diff options
Diffstat (limited to 'source/blender/modifiers/intern/MOD_subsurf.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_subsurf.c | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c index 5a03da91b2d..23ab61821f4 100644 --- a/source/blender/modifiers/intern/MOD_subsurf.c +++ b/source/blender/modifiers/intern/MOD_subsurf.c @@ -38,10 +38,15 @@ #include "DNA_scene_types.h" #include "DNA_object_types.h" +#ifdef WITH_OPENSUBDIV +# include "DNA_userdef_types.h" +#endif + #include "BLI_utildefines.h" #include "BKE_cdderivedmesh.h" +#include "BKE_depsgraph.h" #include "BKE_scene.h" #include "BKE_subsurf.h" @@ -103,10 +108,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, #ifdef WITH_OPENSUBDIV const bool allow_gpu = (flag & MOD_APPLY_ALLOW_GPU) != 0; - const bool do_cddm_convert = useRenderParams; -#else - const bool do_cddm_convert = useRenderParams || !isFinalCalc; #endif + bool do_cddm_convert = useRenderParams || !isFinalCalc; if (useRenderParams) subsurf_flags |= SUBSURF_USE_RENDER_PARAMS; @@ -119,8 +122,21 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, /* TODO(sergey): Not entirely correct, modifiers on top of subsurf * could be disabled. */ - if (md->next == NULL && allow_gpu && do_cddm_convert == false) { - subsurf_flags |= SUBSURF_USE_GPU_BACKEND; + if (md->next == NULL && + allow_gpu && + do_cddm_convert == false && + smd->use_opensubdiv) + { + if (U.opensubdiv_compute_type == USER_OPENSUBDIV_COMPUTE_NONE) { + modifier_setError(md, "OpenSubdiv is disabled in User Preferences"); + } + else if ((DAG_get_eval_flags_for_object(md->scene, ob) & DAG_EVAL_NEED_CPU) == 0) { + subsurf_flags |= SUBSURF_USE_GPU_BACKEND; + do_cddm_convert = false; + } + else { + modifier_setError(md, "OpenSubdiv is disabled due to dependencies"); + } } #endif @@ -147,11 +163,8 @@ static DerivedMesh *applyModifierEM(ModifierData *md, Object *UNUSED(ob), SubsurfFlags ss_flags = (flag & MOD_APPLY_ORCO) ? 0 : (SUBSURF_FOR_EDIT_MODE | SUBSURF_IN_EDIT_MODE); #ifdef WITH_OPENSUBDIV const bool allow_gpu = (flag & MOD_APPLY_ALLOW_GPU) != 0; - /* TODO(sergey): Not entirely correct, modifiers on top of subsurf - * could be disabled. - */ - if (md->next == NULL && allow_gpu) { - ss_flags |= SUBSURF_USE_GPU_BACKEND; + if (md->next == NULL && allow_gpu && smd->use_opensubdiv) { + modifier_setError(md, "OpenSubdiv is not supported in edit mode"); } #endif @@ -160,6 +173,18 @@ static DerivedMesh *applyModifierEM(ModifierData *md, Object *UNUSED(ob), return result; } +static bool dependsOnNormals(ModifierData *md) +{ +#ifdef WITH_OPENSUBDIV + SubsurfModifierData *smd = (SubsurfModifierData *) md; + if (smd->use_opensubdiv && md->next == NULL) { + return true; + } +#else + UNUSED_VARS(md); +#endif + return false; +} ModifierTypeInfo modifierType_Subsurf = { /* name */ "Subsurf", @@ -186,7 +211,7 @@ ModifierTypeInfo modifierType_Subsurf = { /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, - /* dependsOnNormals */ NULL, + /* dependsOnNormals */ dependsOnNormals, /* foreachObjectLink */ NULL, /* foreachIDLink */ NULL, /* foreachTexLink */ NULL, |