diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-04-18 05:20:04 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-04-18 05:20:04 +0400 |
commit | 9cceec40c47543eb372bd9c1331901857b5f120a (patch) | |
tree | 0eb00b227a806279d6cf81593781dfd8656d5fd3 /source/blender/blenkernel/intern/editmesh_bvh.c | |
parent | 2fefbf24a50c3cba1fe9ba984e9cfaeec4eae4a5 (diff) |
use modified vertex coords for calculating display thickness and intersections.
internal improvement to editmesh_bvh.c
- optionally pass cage-coords as an arg, rather then calculating the coords in BKE_bmbvh_new(),
since all callers already have coords calculated.
- de-duplicate coords creation function from knife and bmbvhm, move into own generic function: BKE_editmesh_vertexCos_get()
Diffstat (limited to 'source/blender/blenkernel/intern/editmesh_bvh.c')
-rw-r--r-- | source/blender/blenkernel/intern/editmesh_bvh.c | 59 |
1 files changed, 10 insertions, 49 deletions
diff --git a/source/blender/blenkernel/intern/editmesh_bvh.c b/source/blender/blenkernel/intern/editmesh_bvh.c index ab5e5373a95..2d04ff2071f 100644 --- a/source/blender/blenkernel/intern/editmesh_bvh.c +++ b/source/blender/blenkernel/intern/editmesh_bvh.c @@ -34,9 +34,8 @@ #include "DNA_object_types.h" #include "BLI_math.h" -#include "BLI_bitmap.h" +#include "BLI_kdopbvh.h" -#include "BKE_DerivedMesh.h" #include "BKE_editmesh.h" #include "BKE_editmesh_bvh.h" /* own include */ @@ -49,46 +48,29 @@ struct BMBVHTree { BMesh *bm; float (*cos_cage)[3]; - int flag; -}; + bool cos_cage_free; -struct CageUserData { - int totvert; - float (*cos_cage)[3]; - BLI_bitmap vert_bitmap; + int flag; }; -static void cage_mapped_verts_callback(void *userData, int index, const float co[3], - const float UNUSED(no_f[3]), const short UNUSED(no_s[3])) -{ - struct CageUserData *data = userData; - - if ((index >= 0 && index < data->totvert) && (!BLI_BITMAP_GET(data->vert_bitmap, index))) { - BLI_BITMAP_SET(data->vert_bitmap, index); - copy_v3_v3(data->cos_cage[index], co); - } -} - -BMBVHTree *BKE_bmbvh_new(BMEditMesh *em, int flag, struct Scene *scene) +BMBVHTree *BKE_bmbvh_new(BMEditMesh *em, int flag, float (*cos_cage)[3], const bool cos_cage_free) { /* could become argument */ const float epsilon = FLT_EPSILON * 2.0f; struct BMLoop *(*looptris)[3] = em->looptris; BMBVHTree *bmtree = MEM_callocN(sizeof(*bmtree), "BMBVHTree"); - DerivedMesh *cage, *final; - float cos[3][3], (*cos_cage)[3] = NULL; + float cos[3][3]; int i; int tottri; /* BKE_editmesh_tessface_calc() must be called already */ BLI_assert(em->tottri != 0 || em->bm->totface == 0); - /* cage-flag needs scene */ - BLI_assert(scene || !(flag & BMBVH_USE_CAGE)); - bmtree->em = em; bmtree->bm = em->bm; + bmtree->cos_cage = cos_cage; + bmtree->cos_cage_free = cos_cage_free; bmtree->flag = flag; if (flag & (BMBVH_RESPECT_SELECT)) { @@ -112,29 +94,7 @@ BMBVHTree *BKE_bmbvh_new(BMEditMesh *em, int flag, struct Scene *scene) } bmtree->tree = BLI_bvhtree_new(tottri, epsilon, 8, 8); - - if (flag & BMBVH_USE_CAGE) { - BLI_bitmap vert_bitmap; - struct CageUserData data; - - cage = editbmesh_get_derived_cage_and_final(scene, em->ob, em, &final, CD_MASK_DERIVEDMESH); - cos_cage = MEM_callocN(sizeof(float) * 3 * em->bm->totvert, "bmbvh cos_cage"); - - /* when initializing cage verts, we only want the first cage coordinate for each vertex, - * so that e.g. mirror or array use original vertex coordinates and not mirrored or duplicate */ - vert_bitmap = BLI_BITMAP_NEW(em->bm->totvert, __func__); - - data.totvert = em->bm->totvert; - data.cos_cage = cos_cage; - data.vert_bitmap = vert_bitmap; - - cage->foreachMappedVert(cage, cage_mapped_verts_callback, &data); - MEM_freeN(vert_bitmap); - } - - bmtree->cos_cage = cos_cage; - for (i = 0; i < em->tottri; i++) { if (flag & BMBVH_RESPECT_SELECT) { @@ -150,7 +110,7 @@ BMBVHTree *BKE_bmbvh_new(BMEditMesh *em, int flag, struct Scene *scene) } } - if (flag & BMBVH_USE_CAGE) { + if (cos_cage) { copy_v3_v3(cos[0], cos_cage[BM_elem_index_get(looptris[i][0]->v)]); copy_v3_v3(cos[1], cos_cage[BM_elem_index_get(looptris[i][1]->v)]); copy_v3_v3(cos[2], cos_cage[BM_elem_index_get(looptris[i][2]->v)]); @@ -173,8 +133,9 @@ void BKE_bmbvh_free(BMBVHTree *bmtree) { BLI_bvhtree_free(bmtree->tree); - if (bmtree->cos_cage) + if (bmtree->cos_cage && bmtree->cos_cage_free) { MEM_freeN(bmtree->cos_cage); + } MEM_freeN(bmtree); } |