[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36096] branches/bmesh/blender/source/ blender: =bmesh=

Joseph Eagar joeedh at gmail.com
Mon Apr 11 03:38:21 CEST 2011


Revision: 36096
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36096
Author:   joeedh
Date:     2011-04-11 01:38:20 +0000 (Mon, 11 Apr 2011)
Log Message:
-----------
=bmesh=

Made the new "superknife" tool much stabler
then it was, though a few minor quirks remain.
Rather then the shortest-distance-in-graph method
I was using to rebuild the mesh post-knife I
reworked it to build a triangulation instead,
then merge the triangles into the right correct
faces.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c
    branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c
    branches/bmesh/blender/source/blender/editors/space_view3d/drawmesh.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2011-04-11 01:38:20 UTC (rev 36096)
@@ -202,7 +202,7 @@
 		/*complete the loop*/
 		BLI_addfilledge(firstv, v);
 
-		BLI_edgefill(0);
+		BLI_edgefill(2);
 		
 		for (efa = fillfacebase.first; efa; efa=efa->next) {
 			BMLoop *l1, *l2, *l3;

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-04-11 01:38:20 UTC (rev 36096)
@@ -2008,7 +2008,7 @@
 			}
 			BLI_addfilledge(lastv, firstv);
 			
-			BLI_edgefill(0);
+			BLI_edgefill(2);
 			for (f=fillfacebase.first; f; f=f->next) {
 				BLI_array_growone(mf);
 				BLI_array_growone(origIndex);

Modified: branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c	2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c	2011-04-11 01:38:20 UTC (rev 36096)
@@ -791,17 +791,17 @@
 		a += 1;
 	}
 
