"Fix" for #17636 Crashing bug - won't open a file
authorJanne Karhu <jhkarh@gmail.com>
Tue, 16 Sep 2008 18:40:54 +0000 (18:40 +0000)
committerJanne Karhu <jhkarh@gmail.com>
Tue, 16 Sep 2008 18:40:54 +0000 (18:40 +0000)
- The cause was indeed corrupted particle settings which should have caused a deletion of the whole particle system. However the particle modifier was still left and that led to the crash.
- A "fix" because there's really no way of knowing what caused the corruption of the particle settings. If anyone else gets this and can recreate I'd love to get a .blend. Now that there shouldn't be a crash anymore the symptom will be a missing particle system after file load in an object that had a particle system before.

source/blender/blenkernel/intern/depsgraph.c
source/blender/blenkernel/intern/particle.c
source/blender/blenloader/intern/readfile.c

index 1be0a2aafdbfef0c0b4313918ad924c6686adbec..d958c43aa40a276175f5fc1a4fb5a69ebfa03e71 100644 (file)
@@ -581,9 +581,12 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Object *ob, int
 
                for(; psys; psys=psys->next) {
                        ParticleSettings *part= psys->part;
-                       
+
                        dag_add_relation(dag, node, node, DAG_RL_OB_DATA, "Particle-Object Relation");
 
+                       if(psys->flag & PSYS_DISABLED || psys->flag & PSYS_DELETE)
+                               continue;
+
                        if(part->phystype==PART_PHYS_KEYED && psys->keyed_ob &&
                           BLI_findlink(&psys->keyed_ob->particlesystem,psys->keyed_psys-1)) {
                                node2 = dag_get_node(dag, psys->keyed_ob);
index 2678608fb9a3f4a6c1ab9e05164d15968ddcd023..c9d16c0017fbbce553a67745a9e594251b064f27 100644 (file)
@@ -296,7 +296,7 @@ int psys_check_enabled(Object *ob, ParticleSystem *psys)
        ParticleSystemModifierData *psmd;
        Mesh *me;
 
-       if(psys->flag & PSYS_DISABLED)
+       if(psys->flag & PSYS_DISABLED || psys->flag & PSYS_DELETE)
                return 0;
 
        if(ob->type == OB_MESH) {
index 8865e3bb173c9500487aafbeacc28a451eb36c1c..6add88284c2d7cac8e3807335477144286945cb2 100644 (file)
@@ -2596,7 +2596,7 @@ static void direct_link_particlesettings(FileData *fd, ParticleSettings *part)
        part->pd2= newdataadr(fd, part->pd2);
 }
 
-static void lib_link_particlesystems(FileData *fd, ID *id, ListBase *particles)
+static void lib_link_particlesystems(FileData *fd, Object *ob, ID *id, ListBase *particles)
 {
        ParticleSystem *psys, *psysnext;
        int a;
@@ -2616,6 +2616,11 @@ static void lib_link_particlesystems(FileData *fd, ID *id, ListBase *particles)
                        }
                }
                else {
+                       /* particle modifier must be removed before particle system */
+                       ParticleSystemModifierData *psmd= psys_get_modifier(ob,psys);
+                       BLI_remlink(&ob->modifiers, psmd);
+                       modifier_free((ModifierData *)psmd);
+
                        BLI_remlink(particles, psys);
                        MEM_freeN(psys);
                }
@@ -3069,7 +3074,7 @@ static void lib_link_object(FileData *fd, Main *main)
                                        ob->pd->tex=newlibadr_us(fd, ob->id.lib, ob->pd->tex);
 
                        lib_link_scriptlink(fd, &ob->id, &ob->scriptlink);
-                       lib_link_particlesystems(fd, &ob->id, &ob->particlesystem);
+                       lib_link_particlesystems(fd, ob, &ob->id, &ob->particlesystem);
                        lib_link_modifiers(fd, ob);
                }
                ob= ob->id.next;