[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50103] branches/soc-2012-sushi/source/ blender: Bridge, add n-gon optimization

Alexander Mokhov alexander.mokhov at gmail.com
Tue Aug 21 23:42:42 CEST 2012


Revision: 50103
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50103
Author:   redtriangle
Date:     2012-08-21 21:42:42 +0000 (Tue, 21 Aug 2012)
Log Message:
-----------
Bridge, add n-gon optimization
Bevel, fix error in calculating profile.

Modified Paths:
--------------
    branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_bevel.c
    branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_connect.c
    branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c

Modified: branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c	2012-08-21 21:01:07 UTC (rev 50102)
+++ branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c	2012-08-21 21:42:42 UTC (rev 50103)
@@ -447,6 +447,7 @@
      {BMO_OP_SLOT_INT,  "segmentation"}, /* input segmentation param */
      {BMO_OP_SLOT_INT,  "interpolation"}, /* input interpolation param */
      {BMO_OP_SLOT_FLT,  "strenght"}, /* input strenght param */
+	 {BMO_OP_SLOT_BOOL, "n_gon"},	 /* flag N-gon optimization */
 
 	 {0, /* null-terminating sentinel */}},
 	bmo_bridge_loops_exec,

Modified: branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_bevel.c
===================================================================
--- branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_bevel.c	2012-08-21 21:01:07 UTC (rev 50102)
+++ branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_bevel.c	2012-08-21 21:42:42 UTC (rev 50103)
@@ -66,10 +66,23 @@
 	BMVert *v;
 } NewVertexItem;
 
+
+
+/* list of new vertices formed around v */
+typedef struct AdditionalVert{
+	struct AdditionalVert *next, *prev;
+	BMVert *v;			/* parrent vertex */
+	ListBase vertices;  /* List of auxiliary vertices */
+	int count;			/* count input edges, alse count additioanl vertex */
+	int countSelect;	/* count input selection edges */
+} AdditionalVert;
+
+
+
 /* Item in the list of additional vertices */
 typedef struct VertexItem{
 	struct VertexItem *next, *prev;
-	BMVert *v;		/* parent vertex */
+	BMVert *v;
 	int onEdge;		/*	1 if new vertex located on edge; edge1 = edge, edge2 = NULL
 					*	0 if new vert located betwen edge1 and edge2
 						3 additional vert for rounding case	*/
@@ -77,26 +90,22 @@
 	BMEdge *edge2;
 	BMFace *f;
 	float hv[3];	/* coordinate of support vertex */
-}VertexItem;
+	AdditionalVert *parent;
+} VertexItem;
 
-/* list of new vertices formed around v */
-typedef struct AdditionalVert{
-	struct AdditionalVert *next, *prev;
-	BMVert *v;			/* parrent vertex */
-	ListBase vertices;  /* List of auxiliary vertices */
-	int count;			/* count input edges, alse count additioanl vertex */
-	int countSelect;	/* count input selection edges */
-} AdditionalVert;
 
+
 /*
 * struct with bevel parametrs
 */
-typedef struct BevelParams{
+typedef struct BevelParams {
 	ListBase vertList;		/* list additional vertex */
 	ListBase newVertList;	/* list of creation vertices */
 	float offset;
 	int byPolygon;			/* 1 - make bevel on each polygon, 0 - ignore internal polygon */
 	int seg;				/* segmentation */
+	int isMaxOffset;		/* flag	for control offset 0 - offset < max, 1 - offset > max*/
+	float maxOffset;		/* maximum allowable offset */
 
 	BMOperator *op;
 } BevelParams;
@@ -239,12 +248,37 @@
 		(etags[BM_elem_index_get((e))].newv2)                                 \
 	)
 
+
+void recalculate_aditional_vert(BMesh* bm, BevelParams* bp, VertexItem *vi, BMEdge* sEdge)
+{
+	// берем минимальный отсуп
+	float ve[3], sve[3], angle, lenght, viLen, vie[3];
+	BMVert *v;
+	v = vi->parent->v;
+
+	sub_v3_v3v3(ve, BM_edge_other_vert(vi->edge1, v)->co, v->co);
+	sub_v3_v3v3(sve, BM_edge_other_vert(sEdge, v)->co, v->co);
+
+	angle = angle_v3v3(ve, sve);
+	lenght = bp->offset / sin(angle);
+
+	sub_v3_v3v3(vie, v->co, vi->v->co);
+	viLen = len_v3(vie);
+
+	if (lenght < viLen){
+		normalize_v3(ve);
+		mul_v3_fl(ve, lenght);
+		add_v3_v3(ve, v->co);
+		vi->v = BM_vert_create(bm, ve, NULL);
+	}
+}
+
 /* build point on edge
 *  sEdge - selectes edge */
 BMVert* bevel_calc_aditional_vert(BMesh *bm, BevelParams *bp, BMEdge *sEdge, BMEdge* edge, BMVert* v)
 {
 	BMVert *new_Vert = NULL;
-/*	float vect[3], normV[3];
+	/*float vect[3], normV[3];
 	sub_v3_v3v3(vect, BM_edge_other_vert(edge, v)->co, v->co);
 	normalize_v3_v3(normV, vect);
 	mul_v3_fl(normV, bp->offset);
@@ -261,6 +295,10 @@
 
 	angle = angle_v3v3(ve, sve);
 	lenght = bp->offset / sin(angle);
+
+	//if (bp->maxOffset < lenght)
+	//	bp->maxOffset = lenght;
+
 	normalize_v3(ve);
 	mul_v3_fl(ve, lenght);
 	add_v3_v3(ve, v->co);
@@ -294,7 +332,6 @@
 BMVert* bevel_middle_vert(BMesh *bm, BevelParams *bp, BMEdge *edge_a, BMEdge *edge_b, BMVert *vert)
 {
 	float offset, v_a[3], v_b[3], v_c[3], norm_a[3], norm_b[3],norm_c[3],  angel;
-	float co[3];
 	BMVert* new_vert = NULL;
 	offset = bp->offset;
 	/* calc vectors */
@@ -395,10 +432,45 @@
 	return result;
 }
 
