Blender  V2.93
bmesh_py_types.h
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2012 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #pragma once
25 
26 extern PyTypeObject BPy_BMesh_Type;
27 extern PyTypeObject BPy_BMVert_Type;
28 extern PyTypeObject BPy_BMEdge_Type;
29 extern PyTypeObject BPy_BMFace_Type;
30 extern PyTypeObject BPy_BMLoop_Type;
31 
32 extern PyTypeObject BPy_BMElemSeq_Type;
33 extern PyTypeObject BPy_BMVertSeq_Type;
34 extern PyTypeObject BPy_BMEdgeSeq_Type;
35 extern PyTypeObject BPy_BMFaceSeq_Type;
36 extern PyTypeObject BPy_BMLoopSeq_Type;
37 
38 extern PyTypeObject BPy_BMIter_Type;
39 
40 #define BPy_BMesh_Check(v) (Py_TYPE(v) == &BPy_BMesh_Type)
41 #define BPy_BMVert_Check(v) (Py_TYPE(v) == &BPy_BMVert_Type)
42 #define BPy_BMEdge_Check(v) (Py_TYPE(v) == &BPy_BMEdge_Type)
43 #define BPy_BMFace_Check(v) (Py_TYPE(v) == &BPy_BMFace_Type)
44 #define BPy_BMLoop_Check(v) (Py_TYPE(v) == &BPy_BMLoop_Type)
45 #define BPy_BMElemSeq_Check(v) (Py_TYPE(v) == &BPy_BMElemSeq_Type)
46 #define BPy_BMVertSeq_Check(v) (Py_TYPE(v) == &BPy_BMVertSeq_Type)
47 #define BPy_BMEdgeSeq_Check(v) (Py_TYPE(v) == &BPy_BMEdgeSeq_Type)
48 #define BPy_BMFaceSeq_Check(v) (Py_TYPE(v) == &BPy_BMFaceSeq_Type)
49 #define BPy_BMLoopSeq_Check(v) (Py_TYPE(v) == &BPy_BMLoopSeq_Type)
50 #define BPy_BMIter_Check(v) (Py_TYPE(v) == &BPy_BMIter_Type)
51 /* trick since we know they share a hash function */
52 #define BPy_BMElem_Check(v) (Py_TYPE(v)->tp_hash == BPy_BMVert_Type.tp_hash)
53 
54 /* cast from _any_ bmesh type - they all have BMesh first */
55 typedef struct BPy_BMGeneric {
56  PyObject_VAR_HEAD
57  struct BMesh *bm; /* keep first */
59 
60 /* BPy_BMVert/BPy_BMEdge/BPy_BMFace/BPy_BMLoop can cast to this */
61 typedef struct BPy_BMElem {
62  PyObject_VAR_HEAD
63  struct BMesh *bm; /* keep first */
64  struct BMElem *ele;
66 
67 typedef struct BPy_BMesh {
68  PyObject_VAR_HEAD
69  struct BMesh *bm; /* keep first */
70  int flag;
72 
73 /* element types */
74 typedef struct BPy_BMVert {
75  PyObject_VAR_HEAD
76  struct BMesh *bm; /* keep first */
77  struct BMVert *v;
79 
80 typedef struct BPy_BMEdge {
81  PyObject_VAR_HEAD
82  struct BMesh *bm; /* keep first */
83  struct BMEdge *e;
85 
86 typedef struct BPy_BMFace {
87  PyObject_VAR_HEAD
88  struct BMesh *bm; /* keep first */
89  struct BMFace *f;
91 
92 typedef struct BPy_BMLoop {
93  PyObject_VAR_HEAD
94  struct BMesh *bm; /* keep first */
95  struct BMLoop *l;
97 
98 /* iterators */
99 
100 /* used for ...
101  * - BPy_BMElemSeq_Type
102  * - BPy_BMVertSeq_Type
103  * - BPy_BMEdgeSeq_Type
104  * - BPy_BMFaceSeq_Type
105  * - BPy_BMLoopSeq_Type
106  */
107 typedef struct BPy_BMElemSeq {
108  PyObject_VAR_HEAD
109  struct BMesh *bm; /* keep first */
110 
111  /* if this is a sequence on an existing element,
112  * loops of faces for eg.
113  * If this variable is set, it will be used */
114 
115  /* we hold a reference to this.
116  * check in case the owner becomes invalid on access */
117  /* TODO - make this a GC'd object!, will function OK without this though */
119 
120  /* iterator type */
121  short itype;
123 
124 typedef struct BPy_BMIter {
125  PyObject_VAR_HEAD
126  struct BMesh *bm; /* keep first */
129 
130 void BPy_BM_init_types(void);
131 
132 PyObject *BPyInit_bmesh_types(void);
133 
134 enum {
135  BPY_BMFLAG_NOP = 0, /* do nothing */
136  BPY_BMFLAG_IS_WRAPPED = 1, /* the mesh is owned by editmode */
137 };
138 
139 PyObject *BPy_BMesh_CreatePyObject(BMesh *bm, int flag);
142 PyObject *BPy_BMFace_CreatePyObject(BMesh *bm, BMFace *f);
144 PyObject *BPy_BMElemSeq_CreatePyObject(BMesh *bm, BPy_BMElem *py_ele, const char itype);
150 
151 /* Just checks type and creates v/e/f/l. */
152 PyObject *BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele);
153 
155  PyObject *seq_fast,
156  Py_ssize_t min,
157  Py_ssize_t max,
158  Py_ssize_t *r_size,
159  const char htype,
160  const bool do_unique_check,
161  const bool do_bm_check,
162  const char *error_prefix);
163 void *BPy_BMElem_PySeq_As_Array(BMesh **r_bm,
164  PyObject *seq,
165  Py_ssize_t min,
166  Py_ssize_t max,
167  Py_ssize_t *r_size,
168  const char htype,
169  const bool do_unique_check,
170  const bool do_bm_check,
171  const char *error_prefix);
172 
173 PyObject *BPy_BMElem_Array_As_Tuple(BMesh *bm, BMHeader **elem, Py_ssize_t elem_len);
174 PyObject *BPy_BMVert_Array_As_Tuple(BMesh *bm, BMVert **elem, Py_ssize_t elem_len);
175 PyObject *BPy_BMEdge_Array_As_Tuple(BMesh *bm, BMEdge **elem, Py_ssize_t elem_len);
176 PyObject *BPy_BMFace_Array_As_Tuple(BMesh *bm, BMFace **elem, Py_ssize_t elem_len);
177 PyObject *BPy_BMLoop_Array_As_Tuple(BMesh *bm, BMLoop **elem, Py_ssize_t elem_len);
178 
179 int BPy_BMElem_CheckHType(PyTypeObject *type, const char htype);
180 char *BPy_BMElem_StringFromHType_ex(const char htype, char ret[32]);
181 char *BPy_BMElem_StringFromHType(const char htype);
182 
183 // void bpy_bm_generic_invalidate(BPy_BMGeneric *self);
186  const char *error_prefix,
187  void **args,
188  uint args_tot) ATTR_NONNULL(1, 2);
189 
190 #define BPY_BM_CHECK_OBJ(obj) \
191  if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { \
192  return NULL; \
193  } \
194  (void)0
195 #define BPY_BM_CHECK_INT(obj) \
196  if (UNLIKELY(bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1)) { \
197  return -1; \
198  } \
199  (void)0
200 
201 /* macros like BPY_BM_CHECK_OBJ/BPY_BM_CHECK_INT that ensure we're from the right BMesh */
202 #define BPY_BM_CHECK_SOURCE_OBJ(bm, errmsg, ...) \
203  { \
204  void *_args[] = {__VA_ARGS__}; \
205  if (UNLIKELY(bpy_bm_generic_valid_check_source(bm, errmsg, _args, ARRAY_SIZE(_args)) == \
206  -1)) { \
207  return NULL; \
208  } \
209  } \
210  (void)0
211 #define BPY_BM_CHECK_SOURCE_INT(bm, errmsg, ...) \
212  { \
213  void *_args[] = {__VA_ARGS__}; \
214  if (UNLIKELY(bpy_bm_generic_valid_check_source(bm, errmsg, _args, ARRAY_SIZE(_args)) == \
215  -1)) { \
216  return -1; \
217  } \
218  } \
219  (void)0
220 
221 #define BPY_BM_IS_VALID(obj) (LIKELY((obj)->bm != NULL))
222 
223 #define BM_ITER_BPY_BM_SEQ(ele, iter, bpy_bmelemseq) \
224  for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_new( \
225  iter, \
226  (bpy_bmelemseq)->bm, \
227  (bpy_bmelemseq)->itype, \
228  (bpy_bmelemseq)->py_ele ? ((BPy_BMElem *)(bpy_bmelemseq)->py_ele)->ele : NULL); \
229  ele; \
230  BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_step(iter))
231 
232 #ifdef __PY_CAPI_UTILS_H__
233 struct PyC_FlagSet;
236 extern struct PyC_FlagSet bpy_bm_htype_all_flags[];
237 extern struct PyC_FlagSet bpy_bm_hflag_all_flags[];
238 #endif
#define ATTR_NONNULL(...)
unsigned int uint
Definition: BLI_sys_types.h:83
_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[]
@ BPY_BMFLAG_IS_WRAPPED
@ BPY_BMFLAG_NOP
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)
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)
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, const char htype, const bool do_unique_check, const bool do_bm_check, const char *error_prefix)
PyTypeObject BPy_BMVertSeq_Type
PyTypeObject BPy_BMLoopSeq_Type
struct BPy_BMIter BPy_BMIter
PyObject * BPy_BMLoopSeq_CreatePyObject(BMesh *bm)
PyObject * BPy_BMFace_CreatePyObject(BMesh *bm, BMFace *f)
char * BPy_BMElem_StringFromHType_ex(const char htype, char ret[32])
struct BPy_BMEdge BPy_BMEdge
PyTypeObject BPy_BMEdgeSeq_Type
PyTypeObject BPy_BMEdge_Type
PyObject * BPy_BMFaceSeq_CreatePyObject(BMesh *bm)
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
char * BPy_BMElem_StringFromHType(const char htype)
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_BMElemSeq_CreatePyObject(BMesh *bm, BPy_BMElem *py_ele, const char itype)
int BPy_BMElem_CheckHType(PyTypeObject *type, const char htype)
void * BPy_BMElem_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_size, const char htype, const bool do_unique_check, const bool do_bm_check, const char *error_prefix)
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:51
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