[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20963] branches/bmesh/blender/source/ blender: Ported over the delete key and fkey fully over

Joseph Eagar joeedh at gmail.com
Thu Jun 18 03:31:51 CEST 2009


Revision: 20963
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20963
Author:   joeedh
Date:     2009-06-18 03:31:50 +0200 (Thu, 18 Jun 2009)

Log Message:
-----------
Ported over the delete key and fkey fully over
to bmesh.  Yay! Creating faces from edge nets
is sill missing, I'm leaving that for later.

I added two new bmop functions, BMO_HeaderFlag_Buffer
and BMO_UnHeaderFlag_Buffer, which are header flag
version of BMO_Flag_Buffer and BMO_Unflag_Buffer.
The new functions properly handle setting/clearing
BM_SELECT via the selection API.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    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/intern/bmesh_operators_private.h
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_add.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_tools.c

Added Paths:
-----------
    branches/bmesh/blender/source/blender/bmesh/operators/createops.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h	2009-06-17 23:25:22 UTC (rev 20962)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h	2009-06-18 01:31:50 UTC (rev 20963)
@@ -223,9 +223,12 @@
 struct BMVert *BM_Make_Vert(struct BMesh *bm, float co[3], struct BMVert *example);
 struct BMEdge *BM_Make_Edge(struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMEdge *example, int nodouble);
 struct BMFace *BM_Make_Quadtriangle(struct BMesh *bm, struct BMVert **verts, BMEdge **edges, int len, struct BMFace *example, int nodouble);
-/*more easier to use version of BM_Make_Quadtriangle*/
-BMFace *BM_Make_QuadTri(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, BMVert *v4, BMFace *example);
 
+/*more easier to use version of BM_Make_Quadtriangle.
+  creates edges if necassary.*/
+BMFace *BM_Make_QuadTri(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, 
+			BMVert *v4, BMFace *example, int nodouble);
+
 /*makes an ngon from an unordered list of edges.  v1 and v2 must be the verts
 defining edges[0], and define the winding of the new face.*/
 struct BMFace *BM_Make_Ngon(struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMEdge **edges, int len, int nodouble);

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-06-17 23:25:22 UTC (rev 20962)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-06-18 01:31:50 UTC (rev 20963)
@@ -221,6 +221,11 @@
 /*clears tool-flag flag from all elements inside a slot array.*/
 void BMO_Unflag_Buffer(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag);
 
+/*tool-flags all elements inside an element slot array with flag flag.*/
+void BMO_HeaderFlag_Buffer(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag);
+/*clears tool-flag flag from all elements inside a slot array.*/
+void BMO_UnHeaderFlag_Buffer(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag);
+
 /*puts every element of type type (which is a bitmask) with header flag 
   flag, into a slot.*/
 void BMO_HeaderFlag_To_Slot(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag, int type);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2009-06-17 23:25:22 UTC (rev 20962)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2009-06-18 01:31:50 UTC (rev 20963)
@@ -127,23 +127,29 @@
  *
 */
 
-BMFace *BM_Make_QuadTri(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, BMVert *v4, BMFace *example)
+BMFace *BM_Make_QuadTri(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, 
+			BMVert *v4, BMFace *example, int nodouble)
 {
 	BMEdge *edar[4];
 	BMVert *vtar[4];
 
-	edar[0] = v1->edge;
-	edar[1] = v1->edge;
-	edar[2] = v1->edge;
-	if (v4) edar[3] = v1->edge;
+	edar[0] = bmesh_disk_existedge(v1, v2);
+	edar[1] = bmesh_disk_existedge(v2, v3);
+	edar[2] = bmesh_disk_existedge(v3, v4? v4 : v1);
+	if (v4) edar[3] = bmesh_disk_existedge(v4, v1);
 	else edar[3] = NULL;
 
+	if (!edar[0]) edar[0] = BM_Make_Edge(bm, v1, v2, NULL, 0);
+	if (!edar[1]) edar[1] = BM_Make_Edge(bm, v2, v3, NULL, 0);
+	if (!edar[2]) edar[2] = BM_Make_Edge(bm, v3, v4?v4:v1, NULL, 0);
+	if (!edar[0] && v4) edar[0] = BM_Make_Edge(bm, v4, v1, NULL, 0);
+
 	vtar[0] = v1;
 	vtar[1] = v2;
 	vtar[2] = v3;
 	vtar[3] = v4;
 
-	return BM_Make_Quadtriangle(bm, vtar, edar, v4?4:3, example, 0);
+	return BM_Make_Quadtriangle(bm, vtar, edar, v4?4:3, example, nodouble);
 }
 
 /*remove the edge array bits from this. Its not really needed?*/

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-06-17 23:25:22 UTC (rev 20962)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-06-18 01:31:50 UTC (rev 20963)
@@ -5,6 +5,28 @@
 
 /*applies a transform to vertices*/
 
+/*contextual_create is fkey, it creates
+  new faces, makes stuff from edge nets,
+  makes wire edges, etc.  it also dissolves
+  faces.*/
+BMOpDefine def_contextual_create= {
+	"contextual_create",
+	{{BMOP_OPSLOT_ELEMENT_BUF, "geom"},
+	 {BMOP_OPSLOT_ELEMENT_BUF, "faceout"},
+	 {0, /*null-terminating sentinel*/}},
+	bmesh_contextual_create_exec,
+	0,
+};
+
+BMOpDefine def_edgenet_fill= {
+	"edgenet_fill",
+	{{BMOP_OPSLOT_ELEMENT_BUF, "edges"},
+	 {BMOP_OPSLOT_ELEMENT_BUF, "faceout"},
+	{0, /*null-terminating sentinel*/}},
+	bmesh_edgenet_fill_exec,
+	0,
+};
+
 BMOpDefine def_translate= {
 	"translate",
 	{{BMOP_OPSLOT_VEC, "vec"},
@@ -213,6 +235,8 @@
 	&def_object_load_bmesh,
 	&def_transform,
 	&def_translate,
+	&def_edgenet_fill,
+	&def_contextual_create,
 };
 
 int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*));

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-06-17 23:25:22 UTC (rev 20962)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-06-18 01:31:50 UTC (rev 20963)
@@ -265,7 +265,7 @@
 {
 	BMOpSlot *slot = BMO_GetSlot(op, slotname);
 	if( !(slot->slottype == BMOP_OPSLOT_MAT) )
-		return 0;
+		return;
 
 	slot->len = 4;
 	slot->data.p = BLI_memarena_alloc(op->arena, sizeof(float)*4*4);
@@ -688,6 +688,51 @@
  *
  * BMO_FLAG_BUFFER
  *
+ * Header Flags elements in a slots buffer, automatically
+ * using the selection API where appropriate.
+ *
+*/
+
+void BMO_HeaderFlag_Buffer(BMesh *bm, BMOperator *op, char *slotname, int flag)
+{
+	BMOpSlot *slot = BMO_GetSlot(op, slotname);
+	BMHeader **data =  slot->data.p;
+	int i;
+	
+	for(i = 0; i < slot->len; i++) {
+		BM_SetHFlag(data[i], flag);
+		if (flag & BM_SELECT)
+			BM_Select(bm, data[i], 1);
+	}
+}
+
+/*
+ *
+ * BMO_FLAG_BUFFER
+ *
+ * Removes flags from elements in a slots buffer, automatically
+ * using the selection API where appropriate.
+ *
+*/
+
+void BMO_UnHeaderFlag_Buffer(BMesh *bm, BMOperator *op, char *slotname, int flag)
+{
+	BMOpSlot *slot = BMO_GetSlot(op, slotname);
+	BMHeader **data =  slot->data.p;
+	int i;
+	
+	for(i = 0; i < slot->len; i++) {
+		BM_ClearHFlag(data[i], flag);
+		if (flag & BM_SELECT)
+			BM_Select(bm, data[i], 0);
+	}
+}
+
+
+/*
+ *
+ * BMO_FLAG_BUFFER
+ *
  * Flags elements in a slots buffer
  *
 */

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2009-06-17 23:25:22 UTC (rev 20962)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2009-06-18 01:31:50 UTC (rev 20963)
@@ -25,5 +25,7 @@
 void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op);
 void bmesh_translate_exec(BMesh *bm, BMOperator *op);
 void bmesh_transform_exec(BMesh *bm, BMOperator *op);
+void bmesh_contextual_create_exec(BMesh *bm, BMOperator *op);
+void bmesh_edgenet_fill_exec(BMesh *bm, BMOperator *op);
 
 #endif

