diff --git a/AssetLoader/interface/GLTFLoader.hpp b/AssetLoader/interface/GLTFLoader.hpp index aba68c3..91f4aef 100644 --- a/AssetLoader/interface/GLTFLoader.hpp +++ b/AssetLoader/interface/GLTFLoader.hpp @@ -284,7 +284,7 @@ struct Model { - struct VertexAttribs0 + struct VertexBasicAttribs { float3 pos; float3 normal; @@ -292,7 +292,7 @@ float2 uv1; }; - struct VertexAttribs1 + struct VertexSkinAttribs { float4 joint0; float4 weight0; @@ -300,8 +300,8 @@ enum BUFFER_ID { - BUFFER_ID_VERTEX0 = 0, - BUFFER_ID_VERTEX1, + BUFFER_ID_VERTEX_BASIC_ATTRIBS = 0, + BUFFER_ID_VERTEX_SKIN_ATTRIBS, BUFFER_ID_INDEX, BUFFER_ID_NUM_BUFFERS }; @@ -348,6 +348,10 @@ /// Optional resource cache usage info. ResourceCacheUseInfo* pCacheInfo = nullptr; + + /// Whether to load animation and initialize skin attributes + /// buffer. + bool LoadAnimationAndSkin = true; }; Model(IRenderDevice* pDevice, IDeviceContext* pContext, @@ -383,11 +387,11 @@ Uint32 GetBaseVertex() const { - auto& VertBuff = Buffers[BUFFER_ID_VERTEX0]; - VERIFY(!VertBuff.pSuballocation || VertBuff.pSuballocation->GetOffset() % sizeof(VertexAttribs0) == 0, + auto& VertBuff = Buffers[BUFFER_ID_VERTEX_BASIC_ATTRIBS]; + VERIFY(!VertBuff.pSuballocation || VertBuff.pSuballocation->GetOffset() % sizeof(VertexBasicAttribs) == 0, "Allocation offset is not multiple of sizeof(VertexAttribs0)"); return VertBuff.pSuballocation ? - static_cast(VertBuff.pSuballocation->GetOffset() / sizeof(VertexAttribs0)) : + static_cast(VertBuff.pSuballocation->GetOffset() / sizeof(VertexBasicAttribs)) : 0; } @@ -400,7 +404,8 @@ Node* parent, const tinygltf::Node& gltf_node, uint32_t nodeIndex, - const tinygltf::Model& gltf_model); + const tinygltf::Model& gltf_model, + bool LoadSkin); void LoadSkins(const tinygltf::Model& gltf_model); diff --git a/AssetLoader/interface/GLTFResourceManager.hpp b/AssetLoader/interface/GLTFResourceManager.hpp index bd3ea19..f42c975 100644 --- a/AssetLoader/interface/GLTFResourceManager.hpp +++ b/AssetLoader/interface/GLTFResourceManager.hpp @@ -82,7 +82,7 @@ RefCntAutoPtr FindAllocation(const char* CacheId); - Uint32 GetResourceVersion() + Uint32 GetTextureVersion() { Uint32 Version = 0; @@ -91,6 +91,11 @@ Version += atlas_it.second->GetVersion(); return Version; + } + + Uint32 GetBufferVersion(Uint32 Index) const + { + return m_BufferSuballocators[Index]->GetVersion(); } IBuffer* GetBuffer(Uint32 Index, IRenderDevice* pDevice, IDeviceContext* pContext) @@ -131,8 +136,6 @@ using TexAllocationsHashMapType = std::unordered_map>; std::mutex m_TexAllocationsMtx; TexAllocationsHashMapType m_TexAllocations; - - std::atomic_uint32_t m_ResourceVersion = {}; }; } // namespace GLTF diff --git a/AssetLoader/src/GLTFLoader.cpp b/AssetLoader/src/GLTFLoader.cpp index 5a1ec56..1382cd9 100644 --- a/AssetLoader/src/GLTFLoader.cpp +++ b/AssetLoader/src/GLTFLoader.cpp @@ -77,9 +77,9 @@ { std::vector Textures; - std::vector IndexData; - std::vector VertexData0; - std::vector VertexData1; + std::vector IndexData; + std::vector VertexBasicData; + std::vector VertexSkinData; }; @@ -265,7 +265,8 @@ Node* parent, const tinygltf::Node& gltf_node, uint32_t nodeIndex, - const tinygltf::Model& gltf_model) + const tinygltf::Model& gltf_model, + bool LoadSkin) { std::unique_ptr NewNode(new Node{}); NewNode->Index = nodeIndex; @@ -305,7 +306,7 @@ { 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); + LoadNode(pDevice, NewNode.get(), gltf_model.nodes[gltf_node.children[i]], gltf_node.children[i], gltf_model, LoadSkin); } } @@ -319,8 +320,8 @@ const tinygltf::Primitive& primitive = gltf_mesh.primitives[j]; uint32_t indexStart = static_cast(InitData->IndexData.size()); - uint32_t vertexStart = static_cast(InitData->VertexData0.size()); - VERIFY_EXPR(InitData->VertexData1.empty() || InitData->VertexData0.size() == InitData->VertexData1.size()); + uint32_t vertexStart = static_cast(InitData->VertexBasicData.size()); + VERIFY_EXPR(InitData->VertexSkinData.empty() || InitData->VertexBasicData.size() == InitData->VertexSkinData.size()); uint32_t indexCount = 0; uint32_t vertexCount = 0; @@ -454,24 +455,27 @@ for (uint32_t v = 0; v < vertexCount; v++) { - VertexAttribs0 vert0{}; - vert0.pos = float4(float3::MakeVector(bufferPos + v * posStride), 1.0f); + VertexBasicAttribs BasicAttribs{}; + BasicAttribs.pos = float4(float3::MakeVector(bufferPos + v * posStride), 1.0f); // clang-format off - vert0.normal = bufferNormals != nullptr ? normalize(float3::MakeVector(bufferNormals + v * normalsStride)) : float3{}; - vert0.uv0 = bufferTexCoordSet0 != nullptr ? float2::MakeVector(bufferTexCoordSet0 + v * texCoordSet0Stride) : float2{}; - vert0.uv1 = bufferTexCoordSet1 != nullptr ? float2::MakeVector(bufferTexCoordSet1 + v * texCoordSet1Stride) : float2{}; + BasicAttribs.normal = bufferNormals != nullptr ? normalize(float3::MakeVector(bufferNormals + v * normalsStride)) : float3{}; + BasicAttribs.uv0 = bufferTexCoordSet0 != nullptr ? float2::MakeVector(bufferTexCoordSet0 + v * texCoordSet0Stride) : float2{}; + BasicAttribs.uv1 = bufferTexCoordSet1 != nullptr ? float2::MakeVector(bufferTexCoordSet1 + v * texCoordSet1Stride) : float2{}; // clang-format on - InitData->VertexData0.push_back(vert0); - - VertexAttribs1 vert1{}; - if (hasSkin) + InitData->VertexBasicData.push_back(BasicAttribs); + + if (LoadSkin) { - vert1.joint0 = bufferJoints8 != nullptr ? - float4::MakeVector(bufferJoints8 + v * jointsStride) : - float4::MakeVector(bufferJoints16 + v * jointsStride); - vert1.weight0 = float4::MakeVector(bufferWeights + v * weightsStride); + VertexSkinAttribs SkinAttribs{}; + if (hasSkin) + { + SkinAttribs.joint0 = bufferJoints8 != nullptr ? + float4::MakeVector(bufferJoints8 + v * jointsStride) : + float4::MakeVector(bufferJoints16 + v * jointsStride); + SkinAttribs.weight0 = float4::MakeVector(bufferWeights + v * weightsStride); + } + InitData->VertexSkinData.push_back(SkinAttribs); } - InitData->VertexData1.push_back(vert1); } } @@ -946,15 +950,15 @@ } }; - if (!InitData->VertexData0.empty()) - { - const auto& VertexData = InitData->VertexData0; - UpdateBuffer(BUFFER_ID_VERTEX0, VertexData.data(), VertexData.size() * sizeof(VertexData[0])); - } - if (!InitData->VertexData1.empty()) - { - const auto& VertexData = InitData->VertexData1; - UpdateBuffer(BUFFER_ID_VERTEX1, VertexData.data(), VertexData.size() * sizeof(VertexData[0])); + if (!InitData->VertexBasicData.empty()) + { + const auto& VertexData = InitData->VertexBasicData; + UpdateBuffer(BUFFER_ID_VERTEX_BASIC_ATTRIBS, VertexData.data(), VertexData.size() * sizeof(VertexData[0])); + } + if (!InitData->VertexSkinData.empty()) + { + const auto& VertexData = InitData->VertexSkinData; + UpdateBuffer(BUFFER_ID_VERTEX_SKIN_ATTRIBS, VertexData.data(), VertexData.size() * sizeof(VertexData[0])); } if (!InitData->IndexData.empty()) { @@ -1668,14 +1672,17 @@ 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); - } - - if (gltf_model.animations.size() > 0) - { - LoadAnimations(gltf_model); - } - LoadSkins(gltf_model); + LoadNode(pDevice, nullptr, node, scene.nodes[i], gltf_model, CI.LoadAnimationAndSkin); + } + + if (CI.LoadAnimationAndSkin) + { + if (gltf_model.animations.size() > 0) + { + LoadAnimations(gltf_model); + } + LoadSkins(gltf_model); + } for (auto* node : LinearNodes) { @@ -1697,11 +1704,11 @@ Extensions = gltf_model.extensionsUsed; { - auto& VertexData0 = InitData->VertexData0; + auto& VertexData0 = InitData->VertexBasicData; auto BufferSize = static_cast(VertexData0.size() * sizeof(VertexData0[0])); if (pResourceMgr != nullptr) { - Buffers[BUFFER_ID_VERTEX0].pSuballocation = pResourceMgr->AllocateBufferSpace(CI.pCacheInfo->VertexBuffer0Idx, BufferSize, 1); + Buffers[BUFFER_ID_VERTEX_BASIC_ATTRIBS].pSuballocation = pResourceMgr->AllocateBufferSpace(CI.pCacheInfo->VertexBuffer0Idx, BufferSize, 1); } else { @@ -1714,18 +1721,19 @@ VBDesc.Usage = USAGE_IMMUTABLE; BufferData BuffData(VertexData0.data(), VBDesc.uiSizeInBytes); - pDevice->CreateBuffer(VBDesc, &BuffData, &Buffers[BUFFER_ID_VERTEX0].pBuffer); + pDevice->CreateBuffer(VBDesc, &BuffData, &Buffers[BUFFER_ID_VERTEX_BASIC_ATTRIBS].pBuffer); VertexData0.clear(); } } - { - auto& VertexData1 = InitData->VertexData1; + if (CI.LoadAnimationAndSkin) + { + auto& VertexData1 = InitData->VertexSkinData; auto BufferSize = static_cast(VertexData1.size() * sizeof(VertexData1[0])); if (pResourceMgr != nullptr) { - Buffers[BUFFER_ID_VERTEX1].pSuballocation = pResourceMgr->AllocateBufferSpace(CI.pCacheInfo->VertexBuffer1Idx, BufferSize, 1); + Buffers[BUFFER_ID_VERTEX_SKIN_ATTRIBS].pSuballocation = pResourceMgr->AllocateBufferSpace(CI.pCacheInfo->VertexBuffer1Idx, BufferSize, 1); } else { @@ -1737,7 +1745,7 @@ VBDesc.Usage = USAGE_IMMUTABLE; BufferData BuffData(VertexData1.data(), VBDesc.uiSizeInBytes); - pDevice->CreateBuffer(VBDesc, &BuffData, &Buffers[BUFFER_ID_VERTEX1].pBuffer); + pDevice->CreateBuffer(VBDesc, &BuffData, &Buffers[BUFFER_ID_VERTEX_SKIN_ATTRIBS].pBuffer); VertexData1.clear(); }