diff options
-rw-r--r-- | source/blender/blenkernel/BKE_multires.h | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 15 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 2 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 1 |
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); |