-VertexItem* calc_support_vertex(BevelParams* bp, BMEdge *e, BMVert *v)
+/*
+*	A-M-B
+*	  |
+*	C-N-D
+*  A-B, C-D input line
+* return MN - distance
+*/
+float calc_len_between_line(float A[3], float B[3], float C[3], float D[3], float M[3], float N[3])
 {
+	float P1, P2, Q1, Q2, R1, R2, m, n;
+	float MN[3];
+
+	P1 = (B[0] - A[0]) * (B[0] - A[0]) + (B[1] - A[1]) * (B[1] - A[1]) + (B[2] - A[2]) * (B[2] - A[2]);
+	P2 = (B[0] - A[0]) * (D[0] - C[0]) + (B[1] - A[1]) * (D[1] - C[1]) + (B[2] - A[2]) * (D[2] - C[2]);
+	Q1 = -1 * P2;
+	Q2 = -1 * ((D[0]  - C[0]) * (D[0] - C[0]) + (D[1] - C[1]) * (D[1] - C[1]) + (D[2] - C[2]) * (D[2] - C[2]));
+	R1 = (C[0] - A[0]) * (B[0] - A[0]) + (C[1] - A[1]) * (B[1] - A[1]) + (C[2] - A[2]) * (B[2] - A[2]);
+	R2 = (C[0] - A[0]) * (D[0] - C[0]) + (C[1] - A[1]) * (D[1] - C[1]) + (C[2] - A[2]) * (D[2] - C[2]);
+
+	m = (Q2 * R1 - Q1 * R2) / (P1 * Q2 - P2 * Q1);
+	n = (P1 * R2 - P2 * R1) / (P1 * Q2 - P2 * Q1);
+
+	M[0] = A[0] + m * (B[0] - A[0]);
+	M[1] = A[1] + m * (B[1] - A[1]);
+	M[2] = A[2] + m * (B[2] - A[2]);
+
+	N[0] = C[0] + n * (D[0] - C[0]);
+	N[1] = C[1] + n * (D[1] - C[1]);
+	N[2] = C[2] + n * (D[2] - C[2]);
+
+	sub_v3_v3v3(MN, M, N);
+	return len_v3(MN);
+}
+
+VertexItem* calc_support_vertex(BMEdge *e, BMVert *v, VertexItem *itemA, VertexItem *itemB)
+{
 	VertexItem *item;
-	float vect[3], normV[3];
+//	float vect[3], normV[3];
+	float M[3], N[3];
 
 	item = (VertexItem*)MEM_callocN(sizeof(VertexItem), "VertexItem");
 	item->onEdge = 3;
@@ -407,27 +479,68 @@
 	item->f = NULL;
 	item->v = NULL;
 
-	sub_v3_v3v3(vect, BM_edge_other_vert(e, v)->co, v->co);
+	/*sub_v3_v3v3(vect, BM_edge_other_vert(e, v)->co, v->co);
 	normalize_v3_v3(normV, vect);
 	mul_v3_fl(normV, bp->offset);
 	add_v3_v3(normV, v->co);
 
-	copy_v3_v3(item->hv, normV);
+	copy_v3_v3(item->hv, normV);*/
+
+	calc_len_between_line(v->co, BM_edge_other_vert(e, v)->co, itemA->v->co, itemB->v->co, M, N);
+	copy_v3_v3(item->hv, M);
+
 	return item;
 }
 
