[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58300] branches/soc-2013-sketch_mesh/ source/blender/editors/mesh/editmesh_deform_laplacian.c: Testing deformation without compute implicit rotations.

Alexander Pinzon apinzonf at gmail.com
Tue Jul 16 02:39:55 CEST 2013


Revision: 58300
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58300
Author:   apinzonf
Date:     2013-07-16 00:39:55 +0000 (Tue, 16 Jul 2013)
Log Message:
-----------
Testing deformation without compute implicit rotations.
Implicit rotations cause erroneous solutions.

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-16 00:34:03 UTC (rev 58299)
+++ branches/soc-2013-sketch_mesh/source/blender/editors/mesh/editmesh_deform_laplacian.c	2013-07-16 00:39:55 UTC (rev 58300)
@@ -60,6 +60,7 @@
 	int * list_index;			/* Static vertex index list*/
 	float (*co)[3];				/* Original vertex coordinates*/
 	float (*no)[3];				/* Original vertex normal*/
+	BMVert ** list_verts;		/* Vertex order by index*/
 };
 typedef struct BStaticAnchors StaticAnchors;
 
@@ -73,7 +74,6 @@
 	float *vweights;			/* Total sum of weights per vertice*/
 	float (*delta)[3];			/* Differential Coordinates*/
 	int *list_uverts;			/* Unit vectors of projected edges onto the plane orthogonal to  n*/
-	BMVert ** list_verts;		/* Vertex order by index*/
 	/* Pointers to data*/
 	int numVerts;
 	int numHandlers;
@@ -151,8 +151,10 @@
 	sa->numVerts = numv;
 	sa->numStatics = nums;
 	sa->list_index = (int *)MEM_callocN(sizeof(int)*(sa->numStatics), "LapListStatics");
+	sa->list_verts = (BMVert**)MEM_callocN(sizeof(BMVert*)*(sa->numVerts), "LapListverts");
 	sa->co = (float (*)[3])MEM_callocN(sizeof(float)*(sa->numVerts*3), "LapCoordinates");
 	sa->no = (float (*)[3])MEM_callocN(sizeof(float)*(sa->numVerts*3), "LapNormals");
+	memset(sa->no, 0.0, sizeof(float) * sa->numVerts * 3);
 	return sa;
 }
 
@@ -185,7 +187,6 @@
 	sys->vweights = (float *)MEM_callocN(sizeof(float) * sys->numVerts, "LapVweights");
 	sys->list_uverts = (int *)MEM_callocN(sizeof(BMVert *) * sys->numVerts, "LapUverts");
 	sys->delta = (float (*)[3])MEM_callocN(sizeof(float) * sys->numVerts * 3, "LapDelta");
-	sys->list_verts = (BMVert**)MEM_callocN(sizeof(BMVert*) * sys->numVerts, "LapVerts");
 	memset(sys->vweights, 0.0 , sizeof(float) * sys->numVerts);
 	memset(sys->delta, 0.0, sizeof(float) * sys->numVerts * 3);
 	return sys;
@@ -197,6 +198,7 @@
 	delete_void_pointer(sa->co);
 	delete_void_pointer(sa->list_index);
 	delete_void_pointer(sa->no);
+	delete_void_pointer(sa->list_verts);
 	delete_void_pointer(sa);
 	sa = NULL;
 }
@@ -215,7 +217,6 @@
 	delete_void_pointer(sys->vweights);
 	delete_void_pointer(sys->delta);
 	delete_void_pointer(sys->list_uverts);
-	delete_void_pointer(sys->list_verts);
 	sys->bm = NULL;
 	if (sys->context) nlDeleteContext(sys->context);
 	if (sys->contextrot) nlDeleteContext(sys->contextrot);
