[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27719] branches/render25/source/blender: Render Branch: tweak to group transform, now group matrix is applied in

Brecht Van Lommel brecht at blender.org
Wed Mar 24 16:59:44 CET 2010


Revision: 27719
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27719
Author:   blendix
Date:     2010-03-24 16:59:44 +0100 (Wed, 24 Mar 2010)

Log Message:
-----------
Render Branch: tweak to group transform, now group matrix is applied in
where_is_object_time instead of object_handle_update to ensure it is always
applied. Still a problem with dragon tail, will attempt to fix that next.

Modified Paths:
--------------
    branches/render25/source/blender/blenkernel/BKE_object.h
    branches/render25/source/blender/blenkernel/intern/group.c
    branches/render25/source/blender/blenkernel/intern/object.c
    branches/render25/source/blender/blenkernel/intern/scene.c
    branches/render25/source/blender/editors/transform/transform_conversions.c
    branches/render25/source/blender/makesdna/DNA_object_types.h

Modified: branches/render25/source/blender/blenkernel/BKE_object.h
===================================================================
--- branches/render25/source/blender/blenkernel/BKE_object.h	2010-03-24 15:43:22 UTC (rev 27718)
+++ branches/render25/source/blender/blenkernel/BKE_object.h	2010-03-24 15:59:44 UTC (rev 27719)
@@ -121,7 +121,7 @@
 void *object_tfm_backup(struct Object *ob);
 void object_tfm_restore(struct Object *ob, void *obtfm_pt);
 
-void object_handle_update(struct Scene *scene, struct Object *ob, float groupmat[][4]);
+void object_handle_update(struct Scene *scene, struct Object *ob);
 
 float give_timeoffset(struct Object *ob);
 int give_obdata_texspace(struct Object *ob, short **texflag, float **loc, float **size, float **rot);

Modified: branches/render25/source/blender/blenkernel/intern/group.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/group.c	2010-03-24 15:43:22 UTC (rev 27718)
+++ branches/render25/source/blender/blenkernel/intern/group.c	2010-03-24 15:59:44 UTC (rev 27719)
@@ -354,6 +354,10 @@
 			if(go->ob) {
 				mul_m4_m4m4(go->ob->obmat, go->ob->obmat, parmat);
 				mul_m4_m4m4(go->ob->parentinv, go->ob->parentinv, iparmat);
+
+				/* this is applied in where_is_object_time in case the 
+				   matrix is recalculated */
+				go->ob->groupmat= (float*)parmat;
 			}
 		}
 	}
@@ -372,7 +376,7 @@
 				go->ob->recalc= go->recalc;
 				
 				group_replaces_nla(parent, go->ob, 's');
-				object_handle_update(scene, go->ob, parmat);
+				object_handle_update(scene, go->ob);
 				group_replaces_nla(parent, go->ob, 'e');
 				
 				/* leave recalc tags in case group members are in normal scene */
@@ -387,7 +391,7 @@
 		/* only do existing tags, as set by regular depsgraph */
 		for(go= group->gobject.first; go; go= go->next)
 			if(go->ob && go->ob->recalc)
-				object_handle_update(scene, go->ob, parmat);
+				object_handle_update(scene, go->ob);
 	}
 
 	if(group->id.lib) {
@@ -395,6 +399,8 @@
 			if(go->ob) {
 				mul_m4_m4m4(go->ob->obmat, go->ob->obmat, iparmat);
 				mul_m4_m4m4(go->ob->parentinv, go->ob->parentinv, parmat);
+
+				go->ob->groupmat= NULL;
 			}
 		}
 	}

Modified: branches/render25/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/object.c	2010-03-24 15:43:22 UTC (rev 27718)
+++ branches/render25/source/blender/blenkernel/intern/object.c	2010-03-24 15:59:44 UTC (rev 27719)
@@ -2065,6 +2065,14 @@
 	/* set negative scale flag in object */
 	if(is_negative_m4(ob->obmat))	ob->transflag |= OB_NEG_SCALE;
 	else							ob->transflag &= ~OB_NEG_SCALE;
+
+	if(ob->groupmat) {
+		/* if this is being called as part of dupligroup evaluation, we
+		   want the object matrices to be transformed by the duplicator
+		   so that e.g. physics systems are executed in the correct
+		   space. this is enabled in group_handle_recalc_and_update */
+		mul_m4_m4m4(ob->obmat, ob->obmat, (float(*)[4])ob->groupmat);
+	}
 }
 
 static void solve_parenting (Scene *scene, Object *ob, Object *par, float obmat[][4], float slowmat[][4], int simul)
