diff options
-rw-r--r-- | source/blender/blenkernel/BKE_multires.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 48 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mesh_conv.c | 4 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_utils.c | 1 |
4 files changed, 19 insertions, 36 deletions
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index 69482706da6..bc34b0131bf 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -99,7 +99,7 @@ void multiresModifier_prepare_join(struct Scene *scene, struct Object *ob, struc int multires_mdisp_corners(struct MDisps *s); /* update multires data after topology changing */ -void multires_topology_changed(struct Scene *scene, struct Object *ob); +void multires_topology_changed(struct Mesh *me); /**** interpolation stuff ****/ void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u, float v); 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 *****************/ diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c index 2be9d4c7490..c8876e55431 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_conv.c +++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c @@ -89,6 +89,7 @@ #include "BKE_mesh.h" #include "BKE_customdata.h" +#include "BKE_multires.h" #include "BKE_global.h" /* ugh - for looping over all objects */ #include "BKE_main.h" @@ -854,4 +855,7 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess) } if (oldverts) MEM_freeN(oldverts); + + /* topology could be changed, ensure mdisps are ok */ + multires_topology_changed(me); } diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c index 12601d51b01..6511cc713e3 100644 --- a/source/blender/editors/mesh/editmesh_utils.c +++ b/source/blender/editors/mesh/editmesh_utils.c @@ -313,7 +313,6 @@ void EDBM_mesh_load(Object *ob) #ifdef USE_TESSFACE_DEFAULT BKE_mesh_tessface_calc(me); #endif - } void EDBM_mesh_free(BMEditMesh *tm) |