[Bf-blender-cvs] [7c0cafd95da] temp-group-collections: Groups and collections 1/3

Dalai Felinto noreply at git.blender.org
Wed Nov 1 18:14:27 CET 2017


Commit: 7c0cafd95da28fe47ab555b63095640e953c0c1a
Author: Dalai Felinto
Date:   Tue Jul 18 17:13:52 2017 +0200
Branches: temp-group-collections
https://developer.blender.org/rB7c0cafd95da28fe47ab555b63095640e953c0c1a

Groups and collections 1/3

This is the first out of a three parts work.
In this part we use Collections instead of GroupObject to handle group elements.

I'm not asking for review (yet), but if anyone wants to comment on anything, the
sooner the better, so feel fre.

Coming next:
(1) Allow collection of type "group"
(2) Allow creation of groups from collection

I will update the patch description once I get those other parts finished.
But the final commit will likely be done in separated patches.

Reviewers: sergey, mont29

Subscribers: brecht

Differential Revision: https://developer.blender.org/D2892

===================================================================

M	source/blender/alembic/intern/alembic_capi.cc
M	source/blender/blenkernel/BKE_collection.h
M	source/blender/blenkernel/BKE_group.h
M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/collection.c
M	source/blender/blenkernel/intern/collision.c
M	source/blender/blenkernel/intern/dynamicpaint.c
M	source/blender/blenkernel/intern/effect.c
M	source/blender/blenkernel/intern/group.c
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/library_query.c
M	source/blender/blenkernel/intern/library_remap.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/object_dupli.c
M	source/blender/blenkernel/intern/particle.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenkernel/intern/softbody.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/collada/SceneExporter.cpp
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/editors/gpencil/gpencil_convert.c
M	source/blender/editors/object/object_add.c
M	source/blender/editors/object/object_relations.c
M	source/blender/editors/space_info/info_stats.c
M	source/blender/editors/space_outliner/outliner_collections.c
M	source/blender/editors/space_outliner/outliner_edit.c
M	source/blender/editors/space_outliner/outliner_intern.h
M	source/blender/editors/space_outliner/outliner_ops.c
M	source/blender/editors/space_outliner/outliner_select.c
M	source/blender/editors/space_outliner/outliner_tools.c
M	source/blender/editors/space_outliner/outliner_tree.c
M	source/blender/editors/space_view3d/view3d_ops.c
M	source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
M	source/blender/makesdna/DNA_group_types.h
M	source/blender/makesrna/intern/rna_group.c
M	source/blender/makesrna/intern/rna_layer.c
M	source/blender/render/intern/source/convertblender.c
M	source/gameengine/Converter/BL_BlenderDataConversion.cpp
M	source/gameengine/Ketsji/KX_Scene.cpp

===================================================================

diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 730a574e649..036d0bb9440 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -839,7 +839,7 @@ static void import_endjob(void *user_data)
 		if (lc == NULL) {
 			BLI_assert(BLI_listbase_count_ex(&sl->layer_collections, 1) == 0);
 			/* when there is no collection linked to this SceneLayer, create one */
-			SceneCollection *sc = BKE_collection_add(data->scene, NULL, NULL);
+			SceneCollection *sc = BKE_collection_add(&data->scene->id, NULL, NULL);
 			lc = BKE_collection_link(sl, sc);
 		}
 
@@ -847,7 +847,7 @@ static void import_endjob(void *user_data)
 			Object *ob = (*iter)->object();
 			ob->lay = data->scene->lay;
 
-			BKE_collection_object_add(data->scene, lc->scene_collection, ob);
+			BKE_collection_object_add(&data->scene->id, lc->scene_collection, ob);
 
 			base = BKE_scene_layer_base_find(sl, ob);
 			BKE_scene_layer_base_select(sl, base);
diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h
index 0adac4500f8..edfba641a6d 100644
--- a/source/blender/blenkernel/BKE_collection.h
+++ b/source/blender/blenkernel/BKE_collection.h
@@ -39,19 +39,24 @@ struct BLI_Iterator;
 struct SceneCollection;
 struct Object;
 struct Base;
+struct Group;
+struct ID;
 struct Main;
 struct Scene;
 
-struct SceneCollection *BKE_collection_add(struct Scene *scene, struct SceneCollection *sc_parent, const char *name);
+struct SceneCollection *BKE_collection_add(struct ID *id, struct SceneCollection *sc_parent, const char *name);
 bool BKE_collection_remove(struct Scene *scene, struct SceneCollection *sc);
