Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-11-02 12:56:20 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-11-02 13:00:51 +0300
commitf2873b3ce5403d4df48750f388b4c749bc8e3d7f (patch)
tree8a03a1cd3fe85d532b631f57f57d05d31ce4ce07 /source/blender/blenkernel
parentac8d7873278c47e8e282b7f83888108e2720a451 (diff)
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).
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/CMakeLists.txt3
-rw-r--r--source/blender/blenkernel/intern/multires.c123
2 files changed, 4 insertions, 122 deletions
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)