Merge branch 'master' into blender2.8
[blender.git] / source / blender / modifiers / intern / MOD_subsurf.c
index 4cef4ac8a53721cb8170b778f913f0ccb1abb714..0d0d70ec33dc79b58fa8739f4f4644b105f3c354 100644 (file)
 
 
 #include "BKE_cdderivedmesh.h"
-#include "BKE_depsgraph.h"
 #include "BKE_scene.h"
 #include "BKE_subsurf.h"
 
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
+
 #include "MOD_modifiertypes.h"
 
 #include "intern/CCGSubSurf.h"
@@ -97,18 +99,17 @@ static bool isDisabled(ModifierData *md, int useRenderParams)
        return get_render_subsurf_level(&md->scene->r, levels, useRenderParams != 0) == 0;
 }
 
-static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
-                                  DerivedMesh *derivedData,
-                                  ModifierApplyFlag flag)
+static DerivedMesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx,
+                                  DerivedMesh *derivedData)
 {
        SubsurfModifierData *smd = (SubsurfModifierData *) md;
        SubsurfFlags subsurf_flags = 0;
        DerivedMesh *result;
-       const bool useRenderParams = (flag & MOD_APPLY_RENDER) != 0;
-       const bool isFinalCalc = (flag & MOD_APPLY_USECACHE) != 0;
+       const bool useRenderParams = (ctx->flag & MOD_APPLY_RENDER) != 0;
+       const bool isFinalCalc = (ctx->flag & MOD_APPLY_USECACHE) != 0;
 
 #ifdef WITH_OPENSUBDIV
-       const bool allow_gpu = (flag & MOD_APPLY_ALLOW_GPU) != 0;
+       const bool allow_gpu = (ctx->flag & MOD_APPLY_ALLOW_GPU) != 0;
 #endif
        bool do_cddm_convert = useRenderParams || !isFinalCalc;
 
@@ -116,7 +117,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
                subsurf_flags |= SUBSURF_USE_RENDER_PARAMS;
        if (isFinalCalc)
                subsurf_flags |= SUBSURF_IS_FINAL_CALC;
-       if (ob->mode & OB_MODE_EDIT)
+       if (ctx->object->mode & OB_MODE_EDIT)
                subsurf_flags |= SUBSURF_IN_EDIT_MODE;
 
 #ifdef WITH_OPENSUBDIV
@@ -131,10 +132,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
                if (U.opensubdiv_compute_type == USER_OPENSUBDIV_COMPUTE_NONE) {
                        modifier_setError(md, "OpenSubdiv is disabled in User Preferences");
                }
-               else if ((ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) != 0) {
+               else if ((ctx->object->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) != 0) {
                        modifier_setError(md, "OpenSubdiv is not supported in paint modes");
                }
-               else if ((DAG_get_eval_flags_for_object(md->scene, ob) & DAG_EVAL_NEED_CPU) == 0) {
+               else if ((DEG_get_eval_flags_for_id(ctx->depsgraph, &ctx->object->id) & DAG_EVAL_NEED_CPU) == 0) {
                        subsurf_flags |= SUBSURF_USE_GPU_BACKEND;
                        do_cddm_convert = false;
                }
@@ -147,26 +148,30 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
        result = subsurf_make_derived_from_derived(derivedData, smd, NULL, subsurf_flags);
        result->cd_flag = derivedData->cd_flag;
 
-       if (do_cddm_convert) {
+       {
                DerivedMesh *cddm = CDDM_copy(result);
                result->release(result);
                result = cddm;
        }
 
+#ifndef WITH_OPESUBDIV
+       (void) do_cddm_convert;
+#endif
+
        return result;
 }
 
-static DerivedMesh *applyModifierEM(ModifierData *md, Object *UNUSED(ob),
-                                    struct BMEditMesh *UNUSED(editData),
-                                    DerivedMesh *derivedData,
-                                    ModifierApplyFlag flag)
+static DerivedMesh *applyModifierEM(
+        ModifierData *md, const ModifierEvalContext *ctx,
+        struct BMEditMesh *UNUSED(editData),
+        DerivedMesh *derivedData)
 {
        SubsurfModifierData *smd = (SubsurfModifierData *) md;
        DerivedMesh *result;
        /* 'orco' using editmode flags would cause cache to be used twice in editbmesh_calc_modifiers */
-       SubsurfFlags ss_flags = (flag & MOD_APPLY_ORCO) ? 0 : (SUBSURF_FOR_EDIT_MODE | SUBSURF_IN_EDIT_MODE);
+       SubsurfFlags ss_flags = (ctx->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;
+       const bool allow_gpu = (ctx->flag & MOD_APPLY_ALLOW_GPU) != 0;
        if (md->next == NULL && allow_gpu && smd->use_opensubdiv) {
                modifier_setError(md, "OpenSubdiv is not supported in edit mode");
        }
@@ -202,17 +207,25 @@ ModifierTypeInfo modifierType_Subsurf = {
                                eModifierTypeFlag_AcceptsCVs,
 
        /* copyData */          copyData,
+
+       /* deformVerts_DM */    NULL,
+       /* deformMatrices_DM */ NULL,
+       /* deformVertsEM_DM */  NULL,
+       /* deformMatricesEM_DM*/NULL,
+       /* applyModifier_DM */  applyModifier,
+       /* applyModifierEM_DM */applyModifierEM,
+
        /* deformVerts */       NULL,
        /* deformMatrices */    NULL,
        /* deformVertsEM */     NULL,
        /* deformMatricesEM */  NULL,
-       /* applyModifier */     applyModifier,
-       /* applyModifierEM */   applyModifierEM,
+       /* applyModifier */     NULL,
+       /* applyModifierEM */   NULL,
+
        /* initData */          initData,
        /* requiredDataMask */  NULL,
        /* freeData */          freeData,
        /* isDisabled */        isDisabled,
-       /* updateDepgraph */    NULL,
        /* updateDepsgraph */   NULL,
        /* dependsOnTime */     NULL,
        /* dependsOnNormals */  dependsOnNormals,