@@ -320,7 +321,8 @@
 	BM_ITER_MESH (v, &viter, em->bm, BM_VERTS_OF_MESH) {
 		vid = BM_elem_index_get(v);
 		copy_v3_v3(data->sa->co[vid], v->co);
-		copy_v3_v3(data->sa->no[vid], v->no);
+		//copy_v3_v3(data->sa->no[vid], v->no);
+		data->sa->list_verts[vid] = v;
 		if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
 			data->sa->list_index[i] = vid;
 			i = i + 1;
@@ -372,7 +374,7 @@
 
 static void init_laplacian_matrix( SystemCustomData * data)
 {
-	float v1[3], v2[3], v3[3], v4[3];
+	float v1[3], v2[3], v3[3], v4[3], no[3];
 	float w2, w3, w4;
 	int i, j, vid, vidf[4];
 	bool has_4_vert;
@@ -395,16 +397,30 @@
 		idv2 = vidf[1];
 		idv3 = vidf[2];
 		idv4 = has_4_vert ? vidf[3] : 0;
+		if (has_4_vert) {
+			normal_quad_v3(no, sa->co[idv1], sa->co[idv2], sa->co[idv3], sa->co[idv4]); 
+			add_v3_v3(sa->no[idv1], no);
+			add_v3_v3(sa->no[idv2], no);
+			add_v3_v3(sa->no[idv3], no);
+			add_v3_v3(sa->no[idv4], no);
+		} 
+		else {
+			normal_tri_v3(no, sa->co[idv1], sa->co[idv2], sa->co[idv3]); 
+			add_v3_v3(sa->no[idv1], no);
+			add_v3_v3(sa->no[idv2], no);
+			add_v3_v3(sa->no[idv3], no);
+		}
 
+
 		idv[0] = idv1;
 		idv[1] = idv2;
 		idv[2] = idv3;
 		idv[3] = idv4;
 
-		nlMakeCurrent(sys->context);
-		nlRightHandSideAdd(0, idv1						, 0.0f);
-		nlRightHandSideAdd(0, sys->numVerts + idv1		, 0.0f);
-		nlRightHandSideAdd(0, 2*sys->numVerts + idv1	, 0.0f);
+		/*nlMakeCurrent(sys->context);
+		nlRightHandSideSet(0, idv1						, 0.0f);
+		nlRightHandSideSet(0, sys->numVerts + idv1		, 0.0f);
+		nlRightHandSideSet(0, 2*sys->numVerts + idv1	, 0.0f);*/
 
 		for (j = 0; j < i; j++) {
 			idv1 = idv[j];
@@ -428,6 +444,11 @@
 				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);
+
+				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 );
@@ -462,6 +483,19 @@
 			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						, -v2[0] * w2);
