diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-11-05 00:21:30 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-11-05 00:21:30 +0300 |
commit | 9c1c0152df19d982b14ea9a58c1c19c0f378680b (patch) | |
tree | f73fae8db916c32b6c7c4911e3a767eaff84abb1 /source/blender/render | |
parent | 68278f35e8ae7e6ca387695d752a907ade5f8c4e (diff) | |
parent | 08bbda500530e89b1a0f18006a248529e858511b (diff) |
Sculpt: svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r24257:24330
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/source/pointdensity.c | 74 |
1 files changed, 36 insertions, 38 deletions
diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c index b7832e74cd1..2b3e6047af4 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -41,6 +41,7 @@ #include "BKE_particle.h" #include "BKE_texture.h" +#include "DNA_meshdata_types.h" #include "DNA_texture_types.h" #include "DNA_particle_types.h" @@ -184,38 +185,44 @@ static void pointdensity_cache_psys(Render *re, PointDensity *pd, Object *ob, Pa } -static void pointdensity_cache_object(Render *re, PointDensity *pd, ObjectRen *obr) +static void pointdensity_cache_object(Render *re, PointDensity *pd, Object *ob) { int i; + DerivedMesh *dm; + MVert *mvert = NULL; + float cam_mat[4][4]; - if (!obr || !pd) return; - if(!obr->vertnodes) return; + dm = mesh_create_derived_render(re->scene, ob, CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL); + mvert= dm->getVertArray(dm); /* local object space */ - /* in case ob->imat isn't up-to-date */ - Mat4Invert(obr->ob->imat, obr->ob->obmat); - - pd->point_tree = BLI_bvhtree_new(obr->totvert, 0.0, 4, 6); - pd->totpoints = obr->totvert; + pd->totpoints= dm->getNumVerts(dm); + if (pd->totpoints == 0) return; + + pd->point_tree = BLI_bvhtree_new(pd->totpoints, 0.0, 4, 6); - for(i=0; i<obr->totvert; i++) { - float ver_co[3]; - VertRen *ver= RE_findOrAddVert(obr, i); + for(i=0; i < pd->totpoints; i++, mvert++) { + float co[3]; - VECCOPY(ver_co, ver->co); - Mat4MulVecfl(re->viewinv, ver_co); - - if (pd->ob_cache_space == TEX_PD_OBJECTSPACE) { - Mat4MulVecfl(obr->ob->imat, ver_co); - } else if (pd->psys_cache_space == TEX_PD_OBJECTLOC) { - VecSubf(ver_co, ver_co, obr->ob->loc); - } else { - /* TEX_PD_WORLDSPACE */ + VECCOPY(co, mvert->co); + + switch(pd->ob_cache_space) { + case TEX_PD_OBJECTSPACE: + break; + case TEX_PD_OBJECTLOC: + Mat4MulVecfl(ob->obmat, co); + VecSubf(co, co, ob->loc); + break; + case TEX_PD_WORLDSPACE: + default: + Mat4MulVecfl(ob->obmat, co); + break; } - - BLI_bvhtree_insert(pd->point_tree, i, ver_co, 1); + + BLI_bvhtree_insert(pd->point_tree, i, co, 1); } BLI_bvhtree_balance(pd->point_tree); + dm->release(dm); } static void cache_pointdensity(Render *re, Tex *tex) @@ -229,27 +236,18 @@ static void cache_pointdensity(Render *re, Tex *tex) if (pd->source == TEX_PD_PSYS) { Object *ob = pd->object; + ParticleSystem *psys; - if (!ob) return; - if (!pd->psys) return; + if (!ob || !pd->psys) return; + + psys= BLI_findlink(&ob->particlesystem, pd->psys-1); + if (!psys) return; - pointdensity_cache_psys(re, pd, ob, pd->psys); + pointdensity_cache_psys(re, pd, ob, psys); } else if (pd->source == TEX_PD_OBJECT) { Object *ob = pd->object; - ObjectRen *obr; - int found=0; - - /* find the obren that corresponds to the object */ - for (obr=re->objecttable.first; obr; obr=obr->next) { - if (obr->ob == ob) { - found=1; - break; - } - } - if (!found) return; - - pointdensity_cache_object(re, pd, obr); + if (ob) pointdensity_cache_object(re, pd, ob); } } |