[Bf-blender-cvs] [c685b9f] alembic: Alembic support for MSurfaceSample customdata.
Lukas Tönne
noreply at git.blender.org
Tue May 5 17:00:05 CEST 2015
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 */
More information about the Bf-blender-cvs
mailing list