[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15539] branches/soc-2008-nicholasbishop/ source/blender: * Turned off multires updates if mode isn't sculptmode

Nicholas Bishop nicholasbishop at gmail.com
Sat Jul 12 05:30:57 CEST 2008


Revision: 15539
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15539
Author:   nicholasbishop
Date:     2008-07-12 05:30:49 +0200 (Sat, 12 Jul 2008)

Log Message:
-----------
* Turned off multires updates if mode isn't sculptmode
* Changed displacement matrices so that edges of faces deform more smoothly
* Force a displacement update on leaving sculptmode

Modified Paths:
--------------
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
    branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-07-12 01:53:25 UTC (rev 15538)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-07-12 03:30:49 UTC (rev 15539)
@@ -83,6 +83,7 @@
 
 /* MultiresDM */
 struct DerivedMesh *MultiresDM_new(struct DerivedMesh*, int, int, int, int, int);
+void *MultiresDM_get_vertnorm(struct DerivedMesh *);
 void *MultiresDM_get_orco(struct DerivedMesh *);
 void *MultiresDM_get_subco(struct DerivedMesh *);
 struct MFace *MultiresDM_get_orfa(struct DerivedMesh *);
@@ -103,6 +104,12 @@
 	struct MDisps *grid;
 	struct MFace *face;
 	float mat[3][3];
+	
+	/* For matrix calc */
+	float mat_target[3];
+	float mat_center[3];
+	float (*mat_norms)[3];
+
 	int spacing;
 	int sidetot;
 	int sidendx;

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-07-12 01:53:25 UTC (rev 15538)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-07-12 03:30:49 UTC (rev 15539)
@@ -1164,6 +1164,8 @@
 	int totored;
 	int totorfa;
 
+	float (*norm)[3];
+
 	ListBase *vert_face_map;
 	IndexNode *vert_face_map_mem;
 
@@ -1183,6 +1185,7 @@
 		MEM_freeN(mrdm->orfa);
 		MEM_freeN(mrdm->subco);
 		MEM_freeN(mrdm->orco);
+		MEM_freeN(mrdm->norm);
 		if(mrdm->vert_face_map)
 			MEM_freeN(mrdm->vert_face_map);
 		if(mrdm->vert_face_map_mem)
@@ -1191,6 +1194,32 @@
 	}
 }
 
+static void MultiresDM_calc_norm(MultiresDM *mrdm)
+{
+	float (*v)[3] = mrdm->orco;
+	int i;
+
+	mrdm->norm = MEM_callocN(sizeof(float)*3 * mrdm->totorco, "MultiresDM vertnorms");
+
+	for(i = 0; i < mrdm->totorfa; ++i) {
+		MFace *f = &mrdm->orfa[i];
+		float n[3];
+		if(f->v4)
+			CalcNormFloat4(v[f->v1], v[f->v2], v[f->v3], v[f->v4], n);
+		else
+			CalcNormFloat(v[f->v1], v[f->v2], v[f->v3], n);
+		
+		VecAddf(mrdm->norm[f->v1], mrdm->norm[f->v1], n);
+		VecAddf(mrdm->norm[f->v2], mrdm->norm[f->v2], n);
+		VecAddf(mrdm->norm[f->v3], mrdm->norm[f->v3], n);
+		if(f->v4)
+			VecAddf(mrdm->norm[f->v4], mrdm->norm[f->v4], n);
+	}
+
+	for(i = 0; i < mrdm->totorco; ++i)
+		Normalize(mrdm->norm[i]);
+}
+
 DerivedMesh *MultiresDM_new(DerivedMesh *orig, int numVerts, int numEdges, int numFaces, int lvl, int totlvl)
 {
 	MultiresDM *mrdm = MEM_callocN(sizeof(MultiresDM), "MultiresDM");
@@ -1239,11 +1268,18 @@
 	mrdm->totlvl = totlvl;
 	mrdm->subco = MEM_callocN(sizeof(float)*3*numVerts, "multires subdivided coords");
 
+	MultiresDM_calc_norm(mrdm);
+
 	dm->release = MultiresDM_release;
 
 	return dm;
 }
 
+void *MultiresDM_get_vertnorm(DerivedMesh *dm)
+{
+	return ((MultiresDM*)dm)->norm;
+}
+
 void *MultiresDM_get_orco(DerivedMesh *dm)
 {
 	return ((MultiresDM*)dm)->orco;

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-07-12 01:53:25 UTC (rev 15538)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-07-12 03:30:49 UTC (rev 15539)
@@ -1384,6 +1384,12 @@
 	calc_face_ts_mat(out, orco[f->v1], orco[f->v2], orco[f->v3], (f->v4 ? orco[f->v4] : NULL));
 }
 
