Blender V5.0
bmesh_py_types.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2012 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include <Python.h>
12
13#include "bmesh.hh"
14
15struct BMesh;
16struct BMEdge;
17struct BMElem;
18struct BMFace;
19struct BMLoop;
20struct BMVert;
21
22extern PyTypeObject BPy_BMesh_Type;
23extern PyTypeObject BPy_BMVert_Type;
24extern PyTypeObject BPy_BMEdge_Type;
25extern PyTypeObject BPy_BMFace_Type;
26extern PyTypeObject BPy_BMLoop_Type;
27
28extern PyTypeObject BPy_BMElemSeq_Type;
29extern PyTypeObject BPy_BMVertSeq_Type;
30extern PyTypeObject BPy_BMEdgeSeq_Type;
31extern PyTypeObject BPy_BMFaceSeq_Type;
32extern PyTypeObject BPy_BMLoopSeq_Type;
33
34extern PyTypeObject BPy_BMIter_Type;
35
36#define BPy_BMesh_Check(v) (Py_TYPE(v) == &BPy_BMesh_Type)
37#define BPy_BMVert_Check(v) (Py_TYPE(v) == &BPy_BMVert_Type)
38#define BPy_BMEdge_Check(v) (Py_TYPE(v) == &BPy_BMEdge_Type)
39#define BPy_BMFace_Check(v) (Py_TYPE(v) == &BPy_BMFace_Type)
40#define BPy_BMLoop_Check(v) (Py_TYPE(v) == &BPy_BMLoop_Type)
41#define BPy_BMElemSeq_Check(v) (Py_TYPE(v) == &BPy_BMElemSeq_Type)
42#define BPy_BMVertSeq_Check(v) (Py_TYPE(v) == &BPy_BMVertSeq_Type)
43#define BPy_BMEdgeSeq_Check(v) (Py_TYPE(v) == &BPy_BMEdgeSeq_Type)
44#define BPy_BMFaceSeq_Check(v) (Py_TYPE(v) == &BPy_BMFaceSeq_Type)
45#define BPy_BMLoopSeq_Check(v) (Py_TYPE(v) == &BPy_BMLoopSeq_Type)
46#define BPy_BMIter_Check(v) (Py_TYPE(v) == &BPy_BMIter_Type)
47/* trick since we know they share a hash function */
48#define BPy_BMElem_Check(v) (Py_TYPE(v)->tp_hash == BPy_BMVert_Type.tp_hash)
49
50/* cast from _any_ bmesh type - they all have BMesh first */
52 PyObject_VAR_HEAD
53 BMesh *bm; /* keep first */
54};
55
56/* BPy_BMVert/BPy_BMEdge/BPy_BMFace/BPy_BMLoop can cast to this */
57struct BPy_BMElem {
58 PyObject_VAR_HEAD
59 BMesh *bm; /* keep first */
61};
62
63struct BPy_BMesh {
64 PyObject_VAR_HEAD
65 BMesh *bm; /* keep first */
66 int flag;
67};
68
69/* element types */
70struct BPy_BMVert {
71 PyObject_VAR_HEAD
72 BMesh *bm; /* keep first */
74};
75
76struct BPy_BMEdge {
77 PyObject_VAR_HEAD
78 BMesh *bm; /* keep first */
80};
81
82struct BPy_BMFace {
83 PyObject_VAR_HEAD
84 BMesh *bm; /* keep first */
86};
87
88struct BPy_BMLoop {
89 PyObject_VAR_HEAD
90 BMesh *bm; /* keep first */
92};
93
94/* iterators */
95
96/* used for ...
97 * - BPy_BMElemSeq_Type
98 * - BPy_BMVertSeq_Type
99 * - BPy_BMEdgeSeq_Type
100 * - BPy_BMFaceSeq_Type
101 * - BPy_BMLoopSeq_Type
102 */
104 PyObject_VAR_HEAD
105 BMesh *bm; /* keep first */
106
107 /* if this is a sequence on an existing element,
108 * loops of faces for eg.
109 * If this variable is set, it will be used */
110
111 /* we hold a reference to this.
112 * check in case the owner becomes invalid on access */
113 /* TODO: make this a GC'd object!, will function OK without this though. */
115
116 /* iterator type */
117 short itype;
118};
119
121 PyObject_VAR_HEAD
122 BMesh *bm; /* keep first */
124};
125
126void BPy_BM_init_types();
127
128[[nodiscard]] PyObject *BPyInit_bmesh_types();
129
130enum {
131 BPY_BMFLAG_NOP = 0, /* do nothing */
132 BPY_BMFLAG_IS_WRAPPED = 1, /* the mesh is owned by editmode */
133};
134
135[[nodiscard]] PyObject *BPy_BMesh_CreatePyObject(BMesh *bm, int flag);
136[[nodiscard]] PyObject *BPy_BMVert_CreatePyObject(BMesh *bm, BMVert *v);
137[[nodiscard]] PyObject *BPy_BMEdge_CreatePyObject(BMesh *bm, BMEdge *e);
138[[nodiscard]] PyObject *BPy_BMFace_CreatePyObject(BMesh *bm, BMFace *f);
139[[nodiscard]] PyObject *BPy_BMLoop_CreatePyObject(BMesh *bm, BMLoop *l);
140[[nodiscard]] PyObject *BPy_BMElemSeq_CreatePyObject(BMesh *bm, BPy_BMElem *py_ele, char itype);
141[[nodiscard]] PyObject *BPy_BMVertSeq_CreatePyObject(BMesh *bm);
142[[nodiscard]] PyObject *BPy_BMEdgeSeq_CreatePyObject(BMesh *bm);
143[[nodiscard]] PyObject *BPy_BMFaceSeq_CreatePyObject(BMesh *bm);
144[[nodiscard]] PyObject *BPy_BMLoopSeq_CreatePyObject(BMesh *bm);
145[[nodiscard]] PyObject *BPy_BMIter_CreatePyObject(BMesh *bm);
146
148[[nodiscard]] PyObject *BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele);
149
156[[nodiscard]] void *BPy_BMElem_PySeq_As_Array_FAST(BMesh **r_bm,
157 PyObject *seq_fast,
158 Py_ssize_t min,
159 Py_ssize_t max,
160 Py_ssize_t *r_seq_num,
161 char htype,
162 bool do_unique_check,
163 bool do_bm_check,
164 const char *error_prefix);
165[[nodiscard]] void *BPy_BMElem_PySeq_As_Array(BMesh **r_bm,
166 PyObject *seq,
167 Py_ssize_t min,
168 Py_ssize_t max,
169 Py_ssize_t *r_seq_num,
170 char htype,
171 bool do_unique_check,
172 bool do_bm_check,
173 const char *error_prefix);
174
175[[nodiscard]] BMVert **BPy_BMVert_PySeq_As_Array(BMesh **r_bm,
176 PyObject *seq,
177 Py_ssize_t min,
178 Py_ssize_t max,
179 Py_ssize_t *r_seq_num,
180 bool do_unique_check,
181 bool do_bm_check,
182 const char *error_prefix);
183[[nodiscard]] BMEdge **BPy_BMEdge_PySeq_As_Array(BMesh **r_bm,
184 PyObject *seq,
185 Py_ssize_t min,
186 Py_ssize_t max,
187 Py_ssize_t *r_seq_num,
188 bool do_unique_check,
189 bool do_bm_check,
190 const char *error_prefix);
191[[nodiscard]] BMFace **BPy_BMFace_PySeq_As_Array(BMesh **r_bm,
192 PyObject *seq,
193 Py_ssize_t min,
194 Py_ssize_t max,
195 Py_ssize_t *r_seq_num,
196 bool do_unique_check,
197 bool do_bm_check,
198 const char *error_prefix);
199[[nodiscard]] BMLoop **BPy_BMLoop_PySeq_As_Array(BMesh **r_bm,
200 PyObject *seq,
201 Py_ssize_t min,
202 Py_ssize_t max,
203 Py_ssize_t *r_seq_num,
204 bool do_unique_check,
205 bool do_bm_check,
206 const char *error_prefix);
207
208[[nodiscard]] PyObject *BPy_BMElem_Array_As_Tuple(BMesh *bm, BMHeader **elem, Py_ssize_t elem_num);
209[[nodiscard]] PyObject *BPy_BMVert_Array_As_Tuple(BMesh *bm, BMVert **elem, Py_ssize_t elem_num);
210[[nodiscard]] PyObject *BPy_BMEdge_Array_As_Tuple(BMesh *bm, BMEdge **elem, Py_ssize_t elem_num);
211[[nodiscard]] PyObject *BPy_BMFace_Array_As_Tuple(BMesh *bm, BMFace **elem, Py_ssize_t elem_num);
212[[nodiscard]] PyObject *BPy_BMLoop_Array_As_Tuple(BMesh *bm,
213 BMLoop *const *elem,
214 Py_ssize_t elem_num);
215
216[[nodiscard]] int BPy_BMElem_CheckHType(PyTypeObject *type, char htype);
222[[nodiscard]] char *BPy_BMElem_StringFromHType_ex(char htype, char ret[32]);
223[[nodiscard]] char *BPy_BMElem_StringFromHType(char htype);
224
225// void bpy_bm_generic_invalidate(BPy_BMGeneric *self);
227[[nodiscard]] int bpy_bm_generic_valid_check_source(BMesh *bm_source,
228 const char *error_prefix,
229 void **args,
230 uint args_tot) ATTR_NONNULL(1, 2);
231[[nodiscard]] int bpy_bm_check_uv_select_sync_valid(BMesh *bm, const char *error_prefix);
232[[nodiscard]] int bpy_bm_uv_layer_offset_or_error(BMesh *bm, const char *error_prefix);
233[[nodiscard]] int bpy_bm_check_bm_match_or_error(BMesh *bm_a,
234 BMesh *bm_b,
235 const char *error_prefix);
236
237#define BPY_BM_CHECK_OBJ(obj) \
238 if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { \
239 return NULL; \
240 } \
241 (void)0
242#define BPY_BM_CHECK_INT(obj) \
243 if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { \
244 return -1; \
245 } \
246 (void)0
247
251#define BPY_BM_CHECK_SOURCE_OBJ(bm, errmsg, ...) \
252 { \
253 void *_args[] = {__VA_ARGS__}; \
254 if (UNLIKELY(bpy_bm_generic_valid_check_source(bm, errmsg, _args, ARRAY_SIZE(_args)) == -1)) \
255 { \
256 return NULL; \
257 } \
258 } \
259 (void)0
260#define BPY_BM_CHECK_SOURCE_INT(bm, errmsg, ...) \
261 { \
262 void *_args[] = {__VA_ARGS__}; \
263 if (UNLIKELY(bpy_bm_generic_valid_check_source(bm, errmsg, _args, ARRAY_SIZE(_args)) == -1)) \
264 { \
265 return -1; \
266 } \
267 } \
268 (void)0
269
270#define BPY_BM_IS_VALID(obj) (LIKELY((obj)->bm != NULL))
271
272#define BM_ITER_BPY_BM_SEQ(ele, iter, bpy_bmelemseq) \
273 for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_new( \
274 iter, \
275 (bpy_bmelemseq)->bm, \
276 (bpy_bmelemseq)->itype, \
277 (bpy_bmelemseq)->py_ele ? ((BPy_BMElem *)(bpy_bmelemseq)->py_ele)->ele : NULL); \
278 ele; \
279 BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_step(iter))
#define ATTR_NONNULL(...)
unsigned int uint
BMesh * bm
BMesh const char itype
PyTypeObject BPy_BMesh_Type
PyTypeObject BPy_BMVertSeq_Type
PyTypeObject BPy_BMLoopSeq_Type
PyTypeObject BPy_BMEdgeSeq_Type
PyTypeObject BPy_BMEdge_Type
PyTypeObject BPy_BMFaceSeq_Type
PyTypeObject BPy_BMVert_Type
PyTypeObject BPy_BMIter_Type
PyTypeObject BPy_BMElemSeq_Type
PyTypeObject BPy_BMFace_Type
PyTypeObject BPy_BMLoop_Type
PyObject * BPy_BMEdgeSeq_CreatePyObject(BMesh *bm)
PyObject * BPy_BMFace_CreatePyObject(BMesh *bm, BMFace *f)
char * BPy_BMElem_StringFromHType_ex(char htype, char ret[32])
PyObject * BPy_BMLoop_Array_As_Tuple(BMesh *bm, BMLoop *const *elem, Py_ssize_t elem_num)
PyObject * BPy_BMLoopSeq_CreatePyObject(BMesh *bm)
PyObject * BPy_BMFaceSeq_CreatePyObject(BMesh *bm)
char * BPy_BMElem_StringFromHType(char htype)
PyObject * BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele)
PyObject * BPy_BMVert_Array_As_Tuple(BMesh *bm, BMVert **elem, Py_ssize_t elem_num)
PyObject * BPy_BMesh_CreatePyObject(BMesh *bm, int flag)
PyObject * BPy_BMElemSeq_CreatePyObject(BMesh *bm, BPy_BMElem *py_ele, char itype)
int int bpy_bm_check_uv_select_sync_valid(BMesh *bm, const char *error_prefix)
PyObject * BPy_BMVert_CreatePyObject(BMesh *bm, BMVert *v)
PyObject * BPy_BMLoop_CreatePyObject(BMesh *bm, BMLoop *l)
int bpy_bm_generic_valid_check_source(BMesh *bm_source, const char *error_prefix, void **args, uint args_tot) ATTR_NONNULL(1
PyObject * BPy_BMVertSeq_CreatePyObject(BMesh *bm)
PyObject * BPy_BMFace_Array_As_Tuple(BMesh *bm, BMFace **elem, Py_ssize_t elem_num)
void BPy_BM_init_types()
int BPy_BMElem_CheckHType(PyTypeObject *type, char htype)
int bpy_bm_uv_layer_offset_or_error(BMesh *bm, const char *error_prefix)
BMVert ** BPy_BMVert_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_seq_num, bool do_unique_check, bool do_bm_check, const char *error_prefix)
BMEdge ** BPy_BMEdge_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_seq_num, bool do_unique_check, bool do_bm_check, const char *error_prefix)
int bpy_bm_check_bm_match_or_error(BMesh *bm_a, BMesh *bm_b, const char *error_prefix)
@ BPY_BMFLAG_IS_WRAPPED
@ BPY_BMFLAG_NOP
PyObject * BPy_BMEdge_Array_As_Tuple(BMesh *bm, BMEdge **elem, Py_ssize_t elem_num)
BMLoop ** BPy_BMLoop_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_seq_num, bool do_unique_check, bool do_bm_check, const char *error_prefix)
int bpy_bm_generic_valid_check(BPy_BMGeneric *self)
void * BPy_BMElem_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_seq_num, char htype, bool do_unique_check, bool do_bm_check, const char *error_prefix)
PyObject * BPy_BMElem_Array_As_Tuple(BMesh *bm, BMHeader **elem, Py_ssize_t elem_num)
PyObject * BPy_BMIter_CreatePyObject(BMesh *bm)
PyObject * BPyInit_bmesh_types()
PyObject * BPy_BMEdge_CreatePyObject(BMesh *bm, BMEdge *e)
BMFace ** BPy_BMFace_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_seq_num, bool do_unique_check, bool do_bm_check, const char *error_prefix)
void * BPy_BMElem_PySeq_As_Array_FAST(BMesh **r_bm, PyObject *seq_fast, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_seq_num, char htype, bool do_unique_check, bool do_bm_check, const char *error_prefix)
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
PyObject * self
return ret
#define min(a, b)
Definition sort.cc:36
PyObject_VAR_HEAD BMesh * bm
BPy_BMElem * py_ele
PyObject_VAR_HEAD BMesh * bm
PyObject_VAR_HEAD BMesh * bm
PyObject_VAR_HEAD BMesh * bm
PyObject_VAR_HEAD BMesh * bm
PyObject_VAR_HEAD BMesh * bm
PyObject_VAR_HEAD BMesh * bm
PyObject_VAR_HEAD BMesh * bm
PyObject_VAR_HEAD BMesh * bm
max
Definition text_draw.cc:251
uint8_t flag
Definition wm_window.cc:145