Program Listing for File Drawable.h¶
↰ Return to documentation for file (Source\Azura\RenderSystem\Inc\Generic\Drawable.h
)
#pragma once
#include "Containers/Vector.h"
#include "GenericTypes.h"
#include "Types.h"
#include "Core/RawStorageFormat.h"
namespace Azura {
struct TextureDesc;
using DrawableID = U32;
class Shader;
struct DrawableCreateInfo {
U32 m_vertexCount{0};
U32 m_instanceCount{0};
U32 m_indexCount{0};
RawStorageFormat m_indexType{RawStorageFormat::R32_UINT};
};
class Drawable {
public:
Drawable(const DrawableCreateInfo& info,
U32 numVertexSlots,
U32 numInstanceSlots,
U32 numUniformSlots,
Memory::Allocator& allocator);
virtual ~Drawable() = default;
Drawable(const Drawable& other) = delete;
Drawable(Drawable&& other) noexcept = default;
Drawable& operator=(const Drawable& other) = delete;
Drawable& operator=(Drawable&& other) noexcept = delete;
void AddVertexBufferInfo(BufferInfo&& info);
void AddInstanceBufferInfo(BufferInfo&& info);
void AddUniformBufferInfo(UniformBufferInfo&& info);
U32 GetSingleUniformBufferInfo(const DescriptorSlot & slot) const;
U32 GetSingleVertexBufferInfo(const SlotID & slot) const;
U32 GetSingleInstanceBufferInfo(const SlotID & slot) const;
void SetIndexBufferInfo(BufferInfo&& info);
U32 GetVertexCount() const;
U32 GetIndexCount() const;
U32 GetInstanceCount() const;
RawStorageFormat GetIndexType() const;
const Containers::Vector<BufferInfo>& GetVertexBufferInfos() const;
const Containers::Vector<BufferInfo>& GetInstanceBufferInfos() const;
const Containers::Vector<UniformBufferInfo>& GetUniformBufferInfos() const;
const BufferInfo& GetIndexBufferInfo() const;
protected:
Memory::Allocator& GetAllocator() const;
Containers::Vector<BufferInfo> m_vertexBufferInfos;
Containers::Vector<BufferInfo> m_instanceBufferInfos;
Containers::Vector<UniformBufferInfo> m_uniformBufferInfos;
BufferInfo m_indexBufferInfo;
DrawableCreateInfo m_createInfo;
private:
// Shared as they are editable by APIs
const U32 m_vertexCount;
const U32 m_indexCount;
const RawStorageFormat m_indexType;
U32 m_instanceCount;
std::reference_wrapper<Memory::Allocator> m_allocator;
};
struct DrawablePoolCreateInfo {
U32 m_byteSize{0};
U32 m_numDrawables{0};
CullMode m_cullMode{CullMode::None};
DrawType m_drawType{DrawType::InstancedIndexed};
SmallVector<VertexSlot, 4> m_vertexDataSlots;
Containers::Vector<U32> m_renderPasses;
~DrawablePoolCreateInfo() = default;
DrawablePoolCreateInfo(const DrawablePoolCreateInfo& other) = delete;
DrawablePoolCreateInfo(DrawablePoolCreateInfo&& other) noexcept = delete;
DrawablePoolCreateInfo& operator=(const DrawablePoolCreateInfo& other) = delete;
DrawablePoolCreateInfo& operator=(DrawablePoolCreateInfo&& other) noexcept = delete;
DrawablePoolCreateInfo(Memory::Allocator& alloc);
U32 AddInputSlot(const VertexSlot& slotInfo);
};
class DrawablePool {
public:
explicit DrawablePool(const DrawablePoolCreateInfo& createInfo,
DescriptorCount descriptorCount,
Memory::Allocator& allocator);
virtual ~DrawablePool() = default;
DrawablePool(const DrawablePool& other) = delete;
DrawablePool(DrawablePool&& other) noexcept = default;
DrawablePool& operator=(const DrawablePool& other) = delete;
DrawablePool& operator=(DrawablePool&& other) noexcept = default;
virtual DrawableID CreateDrawable(const DrawableCreateInfo& createInfo) = 0;
// Drawable Scope Binds
void BindVertexData(DrawableID drawableId, SlotID slot, const Containers::Vector<U8>& buffer);
virtual void BindVertexData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) = 0;
virtual void BindVertexData(DrawableID drawableId, SlotID slot, U32 sourceBuffer, U32 offset, U32 size) = 0;
void BindInstanceData(DrawableID drawableId, SlotID slot, const Containers::Vector<U8>& buffer);
virtual void BindInstanceData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) = 0;
void BindUniformData(DrawableID drawableId, SlotID slot, const Containers::Vector<U8>& buffer);
virtual void BindUniformData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) = 0;
void SetIndexData(DrawableID drawableId, const Containers::Vector<U8>& buffer);
virtual void SetIndexData(DrawableID drawableId, const U8* buffer, U32 size) = 0;
// Pool Scope Binds
virtual void AddShader(U32 shaderId) = 0;
virtual void BindTextureData(SlotID slot, const TextureDesc& desc, const U8* buffer) = 0;
virtual void BindSampler(SlotID slot, const SamplerDesc& desc) = 0;
virtual void BeginUpdates() = 0;
void UpdateUniformData(DrawableID drawableId, SlotID slot, const Containers::Vector<U8>& buffer);
virtual void UpdateUniformData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) = 0;
virtual void UpdateVertexData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) = 0;
virtual void UpdateInstanceData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) = 0;
virtual void UpdateTextureData(SlotID slot, const U8* buffer) = 0;
U32 GetSingleTextureBufferInfo(const DescriptorSlot & slot);
virtual void Submit() = 0;
virtual void SubmitUpdates() = 0;
U32 GetSize() const;
bool CanRenderInPass(U32 renderPassId) const;
protected:
Memory::Allocator& GetAllocator() const;
DrawType GetDrawType() const;
U32 m_numVertexSlots;
U32 m_numInstanceSlots;
DescriptorCount m_descriptorCount;
Containers::Vector<VertexSlot> m_vertexDataSlots;
Containers::Vector<U32> m_renderPasses;
Containers::Vector<TextureBufferInfo> m_textureBufferInfos;
Containers::Vector<SamplerInfo> m_samplerInfos;
Containers::Vector<BufferUpdate> m_bufferUpdates;
CullMode m_cullMode;
private:
U32 m_byteSize;
DrawType m_drawType;
std::reference_wrapper<Memory::Allocator> m_allocator;
};
} // namespace Azura