Merge branch 'master' into blender2.8
[blender.git] / source / blender / modifiers / intern / MOD_meshsequencecache.c
index 5d623295edf843e1b3417dcd8be666294494f369..5c2f1aba8e16e9fcdeb1e5c1265fa96e90759925 100644 (file)
  */
 
 #include "DNA_cachefile_types.h"
  */
 
 #include "DNA_cachefile_types.h"
+#include "DNA_mesh_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 
 #include "BKE_cachefile.h"
 #include "BKE_DerivedMesh.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 
 #include "BKE_cachefile.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_cdderivedmesh.h"
 #include "BKE_global.h"
 #include "BKE_library.h"
 #include "BKE_library_query.h"
 #include "BKE_global.h"
 #include "BKE_library.h"
 #include "BKE_library_query.h"
@@ -94,11 +96,15 @@ static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams))
 
 static DerivedMesh *applyModifier(ModifierData *md, struct EvaluationContext *UNUSED(eval_ctx),
                                   Object *ob, DerivedMesh *dm,
 
 static DerivedMesh *applyModifier(ModifierData *md, struct EvaluationContext *UNUSED(eval_ctx),
                                   Object *ob, DerivedMesh *dm,
-                                  ModifierApplyFlag flag)
+                                  ModifierApplyFlag UNUSED(flag))
 {
 #ifdef WITH_ALEMBIC
        MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *) md;
 
 {
 #ifdef WITH_ALEMBIC
        MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *) md;
 
+       /* Only used to check wehther we are operating on org data or not... */
+       Mesh *me = (ob->type == OB_MESH) ? ob->data : NULL;
+       DerivedMesh *org_dm = dm;
+
        Scene *scene = md->scene;
        const float frame = BKE_scene_frame_get(scene);
        const float time = BKE_cachefile_time_offset(mcmd->cache_file, frame, FPS);
        Scene *scene = md->scene;
        const float frame = BKE_scene_frame_get(scene);
        const float time = BKE_cachefile_time_offset(mcmd->cache_file, frame, FPS);
@@ -120,6 +126,16 @@ static DerivedMesh *applyModifier(ModifierData *md, struct EvaluationContext *UN
                }
        }
 
                }
        }
 
+       if (me != NULL) {
+               MVert *mvert = dm->getVertArray(dm);
+               MEdge *medge = dm->getEdgeArray(dm);
+               MPoly *mpoly = dm->getPolyArray(dm);
+               if ((me->mvert == mvert) || (me->medge == medge) || (me->mpoly == mpoly)) {
+                       /* We need to duplicate data here, otherwise we'll modify org mesh, see T51701. */
+                       dm = CDDM_copy(dm);
+               }
+       }
+
        DerivedMesh *result = ABC_read_mesh(mcmd->reader,
                                            ob,
                                            dm,
        DerivedMesh *result = ABC_read_mesh(mcmd->reader,
                                            ob,
                                            dm,
@@ -131,11 +147,15 @@ static DerivedMesh *applyModifier(ModifierData *md, struct EvaluationContext *UN
                modifier_setError(md, "%s", err_str);
        }
 
                modifier_setError(md, "%s", err_str);
        }
 
+       if (!ELEM(result, NULL, dm) && (dm != org_dm)) {
+               dm->release(dm);
+               dm = org_dm;
+       }
+
        return result ? result : dm;
        return result ? result : dm;
-       UNUSED_VARS(flag);
 #else
        return dm;
 #else
        return dm;
-       UNUSED_VARS(md, ob, flag);
+       UNUSED_VARS(md, ob);
 #endif
 }
 
 #endif
 }