Fix crash happening with hair step
authorSergey Sharybin <sergey.vfx@gmail.com>
Fri, 25 Jan 2019 12:58:42 +0000 (13:58 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Fri, 25 Jan 2019 13:02:31 +0000 (14:02 +0100)
The issue was caused by the hair step checking whether
particle system needs to have path cache. This was done
in a way which was traversing an entire scene and was
checking every object for particle instance modifier.

Ideally, path cache should be an own operation in the
dependency graph. Or at least, this flag should be set
by dependency graph builder, similar to curve's path.

Since the code was broken already (it was only checking
first particle instance modifier), it is easier to
remove the buggy code, solve the crash and move on for
now.

If this causes an issue, simply set particle system to
be rendered as path.

Fixes crash with playback of Spring scenes.

source/blender/blenkernel/intern/particle_system.c

index 86d2ceddced6fecc0a8020709930e7bd0da102b6..bed03858db8c8746237cb5889d931c9619fb1acb 100644 (file)
@@ -2969,23 +2969,6 @@ static void psys_update_path_cache(ParticleSimulationData *sim, float cfra, cons
                }
        }
 
-
-       /* particle instance modifier with "path" option need cached paths even if particle system doesn't */
-       if (skip) {
-               FOREACH_SCENE_OBJECT_BEGIN(sim->scene, ob)
-               {
-                       ModifierData *md = modifiers_findByType(ob, eModifierType_ParticleInstance);
-                       if (md) {
-                               ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData *)md;
-                               if (pimd->flag & eParticleInstanceFlag_Path && pimd->ob == sim->ob && pimd->psys == (psys - (ParticleSystem*)sim->ob->particlesystem.first)) {
-                                       skip = 0;
-                                       break;
-                               }
-                       }
-               }
-               FOREACH_SCENE_OBJECT_END;
-       }
-
        if (!skip) {
                psys_cache_paths(sim, cfra, use_render_params);