[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15649] branches/soc-2008-nicholasbishop/ source/blender/blenkernel: Updating for all multires levels should work now .

Nicholas Bishop nicholasbishop at gmail.com
Sun Jul 20 07:41:55 CEST 2008


Revision: 15649
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15649
Author:   nicholasbishop
Date:     2008-07-20 07:41:55 +0200 (Sun, 20 Jul 2008)

Log Message:
-----------
Updating for all multires levels should work now.

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

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-07-20 05:01:29 UTC (rev 15648)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-07-20 05:41:55 UTC (rev 15649)
@@ -97,6 +97,7 @@
 int MultiresDM_get_totorco(struct DerivedMesh *);
 int MultiresDM_get_totored(struct DerivedMesh *);
 void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct DerivedMesh*));
+void MultiresDM_block_update(struct DerivedMesh *);
 
 /* Modifier */
 struct MDisps;

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-07-20 05:01:29 UTC (rev 15648)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-07-20 05:41:55 UTC (rev 15649)
@@ -1170,6 +1170,7 @@
 	IndexNode *vert_face_map_mem;
 
 	Mesh *me;
+	int block_update;
 
 	void (*update)(DerivedMesh*);
 } MultiresDM;
@@ -1179,7 +1180,7 @@
 	MultiresDM *mrdm = (MultiresDM*)dm;
 
 	/* Before freeing, need to update the displacement map */
-	if(dm->needsFree)
+	if(dm->needsFree && !mrdm->block_update)
 		mrdm->update(dm);
 
 	if(DM_release(dm)) {
@@ -1269,6 +1270,7 @@
 	mrdm->lvl = lvl;
 	mrdm->totlvl = totlvl;
 	mrdm->subco = MEM_callocN(sizeof(float)*3*numVerts, "multires subdivided coords");
+	mrdm->block_update = 0;
 
 	MultiresDM_calc_norm(mrdm);
 
@@ -1358,3 +1360,8 @@
 
 	return mrdm->vert_face_map;
 }
+
+void MultiresDM_block_update(DerivedMesh *dm)
+{
+	((MultiresDM*)dm)->block_update = 1;
+}

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-07-20 05:01:29 UTC (rev 15648)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-07-20 05:41:55 UTC (rev 15649)
@@ -1403,7 +1403,7 @@
 }
 
 void multires_subdisp(DerivedMesh *orig, Mesh *me, DerivedMesh *final, int lvl, int totlvl,
-		      int totsubvert, int totsubedge, int totsubface)
+		      int totsubvert, int totsubedge, int totsubface, MVert *addverts)
 {
 	DerivedMesh *mrdm;
 	MultiresModifierData mmd_sub;
@@ -1585,6 +1585,11 @@
 		}
 	}
 
+	if(addverts) {
+		for(i = 0; i < totvert; ++i)
+			VecAddf(mvd[i].co, mvd[i].co, addverts[i].co);
+	}
+
 	final->needsFree = 1;
 	final->release(final);
 	mrdm->needsFree = 1;
@@ -1653,7 +1658,7 @@
 
 		orig = CDDM_from_mesh(me, NULL);
 
-		multires_subdisp(orig, me, final, mmd->totlvl - 1, mmd->totlvl, totsubvert, totsubedge, totsubface);
+		multires_subdisp(orig, me, final, mmd->totlvl - 1, mmd->totlvl, totsubvert, totsubedge, totsubface, NULL);
 
 		orig->needsFree = 1;
 		orig->release(orig);
@@ -1909,6 +1914,48 @@
 
 		d.subco = MultiresDM_get_subco(dm);
 
+		if(lvl < totlvl) {
+			/* Propagate disps upwards */
+			Mesh *me = MultiresDM_get_mesh(dm);
+			DerivedMesh *orig = CDDM_from_mesh(me, NULL), *orig_mrdm, *final, *orig_top_mrdm;
+			MultiresModifierData mmd;
+			MVert *verts_orig, *verts_new, *orig_top_verts;
+
+			/* Regenerate the vertex coords at the top level using the unmodified disps */
+			mmd.totlvl = totlvl;
+			mmd.lvl = totlvl;
+			orig_top_mrdm = multires_dm_create_from_derived(&mmd, orig, me, 0, 0);
+			MultiresDM_block_update(orig_top_mrdm);
+			orig_top_verts = CDDM_get_verts(orig_top_mrdm);
+
+			/* Regenerate the current level as a MultiresDM using the unmodified disps */
+			mmd.totlvl = totlvl;
+			mmd.lvl = lvl;
+			orig_mrdm = multires_dm_create_from_derived(&mmd, orig, me, 0, 0);
+			MultiresDM_block_update(orig_mrdm);
+
+			/* Subtract the original vertex cos from the new vertex cos */
+			verts_orig = CDDM_get_verts(orig_mrdm);
+			verts_new = CDDM_get_verts(dm);
+			for(i = 0; i < dm->getNumVerts(dm); ++i)
+				VecSubf(verts_new[i].co, verts_new[i].co, verts_orig[i].co);
+
+			orig_mrdm->release(orig_mrdm);
+
+			final = multires_subdisp_pre(dm, totlvl - lvl);
+
+			// ?
+			orig->release(orig);
+			orig = CDDM_from_mesh(me, NULL);
+
+			multires_subdisp(orig, me, final, lvl, totlvl, dm->getNumVerts(dm), dm->getNumEdges(dm),
+					 dm->getNumFaces(dm), orig_top_verts);
+			orig->release(orig);
+			orig_top_mrdm->release(orig_top_mrdm);
+
+			return;
+		}
+
 		/* Update the current level */
 		for(i = 0; i < MultiresDM_get_totorfa(dm); ++i) {
 			const int numVerts = mface[i].v4 ? 4 : 3;
@@ -1971,15 +2018,6 @@
 			++mvert;
 			++d.subco;
 		}
-
-		if(lvl < totlvl) {
-			/* Propagate disps upwards */
-			Mesh *me = MultiresDM_get_mesh(dm);
-			DerivedMesh *orig = CDDM_from_mesh(me, NULL);
-			multires_subdisp(orig, me, multires_subdisp_pre(dm, totlvl - lvl),
-					 lvl, totlvl, dm->getNumVerts(dm), dm->getNumEdges(dm), dm->getNumFaces(dm));
-			orig->release(orig);
-		}
 	}
 }
 





More information about the Bf-blender-cvs mailing list