Commit: 34b226cd4f904cd681bf658d981a9893ba99b6a3
Author: Kévin Dietrich
Date:   Wed Jun 1 14:23:04 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB34b226cd4f904cd681bf658d981a9893ba99b6a3

Avoid creating a new DerivedMesh if the vertex count does not change.

===================================================================

M       source/blender/alembic/ABC_alembic.h
M       source/blender/alembic/intern/alembic_capi.cc
M       source/blender/modifiers/intern/MOD_meshsequencecache.c

===================================================================

diff --git a/source/blender/alembic/ABC_alembic.h 
b/source/blender/alembic/ABC_alembic.h
index a9b4299..668fa7e 100644
--- a/source/blender/alembic/ABC_alembic.h
+++ b/source/blender/alembic/ABC_alembic.h
@@ -63,7 +63,7 @@ int ABC_check_subobject_valid(const char *filepath, const 
char *object_path);
 
 void ABC_get_transform(struct Object *ob, const char *filepath, const char 
*object_path, float r_mat[4][4], float time);
 
-struct DerivedMesh *ABC_read_mesh(const char *filepath, const char 
*object_path, const float time);
+struct DerivedMesh *ABC_read_mesh(struct DerivedMesh *dm, const char 
*filepath, const char *object_path, const float time);
 
 void ABC_read_vertex_cache(const char *filepath, const char *object_path, 
const float time,
                            float (*vertexCos)[3], int max_verts);
diff --git a/source/blender/alembic/intern/alembic_capi.cc 
b/source/blender/alembic/intern/alembic_capi.cc
index 5b16b22..7ec4a20 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -654,7 +654,7 @@ static void read_faces_cb(void *userdata, const int x)
 }
 #endif
 
-static DerivedMesh *read_mesh_sample(const IObject &iobject, const float time)
+static DerivedMesh *read_mesh_sample(DerivedMesh *dm, const IObject &iobject, 
const float time)
 {
        IPolyMesh mesh(iobject, kWrapExisting);
        IPolyMeshSchema schema = mesh.getSchema();
@@ -665,13 +665,9 @@ static DerivedMesh *read_mesh_sample(const IObject 
&iobject, const float time)
        const Alembic::Abc::Int32ArraySamplePtr &face_indices = 
sample.getFaceIndices();
        const Alembic::Abc::Int32ArraySamplePtr &face_counts = 
sample.getFaceCounts();
 
-       const size_t num_verts = positions->size();
-       const size_t num_edges = 0;
-       const size_t num_faces = 0;
-       const size_t num_loops = face_indices->size();
-       const size_t num_polys = face_counts->size();
-
-       DerivedMesh *dm = CDDM_new(num_verts, num_edges, num_faces, num_loops, 
num_polys);
+       if (dm->getNumVerts(dm) != positions->size()) {
+               dm = CDDM_new(positions->size(), 0, 0, face_indices->size(), 
face_counts->size());
+       }
 
        MVert *mverts = dm->getVertArray(dm);
        MPoly *mpolys = dm->getPolyArray(dm);
@@ -703,7 +699,7 @@ using Alembic::Abc::ObjectHeader;
 using Alembic::AbcGeom::IPointsSchema;
 using Alembic::AbcGeom::ICurvesSchema;
 
-static DerivedMesh *read_points_sample(const IObject &iobject, const float 
time)
+static DerivedMesh *read_points_sample(DerivedMesh *dm, const IObject 
&iobject, const float time)
 {
        IPoints points(iobject, kWrapExisting);
        IPointsSchema schema = points.getSchema();
@@ -712,8 +708,9 @@ static DerivedMesh *read_points_sample(const IObject 
&iobject, const float time)
 
        const P3fArraySamplePtr &positions = sample.getPositions();
 
-       const size_t num_verts = positions->size();
-       DerivedMesh *dm = CDDM_new(num_verts, 0, 0, 0, 0);
+       if (dm->getNumVerts(dm) != positions->size()) {
+               dm = CDDM_new(positions->size(), 0, 0, 0, 0);
+       }
 
        MVert *mverts = dm->getVertArray(dm);
 
@@ -742,7 +739,7 @@ void read_curves_sample(float (*vertexCos)[3], int 
max_verts, const IObject &iob
        }
 }
 
-DerivedMesh *ABC_read_mesh(const char *filepath, const char *object_path, 
const float time)
+DerivedMesh *ABC_read_mesh(DerivedMesh *dm, const char *filepath, const char 
*object_path, const float time)
 {
        IArchive archive = open_archive(filepath);
 
@@ -760,10 +757,10 @@ DerivedMesh *ABC_read_mesh(const char *filepath, const 
char *object_path, const
        const Alembic::Abc::ObjectHeader &header = iobject.getHeader();
 
        if (IPolyMesh::matches(header)) {
-               return read_mesh_sample(iobject, time);
+               return read_mesh_sample(dm, iobject, time);
        }
        else if (IPoints::matches(header)) {
-               return read_points_sample(iobject, time);
+               return read_points_sample(dm, iobject, time);
        }
 
        return NULL;
diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.c 
b/source/blender/modifiers/intern/MOD_meshsequencecache.c
index 7443513..05354fb 100644
--- a/source/blender/modifiers/intern/MOD_meshsequencecache.c
+++ b/source/blender/modifiers/intern/MOD_meshsequencecache.c
@@ -94,7 +94,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object 
*ob,
                }
        }
 
-       DerivedMesh *result = ABC_read_mesh(filepath,
+       DerivedMesh *result = ABC_read_mesh(dm,
+                                           filepath,
                                            mcmd->abc_object_path,
                                            time);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to