[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46276] trunk/blender/source/blender/ blenkernel/intern/mesh.c: code cleanup: use much simpler (and likely faster ) polygon normal calculation in object mode.

Campbell Barton ideasman42 at gmail.com
Fri May 4 15:13:45 CEST 2012


Revision: 46276
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46276
Author:   campbellbarton
Date:     2012-05-04 13:13:45 +0000 (Fri, 04 May 2012)
Log Message:
-----------
code cleanup: use much simpler (and likely faster) polygon normal calculation in object mode.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/mesh.c

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-05-04 13:12:09 UTC (rev 46275)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-05-04 13:13:45 UTC (rev 46276)
@@ -2766,64 +2766,20 @@
 static void mesh_calc_ngon_normal(MPoly *mpoly, MLoop *loopstart, 
                                   MVert *mvert, float normal[3])
 {
-
-	MVert *v1, *v2, *v3;
-	double u[3], v[3], w[3];
-	double n[3] = {0.0, 0.0, 0.0}, l;
+	const int nverts = mpoly->totloop;
+	MLoop const *l_prev = loopstart + (nverts - 1);
+	MLoop const *l_curr = loopstart;
+	float n[3] = {0.0f};
 	int i;
 
-	for (i = 0; i < mpoly->totloop; i++) {
-		v1 = mvert + loopstart[i].v;
-		v2 = mvert + loopstart[(i+1)%mpoly->totloop].v;
-		v3 = mvert + loopstart[(i+2)%mpoly->totloop].v;
-		
-		copy_v3db_v3fl(u, v1->co);
-		copy_v3db_v3fl(v, v2->co);
-		copy_v3db_v3fl(w, v3->co);
-
-		/*this fixes some weird numerical error*/
-		if (i==0) {
-			u[0] += 0.0001f;
-			u[1] += 0.0001f;
-			u[2] += 0.0001f;
-		}
-		
-		/* newell's method
-		 * 
-		 * so thats?:
-		 * (a[1] - b[1]) * (a[2] + b[2]);
-		 * a[1]*b[2] - b[1]*a[2] - b[1]*b[2] + a[1]*a[2]
-		 * 
-		 * odd.  half of that is the cross product. . .what's the
-		 * other half?
-		 * 
-		 * also could be like a[1]*(b[2] + a[2]) - b[1]*(a[2] - b[2])
-		 */
-
-		n[0] += (u[1] - v[1]) * (u[2] + v[2]);
-		n[1] += (u[2] - v[2]) * (u[0] + v[0]);
-		n[2] += (u[0] - v[0]) * (u[1] + v[1]);
+	/* Newell's Method */
+	for (i = 0; i < nverts; l_prev = l_curr, l_curr++, i++) {
+		add_newell_cross_v3_v3v3(n, mvert[l_prev->v].co, mvert[l_curr->v].co);
 	}
-	
-	l = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
-	l = sqrt(l);
 
-	if (l == 0.0) {
-		normal[0] = 0.0f;
-		normal[1] = 0.0f;
-		normal[2] = 1.0f;
-
-		return;
+	if (UNLIKELY(normalize_v3_v3(normal, n) == 0.0f)) {
+		normal[2] = 1.0f; /* other axis set to 0.0 */
 	}
-	else l = 1.0f / l;
-
-	n[0] *= l;
-	n[1] *= l;
-	n[2] *= l;
-	
-	normal[0] = (float) n[0];
-	normal[1] = (float) n[1];
-	normal[2] = (float) n[2];
 }
 
 void mesh_calc_poly_normal(MPoly *mpoly, MLoop *loopstart, 
@@ -2857,54 +2813,20 @@
 static void mesh_calc_ngon_normal_coords(MPoly *mpoly, MLoop *loopstart,
                                          const float (*vertex_coords)[3], float normal[3])
 {
-
-	const float *v1, *v2, *v3;
-	double u[3], v[3], w[3];
-	double n[3] = {0.0, 0.0, 0.0}, l;
+	const int nverts = mpoly->totloop;
+	MLoop const *l_prev = loopstart + (nverts - 1);
+	MLoop const *l_curr = loopstart;
+	float n[3] = {0.0f};
 	int i;
 
-	for (i = 0; i < mpoly->totloop; i++) {
-		v1 = (const float *)(vertex_coords + loopstart[i].v);
-		v2 = (const float *)(vertex_coords + loopstart[(i+1)%mpoly->totloop].v);
-		v3 = (const float *)(vertex_coords + loopstart[(i+2)%mpoly->totloop].v);
-
-		copy_v3db_v3fl(u, v1);
-		copy_v3db_v3fl(v, v2);
-		copy_v3db_v3fl(w, v3);
-
-		/*this fixes some weird numerical error*/
-		if (i==0) {
-			u[0] += 0.0001f;
-			u[1] += 0.0001f;
-			u[2] += 0.0001f;
-		}
-
-		n[0] += (u[1] - v[1]) * (u[2] + v[2]);
-		n[1] += (u[2] - v[2]) * (u[0] + v[0]);
-		n[2] += (u[0] - v[0]) * (u[1] + v[1]);
+	/* Newell's Method */
+	for (i = 0; i < nverts; l_prev = l_curr, l_curr++, i++) {
+		add_newell_cross_v3_v3v3(n, vertex_coords[l_prev->v], vertex_coords[l_curr->v]);
 	}
 
-	l = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
-	l = sqrt(l);
-
-	if (l == 0.0) {
-		normal[0] = 0.0f;
-		normal[1] = 0.0f;
-		normal[2] = 1.0f;
-
-		return;
+	if (UNLIKELY(normalize_v3_v3(normal, n) == 0.0f)) {
+		normal[2] = 1.0f; /* other axis set to 0.0 */
 	}
-	else {
-		l = 1.0f / l;
-	}
-
-	n[0] *= l;
-	n[1] *= l;
-	n[2] *= l;
-
-	normal[0] = (float) n[0];
-	normal[1] = (float) n[1];
-	normal[2] = (float) n[2];
 }
 
 void mesh_calc_poly_normal_coords(MPoly *mpoly, MLoop *loopstart,




More information about the Bf-blender-cvs mailing list