diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2010-11-08 17:00:23 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2010-11-08 17:00:23 +0300 |
commit | 8647dbc0a60576aeb69b9431c02a1273290ee32d (patch) | |
tree | b9b45959ee75487fdca03c7996b3f6487a4a3fc0 /source/blender/blenkernel/intern/multires.c | |
parent | f15187cfcdfcc4f1210ce2b9ff7caba804411867 (diff) |
Fix crash when creating new faces in edit mode
- Do not check corners count if totdisp is set to 0
- Allocate memory for such mdisps to prevent the whole disp layer erasing
Diffstat (limited to 'source/blender/blenkernel/intern/multires.c')
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index f4e9dcf742b..5dfae6599aa 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -1614,17 +1614,31 @@ void multires_topology_changed(Object *ob) { Mesh *me= (Mesh*)ob->data; MDisps *mdisp= NULL; - int i; + int i, totlvl; CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface); mdisp= CustomData_get_layer(&me->fdata, CD_MDISPS); if(!mdisp) return; + totlvl= get_levels_from_disps(ob); + for(i = 0; i < me->totface; i++, mdisp++) { - int corners= multires_mdisp_corners(mdisp); + int corners= 0; int nvert= me->mface[i].v4 ? 4 : 3; + /* allocate memory for mdisp, the whole disp layer would be erased otherwise */ + if(!mdisp->totdisp) { + int side = multires_side_tot[totlvl]; + + mdisp->totdisp= nvert*side*side; + mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology"); + + continue; + } + + corners= multires_mdisp_corners(mdisp); + if(corners!=nvert) { mdisp->totdisp= (mdisp->totdisp/corners)*nvert; |