diff options
Diffstat (limited to 'source/blender/editors/object/object_bake.c')
-rw-r--r-- | source/blender/editors/object/object_bake.c | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c index 593a5b6f1fe..cea9a0aae6b 100644 --- a/source/blender/editors/object/object_bake.c +++ b/source/blender/editors/object/object_bake.c @@ -49,6 +49,7 @@ #include "BLI_math_geom.h" #include "BKE_blender.h" +#include "BKE_ccg.h" #include "BKE_screen.h" #include "BKE_context.h" #include "BKE_global.h" @@ -475,32 +476,32 @@ static void interp_barycentric_tri_data(float data[3][3], float u, float v, floa /* mode = 0: interpolate normals, * mode = 1: interpolate coord */ -static void interp_bilinear_grid(DMGridData *grid, int grid_size, float crn_x, float crn_y, int mode, float res[3]) +static void interp_bilinear_grid(CCGKey *key, CCGElem *grid, float crn_x, float crn_y, int mode, float res[3]) { int x0, x1, y0, y1; float u, v; float data[4][3]; x0 = (int) crn_x; - x1 = x0 >= (grid_size - 1) ? (grid_size - 1) : (x0 + 1); + x1 = x0 >= (key->grid_size - 1) ? (key->grid_size - 1) : (x0 + 1); y0 = (int) crn_y; - y1 = y0 >= (grid_size - 1) ? (grid_size - 1) : (y0 + 1); + y1 = y0 >= (key->grid_size - 1) ? (key->grid_size - 1) : (y0 + 1); u = crn_x - x0; v = crn_y - y0; if (mode == 0) { - copy_v3_v3(data[0], grid[y0 * grid_size + x0].no); - copy_v3_v3(data[1], grid[y0 * grid_size + x1].no); - copy_v3_v3(data[2], grid[y1 * grid_size + x1].no); - copy_v3_v3(data[3], grid[y1 * grid_size + x0].no); + copy_v3_v3(data[0], CCG_grid_elem_no(key, grid, x0, y0)); + copy_v3_v3(data[1], CCG_grid_elem_no(key, grid, x1, y0)); + copy_v3_v3(data[2], CCG_grid_elem_no(key, grid, x1, y1)); + copy_v3_v3(data[3], CCG_grid_elem_no(key, grid, x0, y1)); } else { - copy_v3_v3(data[0], grid[y0 * grid_size + x0].co); - copy_v3_v3(data[1], grid[y0 * grid_size + x1].co); - copy_v3_v3(data[2], grid[y1 * grid_size + x1].co); - copy_v3_v3(data[3], grid[y1 * grid_size + x0].co); + copy_v3_v3(data[0], CCG_grid_elem_co(key, grid, x0, y0)); + copy_v3_v3(data[1], CCG_grid_elem_co(key, grid, x1, y0)); + copy_v3_v3(data[2], CCG_grid_elem_co(key, grid, x1, y1)); + copy_v3_v3(data[3], CCG_grid_elem_co(key, grid, x0, y1)); } interp_bilinear_quad_data(data, u, v, res); @@ -509,7 +510,8 @@ static void interp_bilinear_grid(DMGridData *grid, int grid_size, float crn_x, f static void get_ccgdm_data(DerivedMesh *lodm, DerivedMesh *hidm, const int *origindex, const int lvl, const int face_index, const float u, const float v, float co[3], float n[3]) { MFace mface; - DMGridData **grid_data; + CCGElem **grid_data; + CCGKey key; float crn_x, crn_y; int grid_size, S, face_side; int *grid_offset, g_index; @@ -519,6 +521,7 @@ static void get_ccgdm_data(DerivedMesh *lodm, DerivedMesh *hidm, const int *orig grid_size = hidm->getGridSize(hidm); grid_data = hidm->getGridData(hidm); grid_offset = hidm->getGridOffset(hidm); + hidm->getGridKey(hidm, &key); face_side = (grid_size << 1) - 1; @@ -546,10 +549,10 @@ static void get_ccgdm_data(DerivedMesh *lodm, DerivedMesh *hidm, const int *orig CLAMP(crn_y, 0.0f, grid_size); if (n != NULL) - interp_bilinear_grid(grid_data[g_index + S], grid_size, crn_x, crn_y, 0, n); + interp_bilinear_grid(&key, grid_data[g_index + S], crn_x, crn_y, 0, n); if (co != NULL) - interp_bilinear_grid(grid_data[g_index + S], grid_size, crn_x, crn_y, 1, co); + interp_bilinear_grid(&key, grid_data[g_index + S], crn_x, crn_y, 1, co); } /* mode = 0: interpolate normals, @@ -619,7 +622,7 @@ static void *init_heights_data(MultiresBakeRender *bkr, Image *ima) if (bkr->simple) smd.subdivType = ME_SIMPLE_SUBSURF; - height_data->ssdm = subsurf_make_derived_from_derived(bkr->lores_dm, &smd, 0, NULL, 0, 0, 0); + height_data->ssdm = subsurf_make_derived_from_derived(bkr->lores_dm, &smd, NULL, 0); } height_data->origindex = lodm->getTessFaceDataArray(lodm, CD_ORIGINDEX); @@ -1020,7 +1023,8 @@ static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *l tmp_mmd.lvl = *lvl; tmp_mmd.sculptlvl = *lvl; - dm = multires_dm_create_from_derived(&tmp_mmd, 1, cddm, ob, 0); + dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, + MULTIRES_USE_LOCAL_MMD); cddm->release(cddm); } @@ -1040,7 +1044,8 @@ static DerivedMesh *multiresbake_create_hiresdm(Scene *scene, Object *ob, int *l tmp_mmd.lvl = mmd->totlvl; tmp_mmd.sculptlvl = mmd->totlvl; - dm = multires_dm_create_from_derived(&tmp_mmd, 1, cddm, ob, 0); + dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, + MULTIRES_USE_LOCAL_MMD); cddm->release(cddm); return dm; |