Blender  V3.3
bmesh_py_types.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2012 Blender Foundation. All rights reserved. */
3 
8 #pragma once
9 
10 extern PyTypeObject BPy_BMesh_Type;
11 extern PyTypeObject BPy_BMVert_Type;
12 extern PyTypeObject BPy_BMEdge_Type;
13 extern PyTypeObject BPy_BMFace_Type;
14 extern PyTypeObject BPy_BMLoop_Type;
15 
16 extern PyTypeObject BPy_BMElemSeq_Type;
17 extern PyTypeObject BPy_BMVertSeq_Type;
18 extern PyTypeObject BPy_BMEdgeSeq_Type;
19 extern PyTypeObject BPy_BMFaceSeq_Type;
20 extern PyTypeObject BPy_BMLoopSeq_Type;
21 
22 extern PyTypeObject BPy_BMIter_Type;
23 
24 #define BPy_BMesh_Check(v) (Py_TYPE(v) == &BPy_BMesh_Type)
25 #define BPy_BMVert_Check(v) (Py_TYPE(v) == &BPy_BMVert_Type)
26 #define BPy_BMEdge_Check(v) (Py_TYPE(v) == &BPy_BMEdge_Type)
27 #define BPy_BMFace_Check(v) (Py_TYPE(v) == &BPy_BMFace_Type)
28 #define BPy_BMLoop_Check(v) (Py_TYPE(v) == &BPy_BMLoop_Type)
29 #define BPy_BMElemSeq_Check(v) (Py_TYPE(v) == &BPy_BMElemSeq_Type)
30 #define BPy_BMVertSeq_Check(v) (Py_TYPE(v) == &BPy_BMVertSeq_Type)
31 #define BPy_BMEdgeSeq_Check(v) (Py_TYPE(v) == &BPy_BMEdgeSeq_Type)
32 #define BPy_BMFaceSeq_Check(v) (Py_TYPE(v) == &BPy_BMFaceSeq_Type)
33 #define BPy_BMLoopSeq_Check(v) (Py_TYPE(v) == &BPy_BMLoopSeq_Type)
34 #define BPy_BMIter_Check(v) (Py_TYPE(v) == &BPy_BMIter_Type)
35 /* trick since we know they share a hash function */
36 #define BPy_BMElem_Check(v) (Py_TYPE(v)->tp_hash == BPy_BMVert_Type.tp_hash)
37 
38 /* cast from _any_ bmesh type - they all have BMesh first */
39 typedef struct BPy_BMGeneric {
40  PyObject_VAR_HEAD
41  struct BMesh *bm; /* keep first */
43 
44 /* BPy_BMVert/BPy_BMEdge/BPy_BMFace/BPy_BMLoop can cast to this */
45 typedef struct BPy_BMElem {
46  PyObject_VAR_HEAD
47  struct BMesh *bm; /* keep first */
48  struct BMElem *ele;
50 
51 typedef struct BPy_BMesh {
52  PyObject_VAR_HEAD
53  struct BMesh *bm; /* keep first */
54  int flag;
56 
57 /* element types */
58 typedef struct BPy_BMVert {
59  PyObject_VAR_HEAD
60  struct BMesh *bm; /* keep first */
61  struct BMVert *v;
63 
64 typedef struct BPy_BMEdge {
65  PyObject_VAR_HEAD
66  struct BMesh *bm; /* keep first */
67  struct BMEdge *e;
69 
70 typedef struct BPy_BMFace {
71  PyObject_VAR_HEAD
72  struct BMesh *bm; /* keep first */
73  struct BMFace *f;
75 
76 typedef struct BPy_BMLoop {
77  PyObject_VAR_HEAD
78  struct BMesh *bm; /* keep first */
79  struct BMLoop *l;
81 
82 /* iterators */
83 
84 /* used for ...
85  * - BPy_BMElemSeq_Type
86  * - BPy_BMVertSeq_Type
87  * - BPy_BMEdgeSeq_Type
88  * - BPy_BMFaceSeq_Type
89  * - BPy_BMLoopSeq_Type
90  */
91 typedef struct BPy_BMElemSeq {
92  PyObject_VAR_HEAD
93  struct BMesh *bm; /* keep first */
94 
95  /* if this is a sequence on an existing element,
96  * loops of faces for eg.
97  * If this variable is set, it will be used */
98 
99  /* we hold a reference to this.
100  * check in case the owner becomes invalid on access */
101  /* TODO: make this a GC'd object!, will function OK without this though. */
103 
104  /* iterator type */
105  short itype;
107 
108 typedef struct BPy_BMIter {
109  PyObject_VAR_HEAD
110  struct BMesh *bm; /* keep first */
113 
114 void BPy_BM_init_types(void);
115 
116 PyObject *BPyInit_bmesh_types(void);
117 
118 enum {
119  BPY_BMFLAG_NOP = 0, /* do nothing */
120  BPY_BMFLAG_IS_WRAPPED = 1, /* the mesh is owned by editmode */
121 };
122 
123 PyObject *BPy_BMesh_CreatePyObject(BMesh *bm, int flag);
126 PyObject *BPy_BMFace_CreatePyObject(BMesh *bm, BMFace *f);
128 PyObject *BPy_BMElemSeq_CreatePyObject(BMesh *bm, BPy_BMElem *py_ele, char itype);
134 
136 PyObject *BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele);
137 
145  PyObject *seq_fast,
146  Py_ssize_t min,
147  Py_ssize_t max,
148  Py_ssize_t *r_size,
149  char htype,
150  bool do_unique_check,
151  bool do_bm_check,
152  const char *error_prefix);
153 void *BPy_BMElem_PySeq_As_Array(BMesh **r_bm,
154  PyObject *seq,
155  Py_ssize_t min,
156  Py_ssize_t max,
157  Py_ssize_t *r_size,
158  char htype,
159  bool do_unique_check,
160  bool do_bm_check,
161  const char *error_prefix);
162 
163 PyObject *BPy_BMElem_Array_As_Tuple(BMesh *bm, BMHeader **elem, Py_ssize_t elem_len);
164 PyObject *BPy_BMVert_Array_As_Tuple(BMesh *bm, BMVert **elem, Py_ssize_t elem_len);
165 PyObject *BPy_BMEdge_Array_As_Tuple(BMesh *bm, BMEdge **elem, Py_ssize_t elem_len);
166 PyObject *BPy_BMFace_Array_As_Tuple(BMesh *bm, BMFace **elem, Py_ssize_t elem_len);
167 PyObject *BPy_BMLoop_Array_As_Tuple(BMesh *bm, BMLoop **elem, Py_ssize_t elem_len);
168 
169 int BPy_BMElem_CheckHType(PyTypeObject *type, char htype);
175 char *BPy_BMElem_StringFromHType_ex(char htype, char ret[32]);
176 char *BPy_BMElem_StringFromHType(char htype);
177 
178 // void bpy_bm_generic_invalidate(BPy_BMGeneric *self);
181  const char *error_prefix,
182  void **args,
183  uint args_tot) ATTR_NONNULL(1, 2);
184 
185 #define BPY_BM_CHECK_OBJ(obj) \
186  if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { \
187  return NULL; \
188  } \
189  (void)0
190 #define BPY_BM_CHECK_INT(obj) \
191  if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { \
192  return -1; \
193  } \
194  (void)0
195 
199 #define BPY_BM_CHECK_SOURCE_OBJ(bm, errmsg, ...) \
200  { \
201  void *_args[] = {__VA_ARGS__}; \
202  if (UNLIKELY(bpy_bm_generic_valid_check_source(bm, errmsg, _args, ARRAY_SIZE(_args)) == \
203  -1)) { \
204  return NULL; \
205  } \
206  } \
207  (void)0
208 #define BPY_BM_CHECK_SOURCE_INT(bm, errmsg, ...) \
209  { \
210  void *_args[] = {__VA_ARGS__}; \
211  if (UNLIKELY(bpy_bm_generic_valid_check_source(bm, errmsg, _args, ARRAY_SIZE(_args)) == \
212  -1)) { \
213  return -1; \
214  } \
215  } \
216  (void)0
217 
218 #define BPY_BM_IS_VALID(obj) (LIKELY((obj)->bm != NULL))
219 
220 #define BM_ITER_BPY_BM_SEQ(ele, iter, bpy_bmelemseq) \
221  for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_new( \
222  iter, \
223  (bpy_bmelemseq)->bm, \
224  (bpy_bmelemseq)->itype, \
225  (bpy_bmelemseq)->py_ele ? ((BPy_BMElem *)(bpy_bmelemseq)->py_ele)->ele : NULL); \
226  ele; \
227  BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_step(iter))
228 
229 #ifdef __PY_CAPI_UTILS_H__
230 struct PyC_FlagSet;
233 extern struct PyC_FlagSet bpy_bm_htype_all_flags[];
234 extern struct PyC_FlagSet bpy_bm_hflag_all_flags[];
235 #endif
#define ATTR_NONNULL(...)
unsigned int uint
Definition: BLI_sys_types.h:67
_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 type
ATTR_WARN_UNUSED_RESULT BMesh const char itype
ATTR_WARN_UNUSED_RESULT BMesh * bm
PyC_FlagSet bpy_bm_htype_all_flags[]
PyC_FlagSet bpy_bm_htype_vert_edge_face_flags[]
PyC_FlagSet bpy_bm_hflag_all_flags[]
PyC_FlagSet bpy_bm_scene_vert_edge_face_flags[]
struct BPy_BMLoop BPy_BMLoop
PyObject * BPy_BMIter_CreatePyObject(BMesh *bm)
PyObject * BPy_BMEdge_Array_As_Tuple(BMesh *bm, BMEdge **elem, Py_ssize_t elem_len)
struct BPy_BMVert BPy_BMVert
struct BPy_BMGeneric BPy_BMGeneric
PyTypeObject BPy_BMesh_Type
PyObject * BPy_BMEdge_CreatePyObject(BMesh *bm, BMEdge *e)
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)
PyObject * BPy_BMLoop_CreatePyObject(BMesh *bm, BMLoop *l)
PyObject * BPy_BMFace_Array_As_Tuple(BMesh *bm, BMFace **elem, Py_ssize_t elem_len)
PyObject * BPy_BMVert_Array_As_Tuple(BMesh *bm, BMVert **elem, Py_ssize_t elem_len)
PyObject * BPyInit_bmesh_types(void)
PyObject * BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele)
int bpy_bm_generic_valid_check_source(BMesh *bm_source, const char *error_prefix, void **args, uint args_tot) ATTR_NONNULL(1
void BPy_BM_init_types(void)
PyTypeObject BPy_BMVertSeq_Type
PyTypeObject BPy_BMLoopSeq_Type
char * BPy_BMElem_StringFromHType(char htype)
struct BPy_BMIter BPy_BMIter
PyObject * BPy_BMLoopSeq_CreatePyObject(BMesh *bm)
PyObject * BPy_BMElemSeq_CreatePyObject(BMesh *bm, BPy_BMElem *py_ele, char itype)
PyObject * BPy_BMFace_CreatePyObject(BMesh *bm, BMFace *f)
struct BPy_BMEdge BPy_BMEdge
int BPy_BMElem_CheckHType(PyTypeObject *type, char htype)
PyTypeObject BPy_BMEdgeSeq_Type
PyTypeObject BPy_BMEdge_Type
@ BPY_BMFLAG_IS_WRAPPED
@ BPY_BMFLAG_NOP
PyObject * BPy_BMFaceSeq_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)
char * BPy_BMElem_StringFromHType_ex(char htype, char ret[32])
PyObject * BPy_BMLoop_Array_As_Tuple(BMesh *bm, BMLoop **elem, Py_ssize_t elem_len)
PyObject * BPy_BMesh_CreatePyObject(BMesh *bm, int flag)
int bpy_bm_generic_valid_check(BPy_BMGeneric *self)
PyTypeObject BPy_BMFaceSeq_Type
struct BPy_BMFace BPy_BMFace
PyTypeObject BPy_BMVert_Type
PyTypeObject BPy_BMIter_Type
struct BPy_BMElemSeq BPy_BMElemSeq
PyObject * BPy_BMVertSeq_CreatePyObject(BMesh *bm)
PyTypeObject BPy_BMElemSeq_Type
PyObject * BPy_BMElem_Array_As_Tuple(BMesh *bm, BMHeader **elem, Py_ssize_t elem_len)
struct BPy_BMElem BPy_BMElem
PyTypeObject BPy_BMFace_Type
PyObject * BPy_BMVert_CreatePyObject(BMesh *bm, BMVert *v)
PyTypeObject BPy_BMLoop_Type
struct BPy_BMesh BPy_BMesh
PyObject * BPy_BMEdgeSeq_CreatePyObject(BMesh *bm)
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
return ret
#define min(a, b)
Definition: sort.c:35
PyObject_VAR_HEAD struct BMesh * bm
struct BMEdge * e
BPy_BMElem * py_ele
PyObject_VAR_HEAD struct BMesh * bm
struct BMElem * ele
PyObject_VAR_HEAD struct BMesh * bm
struct BMFace * f
PyObject_VAR_HEAD struct BMesh * bm
PyObject_VAR_HEAD struct BMesh * bm
PyObject_VAR_HEAD struct BMesh * bm
struct BMLoop * l
PyObject_VAR_HEAD struct BMesh * bm
PyObject_VAR_HEAD struct BMesh * bm
struct BMVert * v
PyObject_VAR_HEAD struct BMesh * bm
float max