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.
This commit is contained in:
parent
5c646e7e3a
commit
34814e4755
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
MDisps *mdisp = NULL, *cur = NULL;
|
||||
int i, grid = 0;
|
||||
|
||||
if (mmd)
|
||||
multires_set_tot_mdisps(me, mmd->totlvl);
|
||||
CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totface);
|
||||
mdisp = CustomData_get_layer(&me->ldata, CD_MDISPS);
|
||||
|
||||
CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
|
||||
mdisp= CustomData_get_layer(&me->fdata, 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 *****************/
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue