[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44498] trunk/blender/source/blender/ blenkernel/intern/multires.c: BMesh: use MPoly rather than MFace in multiresModifier_base_apply

Nicholas Bishop nicholasbishop at gmail.com
Tue Feb 28 04:54:42 CET 2012


Revision: 44498
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44498
Author:   nicholasbishop
Date:     2012-02-28 03:54:31 +0000 (Tue, 28 Feb 2012)
Log Message:
-----------
BMesh: use MPoly rather than MFace in multiresModifier_base_apply

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

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2012-02-28 02:08:32 UTC (rev 44497)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2012-02-28 03:54:31 UTC (rev 44498)
@@ -503,7 +503,7 @@
 {
 	DerivedMesh *cddm, *dispdm, *origdm;
 	Mesh *me;
-	ListBase *fmap;
+	ListBase *pmap;
 	float (*origco)[3];
 	int i, j, offset, totlvl;
 
@@ -533,7 +533,7 @@
 	/* heuristic to produce a better-fitting base mesh */
 
 	cddm = CDDM_from_mesh(me, NULL);
-	fmap = cddm->getFaceMap(ob, cddm);
+	pmap = cddm->getPolyMap(ob, cddm);
 	origco = MEM_callocN(sizeof(float)*3*me->totvert, "multires apply base origco");
 	for (i = 0; i < me->totvert ;++i)
 		copy_v3_v3(origco[i], me->mvert[i].co);
@@ -544,18 +544,17 @@
 		float dist;
 		int tot;
 
-		/* don't adjust verts not used by at least one face */
-		if (!fmap[i].first)
+		/* don't adjust verts not used by at least one poly */
+		if (!pmap[i].first)
 			continue;
 
 		/* find center */
-		for (n = fmap[i].first, tot = 0; n; n = n->next) {
-			MFace *f = &me->mface[n->index];
-			int S = f->v4 ? 4 : 3;
+		for (n = pmap[i].first, tot = 0; n; n = n->next) {
+			const MPoly *p = &me->mpoly[n->index];
 			
 			/* this double counts, not sure if that's bad or good */
-			for (j = 0; j < S; ++j) {
-				int vndx = (&f->v1)[j];
+			for (j = 0; j < p->totloop; ++j) {
+				int vndx = me->mloop[p->loopstart + j].v;
 				if (vndx != i) {
 					add_v3_v3(center, origco[vndx]);
 					++tot;
@@ -565,23 +564,36 @@
 		mul_v3_fl(center, 1.0f / tot);
 
 		/* find normal */
-		for (n = fmap[i].first; n; n = n->next) {
-			MFace *f = &me->mface[n->index];
-			int S = f->v4 ? 4 : 3;
-			float v[4][3], no[3];
+		for (n = pmap[i].first; n; n = n->next) {
+			const MPoly *p = &me->mpoly[n->index];
+			MPoly fake_poly;
+			MLoop *fake_loops;
+			float (*fake_co)[3];
+			float no[3];
+
+			/* set up poly, loops, and coords in order to call
+			   mesh_calc_poly_normal_coords() */
+			fake_poly.totloop = p->totloop;
+			fake_poly.loopstart = 0;
+			fake_loops = MEM_mallocN(sizeof(MLoop) * p->totloop, "fake_loops");
+			fake_co = MEM_mallocN(sizeof(float) * 3 * p->totloop, "fake_co");
 			
-			for (j = 0; j < S; ++j) {
-				int vndx = (&f->v1)[j];
+			for (j = 0; j < p->totloop; ++j) {
+				int vndx = me->mloop[p->loopstart + j].v;
+				
+				fake_loops[j].v = j;
+				
 				if (vndx == i)
-					copy_v3_v3(v[j], center);
+					copy_v3_v3(fake_co[j], center);
 				else
-					copy_v3_v3(v[j], origco[vndx]);
+					copy_v3_v3(fake_co[j], origco[vndx]);
 			}
 			
-			if (S == 4)
-				normal_quad_v3(no, v[0], v[1], v[2], v[3]);
-			else
-				normal_tri_v3(no, v[0], v[1], v[2]);
+			mesh_calc_poly_normal_coords(&fake_poly, fake_loops,
+										 (const float(*)[3])fake_co, no);
+			MEM_freeN(fake_loops);
+			MEM_freeN(fake_co);
+
 			add_v3_v3(avg_no, no);
 		}
 		normalize_v3(avg_no);




More information about the Bf-blender-cvs mailing list