forked from bartvdbraak/blender
2.5/Multires:
* Fixed multires subdivision of a sculpted object. Accidentally broke this when I fixed removing a multires modifier.
This commit is contained in:
parent
fc5df351b3
commit
b6548c21c2
@ -36,6 +36,7 @@ struct Object;
|
|||||||
typedef struct MultiresSubsurf {
|
typedef struct MultiresSubsurf {
|
||||||
struct MultiresModifierData *mmd;
|
struct MultiresModifierData *mmd;
|
||||||
struct Object *ob;
|
struct Object *ob;
|
||||||
|
int local_mmd;
|
||||||
} MultiresSubsurf;
|
} MultiresSubsurf;
|
||||||
|
|
||||||
/* MultiresDM */
|
/* MultiresDM */
|
||||||
@ -59,7 +60,7 @@ void multires_mark_as_modified(struct Object *ob);
|
|||||||
|
|
||||||
void multires_force_update(struct Object *ob);
|
void multires_force_update(struct Object *ob);
|
||||||
|
|
||||||
struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, struct DerivedMesh*,
|
struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, int local_mmd, struct DerivedMesh*,
|
||||||
struct Object *, int, int);
|
struct Object *, int, int);
|
||||||
|
|
||||||
struct MultiresModifierData *find_multires_modifier(struct Object *ob);
|
struct MultiresModifierData *find_multires_modifier(struct Object *ob);
|
||||||
|
@ -1288,6 +1288,7 @@ typedef struct MultiresDM {
|
|||||||
CDDerivedMesh cddm;
|
CDDerivedMesh cddm;
|
||||||
|
|
||||||
MultiresModifierData *mmd;
|
MultiresModifierData *mmd;
|
||||||
|
int local_mmd;
|
||||||
|
|
||||||
int lvl, totlvl;
|
int lvl, totlvl;
|
||||||
float (*orco)[3];
|
float (*orco)[3];
|
||||||
@ -1308,13 +1309,14 @@ static void MultiresDM_release(DerivedMesh *dm)
|
|||||||
MultiresDM *mrdm = (MultiresDM*)dm;
|
MultiresDM *mrdm = (MultiresDM*)dm;
|
||||||
int mvert_layer;
|
int mvert_layer;
|
||||||
|
|
||||||
/* Check that mmd still exists */
|
|
||||||
if(BLI_findindex(&mrdm->ob->modifiers, mrdm->mmd) < 0)
|
|
||||||
mrdm->mmd = NULL;
|
|
||||||
|
|
||||||
/* Before freeing, need to update the displacement map */
|
/* Before freeing, need to update the displacement map */
|
||||||
if(dm->needsFree && mrdm->modified && mrdm->mmd)
|
if(dm->needsFree && mrdm->modified) {
|
||||||
mrdm->update(dm);
|
/* Check that mmd still exists */
|
||||||
|
if(!mrdm->local_mmd && BLI_findindex(&mrdm->ob->modifiers, mrdm->mmd) < 0)
|
||||||
|
mrdm->mmd = NULL;
|
||||||
|
if(mrdm->mmd)
|
||||||
|
mrdm->update(dm);
|
||||||
|
}
|
||||||
|
|
||||||
/* If the MVert data is being used as the sculpt undo store, don't free it */
|
/* If the MVert data is being used as the sculpt undo store, don't free it */
|
||||||
mvert_layer = CustomData_get_layer_index(&dm->vertData, CD_MVERT);
|
mvert_layer = CustomData_get_layer_index(&dm->vertData, CD_MVERT);
|
||||||
@ -1353,6 +1355,7 @@ DerivedMesh *MultiresDM_new(MultiresSubsurf *ms, DerivedMesh *orig, int numVerts
|
|||||||
|
|
||||||
mrdm->mmd = ms->mmd;
|
mrdm->mmd = ms->mmd;
|
||||||
mrdm->ob = ms->ob;
|
mrdm->ob = ms->ob;
|
||||||
|
mrdm->local_mmd = ms->local_mmd;
|
||||||
|
|
||||||
if(dm) {
|
if(dm) {
|
||||||
MDisps *disps;
|
MDisps *disps;
|
||||||
|
@ -8121,7 +8121,7 @@ static DerivedMesh *multiresModifier_applyModifier(ModifierData *md, Object *ob,
|
|||||||
if(mmd->lvl == 1)
|
if(mmd->lvl == 1)
|
||||||
return dm;
|
return dm;
|
||||||
|
|
||||||
final = multires_dm_create_from_derived(mmd, dm, ob, useRenderParams, isFinalCalc);
|
final = multires_dm_create_from_derived(mmd, 0, dm, ob, useRenderParams, isFinalCalc);
|
||||||
if(mmd->undo_signal && mmd->undo_verts && mmd->undo_verts_tot == final->getNumVerts(final)) {
|
if(mmd->undo_signal && mmd->undo_verts && mmd->undo_verts_tot == final->getNumVerts(final)) {
|
||||||
int i;
|
int i;
|
||||||
MVert *dst = CDDM_get_verts(final);
|
MVert *dst = CDDM_get_verts(final);
|
||||||
|
@ -223,7 +223,7 @@ static void multires_subdisp(DerivedMesh *orig, Object *ob, DerivedMesh *final,
|
|||||||
|
|
||||||
memset(&mmd_sub, 0, sizeof(MultiresModifierData));
|
memset(&mmd_sub, 0, sizeof(MultiresModifierData));
|
||||||
mmd_sub.lvl = mmd_sub.totlvl = totlvl;
|
mmd_sub.lvl = mmd_sub.totlvl = totlvl;
|
||||||
mrdm = multires_dm_create_from_derived(&mmd_sub, orig, ob, 0, 0);
|
mrdm = multires_dm_create_from_derived(&mmd_sub, 1, orig, ob, 0, 0);
|
||||||
|
|
||||||
mvd = CDDM_get_verts(mrdm);
|
mvd = CDDM_get_verts(mrdm);
|
||||||
/* Need to map from ccg to mrdm */
|
/* Need to map from ccg to mrdm */
|
||||||
@ -469,7 +469,7 @@ void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int dista
|
|||||||
orig = CDDM_from_mesh(me, NULL);
|
orig = CDDM_from_mesh(me, NULL);
|
||||||
memset(&mmd_sub, 0, sizeof(MultiresModifierData));
|
memset(&mmd_sub, 0, sizeof(MultiresModifierData));
|
||||||
mmd_sub.lvl = mmd_sub.totlvl = mmd->lvl;
|
mmd_sub.lvl = mmd_sub.totlvl = mmd->lvl;
|
||||||
mrdm = multires_dm_create_from_derived(&mmd_sub, orig, ob, 0, 0);
|
mrdm = multires_dm_create_from_derived(&mmd_sub, 1, orig, ob, 0, 0);
|
||||||
totsubvert = mrdm->getNumVerts(mrdm);
|
totsubvert = mrdm->getNumVerts(mrdm);
|
||||||
totsubedge = mrdm->getNumEdges(mrdm);
|
totsubedge = mrdm->getNumEdges(mrdm);
|
||||||
totsubface = mrdm->getNumFaces(mrdm);
|
totsubface = mrdm->getNumFaces(mrdm);
|
||||||
@ -1192,7 +1192,7 @@ static void multiresModifier_update(DerivedMesh *dm)
|
|||||||
(includes older displacements but not new sculpts) */
|
(includes older displacements but not new sculpts) */
|
||||||
mmd.totlvl = totlvl;
|
mmd.totlvl = totlvl;
|
||||||
mmd.lvl = lvl;
|
mmd.lvl = lvl;
|
||||||
subco_dm = multires_dm_create_from_derived(&mmd, orig, ob, 0, 0);
|
subco_dm = multires_dm_create_from_derived(&mmd, 1, orig, ob, 0, 0);
|
||||||
cur_lvl_orig_verts = CDDM_get_verts(subco_dm);
|
cur_lvl_orig_verts = CDDM_get_verts(subco_dm);
|
||||||
|
|
||||||
/* Subtract the original vertex cos from the new vertex cos */
|
/* Subtract the original vertex cos from the new vertex cos */
|
||||||
@ -1229,7 +1229,7 @@ void multires_force_update(Object *ob)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, DerivedMesh *dm, Object *ob,
|
struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int local_mmd, DerivedMesh *dm, Object *ob,
|
||||||
int useRenderParams, int isFinalCalc)
|
int useRenderParams, int isFinalCalc)
|
||||||
{
|
{
|
||||||
SubsurfModifierData smd;
|
SubsurfModifierData smd;
|
||||||
@ -1239,6 +1239,7 @@ struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, D
|
|||||||
|
|
||||||
ms.mmd = mmd;
|
ms.mmd = mmd;
|
||||||
ms.ob = ob;
|
ms.ob = ob;
|
||||||
|
ms.local_mmd = local_mmd;
|
||||||
|
|
||||||
memset(&smd, 0, sizeof(SubsurfModifierData));
|
memset(&smd, 0, sizeof(SubsurfModifierData));
|
||||||
smd.levels = smd.renderLevels = mmd->lvl - 1;
|
smd.levels = smd.renderLevels = mmd->lvl - 1;
|
||||||
|
@ -9416,7 +9416,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
|
|||||||
|
|
||||||
mmd->lvl = mmd->totlvl;
|
mmd->lvl = mmd->totlvl;
|
||||||
orig = CDDM_from_mesh(me, NULL);
|
orig = CDDM_from_mesh(me, NULL);
|
||||||
dm = multires_dm_create_from_derived(mmd, orig, ob, 0, 0);
|
dm = multires_dm_create_from_derived(mmd, 0, orig, ob, 0, 0);
|
||||||
|
|
||||||
multires_load_old(dm, me->mr);
|
multires_load_old(dm, me->mr);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user