[Bf-blender-cvs] [0d45e09] alembic_basic_io: Add support to stream vertex colors for dynamic meshes.
Kévin Dietrich
noreply at git.blender.org
Mon Jun 20 18:59:31 CEST 2016
Commit: 0d45e091babb722659cd0d262f0f67e5ae3d5d95
Author: Kévin Dietrich
Date: Mon Jun 20 16:35:55 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB0d45e091babb722659cd0d262f0f67e5ae3d5d95
Add support to stream vertex colors for dynamic meshes.
===================================================================
M source/blender/alembic/intern/abc_customdata.cc
M source/blender/alembic/intern/abc_customdata.h
M source/blender/alembic/intern/abc_mesh.cc
M source/blender/alembic/intern/alembic_capi.cc
===================================================================
diff --git a/source/blender/alembic/intern/abc_customdata.cc b/source/blender/alembic/intern/abc_customdata.cc
index 8fdc173..c7b568b 100644
--- a/source/blender/alembic/intern/abc_customdata.cc
+++ b/source/blender/alembic/intern/abc_customdata.cc
@@ -225,7 +225,8 @@ using Alembic::AbcGeom::IC4fGeomParam;
using Alembic::AbcGeom::IV2fGeomParam;
static void read_mcols(const CDStreamConfig &config, void *data,
- const C3fArraySamplePtr &c3f_ptr, const C4fArraySamplePtr &c4f_ptr)
+ const C3fArraySamplePtr &c3f_ptr, const C4fArraySamplePtr &c4f_ptr,
+ const Alembic::Abc::ISampleSelector &iss)
{
MCol *cfaces = static_cast<MCol *>(data);
MPoly *polys = config.mpoly;
@@ -269,7 +270,8 @@ static void read_mcols(const CDStreamConfig &config, void *data,
static void read_uvs(const CDStreamConfig &config, void *data,
const Alembic::AbcGeom::V2fArraySamplePtr &uvs,
- const Alembic::AbcGeom::UInt32ArraySamplePtr &indices)
+ const Alembic::AbcGeom::UInt32ArraySamplePtr &indices,
+ const Alembic::Abc::ISampleSelector &iss)
{
MPoly *mpolys = config.mpoly;
MLoopUV *mloopuvs = static_cast<MLoopUV *>(data);
@@ -291,10 +293,12 @@ static void read_uvs(const CDStreamConfig &config, void *data,
}
}
-static void read_custom_data_ex(const ICompoundProperty &prop, const PropertyHeader &prop_header, const CDStreamConfig &config, CustomData *data, int data_type)
+static void read_custom_data_ex(const ICompoundProperty &prop,
+ const PropertyHeader &prop_header,
+ const CDStreamConfig &config,
+ const Alembic::Abc::ISampleSelector &iss,
+ int data_type)
{
- Alembic::Abc::ISampleSelector iss = Alembic::Abc::ISampleSelector(0.0f);
-
void *cd_data = config.add_customdata_cb(config.user_data,
prop_header.getName().c_str(),
data_type);
@@ -318,18 +322,18 @@ static void read_custom_data_ex(const ICompoundProperty &prop, const PropertyHea
c4f_ptr = sample.getVals();
}
- read_mcols(config, cd_data, c3f_ptr, c4f_ptr);
+ read_mcols(config, cd_data, c3f_ptr, c4f_ptr, iss);
}
else if (data_type == CD_MLOOPUV) {
IV2fGeomParam uv_param(prop, prop_header.getName());
IV2fGeomParam::Sample sample;
uv_param.getIndexed(sample, iss);
- read_uvs(config, cd_data, sample.getVals(), sample.getIndices());
+ read_uvs(config, cd_data, sample.getVals(), sample.getIndices(), iss);
}
}
-void read_custom_data(const ICompoundProperty &prop, const CDStreamConfig &config, CustomData *data)
+void read_custom_data(const ICompoundProperty &prop, const CDStreamConfig &config, const Alembic::Abc::ISampleSelector &iss)
{
if (!prop.valid()) {
return;
@@ -349,7 +353,7 @@ void read_custom_data(const ICompoundProperty &prop, const CDStreamConfig &confi
continue;
}
- read_custom_data_ex(prop, prop_header, config, data, CD_MLOOPUV);
+ read_custom_data_ex(prop, prop_header, config, iss, CD_MLOOPUV);
continue;
}
@@ -359,7 +363,7 @@ void read_custom_data(const ICompoundProperty &prop, const CDStreamConfig &confi
continue;
}
- read_custom_data_ex(prop, prop_header, config, data, CD_MLOOPCOL);
+ read_custom_data_ex(prop, prop_header, config, iss, CD_MLOOPCOL);
continue;
}
@@ -369,7 +373,7 @@ void read_custom_data(const ICompoundProperty &prop, const CDStreamConfig &confi
continue;
}
- read_custom_data_ex(prop, prop_header, config, data, CD_MLOOPCOL);
+ read_custom_data_ex(prop, prop_header, config, iss, CD_MLOOPCOL);
continue;
}
}
diff --git a/source/blender/alembic/intern/abc_customdata.h b/source/blender/alembic/intern/abc_customdata.h
index 49a01a8..b1e2293 100644
--- a/source/blender/alembic/intern/abc_customdata.h
+++ b/source/blender/alembic/intern/abc_customdata.h
@@ -79,4 +79,4 @@ void write_custom_data(const OCompoundProperty &prop,
void read_custom_data(const ICompoundProperty &prop,
const CDStreamConfig &config,
- CustomData *data);
+ const Alembic::Abc::ISampleSelector &iss);
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index b3e7fdd..6d337eb 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -953,7 +953,16 @@ void AbcMeshReader::readPolyDataSample(Mesh *mesh,
uvs = uvsamp.getVals();
uvs_indices = uvsamp.getIndices();
- ED_mesh_uv_texture_add(mesh, Alembic::Abc::GetSourceName(uv.getMetaData()).c_str(), true);
+ std::string name = Alembic::Abc::GetSourceName(uv.getMetaData());
+
+ /* According to the convention, primary UVs should have had their name
+ * set using Alembic::Abc::SetSourceName, but you can't expect everyone
+ * to follow it! :) */
+ if (name.empty()) {
+ name = uv.getName();
+ }
+
+ ED_mesh_uv_texture_add(mesh, name.c_str(), true);
}
read_mpolys(mesh->mpoly, mesh->mloop, mesh->mloopuv, &mesh->ldata,
@@ -970,7 +979,7 @@ void AbcMeshReader::readPolyDataSample(Mesh *mesh,
config.user_data = mesh;
config.add_customdata_cb = add_customdata_cb;
- read_custom_data(arb_geom_params, config, &mesh->ldata);
+ read_custom_data(arb_geom_params, config, ISampleSelector(0.0f));
}
void AbcMeshReader::readFaceSetsSample(Main *bmain, Mesh *mesh, size_t poly_start,
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 40359c3..4a85e24 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -702,6 +702,28 @@ void ABC_get_transform(Object *ob, const char *filepath, const char *object_path
/* ***************************************** */
+static void *add_customdata_cb(void *user_data, const char *name, int data_type)
+{
+ DerivedMesh *dm = static_cast<DerivedMesh *>(user_data);
+ CustomDataType cd_data_type = static_cast<CustomDataType>(data_type);
+ void *cd_ptr = NULL;
+
+ if (ELEM(cd_data_type, CD_MLOOPUV, CD_MLOOPCOL)) {
+ cd_ptr = CustomData_get_layer_named(dm->getLoopDataLayout(dm), cd_data_type, name);
+
+ if (cd_ptr == NULL) {
+ cd_ptr = CustomData_add_layer_named(dm->getLoopDataLayout(dm),
+ cd_data_type,
+ CD_DEFAULT,
+ NULL,
+ dm->getNumLoops(dm),
+ name);
+ }
+ }
+
+ return cd_ptr;
+}
+
static DerivedMesh *read_mesh_sample(DerivedMesh *dm, const IObject &iobject, const float time)
{
IPolyMesh mesh(iobject, kWrapExisting);
@@ -713,8 +735,10 @@ static DerivedMesh *read_mesh_sample(DerivedMesh *dm, const IObject &iobject, co
const Alembic::Abc::Int32ArraySamplePtr &face_indices = sample.getFaceIndices();
const Alembic::Abc::Int32ArraySamplePtr &face_counts = sample.getFaceCounts();
+ bool new_dm = false;
if (dm->getNumVerts(dm) != positions->size()) {
dm = CDDM_new(positions->size(), 0, 0, face_indices->size(), face_counts->size());
+ new_dm = true;
}
const IV2fGeomParam uv = schema.getUVsParam();
@@ -722,7 +746,8 @@ static DerivedMesh *read_mesh_sample(DerivedMesh *dm, const IObject &iobject, co
Alembic::Abc::UInt32ArraySamplePtr uvs_indices;
if (uv.valid()) {
- IV2fGeomParam::Sample uvsamp = uv.getExpandedValue(sample_sel);
+ IV2fGeomParam::Sample uvsamp;
+ uv.getIndexed(uvsamp, sample_sel);
uvs = uvsamp.getVals();
uvs_indices = uvsamp.getIndices();
}
@@ -747,12 +772,45 @@ static DerivedMesh *read_mesh_sample(DerivedMesh *dm, const IObject &iobject, co
MPoly *mpolys = dm->getPolyArray(dm);
MLoop *mloops = dm->getLoopArray(dm);
MLoopUV *mloopuvs = static_cast<MLoopUV *>(CustomData_get(&dm->loopData, 0, CD_MLOOPUV));
- CustomData *pdata = dm->getLoopDataLayout(dm);
+
+ if (!mloopuvs && uvs) {
+ std::string name = Alembic::Abc::GetSourceName(uv.getMetaData());
+
+ /* According to the convention, primary UVs should have had their name
+ * set using Alembic::Abc::SetSourceName, but you can't expect everyone
+ * to follow it! :) */
+ if (name.empty()) {
+ name = uv.getName();
+ }
+
+ void *ptr = CustomData_add_layer_named(dm->getLoopDataLayout(dm),
+ CD_MLOOPUV,
+ CD_DEFAULT,
+ NULL,
+ dm->getNumLoops(dm),
+ name.c_str());
+
+ mloopuvs = static_cast<MLoopUV *>(ptr);
+ }
+
+ CustomData *ldata = dm->getLoopDataLayout(dm);
read_mverts(mverts, positions, vertex_normals);
- read_mpolys(mpolys, mloops, mloopuvs, pdata, face_indices, face_counts, uvs, uvs_indices, poly_normals);
+ read_mpolys(mpolys, mloops, mloopuvs, ldata, face_indices, face_counts, uvs, uvs_indices, poly_normals);
+
+ CDStreamConfig config;
+ config.user_data = dm;
+ config.mloop = dm->getLoopArray(dm);
+ config.mpoly = dm->getPolyArray(dm);
+ config.totloop = dm->getNumLoops(dm);
+ config.totpoly = dm->getNumPolys(dm);
+ config.add_customdata_cb = add_customdata_cb;
- CDDM_calc_edges(dm);
+ read_custom_data(schema.getArbGeomParams(), config, sample_sel);
+
+ if (new_dm) {
+ CDDM_calc_edges(dm);
+ }
if (!normals.valid()) {
dm->dirty = static_cast<DMDirtyFlag>(static_cast<int>(dm->dirty) | static_cast<int>(DM_DIRTY_NORMALS));
More information about the Bf-blender-cvs
mailing list