Commit: c685b9f30b5b5e242e9e3254c371e9d5a79b0191 Author: Lukas Tönne Date: Tue May 5 16:59:49 2015 +0200 Branches: alembic https://developer.blender.org/rBc685b9f30b5b5e242e9e3254c371e9d5a79b0191
Alembic support for MSurfaceSample customdata. =================================================================== 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 30d6209..77a9ea7 100644 --- a/source/blender/pointcache/alembic/abc_customdata.cpp +++ b/source/blender/pointcache/alembic/abc_customdata.cpp @@ -255,6 +255,45 @@ void write_sample<CD_ORIGSPACE_MLOOP>(CustomDataWriter *writer, OCompoundPropert prop_uv.set(V2fArraySample(uv_data)); } +template <> +void write_sample<CD_MSURFACE_SAMPLE>(CustomDataWriter *writer, OCompoundProperty &parent, const std::string &name, void *data, int num_data) +{ + OCompoundProperty prop = writer->add_compound_property<OCompoundProperty>(name, parent); + + OUInt32ArrayProperty prop_orig_verts = writer->add_array_property<OUInt32ArrayProperty>(name + ":orig_verts", prop); + OFloatArrayProperty prop_orig_weights = writer->add_array_property<OFloatArrayProperty>(name + ":orig_weights", prop); + OInt32ArrayProperty prop_orig_poly = writer->add_array_property<OInt32ArrayProperty>(name + ":orig_poly", prop); + OUInt32ArrayProperty prop_orig_loops = writer->add_array_property<OUInt32ArrayProperty>(name + ":orig_loops", prop); + + MSurfaceSample *surf = (MSurfaceSample *)data; + std::vector<uint32_t> orig_verts_data; + std::vector<float32_t> orig_weights_data; + std::vector<int32_t> orig_poly_data; + std::vector<uint32_t> orig_loops_data; + orig_verts_data.reserve(num_data * 3); + orig_weights_data.reserve(num_data * 3); + orig_poly_data.reserve(num_data); + orig_loops_data.reserve(num_data * 3); + for (int i = 0; i < num_data; ++i) { + orig_verts_data.push_back(surf->orig_verts[0]); + orig_verts_data.push_back(surf->orig_verts[1]); + orig_verts_data.push_back(surf->orig_verts[2]); + orig_weights_data.push_back(surf->orig_weights[0]); + orig_weights_data.push_back(surf->orig_weights[1]); + orig_weights_data.push_back(surf->orig_weights[2]); + orig_poly_data.push_back(surf->orig_poly); + orig_loops_data.push_back(surf->orig_loops[0]); + orig_loops_data.push_back(surf->orig_loops[1]); + orig_loops_data.push_back(surf->orig_loops[2]); + + ++surf; + } + prop_orig_verts.set(UInt32ArraySample(orig_verts_data)); + prop_orig_weights.set(FloatArraySample(orig_weights_data)); + prop_orig_poly.set(Int32ArraySample(orig_poly_data)); + prop_orig_loops.set(UInt32ArraySample(orig_loops_data)); +} + /* ------------------------------------------------------------------------- */ template <CustomDataType CDTYPE> @@ -522,6 +561,54 @@ PTCReadSampleResult read_sample<CD_ORIGSPACE_MLOOP>(CustomDataReader *reader, IC return PTC_READ_SAMPLE_EXACT; } +template <> +PTCReadSampleResult read_sample<CD_MSURFACE_SAMPLE>(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); + + IUInt32ArrayProperty orig_verts_prop = reader->add_array_property<IUInt32ArrayProperty>(name + ":orig_verts", prop); + IFloatArrayProperty orig_weights_prop = reader->add_array_property<IFloatArrayProperty>(name + ":orig_weights", prop); + IInt32ArrayProperty orig_poly_prop = reader->add_array_property<IInt32ArrayProperty>(name + ":orig_poly", prop); + IUInt32ArrayProperty orig_loops_prop = reader->add_array_property<IUInt32ArrayProperty>(name + ":orig_loops", prop); + + UInt32ArraySamplePtr orig_verts_sample = orig_verts_prop.getValue(ss); + FloatArraySamplePtr orig_weights_sample = orig_weights_prop.getValue(ss); + Int32ArraySamplePtr orig_poly_sample = orig_poly_prop.getValue(ss); + UInt32ArraySamplePtr orig_loops_sample = orig_loops_prop.getValue(ss); + + if (orig_verts_sample->size() != num_data*3 || + orig_weights_sample->size() != num_data*3 || + orig_poly_sample->size() != num_data || + orig_loops_sample->size() != num_data*3) + return PTC_READ_SAMPLE_INVALID; + + MSurfaceSample *surf = (MSurfaceSample *)data; + const uint32_t *orig_verts_data = (const uint32_t *)orig_verts_sample->getData(); + const float32_t *orig_weights_data = (const float32_t *)orig_weights_sample->getData(); + const int32_t *orig_poly_data = (const int32_t *)orig_poly_sample->getData(); + const uint32_t *orig_loops_data = (const uint32_t *)orig_loops_sample->getData(); + for (int i = 0; i < num_data; ++i) { + surf->orig_verts[0] = orig_verts_data[0]; + surf->orig_verts[1] = orig_verts_data[1]; + surf->orig_verts[2] = orig_verts_data[2]; + surf->orig_weights[0] = orig_weights_data[0]; + surf->orig_weights[1] = orig_weights_data[1]; + surf->orig_weights[2] = orig_weights_data[2]; + surf->orig_poly = *orig_poly_data; + surf->orig_loops[0] = orig_loops_data[0]; + surf->orig_loops[1] = orig_loops_data[1]; + surf->orig_loops[2] = orig_loops_data[2]; + + orig_verts_data += 3; + orig_weights_data += 3; + orig_poly_data += 1; + orig_loops_data += 3; + ++surf; + } + + return PTC_READ_SAMPLE_EXACT; +} + /* ========================================================================= */ /* recursive template that handles dispatch by CD layer type */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs