[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