diff options
Diffstat (limited to 'source/blender/bmesh/intern')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_construct.c | 8 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_core.c | 4 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_interp.c | 4 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_iterators.c | 42 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_iterators.h | 27 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_iterators_inline.h | 18 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_marking.c | 2 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mods.c | 5 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_opdefines.c | 1 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_polygon.c | 54 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.c | 2 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_structure.c | 25 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_structure.h | 1 |
13 files changed, 78 insertions, 115 deletions
diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c index eef1e7bbb4f..e0348fea636 100644 --- a/source/blender/bmesh/intern/bmesh_construct.c +++ b/source/blender/bmesh/intern/bmesh_construct.c @@ -505,7 +505,7 @@ static void bm_vert_attrs_copy(BMesh *source_mesh, BMesh *target_mesh, return; } copy_v3_v3(target_vertex->no, source_vertex->no); - CustomData_bmesh_free_block_data(&target_mesh->vdata, &target_vertex->head.data); + CustomData_bmesh_free_block_data(&target_mesh->vdata, target_vertex->head.data); CustomData_bmesh_copy_data(&source_mesh->vdata, &target_mesh->vdata, source_vertex->head.data, &target_vertex->head.data); } @@ -517,7 +517,7 @@ static void bm_edge_attrs_copy(BMesh *source_mesh, BMesh *target_mesh, BLI_assert(!"BMEdge: source and targer match"); return; } - CustomData_bmesh_free_block_data(&target_mesh->edata, &target_edge->head.data); + CustomData_bmesh_free_block_data(&target_mesh->edata, target_edge->head.data); CustomData_bmesh_copy_data(&source_mesh->edata, &target_mesh->edata, source_edge->head.data, &target_edge->head.data); } @@ -529,7 +529,7 @@ static void bm_loop_attrs_copy(BMesh *source_mesh, BMesh *target_mesh, BLI_assert(!"BMLoop: source and targer match"); return; } - CustomData_bmesh_free_block_data(&target_mesh->ldata, &target_loop->head.data); + CustomData_bmesh_free_block_data(&target_mesh->ldata, target_loop->head.data); CustomData_bmesh_copy_data(&source_mesh->ldata, &target_mesh->ldata, source_loop->head.data, &target_loop->head.data); } @@ -542,7 +542,7 @@ static void bm_face_attrs_copy(BMesh *source_mesh, BMesh *target_mesh, return; } copy_v3_v3(target_face->no, source_face->no); - CustomData_bmesh_free_block_data(&target_mesh->pdata, &target_face->head.data); + CustomData_bmesh_free_block_data(&target_mesh->pdata, target_face->head.data); CustomData_bmesh_copy_data(&source_mesh->pdata, &target_mesh->pdata, source_face->head.data, &target_face->head.data); target_face->mat_nr = source_face->mat_nr; diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c index 1f942dad048..eb7b9f78ef4 100644 --- a/source/blender/bmesh/intern/bmesh_core.c +++ b/source/blender/bmesh/intern/bmesh_core.c @@ -1473,8 +1473,10 @@ BMVert *bmesh_semv(BMesh *bm, BMVert *tv, BMEdge *e, BMEdge **r_e) valence2 = bmesh_disk_count(tv); #endif + /* order of 'e_new' verts should match 'e' + * (so extruded faces don't flip) */ v_new = BM_vert_create(bm, tv->co, tv, BM_CREATE_NOP); - e_new = BM_edge_create(bm, v_new, tv, e, BM_CREATE_NOP); + e_new = BM_edge_create(bm, tv, v_new, e, BM_CREATE_NOP); bmesh_disk_edge_remove(e_new, tv); bmesh_disk_edge_remove(e_new, v_new); diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c index 306b6e74350..a32f28169f6 100644 --- a/source/blender/bmesh/intern/bmesh_interp.c +++ b/source/blender/bmesh/intern/bmesh_interp.c @@ -54,7 +54,7 @@ static void bm_data_interp_from_elem(CustomData *data_layer, BMElem *ele1, BMEle /* do nothing */ } else { - CustomData_bmesh_free_block_data(data_layer, &ele_dst->head.data); + CustomData_bmesh_free_block_data(data_layer, ele_dst->head.data); CustomData_bmesh_copy_data(data_layer, data_layer, ele1->head.data, &ele_dst->head.data); } } @@ -63,7 +63,7 @@ static void bm_data_interp_from_elem(CustomData *data_layer, BMElem *ele1, BMEle /* do nothing */ } else { - CustomData_bmesh_free_block_data(data_layer, &ele_dst->head.data); + CustomData_bmesh_free_block_data(data_layer, ele_dst->head.data); CustomData_bmesh_copy_data(data_layer, data_layer, ele2->head.data, &ele_dst->head.data); } } diff --git a/source/blender/bmesh/intern/bmesh_iterators.c b/source/blender/bmesh/intern/bmesh_iterators.c index 91b9774634d..476878ad38c 100644 --- a/source/blender/bmesh/intern/bmesh_iterators.c +++ b/source/blender/bmesh/intern/bmesh_iterators.c @@ -338,50 +338,18 @@ int BM_iter_mesh_count_flag(const char itype, BMesh *bm, const char hflag, const # define USE_IMMUTABLE_ASSERT #endif -void bmiter__vert_of_mesh_begin(struct BMIter__vert_of_mesh *iter) +void bmiter__elem_of_mesh_begin(struct BMIter__elem_of_mesh *iter) { #ifdef USE_IMMUTABLE_ASSERT - ((BMIter *)iter)->count = iter->bm->totvert; + ((BMIter *)iter)->count = BLI_mempool_count(iter->pooliter.pool); #endif - BLI_mempool_iternew(iter->bm->vpool, &iter->pooliter); + BLI_mempool_iternew(iter->pooliter.pool, &iter->pooliter); } -void *bmiter__vert_of_mesh_step(struct BMIter__vert_of_mesh *iter) +void *bmiter__elem_of_mesh_step(struct BMIter__elem_of_mesh *iter) { #ifdef USE_IMMUTABLE_ASSERT - BLI_assert(((BMIter *)iter)->count <= iter->bm->totvert); -#endif - return BLI_mempool_iterstep(&iter->pooliter); -} - -void bmiter__edge_of_mesh_begin(struct BMIter__edge_of_mesh *iter) -{ -#ifdef USE_IMMUTABLE_ASSERT - ((BMIter *)iter)->count = iter->bm->totedge; -#endif - BLI_mempool_iternew(iter->bm->epool, &iter->pooliter); -} - -void *bmiter__edge_of_mesh_step(struct BMIter__edge_of_mesh *iter) -{ -#ifdef USE_IMMUTABLE_ASSERT - BLI_assert(((BMIter *)iter)->count <= iter->bm->totedge); -#endif - return BLI_mempool_iterstep(&iter->pooliter); -} - -void bmiter__face_of_mesh_begin(struct BMIter__face_of_mesh *iter) -{ -#ifdef USE_IMMUTABLE_ASSERT - ((BMIter *)iter)->count = iter->bm->totface; -#endif - BLI_mempool_iternew(iter->bm->fpool, &iter->pooliter); -} - -void *bmiter__face_of_mesh_step(struct BMIter__face_of_mesh *iter) -{ -#ifdef USE_IMMUTABLE_ASSERT - BLI_assert(((BMIter *)iter)->count <= iter->bm->totface); + BLI_assert(((BMIter *)iter)->count <= BLI_mempool_count(iter->pooliter.pool)); #endif return BLI_mempool_iterstep(&iter->pooliter); } diff --git a/source/blender/bmesh/intern/bmesh_iterators.h b/source/blender/bmesh/intern/bmesh_iterators.h index fdf0f27f05f..44be7072e71 100644 --- a/source/blender/bmesh/intern/bmesh_iterators.h +++ b/source/blender/bmesh/intern/bmesh_iterators.h @@ -110,16 +110,7 @@ extern const char bm_iter_itype_htype_map[BM_ITYPE_MAX]; for (ele = BM_iter_new(iter, NULL, itype, data), indexvar = 0; ele; ele = BM_iter_step(iter), (indexvar)++) /* iterator type structs */ -struct BMIter__vert_of_mesh { - BMesh *bm; - BLI_mempool_iter pooliter; -}; -struct BMIter__edge_of_mesh { - BMesh *bm; - BLI_mempool_iter pooliter; -}; -struct BMIter__face_of_mesh { - BMesh *bm; +struct BMIter__elem_of_mesh { BLI_mempool_iter pooliter; }; struct BMIter__edge_of_vert { @@ -173,9 +164,7 @@ typedef void *(*BMIter__step_cb) (void *); typedef struct BMIter { /* keep union first */ union { - struct BMIter__vert_of_mesh vert_of_mesh; - struct BMIter__edge_of_mesh edge_of_mesh; - struct BMIter__face_of_mesh face_of_mesh; + struct BMIter__elem_of_mesh elem_of_mesh; struct BMIter__edge_of_vert edge_of_vert; struct BMIter__face_of_vert face_of_vert; @@ -219,9 +208,7 @@ int BM_iter_mesh_count_flag(const char itype, BMesh *bm, const char hflag, c void bmiter__##name##_begin(struct BMIter__##name *iter); \ void *bmiter__##name##_step(struct BMIter__##name *iter) -BMITER_CB_DEF(vert_of_mesh); -BMITER_CB_DEF(edge_of_mesh); -BMITER_CB_DEF(face_of_mesh); +BMITER_CB_DEF(elem_of_mesh); BMITER_CB_DEF(edge_of_vert); BMITER_CB_DEF(face_of_vert); BMITER_CB_DEF(loop_of_vert); @@ -237,4 +224,12 @@ BMITER_CB_DEF(loop_of_face); #include "intern/bmesh_iterators_inline.h" +#define BM_ITER_CHECK_TYPE_DATA(data) \ + CHECK_TYPE_ANY(data, void *, BMFace *, BMEdge *, BMVert *, BMLoop *, BMElem *) + +#define BM_iter_new(iter, bm, itype, data) \ + (BM_ITER_CHECK_TYPE_DATA(data), BM_iter_new(iter, bm, itype, data)) +#define BM_iter_init(iter, bm, itype, data) \ + (BM_ITER_CHECK_TYPE_DATA(data), BM_iter_init(iter, bm, itype, data)) + #endif /* __BMESH_ITERATORS_H__ */ diff --git a/source/blender/bmesh/intern/bmesh_iterators_inline.h b/source/blender/bmesh/intern/bmesh_iterators_inline.h index b9733d4702f..d3e18b97acb 100644 --- a/source/blender/bmesh/intern/bmesh_iterators_inline.h +++ b/source/blender/bmesh/intern/bmesh_iterators_inline.h @@ -60,23 +60,23 @@ BLI_INLINE bool BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *da case BM_VERTS_OF_MESH: BLI_assert(bm != NULL); BLI_assert(data == NULL); - iter->begin = (BMIter__begin_cb)bmiter__vert_of_mesh_begin; - iter->step = (BMIter__step_cb)bmiter__vert_of_mesh_step; - iter->data.vert_of_mesh.bm = bm; + iter->begin = (BMIter__begin_cb)bmiter__elem_of_mesh_begin; + iter->step = (BMIter__step_cb)bmiter__elem_of_mesh_step; + iter->data.elem_of_mesh.pooliter.pool = bm->vpool; break; case BM_EDGES_OF_MESH: BLI_assert(bm != NULL); BLI_assert(data == NULL); - iter->begin = (BMIter__begin_cb)bmiter__edge_of_mesh_begin; - iter->step = (BMIter__step_cb)bmiter__edge_of_mesh_step; - iter->data.edge_of_mesh.bm = bm; + iter->begin = (BMIter__begin_cb)bmiter__elem_of_mesh_begin; + iter->step = (BMIter__step_cb)bmiter__elem_of_mesh_step; + iter->data.elem_of_mesh.pooliter.pool = bm->epool; break; case BM_FACES_OF_MESH: BLI_assert(bm != NULL); BLI_assert(data == NULL); - iter->begin = (BMIter__begin_cb)bmiter__face_of_mesh_begin; - iter->step = (BMIter__step_cb)bmiter__face_of_mesh_step; - iter->data.face_of_mesh.bm = bm; + iter->begin = (BMIter__begin_cb)bmiter__elem_of_mesh_begin; + iter->step = (BMIter__step_cb)bmiter__elem_of_mesh_step; + iter->data.elem_of_mesh.pooliter.pool = bm->fpool; break; case BM_EDGES_OF_VERT: BLI_assert(data != NULL); diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index 19e6f646564..ee35d8cd1d2 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -537,7 +537,7 @@ void BM_mesh_select_mode_set(BMesh *bm, int selectmode) * counts number of elements with flag enabled/disabled */ static int bm_mesh_flag_count(BMesh *bm, const char htype, const char hflag, - const short respecthide, const bool test_for_enabled) + const bool respecthide, const bool test_for_enabled) { BMElem *ele; BMIter iter; diff --git a/source/blender/bmesh/intern/bmesh_mods.c b/source/blender/bmesh/intern/bmesh_mods.c index 6e8591da0f3..72d25413f09 100644 --- a/source/blender/bmesh/intern/bmesh_mods.c +++ b/source/blender/bmesh/intern/bmesh_mods.c @@ -265,7 +265,8 @@ BMFace *BM_faces_join_pair(BMesh *bm, BMFace *f_a, BMFace *f_b, BMEdge *e, const * * \param bm The bmesh * \param f the original face - * \param v1, v2 vertices which define the split edge, must be different + * \param l_a, l_b Loops of this face, their vertices define + * the split edge to be created (must be differ and not can't be adjacent in the face). * \param r_l pointer which will receive the BMLoop for the split edge in the new face * \param example Edge used for attributes of splitting edge, if non-NULL * \param nodouble Use an existing edge if found @@ -348,7 +349,7 @@ BMFace *BM_face_split(BMesh *bm, BMFace *f, * \param l_a, l_b vertices which define the split edge, must be different * \param cos Array of coordinates for intermediate points * \param n Length of \a cos (must be > 0) - * \param r_l pointer which will receive the BMLoop for the first split edge (from \a v1) in the new face + * \param r_l pointer which will receive the BMLoop for the first split edge (from \a l_a) in the new face * \param example Edge used for attributes of splitting edge, if non-NULL * * \return Pointer to the newly created face representing one side of the split diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index d8be55ce7c2..e2be90e7baf 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -104,6 +104,7 @@ static BMOpDefine bmo_smooth_vert_def = { "smooth_vert", /* slots_in */ {{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */ + {"factor", BMO_OP_SLOT_FLT}, /* smoothing factor */ {"mirror_clip_x", BMO_OP_SLOT_BOOL}, /* set vertices close to the x axis before the operation to 0 */ {"mirror_clip_y", BMO_OP_SLOT_BOOL}, /* set vertices close to the y axis before the operation to 0 */ {"mirror_clip_z", BMO_OP_SLOT_BOOL}, /* set vertices close to the z axis before the operation to 0 */ diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c index 9a1914b5596..a8e1acd9c71 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.c +++ b/source/blender/bmesh/intern/bmesh_polygon.c @@ -666,49 +666,25 @@ static bool line_crosses_v2f(const float v1[2], const float v2[2], const float v */ bool BM_face_point_inside_test(BMFace *f, const float co[3]) { - int ax, ay; - float co2[2], cent[2] = {0.0f, 0.0f}, out[2] = {FLT_MAX * 0.5f, FLT_MAX * 0.5f}; + float axis_mat[3][3]; + float (*projverts)[2] = BLI_array_alloca(projverts, f->len); + + float co_2d[2]; BMLoop *l_iter; - BMLoop *l_first; - int crosses = 0; - float onepluseps = 1.0f + (float)FLT_EPSILON * 150.0f; + int i; if (is_zero_v3(f->no)) BM_face_normal_update(f); - - /* find best projection of face XY, XZ or YZ: barycentric weights of - * the 2d projected coords are the same and faster to compute - * - * this probably isn't all that accurate, but it has the advantage of - * being fast (especially compared to projecting into the face orientation) - */ - axis_dominant_v3(&ax, &ay, f->no); - - co2[0] = co[ax]; - co2[1] = co[ay]; - - l_iter = l_first = BM_FACE_FIRST_LOOP(f); - do { - cent[0] += l_iter->v->co[ax]; - cent[1] += l_iter->v->co[ay]; - } while ((l_iter = l_iter->next) != l_first); - - mul_v2_fl(cent, 1.0f / (float)f->len); - - l_iter = l_first = BM_FACE_FIRST_LOOP(f); - do { - float v1[2], v2[2]; - - v1[0] = (l_iter->prev->v->co[ax] - cent[0]) * onepluseps + cent[0]; - v1[1] = (l_iter->prev->v->co[ay] - cent[1]) * onepluseps + cent[1]; - - v2[0] = (l_iter->v->co[ax] - cent[0]) * onepluseps + cent[0]; - v2[1] = (l_iter->v->co[ay] - cent[1]) * onepluseps + cent[1]; - - crosses += line_crosses_v2f(v1, v2, co2, out) != 0; - } while ((l_iter = l_iter->next) != l_first); - - return crosses % 2 != 0; + + axis_dominant_v3_to_m3(axis_mat, f->no); + + mul_v2_m3v3(co_2d, axis_mat, co); + + for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f); i < f->len; i++, l_iter = l_iter->next) { + mul_v2_m3v3(projverts[i], axis_mat, l_iter->v->co); + } + + return isect_point_poly_v2(co_2d, (const float (*)[2])projverts, f->len, false); } /** diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 685e5443583..40e0356e14c 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -311,7 +311,7 @@ BMLoop *BM_vert_find_first_loop(BMVert *v) { BMEdge *e; - if (!v || !v->e) + if (!v->e) return NULL; e = bmesh_disk_faceedge_find_first(v->e, v); diff --git a/source/blender/bmesh/intern/bmesh_structure.c b/source/blender/bmesh/intern/bmesh_structure.c index d8313dab36f..3e8002c0192 100644 --- a/source/blender/bmesh/intern/bmesh_structure.c +++ b/source/blender/bmesh/intern/bmesh_structure.c @@ -108,6 +108,7 @@ bool bmesh_edge_swapverts(BMEdge *e, BMVert *v_orig, BMVert *v_new) * - #bmesh_radial_append * - #bmesh_radial_loop_remove * - #bmesh_radial_facevert_count + * - #bmesh_radial_facevert_check * - #bmesh_radial_faceloop_find_first * - #bmesh_radial_faceloop_find_next * - #bmesh_radial_validate @@ -265,7 +266,7 @@ BMEdge *bmesh_disk_faceedge_find_first(const BMEdge *e, const BMVert *v) { const BMEdge *e_find = e; do { - if (e_find->l && bmesh_radial_facevert_count(e_find->l, v)) { + if (e_find->l && bmesh_radial_facevert_check(e_find->l, v)) { return (BMEdge *)e_find; } } while ((e_find = bmesh_disk_edge_next(e_find, v)) != e); @@ -275,10 +276,10 @@ BMEdge *bmesh_disk_faceedge_find_first(const BMEdge *e, const BMVert *v) BMEdge *bmesh_disk_faceedge_find_next(const BMEdge *e, const BMVert *v) { - BMEdge *e_find = NULL; + BMEdge *e_find; e_find = bmesh_disk_edge_next(e, v); do { - if (e_find->l && bmesh_radial_facevert_count(e_find->l, v)) { + if (e_find->l && bmesh_radial_facevert_check(e_find->l, v)) { return e_find; } } while ((e_find = bmesh_disk_edge_next(e_find, v)) != e); @@ -455,6 +456,24 @@ int bmesh_radial_facevert_count(const BMLoop *l, const BMVert *v) return count; } +/** + * \brief RADIAL CHECK FACE VERT + * + * Quicker check for ``bmesh_radial_facevert_count(...) != 0`` + */ +bool bmesh_radial_facevert_check(const BMLoop *l, const BMVert *v) +{ + const BMLoop *l_iter; + l_iter = l; + do { + if (l_iter->v == v) { + return true; + } + } while ((l_iter = l_iter->radial_next) != l); + + return false; +} + /*****loop cycle functions, e.g. loops surrounding a face**** */ bool bmesh_loop_validate(BMFace *f) { diff --git a/source/blender/bmesh/intern/bmesh_structure.h b/source/blender/bmesh/intern/bmesh_structure.h index d2ad655ae75..29868194bbf 100644 --- a/source/blender/bmesh/intern/bmesh_structure.h +++ b/source/blender/bmesh/intern/bmesh_structure.h @@ -61,6 +61,7 @@ void bmesh_radial_loop_remove(BMLoop *l, BMEdge *e) ATTR_NONNULL(1); * just use member access l->radial_next, l->radial_prev now */ int bmesh_radial_facevert_count(const BMLoop *l, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); +bool bmesh_radial_facevert_check(const BMLoop *l, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); BMLoop *bmesh_radial_faceloop_find_first(const BMLoop *l, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); BMLoop *bmesh_radial_faceloop_find_next(const BMLoop *l, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); BMLoop *bmesh_radial_faceloop_find_vert(const BMFace *f, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); |