diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-04-16 15:03:42 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-04-16 15:03:42 +0400 |
commit | 34814e47558febd42f56b2ec38c4cb8954eb5dad (patch) | |
tree | 442bdf47dffecda7cfc145a8b734ca564103d349 /source/blender/blenkernel/intern/multires.c | |
parent | 5c646e7e3a48c7fea0bfea407d3d27df0b1aa02b (diff) |
Port multires_topology_changed to new bmesh api
This call is still needed when loading editmesh because some operations
are not creating CD layer for new loops (like crating new face) and
to prevent loosing all sculpted data when running disps correct
displacement maps should be allocated on loading edit mesh.
Diffstat (limited to 'source/blender/blenkernel/intern/multires.c')
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 48 |
1 files changed, 14 insertions, 34 deletions
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index d8117aa1344..2167495ef08 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -2166,58 +2166,38 @@ void multiresModifier_prepare_join(Scene *scene, Object *ob, Object *to_ob) } /* update multires data after topology changing */ -#if 0 // BMESH_TODO -void multires_topology_changed(Scene *scene, Object *ob) +void multires_topology_changed(Mesh *me) { - Mesh *me= (Mesh*)ob->data; - MDisps *mdisp= NULL, *cur= NULL; - int i, grid= 0, corners; - MultiresModifierData *mmd= get_multires_modifier(scene, ob, 1); - - if (mmd) - multires_set_tot_mdisps(me, mmd->totlvl); + MDisps *mdisp = NULL, *cur = NULL; + int i, grid = 0; - CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface); - mdisp= CustomData_get_layer(&me->fdata, CD_MDISPS); + CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totface); + mdisp = CustomData_get_layer(&me->ldata, CD_MDISPS); - if (!mdisp) return; + if (!mdisp) + return; - cur= mdisp; - for (i = 0; i < me->totface; i++, cur++) { - if (mdisp->totdisp) { - corners= multires_mdisp_corners(mdisp); - grid= mdisp->totdisp / corners; + cur = mdisp; + for (i = 0; i < me->totloop; i++, cur++) { + if (cur->totdisp) { + grid = mdisp->totdisp; break; } } - for (i = 0; i < me->totface; i++, mdisp++) { - int nvert= me->mface[i].v4 ? 4 : 3; - + for (i = 0; i < me->totloop; i++, mdisp++) { /* allocate memory for mdisp, the whole disp layer would be erased otherwise */ if (!mdisp->totdisp || !mdisp->disps) { if (grid) { - mdisp->totdisp= nvert*grid; - mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology"); + mdisp->totdisp = grid; + mdisp->disps = MEM_callocN(3 * mdisp->totdisp * sizeof(float), "mdisp topology"); } continue; } - - corners= multires_mdisp_corners(mdisp); - - if (corners!=nvert) { - mdisp->totdisp= (mdisp->totdisp/corners)*nvert; - - if (mdisp->disps) - MEM_freeN(mdisp->disps); - - mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology"); - } } } -#endif // BMESH_TODO /***************** Multires interpolation stuff *****************/ |