+void BKE_collection_copy_data(struct SceneCollection *sc_dst, struct SceneCollection *sc_src, const int flag);
 struct SceneCollection *BKE_collection_master(const struct Scene *scene);
+struct SceneCollection *BKE_collection_group_master(const struct Group *group);
 void BKE_collection_rename(const struct Scene *scene, struct SceneCollection *sc, const char *name);
 void BKE_collection_master_free(struct Scene *scene, const bool do_id_user);
-void BKE_collection_object_add(const struct Scene *scene, struct SceneCollection *sc, struct Object *object);
+void BKE_collection_master_group_free(struct Group *group);
+bool BKE_collection_object_add(const struct ID *id, struct SceneCollection *sc, struct Object *object);
 void BKE_collection_object_add_from(struct Scene *scene, struct Object *ob_src, struct Object *ob_dst);
-void BKE_collection_object_remove(struct Main *bmain, const struct Scene *scene, struct SceneCollection *sc, struct Object *object, const bool free_us);
-void BKE_collections_object_remove(struct Main *bmain, struct Scene *scene, struct Object *object, const bool free_us);
-void BKE_collection_object_move(const struct Scene *scene, struct SceneCollection *sc_dst, struct SceneCollection *sc_src, struct Object *ob);
+bool BKE_collection_object_remove(struct Main *bmain, struct ID *id, struct SceneCollection *sc, struct Object *object, const bool free_us);
+bool BKE_collections_object_remove(struct Main *bmain, struct ID *id, struct Object *object, const bool free_us);
+void BKE_collection_object_move(struct Scene *scene, struct SceneCollection *sc_dst, struct SceneCollection *sc_src, struct Object *ob);
 
 void BKE_collection_reinsert_after(const struct Scene *scene, struct SceneCollection *sc_reinsert, struct SceneCollection *sc_after);
 void BKE_collection_reinsert_into(struct SceneCollection *sc_reinsert, struct SceneCollection *sc_into);
@@ -75,11 +80,11 @@ void BKE_scene_objects_iterator_begin(struct BLI_Iterator *iter, void *data_in);
 void BKE_scene_objects_iterator_next(struct BLI_Iterator *iter);
 void BKE_scene_objects_iterator_end(struct BLI_Iterator *iter);
 
-#define FOREACH_SCENE_COLLECTION(scene, _instance)                            \
+#define FOREACH_SCENE_COLLECTION(_id, _instance)                              \
 	ITER_BEGIN(BKE_scene_collections_iterator_begin,                          \
 	           BKE_scene_collections_iterator_next,                           \
 	           BKE_scene_collections_iterator_end,                            \
-	           scene, SceneCollection *, _instance)
+	           _id, SceneCollection *, _instance)
 
 #define FOREACH_SCENE_COLLECTION_END                                          \
 	ITER_END
diff --git a/source/blender/blenkernel/BKE_group.h b/source/blender/blenkernel/BKE_group.h
index 205f42d6643..08f4ff15f8f 100644
--- a/source/blender/blenkernel/BKE_group.h
+++ b/source/blender/blenkernel/BKE_group.h
@@ -42,6 +42,7 @@ struct Object;
 struct Scene;
 
 void          BKE_group_free(struct Group *group);
+void          BKE_group_init(struct Group *group);
 struct Group *BKE_group_add(struct Main *bmain, const char *name);
 void          BKE_group_copy_data(struct Main *bmain, struct Group *group_dst, const struct Group *group_src, const int flag);
 struct Group *BKE_group_copy(struct Main *bmain, const struct Group *group);
@@ -56,4 +57,24 @@ bool          BKE_group_is_animated(struct Group *group, struct Object *parent);
 void          BKE_group_tag_recalc(struct Group *group);
 void          BKE_group_handle_recalc_and_update(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *parent, struct Group *group);
 
+#define FOREACH_GROUP_BASE(_group, _base)                         \
+	for (Base *_base = (Base *)(_group)->scene_layer->object_bases.first; \
+	     _base;                                                   \
+		 _base = _base->next)                                     \
+	{
+
+#define FOREACH_GROUP_BASE_END                                    \
+	}
+
+#define FOREACH_GROUP_OBJECT(_group, _object)                     \
+	for (Base *_base = (Base *)(_group)->scene_layer->object_bases.first; \
+	     _base;                                                   \
+		 _base = _base->next)                                     \
+	{                                                             \
+		Object *_object = _base->object;                          \
+		BLI_assert(_object != NULL);
+
+#define FOREACH_GROUP_OBJECT_END                                  \
+	}
+
 #endif  /* __BKE_GROUP_H__ */
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 1585742729c..6753388a7fc 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -48,6 +48,7 @@ struct ListBase;
 struct Main;
 struct Object;
 struct Base;
