Blaze/Blaze/Source/ModelLoader.h

89 lines
2.1 KiB
C++

#pragma once
#include <DirectXMath.h>
#include <memory_resource>
#include <vector>
#include "BufferManager.h"
#include "TextureManager.h"
namespace Blaze
{
struct GlobalMemory;
struct RenderDevice;
struct EntityManager;
struct Entity;
struct Vertex
{
DirectX::XMFLOAT4 position = { 0.0f, 0.0f, 0.0f, 1.0f };
DirectX::XMFLOAT4 normal = { 0.0f, 0.0f, 1.0f, 0.0f };
DirectX::XMFLOAT4 tangent = { 1.0f, 0.0f, 0.0f, 0.0f };
DirectX::XMFLOAT2 texCoord0 = { 0.0f, 0.0f };
DirectX::XMFLOAT2 texCoord1 = { 0.0f, 0.0f };
DirectX::XMFLOAT4 color0 = { 1.0f, 1.0f, 1.0f, 1.0f };
};
struct Primitive
{
uint32_t indexStart;
uint32_t indexCount;
uint32_t material;
int32_t vertexOffset;
};
struct ModelMesh
{
uint32_t primitiveStart = 0;
uint32_t primitiveCount = 0;
[[nodiscard]] bool IsNull() const
{
return primitiveCount == 0;
}
};
struct Material
{
size_t constexpr static kGPUDataOffset = sizeof( VkSampler );
size_t constexpr static kGPUDataSize = 56;
VkSampler sampler; // TODO: Reuse
// To copy directly.
DirectX::XMFLOAT4 baseColor = { 1.0f, 1.0f, 1.0f, 1.0f };
DirectX::XMFLOAT4 emission = { 0.0f, 0.0f, 0.0f, 1.0f };
TextureID albedoTextureID;
TextureID normalTextureID;
TextureID metalRoughTextureID;
TextureID emissiveTextureID;
float metallic = 1.0f;
float roughness = 1.0f;
[[nodiscard]] bool IsNull() const
{
return not( albedoTextureID and normalTextureID and metalRoughTextureID and emissiveTextureID and sampler );
}
};
static_assert( sizeof( Material ) == Material::kGPUDataOffset + Material::kGPUDataSize );
static constexpr Material DEFAULT_MATERIAL = {};
struct Model
{
BufferID vertexBuffer;
BufferID indexBuffer;
std::vector<Material> materials;
std::vector<Primitive> primitives;
[[nodiscard]] bool IsNull() const
{
return vertexBuffer.IsNull();
}
};
Entity* LoadModel( RenderDevice* render_device, EntityManager* entity_manager, const char* filename );
} // namespace Blaze