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;
106 settings.min_iter_per_thread = MIN_ITER_SIZE;
109 settings.userdata_chunk = &
count;
110 settings.userdata_chunk_size =
sizeof(
count);
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);
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)
385 settings.userdata_chunk = &chunk_data;
386 settings.userdata_chunk_size =
sizeof(chunk_data);
401 settings.userdata_chunk = &chunk_data;
402 settings.userdata_chunk_size =
sizeof(chunk_data);
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);
759 const bool respecthide,
760 const bool test_for_enabled)
805 const bool respecthide)
813 const bool respecthide)
877 for (; ese; ese = ese->
prev) {
992 float vec[3] = {0.0f, 0.0f, 0.0f};
1003 if (eve->
no[0] < 0.5f) {
1006 else if (eve->
no[1] < 0.5f) {
1028 if (eed->
v2->
co[1] > eed->
v1->
co[1]) {
1047 "BMEdit Selection");
1121 ese_next = ese->
next;
1142 ese->
ele = ese_last->
ele;
1147 ese->
ele = ese_last->
ele;
1193 GHash *map =
nullptr;
1194 switch (ese->ele->head.htype) {
1208 if (map !=
nullptr) {
1209 BMElem *ele_dst = ese->ele;
1213 if (ele_dst_next ==
nullptr) {
1216 ele_dst = ele_dst_next;
1218 if (
UNLIKELY(ele_dst == ese->ele)) {
1222 if (use_chain ==
false) {
1234 ese_next = ese->next;
1247 const bool respecthide,
1248 const bool overwrite,
1249 const char hflag_test)
1255 const char hflag_nosel = hflag & ~BM_ELEM_SELECT;
1266 (respecthide ==
false) && (hflag_test == 0))
1270 for (i = 0; i < 3; i++) {
1275 for (; ele; ele =
static_cast<BMElem *
>(BM_iter_step(&iter))) {
1283 for (i = 0; i < 3; i++) {
1287 if (htype & flag_types[i]) {
1289 for (; ele; ele =
static_cast<BMElem *
>(BM_iter_step(&iter))) {
1300 else if (overwrite) {
1316 const bool respecthide,
1317 const bool overwrite,
1318 const char hflag_test)
1327 const char hflag_nosel = hflag & ~BM_ELEM_SELECT;
1340 for (i = 0; i < 3; i++) {
1341 if (htype & flag_types[i]) {
1343 for (; ele; ele =
static_cast<BMElem *
>(BM_iter_step(&iter))) {
1355 else if (overwrite) {
1370 const bool respecthide)
1379 const bool respecthide)
1416 BMEdge *e_iter, *e_first;
1417 e_iter = e_first =
v->
e;
1421 const BMLoop *l_radial_iter, *l_radial_first;
1422 l_radial_iter = l_radial_first = e_iter->
l;
1425 }
while ((l_radial_iter = l_radial_iter->
radial_next) != l_radial_first);
1440 const BMLoop *l_iter, *l_first;
1441 l_iter = l_first =
e->l;
1444 }
while ((l_iter = l_iter->
radial_next) != l_first);
1476 }
while ((l_iter = l_iter->
next) != l_first);
1481 }
while ((l_iter = l_iter->
next) != l_first);
1491 }
while ((l_iter = l_iter->
next) != l_first);
1499 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)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct 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)
ATTR_WARN_UNUSED_RESULT BMesh * bm
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)
int BM_mesh_active_elem_index_get(BMesh *bm)
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)
ccl_device_inline float4 select(const int4 mask, const float4 a, const float4 b)
struct BMEditSelection * next
struct BMEditSelection * prev
struct BMLoop * radial_next