Depsgraph/RNA: Fix broken 'dupliobject' RNA interface.

Previous code would crash on whole lot of accessors in case current item
was not a real dupli instance.

And code was missing access to crucial dupli (world) matrix! Pretty
useless without that.

Also reordered a bit members in here, let's try to keep a bit of logic...
This commit is contained in:
Bastien Montagne 2018-09-19 15:44:10 +02:00
parent a349527981
commit 33edfefa8e
1 changed files with 73 additions and 36 deletions

View File

@ -43,6 +43,7 @@
#ifdef RNA_RUNTIME
#include "BLI_iterator.h"
#include "BLI_math.h"
#include "BKE_anim.h"
@ -60,6 +61,13 @@ static PointerRNA rna_DepsgraphObjectInstance_object_get(PointerRNA *ptr)
return rna_pointer_inherit_refine(ptr, &RNA_Object, iterator->current);
}
static int rna_DepsgraphObjectInstance_is_instance_get(PointerRNA *ptr)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
return (deg_iter->dupli_object_current != NULL);
}
static PointerRNA rna_DepsgraphObjectInstance_instance_object_get(PointerRNA *ptr)
{
BLI_Iterator *iterator = ptr->data;
@ -86,46 +94,72 @@ static PointerRNA rna_DepsgraphObjectInstance_particle_system_get(PointerRNA *pt
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
return rna_pointer_inherit_refine(ptr, &RNA_ParticleSystem,
deg_iter->dupli_object_current->particle_system);
struct ParticleSystem *particle_system = NULL;
if (deg_iter->dupli_object_current != NULL) {
particle_system = deg_iter->dupli_object_current->particle_system;
}
return rna_pointer_inherit_refine(ptr, &RNA_ParticleSystem, particle_system);
}
static void rna_DepsgraphObjectInstance_persistent_id_get(PointerRNA *ptr, int *persistent_id)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
memcpy(persistent_id, deg_iter->dupli_object_current->persistent_id,
sizeof(deg_iter->dupli_object_current->persistent_id));
}
static void rna_DepsgraphObjectInstance_orco_get(PointerRNA *ptr, float *orco)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
memcpy(orco, deg_iter->dupli_object_current->orco,
sizeof(deg_iter->dupli_object_current->orco));
if (deg_iter->dupli_object_current != NULL) {
memcpy(persistent_id, deg_iter->dupli_object_current->persistent_id,
sizeof(deg_iter->dupli_object_current->persistent_id));
}
else {
memset(persistent_id, 0, sizeof(deg_iter->dupli_object_current->persistent_id));
}
}
static unsigned int rna_DepsgraphObjectInstance_random_id_get(PointerRNA *ptr)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
return deg_iter->dupli_object_current->random_id;
if (deg_iter->dupli_object_current != NULL) {
return deg_iter->dupli_object_current->random_id;
}
else {
return 0;
}
}
static void rna_DepsgraphObjectInstance_matrix_world_get(PointerRNA *ptr, float *mat)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
if (deg_iter->dupli_object_current != NULL) {
copy_m4_m4((float(*)[4])mat, deg_iter->dupli_object_current->mat);
}
else {
unit_m4((float(*)[4])mat);
}
}
static void rna_DepsgraphObjectInstance_orco_get(PointerRNA *ptr, float *orco)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
if (deg_iter->dupli_object_current != NULL) {
copy_v3_v3(orco, deg_iter->dupli_object_current->orco);
}
else {
zero_v3(orco);
}
}
static void rna_DepsgraphObjectInstance_uv_get(PointerRNA *ptr, float *uv)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
memcpy(uv, deg_iter->dupli_object_current->uv,
sizeof(deg_iter->dupli_object_current->uv));
}
static int rna_DepsgraphObjectInstance_is_instance_get(PointerRNA *ptr)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
return (deg_iter->dupli_object_current != NULL);
if (deg_iter->dupli_object_current != NULL) {
copy_v2_v2(uv, deg_iter->dupli_object_current->uv);
}
else {
zero_v2(uv);
}
}
/* ******************** Sorted ***************** */
@ -388,6 +422,11 @@ static void rna_def_depsgraph_instance(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_pointer_funcs(prop, "rna_DepsgraphObjectInstance_object_get", NULL, NULL, NULL);
prop = RNA_def_property(srna, "is_instance", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Is Instance", "Denotes whether the object is coming from dupli-list");
RNA_def_property_boolean_funcs(prop, "rna_DepsgraphObjectInstance_is_instance_get", NULL);
prop = RNA_def_property(srna, "instance_object", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_ui_text(prop, "Instance Object", "Object which is being instanced by this iterator");
@ -413,30 +452,28 @@ static void rna_def_depsgraph_instance(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_int_funcs(prop, "rna_DepsgraphObjectInstance_persistent_id_get", NULL, NULL);
prop = RNA_def_property(srna, "orco", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
/* Seems system is not smart enough to figure that getter function should return
* array for PROP_TRANSLATION.
*/
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Generated Coordinates", "Generated coordinates in parent object space");
RNA_def_property_float_funcs(prop, "rna_DepsgraphObjectInstance_orco_get", NULL, NULL);
prop = RNA_def_property(srna, "random_id", PROP_INT, PROP_UNSIGNED);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Dupli random id", "Random id for this dupli object");
RNA_def_property_int_funcs(prop, "rna_DepsgraphObjectInstance_random_id_get", NULL, NULL);
prop = RNA_def_property(srna, "matrix_world", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
RNA_def_property_ui_text(prop, "Generated Matrix", "Generated transform matrix in world space");
RNA_def_property_float_funcs(prop, "rna_DepsgraphObjectInstance_matrix_local_get", NULL, NULL);
prop = RNA_def_property(srna, "orco", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Generated Coordinates", "Generated coordinates in parent object space");
RNA_def_property_float_funcs(prop, "rna_DepsgraphObjectInstance_orco_get", NULL, NULL);
prop = RNA_def_property(srna, "uv", PROP_FLOAT, PROP_NONE);
RNA_def_property_ui_text(prop, "UV Coordinates", "UV coordinates in parent object space");
RNA_def_property_array(prop, 2);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_float_funcs(prop, "rna_DepsgraphObjectInstance_uv_get", NULL, NULL);
prop = RNA_def_property(srna, "is_instance", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Is Instance", "Denotes whether the object is coming from dupli-list");
RNA_def_property_boolean_funcs(prop, "rna_DepsgraphObjectInstance_is_instance_get", NULL);
}
static void rna_def_depsgraph_update(BlenderRNA *brna)