Blender V4.3
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
9#pragma once
10
11struct BMesh;
12struct BMEdge;
13struct BMElem;
14struct BMFace;
15struct BMLoop;
16struct BMVert;
17
18extern PyTypeObject BPy_BMesh_Type;
19extern PyTypeObject BPy_BMVert_Type;
20extern PyTypeObject BPy_BMEdge_Type;
21extern PyTypeObject BPy_BMFace_Type;
22extern PyTypeObject BPy_BMLoop_Type;
23
24extern PyTypeObject BPy_BMElemSeq_Type;
25extern PyTypeObject BPy_BMVertSeq_Type;
26extern PyTypeObject BPy_BMEdgeSeq_Type;
27extern PyTypeObject BPy_BMFaceSeq_Type;
28extern PyTypeObject BPy_BMLoopSeq_Type;
29
30extern PyTypeObject BPy_BMIter_Type;
31
32#define BPy_BMesh_Check(v) (Py_TYPE(v) == &BPy_BMesh_Type)
33#define BPy_BMVert_Check(v) (Py_TYPE(v) == &BPy_BMVert_Type)
34#define BPy_BMEdge_Check(v) (Py_TYPE(v) == &BPy_BMEdge_Type)
35#define BPy_BMFace_Check(v) (Py_TYPE(v) == &BPy_BMFace_Type)
36#define BPy_BMLoop_Check(v) (Py_TYPE(v) == &BPy_BMLoop_Type)
37#define BPy_BMElemSeq_Check(v) (Py_TYPE(v) == &BPy_BMElemSeq_Type)
38#define BPy_BMVertSeq_Check(v) (Py_TYPE(v) == &BPy_BMVertSeq_Type)
39#define BPy_BMEdgeSeq_Check(v) (Py_TYPE(v) == &BPy_BMEdgeSeq_Type)
40#define BPy_BMFaceSeq_Check(v) (Py_TYPE(v) == &BPy_BMFaceSeq_Type)
41#define BPy_BMLoopSeq_Check(v) (Py_TYPE(v) == &BPy_BMLoopSeq_Type)
42#define BPy_BMIter_Check(v) (Py_TYPE(v) == &BPy_BMIter_Type)
43/* trick since we know they share a hash function */
44#define BPy_BMElem_Check(v) (Py_TYPE(v)->tp_hash == BPy_BMVert_Type.tp_hash)
45
46/* cast from _any_ bmesh type - they all have BMesh first */
48 PyObject_VAR_HEAD
49 BMesh *bm; /* keep first */
50};
51
52/* BPy_BMVert/BPy_BMEdge/BPy_BMFace/BPy_BMLoop can cast to this */
53struct BPy_BMElem {
54 PyObject_VAR_HEAD
55 BMesh *bm; /* keep first */
57};
58
59struct BPy_BMesh {
60 PyObject_VAR_HEAD
61 BMesh *bm; /* keep first */
62 int flag;
63};
64
65/* element types */
66struct BPy_BMVert {
67 PyObject_VAR_HEAD
68 BMesh *bm; /* keep first */
70};
71
72struct BPy_BMEdge {
73 PyObject_VAR_HEAD
74 BMesh *bm; /* keep first */
76};
77
78struct BPy_BMFace {
79 PyObject_VAR_HEAD
80 BMesh *bm; /* keep first */
82};
83
84struct BPy_BMLoop {
85 PyObject_VAR_HEAD
86 BMesh *bm; /* keep first */
88};
89
90/* iterators */
91
92/* used for ...
93 * - BPy_BMElemSeq_Type
94 * - BPy_BMVertSeq_Type
95 * - BPy_BMEdgeSeq_Type
96 * - BPy_BMFaceSeq_Type
97 * - BPy_BMLoopSeq_Type
98 */
100 PyObject_VAR_HEAD
101 BMesh *bm; /* keep first */
102
103 /* if this is a sequence on an existing element,
104 * loops of faces for eg.
105 * If this variable is set, it will be used */
106
107 /* we hold a reference to this.
108 * check in case the owner becomes invalid on access */
109 /* TODO: make this a GC'd object!, will function OK without this though. */
111
112 /* iterator type */
113 short itype;
114};
115
117 PyObject_VAR_HEAD
118 BMesh *bm; /* keep first */
120};
121
122void BPy_BM_init_types();
123
124PyObject *BPyInit_bmesh_types();
125
126enum {
127 BPY_BMFLAG_NOP = 0, /* do nothing */
128 BPY_BMFLAG_IS_WRAPPED = 1, /* the mesh is owned by editmode */
129};
130
131PyObject *BPy_BMesh_CreatePyObject(BMesh *bm, int flag);
136PyObject *BPy_BMElemSeq_CreatePyObject(BMesh *bm, BPy_BMElem *py_ele, char itype);
142
145
153 PyObject *seq_fast,
154 Py_ssize_t min,
155 Py_ssize_t max,
156 Py_ssize_t *r_size,
157 char htype,
158 bool do_unique_check,
159 bool do_bm_check,
160 const char *error_prefix);
162 PyObject *seq,
163 Py_ssize_t min,
164 Py_ssize_t max,
165 Py_ssize_t *r_size,
166 char htype,
167 bool do_unique_check,
168 bool do_bm_check,
169 const char *error_prefix);
170
171PyObject *BPy_BMElem_Array_As_Tuple(BMesh *bm, BMHeader **elem, Py_ssize_t elem_len);
172PyObject *BPy_BMVert_Array_As_Tuple(BMesh *bm, BMVert **elem, Py_ssize_t elem_len);
173PyObject *BPy_BMEdge_Array_As_Tuple(BMesh *bm, BMEdge **elem, Py_ssize_t elem_len);
174PyObject *BPy_BMFace_Array_As_Tuple(BMesh *bm, BMFace **elem, Py_ssize_t elem_len);
175PyObject *BPy_BMLoop_Array_As_Tuple(BMesh *bm, BMLoop *const *elem, Py_ssize_t elem_len);
176
177int BPy_BMElem_CheckHType(PyTypeObject *type, char htype);
183char *BPy_BMElem_StringFromHType_ex(char htype, char ret[32]);
184char *BPy_BMElem_StringFromHType(char htype);
185
186// void bpy_bm_generic_invalidate(BPy_BMGeneric *self);
189 const char *error_prefix,
190 void **args,
191 uint args_tot) ATTR_NONNULL(1, 2);
192
193#define BPY_BM_CHECK_OBJ(obj) \
194 if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { \
195 return NULL; \
196 } \
197 (void)0
198#define BPY_BM_CHECK_INT(obj) \
199 if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { \
200 return -1; \
201 } \
202 (void)0
203
207#define BPY_BM_CHECK_SOURCE_OBJ(bm, errmsg, ...) \
208 { \
209 void *_args[] = {__VA_ARGS__}; \
210 if (UNLIKELY(bpy_bm_generic_valid_check_source(bm, errmsg, _args, ARRAY_SIZE(_args)) == -1)) \
211 { \
212 return NULL; \
213 } \
214 } \
215 (void)0
216#define BPY_BM_CHECK_SOURCE_INT(bm, errmsg, ...) \
217 { \
218 void *_args[] = {__VA_ARGS__}; \
219 if (UNLIKELY(bpy_bm_generic_valid_check_source(bm, errmsg, _args, ARRAY_SIZE(_args)) == -1)) \
220 { \
221 return -1; \
222 } \
223 } \
224 (void)0
225
226#define BPY_BM_IS_VALID(obj) (LIKELY((obj)->bm != NULL))
227
228#define BM_ITER_BPY_BM_SEQ(ele, iter, bpy_bmelemseq) \
229 for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_new( \
230 iter, \
231 (bpy_bmelemseq)->bm, \
232 (bpy_bmelemseq)->itype, \
233 (bpy_bmelemseq)->py_ele ? ((BPy_BMElem *)(bpy_bmelemseq)->py_ele)->ele : NULL); \
234 ele; \
235 BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_step(iter))
#define ATTR_NONNULL(...)
unsigned int uint
ATTR_WARN_UNUSED_RESULT BMesh const char itype
ATTR_WARN_UNUSED_RESULT BMesh * bm
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_BMEdge_Array_As_Tuple(BMesh *bm, BMEdge **elem, Py_ssize_t elem_len)
PyObject * BPy_BMLoopSeq_CreatePyObject(BMesh *bm)
PyObject * BPy_BMElem_Array_As_Tuple(BMesh *bm, BMHeader **elem, Py_ssize_t elem_len)
PyObject * BPy_BMFaceSeq_CreatePyObject(BMesh *bm)
char * BPy_BMElem_StringFromHType(char htype)
PyObject * BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele)
PyObject * BPy_BMesh_CreatePyObject(BMesh *bm, int flag)
PyObject * BPy_BMElemSeq_CreatePyObject(BMesh *bm, BPy_BMElem *py_ele, char itype)
PyObject * BPy_BMVert_Array_As_Tuple(BMesh *bm, BMVert **elem, Py_ssize_t elem_len)
PyTypeObject BPy_BMesh_Type
PyObject * BPy_BMVert_CreatePyObject(BMesh *bm, BMVert *v)
PyObject * BPy_BMLoop_CreatePyObject(BMesh *bm, BMLoop *l)
PyObject * BPy_BMLoop_Array_As_Tuple(BMesh *bm, BMLoop *const *elem, Py_ssize_t elem_len)
int bpy_bm_generic_valid_check_source(BMesh *bm_source, const char *error_prefix, void **args, uint args_tot) ATTR_NONNULL(1
PyTypeObject BPy_BMVertSeq_Type
PyTypeObject BPy_BMLoopSeq_Type
PyObject * BPy_BMVertSeq_CreatePyObject(BMesh *bm)
PyObject * BPy_BMFace_Array_As_Tuple(BMesh *bm, BMFace **elem, Py_ssize_t elem_len)
void BPy_BM_init_types()
int BPy_BMElem_CheckHType(PyTypeObject *type, char htype)
PyTypeObject BPy_BMEdgeSeq_Type
@ BPY_BMFLAG_IS_WRAPPED
@ BPY_BMFLAG_NOP
PyTypeObject BPy_BMEdge_Type
int bpy_bm_generic_valid_check(BPy_BMGeneric *self)
PyTypeObject BPy_BMFaceSeq_Type
PyTypeObject BPy_BMVert_Type
PyTypeObject BPy_BMIter_Type
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_size, char htype, bool do_unique_check, bool do_bm_check, const char *error_prefix)
PyTypeObject BPy_BMElemSeq_Type
PyTypeObject BPy_BMFace_Type
PyTypeObject BPy_BMLoop_Type
PyObject * BPy_BMIter_CreatePyObject(BMesh *bm)
void * BPy_BMElem_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_size, char htype, bool do_unique_check, bool do_bm_check, const char *error_prefix)
PyObject * BPyInit_bmesh_types()
PyObject * BPy_BMEdge_CreatePyObject(BMesh *bm, BMEdge *e)
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.c:32
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
uint8_t flag
Definition wm_window.cc:138