[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56282] trunk/blender/source/blender: Fix #34806: rigid body world settings were not copied with a full scene copy.

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Apr 25 01:09:25 CEST 2013


Revision: 56282
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56282
Author:   blendix
Date:     2013-04-24 23:09:25 +0000 (Wed, 24 Apr 2013)
Log Message:
-----------
Fix #34806: rigid body world settings were not copied with a full scene copy.

Now copying a scene will also duplicate groups that consist entirely of objects
that are duplicated with the scene. The rigid body world will then also pointers
to these new groups.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_rigidbody.h
    trunk/blender/source/blender/blenkernel/BKE_scene.h
    trunk/blender/source/blender/blenkernel/intern/group.c
    trunk/blender/source/blender/blenkernel/intern/rigidbody.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/editors/include/ED_object.h
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/editors/object/object_relations.c
    trunk/blender/source/blender/editors/screen/screen_ops.c

Modified: trunk/blender/source/blender/blenkernel/BKE_rigidbody.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_rigidbody.h	2013-04-24 23:09:22 UTC (rev 56281)
+++ trunk/blender/source/blender/blenkernel/BKE_rigidbody.h	2013-04-24 23:09:25 UTC (rev 56282)
@@ -62,6 +62,10 @@
 struct RigidBodyOb *BKE_rigidbody_create_object(struct Scene *scene, struct Object *ob, short type);
 struct RigidBodyCon *BKE_rigidbody_create_constraint(struct Scene *scene, struct Object *ob, short type);
 
+/* copy */
+struct RigidBodyWorld *BKE_rigidbody_world_copy(struct RigidBodyWorld *rbw);
+void BKE_rigidbody_world_groups_relink(struct RigidBodyWorld *rbw);
+
 /* 'validate' (i.e. make new or replace old) Physics-Engine objects */
 void BKE_rigidbody_validate_sim_world(struct Scene *scene, struct RigidBodyWorld *rbw, short rebuild);
 void BKE_rigidbody_validate_sim_object(struct RigidBodyWorld *rbw, struct Object *ob, short rebuild);

Modified: trunk/blender/source/blender/blenkernel/BKE_scene.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_scene.h	2013-04-24 23:09:22 UTC (rev 56281)
+++ trunk/blender/source/blender/blenkernel/BKE_scene.h	2013-04-24 23:09:25 UTC (rev 56282)
@@ -84,6 +84,7 @@
 struct Scene *BKE_scene_set_name(struct Main *bmain, const char *name);
 
 struct Scene *BKE_scene_copy(struct Scene *sce, int type);
+void BKE_scene_groups_relink(struct Scene *sce);
 void BKE_scene_unlink(struct Main *bmain, struct Scene *sce, struct Scene *newsce);
 
 struct Object *BKE_scene_camera_find(struct Scene *sc);

Modified: trunk/blender/source/blender/blenkernel/intern/group.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/group.c	2013-04-24 23:09:22 UTC (rev 56281)
+++ trunk/blender/source/blender/blenkernel/intern/group.c	2013-04-24 23:09:25 UTC (rev 56282)
@@ -148,7 +148,7 @@
 {
 	Group *groupn;
 
-	groupn = MEM_dupallocN(group);
+	groupn = BKE_libblock_copy(&group->id);
 	BLI_duplicatelist(&groupn->gobject, &group->gobject);
 
 	return groupn;

Modified: trunk/blender/source/blender/blenkernel/intern/rigidbody.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/rigidbody.c	2013-04-24 23:09:22 UTC (rev 56281)
+++ trunk/blender/source/blender/blenkernel/intern/rigidbody.c	2013-04-24 23:09:25 UTC (rev 56282)
@@ -58,12 +58,13 @@
 #include "BKE_animsys.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_effect.h"
+#include "BKE_global.h"
 #include "BKE_group.h"
+#include "BKE_library.h"
+#include "BKE_mesh.h"
 #include "BKE_object.h"
-#include "BKE_mesh.h"
 #include "BKE_pointcache.h"
 #include "BKE_rigidbody.h"
-#include "BKE_global.h"
 #include "BKE_utildefines.h"
 
 #include "RNA_access.h"
@@ -724,6 +725,36 @@
 	return rbw;
 }
 
