[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