diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2010-11-02 13:55:49 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2010-11-02 13:55:49 +0300 |
commit | 5fb6c942b7932904b53d6a04de8b7a02be7f0f75 (patch) | |
tree | 82f0b096afc0330e21c2156ea98ff8a03f9d76f1 /source/blender/blenkernel/intern/multires.c | |
parent | f130d4c0a7d1b174454e423f3cdf753e12a09dce (diff) |
Fix #24485: Applying scale to multires object end up in a blender crash
Fixed multires_apply_smat to work properly with different current and
total subdivision levels.
Diffstat (limited to 'source/blender/blenkernel/intern/multires.c')
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 5324d5dde62..bf1cd9b9994 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -1471,15 +1471,19 @@ void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3]) int i, numGrids, gridSize, dGridSize, dSkip, totvert; float (*vertCos)[3] = NULL; MultiresModifierData *mmd= get_multires_modifier(scene, ob); + MultiresModifierData high_mmd; CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface); mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS); if(!mdisps || !mmd) return; + /* we need derived mesh created from highest resolution */ + high_mmd= *mmd; + high_mmd.lvl= high_mmd.totlvl; /* unscaled multires with applied displacement */ - subdm= get_multires_dm(scene, mmd, ob); + subdm= get_multires_dm(scene, &high_mmd, ob); /* prepare scaled CDDM to create ccgDN */ cddm= mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH); @@ -1495,7 +1499,7 @@ void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3]) mvert= cddm->getVertArray(cddm); /* scaled ccgDM for tangent space of object with applied scale */ - dm= subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0); + dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0); cddm->release(cddm); numGrids= dm->getNumGrids(dm); @@ -1504,7 +1508,7 @@ void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3]) gridOffset= dm->getGridOffset(dm); subGridData= subdm->getGridData(subdm); - dGridSize= multires_side_tot[mmd->totlvl]; + dGridSize= multires_side_tot[high_mmd.totlvl]; dSkip= (dGridSize-1)/(gridSize-1); #pragma omp parallel for private(i) if(me->totface*gridSize*gridSize*4 >= CCG_OMP_LIMIT) |