[Bf-blender-cvs] [0c0de344aab] temp-fracture-modifier-2.8: make usage of opensubdiv in subsurf and multires optional, allow switching to legacy mode

Martin Felke noreply at git.blender.org
Sat Mar 2 19:40:21 CET 2019


Commit: 0c0de344aabd0fb2cfbe998d9b54ca2ac6a70120
Author: Martin Felke
Date:   Fri Feb 22 12:15:52 2019 +0100
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rB0c0de344aabd0fb2cfbe998d9b54ca2ac6a70120

make usage of opensubdiv in subsurf and multires optional, allow switching to legacy mode

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_multires.c
M	source/blender/modifiers/intern/MOD_subsurf.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index a2146ad4e13..810ef076200 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -643,13 +643,14 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
 
     def MULTIRES(self, layout, ob, md):
         layout.row().prop(md, "subdivision_type", expand=True)
+        layout.row().prop(md, "use_opensubdiv")
 
         split = layout.split()
         col = split.column()
         col.prop(md, "levels", text="Preview")
         col.prop(md, "sculpt_levels", text="Sculpt")
         col.prop(md, "render_levels", text="Render")
-        if hasattr(md, "quality"):
+        if hasattr(md, "quality") and md.use_opensubdiv:
             col.prop(md, "quality")
 
         col = split.column()
@@ -1005,6 +1006,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
     def SUBSURF(self, layout, ob, md):
         from bpy import context
         layout.row().prop(md, "subdivision_type", expand=True)
+        layout.row().prop(md, "use_opensubdiv")
 
         split = layout.split()
         col = split.column()
@@ -1028,7 +1030,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
             col.label(text="Subdivisions:")
             col.prop(md, "levels", text="View")
             col.prop(md, "render_levels", text="Render")
