Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Bishop <nicholasbishop@gmail.com>2008-08-09 04:18:37 +0400
committerNicholas Bishop <nicholasbishop@gmail.com>2008-08-09 04:18:37 +0400
commit2d7e3a63e5bbe12189eac54db088d4af7a96eab1 (patch)
treef83565fa125ecbdebf2b069a0f916ae4ccb15c4b /source/blender
parenta90e7bd0c249e6ee3cdf895c6869fd148d6015fb (diff)
Multires doesn't update itself outside of sculptmode now, so switching levels is somewhat faster outside of sculptmode.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_multires.h5
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c10
-rw-r--r--source/blender/blenkernel/intern/multires.c11
3 files changed, 14 insertions, 12 deletions
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
index 429b3fba4cf..91417591d98 100644
--- a/source/blender/blenkernel/BKE_multires.h
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -95,7 +95,10 @@ struct ListBase *MultiresDM_get_vert_face_map(struct DerivedMesh *);
int MultiresDM_get_totlvl(struct DerivedMesh *);
int MultiresDM_get_lvl(struct DerivedMesh *);
void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct DerivedMesh*));
-void MultiresDM_block_update(struct DerivedMesh *);
+int *MultiresDM_get_flags(struct DerivedMesh *);
+
+#define MULTIRES_DM_UPDATE_BLOCK 1
+#define MULTIRES_DM_UPDATE_ALWAYS 2
/* Modifier */
struct MDisps;
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 30f0a95374c..00a3b808de6 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1165,7 +1165,7 @@ typedef struct MultiresDM {
IndexNode *vert_face_map_mem;
Mesh *me;
- int block_update;
+ int flags;
void (*update)(DerivedMesh*);
} MultiresDM;
@@ -1175,7 +1175,7 @@ static void MultiresDM_release(DerivedMesh *dm)
MultiresDM *mrdm = (MultiresDM*)dm;
/* Before freeing, need to update the displacement map */
- if(dm->needsFree && !mrdm->block_update)
+ if(dm->needsFree && !(mrdm->flags & MULTIRES_DM_UPDATE_BLOCK))
mrdm->update(dm);
if(DM_release(dm)) {
@@ -1261,7 +1261,7 @@ DerivedMesh *MultiresDM_new(MultiresSubsurf *ms, DerivedMesh *orig, int numVerts
mrdm->lvl = ms->lvl;
mrdm->totlvl = ms->totlvl;
mrdm->subco = MEM_callocN(sizeof(MVert)*numVerts, "multires subdivided verts");
- mrdm->block_update = 0;
+ mrdm->flags = 0;
dm->release = MultiresDM_release;
@@ -1325,7 +1325,7 @@ ListBase *MultiresDM_get_vert_face_map(DerivedMesh *dm)
return mrdm->vert_face_map;
}
-void MultiresDM_block_update(DerivedMesh *dm)
+int *MultiresDM_get_flags(DerivedMesh *dm)
{
- ((MultiresDM*)dm)->block_update = 1;
+ return &((MultiresDM*)dm)->flags;
}
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 976b71e252c..8f23c8f60fa 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -1176,6 +1176,7 @@ static void multires_subdisp(DerivedMesh *orig, Mesh *me, DerivedMesh *final, in
final->needsFree = 1;
final->release(final);
mrdm->needsFree = 1;
+ *MultiresDM_get_flags(mrdm) |= MULTIRES_DM_UPDATE_ALWAYS;
mrdm->release(mrdm);
}
@@ -1584,7 +1585,7 @@ static void multiresModifier_update(DerivedMesh *dm)
MFace *mface;
int i;
- //if(!(G.f & G_SCULPTMODE)) return;
+ if(!(G.f & G_SCULPTMODE) && !(*MultiresDM_get_flags(dm) & MULTIRES_DM_UPDATE_ALWAYS)) return;
mdisps = dm->getFaceDataArray(dm, CD_MDISPS);
@@ -1612,7 +1613,7 @@ static void multiresModifier_update(DerivedMesh *dm)
mmd.totlvl = totlvl;
mmd.lvl = lvl;
subco_dm = multires_dm_create_from_derived(&mmd, orig, me, 0, 0);
- MultiresDM_block_update(subco_dm);
+ *MultiresDM_get_flags(subco_dm) |= MULTIRES_DM_UPDATE_BLOCK;
cur_lvl_orig_verts = CDDM_get_verts(subco_dm);
/* Subtract the original vertex cos from the new vertex cos */
@@ -1654,16 +1655,14 @@ struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, D
SubsurfModifierData smd;
MultiresSubsurf ms = {me, mmd->totlvl, mmd->lvl};
DerivedMesh *result;
+ int i;
memset(&smd, 0, sizeof(SubsurfModifierData));
smd.levels = smd.renderLevels = mmd->lvl - 1;
result = subsurf_make_derived_from_derived_with_multires(dm, &smd, &ms, useRenderParams, NULL, isFinalCalc, 0);
- /* TODO */
- int i;
- for(i = 0; i < result->getNumVerts(result); ++i) {
+ for(i = 0; i < result->getNumVerts(result); ++i)
MultiresDM_get_subco(result)[i] = CDDM_get_verts(result)[i];
- }
multiresModifier_disp_run(result, MultiresDM_get_subco(result), 0);
MultiresDM_set_update(result, multiresModifier_update);