From 2a325d45e0ebb64a046c95371f1357b77d060464 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 15 Dec 2017 09:21:36 +0100 Subject: [PATCH] Mesh color attributes are now stored as RGBA8 --- libraries/fbx/src/FBXReader_Mesh.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/libraries/fbx/src/FBXReader_Mesh.cpp b/libraries/fbx/src/FBXReader_Mesh.cpp index e684332738..2f307f0afa 100644 --- a/libraries/fbx/src/FBXReader_Mesh.cpp +++ b/libraries/fbx/src/FBXReader_Mesh.cpp @@ -41,6 +41,7 @@ #include using vec2h = glm::tvec2; +using ColorType = glm::uint32; class Vertex { public: @@ -596,7 +597,7 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) { assert(normalsSize == tangentsSize); const auto normalsAndTangentsSize = normalsSize + tangentsSize; const int normalsAndTangentsStride = 2 * sizeof(NormalType); - const int colorsSize = fbxMesh.colors.size() * sizeof(glm::vec3); + const int colorsSize = fbxMesh.colors.size() * sizeof(ColorType); // Texture coordinates are stored in 2 half floats const int texCoordsSize = fbxMesh.texCoords.size() * sizeof(vec2h); const int texCoords1Size = fbxMesh.texCoords1.size() * sizeof(vec2h); @@ -623,8 +624,8 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) { attribBuffer->resize(totalAttributeSize); // Interleave normals and tangents - { - QVector normalsAndTangents; + if (normalsSize > 0) { + std::vector normalsAndTangents; normalsAndTangents.reserve(fbxMesh.normals.size() + fbxMesh.tangents.size()); for (auto normalIt = fbxMesh.normals.constBegin(), tangentIt = fbxMesh.tangents.constBegin(); @@ -642,9 +643,18 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) { normalsAndTangents.push_back(packedNormal); normalsAndTangents.push_back(packedTangent); } - attribBuffer->setSubData(normalsOffset, normalsAndTangentsSize, (const gpu::Byte*) normalsAndTangents.constData()); + attribBuffer->setSubData(normalsOffset, normalsAndTangentsSize, (const gpu::Byte*) normalsAndTangents.data()); + } + + if (colorsSize > 0) { + std::vector colors; + + colors.reserve(fbxMesh.colors.size()); + for (const auto& color : fbxMesh.colors) { + colors.push_back(glm::packUnorm4x8(glm::vec4(color, 1.0f))); + } + attribBuffer->setSubData(colorsOffset, colorsSize, (const gpu::Byte*) colors.data()); } - attribBuffer->setSubData(colorsOffset, colorsSize, (const gpu::Byte*) fbxMesh.colors.constData()); if (texCoordsSize > 0) { QVector texCoordData; @@ -698,7 +708,7 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) { if (colorsSize) { mesh->addAttribute(gpu::Stream::COLOR, model::BufferView(attribBuffer, colorsOffset, colorsSize, - gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RGB))); + gpu::Element::COLOR_RGBA_32)); } if (texCoordsSize) { mesh->addAttribute(gpu::Stream::TEXCOORD,