[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13121] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Jan 3 23:43:51 CET 2008


Revision: 13121
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13121
Author:   blendix
Date:     2008-01-03 23:43:51 +0100 (Thu, 03 Jan 2008)

Log Message:
-----------

- Bugfix for flickering shadow with strand simplification.
- On non-edited hair, don't generate child particles for
  each step, only at the end.
- Small optimization in the kd-tree.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/blenlib/intern/BLI_kdtree.c
    trunk/blender/source/blender/render/intern/source/convertblender.c

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2008-01-03 22:20:45 UTC (rev 13120)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2008-01-03 22:43:51 UTC (rev 13121)
@@ -536,7 +536,7 @@
 	ParticleRenderData *data;
 	ParticleRenderElem *elems, *elem;
 	ParticleSettings *part= ctx->psys->part;
-	float *facearea, (*facecenter)[3], size[3], fac, powrate;
+	float *facearea, (*facecenter)[3], size[3], fac, powrate, scaleclamp;
 	float co1[3], co2[3], co3[3], co4[3], lambda, arearatio, t, area, viewport;
 	double vprate;
 	int *origindex, *facetotvert;
@@ -562,6 +562,9 @@
 	elems= MEM_callocN(sizeof(ParticleRenderElem)*totorigface, "SimplifyFaceElem");
 
 	data= ctx->psys->renderdata;
+	if(data->elems)
+		MEM_freeN(data->elems);
+
 	data->dosimplify= 1;
 	data->elems= elems;
 	data->origindex= origindex;
@@ -619,11 +622,13 @@
 		area = psys_render_projected_area(ctx->psys, facecenter[a], facearea[a], vprate, &viewport);
 		arearatio= fac*area/facearea[a];
 
-		if(arearatio < 1.0f || viewport < 1.0f) {
+		if((arearatio < 1.0f || viewport < 1.0f) && elem->totchild) {
 			/* lambda is percentage of elements to keep */
 			lambda= (arearatio < 1.0f)? pow(arearatio, powrate): 1.0f;
 			lambda *= viewport;
 
+			lambda= MAX2(lambda, 1.0f/elem->totchild);
+
 			/* compute transition region */
 			t= part->simplify_transition;
 			elem->t= (lambda-t < 0.0f)? lambda: (lambda+t > 1.0f)? 1.0f-lambda: t;
@@ -633,6 +638,14 @@
 			elem->scalemax= (lambda+t < 1.0f)? 1.0f/lambda: 1.0f/(1.0f - elem->t*elem->t/t);
 			elem->scalemin= (lambda+t < 1.0f)? 0.0f: elem->scalemax*(1.0f-elem->t/t);
 
+			elem->scalemin= sqrt(elem->scalemin);
+			elem->scalemax= sqrt(elem->scalemax);
+
+			/* clamp scaling */
+			scaleclamp= MIN2(elem->totchild, 10.0f);
+			elem->scalemin= MIN2(scaleclamp, elem->scalemin);
+			elem->scalemax= MIN2(scaleclamp, elem->scalemax);
+
 			/* extend lambda to include transition */
 			lambda= lambda + elem->t;
 			if(lambda > 1.0f)

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2008-01-03 22:20:45 UTC (rev 13120)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2008-01-03 22:43:51 UTC (rev 13121)
@@ -4247,7 +4247,8 @@
 		/* for render, child particle paths are computed on the fly */
 		if(part->childtype) {
 			if(((psys->totchild!=0)) || (psys_in_edit_mode(psys) && (pset->flag&PE_SHOW_CHILD)))
-				psys_cache_child_paths(ob, psys, cfra, 0);
+				if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE))
+					psys_cache_child_paths(ob, psys, cfra, 0);
 		}
 	}
 	else if(psys->pathcache)
@@ -4459,8 +4460,9 @@
 
 			distribute_particles(ob, psys, part->from);
 
-			if(get_alloc_child_particles_tot(psys))
-				distribute_particles(ob, psys, PART_FROM_CHILD);
+			if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE))
+				if(get_alloc_child_particles_tot(psys))
+					distribute_particles(ob, psys, PART_FROM_CHILD);
 		}
 		initialize_all_particles(ob, psys, psmd);
 

Modified: trunk/blender/source/blender/blenlib/intern/BLI_kdtree.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/BLI_kdtree.c	2008-01-03 22:20:45 UTC (rev 13120)
+++ trunk/blender/source/blender/blenlib/intern/BLI_kdtree.c	2008-01-03 22:43:51 UTC (rev 13121)
@@ -166,11 +166,18 @@
 	min_node= root;
 	min_dist= squared_distance(root->co,co,root->nor,nor);
 
-	if(root->left)
-		stack[cur++]=root->left;
-
-	if(root->right)
-		stack[cur++]=root->right;
+	if(co[root->d] < root->co[root->d]) {
+		if(root->right)
+			stack[cur++]=root->right;
+		if(root->left)
+			stack[cur++]=root->left;
+	}
+	else {
+		if(root->left)
+			stack[cur++]=root->left;
+		if(root->right)
+			stack[cur++]=root->right;
+	}
 	
 	while(cur--){
 		node=stack[cur];
@@ -266,12 +273,19 @@
 	cur_dist= squared_distance(root->co,co,root->nor,nor);
 	add_nearest(nearest,&found,n,root->index,cur_dist,root->co);
 	
-	if(root->left)
-		stack[cur++]=root->left;
+	if(co[root->d] < root->co[root->d]) {
+		if(root->right)
+			stack[cur++]=root->right;
+		if(root->left)
+			stack[cur++]=root->left;
+	}
+	else {
+		if(root->left)
+			stack[cur++]=root->left;
+		if(root->right)
+			stack[cur++]=root->right;
+	}
 
-	if(root->right)
-		stack[cur++]=root->right;
-
 	while(cur--){
 		node=stack[cur];
 

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2008-01-03 22:20:45 UTC (rev 13120)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2008-01-03 22:43:51 UTC (rev 13121)
@@ -1695,10 +1695,10 @@
 			/* get orco */
 			if(tpsys && (part->from==PART_FROM_PARTICLE || part->phystype==PART_PHYS_NO)){
 				tpa=tpsys->particles+pa->num;
-				psys_particle_on_emitter(ob, psmd,tpart->from,tpa->num, -1,tpa->fuv,tpa->foffset,co,nor,0,0,orco,0);
+				psys_particle_on_emitter(ob, psmd,tpart->from,tpa->num,pa->num_dmcache,tpa->fuv,tpa->foffset,co,nor,0,0,orco,0);
 			}
 			else
-				psys_particle_on_emitter(ob, psmd,part->from,pa->num,-1,pa->fuv,pa->foffset,co,nor,0,0,orco,0);
+				psys_particle_on_emitter(ob, psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,orco,0);
 
 			if(uvco && ELEM(part->from,PART_FROM_FACE,PART_FROM_VOLUME)){
 				layer=psmd->dm->faceData.layers + CustomData_get_layer_index(&psmd->dm->faceData,CD_MFACE);





More information about the Bf-blender-cvs mailing list