[Bf-blender-cvs] [34b226c] alembic_basic_io: Avoid creating a new DerivedMesh if the vertex count does not change.

Kévin Dietrich noreply at git.blender.org
Wed Jun 1 17:28:22 CEST 2016


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);




More information about the Bf-blender-cvs mailing list