[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36285] branches/bmesh/blender: =bmesh= fixed edge split modifier, and a bug in knifetool reported by letterrip.
Joseph Eagar
joeedh at gmail.com
Sat Apr 23 01:37:58 CEST 2011
Revision: 36285
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36285
Author: joeedh
Date: 2011-04-22 23:37:58 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
=bmesh= fixed edge split modifier, and a bug in knifetool reported by letterrip. also brought back beautify-fill.
Modified Paths:
--------------
branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
branches/bmesh/blender/source/blender/blenlib/BLI_math_geom.h
branches/bmesh/blender/source/blender/blenlib/intern/math_geom.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
branches/bmesh/blender/source/blender/bmesh/operators/createops.c
branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c
branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
branches/bmesh/blender/source/blender/modifiers/intern/MOD_edgesplit.c
Modified: branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
===================================================================
--- branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py 2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py 2011-04-22 23:37:58 UTC (rev 36285)
@@ -45,7 +45,11 @@
# the mt.type enum is (ab)used for a lookup on function names
# ...to avoid lengthy if statements
# so each type must have a function here.
-
+
+ def NGONINTERP(self, layout, ob, md):
+ split = layout.split()
+ split.prop(md, "resolution")
+
def ARMATURE(self, layout, ob, md):
split = layout.split()
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2011-04-22 23:37:58 UTC (rev 36285)
@@ -2748,7 +2748,10 @@
void CDDM_set_mvert(DerivedMesh *dm, MVert *mvert)
{
CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
-
+
+ if (!CustomData_has_layer(&dm->vertData, CD_MVERT))
+ CustomData_add_layer(&dm->vertData, CD_MVERT, CD_ASSIGN, mvert, dm->numVertData);
+
cddm->mvert = mvert;
}
@@ -2756,6 +2759,9 @@
{
CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
+ if (!CustomData_has_layer(&dm->edgeData, CD_MEDGE))
+ CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_ASSIGN, medge, dm->numEdgeData);
+
cddm->medge = medge;
}
@@ -2763,5 +2769,8 @@
{
CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
+ if (!CustomData_has_layer(&dm->faceData, CD_MFACE))
+ CustomData_add_layer(&dm->faceData, CD_MFACE, CD_ASSIGN, mface, dm->numFaceData);
+
cddm->mface = mface;
}
Modified: branches/bmesh/blender/source/blender/blenlib/BLI_math_geom.h
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/BLI_math_geom.h 2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/blenlib/BLI_math_geom.h 2011-04-22 23:37:58 UTC (rev 36285)
@@ -70,6 +70,8 @@
/* TODO int return value consistency */
+ int is_quad_convex_v3(float *v1, float *v2, float *v3, float *v4);
+
/* line-line */
#define ISECT_LINE_LINE_COLINEAR -1
#define ISECT_LINE_LINE_NONE 0
Modified: branches/bmesh/blender/source/blender/blenlib/intern/math_geom.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/math_geom.c 2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/blenlib/intern/math_geom.c 2011-04-22 23:37:58 UTC (rev 36285)
@@ -2678,3 +2678,39 @@
return contrib;
}
+
+/* evaluate if entire quad is a proper convex quad */
+ int is_quad_convex_v3(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! */
+ normal_tri_v3( nor1,v1, v2, v3);
+ normal_tri_v3( nor2,v1, v3, v4);
+ 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( isect_line_line_v2(vec[0], vec[2], vec[1], vec[3]) > 0 ) return 1;
+ return 0;
+}
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2011-04-22 23:37:58 UTC (rev 36285)
@@ -940,6 +940,21 @@
BMOP_UNTAN_MULTIRES
};
+/*
+ Beautify Fill
+
+ Makes triangle a bit nicer
+ */
+BMOpDefine def_beautify_fill = {
+ "beautify_fill",
+ {{BMOP_OPSLOT_ELEMENT_BUF, "faces"}, /* input faces */
+ {BMOP_OPSLOT_ELEMENT_BUF, "constrain_edges"}, /* edges that can't be flipped */
+ {BMOP_OPSLOT_ELEMENT_BUF, "geomout"}, /* new flipped faces and edges */
+ {0} /*null-terminating sentinel*/},
+ bmesh_beautify_fill_exec,
+ BMOP_UNTAN_MULTIRES
+};
+
BMOpDefine *opdefines[] = {
&def_splitop,
&def_dupeop,
@@ -1000,6 +1015,7 @@
&def_create_cube,
&def_join_triangles,
&def_bevel,
+ &def_beautify_fill,
};
int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*));
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h 2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h 2011-04-22 23:37:58 UTC (rev 36285)
@@ -69,5 +69,6 @@
void bmesh_create_cube_exec(BMesh *bm, BMOperator *op);
void bmesh_jointriangles_exec(BMesh *bm, BMOperator *op);
void bmesh_bevel_exec(BMesh *bm, BMOperator *op);
+void bmesh_beautify_fill_exec(BMesh *bm, BMOperator *op);
#endif
Modified: branches/bmesh/blender/source/blender/bmesh/operators/createops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/createops.c 2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/bmesh/operators/createops.c 2011-04-22 23:37:58 UTC (rev 36285)
@@ -964,42 +964,6 @@
MEM_freeN(vdata);
}
-/* 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! */
- normal_tri_v3( nor1,v1, v2, v3);
- normal_tri_v3( nor2,v1, v3, v4);
- 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( isect_line_line_v2(vec[0], vec[2], vec[1], vec[3]) > 0 ) return 1;
- return 0;
-}
-
BMEdge *edge_next(BMesh *bm, BMEdge *e)
{
BMIter iter;
@@ -1257,22 +1221,22 @@
f = NULL;
/* the order of vertices can be anything, 6 cases to check */
- if( convex(verts[0]->co, verts[1]->co, verts[2]->co, verts[3]->co) ) {
+ if( is_quad_convex_v3(verts[0]->co, verts[1]->co, verts[2]->co, verts[3]->co) ) {
f= BM_Make_QuadTri(bm, verts[0], verts[1], verts[2], verts[3], NULL, 1);
}
- else if( convex(verts[0]->co, verts[2]->co, verts[3]->co, verts[1]->co) ) {
+ else if( is_quad_convex_v3(verts[0]->co, verts[2]->co, verts[3]->co, verts[1]->co) ) {
f= BM_Make_QuadTri(bm, verts[0], verts[2], verts[3], verts[1], NULL, 1);
}
- else if( convex(verts[0]->co, verts[2]->co, verts[1]->co, verts[3]->co) ) {
+ else if( is_quad_convex_v3(verts[0]->co, verts[2]->co, verts[1]->co, verts[3]->co) ) {
f= BM_Make_QuadTri(bm, verts[0], verts[2], verts[1], verts[3], NULL, 1);
}
- else if( convex(verts[0]->co, verts[1]->co, verts[3]->co, verts[2]->co) ) {
+ else if( is_quad_convex_v3(verts[0]->co, verts[1]->co, verts[3]->co, verts[2]->co) ) {
f= BM_Make_QuadTri(bm, verts[0], verts[1], verts[3], verts[2], NULL, 1);
}
- else if( convex(verts[0]->co, verts[3]->co, verts[2]->co, verts[1]->co) ) {
+ else if( is_quad_convex_v3(verts[0]->co, verts[3]->co, verts[2]->co, verts[1]->co) ) {
f= BM_Make_QuadTri(bm, verts[0], verts[3], verts[2], verts[1], NULL, 1);
}
- else if( convex(verts[0]->co, verts[3]->co, verts[1]->co, verts[2]->co) ) {
+ else if( is_quad_convex_v3(verts[0]->co, verts[3]->co, verts[1]->co, verts[2]->co) ) {
f= BM_Make_QuadTri(bm, verts[0], verts[3], verts[1], verts[2], NULL, 1);
}
else {
Modified: branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c 2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c 2011-04-22 23:37:58 UTC (rev 36285)
@@ -14,6 +14,10 @@
#define EDGE_NEW 1
#define FACE_NEW 1
+#define ELE_NEW 1
+#define FACE_MARK 2
+#define EDGE_MARK 4
+
void triangulate_exec(BMesh *bm, BMOperator *op)
{
BMOIter siter;
@@ -54,3 +58,73 @@
BLI_array_free(projectverts);
BLI_array_free(newfaces);
}
+
+void bmesh_beautify_fill_exec(BMesh *bm, BMOperator *op)
+{
+ BMOIter siter;
+ BMIter iter;
+ BMFace *f;
+ BMEdge *e;
+ int stop=0;
+
+ BMO_Flag_Buffer(bm, op, "constrain_edges", EDGE_MARK, BM_EDGE);
+
+ BMO_ITER(f, &siter, bm, op, "faces", BM_FACE) {
+ if (f->len == 3)
+ BMO_SetFlag(bm, f, FACE_MARK);
+ }
+
+ while (!stop) {
+ stop = 1;
+
+ BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BMVert *v1, *v2, *v3, *v4, *d1, *d2;
+ float len1, len2, len3, len4, len5, len6, opp1, opp2, fac1, fac2;
+ int ok;
+
+ if (BM_Edge_FaceCount(e) != 2 || BMO_TestFlag(bm, e, EDGE_MARK))
+ continue;
+ if (!BMO_TestFlag(bm, e->l->f, FACE_MARK) || !BMO_TestFlag(bm, e->l->radial_next->f, FACE_MARK))
+ continue;
+
+ v1 = e->l->prev->v;
+ v2 = e->l->v;
+ v3 = e->l->radial_next->prev->v;
+ v4 = e->l->next->v;
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list