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
path: root/source
diff options
context:
space:
mode:
authorNicholas Bishop <nicholasbishop@gmail.com>2009-06-07 22:09:22 +0400
committerNicholas Bishop <nicholasbishop@gmail.com>2009-06-07 22:09:22 +0400
commit98444f677044c01f62b58499acde154aea5f0a69 (patch)
tree7a2e340d2065c7dfc7f990f831329b290664a18f /source
parent0fc53d8d4cbaa7004b9ced7c0bb8e3988543804e (diff)
Multires/2.5:
Attempt to make multires updating a little cleaner by assuming that no update needs to be performed, and only doing the update when the modified flag is set (either by sculpting or using some other tool that needs an update.)
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_multires.h7
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c10
-rw-r--r--source/blender/blenkernel/intern/multires.c15
-rw-r--r--source/blender/blenloader/intern/readfile.c2
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c1
5 files changed, 20 insertions, 15 deletions
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
index 29a522d711f..6558212519f 100644
--- a/source/blender/blenkernel/BKE_multires.h
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -50,10 +50,11 @@ int *MultiresDM_get_face_offsets(struct DerivedMesh *);
int MultiresDM_get_totlvl(struct DerivedMesh *);
int MultiresDM_get_lvl(struct DerivedMesh *);
void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct DerivedMesh*));
-int *MultiresDM_get_flags(struct DerivedMesh *);
-#define MULTIRES_DM_UPDATE_BLOCK 1
-#define MULTIRES_DM_UPDATE_ALWAYS 2
+/* The displacements will only be updated when
+ the MultiresDM has been marked as modified */
+void MultiresDM_mark_as_modified(struct DerivedMesh *);
+void multires_mark_as_modified(struct Object *ob);
void multires_force_update(struct Object *ob);
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 7969eac2bf0..57ef920f75b 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1298,7 +1298,7 @@ typedef struct MultiresDM {
int *face_offsets;
Mesh *me;
- int flags;
+ int modified;
void (*update)(DerivedMesh*);
} MultiresDM;
@@ -1309,7 +1309,7 @@ static void MultiresDM_release(DerivedMesh *dm)
int mvert_layer;
/* Before freeing, need to update the displacement map */
- if(dm->needsFree && !(mrdm->flags & MULTIRES_DM_UPDATE_BLOCK))
+ if(dm->needsFree && mrdm->modified)
mrdm->update(dm);
/* If the MVert data is being used as the sculpt undo store, don't free it */
@@ -1382,7 +1382,7 @@ DerivedMesh *MultiresDM_new(MultiresSubsurf *ms, DerivedMesh *orig, int numVerts
mrdm->lvl = ms->mmd->lvl;
mrdm->totlvl = ms->mmd->totlvl;
mrdm->subco = MEM_callocN(sizeof(MVert)*numVerts, "multires subdivided verts");
- mrdm->flags = 0;
+ mrdm->modified = 0;
dm->release = MultiresDM_release;
@@ -1468,7 +1468,7 @@ int *MultiresDM_get_face_offsets(DerivedMesh *dm)
return mrdm->face_offsets;
}
-int *MultiresDM_get_flags(DerivedMesh *dm)
+void MultiresDM_mark_as_modified(DerivedMesh *dm)
{
- return &((MultiresDM*)dm)->flags;
+ ((MultiresDM*)dm)->modified = 1;
}
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 244c2711e63..b1387281cf5 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -165,7 +165,7 @@ int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object *src
for(i = 0; i < src_me->totvert; ++i)
VecCopyf(mvert[i].co, src_me->mvert[i].co);
mrdm->needsFree = 1;
- *MultiresDM_get_flags(mrdm) |= MULTIRES_DM_UPDATE_ALWAYS;
+ MultiresDM_mark_as_modified(mrdm);
mrdm->release(mrdm);
dst->derivedFinal = NULL;
@@ -397,7 +397,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;
+ MultiresDM_mark_as_modified(mrdm);
mrdm->release(mrdm);
}
@@ -475,7 +475,6 @@ void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int dista
final = multires_subdisp_pre(mrdm, distance, simple);
mrdm->needsFree = 1;
- *MultiresDM_get_flags(mrdm) |= MULTIRES_DM_UPDATE_BLOCK;
mrdm->release(mrdm);
}
@@ -1168,8 +1167,6 @@ static void multiresModifier_update(DerivedMesh *dm)
Mesh *me;
MDisps *mdisps;
- if(!(G.f & G_SCULPTMODE) && !(*MultiresDM_get_flags(dm) & MULTIRES_DM_UPDATE_ALWAYS)) return;
-
me = MultiresDM_get_mesh(dm);
mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
@@ -1191,7 +1188,6 @@ 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_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 */
@@ -1212,6 +1208,13 @@ static void multiresModifier_update(DerivedMesh *dm)
}
}
+void multires_mark_as_modified(struct Object *ob)
+{
+ if(ob && ob->derivedFinal) {
+ MultiresDM_mark_as_modified(ob->derivedFinal);
+ }
+}
+
void multires_force_update(Object *ob)
{
if(ob && ob->derivedFinal) {
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ef2f60c1803..cf26527e3f0 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -9001,7 +9001,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
multires_load_old(dm, me->mr);
- *MultiresDM_get_flags(dm) |= MULTIRES_DM_UPDATE_ALWAYS;
+ MultiresDM_mark_as_modified(dm);
dm->release(dm);
orig->release(orig);
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index a106df7745c..dc954ff5f26 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -1521,6 +1521,7 @@ static void sculpt_flush_update(bContext *C)
mmd->undo_verts = s->session->mvert;
mmd->undo_verts_tot = s->session->totvert;
+ multires_mark_as_modified(CTX_data_active_object(C));
}
ED_region_tag_redraw(ar);