[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15281] branches/soc-2008-nicholasbishop/ source/blender: Fixed updating of normals during sculpting for non-smooth multires meshes.

Nicholas Bishop nicholasbishop at gmail.com
Thu Jun 19 17:36:39 CEST 2008


Revision: 15281
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15281
Author:   nicholasbishop
Date:     2008-06-19 17:35:44 +0200 (Thu, 19 Jun 2008)

Log Message:
-----------
Fixed updating of normals during sculpting for non-smooth multires meshes.

Modified Paths:
--------------
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_sculpt.h
    branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_sculpt.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_sculpt.h	2008-06-19 14:40:46 UTC (rev 15280)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_sculpt.h	2008-06-19 15:35:44 UTC (rev 15281)
@@ -48,6 +48,7 @@
 	int totface;
 	struct MVert *mvert;
 	struct MFace *mface;
+	float *face_normals;
 	
 	/* An array of lists; array is sized as
 	   large as the number of verts in the mesh,

Modified: branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c	2008-06-19 14:40:46 UTC (rev 15280)
+++ branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c	2008-06-19 15:35:44 UTC (rev 15281)
@@ -1087,19 +1087,27 @@
 	a->symm = orig;
 }
 
-void add_face_normal(vec3f *norm, MVert *mvert, const MFace* face)
+void add_face_normal(vec3f *norm, MVert *mvert, const MFace* face, float *fn)
 {
 	vec3f c= {mvert[face->v1].co[0],mvert[face->v1].co[1],mvert[face->v1].co[2]};
 	vec3f b= {mvert[face->v2].co[0],mvert[face->v2].co[1],mvert[face->v2].co[2]};
 	vec3f a= {mvert[face->v3].co[0],mvert[face->v3].co[1],mvert[face->v3].co[2]};
 	vec3f s1, s2;
+	float final[3];
 
 	VecSubf(&s1.x,&a.x,&b.x);
 	VecSubf(&s2.x,&c.x,&b.x);
 
-	norm->x+= s1.y * s2.z - s1.z * s2.y;
-	norm->y+= s1.z * s2.x - s1.x * s2.z;
-	norm->z+= s1.x * s2.y - s1.y * s2.x;
+	final[0] = s1.y * s2.z - s1.z * s2.y;
+	final[1] = s1.z * s2.x - s1.x * s2.z;
+	final[2] = s1.x * s2.y - s1.y * s2.x;
+
+	if(fn)
+		VecCopyf(fn, final);
+
+	norm->x+= final[0];
+	norm->y+= final[1];
+	norm->z+= final[2];
 }
 
 void update_damaged_vert(ListBase *lb, BrushAction *a)
@@ -1112,7 +1120,10 @@
 		IndexNode *face= sculpt_session()->vertex_users[vert->Index].first;
 
 		while(face){
-			add_face_normal(&norm, ss->mvert, &ss->mface[face->Index]);
+			float *fn = NULL;
+			if(ss->face_normals)
+				fn = &ss->face_normals[face->Index*3];
+			add_face_normal(&norm, ss->mvert, &ss->mface[face->Index], fn);
 			face= face->next;
 		}
 		Normalize(&norm.x);
@@ -1643,6 +1654,7 @@
 		ss->totface = dm->getNumFaces(dm);
 		ss->mvert = dm->getVertDataArray(dm, CD_MVERT);
 		ss->mface = dm->getFaceDataArray(dm, CD_MFACE);
+		ss->face_normals = dm->getFaceDataArray(dm, CD_NORMAL);
 	}
 	else {
 		Mesh *me = get_mesh(ob);
@@ -1651,6 +1663,7 @@
 		ss->totface = me->totface;
 		ss->mvert = me->mvert;
 		ss->mface = me->mface;
+		ss->face_normals = NULL;
 	}
 
 	/* Check that vertex users are up-to-date */





More information about the Bf-blender-cvs mailing list