[Bf-blender-cvs] [721806f] alembic_pointcache: Nicer code structure for writing Alembic mesh samples, using smaller functions for individual data properties.

Lukas Tönne noreply at git.blender.org
Wed Nov 12 12:35:51 CET 2014


Commit: 721806fa764b04e3eb90235237b44ea57f054ecc
Author: Lukas Tönne
Date:   Wed Nov 12 11:50:44 2014 +0100
Branches: alembic_pointcache
https://developer.blender.org/rB721806fa764b04e3eb90235237b44ea57f054ecc

Nicer code structure for writing Alembic mesh samples, using smaller
functions for individual data properties.

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

M	source/blender/pointcache/intern/mesh.cpp

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

diff --git a/source/blender/pointcache/intern/mesh.cpp b/source/blender/pointcache/intern/mesh.cpp
index 567741a..955f685 100644
--- a/source/blender/pointcache/intern/mesh.cpp
+++ b/source/blender/pointcache/intern/mesh.cpp
@@ -60,6 +60,76 @@ PointCacheWriter::~PointCacheWriter()
 {
 }
 
+static P3fArraySample create_sample_positions(DerivedMesh *dm, std::vector<V3f> &data)
+{
+	MVert *mv, *mverts = dm->getVertArray(dm);
+	int i, totvert = dm->getNumVerts(dm);
+	
+	data.reserve(totvert);
+	for (i = 0, mv = mverts; i < totvert; ++i, ++mv) {
+		float *co = mv->co;
+		data.push_back(V3f(co[0], co[1], co[2]));
+	}
+	
+	return P3fArraySample(data);
+}
+
+static Int32ArraySample create_sample_vertex_indices(DerivedMesh *dm, std::vector<int> &data)
+{
+	MLoop *ml, *mloops = dm->getLoopArray(dm);
+	int i, totloop = dm->getNumLoops(dm);
+	
+	data.reserve(totloop);
+	for (i = 0, ml = mloops; i < totloop; ++i, ++ml) {
+		data.push_back(ml->v);
+	}
+	
+	return Int32ArraySample(data);
+}
+
+static Int32ArraySample create_sample_loop_counts(DerivedMesh *dm, std::vector<int> &data)
+{
+	MPoly *mp, *mpolys = dm->getPolyArray(dm);
+	int i, totpoly = dm->getNumPolys(dm);
+	
+	data.reserve(totpoly);
+	for (i = 0, mp = mpolys; i < totpoly; ++i, ++mp) {
+		data.push_back(mp->totloop);
+	}
+	
+	return Int32ArraySample(data);
+}
+
+static OBoolGeomParam::Sample create_sample_poly_smooth(DerivedMesh *dm, std::vector<bool_t> &data)
+{
+	MPoly *mp, *mpolys = dm->getPolyArray(dm);
+	int i, totpoly = dm->getNumPolys(dm);
+	
+	data.reserve(totpoly);
+	for (i = 0, mp = mpolys; i < totpoly; ++i, ++mp) {
+		data.push_back((bool)(mp->flag & ME_SMOOTH));
+	}
+	
+	OBoolGeomParam::Sample sample;
+	sample.setVals(BoolArraySample(data));
+	sample.setScope(kUniformScope);
+	return sample;
+}
+
+static OInt32ArrayProperty::sample_type create_sample_edge_vertices(DerivedMesh *dm, std::vector<int> &data)
+{
+	MEdge *me, *medges = dm->getEdgeArray(dm);
+	int i, totedge = dm->getNumEdges(dm);
+	
+	data.reserve(totedge * 2);
+	for (i = 0, me = medges; i < totedge; ++i, ++me) {
+		data.push_back(me->v1);
+		data.push_back(me->v2);
+	}
+	
+	return OInt32ArrayProperty::sample_type(data);
+}
+
 void PointCacheWriter::write_sample()
 {
 	DerivedMesh *output_dm = m_pcmd->output_dm;
@@ -68,61 +138,36 @@ void PointCacheWriter::write_sample()
 	
 	OPolyMeshSchema &schema = m_mesh.getSchema();
 	
-	MVert *mv, *mverts = output_dm->getVertArray(output_dm);
-	MLoop *ml, *mloops = output_dm->getLoopArray(output_dm);
-	MPoly *mp, *mpolys = output_dm->getPolyArray(output_dm);
-	MEdge *me, *medges = output_dm->getEdgeArray(output_dm);
-	int totvert = output_dm->getNumVerts(output_dm);
-	int totloop = output_dm->getNumLoops(output_dm);
-	int totpoly = output_dm->getNumPolys(output_dm);
-	int totedge = output_dm->getNumEdges(output_dm);
-	int i;
-	
-	std::vector<V3f> positions;
-	positions.reserve(totvert);
-	std::vector<int> indices;
-	indices.reserve(totloop);
-	std::vector<int> counts;
-	counts.reserve(totpoly);
-	std::vector<bool_t> smooth;
-	smooth.reserve(totpoly);
-	std::vector<int> edges;
-	edges.reserve(totedge * 2);
+	std::vector<V3f> positions_buffer;
+	std::vector<int> indices_buffer;
+	std::vector<int> counts_buffer;
+	std::vector<bool_t> smooth_buffer;
+	std::vector<int> edges_buffer;
+//	std::vector<V2f> uvs;
+//	V2fArraySample()
 	
 	// TODO decide how to handle vertex/face normals, in caching vs. export ...
 //	std::vector<V2f> uvs;
 //	OV2fGeomParam::Sample uvs(V2fArraySample(uvs), kFacevaryingScope );
 	
-	for (i = 0, mv = mverts; i < totvert; ++i, ++mv) {
-		float *co = mv->co;
-		positions.push_back(V3f(co[0], co[1], co[2]));
-	}
-	for (i = 0, ml = mloops; i < totloop; ++i, ++ml) {
-		indices.push_back(ml->v);
-	}
-	for (i = 0, mp = mpolys; i < totpoly; ++i, ++mp) {
-		counts.push_back(mp->totloop);
-		smooth.push_back((bool)(mp->flag & ME_SMOOTH));
-	}
-	for (i = 0, me = medges; i < totedge; ++i, ++me) {
-		edges.push_back(me->v1);
-		edges.push_back(me->v2);
-	}
+	P3fArraySample positions = create_sample_positions(output_dm, positions_buffer);
+	Int32ArraySample indices = create_sample_vertex_indices(output_dm, indices_buffer);
+	Int32ArraySample counts = create_sample_loop_counts(output_dm, counts_buffer);
+	OBoolGeomParam::Sample smooth = create_sample_poly_smooth(output_dm, smooth_buffer);
+	OInt32ArrayProperty::sample_type edges = create_sample_edge_vertices(output_dm, edges_buffer);
 	
 	OPolyMeshSchema::Sample sample = OPolyMeshSchema::Sample(
-	            P3fArraySample(positions),
-	            Int32ArraySample(indices),
-	            Int32ArraySample(counts)
+	            positions,
+	            indices,
+	            counts,
+	            OV2fGeomParam::Sample(), /* XXX define how/which UV map should be considered primary for the alembic schema */
+	            ON3fGeomParam::Sample()
 	            );
 	schema.set(sample);
 	
-	OBoolGeomParam::Sample sample_smooth;
-	sample_smooth.setVals(BoolArraySample(smooth));
-	sample_smooth.setScope(kUniformScope);
-	m_param_smooth.set(sample_smooth);
+	m_param_smooth.set(smooth);
 	
-	OInt32ArrayProperty::sample_type sample_edges(edges);
-	m_prop_edges.set(sample_edges);
+	m_prop_edges.set(edges);
 }




More information about the Bf-blender-cvs mailing list