[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