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:
authorCampbell Barton <ideasman42@gmail.com>2013-04-18 05:20:04 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-04-18 05:20:04 +0400
commit9cceec40c47543eb372bd9c1331901857b5f120a (patch)
tree0eb00b227a806279d6cf81593781dfd8656d5fd3 /source/blender/blenkernel/intern/editderivedmesh.c
parent2fefbf24a50c3cba1fe9ba984e9cfaeec4eae4a5 (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/editderivedmesh.c')
-rw-r--r--source/blender/blenkernel/intern/editderivedmesh.c60
1 files changed, 54 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index 1f6c99bfaaa..eda8957bb1b 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -1652,14 +1652,12 @@ static void statvis_calc_thickness(
}
}
- (void)vertexCos;
-
BM_mesh_elem_index_ensure(bm, BM_FACE);
if (vertexCos) {
BM_mesh_elem_index_ensure(bm, BM_VERT);
}
- bmtree = BKE_bmbvh_new(em, 0, NULL);
+ bmtree = BKE_bmbvh_new(em, 0, vertexCos, false);
for (i = 0; i < tottri; i++) {
BMFace *f_hit;
@@ -1750,14 +1748,12 @@ static void statvis_calc_intersect(
memset(r_face_colors, 64, sizeof(int) * em->bm->totface);
- (void)vertexCos;
-
BM_mesh_elem_index_ensure(bm, BM_FACE);
if (vertexCos) {
BM_mesh_elem_index_ensure(bm, BM_VERT);
}
- bmtree = BKE_bmbvh_new(em, 0, NULL);
+ bmtree = BKE_bmbvh_new(em, 0, vertexCos, false);
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
BMFace *f_hit;
@@ -1839,3 +1835,55 @@ void BKE_editmesh_statvis_calc(BMEditMesh *em, DerivedMesh *dm,
}
}
}
+
+
+
+/* -------------------------------------------------------------------- */
+/* Editmesh Vert Coords */
+
+#include "BLI_bitmap.h"
+struct CageUserData {
+ int totvert;
+ float (*cos_cage)[3];
+ BLI_bitmap visit_bitmap;
+};
+
+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->visit_bitmap, index))) {
+ BLI_BITMAP_SET(data->visit_bitmap, index);
+ copy_v3_v3(data->cos_cage[index], co);
+ }
+}
+
+float (*BKE_editmesh_vertexCos_get(BMEditMesh *em, Scene *scene, int *r_numVerts))[3]
+{
+ DerivedMesh *cage, *final;
+ BLI_bitmap visit_bitmap;
+ struct CageUserData data;
+ float (*cos_cage)[3];
+
+ cage = editbmesh_get_derived_cage_and_final(scene, em->ob, em, &final, CD_MASK_BAREMESH);
+ cos_cage = MEM_callocN(sizeof(*cos_cage) * 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 */
+ visit_bitmap = BLI_BITMAP_NEW(em->bm->totvert, __func__);
+
+ data.totvert = em->bm->totvert;
+ data.cos_cage = cos_cage;
+ data.visit_bitmap = visit_bitmap;
+
+ cage->foreachMappedVert(cage, cage_mapped_verts_callback, &data);
+
+ MEM_freeN(visit_bitmap);
+
+ if (r_numVerts) {
+ *r_numVerts = em->bm->totvert;
+ }
+
+ return cos_cage;
+}