From 6c1c6f22cea9729c40e02ed45374bad31fbca6dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Thu, 23 Jan 2014 10:20:42 +0100 Subject: Removed the omat matrix from DupliObject. This was storing the original object matrix, which builds on the assumption that obmat is modified during dupli construction, which is a bad hack. Now the obmats are still modified, but this only happens outside of the dupli system itself and the original ("omat") is stored as local variables in the same place where the obmat manipulation takes place. This is easier to follow and avoids hidden hacks as much as possible. Reviewed By: campbellbarton Differential Revision: https://developer.blender.org/D254 --- source/blender/blenkernel/intern/scene.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'source/blender/blenkernel/intern/scene.c') diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index ca6ff4dc1e5..584aab9f84a 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -747,7 +747,7 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter, /* init */ if (val == 0) { - iter->fase = F_START; + iter->phase = F_START; iter->dupob = NULL; iter->duplilist = NULL; } @@ -757,11 +757,11 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter, run_again = 0; /* the first base */ - if (iter->fase == F_START) { + if (iter->phase == F_START) { *base = (*scene)->base.first; if (*base) { *ob = (*base)->object; - iter->fase = F_SCENE; + iter->phase = F_SCENE; } else { /* exception: empty scene */ @@ -770,20 +770,20 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter, if ((*scene)->base.first) { *base = (*scene)->base.first; *ob = (*base)->object; - iter->fase = F_SCENE; + iter->phase = F_SCENE; break; } } } } else { - if (*base && iter->fase != F_DUPLI) { + if (*base && iter->phase != F_DUPLI) { *base = (*base)->next; if (*base) { *ob = (*base)->object; } else { - if (iter->fase == F_SCENE) { + if (iter->phase == F_SCENE) { /* (*scene) is finished, now do the set */ while ((*scene)->set) { (*scene) = (*scene)->set; @@ -799,10 +799,10 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter, } if (*base == NULL) { - iter->fase = F_START; + iter->phase = F_START; } else { - if (iter->fase != F_DUPLI) { + if (iter->phase != F_DUPLI) { if ( (*base)->object->transflag & OB_DUPLI) { /* groups cannot be duplicated for mballs yet, * this enters eternal loop because of @@ -820,20 +820,21 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter, /* handle dupli's */ if (iter->dupob) { + copy_m4_m4(iter->omat, iter->dupob->ob->obmat); copy_m4_m4(iter->dupob->ob->obmat, iter->dupob->mat); (*base)->flag |= OB_FROMDUPLI; *ob = iter->dupob->ob; - iter->fase = F_DUPLI; + iter->phase = F_DUPLI; iter->dupob = iter->dupob->next; } - else if (iter->fase == F_DUPLI) { - iter->fase = F_SCENE; + else if (iter->phase == F_DUPLI) { + iter->phase = F_SCENE; (*base)->flag &= ~OB_FROMDUPLI; for (iter->dupob = iter->duplilist->first; iter->dupob; iter->dupob = iter->dupob->next) { - copy_m4_m4(iter->dupob->ob->obmat, iter->dupob->omat); + copy_m4_m4(iter->dupob->ob->obmat, iter->omat); } free_object_duplilist(iter->duplilist); @@ -850,7 +851,7 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter, } #endif - return iter->fase; + return iter->phase; } Object *BKE_scene_camera_find(Scene *sc) -- cgit v1.2.3