[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18162] branches/soc-2008-nicholasbishop/ source/blender: Moved the Multires/ Sculpt undo data into the multires modifier.

Nicholas Bishop nicholasbishop at gmail.com
Tue Dec 30 04:57:02 CET 2008


Revision: 18162
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18162
Author:   nicholasbishop
Date:     2008-12-30 04:56:56 +0100 (Tue, 30 Dec 2008)

Log Message:
-----------
Moved the Multires/Sculpt undo data into the multires modifier. Also fixed up the way the data is free'd to fix a bug that made it appear sculpting had been lost after doing an undo.

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/modifier.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.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/makesdna/DNA_modifier_types.h
    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-12-30 03:38:18 UTC (rev 18161)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-12-30 03:56:56 UTC (rev 18162)
@@ -34,8 +34,8 @@
 struct Object;
 
 typedef struct MultiresSubsurf {
+	struct MultiresModifierData *mmd;
 	struct Mesh *me;
-	int totlvl, lvl;
 } MultiresSubsurf;
 
 typedef struct IndexNode {

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-12-30 03:38:18 UTC (rev 18161)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-12-30 03:56:56 UTC (rev 18162)
@@ -53,6 +53,7 @@
 
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
 #include "DNA_object_fluidsim.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
@@ -1157,6 +1158,8 @@
 typedef struct MultiresDM {
 	CDDerivedMesh cddm;
 
+	MultiresModifierData *mmd;
+
 	int lvl, totlvl;
 	float (*orco)[3];
 	MVert *subco;
@@ -1174,11 +1177,20 @@
 static void MultiresDM_release(DerivedMesh *dm)
 {
 	MultiresDM *mrdm = (MultiresDM*)dm;
+	int mvert_layer;
 
 	/* Before freeing, need to update the displacement map */
 	if(dm->needsFree && !(mrdm->flags & MULTIRES_DM_UPDATE_BLOCK))
 		mrdm->update(dm);
 
+	/* If the MVert data is being used as the sculpt undo store, don't free it */
+	mvert_layer = CustomData_get_layer_index(&dm->vertData, CD_MVERT);
+	if(mvert_layer != -1) {
+		CustomDataLayer *cd = &dm->vertData.layers[mvert_layer];
+		if(cd->data == mrdm->mmd->undo_verts)
+			cd->flag |= CD_FLAG_NOFREE;
+	}
+
 	if(DM_release(dm)) {
 		MEM_freeN(mrdm->subco);
 		MEM_freeN(mrdm->orco);
@@ -1206,6 +1218,7 @@
 	MEM_freeN(cddm);
 	dm = &mrdm->cddm.dm;
 
+	mrdm->mmd = ms->mmd;
 	mrdm->me = ms->me;
 
 	if(dm) {
@@ -1238,8 +1251,8 @@
 	mrdm->cddm.medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
 	mrdm->cddm.mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
 
-	mrdm->lvl = ms->lvl;
-	mrdm->totlvl = ms->totlvl;
+	mrdm->lvl = ms->mmd->lvl;
+	mrdm->totlvl = ms->mmd->totlvl;
 	mrdm->subco = MEM_callocN(sizeof(MVert)*numVerts, "multires subdivided verts");
 	mrdm->flags = 0;
 

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c	2008-12-30 03:38:18 UTC (rev 18161)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c	2008-12-30 03:56:56 UTC (rev 18162)
@@ -7236,6 +7236,14 @@
 	mmd->lvl = mmd->totlvl = 1;
 }
 
+static void multiresModifier_freeData(ModifierData *md)
+{
+	MultiresModifierData *mmd = (MultiresModifierData*)md;
+
+	if(mmd->undo_verts)
+		MEM_freeN(mmd->undo_verts);
+}
+
 static void multiresModifier_copyData(ModifierData *md, ModifierData *target)
 {
 	MultiresModifierData *mmd = (MultiresModifierData*) md;
@@ -7257,18 +7265,18 @@
 		return dm;
 
 	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)) {
+	if(mmd->undo_signal && mmd->undo_verts && mmd->undo_verts_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);
+		for(i = 0; i < mmd->undo_verts_tot; ++i) {
+			VecCopyf(dst[i].co, mmd->undo_verts[i].co);
 		}
 		CDDM_calc_normals(final);
+
+		MEM_freeN(mmd->undo_verts);
+		mmd->undo_signal = 0;
+		mmd->undo_verts = NULL;
 	}
-	if(me->mr_undo && me->mr_undo_state)
-		MEM_freeN(me->mr_undo);
-	me->mr_undo_state = 0;
-	me->mr_undo = NULL;
 
 	return final;
 }
@@ -7598,6 +7606,7 @@
 		mti->type = eModifierTypeType_Constructive;
 		mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_RequiresOriginalData;
 		mti->initData = multiresModifier_initData;
+		mti->freeData = multiresModifier_freeData;
 		mti->copyData = multiresModifier_copyData;
 		mti->applyModifier = multiresModifier_applyModifier;
 

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-12-30 03:38:18 UTC (rev 18161)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-12-30 03:56:56 UTC (rev 18162)
@@ -1259,10 +1259,13 @@
 						    int useRenderParams, int isFinalCalc)
 {
 	SubsurfModifierData smd;
-	MultiresSubsurf ms = {me, mmd->totlvl, mmd->lvl};
+	MultiresSubsurf ms;
 	DerivedMesh *result;
 	int i;
 
+	ms.mmd = mmd;
+	ms.me = me;
+
 	memset(&smd, 0, sizeof(SubsurfModifierData));
 	smd.levels = smd.renderLevels = mmd->lvl - 1;
 

Modified: branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c	2008-12-30 03:38:18 UTC (rev 18161)
+++ branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c	2008-12-30 03:56:56 UTC (rev 18162)
@@ -2794,9 +2794,6 @@
 	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) {
@@ -3200,6 +3197,13 @@
 						SWITCH_INT(mmd->dynverts[a])
 			}
 		}
