[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