Added: branches/bmesh/blender/source/blender/bmesh/operators/createops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/createops.c	                        (rev 0)
+++ branches/bmesh/blender/source/blender/bmesh/operators/createops.c	2009-06-18 01:31:50 UTC (rev 20963)
@@ -0,0 +1,156 @@
+#include "MEM_guardedalloc.h"
+
+#include "BKE_utildefines.h"
+
+#include "BLI_ghash.h"
+#include "BLI_memarena.h"
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "bmesh.h"
+#include "bmesh_operators_private.h"
+
+#define ELE_NEW		1
+#define ELE_OUT		2
+
+void bmesh_edgenet_fill_exec(BMesh *bm, BMOperator *op)
+{
+	/*unimplemented, need to think on how to do this.  probably are graph
+	  theory stuff that could help with this problem.*/
+}
+
+/* evaluate if entire quad is a proper convex quad */
+static int convex(float *v1, float *v2, float *v3, float *v4)
+{
+	float nor[3], nor1[3], nor2[3], vec[4][2];
+	
+	/* define projection, do both trias apart, quad is undefined! */
+	CalcNormFloat(v1, v2, v3, nor1);
+	CalcNormFloat(v1, v3, v4, nor2);
+	nor[0]= ABS(nor1[0]) + ABS(nor2[0]);
+	nor[1]= ABS(nor1[1]) + ABS(nor2[1]);
+	nor[2]= ABS(nor1[2]) + ABS(nor2[2]);
+
+	if(nor[2] >= nor[0] && nor[2] >= nor[1]) {
+		vec[0][0]= v1[0]; vec[0][1]= v1[1];
+		vec[1][0]= v2[0]; vec[1][1]= v2[1];
+		vec[2][0]= v3[0]; vec[2][1]= v3[1];
+		vec[3][0]= v4[0]; vec[3][1]= v4[1];
+	}
+	else if(nor[1] >= nor[0] && nor[1]>= nor[2]) {
+		vec[0][0]= v1[0]; vec[0][1]= v1[2];
+		vec[1][0]= v2[0]; vec[1][1]= v2[2];
+		vec[2][0]= v3[0]; vec[2][1]= v3[2];
+		vec[3][0]= v4[0]; vec[3][1]= v4[2];
+	}
+	else {
+		vec[0][0]= v1[1]; vec[0][1]= v1[2];
+		vec[1][0]= v2[1]; vec[1][1]= v2[2];
+		vec[2][0]= v3[1]; vec[2][1]= v3[2];
+		vec[3][0]= v4[1]; vec[3][1]= v4[2];
+	}
+	
+	/* linetests, the 2 diagonals have to instersect to be convex */
+	if( IsectLL2Df(vec[0], vec[2], vec[1], vec[3]) > 0 ) return 1;
+	return 0;
+}
+
+/*this is essentially new fkey*/
+void bmesh_contextual_create_exec(BMesh *bm, BMOperator *op)
+{
+	BMOperator op2;
+	BMOIter oiter;
+	BMIter iter, liter;
+	BMHeader *h;
+	BMVert *v, *verts[4];
+	BMEdge *e;
+	BMLoop *l;
+	BMFace *f;
+	int totv=0, tote=0, totf=0, amount;
+
+	/*count number of each element type we were passed*/
+	BMO_ITER(h, &oiter, bm, op, "geom") {
+		switch (h->type) {
+			case BM_VERT: totv++; break;
+			case BM_EDGE: tote++; break;
+			case BM_FACE: totf++; break;
+		}
+
+		BMO_SetFlag(bm, h, ELE_NEW);
+	}
+	
+	/*first call dissolve faces*/
+	BMO_InitOpf(bm, &op2, "dissolvefaces faces=%ff", ELE_NEW);
+	BMO_Exec_Op(bm, &op2);
+	BMO_ITER(f, &oiter, bm, &op2, "regionout") {
+		BMO_SetFlag(bm, f, ELE_OUT);
+
+		/*unflag verts associated with dissolved faces*/
+		BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+			BMO_ClearFlag(bm, l->v, ELE_NEW);
+		}
+	}
+	BMO_Finish_Op(bm, &op2);
+
+	/*then call edgenet create, which may still be unimplemented, heh*/
+	BMO_InitOpf(bm, &op2, "edgenet_fill edges=%fe", ELE_NEW);
+	BMO_Exec_Op(bm, &op2);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list