diff options
Diffstat (limited to 'source/blender/python/bmesh/bmesh_py_types.c')
-rw-r--r-- | source/blender/python/bmesh/bmesh_py_types.c | 6227 |
1 files changed, 3242 insertions, 2985 deletions
diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index 366f0b4b3f7..522927f56e2 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -57,36 +57,36 @@ static void bm_dealloc_editmode_warn(BPy_BMesh *self); /* scene does not use BM_* flags. */ PyC_FlagSet bpy_bm_scene_vert_edge_face_flags[] = { - {1, "VERT"}, - {2, "EDGE"}, - {4, "FACE"}, - {0, NULL}, + {1, "VERT"}, + {2, "EDGE"}, + {4, "FACE"}, + {0, NULL}, }; PyC_FlagSet bpy_bm_htype_vert_edge_face_flags[] = { - {BM_VERT, "VERT"}, - {BM_EDGE, "EDGE"}, - {BM_FACE, "FACE"}, - {0, NULL}, + {BM_VERT, "VERT"}, + {BM_EDGE, "EDGE"}, + {BM_FACE, "FACE"}, + {0, NULL}, }; PyC_FlagSet bpy_bm_htype_all_flags[] = { - {BM_VERT, "VERT"}, - {BM_LOOP, "EDGE"}, - {BM_FACE, "FACE"}, - {BM_LOOP, "LOOP"}, - {0, NULL}, + {BM_VERT, "VERT"}, + {BM_LOOP, "EDGE"}, + {BM_FACE, "FACE"}, + {BM_LOOP, "LOOP"}, + {0, NULL}, }; #define BPY_BM_HFLAG_ALL_STR "('SELECT', 'HIDE', 'SEAM', 'SMOOTH', 'TAG')" PyC_FlagSet bpy_bm_hflag_all_flags[] = { - {BM_ELEM_SELECT, "SELECT"}, - {BM_ELEM_HIDDEN, "HIDE"}, - {BM_ELEM_SEAM, "SEAM"}, - {BM_ELEM_SMOOTH, "SMOOTH"}, - {BM_ELEM_TAG, "TAG"}, - {0, NULL}, + {BM_ELEM_SELECT, "SELECT"}, + {BM_ELEM_HIDDEN, "HIDE"}, + {BM_ELEM_SEAM, "SEAM"}, + {BM_ELEM_SMOOTH, "SMOOTH"}, + {BM_ELEM_TAG, "TAG"}, + {0, NULL}, }; /* py-type definitions @@ -95,498 +95,463 @@ PyC_FlagSet bpy_bm_hflag_all_flags[] = { /* getseters * ========= */ - /* bmesh elems * ----------- */ -PyDoc_STRVAR(bpy_bm_elem_select_doc, "Selected state of this element.\n\n:type: boolean"); -PyDoc_STRVAR(bpy_bm_elem_hide_doc, "Hidden state of this element.\n\n:type: boolean"); -PyDoc_STRVAR(bpy_bm_elem_tag_doc, "Generic attribute scripts can use for own logic\n\n:type: boolean"); -PyDoc_STRVAR(bpy_bm_elem_smooth_doc, "Smooth state of this element.\n\n:type: boolean"); -PyDoc_STRVAR(bpy_bm_elem_seam_doc, "Seam for UV unwrapping.\n\n:type: boolean"); - +PyDoc_STRVAR(bpy_bm_elem_select_doc, "Selected state of this element.\n\n:type: boolean"); +PyDoc_STRVAR(bpy_bm_elem_hide_doc, "Hidden state of this element.\n\n:type: boolean"); +PyDoc_STRVAR(bpy_bm_elem_tag_doc, + "Generic attribute scripts can use for own logic\n\n:type: boolean"); +PyDoc_STRVAR(bpy_bm_elem_smooth_doc, "Smooth state of this element.\n\n:type: boolean"); +PyDoc_STRVAR(bpy_bm_elem_seam_doc, "Seam for UV unwrapping.\n\n:type: boolean"); static PyObject *bpy_bm_elem_hflag_get(BPy_BMElem *self, void *flag) { - const char hflag = (char)POINTER_AS_INT(flag); + const char hflag = (char)POINTER_AS_INT(flag); - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - return PyBool_FromLong(BM_elem_flag_test(self->ele, hflag)); + return PyBool_FromLong(BM_elem_flag_test(self->ele, hflag)); } static int bpy_bm_elem_hflag_set(BPy_BMElem *self, PyObject *value, void *flag) { - const char hflag = (char)POINTER_AS_INT(flag); - int param; - - BPY_BM_CHECK_INT(self); - - if ((param = PyC_Long_AsBool(value)) == -1) { - return -1; - } - - if (hflag == BM_ELEM_SELECT) { - BM_elem_select_set(self->bm, self->ele, param); - } - else { - BM_elem_flag_set(self->ele, hflag, param); - } - return 0; -} - -PyDoc_STRVAR(bpy_bm_elem_index_doc, -"Index of this element.\n" -"\n" -":type: int\n" -"\n" -".. note::\n" -"\n" -" This value is not necessarily valid, while editing the mesh it can become *dirty*.\n" -"\n" -" It's also possible to assign any number to this attribute for a scripts internal logic.\n" -"\n" -" To ensure the value is up to date - see :class:`BMElemSeq.index_update`.\n" -); + const char hflag = (char)POINTER_AS_INT(flag); + int param; + + BPY_BM_CHECK_INT(self); + + if ((param = PyC_Long_AsBool(value)) == -1) { + return -1; + } + + if (hflag == BM_ELEM_SELECT) { + BM_elem_select_set(self->bm, self->ele, param); + } + else { + BM_elem_flag_set(self->ele, hflag, param); + } + return 0; +} + +PyDoc_STRVAR( + bpy_bm_elem_index_doc, + "Index of this element.\n" + "\n" + ":type: int\n" + "\n" + ".. note::\n" + "\n" + " This value is not necessarily valid, while editing the mesh it can become *dirty*.\n" + "\n" + " It's also possible to assign any number to this attribute for a scripts internal logic.\n" + "\n" + " To ensure the value is up to date - see :class:`BMElemSeq.index_update`.\n"); static PyObject *bpy_bm_elem_index_get(BPy_BMElem *self, void *UNUSED(flag)) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - return PyLong_FromLong(BM_elem_index_get(self->ele)); + return PyLong_FromLong(BM_elem_index_get(self->ele)); } static int bpy_bm_elem_index_set(BPy_BMElem *self, PyObject *value, void *UNUSED(flag)) { - int param; + int param; - BPY_BM_CHECK_INT(self); + BPY_BM_CHECK_INT(self); - if (((param = PyC_Long_AsI32(value)) == -1) && PyErr_Occurred()) { - /* error is set */ - return -1; - } + if (((param = PyC_Long_AsI32(value)) == -1) && PyErr_Occurred()) { + /* error is set */ + return -1; + } - BM_elem_index_set(self->ele, param); /* set_dirty! */ + BM_elem_index_set(self->ele, param); /* set_dirty! */ - /* when setting the index assume its set invalid */ - self->bm->elem_index_dirty |= self->ele->head.htype; + /* when setting the index assume its set invalid */ + self->bm->elem_index_dirty |= self->ele->head.htype; - return 0; + return 0; } /* type specific get/sets * ---------------------- */ - /* Mesh * ^^^^ */ /* doc-strings for all uses of this function */ PyDoc_STRVAR(bpy_bmvertseq_doc, -"This meshes vert sequence (read-only).\n\n:type: :class:`BMVertSeq`" -); + "This meshes vert sequence (read-only).\n\n:type: :class:`BMVertSeq`"); static PyObject *bpy_bmvertseq_get(BPy_BMesh *self, void *UNUSED(closure)) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMVertSeq_CreatePyObject(self->bm); + BPY_BM_CHECK_OBJ(self); + return BPy_BMVertSeq_CreatePyObject(self->bm); } PyDoc_STRVAR(bpy_bmedgeseq_doc, -"This meshes edge sequence (read-only).\n\n:type: :class:`BMEdgeSeq`" -); + "This meshes edge sequence (read-only).\n\n:type: :class:`BMEdgeSeq`"); static PyObject *bpy_bmedgeseq_get(BPy_BMesh *self, void *UNUSED(closure)) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMEdgeSeq_CreatePyObject(self->bm); + BPY_BM_CHECK_OBJ(self); + return BPy_BMEdgeSeq_CreatePyObject(self->bm); } PyDoc_STRVAR(bpy_bmfaceseq_doc, -"This meshes face sequence (read-only).\n\n:type: :class:`BMFaceSeq`" -); + "This meshes face sequence (read-only).\n\n:type: :class:`BMFaceSeq`"); static PyObject *bpy_bmfaceseq_get(BPy_BMesh *self, void *UNUSED(closure)) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMFaceSeq_CreatePyObject(self->bm); + BPY_BM_CHECK_OBJ(self); + return BPy_BMFaceSeq_CreatePyObject(self->bm); } PyDoc_STRVAR(bpy_bmloopseq_doc, -"This meshes loops (read-only).\n\n:type: :class:`BMLoopSeq`\n" -"\n" -".. note::\n" -"\n" -" Loops must be accessed via faces, this is only exposed for layer access.\n" -); + "This meshes loops (read-only).\n\n:type: :class:`BMLoopSeq`\n" + "\n" + ".. note::\n" + "\n" + " Loops must be accessed via faces, this is only exposed for layer access.\n"); static PyObject *bpy_bmloopseq_get(BPy_BMesh *self, void *UNUSED(closure)) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMLoopSeq_CreatePyObject(self->bm); + BPY_BM_CHECK_OBJ(self); + return BPy_BMLoopSeq_CreatePyObject(self->bm); } /* vert */ -PyDoc_STRVAR(bpy_bmvert_link_edges_doc, -"Edges connected to this vertex (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMEdge`" -); -PyDoc_STRVAR(bpy_bmvert_link_faces_doc, -"Faces connected to this vertex (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMFace`" -); -PyDoc_STRVAR(bpy_bmvert_link_loops_doc, -"Loops that use this vertex (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`" -); +PyDoc_STRVAR( + bpy_bmvert_link_edges_doc, + "Edges connected to this vertex (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMEdge`"); +PyDoc_STRVAR( + bpy_bmvert_link_faces_doc, + "Faces connected to this vertex (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMFace`"); +PyDoc_STRVAR( + bpy_bmvert_link_loops_doc, + "Loops that use this vertex (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`"); /* edge */ PyDoc_STRVAR(bpy_bmedge_verts_doc, -"Verts this edge uses (always 2), (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMVert`" -); -PyDoc_STRVAR(bpy_bmedge_link_faces_doc, -"Faces connected to this edge, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMFace`" -); -PyDoc_STRVAR(bpy_bmedge_link_loops_doc, -"Loops connected to this edge, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`" -); + "Verts this edge uses (always 2), (read-only).\n\n:type: :class:`BMElemSeq` of " + ":class:`BMVert`"); +PyDoc_STRVAR( + bpy_bmedge_link_faces_doc, + "Faces connected to this edge, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMFace`"); +PyDoc_STRVAR( + bpy_bmedge_link_loops_doc, + "Loops connected to this edge, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`"); /* face */ PyDoc_STRVAR(bpy_bmface_verts_doc, -"Verts of this face, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMVert`" -); + "Verts of this face, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMVert`"); PyDoc_STRVAR(bpy_bmface_edges_doc, -"Edges of this face, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMEdge`" -); + "Edges of this face, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMEdge`"); PyDoc_STRVAR(bpy_bmface_loops_doc, -"Loops of this face, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`" -); + "Loops of this face, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`"); /* loop */ -PyDoc_STRVAR(bpy_bmloops_link_loops_doc, -"Loops connected to this loop, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`" -); +PyDoc_STRVAR( + bpy_bmloops_link_loops_doc, + "Loops connected to this loop, (read-only).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`"); static PyObject *bpy_bmelemseq_elem_get(BPy_BMElem *self, void *itype) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMElemSeq_CreatePyObject(self->bm, self, POINTER_AS_INT(itype)); + BPY_BM_CHECK_OBJ(self); + return BPy_BMElemSeq_CreatePyObject(self->bm, self, POINTER_AS_INT(itype)); } - PyDoc_STRVAR(bpy_bm_is_valid_doc, -"True when this element is valid (hasn't been removed).\n\n:type: boolean" -); + "True when this element is valid (hasn't been removed).\n\n:type: boolean"); static PyObject *bpy_bm_is_valid_get(BPy_BMGeneric *self) { - return PyBool_FromLong(BPY_BM_IS_VALID(self)); + return PyBool_FromLong(BPY_BM_IS_VALID(self)); } -PyDoc_STRVAR(bpy_bmesh_is_wrapped_doc, -"True when this mesh is owned by blender (typically the editmode BMesh).\n\n:type: boolean" -); +PyDoc_STRVAR( + bpy_bmesh_is_wrapped_doc, + "True when this mesh is owned by blender (typically the editmode BMesh).\n\n:type: boolean"); static PyObject *bpy_bmesh_is_wrapped_get(BPy_BMesh *self) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - return PyBool_FromLong(self->flag & BPY_BMFLAG_IS_WRAPPED); + return PyBool_FromLong(self->flag & BPY_BMFLAG_IS_WRAPPED); } PyDoc_STRVAR(bpy_bmesh_select_mode_doc, -"The selection mode, values can be {'VERT', 'EDGE', 'FACE'}, can't be assigned an empty set.\n\n:type: set" -); + "The selection mode, values can be {'VERT', 'EDGE', 'FACE'}, can't be assigned an " + "empty set.\n\n:type: set"); static PyObject *bpy_bmesh_select_mode_get(BPy_BMesh *self) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - return PyC_FlagSet_FromBitfield(bpy_bm_scene_vert_edge_face_flags, self->bm->selectmode); + return PyC_FlagSet_FromBitfield(bpy_bm_scene_vert_edge_face_flags, self->bm->selectmode); } static int bpy_bmesh_select_mode_set(BPy_BMesh *self, PyObject *value) { - int flag = 0; - BPY_BM_CHECK_INT(self); + int flag = 0; + BPY_BM_CHECK_INT(self); - if (PyC_FlagSet_ToBitfield(bpy_bm_scene_vert_edge_face_flags, value, &flag, "bm.select_mode") == -1) { - return -1; - } - else if (flag == 0) { - PyErr_SetString(PyExc_TypeError, - "bm.select_mode: cant assignt an empty value"); - return -1; - } - else { - self->bm->selectmode = flag; - return 0; - } + if (PyC_FlagSet_ToBitfield(bpy_bm_scene_vert_edge_face_flags, value, &flag, "bm.select_mode") == + -1) { + return -1; + } + else if (flag == 0) { + PyErr_SetString(PyExc_TypeError, "bm.select_mode: cant assignt an empty value"); + return -1; + } + else { + self->bm->selectmode = flag; + return 0; + } } PyDoc_STRVAR(bpy_bmesh_select_history_doc, -"Sequence of selected items (the last is displayed as active).\n\n:type: :class:`BMEditSelSeq`" -); + "Sequence of selected items (the last is displayed as active).\n\n:type: " + ":class:`BMEditSelSeq`"); static PyObject *bpy_bmesh_select_history_get(BPy_BMesh *self) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - return BPy_BMEditSel_CreatePyObject(self->bm); + return BPy_BMEditSel_CreatePyObject(self->bm); } static int bpy_bmesh_select_history_set(BPy_BMesh *self, PyObject *value) { - BPY_BM_CHECK_INT(self); + BPY_BM_CHECK_INT(self); - return BPy_BMEditSel_Assign(self, value); + return BPy_BMEditSel_Assign(self, value); } /* Vert * ^^^^ */ PyDoc_STRVAR(bpy_bmvert_co_doc, -"The coordinates for this vertex as a 3D, wrapped vector.\n\n:type: :class:`mathutils.Vector`" -); + "The coordinates for this vertex as a 3D, wrapped vector.\n\n:type: " + ":class:`mathutils.Vector`"); static PyObject *bpy_bmvert_co_get(BPy_BMVert *self) { - BPY_BM_CHECK_OBJ(self); - return Vector_CreatePyObject_wrap(self->v->co, 3, NULL); + BPY_BM_CHECK_OBJ(self); + return Vector_CreatePyObject_wrap(self->v->co, 3, NULL); } static int bpy_bmvert_co_set(BPy_BMVert *self, PyObject *value) { - BPY_BM_CHECK_INT(self); + BPY_BM_CHECK_INT(self); - if (mathutils_array_parse(self->v->co, 3, 3, value, "BMVert.co") != -1) { - return 0; - } - else { - return -1; - } + if (mathutils_array_parse(self->v->co, 3, 3, value, "BMVert.co") != -1) { + return 0; + } + else { + return -1; + } } - -PyDoc_STRVAR(bpy_bmvert_normal_doc, -"The normal for this vertex as a 3D, wrapped vector.\n\n:type: :class:`mathutils.Vector`" -); +PyDoc_STRVAR( + bpy_bmvert_normal_doc, + "The normal for this vertex as a 3D, wrapped vector.\n\n:type: :class:`mathutils.Vector`"); static PyObject *bpy_bmvert_normal_get(BPy_BMVert *self) { - BPY_BM_CHECK_OBJ(self); - return Vector_CreatePyObject_wrap(self->v->no, 3, NULL); + BPY_BM_CHECK_OBJ(self); + return Vector_CreatePyObject_wrap(self->v->no, 3, NULL); } static int bpy_bmvert_normal_set(BPy_BMVert *self, PyObject *value) { - BPY_BM_CHECK_INT(self); + BPY_BM_CHECK_INT(self); - if (mathutils_array_parse(self->v->no, 3, 3, value, "BMVert.normal") != -1) { - return 0; - } - else { - return -1; - } + if (mathutils_array_parse(self->v->no, 3, 3, value, "BMVert.normal") != -1) { + return 0; + } + else { + return -1; + } } - PyDoc_STRVAR(bpy_bmvert_is_manifold_doc, -"True when this vertex is manifold (read-only).\n\n:type: boolean" -); + "True when this vertex is manifold (read-only).\n\n:type: boolean"); static PyObject *bpy_bmvert_is_manifold_get(BPy_BMVert *self) { - BPY_BM_CHECK_OBJ(self); - return PyBool_FromLong(BM_vert_is_manifold(self->v)); + BPY_BM_CHECK_OBJ(self); + return PyBool_FromLong(BM_vert_is_manifold(self->v)); } - PyDoc_STRVAR(bpy_bmvert_is_wire_doc, -"True when this vertex is not connected to any faces (read-only).\n\n:type: boolean" -); + "True when this vertex is not connected to any faces (read-only).\n\n:type: boolean"); static PyObject *bpy_bmvert_is_wire_get(BPy_BMVert *self) { - BPY_BM_CHECK_OBJ(self); - return PyBool_FromLong(BM_vert_is_wire(self->v)); + BPY_BM_CHECK_OBJ(self); + return PyBool_FromLong(BM_vert_is_wire(self->v)); } -PyDoc_STRVAR(bpy_bmvert_is_boundary_doc, -"True when this vertex is connected to boundary edges (read-only).\n\n:type: boolean" -); +PyDoc_STRVAR( + bpy_bmvert_is_boundary_doc, + "True when this vertex is connected to boundary edges (read-only).\n\n:type: boolean"); static PyObject *bpy_bmvert_is_boundary_get(BPy_BMVert *self) { - BPY_BM_CHECK_OBJ(self); - return PyBool_FromLong(BM_vert_is_boundary(self->v)); + BPY_BM_CHECK_OBJ(self); + return PyBool_FromLong(BM_vert_is_boundary(self->v)); } - /* Edge * ^^^^ */ PyDoc_STRVAR(bpy_bmedge_is_manifold_doc, -"True when this edge is manifold (read-only).\n\n:type: boolean" -); + "True when this edge is manifold (read-only).\n\n:type: boolean"); static PyObject *bpy_bmedge_is_manifold_get(BPy_BMEdge *self) { - BPY_BM_CHECK_OBJ(self); - return PyBool_FromLong(BM_edge_is_manifold(self->e)); + BPY_BM_CHECK_OBJ(self); + return PyBool_FromLong(BM_edge_is_manifold(self->e)); } PyDoc_STRVAR(bpy_bmedge_is_contiguous_doc, -"True when this edge is manifold, between two faces with the same winding (read-only).\n\n:type: boolean" -); + "True when this edge is manifold, between two faces with the same winding " + "(read-only).\n\n:type: boolean"); static PyObject *bpy_bmedge_is_contiguous_get(BPy_BMEdge *self) { - BPY_BM_CHECK_OBJ(self); - return PyBool_FromLong(BM_edge_is_contiguous(self->e)); + BPY_BM_CHECK_OBJ(self); + return PyBool_FromLong(BM_edge_is_contiguous(self->e)); } PyDoc_STRVAR(bpy_bmedge_is_convex_doc, -"True when this edge joins two convex faces, depends on a valid face normal (read-only).\n\n:type: boolean" -); + "True when this edge joins two convex faces, depends on a valid face normal " + "(read-only).\n\n:type: boolean"); static PyObject *bpy_bmedge_is_convex_get(BPy_BMEdge *self) { - BPY_BM_CHECK_OBJ(self); - return PyBool_FromLong(BM_edge_is_convex(self->e)); + BPY_BM_CHECK_OBJ(self); + return PyBool_FromLong(BM_edge_is_convex(self->e)); } PyDoc_STRVAR(bpy_bmedge_is_wire_doc, -"True when this edge is not connected to any faces (read-only).\n\n:type: boolean" -); + "True when this edge is not connected to any faces (read-only).\n\n:type: boolean"); static PyObject *bpy_bmedge_is_wire_get(BPy_BMEdge *self) { - BPY_BM_CHECK_OBJ(self); - return PyBool_FromLong(BM_edge_is_wire(self->e)); + BPY_BM_CHECK_OBJ(self); + return PyBool_FromLong(BM_edge_is_wire(self->e)); } - PyDoc_STRVAR(bpy_bmedge_is_boundary_doc, -"True when this edge is at the boundary of a face (read-only).\n\n:type: boolean" -); + "True when this edge is at the boundary of a face (read-only).\n\n:type: boolean"); static PyObject *bpy_bmedge_is_boundary_get(BPy_BMEdge *self) { - BPY_BM_CHECK_OBJ(self); - return PyBool_FromLong(BM_edge_is_boundary(self->e)); + BPY_BM_CHECK_OBJ(self); + return PyBool_FromLong(BM_edge_is_boundary(self->e)); } - /* Face * ^^^^ */ -PyDoc_STRVAR(bpy_bmface_normal_doc, -"The normal for this face as a 3D, wrapped vector.\n\n:type: :class:`mathutils.Vector`" -); +PyDoc_STRVAR( + bpy_bmface_normal_doc, + "The normal for this face as a 3D, wrapped vector.\n\n:type: :class:`mathutils.Vector`"); static PyObject *bpy_bmface_normal_get(BPy_BMFace *self) { - BPY_BM_CHECK_OBJ(self); - return Vector_CreatePyObject_wrap(self->f->no, 3, NULL); + BPY_BM_CHECK_OBJ(self); + return Vector_CreatePyObject_wrap(self->f->no, 3, NULL); } static int bpy_bmface_normal_set(BPy_BMFace *self, PyObject *value) { - BPY_BM_CHECK_INT(self); + BPY_BM_CHECK_INT(self); - if (mathutils_array_parse(self->f->no, 3, 3, value, "BMFace.normal") != -1) { - return 0; - } - else { - return -1; - } + if (mathutils_array_parse(self->f->no, 3, 3, value, "BMFace.normal") != -1) { + return 0; + } + else { + return -1; + } } -PyDoc_STRVAR(bpy_bmface_material_index_doc, -"The face's material index.\n\n:type: int" -); +PyDoc_STRVAR(bpy_bmface_material_index_doc, "The face's material index.\n\n:type: int"); static PyObject *bpy_bmface_material_index_get(BPy_BMFace *self) { - BPY_BM_CHECK_OBJ(self); - return PyLong_FromLong(self->f->mat_nr); + BPY_BM_CHECK_OBJ(self); + return PyLong_FromLong(self->f->mat_nr); } static int bpy_bmface_material_index_set(BPy_BMFace *self, PyObject *value) { - int param; + int param; - BPY_BM_CHECK_INT(self); + BPY_BM_CHECK_INT(self); - if (((param = PyC_Long_AsI32(value)) == -1) && PyErr_Occurred()) { - /* error is set */ - return -1; - } + if (((param = PyC_Long_AsI32(value)) == -1) && PyErr_Occurred()) { + /* error is set */ + return -1; + } - if ((param < 0) || (param > MAXMAT)) { - /* normally we clamp but in this case raise an error */ - PyErr_SetString(PyExc_ValueError, - "material index outside of usable range (0 - 32766)"); - return -1; - } - else { - self->f->mat_nr = (short)param; - return 0; - } + if ((param < 0) || (param > MAXMAT)) { + /* normally we clamp but in this case raise an error */ + PyErr_SetString(PyExc_ValueError, "material index outside of usable range (0 - 32766)"); + return -1; + } + else { + self->f->mat_nr = (short)param; + return 0; + } } - /* Loop * ^^^^ */ -PyDoc_STRVAR(bpy_bmloop_vert_doc, -"The loop's vertex (read-only).\n\n:type: :class:`BMVert`" -); +PyDoc_STRVAR(bpy_bmloop_vert_doc, "The loop's vertex (read-only).\n\n:type: :class:`BMVert`"); static PyObject *bpy_bmloop_vert_get(BPy_BMLoop *self) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMVert_CreatePyObject(self->bm, self->l->v); + BPY_BM_CHECK_OBJ(self); + return BPy_BMVert_CreatePyObject(self->bm, self->l->v); } - -PyDoc_STRVAR(bpy_bmloop_edge_doc, -"The loop's edge (between this loop and the next), (read-only).\n\n:type: :class:`BMEdge`" -); +PyDoc_STRVAR( + bpy_bmloop_edge_doc, + "The loop's edge (between this loop and the next), (read-only).\n\n:type: :class:`BMEdge`"); static PyObject *bpy_bmloop_edge_get(BPy_BMLoop *self) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMEdge_CreatePyObject(self->bm, self->l->e); + BPY_BM_CHECK_OBJ(self); + return BPy_BMEdge_CreatePyObject(self->bm, self->l->e); } - PyDoc_STRVAR(bpy_bmloop_face_doc, -"The face this loop makes (read-only).\n\n:type: :class:`BMFace`" -); + "The face this loop makes (read-only).\n\n:type: :class:`BMFace`"); static PyObject *bpy_bmloop_face_get(BPy_BMLoop *self) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMFace_CreatePyObject(self->bm, self->l->f); + BPY_BM_CHECK_OBJ(self); + return BPy_BMFace_CreatePyObject(self->bm, self->l->f); } PyDoc_STRVAR(bpy_bmloop_link_loop_next_doc, -"The next face corner (read-only).\n\n:type: :class:`BMLoop`" -); + "The next face corner (read-only).\n\n:type: :class:`BMLoop`"); static PyObject *bpy_bmloop_link_loop_next_get(BPy_BMLoop *self) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMLoop_CreatePyObject(self->bm, self->l->next); + BPY_BM_CHECK_OBJ(self); + return BPy_BMLoop_CreatePyObject(self->bm, self->l->next); } PyDoc_STRVAR(bpy_bmloop_link_loop_prev_doc, -"The previous face corner (read-only).\n\n:type: :class:`BMLoop`" -); + "The previous face corner (read-only).\n\n:type: :class:`BMLoop`"); static PyObject *bpy_bmloop_link_loop_prev_get(BPy_BMLoop *self) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMLoop_CreatePyObject(self->bm, self->l->prev); + BPY_BM_CHECK_OBJ(self); + return BPy_BMLoop_CreatePyObject(self->bm, self->l->prev); } PyDoc_STRVAR(bpy_bmloop_link_loop_radial_next_doc, -"The next loop around the edge (read-only).\n\n:type: :class:`BMLoop`" -); + "The next loop around the edge (read-only).\n\n:type: :class:`BMLoop`"); static PyObject *bpy_bmloop_link_loop_radial_next_get(BPy_BMLoop *self) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMLoop_CreatePyObject(self->bm, self->l->radial_next); + BPY_BM_CHECK_OBJ(self); + return BPy_BMLoop_CreatePyObject(self->bm, self->l->radial_next); } PyDoc_STRVAR(bpy_bmloop_link_loop_radial_prev_doc, -"The previous loop around the edge (read-only).\n\n:type: :class:`BMLoop`" -); + "The previous loop around the edge (read-only).\n\n:type: :class:`BMLoop`"); static PyObject *bpy_bmloop_link_loop_radial_prev_get(BPy_BMLoop *self) { - BPY_BM_CHECK_OBJ(self); - return BPy_BMLoop_CreatePyObject(self->bm, self->l->radial_prev); + BPY_BM_CHECK_OBJ(self); + return BPy_BMLoop_CreatePyObject(self->bm, self->l->radial_prev); } PyDoc_STRVAR(bpy_bmloop_is_convex_doc, -"True when this loop is at the convex corner of a face, depends on a valid face normal (read-only).\n\n:type: boolean" -); + "True when this loop is at the convex corner of a face, depends on a valid face " + "normal (read-only).\n\n:type: boolean"); static PyObject *bpy_bmloop_is_convex_get(BPy_BMLoop *self) { - BPY_BM_CHECK_OBJ(self); - return PyBool_FromLong(BM_loop_is_convex(self->l)); + BPY_BM_CHECK_OBJ(self); + return PyBool_FromLong(BM_loop_is_convex(self->l)); } /* ElemSeq @@ -594,1935 +559,2096 @@ static PyObject *bpy_bmloop_is_convex_get(BPy_BMLoop *self) /* note: use for bmvert/edge/face/loop seq's use these, not bmelemseq directly */ PyDoc_STRVAR(bpy_bmelemseq_layers_vert_doc, -"custom-data layers (read-only).\n\n:type: :class:`BMLayerAccessVert`" -); + "custom-data layers (read-only).\n\n:type: :class:`BMLayerAccessVert`"); PyDoc_STRVAR(bpy_bmelemseq_layers_edge_doc, -"custom-data layers (read-only).\n\n:type: :class:`BMLayerAccessEdge`" -); + "custom-data layers (read-only).\n\n:type: :class:`BMLayerAccessEdge`"); PyDoc_STRVAR(bpy_bmelemseq_layers_face_doc, -"custom-data layers (read-only).\n\n:type: :class:`BMLayerAccessFace`" -); + "custom-data layers (read-only).\n\n:type: :class:`BMLayerAccessFace`"); PyDoc_STRVAR(bpy_bmelemseq_layers_loop_doc, -"custom-data layers (read-only).\n\n:type: :class:`BMLayerAccessLoop`" -); + "custom-data layers (read-only).\n\n:type: :class:`BMLayerAccessLoop`"); static PyObject *bpy_bmelemseq_layers_get(BPy_BMElemSeq *self, void *htype) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - return BPy_BMLayerAccess_CreatePyObject(self->bm, POINTER_AS_INT(htype)); + return BPy_BMLayerAccess_CreatePyObject(self->bm, POINTER_AS_INT(htype)); } /* FaceSeq * ^^^^^^^ */ -PyDoc_STRVAR(bpy_bmfaceseq_active_doc, -"active face.\n\n:type: :class:`BMFace` or None" -); +PyDoc_STRVAR(bpy_bmfaceseq_active_doc, "active face.\n\n:type: :class:`BMFace` or None"); static PyObject *bpy_bmfaceseq_active_get(BPy_BMElemSeq *self, void *UNUSED(closure)) { - BMesh *bm = self->bm; - BPY_BM_CHECK_OBJ(self); + BMesh *bm = self->bm; + BPY_BM_CHECK_OBJ(self); - if (bm->act_face) { - return BPy_BMElem_CreatePyObject(bm, (BMHeader *)bm->act_face); - } - else { - Py_RETURN_NONE; - } + if (bm->act_face) { + return BPy_BMElem_CreatePyObject(bm, (BMHeader *)bm->act_face); + } + else { + Py_RETURN_NONE; + } } static int bpy_bmfaceseq_active_set(BPy_BMElem *self, PyObject *value, void *UNUSED(closure)) { - BMesh *bm = self->bm; - if (value == Py_None) { - bm->act_face = NULL; - return 0; - } - else if (BPy_BMFace_Check(value)) { - BPY_BM_CHECK_SOURCE_INT(bm, "faces.active = f", value); - - bm->act_face = ((BPy_BMFace *)value)->f; - return 0; - } - else { - PyErr_Format(PyExc_TypeError, - "faces.active = f: expected BMFace or None, not %.200s", - Py_TYPE(value)->tp_name); - return -1; - } + BMesh *bm = self->bm; + if (value == Py_None) { + bm->act_face = NULL; + return 0; + } + else if (BPy_BMFace_Check(value)) { + BPY_BM_CHECK_SOURCE_INT(bm, "faces.active = f", value); + + bm->act_face = ((BPy_BMFace *)value)->f; + return 0; + } + else { + PyErr_Format(PyExc_TypeError, + "faces.active = f: expected BMFace or None, not %.200s", + Py_TYPE(value)->tp_name); + return -1; + } } static PyGetSetDef bpy_bmesh_getseters[] = { - {(char *)"verts", (getter)bpy_bmvertseq_get, (setter)NULL, (char *)bpy_bmvertseq_doc, NULL}, - {(char *)"edges", (getter)bpy_bmedgeseq_get, (setter)NULL, (char *)bpy_bmedgeseq_doc, NULL}, - {(char *)"faces", (getter)bpy_bmfaceseq_get, (setter)NULL, (char *)bpy_bmfaceseq_doc, NULL}, - {(char *)"loops", (getter)bpy_bmloopseq_get, (setter)NULL, (char *)bpy_bmloopseq_doc, NULL}, - {(char *)"select_mode", (getter)bpy_bmesh_select_mode_get, (setter)bpy_bmesh_select_mode_set, (char *)bpy_bmesh_select_mode_doc, NULL}, - - {(char *)"select_history", (getter)bpy_bmesh_select_history_get, (setter)bpy_bmesh_select_history_set, (char *)bpy_bmesh_select_history_doc, NULL}, - - /* readonly checks */ - {(char *)"is_wrapped", (getter)bpy_bmesh_is_wrapped_get, (setter)NULL, (char *)bpy_bmesh_is_wrapped_doc, NULL}, /* as with mathutils */ - {(char *)"is_valid", (getter)bpy_bm_is_valid_get, (setter)NULL, (char *)bpy_bm_is_valid_doc, NULL}, - - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {(char *)"verts", (getter)bpy_bmvertseq_get, (setter)NULL, (char *)bpy_bmvertseq_doc, NULL}, + {(char *)"edges", (getter)bpy_bmedgeseq_get, (setter)NULL, (char *)bpy_bmedgeseq_doc, NULL}, + {(char *)"faces", (getter)bpy_bmfaceseq_get, (setter)NULL, (char *)bpy_bmfaceseq_doc, NULL}, + {(char *)"loops", (getter)bpy_bmloopseq_get, (setter)NULL, (char *)bpy_bmloopseq_doc, NULL}, + {(char *)"select_mode", + (getter)bpy_bmesh_select_mode_get, + (setter)bpy_bmesh_select_mode_set, + (char *)bpy_bmesh_select_mode_doc, + NULL}, + + {(char *)"select_history", + (getter)bpy_bmesh_select_history_get, + (setter)bpy_bmesh_select_history_set, + (char *)bpy_bmesh_select_history_doc, + NULL}, + + /* readonly checks */ + {(char *)"is_wrapped", + (getter)bpy_bmesh_is_wrapped_get, + (setter)NULL, + (char *)bpy_bmesh_is_wrapped_doc, + NULL}, /* as with mathutils */ + {(char *)"is_valid", + (getter)bpy_bm_is_valid_get, + (setter)NULL, + (char *)bpy_bm_is_valid_doc, + NULL}, + + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyGetSetDef bpy_bmvert_getseters[] = { - /* generic */ - {(char *)"select", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_select_doc, (void *)BM_ELEM_SELECT}, - {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_HIDDEN}, - {(char *)"tag", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_tag_doc, (void *)BM_ELEM_TAG}, - {(char *)"index", (getter)bpy_bm_elem_index_get, (setter)bpy_bm_elem_index_set, (char *)bpy_bm_elem_index_doc, NULL}, - - {(char *)"co", (getter)bpy_bmvert_co_get, (setter)bpy_bmvert_co_set, (char *)bpy_bmvert_co_doc, NULL}, - {(char *)"normal", (getter)bpy_bmvert_normal_get, (setter)bpy_bmvert_normal_set, (char *)bpy_bmvert_normal_doc, NULL}, - - /* connectivity data */ - {(char *)"link_edges", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmvert_link_edges_doc, (void *)BM_EDGES_OF_VERT}, - {(char *)"link_faces", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmvert_link_faces_doc, (void *)BM_FACES_OF_VERT}, - {(char *)"link_loops", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmvert_link_loops_doc, (void *)BM_LOOPS_OF_VERT}, - - /* readonly checks */ - {(char *)"is_manifold", (getter)bpy_bmvert_is_manifold_get, (setter)NULL, (char *)bpy_bmvert_is_manifold_doc, NULL}, - {(char *)"is_wire", (getter)bpy_bmvert_is_wire_get, (setter)NULL, (char *)bpy_bmvert_is_wire_doc, NULL}, - {(char *)"is_boundary", (getter)bpy_bmvert_is_boundary_get, (setter)NULL, (char *)bpy_bmvert_is_boundary_doc, NULL}, - {(char *)"is_valid", (getter)bpy_bm_is_valid_get, (setter)NULL, (char *)bpy_bm_is_valid_doc, NULL}, - - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + /* generic */ + {(char *)"select", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_select_doc, + (void *)BM_ELEM_SELECT}, + {(char *)"hide", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_hide_doc, + (void *)BM_ELEM_HIDDEN}, + {(char *)"tag", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_tag_doc, + (void *)BM_ELEM_TAG}, + {(char *)"index", + (getter)bpy_bm_elem_index_get, + (setter)bpy_bm_elem_index_set, + (char *)bpy_bm_elem_index_doc, + NULL}, + + {(char *)"co", + (getter)bpy_bmvert_co_get, + (setter)bpy_bmvert_co_set, + (char *)bpy_bmvert_co_doc, + NULL}, + {(char *)"normal", + (getter)bpy_bmvert_normal_get, + (setter)bpy_bmvert_normal_set, + (char *)bpy_bmvert_normal_doc, + NULL}, + + /* connectivity data */ + {(char *)"link_edges", + (getter)bpy_bmelemseq_elem_get, + (setter)NULL, + (char *)bpy_bmvert_link_edges_doc, + (void *)BM_EDGES_OF_VERT}, + {(char *)"link_faces", + (getter)bpy_bmelemseq_elem_get, + (setter)NULL, + (char *)bpy_bmvert_link_faces_doc, + (void *)BM_FACES_OF_VERT}, + {(char *)"link_loops", + (getter)bpy_bmelemseq_elem_get, + (setter)NULL, + (char *)bpy_bmvert_link_loops_doc, + (void *)BM_LOOPS_OF_VERT}, + + /* readonly checks */ + {(char *)"is_manifold", + (getter)bpy_bmvert_is_manifold_get, + (setter)NULL, + (char *)bpy_bmvert_is_manifold_doc, + NULL}, + {(char *)"is_wire", + (getter)bpy_bmvert_is_wire_get, + (setter)NULL, + (char *)bpy_bmvert_is_wire_doc, + NULL}, + {(char *)"is_boundary", + (getter)bpy_bmvert_is_boundary_get, + (setter)NULL, + (char *)bpy_bmvert_is_boundary_doc, + NULL}, + {(char *)"is_valid", + (getter)bpy_bm_is_valid_get, + (setter)NULL, + (char *)bpy_bm_is_valid_doc, + NULL}, + + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyGetSetDef bpy_bmedge_getseters[] = { - /* generic */ - {(char *)"select", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_select_doc, (void *)BM_ELEM_SELECT}, - {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_HIDDEN}, - {(char *)"tag", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_tag_doc, (void *)BM_ELEM_TAG}, - {(char *)"index", (getter)bpy_bm_elem_index_get, (setter)bpy_bm_elem_index_set, (char *)bpy_bm_elem_index_doc, NULL}, - - {(char *)"smooth", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_smooth_doc, (void *)BM_ELEM_SMOOTH}, - {(char *)"seam", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_seam_doc, (void *)BM_ELEM_SEAM}, - - /* connectivity data */ - {(char *)"verts", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmedge_verts_doc, (void *)BM_VERTS_OF_EDGE}, - - {(char *)"link_faces", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmedge_link_faces_doc, (void *)BM_FACES_OF_EDGE}, - {(char *)"link_loops", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmedge_link_loops_doc, (void *)BM_LOOPS_OF_EDGE}, - - /* readonly checks */ - {(char *)"is_manifold", (getter)bpy_bmedge_is_manifold_get, (setter)NULL, (char *)bpy_bmedge_is_manifold_doc, NULL}, - {(char *)"is_contiguous", (getter)bpy_bmedge_is_contiguous_get, (setter)NULL, (char *)bpy_bmedge_is_contiguous_doc, NULL}, - {(char *)"is_convex", (getter)bpy_bmedge_is_convex_get, (setter)NULL, (char *)bpy_bmedge_is_convex_doc, NULL}, - {(char *)"is_wire", (getter)bpy_bmedge_is_wire_get, (setter)NULL, (char *)bpy_bmedge_is_wire_doc, NULL}, - {(char *)"is_boundary", (getter)bpy_bmedge_is_boundary_get, (setter)NULL, (char *)bpy_bmedge_is_boundary_doc, NULL}, - {(char *)"is_valid", (getter)bpy_bm_is_valid_get, (setter)NULL, (char *)bpy_bm_is_valid_doc, NULL}, - - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + /* generic */ + {(char *)"select", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_select_doc, + (void *)BM_ELEM_SELECT}, + {(char *)"hide", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_hide_doc, + (void *)BM_ELEM_HIDDEN}, + {(char *)"tag", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_tag_doc, + (void *)BM_ELEM_TAG}, + {(char *)"index", + (getter)bpy_bm_elem_index_get, + (setter)bpy_bm_elem_index_set, + (char *)bpy_bm_elem_index_doc, + NULL}, + + {(char *)"smooth", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_smooth_doc, + (void *)BM_ELEM_SMOOTH}, + {(char *)"seam", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_seam_doc, + (void *)BM_ELEM_SEAM}, + + /* connectivity data */ + {(char *)"verts", + (getter)bpy_bmelemseq_elem_get, + (setter)NULL, + (char *)bpy_bmedge_verts_doc, + (void *)BM_VERTS_OF_EDGE}, + + {(char *)"link_faces", + (getter)bpy_bmelemseq_elem_get, + (setter)NULL, + (char *)bpy_bmedge_link_faces_doc, + (void *)BM_FACES_OF_EDGE}, + {(char *)"link_loops", + (getter)bpy_bmelemseq_elem_get, + (setter)NULL, + (char *)bpy_bmedge_link_loops_doc, + (void *)BM_LOOPS_OF_EDGE}, + + /* readonly checks */ + {(char *)"is_manifold", + (getter)bpy_bmedge_is_manifold_get, + (setter)NULL, + (char *)bpy_bmedge_is_manifold_doc, + NULL}, + {(char *)"is_contiguous", + (getter)bpy_bmedge_is_contiguous_get, + (setter)NULL, + (char *)bpy_bmedge_is_contiguous_doc, + NULL}, + {(char *)"is_convex", + (getter)bpy_bmedge_is_convex_get, + (setter)NULL, + (char *)bpy_bmedge_is_convex_doc, + NULL}, + {(char *)"is_wire", + (getter)bpy_bmedge_is_wire_get, + (setter)NULL, + (char *)bpy_bmedge_is_wire_doc, + NULL}, + {(char *)"is_boundary", + (getter)bpy_bmedge_is_boundary_get, + (setter)NULL, + (char *)bpy_bmedge_is_boundary_doc, + NULL}, + {(char *)"is_valid", + (getter)bpy_bm_is_valid_get, + (setter)NULL, + (char *)bpy_bm_is_valid_doc, + NULL}, + + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyGetSetDef bpy_bmface_getseters[] = { - /* generic */ - {(char *)"select", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_select_doc, (void *)BM_ELEM_SELECT}, - {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_HIDDEN}, - {(char *)"tag", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_tag_doc, (void *)BM_ELEM_TAG}, - {(char *)"index", (getter)bpy_bm_elem_index_get, (setter)bpy_bm_elem_index_set, (char *)bpy_bm_elem_index_doc, NULL}, - - {(char *)"smooth", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_smooth_doc, (void *)BM_ELEM_SMOOTH}, - - {(char *)"normal", (getter)bpy_bmface_normal_get, (setter)bpy_bmface_normal_set, (char *)bpy_bmface_normal_doc, NULL}, - - {(char *)"material_index", (getter)bpy_bmface_material_index_get, (setter)bpy_bmface_material_index_set, (char *)bpy_bmface_material_index_doc, NULL}, - - /* connectivity data */ - {(char *)"verts", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmface_verts_doc, (void *)BM_VERTS_OF_FACE}, - {(char *)"edges", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmface_edges_doc, (void *)BM_EDGES_OF_FACE}, - {(char *)"loops", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmface_loops_doc, (void *)BM_LOOPS_OF_FACE}, - - /* readonly checks */ - {(char *)"is_valid", (getter)bpy_bm_is_valid_get, (setter)NULL, (char *)bpy_bm_is_valid_doc, NULL}, - - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + /* generic */ + {(char *)"select", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_select_doc, + (void *)BM_ELEM_SELECT}, + {(char *)"hide", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_hide_doc, + (void *)BM_ELEM_HIDDEN}, + {(char *)"tag", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_tag_doc, + (void *)BM_ELEM_TAG}, + {(char *)"index", + (getter)bpy_bm_elem_index_get, + (setter)bpy_bm_elem_index_set, + (char *)bpy_bm_elem_index_doc, + NULL}, + + {(char *)"smooth", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_smooth_doc, + (void *)BM_ELEM_SMOOTH}, + + {(char *)"normal", + (getter)bpy_bmface_normal_get, + (setter)bpy_bmface_normal_set, + (char *)bpy_bmface_normal_doc, + NULL}, + + {(char *)"material_index", + (getter)bpy_bmface_material_index_get, + (setter)bpy_bmface_material_index_set, + (char *)bpy_bmface_material_index_doc, + NULL}, + + /* connectivity data */ + {(char *)"verts", + (getter)bpy_bmelemseq_elem_get, + (setter)NULL, + (char *)bpy_bmface_verts_doc, + (void *)BM_VERTS_OF_FACE}, + {(char *)"edges", + (getter)bpy_bmelemseq_elem_get, + (setter)NULL, + (char *)bpy_bmface_edges_doc, + (void *)BM_EDGES_OF_FACE}, + {(char *)"loops", + (getter)bpy_bmelemseq_elem_get, + (setter)NULL, + (char *)bpy_bmface_loops_doc, + (void *)BM_LOOPS_OF_FACE}, + + /* readonly checks */ + {(char *)"is_valid", + (getter)bpy_bm_is_valid_get, + (setter)NULL, + (char *)bpy_bm_is_valid_doc, + NULL}, + + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyGetSetDef bpy_bmloop_getseters[] = { - /* generic */ - /* flags are available but not used for loops. */ - // {(char *)"select", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_select_doc, (void *)BM_ELEM_SELECT}, - // {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_HIDDEN}, - {(char *)"tag", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_tag_doc, (void *)BM_ELEM_TAG}, - {(char *)"index", (getter)bpy_bm_elem_index_get, (setter)bpy_bm_elem_index_set, (char *)bpy_bm_elem_index_doc, NULL}, - - {(char *)"vert", (getter)bpy_bmloop_vert_get, (setter)NULL, (char *)bpy_bmloop_vert_doc, NULL}, - {(char *)"edge", (getter)bpy_bmloop_edge_get, (setter)NULL, (char *)bpy_bmloop_edge_doc, NULL}, - {(char *)"face", (getter)bpy_bmloop_face_get, (setter)NULL, (char *)bpy_bmloop_face_doc, NULL}, - - /* connectivity data */ - {(char *)"link_loops", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmloops_link_loops_doc, (void *)BM_LOOPS_OF_LOOP}, - {(char *)"link_loop_next", (getter)bpy_bmloop_link_loop_next_get, (setter)NULL, (char *)bpy_bmloop_link_loop_next_doc, NULL}, - {(char *)"link_loop_prev", (getter)bpy_bmloop_link_loop_prev_get, (setter)NULL, (char *)bpy_bmloop_link_loop_prev_doc, NULL}, - {(char *)"link_loop_radial_next", (getter)bpy_bmloop_link_loop_radial_next_get, (setter)NULL, (char *)bpy_bmloop_link_loop_radial_next_doc, NULL}, - {(char *)"link_loop_radial_prev", (getter)bpy_bmloop_link_loop_radial_prev_get, (setter)NULL, (char *)bpy_bmloop_link_loop_radial_prev_doc, NULL}, - - /* readonly checks */ - {(char *)"is_convex", (getter)bpy_bmloop_is_convex_get, (setter)NULL, (char *)bpy_bmloop_is_convex_doc, NULL}, - {(char *)"is_valid", (getter)bpy_bm_is_valid_get, (setter)NULL, (char *)bpy_bm_is_valid_doc, NULL}, - - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + /* generic */ + /* flags are available but not used for loops. */ + // {(char *)"select", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_select_doc, (void *)BM_ELEM_SELECT}, + // {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_HIDDEN}, + {(char *)"tag", + (getter)bpy_bm_elem_hflag_get, + (setter)bpy_bm_elem_hflag_set, + (char *)bpy_bm_elem_tag_doc, + (void *)BM_ELEM_TAG}, + {(char *)"index", + (getter)bpy_bm_elem_index_get, + (setter)bpy_bm_elem_index_set, + (char *)bpy_bm_elem_index_doc, + NULL}, + + {(char *)"vert", (getter)bpy_bmloop_vert_get, (setter)NULL, (char *)bpy_bmloop_vert_doc, NULL}, + {(char *)"edge", (getter)bpy_bmloop_edge_get, (setter)NULL, (char *)bpy_bmloop_edge_doc, NULL}, + {(char *)"face", (getter)bpy_bmloop_face_get, (setter)NULL, (char *)bpy_bmloop_face_doc, NULL}, + + /* connectivity data */ + {(char *)"link_loops", + (getter)bpy_bmelemseq_elem_get, + (setter)NULL, + (char *)bpy_bmloops_link_loops_doc, + (void *)BM_LOOPS_OF_LOOP}, + {(char *)"link_loop_next", + (getter)bpy_bmloop_link_loop_next_get, + (setter)NULL, + (char *)bpy_bmloop_link_loop_next_doc, + NULL}, + {(char *)"link_loop_prev", + (getter)bpy_bmloop_link_loop_prev_get, + (setter)NULL, + (char *)bpy_bmloop_link_loop_prev_doc, + NULL}, + {(char *)"link_loop_radial_next", + (getter)bpy_bmloop_link_loop_radial_next_get, + (setter)NULL, + (char *)bpy_bmloop_link_loop_radial_next_doc, + NULL}, + {(char *)"link_loop_radial_prev", + (getter)bpy_bmloop_link_loop_radial_prev_get, + (setter)NULL, + (char *)bpy_bmloop_link_loop_radial_prev_doc, + NULL}, + + /* readonly checks */ + {(char *)"is_convex", + (getter)bpy_bmloop_is_convex_get, + (setter)NULL, + (char *)bpy_bmloop_is_convex_doc, + NULL}, + {(char *)"is_valid", + (getter)bpy_bm_is_valid_get, + (setter)NULL, + (char *)bpy_bm_is_valid_doc, + NULL}, + + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyGetSetDef bpy_bmvertseq_getseters[] = { - {(char *)"layers", (getter)bpy_bmelemseq_layers_get, (setter)NULL, (char *)bpy_bmelemseq_layers_vert_doc, (void *)BM_VERT}, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {(char *)"layers", + (getter)bpy_bmelemseq_layers_get, + (setter)NULL, + (char *)bpy_bmelemseq_layers_vert_doc, + (void *)BM_VERT}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyGetSetDef bpy_bmedgeseq_getseters[] = { - {(char *)"layers", (getter)bpy_bmelemseq_layers_get, (setter)NULL, (char *)bpy_bmelemseq_layers_edge_doc, (void *)BM_EDGE}, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {(char *)"layers", + (getter)bpy_bmelemseq_layers_get, + (setter)NULL, + (char *)bpy_bmelemseq_layers_edge_doc, + (void *)BM_EDGE}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyGetSetDef bpy_bmfaceseq_getseters[] = { - {(char *)"layers", (getter)bpy_bmelemseq_layers_get, (setter)NULL, (char *)bpy_bmelemseq_layers_face_doc, (void *)BM_FACE}, - /* face only */ - {(char *)"active", (getter)bpy_bmfaceseq_active_get, (setter)bpy_bmfaceseq_active_set, (char *)bpy_bmfaceseq_active_doc, NULL}, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {(char *)"layers", + (getter)bpy_bmelemseq_layers_get, + (setter)NULL, + (char *)bpy_bmelemseq_layers_face_doc, + (void *)BM_FACE}, + /* face only */ + {(char *)"active", + (getter)bpy_bmfaceseq_active_get, + (setter)bpy_bmfaceseq_active_set, + (char *)bpy_bmfaceseq_active_doc, + NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyGetSetDef bpy_bmloopseq_getseters[] = { - {(char *)"layers", (getter)bpy_bmelemseq_layers_get, (setter)NULL, (char *)bpy_bmelemseq_layers_loop_doc, (void *)BM_LOOP}, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {(char *)"layers", + (getter)bpy_bmelemseq_layers_get, + (setter)NULL, + (char *)bpy_bmelemseq_layers_loop_doc, + (void *)BM_LOOP}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; - /* Methods * ======= */ - /* Mesh * ---- */ PyDoc_STRVAR(bpy_bmesh_copy_doc, -".. method:: copy()\n" -"\n" -" :return: A copy of this BMesh.\n" -" :rtype: :class:`BMesh`\n" -); + ".. method:: copy()\n" + "\n" + " :return: A copy of this BMesh.\n" + " :rtype: :class:`BMesh`\n"); static PyObject *bpy_bmesh_copy(BPy_BMesh *self) { - BMesh *bm; - BMesh *bm_copy; + BMesh *bm; + BMesh *bm_copy; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - bm = self->bm; + bm = self->bm; - bm_copy = BM_mesh_copy(bm); + bm_copy = BM_mesh_copy(bm); - if (bm_copy) { - return BPy_BMesh_CreatePyObject(bm_copy, BPY_BMFLAG_NOP); - } - else { - PyErr_SetString(PyExc_SystemError, "Unable to copy BMesh, internal error"); - return NULL; - } + if (bm_copy) { + return BPy_BMesh_CreatePyObject(bm_copy, BPY_BMFLAG_NOP); + } + else { + PyErr_SetString(PyExc_SystemError, "Unable to copy BMesh, internal error"); + return NULL; + } } PyDoc_STRVAR(bpy_bmesh_clear_doc, -".. method:: clear()\n" -"\n" -" Clear all mesh data.\n" -); + ".. method:: clear()\n" + "\n" + " Clear all mesh data.\n"); static PyObject *bpy_bmesh_clear(BPy_BMesh *self) { - BMesh *bm; + BMesh *bm; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - bm = self->bm; + bm = self->bm; - BM_mesh_clear(bm); + BM_mesh_clear(bm); - Py_RETURN_NONE; + Py_RETURN_NONE; } -PyDoc_STRVAR(bpy_bmesh_free_doc, -".. method:: free()\n" -"\n" -" Explicitly free the BMesh data from memory, causing exceptions on further access.\n" -"\n" -" .. note::\n" -"\n" -" The BMesh is freed automatically, typically when the script finishes executing.\n" -" However in some cases its hard to predict when this will be and its useful to\n" -" explicitly free the data.\n" -); +PyDoc_STRVAR( + bpy_bmesh_free_doc, + ".. method:: free()\n" + "\n" + " Explicitly free the BMesh data from memory, causing exceptions on further access.\n" + "\n" + " .. note::\n" + "\n" + " The BMesh is freed automatically, typically when the script finishes executing.\n" + " However in some cases its hard to predict when this will be and its useful to\n" + " explicitly free the data.\n"); static PyObject *bpy_bmesh_free(BPy_BMesh *self) { - if (self->bm) { - BMesh *bm = self->bm; + if (self->bm) { + BMesh *bm = self->bm; - bm_dealloc_editmode_warn(self); + bm_dealloc_editmode_warn(self); - if ((self->flag & BPY_BMFLAG_IS_WRAPPED) == 0) { - BM_mesh_free(bm); - } + if ((self->flag & BPY_BMFLAG_IS_WRAPPED) == 0) { + BM_mesh_free(bm); + } - bpy_bm_generic_invalidate((BPy_BMGeneric *)self); - } + bpy_bm_generic_invalidate((BPy_BMGeneric *)self); + } - Py_RETURN_NONE; + Py_RETURN_NONE; } PyDoc_STRVAR(bpy_bmesh_to_mesh_doc, -".. method:: to_mesh(mesh)\n" -"\n" -" Writes this BMesh data into an existing Mesh datablock.\n" -"\n" -" :arg mesh: The mesh data to write into.\n" -" :type mesh: :class:`Mesh`\n" -); + ".. method:: to_mesh(mesh)\n" + "\n" + " Writes this BMesh data into an existing Mesh datablock.\n" + "\n" + " :arg mesh: The mesh data to write into.\n" + " :type mesh: :class:`Mesh`\n"); static PyObject *bpy_bmesh_to_mesh(BPy_BMesh *self, PyObject *args) { - PyObject *py_mesh; - Mesh *me; - BMesh *bm; - - BPY_BM_CHECK_OBJ(self); - - if (!PyArg_ParseTuple(args, "O:to_mesh", &py_mesh) || - !(me = PyC_RNA_AsPointer(py_mesh, "Mesh"))) - { - return NULL; - } - - /* we could allow this but its almost certainly _not_ what script authors want */ - if (me->edit_mesh) { - PyErr_Format(PyExc_ValueError, - "to_mesh(): Mesh '%s' is in editmode", me->id.name + 2); - return NULL; - } - - bm = self->bm; - - BLI_assert(BKE_id_is_in_global_main(&me->id)); - BM_mesh_bm_to_me( - G_MAIN, /* XXX UGLY! */ - bm, me, - (&(struct BMeshToMeshParams){ - .calc_object_remap = true, - })); - - /* we could have the user do this but if they forget blender can easy crash - * since the references arrays for the objects derived meshes are now invalid */ - DEG_id_tag_update(&me->id, ID_RECALC_GEOMETRY); - - Py_RETURN_NONE; -} - -PyDoc_STRVAR(bpy_bmesh_from_object_doc, -".. method:: from_object(object, depsgraph, deform=True, cage=False, face_normals=True)\n" -"\n" -" Initialize this bmesh from existing object datablock (currently only meshes are supported).\n" -"\n" -" :arg object: The object data to load.\n" -" :type object: :class:`Object`\n" -" :arg deform: Apply deformation modifiers.\n" -" :type deform: boolean\n" -" :arg cage: Get the mesh as a deformed cage.\n" -" :type cage: boolean\n" -" :arg face_normals: Calculate face normals.\n" -" :type face_normals: boolean\n" -); + PyObject *py_mesh; + Mesh *me; + BMesh *bm; + + BPY_BM_CHECK_OBJ(self); + + if (!PyArg_ParseTuple(args, "O:to_mesh", &py_mesh) || + !(me = PyC_RNA_AsPointer(py_mesh, "Mesh"))) { + return NULL; + } + + /* we could allow this but its almost certainly _not_ what script authors want */ + if (me->edit_mesh) { + PyErr_Format(PyExc_ValueError, "to_mesh(): Mesh '%s' is in editmode", me->id.name + 2); + return NULL; + } + + bm = self->bm; + + BLI_assert(BKE_id_is_in_global_main(&me->id)); + BM_mesh_bm_to_me(G_MAIN, /* XXX UGLY! */ + bm, + me, + (&(struct BMeshToMeshParams){ + .calc_object_remap = true, + })); + + /* we could have the user do this but if they forget blender can easy crash + * since the references arrays for the objects derived meshes are now invalid */ + DEG_id_tag_update(&me->id, ID_RECALC_GEOMETRY); + + Py_RETURN_NONE; +} + +PyDoc_STRVAR( + bpy_bmesh_from_object_doc, + ".. method:: from_object(object, depsgraph, deform=True, cage=False, face_normals=True)\n" + "\n" + " Initialize this bmesh from existing object datablock (currently only meshes are " + "supported).\n" + "\n" + " :arg object: The object data to load.\n" + " :type object: :class:`Object`\n" + " :arg deform: Apply deformation modifiers.\n" + " :type deform: boolean\n" + " :arg cage: Get the mesh as a deformed cage.\n" + " :type cage: boolean\n" + " :arg face_normals: Calculate face normals.\n" + " :type face_normals: boolean\n"); static PyObject *bpy_bmesh_from_object(BPy_BMesh *self, PyObject *args, PyObject *kw) { - static const char *kwlist[] = {"object", "depsgraph", "deform", "cage", "face_normals", NULL}; - PyObject *py_object; - PyObject *py_depsgraph; - Object *ob, *ob_eval; - struct Depsgraph *depsgraph; - struct Scene *scene_eval; - Mesh *me_eval; - BMesh *bm; - bool use_deform = true; - bool use_cage = false; - bool use_fnorm = true; - CustomData_MeshMasks data_masks = CD_MASK_BMESH; - - BPY_BM_CHECK_OBJ(self); - - if (!PyArg_ParseTupleAndKeywords( - args, kw, "OO|O&O&O&:from_object", (char **)kwlist, - &py_object, &py_depsgraph, - PyC_ParseBool, &use_deform, - PyC_ParseBool, &use_cage, - PyC_ParseBool, &use_fnorm) || - !(ob = PyC_RNA_AsPointer(py_object, "Object")) || - !(depsgraph = PyC_RNA_AsPointer(py_depsgraph, "Depsgraph"))) - { - return NULL; - } - - if (ob->type != OB_MESH) { - PyErr_SetString(PyExc_ValueError, - "from_object(...): currently only mesh objects are supported"); - return NULL; - } - - const bool use_render = DEG_get_mode(depsgraph) == DAG_EVAL_RENDER; - scene_eval = DEG_get_evaluated_scene(depsgraph); - ob_eval = DEG_get_evaluated_object(depsgraph, ob); - - /* Write the display mesh into the dummy mesh */ - if (use_deform) { - if (use_render) { - if (use_cage) { - PyErr_SetString(PyExc_ValueError, - "from_object(...): cage arg is unsupported when dependency graph evaluation mode is RENDER"); - return NULL; - } - else { - me_eval = mesh_create_eval_final_render(depsgraph, scene_eval, ob_eval, &data_masks); - } - } - else { - if (use_cage) { - me_eval = mesh_get_eval_deform(depsgraph, scene_eval, ob_eval, &data_masks); - } - else { - me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, &data_masks); - } - } - } - else { - /* !use_deform */ - if (use_cage) { - PyErr_SetString(PyExc_ValueError, - "from_object(...): cage arg is unsupported when deform=False"); - return NULL; - } - else if (use_render) { - me_eval = mesh_create_eval_no_deform_render(depsgraph, scene_eval, ob, &data_masks); - } - else { - me_eval = mesh_create_eval_no_deform(depsgraph, scene_eval, ob, &data_masks); - } - } - - if (me_eval == NULL) { - PyErr_Format(PyExc_ValueError, - "from_object(...): Object '%s' has no usable mesh data", ob->id.name + 2); - return NULL; - } - - bm = self->bm; - - BM_mesh_bm_from_me( - bm, me_eval, (&(struct BMeshFromMeshParams){ - .calc_face_normal = use_fnorm, - })); - - Py_RETURN_NONE; -} - - -PyDoc_STRVAR(bpy_bmesh_from_mesh_doc, -".. method:: from_mesh(mesh, face_normals=True, use_shape_key=False, shape_key_index=0)\n" -"\n" -" Initialize this bmesh from existing mesh datablock.\n" -"\n" -" :arg mesh: The mesh data to load.\n" -" :type mesh: :class:`Mesh`\n" -" :arg use_shape_key: Use the locations from a shape key.\n" -" :type use_shape_key: boolean\n" -" :arg shape_key_index: The shape key index to use.\n" -" :type shape_key_index: int\n" -"\n" -" .. note::\n" -"\n" -" Multiple calls can be used to join multiple meshes.\n" -"\n" -" Custom-data layers are only copied from ``mesh`` on initialization.\n" -" Further calls will copy custom-data to matching layers, layers missing on the target mesh wont be added.\n" -); + static const char *kwlist[] = {"object", "depsgraph", "deform", "cage", "face_normals", NULL}; + PyObject *py_object; + PyObject *py_depsgraph; + Object *ob, *ob_eval; + struct Depsgraph *depsgraph; + struct Scene *scene_eval; + Mesh *me_eval; + BMesh *bm; + bool use_deform = true; + bool use_cage = false; + bool use_fnorm = true; + CustomData_MeshMasks data_masks = CD_MASK_BMESH; + + BPY_BM_CHECK_OBJ(self); + + if (!PyArg_ParseTupleAndKeywords(args, + kw, + "OO|O&O&O&:from_object", + (char **)kwlist, + &py_object, + &py_depsgraph, + PyC_ParseBool, + &use_deform, + PyC_ParseBool, + &use_cage, + PyC_ParseBool, + &use_fnorm) || + !(ob = PyC_RNA_AsPointer(py_object, "Object")) || + !(depsgraph = PyC_RNA_AsPointer(py_depsgraph, "Depsgraph"))) { + return NULL; + } + + if (ob->type != OB_MESH) { + PyErr_SetString(PyExc_ValueError, + "from_object(...): currently only mesh objects are supported"); + return NULL; + } + + const bool use_render = DEG_get_mode(depsgraph) == DAG_EVAL_RENDER; + scene_eval = DEG_get_evaluated_scene(depsgraph); + ob_eval = DEG_get_evaluated_object(depsgraph, ob); + + /* Write the display mesh into the dummy mesh */ + if (use_deform) { + if (use_render) { + if (use_cage) { + PyErr_SetString(PyExc_ValueError, + "from_object(...): cage arg is unsupported when dependency graph " + "evaluation mode is RENDER"); + return NULL; + } + else { + me_eval = mesh_create_eval_final_render(depsgraph, scene_eval, ob_eval, &data_masks); + } + } + else { + if (use_cage) { + me_eval = mesh_get_eval_deform(depsgraph, scene_eval, ob_eval, &data_masks); + } + else { + me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, &data_masks); + } + } + } + else { + /* !use_deform */ + if (use_cage) { + PyErr_SetString(PyExc_ValueError, + "from_object(...): cage arg is unsupported when deform=False"); + return NULL; + } + else if (use_render) { + me_eval = mesh_create_eval_no_deform_render(depsgraph, scene_eval, ob, &data_masks); + } + else { + me_eval = mesh_create_eval_no_deform(depsgraph, scene_eval, ob, &data_masks); + } + } + + if (me_eval == NULL) { + PyErr_Format(PyExc_ValueError, + "from_object(...): Object '%s' has no usable mesh data", + ob->id.name + 2); + return NULL; + } + + bm = self->bm; + + BM_mesh_bm_from_me(bm, + me_eval, + (&(struct BMeshFromMeshParams){ + .calc_face_normal = use_fnorm, + })); + + Py_RETURN_NONE; +} + +PyDoc_STRVAR( + bpy_bmesh_from_mesh_doc, + ".. method:: from_mesh(mesh, face_normals=True, use_shape_key=False, shape_key_index=0)\n" + "\n" + " Initialize this bmesh from existing mesh datablock.\n" + "\n" + " :arg mesh: The mesh data to load.\n" + " :type mesh: :class:`Mesh`\n" + " :arg use_shape_key: Use the locations from a shape key.\n" + " :type use_shape_key: boolean\n" + " :arg shape_key_index: The shape key index to use.\n" + " :type shape_key_index: int\n" + "\n" + " .. note::\n" + "\n" + " Multiple calls can be used to join multiple meshes.\n" + "\n" + " Custom-data layers are only copied from ``mesh`` on initialization.\n" + " Further calls will copy custom-data to matching layers, layers missing on the target " + "mesh wont be added.\n"); static PyObject *bpy_bmesh_from_mesh(BPy_BMesh *self, PyObject *args, PyObject *kw) { - static const char *kwlist[] = {"mesh", "face_normals", "use_shape_key", "shape_key_index", NULL}; - BMesh *bm; - PyObject *py_mesh; - Mesh *me; - bool use_fnorm = true; - bool use_shape_key = false; - int shape_key_index = 0; - - BPY_BM_CHECK_OBJ(self); - - if (!PyArg_ParseTupleAndKeywords( - args, kw, "O|O&O&i:from_mesh", (char **)kwlist, - &py_mesh, - PyC_ParseBool, &use_fnorm, - PyC_ParseBool, &use_shape_key, - &shape_key_index) || - !(me = PyC_RNA_AsPointer(py_mesh, "Mesh"))) - { - return NULL; - } - - bm = self->bm; - - BM_mesh_bm_from_me( - bm, me, (&(struct BMeshFromMeshParams){ - .calc_face_normal = use_fnorm, .use_shapekey = use_shape_key, .active_shapekey = shape_key_index + 1, - })); - - Py_RETURN_NONE; + static const char *kwlist[] = {"mesh", "face_normals", "use_shape_key", "shape_key_index", NULL}; + BMesh *bm; + PyObject *py_mesh; + Mesh *me; + bool use_fnorm = true; + bool use_shape_key = false; + int shape_key_index = 0; + + BPY_BM_CHECK_OBJ(self); + + if (!PyArg_ParseTupleAndKeywords(args, + kw, + "O|O&O&i:from_mesh", + (char **)kwlist, + &py_mesh, + PyC_ParseBool, + &use_fnorm, + PyC_ParseBool, + &use_shape_key, + &shape_key_index) || + !(me = PyC_RNA_AsPointer(py_mesh, "Mesh"))) { + return NULL; + } + + bm = self->bm; + + BM_mesh_bm_from_me(bm, + me, + (&(struct BMeshFromMeshParams){ + .calc_face_normal = use_fnorm, + .use_shapekey = use_shape_key, + .active_shapekey = shape_key_index + 1, + })); + + Py_RETURN_NONE; } - PyDoc_STRVAR(bpy_bmesh_select_flush_mode_doc, -".. method:: select_flush_mode()\n" -"\n" -" flush selection based on the current mode current :class:`BMesh.select_mode`.\n" -); + ".. method:: select_flush_mode()\n" + "\n" + " flush selection based on the current mode current :class:`BMesh.select_mode`.\n"); static PyObject *bpy_bmesh_select_flush_mode(BPy_BMesh *self) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - BM_mesh_select_mode_flush(self->bm); + BM_mesh_select_mode_flush(self->bm); - Py_RETURN_NONE; + Py_RETURN_NONE; } - PyDoc_STRVAR(bpy_bmesh_select_flush_doc, -".. method:: select_flush(select)\n" -"\n" -" Flush selection, independent of the current selection mode.\n" -"\n" -" :arg select: flush selection or de-selected elements.\n" -" :type select: boolean\n" -); + ".. method:: select_flush(select)\n" + "\n" + " Flush selection, independent of the current selection mode.\n" + "\n" + " :arg select: flush selection or de-selected elements.\n" + " :type select: boolean\n"); static PyObject *bpy_bmesh_select_flush(BPy_BMesh *self, PyObject *value) { - int param; + int param; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if ((param = PyC_Long_AsBool(value)) == -1) { - return NULL; - } + if ((param = PyC_Long_AsBool(value)) == -1) { + return NULL; + } - if (param) { - BM_mesh_select_flush(self->bm); - } - else { - BM_mesh_deselect_flush(self->bm); - } + if (param) { + BM_mesh_select_flush(self->bm); + } + else { + BM_mesh_deselect_flush(self->bm); + } - Py_RETURN_NONE; + Py_RETURN_NONE; } - PyDoc_STRVAR(bpy_bmesh_normal_update_doc, -".. method:: normal_update()\n" -"\n" -" Update mesh normals.\n" -); + ".. method:: normal_update()\n" + "\n" + " Update mesh normals.\n"); static PyObject *bpy_bmesh_normal_update(BPy_BMesh *self) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - BM_mesh_normals_update(self->bm); + BM_mesh_normals_update(self->bm); - Py_RETURN_NONE; + Py_RETURN_NONE; } - PyDoc_STRVAR(bpy_bmesh_transform_doc, -".. method:: transform(matrix, filter=None)\n" -"\n" -" Transform the mesh (optionally filtering flagged data only).\n" -"\n" -" :arg matrix: transform matrix.\n" -" :type matrix: 4x4 :class:`mathutils.Matrix`\n" -" :arg filter: set of values in " BPY_BM_HFLAG_ALL_STR ".\n" -" :type filter: set\n" -); + ".. method:: transform(matrix, filter=None)\n" + "\n" + " Transform the mesh (optionally filtering flagged data only).\n" + "\n" + " :arg matrix: transform matrix.\n" + " :type matrix: 4x4 :class:`mathutils.Matrix`\n" + " :arg filter: set of values in " BPY_BM_HFLAG_ALL_STR + ".\n" + " :type filter: set\n"); static PyObject *bpy_bmesh_transform(BPy_BMElem *self, PyObject *args, PyObject *kw) { - static const char *kwlist[] = {"matrix", "filter", NULL}; - - MatrixObject *mat; - PyObject *filter = NULL; - int filter_flags = 0; - - BPY_BM_CHECK_OBJ(self); - - if (!PyArg_ParseTupleAndKeywords(args, kw, - "O!|O!:transform", - (char **)kwlist, - &matrix_Type, &mat, - &PySet_Type, &filter)) - { - return NULL; - } - else { - BMVert *eve; - BMIter iter; - void *mat_ptr; - - if (BaseMath_ReadCallback(mat) == -1) { - return NULL; - } - else if (mat->num_col != 4 || mat->num_row != 4) { - PyErr_SetString(PyExc_ValueError, - "expected a 4x4 matrix"); - return NULL; - } - - if (filter != NULL && PyC_FlagSet_ToBitfield(bpy_bm_hflag_all_flags, filter, - &filter_flags, "bm.transform") == -1) - { - return NULL; - } - - mat_ptr = mat->matrix; - - if (!filter_flags) { - BM_ITER_MESH (eve, &iter, self->bm, BM_VERTS_OF_MESH) { - mul_m4_v3((float (*)[4])mat_ptr, eve->co); - } - } - else { - char filter_flags_ch = (char)filter_flags; - BM_ITER_MESH (eve, &iter, self->bm, BM_VERTS_OF_MESH) { - if (BM_elem_flag_test(eve, filter_flags_ch)) { - mul_m4_v3((float (*)[4])mat_ptr, eve->co); - } - } - } - } - - Py_RETURN_NONE; + static const char *kwlist[] = {"matrix", "filter", NULL}; + + MatrixObject *mat; + PyObject *filter = NULL; + int filter_flags = 0; + + BPY_BM_CHECK_OBJ(self); + + if (!PyArg_ParseTupleAndKeywords(args, + kw, + "O!|O!:transform", + (char **)kwlist, + &matrix_Type, + &mat, + &PySet_Type, + &filter)) { + return NULL; + } + else { + BMVert *eve; + BMIter iter; + void *mat_ptr; + + if (BaseMath_ReadCallback(mat) == -1) { + return NULL; + } + else if (mat->num_col != 4 || mat->num_row != 4) { + PyErr_SetString(PyExc_ValueError, "expected a 4x4 matrix"); + return NULL; + } + + if (filter != NULL && + PyC_FlagSet_ToBitfield(bpy_bm_hflag_all_flags, filter, &filter_flags, "bm.transform") == + -1) { + return NULL; + } + + mat_ptr = mat->matrix; + + if (!filter_flags) { + BM_ITER_MESH (eve, &iter, self->bm, BM_VERTS_OF_MESH) { + mul_m4_v3((float(*)[4])mat_ptr, eve->co); + } + } + else { + char filter_flags_ch = (char)filter_flags; + BM_ITER_MESH (eve, &iter, self->bm, BM_VERTS_OF_MESH) { + if (BM_elem_flag_test(eve, filter_flags_ch)) { + mul_m4_v3((float(*)[4])mat_ptr, eve->co); + } + } + } + } + + Py_RETURN_NONE; } PyDoc_STRVAR(bpy_bmesh_calc_volume_doc, -".. method:: calc_volume(signed=False)\n" -"\n" -" Calculate mesh volume based on face normals.\n" -"\n" -" :arg signed: when signed is true, negative values may be returned.\n" -" :type signed: bool\n" -" :return: The volume of the mesh.\n" -" :rtype: float\n" -); + ".. method:: calc_volume(signed=False)\n" + "\n" + " Calculate mesh volume based on face normals.\n" + "\n" + " :arg signed: when signed is true, negative values may be returned.\n" + " :type signed: bool\n" + " :return: The volume of the mesh.\n" + " :rtype: float\n"); static PyObject *bpy_bmesh_calc_volume(BPy_BMElem *self, PyObject *args, PyObject *kw) { - static const char *kwlist[] = {"signed", NULL}; - PyObject *is_signed = Py_False; + static const char *kwlist[] = {"signed", NULL}; + PyObject *is_signed = Py_False; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (!PyArg_ParseTupleAndKeywords(args, kw, - "|O!:calc_volume", - (char **)kwlist, - &PyBool_Type, &is_signed)) - { - return NULL; - } - else { - return PyFloat_FromDouble(BM_mesh_calc_volume(self->bm, is_signed != Py_False)); - } + if (!PyArg_ParseTupleAndKeywords( + args, kw, "|O!:calc_volume", (char **)kwlist, &PyBool_Type, &is_signed)) { + return NULL; + } + else { + return PyFloat_FromDouble(BM_mesh_calc_volume(self->bm, is_signed != Py_False)); + } } PyDoc_STRVAR(bpy_bmesh_calc_loop_triangles_doc, -".. method:: calc_loop_triangles()\n" -"\n" -" Calculate triangle tessellation from quads/ngons.\n" -"\n" -" :return: The triangulated faces.\n" -" :rtype: list of :class:`BMLoop` tuples\n" -); + ".. method:: calc_loop_triangles()\n" + "\n" + " Calculate triangle tessellation from quads/ngons.\n" + "\n" + " :return: The triangulated faces.\n" + " :rtype: list of :class:`BMLoop` tuples\n"); static PyObject *bpy_bmesh_calc_loop_triangles(BPy_BMElem *self) { - BMesh *bm; + BMesh *bm; - int looptris_tot; - int tottri; - BMLoop *(*looptris)[3]; + int looptris_tot; + int tottri; + BMLoop *(*looptris)[3]; - PyObject *ret; - int i; + PyObject *ret; + int i; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - bm = self->bm; + bm = self->bm; - looptris_tot = poly_to_tri_count(bm->totface, bm->totloop); - looptris = PyMem_MALLOC(sizeof(*looptris) * looptris_tot); + looptris_tot = poly_to_tri_count(bm->totface, bm->totloop); + looptris = PyMem_MALLOC(sizeof(*looptris) * looptris_tot); - BM_mesh_calc_tessellation(bm, looptris, &tottri); + BM_mesh_calc_tessellation(bm, looptris, &tottri); - ret = PyList_New(tottri); - for (i = 0; i < tottri; i++) { - PyList_SET_ITEM(ret, i, BPy_BMLoop_Array_As_Tuple(bm, looptris[i], 3)); - } + ret = PyList_New(tottri); + for (i = 0; i < tottri; i++) { + PyList_SET_ITEM(ret, i, BPy_BMLoop_Array_As_Tuple(bm, looptris[i], 3)); + } - PyMem_FREE(looptris); + PyMem_FREE(looptris); - return ret; + return ret; } - /* Elem * ---- */ PyDoc_STRVAR(bpy_bm_elem_select_set_doc, -".. method:: select_set(select)\n" -"\n" -" Set the selection.\n" -" This is different from the *select* attribute because it updates the selection state of associated geometry.\n" -"\n" -" :arg select: Select or de-select.\n" -" :type select: boolean\n" -"\n" -" .. note::\n" -"\n" -" Currently this only flushes down, so selecting a face will select all its vertices but de-selecting a vertex " -" won't de-select all the faces that use it, before finishing with a mesh typically flushing is still needed.\n" -); + ".. method:: select_set(select)\n" + "\n" + " Set the selection.\n" + " This is different from the *select* attribute because it updates the selection " + "state of associated geometry.\n" + "\n" + " :arg select: Select or de-select.\n" + " :type select: boolean\n" + "\n" + " .. note::\n" + "\n" + " Currently this only flushes down, so selecting a face will select all its " + "vertices but de-selecting a vertex " + " won't de-select all the faces that use it, before finishing with a mesh " + "typically flushing is still needed.\n"); static PyObject *bpy_bm_elem_select_set(BPy_BMElem *self, PyObject *value) { - int param; + int param; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if ((param = PyC_Long_AsBool(value)) == -1) { - return NULL; - } + if ((param = PyC_Long_AsBool(value)) == -1) { + return NULL; + } - BM_elem_select_set(self->bm, self->ele, param); + BM_elem_select_set(self->bm, self->ele, param); - Py_RETURN_NONE; + Py_RETURN_NONE; } - PyDoc_STRVAR(bpy_bm_elem_hide_set_doc, -".. method:: hide_set(hide)\n" -"\n" -" Set the hide state.\n" -" This is different from the *hide* attribute because it updates the selection and hide state of associated geometry.\n" -"\n" -" :arg hide: Hidden or visible.\n" -" :type hide: boolean\n" -); + ".. method:: hide_set(hide)\n" + "\n" + " Set the hide state.\n" + " This is different from the *hide* attribute because it updates the selection and " + "hide state of associated geometry.\n" + "\n" + " :arg hide: Hidden or visible.\n" + " :type hide: boolean\n"); static PyObject *bpy_bm_elem_hide_set(BPy_BMElem *self, PyObject *value) { - int param; + int param; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if ((param = PyC_Long_AsBool(value)) == -1) { - return NULL; - } + if ((param = PyC_Long_AsBool(value)) == -1) { + return NULL; + } - BM_elem_hide_set(self->bm, self->ele, param); + BM_elem_hide_set(self->bm, self->ele, param); - Py_RETURN_NONE; + Py_RETURN_NONE; } - PyDoc_STRVAR(bpy_bm_elem_copy_from_doc, -".. method:: copy_from(other)\n" -"\n" -" Copy values from another element of matching type.\n" -); + ".. method:: copy_from(other)\n" + "\n" + " Copy values from another element of matching type.\n"); static PyObject *bpy_bm_elem_copy_from(BPy_BMElem *self, BPy_BMElem *value) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (Py_TYPE(self) != Py_TYPE(value)) { - PyErr_Format(PyExc_TypeError, - "expected element of type '%.200s' not '%.200s'", - Py_TYPE(self)->tp_name, Py_TYPE(value)->tp_name); - return NULL; - } + if (Py_TYPE(self) != Py_TYPE(value)) { + PyErr_Format(PyExc_TypeError, + "expected element of type '%.200s' not '%.200s'", + Py_TYPE(self)->tp_name, + Py_TYPE(value)->tp_name); + return NULL; + } - if (value->ele != self->ele) { - BM_elem_attrs_copy(value->bm, self->bm, value->ele, self->ele); - } + if (value->ele != self->ele) { + BM_elem_attrs_copy(value->bm, self->bm, value->ele, self->ele); + } - Py_RETURN_NONE; + Py_RETURN_NONE; } - /* Vert * ---- */ - PyDoc_STRVAR(bpy_bmvert_copy_from_vert_interp_doc, -".. method:: copy_from_vert_interp(vert_pair, fac)\n" -"\n" -" Interpolate the customdata from a vert between 2 other verts.\n" -"\n" -" :arg vert_pair: The vert to interpolate data from.\n" -" :type vert_pair: :class:`BMVert`\n" -); + ".. method:: copy_from_vert_interp(vert_pair, fac)\n" + "\n" + " Interpolate the customdata from a vert between 2 other verts.\n" + "\n" + " :arg vert_pair: The vert to interpolate data from.\n" + " :type vert_pair: :class:`BMVert`\n"); static PyObject *bpy_bmvert_copy_from_vert_interp(BPy_BMVert *self, PyObject *args) { - PyObject *vert_seq; - float fac; + PyObject *vert_seq; + float fac; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (!PyArg_ParseTuple(args, "Of:BMVert.copy_from_vert_interp", - &vert_seq, &fac)) - { - return NULL; - } - else { - BMesh *bm = self->bm; - BMVert **vert_array = NULL; - Py_ssize_t vert_seq_len; /* always 2 */ + if (!PyArg_ParseTuple(args, "Of:BMVert.copy_from_vert_interp", &vert_seq, &fac)) { + return NULL; + } + else { + BMesh *bm = self->bm; + BMVert **vert_array = NULL; + Py_ssize_t vert_seq_len; /* always 2 */ - vert_array = BPy_BMElem_PySeq_As_Array(&bm, vert_seq, 2, 2, - &vert_seq_len, BM_VERT, - true, true, "BMVert.copy_from_vert_interp(...)"); + vert_array = BPy_BMElem_PySeq_As_Array(&bm, + vert_seq, + 2, + 2, + &vert_seq_len, + BM_VERT, + true, + true, + "BMVert.copy_from_vert_interp(...)"); - if (vert_array == NULL) { - return NULL; - } + if (vert_array == NULL) { + return NULL; + } - BM_data_interp_from_verts(bm, vert_array[0], vert_array[1], self->v, clamp_f(fac, 0.0f, 1.0f)); + BM_data_interp_from_verts(bm, vert_array[0], vert_array[1], self->v, clamp_f(fac, 0.0f, 1.0f)); - PyMem_FREE(vert_array); - Py_RETURN_NONE; - } + PyMem_FREE(vert_array); + Py_RETURN_NONE; + } } - PyDoc_STRVAR(bpy_bmvert_copy_from_face_interp_doc, -".. method:: copy_from_face_interp(face)\n" -"\n" -" Interpolate the customdata from a face onto this loop (the loops vert should overlap the face).\n" -"\n" -" :arg face: The face to interpolate data from.\n" -" :type face: :class:`BMFace`\n" -); + ".. method:: copy_from_face_interp(face)\n" + "\n" + " Interpolate the customdata from a face onto this loop (the loops vert should " + "overlap the face).\n" + "\n" + " :arg face: The face to interpolate data from.\n" + " :type face: :class:`BMFace`\n"); static PyObject *bpy_bmvert_copy_from_face_interp(BPy_BMVert *self, PyObject *args) { - BPy_BMFace *py_face = NULL; + BPy_BMFace *py_face = NULL; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (!PyArg_ParseTuple(args, "O!:BMVert.copy_from_face_interp", - &BPy_BMFace_Type, &py_face)) - { - return NULL; - } - else { - BMesh *bm = self->bm; + if (!PyArg_ParseTuple(args, "O!:BMVert.copy_from_face_interp", &BPy_BMFace_Type, &py_face)) { + return NULL; + } + else { + BMesh *bm = self->bm; - BPY_BM_CHECK_SOURCE_OBJ(bm, "copy_from_face_interp()", py_face); + BPY_BM_CHECK_SOURCE_OBJ(bm, "copy_from_face_interp()", py_face); - BM_vert_interp_from_face(bm, self->v, py_face->f); + BM_vert_interp_from_face(bm, self->v, py_face->f); - Py_RETURN_NONE; - } + Py_RETURN_NONE; + } } - PyDoc_STRVAR(bpy_bmvert_calc_edge_angle_doc, -".. method:: calc_edge_angle(fallback=None)\n" -"\n" -" Return the angle between this vert's two connected edges.\n" -"\n" -" :arg fallback: return this when the vert doesn't have 2 edges\n" -" (instead of raising a :exc:`ValueError`).\n" -" :type fallback: any\n" -" :return: Angle between edges in radians.\n" -" :rtype: float\n" -); + ".. method:: calc_edge_angle(fallback=None)\n" + "\n" + " Return the angle between this vert's two connected edges.\n" + "\n" + " :arg fallback: return this when the vert doesn't have 2 edges\n" + " (instead of raising a :exc:`ValueError`).\n" + " :type fallback: any\n" + " :return: Angle between edges in radians.\n" + " :rtype: float\n"); static PyObject *bpy_bmvert_calc_edge_angle(BPy_BMVert *self, PyObject *args) { - const float angle_invalid = -1.0f; - float angle; - PyObject *fallback = NULL; - - BPY_BM_CHECK_OBJ(self); - - if (!PyArg_ParseTuple(args, "|O:calc_edge_angle", &fallback)) { - return NULL; - } - - angle = BM_vert_calc_edge_angle_ex(self->v, angle_invalid); - - if (angle == angle_invalid) { - /* avoid exception */ - if (fallback) { - Py_INCREF(fallback); - return fallback; - } - else { - PyErr_SetString(PyExc_ValueError, - "BMVert.calc_edge_angle(): " - "vert must connect to exactly 2 edges"); - return NULL; - } - } - - return PyFloat_FromDouble(angle); -} - -PyDoc_STRVAR(bpy_bmvert_calc_shell_factor_doc, -".. method:: calc_shell_factor()\n" -"\n" -" Return a multiplier calculated based on the sharpness of the vertex.\n" -" Where a flat surface gives 1.0, and higher values sharper edges.\n" -" This is used to maintain shell thickness when offsetting verts along their normals.\n" -"\n" -" :return: offset multiplier\n" -" :rtype: float\n" -); + const float angle_invalid = -1.0f; + float angle; + PyObject *fallback = NULL; + + BPY_BM_CHECK_OBJ(self); + + if (!PyArg_ParseTuple(args, "|O:calc_edge_angle", &fallback)) { + return NULL; + } + + angle = BM_vert_calc_edge_angle_ex(self->v, angle_invalid); + + if (angle == angle_invalid) { + /* avoid exception */ + if (fallback) { + Py_INCREF(fallback); + return fallback; + } + else { + PyErr_SetString(PyExc_ValueError, + "BMVert.calc_edge_angle(): " + "vert must connect to exactly 2 edges"); + return NULL; + } + } + + return PyFloat_FromDouble(angle); +} + +PyDoc_STRVAR( + bpy_bmvert_calc_shell_factor_doc, + ".. method:: calc_shell_factor()\n" + "\n" + " Return a multiplier calculated based on the sharpness of the vertex.\n" + " Where a flat surface gives 1.0, and higher values sharper edges.\n" + " This is used to maintain shell thickness when offsetting verts along their normals.\n" + "\n" + " :return: offset multiplier\n" + " :rtype: float\n"); static PyObject *bpy_bmvert_calc_shell_factor(BPy_BMVert *self) { - BPY_BM_CHECK_OBJ(self); - return PyFloat_FromDouble(BM_vert_calc_shell_factor(self->v)); + BPY_BM_CHECK_OBJ(self); + return PyFloat_FromDouble(BM_vert_calc_shell_factor(self->v)); } PyDoc_STRVAR(bpy_bmvert_normal_update_doc, -".. method:: normal_update()\n" -"\n" -" Update vertex normal.\n" -); + ".. method:: normal_update()\n" + "\n" + " Update vertex normal.\n"); static PyObject *bpy_bmvert_normal_update(BPy_BMVert *self) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - BM_vert_normal_update(self->v); + BM_vert_normal_update(self->v); - Py_RETURN_NONE; + Py_RETURN_NONE; } - /* Edge * ---- */ PyDoc_STRVAR(bpy_bmedge_calc_length_doc, -".. method:: calc_length()\n" -"\n" -" :return: The length between both verts.\n" -" :rtype: float\n" -); + ".. method:: calc_length()\n" + "\n" + " :return: The length between both verts.\n" + " :rtype: float\n"); static PyObject *bpy_bmedge_calc_length(BPy_BMEdge *self) { - BPY_BM_CHECK_OBJ(self); - return PyFloat_FromDouble(len_v3v3(self->e->v1->co, self->e->v2->co)); + BPY_BM_CHECK_OBJ(self); + return PyFloat_FromDouble(len_v3v3(self->e->v1->co, self->e->v2->co)); } PyDoc_STRVAR(bpy_bmedge_calc_face_angle_doc, -".. method:: calc_face_angle(fallback=None)\n" -"\n" -" :arg fallback: return this when the edge doesn't have 2 faces\n" -" (instead of raising a :exc:`ValueError`).\n" -" :type fallback: any\n" -" :return: The angle between 2 connected faces in radians.\n" -" :rtype: float\n" -); + ".. method:: calc_face_angle(fallback=None)\n" + "\n" + " :arg fallback: return this when the edge doesn't have 2 faces\n" + " (instead of raising a :exc:`ValueError`).\n" + " :type fallback: any\n" + " :return: The angle between 2 connected faces in radians.\n" + " :rtype: float\n"); static PyObject *bpy_bmedge_calc_face_angle(BPy_BMEdge *self, PyObject *args) { - const float angle_invalid = -1.0f; - float angle; - PyObject *fallback = NULL; - - BPY_BM_CHECK_OBJ(self); - - if (!PyArg_ParseTuple(args, "|O:calc_face_angle", &fallback)) { - return NULL; - } - - angle = BM_edge_calc_face_angle_ex(self->e, angle_invalid); - - if (angle == angle_invalid) { - /* avoid exception */ - if (fallback) { - Py_INCREF(fallback); - return fallback; - } - else { - PyErr_SetString(PyExc_ValueError, - "BMEdge.calc_face_angle(): " - "edge doesn't use 2 faces"); - return NULL; - } - } - - return PyFloat_FromDouble(angle); -} - -PyDoc_STRVAR(bpy_bmedge_calc_face_angle_signed_doc, -".. method:: calc_face_angle_signed(fallback=None)\n" -"\n" -" :arg fallback: return this when the edge doesn't have 2 faces\n" -" (instead of raising a :exc:`ValueError`).\n" -" :type fallback: any\n" -" :return: The angle between 2 connected faces in radians (negative for concave join).\n" -" :rtype: float\n" -); + const float angle_invalid = -1.0f; + float angle; + PyObject *fallback = NULL; + + BPY_BM_CHECK_OBJ(self); + + if (!PyArg_ParseTuple(args, "|O:calc_face_angle", &fallback)) { + return NULL; + } + + angle = BM_edge_calc_face_angle_ex(self->e, angle_invalid); + + if (angle == angle_invalid) { + /* avoid exception */ + if (fallback) { + Py_INCREF(fallback); + return fallback; + } + else { + PyErr_SetString(PyExc_ValueError, + "BMEdge.calc_face_angle(): " + "edge doesn't use 2 faces"); + return NULL; + } + } + + return PyFloat_FromDouble(angle); +} + +PyDoc_STRVAR( + bpy_bmedge_calc_face_angle_signed_doc, + ".. method:: calc_face_angle_signed(fallback=None)\n" + "\n" + " :arg fallback: return this when the edge doesn't have 2 faces\n" + " (instead of raising a :exc:`ValueError`).\n" + " :type fallback: any\n" + " :return: The angle between 2 connected faces in radians (negative for concave join).\n" + " :rtype: float\n"); static PyObject *bpy_bmedge_calc_face_angle_signed(BPy_BMEdge *self, PyObject *args) { - const float angle_invalid = -FLT_MAX; - float angle; - PyObject *fallback = NULL; - - BPY_BM_CHECK_OBJ(self); - - if (!PyArg_ParseTuple(args, "|O:calc_face_angle_signed", &fallback)) { - return NULL; - } - - angle = BM_edge_calc_face_angle_signed_ex(self->e, angle_invalid); - - if (angle == angle_invalid) { - /* avoid exception */ - if (fallback) { - Py_INCREF(fallback); - return fallback; - } - else { - PyErr_SetString(PyExc_ValueError, - "BMEdge.calc_face_angle_signed(): " - "edge doesn't use 2 faces"); - return NULL; - } - } - - return PyFloat_FromDouble(angle); -} - -PyDoc_STRVAR(bpy_bmedge_calc_tangent_doc, -".. method:: calc_tangent(loop)\n" -"\n" -" Return the tangent at this edge relative to a face (pointing inward into the face).\n" -" This uses the face normal for calculation.\n" -"\n" -" :arg loop: The loop used for tangent calculation.\n" -" :type loop: :class:`BMLoop`\n" -" :return: a normalized vector.\n" -" :rtype: :class:`mathutils.Vector`\n" -); + const float angle_invalid = -FLT_MAX; + float angle; + PyObject *fallback = NULL; + + BPY_BM_CHECK_OBJ(self); + + if (!PyArg_ParseTuple(args, "|O:calc_face_angle_signed", &fallback)) { + return NULL; + } + + angle = BM_edge_calc_face_angle_signed_ex(self->e, angle_invalid); + + if (angle == angle_invalid) { + /* avoid exception */ + if (fallback) { + Py_INCREF(fallback); + return fallback; + } + else { + PyErr_SetString(PyExc_ValueError, + "BMEdge.calc_face_angle_signed(): " + "edge doesn't use 2 faces"); + return NULL; + } + } + + return PyFloat_FromDouble(angle); +} + +PyDoc_STRVAR( + bpy_bmedge_calc_tangent_doc, + ".. method:: calc_tangent(loop)\n" + "\n" + " Return the tangent at this edge relative to a face (pointing inward into the face).\n" + " This uses the face normal for calculation.\n" + "\n" + " :arg loop: The loop used for tangent calculation.\n" + " :type loop: :class:`BMLoop`\n" + " :return: a normalized vector.\n" + " :rtype: :class:`mathutils.Vector`\n"); static PyObject *bpy_bmedge_calc_tangent(BPy_BMEdge *self, PyObject *args) { - BPy_BMLoop *py_loop; - BPY_BM_CHECK_OBJ(self); - - if (!PyArg_ParseTuple(args, "O!:BMEdge.calc_face_tangent", - &BPy_BMLoop_Type, &py_loop)) - { - return NULL; - } - else { - float vec[3]; - BPY_BM_CHECK_OBJ(py_loop); - /* no need to check if they are from the same mesh or even connected */ - BM_edge_calc_face_tangent(self->e, py_loop->l, vec); - return Vector_CreatePyObject(vec, 3, NULL); - } -} - - -PyDoc_STRVAR(bpy_bmedge_other_vert_doc, -".. method:: other_vert(vert)\n" -"\n" -" Return the other vertex on this edge or None if the vertex is not used by this edge.\n" -"\n" -" :arg vert: a vert in this edge.\n" -" :type vert: :class:`BMVert`\n" -" :return: The edges other vert.\n" -" :rtype: :class:`BMVert` or None\n" -); + BPy_BMLoop *py_loop; + BPY_BM_CHECK_OBJ(self); + + if (!PyArg_ParseTuple(args, "O!:BMEdge.calc_face_tangent", &BPy_BMLoop_Type, &py_loop)) { + return NULL; + } + else { + float vec[3]; + BPY_BM_CHECK_OBJ(py_loop); + /* no need to check if they are from the same mesh or even connected */ + BM_edge_calc_face_tangent(self->e, py_loop->l, vec); + return Vector_CreatePyObject(vec, 3, NULL); + } +} + +PyDoc_STRVAR( + bpy_bmedge_other_vert_doc, + ".. method:: other_vert(vert)\n" + "\n" + " Return the other vertex on this edge or None if the vertex is not used by this edge.\n" + "\n" + " :arg vert: a vert in this edge.\n" + " :type vert: :class:`BMVert`\n" + " :return: The edges other vert.\n" + " :rtype: :class:`BMVert` or None\n"); static PyObject *bpy_bmedge_other_vert(BPy_BMEdge *self, BPy_BMVert *value) { - BMVert *other; - BPY_BM_CHECK_OBJ(self); + BMVert *other; + BPY_BM_CHECK_OBJ(self); - if (!BPy_BMVert_Check(value)) { - PyErr_Format(PyExc_TypeError, - "BMEdge.other_vert(vert): BMVert expected, not '%.200s'", - Py_TYPE(value)->tp_name); - return NULL; - } + if (!BPy_BMVert_Check(value)) { + PyErr_Format(PyExc_TypeError, + "BMEdge.other_vert(vert): BMVert expected, not '%.200s'", + Py_TYPE(value)->tp_name); + return NULL; + } - BPY_BM_CHECK_SOURCE_OBJ(self->bm, "BMEdge.other_vert(vert)", value); + BPY_BM_CHECK_SOURCE_OBJ(self->bm, "BMEdge.other_vert(vert)", value); - other = BM_edge_other_vert(self->e, value->v); + other = BM_edge_other_vert(self->e, value->v); - if (other) { - return BPy_BMVert_CreatePyObject(self->bm, other); - } - else { - /* could raise an exception here */ - Py_RETURN_NONE; - } + if (other) { + return BPy_BMVert_CreatePyObject(self->bm, other); + } + else { + /* could raise an exception here */ + Py_RETURN_NONE; + } } - PyDoc_STRVAR(bpy_bmedge_normal_update_doc, -".. method:: normal_update()\n" -"\n" -" Update edges vertex normals.\n" -); + ".. method:: normal_update()\n" + "\n" + " Update edges vertex normals.\n"); static PyObject *bpy_bmedge_normal_update(BPy_BMEdge *self) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - BM_edge_normals_update(self->e); + BM_edge_normals_update(self->e); - Py_RETURN_NONE; + Py_RETURN_NONE; } - /* Face * ---- */ -PyDoc_STRVAR(bpy_bmface_copy_from_face_interp_doc, -".. method:: copy_from_face_interp(face, vert=True)\n" -"\n" -" Interpolate the customdata from another face onto this one (faces should overlap).\n" -"\n" -" :arg face: The face to interpolate data from.\n" -" :type face: :class:`BMFace`\n" -" :arg vert: When True, also copy vertex data.\n" -" :type vert: boolean\n" -); +PyDoc_STRVAR( + bpy_bmface_copy_from_face_interp_doc, + ".. method:: copy_from_face_interp(face, vert=True)\n" + "\n" + " Interpolate the customdata from another face onto this one (faces should overlap).\n" + "\n" + " :arg face: The face to interpolate data from.\n" + " :type face: :class:`BMFace`\n" + " :arg vert: When True, also copy vertex data.\n" + " :type vert: boolean\n"); static PyObject *bpy_bmface_copy_from_face_interp(BPy_BMFace *self, PyObject *args) { - BPy_BMFace *py_face = NULL; - bool do_vertex = true; + BPy_BMFace *py_face = NULL; + bool do_vertex = true; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (!PyArg_ParseTuple( - args, "O!|O&:BMFace.copy_from_face_interp", - &BPy_BMFace_Type, &py_face, - PyC_ParseBool, &do_vertex)) - { - return NULL; - } - else { - BMesh *bm = self->bm; + if (!PyArg_ParseTuple(args, + "O!|O&:BMFace.copy_from_face_interp", + &BPy_BMFace_Type, + &py_face, + PyC_ParseBool, + &do_vertex)) { + return NULL; + } + else { + BMesh *bm = self->bm; - BPY_BM_CHECK_SOURCE_OBJ(bm, "BMFace.copy_from_face_interp(face)", py_face); + BPY_BM_CHECK_SOURCE_OBJ(bm, "BMFace.copy_from_face_interp(face)", py_face); - BM_face_interp_from_face(bm, self->f, py_face->f, do_vertex); + BM_face_interp_from_face(bm, self->f, py_face->f, do_vertex); - Py_RETURN_NONE; - } + Py_RETURN_NONE; + } } - PyDoc_STRVAR(bpy_bmface_copy_doc, -".. method:: copy(verts=True, edges=True)\n" -"\n" -" Make a copy of this face.\n" -"\n" -" :arg verts: When set, the faces verts will be duplicated too.\n" -" :type verts: boolean\n" -" :arg edges: When set, the faces edges will be duplicated too.\n" -" :type edges: boolean\n" -" :return: The newly created face.\n" -" :rtype: :class:`BMFace`\n" -); + ".. method:: copy(verts=True, edges=True)\n" + "\n" + " Make a copy of this face.\n" + "\n" + " :arg verts: When set, the faces verts will be duplicated too.\n" + " :type verts: boolean\n" + " :arg edges: When set, the faces edges will be duplicated too.\n" + " :type edges: boolean\n" + " :return: The newly created face.\n" + " :rtype: :class:`BMFace`\n"); static PyObject *bpy_bmface_copy(BPy_BMFace *self, PyObject *args, PyObject *kw) { - static const char *kwlist[] = {"verts", "edges", NULL}; + static const char *kwlist[] = {"verts", "edges", NULL}; - BMesh *bm = self->bm; - bool do_verts = true; - bool do_edges = true; + BMesh *bm = self->bm; + bool do_verts = true; + bool do_edges = true; - BMFace *f_cpy; - BPY_BM_CHECK_OBJ(self); + BMFace *f_cpy; + BPY_BM_CHECK_OBJ(self); - if (!PyArg_ParseTupleAndKeywords( - args, kw, - "|O&O&:BMFace.copy", (char **)kwlist, - PyC_ParseBool, &do_verts, - PyC_ParseBool, &do_edges)) - { - return NULL; - } + if (!PyArg_ParseTupleAndKeywords(args, + kw, + "|O&O&:BMFace.copy", + (char **)kwlist, + PyC_ParseBool, + &do_verts, + PyC_ParseBool, + &do_edges)) { + return NULL; + } - f_cpy = BM_face_copy(bm, bm, self->f, do_verts, do_edges); + f_cpy = BM_face_copy(bm, bm, self->f, do_verts, do_edges); - if (f_cpy) { - return BPy_BMFace_CreatePyObject(bm, f_cpy); - } - else { - PyErr_SetString(PyExc_ValueError, - "BMFace.copy(): couldn't create the new face, internal error"); - return NULL; - } + if (f_cpy) { + return BPy_BMFace_CreatePyObject(bm, f_cpy); + } + else { + PyErr_SetString(PyExc_ValueError, + "BMFace.copy(): couldn't create the new face, internal error"); + return NULL; + } } - PyDoc_STRVAR(bpy_bmface_calc_area_doc, -".. method:: calc_area()\n" -"\n" -" Return the area of the face.\n" -"\n" -" :return: Return the area of the face.\n" -" :rtype: float\n" -); + ".. method:: calc_area()\n" + "\n" + " Return the area of the face.\n" + "\n" + " :return: Return the area of the face.\n" + " :rtype: float\n"); static PyObject *bpy_bmface_calc_area(BPy_BMFace *self) { - BPY_BM_CHECK_OBJ(self); - return PyFloat_FromDouble(BM_face_calc_area(self->f)); + BPY_BM_CHECK_OBJ(self); + return PyFloat_FromDouble(BM_face_calc_area(self->f)); } - PyDoc_STRVAR(bpy_bmface_calc_perimeter_doc, -".. method:: calc_perimeter()\n" -"\n" -" Return the perimeter of the face.\n" -"\n" -" :return: Return the perimeter of the face.\n" -" :rtype: float\n" -); + ".. method:: calc_perimeter()\n" + "\n" + " Return the perimeter of the face.\n" + "\n" + " :return: Return the perimeter of the face.\n" + " :rtype: float\n"); static PyObject *bpy_bmface_calc_perimeter(BPy_BMFace *self) { - BPY_BM_CHECK_OBJ(self); - return PyFloat_FromDouble(BM_face_calc_perimeter(self->f)); + BPY_BM_CHECK_OBJ(self); + return PyFloat_FromDouble(BM_face_calc_perimeter(self->f)); } - PyDoc_STRVAR(bpy_bmface_calc_tangent_edge_doc, -".. method:: calc_tangent_edge()\n" -"\n" -" Return face tangent based on longest edge.\n" -"\n" -" :return: a normalized vector.\n" -" :rtype: :class:`mathutils.Vector`\n" -); + ".. method:: calc_tangent_edge()\n" + "\n" + " Return face tangent based on longest edge.\n" + "\n" + " :return: a normalized vector.\n" + " :rtype: :class:`mathutils.Vector`\n"); static PyObject *bpy_bmface_calc_tangent_edge(BPy_BMFace *self) { - float tangent[3]; + float tangent[3]; - BPY_BM_CHECK_OBJ(self); - BM_face_calc_tangent_edge(self->f, tangent); - return Vector_CreatePyObject(tangent, 3, NULL); + BPY_BM_CHECK_OBJ(self); + BM_face_calc_tangent_edge(self->f, tangent); + return Vector_CreatePyObject(tangent, 3, NULL); } - PyDoc_STRVAR(bpy_bmface_calc_tangent_edge_pair_doc, -".. method:: calc_tangent_edge_pair()\n" -"\n" -" Return face tangent based on the two longest disconnected edges.\n" -"\n" -" - Tris: Use the edge pair with the most similar lengths.\n" -" - Quads: Use the longest edge pair.\n" -" - NGons: Use the two longest disconnected edges.\n" -"\n" -" :return: a normalized vector.\n" -" :rtype: :class:`mathutils.Vector`\n" -); + ".. method:: calc_tangent_edge_pair()\n" + "\n" + " Return face tangent based on the two longest disconnected edges.\n" + "\n" + " - Tris: Use the edge pair with the most similar lengths.\n" + " - Quads: Use the longest edge pair.\n" + " - NGons: Use the two longest disconnected edges.\n" + "\n" + " :return: a normalized vector.\n" + " :rtype: :class:`mathutils.Vector`\n"); static PyObject *bpy_bmface_calc_tangent_edge_pair(BPy_BMFace *self) { - float tangent[3]; + float tangent[3]; - BPY_BM_CHECK_OBJ(self); - BM_face_calc_tangent_edge_pair(self->f, tangent); - return Vector_CreatePyObject(tangent, 3, NULL); + BPY_BM_CHECK_OBJ(self); + BM_face_calc_tangent_edge_pair(self->f, tangent); + return Vector_CreatePyObject(tangent, 3, NULL); } - PyDoc_STRVAR(bpy_bmface_calc_tangent_edge_diagonal_doc, -".. method:: calc_tangent_edge_diagonal()\n" -"\n" -" Return face tangent based on the edge farthest from any vertex.\n" -"\n" -" :return: a normalized vector.\n" -" :rtype: :class:`mathutils.Vector`\n" -); + ".. method:: calc_tangent_edge_diagonal()\n" + "\n" + " Return face tangent based on the edge farthest from any vertex.\n" + "\n" + " :return: a normalized vector.\n" + " :rtype: :class:`mathutils.Vector`\n"); static PyObject *bpy_bmface_calc_tangent_edge_diagonal(BPy_BMFace *self) { - float tangent[3]; + float tangent[3]; - BPY_BM_CHECK_OBJ(self); - BM_face_calc_tangent_edge_diagonal(self->f, tangent); - return Vector_CreatePyObject(tangent, 3, NULL); + BPY_BM_CHECK_OBJ(self); + BM_face_calc_tangent_edge_diagonal(self->f, tangent); + return Vector_CreatePyObject(tangent, 3, NULL); } - PyDoc_STRVAR(bpy_bmface_calc_tangent_vert_diagonal_doc, -".. method:: calc_tangent_vert_diagonal()\n" -"\n" -" Return face tangent based on the two most distent vertices.\n" -"\n" -" :return: a normalized vector.\n" -" :rtype: :class:`mathutils.Vector`\n" -); + ".. method:: calc_tangent_vert_diagonal()\n" + "\n" + " Return face tangent based on the two most distent vertices.\n" + "\n" + " :return: a normalized vector.\n" + " :rtype: :class:`mathutils.Vector`\n"); static PyObject *bpy_bmface_calc_tangent_vert_diagonal(BPy_BMFace *self) { - float tangent[3]; + float tangent[3]; - BPY_BM_CHECK_OBJ(self); - BM_face_calc_tangent_vert_diagonal(self->f, tangent); - return Vector_CreatePyObject(tangent, 3, NULL); + BPY_BM_CHECK_OBJ(self); + BM_face_calc_tangent_vert_diagonal(self->f, tangent); + return Vector_CreatePyObject(tangent, 3, NULL); } - PyDoc_STRVAR(bpy_bmface_calc_center_median_doc, -".. method:: calc_center_median()\n" -"\n" -" Return median center of the face.\n" -"\n" -" :return: a 3D vector.\n" -" :rtype: :class:`mathutils.Vector`\n" -); + ".. method:: calc_center_median()\n" + "\n" + " Return median center of the face.\n" + "\n" + " :return: a 3D vector.\n" + " :rtype: :class:`mathutils.Vector`\n"); static PyObject *bpy_bmface_calc_center_mean(BPy_BMFace *self) { - float cent[3]; + float cent[3]; - BPY_BM_CHECK_OBJ(self); - BM_face_calc_center_median(self->f, cent); - return Vector_CreatePyObject(cent, 3, NULL); + BPY_BM_CHECK_OBJ(self); + BM_face_calc_center_median(self->f, cent); + return Vector_CreatePyObject(cent, 3, NULL); } PyDoc_STRVAR(bpy_bmface_calc_center_median_weighted_doc, -".. method:: calc_center_median_weighted()\n" -"\n" -" Return median center of the face weighted by edge lengths.\n" -"\n" -" :return: a 3D vector.\n" -" :rtype: :class:`mathutils.Vector`\n" -); + ".. method:: calc_center_median_weighted()\n" + "\n" + " Return median center of the face weighted by edge lengths.\n" + "\n" + " :return: a 3D vector.\n" + " :rtype: :class:`mathutils.Vector`\n"); static PyObject *bpy_bmface_calc_center_median_weighted(BPy_BMFace *self) { - float cent[3]; + float cent[3]; - BPY_BM_CHECK_OBJ(self); - BM_face_calc_center_median_weighted(self->f, cent); - return Vector_CreatePyObject(cent, 3, NULL); + BPY_BM_CHECK_OBJ(self); + BM_face_calc_center_median_weighted(self->f, cent); + return Vector_CreatePyObject(cent, 3, NULL); } PyDoc_STRVAR(bpy_bmface_calc_center_bounds_doc, -".. method:: calc_center_bounds()\n" -"\n" -" Return bounds center of the face.\n" -"\n" -" :return: a 3D vector.\n" -" :rtype: :class:`mathutils.Vector`\n" -); + ".. method:: calc_center_bounds()\n" + "\n" + " Return bounds center of the face.\n" + "\n" + " :return: a 3D vector.\n" + " :rtype: :class:`mathutils.Vector`\n"); static PyObject *bpy_bmface_calc_center_bounds(BPy_BMFace *self) { - float cent[3]; + float cent[3]; - BPY_BM_CHECK_OBJ(self); - BM_face_calc_center_bounds(self->f, cent); - return Vector_CreatePyObject(cent, 3, NULL); + BPY_BM_CHECK_OBJ(self); + BM_face_calc_center_bounds(self->f, cent); + return Vector_CreatePyObject(cent, 3, NULL); } - PyDoc_STRVAR(bpy_bmface_normal_update_doc, -".. method:: normal_update()\n" -"\n" -" Update face's normal.\n" -); + ".. method:: normal_update()\n" + "\n" + " Update face's normal.\n"); static PyObject *bpy_bmface_normal_update(BPy_BMFace *self) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - BM_face_normal_update(self->f); + BM_face_normal_update(self->f); - Py_RETURN_NONE; + Py_RETURN_NONE; } - PyDoc_STRVAR(bpy_bmface_normal_flip_doc, -".. method:: normal_flip()\n" -"\n" -" Reverses winding of a face, which flips its normal.\n" -); + ".. method:: normal_flip()\n" + "\n" + " Reverses winding of a face, which flips its normal.\n"); static PyObject *bpy_bmface_normal_flip(BPy_BMFace *self) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - BM_face_normal_flip(self->bm, self->f); + BM_face_normal_flip(self->bm, self->f); - Py_RETURN_NONE; + Py_RETURN_NONE; } - /* Loop * ---- */ PyDoc_STRVAR(bpy_bmloop_copy_from_face_interp_doc, -".. method:: copy_from_face_interp(face, vert=True, multires=True)\n" -"\n" -" Interpolate the customdata from a face onto this loop (the loops vert should overlap the face).\n" -"\n" -" :arg face: The face to interpolate data from.\n" -" :type face: :class:`BMFace`\n" -" :arg vert: When enabled, interpolate the loops vertex data (optional).\n" -" :type vert: boolean\n" -" :arg multires: When enabled, interpolate the loops multires data (optional).\n" -" :type multires: boolean\n" -); + ".. method:: copy_from_face_interp(face, vert=True, multires=True)\n" + "\n" + " Interpolate the customdata from a face onto this loop (the loops vert should " + "overlap the face).\n" + "\n" + " :arg face: The face to interpolate data from.\n" + " :type face: :class:`BMFace`\n" + " :arg vert: When enabled, interpolate the loops vertex data (optional).\n" + " :type vert: boolean\n" + " :arg multires: When enabled, interpolate the loops multires data (optional).\n" + " :type multires: boolean\n"); static PyObject *bpy_bmloop_copy_from_face_interp(BPy_BMLoop *self, PyObject *args) { - BPy_BMFace *py_face = NULL; - bool do_vertex = true; - bool do_multires = true; + BPy_BMFace *py_face = NULL; + bool do_vertex = true; + bool do_multires = true; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (!PyArg_ParseTuple( - args, "O!|O&O&:BMLoop.copy_from_face_interp", - &BPy_BMFace_Type, &py_face, - PyC_ParseBool, &do_vertex, - PyC_ParseBool, &do_multires)) - { - return NULL; - } - else { - BMesh *bm = self->bm; + if (!PyArg_ParseTuple(args, + "O!|O&O&:BMLoop.copy_from_face_interp", + &BPy_BMFace_Type, + &py_face, + PyC_ParseBool, + &do_vertex, + PyC_ParseBool, + &do_multires)) { + return NULL; + } + else { + BMesh *bm = self->bm; - BPY_BM_CHECK_SOURCE_OBJ(bm, "BMLoop.copy_from_face_interp(face)", py_face); + BPY_BM_CHECK_SOURCE_OBJ(bm, "BMLoop.copy_from_face_interp(face)", py_face); - BM_loop_interp_from_face(bm, self->l, py_face->f, do_vertex, do_multires); + BM_loop_interp_from_face(bm, self->l, py_face->f, do_vertex, do_multires); - Py_RETURN_NONE; - } + Py_RETURN_NONE; + } } - PyDoc_STRVAR(bpy_bmloop_calc_angle_doc, -".. method:: calc_angle()\n" -"\n" -" Return the angle at this loops corner of the face.\n" -" This is calculated so sharper corners give lower angles.\n" -"\n" -" :return: The angle in radians.\n" -" :rtype: float\n" -); + ".. method:: calc_angle()\n" + "\n" + " Return the angle at this loops corner of the face.\n" + " This is calculated so sharper corners give lower angles.\n" + "\n" + " :return: The angle in radians.\n" + " :rtype: float\n"); static PyObject *bpy_bmloop_calc_angle(BPy_BMLoop *self) { - BPY_BM_CHECK_OBJ(self); - return PyFloat_FromDouble(BM_loop_calc_face_angle(self->l)); + BPY_BM_CHECK_OBJ(self); + return PyFloat_FromDouble(BM_loop_calc_face_angle(self->l)); } PyDoc_STRVAR(bpy_bmloop_calc_normal_doc, -".. method:: calc_normal()\n" -"\n" -" Return normal at this loops corner of the face.\n" -" Falls back to the face normal for straight lines.\n" -"\n" -" :return: a normalized vector.\n" -" :rtype: :class:`mathutils.Vector`\n" -); + ".. method:: calc_normal()\n" + "\n" + " Return normal at this loops corner of the face.\n" + " Falls back to the face normal for straight lines.\n" + "\n" + " :return: a normalized vector.\n" + " :rtype: :class:`mathutils.Vector`\n"); static PyObject *bpy_bmloop_calc_normal(BPy_BMLoop *self) { - float vec[3]; - BPY_BM_CHECK_OBJ(self); - BM_loop_calc_face_normal(self->l, vec); - return Vector_CreatePyObject(vec, 3, NULL); -} - -PyDoc_STRVAR(bpy_bmloop_calc_tangent_doc, -".. method:: calc_tangent()\n" -"\n" -" Return the tangent at this loops corner of the face (pointing inward into the face).\n" -" Falls back to the face normal for straight lines.\n" -"\n" -" :return: a normalized vector.\n" -" :rtype: :class:`mathutils.Vector`\n" -); + float vec[3]; + BPY_BM_CHECK_OBJ(self); + BM_loop_calc_face_normal(self->l, vec); + return Vector_CreatePyObject(vec, 3, NULL); +} + +PyDoc_STRVAR( + bpy_bmloop_calc_tangent_doc, + ".. method:: calc_tangent()\n" + "\n" + " Return the tangent at this loops corner of the face (pointing inward into the face).\n" + " Falls back to the face normal for straight lines.\n" + "\n" + " :return: a normalized vector.\n" + " :rtype: :class:`mathutils.Vector`\n"); static PyObject *bpy_bmloop_calc_tangent(BPy_BMLoop *self) { - float vec[3]; - BPY_BM_CHECK_OBJ(self); - BM_loop_calc_face_tangent(self->l, vec); - return Vector_CreatePyObject(vec, 3, NULL); + float vec[3]; + BPY_BM_CHECK_OBJ(self); + BM_loop_calc_face_tangent(self->l, vec); + return Vector_CreatePyObject(vec, 3, NULL); } /* Vert Seq * -------- */ PyDoc_STRVAR(bpy_bmvertseq_new_doc, -".. method:: new(co=(0.0, 0.0, 0.0), example=None)\n" -"\n" -" Create a new vertex.\n" -"\n" -" :arg co: The initial location of the vertex (optional argument).\n" -" :type co: float triplet\n" -" :arg example: Existing vert to initialize settings.\n" -" :type example: :class:`BMVert`\n" -" :return: The newly created edge.\n" -" :rtype: :class:`BMVert`\n" -); + ".. method:: new(co=(0.0, 0.0, 0.0), example=None)\n" + "\n" + " Create a new vertex.\n" + "\n" + " :arg co: The initial location of the vertex (optional argument).\n" + " :type co: float triplet\n" + " :arg example: Existing vert to initialize settings.\n" + " :type example: :class:`BMVert`\n" + " :return: The newly created edge.\n" + " :rtype: :class:`BMVert`\n"); static PyObject *bpy_bmvertseq_new(BPy_BMElemSeq *self, PyObject *args) { - PyObject *py_co = NULL; - BPy_BMVert *py_vert_example = NULL; /* optional */ + PyObject *py_co = NULL; + BPy_BMVert *py_vert_example = NULL; /* optional */ - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (!PyArg_ParseTuple(args, "|OO!:verts.new", - &py_co, - &BPy_BMVert_Type, &py_vert_example)) - { - return NULL; - } - else { - BMesh *bm = self->bm; - BMVert *v; - float co[3] = {0.0f, 0.0f, 0.0f}; + if (!PyArg_ParseTuple(args, "|OO!:verts.new", &py_co, &BPy_BMVert_Type, &py_vert_example)) { + return NULL; + } + else { + BMesh *bm = self->bm; + BMVert *v; + float co[3] = {0.0f, 0.0f, 0.0f}; - if (py_vert_example) { - BPY_BM_CHECK_OBJ(py_vert_example); - } + if (py_vert_example) { + BPY_BM_CHECK_OBJ(py_vert_example); + } - if (py_co && mathutils_array_parse(co, 3, 3, py_co, "verts.new(co)") == -1) { - return NULL; - } + if (py_co && mathutils_array_parse(co, 3, 3, py_co, "verts.new(co)") == -1) { + return NULL; + } - v = BM_vert_create(bm, co, NULL, BM_CREATE_NOP); + v = BM_vert_create(bm, co, NULL, BM_CREATE_NOP); - if (v == NULL) { - PyErr_SetString(PyExc_ValueError, - "faces.new(verts): couldn't create the new face, internal error"); - return NULL; - } + if (v == NULL) { + PyErr_SetString(PyExc_ValueError, + "faces.new(verts): couldn't create the new face, internal error"); + return NULL; + } - if (py_vert_example) { - BM_elem_attrs_copy(py_vert_example->bm, bm, py_vert_example->v, v); - } + if (py_vert_example) { + BM_elem_attrs_copy(py_vert_example->bm, bm, py_vert_example->v, v); + } - return BPy_BMVert_CreatePyObject(bm, v); - } + return BPy_BMVert_CreatePyObject(bm, v); + } } - /* Edge Seq * -------- */ PyDoc_STRVAR(bpy_bmedgeseq_new_doc, -".. method:: new(verts, example=None)\n" -"\n" -" Create a new edge from a given pair of verts.\n" -"\n" -" :arg verts: Vertex pair.\n" -" :type verts: pair of :class:`BMVert`\n" -" :arg example: Existing edge to initialize settings (optional argument).\n" -" :type example: :class:`BMEdge`\n" -" :return: The newly created edge.\n" -" :rtype: :class:`BMEdge`\n" -); + ".. method:: new(verts, example=None)\n" + "\n" + " Create a new edge from a given pair of verts.\n" + "\n" + " :arg verts: Vertex pair.\n" + " :type verts: pair of :class:`BMVert`\n" + " :arg example: Existing edge to initialize settings (optional argument).\n" + " :type example: :class:`BMEdge`\n" + " :return: The newly created edge.\n" + " :rtype: :class:`BMEdge`\n"); static PyObject *bpy_bmedgeseq_new(BPy_BMElemSeq *self, PyObject *args) { - PyObject *vert_seq; - BPy_BMEdge *py_edge_example = NULL; /* optional */ + PyObject *vert_seq; + BPy_BMEdge *py_edge_example = NULL; /* optional */ - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (!PyArg_ParseTuple(args, "O|O!:edges.new", - &vert_seq, - &BPy_BMEdge_Type, &py_edge_example)) - { - return NULL; - } - else { - BMesh *bm = self->bm; - BMEdge *e; - BMVert **vert_array = NULL; - Py_ssize_t vert_seq_len; /* always 2 */ - PyObject *ret = NULL; + if (!PyArg_ParseTuple(args, "O|O!:edges.new", &vert_seq, &BPy_BMEdge_Type, &py_edge_example)) { + return NULL; + } + else { + BMesh *bm = self->bm; + BMEdge *e; + BMVert **vert_array = NULL; + Py_ssize_t vert_seq_len; /* always 2 */ + PyObject *ret = NULL; - if (py_edge_example) { - BPY_BM_CHECK_OBJ(py_edge_example); - } + if (py_edge_example) { + BPY_BM_CHECK_OBJ(py_edge_example); + } - vert_array = BPy_BMElem_PySeq_As_Array(&bm, vert_seq, 2, 2, - &vert_seq_len, BM_VERT, - true, true, "edges.new(...)"); + vert_array = BPy_BMElem_PySeq_As_Array( + &bm, vert_seq, 2, 2, &vert_seq_len, BM_VERT, true, true, "edges.new(...)"); - if (vert_array == NULL) { - return NULL; - } + if (vert_array == NULL) { + return NULL; + } - if (BM_edge_exists(vert_array[0], vert_array[1])) { - PyErr_SetString(PyExc_ValueError, - "edges.new(): this edge exists"); - goto cleanup; - } + if (BM_edge_exists(vert_array[0], vert_array[1])) { + PyErr_SetString(PyExc_ValueError, "edges.new(): this edge exists"); + goto cleanup; + } - e = BM_edge_create(bm, vert_array[0], vert_array[1], NULL, BM_CREATE_NOP); + e = BM_edge_create(bm, vert_array[0], vert_array[1], NULL, BM_CREATE_NOP); - if (e == NULL) { - PyErr_SetString(PyExc_ValueError, - "faces.new(verts): couldn't create the new face, internal error"); - goto cleanup; - } + if (e == NULL) { + PyErr_SetString(PyExc_ValueError, + "faces.new(verts): couldn't create the new face, internal error"); + goto cleanup; + } - if (py_edge_example) { - BM_elem_attrs_copy(py_edge_example->bm, bm, py_edge_example->e, e); - } + if (py_edge_example) { + BM_elem_attrs_copy(py_edge_example->bm, bm, py_edge_example->e, e); + } - ret = BPy_BMEdge_CreatePyObject(bm, e); + ret = BPy_BMEdge_CreatePyObject(bm, e); -cleanup: - if (vert_array) { - PyMem_FREE(vert_array); - } - return ret; - } + cleanup: + if (vert_array) { + PyMem_FREE(vert_array); + } + return ret; + } } - /* Face Seq * -------- */ PyDoc_STRVAR(bpy_bmfaceseq_new_doc, -".. method:: new(verts, example=None)\n" -"\n" -" Create a new face from a given set of verts.\n" -"\n" -" :arg verts: Sequence of 3 or more verts.\n" -" :type verts: :class:`BMVert`\n" -" :arg example: Existing face to initialize settings (optional argument).\n" -" :type example: :class:`BMFace`\n" -" :return: The newly created face.\n" -" :rtype: :class:`BMFace`\n" -); + ".. method:: new(verts, example=None)\n" + "\n" + " Create a new face from a given set of verts.\n" + "\n" + " :arg verts: Sequence of 3 or more verts.\n" + " :type verts: :class:`BMVert`\n" + " :arg example: Existing face to initialize settings (optional argument).\n" + " :type example: :class:`BMFace`\n" + " :return: The newly created face.\n" + " :rtype: :class:`BMFace`\n"); static PyObject *bpy_bmfaceseq_new(BPy_BMElemSeq *self, PyObject *args) { - PyObject *vert_seq; - BPy_BMFace *py_face_example = NULL; /* optional */ + PyObject *vert_seq; + BPy_BMFace *py_face_example = NULL; /* optional */ - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (!PyArg_ParseTuple(args, "O|O!:faces.new", - &vert_seq, - &BPy_BMFace_Type, &py_face_example)) - { - return NULL; - } - else { - BMesh *bm = self->bm; - Py_ssize_t vert_seq_len; + if (!PyArg_ParseTuple(args, "O|O!:faces.new", &vert_seq, &BPy_BMFace_Type, &py_face_example)) { + return NULL; + } + else { + BMesh *bm = self->bm; + Py_ssize_t vert_seq_len; - BMVert **vert_array = NULL; + BMVert **vert_array = NULL; - PyObject *ret = NULL; + PyObject *ret = NULL; - BMFace *f_new; + BMFace *f_new; - if (py_face_example) { - BPY_BM_CHECK_OBJ(py_face_example); - } + if (py_face_example) { + BPY_BM_CHECK_OBJ(py_face_example); + } - vert_array = BPy_BMElem_PySeq_As_Array(&bm, vert_seq, 3, PY_SSIZE_T_MAX, - &vert_seq_len, BM_VERT, - true, true, "faces.new(...)"); + vert_array = BPy_BMElem_PySeq_As_Array( + &bm, vert_seq, 3, PY_SSIZE_T_MAX, &vert_seq_len, BM_VERT, true, true, "faces.new(...)"); - if (vert_array == NULL) { - return NULL; - } + if (vert_array == NULL) { + return NULL; + } - /* check if the face exists */ - if (BM_face_exists(vert_array, vert_seq_len) != NULL) { - PyErr_SetString(PyExc_ValueError, - "faces.new(verts): face already exists"); - goto cleanup; - } + /* check if the face exists */ + if (BM_face_exists(vert_array, vert_seq_len) != NULL) { + PyErr_SetString(PyExc_ValueError, "faces.new(verts): face already exists"); + goto cleanup; + } - /* Go ahead and make the face! - * --------------------------- */ + /* Go ahead and make the face! + * --------------------------- */ - f_new = BM_face_create_verts(bm, vert_array, vert_seq_len, - py_face_example ? py_face_example->f : NULL, BM_CREATE_NOP, true); + f_new = BM_face_create_verts(bm, + vert_array, + vert_seq_len, + py_face_example ? py_face_example->f : NULL, + BM_CREATE_NOP, + true); - if (UNLIKELY(f_new == NULL)) { - PyErr_SetString(PyExc_ValueError, - "faces.new(verts): couldn't create the new face, internal error"); - goto cleanup; - } + if (UNLIKELY(f_new == NULL)) { + PyErr_SetString(PyExc_ValueError, + "faces.new(verts): couldn't create the new face, internal error"); + goto cleanup; + } - ret = BPy_BMFace_CreatePyObject(bm, f_new); + ret = BPy_BMFace_CreatePyObject(bm, f_new); - /* pass through */ -cleanup: - if (vert_array) { - PyMem_FREE(vert_array); - } - return ret; - } + /* pass through */ + cleanup: + if (vert_array) { + PyMem_FREE(vert_array); + } + return ret; + } } /* Elem Seq * -------- */ PyDoc_STRVAR(bpy_bmvertseq_remove_doc, -".. method:: remove(vert)\n" -"\n" -" Remove a vert.\n" -); + ".. method:: remove(vert)\n" + "\n" + " Remove a vert.\n"); static PyObject *bpy_bmvertseq_remove(BPy_BMElemSeq *self, BPy_BMVert *value) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (!BPy_BMVert_Check(value)) { - return NULL; - } - else { - BMesh *bm = self->bm; + if (!BPy_BMVert_Check(value)) { + return NULL; + } + else { + BMesh *bm = self->bm; - BPY_BM_CHECK_SOURCE_OBJ(bm, "verts.remove(vert)", value); + BPY_BM_CHECK_SOURCE_OBJ(bm, "verts.remove(vert)", value); - BM_vert_kill(bm, value->v); - bpy_bm_generic_invalidate((BPy_BMGeneric *)value); + BM_vert_kill(bm, value->v); + bpy_bm_generic_invalidate((BPy_BMGeneric *)value); - Py_RETURN_NONE; - } + Py_RETURN_NONE; + } } PyDoc_STRVAR(bpy_bmedgeseq_remove_doc, -".. method:: remove(edge)\n" -"\n" -" Remove an edge.\n" -); + ".. method:: remove(edge)\n" + "\n" + " Remove an edge.\n"); static PyObject *bpy_bmedgeseq_remove(BPy_BMElemSeq *self, BPy_BMEdge *value) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (!BPy_BMEdge_Check(value)) { - return NULL; - } - else { - BMesh *bm = self->bm; + if (!BPy_BMEdge_Check(value)) { + return NULL; + } + else { + BMesh *bm = self->bm; - BPY_BM_CHECK_SOURCE_OBJ(bm, "edges.remove(edges)", value); + BPY_BM_CHECK_SOURCE_OBJ(bm, "edges.remove(edges)", value); - BM_edge_kill(bm, value->e); - bpy_bm_generic_invalidate((BPy_BMGeneric *)value); + BM_edge_kill(bm, value->e); + bpy_bm_generic_invalidate((BPy_BMGeneric *)value); - Py_RETURN_NONE; - } + Py_RETURN_NONE; + } } PyDoc_STRVAR(bpy_bmfaceseq_remove_doc, -".. method:: remove(face)\n" -"\n" -" Remove a face.\n" -); + ".. method:: remove(face)\n" + "\n" + " Remove a face.\n"); static PyObject *bpy_bmfaceseq_remove(BPy_BMElemSeq *self, BPy_BMFace *value) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - if (!BPy_BMFace_Check(value)) { - return NULL; - } - else { - BMesh *bm = self->bm; + if (!BPy_BMFace_Check(value)) { + return NULL; + } + else { + BMesh *bm = self->bm; - BPY_BM_CHECK_SOURCE_OBJ(bm, "faces.remove(face)", value); + BPY_BM_CHECK_SOURCE_OBJ(bm, "faces.remove(face)", value); - BM_face_kill(bm, value->f); - bpy_bm_generic_invalidate((BPy_BMGeneric *)value); + BM_face_kill(bm, value->f); + bpy_bm_generic_invalidate((BPy_BMGeneric *)value); - Py_RETURN_NONE; - } + Py_RETURN_NONE; + } } PyDoc_STRVAR(bpy_bmedgeseq_get__method_doc, -".. method:: get(verts, fallback=None)\n" -"\n" -" Return an edge which uses the **verts** passed.\n" -"\n" -" :arg verts: Sequence of verts.\n" -" :type verts: :class:`BMVert`\n" -" :arg fallback: Return this value if nothing is found.\n" -" :return: The edge found or None\n" -" :rtype: :class:`BMEdge`\n" -); + ".. method:: get(verts, fallback=None)\n" + "\n" + " Return an edge which uses the **verts** passed.\n" + "\n" + " :arg verts: Sequence of verts.\n" + " :type verts: :class:`BMVert`\n" + " :arg fallback: Return this value if nothing is found.\n" + " :return: The edge found or None\n" + " :rtype: :class:`BMEdge`\n"); static PyObject *bpy_bmedgeseq_get__method(BPy_BMElemSeq *self, PyObject *args) { - PyObject *vert_seq; - PyObject *fallback = Py_None; /* optional */ - - BPY_BM_CHECK_OBJ(self); - - if (!PyArg_ParseTuple(args, "O|O:edges.get", - &vert_seq, - &fallback)) - { - return NULL; - } - else { - BMesh *bm = self->bm; - BMEdge *e; - BMVert **vert_array = NULL; - Py_ssize_t vert_seq_len; /* always 2 */ - PyObject *ret = NULL; - - vert_array = BPy_BMElem_PySeq_As_Array(&bm, vert_seq, 2, 2, - &vert_seq_len, BM_VERT, - true, true, "edges.get(...)"); - - if (vert_array == NULL) { - return NULL; - } - - if ((e = BM_edge_exists(vert_array[0], vert_array[1]))) { - ret = BPy_BMEdge_CreatePyObject(bm, e); - } - else { - ret = fallback; - Py_INCREF(ret); - } - - PyMem_FREE(vert_array); - return ret; - } + PyObject *vert_seq; + PyObject *fallback = Py_None; /* optional */ + + BPY_BM_CHECK_OBJ(self); + + if (!PyArg_ParseTuple(args, "O|O:edges.get", &vert_seq, &fallback)) { + return NULL; + } + else { + BMesh *bm = self->bm; + BMEdge *e; + BMVert **vert_array = NULL; + Py_ssize_t vert_seq_len; /* always 2 */ + PyObject *ret = NULL; + + vert_array = BPy_BMElem_PySeq_As_Array( + &bm, vert_seq, 2, 2, &vert_seq_len, BM_VERT, true, true, "edges.get(...)"); + + if (vert_array == NULL) { + return NULL; + } + + if ((e = BM_edge_exists(vert_array[0], vert_array[1]))) { + ret = BPy_BMEdge_CreatePyObject(bm, e); + } + else { + ret = fallback; + Py_INCREF(ret); + } + + PyMem_FREE(vert_array); + return ret; + } } PyDoc_STRVAR(bpy_bmfaceseq_get__method_doc, -".. method:: get(verts, fallback=None)\n" -"\n" -" Return a face which uses the **verts** passed.\n" -"\n" -" :arg verts: Sequence of verts.\n" -" :type verts: :class:`BMVert`\n" -" :arg fallback: Return this value if nothing is found.\n" -" :return: The face found or None\n" -" :rtype: :class:`BMFace`\n" -); + ".. method:: get(verts, fallback=None)\n" + "\n" + " Return a face which uses the **verts** passed.\n" + "\n" + " :arg verts: Sequence of verts.\n" + " :type verts: :class:`BMVert`\n" + " :arg fallback: Return this value if nothing is found.\n" + " :return: The face found or None\n" + " :rtype: :class:`BMFace`\n"); static PyObject *bpy_bmfaceseq_get__method(BPy_BMElemSeq *self, PyObject *args) { - PyObject *vert_seq; - PyObject *fallback = Py_None; /* optional */ - - BPY_BM_CHECK_OBJ(self); - - if (!PyArg_ParseTuple(args, "O|O:faces.get", - &vert_seq, - &fallback)) - { - return NULL; - } - else { - BMesh *bm = self->bm; - BMFace *f = NULL; - BMVert **vert_array = NULL; - Py_ssize_t vert_seq_len; - PyObject *ret = NULL; - - vert_array = BPy_BMElem_PySeq_As_Array(&bm, vert_seq, 1, PY_SSIZE_T_MAX, - &vert_seq_len, BM_VERT, - true, true, "faces.get(...)"); - - if (vert_array == NULL) { - return NULL; - } - - f = BM_face_exists(vert_array, vert_seq_len); - if (f != NULL) { - ret = BPy_BMFace_CreatePyObject(bm, f); - } - else { - ret = fallback; - Py_INCREF(ret); - } - - PyMem_FREE(vert_array); - return ret; - } -} - -PyDoc_STRVAR(bpy_bmelemseq_index_update_doc, -".. method:: index_update()\n" -"\n" -" Initialize the index values of this sequence.\n" -"\n" -" This is the equivalent of looping over all elements and assigning the index values.\n" -"\n" -" .. code-block:: python\n" -"\n" -" for index, ele in enumerate(sequence):\n" -" ele.index = index\n" -"\n" -" .. note::\n" -"\n" -" Running this on sequences besides :class:`BMesh.verts`, :class:`BMesh.edges`, :class:`BMesh.faces`\n" -" works but wont result in each element having a valid index, instead its order in the sequence will be set.\n" -); + PyObject *vert_seq; + PyObject *fallback = Py_None; /* optional */ + + BPY_BM_CHECK_OBJ(self); + + if (!PyArg_ParseTuple(args, "O|O:faces.get", &vert_seq, &fallback)) { + return NULL; + } + else { + BMesh *bm = self->bm; + BMFace *f = NULL; + BMVert **vert_array = NULL; + Py_ssize_t vert_seq_len; + PyObject *ret = NULL; + + vert_array = BPy_BMElem_PySeq_As_Array( + &bm, vert_seq, 1, PY_SSIZE_T_MAX, &vert_seq_len, BM_VERT, true, true, "faces.get(...)"); + + if (vert_array == NULL) { + return NULL; + } + + f = BM_face_exists(vert_array, vert_seq_len); + if (f != NULL) { + ret = BPy_BMFace_CreatePyObject(bm, f); + } + else { + ret = fallback; + Py_INCREF(ret); + } + + PyMem_FREE(vert_array); + return ret; + } +} + +PyDoc_STRVAR( + bpy_bmelemseq_index_update_doc, + ".. method:: index_update()\n" + "\n" + " Initialize the index values of this sequence.\n" + "\n" + " This is the equivalent of looping over all elements and assigning the index values.\n" + "\n" + " .. code-block:: python\n" + "\n" + " for index, ele in enumerate(sequence):\n" + " ele.index = index\n" + "\n" + " .. note::\n" + "\n" + " Running this on sequences besides :class:`BMesh.verts`, :class:`BMesh.edges`, " + ":class:`BMesh.faces`\n" + " works but wont result in each element having a valid index, instead its order in the " + "sequence will be set.\n"); static PyObject *bpy_bmelemseq_index_update(BPy_BMElemSeq *self) { - BMesh *bm = self->bm; + BMesh *bm = self->bm; - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - switch ((BMIterType)self->itype) { - case BM_VERTS_OF_MESH: - BM_mesh_elem_index_ensure(self->bm, BM_VERT); - break; - case BM_EDGES_OF_MESH: - BM_mesh_elem_index_ensure(self->bm, BM_EDGE); - break; - case BM_FACES_OF_MESH: - BM_mesh_elem_index_ensure(self->bm, BM_FACE); - break; - default: - { - BMIter iter; - BMElem *ele; - int index = 0; - const char htype = bm_iter_itype_htype_map[self->itype]; + switch ((BMIterType)self->itype) { + case BM_VERTS_OF_MESH: + BM_mesh_elem_index_ensure(self->bm, BM_VERT); + break; + case BM_EDGES_OF_MESH: + BM_mesh_elem_index_ensure(self->bm, BM_EDGE); + break; + case BM_FACES_OF_MESH: + BM_mesh_elem_index_ensure(self->bm, BM_FACE); + break; + default: { + BMIter iter; + BMElem *ele; + int index = 0; + const char htype = bm_iter_itype_htype_map[self->itype]; - BM_ITER_BPY_BM_SEQ (ele, &iter, self) { - BM_elem_index_set(ele, index); /* set_dirty! */ - index++; - } + BM_ITER_BPY_BM_SEQ(ele, &iter, self) + { + BM_elem_index_set(ele, index); /* set_dirty! */ + index++; + } - /* since this isn't the normal vert/edge/face loops, - * we're setting dirty values here. so tag as dirty. */ - bm->elem_index_dirty |= htype; + /* since this isn't the normal vert/edge/face loops, + * we're setting dirty values here. so tag as dirty. */ + bm->elem_index_dirty |= htype; - break; - } - } + break; + } + } - Py_RETURN_NONE; + Py_RETURN_NONE; } PyDoc_STRVAR(bpy_bmelemseq_ensure_lookup_table_doc, -".. method:: ensure_lookup_table()\n" -"\n" -" Ensure internal data needed for int subscription is initialized with verts/edges/faces, eg ``bm.verts[index]``.\n" -"\n" -" This needs to be called again after adding/removing data in this sequence." -); + ".. method:: ensure_lookup_table()\n" + "\n" + " Ensure internal data needed for int subscription is initialized with " + "verts/edges/faces, eg ``bm.verts[index]``.\n" + "\n" + " This needs to be called again after adding/removing data in this sequence."); static PyObject *bpy_bmelemseq_ensure_lookup_table(BPy_BMElemSeq *self) { - BPY_BM_CHECK_OBJ(self); - - BM_mesh_elem_table_ensure(self->bm, bm_iter_itype_htype_map[self->itype]); - - Py_RETURN_NONE; -} - -PyDoc_STRVAR(bpy_bmelemseq_sort_doc, -".. method:: sort(key=None, reverse=False)\n" -"\n" -" Sort the elements of this sequence, using an optional custom sort key.\n" -" Indices of elements are not changed, BMElemeSeq.index_update() can be used for that.\n" -"\n" -" :arg key: The key that sets the ordering of the elements.\n" -" :type key: :function: returning a number\n" -" :arg reverse: Reverse the order of the elements\n" -" :type reverse: :boolean:\n" -"\n" -" .. note::\n" -"\n" -" When the 'key' argument is not provided, the elements are reordered following their current index value.\n" -" In particular this can be used by setting indices manually before calling this method.\n" -"\n" -" .. warning::\n" -"\n" -" Existing references to the N'th element, will continue to point the data at that index.\n" -); + BPY_BM_CHECK_OBJ(self); + + BM_mesh_elem_table_ensure(self->bm, bm_iter_itype_htype_map[self->itype]); + + Py_RETURN_NONE; +} + +PyDoc_STRVAR( + bpy_bmelemseq_sort_doc, + ".. method:: sort(key=None, reverse=False)\n" + "\n" + " Sort the elements of this sequence, using an optional custom sort key.\n" + " Indices of elements are not changed, BMElemeSeq.index_update() can be used for that.\n" + "\n" + " :arg key: The key that sets the ordering of the elements.\n" + " :type key: :function: returning a number\n" + " :arg reverse: Reverse the order of the elements\n" + " :type reverse: :boolean:\n" + "\n" + " .. note::\n" + "\n" + " When the 'key' argument is not provided, the elements are reordered following their " + "current index value.\n" + " In particular this can be used by setting indices manually before calling this " + "method.\n" + "\n" + " .. warning::\n" + "\n" + " Existing references to the N'th element, will continue to point the data at that " + "index.\n"); /* Use a static variable here because there is the need to sort some array * doing comparisons on elements of another array, qsort_r would have been @@ -2536,320 +2662,439 @@ PyDoc_STRVAR(bpy_bmelemseq_sort_doc, * has enough elements to complete the task. */ -static int bpy_bmelemseq_sort_cmp_by_keys_ascending(const void *index1_v, const void *index2_v, void *keys_v) +static int bpy_bmelemseq_sort_cmp_by_keys_ascending(const void *index1_v, + const void *index2_v, + void *keys_v) { - const double *keys = keys_v; - const int *index1 = (int *)index1_v; - const int *index2 = (int *)index2_v; + const double *keys = keys_v; + const int *index1 = (int *)index1_v; + const int *index2 = (int *)index2_v; - if (keys[*index1] < keys[*index2]) { - return -1; - } - else if (keys[*index1] > keys[*index2]) { - return 1; - } - else { - return 0; - } + if (keys[*index1] < keys[*index2]) { + return -1; + } + else if (keys[*index1] > keys[*index2]) { + return 1; + } + else { + return 0; + } } -static int bpy_bmelemseq_sort_cmp_by_keys_descending(const void *index1_v, const void *index2_v, void *keys_v) +static int bpy_bmelemseq_sort_cmp_by_keys_descending(const void *index1_v, + const void *index2_v, + void *keys_v) { - return -bpy_bmelemseq_sort_cmp_by_keys_ascending(index1_v, index2_v, keys_v); + return -bpy_bmelemseq_sort_cmp_by_keys_ascending(index1_v, index2_v, keys_v); } static PyObject *bpy_bmelemseq_sort(BPy_BMElemSeq *self, PyObject *args, PyObject *kw) { - static const char *kwlist[] = {"key", "reverse", NULL}; - PyObject *keyfunc = NULL; /* optional */ - bool do_reverse = false; /* optional */ - - const char htype = bm_iter_itype_htype_map[self->itype]; - int n_elem; - - BMIter iter; - BMElem *ele; - - double *keys; - int *elem_idx; - unsigned int *elem_map_idx; - int (*elem_idx_compare_by_keys)(const void *, const void *, void *); - - unsigned int *vert_idx = NULL; - unsigned int *edge_idx = NULL; - unsigned int *face_idx = NULL; - int i; - - BMesh *bm = self->bm; - - BPY_BM_CHECK_OBJ(self); - - if (args != NULL) { - if (!PyArg_ParseTupleAndKeywords( - args, kw, - "|OO&:BMElemSeq.sort", (char **)kwlist, - &keyfunc, - PyC_ParseBool, &do_reverse)) - { - return NULL; - } - } - - if (keyfunc != NULL && !PyCallable_Check(keyfunc)) { - PyErr_SetString(PyExc_TypeError, - "the 'key' argument is not a callable object"); - return NULL; - } - - n_elem = BM_mesh_elem_count(bm, htype); - if (n_elem <= 1) { - /* 0 or 1 elements: sorted already */ - Py_RETURN_NONE; - } - - keys = PyMem_MALLOC(sizeof(*keys) * n_elem); - if (keys == NULL) { - PyErr_NoMemory(); - return NULL; - } - - i = 0; - BM_ITER_BPY_BM_SEQ (ele, &iter, self) { - if (keyfunc != NULL) { - PyObject *py_elem; - PyObject *index; - - py_elem = BPy_BMElem_CreatePyObject(self->bm, (BMHeader *)ele); - index = PyObject_CallFunctionObjArgs(keyfunc, py_elem, NULL); - Py_DECREF(py_elem); - if (index == NULL) { - /* No need to set the exception here, - * PyObject_CallFunctionObjArgs() does that */ - PyMem_FREE(keys); - return NULL; - } - - if ((keys[i] = PyFloat_AsDouble(index)) == -1 && PyErr_Occurred()) { - PyErr_SetString(PyExc_ValueError, - "the value returned by the 'key' function is not a number"); - Py_DECREF(index); - PyMem_FREE(keys); - return NULL; - } - - Py_DECREF(index); - } - else { - /* If the 'key' function is not provided we sort - * according to the current index values */ - keys[i] = ele->head.index; - } - - i++; - } - - elem_idx = PyMem_MALLOC(sizeof(*elem_idx) * n_elem); - if (elem_idx == NULL) { - PyErr_NoMemory(); - PyMem_FREE(keys); - return NULL; - } - - /* Initialize the element index array */ - range_vn_i(elem_idx, n_elem, 0); - - /* Sort the index array according to the order of the 'keys' array */ - if (do_reverse) { - elem_idx_compare_by_keys = bpy_bmelemseq_sort_cmp_by_keys_descending; - } - else { - elem_idx_compare_by_keys = bpy_bmelemseq_sort_cmp_by_keys_ascending; - } - - BLI_qsort_r(elem_idx, n_elem, sizeof(*elem_idx), elem_idx_compare_by_keys, keys); - - elem_map_idx = PyMem_MALLOC(sizeof(*elem_map_idx) * n_elem); - if (elem_map_idx == NULL) { - PyErr_NoMemory(); - PyMem_FREE(elem_idx); - PyMem_FREE(keys); - return NULL; - } - - /* Initialize the map array - * - * We need to know the index such that if used as the new_index in - * BM_mesh_remap() will give the order of the sorted keys like in - * elem_idx */ - for (i = 0; i < n_elem; i++) { - elem_map_idx[elem_idx[i]] = i; - } - - switch ((BMIterType)self->itype) { - case BM_VERTS_OF_MESH: - vert_idx = elem_map_idx; - break; - case BM_EDGES_OF_MESH: - edge_idx = elem_map_idx; - break; - case BM_FACES_OF_MESH: - face_idx = elem_map_idx; - break; - default: - PyErr_Format(PyExc_TypeError, "element type %d not supported", self->itype); - PyMem_FREE(elem_map_idx); - PyMem_FREE(elem_idx); - PyMem_FREE(keys); - return NULL; - } - - BM_mesh_remap(bm, vert_idx, edge_idx, face_idx); - - PyMem_FREE(elem_map_idx); - PyMem_FREE(elem_idx); - PyMem_FREE(keys); - - Py_RETURN_NONE; + static const char *kwlist[] = {"key", "reverse", NULL}; + PyObject *keyfunc = NULL; /* optional */ + bool do_reverse = false; /* optional */ + + const char htype = bm_iter_itype_htype_map[self->itype]; + int n_elem; + + BMIter iter; + BMElem *ele; + + double *keys; + int *elem_idx; + unsigned int *elem_map_idx; + int (*elem_idx_compare_by_keys)(const void *, const void *, void *); + + unsigned int *vert_idx = NULL; + unsigned int *edge_idx = NULL; + unsigned int *face_idx = NULL; + int i; + + BMesh *bm = self->bm; + + BPY_BM_CHECK_OBJ(self); + + if (args != NULL) { + if (!PyArg_ParseTupleAndKeywords(args, + kw, + "|OO&:BMElemSeq.sort", + (char **)kwlist, + &keyfunc, + PyC_ParseBool, + &do_reverse)) { + return NULL; + } + } + + if (keyfunc != NULL && !PyCallable_Check(keyfunc)) { + PyErr_SetString(PyExc_TypeError, "the 'key' argument is not a callable object"); + return NULL; + } + + n_elem = BM_mesh_elem_count(bm, htype); + if (n_elem <= 1) { + /* 0 or 1 elements: sorted already */ + Py_RETURN_NONE; + } + + keys = PyMem_MALLOC(sizeof(*keys) * n_elem); + if (keys == NULL) { + PyErr_NoMemory(); + return NULL; + } + + i = 0; + BM_ITER_BPY_BM_SEQ(ele, &iter, self) + { + if (keyfunc != NULL) { + PyObject *py_elem; + PyObject *index; + + py_elem = BPy_BMElem_CreatePyObject(self->bm, (BMHeader *)ele); + index = PyObject_CallFunctionObjArgs(keyfunc, py_elem, NULL); + Py_DECREF(py_elem); + if (index == NULL) { + /* No need to set the exception here, + * PyObject_CallFunctionObjArgs() does that */ + PyMem_FREE(keys); + return NULL; + } + + if ((keys[i] = PyFloat_AsDouble(index)) == -1 && PyErr_Occurred()) { + PyErr_SetString(PyExc_ValueError, + "the value returned by the 'key' function is not a number"); + Py_DECREF(index); + PyMem_FREE(keys); + return NULL; + } + + Py_DECREF(index); + } + else { + /* If the 'key' function is not provided we sort + * according to the current index values */ + keys[i] = ele->head.index; + } + + i++; + } + + elem_idx = PyMem_MALLOC(sizeof(*elem_idx) * n_elem); + if (elem_idx == NULL) { + PyErr_NoMemory(); + PyMem_FREE(keys); + return NULL; + } + + /* Initialize the element index array */ + range_vn_i(elem_idx, n_elem, 0); + + /* Sort the index array according to the order of the 'keys' array */ + if (do_reverse) { + elem_idx_compare_by_keys = bpy_bmelemseq_sort_cmp_by_keys_descending; + } + else { + elem_idx_compare_by_keys = bpy_bmelemseq_sort_cmp_by_keys_ascending; + } + + BLI_qsort_r(elem_idx, n_elem, sizeof(*elem_idx), elem_idx_compare_by_keys, keys); + + elem_map_idx = PyMem_MALLOC(sizeof(*elem_map_idx) * n_elem); + if (elem_map_idx == NULL) { + PyErr_NoMemory(); + PyMem_FREE(elem_idx); + PyMem_FREE(keys); + return NULL; + } + + /* Initialize the map array + * + * We need to know the index such that if used as the new_index in + * BM_mesh_remap() will give the order of the sorted keys like in + * elem_idx */ + for (i = 0; i < n_elem; i++) { + elem_map_idx[elem_idx[i]] = i; + } + + switch ((BMIterType)self->itype) { + case BM_VERTS_OF_MESH: + vert_idx = elem_map_idx; + break; + case BM_EDGES_OF_MESH: + edge_idx = elem_map_idx; + break; + case BM_FACES_OF_MESH: + face_idx = elem_map_idx; + break; + default: + PyErr_Format(PyExc_TypeError, "element type %d not supported", self->itype); + PyMem_FREE(elem_map_idx); + PyMem_FREE(elem_idx); + PyMem_FREE(keys); + return NULL; + } + + BM_mesh_remap(bm, vert_idx, edge_idx, face_idx); + + PyMem_FREE(elem_map_idx); + PyMem_FREE(elem_idx); + PyMem_FREE(keys); + + Py_RETURN_NONE; } static struct PyMethodDef bpy_bmesh_methods[] = { - /* utility */ - {"copy", (PyCFunction)bpy_bmesh_copy, METH_NOARGS, bpy_bmesh_copy_doc}, - {"clear", (PyCFunction)bpy_bmesh_clear, METH_NOARGS, bpy_bmesh_clear_doc}, - {"free", (PyCFunction)bpy_bmesh_free, METH_NOARGS, bpy_bmesh_free_doc}, - - /* conversion */ - {"from_object", (PyCFunction)bpy_bmesh_from_object, METH_VARARGS | METH_KEYWORDS, bpy_bmesh_from_object_doc}, - {"from_mesh", (PyCFunction)bpy_bmesh_from_mesh, METH_VARARGS | METH_KEYWORDS, bpy_bmesh_from_mesh_doc}, - {"to_mesh", (PyCFunction)bpy_bmesh_to_mesh, METH_VARARGS, bpy_bmesh_to_mesh_doc}, - - /* meshdata */ - {"select_flush_mode", (PyCFunction)bpy_bmesh_select_flush_mode, METH_NOARGS, bpy_bmesh_select_flush_mode_doc}, - {"select_flush", (PyCFunction)bpy_bmesh_select_flush, METH_O, bpy_bmesh_select_flush_doc}, - {"normal_update", (PyCFunction)bpy_bmesh_normal_update, METH_NOARGS, bpy_bmesh_normal_update_doc}, - {"transform", (PyCFunction)bpy_bmesh_transform, METH_VARARGS | METH_KEYWORDS, bpy_bmesh_transform_doc}, - - /* calculations */ - {"calc_volume", (PyCFunction)bpy_bmesh_calc_volume, METH_VARARGS | METH_KEYWORDS, bpy_bmesh_calc_volume_doc}, - {"calc_loop_triangles", (PyCFunction)bpy_bmesh_calc_loop_triangles, METH_NOARGS, bpy_bmesh_calc_loop_triangles_doc}, - {NULL, NULL, 0, NULL}, + /* utility */ + {"copy", (PyCFunction)bpy_bmesh_copy, METH_NOARGS, bpy_bmesh_copy_doc}, + {"clear", (PyCFunction)bpy_bmesh_clear, METH_NOARGS, bpy_bmesh_clear_doc}, + {"free", (PyCFunction)bpy_bmesh_free, METH_NOARGS, bpy_bmesh_free_doc}, + + /* conversion */ + {"from_object", + (PyCFunction)bpy_bmesh_from_object, + METH_VARARGS | METH_KEYWORDS, + bpy_bmesh_from_object_doc}, + {"from_mesh", + (PyCFunction)bpy_bmesh_from_mesh, + METH_VARARGS | METH_KEYWORDS, + bpy_bmesh_from_mesh_doc}, + {"to_mesh", (PyCFunction)bpy_bmesh_to_mesh, METH_VARARGS, bpy_bmesh_to_mesh_doc}, + + /* meshdata */ + {"select_flush_mode", + (PyCFunction)bpy_bmesh_select_flush_mode, + METH_NOARGS, + bpy_bmesh_select_flush_mode_doc}, + {"select_flush", (PyCFunction)bpy_bmesh_select_flush, METH_O, bpy_bmesh_select_flush_doc}, + {"normal_update", + (PyCFunction)bpy_bmesh_normal_update, + METH_NOARGS, + bpy_bmesh_normal_update_doc}, + {"transform", + (PyCFunction)bpy_bmesh_transform, + METH_VARARGS | METH_KEYWORDS, + bpy_bmesh_transform_doc}, + + /* calculations */ + {"calc_volume", + (PyCFunction)bpy_bmesh_calc_volume, + METH_VARARGS | METH_KEYWORDS, + bpy_bmesh_calc_volume_doc}, + {"calc_loop_triangles", + (PyCFunction)bpy_bmesh_calc_loop_triangles, + METH_NOARGS, + bpy_bmesh_calc_loop_triangles_doc}, + {NULL, NULL, 0, NULL}, }; static struct PyMethodDef bpy_bmvert_methods[] = { - {"select_set", (PyCFunction)bpy_bm_elem_select_set, METH_O, bpy_bm_elem_select_set_doc}, - {"hide_set", (PyCFunction)bpy_bm_elem_hide_set, METH_O, bpy_bm_elem_hide_set_doc}, - {"copy_from", (PyCFunction)bpy_bm_elem_copy_from, METH_O, bpy_bm_elem_copy_from_doc}, - {"copy_from_face_interp", (PyCFunction)bpy_bmvert_copy_from_face_interp, METH_VARARGS, bpy_bmvert_copy_from_face_interp_doc}, - {"copy_from_vert_interp", (PyCFunction)bpy_bmvert_copy_from_vert_interp, METH_VARARGS, bpy_bmvert_copy_from_vert_interp_doc}, - - {"calc_edge_angle", (PyCFunction)bpy_bmvert_calc_edge_angle, METH_VARARGS, bpy_bmvert_calc_edge_angle_doc}, - {"calc_shell_factor", (PyCFunction)bpy_bmvert_calc_shell_factor, METH_NOARGS, bpy_bmvert_calc_shell_factor_doc}, - - {"normal_update", (PyCFunction)bpy_bmvert_normal_update, METH_NOARGS, bpy_bmvert_normal_update_doc}, - - {NULL, NULL, 0, NULL}, + {"select_set", (PyCFunction)bpy_bm_elem_select_set, METH_O, bpy_bm_elem_select_set_doc}, + {"hide_set", (PyCFunction)bpy_bm_elem_hide_set, METH_O, bpy_bm_elem_hide_set_doc}, + {"copy_from", (PyCFunction)bpy_bm_elem_copy_from, METH_O, bpy_bm_elem_copy_from_doc}, + {"copy_from_face_interp", + (PyCFunction)bpy_bmvert_copy_from_face_interp, + METH_VARARGS, + bpy_bmvert_copy_from_face_interp_doc}, + {"copy_from_vert_interp", + (PyCFunction)bpy_bmvert_copy_from_vert_interp, + METH_VARARGS, + bpy_bmvert_copy_from_vert_interp_doc}, + + {"calc_edge_angle", + (PyCFunction)bpy_bmvert_calc_edge_angle, + METH_VARARGS, + bpy_bmvert_calc_edge_angle_doc}, + {"calc_shell_factor", + (PyCFunction)bpy_bmvert_calc_shell_factor, + METH_NOARGS, + bpy_bmvert_calc_shell_factor_doc}, + + {"normal_update", + (PyCFunction)bpy_bmvert_normal_update, + METH_NOARGS, + bpy_bmvert_normal_update_doc}, + + {NULL, NULL, 0, NULL}, }; static struct PyMethodDef bpy_bmedge_methods[] = { - {"select_set", (PyCFunction)bpy_bm_elem_select_set, METH_O, bpy_bm_elem_select_set_doc}, - {"hide_set", (PyCFunction)bpy_bm_elem_hide_set, METH_O, bpy_bm_elem_hide_set_doc}, - {"copy_from", (PyCFunction)bpy_bm_elem_copy_from, METH_O, bpy_bm_elem_copy_from_doc}, - - {"other_vert", (PyCFunction)bpy_bmedge_other_vert, METH_O, bpy_bmedge_other_vert_doc}, - - {"calc_length", (PyCFunction)bpy_bmedge_calc_length, METH_NOARGS, bpy_bmedge_calc_length_doc}, - {"calc_face_angle", (PyCFunction)bpy_bmedge_calc_face_angle, METH_VARARGS, bpy_bmedge_calc_face_angle_doc}, - {"calc_face_angle_signed", (PyCFunction)bpy_bmedge_calc_face_angle_signed, METH_VARARGS, bpy_bmedge_calc_face_angle_signed_doc}, - {"calc_tangent", (PyCFunction)bpy_bmedge_calc_tangent, METH_VARARGS, bpy_bmedge_calc_tangent_doc}, - - {"normal_update", (PyCFunction)bpy_bmedge_normal_update, METH_NOARGS, bpy_bmedge_normal_update_doc}, - - {NULL, NULL, 0, NULL}, + {"select_set", (PyCFunction)bpy_bm_elem_select_set, METH_O, bpy_bm_elem_select_set_doc}, + {"hide_set", (PyCFunction)bpy_bm_elem_hide_set, METH_O, bpy_bm_elem_hide_set_doc}, + {"copy_from", (PyCFunction)bpy_bm_elem_copy_from, METH_O, bpy_bm_elem_copy_from_doc}, + + {"other_vert", (PyCFunction)bpy_bmedge_other_vert, METH_O, bpy_bmedge_other_vert_doc}, + + {"calc_length", (PyCFunction)bpy_bmedge_calc_length, METH_NOARGS, bpy_bmedge_calc_length_doc}, + {"calc_face_angle", + (PyCFunction)bpy_bmedge_calc_face_angle, + METH_VARARGS, + bpy_bmedge_calc_face_angle_doc}, + {"calc_face_angle_signed", + (PyCFunction)bpy_bmedge_calc_face_angle_signed, + METH_VARARGS, + bpy_bmedge_calc_face_angle_signed_doc}, + {"calc_tangent", + (PyCFunction)bpy_bmedge_calc_tangent, + METH_VARARGS, + bpy_bmedge_calc_tangent_doc}, + + {"normal_update", + (PyCFunction)bpy_bmedge_normal_update, + METH_NOARGS, + bpy_bmedge_normal_update_doc}, + + {NULL, NULL, 0, NULL}, }; static struct PyMethodDef bpy_bmface_methods[] = { - {"select_set", (PyCFunction)bpy_bm_elem_select_set, METH_O, bpy_bm_elem_select_set_doc}, - {"hide_set", (PyCFunction)bpy_bm_elem_hide_set, METH_O, bpy_bm_elem_hide_set_doc}, - - {"copy_from", (PyCFunction)bpy_bm_elem_copy_from, METH_O, bpy_bm_elem_copy_from_doc}, - {"copy_from_face_interp", (PyCFunction)bpy_bmface_copy_from_face_interp, METH_O, bpy_bmface_copy_from_face_interp_doc}, - - {"copy", (PyCFunction)bpy_bmface_copy, METH_VARARGS | METH_KEYWORDS, bpy_bmface_copy_doc}, - - {"calc_area", (PyCFunction)bpy_bmface_calc_area, METH_NOARGS, bpy_bmface_calc_area_doc}, - {"calc_perimeter", (PyCFunction)bpy_bmface_calc_perimeter, METH_NOARGS, bpy_bmface_calc_perimeter_doc}, - {"calc_tangent_edge", (PyCFunction)bpy_bmface_calc_tangent_edge, METH_NOARGS, bpy_bmface_calc_tangent_edge_doc}, - {"calc_tangent_edge_pair", (PyCFunction)bpy_bmface_calc_tangent_edge_pair, METH_NOARGS, bpy_bmface_calc_tangent_edge_pair_doc}, - {"calc_tangent_edge_diagonal", (PyCFunction)bpy_bmface_calc_tangent_edge_diagonal, METH_NOARGS, bpy_bmface_calc_tangent_edge_diagonal_doc}, - {"calc_tangent_vert_diagonal", (PyCFunction)bpy_bmface_calc_tangent_vert_diagonal, METH_NOARGS, bpy_bmface_calc_tangent_vert_diagonal_doc}, - {"calc_center_median", (PyCFunction)bpy_bmface_calc_center_mean, METH_NOARGS, bpy_bmface_calc_center_median_doc}, - {"calc_center_median_weighted", (PyCFunction)bpy_bmface_calc_center_median_weighted, METH_NOARGS, bpy_bmface_calc_center_median_weighted_doc}, - {"calc_center_bounds", (PyCFunction)bpy_bmface_calc_center_bounds, METH_NOARGS, bpy_bmface_calc_center_bounds_doc}, - - {"normal_update", (PyCFunction)bpy_bmface_normal_update, METH_NOARGS, bpy_bmface_normal_update_doc}, - {"normal_flip", (PyCFunction)bpy_bmface_normal_flip, METH_NOARGS, bpy_bmface_normal_flip_doc}, - - {NULL, NULL, 0, NULL}, + {"select_set", (PyCFunction)bpy_bm_elem_select_set, METH_O, bpy_bm_elem_select_set_doc}, + {"hide_set", (PyCFunction)bpy_bm_elem_hide_set, METH_O, bpy_bm_elem_hide_set_doc}, + + {"copy_from", (PyCFunction)bpy_bm_elem_copy_from, METH_O, bpy_bm_elem_copy_from_doc}, + {"copy_from_face_interp", + (PyCFunction)bpy_bmface_copy_from_face_interp, + METH_O, + bpy_bmface_copy_from_face_interp_doc}, + + {"copy", (PyCFunction)bpy_bmface_copy, METH_VARARGS | METH_KEYWORDS, bpy_bmface_copy_doc}, + + {"calc_area", (PyCFunction)bpy_bmface_calc_area, METH_NOARGS, bpy_bmface_calc_area_doc}, + {"calc_perimeter", + (PyCFunction)bpy_bmface_calc_perimeter, + METH_NOARGS, + bpy_bmface_calc_perimeter_doc}, + {"calc_tangent_edge", + (PyCFunction)bpy_bmface_calc_tangent_edge, + METH_NOARGS, + bpy_bmface_calc_tangent_edge_doc}, + {"calc_tangent_edge_pair", + (PyCFunction)bpy_bmface_calc_tangent_edge_pair, + METH_NOARGS, + bpy_bmface_calc_tangent_edge_pair_doc}, + {"calc_tangent_edge_diagonal", + (PyCFunction)bpy_bmface_calc_tangent_edge_diagonal, + METH_NOARGS, + bpy_bmface_calc_tangent_edge_diagonal_doc}, + {"calc_tangent_vert_diagonal", + (PyCFunction)bpy_bmface_calc_tangent_vert_diagonal, + METH_NOARGS, + bpy_bmface_calc_tangent_vert_diagonal_doc}, + {"calc_center_median", + (PyCFunction)bpy_bmface_calc_center_mean, + METH_NOARGS, + bpy_bmface_calc_center_median_doc}, + {"calc_center_median_weighted", + (PyCFunction)bpy_bmface_calc_center_median_weighted, + METH_NOARGS, + bpy_bmface_calc_center_median_weighted_doc}, + {"calc_center_bounds", + (PyCFunction)bpy_bmface_calc_center_bounds, + METH_NOARGS, + bpy_bmface_calc_center_bounds_doc}, + + {"normal_update", + (PyCFunction)bpy_bmface_normal_update, + METH_NOARGS, + bpy_bmface_normal_update_doc}, + {"normal_flip", (PyCFunction)bpy_bmface_normal_flip, METH_NOARGS, bpy_bmface_normal_flip_doc}, + + {NULL, NULL, 0, NULL}, }; static struct PyMethodDef bpy_bmloop_methods[] = { - {"copy_from", (PyCFunction)bpy_bm_elem_copy_from, METH_O, bpy_bm_elem_copy_from_doc}, - {"copy_from_face_interp", (PyCFunction)bpy_bmloop_copy_from_face_interp, METH_O, bpy_bmloop_copy_from_face_interp_doc}, - - {"calc_angle", (PyCFunction)bpy_bmloop_calc_angle, METH_NOARGS, bpy_bmloop_calc_angle_doc}, - {"calc_normal", (PyCFunction)bpy_bmloop_calc_normal, METH_NOARGS, bpy_bmloop_calc_normal_doc}, - {"calc_tangent", (PyCFunction)bpy_bmloop_calc_tangent, METH_NOARGS, bpy_bmloop_calc_tangent_doc}, - {NULL, NULL, 0, NULL}, + {"copy_from", (PyCFunction)bpy_bm_elem_copy_from, METH_O, bpy_bm_elem_copy_from_doc}, + {"copy_from_face_interp", + (PyCFunction)bpy_bmloop_copy_from_face_interp, + METH_O, + bpy_bmloop_copy_from_face_interp_doc}, + + {"calc_angle", (PyCFunction)bpy_bmloop_calc_angle, METH_NOARGS, bpy_bmloop_calc_angle_doc}, + {"calc_normal", (PyCFunction)bpy_bmloop_calc_normal, METH_NOARGS, bpy_bmloop_calc_normal_doc}, + {"calc_tangent", + (PyCFunction)bpy_bmloop_calc_tangent, + METH_NOARGS, + bpy_bmloop_calc_tangent_doc}, + {NULL, NULL, 0, NULL}, }; static struct PyMethodDef bpy_bmelemseq_methods[] = { - /* odd function, initializes index values */ - {"index_update", (PyCFunction)bpy_bmelemseq_index_update, METH_NOARGS, bpy_bmelemseq_index_update_doc}, - {NULL, NULL, 0, NULL}, + /* odd function, initializes index values */ + {"index_update", + (PyCFunction)bpy_bmelemseq_index_update, + METH_NOARGS, + bpy_bmelemseq_index_update_doc}, + {NULL, NULL, 0, NULL}, }; static struct PyMethodDef bpy_bmvertseq_methods[] = { - {"new", (PyCFunction)bpy_bmvertseq_new, METH_VARARGS, bpy_bmvertseq_new_doc}, - {"remove", (PyCFunction)bpy_bmvertseq_remove, METH_O, bpy_bmvertseq_remove_doc}, - - /* odd function, initializes index values */ - {"index_update", (PyCFunction)bpy_bmelemseq_index_update, METH_NOARGS, bpy_bmelemseq_index_update_doc}, - {"ensure_lookup_table", (PyCFunction)bpy_bmelemseq_ensure_lookup_table, METH_NOARGS, bpy_bmelemseq_ensure_lookup_table_doc}, - {"sort", (PyCFunction)bpy_bmelemseq_sort, METH_VARARGS | METH_KEYWORDS, bpy_bmelemseq_sort_doc}, - {NULL, NULL, 0, NULL}, + {"new", (PyCFunction)bpy_bmvertseq_new, METH_VARARGS, bpy_bmvertseq_new_doc}, + {"remove", (PyCFunction)bpy_bmvertseq_remove, METH_O, bpy_bmvertseq_remove_doc}, + + /* odd function, initializes index values */ + {"index_update", + (PyCFunction)bpy_bmelemseq_index_update, + METH_NOARGS, + bpy_bmelemseq_index_update_doc}, + {"ensure_lookup_table", + (PyCFunction)bpy_bmelemseq_ensure_lookup_table, + METH_NOARGS, + bpy_bmelemseq_ensure_lookup_table_doc}, + {"sort", + (PyCFunction)bpy_bmelemseq_sort, + METH_VARARGS | METH_KEYWORDS, + bpy_bmelemseq_sort_doc}, + {NULL, NULL, 0, NULL}, }; static struct PyMethodDef bpy_bmedgeseq_methods[] = { - {"new", (PyCFunction)bpy_bmedgeseq_new, METH_VARARGS, bpy_bmedgeseq_new_doc}, - {"remove", (PyCFunction)bpy_bmedgeseq_remove, METH_O, bpy_bmedgeseq_remove_doc}, - /* 'bpy_bmelemseq_get' for different purpose */ - {"get", (PyCFunction)bpy_bmedgeseq_get__method, METH_VARARGS, bpy_bmedgeseq_get__method_doc}, - - /* odd function, initializes index values */ - {"index_update", (PyCFunction)bpy_bmelemseq_index_update, METH_NOARGS, bpy_bmelemseq_index_update_doc}, - {"ensure_lookup_table", (PyCFunction)bpy_bmelemseq_ensure_lookup_table, METH_NOARGS, bpy_bmelemseq_ensure_lookup_table_doc}, - {"sort", (PyCFunction)bpy_bmelemseq_sort, METH_VARARGS | METH_KEYWORDS, bpy_bmelemseq_sort_doc}, - {NULL, NULL, 0, NULL}, + {"new", (PyCFunction)bpy_bmedgeseq_new, METH_VARARGS, bpy_bmedgeseq_new_doc}, + {"remove", (PyCFunction)bpy_bmedgeseq_remove, METH_O, bpy_bmedgeseq_remove_doc}, + /* 'bpy_bmelemseq_get' for different purpose */ + {"get", (PyCFunction)bpy_bmedgeseq_get__method, METH_VARARGS, bpy_bmedgeseq_get__method_doc}, + + /* odd function, initializes index values */ + {"index_update", + (PyCFunction)bpy_bmelemseq_index_update, + METH_NOARGS, + bpy_bmelemseq_index_update_doc}, + {"ensure_lookup_table", + (PyCFunction)bpy_bmelemseq_ensure_lookup_table, + METH_NOARGS, + bpy_bmelemseq_ensure_lookup_table_doc}, + {"sort", + (PyCFunction)bpy_bmelemseq_sort, + METH_VARARGS | METH_KEYWORDS, + bpy_bmelemseq_sort_doc}, + {NULL, NULL, 0, NULL}, }; static struct PyMethodDef bpy_bmfaceseq_methods[] = { - {"new", (PyCFunction)bpy_bmfaceseq_new, METH_VARARGS, bpy_bmfaceseq_new_doc}, - {"remove", (PyCFunction)bpy_bmfaceseq_remove, METH_O, bpy_bmfaceseq_remove_doc}, - /* 'bpy_bmelemseq_get' for different purpose */ - {"get", (PyCFunction)bpy_bmfaceseq_get__method, METH_VARARGS, bpy_bmfaceseq_get__method_doc}, - - /* odd function, initializes index values */ - {"index_update", (PyCFunction)bpy_bmelemseq_index_update, METH_NOARGS, bpy_bmelemseq_index_update_doc}, - {"ensure_lookup_table", (PyCFunction)bpy_bmelemseq_ensure_lookup_table, METH_NOARGS, bpy_bmelemseq_ensure_lookup_table_doc}, - {"sort", (PyCFunction)bpy_bmelemseq_sort, METH_VARARGS | METH_KEYWORDS, bpy_bmelemseq_sort_doc}, - {NULL, NULL, 0, NULL}, + {"new", (PyCFunction)bpy_bmfaceseq_new, METH_VARARGS, bpy_bmfaceseq_new_doc}, + {"remove", (PyCFunction)bpy_bmfaceseq_remove, METH_O, bpy_bmfaceseq_remove_doc}, + /* 'bpy_bmelemseq_get' for different purpose */ + {"get", (PyCFunction)bpy_bmfaceseq_get__method, METH_VARARGS, bpy_bmfaceseq_get__method_doc}, + + /* odd function, initializes index values */ + {"index_update", + (PyCFunction)bpy_bmelemseq_index_update, + METH_NOARGS, + bpy_bmelemseq_index_update_doc}, + {"ensure_lookup_table", + (PyCFunction)bpy_bmelemseq_ensure_lookup_table, + METH_NOARGS, + bpy_bmelemseq_ensure_lookup_table_doc}, + {"sort", + (PyCFunction)bpy_bmelemseq_sort, + METH_VARARGS | METH_KEYWORDS, + bpy_bmelemseq_sort_doc}, + {NULL, NULL, 0, NULL}, }; static struct PyMethodDef bpy_bmloopseq_methods[] = { - /* odd function, initializes index values */ - /* no: index_update() function since we cant iterate over loops */ - /* no: sort() function since we cant iterate over loops */ - {NULL, NULL, 0, NULL}, + /* odd function, initializes index values */ + /* no: index_update() function since we cant iterate over loops */ + /* no: sort() function since we cant iterate over loops */ + {NULL, NULL, 0, NULL}, }; /* Sequences @@ -2860,253 +3105,254 @@ static struct PyMethodDef bpy_bmloopseq_methods[] = { static PyTypeObject *bpy_bm_itype_as_pytype(const char itype) { - /* should cover all types */ - switch ((BMIterType)itype) { - case BM_VERTS_OF_MESH: - case BM_VERTS_OF_FACE: - case BM_VERTS_OF_EDGE: - return &BPy_BMVert_Type; + /* should cover all types */ + switch ((BMIterType)itype) { + case BM_VERTS_OF_MESH: + case BM_VERTS_OF_FACE: + case BM_VERTS_OF_EDGE: + return &BPy_BMVert_Type; - case BM_EDGES_OF_MESH: - case BM_EDGES_OF_FACE: - case BM_EDGES_OF_VERT: - return &BPy_BMEdge_Type; + case BM_EDGES_OF_MESH: + case BM_EDGES_OF_FACE: + case BM_EDGES_OF_VERT: + return &BPy_BMEdge_Type; - case BM_FACES_OF_MESH: - case BM_FACES_OF_EDGE: - case BM_FACES_OF_VERT: - return &BPy_BMFace_Type; + case BM_FACES_OF_MESH: + case BM_FACES_OF_EDGE: + case BM_FACES_OF_VERT: + return &BPy_BMFace_Type; - // case BM_ALL_LOOPS_OF_FACE: - case BM_LOOPS_OF_FACE: - case BM_LOOPS_OF_EDGE: - case BM_LOOPS_OF_VERT: - case BM_LOOPS_OF_LOOP: - return &BPy_BMLoop_Type; - } + // case BM_ALL_LOOPS_OF_FACE: + case BM_LOOPS_OF_FACE: + case BM_LOOPS_OF_EDGE: + case BM_LOOPS_OF_VERT: + case BM_LOOPS_OF_LOOP: + return &BPy_BMLoop_Type; + } - return NULL; + return NULL; } static Py_ssize_t bpy_bmelemseq_length(BPy_BMElemSeq *self) { - BPY_BM_CHECK_INT(self); - - /* first check if the size is known */ - switch ((BMIterType)self->itype) { - /* main-types */ - case BM_VERTS_OF_MESH: - return self->bm->totvert; - case BM_EDGES_OF_MESH: - return self->bm->totedge; - case BM_FACES_OF_MESH: - return self->bm->totface; - - /* sub-types */ - case BM_VERTS_OF_FACE: - case BM_EDGES_OF_FACE: - case BM_LOOPS_OF_FACE: - BPY_BM_CHECK_INT(self->py_ele); - return ((BMFace *)self->py_ele->ele)->len; - - case BM_VERTS_OF_EDGE: - return 2; - - default: - /* quiet compiler */ - break; - } - - - /* loop over all items, avoid this if we can */ - { - BMIter iter; - BMHeader *ele; - Py_ssize_t tot = 0; - - BM_ITER_BPY_BM_SEQ (ele, &iter, self) { - tot++; - } - return tot; - } + BPY_BM_CHECK_INT(self); + + /* first check if the size is known */ + switch ((BMIterType)self->itype) { + /* main-types */ + case BM_VERTS_OF_MESH: + return self->bm->totvert; + case BM_EDGES_OF_MESH: + return self->bm->totedge; + case BM_FACES_OF_MESH: + return self->bm->totface; + + /* sub-types */ + case BM_VERTS_OF_FACE: + case BM_EDGES_OF_FACE: + case BM_LOOPS_OF_FACE: + BPY_BM_CHECK_INT(self->py_ele); + return ((BMFace *)self->py_ele->ele)->len; + + case BM_VERTS_OF_EDGE: + return 2; + + default: + /* quiet compiler */ + break; + } + + /* loop over all items, avoid this if we can */ + { + BMIter iter; + BMHeader *ele; + Py_ssize_t tot = 0; + + BM_ITER_BPY_BM_SEQ(ele, &iter, self) + { + tot++; + } + return tot; + } } static PyObject *bpy_bmelemseq_subscript_int(BPy_BMElemSeq *self, int keynum) { - BPY_BM_CHECK_OBJ(self); - - if (keynum < 0) { - /* only get length on negative value, may loop entire seq */ - keynum += bpy_bmelemseq_length(self); - } - if (keynum >= 0) { - if (self->itype <= BM_FACES_OF_MESH) { - if ((self->bm->elem_table_dirty & bm_iter_itype_htype_map[self->itype]) == 0) { - BMHeader *ele = NULL; - switch (self->itype) { - case BM_VERTS_OF_MESH: - if (keynum < self->bm->totvert) { - ele = (BMHeader *)self->bm->vtable[keynum]; - } - break; - case BM_EDGES_OF_MESH: - if (keynum < self->bm->totedge) { - ele = (BMHeader *)self->bm->etable[keynum]; - } - break; - case BM_FACES_OF_MESH: - if (keynum < self->bm->totface) { - ele = (BMHeader *)self->bm->ftable[keynum]; - } - break; - } - if (ele) { - return BPy_BMElem_CreatePyObject(self->bm, ele); - } - /* fall through to index error below */ - } - else { - PyErr_SetString(PyExc_IndexError, - "BMElemSeq[index]: outdated internal index table, " - "run ensure_lookup_table() first"); - return NULL; - } - } - else { - BMHeader *ele = BM_iter_at_index(self->bm, self->itype, self->py_ele ? self->py_ele->ele : NULL, keynum); - if (ele) { - return BPy_BMElem_CreatePyObject(self->bm, ele); - } - } - } - - PyErr_Format(PyExc_IndexError, - "BMElemSeq[index]: index %d out of range", keynum); - return NULL; -} - -static PyObject *bpy_bmelemseq_subscript_slice(BPy_BMElemSeq *self, Py_ssize_t start, Py_ssize_t stop) -{ - BMIter iter; - int count = 0; - bool ok; - - PyObject *list; - BMHeader *ele; - - BPY_BM_CHECK_OBJ(self); - - list = PyList_New(0); - - ok = BM_iter_init(&iter, self->bm, self->itype, self->py_ele ? self->py_ele->ele : NULL); - - BLI_assert(ok == true); - - if (UNLIKELY(ok == false)) { - return list; - } - - /* first loop up-until the start */ - for (ok = true; ok; ok = (BM_iter_step(&iter) != NULL)) { - if (count == start) { - break; - } - count++; - } - - /* add items until stop */ - while ((ele = BM_iter_step(&iter))) { - PyList_APPEND(list, BPy_BMElem_CreatePyObject(self->bm, ele)); - - count++; - if (count == stop) { - break; - } - } - - return list; + BPY_BM_CHECK_OBJ(self); + + if (keynum < 0) { + /* only get length on negative value, may loop entire seq */ + keynum += bpy_bmelemseq_length(self); + } + if (keynum >= 0) { + if (self->itype <= BM_FACES_OF_MESH) { + if ((self->bm->elem_table_dirty & bm_iter_itype_htype_map[self->itype]) == 0) { + BMHeader *ele = NULL; + switch (self->itype) { + case BM_VERTS_OF_MESH: + if (keynum < self->bm->totvert) { + ele = (BMHeader *)self->bm->vtable[keynum]; + } + break; + case BM_EDGES_OF_MESH: + if (keynum < self->bm->totedge) { + ele = (BMHeader *)self->bm->etable[keynum]; + } + break; + case BM_FACES_OF_MESH: + if (keynum < self->bm->totface) { + ele = (BMHeader *)self->bm->ftable[keynum]; + } + break; + } + if (ele) { + return BPy_BMElem_CreatePyObject(self->bm, ele); + } + /* fall through to index error below */ + } + else { + PyErr_SetString(PyExc_IndexError, + "BMElemSeq[index]: outdated internal index table, " + "run ensure_lookup_table() first"); + return NULL; + } + } + else { + BMHeader *ele = BM_iter_at_index( + self->bm, self->itype, self->py_ele ? self->py_ele->ele : NULL, keynum); + if (ele) { + return BPy_BMElem_CreatePyObject(self->bm, ele); + } + } + } + + PyErr_Format(PyExc_IndexError, "BMElemSeq[index]: index %d out of range", keynum); + return NULL; +} + +static PyObject *bpy_bmelemseq_subscript_slice(BPy_BMElemSeq *self, + Py_ssize_t start, + Py_ssize_t stop) +{ + BMIter iter; + int count = 0; + bool ok; + + PyObject *list; + BMHeader *ele; + + BPY_BM_CHECK_OBJ(self); + + list = PyList_New(0); + + ok = BM_iter_init(&iter, self->bm, self->itype, self->py_ele ? self->py_ele->ele : NULL); + + BLI_assert(ok == true); + + if (UNLIKELY(ok == false)) { + return list; + } + + /* first loop up-until the start */ + for (ok = true; ok; ok = (BM_iter_step(&iter) != NULL)) { + if (count == start) { + break; + } + count++; + } + + /* add items until stop */ + while ((ele = BM_iter_step(&iter))) { + PyList_APPEND(list, BPy_BMElem_CreatePyObject(self->bm, ele)); + + count++; + if (count == stop) { + break; + } + } + + return list; } static PyObject *bpy_bmelemseq_subscript(BPy_BMElemSeq *self, PyObject *key) { - /* don't need error check here */ - if (PyIndex_Check(key)) { - Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError); - if (i == -1 && PyErr_Occurred()) { - return NULL; - } - return bpy_bmelemseq_subscript_int(self, i); - } - else if (PySlice_Check(key)) { - PySliceObject *key_slice = (PySliceObject *)key; - Py_ssize_t step = 1; - - if (key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) { - return NULL; - } - else if (step != 1) { - PyErr_SetString(PyExc_TypeError, - "BMElemSeq[slice]: slice steps not supported"); - return NULL; - } - else if (key_slice->start == Py_None && key_slice->stop == Py_None) { - return bpy_bmelemseq_subscript_slice(self, 0, PY_SSIZE_T_MAX); - } - else { - Py_ssize_t start = 0, stop = PY_SSIZE_T_MAX; - - /* avoid PySlice_GetIndicesEx because it needs to know the length ahead of time. */ - if (key_slice->start != Py_None && !_PyEval_SliceIndex(key_slice->start, &start)) { - return NULL; - } - if (key_slice->stop != Py_None && !_PyEval_SliceIndex(key_slice->stop, &stop)) { - return NULL; - } - - if (start < 0 || stop < 0) { - /* only get the length for negative values */ - Py_ssize_t len = bpy_bmelemseq_length(self); - if (start < 0) { - start += len; - } - if (stop < 0) { - stop += len; - } - } - - if (stop - start <= 0) { - return PyList_New(0); - } - else { - return bpy_bmelemseq_subscript_slice(self, start, stop); - } - } - } - else { - PyErr_SetString(PyExc_AttributeError, - "BMElemSeq[key]: invalid key, key must be an int"); - return NULL; - } + /* don't need error check here */ + if (PyIndex_Check(key)) { + Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) { + return NULL; + } + return bpy_bmelemseq_subscript_int(self, i); + } + else if (PySlice_Check(key)) { + PySliceObject *key_slice = (PySliceObject *)key; + Py_ssize_t step = 1; + + if (key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) { + return NULL; + } + else if (step != 1) { + PyErr_SetString(PyExc_TypeError, "BMElemSeq[slice]: slice steps not supported"); + return NULL; + } + else if (key_slice->start == Py_None && key_slice->stop == Py_None) { + return bpy_bmelemseq_subscript_slice(self, 0, PY_SSIZE_T_MAX); + } + else { + Py_ssize_t start = 0, stop = PY_SSIZE_T_MAX; + + /* avoid PySlice_GetIndicesEx because it needs to know the length ahead of time. */ + if (key_slice->start != Py_None && !_PyEval_SliceIndex(key_slice->start, &start)) { + return NULL; + } + if (key_slice->stop != Py_None && !_PyEval_SliceIndex(key_slice->stop, &stop)) { + return NULL; + } + + if (start < 0 || stop < 0) { + /* only get the length for negative values */ + Py_ssize_t len = bpy_bmelemseq_length(self); + if (start < 0) { + start += len; + } + if (stop < 0) { + stop += len; + } + } + + if (stop - start <= 0) { + return PyList_New(0); + } + else { + return bpy_bmelemseq_subscript_slice(self, start, stop); + } + } + } + else { + PyErr_SetString(PyExc_AttributeError, "BMElemSeq[key]: invalid key, key must be an int"); + return NULL; + } } static int bpy_bmelemseq_contains(BPy_BMElemSeq *self, PyObject *value) { - BPY_BM_CHECK_INT(self); + BPY_BM_CHECK_INT(self); - if (Py_TYPE(value) == bpy_bm_itype_as_pytype(self->itype)) { - BPy_BMElem *value_bm_ele = (BPy_BMElem *)value; - if (value_bm_ele->bm == self->bm) { - BMElem *ele, *ele_test = value_bm_ele->ele; - BMIter iter; - BM_ITER_BPY_BM_SEQ (ele, &iter, self) { - if (ele == ele_test) { - return 1; - } - } - } - } + if (Py_TYPE(value) == bpy_bm_itype_as_pytype(self->itype)) { + BPy_BMElem *value_bm_ele = (BPy_BMElem *)value; + if (value_bm_ele->bm == self->bm) { + BMElem *ele, *ele_test = value_bm_ele->ele; + BMIter iter; + BM_ITER_BPY_BM_SEQ(ele, &iter, self) + { + if (ele == ele_test) { + return 1; + } + } + } + } - return 0; + return 0; } /* BMElem (customdata) @@ -3114,42 +3360,44 @@ static int bpy_bmelemseq_contains(BPy_BMElemSeq *self, PyObject *value) static PyObject *bpy_bmelem_subscript(BPy_BMElem *self, BPy_BMLayerItem *key) { - BPY_BM_CHECK_OBJ(self); + BPY_BM_CHECK_OBJ(self); - return BPy_BMLayerItem_GetItem(self, key); + return BPy_BMLayerItem_GetItem(self, key); } static int bpy_bmelem_ass_subscript(BPy_BMElem *self, BPy_BMLayerItem *key, PyObject *value) { - BPY_BM_CHECK_INT(self); + BPY_BM_CHECK_INT(self); - return BPy_BMLayerItem_SetItem(self, key, value); + return BPy_BMLayerItem_SetItem(self, key, value); } static PySequenceMethods bpy_bmelemseq_as_sequence = { - (lenfunc)bpy_bmelemseq_length, /* sq_length */ - NULL, /* sq_concat */ - NULL, /* sq_repeat */ - (ssizeargfunc)bpy_bmelemseq_subscript_int, /* sq_item */ /* Only set this so PySequence_Check() returns True */ - NULL, /* sq_slice */ - (ssizeobjargproc)NULL, /* sq_ass_item */ - NULL, /* *was* sq_ass_slice */ - (objobjproc)bpy_bmelemseq_contains, /* sq_contains */ - (binaryfunc) NULL, /* sq_inplace_concat */ - (ssizeargfunc) NULL, /* sq_inplace_repeat */ + (lenfunc)bpy_bmelemseq_length, /* sq_length */ + NULL, /* sq_concat */ + NULL, /* sq_repeat */ + (ssizeargfunc)bpy_bmelemseq_subscript_int, + /* sq_item */ /* Only set this so PySequence_Check() returns True */ + NULL, /* sq_slice */ + (ssizeobjargproc)NULL, /* sq_ass_item */ + NULL, /* *was* sq_ass_slice */ + (objobjproc)bpy_bmelemseq_contains, /* sq_contains */ + (binaryfunc)NULL, /* sq_inplace_concat */ + (ssizeargfunc)NULL, /* sq_inplace_repeat */ }; static PyMappingMethods bpy_bmelemseq_as_mapping = { - (lenfunc)bpy_bmelemseq_length, /* mp_length */ - (binaryfunc)bpy_bmelemseq_subscript, /* mp_subscript */ - (objobjargproc)NULL, /* mp_ass_subscript */ + (lenfunc)bpy_bmelemseq_length, /* mp_length */ + (binaryfunc)bpy_bmelemseq_subscript, /* mp_subscript */ + (objobjargproc)NULL, /* mp_ass_subscript */ }; /* for customdata access */ static PyMappingMethods bpy_bm_elem_as_mapping = { - (lenfunc)NULL, /* mp_length */ /* keep this empty, messes up 'if elem: ...' test */ - (binaryfunc)bpy_bmelem_subscript, /* mp_subscript */ - (objobjargproc)bpy_bmelem_ass_subscript, /* mp_ass_subscript */ + (lenfunc)NULL, + /* mp_length */ /* keep this empty, messes up 'if elem: ...' test */ + (binaryfunc)bpy_bmelem_subscript, /* mp_subscript */ + (objobjargproc)bpy_bmelem_ass_subscript, /* mp_ass_subscript */ }; /* Iterator @@ -3157,230 +3405,228 @@ static PyMappingMethods bpy_bm_elem_as_mapping = { static PyObject *bpy_bmelemseq_iter(BPy_BMElemSeq *self) { - BPy_BMIter *py_iter; + BPy_BMIter *py_iter; - BPY_BM_CHECK_OBJ(self); - py_iter = (BPy_BMIter *)BPy_BMIter_CreatePyObject(self->bm); - BM_iter_init(&(py_iter->iter), self->bm, self->itype, self->py_ele ? self->py_ele->ele : NULL); - return (PyObject *)py_iter; + BPY_BM_CHECK_OBJ(self); + py_iter = (BPy_BMIter *)BPy_BMIter_CreatePyObject(self->bm); + BM_iter_init(&(py_iter->iter), self->bm, self->itype, self->py_ele ? self->py_ele->ele : NULL); + return (PyObject *)py_iter; } static PyObject *bpy_bmiter_next(BPy_BMIter *self) { - BMHeader *ele = BM_iter_step(&self->iter); - if (ele == NULL) { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - else { - return (PyObject *)BPy_BMElem_CreatePyObject(self->bm, ele); - } + BMHeader *ele = BM_iter_step(&self->iter); + if (ele == NULL) { + PyErr_SetNone(PyExc_StopIteration); + return NULL; + } + else { + return (PyObject *)BPy_BMElem_CreatePyObject(self->bm, ele); + } } - /* Dealloc Functions * ================= */ static void bpy_bmesh_dealloc(BPy_BMesh *self) { - BMesh *bm = self->bm; + BMesh *bm = self->bm; - /* have have been freed by bmesh */ - if (bm) { - bm_dealloc_editmode_warn(self); + /* have have been freed by bmesh */ + if (bm) { + bm_dealloc_editmode_warn(self); - if (CustomData_has_layer(&bm->vdata, CD_BM_ELEM_PYPTR)) { - BM_data_layer_free(bm, &bm->vdata, CD_BM_ELEM_PYPTR); - } - if (CustomData_has_layer(&bm->edata, CD_BM_ELEM_PYPTR)) { - BM_data_layer_free(bm, &bm->edata, CD_BM_ELEM_PYPTR); - } - if (CustomData_has_layer(&bm->pdata, CD_BM_ELEM_PYPTR)) { - BM_data_layer_free(bm, &bm->pdata, CD_BM_ELEM_PYPTR); - } - if (CustomData_has_layer(&bm->ldata, CD_BM_ELEM_PYPTR)) { - BM_data_layer_free(bm, &bm->ldata, CD_BM_ELEM_PYPTR); - } + if (CustomData_has_layer(&bm->vdata, CD_BM_ELEM_PYPTR)) { + BM_data_layer_free(bm, &bm->vdata, CD_BM_ELEM_PYPTR); + } + if (CustomData_has_layer(&bm->edata, CD_BM_ELEM_PYPTR)) { + BM_data_layer_free(bm, &bm->edata, CD_BM_ELEM_PYPTR); + } + if (CustomData_has_layer(&bm->pdata, CD_BM_ELEM_PYPTR)) { + BM_data_layer_free(bm, &bm->pdata, CD_BM_ELEM_PYPTR); + } + if (CustomData_has_layer(&bm->ldata, CD_BM_ELEM_PYPTR)) { + BM_data_layer_free(bm, &bm->ldata, CD_BM_ELEM_PYPTR); + } - bm->py_handle = NULL; + bm->py_handle = NULL; - if ((self->flag & BPY_BMFLAG_IS_WRAPPED) == 0) { - BM_mesh_free(bm); - } - } + if ((self->flag & BPY_BMFLAG_IS_WRAPPED) == 0) { + BM_mesh_free(bm); + } + } - PyObject_DEL(self); + PyObject_DEL(self); } static void bpy_bmvert_dealloc(BPy_BMElem *self) { - BMesh *bm = self->bm; - if (bm) { - void **ptr = CustomData_bmesh_get(&bm->vdata, self->ele->head.data, CD_BM_ELEM_PYPTR); - if (ptr) { - *ptr = NULL; - } - } - PyObject_DEL(self); + BMesh *bm = self->bm; + if (bm) { + void **ptr = CustomData_bmesh_get(&bm->vdata, self->ele->head.data, CD_BM_ELEM_PYPTR); + if (ptr) { + *ptr = NULL; + } + } + PyObject_DEL(self); } static void bpy_bmedge_dealloc(BPy_BMElem *self) { - BMesh *bm = self->bm; - if (bm) { - void **ptr = CustomData_bmesh_get(&bm->edata, self->ele->head.data, CD_BM_ELEM_PYPTR); - if (ptr) { - *ptr = NULL; - } - } - PyObject_DEL(self); + BMesh *bm = self->bm; + if (bm) { + void **ptr = CustomData_bmesh_get(&bm->edata, self->ele->head.data, CD_BM_ELEM_PYPTR); + if (ptr) { + *ptr = NULL; + } + } + PyObject_DEL(self); } static void bpy_bmface_dealloc(BPy_BMElem *self) { - BMesh *bm = self->bm; - if (bm) { - void **ptr = CustomData_bmesh_get(&bm->pdata, self->ele->head.data, CD_BM_ELEM_PYPTR); - if (ptr) { - *ptr = NULL; - } - } - PyObject_DEL(self); + BMesh *bm = self->bm; + if (bm) { + void **ptr = CustomData_bmesh_get(&bm->pdata, self->ele->head.data, CD_BM_ELEM_PYPTR); + if (ptr) { + *ptr = NULL; + } + } + PyObject_DEL(self); } static void bpy_bmloop_dealloc(BPy_BMElem *self) { - BMesh *bm = self->bm; - if (bm) { - void **ptr = CustomData_bmesh_get(&bm->ldata, self->ele->head.data, CD_BM_ELEM_PYPTR); - if (ptr) { - *ptr = NULL; - } - } - PyObject_DEL(self); + BMesh *bm = self->bm; + if (bm) { + void **ptr = CustomData_bmesh_get(&bm->ldata, self->ele->head.data, CD_BM_ELEM_PYPTR); + if (ptr) { + *ptr = NULL; + } + } + PyObject_DEL(self); } static void bpy_bmelemseq_dealloc(BPy_BMElemSeq *self) { - Py_XDECREF(self->py_ele); + Py_XDECREF(self->py_ele); - PyObject_DEL(self); + PyObject_DEL(self); } /* not sure where this should go */ static Py_hash_t bpy_bm_elem_hash(PyObject *self) { - return _Py_HashPointer(((BPy_BMElem *)self)->ele); + return _Py_HashPointer(((BPy_BMElem *)self)->ele); } static Py_hash_t bpy_bm_hash(PyObject *self) { - return _Py_HashPointer(((BPy_BMesh *)self)->bm); + return _Py_HashPointer(((BPy_BMesh *)self)->bm); } /* Type Docstrings * =============== */ -PyDoc_STRVAR(bpy_bmesh_doc, -"The BMesh data structure\n" -); -PyDoc_STRVAR(bpy_bmvert_doc, -"The BMesh vertex type\n" -); -PyDoc_STRVAR(bpy_bmedge_doc, -"The BMesh edge connecting 2 verts\n" -); -PyDoc_STRVAR(bpy_bmface_doc, -"The BMesh face with 3 or more sides\n" -); +PyDoc_STRVAR(bpy_bmesh_doc, "The BMesh data structure\n"); +PyDoc_STRVAR(bpy_bmvert_doc, "The BMesh vertex type\n"); +PyDoc_STRVAR(bpy_bmedge_doc, "The BMesh edge connecting 2 verts\n"); +PyDoc_STRVAR(bpy_bmface_doc, "The BMesh face with 3 or more sides\n"); PyDoc_STRVAR(bpy_bmloop_doc, -"This is normally accessed from :class:`BMFace.loops` where each face loop represents a corner of the face.\n" -); + "This is normally accessed from :class:`BMFace.loops` where each face loop " + "represents a corner of the face.\n"); PyDoc_STRVAR(bpy_bmelemseq_doc, -"General sequence type used for accessing any sequence of\n" -":class:`BMVert`, :class:`BMEdge`, :class:`BMFace`, :class:`BMLoop`.\n" -"\n" -"When accessed via :class:`BMesh.verts`, :class:`BMesh.edges`, :class:`BMesh.faces`\n" -"there are also functions to create/remomove items.\n" -); + "General sequence type used for accessing any sequence of\n" + ":class:`BMVert`, :class:`BMEdge`, :class:`BMFace`, :class:`BMLoop`.\n" + "\n" + "When accessed via :class:`BMesh.verts`, :class:`BMesh.edges`, :class:`BMesh.faces`\n" + "there are also functions to create/remomove items.\n"); PyDoc_STRVAR(bpy_bmiter_doc, -"Internal BMesh type for looping over verts/faces/edges,\n" -"used for iterating over :class:`BMElemSeq` types.\n" -); + "Internal BMesh type for looping over verts/faces/edges,\n" + "used for iterating over :class:`BMElemSeq` types.\n"); static PyObject *bpy_bmesh_repr(BPy_BMesh *self) { - BMesh *bm = self->bm; + BMesh *bm = self->bm; - if (bm) { - return PyUnicode_FromFormat("<BMesh(%p), totvert=%d, totedge=%d, totface=%d, totloop=%d>", - bm, bm->totvert, bm->totedge, bm->totface, bm->totloop); - } - else { - return PyUnicode_FromFormat("<BMesh dead at %p>", self); - } + if (bm) { + return PyUnicode_FromFormat("<BMesh(%p), totvert=%d, totedge=%d, totface=%d, totloop=%d>", + bm, + bm->totvert, + bm->totedge, + bm->totface, + bm->totloop); + } + else { + return PyUnicode_FromFormat("<BMesh dead at %p>", self); + } } static PyObject *bpy_bmvert_repr(BPy_BMVert *self) { - BMesh *bm = self->bm; + BMesh *bm = self->bm; - if (bm) { - BMVert *v = self->v; - return PyUnicode_FromFormat("<BMVert(%p), index=%d>", - v, BM_elem_index_get(v)); - } - else { - return PyUnicode_FromFormat("<BMVert dead at %p>", self); - } + if (bm) { + BMVert *v = self->v; + return PyUnicode_FromFormat("<BMVert(%p), index=%d>", v, BM_elem_index_get(v)); + } + else { + return PyUnicode_FromFormat("<BMVert dead at %p>", self); + } } static PyObject *bpy_bmedge_repr(BPy_BMEdge *self) { - BMesh *bm = self->bm; + BMesh *bm = self->bm; - if (bm) { - BMEdge *e = self->e; - return PyUnicode_FromFormat("<BMEdge(%p), index=%d, verts=(%p/%d, %p/%d)>", - e, BM_elem_index_get(e), - e->v1, BM_elem_index_get(e->v1), - e->v2, BM_elem_index_get(e->v2)); - } - else { - return PyUnicode_FromFormat("<BMEdge dead at %p>", self); - } + if (bm) { + BMEdge *e = self->e; + return PyUnicode_FromFormat("<BMEdge(%p), index=%d, verts=(%p/%d, %p/%d)>", + e, + BM_elem_index_get(e), + e->v1, + BM_elem_index_get(e->v1), + e->v2, + BM_elem_index_get(e->v2)); + } + else { + return PyUnicode_FromFormat("<BMEdge dead at %p>", self); + } } static PyObject *bpy_bmface_repr(BPy_BMFace *self) { - BMesh *bm = self->bm; + BMesh *bm = self->bm; - if (bm) { - BMFace *f = self->f; - return PyUnicode_FromFormat("<BMFace(%p), index=%d, totverts=%d>", - f, BM_elem_index_get(f), - f->len); - } - else { - return PyUnicode_FromFormat("<BMFace dead at %p>", self); - } + if (bm) { + BMFace *f = self->f; + return PyUnicode_FromFormat( + "<BMFace(%p), index=%d, totverts=%d>", f, BM_elem_index_get(f), f->len); + } + else { + return PyUnicode_FromFormat("<BMFace dead at %p>", self); + } } static PyObject *bpy_bmloop_repr(BPy_BMLoop *self) { - BMesh *bm = self->bm; - - if (bm) { - BMLoop *l = self->l; - return PyUnicode_FromFormat("<BMLoop(%p), index=%d, vert=%p/%d, edge=%p/%d, face=%p/%d>", - l, BM_elem_index_get(l), - l->v, BM_elem_index_get(l->v), - l->e, BM_elem_index_get(l->e), - l->f, BM_elem_index_get(l->f)); - } - else { - return PyUnicode_FromFormat("<BMLoop dead at %p>", self); - } + BMesh *bm = self->bm; + + if (bm) { + BMLoop *l = self->l; + return PyUnicode_FromFormat("<BMLoop(%p), index=%d, vert=%p/%d, edge=%p/%d, face=%p/%d>", + l, + BM_elem_index_get(l), + l->v, + BM_elem_index_get(l->v), + l->e, + BM_elem_index_get(l->e), + l->f, + BM_elem_index_get(l->f)); + } + else { + return PyUnicode_FromFormat("<BMLoop dead at %p>", self); + } } /* Types @@ -3398,220 +3644,213 @@ PyTypeObject BPy_BMFaceSeq_Type; PyTypeObject BPy_BMLoopSeq_Type; PyTypeObject BPy_BMIter_Type; - - void BPy_BM_init_types(void) { - BPy_BMesh_Type.tp_basicsize = sizeof(BPy_BMesh); - BPy_BMVert_Type.tp_basicsize = sizeof(BPy_BMVert); - BPy_BMEdge_Type.tp_basicsize = sizeof(BPy_BMEdge); - BPy_BMFace_Type.tp_basicsize = sizeof(BPy_BMFace); - BPy_BMLoop_Type.tp_basicsize = sizeof(BPy_BMLoop); - BPy_BMElemSeq_Type.tp_basicsize = sizeof(BPy_BMElemSeq); - BPy_BMVertSeq_Type.tp_basicsize = sizeof(BPy_BMElemSeq); - BPy_BMEdgeSeq_Type.tp_basicsize = sizeof(BPy_BMElemSeq); - BPy_BMFaceSeq_Type.tp_basicsize = sizeof(BPy_BMElemSeq); - BPy_BMLoopSeq_Type.tp_basicsize = sizeof(BPy_BMElemSeq); - BPy_BMIter_Type.tp_basicsize = sizeof(BPy_BMIter); - - - BPy_BMesh_Type.tp_name = "BMesh"; - BPy_BMVert_Type.tp_name = "BMVert"; - BPy_BMEdge_Type.tp_name = "BMEdge"; - BPy_BMFace_Type.tp_name = "BMFace"; - BPy_BMLoop_Type.tp_name = "BMLoop"; - BPy_BMElemSeq_Type.tp_name = "BMElemSeq"; - BPy_BMVertSeq_Type.tp_name = "BMVertSeq"; - BPy_BMEdgeSeq_Type.tp_name = "BMEdgeSeq"; - BPy_BMFaceSeq_Type.tp_name = "BMFaceSeq"; - BPy_BMLoopSeq_Type.tp_name = "BMLoopSeq"; - BPy_BMIter_Type.tp_name = "BMIter"; - - - BPy_BMesh_Type.tp_doc = bpy_bmesh_doc; - BPy_BMVert_Type.tp_doc = bpy_bmvert_doc; - BPy_BMEdge_Type.tp_doc = bpy_bmedge_doc; - BPy_BMFace_Type.tp_doc = bpy_bmface_doc; - BPy_BMLoop_Type.tp_doc = bpy_bmloop_doc; - BPy_BMElemSeq_Type.tp_doc = bpy_bmelemseq_doc; - BPy_BMVertSeq_Type.tp_doc = NULL; - BPy_BMEdgeSeq_Type.tp_doc = NULL; - BPy_BMFaceSeq_Type.tp_doc = NULL; - BPy_BMLoopSeq_Type.tp_doc = NULL; - BPy_BMIter_Type.tp_doc = bpy_bmiter_doc; - - - BPy_BMesh_Type.tp_repr = (reprfunc)bpy_bmesh_repr; - BPy_BMVert_Type.tp_repr = (reprfunc)bpy_bmvert_repr; - BPy_BMEdge_Type.tp_repr = (reprfunc)bpy_bmedge_repr; - BPy_BMFace_Type.tp_repr = (reprfunc)bpy_bmface_repr; - BPy_BMLoop_Type.tp_repr = (reprfunc)bpy_bmloop_repr; - BPy_BMElemSeq_Type.tp_repr = NULL; - BPy_BMVertSeq_Type.tp_repr = NULL; - BPy_BMEdgeSeq_Type.tp_repr = NULL; - BPy_BMFaceSeq_Type.tp_repr = NULL; - BPy_BMLoopSeq_Type.tp_repr = NULL; - BPy_BMIter_Type.tp_repr = NULL; - - - BPy_BMesh_Type.tp_getset = bpy_bmesh_getseters; - BPy_BMVert_Type.tp_getset = bpy_bmvert_getseters; - BPy_BMEdge_Type.tp_getset = bpy_bmedge_getseters; - BPy_BMFace_Type.tp_getset = bpy_bmface_getseters; - BPy_BMLoop_Type.tp_getset = bpy_bmloop_getseters; - BPy_BMElemSeq_Type.tp_getset = NULL; - BPy_BMVertSeq_Type.tp_getset = bpy_bmvertseq_getseters; - BPy_BMEdgeSeq_Type.tp_getset = bpy_bmedgeseq_getseters; - BPy_BMFaceSeq_Type.tp_getset = bpy_bmfaceseq_getseters; - BPy_BMLoopSeq_Type.tp_getset = bpy_bmloopseq_getseters; - BPy_BMIter_Type.tp_getset = NULL; - - - BPy_BMesh_Type.tp_methods = bpy_bmesh_methods; - BPy_BMVert_Type.tp_methods = bpy_bmvert_methods; - BPy_BMEdge_Type.tp_methods = bpy_bmedge_methods; - BPy_BMFace_Type.tp_methods = bpy_bmface_methods; - BPy_BMLoop_Type.tp_methods = bpy_bmloop_methods; - BPy_BMElemSeq_Type.tp_methods = bpy_bmelemseq_methods; - BPy_BMVertSeq_Type.tp_methods = bpy_bmvertseq_methods; - BPy_BMEdgeSeq_Type.tp_methods = bpy_bmedgeseq_methods; - BPy_BMFaceSeq_Type.tp_methods = bpy_bmfaceseq_methods; - BPy_BMLoopSeq_Type.tp_methods = bpy_bmloopseq_methods; - BPy_BMIter_Type.tp_methods = NULL; - - /*BPy_BMElem_Check() uses bpy_bm_elem_hash() to check types. - * if this changes update the macro */ - BPy_BMesh_Type.tp_hash = bpy_bm_hash; - BPy_BMVert_Type.tp_hash = bpy_bm_elem_hash; - BPy_BMEdge_Type.tp_hash = bpy_bm_elem_hash; - BPy_BMFace_Type.tp_hash = bpy_bm_elem_hash; - BPy_BMLoop_Type.tp_hash = bpy_bm_elem_hash; - BPy_BMElemSeq_Type.tp_hash = NULL; - BPy_BMVertSeq_Type.tp_hash = NULL; - BPy_BMEdgeSeq_Type.tp_hash = NULL; - BPy_BMFaceSeq_Type.tp_hash = NULL; - BPy_BMLoopSeq_Type.tp_hash = NULL; - BPy_BMIter_Type.tp_hash = NULL; - - BPy_BMElemSeq_Type.tp_as_sequence = &bpy_bmelemseq_as_sequence; - BPy_BMVertSeq_Type.tp_as_sequence = &bpy_bmelemseq_as_sequence; - BPy_BMEdgeSeq_Type.tp_as_sequence = &bpy_bmelemseq_as_sequence; - BPy_BMFaceSeq_Type.tp_as_sequence = &bpy_bmelemseq_as_sequence; - BPy_BMLoopSeq_Type.tp_as_sequence = NULL; /* this is not a seq really, only for layer access */ - - BPy_BMElemSeq_Type.tp_as_mapping = &bpy_bmelemseq_as_mapping; - BPy_BMVertSeq_Type.tp_as_mapping = &bpy_bmelemseq_as_mapping; - BPy_BMEdgeSeq_Type.tp_as_mapping = &bpy_bmelemseq_as_mapping; - BPy_BMFaceSeq_Type.tp_as_mapping = &bpy_bmelemseq_as_mapping; - BPy_BMLoopSeq_Type.tp_as_mapping = NULL; /* this is not a seq really, only for layer access */ - - /* layer access */ - BPy_BMVert_Type.tp_as_mapping = &bpy_bm_elem_as_mapping; - BPy_BMEdge_Type.tp_as_mapping = &bpy_bm_elem_as_mapping; - BPy_BMFace_Type.tp_as_mapping = &bpy_bm_elem_as_mapping; - BPy_BMLoop_Type.tp_as_mapping = &bpy_bm_elem_as_mapping; - - BPy_BMElemSeq_Type.tp_iter = (getiterfunc)bpy_bmelemseq_iter; - BPy_BMVertSeq_Type.tp_iter = (getiterfunc)bpy_bmelemseq_iter; - BPy_BMEdgeSeq_Type.tp_iter = (getiterfunc)bpy_bmelemseq_iter; - BPy_BMFaceSeq_Type.tp_iter = (getiterfunc)bpy_bmelemseq_iter; - BPy_BMLoopSeq_Type.tp_iter = NULL; /* no mapping */ - - /* only 1 iteratir so far */ - BPy_BMIter_Type.tp_iternext = (iternextfunc)bpy_bmiter_next; - BPy_BMIter_Type.tp_iter = PyObject_SelfIter; - - BPy_BMesh_Type.tp_dealloc = (destructor)bpy_bmesh_dealloc; - BPy_BMVert_Type.tp_dealloc = (destructor)bpy_bmvert_dealloc; - BPy_BMEdge_Type.tp_dealloc = (destructor)bpy_bmedge_dealloc; - BPy_BMFace_Type.tp_dealloc = (destructor)bpy_bmface_dealloc; - BPy_BMLoop_Type.tp_dealloc = (destructor)bpy_bmloop_dealloc; - BPy_BMElemSeq_Type.tp_dealloc = (destructor)bpy_bmelemseq_dealloc; - BPy_BMVertSeq_Type.tp_dealloc = (destructor)bpy_bmelemseq_dealloc; - BPy_BMEdgeSeq_Type.tp_dealloc = (destructor)bpy_bmelemseq_dealloc; - BPy_BMFaceSeq_Type.tp_dealloc = (destructor)bpy_bmelemseq_dealloc; - BPy_BMLoopSeq_Type.tp_dealloc = (destructor)bpy_bmelemseq_dealloc; - BPy_BMIter_Type.tp_dealloc = NULL; - - BPy_BMesh_Type.tp_flags = Py_TPFLAGS_DEFAULT; - BPy_BMVert_Type.tp_flags = Py_TPFLAGS_DEFAULT; - BPy_BMEdge_Type.tp_flags = Py_TPFLAGS_DEFAULT; - BPy_BMFace_Type.tp_flags = Py_TPFLAGS_DEFAULT; - BPy_BMLoop_Type.tp_flags = Py_TPFLAGS_DEFAULT; - BPy_BMElemSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT; - BPy_BMVertSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT; - BPy_BMEdgeSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT; - BPy_BMFaceSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT; - BPy_BMLoopSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT; - BPy_BMIter_Type.tp_flags = Py_TPFLAGS_DEFAULT; - - - PyType_Ready(&BPy_BMesh_Type); - PyType_Ready(&BPy_BMVert_Type); - PyType_Ready(&BPy_BMEdge_Type); - PyType_Ready(&BPy_BMFace_Type); - PyType_Ready(&BPy_BMLoop_Type); - PyType_Ready(&BPy_BMElemSeq_Type); - PyType_Ready(&BPy_BMVertSeq_Type); - PyType_Ready(&BPy_BMEdgeSeq_Type); - PyType_Ready(&BPy_BMFaceSeq_Type); - PyType_Ready(&BPy_BMLoopSeq_Type); - PyType_Ready(&BPy_BMIter_Type); + BPy_BMesh_Type.tp_basicsize = sizeof(BPy_BMesh); + BPy_BMVert_Type.tp_basicsize = sizeof(BPy_BMVert); + BPy_BMEdge_Type.tp_basicsize = sizeof(BPy_BMEdge); + BPy_BMFace_Type.tp_basicsize = sizeof(BPy_BMFace); + BPy_BMLoop_Type.tp_basicsize = sizeof(BPy_BMLoop); + BPy_BMElemSeq_Type.tp_basicsize = sizeof(BPy_BMElemSeq); + BPy_BMVertSeq_Type.tp_basicsize = sizeof(BPy_BMElemSeq); + BPy_BMEdgeSeq_Type.tp_basicsize = sizeof(BPy_BMElemSeq); + BPy_BMFaceSeq_Type.tp_basicsize = sizeof(BPy_BMElemSeq); + BPy_BMLoopSeq_Type.tp_basicsize = sizeof(BPy_BMElemSeq); + BPy_BMIter_Type.tp_basicsize = sizeof(BPy_BMIter); + + BPy_BMesh_Type.tp_name = "BMesh"; + BPy_BMVert_Type.tp_name = "BMVert"; + BPy_BMEdge_Type.tp_name = "BMEdge"; + BPy_BMFace_Type.tp_name = "BMFace"; + BPy_BMLoop_Type.tp_name = "BMLoop"; + BPy_BMElemSeq_Type.tp_name = "BMElemSeq"; + BPy_BMVertSeq_Type.tp_name = "BMVertSeq"; + BPy_BMEdgeSeq_Type.tp_name = "BMEdgeSeq"; + BPy_BMFaceSeq_Type.tp_name = "BMFaceSeq"; + BPy_BMLoopSeq_Type.tp_name = "BMLoopSeq"; + BPy_BMIter_Type.tp_name = "BMIter"; + + BPy_BMesh_Type.tp_doc = bpy_bmesh_doc; + BPy_BMVert_Type.tp_doc = bpy_bmvert_doc; + BPy_BMEdge_Type.tp_doc = bpy_bmedge_doc; + BPy_BMFace_Type.tp_doc = bpy_bmface_doc; + BPy_BMLoop_Type.tp_doc = bpy_bmloop_doc; + BPy_BMElemSeq_Type.tp_doc = bpy_bmelemseq_doc; + BPy_BMVertSeq_Type.tp_doc = NULL; + BPy_BMEdgeSeq_Type.tp_doc = NULL; + BPy_BMFaceSeq_Type.tp_doc = NULL; + BPy_BMLoopSeq_Type.tp_doc = NULL; + BPy_BMIter_Type.tp_doc = bpy_bmiter_doc; + + BPy_BMesh_Type.tp_repr = (reprfunc)bpy_bmesh_repr; + BPy_BMVert_Type.tp_repr = (reprfunc)bpy_bmvert_repr; + BPy_BMEdge_Type.tp_repr = (reprfunc)bpy_bmedge_repr; + BPy_BMFace_Type.tp_repr = (reprfunc)bpy_bmface_repr; + BPy_BMLoop_Type.tp_repr = (reprfunc)bpy_bmloop_repr; + BPy_BMElemSeq_Type.tp_repr = NULL; + BPy_BMVertSeq_Type.tp_repr = NULL; + BPy_BMEdgeSeq_Type.tp_repr = NULL; + BPy_BMFaceSeq_Type.tp_repr = NULL; + BPy_BMLoopSeq_Type.tp_repr = NULL; + BPy_BMIter_Type.tp_repr = NULL; + + BPy_BMesh_Type.tp_getset = bpy_bmesh_getseters; + BPy_BMVert_Type.tp_getset = bpy_bmvert_getseters; + BPy_BMEdge_Type.tp_getset = bpy_bmedge_getseters; + BPy_BMFace_Type.tp_getset = bpy_bmface_getseters; + BPy_BMLoop_Type.tp_getset = bpy_bmloop_getseters; + BPy_BMElemSeq_Type.tp_getset = NULL; + BPy_BMVertSeq_Type.tp_getset = bpy_bmvertseq_getseters; + BPy_BMEdgeSeq_Type.tp_getset = bpy_bmedgeseq_getseters; + BPy_BMFaceSeq_Type.tp_getset = bpy_bmfaceseq_getseters; + BPy_BMLoopSeq_Type.tp_getset = bpy_bmloopseq_getseters; + BPy_BMIter_Type.tp_getset = NULL; + + BPy_BMesh_Type.tp_methods = bpy_bmesh_methods; + BPy_BMVert_Type.tp_methods = bpy_bmvert_methods; + BPy_BMEdge_Type.tp_methods = bpy_bmedge_methods; + BPy_BMFace_Type.tp_methods = bpy_bmface_methods; + BPy_BMLoop_Type.tp_methods = bpy_bmloop_methods; + BPy_BMElemSeq_Type.tp_methods = bpy_bmelemseq_methods; + BPy_BMVertSeq_Type.tp_methods = bpy_bmvertseq_methods; + BPy_BMEdgeSeq_Type.tp_methods = bpy_bmedgeseq_methods; + BPy_BMFaceSeq_Type.tp_methods = bpy_bmfaceseq_methods; + BPy_BMLoopSeq_Type.tp_methods = bpy_bmloopseq_methods; + BPy_BMIter_Type.tp_methods = NULL; + + /*BPy_BMElem_Check() uses bpy_bm_elem_hash() to check types. + * if this changes update the macro */ + BPy_BMesh_Type.tp_hash = bpy_bm_hash; + BPy_BMVert_Type.tp_hash = bpy_bm_elem_hash; + BPy_BMEdge_Type.tp_hash = bpy_bm_elem_hash; + BPy_BMFace_Type.tp_hash = bpy_bm_elem_hash; + BPy_BMLoop_Type.tp_hash = bpy_bm_elem_hash; + BPy_BMElemSeq_Type.tp_hash = NULL; + BPy_BMVertSeq_Type.tp_hash = NULL; + BPy_BMEdgeSeq_Type.tp_hash = NULL; + BPy_BMFaceSeq_Type.tp_hash = NULL; + BPy_BMLoopSeq_Type.tp_hash = NULL; + BPy_BMIter_Type.tp_hash = NULL; + + BPy_BMElemSeq_Type.tp_as_sequence = &bpy_bmelemseq_as_sequence; + BPy_BMVertSeq_Type.tp_as_sequence = &bpy_bmelemseq_as_sequence; + BPy_BMEdgeSeq_Type.tp_as_sequence = &bpy_bmelemseq_as_sequence; + BPy_BMFaceSeq_Type.tp_as_sequence = &bpy_bmelemseq_as_sequence; + BPy_BMLoopSeq_Type.tp_as_sequence = NULL; /* this is not a seq really, only for layer access */ + + BPy_BMElemSeq_Type.tp_as_mapping = &bpy_bmelemseq_as_mapping; + BPy_BMVertSeq_Type.tp_as_mapping = &bpy_bmelemseq_as_mapping; + BPy_BMEdgeSeq_Type.tp_as_mapping = &bpy_bmelemseq_as_mapping; + BPy_BMFaceSeq_Type.tp_as_mapping = &bpy_bmelemseq_as_mapping; + BPy_BMLoopSeq_Type.tp_as_mapping = NULL; /* this is not a seq really, only for layer access */ + + /* layer access */ + BPy_BMVert_Type.tp_as_mapping = &bpy_bm_elem_as_mapping; + BPy_BMEdge_Type.tp_as_mapping = &bpy_bm_elem_as_mapping; + BPy_BMFace_Type.tp_as_mapping = &bpy_bm_elem_as_mapping; + BPy_BMLoop_Type.tp_as_mapping = &bpy_bm_elem_as_mapping; + + BPy_BMElemSeq_Type.tp_iter = (getiterfunc)bpy_bmelemseq_iter; + BPy_BMVertSeq_Type.tp_iter = (getiterfunc)bpy_bmelemseq_iter; + BPy_BMEdgeSeq_Type.tp_iter = (getiterfunc)bpy_bmelemseq_iter; + BPy_BMFaceSeq_Type.tp_iter = (getiterfunc)bpy_bmelemseq_iter; + BPy_BMLoopSeq_Type.tp_iter = NULL; /* no mapping */ + + /* only 1 iteratir so far */ + BPy_BMIter_Type.tp_iternext = (iternextfunc)bpy_bmiter_next; + BPy_BMIter_Type.tp_iter = PyObject_SelfIter; + + BPy_BMesh_Type.tp_dealloc = (destructor)bpy_bmesh_dealloc; + BPy_BMVert_Type.tp_dealloc = (destructor)bpy_bmvert_dealloc; + BPy_BMEdge_Type.tp_dealloc = (destructor)bpy_bmedge_dealloc; + BPy_BMFace_Type.tp_dealloc = (destructor)bpy_bmface_dealloc; + BPy_BMLoop_Type.tp_dealloc = (destructor)bpy_bmloop_dealloc; + BPy_BMElemSeq_Type.tp_dealloc = (destructor)bpy_bmelemseq_dealloc; + BPy_BMVertSeq_Type.tp_dealloc = (destructor)bpy_bmelemseq_dealloc; + BPy_BMEdgeSeq_Type.tp_dealloc = (destructor)bpy_bmelemseq_dealloc; + BPy_BMFaceSeq_Type.tp_dealloc = (destructor)bpy_bmelemseq_dealloc; + BPy_BMLoopSeq_Type.tp_dealloc = (destructor)bpy_bmelemseq_dealloc; + BPy_BMIter_Type.tp_dealloc = NULL; + + BPy_BMesh_Type.tp_flags = Py_TPFLAGS_DEFAULT; + BPy_BMVert_Type.tp_flags = Py_TPFLAGS_DEFAULT; + BPy_BMEdge_Type.tp_flags = Py_TPFLAGS_DEFAULT; + BPy_BMFace_Type.tp_flags = Py_TPFLAGS_DEFAULT; + BPy_BMLoop_Type.tp_flags = Py_TPFLAGS_DEFAULT; + BPy_BMElemSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT; + BPy_BMVertSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT; + BPy_BMEdgeSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT; + BPy_BMFaceSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT; + BPy_BMLoopSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT; + BPy_BMIter_Type.tp_flags = Py_TPFLAGS_DEFAULT; + + PyType_Ready(&BPy_BMesh_Type); + PyType_Ready(&BPy_BMVert_Type); + PyType_Ready(&BPy_BMEdge_Type); + PyType_Ready(&BPy_BMFace_Type); + PyType_Ready(&BPy_BMLoop_Type); + PyType_Ready(&BPy_BMElemSeq_Type); + PyType_Ready(&BPy_BMVertSeq_Type); + PyType_Ready(&BPy_BMEdgeSeq_Type); + PyType_Ready(&BPy_BMFaceSeq_Type); + PyType_Ready(&BPy_BMLoopSeq_Type); + PyType_Ready(&BPy_BMIter_Type); } /* bmesh.types submodule * ********************* */ static struct PyModuleDef BPy_BM_types_module_def = { - PyModuleDef_HEAD_INIT, - "bmesh.types", /* m_name */ - NULL, /* m_doc */ - 0, /* m_size */ - NULL, /* m_methods */ - NULL, /* m_reload */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL, /* m_free */ + PyModuleDef_HEAD_INIT, + "bmesh.types", /* m_name */ + NULL, /* m_doc */ + 0, /* m_size */ + NULL, /* m_methods */ + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL, /* m_free */ }; PyObject *BPyInit_bmesh_types(void) { - PyObject *submodule; + PyObject *submodule; - submodule = PyModule_Create(&BPy_BM_types_module_def); + submodule = PyModule_Create(&BPy_BM_types_module_def); #define MODULE_TYPE_ADD(s, t) \ - PyModule_AddObject(s, t.tp_name, (PyObject *)&t); Py_INCREF((PyObject *)&t) - - /* bmesh_py_types.c */ - MODULE_TYPE_ADD(submodule, BPy_BMesh_Type); - MODULE_TYPE_ADD(submodule, BPy_BMVert_Type); - MODULE_TYPE_ADD(submodule, BPy_BMEdge_Type); - MODULE_TYPE_ADD(submodule, BPy_BMFace_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLoop_Type); - MODULE_TYPE_ADD(submodule, BPy_BMElemSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMVertSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMEdgeSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMFaceSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLoopSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMIter_Type); - /* bmesh_py_types_select.c */ - MODULE_TYPE_ADD(submodule, BPy_BMEditSelSeq_Type); - MODULE_TYPE_ADD(submodule, BPy_BMEditSelIter_Type); - /* bmesh_py_types_customdata.c */ - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessVert_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessEdge_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessFace_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessLoop_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerCollection_Type); - MODULE_TYPE_ADD(submodule, BPy_BMLayerItem_Type); - /* bmesh_py_types_meshdata.c */ - MODULE_TYPE_ADD(submodule, BPy_BMLoopUV_Type); - MODULE_TYPE_ADD(submodule, BPy_BMDeformVert_Type); + PyModule_AddObject(s, t.tp_name, (PyObject *)&t); \ + Py_INCREF((PyObject *)&t) + + /* bmesh_py_types.c */ + MODULE_TYPE_ADD(submodule, BPy_BMesh_Type); + MODULE_TYPE_ADD(submodule, BPy_BMVert_Type); + MODULE_TYPE_ADD(submodule, BPy_BMEdge_Type); + MODULE_TYPE_ADD(submodule, BPy_BMFace_Type); + MODULE_TYPE_ADD(submodule, BPy_BMLoop_Type); + MODULE_TYPE_ADD(submodule, BPy_BMElemSeq_Type); + MODULE_TYPE_ADD(submodule, BPy_BMVertSeq_Type); + MODULE_TYPE_ADD(submodule, BPy_BMEdgeSeq_Type); + MODULE_TYPE_ADD(submodule, BPy_BMFaceSeq_Type); + MODULE_TYPE_ADD(submodule, BPy_BMLoopSeq_Type); + MODULE_TYPE_ADD(submodule, BPy_BMIter_Type); + /* bmesh_py_types_select.c */ + MODULE_TYPE_ADD(submodule, BPy_BMEditSelSeq_Type); + MODULE_TYPE_ADD(submodule, BPy_BMEditSelIter_Type); + /* bmesh_py_types_customdata.c */ + MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessVert_Type); + MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessEdge_Type); + MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessFace_Type); + MODULE_TYPE_ADD(submodule, BPy_BMLayerAccessLoop_Type); + MODULE_TYPE_ADD(submodule, BPy_BMLayerCollection_Type); + MODULE_TYPE_ADD(submodule, BPy_BMLayerItem_Type); + /* bmesh_py_types_meshdata.c */ + MODULE_TYPE_ADD(submodule, BPy_BMLoopUV_Type); + MODULE_TYPE_ADD(submodule, BPy_BMDeformVert_Type); #undef MODULE_TYPE_ADD - return submodule; + return submodule; } /* Utility Functions @@ -3619,272 +3858,273 @@ PyObject *BPyInit_bmesh_types(void) PyObject *BPy_BMesh_CreatePyObject(BMesh *bm, int flag) { - BPy_BMesh *self; + BPy_BMesh *self; - if (bm->py_handle) { - self = bm->py_handle; - Py_INCREF(self); - } - else { - self = PyObject_New(BPy_BMesh, &BPy_BMesh_Type); - self->bm = bm; - self->flag = flag; + if (bm->py_handle) { + self = bm->py_handle; + Py_INCREF(self); + } + else { + self = PyObject_New(BPy_BMesh, &BPy_BMesh_Type); + self->bm = bm; + self->flag = flag; - bm->py_handle = self; /* point back */ + bm->py_handle = self; /* point back */ - /* avoid allocating layers when we don't have to */ + /* avoid allocating layers when we don't have to */ #if 0 - BM_data_layer_add(bm, &bm->vdata, CD_BM_ELEM_PYPTR); - BM_data_layer_add(bm, &bm->edata, CD_BM_ELEM_PYPTR); - BM_data_layer_add(bm, &bm->pdata, CD_BM_ELEM_PYPTR); - BM_data_layer_add(bm, &bm->ldata, CD_BM_ELEM_PYPTR); + BM_data_layer_add(bm, &bm->vdata, CD_BM_ELEM_PYPTR); + BM_data_layer_add(bm, &bm->edata, CD_BM_ELEM_PYPTR); + BM_data_layer_add(bm, &bm->pdata, CD_BM_ELEM_PYPTR); + BM_data_layer_add(bm, &bm->ldata, CD_BM_ELEM_PYPTR); #endif - } + } - return (PyObject *)self; + return (PyObject *)self; } - - PyObject *BPy_BMVert_CreatePyObject(BMesh *bm, BMVert *v) { - BPy_BMVert *self; + BPy_BMVert *self; - void **ptr = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_BM_ELEM_PYPTR); + void **ptr = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_BM_ELEM_PYPTR); - /* bmesh may free layers, ensure we have one to store ourself */ - if (UNLIKELY(ptr == NULL)) { - BM_data_layer_add(bm, &bm->vdata, CD_BM_ELEM_PYPTR); - ptr = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_BM_ELEM_PYPTR); - } + /* bmesh may free layers, ensure we have one to store ourself */ + if (UNLIKELY(ptr == NULL)) { + BM_data_layer_add(bm, &bm->vdata, CD_BM_ELEM_PYPTR); + ptr = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_BM_ELEM_PYPTR); + } - if (*ptr != NULL) { - self = *ptr; - Py_INCREF(self); - } - else { - self = PyObject_New(BPy_BMVert, &BPy_BMVert_Type); - BLI_assert(v != NULL); - self->bm = bm; - self->v = v; - *ptr = self; - } - return (PyObject *)self; + if (*ptr != NULL) { + self = *ptr; + Py_INCREF(self); + } + else { + self = PyObject_New(BPy_BMVert, &BPy_BMVert_Type); + BLI_assert(v != NULL); + self->bm = bm; + self->v = v; + *ptr = self; + } + return (PyObject *)self; } PyObject *BPy_BMEdge_CreatePyObject(BMesh *bm, BMEdge *e) { - BPy_BMEdge *self; + BPy_BMEdge *self; - void **ptr = CustomData_bmesh_get(&bm->edata, e->head.data, CD_BM_ELEM_PYPTR); + void **ptr = CustomData_bmesh_get(&bm->edata, e->head.data, CD_BM_ELEM_PYPTR); - /* bmesh may free layers, ensure we have one to store ourself */ - if (UNLIKELY(ptr == NULL)) { - BM_data_layer_add(bm, &bm->edata, CD_BM_ELEM_PYPTR); - ptr = CustomData_bmesh_get(&bm->edata, e->head.data, CD_BM_ELEM_PYPTR); - } + /* bmesh may free layers, ensure we have one to store ourself */ + if (UNLIKELY(ptr == NULL)) { + BM_data_layer_add(bm, &bm->edata, CD_BM_ELEM_PYPTR); + ptr = CustomData_bmesh_get(&bm->edata, e->head.data, CD_BM_ELEM_PYPTR); + } - if (*ptr != NULL) { - self = *ptr; - Py_INCREF(self); - } - else { - self = PyObject_New(BPy_BMEdge, &BPy_BMEdge_Type); - BLI_assert(e != NULL); - self->bm = bm; - self->e = e; - *ptr = self; - } - return (PyObject *)self; + if (*ptr != NULL) { + self = *ptr; + Py_INCREF(self); + } + else { + self = PyObject_New(BPy_BMEdge, &BPy_BMEdge_Type); + BLI_assert(e != NULL); + self->bm = bm; + self->e = e; + *ptr = self; + } + return (PyObject *)self; } PyObject *BPy_BMFace_CreatePyObject(BMesh *bm, BMFace *f) { - BPy_BMFace *self; + BPy_BMFace *self; - void **ptr = CustomData_bmesh_get(&bm->pdata, f->head.data, CD_BM_ELEM_PYPTR); + void **ptr = CustomData_bmesh_get(&bm->pdata, f->head.data, CD_BM_ELEM_PYPTR); - /* bmesh may free layers, ensure we have one to store ourself */ - if (UNLIKELY(ptr == NULL)) { - BM_data_layer_add(bm, &bm->pdata, CD_BM_ELEM_PYPTR); - ptr = CustomData_bmesh_get(&bm->pdata, f->head.data, CD_BM_ELEM_PYPTR); - } + /* bmesh may free layers, ensure we have one to store ourself */ + if (UNLIKELY(ptr == NULL)) { + BM_data_layer_add(bm, &bm->pdata, CD_BM_ELEM_PYPTR); + ptr = CustomData_bmesh_get(&bm->pdata, f->head.data, CD_BM_ELEM_PYPTR); + } - if (*ptr != NULL) { - self = *ptr; - Py_INCREF(self); - } - else { - self = PyObject_New(BPy_BMFace, &BPy_BMFace_Type); - BLI_assert(f != NULL); - self->bm = bm; - self->f = f; - *ptr = self; - } - return (PyObject *)self; + if (*ptr != NULL) { + self = *ptr; + Py_INCREF(self); + } + else { + self = PyObject_New(BPy_BMFace, &BPy_BMFace_Type); + BLI_assert(f != NULL); + self->bm = bm; + self->f = f; + *ptr = self; + } + return (PyObject *)self; } PyObject *BPy_BMLoop_CreatePyObject(BMesh *bm, BMLoop *l) { - BPy_BMLoop *self; + BPy_BMLoop *self; - void **ptr = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_BM_ELEM_PYPTR); + void **ptr = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_BM_ELEM_PYPTR); - /* bmesh may free layers, ensure we have one to store ourself */ - if (UNLIKELY(ptr == NULL)) { - BM_data_layer_add(bm, &bm->ldata, CD_BM_ELEM_PYPTR); - ptr = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_BM_ELEM_PYPTR); - } + /* bmesh may free layers, ensure we have one to store ourself */ + if (UNLIKELY(ptr == NULL)) { + BM_data_layer_add(bm, &bm->ldata, CD_BM_ELEM_PYPTR); + ptr = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_BM_ELEM_PYPTR); + } - if (*ptr != NULL) { - self = *ptr; - Py_INCREF(self); - } - else { - self = PyObject_New(BPy_BMLoop, &BPy_BMLoop_Type); - BLI_assert(l != NULL); - self->bm = bm; - self->l = l; - *ptr = self; - } - return (PyObject *)self; + if (*ptr != NULL) { + self = *ptr; + Py_INCREF(self); + } + else { + self = PyObject_New(BPy_BMLoop, &BPy_BMLoop_Type); + BLI_assert(l != NULL); + self->bm = bm; + self->l = l; + *ptr = self; + } + return (PyObject *)self; } PyObject *BPy_BMElemSeq_CreatePyObject(BMesh *bm, BPy_BMElem *py_ele, const char itype) { - BPy_BMElemSeq *self = PyObject_New(BPy_BMElemSeq, &BPy_BMElemSeq_Type); - self->bm = bm; - self->py_ele = py_ele; /* can be NULL */ - self->itype = itype; - Py_XINCREF(py_ele); - return (PyObject *)self; + BPy_BMElemSeq *self = PyObject_New(BPy_BMElemSeq, &BPy_BMElemSeq_Type); + self->bm = bm; + self->py_ele = py_ele; /* can be NULL */ + self->itype = itype; + Py_XINCREF(py_ele); + return (PyObject *)self; } PyObject *BPy_BMVertSeq_CreatePyObject(BMesh *bm) { - BPy_BMElemSeq *self = PyObject_New(BPy_BMElemSeq, &BPy_BMVertSeq_Type); - self->bm = bm; - self->py_ele = NULL; /* unused */ - self->itype = BM_VERTS_OF_MESH; - return (PyObject *)self; + BPy_BMElemSeq *self = PyObject_New(BPy_BMElemSeq, &BPy_BMVertSeq_Type); + self->bm = bm; + self->py_ele = NULL; /* unused */ + self->itype = BM_VERTS_OF_MESH; + return (PyObject *)self; } PyObject *BPy_BMEdgeSeq_CreatePyObject(BMesh *bm) { - BPy_BMElemSeq *self = PyObject_New(BPy_BMElemSeq, &BPy_BMEdgeSeq_Type); - self->bm = bm; - self->py_ele = NULL; /* unused */ - self->itype = BM_EDGES_OF_MESH; - return (PyObject *)self; + BPy_BMElemSeq *self = PyObject_New(BPy_BMElemSeq, &BPy_BMEdgeSeq_Type); + self->bm = bm; + self->py_ele = NULL; /* unused */ + self->itype = BM_EDGES_OF_MESH; + return (PyObject *)self; } PyObject *BPy_BMFaceSeq_CreatePyObject(BMesh *bm) { - BPy_BMElemSeq *self = PyObject_New(BPy_BMElemSeq, &BPy_BMFaceSeq_Type); - self->bm = bm; - self->py_ele = NULL; /* unused */ - self->itype = BM_FACES_OF_MESH; - return (PyObject *)self; + BPy_BMElemSeq *self = PyObject_New(BPy_BMElemSeq, &BPy_BMFaceSeq_Type); + self->bm = bm; + self->py_ele = NULL; /* unused */ + self->itype = BM_FACES_OF_MESH; + return (PyObject *)self; } PyObject *BPy_BMLoopSeq_CreatePyObject(BMesh *bm) { - BPy_BMElemSeq *self = PyObject_New(BPy_BMElemSeq, &BPy_BMLoopSeq_Type); - self->bm = bm; - self->py_ele = NULL; /* unused */ - self->itype = 0; /* should never be passed to the iterator function */ - return (PyObject *)self; + BPy_BMElemSeq *self = PyObject_New(BPy_BMElemSeq, &BPy_BMLoopSeq_Type); + self->bm = bm; + self->py_ele = NULL; /* unused */ + self->itype = 0; /* should never be passed to the iterator function */ + return (PyObject *)self; } PyObject *BPy_BMIter_CreatePyObject(BMesh *bm) { - BPy_BMIter *self = PyObject_New(BPy_BMIter, &BPy_BMIter_Type); - self->bm = bm; - /* caller must initialize 'iter' member */ - return (PyObject *)self; + BPy_BMIter *self = PyObject_New(BPy_BMIter, &BPy_BMIter_Type); + self->bm = bm; + /* caller must initialize 'iter' member */ + return (PyObject *)self; } /* this is just a helper func */ PyObject *BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele) { - switch (ele->htype) { - case BM_VERT: - return BPy_BMVert_CreatePyObject(bm, (BMVert *)ele); - case BM_EDGE: - return BPy_BMEdge_CreatePyObject(bm, (BMEdge *)ele); - case BM_FACE: - return BPy_BMFace_CreatePyObject(bm, (BMFace *)ele); - case BM_LOOP: - return BPy_BMLoop_CreatePyObject(bm, (BMLoop *)ele); - default: - BLI_assert(0); - PyErr_SetString(PyExc_SystemError, "internal error"); - return NULL; - } + switch (ele->htype) { + case BM_VERT: + return BPy_BMVert_CreatePyObject(bm, (BMVert *)ele); + case BM_EDGE: + return BPy_BMEdge_CreatePyObject(bm, (BMEdge *)ele); + case BM_FACE: + return BPy_BMFace_CreatePyObject(bm, (BMFace *)ele); + case BM_LOOP: + return BPy_BMLoop_CreatePyObject(bm, (BMLoop *)ele); + default: + BLI_assert(0); + PyErr_SetString(PyExc_SystemError, "internal error"); + return NULL; + } } int bpy_bm_generic_valid_check(BPy_BMGeneric *self) { - if (LIKELY(self->bm)) { + if (LIKELY(self->bm)) { - /* far too slow to enable by default but handy - * to uncomment for debugging tricky errors, - * note that this will throw error on entering a - * function where the actual error will be caused by - * the previous action. */ + /* far too slow to enable by default but handy + * to uncomment for debugging tricky errors, + * note that this will throw error on entering a + * function where the actual error will be caused by + * the previous action. */ #if 0 - if (BM_mesh_validate(self->bm) == false) { - PyErr_Format(PyExc_ReferenceError, - "BMesh used by %.200s has become invalid", - Py_TYPE(self)->tp_name); - return -1; - } + if (BM_mesh_validate(self->bm) == false) { + PyErr_Format(PyExc_ReferenceError, + "BMesh used by %.200s has become invalid", + Py_TYPE(self)->tp_name); + return -1; + } #endif - return 0; - } - else { - PyErr_Format(PyExc_ReferenceError, - "BMesh data of type %.200s has been removed", - Py_TYPE(self)->tp_name); - return -1; - } -} - -int bpy_bm_generic_valid_check_source(BMesh *bm_source, const char *error_prefix, void **args, unsigned int args_tot) -{ - int ret = 0; - - while (args_tot--) { - BPy_BMGeneric *py_bm_elem = args[args_tot]; - if (py_bm_elem) { - - BLI_assert(BPy_BMesh_Check(py_bm_elem) || - BPy_BMElem_Check(py_bm_elem)); - - ret = bpy_bm_generic_valid_check(py_bm_elem); - if (UNLIKELY(ret == -1)) { - break; - } - else { - if (UNLIKELY(py_bm_elem->bm != bm_source)) { - /* could give more info here */ - PyErr_Format(PyExc_ValueError, - "%.200s: BMesh data of type %.200s is from another mesh", - error_prefix, Py_TYPE(py_bm_elem)->tp_name); - ret = -1; - break; - } - } - } - } - - return ret; + return 0; + } + else { + PyErr_Format(PyExc_ReferenceError, + "BMesh data of type %.200s has been removed", + Py_TYPE(self)->tp_name); + return -1; + } +} + +int bpy_bm_generic_valid_check_source(BMesh *bm_source, + const char *error_prefix, + void **args, + unsigned int args_tot) +{ + int ret = 0; + + while (args_tot--) { + BPy_BMGeneric *py_bm_elem = args[args_tot]; + if (py_bm_elem) { + + BLI_assert(BPy_BMesh_Check(py_bm_elem) || BPy_BMElem_Check(py_bm_elem)); + + ret = bpy_bm_generic_valid_check(py_bm_elem); + if (UNLIKELY(ret == -1)) { + break; + } + else { + if (UNLIKELY(py_bm_elem->bm != bm_source)) { + /* could give more info here */ + PyErr_Format(PyExc_ValueError, + "%.200s: BMesh data of type %.200s is from another mesh", + error_prefix, + Py_TYPE(py_bm_elem)->tp_name); + ret = -1; + break; + } + } + } + } + + return ret; } void bpy_bm_generic_invalidate(BPy_BMGeneric *self) { - self->bm = NULL; + self->bm = NULL; } /* generic python seq as BMVert/Edge/Face array, @@ -3892,186 +4132,196 @@ void bpy_bm_generic_invalidate(BPy_BMGeneric *self) * * The 'bm_r' value is assigned when empty, and used when set. */ -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) -{ - BMesh *bm = (r_bm && *r_bm) ? *r_bm : NULL; - PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast); - const Py_ssize_t seq_len = PySequence_Fast_GET_SIZE(seq_fast); - Py_ssize_t i, i_last_dirty = PY_SSIZE_T_MAX; - - BPy_BMElem *item; - BMElem **alloc; - - *r_size = 0; - - if (seq_len < min || seq_len > max) { - PyErr_Format(PyExc_TypeError, - "%s: sequence incorrect size, expected [%d - %d], given %d", - error_prefix, min, max, seq_len); - return NULL; - } - - /* from now on, use goto */ - alloc = PyMem_MALLOC(seq_len * sizeof(BPy_BMElem **)); - - for (i = 0; i < seq_len; i++) { - item = (BPy_BMElem *)seq_fast_items[i]; - - if (!BPy_BMElem_CheckHType(Py_TYPE(item), htype)) { - PyErr_Format(PyExc_TypeError, - "%s: expected %.200s, not '%.200s'", - error_prefix, BPy_BMElem_StringFromHType(htype), Py_TYPE(item)->tp_name); - goto err_cleanup; - } - else if (!BPY_BM_IS_VALID(item)) { - PyErr_Format(PyExc_TypeError, - "%s: %d %s has been removed", - error_prefix, i, Py_TYPE(item)->tp_name); - goto err_cleanup; - } - /* trick so we can ensure all items have the same mesh, - * and allows us to pass the 'bm' as NULL. */ - else if (do_bm_check && (bm && bm != item->bm)) { - PyErr_Format(PyExc_ValueError, - "%s: %d %s is from another mesh", - error_prefix, i, BPy_BMElem_StringFromHType(htype)); - goto err_cleanup; - } - - if (bm == NULL) { - bm = item->bm; - } - - alloc[i] = item->ele; - - if (do_unique_check) { - BM_elem_flag_enable(item->ele, BM_ELEM_INTERNAL_TAG); - i_last_dirty = i; - } - } - - if (do_unique_check) { - /* check for double verts! */ - bool ok = true; - for (i = 0; i < seq_len; i++) { - if (UNLIKELY(BM_elem_flag_test(alloc[i], BM_ELEM_INTERNAL_TAG) == false)) { - ok = false; - } - - /* ensure we don't leave this enabled */ - BM_elem_flag_disable(alloc[i], BM_ELEM_INTERNAL_TAG); - } - - if (ok == false) { - /* Cleared above. */ - i_last_dirty = PY_SSIZE_T_MAX; - PyErr_Format(PyExc_ValueError, - "%s: found the same %.200s used multiple times", - error_prefix, BPy_BMElem_StringFromHType(htype)); - goto err_cleanup; - } - } - - *r_size = seq_len; - if (r_bm) { - *r_bm = bm; - } - return alloc; +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) +{ + BMesh *bm = (r_bm && *r_bm) ? *r_bm : NULL; + PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast); + const Py_ssize_t seq_len = PySequence_Fast_GET_SIZE(seq_fast); + Py_ssize_t i, i_last_dirty = PY_SSIZE_T_MAX; + + BPy_BMElem *item; + BMElem **alloc; + + *r_size = 0; + + if (seq_len < min || seq_len > max) { + PyErr_Format(PyExc_TypeError, + "%s: sequence incorrect size, expected [%d - %d], given %d", + error_prefix, + min, + max, + seq_len); + return NULL; + } + + /* from now on, use goto */ + alloc = PyMem_MALLOC(seq_len * sizeof(BPy_BMElem **)); + + for (i = 0; i < seq_len; i++) { + item = (BPy_BMElem *)seq_fast_items[i]; + + if (!BPy_BMElem_CheckHType(Py_TYPE(item), htype)) { + PyErr_Format(PyExc_TypeError, + "%s: expected %.200s, not '%.200s'", + error_prefix, + BPy_BMElem_StringFromHType(htype), + Py_TYPE(item)->tp_name); + goto err_cleanup; + } + else if (!BPY_BM_IS_VALID(item)) { + PyErr_Format( + PyExc_TypeError, "%s: %d %s has been removed", error_prefix, i, Py_TYPE(item)->tp_name); + goto err_cleanup; + } + /* trick so we can ensure all items have the same mesh, + * and allows us to pass the 'bm' as NULL. */ + else if (do_bm_check && (bm && bm != item->bm)) { + PyErr_Format(PyExc_ValueError, + "%s: %d %s is from another mesh", + error_prefix, + i, + BPy_BMElem_StringFromHType(htype)); + goto err_cleanup; + } + + if (bm == NULL) { + bm = item->bm; + } + + alloc[i] = item->ele; + + if (do_unique_check) { + BM_elem_flag_enable(item->ele, BM_ELEM_INTERNAL_TAG); + i_last_dirty = i; + } + } + + if (do_unique_check) { + /* check for double verts! */ + bool ok = true; + for (i = 0; i < seq_len; i++) { + if (UNLIKELY(BM_elem_flag_test(alloc[i], BM_ELEM_INTERNAL_TAG) == false)) { + ok = false; + } + + /* ensure we don't leave this enabled */ + BM_elem_flag_disable(alloc[i], BM_ELEM_INTERNAL_TAG); + } + + if (ok == false) { + /* Cleared above. */ + i_last_dirty = PY_SSIZE_T_MAX; + PyErr_Format(PyExc_ValueError, + "%s: found the same %.200s used multiple times", + error_prefix, + BPy_BMElem_StringFromHType(htype)); + goto err_cleanup; + } + } + + *r_size = seq_len; + if (r_bm) { + *r_bm = bm; + } + return alloc; err_cleanup: - if (do_unique_check && (i_last_dirty != PY_SSIZE_T_MAX)) { - for (i = 0; i <= i_last_dirty; i++) { - BM_elem_flag_disable(alloc[i], BM_ELEM_INTERNAL_TAG); - } - } - PyMem_FREE(alloc); - return NULL; - + if (do_unique_check && (i_last_dirty != PY_SSIZE_T_MAX)) { + for (i = 0; i <= i_last_dirty; i++) { + BM_elem_flag_disable(alloc[i], BM_ELEM_INTERNAL_TAG); + } + } + PyMem_FREE(alloc); + return NULL; } -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) +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 *seq_fast; - PyObject *ret; + PyObject *seq_fast; + PyObject *ret; - if (!(seq_fast = PySequence_Fast(seq, error_prefix))) { - return NULL; - } + if (!(seq_fast = PySequence_Fast(seq, error_prefix))) { + return NULL; + } - ret = BPy_BMElem_PySeq_As_Array_FAST( - r_bm, seq_fast, min, max, r_size, - htype, - do_unique_check, do_bm_check, - error_prefix); + ret = BPy_BMElem_PySeq_As_Array_FAST( + r_bm, seq_fast, min, max, r_size, htype, do_unique_check, do_bm_check, error_prefix); - Py_DECREF(seq_fast); - return ret; + Py_DECREF(seq_fast); + return ret; } - PyObject *BPy_BMElem_Array_As_Tuple(BMesh *bm, BMHeader **elem, Py_ssize_t elem_len) { - Py_ssize_t i; - PyObject *ret = PyTuple_New(elem_len); - for (i = 0; i < elem_len; i++) { - PyTuple_SET_ITEM(ret, i, BPy_BMElem_CreatePyObject(bm, elem[i])); - } - return ret; + Py_ssize_t i; + PyObject *ret = PyTuple_New(elem_len); + for (i = 0; i < elem_len; i++) { + PyTuple_SET_ITEM(ret, i, BPy_BMElem_CreatePyObject(bm, elem[i])); + } + return ret; } PyObject *BPy_BMVert_Array_As_Tuple(BMesh *bm, BMVert **elem, Py_ssize_t elem_len) { - Py_ssize_t i; - PyObject *ret = PyTuple_New(elem_len); - for (i = 0; i < elem_len; i++) { - PyTuple_SET_ITEM(ret, i, BPy_BMVert_CreatePyObject(bm, elem[i])); - } - return ret; + Py_ssize_t i; + PyObject *ret = PyTuple_New(elem_len); + for (i = 0; i < elem_len; i++) { + PyTuple_SET_ITEM(ret, i, BPy_BMVert_CreatePyObject(bm, elem[i])); + } + return ret; } PyObject *BPy_BMEdge_Array_As_Tuple(BMesh *bm, BMEdge **elem, Py_ssize_t elem_len) { - Py_ssize_t i; - PyObject *ret = PyTuple_New(elem_len); - for (i = 0; i < elem_len; i++) { - PyTuple_SET_ITEM(ret, i, BPy_BMEdge_CreatePyObject(bm, elem[i])); - } + Py_ssize_t i; + PyObject *ret = PyTuple_New(elem_len); + for (i = 0; i < elem_len; i++) { + PyTuple_SET_ITEM(ret, i, BPy_BMEdge_CreatePyObject(bm, elem[i])); + } - return ret; + return ret; } PyObject *BPy_BMFace_Array_As_Tuple(BMesh *bm, BMFace **elem, Py_ssize_t elem_len) { - Py_ssize_t i; - PyObject *ret = PyTuple_New(elem_len); - for (i = 0; i < elem_len; i++) { - PyTuple_SET_ITEM(ret, i, BPy_BMFace_CreatePyObject(bm, elem[i])); - } + Py_ssize_t i; + PyObject *ret = PyTuple_New(elem_len); + for (i = 0; i < elem_len; i++) { + PyTuple_SET_ITEM(ret, i, BPy_BMFace_CreatePyObject(bm, elem[i])); + } - return ret; + return ret; } PyObject *BPy_BMLoop_Array_As_Tuple(BMesh *bm, BMLoop **elem, Py_ssize_t elem_len) { - Py_ssize_t i; - PyObject *ret = PyTuple_New(elem_len); - for (i = 0; i < elem_len; i++) { - PyTuple_SET_ITEM(ret, i, BPy_BMLoop_CreatePyObject(bm, elem[i])); - } + Py_ssize_t i; + PyObject *ret = PyTuple_New(elem_len); + for (i = 0; i < elem_len; i++) { + PyTuple_SET_ITEM(ret, i, BPy_BMLoop_CreatePyObject(bm, elem[i])); + } - return ret; + return ret; } int BPy_BMElem_CheckHType(PyTypeObject *type, const char htype) { - return (((htype & BM_VERT) && (type == &BPy_BMVert_Type)) || - ((htype & BM_EDGE) && (type == &BPy_BMEdge_Type)) || - ((htype & BM_FACE) && (type == &BPy_BMFace_Type)) || - ((htype & BM_LOOP) && (type == &BPy_BMLoop_Type))); + return (((htype & BM_VERT) && (type == &BPy_BMVert_Type)) || + ((htype & BM_EDGE) && (type == &BPy_BMEdge_Type)) || + ((htype & BM_FACE) && (type == &BPy_BMFace_Type)) || + ((htype & BM_LOOP) && (type == &BPy_BMLoop_Type))); } /** @@ -4081,32 +4331,39 @@ int BPy_BMElem_CheckHType(PyTypeObject *type, const char htype) */ char *BPy_BMElem_StringFromHType_ex(const char htype, char ret[32]) { - /* zero to ensure string is always NULL terminated */ - char *ret_ptr = ret; - if (htype & BM_VERT) { ret_ptr += sprintf(ret_ptr, "/%s", BPy_BMVert_Type.tp_name); } - if (htype & BM_EDGE) { ret_ptr += sprintf(ret_ptr, "/%s", BPy_BMEdge_Type.tp_name); } - if (htype & BM_FACE) { ret_ptr += sprintf(ret_ptr, "/%s", BPy_BMFace_Type.tp_name); } - if (htype & BM_LOOP) { ret_ptr += sprintf(ret_ptr, "/%s", BPy_BMLoop_Type.tp_name); } - ret[0] = '('; - *ret_ptr++ = ')'; - *ret_ptr = '\0'; - return ret; + /* zero to ensure string is always NULL terminated */ + char *ret_ptr = ret; + if (htype & BM_VERT) { + ret_ptr += sprintf(ret_ptr, "/%s", BPy_BMVert_Type.tp_name); + } + if (htype & BM_EDGE) { + ret_ptr += sprintf(ret_ptr, "/%s", BPy_BMEdge_Type.tp_name); + } + if (htype & BM_FACE) { + ret_ptr += sprintf(ret_ptr, "/%s", BPy_BMFace_Type.tp_name); + } + if (htype & BM_LOOP) { + ret_ptr += sprintf(ret_ptr, "/%s", BPy_BMLoop_Type.tp_name); + } + ret[0] = '('; + *ret_ptr++ = ')'; + *ret_ptr = '\0'; + return ret; } char *BPy_BMElem_StringFromHType(const char htype) { - /* zero to ensure string is always NULL terminated */ - static char ret[32]; - return BPy_BMElem_StringFromHType_ex(htype, ret); + /* zero to ensure string is always NULL terminated */ + static char ret[32]; + return BPy_BMElem_StringFromHType_ex(htype, ret); } - /* -------------------------------------------------------------------- */ /* keep at bottom */ /* this function is called on free, it should stay quite fast */ static void bm_dealloc_editmode_warn(BPy_BMesh *self) { - if (self->flag & BPY_BMFLAG_IS_WRAPPED) { - /* currently nop - this works without warnings now */ - } + if (self->flag & BPY_BMFLAG_IS_WRAPPED) { + /* currently nop - this works without warnings now */ + } } |