[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43959] branches/bmesh/blender/source/ blender/bmesh: speedup for edge split modifier/operator
Campbell Barton
ideasman42 at gmail.com
Tue Feb 7 17:08:34 CET 2012
Revision: 43959
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43959
Author: campbellbarton
Date: 2012-02-07 16:08:19 +0000 (Tue, 07 Feb 2012)
Log Message:
-----------
speedup for edge split modifier/operator
- don't call 'del' operator now, expose the internal function instead.
- use the index values stored in the header rather then the operator.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
branches/bmesh/blender/source/blender/bmesh/operators/edgesplitop.c
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h 2012-02-07 15:14:08 UTC (rev 43958)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h 2012-02-07 16:08:19 UTC (rev 43959)
@@ -256,6 +256,20 @@
void BMO_remove_tagged_edges(struct BMesh *bm, const short oflag);
void BMO_remove_tagged_verts(struct BMesh *bm, const short oflag);
+/* take care, uses operator flag DEL_WIREVERT */
+void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type);
+
+/* del "context" slot values, used for operator too */
+enum {
+ DEL_VERTS = 1,
+ DEL_EDGES,
+ DEL_ONLYFACES,
+ DEL_EDGESFACES,
+ DEL_FACES,
+ DEL_ALL ,
+ DEL_ONLYTAGGED
+};
+
void BMO_Set_OpFlag(struct BMesh *bm, struct BMOperator *op, const int op_flag);
void BMO_Clear_OpFlag(struct BMesh *bm, struct BMOperator *op, const int op_flag);
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h 2012-02-07 15:14:08 UTC (rev 43958)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h 2012-02-07 16:08:19 UTC (rev 43959)
@@ -27,17 +27,6 @@
/*--------defines/enumerations for specific operators-------*/
-/*del operator "context" slot values*/
-enum {
- DEL_VERTS = 1,
- DEL_EDGES,
- DEL_ONLYFACES,
- DEL_EDGESFACES,
- DEL_FACES,
- DEL_ALL ,
- DEL_ONLYTAGGED
-};
-
/*quad innervert values*/
enum {
SUBD_INNERVERT,
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c 2012-02-07 15:14:08 UTC (rev 43958)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c 2012-02-07 16:08:19 UTC (rev 43959)
@@ -404,6 +404,154 @@
}
}
+/*************************************************************/
+/* you need to make remove tagged verts/edges/faces
+ * api functions that take a filter callback.....
+ * and this new filter type will be for opstack flags.
+ * This is because the BM_remove_taggedXXX functions bypass iterator API.
+ * - Ops dont care about 'UI' considerations like selection state, hide state, ect.
+ * If you want to work on unhidden selections for instance,
+ * copy output from a 'select context' operator to another operator....
+ */
+
+static void bmo_remove_tagged_context_verts(BMesh *bm, const short oflag)
+{
+ BMVert *v;
+ BMEdge *e;
+ BMLoop *f;
+
+ BMIter verts;
+ BMIter edges;
+ BMIter faces;
+
+ for (v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BMIter_Step(&verts)) {
+ if (BMO_TestFlag(bm, (BMHeader *)v, oflag)) {
+ /* Visit edge */
+ for (e = BMIter_New(&edges, bm, BM_EDGES_OF_VERT, v); e; e = BMIter_Step(&edges))
+ BMO_SetFlag(bm, (BMHeader *)e, oflag);
+ /* Visit face */
+ for (f = BMIter_New(&faces, bm, BM_FACES_OF_VERT, v); f; f = BMIter_Step(&faces))
+ BMO_SetFlag(bm, (BMHeader *)f, oflag);
+ }
+ }
+
+ BMO_remove_tagged_faces(bm, oflag);
+ BMO_remove_tagged_edges(bm, oflag);
+ BMO_remove_tagged_verts(bm, oflag);
+}
+
+static void bmo_remove_tagged_context_edges(BMesh *bm, const short oflag)
+{
+ BMEdge *e;
+ BMFace *f;
+
+ BMIter edges;
+ BMIter faces;
+
+ for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
+ if (BMO_TestFlag(bm, (BMHeader *)e, oflag)) {
+ for (f = BMIter_New(&faces, bm, BM_FACES_OF_EDGE, e); f; f = BMIter_Step(&faces)) {
+ BMO_SetFlag(bm, (BMHeader *)f, oflag);
+ }
+ }
+ }
+ BMO_remove_tagged_faces(bm, oflag);
+ BMO_remove_tagged_edges(bm, oflag);
+}
+
+#define DEL_WIREVERT (1 << 10)
+
+void BMO_remove_tagged_context(BMesh *bm, const short oflag, int type)
+{
+ BMVert *v;
+ BMEdge *e;
+ BMFace *f;
+
+ BMIter verts;
+ BMIter edges;
+ BMIter faces;
+
+ if (type == DEL_VERTS) bmo_remove_tagged_context_verts(bm, oflag);
+ else if (type == DEL_EDGES) {
+ /* flush down to vert */
+ for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
+ if (BMO_TestFlag(bm, (BMHeader *)e, oflag)) {
+ BMO_SetFlag(bm, (BMHeader *)(e->v1), oflag);
+ BMO_SetFlag(bm, (BMHeader *)(e->v2), oflag);
+ }
+ }
+ bmo_remove_tagged_context_edges(bm, oflag);
+ /* remove loose vertice */
+ for (v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BMIter_Step(&verts)) {
+ if (BMO_TestFlag(bm, (BMHeader *)v, oflag) && (!(v->e)))
+ BMO_SetFlag(bm, (BMHeader *)v, DEL_WIREVERT);
+ }
+ BMO_remove_tagged_verts(bm, DEL_WIREVERT);
+ }
+ else if (type == DEL_EDGESFACES) bmo_remove_tagged_context_edges(bm, oflag);
+ else if (type == DEL_ONLYFACES) BMO_remove_tagged_faces(bm, oflag);
+ else if (type == DEL_ONLYTAGGED) {
+ BMO_remove_tagged_faces(bm, oflag);
+ BMO_remove_tagged_edges(bm, oflag);
+ BMO_remove_tagged_verts(bm, oflag);
+ }
+ else if (type == DEL_FACES) {
+ /* go through and mark all edges and all verts of all faces for delet */
+ for (f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BMIter_Step(&faces)) {
+ if (BMO_TestFlag(bm, (BMHeader *)f, oflag)) {
+ for (e = BMIter_New(&edges, bm, BM_EDGES_OF_FACE, f); e; e = BMIter_Step(&edges))
+ BMO_SetFlag(bm, (BMHeader *)e, oflag);
+ for (v = BMIter_New(&verts, bm, BM_VERTS_OF_FACE, f); v; v = BMIter_Step(&verts))
+ BMO_SetFlag(bm, (BMHeader *)v, oflag);
+ }
+ }
+ /* now go through and mark all remaining faces all edges for keeping */
+ for (f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BMIter_Step(&faces)) {
+ if (!BMO_TestFlag(bm, (BMHeader *)f, oflag)) {
+ for (e = BMIter_New(&edges, bm, BM_EDGES_OF_FACE, f); e; e = BMIter_Step(&edges)) {
+ BMO_ClearFlag(bm, (BMHeader *)e, oflag);
+ }
+ for (v = BMIter_New(&verts, bm, BM_VERTS_OF_FACE, f); v; v = BMIter_Step(&verts)) {
+ BMO_ClearFlag(bm, (BMHeader *)v, oflag);
+ }
+ }
+ }
+ /* also mark all the vertices of remaining edges for keeping */
+ for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
+ if (!BMO_TestFlag(bm, (BMHeader *)e, oflag)) {
+ BMO_ClearFlag(bm, (BMHeader *)e->v1, oflag);
+ BMO_ClearFlag(bm, (BMHeader *)e->v2, oflag);
+ }
+ }
+ /* now delete marked face */
+ BMO_remove_tagged_faces(bm, oflag);
+ /* delete marked edge */
+ BMO_remove_tagged_edges(bm, oflag);
+ /* remove loose vertice */
+ BMO_remove_tagged_verts(bm, oflag);
+ }
+ /* does this option even belong in here */
+ else if (type == DEL_ALL) {
+ for (f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BMIter_Step(&faces))
+ BMO_SetFlag(bm, (BMHeader *)f, oflag);
+ for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges))
+ BMO_SetFlag(bm, (BMHeader *)e, oflag);
+ for (v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BMIter_Step(&verts))
+ BMO_SetFlag(bm, (BMHeader *)v, oflag);
+
+ BMO_remove_tagged_faces(bm, oflag);
+ BMO_remove_tagged_edges(bm, oflag);
+ BMO_remove_tagged_verts(bm, oflag);
+ }
+}
+/*************************************************************/
+
+
+
+
+
+
+
static void bm_copy_vert_attributes(BMesh *source_mesh, BMesh *target_mesh,
const BMVert *source_vertex, BMVert *target_vertex)
{
Modified: branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c 2012-02-07 15:14:08 UTC (rev 43958)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c 2012-02-07 16:08:19 UTC (rev 43959)
@@ -434,162 +434,21 @@
BMO_Finish_Op(bm, &dupeop);
}
-#define DEL_INPUT 1
-#define DEL_WIREVERT 2
-static void delete_verts(BMesh *bm, const short oflag);
-static void delete_context(BMesh *bm, const short oflag, const int type);
-
void delop_exec(BMesh *bm, BMOperator *op)
{
+#define DEL_INPUT 1
+
BMOperator *delop = op;
/* Mark Buffer */
BMO_Flag_Buffer(bm, delop, "geom", DEL_INPUT, BM_ALL);
- delete_context(bm, DEL_INPUT, BMO_Get_Int(op, "context"));
-}
+ BMO_remove_tagged_context(bm, DEL_INPUT, BMO_Get_Int(op, "context"));
-static void delete_verts(BMesh *bm, const short oflag)
-{
- BMVert *v;
- BMEdge *e;
- BMLoop *f;
-
- BMIter verts;
- BMIter edges;
- BMIter faces;
-
- for (v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BMIter_Step(&verts)) {
- if (BMO_TestFlag(bm, (BMHeader *)v, oflag)) {
- /* Visit edge */
- for (e = BMIter_New(&edges, bm, BM_EDGES_OF_VERT, v); e; e = BMIter_Step(&edges))
- BMO_SetFlag(bm, (BMHeader *)e, oflag);
- /* Visit face */
- for (f = BMIter_New(&faces, bm, BM_FACES_OF_VERT, v); f; f = BMIter_Step(&faces))
- BMO_SetFlag(bm, (BMHeader *)f, oflag);
- }
- }
-
- BMO_remove_tagged_faces(bm, oflag);
- BMO_remove_tagged_edges(bm, oflag);
- BMO_remove_tagged_verts(bm, oflag);
+#undef DEL_INPUT
}
-static void delete_edges(BMesh *bm, const short oflag)
-{
- BMEdge *e;
- BMFace *f;
-
- BMIter edges;
- BMIter faces;
-
- for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
- if (BMO_TestFlag(bm, (BMHeader *)e, oflag)) {
- for (f = BMIter_New(&faces, bm, BM_FACES_OF_EDGE, e); f; f = BMIter_Step(&faces)) {
- BMO_SetFlag(bm, (BMHeader *)f, oflag);
- }
- }
- }
- BMO_remove_tagged_faces(bm, oflag);
- BMO_remove_tagged_edges(bm, oflag);
-}
-
-/* you need to make remove tagged verts/edges/faces
- * api functions that take a filter callback.....
- * and this new filter type will be for opstack flags.
- * This is because the BM_remove_taggedXXX functions bypass iterator API.
- * - Ops dont care about 'UI' considerations like selection state, hide state, ect.
- * If you want to work on unhidden selections for instance,
- * copy output from a 'select context' operator to another operator....
- */
-
-/* Break this into smaller functions */
-
-static void delete_context(BMesh *bm, const short oflag, int type)
-{
- BMVert *v;
- BMEdge *e;
- BMFace *f;
-
- BMIter verts;
- BMIter edges;
- BMIter faces;
-
- if (type == DEL_VERTS) delete_verts(bm, oflag);
- else if (type == DEL_EDGES) {
- /* flush down to vert */
- for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
- if (BMO_TestFlag(bm, (BMHeader *)e, oflag)) {
- BMO_SetFlag(bm, (BMHeader *)(e->v1), oflag);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list