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:
authorSergey Sharybin <sergey.vfx@gmail.com>2010-11-02 13:55:49 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2010-11-02 13:55:49 +0300
commit5fb6c942b7932904b53d6a04de8b7a02be7f0f75 (patch)
tree82f0b096afc0330e21c2156ea98ff8a03f9d76f1 /source/blender
parentf130d4c0a7d1b174454e423f3cdf753e12a09dce (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')
-rw-r--r--source/blender/blenkernel/intern/multires.c10
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)