Particle ID block controls:
[blender.git] / source / blender / blenkernel / intern / particle.c
index 04215b1ddd1453fc2972429bb867b0c0bd126e31..2474053298d81a1148b2715dbf6af847842b923d 100644 (file)
@@ -222,6 +222,20 @@ short psys_get_current_num(Object *ob)
        
        return i;
 }
        
        return i;
 }
+void psys_set_current_num(Object *ob, int index)
+{
+       ParticleSystem *psys;
+       short i;
+
+       if(ob==0) return;
+
+       for(psys=ob->particlesystem.first, i=0; psys; psys=psys->next, i++) {
+               if(i == index - 1)
+                       psys->flag |= PSYS_CURRENT;
+               else
+                       psys->flag &= ~PSYS_CURRENT;
+       }
+}
 Object *psys_find_object(Scene *scene, ParticleSystem *psys)
 {
        Base *base = scene->base.first;
 Object *psys_find_object(Scene *scene, ParticleSystem *psys)
 {
        Base *base = scene->base.first;
@@ -307,7 +321,7 @@ int psys_check_enabled(Object *ob, ParticleSystem *psys)
        ParticleSystemModifierData *psmd;
        Mesh *me;
 
        ParticleSystemModifierData *psmd;
        Mesh *me;
 
-       if(psys->flag & PSYS_DISABLED || psys->flag & PSYS_DELETE)
+       if(psys->flag & PSYS_DISABLED || psys->flag & PSYS_DELETE || !psys->part)
                return 0;
 
        if(ob->type == OB_MESH) {
                return 0;
 
        if(ob->type == OB_MESH) {
@@ -2915,6 +2929,61 @@ void psys_mat_hair_to_global(Object *ob, DerivedMesh *dm, short from, ParticleDa
 /************************************************/
 /*                     ParticleSettings handling                       */
 /************************************************/
 /************************************************/
 /*                     ParticleSettings handling                       */
 /************************************************/
+void object_add_particle_system_slot(Scene *scene, Object *ob)
+{
+       ParticleSystem *psys;
+       ModifierData *md;
+       ParticleSystemModifierData *psmd;
+
+       if(!ob || ob->type != OB_MESH)
+               return;
+
+       psys = ob->particlesystem.first;
+       for(; psys; psys=psys->next)
+               psys->flag &= ~PSYS_CURRENT;
+
+       psys = MEM_callocN(sizeof(ParticleSystem), "particle_system");
+       psys->pointcache = BKE_ptcache_add();
+       BLI_addtail(&ob->particlesystem, psys);
+
+       psys->part = psys_new_settings("PSys", NULL);
+
+       md= modifier_new(eModifierType_ParticleSystem);
+       sprintf(md->name, "ParticleSystem %i", BLI_countlist(&ob->particlesystem));
+       psmd= (ParticleSystemModifierData*) md;
+       psmd->psys=psys;
+       BLI_addtail(&ob->modifiers, md);
+
+       psys->totpart=0;
+       psys->flag = PSYS_ENABLED|PSYS_CURRENT;
+       psys->cfra=bsystem_time(scene,ob,scene->r.cfra+1,0.0);
+
+       DAG_scene_sort(scene);
+       DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+}
+void object_remove_particle_system_slot(Scene *scene, Object *ob)
+{
+       ParticleSystem *psys = psys_get_current(ob);
+       ParticleSystemModifierData *psmd;
+
+       if(!psys)
+               return;
+
+       /* clear modifier */
+       psmd= psys_get_modifier(ob, psys);
+       BLI_remlink(&ob->modifiers, psmd);
+       modifier_free((ModifierData *)psmd);
+
+       /* clear particle system */
+       BLI_remlink(&ob->particlesystem, psys);
+       psys_free(ob,psys);
+
+       if(ob->particlesystem.first)
+               ((ParticleSystem *) ob->particlesystem.first)->flag |= PSYS_CURRENT;
+
+       DAG_scene_sort(scene);
+       DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+}
 static void default_particle_settings(ParticleSettings *part)
 {
        int i;
 static void default_particle_settings(ParticleSettings *part)
 {
        int i;
@@ -3001,6 +3070,9 @@ ParticleSettings *psys_new_settings(char *name, Main *main)
 {
        ParticleSettings *part;
 
 {
        ParticleSettings *part;
 
+       if(main==NULL)
+               main = G.main;
+
        part= alloc_libblock(&main->particle, ID_PA, name);
        
        default_particle_settings(part);
        part= alloc_libblock(&main->particle, ID_PA, name);
        
        default_particle_settings(part);