[Bf-blender-cvs] [5167940] alembic_basic_io: Add support to read in subd meshes.

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


Commit: 51679409b2f6b4da73671f553ed4d9ae7419ff4e
Author: Kévin Dietrich
Date:   Wed May 25 12:56:34 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB51679409b2f6b4da73671f553ed4d9ae7419ff4e

Add support to read in subd meshes.

Only vertices and faces are read at the moment. Support for more
properties, such as creases, will come later.

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

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

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

diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index f6609b2..85bad65 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -66,6 +66,8 @@ using Alembic::AbcGeom::IObject;
 using Alembic::AbcGeom::IPolyMesh;
 using Alembic::AbcGeom::IPolyMeshSchema;
 using Alembic::AbcGeom::ISampleSelector;
+using Alembic::AbcGeom::ISubD;
+using Alembic::AbcGeom::ISubDSchema;
 using Alembic::AbcGeom::IV2fGeomParam;
 
 using Alembic::AbcGeom::OArrayProperty;
@@ -1120,16 +1122,22 @@ static void assign_materials(Main *bmain, Object *ob, const std::map<std::string
 
 /* ****************************** AbcMeshReader ***************************** */
 
-AbcMeshReader::AbcMeshReader(const IObject &object, ImportSettings &settings)
+AbcMeshReader::AbcMeshReader(const IObject &object, ImportSettings &settings, bool is_subd)
     : AbcObjectReader(object, settings)
 {
-	IPolyMesh abc_mesh(m_iobject, kWrapExisting);
-	m_schema = abc_mesh.getSchema();
+	if (is_subd) {
+		ISubD isubd_mesh(m_iobject, kWrapExisting);
+		m_subd_schema = isubd_mesh.getSchema();
+	}
+	else {
+		IPolyMesh ipoly_mesh(m_iobject, kWrapExisting);
+		m_schema = ipoly_mesh.getSchema();
+	}
 }
 
 bool AbcMeshReader::valid() const
 {
-	return m_schema.valid();
+	return m_schema.valid() || m_subd_schema.valid();
 }
 
 void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
@@ -1137,14 +1145,25 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
 	Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str());
 
 	const ISampleSelector sample_sel(time);
+	const size_t poly_start = mesh->totpoly;
 
-	const IPolyMeshSchema::Sample sample = m_schema.getValue(sample_sel);
+	if (m_subd_schema.valid()) {
+		const ISubDSchema::Sample sample = m_subd_schema.getValue(sample_sel);
 
-	readVertexDataSample(mesh, sample);
+		readVertexDataSample(mesh, sample.getPositions());
+		readPolyDataSample(mesh, sample.getFaceIndices(), sample.getFaceCounts(), poly_start);
+	}
+	else {
+		const IPolyMeshSchema::Sample sample = m_schema.getValue(sample_sel);
 
-	const size_t poly_start = mesh->totpoly;
+		readVertexDataSample(mesh, sample.getPositions());
+		readPolyDataSample(mesh, sample.getFaceIndices(), sample.getFaceCounts(), poly_start);
+	}
 
-	readPolyDataSample(mesh, sample, poly_start);
+	BKE_mesh_validate(mesh, false, false);
+
+	m_object = BKE_object_add(bmain, scene, OB_MESH, m_object_name.c_str());
+	m_object->data = mesh;
 
 	/* TODO: expose this as a setting to the user? */
 	const bool assign_mat = true;
@@ -1153,11 +1172,6 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
 		readFaceSetsSample(bmain, mesh, poly_start, sample_sel);
 	}
 
-	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);
@@ -1173,9 +1187,8 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
 	BLI_strncpy(mcmd->sub_object, m_iobject.getFullName().c_str(), 1024);
 }
 
-void AbcMeshReader::readVertexDataSample(Mesh *mesh, const IPolyMeshSchema::Sample &sample)
+void AbcMeshReader::readVertexDataSample(Mesh *mesh, const P3fArraySamplePtr &positions)
 {
-	const P3fArraySamplePtr positions = sample.getPositions();
 	const size_t vertex_count = positions->size();
 	const size_t vertex_start = mesh->totvert;
 
@@ -1200,21 +1213,21 @@ void AbcMeshReader::readVertexDataSample(Mesh *mesh, const IPolyMeshSchema::Samp
 	}
 }
 