@@ -2477,10 +2485,9 @@
 
 /* the main object update call, for object matrix, constraints, keys and displist (modifiers) */
 /* requires flags to be set! */
-void object_handle_update(Scene *scene, Object *ob, float groupmat[][4])
+void object_handle_update(Scene *scene, Object *ob)
 {
 	if(ob->recalc & OB_RECALC) {
-		
 		/* XXX new animsys warning: depsgraph tag OB_RECALC_DATA should not skip drivers, 
 		   which is only in where_is_object now */
 		if(ob->recalc & OB_RECALC) {
@@ -2493,17 +2500,8 @@
 				// printf("ob proxy copy, lib ob %s proxy %s\n", ob->id.name, ob->proxy_from->id.name);
 				copy_m4_m4(ob->obmat, ob->proxy_from->obmat);
 			}
-			else {
+			else
 				where_is_object(scene, ob);
-
-				if(groupmat) {
-					/* if this is being called as part of dupligroup evaluation, we
-					   want the object matrices to be transformed by the duplicator
-					   so that e.g. physics systems are executed in the correct
-					   space. this is here because it must run before recalc data. */
-					mul_m4_m4m4(ob->obmat, ob->obmat, groupmat);
-				}
-			}
 		}
 		
 		if(ob->recalc & OB_RECALC_DATA) {
@@ -2605,9 +2603,9 @@
 			/* set pointer in library proxy target, for copying, but restore it */
 			ob->proxy->proxy_from= ob;
 			// printf("call update, lib ob %s proxy %s\n", ob->proxy->id.name, ob->id.name);
-			object_handle_update(scene, ob->proxy, NULL);
+			object_handle_update(scene, ob->proxy);
 		}
-	
+
 		ob->recalc &= ~OB_RECALC;
 	}
 

Modified: branches/render25/source/blender/blenkernel/intern/scene.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/scene.c	2010-03-24 15:43:22 UTC (rev 27718)
+++ branches/render25/source/blender/blenkernel/intern/scene.c	2010-03-24 15:59:44 UTC (rev 27719)
@@ -898,7 +898,7 @@
 	for(base= sce->base.first; base; base= base->next) {
 		ob= base->object;
 		
-		object_handle_update(sce, ob, NULL);   // bke_object.h
+		object_handle_update(sce, ob);   // bke_object.h
 		
 		/* only update layer when an ipo */
 			// XXX old animation system
@@ -922,11 +922,11 @@
 	   dependencies on sets, but not the other way around. */
 	if(scene->set) {
 		for(SETLOOPER(scene->set, base))
-			object_handle_update(scene, base->object, NULL);
+			object_handle_update(scene, base->object);
 	}
 	
 	for(base= scene->base.first; base; base= base->next) {
-		object_handle_update(scene, base->object, NULL);
+		object_handle_update(scene, base->object);
 	}
 
 	/* recalc scene animation data here (for sequencer) */

Modified: branches/render25/source/blender/editors/transform/transform_conversions.c
===================================================================
--- branches/render25/source/blender/editors/transform/transform_conversions.c	2010-03-24 15:43:22 UTC (rev 27718)
+++ branches/render25/source/blender/editors/transform/transform_conversions.c	2010-03-24 15:59:44 UTC (rev 27719)
@@ -4292,7 +4292,7 @@
 	/* handle pending update events, otherwise they got copied below */
 	for (base= scene->base.first; base; base= base->next) {
 		if(base->object->recalc)
-			object_handle_update(t->scene, base->object, NULL);
+			object_handle_update(t->scene, base->object);
 	}
 
 	for (base= scene->base.first; base; base= base->next) {

Modified: branches/render25/source/blender/makesdna/DNA_object_types.h
===================================================================
--- branches/render25/source/blender/makesdna/DNA_object_types.h	2010-03-24 15:43:22 UTC (rev 27718)
+++ branches/render25/source/blender/makesdna/DNA_object_types.h	2010-03-24 15:59:44 UTC (rev 27719)
@@ -250,12 +250,12 @@
 	int lastDataMask;			/* the custom data layer mask that was last used to calculate derivedDeform and derivedFinal */
 	unsigned int state;			/* bit masks of game controllers that are active */
 	unsigned int init_state;	/* bit masks of initial state as recorded by the users */
+	unsigned int pad2;
 
-	int pad2;
-
 	ListBase gpulamp;		/* runtime, for lamps only */
 	ListBase pc_ids;
 	ListBase *duplilist;	/* for temporary dupli list storage, only for use by RNA API */
+	float *groupmat;		/* runtime, temporarily set during group evaluation */
 } Object;
 
 /* Warning, this is not used anymore because hooks are now modifiers */





More information about the Bf-blender-cvs mailing list