Commit: 420ea4423e213cff26139fc7f4672f012ac5bf06
Author: Martin Felke
Date:   Thu Dec 22 00:31:42 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB420ea4423e213cff26139fc7f4672f012ac5bf06

particle system: allow changing vgroups over time, suppress emission on empty 
assigned density vgroups

===================================================================

M       source/blender/blenkernel/BKE_particle.h
M       source/blender/blenkernel/intern/particle_distribute.c
M       source/blender/blenkernel/intern/particle_system.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_particle.h 
b/source/blender/blenkernel/BKE_particle.h
index b3e3968..700bafc 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -423,7 +423,7 @@ void psys_particle_on_dm(struct DerivedMesh *dm_final, int 
from, int index, int
                          float orco[3], float ornor[3]);
 
 /* particle_system.c */
-void distribute_particles(struct ParticleSimulationData *sim, int from);
+int distribute_particles(struct ParticleSimulationData *sim, int from);
 void initialize_particle(struct ParticleSimulationData *sim, struct 
ParticleData *pa);
 void psys_calc_dmcache(struct Object *ob, struct DerivedMesh *dm_final, struct 
DerivedMesh *dm_deformed, struct ParticleSystem *psys);
 int psys_particle_dm_face_lookup(struct DerivedMesh *dm_final, struct 
DerivedMesh *dm_deformed, int findex, const float fw[4], struct LinkNode 
**poly_nodes);
diff --git a/source/blender/blenkernel/intern/particle_distribute.c 
b/source/blender/blenkernel/intern/particle_distribute.c
index 44cf5b1..3bcac8c 100644
--- a/source/blender/blenkernel/intern/particle_distribute.c
+++ b/source/blender/blenkernel/intern/particle_distribute.c
@@ -1163,7 +1163,7 @@ static void psys_task_init_distribute(ParticleTask *task, 
ParticleSimulationData
        task->rng = BLI_rng_new(seed);
 }
 
-static void distribute_particles_on_dm(ParticleSimulationData *sim, int from)
+static int distribute_particles_on_dm(ParticleSimulationData *sim, int from)
 {
        TaskScheduler *task_scheduler;
        TaskPool *task_pool;
@@ -1174,7 +1174,7 @@ static void 
distribute_particles_on_dm(ParticleSimulationData *sim, int from)
        
        /* create a task pool for distribution tasks */
        if (!psys_thread_context_init_distribute(&ctx, sim, from))
-               return;
+               return 0;
        
        task_scheduler = BLI_task_scheduler_get();
        task_pool = BLI_task_pool_create(task_scheduler, &ctx);
@@ -1202,6 +1202,8 @@ static void 
distribute_particles_on_dm(ParticleSimulationData *sim, int from)
        psys_tasks_free(tasks, numtasks);
        
        psys_thread_context_free(&ctx);
+
+       return 1;
 }
 
 /* ready for future use, to emit particles without geometry */
@@ -1212,14 +1214,15 @@ static void 
distribute_particles_on_shape(ParticleSimulationData *sim, int UNUSE
        fprintf(stderr,"Shape emission not yet possible!\n");
 }
 
-void distribute_particles(ParticleSimulationData *sim, int from)
+int distribute_particles(ParticleSimulationData *sim, int from)
 {
        PARTICLE_PSMD;
        int distr_error=0;
+       int ret = 0;
 
        if (psmd) {
                if (psmd->dm_final)
-                       distribute_particles_on_dm(sim, from);
+                       ret = distribute_particles_on_dm(sim, from);
                else
                        distr_error=1;
        }
@@ -1231,6 +1234,8 @@ void distribute_particles(ParticleSimulationData *sim, 
int from)
 
                fprintf(stderr,"Particle distribution error!\n");
        }
+
+       return ret;
 }
 
 /* ======== Simplify ======== */
diff --git a/source/blender/blenkernel/intern/particle_system.c 
b/source/blender/blenkernel/intern/particle_system.c
index efaf1f9..6bc99a0 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -3859,7 +3859,9 @@ static int emit_particles(ParticleSimulationData *sim, 
PTCacheID *pid, float UNU
        if (totpart != oldtotpart)
                realloc_particles(sim, totpart);
 
-       return totpart - oldtotpart;
+       //always allow redistribution of particles !
+       //return totpart - oldtotpart;
+       return 1;
 }
 
 /* Calculates the next state for all particles of the system
@@ -3876,7 +3878,7 @@ static void system_step(ParticleSimulationData *sim, 
float cfra, const bool use_
        PTCacheID ptcacheid, *pid = NULL;
        PARTICLE_P;
        float disp, cache_cfra = cfra; /*, *vg_vel= 0, *vg_tan= 0, *vg_rot= 0, 
*vg_size= 0; */
-       int startframe = 0, endframe = 100, oldtotpart = 0;
+       int startframe = 0, endframe = 100, oldtotpart = 0, emitcount = 0;
 
        /* cache shouldn't be used for hair or "continue physics" */
        if (part->type != PART_HAIR) {
@@ -3903,11 +3905,21 @@ static void system_step(ParticleSimulationData *sim, 
float cfra, const bool use_
 
 /* 1. emit particles and redo particles if needed */
        oldtotpart = psys->totpart;
-       if (emit_particles(sim, pid, cfra) || psys->recalc & PSYS_RECALC_RESET) 
{
-               distribute_particles(sim, part->from);
-               initialize_all_particles(sim);
-               /* reset only just created particles (on startframe all 
particles are recreated) */
-               reset_all_particles(sim, 0.0, cfra, oldtotpart);
+       emitcount = emit_particles(sim, pid, cfra);
+       if (emitcount || psys->recalc & PSYS_RECALC_RESET) {
+               if (distribute_particles(sim, part->from)) {
+                       initialize_all_particles(sim);
+                       /* reset only just created particles (on startframe all 
particles are recreated) */
+                       reset_all_particles(sim, 0.0, cfra, oldtotpart);
+               }
+               else {
+                       //throw away...
+                       int i;
+                       for (i = 0; i < sim->psys->totpart; i++)
+                       {
+                               sim->psys->particles[i].flag |= PARS_UNEXIST;
+                       }
+               }
                free_unexisting_particles(sim);
 
                if (psys->fluid_springs) {
@@ -3920,7 +3932,9 @@ static void system_step(ParticleSimulationData *sim, 
float cfra, const bool use_
                /* flag for possible explode modifiers after this system */
                sim->psmd->flag |= eParticleSystemFlag_Pars;
 
-               BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_AFTER, cfra);
+               if (psys->recalc & PSYS_RECALC_RESET) {
+                       BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_AFTER, cfra);
+               }
        }
 
 /* 2. try to read from the cache */
@@ -4265,8 +4279,18 @@ void particle_system_update(Scene *scene, Object *ob, 
ParticleSystem *psys, cons
 
                                        if (emit_particles(&sim, NULL, cfra) || 
(psys->recalc & PSYS_RECALC_RESET)) {
                                                free_keyed_keys(psys);
-                                               distribute_particles(&sim, 
part->from);
-                                               initialize_all_particles(&sim);
+                                               if (distribute_particles(&sim, 
part->from)) {
+                                                       
initialize_all_particles(&sim);
+                                               }
+                                               else {
+                                                       //throw away...
+                                                       int i;
+                                                       for (i = 0; i < 
sim.psys->totpart; i++)
+                                                       {
+                                                               
sim.psys->particles[i].flag |= PARS_UNEXIST;
+                                                       }
+                                               }
+
                                                free_unexisting = true;
 
                                                /* flag for possible explode 
modifiers after this system */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to