+		else if (md->type==eModifierType_Multires) {
+			MultiresModifierData *mmd = (MultiresModifierData*) md;
+
+			mmd->undo_verts = newdataadr(fd, mmd->undo_verts);
+			mmd->undo_signal = !!mmd->undo_verts;
+		}
+
 	}
 }
 

Modified: branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/writefile.c	2008-12-30 03:38:18 UTC (rev 18161)
+++ branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/writefile.c	2008-12-30 03:56:56 UTC (rev 18162)
@@ -825,7 +825,7 @@
 
 }
 
-static void write_modifiers(WriteData *wd, ListBase *modbase)
+static void write_modifiers(WriteData *wd, ListBase *modbase, int write_undo)
 {
 	ModifierData *md;
 
@@ -871,10 +871,16 @@
 			writestruct(wd, DATA, "MDefInfluence", mmd->totinfluence, mmd->dyninfluences);
 			writedata(wd, DATA, sizeof(int)*mmd->totvert, mmd->dynverts);
 		}
+		else if (md->type==eModifierType_Multires) {
+			MultiresModifierData *mmd = (MultiresModifierData*) md;
+
+			if(mmd->undo_verts && write_undo)
+				writestruct(wd, DATA, "MVert", mmd->undo_verts_tot, mmd->undo_verts);
+		}
 	}
 }
 
-static void write_objects(WriteData *wd, ListBase *idbase)
+static void write_objects(WriteData *wd, ListBase *idbase, int write_undo)
 {
 	Object *ob;
 	
@@ -916,7 +922,7 @@
 			writestruct(wd, DATA, "FluidsimSettings", 1, ob->fluidsimSettings); // NT
 			
 			write_particlesystems(wd, &ob->particlesystem);
-			write_modifiers(wd, &ob->modifiers);
+			write_modifiers(wd, &ob->modifiers, write_undo);
 		}
 		ob= ob->id.next;
 	}
@@ -1175,7 +1181,7 @@
 	}
 }
 
-static void write_meshs(WriteData *wd, ListBase *idbase, int mr_undo)
+static void write_meshs(WriteData *wd, ListBase *idbase)
 {
 	Mesh *mesh;
 
@@ -1224,9 +1230,6 @@
 				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;
 	}
@@ -2040,10 +2043,10 @@
 	write_groups   (wd, &G.main->group);
 	write_armatures(wd, &G.main->armature);
 	write_actions  (wd, &G.main->action);
-	write_objects  (wd, &G.main->object);
+	write_objects  (wd, &G.main->object, (current != NULL));
 	write_materials(wd, &G.main->mat);
 	write_textures (wd, &G.main->tex);
-	write_meshs    (wd, &G.main->mesh, (current != NULL));
+	write_meshs    (wd, &G.main->mesh);
 	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-12-30 03:38:18 UTC (rev 18161)
+++ branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_mesh_types.h	2008-12-30 03:56:56 UTC (rev 18162)
@@ -94,9 +94,6 @@
 	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/makesdna/DNA_modifier_types.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_modifier_types.h	2008-12-30 03:38:18 UTC (rev 18161)
+++ branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_modifier_types.h	2008-12-30 03:56:56 UTC (rev 18162)
@@ -494,9 +494,12 @@
 typedef struct MultiresModifierData {
 	ModifierData modifier;
 
+	struct MVert *undo_verts; /* Store DerivedMesh vertices for multires undo */
+	int undo_verts_tot; /* Length of undo_verts array */
+	char undo_signal; /* If true, signals to replace verts with undo verts */
+
 	char lvl, totlvl;
 	char simple;
-	char pad[5];
 } MultiresModifierData;
 
 #endif

Modified: branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c	2008-12-30 03:38:18 UTC (rev 18161)
+++ branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c	2008-12-30 03:56:56 UTC (rev 18162)
@@ -1833,19 +1833,15 @@
 	sculpt_stroke_free();
 
 	if(mmd) {
-		me->mr_undo = ss->mvert;
-		me->mr_undo_tot = ss->totvert;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list