2.5 Multires:
* Fixed a memory corruption bug when deleting a multiresmodifier, was hanging on to a bad pointer. Reported on IRC by lusque
This commit is contained in:
@@ -204,10 +204,11 @@ static void VecAddUf(float a[3], float b[3])
|
||||
a[2] += b[2];
|
||||
}
|
||||
|
||||
static void multires_subdisp(DerivedMesh *orig, Mesh *me, DerivedMesh *final, int lvl, int totlvl,
|
||||
static void multires_subdisp(DerivedMesh *orig, Object *ob, DerivedMesh *final, int lvl, int totlvl,
|
||||
int totsubvert, int totsubedge, int totsubface, int addverts)
|
||||
{
|
||||
DerivedMesh *mrdm;
|
||||
Mesh *me = ob->data;
|
||||
MultiresModifierData mmd_sub;
|
||||
MVert *mvs = CDDM_get_verts(final);
|
||||
MVert *mvd, *mvd_f1, *mvs_f1, *mvd_f3, *mvd_f4;
|
||||
@@ -222,7 +223,7 @@ static void multires_subdisp(DerivedMesh *orig, Mesh *me, DerivedMesh *final, in
|
||||
|
||||
memset(&mmd_sub, 0, sizeof(MultiresModifierData));
|
||||
mmd_sub.lvl = mmd_sub.totlvl = totlvl;
|
||||
mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 0);
|
||||
mrdm = multires_dm_create_from_derived(&mmd_sub, orig, ob, 0, 0);
|
||||
|
||||
mvd = CDDM_get_verts(mrdm);
|
||||
/* Need to map from ccg to mrdm */
|
||||
@@ -395,7 +396,7 @@ static void multires_subdisp(DerivedMesh *orig, Mesh *me, DerivedMesh *final, in
|
||||
}
|
||||
}
|
||||
|
||||
final->needsFree = 1;
|
||||
final->needsFree = 1;
|
||||
final->release(final);
|
||||
mrdm->needsFree = 1;
|
||||
MultiresDM_mark_as_modified(mrdm);
|
||||
@@ -468,7 +469,7 @@ void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int dista
|
||||
orig = CDDM_from_mesh(me, NULL);
|
||||
memset(&mmd_sub, 0, sizeof(MultiresModifierData));
|
||||
mmd_sub.lvl = mmd_sub.totlvl = mmd->lvl;
|
||||
mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 0);
|
||||
mrdm = multires_dm_create_from_derived(&mmd_sub, orig, ob, 0, 0);
|
||||
totsubvert = mrdm->getNumVerts(mrdm);
|
||||
totsubedge = mrdm->getNumEdges(mrdm);
|
||||
totsubface = mrdm->getNumFaces(mrdm);
|
||||
@@ -497,7 +498,7 @@ void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int dista
|
||||
|
||||
orig = CDDM_from_mesh(me, NULL);
|
||||
|
||||
multires_subdisp(orig, me, final, mmd->lvl, mmd->totlvl, totsubvert, totsubedge, totsubface, 0);
|
||||
multires_subdisp(orig, ob, final, mmd->lvl, mmd->totlvl, totsubvert, totsubedge, totsubface, 0);
|
||||
|
||||
orig->needsFree = 1;
|
||||
orig->release(orig);
|
||||
@@ -1166,9 +1167,11 @@ static void multiresModifier_disp_run(DerivedMesh *dm, MVert *subco, int invert)
|
||||
|
||||
static void multiresModifier_update(DerivedMesh *dm)
|
||||
{
|
||||
Object *ob;
|
||||
Mesh *me;
|
||||
MDisps *mdisps;
|
||||
|
||||
ob = MultiresDM_get_object(dm);
|
||||
me = MultiresDM_get_mesh(dm);
|
||||
mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
|
||||
|
||||
@@ -1189,7 +1192,7 @@ static void multiresModifier_update(DerivedMesh *dm)
|
||||
(includes older displacements but not new sculpts) */
|
||||
mmd.totlvl = totlvl;
|
||||
mmd.lvl = lvl;
|
||||
subco_dm = multires_dm_create_from_derived(&mmd, orig, me, 0, 0);
|
||||
subco_dm = multires_dm_create_from_derived(&mmd, orig, ob, 0, 0);
|
||||
cur_lvl_orig_verts = CDDM_get_verts(subco_dm);
|
||||
|
||||
/* Subtract the original vertex cos from the new vertex cos */
|
||||
@@ -1199,7 +1202,7 @@ static void multiresModifier_update(DerivedMesh *dm)
|
||||
|
||||
final = multires_subdisp_pre(dm, totlvl - lvl, 0);
|
||||
|
||||
multires_subdisp(orig, me, final, lvl, totlvl, dm->getNumVerts(dm), dm->getNumEdges(dm),
|
||||
multires_subdisp(orig, ob, final, lvl, totlvl, dm->getNumVerts(dm), dm->getNumEdges(dm),
|
||||
dm->getNumFaces(dm), 1);
|
||||
|
||||
subco_dm->release(subco_dm);
|
||||
@@ -1226,7 +1229,7 @@ void multires_force_update(Object *ob)
|
||||
}
|
||||
}
|
||||
|
||||
struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, DerivedMesh *dm, Mesh *me,
|
||||
struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, DerivedMesh *dm, Object *ob,
|
||||
int useRenderParams, int isFinalCalc)
|
||||
{
|
||||
SubsurfModifierData smd;
|
||||
@@ -1235,7 +1238,7 @@ struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, D
|
||||
int i;
|
||||
|
||||
ms.mmd = mmd;
|
||||
ms.me = me;
|
||||
ms.ob = ob;
|
||||
|
||||
memset(&smd, 0, sizeof(SubsurfModifierData));
|
||||
smd.levels = smd.renderLevels = mmd->lvl - 1;
|
||||
|
||||
Reference in New Issue
Block a user