[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58353] branches/soc-2013-sketch_mesh/ source/blender/editors/mesh/editmesh_deform_laplacian.c: The system now factored matrix only one time, then only processes the solution.

Alexander Pinzon apinzonf at gmail.com
Wed Jul 17 23:24:26 CEST 2013


Revision: 58353
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58353
Author:   apinzonf
Date:     2013-07-17 21:24:26 +0000 (Wed, 17 Jul 2013)
Log Message:
-----------
The system now factored matrix only one time, then only processes the solution.
The system can calculate the solution of automatic form after rotate, translate or scale the vertices handlers.

Modified Paths:
--------------
    branches/soc-2013-sketch_mesh/source/blender/editors/mesh/editmesh_deform_laplacian.c

Modified: branches/soc-2013-sketch_mesh/source/blender/editors/mesh/editmesh_deform_laplacian.c
===================================================================
--- branches/soc-2013-sketch_mesh/source/blender/editors/mesh/editmesh_deform_laplacian.c	2013-07-17 21:06:27 UTC (rev 58352)
+++ branches/soc-2013-sketch_mesh/source/blender/editors/mesh/editmesh_deform_laplacian.c	2013-07-17 21:24:26 UTC (rev 58353)
@@ -79,7 +79,6 @@
 	int numStatics;
 	BMesh *bm;
 	NLContext *context;			/* System for solve general implicit rotations*/
-	NLContext *contextrot;		/* System for solve general Laplacian with rotated differential coordinates*/
 };
 typedef struct BLaplacianSystem LaplacianSystem;
 
@@ -97,6 +96,7 @@
 	StaticAnchors  * sa;
 	HandlerAnchors * shs;
 	int stateSystem;
+	bool update_required;
 };
 
 typedef struct BSystemCustomData SystemCustomData;
@@ -108,7 +108,8 @@
 	LAP_MODAL_PREVIEW,
 	LAP_MODAL_MARK_STATIC,
 	LAP_MODAL_MARK_HANDLER,
-	LAP_MODAL_TRANSFORM
+	LAP_MODAL_TRANSFORM, 
+	LAP_MODAL_NOTHING 
 };
 
 wmKeyMap * laplacian_deform_modal_keymap(wmKeyConfig *keyconf);
@@ -117,7 +118,6 @@
 static HandlerAnchors * init_handler_anchors(int numh);
 static LaplacianSystem * init_laplacian_system(int numv, int nums, int numh);
 static float cotan_weight(float *v1, float *v2, float *v3);
-static float div_fl_fl(float x, float y);
 static int laplacian_deform_invoke(struct bContext *C, struct wmOperator *op, const struct wmEvent *evt);
 static int laplacian_deform_modal(bContext *C, wmOperator *op, const wmEvent *event);
 static int laplacian_deform_cancel(bContext *C, wmOperator *op);
@@ -210,7 +210,6 @@
 	delete_void_pointer(sys->list_uverts);
 	sys->bm = NULL;
 	if (sys->context) nlDeleteContext(sys->context);
-	if (sys->contextrot) nlDeleteContext(sys->contextrot);
 	delete_void_pointer(sys);
 	sys = NULL;
 }
@@ -357,11 +356,6 @@
 	return dot_v3v3(a, b) / clen;
 }
 
