From e7fa745f13dd8cd062f9454071ca7fc4504706f5 Mon Sep 17 00:00:00 2001 From: assiduous Date: Sat, 16 May 2020 20:47:34 -0700 Subject: GLTF Loader: split GLTF vertex data into two streams: pos, normal, uv0, uv1, and joint, weight --- AssetLoader/src/GLTFLoader.cpp | 77 ++++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 32 deletions(-) (limited to 'AssetLoader/src/GLTFLoader.cpp') diff --git a/AssetLoader/src/GLTFLoader.cpp b/AssetLoader/src/GLTFLoader.cpp index ad8a4d1..9536272 100644 --- a/AssetLoader/src/GLTFLoader.cpp +++ b/AssetLoader/src/GLTFLoader.cpp @@ -224,13 +224,14 @@ Model::Model(IRenderDevice* pDevice, LoadFromFile(pDevice, pContext, filename, pTextureCache); } -void Model::LoadNode(IRenderDevice* pDevice, - Node* parent, - const tinygltf::Node& gltf_node, - uint32_t nodeIndex, - const tinygltf::Model& gltf_model, - std::vector& indexBuffer, - std::vector& vertexBuffer) +void Model::LoadNode(IRenderDevice* pDevice, + Node* parent, + const tinygltf::Node& gltf_node, + uint32_t nodeIndex, + const tinygltf::Model& gltf_model, + std::vector& indexBuffer, + std::vector& vertexData0, + std::vector& vertexData1) { std::unique_ptr NewNode(new Node{}); NewNode->Index = nodeIndex; @@ -267,7 +268,7 @@ void Model::LoadNode(IRenderDevice* pDevice, { for (size_t i = 0; i < gltf_node.children.size(); i++) { - LoadNode(pDevice, NewNode.get(), gltf_model.nodes[gltf_node.children[i]], gltf_node.children[i], gltf_model, indexBuffer, vertexBuffer); + LoadNode(pDevice, NewNode.get(), gltf_model.nodes[gltf_node.children[i]], gltf_node.children[i], gltf_model, indexBuffer, vertexData0, vertexData1); } } @@ -281,7 +282,9 @@ void Model::LoadNode(IRenderDevice* pDevice, const tinygltf::Primitive& primitive = gltf_mesh.primitives[j]; uint32_t indexStart = static_cast(indexBuffer.size()); - uint32_t vertexStart = static_cast(vertexBuffer.size()); + uint32_t vertexStart = static_cast(vertexData0.size()); + VERIFY_EXPR(vertexData1.empty() || vertexData0.size() == vertexData1.size()); + uint32_t indexCount = 0; uint32_t vertexCount = 0; float3 PosMin; @@ -367,20 +370,22 @@ void Model::LoadNode(IRenderDevice* pDevice, for (size_t v = 0; v < posAccessor.count; v++) { - Vertex vert{}; - vert.pos = float4(float3::MakeVector(&bufferPos[v * 3]), 1.0f); + VertexAttribs0 vert0{}; + vert0.pos = float4(float3::MakeVector(&bufferPos[v * 3]), 1.0f); // clang-format off - vert.normal = bufferNormals != nullptr ? normalize(float3::MakeVector(&bufferNormals[v * 3])) : float3{}; - vert.uv0 = bufferTexCoordSet0 != nullptr ? float2::MakeVector(&bufferTexCoordSet0[v * 2]) : float2{}; - vert.uv1 = bufferTexCoordSet1 != nullptr ? float2::MakeVector(&bufferTexCoordSet1[v * 2]) : float2{}; + vert0.normal = bufferNormals != nullptr ? normalize(float3::MakeVector(&bufferNormals[v * 3])) : float3{}; + vert0.uv0 = bufferTexCoordSet0 != nullptr ? float2::MakeVector(&bufferTexCoordSet0[v * 2]) : float2{}; + vert0.uv1 = bufferTexCoordSet1 != nullptr ? float2::MakeVector(&bufferTexCoordSet1[v * 2]) : float2{}; // clang-format on + vertexData0.push_back(vert0); + VertexAttribs1 vert1{}; if (hasSkin) { - vert.joint0 = float4::MakeVector(&bufferJoints[v * 4]); - vert.weight0 = float4::MakeVector(&bufferWeights[v * 4]); + vert1.joint0 = float4::MakeVector(&bufferJoints[v * 4]); + vert1.weight0 = float4::MakeVector(&bufferWeights[v * 4]); } - vertexBuffer.push_back(vert); + vertexData1.push_back(vert1); } } @@ -1271,8 +1276,9 @@ void Model::LoadFromFile(IRenderDevice* pDevice, LOG_WARNING_MESSAGE("Loaded gltf file ", filename, " with the following warning:", warning); } - std::vector IndexBuffer; - std::vector VertexBuffer; + std::vector IndexBuffer; + std::vector VertexData0; + std::vector VertexData1; LoadTextureSamplers(pDevice, gltf_model); LoadTextures(pDevice, pContext, gltf_model, LoaderData.BaseDir, pTextureCache); @@ -1283,7 +1289,7 @@ void Model::LoadFromFile(IRenderDevice* pDevice, for (size_t i = 0; i < scene.nodes.size(); i++) { const tinygltf::Node node = gltf_model.nodes[scene.nodes[i]]; - LoadNode(pDevice, nullptr, node, scene.nodes[i], gltf_model, IndexBuffer, VertexBuffer); + LoadNode(pDevice, nullptr, node, scene.nodes[i], gltf_model, IndexBuffer, VertexData0, VertexData1); } if (gltf_model.animations.size() > 0) @@ -1310,33 +1316,40 @@ void Model::LoadFromFile(IRenderDevice* pDevice, Extensions = gltf_model.extensionsUsed; - size_t vertexBufferSize = VertexBuffer.size() * sizeof(Vertex); - size_t indexBufferSize = IndexBuffer.size() * sizeof(Uint32); - - IndexCount = static_cast(IndexBuffer.size()); + { + VERIFY_EXPR(!VertexData0.empty()); + BufferDesc VBDesc; + VBDesc.Name = "GLTF vertex attribs 0 buffer"; + VBDesc.uiSizeInBytes = static_cast(VertexData0.size() * sizeof(VertexData0[0])); + VBDesc.BindFlags = BIND_VERTEX_BUFFER; + VBDesc.Usage = USAGE_STATIC; - VERIFY_EXPR(vertexBufferSize > 0); + BufferData BuffData(VertexData0.data(), VBDesc.uiSizeInBytes); + pDevice->CreateBuffer(VBDesc, &BuffData, &pVertexBuffer[0]); + } { + VERIFY_EXPR(!VertexData1.empty()); BufferDesc VBDesc; - VBDesc.Name = "GLTF vertex buffer"; - VBDesc.uiSizeInBytes = static_cast(vertexBufferSize); + VBDesc.Name = "GLTF vertex attribs 1 buffer"; + VBDesc.uiSizeInBytes = static_cast(VertexData1.size() * sizeof(VertexData1[0])); VBDesc.BindFlags = BIND_VERTEX_BUFFER; VBDesc.Usage = USAGE_STATIC; - BufferData BuffData(VertexBuffer.data(), static_cast(vertexBufferSize)); - pDevice->CreateBuffer(VBDesc, &BuffData, &pVertexBuffer); + BufferData BuffData(VertexData1.data(), VBDesc.uiSizeInBytes); + pDevice->CreateBuffer(VBDesc, &BuffData, &pVertexBuffer[1]); } - if (indexBufferSize > 0) + + if (!IndexBuffer.empty()) { BufferDesc IBDesc; IBDesc.Name = "GLTF inde buffer"; - IBDesc.uiSizeInBytes = static_cast(indexBufferSize); + IBDesc.uiSizeInBytes = static_cast(IndexBuffer.size() * sizeof(IndexBuffer[0])); IBDesc.BindFlags = BIND_INDEX_BUFFER; IBDesc.Usage = USAGE_STATIC; - BufferData BuffData(IndexBuffer.data(), static_cast(indexBufferSize)); + BufferData BuffData(IndexBuffer.data(), IBDesc.uiSizeInBytes); pDevice->CreateBuffer(IBDesc, &BuffData, &pIndexBuffer); } -- cgit v1.2.3