89 lines
2.1 KiB
C++
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
|