-static float div_fl_fl(float x, float y){
-	if (fabs(y) > 0.0f) return x/y;
-	return 0.0f;
-}
-
 static void init_laplacian_matrix( SystemCustomData * data)
 {
 	float v1[3], v2[3], v3[3], v4[3], no[3];
@@ -425,26 +419,19 @@
 
 			if (has_4_vert) {
 
-				w2 = (cotan_weight(v4, v1, v2) + cotan_weight(v3, v1, v2)) ;
-				w3 = (cotan_weight(v2, v3, v1) + cotan_weight(v4, v1, v3)) ;
-				w4 = (cotan_weight(v2, v4, v1) + cotan_weight(v3, v4, v1)) ;
+				w2 = (cotan_weight(v4, v1, v2) + cotan_weight(v3, v1, v2)) /2.0f ;
+				w3 = (cotan_weight(v2, v3, v1) + cotan_weight(v4, v1, v3)) /2.0f ;
+				w4 = (cotan_weight(v2, v4, v1) + cotan_weight(v3, v4, v1)) /2.0f;
 
 				sys->delta[idv1][0] -=  v4[0] * w4;
 				sys->delta[idv1][1] -=  v4[1] * w4;
 				sys->delta[idv1][2] -=  v4[2] * w4;
 
-				nlMakeCurrent(sys->context);
-				nlRightHandSideAdd(0, idv1						, -v4[0] * w4);
-				nlRightHandSideAdd(0, sys->numVerts + idv1		, -v4[1] * w4);
-				nlRightHandSideAdd(0, 2*sys->numVerts + idv1	, -v4[2] * w4);
+				nlRightHandSideAdd(0, idv1, -v4[0] * w4);
+				nlRightHandSideAdd(1, idv1, -v4[1] * w4);
+				nlRightHandSideAdd(2, idv1, -v4[2] * w4);
 
-				nlMakeCurrent(sys->context);
-				nlMatrixAdd(idv1					, idv4						, -w4 );
-				nlMatrixAdd(sys->numVerts + idv1	, sys->numVerts + idv4		, -w4 );
-				nlMatrixAdd(sys->numVerts*2 + idv1	, sys->numVerts*2 + idv4	, -w4 );
-
-				nlMakeCurrent(sys->contextrot);
-				nlMatrixAdd(idv1					, idv4						, -w4 );				
+				nlMatrixAdd(idv1, idv4, -w4 );				
 			}
 			else {
 				w2 = cotan_weight(v3, v1, v2);
@@ -464,36 +451,21 @@
 			sys->delta[idv1][1] -=  v3[1] * w3;
 			sys->delta[idv1][2] -=  v3[2] * w3;
 
-			nlMakeCurrent(sys->context);
-			nlRightHandSideAdd(0, idv1						, v1[0] * (w2 + w3 + w4));
-			nlRightHandSideAdd(0, sys->numVerts + idv1		, v1[1] * (w2 + w3 + w4));
-			nlRightHandSideAdd(0, 2*sys->numVerts + idv1	, v1[2] * (w2 + w3 + w4));
+			nlRightHandSideAdd(0, idv1	, v1[0] * (w2 + w3 + w4));
+			nlRightHandSideAdd(1, idv1	, v1[1] * (w2 + w3 + w4));
+			nlRightHandSideAdd(2, idv1	, v1[2] * (w2 + w3 + w4));
 
-			nlRightHandSideAdd(0, idv1						, -v2[0] * w2);
-			nlRightHandSideAdd(0, sys->numVerts + idv1		, -v2[1] * w2);
-			nlRightHandSideAdd(0, 2*sys->numVerts + idv1	, -v2[2] * w2);
+			nlRightHandSideAdd(0, idv1	, -v2[0] * w2);
+			nlRightHandSideAdd(1, idv1	, -v2[1] * w2);
+			nlRightHandSideAdd(2, idv1	, -v2[2] * w2);
 
-			nlRightHandSideAdd(0, idv1						, -v3[0] * w3);
-			nlRightHandSideAdd(0, sys->numVerts + idv1		, -v3[1] * w3);
-			nlRightHandSideAdd(0, 2*sys->numVerts + idv1	, -v3[2] * w3);
+			nlRightHandSideAdd(0, idv1	, -v3[0] * w3);
+			nlRightHandSideAdd(1, idv1	, -v3[1] * w3);
+			nlRightHandSideAdd(2, idv1	, -v3[2] * w3);
 
-			nlMakeCurrent(sys->context);
-			nlMatrixAdd(idv1					, idv2						, -w2);
-			nlMatrixAdd(sys->numVerts + idv1	, sys->numVerts + idv2		, -w2);
-			nlMatrixAdd(sys->numVerts*2 + idv1	, sys->numVerts*2 + idv2	, -w2);
-
-			nlMatrixAdd(idv1					, idv3						, -w3);
-			nlMatrixAdd(sys->numVerts + idv1	, sys->numVerts + idv3		, -w3);
-			nlMatrixAdd(sys->numVerts*2 + idv1	, sys->numVerts*2 + idv3	, -w3);
-
-			nlMatrixAdd(idv1					, idv1						, w2 + w3 + w4);
-			nlMatrixAdd(sys->numVerts + idv1	, sys->numVerts + idv1		, w2 + w3 + w4);
-			nlMatrixAdd(sys->numVerts*2 + idv1	, sys->numVerts*2 + idv1	, w2 + w3 + w4);
-
-			nlMakeCurrent(sys->contextrot);
-			nlMatrixAdd(idv1					, idv2						, -w2);
-			nlMatrixAdd(idv1					, idv3						, -w3);
-			nlMatrixAdd(idv1					, idv1						, w2 + w3 + w4);
+			nlMatrixAdd(idv1, idv2, -w2);
+			nlMatrixAdd(idv1, idv3, -w3);
+			nlMatrixAdd(idv1, idv1, w2 + w3 + w4);
 			
 		}
 	}
@@ -513,7 +485,6 @@
 	StaticAnchors * sa = data->sa;
 	BLI_array_declare(vidn);
 
