From f2873b3ce5403d4df48750f388b4c749bc8e3d7f Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 2 Nov 2018 10:56:20 +0100 Subject: Multires: Prevent crash when joining two multires objects This only works thing around, just so we can unlock production here. Joining objects of a different scale will not yet work correctly. Proper fix is coming later (the code needs to be ported to new Subdiv API). --- source/blender/blenkernel/CMakeLists.txt | 3 + source/blender/blenkernel/intern/multires.c | 123 +--------------------------- 2 files changed, 4 insertions(+), 122 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index f2e2c0406af..b18b6f6d63d 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -545,6 +545,9 @@ if(WITH_OPENSUBDIV) list(APPEND INC_SYS ${OPENSUBDIV_INCLUDE_DIRS} ) + if(WITH_OPENSUBDIV_MODIFIER) + add_definitions(-DWITH_OPENSUBDIV_MODIFIER) + endif() endif() if(WITH_OPENVDB) diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 2aa3b3f79a3..4b5b87a3606 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -2125,130 +2125,9 @@ static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst) } } -static void multires_apply_smat_cb( - void *__restrict userdata, - const int pidx, - const ParallelRangeTLS *__restrict UNUSED(tls)) -{ - MultiresThreadedData *tdata = userdata; - - CCGElem **gridData = tdata->gridData; - CCGElem **subGridData = tdata->subGridData; - CCGKey *dm_key = tdata->key; - CCGKey *subdm_key = tdata->sub_key; - MPoly *mpoly = tdata->mpoly; - MDisps *mdisps = tdata->mdisps; - int *gridOffset = tdata->gridOffset; - int gridSize = tdata->gridSize; - int dGridSize = tdata->dGridSize; - int dSkip = tdata->dSkip; - float (*smat)[3] = tdata->smat; - - const int numVerts = mpoly[pidx].totloop; - MDisps *mdisp = &mdisps[mpoly[pidx].loopstart]; - int S, x, y, gIndex = gridOffset[pidx]; - - for (S = 0; S < numVerts; ++S, ++gIndex, mdisp++) { - CCGElem *grid = gridData[gIndex]; - CCGElem *subgrid = subGridData[gIndex]; - float (*dispgrid)[3] = mdisp->disps; - - for (y = 0; y < gridSize; y++) { - for (x = 0; x < gridSize; x++) { - float *co = CCG_grid_elem_co(dm_key, grid, x, y); - float *sco = CCG_grid_elem_co(subdm_key, subgrid, x, y); - float *data = dispgrid[dGridSize * y * dSkip + x * dSkip]; - float mat[3][3], disp[3]; - - /* construct tangent space matrix */ - grid_tangent_matrix(mat, dm_key, x, y, grid); - - /* scale subgrid coord and calculate displacement */ - mul_m3_v3(smat, sco); - sub_v3_v3v3(disp, sco, co); - - /* convert difference to tangent space */ - invert_m3(mat); - mul_v3_m3v3(data, mat, disp); - } - } - } -} - static void multires_apply_smat(struct Depsgraph *depsgraph, Scene *scene, Object *ob, float smat[3][3]) { - DerivedMesh *dm = NULL, *cddm = NULL, *subdm = NULL; - CCGElem **gridData, **subGridData; - CCGKey dm_key, subdm_key; - Mesh *me = (Mesh *)ob->data; - MPoly *mpoly = me->mpoly; - /* MLoop *mloop = me->mloop; */ /* UNUSED */ - MDisps *mdisps; - int *gridOffset; - int i, /*numGrids, */ gridSize, dGridSize, dSkip, totvert; - float (*vertCos)[3] = NULL; - MultiresModifierData *mmd = get_multires_modifier(scene, ob, 1); - MultiresModifierData high_mmd; - - CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totloop); - mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS); - - if (!mdisps || !mmd || !mmd->totlvl) return; - - /* we need derived mesh created from highest resolution */ - high_mmd = *mmd; - high_mmd.lvl = high_mmd.totlvl; - - /* unscaled multires with applied displacement */ - subdm = get_multires_dm(depsgraph, scene, &high_mmd, ob); - - /* prepare scaled CDDM to create ccgDN */ - cddm = mesh_get_derived_deform(depsgraph, scene, ob, CD_MASK_BAREMESH); - - totvert = cddm->getNumVerts(cddm); - vertCos = MEM_malloc_arrayN(totvert, sizeof(*vertCos), "multiresScale vertCos"); - cddm->getVertCos(cddm, vertCos); - for (i = 0; i < totvert; i++) - mul_m3_v3(smat, vertCos[i]); - CDDM_apply_vert_coords(cddm, vertCos); - MEM_freeN(vertCos); - - /* scaled ccgDM for tangent space of object with applied scale */ - dm = subsurf_dm_create_local(scene, ob, cddm, high_mmd.totlvl, high_mmd.simple, 0, mmd->uv_smooth == SUBSURF_UV_SMOOTH_NONE, 0, false); - cddm->release(cddm); - - gridSize = dm->getGridSize(dm); - gridData = dm->getGridData(dm); - gridOffset = dm->getGridOffset(dm); - dm->getGridKey(dm, &dm_key); - subGridData = subdm->getGridData(subdm); - subdm->getGridKey(subdm, &subdm_key); - - dGridSize = multires_side_tot[high_mmd.totlvl]; - dSkip = (dGridSize - 1) / (gridSize - 1); - - ParallelRangeSettings settings; - BLI_parallel_range_settings_defaults(&settings); - settings.min_iter_per_thread = CCG_TASK_LIMIT; - - MultiresThreadedData data = { - .gridData = gridData, - .subGridData = subGridData, - .key = &dm_key, - .sub_key = &subdm_key, - .mpoly = mpoly, - .mdisps = mdisps, - .gridOffset = gridOffset, - .gridSize = gridSize, - .dGridSize = dGridSize, - .dSkip = dSkip, - .smat = smat - }; - - BLI_task_parallel_range(0, me->totpoly, &data, multires_apply_smat_cb, &settings); - - dm->release(dm); - subdm->release(subdm); + UNUSED_VARS(depsgraph, scene, ob, smat); } int multires_mdisp_corners(MDisps *s) -- cgit v1.2.3