[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27711] branches/render25/source/blender: Render Branch: linked groups object matrix and data evaluation no longer

Brecht Van Lommel brecht at blender.org
Wed Mar 24 11:14:40 CET 2010


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

Log Message:
-----------
Render Branch: linked groups object matrix and data evaluation no longer
happens in group space now, but in scene/world space. This ensures e.g.
gravity goes in the right direction if the group is rotated, or collision
with objects outside of the group works. This only works correct if there
is one instance of the group, but that was the case already.

This also fixes collision with objects in groups not working, and removes
some object_handle_update calls that should no longer be needed in 2.5.

Modified Paths:
--------------
    branches/render25/source/blender/blenkernel/BKE_object.h
    branches/render25/source/blender/blenkernel/intern/collision.c
    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/blenlib/intern/math_matrix.c
    branches/render25/source/blender/editors/mesh/editmesh_tools.c
    branches/render25/source/blender/editors/space_outliner/outliner.c
    branches/render25/source/blender/editors/transform/transform_conversions.c
    branches/render25/source/blender/editors/uvedit/uvedit_draw.c

Modified: branches/render25/source/blender/blenkernel/BKE_object.h
===================================================================
--- branches/render25/source/blender/blenkernel/BKE_object.h	2010-03-24 10:07:54 UTC (rev 27710)
+++ branches/render25/source/blender/blenkernel/BKE_object.h	2010-03-24 10:14:39 UTC (rev 27711)
@@ -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);
+void object_handle_update(struct Scene *scene, struct Object *ob, float groupmat[][4]);
 
 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/collision.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/collision.c	2010-03-24 10:07:54 UTC (rev 27710)
+++ branches/render25/source/blender/blenkernel/intern/collision.c	2010-03-24 10:14:39 UTC (rev 27711)
@@ -1314,8 +1314,8 @@
 	// check all collision objects
 	for ( base = scene->base.first; base; base = base->next )
 	{
-		/*Only proceed for mesh object in same layer */
-		if(!(base->object->type==OB_MESH && (base->lay & self->lay))) 
+		/* object in same layer */
+		if(!(base->lay & self->lay)) 
 			continue;
 		
 		coll_ob = base->object;

Modified: branches/render25/source/blender/blenkernel/intern/group.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/group.c	2010-03-24 10:07:54 UTC (rev 27710)
+++ branches/render25/source/blender/blenkernel/intern/group.c	2010-03-24 10:14:39 UTC (rev 27711)
@@ -40,6 +40,7 @@
 #include "DNA_particle_types.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_math.h"
 
 #include "BKE_global.h"
 #include "BKE_group.h"
@@ -330,7 +331,33 @@
 void group_handle_recalc_and_update(Scene *scene, Object *parent, Group *group)
 {
 	GroupObject *go;
+	float parmat[4][4], iparmat[4][4];
+	int need_recalc= 0;
+
+	/* test if we need a recalculation */
+	for(go= group->gobject.first; go; go= go->next)
+		if(go->ob && (go->recalc || go->ob->recalc))
+			need_recalc= 1;
 	
+	if(!need_recalc)
+		return;
+
+	if(group->id.lib) {
+		/* in case of linked groups, we ensure all object matrices are
+		   transformed into the group space. this is to make e.g. physics
+		   systems apply gravity in the right direction, but it clearly
+		   does not work for multiple instances */
+		copy_m4_m4(parmat, parent->obmat);
+		invert_m4_m4(iparmat, parmat);
+
+		for(go= group->gobject.first; go; go= go->next) {
+			if(go->ob) {
+				mul_m4_m4m4(go->ob->obmat, go->ob->obmat, parmat);
+				mul_m4_m4m4(go->ob->parentinv, go->ob->parentinv, iparmat);
+			}
+		}
+	}
+
 	/* if animated group... */
 	if(give_timeoffset(parent) != 0.0f || parent->nlastrips.first) {
 		int cfrao;
@@ -338,14 +365,14 @@
 		/* switch to local time */
 		cfrao= scene->r.cfra;
 		scene->r.cfra -= (int)give_timeoffset(parent);
-		
+
 		/* we need a DAG per group... */
 		for(go= group->gobject.first; go; go= go->next) {
 			if(go->ob && go->recalc) {
 				go->ob->recalc= go->recalc;
 				
 				group_replaces_nla(parent, go->ob, 's');
-				object_handle_update(scene, go->ob);
+				object_handle_update(scene, go->ob, parmat);
 				group_replaces_nla(parent, go->ob, 'e');
 				
 				/* leave recalc tags in case group members are in normal scene */
@@ -358,11 +385,16 @@
 	}
 	else {
 		/* 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);
+	}
+
+	if(group->id.lib) {
 		for(go= group->gobject.first; go; go= go->next) {
 			if(go->ob) {
-				if(go->ob->recalc) {
-					object_handle_update(scene, go->ob);
-				}
+				mul_m4_m4m4(go->ob->obmat, go->ob->obmat, iparmat);
+				mul_m4_m4m4(go->ob->parentinv, go->ob->parentinv, parmat);
 			}
 		}
 	}

Modified: branches/render25/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/object.c	2010-03-24 10:07:54 UTC (rev 27710)
+++ branches/render25/source/blender/blenkernel/intern/object.c	2010-03-24 10:14:39 UTC (rev 27711)
@@ -2477,7 +2477,7 @@
 
 /* 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)
+void object_handle_update(Scene *scene, Object *ob, float groupmat[][4])
 {
 	if(ob->recalc & OB_RECALC) {
 		
@@ -2491,16 +2491,19 @@
 			/* handle proxy copy for target */
 			if(ob->id.lib && ob->proxy_from) {
 				// printf("ob proxy copy, lib ob %s proxy %s\n", ob->id.name, ob->proxy_from->id.name);
-				if(ob->proxy_from->proxy_group) {/* transform proxy into group space */
-					Object *obg= ob->proxy_from->proxy_group;
-					invert_m4_m4(obg->imat, obg->obmat);
-					mul_m4_m4m4(ob->obmat, ob->proxy_from->obmat, obg->imat);
+				copy_m4_m4(ob->obmat, ob->proxy_from->obmat);
+			}
+			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);
 				}
-				else
-					copy_m4_m4(ob->obmat, ob->proxy_from->obmat);
 			}
-			else
-				where_is_object(scene, ob);
 		}
 		
 		if(ob->recalc & OB_RECALC_DATA) {
@@ -2602,7 +2605,7 @@
 			/* 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);
+			object_handle_update(scene, ob->proxy, NULL);
 		}
 	
 		ob->recalc &= ~OB_RECALC;

Modified: branches/render25/source/blender/blenkernel/intern/scene.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/scene.c	2010-03-24 10:07:54 UTC (rev 27710)
+++ branches/render25/source/blender/blenkernel/intern/scene.c	2010-03-24 10:14:39 UTC (rev 27711)
@@ -898,7 +898,7 @@
 	for(base= sce->base.first; base; base= base->next) {
 		ob= base->object;
 		
-		object_handle_update(sce, ob);   // bke_object.h
+		object_handle_update(sce, ob, NULL);   // 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);
+			object_handle_update(scene, base->object, NULL);
 	}
 	
 	for(base= scene->base.first; base; base= base->next) {
-		object_handle_update(scene, base->object);
+		object_handle_update(scene, base->object, NULL);
 	}
 
 	/* recalc scene animation data here (for sequencer) */

Modified: branches/render25/source/blender/blenlib/intern/math_matrix.c
===================================================================
--- branches/render25/source/blender/blenlib/intern/math_matrix.c	2010-03-24 10:07:54 UTC (rev 27710)
+++ branches/render25/source/blender/blenlib/intern/math_matrix.c	2010-03-24 10:14:39 UTC (rev 27711)
@@ -125,10 +125,15 @@
 
 /******************************** Arithmetic *********************************/
 
-void mul_m4_m4m4(float m1[][4], float m2[][4], float m3[][4])
+void mul_m4_m4m4(float m1[][4], float m2_[][4], float m3_[][4])
 {
-  /* matrix product: m1[j][k] = m2[j][i].m3[i][k] */
+	float m2[4][4], m3[4][4];
 
+	/* copy so it works when m1 is the same pointer as m2 or m3 */
+	copy_m4_m4(m2, m2_);
+	copy_m4_m4(m3, m3_);
+
+	/* matrix product: m1[j][k] = m2[j][i].m3[i][k] */
 	m1[0][0] = m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0] + m2[0][3]*m3[3][0];
 	m1[0][1] = m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1] + m2[0][3]*m3[3][1];
 	m1[0][2] = m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2] + m2[0][3]*m3[3][2];
@@ -151,20 +156,26 @@
 
 }
 
