[Bf-blender-cvs] [adcb6a1b90] render-layers: Handle main object dupli functions

Dalai Felinto noreply at git.blender.org
Thu Jan 19 18:28:23 CET 2017


Commit: adcb6a1b90ab7256d6a661cc984473036a4074e7
Author: Dalai Felinto
Date:   Thu Jan 19 17:59:59 2017 +0100
Branches: render-layers
https://developer.blender.org/rBadcb6a1b90ab7256d6a661cc984473036a4074e7

Handle main object dupli functions

Missing: mesh separation, material split, mesh conversion (curve to mesh)

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

M	source/blender/blenkernel/BKE_collection.h
M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/collection.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/collada/DocumentImporter.cpp
M	source/blender/editors/armature/armature_relations.c
M	source/blender/editors/include/ED_object.h
M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/editors/object/object_add.c

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

diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h
index ef7acd3be5..47f70012bd 100644
--- a/source/blender/blenkernel/BKE_collection.h
+++ b/source/blender/blenkernel/BKE_collection.h
@@ -47,6 +47,7 @@ bool BKE_collection_remove(struct Scene *scene, struct SceneCollection *sc);
 struct SceneCollection *BKE_collection_master(struct Scene *scene);
 void BKE_collection_master_free(struct Scene *scene);
 void BKE_collection_object_add(struct Scene *scene, 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, 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);
 
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index e5cedf386d..21e6e79514 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -42,6 +42,7 @@ struct Base;
 struct EvaluationContext;
 struct Main;
 struct Object;
+struct ObjectBase;
 struct QuicktimeCodecData;
 struct RenderData;
 struct SceneRenderLayer;
@@ -98,6 +99,8 @@ void BKE_scene_base_flag_to_objects(struct Scene *scene);
 void BKE_scene_base_flag_from_objects(struct Scene *scene);
 void BKE_scene_base_flag_sync_from_base(struct Base *base);
 void BKE_scene_base_flag_sync_from_object(struct Base *base);
+void BKE_scene_object_base_flag_sync_from_base(struct ObjectBase *base);
+void BKE_scene_object_base_flag_sync_from_object(struct ObjectBase *base);
 
 void BKE_scene_set_background(struct Main *bmain, struct Scene *sce);
 struct Scene *BKE_scene_set_name(struct Main *bmain, const char *name);
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 5357589d0e..c7ff70e404 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -180,19 +180,39 @@ void BKE_collection_master_free(Scene *scene){
 	collection_free(BKE_collection_master(scene));
 }
 
+static void collection_object_add(Scene *scene, SceneCollection *sc, Object *ob)
+{
+	BLI_addtail(&sc->objects, BLI_genericNodeN(ob));
+	id_us_plus((ID *)ob);
+	BKE_layer_sync_object_link(scene, sc, ob);
+}
+
 /**
  * Add object to collection
  */
-void BKE_collection_object_add(struct Scene *scene, struct SceneCollection *sc, struct Object *ob)
+void BKE_collection_object_add(Scene *scene, SceneCollection *sc, Object *ob)
 {
 	if (BLI_findptr(&sc->objects, ob, offsetof(LinkData, data))) {
 		/* don't add the same object twice */
 		return;
 	}
+	collection_object_add(scene, sc, ob);
+}
 
