[Bf-blender-cvs] [c9e22c6] alembic: Support for Loop UV and vertex color customdata attributes.

Lukas Tönne noreply at git.blender.org
Fri Apr 24 17:36:13 CEST 2015


Commit: c9e22c6ea9bb2fd78afed9aff8459cf132747c87
Author: Lukas Tönne
Date:   Fri Apr 24 11:02:45 2015 +0200
Branches: alembic
https://developer.blender.org/rBc9e22c6ea9bb2fd78afed9aff8459cf132747c87

Support for Loop UV and vertex color customdata attributes.

The exclusion mask for meshes in Alembic caches now is a bit more
specific as well, to not bluntly exclude all bmesh attributes.

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

M	source/blender/pointcache/alembic/abc_customdata.cpp
M	source/blender/pointcache/alembic/abc_mesh.cpp

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

diff --git a/source/blender/pointcache/alembic/abc_customdata.cpp b/source/blender/pointcache/alembic/abc_customdata.cpp
index 714a562..a817372 100644
--- a/source/blender/pointcache/alembic/abc_customdata.cpp
+++ b/source/blender/pointcache/alembic/abc_customdata.cpp
@@ -180,6 +180,47 @@ void write_sample<CD_ORCO>(CustomDataWriter *writer, OCompoundProperty &parent,
 }
 
 template <>