-int check_dublicated_vertex_item_by_edge(AdditionalVert *av, BMEdge* edge)
+/*
+  return NULL if not dublicated
+	return dublicated item
+*/
+VertexItem* check_dublicated_vertex_item_by_edge(AdditionalVert *av, BMEdge* edge)
 {
-	VertexItem *vitem;
-	int result = 0;
+	VertexItem *vitem, *vi = NULL;
+//	int result = 0;
+
 	for (vitem = av->vertices.first; vitem; vitem = vitem->next) {
 		if  ((vitem->onEdge == 1) &&
 			(vitem->edge1 == edge))
-			result = 1;
+			vi = vitem;
 	}
-	return result;
+	return vi;
 
-}/*
+}
+
+VertexItem* find_on_edge_vertex_item(AdditionalVert* av, BMEdge *e)
+{
+	VertexItem *item, *r = NULL;
+	for (item = av->vertices.first; item; item = item->next){
+		if ((item->onEdge == 1) && (item->edge1 == e))
+			r = item;
+	}
+	return r;
+}
+
+
+VertexItem* find_between_vertex_item(AdditionalVert* av, BMEdge *e, VertexItem *exclI)
+{
+	VertexItem *item, *r = NULL;
+	for (item = av->vertices.first; item; item = item->next){
+		if (exclI != NULL){
+			if ((item->onEdge == 0) &&
+					(item != exclI) &&
+					((item->edge1 == e) || (item->edge2) == e))
+				r = item;
+		}
+		else {
+			if ((item->onEdge == 0) &&
+				((item->edge1 == e) || (item->edge2) == e))
+			r = item;
+		}
+	}
+	return r;
+}
+
+/*
 * additional construction arround the vertex
 */
 void bevel_aditional_construction_by_vert(BMesh *bm, BevelParams *bp, BMOperator *op, BMVert *v)
@@ -436,7 +549,6 @@
 	BMOIter siter;
 	//BMIter iter;
 	BMEdge *e, **edges = NULL;
-	int i;
 	BLI_array_declare(edges);
 
 	// calc count input selected edges
@@ -464,9 +576,10 @@
 			if (BMO_elem_flag_test(bm, e, EDGE_SELECTED)) {
 				BMFace *f;
 				BMIter iter;
+
 				av->countSelect++;
 				/* calc additional point,    calc support vertex on edge */
-				BLI_addtail(&av->vertices, calc_support_vertex(bp, e, v));
+				//BLI_addtail(&av->vertices, calc_support_vertex(bp, e, v));
 
 				/* point located beteween selecion edges*/
 				BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
@@ -477,6 +590,7 @@
 							if (!check_dublicated_vertex_item(av, f)) {
 								VertexItem *item;
 								item = (VertexItem*)MEM_callocN(sizeof(VertexItem), "VertexItem");
+								item->parent = av;
 								item->onEdge = 0; // false
 								item->edge1 = e;
 								item->edge2 = find_selected_edge_in_face(bm, f, e, v);
@@ -489,9 +603,10 @@
 
 						adjacentE = find_non_selected_adjacent_edge(bm, f, e, v);
 						if ((l->e == e) && (adjacentE != NULL)){
-							if (!check_dublicated_vertex_item_by_edge(av, adjacentE)){
+							if (check_dublicated_vertex_item_by_edge(av, adjacentE) == NULL){
 								VertexItem *item;
 								item = (VertexItem*)MEM_callocN(sizeof(VertexItem), "VertexItem");
+								item->parent = av;
 								item->onEdge = 1; /* true */
 								item->edge1 = adjacentE;
 								item->edge2 = NULL;
@@ -500,6 +615,8 @@
 
 								BLI_addtail(&av->vertices, item);
 								av->count ++;
+							} else{
+								recalculate_aditional_vert(bm, bp, check_dublicated_vertex_item_by_edge(av, adjacentE), e);
 							}
 						}
 
@@ -513,8 +630,8 @@
 			/*if (!BMO_elem_flag_test(bm, e, EDGE_SELECTED)){
 				VertexItem *item;
 				item = (VertexItem*)MEM_callocN(sizeof(VertexItem), "VertexItem");
-				item->onEdge = 1; /* true */
-				/*item->edge1 = e;
+				item->onEdge = 1;
+				item->edge1 = e;
 				item->edge2 = NULL;
 				item->f = NULL;
 				item->v = bevel_calc_aditional_vert(bm, bp, e, v);
@@ -522,14 +639,30 @@
 				av->count ++;
 			}*/
 		} while (e != edges[0]);
+
+		/* calc additional point,    calc support vertex on edge */
+		e = bmesh_disk_faceedge_find_first(edges[0], v);
+		do {
+			VertexItem *itemA, *itemB; /* pair of middle vertices */
+			e = bmesh_disk_edge_next(e, v);
+			if (BMO_elem_flag_test(bm, e, EDGE_SELECTED)) {
+			itemA = find_between_vertex_item(av, e , NULL);
+				if (itemA != NULL)
+					itemB = find_between_vertex_item(av, e , itemA);
+
+				if ((itemA != NULL && itemB != NULL))
+					BLI_addtail(&av->vertices, calc_support_vertex(e, v, itemA, itemB));
+			}
+		} while (e != edges[0]);
 	}
+
 	BLI_array_free(edges);
 }
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list