-	nlMakeCurrent(sys->context);
 	BM_ITER_MESH (v, &viter, sys->bm, BM_VERTS_OF_MESH) {
 		i = BM_elem_index_get(v);
 		normalize_v3( sa->no[i]);
@@ -578,10 +549,9 @@
         beta = dot_v3v3(uij, di);
         gamma = dot_v3v3(e2, di);
 
-		nlMakeCurrent(sys->context);
 		pi[0] = nlGetVariable(0, i);
-		pi[1] = nlGetVariable(0, i + sys->numVerts);
-		pi[2] = nlGetVariable(0, i + sys->numVerts*2);
+		pi[1] = nlGetVariable(1, i);
+		pi[2] = nlGetVariable(2, i);
 		ni[0] = 0.0f;	ni[1] = 0.0f;	ni[2] = 0.0f;
 		num_fni = 0;
 		BM_ITER_ELEM_INDEX(f, &fiter, v, BM_FACES_OF_VERT, num_fni) {
@@ -593,8 +563,8 @@
 			
 			for (j=0; j<lvin; j++ ) {
 				vn[j][0] = nlGetVariable(0, vin[j]);
-				vn[j][1] = nlGetVariable(0, vin[j] + sys->numVerts);
-				vn[j][2] = nlGetVariable(0, vin[j] + sys->numVerts*2);
+				vn[j][1] = nlGetVariable(1, vin[j]);
+				vn[j][2] = nlGetVariable(2, vin[j]);
 				if (vin[j] == sys->list_uverts[i]) {
 					copy_v3_v3(pj, vn[j]);
 				}
@@ -618,8 +588,6 @@
 		normalize_v3(uij);
 		cross_v3_v3v3(e2, ni, uij);
 
-
-		nlMakeCurrent(sys->contextrot);
 		nlRightHandSideSet(0, i, alpha*ni[0] + beta*uij[0] + gamma*e2[0]);
 		nlRightHandSideSet(1, i, alpha*ni[1] + beta*uij[1] + gamma*e2[1]);
 		nlRightHandSideSet(2, i, alpha*ni[2] + beta*uij[2] + gamma*e2[2]);
@@ -630,11 +598,21 @@
 
 static int laplacian_deform_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
+	SystemCustomData * data =  op->customdata;
+	if (data) if (data->update_required) {
+		data->update_required = false;
+		printf("\nLAP_MODAL_PREVIEW\n");
+		laplacian_deform_preview(C, op);
+		laplacian_deform_update_header(C);
+		ED_region_tag_redraw(CTX_wm_region(C));
+		return OPERATOR_RUNNING_MODAL;
+	}
 
 	if(event->type == EVT_MODAL_MAP) {
 		switch (event->val) {
 			case LAP_MODAL_CANCEL:
 				printf("\nLAP_MODAL_CANCEL\n");
+				ED_area_headerprint(CTX_wm_area(C), NULL);
 				laplacian_deform_cancel(C, op);
 				return OPERATOR_CANCELLED;
 			case LAP_MODAL_MARK_HANDLER:
@@ -655,8 +633,15 @@
 				break;
 			case LAP_MODAL_TRANSFORM:
 				printf("\nLAP_MODAL_TRANSFORM\n");
+				if (data) {
+					data->update_required = true;
+				}
 				return OPERATOR_PASS_THROUGH;
 				break;
+			case LAP_MODAL_NOTHING:
+				printf("\nLAP_MODAL_NOTHING\n");
+				return OPERATOR_PASS_THROUGH;
+				break;
 			/*default:
 				return OPERATOR_PASS_THROUGH;
 				break;*/
@@ -718,23 +703,26 @@
 
 	WM_modalkeymap_add_item(keymap, SKEY, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
 	WM_modalkeymap_add_item(keymap, RKEY, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, TKEY, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, BKEY, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, CKEY, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
 	WM_modalkeymap_add_item(keymap, GKEY, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PAD0, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PAD1, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PAD2, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PAD3, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PAD4, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PAD5, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PAD6, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PAD7, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PAD8, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PAD9, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PADMINUS, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
-	WM_modalkeymap_add_item(keymap, PADPLUSKEY, KM_PRESS, 0, 0, LAP_MODAL_TRANSFORM);
+
+	WM_modalkeymap_add_item(keymap, ZKEY, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);
+	WM_modalkeymap_add_item(keymap, TKEY, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);
+	WM_modalkeymap_add_item(keymap, NKEY, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);
+	WM_modalkeymap_add_item(keymap, BKEY, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);
+	WM_modalkeymap_add_item(keymap, CKEY, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);
+	WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);
+	WM_modalkeymap_add_item(keymap, PAD0, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);
+	WM_modalkeymap_add_item(keymap, PAD1, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);
+	WM_modalkeymap_add_item(keymap, PAD2, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);
+	WM_modalkeymap_add_item(keymap, PAD3, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);
+	WM_modalkeymap_add_item(keymap, PAD4, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);
+	WM_modalkeymap_add_item(keymap, PAD5, KM_PRESS, 0, 0, LAP_MODAL_NOTHING);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list