diff options
Diffstat (limited to 'source/blender/makesrna/intern/rna_object.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_object.c | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 1fb41bf792f..56652a35ecb 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -149,7 +149,7 @@ const EnumPropertyItem rna_enum_object_gpencil_type_items[] = { {GP_EMPTY, "EMPTY", ICON_EMPTY_AXIS, "Blank", "Create an empty grease pencil object"}, {GP_STROKE, "STROKE", ICON_STROKE, "Stroke", "Create a simple stroke with basic colors"}, {GP_MONKEY, "MONKEY", ICON_MONKEY, "Monkey", "Construct a Suzanne grease pencil object"}, - {0, "", 0, NULL, NULL}, + RNA_ENUM_ITEM_SEPR, {GP_LRT_SCENE, "LRT_SCENE", ICON_SCENE_DATA, @@ -256,17 +256,17 @@ const EnumPropertyItem rna_enum_object_type_items[] = { {OB_POINTCLOUD, "POINTCLOUD", ICON_OUTLINER_OB_POINTCLOUD, "Point Cloud", ""}, {OB_VOLUME, "VOLUME", ICON_OUTLINER_OB_VOLUME, "Volume", ""}, {OB_GPENCIL, "GPENCIL", ICON_OUTLINER_OB_GREASEPENCIL, "Grease Pencil", ""}, - {0, "", 0, NULL, NULL}, + RNA_ENUM_ITEM_SEPR, {OB_ARMATURE, "ARMATURE", ICON_OUTLINER_OB_ARMATURE, "Armature", ""}, {OB_LATTICE, "LATTICE", ICON_OUTLINER_OB_LATTICE, "Lattice", ""}, - {0, "", 0, NULL, NULL}, + RNA_ENUM_ITEM_SEPR, {OB_EMPTY, "EMPTY", ICON_OUTLINER_OB_EMPTY, "Empty", ""}, - {0, "", 0, NULL, NULL}, + RNA_ENUM_ITEM_SEPR, {OB_LAMP, "LIGHT", ICON_OUTLINER_OB_LIGHT, "Light", ""}, {OB_LIGHTPROBE, "LIGHT_PROBE", ICON_OUTLINER_OB_LIGHTPROBE, "Light Probe", ""}, - {0, "", 0, NULL, NULL}, + RNA_ENUM_ITEM_SEPR, {OB_CAMERA, "CAMERA", ICON_OUTLINER_OB_CAMERA, "Camera", ""}, - {0, "", 0, NULL, NULL}, + RNA_ENUM_ITEM_SEPR, {OB_SPEAKER, "SPEAKER", ICON_OUTLINER_OB_SPEAKER, "Speaker", ""}, {0, NULL, 0, NULL, NULL}, }; @@ -1320,12 +1320,17 @@ static int rna_Object_rotation_4d_editable(PointerRNA *ptr, int index) return PROP_EDITABLE; } -static int rna_MaterialSlot_index(PointerRNA *ptr) +static int rna_MaterialSlot_index(const PointerRNA *ptr) { /* There is an offset, so that `ptr->data` is not null and unique across IDs. */ return (uintptr_t)ptr->data - (uintptr_t)ptr->owner_id; } +static int rna_MaterialSlot_index_get(PointerRNA *ptr) +{ + return rna_MaterialSlot_index(ptr); +} + static int rna_MaterialSlot_material_editable(PointerRNA *ptr, const char **UNUSED(r_info)) { Object *ob = (Object *)ptr->owner_id; @@ -1451,7 +1456,7 @@ static void rna_MaterialSlot_update(Main *bmain, Scene *scene, PointerRNA *ptr) DEG_relations_tag_update(bmain); } -static char *rna_MaterialSlot_path(PointerRNA *ptr) +static char *rna_MaterialSlot_path(const PointerRNA *ptr) { int index = rna_MaterialSlot_index(ptr); return BLI_sprintfN("material_slots[%d]", index); @@ -1504,7 +1509,7 @@ static PointerRNA rna_Object_display_get(PointerRNA *ptr) return rna_pointer_inherit_refine(ptr, &RNA_ObjectDisplay, ptr->data); } -static char *rna_ObjectDisplay_path(PointerRNA *UNUSED(ptr)) +static char *rna_ObjectDisplay_path(const PointerRNA *UNUSED(ptr)) { return BLI_strdup("display"); } @@ -1829,6 +1834,24 @@ bool rna_Object_modifiers_override_apply(Main *bmain, ModifierData *mod_dst = ED_object_modifier_add( NULL, bmain, NULL, ob_dst, mod_src->name, mod_src->type); + if (mod_dst == NULL) { + /* This can happen e.g. when a modifier type is tagged as `eModifierTypeFlag_Single`, and that + * modifier has somehow been added already by another code path (e.g. + * `rna_CollisionSettings_dependency_update` does add the `eModifierType_Collision` singleton + * modifier). + * + * Try to handle this by finding already existing one here. */ + const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)mod_src->type); + if (mti->flags & eModifierTypeFlag_Single) { + mod_dst = BKE_modifiers_findby_type(ob_dst, (ModifierType)mod_src->type); + } + + if (mod_dst == NULL) { + BLI_assert(mod_src != NULL); + return false; + } + } + /* XXX Current handling of 'copy' from particle-system modifier is *very* bad (it keeps same psys * pointer as source, then calling code copies psys of object separately and do some magic * remapping of pointers...), unfortunately several pieces of code in Object editing area rely on @@ -2466,7 +2489,7 @@ static void rna_def_material_slot(BlenderRNA *brna) prop = RNA_def_property(srna, "slot_index", PROP_INT, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_int_funcs(prop, "rna_MaterialSlot_index", NULL, NULL); + RNA_def_property_int_funcs(prop, "rna_MaterialSlot_index_get", NULL, NULL); prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_string_funcs( |