[Bf-blender-cvs] [c7abdb4] alembic_basic_io: Add support for reading normals.
Kévin Dietrich
noreply at git.blender.org
Tue Jun 14 16:58:47 CEST 2016
Commit: c7abdb430f32a8aee886f7f6e4fa5854e9ef25a5
Author: Kévin Dietrich
Date: Tue Jun 14 11:46:08 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBc7abdb430f32a8aee886f7f6e4fa5854e9ef25a5
Add support for reading normals.
Also rewrite the normals write code, and add utility functions for Y-up
<-> Z-up conversion.
===================================================================
M source/blender/alembic/intern/abc_hair.cc
M source/blender/alembic/intern/abc_mesh.cc
M source/blender/alembic/intern/abc_mesh.h
M source/blender/alembic/intern/abc_nurbs.cc
M source/blender/alembic/intern/abc_points.cc
M source/blender/alembic/intern/abc_util.cc
M source/blender/alembic/intern/abc_util.h
M source/blender/alembic/intern/alembic_capi.cc
===================================================================
diff --git a/source/blender/alembic/intern/abc_hair.cc b/source/blender/alembic/intern/abc_hair.cc
index 90f2061..a4cdb79 100644
--- a/source/blender/alembic/intern/abc_hair.cc
+++ b/source/blender/alembic/intern/abc_hair.cc
@@ -346,10 +346,7 @@ void AbcHairReader::readObjectData(Main *bmain, Scene *scene, float time)
for (int j = 0; j < steps; ++j, ++bp) {
Imath::V3f pos = (*positions)[idx++];
- /* Convert Y-up to Z-up. */
- bp->vec[0] = pos.x;
- bp->vec[1] = -pos.z;
- bp->vec[2] = pos.y;
+ copy_yup_zup(bp->vec, pos.getValue());
bp->vec[3] = 1.0;
bp->radius = bp->weight = 1.0;
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index 997128a..e43142b 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -88,21 +88,20 @@ using Alembic::AbcGeom::kVaryingScope;
using Alembic::AbcGeom::kVertexScope;
using Alembic::AbcGeom::kWrapExisting;
using Alembic::AbcGeom::UInt32ArraySample;
+using Alembic::AbcGeom::N3fArraySamplePtr;
+using Alembic::AbcGeom::IN3fGeomParam;
/* ************************************************************************** */
static void get_vertices(DerivedMesh *dm, std::vector<float> &points)
{
points.clear();
- points.reserve(dm->getNumVerts(dm) * 3);
+ points.resize(dm->getNumVerts(dm) * 3);
MVert *verts = dm->getVertArray(dm);
for (int i = 0, e = dm->getNumVerts(dm); i < e; ++i) {
- /* Convert Z-up to Y-up. */
- points.push_back(verts[i].co[0]);
- points.push_back(verts[i].co[2]);
- points.push_back(-verts[i].co[1]);
+ copy_zup_yup(&points[i * 3], verts[i].co);
}
}
@@ -283,69 +282,40 @@ void write_extra_uvs(Schema &schema, DerivedMesh *dm, bool pack_uv)
}
}
-static void get_normals(DerivedMesh *dm, std::vector<float> &norms)
+static void get_normals(DerivedMesh *dm, std::vector<float> &normals)
{
- norms.clear();
- norms.reserve(dm->getNumVerts(dm));
+ MPoly *mpoly = dm->getPolyArray(dm);
+ MPoly *mp = mpoly;
- const float nscale = 1.0f / 32767.0f;
+ MLoop *mloop = dm->getLoopArray(dm);
+ MLoop *ml = mloop;
MVert *verts = dm->getVertArray(dm);
- MFace *faces = dm->getTessFaceArray(dm);
-
- for (int i = 0, e = dm->getNumTessFaces(dm); i < e; ++i) {
- MFace *face = &faces[i];
- if (face->flag & ME_SMOOTH) {
- int index = face->v4;
+ const size_t num_normals = dm->getNumVerts(dm) * 3;
- if (face->v4) {
- norms.push_back(verts[index].no[0] * nscale);
- norms.push_back(verts[index].no[1] * nscale);
- norms.push_back(verts[index].no[2] * nscale);
- }
-
- index = face->v3;
- norms.push_back(verts[index].no[0] * nscale);
- norms.push_back(verts[index].no[1] * nscale);
- norms.push_back(verts[index].no[2] * nscale);
+ normals.clear();
+ normals.resize(num_normals);
- index = face->v2;
- norms.push_back(verts[index].no[0] * nscale);
- norms.push_back(verts[index].no[1] * nscale);
- norms.push_back(verts[index].no[2] * nscale);
+ for (int i = 0, e = dm->getNumPolys(dm); i < e; ++i, ++mp) {
+ float no[3];
- index = face->v1;
- norms.push_back(verts[index].no[0] * nscale);
- norms.push_back(verts[index].no[1] * nscale);
- norms.push_back(verts[index].no[2] * nscale);
+ /* Flat shaded, use common normal for all verts. */
+ if ((mp->flag & ME_SMOOTH) == 0) {
+ BKE_mesh_calc_poly_normal(mp, ml, verts, no);
}
- else {
- float no[3];
- if (face->v4) {
- normal_quad_v3(no, verts[face->v1].co, verts[face->v2].co,
- verts[face->v3].co, verts[face->v4].co);
+ for (int j = 0; j < mp->totloop; ++ml, ++j) {
+ int index = ml->v;
- norms.push_back(no[0]);
- norms.push_back(no[1]);
- norms.push_back(no[2]);
+ /* Smooth shaded, use individual vert normals. */
+ if (mp->flag & ME_SMOOTH) {
+ normal_short_to_float_v3(no, verts[index].no);
+ copy_zup_yup(&normals[index * 3], no);
+ }
+ else {
+ copy_zup_yup(&normals[index * 3], no);
}
- else
- normal_tri_v3(no, verts[face->v1].co, verts[face->v2].co,
- verts[face->v3].co);
-
- norms.push_back(no[0]);
- norms.push_back(no[1]);
- norms.push_back(no[2]);
-
- norms.push_back(no[0]);
- norms.push_back(no[1]);
- norms.push_back(no[2]);
-
- norms.push_back(no[0]);
- norms.push_back(no[1]);
- norms.push_back(no[2]);
}
}
}
@@ -523,16 +493,16 @@ void AbcMeshWriter::writeMesh()
if (m_settings.export_normals) {
get_normals(dm, normals);
- ON3fGeomParam::Sample normalsSamp;
+ ON3fGeomParam::Sample normals_sample;
if (!normals.empty()) {
- normalsSamp.setScope(kFacevaryingScope);
- normalsSamp.setVals(
+ normals_sample.setScope(kFacevaryingScope);
+ normals_sample.setVals(
V3fArraySample(
- (const Imath::V3f *) &normals.front(),
+ (const Imath::V3f *)&normals.front(),
normals.size() / 3));
}
- m_mesh_sample.setNormals(normalsSamp);
+ m_mesh_sample.setNormals(normals_sample);
}
m_mesh_sample.setSelfBounds(bounds());
@@ -903,32 +873,22 @@ void AbcMeshWriter::getVelocities(DerivedMesh *dm, std::vector<float> &vels)
const int totverts = dm->getNumVerts(dm);
vels.clear();
- vels.reserve(totverts);
+ vels.resize(totverts * 3);
ModifierData *md = get_fluid_sim_modifier(m_scene, m_object);
FluidsimModifierData *fmd = reinterpret_cast<FluidsimModifierData *>(md);
FluidsimSettings *fss = fmd->fss;
if (fss->meshVelocities) {
- float *meshVels = reinterpret_cast<float *>(fss->meshVelocities);
- float vel[3];
+ float *mesh_vels = reinterpret_cast<float *>(fss->meshVelocities);
for (int i = 0; i < totverts; ++i) {
- copy_v3_v3(vel, meshVels);
-
- /* Convert Z-up to Y-up. */
- vels.push_back(vels[0]);
- vels.push_back(vels[2]);
- vels.push_back(-vels[1]);
- meshVels += 3;
+ copy_zup_yup(&vels[i * 3], mesh_vels);
+ mesh_vels += 3;
}
}
else {
- for (int i = 0; i < totverts; ++i) {
- vels.push_back(0);
- vels.push_back(0);
- vels.push_back(0);
- }
+ std::fill(vels.begin(), vels.end(), 0.0f);
}
}
@@ -1184,7 +1144,7 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
const ISubDSchema::Sample sample = m_subd_schema.getValue(sample_sel);
- readVertexDataSample(mesh, sample.getPositions());
+ readVertexDataSample(mesh, sample.getPositions(), IN3fGeomParam());
readPolyDataSample(mesh, sample.getFaceIndices(), sample.getFaceCounts());
}
else {
@@ -1192,7 +1152,7 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
const IPolyMeshSchema::Sample sample = m_schema.getValue(sample_sel);
- readVertexDataSample(mesh, sample.getPositions());
+ readVertexDataSample(mesh, sample.getPositions(), m_schema.getNormalsParam());
readPolyDataSample(mesh, sample.getFaceIndices(), sample.getFaceCounts());
}
@@ -1213,10 +1173,20 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene *scene, float time)
}
}
-void AbcMeshReader::readVertexDataSample(Mesh *mesh, const P3fArraySamplePtr &positions)
+void AbcMeshReader::readVertexDataSample(Mesh *mesh,
+ const P3fArraySamplePtr &positions,
+ const IN3fGeomParam &normals)
{
utils::mesh_add_verts(mesh, positions->size());
- read_mverts(mesh->mvert, positions);
+
+ N3fArraySamplePtr normal_vals;
+
+ if (normals.valid()) {
+ IN3fGeomParam::Sample normsamp = normals.getExpandedValue();
+ normal_vals = normsamp.getVals();
+ }
+
+ read_mverts(mesh->mvert, positions, normal_vals);
}
void AbcMeshReader::readPolyDataSample(Mesh *mesh,
@@ -1331,17 +1301,26 @@ void AbcMeshReader::readFaceSetsSample(Main *bmain, Mesh *mesh, size_t poly_star
/* ************************************************************************** */
-void read_mverts(MVert *mverts, const Alembic::AbcGeom::P3fArraySamplePtr &positions)
+void read_mverts(MVert *mverts,
+ const Alembic::AbcGeom::P3fArraySamplePtr &positions,
+ const N3fArraySamplePtr &normals)
{
for (int i = 0; i < positions->size(); ++i) {
MVert &mvert = mverts[i];
Imath::V3f pos_in = (*positions)[i];
- /* Convert Y-up to Z-up. */
- mvert.co[0] = pos_in[0];
- mvert.co[1] = -pos_in[2];
- mvert.co[2] = pos_in[1];
+ copy_yup_zup(mvert.co, pos_in.getValue());
+
mvert.bweight = 0;
+
+ if (normals) {
+ Imath::V3f nor_in = (*normals)[i];
+
+ short no[3];
+ normal_float_to_short_v3(no, nor_in.getValue());
+
+ copy_yup_zup(mvert.no, no);
+ }
}
}
diff --git a/source/blender/alembic/intern/abc_mesh.h b/source/blender/alembic/intern/abc_mesh.h
index 418ccee..e698e42 100644
--- a/source/blender/alembic/intern/abc_mesh.h
+++ b/source/blender/alembic/intern/abc_mesh.h
@@ -122,7 +122,8 @@ private:
const Alembic::AbcGeom::Int32ArraySamplePtr &face_counts);
void readVertexDataSample(Mesh *mesh,
- const Alembic::AbcGeom::P3fArraySamplePtr &positions);
+ const Alembic::AbcGeom::P3fArraySamplePtr &positions,
+ const Alembic::AbcGeom::IN3fGeomParam &normals);
};
/* ************************************************************************** */
@@ -132,7 +133,10 @@ struct MLoopUV;
struct MPoly;
struct MVert;
-void read_mverts(MVert *mverts, const Alembic::AbcGeom::P3fArraySamplePtr &positions);
+void read_mverts(MVert *mverts,
+ const Alembic::AbcGeom::P3fArraySamplePtr &positions,
+ const Alembic::AbcGeom::N3fArraySamplePtr &normals);
+
void read_mpolys(MPoly *mpolys, MLoop *mloops, MLoopUV *mloopuvs,
const Alembic::AbcGeom::Int32ArraySamplePtr &face_indices,
const Alembic::AbcGeom::Int32ArraySamplePtr &face_counts,
diff --git a/source/blender/alembic/intern/abc_nurbs.cc b/source/blender/alembic/intern/abc_nurbs.cc
index f91f00c..c2b6f4d 100644
--- a/source/blender/alembic/intern/abc_nurbs.cc
+++ b/source/blender/alembic/intern/abc_nurbs.cc
@@ -271,9 +271,7 @@ void AbcNurbsReader::readObjectData(Main *bmain, Scene *scene, float time)
}
/* Convert Y-up to Z-up. */
- nu->bp[i].vec[0]
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list