[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