diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2007-12-17 18:32:27 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2007-12-17 18:32:27 +0300 |
commit | d4ee29f70af17a044769e11694f9864263f54663 (patch) | |
tree | e9efe566bdc771278dc5d3cdb343c7637edd19ab /source | |
parent | bb6640a63cb2e1988eb5a06e6538f537c79a0711 (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')
-rw-r--r-- | source/blender/blenkernel/intern/particle_system.c | 40 |
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 |