[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