From 642cf57976fb1ff1ce7062bf2ebd5b7ae0f1929a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 24 Mar 2017 12:49:58 -0700 Subject: [PATCH] obj-writer now outputs normals --- libraries/fbx/src/OBJWriter.cpp | 36 +++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/libraries/fbx/src/OBJWriter.cpp b/libraries/fbx/src/OBJWriter.cpp index 5ee04c5718..e236ecb0fa 100644 --- a/libraries/fbx/src/OBJWriter.cpp +++ b/libraries/fbx/src/OBJWriter.cpp @@ -40,12 +40,16 @@ static QString formatFloat(double n) { } bool writeOBJToTextStream(QTextStream& out, QList meshes) { + int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h + // each mesh's vertices are numbered from zero. We're combining all their vertices into one list here, // so keep track of the start index for each mesh. QList meshVertexStartOffset; + QList meshNormalStartOffset; int currentVertexStartOffset = 0; + int currentNormalStartOffset = 0; - // write out all vertices + // write out vertices foreach (const MeshPointer& mesh, meshes) { meshVertexStartOffset.append(currentVertexStartOffset); const gpu::BufferView& vertexBuffer = mesh->getVertexBuffer(); @@ -64,10 +68,28 @@ bool writeOBJToTextStream(QTextStream& out, QList meshes) { } out << "\n"; + // write out normals + bool haveNormals = true; + foreach (const MeshPointer& mesh, meshes) { + meshNormalStartOffset.append(currentNormalStartOffset); + const gpu::BufferView& normalsBufferView = mesh->getAttributeBuffer(attributeTypeNormal); + gpu::BufferView::Index numNormals = (gpu::BufferView::Index)normalsBufferView.getNumElements(); + for (gpu::BufferView::Index i = 0; i < numNormals; i++) { + glm::vec3 normal = normalsBufferView.get(i); + out << "vn "; + out << formatFloat(normal[0]) << " "; + out << formatFloat(normal[1]) << " "; + out << formatFloat(normal[2]) << "\n"; + } + currentNormalStartOffset += numNormals; + } + out << "\n"; + // write out faces int nth = 0; foreach (const MeshPointer& mesh, meshes) { currentVertexStartOffset = meshVertexStartOffset.takeFirst(); + currentNormalStartOffset = meshNormalStartOffset.takeFirst(); const gpu::BufferView& partBuffer = mesh->getPartBuffer(); const gpu::BufferView& indexBuffer = mesh->getIndexBuffer(); @@ -104,9 +126,15 @@ bool writeOBJToTextStream(QTextStream& out, QList meshes) { indexCount++; out << "f "; - out << currentVertexStartOffset + index0 + 1 << " "; - out << currentVertexStartOffset + index1 + 1 << " "; - out << currentVertexStartOffset + index2 + 1 << "\n"; + if (haveNormals) { + out << currentVertexStartOffset + index0 + 1 << "//" << currentVertexStartOffset + index0 + 1 << " "; + out << currentVertexStartOffset + index1 + 1 << "//" << currentVertexStartOffset + index1 + 1 << " "; + out << currentVertexStartOffset + index2 + 1 << "//" << currentVertexStartOffset + index2 + 1 << "\n"; + } else { + out << currentVertexStartOffset + index0 + 1 << " "; + out << currentVertexStartOffset + index1 + 1 << " "; + out << currentVertexStartOffset + index2 + 1 << "\n"; + } } out << "\n"; }