105 lines
3.0 KiB
C++
105 lines
3.0 KiB
C++
// =============================================
|
|
// 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 <tiny_gltf.h>
|
|
|
|
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<Texture> m_Textures;
|
|
eastl::vector<TextureHandle> 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<MeshPrimitive> m_MeshPrimitives;
|
|
|
|
Model(RenderResourceManager *resourceManager, eastl::vector<Texture> &&textures,
|
|
eastl::vector<TextureHandle> &&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<MeshPrimitive> &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);
|
|
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";
|
|
}; |