diff options
Diffstat (limited to 'AssetLoader/interface/GLTFLoader.hpp')
| -rw-r--r-- | AssetLoader/interface/GLTFLoader.hpp | 517 |
1 files changed, 0 insertions, 517 deletions
diff --git a/AssetLoader/interface/GLTFLoader.hpp b/AssetLoader/interface/GLTFLoader.hpp deleted file mode 100644 index 3547775..0000000 --- a/AssetLoader/interface/GLTFLoader.hpp +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Copyright 2019-2021 Diligent Graphics LLC - * Copyright 2015-2019 Egor Yusov - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * In no event and under no legal theory, whether in tort (including negligence), - * contract, or otherwise, unless required by applicable law (such as deliberate - * and grossly negligent acts) or agreed to in writing, shall any Contributor be - * liable for any damages, including any direct, indirect, special, incidental, - * or consequential damages of any character arising as a result of this License or - * out of the use or inability to use the software (including but not limited to damages - * for loss of goodwill, work stoppage, computer failure or malfunction, or any and - * all other commercial damages or losses), even if such Contributor has been advised - * of the possibility of such damages. - */ - -#pragma once - -#include <vector> -#include <array> -#include <memory> -#include <cfloat> -#include <unordered_map> -#include <mutex> -#include <atomic> - -#include "../../../DiligentCore/Graphics/GraphicsEngine/interface/RenderDevice.h" -#include "../../../DiligentCore/Graphics/GraphicsEngine/interface/DeviceContext.h" -#include "../../../DiligentCore/Common/interface/RefCntAutoPtr.hpp" -#include "../../../DiligentCore/Common/interface/AdvancedMath.hpp" -#include "GLTFResourceManager.hpp" - -namespace tinygltf -{ - -class Node; -class Model; - -} // namespace tinygltf - -namespace Diligent -{ - -namespace GLTF -{ - -struct ResourceCacheUseInfo -{ - ResourceManager* pResourceMgr = nullptr; - - Uint8 IndexBufferIdx = 0; - Uint8 VertexBuffer0Idx = 0; - Uint8 VertexBuffer1Idx = 0; - - /// Base color texture format. - TEXTURE_FORMAT BaseColorFormat = TEX_FORMAT_RGBA8_UNORM; - - /// Base color texture format for alpha-cut and alpha-blend materials. - TEXTURE_FORMAT BaseColorAlphaFormat = TEX_FORMAT_RGBA8_UNORM; - - /// Physical descriptor texture format. - TEXTURE_FORMAT PhysicalDescFormat = TEX_FORMAT_RGBA8_UNORM; - - /// Normal map format. - TEXTURE_FORMAT NormalFormat = TEX_FORMAT_RGBA8_UNORM; - - /// Occlusion texture format. - TEXTURE_FORMAT OcclusionFormat = TEX_FORMAT_RGBA8_UNORM; - - /// Emissive texture format. - TEXTURE_FORMAT EmissiveFormat = TEX_FORMAT_RGBA8_UNORM; -}; - -struct Material -{ - Material() noexcept - { - TextureIds.fill(-1); - } - - enum PBR_WORKFLOW - { - PBR_WORKFLOW_METALL_ROUGH = 0, - PBR_WORKFLOW_SPEC_GLOSS - }; - - enum ALPHA_MODE - { - ALPHA_MODE_OPAQUE = 0, - ALPHA_MODE_MASK, - ALPHA_MODE_BLEND, - ALPHA_MODE_NUM_MODES - }; - - // Material attributes packed in a shader-friendly format - struct ShaderAttribs - { - float4 BaseColorFactor = float4{1, 1, 1, 1}; - float4 EmissiveFactor = float4{1, 1, 1, 1}; - float4 SpecularFactor = float4{1, 1, 1, 1}; - - int Workflow = PBR_WORKFLOW_METALL_ROUGH; - float BaseColorUVSelector = -1; - float PhysicalDescriptorUVSelector = -1; - float NormalUVSelector = -1; - - float OcclusionUVSelector = -1; - float EmissiveUVSelector = -1; - float BaseColorSlice = 0; - float PhysicalDescriptorSlice = 0; - - float NormalSlice = 0; - float OcclusionSlice = 0; - float EmissiveSlice = 0; - float MetallicFactor = 1; - - float RoughnessFactor = 1; - int AlphaMode = ALPHA_MODE_OPAQUE; - float AlphaCutoff = 0.5f; - float Dummy0; - - // When texture atlas is used, UV scale and bias applied to - // each texture coordinate set - float4 BaseColorUVScaleBias = float4{1, 1, 0, 0}; - float4 PhysicalDescriptorUVScaleBias = float4{1, 1, 0, 0}; - float4 NormalUVScaleBias = float4{1, 1, 0, 0}; - float4 OcclusionUVScaleBias = float4{1, 1, 0, 0}; - float4 EmissiveUVScaleBias = float4{1, 1, 0, 0}; - }; - static_assert(sizeof(ShaderAttribs) % 16 == 0, "ShaderAttribs struct must be 16-byte aligned"); - ShaderAttribs Attribs; - - bool DoubleSided = false; - - enum TEXTURE_ID - { - // Base color for metallic-roughness workflow or - // diffuse color for specular-glossinees workflow - TEXTURE_ID_BASE_COLOR = 0, - - // Metallic-roughness or specular-glossinees map - TEXTURE_ID_PHYSICAL_DESC, - - TEXTURE_ID_NORMAL_MAP, - TEXTURE_ID_OCCLUSION, - TEXTURE_ID_EMISSIVE, - TEXTURE_ID_NUM_TEXTURES - }; - // Texture indices in Model.Textures array - std::array<int, TEXTURE_ID_NUM_TEXTURES> TextureIds = {}; -}; - - -struct Primitive -{ - const Uint32 FirstIndex; - const Uint32 IndexCount; - const Uint32 VertexCount; - const Uint32 MaterialId; - - const BoundBox BB; - - Primitive(Uint32 _FirstIndex, - Uint32 _IndexCount, - Uint32 _VertexCount, - Uint32 _MaterialId, - const float3& BBMin, - const float3& BBMax) : - FirstIndex{_FirstIndex}, - IndexCount{_IndexCount}, - VertexCount{_VertexCount}, - MaterialId{_MaterialId}, - BB{BBMin, BBMax} - { - } - - Primitive(Primitive&&) = default; - - bool HasIndices() const - { - return IndexCount > 0; - } -}; - - - -struct Mesh -{ - std::vector<Primitive> Primitives; - - BoundBox BB; - - // There may be no primitives in the mesh, in which - // case the bounding box will be invalid. - bool IsValidBB() const - { - return !Primitives.empty(); - } - - struct TransformData - { - float4x4 matrix; - std::vector<float4x4> jointMatrices; - }; - - TransformData Transforms; - - Mesh(const float4x4& matrix); -}; - - -struct Node; -struct Skin -{ - std::string Name; - Node* pSkeletonRoot = nullptr; - std::vector<float4x4> InverseBindMatrices; - std::vector<Node*> Joints; -}; - -struct Camera -{ - enum class Projection - { - Unknown, - Perspective, - Orthographic - } Type = Projection::Unknown; - - std::string Name; - - struct PerspectiveAttribs - { - float AspectRatio; - float YFov; - float ZNear; - float ZFar; - }; - struct OrthographicAttribs - { - float XMag; - float YMag; - float ZNear; - float ZFar; - }; - union - { - PerspectiveAttribs Perspective = {}; - OrthographicAttribs Orthographic; - }; - - float4x4 matrix; -}; - -struct Node -{ - std::string Name; - Node* Parent = nullptr; - Uint32 Index; - - std::vector<std::unique_ptr<Node>> Children; - - float4x4 Matrix; - std::unique_ptr<Mesh> pMesh; - std::unique_ptr<Camera> pCamera; - Skin* pSkin = nullptr; - Int32 SkinIndex = -1; - float3 Translation; - float3 Scale = float3{1, 1, 1}; - Quaternion Rotation; - BoundBox BVH; - BoundBox AABB; - - bool IsValidBVH = false; - - float4x4 LocalMatrix() const; - float4x4 GetMatrix() const; - void UpdateTransforms(); -}; - - -struct AnimationChannel -{ - enum PATH_TYPE - { - TRANSLATION, - ROTATION, - SCALE - }; - PATH_TYPE PathType; - Node* pNode = nullptr; - Uint32 SamplerIndex = static_cast<Uint32>(-1); -}; - - -struct AnimationSampler -{ - enum INTERPOLATION_TYPE - { - LINEAR, - STEP, - CUBICSPLINE - }; - INTERPOLATION_TYPE Interpolation; - std::vector<float> Inputs; - std::vector<float4> OutputsVec4; -}; - -struct Animation -{ - std::string Name; - std::vector<AnimationSampler> Samplers; - std::vector<AnimationChannel> Channels; - - float Start = std::numeric_limits<float>::max(); - float End = std::numeric_limits<float>::min(); -}; - - -struct Model -{ - struct VertexBasicAttribs - { - float3 pos; - float3 normal; - float2 uv0; - float2 uv1; - }; - - struct VertexSkinAttribs - { - float4 joint0; - float4 weight0; - }; - - enum BUFFER_ID - { - BUFFER_ID_VERTEX_BASIC_ATTRIBS = 0, - BUFFER_ID_VERTEX_SKIN_ATTRIBS, - BUFFER_ID_INDEX, - BUFFER_ID_NUM_BUFFERS - }; - - Uint32 IndexCount = 0; - - /// Transformation matrix that transforms unit cube [0,1]x[0,1]x[0,1] into - /// axis-aligned bounding box in model space. - float4x4 AABBTransform; - - std::vector<std::unique_ptr<Node>> Nodes; - std::vector<Node*> LinearNodes; - - std::vector<std::unique_ptr<Skin>> Skins; - - std::vector<RefCntAutoPtr<ISampler>> TextureSamplers; - std::vector<Material> Materials; - std::vector<Animation> Animations; - std::vector<std::string> Extensions; - - struct Dimensions - { - float3 min = float3{+FLT_MAX, +FLT_MAX, +FLT_MAX}; - float3 max = float3{-FLT_MAX, -FLT_MAX, -FLT_MAX}; - } dimensions; - - struct TextureCacheType - { - std::mutex TexturesMtx; - - std::unordered_map<std::string, RefCntWeakPtr<ITexture>> Textures; - }; - - /// Model create information - struct CreateInfo - { - /// File name - const char* FileName = nullptr; - - /// Optional texture cache to use when loading the model. - /// The loader will try to find all the textures in the cache - /// and add all new textures to the cache. - TextureCacheType* pTextureCache = nullptr; - - /// Optional resource cache usage info. - ResourceCacheUseInfo* pCacheInfo = nullptr; - - /// Whether to load animation and initialize skin attributes - /// buffer. - bool LoadAnimationAndSkin = true; - - CreateInfo() = default; - - explicit CreateInfo(const char* _FileName, - TextureCacheType* _pTextureCache = nullptr, - ResourceCacheUseInfo* _pCacheInfo = nullptr, - bool _LoadAnimationAndSkin = true) : - // clang-format off - FileName {_FileName}, - pTextureCache {_pTextureCache}, - pCacheInfo {_pCacheInfo}, - LoadAnimationAndSkin{_LoadAnimationAndSkin} - // clang-format on - { - } - }; - Model(IRenderDevice* pDevice, - IDeviceContext* pContext, - const CreateInfo& CI); - - ~Model(); - - void UpdateAnimation(Uint32 index, float time); - - void PrepareGPUResources(IRenderDevice* pDevice, IDeviceContext* pCtx); - - bool IsGPUDataInitialized() const - { - return GPUDataInitialized.load(); - } - - void Transform(const float4x4& Matrix); - - IBuffer* GetBuffer(BUFFER_ID BuffId) - { - return Buffers[BuffId].pBuffer; - } - - ITexture* GetTexture(Uint32 Index) - { - return Textures[Index].pTexture; - } - - Uint32 GetFirstIndexLocation() const - { - auto& IndBuff = Buffers[BUFFER_ID_INDEX]; - VERIFY(!IndBuff.pSuballocation || IndBuff.pSuballocation->GetOffset() % sizeof(Uint32) == 0, - "Allocation offset is not multiple of sizeof(Uint32)"); - return IndBuff.pSuballocation ? - static_cast<Uint32>(IndBuff.pSuballocation->GetOffset() / sizeof(Uint32)) : - 0; - } - - Uint32 GetBaseVertex() const - { - 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<Uint32>(VertBuff.pSuballocation->GetOffset() / sizeof(VertexBasicAttribs)) : - 0; - } - -private: - void LoadFromFile(IRenderDevice* pDevice, - IDeviceContext* pContext, - const CreateInfo& CI); - - void LoadNode(Node* parent, - const tinygltf::Node& gltf_node, - uint32_t nodeIndex, - const tinygltf::Model& gltf_model, - std::vector<Uint32>& IndexData, - std::vector<VertexBasicAttribs>& VertexBasicData, - std::vector<VertexSkinAttribs>* pVertexSkinData); - - void LoadSkins(const tinygltf::Model& gltf_model); - - void LoadTextures(IRenderDevice* pDevice, - const tinygltf::Model& gltf_model, - const std::string& BaseDir, - TextureCacheType* pTextureCache, - ResourceManager* pResourceMgr); - - void LoadTextureSamplers(IRenderDevice* pDevice, const tinygltf::Model& gltf_model); - void LoadMaterials(const tinygltf::Model& gltf_model); - void LoadAnimations(const tinygltf::Model& gltf_model); - void CalculateBoundingBox(Node* node, const Node* parent); - void CalculateSceneDimensions(); - Node* FindNode(Node* parent, Uint32 index); - Node* NodeFromIndex(uint32_t index); - - std::atomic_bool GPUDataInitialized{false}; - - struct BufferInfo - { - RefCntAutoPtr<IBuffer> pBuffer; - RefCntAutoPtr<IBufferSuballocation> pSuballocation; - }; - std::array<BufferInfo, BUFFER_ID_NUM_BUFFERS> Buffers; - - struct TextureInfo - { - RefCntAutoPtr<ITexture> pTexture; - RefCntAutoPtr<ITextureAtlasSuballocation> pAtlasSuballocation; - - bool IsValid() const - { - return pTexture || pAtlasSuballocation; - } - }; - std::vector<TextureInfo> Textures; -}; - -} // namespace GLTF - -} // namespace Diligent |
