47 count->selection_len += 1;
58 count->selection_len += 1;
69 count->selection_len += 1;
74 void *__restrict chunk_join,
75 void *__restrict chunk)
101 const int MIN_ITER_SIZE = 1024;
113 BM_iter_parallel(
bm, iter_type, range_func,
nullptr, &settings);
114 return count.selection_len;
156 const BMEdge *e_iter = e_first;
168static bool bm_vert_is_edge_select_any(
const BMVert *
v)
171 const BMEdge *e_iter, *e_first;
172 e_iter = e_first =
v->e;
186 const BMEdge *e_iter, *e_first;
187 e_iter = e_first =
v->e;
199 const BMLoop *l_iter = l_first;
202 while ((l_iter = l_iter->
radial_next) != l_first) {
211static bool bm_edge_is_face_select_any(
const BMEdge *
e)
214 const BMLoop *l_iter, *l_first;
215 l_iter = l_first =
e->l;
220 }
while ((l_iter = l_iter->
radial_next) != l_first);
229 const BMLoop *l_iter, *l_first;
230 l_iter = l_first =
e->l;
235 }
while ((l_iter = l_iter->
radial_next) != l_first);
250 if (
bm->totvertsel) {
258 if (
bm->totedgesel) {
271 if (
bm->totvertsel) {
279 if (
bm->totedgesel) {
287 if (
bm->totfacesel) {
295 }
while ((l_iter = l_iter->
next) != l_first);
320 tls->userdata_chunk);
341 tls->userdata_chunk);
354 }
while ((l_iter = l_iter->
next) != l_first);
361 if (is_selected && !ok) {
364 else if (ok && !is_selected) {
370 void *__restrict chunk_join,
371 void *__restrict chunk)
460 l_iter = l_first =
e->l;
463 }
while ((l_iter = l_iter->
radial_next) != l_first);
502 }
while ((l_iter = l_iter->
next) != l_first);
564 for (
i = 0;
i < 2;
i++) {
599 }
while ((l_iter = l_iter->
next) != l_first);
620 }
while ((l_iter = l_iter->
next) != l_first);
631 }
while ((l_iter = l_iter->
next) != l_first);
639 }
while ((l_iter = l_iter->
next) != l_first);
648 }
while ((l_iter = l_iter->
next) != l_first);
708 bm->selectmode = selectmode;
759 const bool respecthide,
760 const bool test_for_enabled)
805 const bool respecthide)
813 const bool respecthide)
871 for (; ese; ese = ese->
prev) {
901 if (
bm->selected.last) {
914 if (
bm->selected.last) {
927 if (
bm->selected.last) {
986 float vec[3] = {0.0f, 0.0f, 0.0f};
997 if (eve->
no[0] < 0.5f) {
1000 else if (eve->
no[1] < 0.5f) {
1022 if (eed->
v2->
co[1] > eed->
v1->
co[1]) {
1113 for (ese =
static_cast<BMEditSelection *
>(
bm->selected.first); ese; ese = ese_next) {
1114 ese_next = ese->
next;
1135 ese->
ele = ese_last->
ele;
1140 ese->
ele = ese_last->
ele;
1186 GHash *map =
nullptr;
1187 switch (ese->ele->head.htype) {
1201 if (map !=
nullptr) {
1202 BMElem *ele_dst = ese->ele;
1206 if (ele_dst_next ==
nullptr) {
1209 ele_dst = ele_dst_next;
1211 if (
UNLIKELY(ele_dst == ese->ele)) {
1215 if (use_chain ==
false) {
1227 ese_next = ese->next;
1240 const bool respecthide,
1241 const bool overwrite,
1242 const char hflag_test)
1259 (respecthide ==
false) && (hflag_test == 0))
1263 for (
i = 0;
i < 3;
i++) {
1268 for (; ele; ele =
static_cast<BMElem *
>(BM_iter_step(&iter))) {
1273 bm->totvertsel =
bm->totedgesel =
bm->totfacesel = 0;
1276 for (
i = 0;
i < 3;
i++) {
1280 if (htype & flag_types[
i]) {
1282 for (; ele; ele =
static_cast<BMElem *
>(BM_iter_step(&iter))) {
1293 else if (overwrite) {
1309 const bool respecthide,
1310 const bool overwrite,
1311 const char hflag_test)
1333 for (
i = 0;
i < 3;
i++) {
1334 if (htype & flag_types[
i]) {
1336 for (; ele; ele =
static_cast<BMElem *
>(BM_iter_step(&iter))) {
1348 else if (overwrite) {
1363 const bool respecthide)
1372 const bool respecthide)
1409 BMEdge *e_iter, *e_first;
1410 e_iter = e_first =
v->e;
1414 const BMLoop *l_radial_iter, *l_radial_first;
1415 l_radial_iter = l_radial_first = e_iter->
l;
1418 }
while ((l_radial_iter = l_radial_iter->
radial_next) != l_radial_first);
1433 const BMLoop *l_iter, *l_first;
1434 l_iter = l_first =
e->l;
1437 }
while ((l_iter = l_iter->
radial_next) != l_first);
1469 }
while ((l_iter = l_iter->
next) != l_first);
1474 }
while ((l_iter = l_iter->
next) != l_first);
1484 }
while ((l_iter = l_iter->
next) != l_first);
1492 switch (head->
htype) {
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_findptr(const struct ListBase *listbase, const void *ptr, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE float normalize_v3(float n[3])
struct MempoolIterData MempoolIterData
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
void(* TaskParallelMempoolFunc)(void *userdata, MempoolIterData *iter, const TaskParallelTLS *__restrict tls)
Read Guarded memory(de)allocation.
#define BM_FACE_FIRST_LOOP(p)
#define BM_elem_index_get(ele)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_flag_set(ele, hflag, val)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_test_bool(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
#define BM_ITER_MESH(ele, iter, bm, itype)
BMIterType
BMesh Iterators.
#define BM_iter_new(iter, bm, itype, data)
BMVert * BM_mesh_active_vert_get(BMesh *bm)
static TaskParallelMempoolFunc recount_totsels_get_range_func(BMIterType iter_type)
void BM_select_history_clear(BMesh *bm)
static void vert_flush_hide_set(BMVert *v)
void _bm_elem_hide_set(BMesh *bm, BMHeader *head, const bool hide)
bool _bm_select_history_check(BMesh *bm, const BMHeader *ele)
static void recount_totsels_range_vert_func(void *, MempoolIterData *iter, const TaskParallelTLS *__restrict tls)
void _bm_select_history_store_head_notest(BMesh *bm, BMHeader *ele)
int BM_mesh_active_face_index_get(BMesh *bm, bool is_sloppy, bool is_selected)
void BM_vert_hide_set(BMVert *v, const bool hide)
void BM_mesh_elem_hflag_enable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
int BM_mesh_active_edge_index_get(BMesh *bm)
static bool bm_edge_is_face_visible_any(const BMEdge *e)
void BM_mesh_select_mode_flush(BMesh *bm)
int BM_mesh_elem_hflag_count_disabled(BMesh *bm, const char htype, const char hflag, const bool respecthide)
static void recount_totsels_range_face_func(void *, MempoolIterData *iter, const TaskParallelTLS *__restrict tls)
void BM_mesh_select_mode_set(BMesh *bm, int selectmode)
static void recount_totsels_reduce(const void *__restrict, void *__restrict chunk_join, void *__restrict chunk)
void BM_face_select_set(BMesh *bm, BMFace *f, const bool select)
Select Face.
static bool bm_vert_is_edge_visible_any(const BMVert *v)
BMEdge * BM_mesh_active_edge_get(BMesh *bm)
void BM_elem_select_set(BMesh *bm, BMElem *ele, const bool select)
void BM_mesh_select_flush(BMesh *bm)
static bool recount_totsels_are_ok(BMesh *bm)
bool _bm_select_history_remove(BMesh *bm, BMHeader *ele)
static void recount_totsels(BMesh *bm)
void _bm_select_history_store_head(BMesh *bm, BMHeader *ele)
void BM_mesh_select_mode_clean_ex(BMesh *bm, const short selectmode)
Select Mode Clean.
static void bm_mesh_select_mode_flush_vert_to_edge(BMesh *bm)
static bool bm_vert_is_edge_select_any_other(const BMVert *v, const BMEdge *e_first)
void _bm_select_history_store_after(BMesh *bm, BMEditSelection *ese_ref, BMHeader *ele)
void BM_mesh_select_mode_flush_ex(BMesh *bm, const short selectmode, eBMSelectionFlushFLags flags)
Select Mode Flush.
static bool bm_edge_is_face_select_any_other(BMLoop *l_first)
void _bm_select_history_store_notest(BMesh *bm, BMHeader *ele)
BMFace * BM_mesh_active_face_get(BMesh *bm, const bool is_sloppy, const bool is_selected)
int BM_mesh_active_vert_index_get(BMesh *bm)
static int recount_totsel(BMesh *bm, BMIterType iter_type)
BMElem * BM_mesh_active_elem_get(BMesh *bm)
void BM_mesh_select_mode_clean(BMesh *bm)
static void bm_mesh_select_mode_flush_vert_to_edge_iter_fn(void *, MempoolIterData *iter, const TaskParallelTLS *__restrict tls)
void BM_editselection_center(BMEditSelection *ese, float r_center[3])
void BM_vert_select_set(BMesh *bm, BMVert *v, const bool select)
Select Vert.
void BM_mesh_elem_hflag_disable_test(BMesh *bm, const char htype, const char hflag, const bool respecthide, const bool overwrite, const char hflag_test)
void _bm_select_history_store_after_notest(BMesh *bm, BMEditSelection *ese_ref, BMHeader *ele)
void BM_edge_select_set(BMesh *bm, BMEdge *e, const bool select)
Select Edge.
void BM_select_history_validate(BMesh *bm)
void BM_editselection_plane(BMEditSelection *ese, float r_plane[3])
void BM_edge_select_set_noflush(BMesh *bm, BMEdge *e, const bool select)
void BM_editselection_normal(BMEditSelection *ese, float r_normal[3])
static void bm_mesh_select_mode_flush_edge_to_face_iter_fn(void *, MempoolIterData *iter, const TaskParallelTLS *__restrict tls)
void BM_mesh_deselect_flush(BMesh *bm)
static void edge_flush_hide_set(BMEdge *e)
GHash * BM_select_history_map_create(BMesh *bm)
void BM_edge_hide_set(BMEdge *e, const bool hide)
static void bm_mesh_select_mode_flush_edge_to_face(BMesh *bm)
void BM_mesh_elem_hflag_disable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
static int bm_mesh_flag_count(BMesh *bm, const char htype, const char hflag, const bool respecthide, const bool test_for_enabled)
void BM_mesh_active_face_set(BMesh *bm, BMFace *f)
void _bm_select_history_store(BMesh *bm, BMHeader *ele)
static void recount_totsels_range_edge_func(void *, MempoolIterData *iter, const TaskParallelTLS *__restrict tls)
static void recount_totvertsel(BMesh *bm)
void BM_select_history_merge_from_targetmap(BMesh *bm, GHash *vert_map, GHash *edge_map, GHash *face_map, const bool use_chain)
void BM_face_select_set_noflush(BMesh *bm, BMFace *f, const bool select)
static void bm_mesh_select_mode_flush_reduce_fn(const void *__restrict, void *__restrict chunk_join, void *__restrict chunk)
static void recount_totedgesel(BMesh *bm)
bool BM_select_history_active_get(BMesh *bm, BMEditSelection *ese)
void BM_face_hide_set(BMFace *f, const bool hide)
static BMEditSelection * bm_select_history_create(BMHeader *ele)
int BM_mesh_elem_hflag_count_enabled(BMesh *bm, const char htype, const char hflag, const bool respecthide)
void BM_mesh_elem_hflag_enable_test(BMesh *bm, const char htype, const char hflag, const bool respecthide, const bool overwrite, const char hflag_test)
static void recount_totfacesel(BMesh *bm)
#define BM_select_history_store_notest(bm, ele)
#define BM_select_history_store_head_notest(bm, ele)
#define BM_select_history_store_after_notest(bm, ese_ref, ele)
#define BM_select_history_check(bm, ele)
@ BM_SELECT_LEN_FLUSH_RECALC_ALL
@ BM_SELECT_LEN_FLUSH_RECALC_EDGE
@ BM_SELECT_LEN_FLUSH_RECALC_FACE
@ BM_SELECT_LEN_FLUSH_RECALC_VERT
void BM_face_calc_center_median(const BMFace *f, float r_cent[3])
void BM_face_calc_tangent_auto(const BMFace *f, float r_tangent[3])
#define BM_ELEM_API_FLAG_DISABLE(element, f)
#define BM_ELEM_API_FLAG_TEST(element, f)
#define BM_ELEM_API_FLAG_ENABLE(element, f)
BLI_INLINE bool BM_edge_is_boundary(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
BLI_INLINE BMEdge * bmesh_disk_edge_next(const BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void * MEM_callocN(size_t len, const char *str)
struct BMEditSelection * next
struct BMEditSelection * prev
struct BMLoop * radial_next
TaskParallelReduceFunc func_reduce
size_t userdata_chunk_size