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:
Diffstat (limited to 'source/blender/modifiers/intern/MOD_subsurf.c')
-rw-r--r--source/blender/modifiers/intern/MOD_subsurf.c47
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,