-	BLI_addtail(&sc->objects, BLI_genericNodeN(ob));
-	id_us_plus((ID *)ob);
-	BKE_layer_sync_object_link(scene, sc, ob);
+/**
+ * Add object to all collections that reference objects is in
+ * (used to copy objects)
+ */
+void BKE_collection_object_add_from(Scene *scene, Object *ob_src, Object *ob_dst)
+{
+	SceneCollection *sc;
+	FOREACH_SCENE_COLLECTION(scene, sc)
+	{
+		if (BLI_findptr(&sc->objects, ob_src, offsetof(LinkData, data))) {
+			collection_object_add(scene, sc, ob_dst);
+		}
+	}
+	FOREACH_SCENE_COLLECTION_END
 }
 
 /**
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 6492f30dc1..d86c65c48c 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -2333,6 +2333,22 @@ void BKE_scene_base_flag_sync_from_object(Base *base)
 	base->flag = base->object->flag;
 }
 
+void BKE_scene_object_base_flag_sync_from_base(ObjectBase *base)
+{
+	Object *ob = base->object;
+
+	/* keep the object only flags untouched */
+	int flag = ob->flag & OB_FROMGROUP;
+
+	ob->flag = base->flag;
+	ob->flag |= flag;
+}
+
+void BKE_scene_object_base_flag_sync_from_object(ObjectBase *base)
+{
+	base->flag = base->object->flag;
+}
+
 void BKE_scene_disable_color_management(Scene *scene)
 {
 	ColorManagedDisplaySettings *display_settings = &scene->display_settings;
diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp
index 226f319cef..f42691cf70 100644
--- a/source/blender/collada/DocumentImporter.cpp
+++ b/source/blender/collada/DocumentImporter.cpp
@@ -57,6 +57,7 @@ extern "C" {
 #include "BLI_fileops.h"
 
 #include "BKE_camera.h"
+#include "BKE_collection.h"
 #include "BKE_main.h"
 #include "BKE_lamp.h"
 #include "BKE_library.h"
@@ -418,7 +419,7 @@ Object *DocumentImporter::create_instance_node(Object *source_ob, COLLADAFW::Nod
 
 	Object *obn = BKE_object_copy(G.main, source_ob);
 	DAG_id_tag_update(&obn->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
-	BKE_scene_base_add(sce, obn);
+	BKE_collection_object_add_from(sce, source_ob, obn);
 
 	if (instance_node) {
 		anim_importer.read_node_transform(instance_node, obn);
diff --git a/source/blender/editors/armature/armature_relations.c b/source/blender/editors/armature/armature_relations.c
index c1821a8781..c913669a13 100644
--- a/source/blender/editors/armature/armature_relations.c
+++ b/source/blender/editors/armature/armature_relations.c
@@ -578,7 +578,6 @@ static void separate_armature_bones(Object *ob, short sel)
 /* separate selected bones into their armature */
 static int separate_armature_exec(bContext *C, wmOperator *op)
 {
-#if 0
 	Main *bmain = CTX_data_main(C);
 	Scene *scene = CTX_data_scene(C);
 	SceneLayer *sl = CTX_data_scene_layer(C);
@@ -624,7 +623,7 @@ static int separate_armature_exec(bContext *C, wmOperator *op)
 	ED_armature_edit_free(obedit->data);
 	
 	/* 2) duplicate base */
-	newbase = ED_object_add_duplicate(bmain, scene, oldbase, USER_DUP_ARM); /* only duplicate linked armature */
+	newbase = ED_object_add_duplicate(bmain, scene, sl, oldbase, USER_DUP_ARM); /* only duplicate linked armature */
 	DAG_relations_tag_update(bmain);
 
 	newob = newbase->object;
@@ -660,16 +659,6 @@ static int separate_armature_exec(bContext *C, wmOperator *op)
 	WM_cursor_wait(0);
 	
 	return OPERATOR_FINISHED;
-#else
-	TODO_LAYER_COPY;
-
-	(void)C;
-	(void)op;
-	(void)separate_armature_bones;
-	(void)separated_armature_fix_links;
-	BKE_report(op->reports, RPT_ERROR, "ARMATURE_OT_separate not supported at the moment");
-	return OPERATOR_CANCELLED;
-#endif
 }
 
 void ARMATURE_OT_separate(wmOperatorType *ot)
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 996dcedb00..40112bc20f 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -112,7 +112,7 @@ void ED_base_object_sync_from_base(struct Base *base, struct Object *ob);
 void ED_base_object_sync_from_object(struct Base *base, struct Object *ob);
 
 /* single object duplicate, if (dupflag == 0), fully linked, else it uses the flags given */
-struct Base *ED_object_add_duplicate(struct Main *bmain, struct Scene *scene, struct Base *base, int dupflag);
+struct ObjectBase *ED_object_add_duplicate(struct Main *bmain, struct Scene *scene, struct SceneLayer *sl, struct ObjectBase *base, int dupflag);
 
 void ED_object_parent(struct Object *ob, struct Object *parent, const int type, const char *substr);
 
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index e97b230470..5acd9b3fda 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -2992,9 +2992,9 @@ enum {
 	MESH_SEPARATE_LOOSE    = 2,
 };
 
-static Base *mesh_separate_tagged(Main *bmain, Scene *scene, Base *base_old, BMesh *bm_old)
+static ObjectBase *mesh_separate_tagged(Main *bmain, Scene *scene, SceneLayer *sl, ObjectBase *base_old, BMesh *bm_old)
 {
-	Base *base_new;
+	ObjectBase *base_new;
 	Object *obedit = base_old->object;
 	BMesh *bm_new;
 
@@ -3013,11 +3013,11 @@ static Base *mesh_separate_tagged(Main *bmain, Scene *scene, Base *base_old, BMe
 	CustomData_bmesh_init_pool(&bm_new->ldata, bm_mesh_allocsize_default.totloop, BM_LOOP);
 	CustomData_bmesh_init_pool(&bm_new->pdata, bm_mesh_allocsize_default.totface, BM_FACE);
 
-	base_new = ED_object_add_duplicate(bmain, scene, base_old, USER_DUP_MESH);
+	base_new = ED_object_add_duplicate(bmain, scene, sl, base_old, USER_DUP_MESH);
 	/* DAG_relations_tag_update(bmain); */ /* normally would call directly after but in this case delay recalc */
 	assign_matarar(base_new->object, give_matarar(obedit), *give_totcolp(obedit)); /* new in 2.5 */
 
-	ED_base_object_select(base_new, BA_SELECT);
+	ED_object_base_select(base_new, BA_SELECT);
 
 	BMO_op_callf(bm_old, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE),
 	             "duplicate geom=%hvef dest=%p", BM_ELEM_TAG, bm_new);
@@ -3039,7 +3039,7 @@ static Base *mesh_separate_tagged(Main *bmain, Scene *scene, Base *base_old, BMe
 	return base_new;
 }
 
-static bool mesh_separate_selected(Main *bmain, Scene *scene, Base *base_old, BMesh *bm_old)
+static bool mesh_separate_selected(Main *bmain, Scene *scene, SceneLayer *sl, ObjectBase *base_old, BMesh *bm_old)
 {
 	/* we may have tags from previous operators */
 	BM_mesh_elem_hflag_disable_all(bm_old, BM_FACE | BM_EDGE | BM_VERT, BM_ELEM_TAG, false);
@@ -3047,7 +3047,7 @@ static bool mesh_separate_selected(Main *bmain, Scene *scene, Base *base_old, BM
 	/* sel -> tag */
 	BM_mesh_elem_hflag_enable_test(bm_old, BM_FACE | BM_EDGE | BM_VERT, BM_ELEM_TAG, true, false, BM_ELEM_SELECT);
 
-	return (mesh_separate_tagged(bmain, scene, base_old, bm_old) != NULL);
+	return (mesh_separate_tagged(bmain, scene, sl, base_old, bm_old) != NULL);
 }
 
 /* flush a hflag to from verts to edges/faces */
@@ -3146,14 +3146,14 @@ static void mesh_separate_material_assign_mat_nr(Main *bmain, Object *ob, const
 	}
 }
 
-static bool mesh_separate_material(Main *bmain, Scene *scene, Base *base_old, BMesh *bm_old)
+static bool mesh_separate_material(Main *bmain, Scene *scene, SceneLayer *sl, ObjectBase *base_old, BMesh *bm_old)
 {
 	BMFace *f_cmp, *f;
 	BMIter iter;
 	bool result = false;
 
 	while ((f_cmp = BM_iter_at_index(b

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list