[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42234] branches/bmesh/blender/source/ blender/blenkernel: utility function for getting the center of a polygon, needed for up coming changes

Campbell Barton ideasman42 at gmail.com
Tue Nov 29 00:50:46 CET 2011


Revision: 42234
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42234
Author:   campbellbarton
Date:     2011-11-28 23:50:40 +0000 (Mon, 28 Nov 2011)
Log Message:
-----------
utility function for getting the center of a polygon, needed for up coming changes

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2011-11-28 21:48:49 UTC (rev 42233)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2011-11-28 23:50:40 UTC (rev 42234)
@@ -79,8 +79,11 @@
 
 /*calculates a face normal.*/
 void mesh_calc_poly_normal(struct MPoly *mpoly, struct MLoop *loopstart, 
-                           struct MVert *mvarray, float *no);
+                           struct MVert *mvarray, float no[3]);
 
+void mesh_calc_poly_center(struct MPoly *mpoly, struct MLoop *loopstart,
+                           struct MVert *mvarray, float cent[3]);
+
 void unlink_mesh(struct Mesh *me);
 void free_mesh(struct Mesh *me, int unlink);
 struct Mesh *add_mesh(const char *name);

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-11-28 21:48:49 UTC (rev 42233)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-11-28 23:50:40 UTC (rev 42234)
@@ -2450,7 +2450,7 @@
  *
 */
 static void mesh_calc_ngon_normal(MPoly *mpoly, MLoop *loopstart, 
-				  MVert *mvert, float *normal)
+                                  MVert *mvert, float normal[3])
 {
 
 	MVert *v1, *v2, *v3;
@@ -2512,35 +2512,69 @@
 }
 
 void mesh_calc_poly_normal(MPoly *mpoly, MLoop *loopstart, 
-                           MVert *mvarray, float *no)
+                           MVert *mvarray, float no[3])
 {
-	if(mpoly->totloop > 4) {
+	if (mpoly->totloop > 4) {
 		mesh_calc_ngon_normal(mpoly, loopstart, mvarray, no);
 	}
-	else if(mpoly->totloop == 3){
-		MVert *v1, *v2, *v3;
-
-		v1 = mvarray + (loopstart++)->v;
-		v2 = mvarray + (loopstart++)->v;
-		v3 = mvarray + loopstart->v;
-		normal_tri_v3( no,v1->co, v2->co, v3->co);
+	else if (mpoly->totloop == 3){
+		normal_tri_v3(no,
+		              mvarray[loopstart[0].v].co,
+		              mvarray[loopstart[1].v].co,
+		              mvarray[loopstart[2].v].co
+		              );
 	}
-	else if(mpoly->totloop == 4){
-		MVert *v1, *v2, *v3, *v4;
-
-		v1 = mvarray + (loopstart++)->v;
-		v2 = mvarray + (loopstart++)->v;
-		v3 = mvarray + (loopstart++)->v;
-		v4 = mvarray + loopstart->v;
-		normal_quad_v3( no,v1->co, v2->co, v3->co, v4->co);
+	else if (mpoly->totloop == 4) {
+		normal_quad_v3(no,
+		               mvarray[loopstart[0].v].co,
+		               mvarray[loopstart[1].v].co,
+		               mvarray[loopstart[2].v].co,
+		               mvarray[loopstart[3].v].co
+		               );
 	}
-	else{ /*horrible, two sided face!*/
+	else { /* horrible, two sided face! */
 		no[0] = 0.0;
 		no[1] = 0.0;
 		no[2] = 1.0;
 	}
 }
 
+static void mesh_calc_ngon_center(MPoly *mpoly, MLoop *loopstart,
+                                  MVert *mvert, float cent[3])
+{
+	const float fac= 1.0f / (float)mpoly->totloop;
+	int i;
+
+	zero_v3(cent);
+
+	for (i = 0; i < mpoly->totloop; i++) {
+		madd_v3_v3fl(cent, mvert[(loopstart++)->v].co, fac);
+	}
+}
+
+void mesh_calc_poly_center(MPoly *mpoly, MLoop *loopstart,
+                           MVert *mvarray, float cent[3])
+{
+	if (mpoly->totloop == 3) {
+		cent_tri_v3(cent,
+		            mvarray[loopstart[0].v].co,
+		            mvarray[loopstart[1].v].co,
+		            mvarray[loopstart[2].v].co
+		            );
+	}
+	else if (mpoly->totloop == 4) {
+		cent_quad_v3(cent,
+		             mvarray[loopstart[0].v].co,
+		             mvarray[loopstart[1].v].co,
+		             mvarray[loopstart[2].v].co,
+		             mvarray[loopstart[3].v].co
+		             );
+	}
+	else {
+		mesh_calc_ngon_center(mpoly, loopstart, mvarray, cent);
+	}
+}
+
 /* basic vertex data functions */
 int minmax_mesh(Mesh *me, float min[3], float max[3])
 {




More information about the Bf-blender-cvs mailing list