[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18925] branches/bmesh/blender/source/ blender/bmesh: split and dupe ops now spit out an edge map for finding the edge skirts.

Joseph Eagar joeedh at gmail.com
Wed Feb 11 13:32:29 CET 2009


Revision: 18925
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18925
Author:   joeedh
Date:     2009-02-11 13:32:29 +0100 (Wed, 11 Feb 2009)

Log Message:
-----------
split and dupe ops now spit out an edge map for finding the edge skirts.  still need to implement a mapping for isolated vert splitting. note, this isn't tested.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
    branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
    branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h	2009-02-11 12:19:42 UTC (rev 18924)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h	2009-02-11 12:32:29 UTC (rev 18925)
@@ -83,6 +83,7 @@
 void BMO_HeaderFlag_To_Slot(struct BMesh *bm, struct BMOperator *op, int slotcode, int flag, int type);
 int BMO_CountSlotBuf(struct BMesh *bm, struct BMOperator *op, int slotcode);
 
+/*copies data, doesn't store a reference to it.*/
 void BMO_Insert_Mapping(BMesh *bm, BMOperator *op, int slotcode, 
 			void *element, void *data, int len);
 void BMO_Insert_MapFloat(BMesh *bm, BMOperator *op, int slotcode, 
@@ -94,6 +95,13 @@
 void BMO_Mapping_To_Flag(struct BMesh *bm, struct BMOperator *op, 
 			 int slotcode, int flag);
 
+/*do NOT use these for non-operator-api-allocated memory! instead
+  use BMO_Get_MapData, which copies the data.*/
+void BMO_Insert_MapPointer(BMesh *bm, BMOperator *op, int slotcode, 
+			void *element, void *val);
+void *BMO_Get_MapPointer(BMesh *bm, BMOperator *op, int slotcode,
+		       void *element);
+
 /*if msg is null, then the default message for the errorcode is used*/
 void BMOP_RaiseError(BMesh *bm, int errcode, char *msg);
 /*returns error code or 0 if no error*/
@@ -119,6 +127,7 @@
 enum {
 	BMOP_SPLIT_MULTIN,
 	BMOP_SPLIT_MULTOUT,
+	BMOP_SPLIT_BOUNDS_EDGEMAP,
 	BMOP_SPLIT_TOTSLOT,
 };
 
@@ -129,6 +138,9 @@
 	BMOP_DUPE_MULTIN,
 	BMOP_DUPE_ORIG,
 	BMOP_DUPE_NEW,
+	/*we need a map for verts duplicated not connected
+	  to any faces, too.*/	
+	BMOP_DUPE_BOUNDS_EDGEMAP,
 	BMOP_DUPE_TOTSLOT
 };
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-02-11 12:19:42 UTC (rev 18924)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-02-11 12:32:29 UTC (rev 18925)
@@ -70,14 +70,16 @@
 };
 
 BMOpDefine def_dupeop = {
-	{BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_PNT_BUF},
+	{BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_PNT_BUF,
+	 BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_MAPPING},
 	dupeop_exec,
 	BMOP_DUPE_TOTSLOT,
 	0
 };
 
 BMOpDefine def_splitop = {
-	{BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_PNT_BUF},
+	{BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_PNT_BUF,
+	 BMOP_OPSLOT_MAPPING},
 	splitop_exec,
 	BMOP_SPLIT_TOTSLOT,
 	0

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-02-11 12:19:42 UTC (rev 18924)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-02-11 12:32:29 UTC (rev 18925)
@@ -183,13 +183,42 @@
 	if(source_slot->slottype != dest_slot->slottype)
 		return;
 	
-	if(dest_slot->slottype > BMOP_OPSLOT_VEC){
-		/*do buffer copy*/
-		dest_slot->data.buf = NULL;
-		dest_slot->len = source_slot->len;
-		if(dest_slot->len){
-			dest_slot->data.buf = BLI_memarena_alloc(dest_op->arena, BMOP_OPSLOT_TYPEINFO[dest_slot->slottype] * dest_slot->len);
-			memcpy(dest_slot->data.buf, source_slot->data.buf, BMOP_OPSLOT_TYPEINFO[dest_slot->slottype] * dest_slot->len);
+	if (dest_slot->slottype > BMOP_OPSLOT_VEC) {
+		if (dest_slot->slottype != BMOP_OPSLOT_MAPPING) {
+			/*do buffer copy*/
+			dest_slot->data.buf = NULL;
+			dest_slot->len = source_slot->len;
+			if(dest_slot->len){
+				dest_slot->data.buf = BLI_memarena_alloc(dest_op->arena, BMOP_OPSLOT_TYPEINFO[dest_slot->slottype] * dest_slot->len);
+				memcpy(dest_slot->data.buf, source_slot->data.buf, BMOP_OPSLOT_TYPEINFO[dest_slot->slottype] * dest_slot->len);
+			}
+		} else {
+			GHashIterator it;
+			element_mapping *srcmap, *dstmap;
+
+			/*sanity check*/
+			if (!source_slot->data.ghash) return;
+			
+			if (!dest_slot->data.ghash) {
+				dest_slot->data.ghash = 
+				      BLI_ghash_new(BLI_ghashutil_ptrhash, 
+				      BLI_ghashutil_ptrcmp);
+			}
+
+			BLI_ghashIterator_init(&it, source_slot->data.ghash);
+			for (;srcmap=BLI_ghashIterator_getValue(&it);
+			      BLI_ghashIterator_step(&it))
+			{
+				dstmap = BLI_memarena_alloc(dest_op->arena, 
+				            sizeof(*dstmap) + srcmap->len);
+
+				dstmap->element = srcmap->element;
+				dstmap->len = srcmap->len;
+				memcpy(dstmap+1, srcmap+1, srcmap->len);
+				
+				BLI_ghash_insert(dest_slot->data.ghash, 
+				                dstmap->element, dstmap);				
+			}
 		}
 	} else {
 		dest_slot->data = source_slot->data;
@@ -401,6 +430,12 @@
 	BMO_Insert_Mapping(bm, op, slotcode, element, &val, sizeof(float));
 }
 
+void BMO_Insert_MapPointer(BMesh *bm, BMOperator *op, int slotcode, 
+			void *element, void *val)
+{
+	BMO_Insert_Mapping(bm, op, slotcode, element, &val, sizeof(void*));
+}
+
 void *BMO_Get_MapData(BMesh *bm, BMOperator *op, int slotcode,
 		      void *element)
 {
@@ -425,6 +460,15 @@
 	return 0.0f;
 }
 
+void *BMO_Get_MapPointer(BMesh *bm, BMOperator *op, int slotcode,
+		       void *element)
+{
+	void **val = BMO_Get_MapData(bm, op, slotcode, element);
+	if (val) return *val;
+
+	return NULL;
+}
+
 static void *alloc_slot_buffer(BMOperator *op, int slotcode, int len){
 
 	/*check if its actually a buffer*/

Modified: branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c	2009-02-11 12:19:42 UTC (rev 18924)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c	2009-02-11 12:32:29 UTC (rev 18925)
@@ -11,9 +11,10 @@
 #include "bmesh_operators_private.h"
 
 /*local flag defines*/
-#define DUPE_INPUT		1			/*input from operator*/
+#define DUPE_INPUT		1 /*input from operator*/
 #define DUPE_NEW		2
 #define DUPE_DONE		4
+#define DUPE_MAPPED		8
 
 /*
  *  COPY VERTEX
@@ -46,17 +47,43 @@
  * Copy an existing edge from one bmesh to another.
  *
 */
-static BMEdge *copy_edge(BMesh *source_mesh, BMEdge *source_edge, BMesh *target_mesh, GHash *vhash, GHash *ehash)
+static BMEdge *copy_edge(BMOperator *op, BMesh *source_mesh,
+			 BMEdge *source_edge, BMesh *target_mesh,
+			 GHash *vhash, GHash *ehash)
 {
 	BMEdge *target_edge = NULL;
 	BMVert *target_vert1, *target_vert2;
-	
+	BMFace *face;
+	BMIter fiter;
+	int found, rlen;
+
+	/*see if any of the neighboring faces are
+	  not being duplicated.  in that case,
+	  add it to the new/old map.*/
+	found = rlen = 0;
+	for (face=BMIter_New(&fiter,source_mesh, BM_FACES_OF_EDGE,source_edge);
+		face; face=BMIter_Step(&fiter)) {
+		if (!BMO_TestFlag(source_mesh, face, DUPE_INPUT)) {
+			found = 1;
+			break;
+		}
+		rlen++;
+	}
+
 	/*Lookup v1 and v2*/
 	target_vert1 = BLI_ghash_lookup(vhash, source_edge->v1);
 	target_vert2 = BLI_ghash_lookup(vhash, source_edge->v2);
 	
 	/*Create a new edge*/
 	target_edge = BM_Make_Edge(target_mesh, target_vert1, target_vert2, NULL, 0);
+	
+	/*add to new/old edge map if necassary*/
+	if (rlen > 0 && rlen <= 2 && found) {
+		/*not sure what non-manifold cases of greater then three
+		  radial should do.*/
+		BMO_Insert_MapPointer(source_mesh,op,BMOP_DUPE_BOUNDS_EDGEMAP,
+			source_edge, target_edge);
+	}
 
 	/*Insert new edge into the edge hash*/
 	BLI_ghash_insert(ehash, source_edge, target_edge);	
@@ -119,7 +146,7 @@
  * Internal Copy function.
 */
 
-static void copy_mesh(BMesh *source, BMesh *target)
+static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
 {
 
 	BMVert *v = NULL;
@@ -160,7 +187,7 @@
 			/*edge pass*/
 			for(e = BMIter_New(&edges, source, BM_EDGES_OF_FACE, f); e; e = BMIter_Step(&edges)){
 				if(!BMO_TestFlag(source, (BMHeader*)e, DUPE_DONE)){
-					copy_edge(source, e, target,  vhash,  ehash);
+					copy_edge(op, source, e, target,  vhash,  ehash);
 					BMO_SetFlag(source, (BMHeader*)e, DUPE_DONE);
 				}
 			}
@@ -182,7 +209,7 @@
 				BMO_SetFlag(source, (BMHeader*)e->v2, DUPE_DONE);
 			}
 			/*now copy the actual edge*/
-			copy_edge(source, e, target,  vhash,  ehash);			
+			copy_edge(op, source, e, target,  vhash,  ehash);			
 			BMO_SetFlag(source, (BMHeader*)e, DUPE_DONE); 
 		}
 	}
@@ -264,7 +291,7 @@
 	/*flag input*/
 	BMO_Flag_Buffer(bm, dupeop, BMOP_DUPE_MULTIN, DUPE_INPUT);
 	/*use the internal copy function*/
-	copy_mesh(bm, bm);
+	copy_mesh(dupeop, bm, bm);
 	
 	/*Output*/
 	/*First copy the input buffers to output buffers - original data*/
@@ -329,6 +356,8 @@
 
 	/*now we make our outputs by copying the dupe outputs*/
 	BMO_CopySlot(&dupeop, splitop, BMOP_DUPE_NEW, BMOP_SPLIT_MULTOUT);
+	BMO_CopySlot(&dupeop, splitop, BMOP_DUPE_BOUNDS_EDGEMAP,
+	             BMOP_SPLIT_BOUNDS_EDGEMAP);
 
 	/*cleanup*/
 	BMO_Finish_Op(bm, &delop);

Modified: branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c	2009-02-11 12:19:42 UTC (rev 18924)
+++ branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c	2009-02-11 12:32:29 UTC (rev 18925)
@@ -592,12 +592,11 @@
 	rad = BMO_GetSlot(op, BMOP_ESUBDIVIDE_RADIUS)->data.f;
 
 	einput = BMO_GetSlot(op, BMOP_ESUBDIVIDE_EDGES);
-	/*first go through and tag edges*/
-	for (i=0; i<einput->len; i++) {
-		edge = ((BMEdge**)einput->data.p)[i];
-		BMO_SetFlag(bmesh, edge, SUBD_SPLIT);
-	}
 	
+	/*first go through and tag edges*/
+	BMO_Flag_To_Slot(bmesh, op, BMOP_ESUBDIVIDE_EDGES,
+	         SUBD_SPLIT, BM_EDGE);
+
 	params.flag = flag;
 	params.numcuts = numcuts;
 	params.op = op;





More information about the Bf-blender-cvs mailing list