[Bf-blender-cvs] [f2873b3ce54] blender2.8: Multires: Prevent crash when joining two multires objects

Sergey Sharybin noreply at git.blender.org
Fri Nov 2 11:01:12 CET 2018


Commit: f2873b3ce5403d4df48750f388b4c749bc8e3d7f
Author: Sergey Sharybin
Date:   Fri Nov 2 10:56:20 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBf2873b3ce5403d4df48750f388b4c749bc8e3d7f

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).

===================================================================

M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/multires.c

===================================================================

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)



More information about the Bf-blender-cvs mailing list