+RigidBodyWorld *BKE_rigidbody_world_copy(RigidBodyWorld *rbw)
+{
+	RigidBodyWorld *rbwn = MEM_dupallocN(rbw);
+
+	if (rbw->effector_weights)
+		rbwn->effector_weights = MEM_dupallocN(rbw->effector_weights);
+	if (rbwn->group)
+		id_us_plus(&rbwn->group->id);
+	if (rbwn->constraints)
+		id_us_plus(&rbwn->constraints->id);
+
+	rbwn->pointcache = BKE_ptcache_copy_list(&rbwn->ptcaches, &rbw->ptcaches, FALSE);
+
+	rbwn->objects = NULL;
+	rbwn->physics_world = NULL;
+	rbwn->numbodies = 0;
+
+	return rbwn;
+}
+
+void BKE_rigidbody_world_groups_relink(RigidBodyWorld *rbw)
+{
+	if (rbw->group && rbw->group->id.newid)
+		rbw->group = (Group*)rbw->group->id.newid;
+	if (rbw->constraints && rbw->constraints->id.newid)
+		rbw->constraints = (Group*)rbw->constraints->id.newid;
+	if (rbw->effector_weights->group && rbw->effector_weights->group->id.newid)
+		rbw->effector_weights->group = (Group*)rbw->effector_weights->group->id.newid;
+}
+
 /* Add rigid body settings to the specified object */
 RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type)
 {
@@ -1332,6 +1363,8 @@
 void BKE_rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, short rebuild) {}
 void BKE_rigidbody_validate_sim_world(Scene *scene, RigidBodyWorld *rbw, short rebuild) {}
 struct RigidBodyWorld *BKE_rigidbody_create_world(Scene *scene) { return NULL; }
+struct RigidBodyWorld *BKE_rigidbody_world_copy(RigidBodyWorld *rbw) { return NULL; }
+void BKE_rigidbody_world_groups_relink(struct RigidBodyWorld *rbw) {}
 struct RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type) { return NULL; }
 struct RigidBodyCon *BKE_rigidbody_create_constraint(Scene *scene, Object *ob, short type) { return NULL; }
 struct RigidBodyWorld *BKE_rigidbody_get_world(Scene *scene) { return NULL; }

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2013-04-24 23:09:22 UTC (rev 56281)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2013-04-24 23:09:25 UTC (rev 56282)
@@ -176,8 +176,10 @@
 		scen->obedit = NULL;
 		scen->stats = NULL;
 		scen->fps_info = NULL;
-		scen->rigidbody_world = NULL; /* RB_TODO figure out a way of copying the rigid body world */
 
+		if(sce->rigidbody_world)
+			scen->rigidbody_world = BKE_rigidbody_world_copy(sce->rigidbody_world);
+
 		BLI_duplicatelist(&(scen->markers), &(sce->markers));
 		BLI_duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces));
 		BLI_duplicatelist(&(scen->r.layers), &(sce->r.layers));
@@ -295,6 +297,12 @@
 	return scen;
 }
 
