rigidbody: Relink constraints when duplicating objects
authorSergej Reich <sergej.reich@googlemail.com>
Sat, 9 Feb 2013 10:04:25 +0000 (10:04 +0000)
committerSergej Reich <sergej.reich@googlemail.com>
Sat, 9 Feb 2013 10:04:25 +0000 (10:04 +0000)
This will preserve constraint <-> rigid body realationships so
constraint setups aren't broken after duplication.

Based on a patch by Brandon Hechinger (jaggz), thanks.

source/blender/blenkernel/BKE_rigidbody.h
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/rigidbody.c

index 607c302..2b19f60 100644 (file)
@@ -52,6 +52,7 @@ void BKE_rigidbody_free_constraint(struct Object *ob);
 
 struct RigidBodyOb *BKE_rigidbody_copy_object(struct Object *ob);
 struct RigidBodyCon *BKE_rigidbody_copy_constraint(struct Object *ob);
+void BKE_rigidbody_relink_constraint(struct RigidBodyCon *rbc);
 
 /* -------------- */
 /* Setup */
index 2312d80..8745762 100644 (file)
@@ -3185,6 +3185,9 @@ void BKE_object_relink(Object *ob)
 
        if (ob->adt)
                BKE_relink_animdata(ob->adt);
+       
+       if (ob->rigidbody_constraint)
+               BKE_rigidbody_relink_constraint(ob->rigidbody_constraint);
 
        ID_NEW(ob->parent);
 
index 58afc65..2435514 100644 (file)
@@ -203,8 +203,6 @@ RigidBodyCon *BKE_rigidbody_copy_constraint(Object *ob)
                /* just duplicate the whole struct first (to catch all the settings) */
                rbcN = MEM_dupallocN(ob->rigidbody_constraint);
 
-               // RB_TODO be more clever about copying constrained objects
-
                /* tag object as needing to be verified */
                rbcN->flag |= RBC_FLAG_NEEDS_VALIDATE;
 
@@ -216,6 +214,13 @@ RigidBodyCon *BKE_rigidbody_copy_constraint(Object *ob)
        return rbcN;
 }
 
+/* preserve relationships between constraints and rigid bodies after duplication */
+void BKE_rigidbody_relink_constraint(RigidBodyCon *rbc)
+{
+       ID_NEW(rbc->ob1);
+       ID_NEW(rbc->ob2);
+}
+
 /* ************************************** */
 /* Setup Utilities - Validate Sim Instances */
 
@@ -1291,6 +1296,7 @@ void BKE_rigidbody_free_object(Object *ob) {}
 void BKE_rigidbody_free_constraint(Object *ob) {}
 struct RigidBodyOb *BKE_rigidbody_copy_object(Object *ob) { return NULL; }
 struct RigidBodyCon *BKE_rigidbody_copy_constraint(Object *ob) { return NULL; }
+void BKE_rigidbody_relink_constraint(RigidBodyCon *rbc) {}
 void BKE_rigidbody_validate_sim_shape(Object *ob, short rebuild) {}
 void BKE_rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, short rebuild) {}
 void BKE_rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, short rebuild) {}