-void mul_m3_m3m3(float m1[][3], float m3[][3], float m2[][3])
+void mul_m3_m3m3(float m1[][3], float m3_[][3], float m2_[][3])
 {
-   /*  m1[i][j] = m2[i][k]*m3[k][j], args are flipped!  */
-	  m1[0][0]= m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0]; 
-	  m1[0][1]= m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1]; 
-	  m1[0][2]= m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2]; 
+	float m2[3][3], m3[3][3];
 
-	  m1[1][0]= m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0]; 
-	  m1[1][1]= m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1]; 
-	  m1[1][2]= m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2]; 
+	/* copy so it works when m1 is the same pointer as m2 or m3 */
+	copy_m3_m3(m2, m2_);
+	copy_m3_m3(m3, m3_);
 
-	  m1[2][0]= m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0]; 
-	  m1[2][1]= m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1]; 
-	  m1[2][2]= m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2]; 
+	/* m1[i][j] = m2[i][k]*m3[k][j], args are flipped!  */
+	m1[0][0]= m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0]; 
+	m1[0][1]= m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1]; 
+	m1[0][2]= m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2]; 
+
+	m1[1][0]= m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0]; 
+	m1[1][1]= m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1]; 
+	m1[1][2]= m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2]; 
+
+	m1[2][0]= m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0]; 
+	m1[2][1]= m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1]; 
+	m1[2][2]= m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2]; 
 }
 
 void mul_m4_m4m3(float (*m1)[4], float (*m3)[4], float (*m2)[3])

Modified: branches/render25/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- branches/render25/source/blender/editors/mesh/editmesh_tools.c	2010-03-24 10:07:54 UTC (rev 27710)
+++ branches/render25/source/blender/editors/mesh/editmesh_tools.c	2010-03-24 10:14:39 UTC (rev 27711)
@@ -640,8 +640,7 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list