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;

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

Reply via email to