Commit: 1a9706ceae2a50ca17570c091a16531f8909fd8f
Author: Lukas Tönne
Date:   Mon Mar 9 12:35:27 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rB1a9706ceae2a50ca17570c091a16531f8909fd8f

Implementation of MDeformVert customdata layers in Alembic.

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

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

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

diff --git a/source/blender/pointcache/alembic/abc_customdata.cpp 
b/source/blender/pointcache/alembic/abc_customdata.cpp
index 88716a9..710e0e1 100644
--- a/source/blender/pointcache/alembic/abc_customdata.cpp
+++ b/source/blender/pointcache/alembic/abc_customdata.cpp
@@ -24,6 +24,8 @@
 #include "abc_customdata.h"
 
 extern "C" {
+#include "MEM_guardedalloc.h"
+
 #include "BLI_math.h"
 #include "BLI_utildefines.h"
 
@@ -59,6 +61,53 @@ static void write_sample(CustomDataWriter *writer, 
OCompoundProperty &parent, co
 }
 
 template <>
+void write_sample<CD_MDEFORMVERT>(CustomDataWriter *writer, OCompoundProperty 
&parent, const std::string &name, void *data, int num_data)
+{
+       OCompoundProperty prop = 
writer->add_compound_property<OCompoundProperty>(name, parent);
+       
+       OInt32ArrayProperty totweight_prop = 
writer->add_array_property<OInt32ArrayProperty>(name+":totweight", prop);
+       OInt32ArrayProperty flag_prop = 
writer->add_array_property<OInt32ArrayProperty>(name+":flag", prop);
+       OInt32ArrayProperty def_nr_prop = 
writer->add_array_property<OInt32ArrayProperty>(name+":def_nr", prop);
+       OFloatArrayProperty weight_prop = 
writer->add_array_property<OFloatArrayProperty>(name+":weight", prop);
+       
+       MDeformVert *mdef = (MDeformVert *)data;
+       
+       /* sum all totweight for the sample size */
+       int num_mdefweight = 0;
+       for (int i = 0; i < num_data; ++i)
+               num_mdefweight += mdef[i].totweight;
+       
+       std::vector<int32_t> totweight_data;
+       std::vector<int32_t> flag_data;
+       std::vector<int32_t> def_nr_data;
+       std::vector<float> weight_data;
+       totweight_data.reserve(num_data);
+       flag_data.reserve(num_data);
+       def_nr_data.reserve(num_mdefweight);
+       weight_data.reserve(num_mdefweight);
+       
+       for (int i = 0; i < num_data; ++i) {
+               totweight_data.push_back(mdef->totweight);
+               flag_data.push_back(mdef->flag);
+               
+               MDeformWeight *mw = mdef->dw;
+               for (int j = 0; j < mdef->totweight; ++j) {
+                       def_nr_data.push_back(mw->def_nr);
+                       weight_data.push_back(mw->weight);
+                       
+                       ++mw;
+               }
+               
+               ++mdef;
+       }
+       
+       totweight_prop.set(Int32ArraySample(totweight_data));
+       flag_prop.set(Int32ArraySample(flag_data));
+       def_nr_prop.set(Int32ArraySample(def_nr_data));
+       weight_prop.set(FloatArraySample(weight_data));
+}
+
+template <>
 void write_sample<CD_ORIGINDEX>(CustomDataWriter *writer, OCompoundProperty 
&parent, const std::string &name, void *data, int num_data)
 {
        OInt32ArrayProperty prop = 
writer->add_array_property<OInt32ArrayProperty>(name, parent);
@@ -106,6 +155,54 @@ static PTCReadSampleResult read_sample(CustomDataReader 
*reader, ICompoundProper
 }
 
 template <>
+PTCReadSampleResult read_sample<CD_MDEFORMVERT>(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);
+       
+       IInt32ArrayProperty totweight_prop = 
reader->add_array_property<IInt32ArrayProperty>(name+":totweight", prop);
+       IInt32ArrayProperty flag_prop = 
reader->add_array_property<IInt32ArrayProperty>(name+":flag", prop);
+       IInt32ArrayProperty def_nr_prop = 
reader->add_array_property<IInt32ArrayProperty>(name+":def_nr", prop);
+       IFloatArrayProperty weight_prop = 
reader->add_array_property<IFloatArrayProperty>(name+":weight", prop);
+       
+       Int32ArraySamplePtr sample_totweight = totweight_prop.getValue(ss);
+       Int32ArraySamplePtr sample_flag = flag_prop.getValue(ss);
+       Int32ArraySamplePtr sample_def_nr = def_nr_prop.getValue(ss);
+       FloatArraySamplePtr sample_weight = weight_prop.getValue(ss);
+       
+       if (sample_totweight->size() != num_data ||
+           sample_flag->size() != num_data)
+               return PTC_READ_SAMPLE_INVALID;
+       
+       const int32_t *data_totweight = (const int32_t 
*)sample_totweight->getData();
+       const int32_t *data_flag = (const int32_t *)sample_flag->getData();
+       const int32_t *data_def_nr = (const int32_t *)sample_def_nr->getData();
+       const float *data_weight = (const float *)sample_weight->getData();
+       
+       MDeformVert *mdef = (MDeformVert *)data;
+       for (int i = 0; i < num_data; ++i) {
+               
+               mdef->totweight = *data_totweight;
+               mdef->flag = *data_flag;
+               
+               MDeformWeight *mw = mdef->dw = (MDeformWeight 
*)MEM_mallocN(sizeof(MDeformWeight) * mdef->totweight, "deformWeight");
+               for (int j = 0; j < mdef->totweight; ++j) {
+                       mw->def_nr = *data_def_nr;
+                       mw->weight = *data_weight;
+                       
+                       ++data_def_nr;
+                       ++data_weight;
+                       ++mw;
+               }
+               
+               ++data_totweight;
+               ++data_flag;
+               ++mdef;
+       }
+       
+       return PTC_READ_SAMPLE_EXACT;
+}
+
+template <>
 PTCReadSampleResult read_sample<CD_ORIGINDEX>(CustomDataReader *reader, 
ICompoundProperty &parent, const ISampleSelector &ss, const std::string &name, 
void *data, int num_data)
 {
        IInt32ArrayProperty prop = 
reader->add_array_property<IInt32ArrayProperty>(name, parent);

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

Reply via email to