+void BKE_scene_groups_relink(Scene *sce)
+{
+	if (sce->rigidbody_world)
+		BKE_rigidbody_world_groups_relink(sce->rigidbody_world);
+}
+
 /* do not free scene itself */
 void BKE_scene_free(Scene *sce)
 {

Modified: trunk/blender/source/blender/editors/include/ED_object.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_object.h	2013-04-24 23:09:22 UTC (rev 56281)
+++ trunk/blender/source/blender/editors/include/ED_object.h	2013-04-24 23:09:25 UTC (rev 56282)
@@ -146,8 +146,8 @@
 struct Object *ED_object_add_type(struct bContext *C, int type, const float loc[3], const float rot[3],
                                   int enter_editmode, unsigned int layer);
 
-void ED_object_single_users(struct Main *bmain, struct Scene *scene, int full);
-void ED_object_single_user(struct Scene *scene, struct Object *ob);
+void ED_object_single_users(struct Main *bmain, struct Scene *scene, bool full, bool copy_groups);
+void ED_object_single_user(struct Main *bmain, struct Scene *scene, struct Object *ob);
 
 /* object motion paths */
 void ED_objects_clear_paths(struct bContext *C);

Modified: trunk/blender/source/blender/editors/interface/interface_templates.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_templates.c	2013-04-24 23:09:22 UTC (rev 56281)
+++ trunk/blender/source/blender/editors/interface/interface_templates.c	2013-04-24 23:09:25 UTC (rev 56282)
@@ -304,8 +304,9 @@
 
 				/* make copy */
 				if (do_scene_obj) {
+					Main *bmain = CTX_data_main(C);
 					Scene *scene = CTX_data_scene(C);
-					ED_object_single_user(scene, (struct Object *)id);
+					ED_object_single_user(bmain, scene, (struct Object *)id);
 					WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene);
 				}
 				else {

Modified: trunk/blender/source/blender/editors/object/object_relations.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_relations.c	2013-04-24 23:09:22 UTC (rev 56281)
+++ trunk/blender/source/blender/editors/object/object_relations.c	2013-04-24 23:09:25 UTC (rev 56282)
@@ -44,6 +44,7 @@
 #include "DNA_material_types.h"
 #include "DNA_meta_types.h"
 #include "DNA_particle_types.h"
+#include "DNA_rigidbody_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_speaker_types.h"
 #include "DNA_world_types.h"
@@ -1601,22 +1602,24 @@
 
 /**************************** Make Single User ********************************/
 
-static void single_object_users(Scene *scene, View3D *v3d, int flag)	
+static void single_object_users(Main *bmain, Scene *scene, View3D *v3d, int flag, bool copy_groups)
 {
 	Base *base;
 	Object *ob, *obn;
+	Group *group, *groupn;
+	GroupObject *go;
 	
 	clear_sca_new_poins();  /* sensor/contr/act */
 
+	/* newid may still have some trash from Outliner tree building,
+	 * so clear that first to avoid errors [#26002] */
+	for (ob = bmain->object.first; ob; ob = ob->id.next)
+		ob->id.newid = NULL;
+
 	/* duplicate (must set newid) */
 	for (base = FIRSTBASE; base; base = base->next) {
 		ob = base->object;
 		
-		/* newid may still have some trash from Outliner tree building,
-		 * so clear that first to avoid errors [#26002]
-		 */
-		ob->id.newid = NULL;
-		
 		if ((base->flag & flag) == flag) {
 			if (ob->id.lib == NULL && ob->id.us > 1) {
 				/* base gets copy of object */
@@ -1626,11 +1629,37 @@
 			}
 		}
 	}
+
+	/* duplicate groups that consist entirely of duplicated objects */
+	for (group = bmain->group.first; group; group = group->id.next) {
+		group->id.newid = NULL;
+
+		if (copy_groups && group->gobject.first) {
+			bool all_duplicated = true;
+
+			for (go = group->gobject.first; go; go = go->next) {
+				if (!(go->ob && (go->ob->id.newid))) {
+					all_duplicated = false;
+					break;
+				}
+			}
+
+			if (all_duplicated) {
+				groupn = BKE_group_copy(group);
+
+				for (go = groupn->gobject.first; go; go = go->next)
+					go->ob = (Object*)go->ob->id.newid;
+			}
+		}
+	}
+
+	/* group pointers in scene */
+	BKE_scene_groups_relink(scene);
 	
 	ID_NEW(scene->camera);
 	if (v3d) ID_NEW(v3d->camera);
 	
-	/* object pointers */
+	/* object and group pointers */
 	for (base = FIRSTBASE; base; base = base->next) {
 		BKE_object_relink(base->object);
 	}
@@ -1640,16 +1669,17 @@
 
 /* not an especially efficient function, only added so the single user
  * button can be functional.*/
-void ED_object_single_user(Scene *scene, Object *ob)
+void ED_object_single_user(Main *bmain, Scene *scene, Object *ob)
 {
 	Base *base;
+	bool copy_groups = false;
 
 	for (base = FIRSTBASE; base; base = base->next) {
 		if (base->object == ob) base->flag |=  OB_DONE;
 		else base->flag &= ~OB_DONE;
 	}
 
-	single_object_users(scene, NULL, OB_DONE);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list