+static void calc_face_ts_partial(float center[3], float target[3], float norm[][3], float (*orco)[3], MFace *f)
+{
+	face_center(center, orco[f->v1], orco[f->v2], orco[f->v3], (f->v4 ? orco[f->v4] : NULL));
+	VecCopyf(target, orco[f->v1]);
+}
+
 void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob)
 {
 	DerivedMesh *final = NULL;
@@ -1600,6 +1606,9 @@
 		Mat3CpyMat3(d->mat, inv);
 	}
 
+	calc_face_ts_partial(d->mat_center, d->mat_target, d->mat_norms, MultiresDM_get_orco(dm), d->face);
+	d->mat_norms = MultiresDM_get_vertnorm(dm);
+
 	d->spacing = pow(2, MultiresDM_get_totlvl(dm) - MultiresDM_get_lvl(dm));
 	d->sidetot = multires_side_tot[MultiresDM_get_totlvl(dm) - 1];
 	d->invert = invert;
@@ -1738,8 +1747,26 @@
 	else
 		VecCopyf(disp, data);
 
-	Mat3MulVecfl(d->mat, disp);
+	{
+		float mat[3][3], inv[3][3];
+		float n1[3], n2[3], norm[3];
+		float l1 = d->y / (1.0 * d->sidetot);
+		float l2 = d->x / (1.0 * d->sidetot);
 
+		VecLerpf(n1, d->mat_norms[d->face->v1], d->mat_norms[d->face->v4], l1);
+		VecLerpf(n2, d->mat_norms[d->face->v2], d->mat_norms[d->face->v3], l1);
+		VecLerpf(norm, n1, n2, l2);
+
+		calc_ts_mat(mat, d->mat_center, d->mat_target, norm);
+		if(d->invert) {
+			Mat3Inv(inv, mat);
+			Mat3CpyMat3(mat, inv);
+		}
+			
+
+		Mat3MulVecfl(mat, disp);
+	}
+
 	if(d->invert) {
 		VecCopyf(data, disp);
 		
@@ -1780,6 +1807,8 @@
 	MFace *mface;
 	int i;
 
+	if(!(G.f & G_SCULPTMODE)) return;
+
 	mdisps = dm->getFaceDataArray(dm, CD_MDISPS);
 
 	if(mdisps) {

Modified: branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c	2008-07-12 01:53:25 UTC (rev 15538)
+++ branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c	2008-07-12 03:30:49 UTC (rev 15539)
@@ -65,6 +65,7 @@
 #include "BKE_main.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
+#include "BKE_multires.h"
 #include "BKE_sculpt.h"
 #include "BKE_texture.h"
 #include "BKE_utildefines.h"
@@ -112,13 +113,6 @@
  *
  */
 
-/* Used by vertex_users to store face indices in a list */
-typedef struct IndexNode {
-	struct IndexNode* next,* prev;
-	int Index;
-} IndexNode;
-
-
 /* ActiveData stores an Index into the mvert array of Mesh, plus Fade, which
    stores how far the vertex is from the brush center, scaled to the range [0,1]. */
 typedef struct ActiveData {
@@ -234,7 +228,7 @@
 	/* Find the users */
 	for(i=0; i<ss->totface; ++i){
 		for(j=0; j<(ss->mface[i].v4?4:3); ++j, ++node) {
-			node->Index=i;
+			node->index=i;
 			BLI_addtail(&ss->vertex_users[((unsigned int*)(&ss->mface[i]))[j]], node);
 		}
 	}
@@ -525,7 +519,7 @@
 	}
 
 	while(node){
-		f= &ss->mface[node->Index];
+		f= &ss->mface[node->index];
 		
 		if(f->v4) {
 			skip= (f->v1==vert?2:
@@ -1114,8 +1108,8 @@
 		while(face){
 			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);
+				fn = &ss->face_normals[face->index*3];
+			add_face_normal(&norm, ss->mvert, &ss->mface[face->index], fn);
 			face= face->next;
 		}
 		Normalize(&norm.x);
@@ -1863,13 +1857,16 @@
 void set_sculptmode(void)
 {
 	if(G.f & G_SCULPTMODE) {
-		Mesh *me= get_mesh(OBACT);
+		Object *ob = OBACT;
+		Mesh *me= get_mesh(ob);
+
+		multires_force_update(ob);
 		
 		G.f &= ~G_SCULPTMODE;
 
 		sculptsession_free(G.scene);
 		if(me && me->pv) 
-			mesh_pmv_off(OBACT, me);
+			mesh_pmv_off(ob, me);
 	} 
 	else {
 		G.f |= G_SCULPTMODE;





More information about the Bf-blender-cvs mailing list