-void AbcMeshReader::readPolyDataSample(Mesh *blender_mesh,
-                                       const Alembic::AbcGeom::IPolyMeshSchema::Sample &sample,
+void AbcMeshReader::readPolyDataSample(Mesh *mesh,
+                                       const Int32ArraySamplePtr &face_indices,
+                                       const Int32ArraySamplePtr &face_counts,
                                        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;
+	const size_t loop_pos = mesh->totloop;
 
-	utils::mesh_add_mpolygons(blender_mesh, num_poly);
-	utils::mesh_add_mloops(blender_mesh, num_loops);
+	utils::mesh_add_mpolygons(mesh, num_poly);
+	utils::mesh_add_mloops(mesh, num_loops);
 
 	IV2fGeomParam::Sample::samp_ptr_type uvsamp_vals;
-	const IV2fGeomParam uv = m_schema.getUVsParam();
+	const IV2fGeomParam uv = (m_subd_schema.valid() ? m_subd_schema.getUVsParam()
+	                                                : m_schema.getUVsParam());
 
 	if (uv.valid()) {
 		IV2fGeomParam::Sample uvsamp = uv.getExpandedValue();
@@ -1225,16 +1238,16 @@ void AbcMeshReader::readPolyDataSample(Mesh *blender_mesh,
 	int loopcount = loop_pos;
 	for (int i = 0; i < num_poly; ++i, ++j) {
 		int face_size = (*face_counts)[i];
-		MPoly &poly = blender_mesh->mpoly[j];
+		MPoly &poly = mesh->mpoly[j];
 
 		poly.loopstart = loopcount;
-		poly.totloop   = face_size;
+		poly.totloop = face_size;
 
 		/* 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 	= mesh->mloop[rev_loop + f];
+			MLoopUV &loopuv = mesh->mloopuv[rev_loop + f];
 
 			if (uvsamp_vals) {
 				loopuv.uv[0] = (*uvsamp_vals)[loopcount][0];
@@ -1250,7 +1263,13 @@ void AbcMeshReader::readFaceSetsSample(Main *bmain, Mesh *mesh, size_t poly_star
                                        const ISampleSelector &sample_sel)
 {
 	std::vector<std::string> face_sets;
-	m_schema.getFaceSetNames(face_sets);
+
+	if (m_subd_schema.valid()) {
+		m_subd_schema.getFaceSetNames(face_sets);
+	}
+	else {
+		m_schema.getFaceSetNames(face_sets);
+	}
 
 	if (face_sets.empty()) {
 		return;
@@ -1268,7 +1287,8 @@ void AbcMeshReader::readFaceSetsSample(Main *bmain, Mesh *mesh, size_t poly_star
 
 		const int assigned_mat = mat_map[grp_name];
 
-		const IFaceSet faceset = m_schema.getFaceSet(grp_name);
+		const IFaceSet faceset = (m_subd_schema.valid() ? m_subd_schema.getFaceSet(grp_name)
+		                                                : m_schema.getFaceSet(grp_name));
 
 		if (!faceset.valid()) {
 			continue;
diff --git a/source/blender/alembic/intern/abc_mesh.h b/source/blender/alembic/intern/abc_mesh.h
index 55d4da1..ef72ee1 100644
--- a/source/blender/alembic/intern/abc_mesh.h
+++ b/source/blender/alembic/intern/abc_mesh.h
@@ -106,9 +106,10 @@ private:
 
 class AbcMeshReader : public AbcObjectReader {
 	Alembic::AbcGeom::IPolyMeshSchema m_schema;
+	Alembic::AbcGeom::ISubDSchema m_subd_schema;
 
 public:
-	AbcMeshReader(const Alembic::Abc::IObject &object, ImportSettings &settings);
+	AbcMeshReader(const Alembic::Abc::IObject &object, ImportSettings &settings, bool is_subd);
 
 	bool valid() const;
 
@@ -118,12 +119,13 @@ 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 readPolyDataSample(Mesh *mesh,
+	                        const Alembic::AbcGeom::Int32ArraySamplePtr &face_indices,
+                            const Alembic::AbcGeom::Int32ArraySamplePtr &face_counts,
+                            const size_t poly_start);
 
 	void readVertexDataSample(Mesh *mesh,
-	                          const Alembic::AbcGeom::IPolyMeshSchema::Sample &sample);
+	                          const Alembic::AbcGeom::P3fArraySamplePtr &positions);
 };
 
 class AbcEmptyReader : public AbcObjectReader {
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index b30b796..f176c7a 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -61,6 +61,7 @@ using Alembic::AbcGeom::IObject;
 using Alembic::AbcGeom::IPolyMesh;
 using Alembic::AbcGeom::IPolyMeshSchema;
 using Alembic::AbcGeom::ISampleSelector;
+using Alembic::AbcGeom::ISubD;
 using Alembic::AbcGeom::IXform;
 
 static IArchive open_archive(const std::string &filename)
@@ -353,7 +354,10 @@ static void visit_object(const IObject &object,
 			reader = new AbcEmptyReader(child, settings);
 		}
 		else if (IPolyMesh::matches(md)) {
-			reader = new AbcMeshReader(child, settings);
+			reader = new AbcMeshReader(child, settings, false);
+		}
+		else if (ISubD::matches(md)) {
+			reader = new AbcMeshReader(child, settings, true);
 		}
 		else if (INuPatch::matches(md)) {
 			reader = new AbcNurbsReader(child, settings);




More information about the Bf-blender-cvs mailing list