[Bf-blender-cvs] [7b2ce1d] alembic_basic_io: Normals from the Alembic archive are not read anymore.
Kévin Dietrich
noreply at git.blender.org
Thu Jul 14 14:43:18 CEST 2016
Commit: 7b2ce1dd13c49533f2f257db56691ac37cf616f0
Author: Kévin Dietrich
Date: Thu Jul 14 13:52:16 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB7b2ce1dd13c49533f2f257db56691ac37cf616f0
Normals from the Alembic archive are not read anymore.
Now we generate the normals on the Blender side and set polygon smooth
flag if needed.
===================================================================
M source/blender/alembic/intern/abc_mesh.cc
M source/blender/alembic/intern/alembic_capi.cc
===================================================================
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index a5f7c4e..ed253d1 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -871,7 +871,6 @@ static void read_mpolys(CDStreamConfig &config, const AbcMeshData &mesh_data)
MPoly *mpolys = config.mpoly;
MLoop *mloops = config.mloop;
MLoopUV *mloopuvs = config.mloopuv;
- CustomData *ldata = config.loopdata;
const Int32ArraySamplePtr &face_indices = mesh_data.face_indices;
const Int32ArraySamplePtr &face_counts = mesh_data.face_counts;
@@ -879,24 +878,10 @@ static void read_mpolys(CDStreamConfig &config, const AbcMeshData &mesh_data)
const UInt32ArraySamplePtr &uvs_indices = mesh_data.uvs_indices;
const N3fArraySamplePtr &normals = mesh_data.face_normals;
- float (*pnors)[3] = NULL;
-
- if (normals) {
- void *vptr = CustomData_get_layer(ldata, CD_NORMAL);
-
- if (!vptr) {
- vptr = CustomData_add_layer(ldata, CD_NORMAL, CD_CALLOC, NULL, normals->size());
- }
-
- pnors = static_cast<float (*)[3]>(vptr);
- }
-
- const bool do_normals = (normals && pnors);
const bool do_uvs = (mloopuvs && uvs && uvs_indices) && (uvs_indices->size() == face_indices->size());
unsigned int loop_index = 0;
unsigned int rev_loop_index = 0;
unsigned int uv_index = 0;
- Imath::V3f nor;
for (int i = 0; i < face_counts->size(); ++i) {
const int face_size = (*face_counts)[i];
@@ -905,6 +890,10 @@ static void read_mpolys(CDStreamConfig &config, const AbcMeshData &mesh_data)
poly.loopstart = loop_index;
poly.totloop = face_size;
+ if (normals != NULL) {
+ poly.flag |= ME_SMOOTH;
+ }
+
/* NOTE: Alembic data is stored in the reverse order. */
rev_loop_index = loop_index + (face_size - 1);
@@ -912,11 +901,6 @@ static void read_mpolys(CDStreamConfig &config, const AbcMeshData &mesh_data)
MLoop &loop = mloops[rev_loop_index];
loop.v = (*face_indices)[loop_index];
- if (do_normals) {
- nor = (*normals)[loop_index];
- copy_yup_zup(pnors[rev_loop_index], nor.getValue());
- }
-
if (do_uvs) {
MLoopUV &loopuv = mloopuvs[rev_loop_index];
@@ -958,6 +942,10 @@ ABC_INLINE void read_uvs_params(CDStreamConfig &config,
}
}
+/* TODO(kevin): normals from Alembic files are not read in anymore, this is due
+ * to the fact that there are many issues that are not so easy to solve, mainly
+ * regarding the way normals are handled in Blender (MPoly.flag vs loop normals).
+ */
ABC_INLINE void read_normals_params(AbcMeshData &abc_data,
const IN3fGeomParam &normals,
const ISampleSelector &selector)
@@ -972,7 +960,7 @@ ABC_INLINE void read_normals_params(AbcMeshData &abc_data,
abc_data.face_normals = normsamp.getVals();
}
else if ((normals.getScope() == kVertexScope) || (normals.getScope() == kVaryingScope)) {
- abc_data.vertex_normals = normsamp.getVals();
+ abc_data.vertex_normals = N3fArraySamplePtr();
}
}
@@ -1046,13 +1034,10 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
m_mesh_data = create_config(mesh);
- bool do_normals = false;
- read_mesh_sample(m_schema, sample_sel, m_mesh_data, do_normals);
-
- if (do_normals) {
- BKE_mesh_calc_normals(mesh);
- }
+ bool has_smooth_normals = false;
+ read_mesh_sample(m_schema, sample_sel, m_mesh_data, has_smooth_normals);
+ BKE_mesh_calc_normals(mesh);
BKE_mesh_validate(mesh, false, false);
readFaceSetsSample(bmain, mesh, 0, sample_sel);
@@ -1125,7 +1110,7 @@ void read_mesh_sample(const IPolyMeshSchema &schema,
read_normals_params(abc_mesh_data, schema.getNormalsParam(), selector);
- do_normals = (!abc_mesh_data.face_normals && !abc_mesh_data.vertex_normals);
+ do_normals = (abc_mesh_data.face_normals != NULL);
read_uvs_params(config, abc_mesh_data, schema.getUVsParam(), selector);
@@ -1204,6 +1189,7 @@ void AbcSubDReader::readObjectData(Main *bmain, Scene *scene, float time)
read_custom_data(m_schema.getArbGeomParams(), m_mesh_data, sample_sel);
+ BKE_mesh_calc_normals(mesh);
BKE_mesh_validate(mesh, false, false);
if (has_animations(m_schema, m_settings)) {
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 1ed162a..691aa06 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -854,6 +854,22 @@ static void *add_customdata_cb(void *user_data, const char *name, int data_type)
return cd_ptr;
}
+ABC_INLINE CDStreamConfig get_config(DerivedMesh *dm)
+{
+ CDStreamConfig config;
+
+ config.user_data = dm;
+ config.mvert = dm->getVertArray(dm);
+ config.mloop = dm->getLoopArray(dm);
+ config.mpoly = dm->getPolyArray(dm);
+ config.totloop = dm->getNumLoops(dm);
+ config.totpoly = dm->getNumPolys(dm);
+ config.loopdata = dm->getLoopDataLayout(dm);
+ config.add_customdata_cb = add_customdata_cb;
+
+ return config;
+}
+
static DerivedMesh *read_mesh_sample(DerivedMesh *dm, const IObject &iobject, const float time)
{
IPolyMesh mesh(iobject, kWrapExisting);
@@ -865,46 +881,32 @@ 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 has_smooth_flag = false;
- bool new_dm = false;
+ DerivedMesh *new_dm = NULL;
if (dm->getNumVerts(dm) != positions->size()) {
- /* Check if we have ME_SMOOTH flag set to restore it later on. */
- has_smooth_flag = check_smooth_poly_flag(dm);
-
- DerivedMesh *tmp = CDDM_from_template(dm,
- positions->size(),
- 0,
- 0,
- face_indices->size(),
- face_counts->size());
- dm = tmp;
- new_dm = true;
+ new_dm = CDDM_from_template(dm,
+ positions->size(),
+ 0,
+ 0,
+ face_indices->size(),
+ face_counts->size());
}
- CDStreamConfig config;
- config.user_data = dm;
- config.mvert = dm->getVertArray(dm);
- config.mloop = dm->getLoopArray(dm);
- config.mpoly = dm->getPolyArray(dm);
- config.totloop = dm->getNumLoops(dm);
- config.totpoly = dm->getNumPolys(dm);
- config.loopdata = dm->getLoopDataLayout(dm);
- config.add_customdata_cb = add_customdata_cb;
+ CDStreamConfig config = get_config(new_dm ? new_dm : dm);
- bool do_normals = false;
- read_mesh_sample(schema, sample_sel, config, do_normals);
+ bool has_loop_normals = false;
+ read_mesh_sample(schema, sample_sel, config, has_loop_normals);
if (new_dm) {
- if (do_normals) {
- CDDM_calc_normals(dm);
+ /* Check if we had ME_SMOOTH flag set to restore it. */
+ if (!has_loop_normals && check_smooth_poly_flag(dm)) {
+ set_smooth_poly_flag(new_dm);
}
- if (has_smooth_flag) {
- set_smooth_poly_flag(dm);
- }
+ CDDM_calc_normals(new_dm);
+ CDDM_calc_edges(new_dm);
- CDDM_calc_edges(dm);
+ return new_dm;
}
return dm;
@@ -923,32 +925,30 @@ static DerivedMesh *read_subd_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;
+ DerivedMesh *new_dm = NULL;
+
if (dm->getNumVerts(dm) != positions->size()) {
- DerivedMesh *tmp = CDDM_from_template(dm,
- positions->size(),
- 0,
- 0,
- face_indices->size(),
- face_counts->size());
- dm = tmp;
- new_dm = true;
+ new_dm = CDDM_from_template(dm,
+ positions->size(),
+ 0,
+ 0,
+ face_indices->size(),
+ face_counts->size());
}
- CDStreamConfig config;
- config.user_data = dm;
- config.mvert = dm->getVertArray(dm);
- config.mloop = dm->getLoopArray(dm);
- config.mpoly = dm->getPolyArray(dm);
- config.totloop = dm->getNumLoops(dm);
- config.totpoly = dm->getNumPolys(dm);
- config.loopdata = dm->getLoopDataLayout(dm);
- config.add_customdata_cb = add_customdata_cb;
-
+ CDStreamConfig config = get_config(new_dm ? new_dm : dm);
read_subd_sample(schema, sample_sel, config);
if (new_dm) {
- CDDM_calc_edges(dm);
+ /* Check if we had ME_SMOOTH flag set to restore it. */
+ if (check_smooth_poly_flag(dm)) {
+ set_smooth_poly_flag(new_dm);
+ }
+
+ CDDM_calc_normals(new_dm);
+ CDDM_calc_edges(new_dm);
+
+ return new_dm;
}
return dm;
More information about the Bf-blender-cvs
mailing list