[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27748] branches/render25/source/blender: Render Branch: Yet another fix for group transform, it was suffering from
Brecht Van Lommel
brecht at blender.org
Thu Mar 25 17:02:48 CET 2010
Revision: 27748
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27748
Author: blendix
Date: 2010-03-25 17:02:00 +0100 (Thu, 25 Mar 2010)
Log Message:
-----------
Render Branch: Yet another fix for group transform, it was suffering from
numerical drift, now we backup matrices and restore if they were not modified.
Modified Paths:
--------------
branches/render25/source/blender/blenkernel/intern/group.c
branches/render25/source/blender/blenkernel/intern/object.c
branches/render25/source/blender/makesdna/DNA_object_types.h
Modified: branches/render25/source/blender/blenkernel/intern/group.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/group.c 2010-03-25 15:21:31 UTC (rev 27747)
+++ branches/render25/source/blender/blenkernel/intern/group.c 2010-03-25 16:02:00 UTC (rev 27748)
@@ -331,16 +331,23 @@
void group_handle_recalc_and_update(Scene *scene, Object *parent, Group *group)
{
GroupObject *go;
+ float (*parentinv)[4][4], (*obmat)[4][4];
float parmat[4][4], iparmat[4][4];
- int need_recalc= 0;
+ int need_recalc= 0, tot= 0, a;
/* test if we need a recalculation */
- for(go= group->gobject.first; go; go= go->next)
+ for(go= group->gobject.first; go; go= go->next) {
+ tot++;
+
if(go->ob && (go->recalc || go->ob->recalc))
need_recalc= 1;
+ }
if(!need_recalc)
return;
+
+ parentinv= MEM_callocN(sizeof(float)*4*4*tot, "group parentinv");
+ obmat= MEM_callocN(sizeof(float)*4*4*tot, "group obmat");
if(group->id.lib) {
/* in case of linked groups, we ensure all object matrices are
@@ -350,14 +357,18 @@
copy_m4_m4(parmat, parent->obmat);
invert_m4_m4(iparmat, parmat);
- for(go= group->gobject.first; go; go= go->next) {
+ for(a=0, go= group->gobject.first; go; go= go->next, a++) {
if(go->ob) {
+ copy_m4_m4(parentinv[a], go->ob->parentinv);
+ copy_m4_m4(obmat[a], go->ob->obmat);
+
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;
+ go->ob->groupmodified= 0;
}
}
}
@@ -395,15 +406,25 @@
}
if(group->id.lib) {
- for(go= group->gobject.first; go; go= go->next) {
+ for(a=0, go= group->gobject.first; go; go= go->next, a++) {
if(go->ob) {
- mul_m4_m4m4(go->ob->obmat, go->ob->obmat, iparmat);
- mul_m4_m4m4(go->ob->parentinv, go->ob->parentinv, parmat);
+ /* we restore object matrices by copy to avoid numerical
+ drift, also matrices may not be exactly invertible */
+ if(go->ob->groupmodified)
+ mul_m4_m4m4(go->ob->obmat, go->ob->obmat, iparmat);
+ else
+ copy_m4_m4(go->ob->obmat, obmat[a]);
+ copy_m4_m4(go->ob->parentinv, parentinv[a]);
+
go->ob->groupmat= NULL;
+ go->ob->groupmodified= 0;
}
}
}
+
+ MEM_freeN(parentinv);
+ MEM_freeN(obmat);
}
Object *group_get_member_with_action(Group *group, bAction *act)
Modified: branches/render25/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/object.c 2010-03-25 15:21:31 UTC (rev 27747)
+++ branches/render25/source/blender/blenkernel/intern/object.c 2010-03-25 16:02:00 UTC (rev 27748)
@@ -2014,8 +2014,9 @@
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);
+ ob->groupmodified= 1;
}
-
+
if(ob->parent) {
Object *par= ob->parent;
Modified: branches/render25/source/blender/makesdna/DNA_object_types.h
===================================================================
--- branches/render25/source/blender/makesdna/DNA_object_types.h 2010-03-25 15:21:31 UTC (rev 27747)
+++ branches/render25/source/blender/makesdna/DNA_object_types.h 2010-03-25 16:02:00 UTC (rev 27748)
@@ -255,7 +255,10 @@
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 */
+ int groupmodified; /* runtime, to indicate if we modified object matrix */
+ int pad3;
} Object;
/* Warning, this is not used anymore because hooks are now modifiers */
More information about the Bf-blender-cvs
mailing list