[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60230] trunk/blender/source/blender/ blenkernel/intern/anim.c: fix [#36625] Particle Instances ignores Group offsets

Campbell Barton ideasman42 at gmail.com
Thu Sep 19 03:21:36 CEST 2013


Revision: 60230
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60230
Author:   campbellbarton
Date:     2013-09-19 01:21:34 +0000 (Thu, 19 Sep 2013)
Log Message:
-----------
fix [#36625] Particle Instances ignores Group offsets
in fact this failed for all nested dupli types except for dupli-groups, (which ignore the 'par_space_mat' object_duplilist_recursive()).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/anim.c

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2013-09-18 23:21:24 UTC (rev 60229)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2013-09-19 01:21:34 UTC (rev 60230)
@@ -751,14 +751,24 @@
 	DupliObject *dob;
 	Group *group;
 	GroupObject *go;
-	float mat[4][4], tmat[4][4], id;
-	
+	float mat[4][4], ob_obmat_ofs[4][4], id;
+
 	if (ob->dup_group == NULL) return;
 	group = ob->dup_group;
 	
 	/* simple preventing of too deep nested groups */
 	if (level > MAX_DUPLI_RECUR) return;
 	
+	/* don't access 'ob->obmat' from now on. */
+	copy_m4_m4(ob_obmat_ofs, ob->obmat);
+
+	if (!is_zero_v3(group->dupli_ofs)) {
+		float tvec[3];
+		copy_v3_v3(tvec, group->dupli_ofs);
+		mul_mat3_m4_v3(ob_obmat_ofs, tvec);
+		sub_v3_v3(ob_obmat_ofs[3], tvec);
+	}
+
 	/* handles animated groups, and */
 
 	/* we need to check update for objects that are not in scene... */
@@ -776,14 +786,7 @@
 		if (go->ob != ob) {
 			
 			/* group dupli offset, should apply after everything else */
-			if (!is_zero_v3(group->dupli_ofs)) {
-				copy_m4_m4(tmat, go->ob->obmat);
-				sub_v3_v3v3(tmat[3], tmat[3], group->dupli_ofs);
-				mul_m4_m4m4(mat, ob->obmat, tmat);
-			}
-			else {
-				mul_m4_m4m4(mat, ob->obmat, go->ob->obmat);
-			}
+			mul_m4_m4m4(mat, ob_obmat_ofs, go->ob->obmat);
 			
 			dob = new_dupli_object(lb, go->ob, mat, ob->lay, persistent_id, level, id, OB_DUPLIGROUP, flag);
 
@@ -797,7 +800,7 @@
 
 			if (go->ob->transflag & OB_DUPLI) {
 				copy_m4_m4(dob->ob->obmat, dob->mat);
-				object_duplilist_recursive(&group->id, scene, go->ob, lb, ob->obmat, persistent_id, level + 1, id, flag);
+				object_duplilist_recursive(&group->id, scene, go->ob, lb, ob_obmat_ofs, persistent_id, level + 1, id, flag);
 				copy_m4_m4(dob->ob->obmat, dob->omat);
 			}
 		}




More information about the Bf-blender-cvs mailing list