Revision: 57717
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57717
Author: blendix
Date: 2013-06-24 22:41:40 +0000 (Mon, 24 Jun 2013)
Log Message:
-----------
Fix particle hair display percentage not properly getting restored after
rendering. This used to happen in an unneeded frame change update which was
removed. For heavy particle systems this could have a bad impact on viewport
performance after rendering.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_particle.h
trunk/blender/source/blender/blenkernel/intern/particle.c
trunk/blender/source/blender/blenkernel/intern/particle_system.c
Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h 2013-06-24
22:41:38 UTC (rev 57716)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h 2013-06-24
22:41:40 UTC (rev 57717)
@@ -380,6 +380,8 @@
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
Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c 2013-06-24
22:41:38 UTC (rev 57716)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c 2013-06-24
22:41:40 UTC (rev 57717)
@@ -734,6 +734,8 @@
{
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 @@
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 */
Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c
2013-06-24 22:41:38 UTC (rev 57716)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c
2013-06-24 22:41:40 UTC (rev 57717)
@@ -123,7 +123,7 @@
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 @@
(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 @@
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 @@
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 @@
/* 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 @@
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)
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs