[Bf-blender-cvs] [b33cf3f] alembic_basic_io: Split mesh read function into smaller ones.

Kévin Dietrich noreply at git.blender.org
Wed May 25 13:31:53 CEST 2016


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 {




More information about the Bf-blender-cvs mailing list