Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2007-12-17 18:32:27 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2007-12-17 18:32:27 +0300
commitd4ee29f70af17a044769e11694f9864263f54663 (patch)
treee9efe566bdc771278dc5d3cdb343c7637edd19ab /source/blender/blenkernel
parentbb6640a63cb2e1988eb5a06e6538f537c79a0711 (diff)
Bugfix: with particle distribution based on orco's, there was no
correction for them being 'squashed' to the bounding box of the object, gave weird artifacts with child particle distribution.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/intern/particle_system.c40
1 files changed, 28 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 4d9256a4931..f223e8d8681 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -494,6 +494,7 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
int w, maxw;
psys_particle_on_dm(ctx->ob,ctx->dm,from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co1,0,0,0,orco1,0);
+ transform_mesh_orco_verts((Mesh*)ob->data, &orco1, 1, 1);
maxw = BLI_kdtree_find_n_nearest(ctx->tree,3,orco1,NULL,ptn);
for(w=0; w<maxw; w++){
@@ -633,6 +634,7 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
do_seams= (part->flag&PART_CHILD_SEAMS && ctx->seams);
psys_particle_on_dm(ob,dm,cfrom,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co1,nor1,0,0,orco1,ornor1);
+ transform_mesh_orco_verts((Mesh*)ob->data, &orco1, 1, 1);
maxw = BLI_kdtree_find_n_nearest(ctx->tree,(do_seams)?10:4,orco1,ornor1,ptn);
maxd=ptn[maxw-1].dist;
@@ -820,6 +822,7 @@ int psys_threads_init_distribution(ParticleThread *threads, DerivedMesh *finaldm
for(p=0,pa=psys->particles; p<totpart; p++,pa++){
psys_particle_on_dm(ob,dm,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,orco,ornor);
+ transform_mesh_orco_verts((Mesh*)ob->data, &orco, 1, 1);
BLI_kdtree_insert(tree, p, orco, ornor);
}
@@ -923,8 +926,10 @@ int psys_threads_init_distribution(ParticleThread *threads, DerivedMesh *finaldm
tree=BLI_kdtree_new(totvert);
for(p=0; p<totvert; p++){
- if(orcodata)
+ if(orcodata) {
VECCOPY(co,orcodata[p])
+ transform_mesh_orco_verts((Mesh*)ob->data, &co, 1, 1);
+ }
else
VECCOPY(co,mv[p].co)
BLI_kdtree_insert(tree,p,co,NULL);
@@ -990,7 +995,8 @@ int psys_threads_init_distribution(ParticleThread *threads, DerivedMesh *finaldm
/* 2.1 */
if((part->flag&PART_EDISTR || children) && ELEM(from,PART_FROM_PARTICLE,PART_FROM_VERT)==0){
- float totarea=0.0, *co1, *co2, *co3, *co4;
+ MVert *v1, *v2, *v3, *v4;
+ float totarea=0.0, co1[3], co2[3], co3[3], co4[3];
float (*orcodata)[3];
orcodata= dm->getVertDataArray(dm, CD_ORCO);
@@ -999,21 +1005,31 @@ int psys_threads_init_distribution(ParticleThread *threads, DerivedMesh *finaldm
MFace *mf=dm->getFaceData(dm,i,CD_MFACE);
if(orcodata) {
- co1= orcodata[mf->v1];
- co2= orcodata[mf->v2];
- co3= orcodata[mf->v3];
+ VECCOPY(co1, orcodata[mf->v1]);
+ VECCOPY(co2, orcodata[mf->v2]);
+ VECCOPY(co3, orcodata[mf->v3]);
+ transform_mesh_orco_verts((Mesh*)ob->data, &co1, 1, 1);
+ transform_mesh_orco_verts((Mesh*)ob->data, &co2, 1, 1);
+ transform_mesh_orco_verts((Mesh*)ob->data, &co3, 1, 1);
}
else {
- co1= ((MVert*)dm->getVertData(dm,mf->v1,CD_MVERT))->co;
- co2= ((MVert*)dm->getVertData(dm,mf->v2,CD_MVERT))->co;
- co3= ((MVert*)dm->getVertData(dm,mf->v3,CD_MVERT))->co;
+ v1= (MVert*)dm->getVertData(dm,mf->v1,CD_MVERT);
+ v2= (MVert*)dm->getVertData(dm,mf->v2,CD_MVERT);
+ v3= (MVert*)dm->getVertData(dm,mf->v3,CD_MVERT);
+ VECCOPY(co1, v1->co);
+ VECCOPY(co2, v2->co);
+ VECCOPY(co3, v3->co);
}
if (mf->v4){
- if(orcodata)
- co4= orcodata[mf->v4];
- else
- co4= ((MVert*)dm->getVertData(dm,mf->v4,CD_MVERT))->co;
+ if(orcodata) {
+ VECCOPY(co4, orcodata[mf->v4]);
+ transform_mesh_orco_verts((Mesh*)ob->data, &co4, 1, 1);
+ }
+ else {
+ v4= (MVert*)dm->getVertData(dm,mf->v4,CD_MVERT);
+ VECCOPY(co4, v4->co);
+ }
cur= AreaQ3Dfl(co1, co2, co3, co4);
}
else