diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2008-07-27 23:21:10 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2008-07-27 23:21:10 +0400 |
commit | 5a3572beecf86bdbdc8fe1589567f5d4d66b095b (patch) | |
tree | dd71e5b7d7f855ddb959f541818e58e60d42a9cf /source/blender/blenkernel/intern | |
parent | 495a8d393745e65d4c0e2e72734871955cb8b20a (diff) |
Somewhat hacky support for undo in sculptmode; does a copy of MVert DerivedMesh data when pushing undo, but not for regular save/load.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 9 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 18 |
2 files changed, 23 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index e48d159ba2f..c7d37610254 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1263,8 +1263,6 @@ DerivedMesh *MultiresDM_new(MultiresSubsurf *ms, DerivedMesh *orig, int numVerts 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 @@ Mesh *MultiresDM_get_mesh(DerivedMesh *dm) 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) diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index a7c7abf305f..4f0960c73f2 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -7224,12 +7224,28 @@ static DerivedMesh *multiresModifier_applyModifier(ModifierData *md, Object *ob, 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; } /***/ |