-	if (a == 3) {
+	if (a == 3 && (mat_nr & 2)) {
 		eve = fillvertbase.first;
 
 		addfillface(eve, eve->next, eve->next->next, 0);
 		return 1;
-	} else if (a == 4) {
+	} else if (a == 4 && (mat_nr & 2)) {
 		float vec1[3], vec2[3];
 
 		eve = fillvertbase.first;
 		
-		if (1) { //BMESH_TODO this is correct, right? -joeedh //mode & 2) {
+		if (1) { //BMESH_TODO) {
 			/*use shortest diagonal for quad*/
 			sub_v3_v3v3(vec1, eve->co, eve->next->next->co);
 			sub_v3_v3v3(vec2, eve->next->co, eve->next->next->next->co);
@@ -855,6 +855,13 @@
 	while(eve) {
 		if(v2) {
 			if( compare_v3v3(v2, eve->co, COMPLIMIT)==0) {
+				float inner = angle_v3v3v3(v1, v2, eve->co);
+				
+				if (fabs(inner-M_PI) < 0.05 || fabs(inner) < 0.05) {
+					eve = eve->next;	
+					continue;
+				}
+
 				len= normal_tri_v3( norm,v1, v2, eve->co);
 				if(len != 0.0) break;
 			}

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2011-04-11 01:38:20 UTC (rev 36096)
@@ -209,8 +209,8 @@
 	
 		f = BM_Make_Face(bm, verts, edar, len);
 	
-		if(example)
-			CustomData_bmesh_copy_data(&bm->pdata, &bm->pdata, example->head.data, &f->head.data);
+		if(example && f)
+			BM_Copy_Attributes(bm, bm, example, f);
 
 	}
 

Modified: branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c	2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c	2011-04-11 01:38:20 UTC (rev 36096)
@@ -213,7 +213,7 @@
 	hit.dist = FLT_MAX;
 	hit.index = -1;
 
-	BLI_bvhtree_ray_cast(tree->tree, co, dir, FLT_MAX, &hit, raycallback, tree);
+	BLI_bvhtree_ray_cast(tree->tree, co, dir, 0.0f, &hit, raycallback, tree);
 	if (hit.dist != FLT_MAX && hit.index != -1) {
 		if (hitout) {
 			VECCOPY(hitout, hit.co);

Modified: branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/knifetool.c	2011-04-11 01:18:25 UTC (rev 36095)
+++ branches/bmesh/blender/source/blender/editors/mesh/knifetool.c	2011-04-11 01:38:20 UTC (rev 36096)
@@ -52,8 +52,10 @@
 #include "BLI_memarena.h"
 #include "BLI_mempool.h"
 #include "BLI_math.h"
+#include "BLI_rand.h"
 #include "BLI_kdopbvh.h"
 #include "BLI_smallhash.h"
+#include "BLI_scanfill.h"
 
 #include "BKE_blender.h"
 #include "BKE_context.h"
@@ -85,6 +87,7 @@
 #include "editbmesh_bvh.h"
 
 #define MAXGROUP	30
+#define KMAXDIST	25	/*max mouse distance from edge before not detecting it*/
 
 /* knifetool operator */
 typedef struct KnifeVert {
@@ -92,7 +95,7 @@
 	ListBase edges;
 
 	float co[3], sco[3]; /*sco is screen coordinates*/
-	short flag, draw, isface;
+	short flag, draw, isface, inspace;
 } KnifeVert;
 
 typedef struct Ref {
@@ -109,16 +112,13 @@
 	BMEdge *e, *oe; /*non-NULL if this is an original edge*/
 } KnifeEdge;
 
-#define KMAXDIST	12	/*max mouse distance from edge before not detecting it*/
-#define MARK		4
-#define DEL			8
-
 typedef struct BMEdgeHit {
 	KnifeEdge *kfe;
 	float hit[3];
-	float shit[3];
+	float realhit[3]; /*used in midpoint mode*/
+	float schit[3];
 	float l; /*lambda along line*/
-	BMVert *v; //set if snapped to a vert
+	KnifeVert *v; //set if snapped to a vert
 	BMFace *f;
 } BMEdgeHit;
 
@@ -166,13 +166,19 @@
 	BLI_mempool *refs;
 	
 	float projmat[4][4];
-	int is_ortho, clipsta, clipend;
+	int is_ortho;
+	float clipsta, clipend;
 	
 	enum {
 		MODE_IDLE,
 		MODE_DRAGGING,
 		MODE_CONNECT,
+		MODE_PANNING,
 	} mode;
+	
+	int snap_midpoints, prevmode, extend;
+	
+	int is_space, prev_is_space; /*1 if current cut location, vertco, isn't on the mesh*/
 } knifetool_opdata;
 
 static ListBase *knife_get_face_kedges(knifetool_opdata *kcd, BMFace *f);
@@ -266,6 +272,8 @@
 	kcd->prevvert = kcd->curvert;
 	kcd->prevbmface = kcd->curbmface;
 	kcd->cutnr++;
+	kcd->prev_is_space = kcd->is_space;
+	kcd->is_space = 0;
 	
 	copy_v3_v3(kcd->prevco, kcd->vertco);
 }
@@ -425,13 +433,17 @@
 	if (kcd->prevedge && kcd->prevedge == kcd->curedge)
 		return;
 	
+	kfe->draw = 1;
+
 	if (kcd->prevvert) {
 		kfe->v1 = kcd->prevvert;
 	} else if (kcd->prevedge) {
 		kfe->v1 = knife_split_edge(kcd, kcd->prevedge, kcd->prevco, &kfe2);
 	} else {
 		kfe->v1 = new_knife_vert(kcd, kcd->prevco);
-		kfe->v1->draw = 1;
+		kfe->v1->draw = kfe->draw = !kcd->prev_is_space;
+		kfe->v1->inspace = kcd->prev_is_space;
+		kfe->draw = !kcd->prev_is_space;
 		kfe->v1->isface = 1;
 	}
 	
@@ -439,20 +451,22 @@
 		kfe->v2 = kcd->curvert;
 	} else if (kcd->curedge) {
 		kfe->v2 = knife_split_edge(kcd, kcd->curedge, kcd->vertco, &kfe3);
-		
+	
 		kcd->curvert = kfe->v2;
 	} else {
 		kfe->v2 = new_knife_vert(kcd, kcd->vertco);
-		kfe->v2->draw = 1;
+		kfe->v2->draw = !kcd->is_space;
 		kfe->v2->isface = 1;
+		kfe->v2->inspace = kcd->is_space;
+		
+		if (kcd->is_space)
+			kfe->draw = 0;
 
 		kcd->curvert = kfe->v2;
 	}
 	
 	knife_find_basef(kcd, kfe);
 	
-	kfe->draw = 1;
-	
 	ref = BLI_mempool_calloc(kcd->refs);
 	ref->ref = kfe;	
 	BLI_addtail(&kfe->v1->edges, ref);
@@ -482,6 +496,7 @@
 	kcd->prevvert = kcd->curvert;
 	kcd->prevedge = kcd->curedge;
 	copy_v3_v3(kcd->prevco, kcd->vertco);
+	kcd->prev_is_space = kcd->is_space;
 }
 
 static int verge_linehit(const void *vlh1, const void *vlh2)
@@ -526,9 +541,20 @@
 				lastlh = firstlh = NULL;
 			}
 			
-			if (!lastlh && len_v3v3(kcd->prevco, lh->hit) < FLT_EPSILON*10)
+			if (len_v3v3(kcd->prevco, lh->realhit) < FLT_EPSILON*80)
 				continue;
+			if (len_v3v3(kcd->vertco, lh->realhit) < FLT_EPSILON*80)
+				continue;
 			
+			if (kcd->prev_is_space || kcd->is_space) {
+				kcd->prev_is_space = kcd->is_space = 0;
+				copy_v3_v3(kcd->prevco, lh->hit);
+				kcd->prevedge = lh->kfe;
+				kcd->curbmface = lh->f;
+				continue;
+			}			
+			
+			kcd->is_space = 0;
 			kcd->curedge = lh->kfe;
 			kcd->curbmface = lh->f;
 			kcd->curvert = lh->v;
@@ -540,6 +566,7 @@
 		kcd->curbmface = oldkcd.curbmface;
 		kcd->curvert = oldkcd.curvert;
 		kcd->curedge = oldkcd.curedge;
+		kcd->is_space = oldkcd.is_space;
 		copy_v3_v3(kcd->vertco, oldkcd.vertco);
 		
 		knife_add_single_cut(kcd);
@@ -563,7 +590,9 @@
 	knifetool_opdata *kcd = arg;
 	
 	glDisable(GL_DEPTH_TEST);
-
+	
+	glPolygonOffset(1.0f, 1.0f);
+	
 	glPushMatrix();
 	glMultMatrixf(kcd->ob->obmat);
 	
@@ -624,12 +653,13 @@
 			
 			knife_project_v3(kcd, lh->kfe->v1->co, sv1);
 			knife_project_v3(kcd, lh->kfe->v2->co, sv2);
+			knife_project_v3(kcd, lh->hit, lh->schit);
 			
-			if (len_v2v2(lh->shit, sv1) < kcd->vthresh/4) {
+			if (len_v2v2(lh->schit, sv1) < kcd->vthresh/4) {
 				copy_v3_v3(lh->hit, lh->kfe->v1->co);
 				glVertex3fv(lh->hit);
 				lh->v = lh->kfe->v1;
-			} else if (len_v2v2(lh->shit, sv2) < kcd->vthresh/4) {
+			} else if (len_v2v2(lh->schit, sv2) < kcd->vthresh/4) {
 				copy_v3_v3(lh->hit, lh->kfe->v2->co);
 				glVertex3fv(lh->hit);
 				lh->v = lh->kfe->v2;
@@ -723,6 +753,27 @@
 	fflush(stdout);
 }
 
+static int kfe_vert_in_edge(KnifeEdge *e, KnifeVert *v) {
+	return e->v1 == v || e->v2 == v;
+}
+
+static int point_on_line(float p[3], float v1[3], float v2[3])
+{
+	float d = dist_to_line_segment_v3(p, v1, v2);
+	if (d < 0.01) {
+		d = len_v3v3(v1, v2);
+		if (d == 0.0)
+			return 0;
+		
+		d = len_v3v3(p, v1) / d;
+		
+		if (d >= -FLT_EPSILON*10 || d <= 1.0+FLT_EPSILON*10)
+			return 1;
+	}
+	
+	return 0;
+}
+
 BMEdgeHit *knife_edge_tri_isect(knifetool_opdata *kcd, BMBVHTree *bmtree, float v1[3], 
                               float v2[3], float v3[3], SmallHash *ehash, bglMats *mats, int *count)
 {
@@ -732,7 +783,8 @@
 	BVHTreeOverlap *results, *result;
 	BMLoop **ls;
 	float cos[9], uv[3], lambda;
-	int tot=0, i, j;
+	unsigned int tot=0;
+	int i, j;
 	
 	copy_v3_v3(cos, v1);
 	copy_v3_v3(cos+3, v2);
@@ -756,6 +808,9 @@
 			for (ref=lst->first; ref; ref=ref->next) {			
 				KnifeEdge *kfe = ref->ref;
 				
+				if (kfe == kcd->curedge || kfe== kcd->prevedge)
+					continue;
+				
 				if (isect_line_tri_v3(kfe->v1->co, kfe->v2->co, v1, v2, v3, &lambda, uv)) {
 					float no[3], view[3], sp[3];
 					
@@ -763,6 +818,17 @@
 					mul_v3_fl(p, lambda);
 					add_v3_v3(p, kfe->v1->co);
 					
+					if (kcd->curedge && point_on_line(p, kcd->curedge->v1->co, kcd->curedge->v2->co))
+						continue;
+					if (kcd->prevedge && point_on_line(p, kcd->prevedge->v1->co, kcd->prevedge->v2->co))
+						continue;
+					if (kcd->curvert && len_v3v3(kcd->curvert->co, p) < FLT_EPSILON*50)
+						continue;
+					if (kcd->prevvert && len_v3v3(kcd->prevvert->co, p) < FLT_EPSILON*50)
+						continue;
+					if (len_v3v3(kcd->prevco, p) < FLT_EPSILON*50 || len_v3v3(kcd->vertco, p) < FLT_EPSILON*50)
+						continue;
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list