diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-04-16 09:23:34 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-04-16 09:23:34 +0400 |
commit | fa919d23bc45ff5d9db5bb374d4fad561bf18b6c (patch) | |
tree | 2ab6d78073ec5e7ab6f93c004c1e29dde47fec16 | |
parent | d044fd329927c69ec57af1f02a6e0435e7eb0ebf (diff) |
move editmesh_bvh.c into blenkernel.
-rw-r--r-- | source/blender/blenkernel/BKE_editmesh_bvh.h (renamed from source/blender/editors/mesh/editmesh_bvh.h) | 25 | ||||
-rw-r--r-- | source/blender/blenkernel/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/editmesh_bvh.c (renamed from source/blender/editors/mesh/editmesh_bvh.c) | 100 | ||||
-rw-r--r-- | source/blender/editors/include/ED_mesh.h | 5 | ||||
-rw-r--r-- | source/blender/editors/mesh/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_knife.c | 5 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_utils.c | 89 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.c | 3 |
8 files changed, 114 insertions, 117 deletions
diff --git a/source/blender/editors/mesh/editmesh_bvh.h b/source/blender/blenkernel/BKE_editmesh_bvh.h index 53d1c36119e..edf261da6e8 100644 --- a/source/blender/editors/mesh/editmesh_bvh.h +++ b/source/blender/blenkernel/BKE_editmesh_bvh.h @@ -25,12 +25,12 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/editors/mesh/editmesh_bvh.h - * \ingroup edmesh +/** \file BKE_editmesh_bvh.h + * \ingroup bke */ -#ifndef __EDITBMESH_BVH_H__ -#define __EDITBMESH_BVH_H__ +#ifndef __BKE_EDITMESH_BVH_H__ +#define __BKE_EDITMESH_BVH_H__ struct BMEditMesh; struct BMFace; @@ -42,22 +42,17 @@ struct BVHTree; struct Scene; struct Object; -#ifndef IN_EDITMESHBVH typedef struct BMBVHTree BMBVHTree; -#endif -struct BMBVHTree *BMBVH_NewBVH(struct BMEditMesh *em, int flag, struct Scene *scene, struct Object *obedit); -void BMBVH_FreeBVH(struct BMBVHTree *tree); -struct BVHTree *BMBVH_BVHTree(struct BMBVHTree *tree); +BMBVHTree *BMBVH_NewBVH(struct BMEditMesh *em, int flag, struct Scene *scene); +void BMBVH_FreeBVH(BMBVHTree *tree); +struct BVHTree *BMBVH_BVHTree(BMBVHTree *tree); -struct BMFace *BMBVH_RayCast(struct BMBVHTree *tree, const float co[3], const float dir[3], +struct BMFace *BMBVH_RayCast(BMBVHTree *tree, const float co[3], const float dir[3], float r_hitout[3], float r_cagehit[3]); -int BMBVH_EdgeVisible(struct BMBVHTree *tree, struct BMEdge *e, - struct ARegion *ar, struct View3D *v3d, struct Object *obedit); - /*find a vert closest to co in a sphere of radius maxdist*/ -struct BMVert *BMBVH_FindClosestVert(struct BMBVHTree *tree, const float co[3], const float maxdist); +struct BMVert *BMBVH_FindClosestVert(BMBVHTree *tree, const float co[3], const float maxdist); /* BMBVH_NewBVH flag parameter */ enum { @@ -67,4 +62,4 @@ enum { BMBVH_RESPECT_HIDDEN = 8 /* omit hidden geometry */ }; -#endif /* __EDITBMESH_BVH_H__ */ +#endif /* __BKE_EDITMESH_BVH_H__ */ diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index f78c7045e58..6d02a8560bb 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -84,6 +84,7 @@ set(SRC intern/displist.c intern/dynamicpaint.c intern/editderivedmesh.c + intern/editmesh_bvh.c intern/effect.c intern/fcurve.c intern/fluidsim.c @@ -237,6 +238,7 @@ set(SRC BKE_subsurf.h BKE_suggestions.h BKE_editmesh.h + BKE_editmesh_bvh.h BKE_text.h BKE_texture.h BKE_tracking.h diff --git a/source/blender/editors/mesh/editmesh_bvh.c b/source/blender/blenkernel/intern/editmesh_bvh.c index f9ef360c3bf..ceca90d47b6 100644 --- a/source/blender/editors/mesh/editmesh_bvh.c +++ b/source/blender/blenkernel/intern/editmesh_bvh.c @@ -25,16 +25,14 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/editors/mesh/editmesh_bvh.c - * \ingroup edmesh +/** \file blender/blenkernel/intern/editmesh_bvh.c + * \ingroup bke */ #include "MEM_guardedalloc.h" #include "DNA_scene_types.h" #include "DNA_object_types.h" -#include "DNA_screen_types.h" -#include "DNA_view3d_types.h" #include "BLI_math.h" #include "BLI_smallhash.h" @@ -42,10 +40,7 @@ #include "BKE_DerivedMesh.h" #include "BKE_editmesh.h" -#include "ED_view3d.h" - -#define IN_EDITMESHBVH /* needed for typedef workaround */ -#include "editmesh_bvh.h" /* own include */ +#include "BKE_editmesh_bvh.h" /* own include */ typedef struct BMBVHTree { @@ -81,7 +76,7 @@ static void cage_mapped_verts_callback(void *userData, int index, const float co } } -BMBVHTree *BMBVH_NewBVH(BMEditMesh *em, int flag, Scene *scene, Object *obedit) +BMBVHTree *BMBVH_NewBVH(BMEditMesh *em, int flag, Scene *scene) { BMBVHTree *tree = MEM_callocN(sizeof(*tree), "BMBVHTree"); DerivedMesh *cage, *final; @@ -96,7 +91,7 @@ BMBVHTree *BMBVH_NewBVH(BMEditMesh *em, int flag, Scene *scene, Object *obedit) BMEdit_RecalcTessellation(em); - tree->ob = obedit; + tree->ob = em->ob; tree->scene = scene; tree->em = em; tree->bm = em->bm; @@ -138,7 +133,7 @@ BMBVHTree *BMBVH_NewBVH(BMEditMesh *em, int flag, Scene *scene, Object *obedit) em->bm->elem_index_dirty &= ~BM_VERT; - cage = editbmesh_get_derived_cage_and_final(scene, obedit, em, &final, CD_MASK_DERIVEDMESH); + cage = editbmesh_get_derived_cage_and_final(scene, em->ob, em, &final, CD_MASK_DERIVEDMESH); cagecos = MEM_callocN(sizeof(float) * 3 * em->bm->totvert, "bmbvh cagecos"); data[0] = em; @@ -360,86 +355,3 @@ static short winding(const float v1[3], const float v2[3], const float v3[3]) return 1; } #endif - -#if 0 //BMESH_TODO: not implemented yet -int BMBVH_VertVisible(BMBVHTree *tree, BMEdge *e, RegionView3D *r3d) -{ - -} -#endif - -static BMFace *edge_ray_cast(BMBVHTree *tree, const float co[3], const float dir[3], float *r_hitout, BMEdge *e) -{ - BMFace *f = BMBVH_RayCast(tree, co, dir, r_hitout, NULL); - - if (f && BM_edge_in_face(f, e)) - return NULL; - - return f; -} - -static void scale_point(float c1[3], const float p[3], const float s) -{ - sub_v3_v3(c1, p); - mul_v3_fl(c1, s); - add_v3_v3(c1, p); -} - - -int BMBVH_EdgeVisible(BMBVHTree *tree, BMEdge *e, ARegion *ar, View3D *v3d, Object *obedit) -{ - BMFace *f; - float co1[3], co2[3], co3[3], dir1[3], dir2[3], dir3[3]; - float origin[3], invmat[4][4]; - float epsilon = 0.01f; - float end[3]; - const float mval_f[2] = {ar->winx / 2.0f, - ar->winy / 2.0f}; - - ED_view3d_win_to_segment(ar, v3d, mval_f, origin, end); - - invert_m4_m4(invmat, obedit->obmat); - mul_m4_v3(invmat, origin); - - copy_v3_v3(co1, e->v1->co); - mid_v3_v3v3(co2, e->v1->co, e->v2->co); - copy_v3_v3(co3, e->v2->co); - - scale_point(co1, co2, 0.99); - scale_point(co3, co2, 0.99); - - /* ok, idea is to generate rays going from the camera origin to the - * three points on the edge (v1, mid, v2)*/ - sub_v3_v3v3(dir1, origin, co1); - sub_v3_v3v3(dir2, origin, co2); - sub_v3_v3v3(dir3, origin, co3); - - normalize_v3(dir1); - normalize_v3(dir2); - normalize_v3(dir3); - - mul_v3_fl(dir1, epsilon); - mul_v3_fl(dir2, epsilon); - mul_v3_fl(dir3, epsilon); - - /* offset coordinates slightly along view vectors, to avoid - * hitting the faces that own the edge.*/ - add_v3_v3v3(co1, co1, dir1); - add_v3_v3v3(co2, co2, dir2); - add_v3_v3v3(co3, co3, dir3); - - normalize_v3(dir1); - normalize_v3(dir2); - normalize_v3(dir3); - - /* do three samplings: left, middle, right */ - f = edge_ray_cast(tree, co1, dir1, NULL, e); - if (f && !edge_ray_cast(tree, co2, dir2, NULL, e)) - return 1; - else if (f && !edge_ray_cast(tree, co3, dir3, NULL, e)) - return 1; - else if (!f) - return 1; - - return 0; -} diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 36ce7606a13..2c79f12de49 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -62,6 +62,7 @@ struct BMEditSelection; struct BMesh; struct BMVert; struct BMLoop; +struct BMBVHTree; struct MLoopCol; struct BMEdge; struct BMFace; @@ -135,6 +136,8 @@ struct UvVertMap *EDBM_uv_vert_map_create(struct BMEditMesh *em, bool use_select void EDBM_flag_enable_all(struct BMEditMesh *em, const char hflag); void EDBM_flag_disable_all(struct BMEditMesh *em, const char hflag); +bool BMBVH_EdgeVisible(struct BMBVHTree *tree, struct BMEdge *e, + struct ARegion *ar, struct View3D *v3d, struct Object *obedit); /* editmesh_select.c */ void EDBM_select_mirrored(struct Object *obedit, struct BMEditMesh *em, bool extend); @@ -299,8 +302,6 @@ bool ED_mesh_pick_face_vert(struct bContext *C, struct Object *ob, const int mva #define ED_MESH_PICK_DEFAULT_VERT_SIZE 50 #define ED_MESH_PICK_DEFAULT_FACE_SIZE 3 -#include "../mesh/editmesh_bvh.h" - #ifdef __cplusplus } #endif diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt index 1aadac015dd..4a4507acc30 100644 --- a/source/blender/editors/mesh/CMakeLists.txt +++ b/source/blender/editors/mesh/CMakeLists.txt @@ -43,7 +43,6 @@ set(SRC editface.c editmesh_add.c editmesh_bevel.c - editmesh_bvh.c editmesh_extrude.c editmesh_inset.c editmesh_knife.c @@ -57,7 +56,6 @@ set(SRC mesh_ops.c meshtools.c - editmesh_bvh.h mesh_intern.h ) diff --git a/source/blender/editors/mesh/editmesh_knife.c b/source/blender/editors/mesh/editmesh_knife.c index 171cbb6859c..62c85078995 100644 --- a/source/blender/editors/mesh/editmesh_knife.c +++ b/source/blender/editors/mesh/editmesh_knife.c @@ -47,6 +47,8 @@ #include "BKE_DerivedMesh.h" #include "BKE_context.h" +#include "BKE_editmesh.h" +#include "BKE_editmesh_bvh.h" #include "BIF_gl.h" #include "BIF_glutil.h" /* for paint cursor */ @@ -60,7 +62,6 @@ #include "WM_types.h" #include "DNA_object_types.h" -#include "BKE_editmesh.h" #include "UI_resources.h" #include "RNA_access.h" @@ -3016,7 +3017,7 @@ static void knifetool_init(bContext *C, KnifeTool_OpData *kcd, kcd->bmbvh = BMBVH_NewBVH(kcd->em, (BMBVH_USE_CAGE | BMBVH_RETURN_ORIG) | (only_select ? BMBVH_RESPECT_SELECT : BMBVH_RESPECT_HIDDEN), - scene, obedit); + scene); kcd->arena = BLI_memarena_new(1 << 15, "knife"); kcd->vthresh = KMAXDIST - 1; diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c index 3266bb61c99..1d776c8b3e7 100644 --- a/source/blender/editors/mesh/editmesh_utils.c +++ b/source/blender/editors/mesh/editmesh_utils.c @@ -43,6 +43,7 @@ #include "BKE_mesh.h" #include "BKE_report.h" #include "BKE_editmesh.h" +#include "BKE_editmesh_bvh.h" #include "BKE_object.h" /* XXX. only for EDBM_mesh_ensure_valid_dm_hack() which will be removed */ @@ -52,6 +53,7 @@ #include "ED_mesh.h" #include "ED_screen.h" #include "ED_util.h" +#include "ED_view3d.h" #include "mesh_intern.h" /* own include */ @@ -1164,7 +1166,7 @@ void EDBM_verts_mirror_cache_begin(BMEditMesh *em, const bool use_select) ED_mesh_mirrtopo_init(me, -1, &mesh_topo_store, true); } else { - tree = BMBVH_NewBVH(em, 0, NULL, NULL); + tree = BMBVH_NewBVH(em, 0, NULL); } BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { @@ -1376,3 +1378,88 @@ int EDBM_view3d_poll(bContext *C) return 0; } + +/* -------------------------------------------------------------------- */ +/* BMBVH functions */ +// XXX +#if 0 //BMESH_TODO: not implemented yet +int BMBVH_VertVisible(BMBVHTree *tree, BMEdge *e, RegionView3D *r3d) +{ + +} +#endif + +static BMFace *edge_ray_cast(struct BMBVHTree *tree, const float co[3], const float dir[3], float *r_hitout, BMEdge *e) +{ + BMFace *f = BMBVH_RayCast(tree, co, dir, r_hitout, NULL); + + if (f && BM_edge_in_face(f, e)) + return NULL; + + return f; +} + +static void scale_point(float c1[3], const float p[3], const float s) +{ + sub_v3_v3(c1, p); + mul_v3_fl(c1, s); + add_v3_v3(c1, p); +} + +bool BMBVH_EdgeVisible(struct BMBVHTree *tree, BMEdge *e, ARegion *ar, View3D *v3d, Object *obedit) +{ + BMFace *f; + float co1[3], co2[3], co3[3], dir1[3], dir2[3], dir3[3]; + float origin[3], invmat[4][4]; + float epsilon = 0.01f; + float end[3]; + const float mval_f[2] = {ar->winx / 2.0f, + ar->winy / 2.0f}; + + ED_view3d_win_to_segment(ar, v3d, mval_f, origin, end); + + invert_m4_m4(invmat, obedit->obmat); + mul_m4_v3(invmat, origin); + + copy_v3_v3(co1, e->v1->co); + mid_v3_v3v3(co2, e->v1->co, e->v2->co); + copy_v3_v3(co3, e->v2->co); + + scale_point(co1, co2, 0.99); + scale_point(co3, co2, 0.99); + + /* ok, idea is to generate rays going from the camera origin to the + * three points on the edge (v1, mid, v2)*/ + sub_v3_v3v3(dir1, origin, co1); + sub_v3_v3v3(dir2, origin, co2); + sub_v3_v3v3(dir3, origin, co3); + + normalize_v3(dir1); + normalize_v3(dir2); + normalize_v3(dir3); + + mul_v3_fl(dir1, epsilon); + mul_v3_fl(dir2, epsilon); + mul_v3_fl(dir3, epsilon); + + /* offset coordinates slightly along view vectors, to avoid + * hitting the faces that own the edge.*/ + add_v3_v3v3(co1, co1, dir1); + add_v3_v3v3(co2, co2, dir2); + add_v3_v3v3(co3, co3, dir3); + + normalize_v3(dir1); + normalize_v3(dir2); + normalize_v3(dir3); + + /* do three samplings: left, middle, right */ + f = edge_ray_cast(tree, co1, dir1, NULL, e); + if (f && !edge_ray_cast(tree, co2, dir2, NULL, e)) + return true; + else if (f && !edge_ray_cast(tree, co3, dir3, NULL, e)) + return true; + else if (!f) + return true; + + return false; +} diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index a0e2b16218d..8ee2796c7e7 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -63,6 +63,7 @@ #include "BKE_nla.h" #include "BKE_bmesh.h" +#include "BKE_editmesh_bvh.h" #include "BKE_context.h" #include "BKE_constraint.h" #include "BKE_global.h" @@ -5175,7 +5176,7 @@ static int createEdgeSlideVerts(TransInfo *t) use_btree_disp = (v3d && t->obedit->dt > OB_WIRE && v3d->drawtype > OB_WIRE); if (use_btree_disp) { - btree = BMBVH_NewBVH(em, BMBVH_RESPECT_HIDDEN, NULL, NULL); + btree = BMBVH_NewBVH(em, BMBVH_RESPECT_HIDDEN, NULL); } else { btree = NULL; |