+			nlRightHandSideAdd(0, sys->numVerts + idv1		, -v2[1] * w2);
+			nlRightHandSideAdd(0, 2*sys->numVerts + 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);
+
+			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);
@@ -512,7 +546,7 @@
 	nlMakeCurrent(sys->context);
 	BM_ITER_MESH (v, &viter, sys->bm, BM_VERTS_OF_MESH) {
 		i = BM_elem_index_get(v);
-		sys->list_verts[i] = v;
+		normalize_v3( sa->no[i]);
 		BM_ITER_ELEM(e, &eiter, v, BM_EDGES_OF_VERT) {
 			vid = BM_elem_index_get(e->v1);
 			if (vid == i) {
@@ -571,7 +605,7 @@
 		
 		for (j = 0; j < ln; j++) {
 			jid = vidn[j];
-			nlMatrixAdd(i,						jid						, - get_matrixd(TDelta, 0, j));
+			/*nlMatrixAdd(i,						jid						, - get_matrixd(TDelta, 0, j));
 			nlMatrixAdd(i,						sys->numVerts + jid		, - get_matrixd(TDelta, 0, j + ln));
 			nlMatrixAdd(i,						sys->numVerts*2 + jid	, - get_matrixd(TDelta, 0, j + ln *2));
 			nlMatrixAdd(i + sys->numVerts,		jid						, - get_matrixd(TDelta, 1, j));
@@ -579,7 +613,7 @@
 			nlMatrixAdd(i + sys->numVerts,		sys->numVerts*2 + jid	, - get_matrixd(TDelta, 1, j + ln *2));
 			nlMatrixAdd(i + sys->numVerts*2,	jid						, - get_matrixd(TDelta, 2, j));
 			nlMatrixAdd(i + sys->numVerts*2,	sys->numVerts + jid		, - get_matrixd(TDelta, 2, j + ln));
-			nlMatrixAdd(i + sys->numVerts*2,	sys->numVerts*2 + jid	, - get_matrixd(TDelta, 2, j + ln *2));
+			nlMatrixAdd(i + sys->numVerts*2,	sys->numVerts*2 + jid	, - get_matrixd(TDelta, 2, j + ln *2));*/
 
 			push_back_triplet(sys->tripletList, i,						jid						, - get_matrixd(TDelta, 0, j));
 			push_back_triplet(sys->tripletList, i,						sys->numVerts + jid		, - get_matrixd(TDelta, 0, j + ln));
@@ -664,7 +698,7 @@
 
 		}
 
-		if (num_fni>0) mul_v3_fl(ni, 1.0f/((float)num_fni));
+		normalize_v3(ni);
 		sub_v3_v3v3(uij, pj, pi);
 		mul_v3_v3fl(dun, ni, dot_v3v3(uij, ni));
 		sub_v3_v3(uij, dun);
@@ -853,24 +887,24 @@
 		{
 			vid = shs->list_handlers[i];
 			nlMakeCurrent(sys->context);
-			nlRightHandSideAdd(0, (n + ns + i)*3	 	, sys->list_verts[vid]->co[0]);
-			nlRightHandSideAdd(0, (n + ns + i)*3 + 1	, sys->list_verts[vid]->co[1]);
-			nlRightHandSideAdd(0, (n + ns + i)*3 + 2	, sys->list_verts[vid]->co[2]);
+			nlRightHandSideAdd(0, (n + ns + i)*3	 	, sa->list_verts[vid]->co[0]);
+			nlRightHandSideAdd(0, (n + ns + i)*3 + 1	, sa->list_verts[vid]->co[1]);
+			nlRightHandSideAdd(0, (n + ns + i)*3 + 2	, sa->list_verts[vid]->co[2]);
 
 			nlMatrixAdd((n + ns + i)*3		, vid		, 1.0f);
 			nlMatrixAdd((n + ns + i)*3 + 1  , n + vid	, 1.0f);
 			nlMatrixAdd((n + ns + i)*3 + 2	, 2*n + vid	, 1.0f);
 
 			nlMakeCurrent(sys->contextrot);
-			nlRightHandSideAdd(0, n + ns + i 	, sys->list_verts[vid]->co[0]);
-			nlRightHandSideAdd(1, n + ns + i	, sys->list_verts[vid]->co[1]);
-			nlRightHandSideAdd(2, n + ns + i	, sys->list_verts[vid]->co[2]);
+			nlRightHandSideAdd(0, n + ns + i 	, sa->list_verts[vid]->co[0]);
+			nlRightHandSideAdd(1, n + ns + i	, sa->list_verts[vid]->co[1]);
+			nlRightHandSideAdd(2, n + ns + i	, sa->list_verts[vid]->co[2]);
 
 			nlMatrixAdd(n + ns + i 		, vid					, 1.0f);
 
-			set_vectord(sys->VectorB, (n + ns + i)*3	 	, sys->list_verts[vid]->co[0]);
-			set_vectord(sys->VectorB, (n + ns + i)*3 + 1	, sys->list_verts[vid]->co[1]);
-			set_vectord(sys->VectorB, (n + ns + i)*3 + 2	, sys->list_verts[vid]->co[2]);
+			set_vectord(sys->VectorB, (n + ns + i)*3	 	, sa->list_verts[vid]->co[0]);
+			set_vectord(sys->VectorB, (n + ns + i)*3 + 1	, sa->list_verts[vid]->co[1]);
+			set_vectord(sys->VectorB, (n + ns + i)*3 + 2	, sa->list_verts[vid]->co[2]);
 
 			push_back_triplet(sys->tripletList, (n + ns + i)*3			, vid		, 1.0f);
 			push_back_triplet(sys->tripletList, (n + ns + i)*3 + 1		, n + vid	, 1.0f);
@@ -887,6 +921,7 @@
 
 		if (nlSolveAdvanced(NULL, NL_TRUE) ) {
 			rotate_differential_coordinates(data);
+			//nlMakeCurrent(sys->context);
 			nlMakeCurrent(sys->contextrot);
 			nlEnd(NL_MATRIX);
 			nlEnd(NL_SYSTEM);
@@ -900,9 +935,9 @@
 					v->co[0] = nlGetVariable(0, vid);
 					v->co[1] = nlGetVariable(1, vid);
 					v->co[2] = nlGetVariable(2, vid);
-					//v->co[0] = nlGetVariable(0, vid);
-					//v->co[1] = nlGetVariable(0, vid + n);
-					//v->co[2] = nlGetVariable(0, vid + 2*n);
+					/*v->co[0] = nlGetVariable(0, vid);
+					v->co[1] = nlGetVariable(0, vid + n);
+					v->co[2] = nlGetVariable(0, vid + 2*n);*/
 				}			
 			}
 			printf("\nSystem solved");




More information about the Bf-blender-cvs mailing list