Merge branch 'master' into blender2.8
[blender.git] / source / blender / modifiers / intern / MOD_subsurf.c
index d620fec8ede688759a7cf0ea0f1d747767b45f36..0d0d70ec33dc79b58fa8739f4f4644b105f3c354 100644 (file)
@@ -65,17 +65,16 @@ static void initData(ModifierData *md)
        smd->flags |= eSubsurfModifierFlag_SubsurfUv;
 }
 
-static void copyData(ModifierData *md, ModifierData *target)
+static void copyData(const ModifierData *md, ModifierData *target)
 {
 #if 0
-       SubsurfModifierData *smd = (SubsurfModifierData *) md;
+       const SubsurfModifierData *smd = (const SubsurfModifierData *) md;
 #endif
        SubsurfModifierData *tsmd = (SubsurfModifierData *) target;
 
        modifier_copyData_generic(md, target);
 
        tsmd->emCache = tsmd->mCache = NULL;
-
 }
 
 static void freeData(ModifierData *md)
@@ -84,9 +83,11 @@ static void freeData(ModifierData *md)
 
        if (smd->mCache) {
                ccgSubSurf_free(smd->mCache);
+               smd->mCache = NULL;
        }
        if (smd->emCache) {
                ccgSubSurf_free(smd->emCache);
+               smd->emCache = NULL;
        }
 }
 
@@ -98,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, Depsgraph *depsgraph,
-                                  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;
 
@@ -117,7 +117,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Depsgraph *depsgraph,
                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
@@ -132,10 +132,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Depsgraph *depsgraph,
                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 ((DEG_get_eval_flags_for_id(depsgraph, &ob->id) & 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;
                }
@@ -156,24 +156,22 @@ static DerivedMesh *applyModifier(ModifierData *md, Depsgraph *depsgraph,
 
 #ifndef WITH_OPESUBDIV
        (void) do_cddm_convert;
-       UNUSED_VARS(depsgraph);
 #endif
 
        return result;
 }
 
 static DerivedMesh *applyModifierEM(
-        ModifierData *md, Depsgraph *UNUSED(depsgraph),
-        Object *UNUSED(ob), struct BMEditMesh *UNUSED(editData),
-        DerivedMesh *derivedData,
-        ModifierApplyFlag flag)
+        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");
        }
@@ -209,12 +207,21 @@ 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,