Blender V4.3
bmesh_operator_api_inline.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
11#pragma once
12
13/* Tool Flag API: Tool code must never put junk in header flags (#BMHeader.hflag)
14 * instead, use this API to set flags.
15 * If you need to store a value per element, use a #GHash or a mapping slot to do it. */
16
18 short _bmo_elem_flag_test(BMesh *bm, const BMFlagLayer *oflags, const short oflag)
19{
21 return oflags[bm->toolflag_index].f & oflag;
22}
23
25 bool _bmo_elem_flag_test_bool(BMesh *bm, const BMFlagLayer *oflags, const short oflag)
26{
28 return (oflags[bm->toolflag_index].f & oflag) != 0;
29}
30
31ATTR_NONNULL(1, 2)
37
38ATTR_NONNULL(1, 2)
44
45ATTR_NONNULL(1, 2)
47{
49 if (val) {
51 }
52 else {
53 oflags[bm->toolflag_index].f &= (short)~oflag;
54 }
55}
56
57ATTR_NONNULL(1, 2)
63
64ATTR_NONNULL(1, 2)
66 BMOpSlot *slot,
67 void *element,
68 const int val)
69{
70 union {
71 void *ptr;
72 int val;
73 } t = {NULL};
74 BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_INT);
75 BMO_slot_map_insert(op, slot, element, ((void)(t.val = val), t.ptr));
76}
77
78ATTR_NONNULL(1, 2)
80 BMOpSlot *slot,
81 void *element,
82 const bool val)
83{
84 union {
85 void *ptr;
86 bool val;
87 } t = {NULL};
88 BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_BOOL);
89 BMO_slot_map_insert(op, slot, element, ((void)(t.val = val), t.ptr));
90}
91
92ATTR_NONNULL(1, 2)
94 BMOpSlot *slot,
95 void *element,
96 const float val)
97{
98 union {
99 void *ptr;
100 float val;
101 } t = {NULL};
102 BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_FLT);
103 BMO_slot_map_insert(op, slot, element, ((void)(t.val = val), t.ptr));
104}
105
106/* pointer versions of BMO_slot_map_float_get and BMO_slot_map_float_insert.
107 *
108 * do NOT use these for non-operator-api-allocated memory! instead
109 * use BMO_slot_map_data_get and BMO_slot_map_insert, which copies the data. */
110
111ATTR_NONNULL(1, 2)
113 BMOpSlot *slot,
114 const void *element,
115 void *val)
116{
117 BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL);
118 BMO_slot_map_insert(op, slot, element, val);
119}
120
121ATTR_NONNULL(1, 2)
123 BMOpSlot *slot,
124 const void *element,
125 void *val)
126{
127 BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_ELEM);
128 BMO_slot_map_insert(op, slot, element, val);
129}
130
131/* no values */
132ATTR_NONNULL(1, 2)
133BLI_INLINE void BMO_slot_map_empty_insert(BMOperator *op, BMOpSlot *slot, const void *element)
134{
135 BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_EMPTY);
136 BMO_slot_map_insert(op, slot, element, NULL);
137}
138
140 bool BMO_slot_map_contains(BMOpSlot *slot, const void *element)
141{
142 BLI_assert(slot->slot_type == BMO_OP_SLOT_MAPPING);
143 return BLI_ghash_haskey(slot->data.ghash, element);
144}
145
147 void **BMO_slot_map_data_get(BMOpSlot *slot, const void *element)
148{
149
150 return BLI_ghash_lookup_p(slot->data.ghash, element);
151}
152
154 float BMO_slot_map_float_get(BMOpSlot *slot, const void *element)
155{
156 void **data;
157 BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_FLT);
158
159 data = BMO_slot_map_data_get(slot, element);
160 if (data) {
161 return *(float *)data;
162 }
163 else {
164 return 0.0f;
165 }
166}
167
169 int BMO_slot_map_int_get(BMOpSlot *slot, const void *element)
170{
171 void **data;
172 BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_INT);
173
174 data = BMO_slot_map_data_get(slot, element);
175 if (data) {
176 return *(int *)data;
177 }
178 else {
179 return 0;
180 }
181}
182
184 bool BMO_slot_map_bool_get(BMOpSlot *slot, const void *element)
185{
186 void **data;
187 BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_BOOL);
188
189 data = BMO_slot_map_data_get(slot, element);
190 if (data) {
191 return *(bool *)data;
192 }
193 else {
194 return false;
195 }
196}
197
199 void *BMO_slot_map_ptr_get(BMOpSlot *slot, const void *element)
200{
201 void **val = BMO_slot_map_data_get(slot, element);
202 BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL);
203 if (val) {
204 return *val;
205 }
206
207 return NULL;
208}
209
211 void *BMO_slot_map_elem_get(BMOpSlot *slot, const void *element)
212{
213 void **val = (void **)BMO_slot_map_data_get(slot, element);
214 BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_ELEM);
215 if (val) {
216 return *val;
217 }
218
219 return NULL;
220}
#define BLI_assert(a)
Definition BLI_assert.h:50
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_NONNULL(...)
#define BLI_INLINE
void ** BLI_ghash_lookup_p(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
Definition BLI_ghash.c:745
ATTR_WARN_UNUSED_RESULT BMesh * bm
@ BMO_OP_SLOT_MAPPING
BLI_INLINE bool _bmo_elem_flag_test_bool(BMesh *bm, const BMFlagLayer *oflags, short oflag)
BLI_INLINE short _bmo_elem_flag_test(BMesh *bm, const BMFlagLayer *oflags, short oflag)
@ BMO_OP_SLOT_SUBTYPE_MAP_ELEM
@ BMO_OP_SLOT_SUBTYPE_MAP_BOOL
@ BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL
@ BMO_OP_SLOT_SUBTYPE_MAP_INT
@ BMO_OP_SLOT_SUBTYPE_MAP_EMPTY
@ BMO_OP_SLOT_SUBTYPE_MAP_FLT
void BMO_slot_map_insert(BMOperator *op, BMOpSlot *slot, const void *element, const void *data)
BLI_INLINE void _bmo_elem_flag_set(BMesh *bm, BMFlagLayer *oflags, const short oflag, int val)
return BLI_ghash_haskey(slot->data.ghash, element)
BLI_INLINE void BMO_slot_map_int_insert(BMOperator *op, BMOpSlot *slot, void *element, const int val)
BLI_INLINE void BMO_slot_map_elem_insert(BMOperator *op, BMOpSlot *slot, const void *element, void *val)
BLI_INLINE void BMO_slot_map_float_insert(BMOperator *op, BMOpSlot *slot, void *element, const float val)
BLI_INLINE void BMO_slot_map_empty_insert(BMOperator *op, BMOpSlot *slot, const void *element)
ATTR_WARN_UNUSED_RESULT const BMFlagLayer const short oflag
BLI_INLINE void BMO_slot_map_bool_insert(BMOperator *op, BMOpSlot *slot, void *element, const bool val)
BLI_INLINE void _bmo_elem_flag_enable(BMesh *bm, BMFlagLayer *oflags, const short oflag)
BLI_INLINE void BMO_slot_map_ptr_insert(BMOperator *op, BMOpSlot *slot, const void *element, void *val)
BLI_INLINE void _bmo_elem_flag_toggle(BMesh *bm, BMFlagLayer *oflags, const short oflag)
BLI_INLINE void _bmo_elem_flag_disable(BMesh *bm, BMFlagLayer *oflags, const short oflag)
ATTR_WARN_UNUSED_RESULT const BMFlagLayer * oflags
uint use_toolflags
int toolflag_index
PointerRNA * ptr
Definition wm_files.cc:4126