Better fix for #32846. Instead of using time change or object recalc condition, set...
authorLukas Toenne <lukas.toenne@googlemail.com>
Thu, 18 Oct 2012 15:54:24 +0000 (15:54 +0000)
committerLukas Toenne <lukas.toenne@googlemail.com>
Thu, 18 Oct 2012 15:54:24 +0000 (15:54 +0000)
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/makesdna/DNA_object_types.h
source/blender/modifiers/intern/MOD_particlesystem.c

index 9aaeb4c8baf652bb9056b8c98e6231e0ae7d6b29..30804518e1daaf1a5732a990c2c9281129686f87 100644 (file)
@@ -2249,8 +2249,16 @@ DerivedMesh *mesh_create_derived_view(Scene *scene, Object *ob, CustomDataMask d
 {
        DerivedMesh *final;
 
+       /* XXX hack
+        * psys modifier updates particle state when called during dupli-list generation,
+        * which can lead to wrong transforms. This disables particle system modifier execution.
+        */
+       ob->transflag |= OB_NO_PSYS_UPDATE;
+
        mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 0, 1, 0, dataMask, -1, 0, 0);
 
+       ob->transflag &= ~OB_NO_PSYS_UPDATE;
+
        return final;
 }
 
index 3a8620fdaba3d199cba6945517cfe7f8975adf45..2fc04c4a5db72fc4700f9f5b698264e885523b17 100644 (file)
@@ -378,6 +378,7 @@ typedef struct DupliObject {
 #define OB_DUPLIPARTS          2048
 #define OB_RENDER_DUPLI                4096
 #define OB_NO_CONSTRAINTS      8192 /* runtime constraints disable */
+#define OB_NO_PSYS_UPDATE      16384 /* hack to work around particle issue */
 
 /* (short) ipoflag */
 /* XXX: many old flags for features removed due to incompatibility
index c4db9375a4a4c8d60a0bd59374afdff872bcc915..6d6c1361566ff116760f009f1aa826a7a3e7e850 100644 (file)
@@ -190,12 +190,7 @@ static void deformVerts(ModifierData *md, Object *ob,
                psmd->totdmface = psmd->dm->getNumTessFaces(psmd->dm);
        }
 
-       /* skip the particle update if no timestep is performed or initialization required.
-        * XXX this is a workaround for bug #32846, which is caused by modifier updates
-        * during dupli-list generation (in cycles). The dupli-list generation can temporarily change
-        * the ob->obmat matrix, which in turn leads to wrong particle states if used for reset ...
-        */
-       if (psys->cfra != cfra || psys->recalc) {
+       if (!(ob->transflag & OB_NO_PSYS_UPDATE)) {
                psmd->flag &= ~eParticleSystemFlag_psys_updated;
                particle_system_update(md->scene, ob, psys);
                psmd->flag |= eParticleSystemFlag_psys_updated;