Blender  V3.3
bmesh_operator_api_inline.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
9 #pragma once
10 
11 /* Tool Flag API: Tool code must never put junk in header flags (#BMHeader.hflag)
12  * instead, use this API to set flags.
13  * If you need to store a value per element, use a #GHash or a mapping slot to do it. */
14 
16  short _bmo_elem_flag_test(BMesh *bm, const BMFlagLayer *oflags, const short oflag)
17 {
19  return oflags[bm->toolflag_index].f & oflag;
20 }
21 
23  bool _bmo_elem_flag_test_bool(BMesh *bm, const BMFlagLayer *oflags, const short oflag)
24 {
26  return (oflags[bm->toolflag_index].f & oflag) != 0;
27 }
28 
29 ATTR_NONNULL(1, 2)
31 {
34 }
35 
36 ATTR_NONNULL(1, 2)
38 {
40  oflags[bm->toolflag_index].f &= (short)~oflag;
41 }
42 
43 ATTR_NONNULL(1, 2)
45 {
47  if (val) {
49  }
50  else {
51  oflags[bm->toolflag_index].f &= (short)~oflag;
52  }
53 }
54 
55 ATTR_NONNULL(1, 2)
57 {
60 }
61 
62 ATTR_NONNULL(1, 2)
64  BMOpSlot *slot,
65  void *element,
66  const int val)
67 {
68  union {
69  void *ptr;
70  int val;
71  } t = {NULL};
72  BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_INT);
73  BMO_slot_map_insert(op, slot, element, ((void)(t.val = val), t.ptr));
74 }
75 
76 ATTR_NONNULL(1, 2)
78  BMOpSlot *slot,
79  void *element,
80  const bool val)
81 {
82  union {
83  void *ptr;
84  bool val;
85  } t = {NULL};
86  BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_BOOL);
87  BMO_slot_map_insert(op, slot, element, ((void)(t.val = val), t.ptr));
88 }
89 
90 ATTR_NONNULL(1, 2)
92  BMOpSlot *slot,
93  void *element,
94  const float val)
95 {
96  union {
97  void *ptr;
98  float val;
99  } t = {NULL};
100  BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_FLT);
101  BMO_slot_map_insert(op, slot, element, ((void)(t.val = val), t.ptr));
102 }
103 
104 /* pointer versions of BMO_slot_map_float_get and BMO_slot_map_float_insert.
105  *
106  * do NOT use these for non-operator-api-allocated memory! instead
107  * use BMO_slot_map_data_get and BMO_slot_map_insert, which copies the data. */
108 
109 ATTR_NONNULL(1, 2)
111  BMOpSlot *slot,
112  const void *element,
113  void *val)
114 {
115  BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL);
116  BMO_slot_map_insert(op, slot, element, val);
117 }
118 
119 ATTR_NONNULL(1, 2)
121  BMOpSlot *slot,
122  const void *element,
123  void *val)
124 {
125  BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_ELEM);
126  BMO_slot_map_insert(op, slot, element, val);
127 }
128 
129 /* no values */
130 ATTR_NONNULL(1, 2)
132 {
133  BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_EMPTY);
134  BMO_slot_map_insert(op, slot, element, NULL);
135 }
136 
138  bool BMO_slot_map_contains(BMOpSlot *slot, const void *element)
139 {
140  BLI_assert(slot->slot_type == BMO_OP_SLOT_MAPPING);
141  return BLI_ghash_haskey(slot->data.ghash, element);
142 }
143 
145  void **BMO_slot_map_data_get(BMOpSlot *slot, const void *element)
146 {
147 
148  return BLI_ghash_lookup_p(slot->data.ghash, element);
149 }
150 
152  float BMO_slot_map_float_get(BMOpSlot *slot, const void *element)
153 {
154  void **data;
155  BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_FLT);
156 
157  data = BMO_slot_map_data_get(slot, element);
158  if (data) {
159  return *(float *)data;
160  }
161  else {
162  return 0.0f;
163  }
164 }
165 
167  int BMO_slot_map_int_get(BMOpSlot *slot, const void *element)
168 {
169  void **data;
170  BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_INT);
171 
172  data = BMO_slot_map_data_get(slot, element);
173  if (data) {
174  return *(int *)data;
175  }
176  else {
177  return 0;
178  }
179 }
180 
182  bool BMO_slot_map_bool_get(BMOpSlot *slot, const void *element)
183 {
184  void **data;
185  BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_BOOL);
186 
187  data = BMO_slot_map_data_get(slot, element);
188  if (data) {
189  return *(bool *)data;
190  }
191  else {
192  return false;
193  }
194 }
195 
197  void *BMO_slot_map_ptr_get(BMOpSlot *slot, const void *element)
198 {
199  void **val = BMO_slot_map_data_get(slot, element);
200  BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL);
201  if (val) {
202  return *val;
203  }
204 
205  return NULL;
206 }
207 
209  void *BMO_slot_map_elem_get(BMOpSlot *slot, const void *element)
210 {
211  void **val = (void **)BMO_slot_map_data_get(slot, element);
212  BLI_assert(slot->slot_subtype.map == BMO_OP_SLOT_SUBTYPE_MAP_ELEM);
213  if (val) {
214  return *val;
215  }
216 
217  return NULL;
218 }
#define ATTR_WARN_UNUSED_RESULT
#define BLI_INLINE
void ** BLI_ghash_lookup_p(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:748
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
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)
ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2) BLI_INLINE short _bmo_elem_flag_test(BMesh *bm
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)
ATTR_WARN_UNUSED_RESULT const void * element
BLI_INLINE void BMO_slot_map_float_insert(BMOperator *op, BMOpSlot *slot, void *element, const float val)
BLI_assert(slot->slot_subtype.map==BMO_OP_SLOT_SUBTYPE_MAP_FLT)
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
Definition: bmesh_class.h:333
int toolflag_index
Definition: bmesh_class.h:335
PointerRNA * ptr
Definition: wm_files.c:3480