Commit: b33cf3fc30cf2e102c40b6accea80c566f0829ec
Author: Kévin Dietrich
Date:   Wed May 25 11:56:20 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBb33cf3fc30cf2e102c40b6accea80c566f0829ec

Split mesh read function into smaller ones.

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

M       source/blender/alembic/intern/abc_mesh.cc
M       source/blender/alembic/intern/abc_mesh.h

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

diff --git a/source/blender/alembic/intern/abc_mesh.cc 
b/source/blender/alembic/intern/abc_mesh.cc
index a2b093f..f6609b2 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -982,7 +982,7 @@ void AbcMeshWriter::getGeoGroups(
 /* ******************************* mesh reader ****************************** 
*/
 
 /* Some helpers for mesh generation */
-namespace mesh_utils {
+namespace utils {
 
 static void mesh_add_verts(Mesh *mesh, size_t len)
 {
@@ -1063,9 +1063,7 @@ static void mesh_add_mpolygons(Mesh *mesh, size_t len)
        mesh->totpoly = totpolys;
 }
 
-} /* mesh_utils */
-
-static Material *findMaterial(Main *bmain, const char *name)
+static Material *find_material(Main *bmain, const char *name)
 {
        Material *material, *found_material = NULL;
 
@@ -1080,7 +1078,7 @@ static Material *findMaterial(Main *bmain, const char 
*name)
        return found_material;
 }
 
-static void ABC_apply_materials(Main *bmain, Object *ob, const 
std::map<std::string, int> &mat_map)
+static void assign_materials(Main *bmain, Object *ob, const 
std::map<std::string, int> &mat_map)
 {
        /* Clean up slots */
        while (object_remove_material_slot(ob));
@@ -1107,7 +1105,7 @@ static void ABC_apply_materials(Main *bmain, Object *ob, 
const std::map<std::str
 
                for (; it != mat_map.end(); ++it) {
                        std::string mat_name = it->first;
-                       Material *assigned_name = findMaterial(bmain, 
mat_name.c_str());
+                       Material *assigned_name = find_material(bmain, 
mat_name.c_str());
 
                        if (assigned_name == NULL) {
                                assigned_name = BKE_material_add(bmain, 
mat_name.c_str());
@@ -1118,6 +1116,10 @@ static void ABC_apply_materials(Main *bmain, Object *ob, 
const std::map<std::str
        }
 }
 
+}  /* namespace utils */
+
+/* ****************************** AbcMeshReader ***************************** 
*/
+
 AbcMeshReader::AbcMeshReader(const IObject &object, ImportSettings &settings)
     : AbcObjectReader(object, settings)
 {
@@ -1132,41 +1134,55 @@ bool AbcMeshReader::valid() const
 
 void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
 {
-       Mesh *blender_mesh = BKE_mesh_add(bmain, m_data_name.c_str());
-
-       const size_t idx_pos  = blender_mesh->totpoly;
-       const size_t vtx_pos  = blender_mesh->totvert;
-       const size_t loop_pos = blender_mesh->totloop;
+       Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str());
 
-       IV2fGeomParam uv = m_schema.getUVsParam();
-       ISampleSelector sample_sel(time);
+       const ISampleSelector sample_sel(time);
 
-       IPolyMeshSchema::Sample smp = m_schema.getValue(sample_sel);
-       P3fArraySamplePtr positions = smp.getPositions();
-       Int32ArraySamplePtr face_indices = smp.getFaceIndices();
-       Int32ArraySamplePtr face_counts  = smp.getFaceCounts();
+       const IPolyMeshSchema::Sample sample = m_schema.getValue(sample_sel);
 
-       const size_t vertex_count = positions->size();
-       const size_t num_poly = face_counts->size();
-       const size_t num_loops = face_indices->size();
+       readVertexDataSample(mesh, sample);
 
-       std::vector<std::string> face_sets;
-       m_schema.getFaceSetNames(face_sets);
+       const size_t poly_start = mesh->totpoly;
 
-       mesh_utils::mesh_add_verts(blender_mesh, vertex_count);
-       mesh_utils::mesh_add_mpolygons(blender_mesh, num_poly);
-       mesh_utils::mesh_add_mloops(blender_mesh, num_loops);
+       readPolyDataSample(mesh, sample, poly_start);
 
-       IV2fGeomParam::Sample::samp_ptr_type uvsamp_vals;
+       /* TODO: expose this as a setting to the user? */
+       const bool assign_mat = true;
 
-       if (uv.valid()) {
-               IV2fGeomParam::Sample uvsamp = uv.getExpandedValue();
-               uvsamp_vals = uvsamp.getVals();
+       if (assign_mat) {
+               readFaceSetsSample(bmain, mesh, poly_start, sample_sel);
        }
 
-       int j = vtx_pos;
-       for (int i = 0; i < vertex_count; ++i, ++j) {
-               MVert &mvert = blender_mesh->mvert[j];
+       BKE_mesh_validate(mesh, false, false);
+
+       m_object = BKE_object_add(bmain, scene, OB_MESH, m_object_name.c_str());
+       m_object->data = mesh;
+
+       /* Add a default mesh cache modifier */
+
+       ModifierData *md = modifier_new(eModifierType_MeshCache);
+       BLI_addtail(&m_object->modifiers, md);
+
+       MeshCacheModifierData *mcmd = reinterpret_cast<MeshCacheModifierData 
*>(md);
+       mcmd->type = MOD_MESHCACHE_TYPE_ABC;
+       mcmd->time_mode = MOD_MESHCACHE_TIME_SECONDS;
+       mcmd->forward_axis = m_settings->from_forward;
+       mcmd->up_axis = m_settings->from_up;
+
+       BLI_strncpy(mcmd->filepath, m_iobject.getArchive().getName().c_str(), 
1024);
+       BLI_strncpy(mcmd->sub_object, m_iobject.getFullName().c_str(), 1024);
+}
+
+void AbcMeshReader::readVertexDataSample(Mesh *mesh, const 
IPolyMeshSchema::Sample &sample)
+{
+       const P3fArraySamplePtr positions = sample.getPositions();
+       const size_t vertex_count = positions->size();
+       const size_t vertex_start = mesh->totvert;
+
+       utils::mesh_add_verts(mesh, vertex_count);
+
+       for (int i = 0, j = vertex_start; i < vertex_count; ++i, ++j) {
+               MVert &mvert = mesh->mvert[j];
                Imath::V3f pos_in = (*positions)[i];
 
                mvert.co[0] = pos_in[0];
@@ -1177,14 +1193,35 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene 
*scene, float time)
        }
 
        if (m_settings->do_convert_mat) {
-               j = vtx_pos;
-               for (int i = 0; i < vertex_count; ++i, ++j) {
-                       MVert &mvert = blender_mesh->mvert[j];
+               for (int i = 0, j = vertex_start; i < vertex_count; ++i, ++j) {
+                       MVert &mvert = mesh->mvert[j];
                        mul_m4_v3(m_settings->conversion_mat, mvert.co);
                }
        }
+}
+
+void AbcMeshReader::readPolyDataSample(Mesh *blender_mesh,
+                                       const 
Alembic::AbcGeom::IPolyMeshSchema::Sample &sample,
+                                       const size_t poly_start)
+{
+       const Int32ArraySamplePtr face_indices = sample.getFaceIndices();
+       const Int32ArraySamplePtr face_counts  = sample.getFaceCounts();
+       const size_t num_poly = face_counts->size();
+       const size_t num_loops = face_indices->size();
+       const size_t loop_pos = blender_mesh->totloop;
+
+       utils::mesh_add_mpolygons(blender_mesh, num_poly);
+       utils::mesh_add_mloops(blender_mesh, num_loops);
 
-       j = idx_pos;
+       IV2fGeomParam::Sample::samp_ptr_type uvsamp_vals;
+       const IV2fGeomParam uv = m_schema.getUVsParam();
+
+       if (uv.valid()) {
+               IV2fGeomParam::Sample uvsamp = uv.getExpandedValue();
+               uvsamp_vals = uvsamp.getVals();
+       }
+
+       int j = poly_start;
        int loopcount = loop_pos;
        for (int i = 0; i < num_poly; ++i, ++j) {
                int face_size = (*face_counts)[i];
@@ -1196,8 +1233,8 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene 
*scene, float time)
                /* TODO: reverse */
                int rev_loop = loopcount;
                for (int f = face_size; f-- ;) {
-                       MLoop &loop     = blender_mesh->mloop[rev_loop+f];
-                       MLoopUV &loopuv = blender_mesh->mloopuv[rev_loop+f];
+                       MLoop &loop     = blender_mesh->mloop[rev_loop + f];
+                       MLoopUV &loopuv = blender_mesh->mloopuv[rev_loop + f];
 
                        if (uvsamp_vals) {
                                loopuv.uv[0] = (*uvsamp_vals)[loopcount][0];
@@ -1207,35 +1244,10 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene 
*scene, float time)
                        loop.v = (*face_indices)[loopcount++];
                }
        }
-
-       BKE_mesh_validate(blender_mesh, false, false);
-
-       m_object = BKE_object_add(bmain, scene, OB_MESH, m_object_name.c_str());
-       m_object->data = blender_mesh;
-
-       /* Add a default mesh cache modifier */
-
-       ModifierData *md = modifier_new(eModifierType_MeshCache);
-       BLI_addtail(&m_object->modifiers, md);
-
-       MeshCacheModifierData *mcmd = reinterpret_cast<MeshCacheModifierData 
*>(md);
-       mcmd->type = MOD_MESHCACHE_TYPE_ABC;
-       mcmd->time_mode = MOD_MESHCACHE_TIME_SECONDS;
-       mcmd->forward_axis = m_settings->from_forward;
-       mcmd->up_axis = m_settings->from_up;
-
-       BLI_strncpy(mcmd->filepath, m_iobject.getArchive().getName().c_str(), 
1024);
-       BLI_strncpy(mcmd->sub_object, m_iobject.getFullName().c_str(), 1024);
-
-       /* TODO: expose this as a setting to the user? */
-       const bool assign_mat = true;
-
-       if (assign_mat) {
-               readFaceSets(bmain, blender_mesh, idx_pos, sample_sel);
-       }
 }
 
-void AbcMeshReader::readFaceSets(Main *bmain, Mesh *mesh, size_t idx_pos, 
const ISampleSelector &sample_sel)
+void AbcMeshReader::readFaceSetsSample(Main *bmain, Mesh *mesh, size_t 
poly_start,
+                                       const ISampleSelector &sample_sel)
 {
        std::vector<std::string> face_sets;
        m_schema.getFaceSetNames(face_sets);
@@ -1268,7 +1280,7 @@ void AbcMeshReader::readFaceSets(Main *bmain, Mesh *mesh, 
size_t idx_pos, const
                const size_t num_group_faces = group_faces->size();
 
                for (size_t l = 0; l < num_group_faces; l++) {
-                       size_t pos = (*group_faces)[l] + idx_pos;
+                       size_t pos = (*group_faces)[l] + poly_start;
 
                        if (pos >= mesh->totpoly) {
                                std::cerr << "Faceset overflow on " << 
faceset.getName() << '\n';
@@ -1280,9 +1292,11 @@ void AbcMeshReader::readFaceSets(Main *bmain, Mesh 
*mesh, size_t idx_pos, const
                }
        }
 
-       ABC_apply_materials(bmain, m_object, mat_map);
+       utils::assign_materials(bmain, m_object, mat_map);
 }
 
+/* ***************************** AbcEmptyReader ***************************** 
*/
+
 AbcEmptyReader::AbcEmptyReader(const Alembic::Abc::IObject &object, 
ImportSettings &settings)
     : AbcObjectReader(object, settings)
 {}
diff --git a/source/blender/alembic/intern/abc_mesh.h 
b/source/blender/alembic/intern/abc_mesh.h
index 3875fa2..55d4da1 100644
--- a/source/blender/alembic/intern/abc_mesh.h
+++ b/source/blender/alembic/intern/abc_mesh.h
@@ -113,8 +113,17 @@ public:
        bool valid() const;
 
        void readObjectData(Main *bmain, Scene *scene, float time);
-    void readFaceSets(Main *bmain, Mesh *mesh, size_t idx_pos,
-                         const Alembic::AbcGeom::ISampleSelector &sample_sel);
+
+private:
+       void readFaceSetsSample(Main *bmain, Mesh *mesh, size_t poly_start,
+                               const Alembic::AbcGeom::ISampleSelector 
&sample_sel);
+
+       void readPolyDataSample(Mesh *blender_mesh,
+                               const Alembic::AbcGeom::IPolyMeshSchema::Sample 
&sample,
+                               const size_t poly_start);
+
+       void readVertexDataSample(Mesh *mesh,
+                                 const 
Alembic::AbcGeom::IPolyMeshSchema::Sample &sample);
 };
 
 class AbcEmptyReader : public AbcObjectReader {

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

Reply via email to