[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15817] branches/soc-2008-nicholasbishop/ source/blender: Somewhat hacky support for undo in sculptmode; does a copy of MVert DerivedMesh data when pushing undo, but not for regular save/load.

Nicholas Bishop nicholasbishop at gmail.com
Sun Jul 27 21:21:21 CEST 2008


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

Log Message:
-----------
Somewhat hacky support for undo in sculptmode; does a copy of MVert DerivedMesh data when pushing undo, but not for regular save/load.

Modified Paths:
--------------
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c
    branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c
    branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/writefile.c
    branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_mesh_types.h
    branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-07-27 18:59:41 UTC (rev 15816)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-07-27 19:21:10 UTC (rev 15817)
@@ -1263,8 +1263,6 @@
 	mrdm->subco = MEM_callocN(sizeof(float)*3*numVerts, "multires subdivided coords");
 	mrdm->block_update = 0;
 
-	MultiresDM_calc_norm(mrdm);
-
 	dm->release = MultiresDM_release;
 
 	return dm;
@@ -1277,7 +1275,12 @@
 
 void *MultiresDM_get_vertnorm(DerivedMesh *dm)
 {
-	return ((MultiresDM*)dm)->norm;
+	MultiresDM *mrdm = (MultiresDM*)dm;
+
+	if(!mrdm->norm)
+		MultiresDM_calc_norm(mrdm);
+
+	return mrdm->norm;
 }
 
 void *MultiresDM_get_orco(DerivedMesh *dm)

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c	2008-07-27 18:59:41 UTC (rev 15816)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c	2008-07-27 19:21:10 UTC (rev 15817)
@@ -7224,12 +7224,28 @@
 						   int useRenderParams, int isFinalCalc)
 {
 	MultiresModifierData *mmd = (MultiresModifierData*)md;
+	Mesh *me = get_mesh(ob);
+	DerivedMesh *final;
 
 	/* TODO: for now just skip a level1 mesh */
 	if(mmd->lvl == 1)
 		return dm;
 
-	return multires_dm_create_from_derived(mmd, dm, get_mesh(ob), useRenderParams, isFinalCalc);
+	final = multires_dm_create_from_derived(mmd, dm, me, useRenderParams, isFinalCalc);
+	if(me->mr_undo_state && me->mr_undo && me->mr_undo_tot == final->getNumVerts(final)) {
+		int i;
+		MVert *dst = CDDM_get_verts(final);
+		for(i = 0; i < me->mr_undo_tot; ++i) {
+			VecCopyf(dst[i].co, me->mr_undo[i].co);
+		}
+		CDDM_calc_normals(final);
+	}
+	if(me->mr_undo && me->mr_undo_state)
+		MEM_freeN(me->mr_undo);
+	me->mr_undo_state = 0;
+	me->mr_undo = NULL;
+
+	return final;
 }
 
 /***/

Modified: branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c	2008-07-27 18:59:41 UTC (rev 15816)
+++ branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c	2008-07-27 19:21:10 UTC (rev 15817)
@@ -2767,6 +2767,9 @@
 	mesh->bb= NULL;
 	mesh->mselect = NULL;
 
+	mesh->mr_undo = newdataadr(fd, mesh->mr_undo);
+	mesh->mr_undo_state = 1;
+
 	/* Multires data */
 	mesh->mr= newdataadr(fd, mesh->mr);
 	if(mesh->mr) {

Modified: branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/writefile.c	2008-07-27 18:59:41 UTC (rev 15816)
+++ branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/writefile.c	2008-07-27 19:21:10 UTC (rev 15817)
@@ -1173,7 +1173,7 @@
 	}
 }
 
-static void write_meshs(WriteData *wd, ListBase *idbase)
+static void write_meshs(WriteData *wd, ListBase *idbase, int mr_undo)
 {
 	Mesh *mesh;
 	MultiresLevel *lvl;
@@ -1246,6 +1246,9 @@
 				writestruct(wd, DATA, "MFace", mesh->pv->totface, mesh->pv->old_faces);
 				writestruct(wd, DATA, "MEdge", mesh->pv->totedge, mesh->pv->old_edges);
 			}
+			
+			if(mr_undo && mesh->mr_undo)
+				writestruct(wd, DATA, "MVert", mesh->mr_undo_tot, mesh->mr_undo);
 		}
 		mesh= mesh->id.next;
 	}
@@ -2031,7 +2034,7 @@
 	write_objects  (wd, &G.main->object);
 	write_materials(wd, &G.main->mat);
 	write_textures (wd, &G.main->tex);
-	write_meshs    (wd, &G.main->mesh);
+	write_meshs    (wd, &G.main->mesh, (current != NULL));
 	write_particlesettings(wd, &G.main->particle);
 	write_nodetrees(wd, &G.main->nodetree);
 	write_brushes  (wd, &G.main->brush);

Modified: branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_mesh_types.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_mesh_types.h	2008-07-27 18:59:41 UTC (rev 15816)
+++ branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_mesh_types.h	2008-07-27 19:21:10 UTC (rev 15817)
@@ -94,6 +94,9 @@
 	short totcol;
 	short subsurftype;		/* only kept for backwards compat, not used anymore */
 
+	struct MVert *mr_undo;		/* Store DerivedMesh vertices for multires undo */
+	int mr_undo_tot, mr_undo_state;
+	
 	struct Multires *mr;		/* Multiresolution modeling data */
 	struct PartialVisibility *pv;
 /*ifdef WITH_VERSE*/

Modified: branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c	2008-07-27 18:59:41 UTC (rev 15816)
+++ branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c	2008-07-27 19:21:10 UTC (rev 15817)
@@ -1825,6 +1825,9 @@
 	MEM_freeN(a);
 	sculpt_stroke_free();
 
+	get_mesh(OBACT)->mr_undo = ss->mvert;
+	get_mesh(OBACT)->mr_undo_tot = ss->totvert;
+
 	sculpt_undo_push(G.scene->sculptdata.brush_type);
 
 	if(G.vd->depths) G.vd->depths->damaged= 1;





More information about the Bf-blender-cvs mailing list