Changeset View
Changeset View
Standalone View
Standalone View
source/blender/makesrna/intern/rna_group.c
| Show All 35 Lines | |||||
| #include "WM_types.h" | #include "WM_types.h" | ||||
| #ifdef RNA_RUNTIME | #ifdef RNA_RUNTIME | ||||
| #include "DNA_scene_types.h" | #include "DNA_scene_types.h" | ||||
| #include "DNA_object_types.h" | #include "DNA_object_types.h" | ||||
| #include "BKE_group.h" | #include "DEG_depsgraph.h" | ||||
| #include "BKE_collection.h" | |||||
| #include "BKE_layer.h" | |||||
| #include "WM_api.h" | #include "WM_api.h" | ||||
| static PointerRNA rna_Group_objects_get(CollectionPropertyIterator *iter) | static void rna_Collection_all_objects_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) | ||||
| { | |||||
| Collection *collection = (Collection *)ptr->data; | |||||
| ListBase collection_objects = BKE_collection_object_cache_get(collection); | |||||
| rna_iterator_listbase_begin(iter, &collection_objects, NULL); | |||||
| } | |||||
| static PointerRNA rna_Collection_all_objects_get(CollectionPropertyIterator *iter) | |||||
| { | { | ||||
| ListBaseIterator *internal = &iter->internal.listbase; | ListBaseIterator *internal = &iter->internal.listbase; | ||||
| /* we are actually iterating a ObjectBase list, so override get */ | /* we are actually iterating a ObjectBase list, so override get */ | ||||
| Base *base = (Base *)internal->link; | Base *base = (Base *)internal->link; | ||||
| return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, base->object); | return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, base->object); | ||||
| } | } | ||||
| static void rna_Group_objects_link(Group *group, ReportList *reports, Object *object) | static void rna_Collection_objects_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) | ||||
| { | |||||
| Collection *collection = (Collection *)ptr->data; | |||||
| rna_iterator_listbase_begin(iter, &collection->gobject, NULL); | |||||
| } | |||||
| static PointerRNA rna_Collection_objects_get(CollectionPropertyIterator *iter) | |||||
| { | |||||
| ListBaseIterator *internal = &iter->internal.listbase; | |||||
| /* we are actually iterating a ObjectBase list, so override get */ | |||||
| CollectionObject *cob = (CollectionObject *)internal->link; | |||||
| return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, cob->ob); | |||||
| } | |||||
| static void rna_Collection_objects_link(Collection *collection, Main *bmain, ReportList *reports, Object *object) | |||||
| { | { | ||||
| if (!BKE_group_object_add(group, object)) { | if (!BKE_collection_object_add(bmain, collection, object)) { | ||||
| BKE_reportf(reports, RPT_ERROR, "Object '%s' already in group '%s'", object->id.name + 2, group->id.name + 2); | BKE_reportf(reports, RPT_ERROR, "Object '%s' already in collection '%s'", object->id.name + 2, collection->id.name + 2); | ||||
| return; | return; | ||||
| } | } | ||||
| WM_main_add_notifier(NC_OBJECT | ND_DRAW, &object->id); | WM_main_add_notifier(NC_OBJECT | ND_DRAW, &object->id); | ||||
| } | } | ||||
| static void rna_Group_objects_unlink(Group *group, ReportList *reports, Object *object) | static void rna_Collection_objects_unlink(Collection *collection, Main *bmain, ReportList *reports, Object *object) | ||||
| { | { | ||||
| if (!BKE_group_object_unlink(group, object)) { | if (!BKE_collection_object_remove(bmain, collection, object, false)) { | ||||
| BKE_reportf(reports, RPT_ERROR, "Object '%s' not in group '%s'", object->id.name + 2, group->id.name + 2); | BKE_reportf(reports, RPT_ERROR, "Object '%s' not in collection '%s'", object->id.name + 2, collection->id.name + 2); | ||||
| return; | return; | ||||
| } | } | ||||
| WM_main_add_notifier(NC_OBJECT | ND_DRAW, &object->id); | WM_main_add_notifier(NC_OBJECT | ND_DRAW, &object->id); | ||||
| } | } | ||||
| static void rna_Collection_children_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) | |||||
| { | |||||
| Collection *collection = (Collection *)ptr->data; | |||||
| rna_iterator_listbase_begin(iter, &collection->children, NULL); | |||||
| } | |||||
| static PointerRNA rna_Collection_children_get(CollectionPropertyIterator *iter) | |||||
| { | |||||
| ListBaseIterator *internal = &iter->internal.listbase; | |||||
| /* we are actually iterating a CollectionBase list, so override get */ | |||||
| CollectionChild *child = (CollectionChild *)internal->link; | |||||
| return rna_pointer_inherit_refine(&iter->parent, &RNA_Collection, child->collection); | |||||
| } | |||||
| static void rna_Collection_children_link(Collection *collection, Main *bmain, ReportList *reports, Collection *child) | |||||
| { | |||||
| if (!BKE_collection_child_add(bmain, collection, child)) { | |||||
| BKE_reportf(reports, RPT_ERROR, "Collection '%s' already in collection '%s'", child->id.name + 2, collection->id.name + 2); | |||||
| return; | |||||
| } | |||||
| WM_main_add_notifier(NC_OBJECT | ND_DRAW, &child->id); | |||||
| } | |||||
| static void rna_Collection_children_unlink(Collection *collection, Main *bmain, ReportList *reports, Collection *child) | |||||
| { | |||||
| if (!BKE_collection_child_remove(bmain, collection, child)) { | |||||
| BKE_reportf(reports, RPT_ERROR, "Collection '%s' not in collection '%s'", child->id.name + 2, collection->id.name + 2); | |||||
| return; | |||||
| } | |||||
| WM_main_add_notifier(NC_OBJECT | ND_DRAW, &child->id); | |||||
| } | |||||
| static void rna_Collection_flag_update(Main *bmain, Scene *scene, PointerRNA *ptr) | |||||
| { | |||||
| Collection *collection = (Collection *)ptr->data; | |||||
| BKE_collection_object_cache_free(collection); | |||||
| BKE_main_collection_sync(bmain); | |||||
| WM_main_add_notifier(NC_SCENE | ND_OB_SELECT, scene); | |||||
| } | |||||
| #else | #else | ||||
| /* group.objects */ | /* collection.objects */ | ||||
| static void rna_def_group_objects(BlenderRNA *brna, PropertyRNA *cprop) | static void rna_def_collection_objects(BlenderRNA *brna, PropertyRNA *cprop) | ||||
| { | { | ||||
| StructRNA *srna; | StructRNA *srna; | ||||
| /* PropertyRNA *prop; */ | |||||
| FunctionRNA *func; | FunctionRNA *func; | ||||
| PropertyRNA *parm; | PropertyRNA *parm; | ||||
| RNA_def_property_srna(cprop, "GroupObjects"); | RNA_def_property_srna(cprop, "CollectionObjects"); | ||||
| srna = RNA_def_struct(brna, "GroupObjects", NULL); | srna = RNA_def_struct(brna, "CollectionObjects", NULL); | ||||
| RNA_def_struct_sdna(srna, "Group"); | RNA_def_struct_sdna(srna, "Collection"); | ||||
| RNA_def_struct_ui_text(srna, "Group Objects", "Collection of group objects"); | RNA_def_struct_ui_text(srna, "Collection Objects", "Collection of collection objects"); | ||||
| /* add object */ | /* add object */ | ||||
| func = RNA_def_function(srna, "link", "rna_Group_objects_link"); | func = RNA_def_function(srna, "link", "rna_Collection_objects_link"); | ||||
| RNA_def_function_flag(func, FUNC_USE_REPORTS); | RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_MAIN); | ||||
| RNA_def_function_ui_description(func, "Add this object to a group"); | RNA_def_function_ui_description(func, "Add this object to a collection"); | ||||
| /* object to add */ | |||||
| parm = RNA_def_pointer(func, "object", "Object", "", "Object to add"); | parm = RNA_def_pointer(func, "object", "Object", "", "Object to add"); | ||||
| RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED); | RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED); | ||||
| /* remove object */ | /* remove object */ | ||||
| func = RNA_def_function(srna, "unlink", "rna_Group_objects_unlink"); | func = RNA_def_function(srna, "unlink", "rna_Collection_objects_unlink"); | ||||
| RNA_def_function_ui_description(func, "Remove this object to a group"); | RNA_def_function_ui_description(func, "Remove this object from a collection"); | ||||
| RNA_def_function_flag(func, FUNC_USE_REPORTS); | RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_MAIN); | ||||
| /* object to remove */ | |||||
| parm = RNA_def_pointer(func, "object", "Object", "", "Object to remove"); | parm = RNA_def_pointer(func, "object", "Object", "", "Object to remove"); | ||||
| RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); | RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); | ||||
| } | } | ||||
| /* collection.children */ | |||||
| static void rna_def_collection_children(BlenderRNA *brna, PropertyRNA *cprop) | |||||
| { | |||||
| StructRNA *srna; | |||||
| FunctionRNA *func; | |||||
| PropertyRNA *parm; | |||||
| RNA_def_property_srna(cprop, "CollectionChildren"); | |||||
| srna = RNA_def_struct(brna, "CollectionChildren", NULL); | |||||
| RNA_def_struct_sdna(srna, "Collection"); | |||||
| RNA_def_struct_ui_text(srna, "Collection Children", "Collection of child collections"); | |||||
| /* add child */ | |||||
| func = RNA_def_function(srna, "link", "rna_Collection_children_link"); | |||||
| RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_MAIN); | |||||
| RNA_def_function_ui_description(func, "Add this collection as child of this collection"); | |||||
| parm = RNA_def_pointer(func, "child", "Collection", "", "Collection to add"); | |||||
| RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED); | |||||
| void RNA_def_group(BlenderRNA *brna) | /* remove child */ | ||||
| func = RNA_def_function(srna, "unlink", "rna_Collection_children_unlink"); | |||||
| RNA_def_function_ui_description(func, "Remove this child collection from a collection"); | |||||
| RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_MAIN); | |||||
| parm = RNA_def_pointer(func, "child", "Collection", "", "Collection to remove"); | |||||
| RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); | |||||
| } | |||||
| void RNA_def_collections(BlenderRNA *brna) | |||||
| { | { | ||||
| StructRNA *srna; | StructRNA *srna; | ||||
| PropertyRNA *prop; | PropertyRNA *prop; | ||||
| srna = RNA_def_struct(brna, "Group", "ID"); | srna = RNA_def_struct(brna, "Collection", "ID"); | ||||
| RNA_def_struct_ui_text(srna, "Group", "Group of Object data-blocks"); | RNA_def_struct_sdna(srna, "Group"); /* it is actually Collection but for 2.8 the dna is patched! */ | ||||
| RNA_def_struct_ui_text(srna, "Collection", "Collection of Object data-blocks"); | |||||
| RNA_def_struct_ui_icon(srna, ICON_GROUP); | RNA_def_struct_ui_icon(srna, ICON_GROUP); | ||||
| /* this is done on save/load in readfile.c, removed if no objects are in the group */ | /* this is done on save/load in readfile.c, removed if no objects are in the collection and not in a scene */ | ||||
| RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT); | RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT); | ||||
| prop = RNA_def_property(srna, "dupli_offset", PROP_FLOAT, PROP_TRANSLATION); | prop = RNA_def_property(srna, "dupli_offset", PROP_FLOAT, PROP_TRANSLATION); | ||||
| RNA_def_property_float_sdna(prop, NULL, "dupli_ofs"); | RNA_def_property_float_sdna(prop, NULL, "dupli_ofs"); | ||||
| RNA_def_property_ui_text(prop, "Dupli Offset", "Offset from the origin to use when instancing as DupliGroup"); | RNA_def_property_ui_text(prop, "Dupli Offset", "Offset from the origin to use when instancing"); | ||||
| RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, RNA_TRANSLATION_PREC_DEFAULT); | RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, RNA_TRANSLATION_PREC_DEFAULT); | ||||
| RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL); | RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL); | ||||
| prop = RNA_def_property(srna, "objects", PROP_COLLECTION, PROP_NONE); | prop = RNA_def_property(srna, "objects", PROP_COLLECTION, PROP_NONE); | ||||
| RNA_def_property_collection_sdna(prop, NULL, "view_layer->object_bases", NULL); | |||||
| RNA_def_property_struct_type(prop, "Object"); | RNA_def_property_struct_type(prop, "Object"); | ||||
| RNA_def_property_ui_text(prop, "Objects", "A collection of this groups objects"); | RNA_def_property_ui_text(prop, "Objects", "Objects that are directly in this collection"); | ||||
| RNA_def_property_collection_funcs(prop, NULL, NULL, NULL, "rna_Group_objects_get", NULL, NULL, NULL, NULL); | RNA_def_property_collection_funcs(prop, "rna_Collection_objects_begin", | ||||
| rna_def_group_objects(brna, prop); | "rna_iterator_listbase_next", | ||||
| "rna_iterator_listbase_end", | |||||
| prop = RNA_def_property(srna, "view_layer", PROP_POINTER, PROP_NONE); | "rna_Collection_objects_get", | ||||
| RNA_def_property_struct_type(prop, "ViewLayer"); | NULL, NULL, NULL, NULL); | ||||
| RNA_def_property_flag(prop, PROP_NEVER_NULL); | rna_def_collection_objects(brna, prop); | ||||
| RNA_def_property_clear_flag(prop, PROP_EDITABLE); | |||||
| RNA_def_property_ui_text(prop, "View Layer", "Group internal view layer"); | prop = RNA_def_property(srna, "all_objects", PROP_COLLECTION, PROP_NONE); | ||||
| RNA_def_property_struct_type(prop, "Object"); | |||||
| RNA_def_property_ui_text(prop, "All Objects", "Objects that are in this collection and its child collections"); | |||||
| RNA_def_property_collection_funcs(prop, "rna_Collection_all_objects_begin", | |||||
| "rna_iterator_listbase_next", | |||||
| "rna_iterator_listbase_end", | |||||
| "rna_Collection_all_objects_get", | |||||
| NULL, NULL, NULL, NULL); | |||||
| prop = RNA_def_property(srna, "children", PROP_COLLECTION, PROP_NONE); | |||||
| RNA_def_property_struct_type(prop, "Collection"); | |||||
| RNA_def_property_ui_text(prop, "Children", "Collections that are immediate children of this collection"); | |||||
| RNA_def_property_collection_funcs(prop, "rna_Collection_children_begin", | |||||
| "rna_iterator_listbase_next", | |||||
| "rna_iterator_listbase_end", | |||||
| "rna_Collection_children_get", | |||||
| NULL, NULL, NULL, NULL); | |||||
| rna_def_collection_children(brna, prop); | |||||
| /* Flags */ | |||||
| prop = RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE); | |||||
| RNA_def_property_boolean_sdna(prop, NULL, "flag", COLLECTION_RESTRICT_SELECT); | |||||
| RNA_def_property_flag(prop, PROP_OVERRIDABLE_STATIC); | |||||
| RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, 1); | |||||
| RNA_def_property_ui_text(prop, "Restrict Select", "Disable collection object selection in the 3D viewport"); | |||||
| RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_Collection_flag_update"); | |||||
| prop = RNA_def_property(srna, "hide_viewport", PROP_BOOLEAN, PROP_NONE); | |||||
| RNA_def_property_boolean_sdna(prop, NULL, "flag", COLLECTION_RESTRICT_VIEW); | |||||
| RNA_def_property_flag(prop, PROP_OVERRIDABLE_STATIC); | |||||
| RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1); | |||||
| RNA_def_property_ui_text(prop, "Restrict Viewport", "Hide collection objects in the 3D viewport"); | |||||
| RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_Collection_flag_update"); | |||||
| prop = RNA_def_property(srna, "hide_render", PROP_BOOLEAN, PROP_NONE); | |||||
| RNA_def_property_boolean_sdna(prop, NULL, "flag", COLLECTION_RESTRICT_RENDER); | |||||
| RNA_def_property_flag(prop, PROP_OVERRIDABLE_STATIC); | |||||
| RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1); | |||||
| RNA_def_property_ui_text(prop, "Restrict Render", "Hide collection objects in renders"); | |||||
| RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_Collection_flag_update"); | |||||
| } | } | ||||
| #endif | #endif | ||||