+void write_sample<CD_MLOOPUV>(CustomDataWriter *writer, OCompoundProperty &parent, const std::string &name, void *data, int num_data)
+{
+	OCompoundProperty prop = writer->add_compound_property<OCompoundProperty>(name, parent);
+	
+	OV2fArrayProperty prop_uv = writer->add_array_property<OV2fArrayProperty>(name + ":uv", prop);
+	OInt32ArrayProperty prop_flag = writer->add_array_property<OInt32ArrayProperty>(name + ":flag", prop);
+	
+	MLoopUV *loop_uv = (MLoopUV *)data;
+	std::vector<V2f> uv_data;
+	std::vector<int32_t> flag_data;
+	uv_data.reserve(num_data);
+	flag_data.reserve(num_data);
+	for (int i = 0; i < num_data; ++i) {
+		uv_data.push_back(V2f(loop_uv->uv[0], loop_uv->uv[1]));
+		flag_data.push_back(loop_uv->flag);
+		
+		++loop_uv;
+	}
+	prop_uv.set(V2fArraySample(uv_data));
+	prop_flag.set(Int32ArraySample(flag_data));
+}
+
+template <>
+void write_sample<CD_MLOOPCOL>(CustomDataWriter *writer, OCompoundProperty &parent, const std::string &name, void *data, int num_data)
+{
+	OCompoundProperty prop = writer->add_compound_property<OCompoundProperty>(name, parent);
+	
+	OC4fArrayProperty prop_col = writer->add_array_property<OC4fArrayProperty>(name + ":color", prop);
+	
+	MLoopCol *loop_col = (MLoopCol *)data;
+	std::vector<C4f> col_data;
+	col_data.reserve(num_data);
+	for (int i = 0; i < num_data; ++i) {
+		col_data.push_back(C4f(loop_col->r, loop_col->g, loop_col->b, loop_col->a));
+		
+		++loop_col;
+	}
+	prop_col.set(C4fArraySample(col_data));
+}
+
+template <>
 void write_sample<CD_ORIGSPACE_MLOOP>(CustomDataWriter *writer, OCompoundProperty &parent, const std::string &name, void *data, int num_data)
 {
 	OCompoundProperty prop = writer->add_compound_property<OCompoundProperty>(name, parent);
@@ -369,6 +410,62 @@ PTCReadSampleResult read_sample<CD_ORCO>(CustomDataReader *reader, ICompoundProp
 }
 
 template <>
+PTCReadSampleResult read_sample<CD_MLOOPUV>(CustomDataReader *reader, ICompoundProperty &parent, const ISampleSelector &ss, const std::string &name, void *data, int num_data)
+{
+	ICompoundProperty prop = reader->add_compound_property<ICompoundProperty>(name, parent);
+	
+	IV2fArrayProperty uv_prop = reader->add_array_property<IV2fArrayProperty>(name + ":uv", prop);
+	IInt32ArrayProperty flag_prop = reader->add_array_property<IInt32ArrayProperty>(name + ":flag", prop);
+	
+	V2fArraySamplePtr uv_sample = uv_prop.getValue(ss);
+	Int32ArraySamplePtr flag_sample = flag_prop.getValue(ss);
+	
+	if (uv_sample->size() != num_data || flag_sample->size() != num_data)
+		return PTC_READ_SAMPLE_INVALID;
+	
+	MLoopUV *loop_uv = (MLoopUV *)data;
+	const V2f *uv_data = (const V2f *)uv_sample->getData();
+	const int32_t *flag_data = (const int32_t *)flag_sample->getData();
+	for (int i = 0; i < num_data; ++i) {
+		copy_v2_v2(loop_uv->uv, uv_data->getValue());
+		loop_uv->flag = *flag_data;
+		
+		++uv_data;
+		++flag_data;
+		++loop_uv;
+	}
+	
+	return PTC_READ_SAMPLE_EXACT;
+}
+
+template <>
+PTCReadSampleResult read_sample<CD_MLOOPCOL>(CustomDataReader *reader, ICompoundProperty &parent, const ISampleSelector &ss, const std::string &name, void *data, int num_data)
+{
+	ICompoundProperty prop = reader->add_compound_property<ICompoundProperty>(name, parent);
+	
+	IC4fArrayProperty col_prop = reader->add_array_property<IC4fArrayProperty>(name + ":color", prop);
+	
+	C4fArraySamplePtr col_sample = col_prop.getValue(ss);
+	
+	if (col_sample->size() != num_data)
+		return PTC_READ_SAMPLE_INVALID;
+	
+	MLoopCol *loop_col = (MLoopCol *)data;
+	const C4f *col_data = (const C4f *)col_sample->getData();
+	for (int i = 0; i < num_data; ++i) {
+		loop_col->r = col_data->r;
+		loop_col->g = col_data->g;
+		loop_col->b = col_data->b;
+		loop_col->a = col_data->a;
+		
+		++col_data;
+		++loop_col;
+	}
+	
+	return PTC_READ_SAMPLE_EXACT;
+}
+
+template <>
 PTCReadSampleResult read_sample<CD_ORIGSPACE_MLOOP>(CustomDataReader *reader, ICompoundProperty &parent, const ISampleSelector &ss, const std::string &name, void *data, int num_data)
 {
 	ICompoundProperty prop = reader->add_compound_property<ICompoundProperty>(name, parent);
diff --git a/source/blender/pointcache/alembic/abc_mesh.cpp b/source/blender/pointcache/alembic/abc_mesh.cpp
index aa6a0c6a..d63f0a7 100644
--- a/source/blender/pointcache/alembic/abc_mesh.cpp
+++ b/source/blender/pointcache/alembic/abc_mesh.cpp
@@ -43,7 +43,14 @@ using namespace Abc;
 using namespace AbcGeom;
 
 /* CD layers that are stored in generic customdata arrays created with CD_ALLOC */
-static CustomDataMask CD_MASK_CACHE_EXCLUDE = (CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE | CD_MASK_MPOLY | CD_MASK_MLOOP | CD_MASK_BMESH | CD_MASK_MTFACE);
+static CustomDataMask CD_MASK_CACHE_EXCLUDE =
+        CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE | CD_MASK_MPOLY | CD_MASK_MLOOP |
+        CD_MASK_MTFACE | CD_MASK_MTEXPOLY |
+        CD_MASK_PROP_STR |
+        CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX |
+        CD_MASK_MDISPS | CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_RECAST | CD_MASK_PAINT_MASK |
+        CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE;
+
 static CustomDataMask CD_MASK_CACHE_VERT = ~(CD_MASK_CACHE_EXCLUDE | CD_MASK_NORMAL);
 static CustomDataMask CD_MASK_CACHE_EDGE = ~(CD_MASK_CACHE_EXCLUDE);
 static CustomDataMask CD_MASK_CACHE_FACE = ~(CD_MASK_CACHE_EXCLUDE);
@@ -304,11 +311,6 @@ void AbcDerivedMeshWriter::write_sample()
 	int num_edata = output_dm->getNumEdges(output_dm);
 	m_edge_data_writer.write_sample(edata, num_edata, user_props);
 	
-	DM_ensure_tessface(output_dm);
-	CustomData *fdata = output_dm->getTessFaceDataLayout(output_dm);
-	int num_fdata = output_dm->getNumTessFaces(output_dm);
-	m_face_data_writer.write_sample(fdata, num_fdata, user_props);
-	
 	CustomData *pdata = output_dm->getPolyDataLayout(output_dm);
 	int num_pdata = output_dm->getNumPolys(output_dm);
 	m_poly_data_writer.write_sample(pdata, num_pdata, user_props);
@@ -316,6 +318,11 @@ void AbcDerivedMeshWriter::write_sample()
 	CustomData *ldata = output_dm->getLoopDataLayout(output_dm);
 	int num_ldata = output_dm->getNumLoops(output_dm);
 	m_loop_data_writer.write_sample(ldata, num_ldata, user_props);
+	
+	DM_ensure_tessface(output_dm);
+	CustomData *fdata = output_dm->getTessFaceDataLayout(output_dm);
+	int num_fdata = output_dm->getNumTessFaces(output_dm);
+	m_face_data_writer.write_sample(fdata, num_fdata, user_props);
 }
 
 /* ========================================================================= */
@@ -559,11 +566,6 @@ PTCReadSampleResult AbcDerivedMeshReader::read_sample(float frame)
 	int num_edata = totedges;
 	m_edge_data_reader.read_sample(ss, edata, num_edata, user_props);
 	
-	DM_ensure_tessface(m_result);
-	CustomData *fdata = m_result->getTessFaceDataLayout(m_result);
-	int num_fdata = m_result->getNumTessFaces(m_result);
-	m_face_data_reader.read_sample(ss, fdata, num_fdata, user_props);
-	
 	CustomData *pdata = m_result->getPolyDataLayout(m_result);
 	int num_pdata = totpolys;
 	m_poly_data_reader.read_sample(ss, pdata, num_pdata, user_props);
@@ -572,6 +574,11 @@ PTCReadSampleResult AbcDerivedMeshReader::read_sample(float frame)
 	int num_ldata = totloops;
 	m_loop_data_reader.read_sample(ss, ldata, num_ldata, user_props);
 	
+	DM_ensure_tessface(m_result);
+	CustomData *fdata = m_result->getTessFaceDataLayout(m_result);
+	int num_fdata = m_result->getNumTessFaces(m_result);
+	m_face_data_reader.read_sample(ss, fdata, num_fdata, user_props);
+	
 	PROFILE_START;
 	if (!has_edges)
 		CDDM_calc_edges(m_result);




More information about the Bf-blender-cvs mailing list