+struct Group;
 struct RenderEngine;
 struct Scene;
 struct SceneCollection;
@@ -59,6 +60,7 @@ void BKE_layer_exit(void);
 struct SceneLayer *BKE_scene_layer_from_scene_get(const struct Scene *scene);
 struct SceneLayer *BKE_scene_layer_from_workspace_get(const struct Scene *scene, const struct WorkSpace *workspace);
 struct SceneLayer *BKE_scene_layer_add(struct Scene *scene, const char *name);
+struct SceneLayer *BKE_scene_layer_group_add(struct Group *group);
 
 /* DEPRECATED */
 struct SceneLayer *BKE_scene_layer_context_active_PLACEHOLDER(const struct Scene *scene);
@@ -72,6 +74,10 @@ struct Base *BKE_scene_layer_base_find(struct SceneLayer *sl, struct Object *ob)
 void BKE_scene_layer_base_deselect_all(struct SceneLayer *sl);
 void BKE_scene_layer_base_select(struct SceneLayer *sl, struct Base *selbase);
 
+void BKE_scene_layer_copy_data(struct SceneLayer *sl_dst, struct SceneLayer *sl_src,
+                               struct SceneCollection* mc_dst, struct SceneCollection* mc_src,
+                               const int flag);
+
 void BKE_layer_collection_free(struct SceneLayer *sl, struct LayerCollection *lc);
 
 struct LayerCollection *BKE_layer_collection_get_active(struct SceneLayer *sl);
@@ -100,9 +106,9 @@ bool BKE_scene_has_object(struct Scene *scene, struct Object *ob);
 
 /* syncing */
 
-void BKE_layer_sync_new_scene_collection(struct Scene *scene, const struct SceneCollection *sc_parent, struct SceneCollection *sc);
-void BKE_layer_sync_object_link(const struct Scene *scene, struct SceneCollection *sc, struct Object *ob);
-void BKE_layer_sync_object_unlink(const struct Scene *scene, struct SceneCollection *sc, struct Object *ob);
+void BKE_layer_sync_new_scene_collection(struct ID *id, const struct SceneCollection *sc_parent, struct SceneCollection *sc);
+void BKE_layer_sync_object_link(const struct ID *id, struct SceneCollection *sc, struct Object *ob);
+void BKE_layer_sync_object_unlink(const struct ID *id, struct SceneCollection *sc, struct Object *ob);
 
 /* override */
 
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 2b69c176c39..e623493a307 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -40,6 +40,7 @@
 #include "BKE_main.h"
 #include "BKE_scene.h"
 
+#include "DNA_group_types.h"
 #include "DNA_ID.h"
 #include "DNA_layer_types.h"
 #include "DNA_object_types.h"
@@ -47,14 +48,26 @@
 
 #include "MEM_guardedalloc.h"
 
+static SceneCollection *collection_master_from_id(const ID *id)
+{
+	switch (GS(id->name)) {
+		case ID_SCE:
+			return ((Scene *)id)->collection;
+		case ID_GR:
+			return ((Group *)id)->collection;
+		default:
+			BLI_assert(!"ID doesn't support collections");
+			return NULL;
+	}
+}
 
 /**
  * Add a collection to a collection ListBase and syncronize all render layers
  * The ListBase is NULL when the collection is to be added to the master collection
  */
-SceneCollection *BKE_collection_add(Scene *scene, SceneCollection *sc_parent, const char *name)
+SceneCollection *BKE_collection_add(ID *id, SceneCollection *sc_parent, const char *name)
 {
-	SceneCollection *sc_master = BKE_collection_master(scene);
+	SceneCollection *sc_master = collection_master_from_id(id);
 	SceneCollection *sc = MEM_callocN(sizeof(SceneCollection), "New Collection");
 
 	if (!name) {
@@ -65,10 +78,10 @@ SceneCollection *BKE_collection_add(Scene *scene, SceneCollection *sc_parent, co
 		sc_parent = sc_master;
 	}
 
-	BKE_collection_rename(scene, sc, name);
+	BKE_collection_rename((Scene *)id, sc, name);
 	BLI_addtail(&sc_par

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list