[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