[Bf-blender-cvs] [2fdaa37] alembic_basic_io: Fix normal prop read/write scope.

Kévin Dietrich noreply at git.blender.org
Thu Jun 16 16:54:22 CEST 2016


Commit: 2fdaa3787978ea3358961246d65ab5c4ba33aebe
Author: Kévin Dietrich
Date:   Thu Jun 16 15:43:55 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB2fdaa3787978ea3358961246d65ab5c4ba33aebe

Fix normal prop read/write scope.

===================================================================

M	source/blender/alembic/intern/abc_mesh.cc
M	source/blender/alembic/intern/abc_mesh.h
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 8652bb4..dc5d375 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -395,7 +395,7 @@ void AbcMeshWriter::writeMesh(DerivedMesh *dm)
 
 		ON3fGeomParam::Sample normals_sample;
 		if (!normals.empty()) {
-			normals_sample.setScope(kFacevaryingScope);
+			normals_sample.setScope(kVertexScope);
 			normals_sample.setVals(
 			            V3fArraySample(
 			                (const Imath::V3f *)&normals.front(),
@@ -830,16 +830,32 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
 
 		const ISubDSchema::Sample sample = m_subd_schema.getValue(sample_sel);
 
-		readVertexDataSample(mesh, sample.getPositions(), IN3fGeomParam());
-		readPolyDataSample(mesh, sample.getFaceIndices(), sample.getFaceCounts());
+		readVertexDataSample(mesh, sample.getPositions(), N3fArraySamplePtr());
+		readPolyDataSample(mesh, sample.getFaceIndices(), sample.getFaceCounts(), N3fArraySamplePtr());
 	}
 	else {
 		is_constant = !has_animations(m_schema, m_settings);
 
 		const IPolyMeshSchema::Sample sample = m_schema.getValue(sample_sel);
 
-		readVertexDataSample(mesh, sample.getPositions(), m_schema.getNormalsParam());
-		readPolyDataSample(mesh, sample.getFaceIndices(), sample.getFaceCounts());
+		N3fArraySamplePtr vertex_normals, poly_normals;
+		const IN3fGeomParam normals = m_schema.getNormalsParam();
+
+		if (normals.valid()) {
+			IN3fGeomParam::Sample normsamp = normals.getExpandedValue(sample_sel);
+
+			if (normals.getScope() == Alembic::AbcGeom::kFacevaryingScope) {
+				poly_normals = normsamp.getVals();
+			}
+			else if ((normals.getScope() == Alembic::AbcGeom::kVertexScope) ||
+			         (normals.getScope() == Alembic::AbcGeom::kVaryingScope))
+			{
+				vertex_normals = normsamp.getVals();
+			}
+		}
+
+		readVertexDataSample(mesh, sample.getPositions(), vertex_normals);
+		readPolyDataSample(mesh, sample.getFaceIndices(), sample.getFaceCounts(), poly_normals);
 	}
 
 	BKE_mesh_validate(mesh, false, false);
@@ -861,18 +877,10 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
 
 void AbcMeshReader::readVertexDataSample(Mesh *mesh,
                                          const P3fArraySamplePtr &positions,
-                                         const IN3fGeomParam &normals)
+                                         const N3fArraySamplePtr &normals)
 {
 	utils::mesh_add_verts(mesh, positions->size());
-
-	N3fArraySamplePtr normal_vals;
-
-	if (normals.valid()) {
-		IN3fGeomParam::Sample normsamp = normals.getExpandedValue();
-		normal_vals = normsamp.getVals();
-	}
-
-	read_mverts(mesh->mvert, positions, normal_vals);
+	read_mverts(mesh->mvert, positions, normals);
 }
 
 static void *add_customdata_cb(void *user_data, const char *name, int data_type)
@@ -900,7 +908,8 @@ static void *add_customdata_cb(void *user_data, const char *name, int data_type)
 
 void AbcMeshReader::readPolyDataSample(Mesh *mesh,
                                        const Int32ArraySamplePtr &face_indices,
-                                       const Int32ArraySamplePtr &face_counts)
+                                       const Int32ArraySamplePtr &face_counts,
+                                       const N3fArraySamplePtr &normals)
 {
 	const size_t num_poly = face_counts->size();
 	const size_t num_loops = face_indices->size();
@@ -919,16 +928,8 @@ void AbcMeshReader::readPolyDataSample(Mesh *mesh,
 		ED_mesh_uv_texture_add(mesh, Alembic::Abc::GetSourceName(uv.getMetaData()).c_str(), true);
 	}
 
-	const IN3fGeomParam normals = m_schema.valid() ? m_schema.getNormalsParam() : IN3fGeomParam();
-	N3fArraySamplePtr normal_vals;
-
-	if (normals.valid()) {
-		IN3fGeomParam::Sample normsamp = normals.getExpandedValue();
-		normal_vals = normsamp.getVals();
-	}
-
 	read_mpolys(mesh->mpoly, mesh->mloop, mesh->mloopuv, &mesh->pdata,
-	            face_indices, face_counts, uvsamp_vals, normal_vals);
+	            face_indices, face_counts, uvsamp_vals, normals);
 
 	const ICompoundProperty &arb_geom_params = (m_schema.valid() ? m_schema.getArbGeomParams()
 	                                                             : m_subd_schema.getArbGeomParams());
diff --git a/source/blender/alembic/intern/abc_mesh.h b/source/blender/alembic/intern/abc_mesh.h
index 656e38a..fe7324b 100644
--- a/source/blender/alembic/intern/abc_mesh.h
+++ b/source/blender/alembic/intern/abc_mesh.h
@@ -108,11 +108,12 @@ private:
 
 	void readPolyDataSample(Mesh *mesh,
 	                        const Alembic::AbcGeom::Int32ArraySamplePtr &face_indices,
-                            const Alembic::AbcGeom::Int32ArraySamplePtr &face_counts);
+                            const Alembic::AbcGeom::Int32ArraySamplePtr &face_counts,
+	                        const Alembic::AbcGeom::N3fArraySamplePtr &normals);
 
 	void readVertexDataSample(Mesh *mesh,
 	                          const Alembic::AbcGeom::P3fArraySamplePtr &positions,
-	                          const Alembic::AbcGeom::IN3fGeomParam &normals);
+	                          const Alembic::AbcGeom::N3fArraySamplePtr &normals);
 };
 
 /* ************************************************************************** */
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 1ed3253..6b4c91e 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -732,7 +732,9 @@ static DerivedMesh *read_mesh_sample(DerivedMesh *dm, const IObject &iobject, co
 		if (normals.getScope() == Alembic::AbcGeom::kFacevaryingScope) {
 			poly_normals = normsamp.getVals();
 		}
-		else {
+		else if ((normals.getScope() == Alembic::AbcGeom::kVertexScope) ||
+		         (normals.getScope() == Alembic::AbcGeom::kVaryingScope))
+		{
 			vertex_normals = normsamp.getVals();
 		}
 	}




More information about the Bf-blender-cvs mailing list