-            if hasattr(md, "quality"):
+            if hasattr(md, "quality") and md.use_opensubdiv:
                 col.prop(md, "quality")
 
         col = split.column()
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index d41282d9ef5..ac5bdee87d7 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -142,6 +142,7 @@ typedef enum {
 	eSubsurfModifierFlag_ControlEdges = (1 << 2),
 	/* DEPRECATED, ONLY USED FOR DO-VERSIONS */
 	eSubsurfModifierFlag_SubsurfUv_DEPRECATED    = (1 << 3),
+	eSubsurfModifierFlag_OpenSubdiv = (1 << 4),
 } SubsurfModifierFlag;
 
 typedef enum {
@@ -861,6 +862,8 @@ typedef enum {
 	eMultiresModifierFlag_ControlEdges = (1 << 0),
 	/* DEPRECATED, only used for versioning. */
 	eMultiresModifierFlag_PlainUv_DEPRECATED      = (1 << 1),
+	/* use legacy or (still slow) opensubdiv mode */
+	eMultiresModifierFlag_OpenSubdiv = (1 << 2),
 } MultiresModifierFlag;
 
 typedef struct FluidsimModifierData {
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 6af36969616..62f2920be7a 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -1286,6 +1286,11 @@ static void rna_def_modifier_subsurf(BlenderRNA *brna)
 	RNA_def_property_boolean_sdna(prop, NULL, "flags", eSubsurfModifierFlag_ControlEdges);
 	RNA_def_property_ui_text(prop, "Optimal Display", "Skip drawing/rendering of interior subdivided edges");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "use_opensubdiv", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flags", eSubsurfModifierFlag_OpenSubdiv);
+	RNA_def_property_ui_text(prop, "Use Opensubdiv", "Use (slower) OpenSubdiv instead of legacy subsurf code");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_generic_map_info(StructRNA *srna)
@@ -1431,6 +1436,11 @@ static void rna_def_modifier_multires(BlenderRNA *brna)
 	RNA_def_property_boolean_sdna(prop, NULL, "flags", eMultiresModifierFlag_ControlEdges);
 	RNA_def_property_ui_text(prop, "Optimal Display", "Skip drawing/rendering of interior subdivided edges");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "use_opensubdiv", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flags", eMultiresModifierFlag_OpenSubdiv);
+	RNA_def_property_ui_text(prop, "Use Opensubdiv", "Use (slower) OpenSubdiv instead of legacy multires code");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_lattice(BlenderRNA *brna)
diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c
index 73fa7aa0e0d..85958e09f85 100644
--- a/source/blender/modifiers/intern/MOD_multires.c
+++ b/source/blender/modifiers/intern/MOD_multires.c
@@ -55,6 +55,10 @@
 
 #include "MOD_modifiertypes.h"
 
+static Mesh *applyModifier_subdiv(ModifierData *md,
+                           const ModifierEvalContext *ctx,
+                           Mesh *mesh);
+
 static void initData(ModifierData *md)
 {
 	MultiresModifierData *mmd = (MultiresModifierData *)md;
@@ -67,7 +71,7 @@ static void initData(ModifierData *md)
 	mmd->quality = 3;
 }
 
-#ifndef WITH_OPENSUBDIV_MODIFIER
+//#ifndef WITH_OPENSUBDIV_MODIFIER
 
 static DerivedMesh *applyModifier_DM(
         ModifierData *md, const ModifierEvalContext *ctx,
@@ -146,9 +150,28 @@ static DerivedMesh *applyModifier_DM(
 	return result;
 }
 
-applyModifier_DM_wrapper(applyModifier, applyModifier_DM)
+applyModifier_DM_wrapper(applyModifier_legacy, applyModifier_DM)
+
+//#endif
 
+static Mesh *applyModifier(ModifierData *md,
+                                  const ModifierEvalContext *ctx,
+                                  Mesh *mesh)
+{
+	MultiresModifierData* mmd = (MultiresModifierData*)md;
+	if (mmd->flags & eMultiresModifierFlag_OpenSubdiv)
+	{
+#ifdef WITH_OPENSUBDIV_MODIFIER
+		return applyModifier_subdiv(md, ctx, mesh);
+#else
+		//silent fallback
+		return applyModifier_legacy(md, ctx, mesh);
 #endif
+	}
+	else {
+		return applyModifier_legacy(md, ctx, mesh);
+	}
+}
 
 #ifdef WITH_OPENSUBDIV_MODIFIER
 
diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c
index aa97eaa89c9..c8bf3a9d3d7 100644
--- a/source/blender/modifiers/intern/MOD_subsurf.c
+++ b/source/blender/modifiers/intern/MOD_subsurf.c
@@ -55,10 +55,15 @@
 
 #include "intern/CCGSubSurf.h"
 
+static Mesh *applyModifier_subdiv(ModifierData *md,
+                           const ModifierEvalContext *ctx,
+                           Mesh *mesh);
+
 static void initData(ModifierData *md)
 {
 	SubsurfModifierData *smd = (SubsurfModifierData *) md;
 
+	smd->subdivType = SUBSURF_TYPE_CATMULL_CLARK; //legacy is the default, since new opensubdiv impl sucks atm...
 	smd->levels = 1;
 	smd->renderLevels = 2;
 	smd->uv_smooth = SUBSURF_UV_SMOOTH_PRESERVE_CORNERS;
@@ -99,7 +104,7 @@ static bool isDisabled(const Scene *scene, ModifierData *md, bool useRenderParam
 	return get_render_subsurf_level(&scene->r, levels, useRenderParams != 0) == 0;
 }
 
-#ifndef WITH_OPENSUBDIV_MODIFIER
+//#ifndef WITH_OPENSUBDIV_MODIFIER
 
 static DerivedMesh *applyModifier_DM(
         ModifierData *md, const ModifierEvalContext *ctx,
@@ -135,9 +140,28 @@ static DerivedMesh *applyModifier_DM(
 	return result;
 }
 
-applyModifier_DM_wrapper(applyModifier, applyModifier_DM)
+applyModifier_DM_wrapper(applyModifier_legacy, applyModifier_DM)
 
+//#endif
+
+static Mesh *applyModifier(ModifierData *md,
+                                  const ModifierEvalContext *ctx,
+                                  Mesh *mesh)
+{
+	SubsurfModifierData* smd = (SubsurfModifierData*)md;
+	if (smd->flags & eSubsurfModifierFlag_OpenSubdiv)
+	{
+#ifdef WITH_OPENSUBDIV_MODIFIER
+		return applyModifier_subdiv(md, ctx, mesh);
+#else
+		//silent fallback
+		return applyModifier_legacy(md, ctx, mesh);
 #endif
+	}
+	else {
+		return applyModifier_legacy(md, ctx, mesh);
+	}
+}
 
 #ifdef WITH_OPENSUBDIV_MODIFIER
 static int subdiv_levels_for_modifier_get(const SubsurfModifierData *smd,
@@ -275,11 +299,11 @@ ModifierTypeInfo modifierType_Subsurf = {
 	/* deformMatrices */    NULL,
 	/* deformVertsEM */     NULL,
 	/* deformMatricesEM */  NULL,
-#ifdef WITH_OPENSUBDIV_MODIFIER
-	/* applyModifier */     applyModifier_subdiv,
-#else
+//#ifdef WITH_OPENSUBDIV_MODIFIER
+//	/* applyModifier */     applyModifier_subdiv,
+//#else
 	/* applyModifier */     applyModifier,
-#endif
+//#endif
 
 	/* initData */          initData,
 	/* requiredDataMask */  NULL,



More information about the Bf-blender-cvs mailing list