// ============================================= // Aster: model_loader.h // Copyright (c) 2020-2024 Anish Bhobe // ============================================= #pragma once #include "buffer.h" #include "global.h" #include "image.h" #include "render_resource_manager.h" #include struct TextureHandle; struct Texture; constexpr auto GLTF_ASCII_FILE_EXTENSION = ".gltf"; constexpr auto GLTF_BINARY_FILE_EXTENSION = ".glb"; struct MeshPrimitive { u32 m_VertexOffset; i32 m_NormalOffset; // <0 for invalid i32 m_TexCoord0Offset; // <0 for invalid u32 m_FirstIndex; u32 m_IndexCount; i32 m_MaterialIdx; // <0 for invalid }; struct Material { vec4 m_AlbedoFactor; vec3 m_EmissionFactor; f32 m_MetalFactor; f32 m_RoughFactor; TextureHandle m_AlbedoTex; TextureHandle m_NormalTex; TextureHandle m_MetalRoughTex; TextureHandle m_OcclusionTex; TextureHandle m_EmissionTex; }; struct Model { RenderResourceManager *m_ResourceManager; eastl::vector m_Textures; eastl::vector m_TextureHandles; StorageBuffer m_MaterialsBuffer; BufferHandle m_MaterialsHandle; StorageBuffer m_VertexPositions; BufferHandle m_VertexPositionHandle; StorageBuffer m_NormalVectors; BufferHandle m_NormalHandle; StorageBuffer m_TexCoord0; BufferHandle m_TexCoord0Handle; IndexBuffer m_IndexBuffer; eastl::vector m_MeshPrimitives; Model(RenderResourceManager *resourceManager, eastl::vector &&textures, eastl::vector &&textureHandles, const StorageBuffer &materialsBuffer, BufferHandle materialsHandle, const StorageBuffer &vertexPosBuffer, BufferHandle vertexPosHandle, const StorageBuffer &normalBuffer, BufferHandle normalHandle, const StorageBuffer &uv0Buffer, BufferHandle uv0Handle, const IndexBuffer &indexBuffer, const eastl::vector &meshPrimitives); Model(Model &&other) noexcept; Model &operator=(Model &&other) noexcept; ~Model(); DISALLOW_COPY_AND_ASSIGN(Model); }; struct ModelLoader { RenderResourceManager *const m_ResourceManager; vk::CommandPool m_CommandPool; vk::CommandBuffer m_CommandBuffer; vk::Queue m_TransferQueue; u32 m_TransferQueueIndex; u32 m_GraphicsQueueIndex; ModelLoader(RenderResourceManager *resourceManager, vk::Queue transferQueue, u32 transferQueueIndex, u32 graphicsQueueIndex); ~ModelLoader(); TextureHandle LoadImage(vk::CommandBuffer commandBuffer, Texture *texture, StagingBuffer *stagingBuffer, tinygltf::Image *image) const; Model LoadModel(cstr path, cstr name = nullptr, bool batched = false); constexpr static auto ANormal = "NORMAL"; constexpr static auto APosition = "POSITION"; constexpr static auto ATangent = "TANGENT"; constexpr static auto ATexCoord0 = "TEXCOORD_0"; constexpr static auto ATexCoord1 = "TEXCOORD_1"; constexpr static auto AJoints0 = "JOINTS_0"; constexpr static auto AWeights0 = "WEIGHTS_0"; };