forked from bartvdbraak/blender
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.
This commit is contained in:
parent
f130d4c0a7
commit
5fb6c942b7
@ -1471,15 +1471,19 @@ void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3])
|
|||||||
int i, numGrids, gridSize, dGridSize, dSkip, totvert;
|
int i, numGrids, gridSize, dGridSize, dSkip, totvert;
|
||||||
float (*vertCos)[3] = NULL;
|
float (*vertCos)[3] = NULL;
|
||||||
MultiresModifierData *mmd= get_multires_modifier(scene, ob);
|
MultiresModifierData *mmd= get_multires_modifier(scene, ob);
|
||||||
|
MultiresModifierData high_mmd;
|
||||||
|
|
||||||
CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
|
CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
|
||||||
mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS);
|
mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS);
|
||||||
|
|
||||||
if(!mdisps || !mmd) return;
|
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 */
|
/* 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 */
|
/* prepare scaled CDDM to create ccgDN */
|
||||||
cddm= mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
|
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);
|
mvert= cddm->getVertArray(cddm);
|
||||||
|
|
||||||
/* scaled ccgDM for tangent space of object with applied scale */
|
/* 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);
|
cddm->release(cddm);
|
||||||
|
|
||||||
numGrids= dm->getNumGrids(dm);
|
numGrids= dm->getNumGrids(dm);
|
||||||
@ -1504,7 +1508,7 @@ void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3])
|
|||||||
gridOffset= dm->getGridOffset(dm);
|
gridOffset= dm->getGridOffset(dm);
|
||||||
subGridData= subdm->getGridData(subdm);
|
subGridData= subdm->getGridData(subdm);
|
||||||
|
|
||||||
dGridSize= multires_side_tot[mmd->totlvl];
|
dGridSize= multires_side_tot[high_mmd.totlvl];
|
||||||
dSkip= (dGridSize-1)/(gridSize-1);
|
dSkip= (dGridSize-1)/(gridSize-1);
|
||||||
|
|
||||||
#pragma omp parallel for private(i) if(me->totface*gridSize*gridSize*4 >= CCG_OMP_LIMIT)
|
#pragma omp parallel for private(i) if(me->totface*gridSize*gridSize*4 >= CCG_OMP_LIMIT)
|
||||||
|
Loading…
Reference in New Issue
Block a user