[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57717] trunk/blender/source/blender/ blenkernel: Fix particle hair display percentage not properly getting restored after

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Jun 25 00:41:40 CEST 2013


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)




More information about the Bf-blender-cvs mailing list