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:
-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);