[Bf-blender-cvs] [78597974dc9] derived: Cleanup: mesh_calc_modifiers refactoring.
Brecht Van Lommel
noreply at git.blender.org
Thu Mar 28 02:28:53 CET 2019
Commit: 78597974dc989b75b1b4eccc546c60590980e00c
Author: Brecht Van Lommel
Date: Wed Mar 27 23:52:41 2019 +0100
Branches: derived
https://developer.blender.org/rB78597974dc989b75b1b4eccc546c60590980e00c
Cleanup: mesh_calc_modifiers refactoring.
===================================================================
M source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 33450aeb2d4..2496ccb047e 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -991,7 +991,99 @@ static void mesh_copy_autosmooth(Mesh *me, Mesh *me_orig)
}
}
-static void mesh_calc_modifiers(
+/* Test if modifier needs to be disabled in sculpt mode. */
+static bool mesh_modifier_sculpt_enabled(
+ Scene *scene,
+ Object *ob,
+ ModifierData *md,
+ const ModifierTypeInfo *mti,
+ bool multires_applied)
+{
+ const bool sculpt_mode = (ob->mode & OB_MODE_SCULPT) && ob->sculpt;
+ if (!sculpt_mode) {
+ return true;
+ }
+
+ MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
+ const bool has_multires = (mmd && mmd->sculptlvl != 0);
+ const bool sculpt_dyntopo = ob->sculpt->bm;
+
+ if (!has_multires || multires_applied || sculpt_dyntopo)
+ {
+ if (md->type == eModifierType_Multires && ((MultiresModifierData *)md)->sculptlvl == 0) {
+ /* If multires is on level 0 skip it silently without warning message. */
+ if (!sculpt_dyntopo) {
+ return false;
+ }
+ }
+
+ bool unsupported = sculpt_dyntopo || multires_applied;
+
+ if (scene->toolsettings->sculpt->flags & SCULPT_ONLY_DEFORM)
+ unsupported |= (mti->type != eModifierTypeType_OnlyDeform);
+
+ if (unsupported) {
+ if (sculpt_dyntopo)
+ modifier_setError(md, "Not supported in dyntopo");
+ else
+ modifier_setError(md, "Not supported in sculpt mode");
+
+ return false;
+ }
+ else {
+ modifier_setError(md, "Hide, Mask and optimized display disabled");
+ }
+ }
+
+ return true;
+}
+
+static void mesh_modifiers_add_normals(
+ const Object *ob,
+ const CustomData_MeshMasks *dataMask,
+ Mesh *mesh_final)
+{
+ const bool do_loop_normals = ((((Mesh *)ob->data)->flag & ME_AUTOSMOOTH) != 0 ||
+ (dataMask->lmask & CD_MASK_NORMAL) != 0);
+ /* Some modifiers may need this info from their target (other) object, simpler to generate it here as well.
+ * Note that they will always be generated when no loop normals are comptuted,
+ * since they are needed by drawing code. */
+ const bool do_poly_normals = ((dataMask->pmask & CD_MASK_NORMAL) != 0);
+
+ if (do_loop_normals) {
+ /* In case we also need poly normals, add the layer here, then BKE_mesh_calc_normals_split() will fill it. */
+ if (do_poly_normals) {
+ if (!CustomData_has_layer(&mesh_final->pdata, CD_NORMAL)) {
+ CustomData_add_layer(&mesh_final->pdata, CD_NORMAL, CD_CALLOC, NULL, mesh_final->totpoly);
+ }
+ }
+ /* Compute loop normals (note: will compute poly and vert normals as well, if needed!) */
+ BKE_mesh_calc_normals_split(mesh_final);
+ BKE_mesh_tessface_clear(mesh_final);
+ }
+ else {
+ /* without this, drawing ngon tri's faces will show ugly tessellated face
+ * normals and will also have to calculate normals on the fly, try avoid
+ * this where possible since calculating polygon normals isn't fast,
+ * note that this isn't a problem for subsurf (only quads) or editmode
+ * which deals with drawing differently.
+ *
+ * Only calc vertex normals if they are flagged as dirty.
+ * If using loop normals, poly nors have already been computed.
+ */
+ /* TODO: if (sculpt_dyntopo == false)*/ {
+ BKE_mesh_ensure_normals_for_display(mesh_final);
+ }
+ }
+
+ /* Some modifiers, like datatransfer, may generate those data as temp layer, we do not want to keep them,
+ * as they are used by display code when available (i.e. even if autosmooth is disabled). */
+ if (!do_loop_normals && CustomData_has_layer(&mesh_final->ldata, CD_NORMAL)) {
+ CustomData_free_layers(&mesh_final->ldata, CD_NORMAL, mesh_final->totloop);
+ }
+}
+
+static void mesh_modifiers_eval(
struct Depsgraph *depsgraph,
Scene *scene, Object *ob,
int useDeform,
@@ -1003,38 +1095,22 @@ static void mesh_calc_modifiers(
Mesh **r_deform,
Mesh **r_final)
{
- ModifierData *firstmd, *md, *previewmd = NULL;
- CDMaskLink *datamasks, *curr;
+ BLI_assert((((Mesh *)ob->data)->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0);
+
/* XXX Always copying POLYINDEX, else tessellated data are no more valid! */
- CustomData_MeshMasks mask, nextmask, previewmask = {0}, append_mask = CD_MASK_BAREMESH_ORIGINDEX;
+ CustomData_MeshMasks append_mask = CD_MASK_BAREMESH_ORIGINDEX;
- float (*deformedVerts)[3] = NULL;
int numVerts = ((Mesh *)ob->data)->totvert;
const bool useRenderParams = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
const int required_mode = useRenderParams ? eModifierMode_Render : eModifierMode_Realtime;
- bool isPrevDeform = false;
- MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
- const bool has_multires = (mmd && mmd->sculptlvl != 0);
bool multires_applied = false;
- const bool sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->sculpt && !useRenderParams;
- const bool sculpt_dyntopo = (sculpt_mode && ob->sculpt->bm) && !useRenderParams;
/* Generic preview only in object mode! */
const bool do_mod_mcol = (ob->mode == OB_MODE_OBJECT);
- const bool do_loop_normals = ((((Mesh *)ob->data)->flag & ME_AUTOSMOOTH) != 0 ||
- (dataMask->lmask & CD_MASK_NORMAL) != 0);
- /* Some modifiers may need this info from their target (other) object, simpler to generate it here as well.
- * Note that they will always be generated when no loop normals are comptuted,
- * since they are needed by drawing code. */
- const bool do_poly_normals = ((dataMask->pmask & CD_MASK_NORMAL) != 0);
-
- VirtualModifierData virtualModifierData;
ModifierApplyFlag app_flags = useRenderParams ? MOD_APPLY_RENDER : 0;
ModifierApplyFlag deform_app_flags = app_flags;
- BLI_assert((((Mesh *)ob->data)->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0);
-
if (useCache)
app_flags |= MOD_APPLY_USECACHE;
if (useDeform)
@@ -1046,10 +1122,14 @@ static void mesh_calc_modifiers(
const ModifierEvalContext mectx_apply = {depsgraph, ob, app_flags};
const ModifierEvalContext mectx_orco = {depsgraph, ob, (app_flags & ~MOD_APPLY_USECACHE) | MOD_APPLY_ORCO};
- md = firstmd = modifiers_getVirtualModifierList(ob, &virtualModifierData);
-
modifiers_clearErrors(ob);
+ VirtualModifierData virtualModifierData;
+ ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
+ ModifierData *firstmd = md;
+
+ ModifierData *previewmd = NULL;
+ CustomData_MeshMasks previewmask = {0};
if (do_mod_mcol) {
/* Find the last active modifier generating a preview, or NULL if none. */
/* XXX Currently, DPaint modifier just ignores this.
@@ -1058,8 +1138,8 @@ static void mesh_calc_modifiers(
previewmd = modifiers_getLastPreview(scene, md, required_mode);
}
- datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, previewmd, &previewmask);
- curr = datamasks;
+ CDMaskLink *datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, previewmd, &previewmask);
+ CDMaskLink *curr = datamasks;
if (r_deform) {
*r_deform = NULL;
@@ -1070,6 +1150,8 @@ static void mesh_calc_modifiers(
* e.g. access to updated normals. See T62633 for an example. */
Mesh *me = NULL;
+ float (*deformedVerts)[3] = NULL;
+ bool isPrevDeform = false;
if (useDeform) {
/* Apply all leading deforming modifiers */
for (; md; md = md->next, curr = curr->next) {
@@ -1079,11 +1161,17 @@ static void mesh_calc_modifiers(
continue;
}
+ if (!useRenderParams) {
+ if (!mesh_modifier_sculpt_enabled(scene, ob, md, mti, multires_applied)) {
+ continue;
+ }
+ }
+
if (useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) {
continue;
}
- if (mti->type == eModifierTypeType_OnlyDeform && !sculpt_dyntopo) {
+ if (mti->type == eModifierTypeType_OnlyDeform) {
if (!deformedVerts) {
deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts);
}
@@ -1121,11 +1209,6 @@ static void mesh_calc_modifiers(
}
}
}
- else {
- /* default behavior for meshes */
- deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts);
- }
-
/* Now apply all remaining modifiers. If useDeform is off then skip
* OnlyDeform ones.
@@ -1149,36 +1232,10 @@ static void mesh_calc_modifiers(
continue;
}
- if (sculpt_mode &&
- (!has_multires || multires_applied || sculpt_dyntopo))
- {
- bool unsupported = false;
-
- if (md->type == eModifierType_Multires && ((MultiresModifierData *)md)->sculptlvl == 0) {
- /* If multires is on level 0 skip it silently without warning message. */
- if (!sculpt_dyntopo) {
- continue;
- }
- }
-
- if (sculpt_dyntopo && !useRenderParams)
- unsupported = true;
-
- if (scene->toolsettings->sculpt->flags & SCULPT_ONLY_DEFORM)
- unsupported |= (mti->type != eModifierTypeType_OnlyDeform);
-
- unsupported |= multires_applied;
-
- if (unsupported) {
- if (sculpt_dyntopo)
- modifier_setError(md, "Not supported in dyntopo");
- else
- modifier_setError(md, "Not supported in sculpt mode");
+ if (!useRenderParams) {
+ if (!mesh_modifier_sculpt_enabled(scene, ob, md, mti, multires_applied)) {
continue;
}
- else {
- modifier_setError(md, "Hide, Mask and optimized display disabled");
- }
}
if (need_mapping && !modifier_supportsMapping(md)) {
@@ -1190,6 +1247,7 @@ static void mesh_calc_modifiers(
}
/* add an orco layer if needed by this modifier */
+ CustomData_MeshMasks mask;
memset(&mask, 0, sizeof(mask));
if (mti->requiredDataMask) {
mti->requiredDataMask(ob, md, &mask);
@@ -1232,6 +1290,7 @@ static void mesh_calc_modifiers(
}
else {
/* determine which data layers are needed by following modifiers */
+ CustomData_MeshMasks nextmask;
if (curr->next)
nextmask = curr->next->mask;
else
@@ -1390,7 +1449,7 @@ static void mesh_calc_modifiers(
if ((index != -1) && (BLI_findindex(&ob->modifiers, md) >= index))
break;
- if (sculpt_mode && md->type == eModifierType_Multires) {
+ if (md->type == eModifierType_Multires) {
multires_applied = true;
}
}
@@ -1425,39 +1484,6 @@ static void mesh_calc_modifiers(
add_orco_mesh(ob, NULL, *r_de
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list