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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to