diff options
-rw-r--r-- | source/blender/blenkernel/BKE_particle.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/particle.c | 16 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/particle_system.c | 14 |
3 files changed, 25 insertions, 7 deletions
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index 2b753cba098..56b550a6f5d 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -380,6 +380,8 @@ int psys_particle_dm_face_lookup(struct Object *ob, struct DerivedMesh *dm, int void reset_particle(struct ParticleSimulationData *sim, struct ParticleData *pa, float dtime, float cfra); +float psys_get_current_display_percentage(struct ParticleSystem *psys); + /* psys_reset */ #define PSYS_RESET_ALL 1 #define PSYS_RESET_DEPSGRAPH 2 diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 3ab535febb1..f6901c7b81b 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -734,6 +734,8 @@ void psys_render_restore(Object *ob, ParticleSystem *psys) { ParticleRenderData *data; ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys); + float render_disp = psys_get_current_display_percentage(psys); + float disp; data = psys->renderdata; if (!data) @@ -777,6 +779,20 @@ void psys_render_restore(Object *ob, ParticleSystem *psys) MEM_freeN(data); psys->renderdata = NULL; + + /* restore particle display percentage */ + disp = psys_get_current_display_percentage(psys); + + if (disp != render_disp) { + PARTICLE_P; + + LOOP_PARTICLES { + if (PSYS_FRAND(p) > disp) + pa->flag |= PARS_NO_DISP; + else + pa->flag &= ~PARS_NO_DISP; + } + } } /* BMESH_TODO, for orig face data, we need to use MPoly */ diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 50d2a47a97f..ec45c9eef40 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -123,7 +123,7 @@ static int particles_are_dynamic(ParticleSystem *psys) return ELEM3(psys->part->phystype, PART_PHYS_NEWTON, PART_PHYS_BOIDS, PART_PHYS_FLUID); } -static int psys_get_current_display_percentage(ParticleSystem *psys) +float psys_get_current_display_percentage(ParticleSystem *psys) { ParticleSettings *part=psys->part; @@ -131,10 +131,10 @@ static int psys_get_current_display_percentage(ParticleSystem *psys) (part->child_nbr && part->childtype) || /* display percentage applies to children */ (psys->pointcache->flag & PTCACHE_BAKING)) /* baking is always done with full amount */ { - return 100; + return 1.0f; } - return psys->part->disp; + return psys->part->disp/100.0f; } static int tot_particles(ParticleSystem *psys, PTCacheID *pid) @@ -3984,7 +3984,7 @@ static void hair_step(ParticleSimulationData *sim, float cfra) ParticleSystem *psys = sim->psys; ParticleSettings *part = psys->part; PARTICLE_P; - float disp = (float)psys_get_current_display_percentage(psys)/100.0f; + float disp = psys_get_current_display_percentage(psys); LOOP_PARTICLES { pa->size = part->size; @@ -4388,7 +4388,7 @@ static void cached_step(ParticleSimulationData *sim, float cfra) psys_update_effectors(sim); - disp= (float)psys_get_current_display_percentage(psys)/100.0f; + disp= psys_get_current_display_percentage(psys); LOOP_PARTICLES { psys_get_texture(sim, pa, &ptex, PAMAP_SIZE, cfra); @@ -4637,7 +4637,7 @@ static void system_step(ParticleSimulationData *sim, float cfra) /* 3. do dynamics */ /* set particles to be not calculated TODO: can't work with pointcache */ - disp= (float)psys_get_current_display_percentage(psys)/100.0f; + disp= psys_get_current_display_percentage(psys); LOOP_PARTICLES { if (PSYS_FRAND(p) > disp) @@ -4933,7 +4933,7 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys) case PART_PHYS_KEYED: { PARTICLE_P; - float disp = (float)psys_get_current_display_percentage(psys)/100.0f; + float disp = psys_get_current_display_percentage(psys); /* Particles without dynamics haven't been reset yet because they don't use pointcache */ if (psys->recalc & PSYS_RECALC_RESET) |