Batch Rendering & IndexBuffers & RendererProgram
This commit is contained in:
parent
2f560239cb
commit
a3092c476c
19 changed files with 263 additions and 52 deletions
|
@ -25,4 +25,3 @@
|
||||||
|
|
||||||
#define LT_ENGINE_ASSERT(x, ...) { if(!(x)) { LT_ENGINE_CRITICAL(__VA_ARGS__); __debugbreak(); } }
|
#define LT_ENGINE_ASSERT(x, ...) { if(!(x)) { LT_ENGINE_CRITICAL(__VA_ARGS__); __debugbreak(); } }
|
||||||
#define LT_CLIENT_ASSERT(x, ...) { if(!(x)) { LT_CLIENT_CRITICAL(__VA_ARGS__); __debugbreak(); } }
|
#define LT_CLIENT_ASSERT(x, ...) { if(!(x)) { LT_CLIENT_CRITICAL(__VA_ARGS__); __debugbreak(); } }
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,9 @@ namespace Light {
|
||||||
m_Window->PollEvents();
|
m_Window->PollEvents();
|
||||||
|
|
||||||
// Rendering
|
// Rendering
|
||||||
m_Window->GetGfxContext()->GetRenderer()->Draw();
|
m_Window->GetGfxContext()->GetRenderer()->BeginScene();
|
||||||
|
m_LayerStack.OnRender();
|
||||||
|
m_Window->GetGfxContext()->GetRenderer()->EndScene();
|
||||||
|
|
||||||
// Buffer updates
|
// Buffer updates
|
||||||
m_Window->GetGfxContext()->GetRenderCommand()->SwapBuffers();
|
m_Window->GetGfxContext()->GetRenderCommand()->SwapBuffers();
|
||||||
|
|
|
@ -27,12 +27,15 @@ namespace Light {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IndexBuffer* IndexBuffer::Create(unsigned int count, unsigned int* indices)
|
IndexBuffer* IndexBuffer::Create(unsigned int count, unsigned int* indices, void* sharedContext)
|
||||||
{
|
{
|
||||||
switch (GraphicsContext::GetGraphicsAPI())
|
switch (GraphicsContext::GetGraphicsAPI())
|
||||||
{
|
{
|
||||||
case GraphicsAPI::OpenGL:
|
case GraphicsAPI::OpenGL:
|
||||||
return new glIndexBuffer(count, indices);
|
return new glIndexBuffer(count, indices);
|
||||||
|
case GraphicsAPI::DirectX: LT_WIN(
|
||||||
|
return new dxIndexBuffer(count, indices, sharedContext);
|
||||||
|
)
|
||||||
default:
|
default:
|
||||||
LT_ENGINE_ASSERT(false, "IndexBuffer::Create: invalid/unsupported GraphicsAPI {}", GraphicsContext::GetGraphicsAPI());
|
LT_ENGINE_ASSERT(false, "IndexBuffer::Create: invalid/unsupported GraphicsAPI {}", GraphicsContext::GetGraphicsAPI());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -9,6 +9,9 @@ namespace Light {
|
||||||
public:
|
public:
|
||||||
static VertexBuffer* Create(unsigned int stride, unsigned int count, float* vertices, void* sharedContext);
|
static VertexBuffer* Create(unsigned int stride, unsigned int count, float* vertices, void* sharedContext);
|
||||||
|
|
||||||
|
virtual void* Map() = 0;
|
||||||
|
virtual void UnMap() = 0;
|
||||||
|
|
||||||
virtual void Bind() = 0;
|
virtual void Bind() = 0;
|
||||||
virtual void UnBind() = 0;
|
virtual void UnBind() = 0;
|
||||||
|
|
||||||
|
@ -19,7 +22,7 @@ namespace Light {
|
||||||
class IndexBuffer
|
class IndexBuffer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static IndexBuffer* Create(unsigned int count, unsigned int* indices);
|
static IndexBuffer* Create(unsigned int count, unsigned int* indices, void* sharedContext);
|
||||||
|
|
||||||
virtual void Bind() = 0;
|
virtual void Bind() = 0;
|
||||||
virtual void UnBind() = 0;
|
virtual void UnBind() = 0;
|
||||||
|
|
|
@ -7,24 +7,36 @@
|
||||||
|
|
||||||
namespace Light {
|
namespace Light {
|
||||||
|
|
||||||
Renderer* Renderer::m_Context;
|
Renderer* Renderer::s_Context;
|
||||||
|
|
||||||
Renderer::Renderer(std::shared_ptr<RenderCommand> renderCommand, void* sharedContext)
|
Renderer::Renderer(std::shared_ptr<RenderCommand> renderCommand, void* sharedContext)
|
||||||
: m_RenderCommand(renderCommand), m_SharedContext(sharedContext)
|
: m_RenderCommand(renderCommand), m_SharedContext(sharedContext)
|
||||||
{
|
{
|
||||||
m_Context = this;
|
s_Context = this;
|
||||||
|
|
||||||
m_Shader = std::unique_ptr<Shader>(Shader::Create("res/vertex.vertex", "res/fragment.fragment", m_SharedContext));
|
// QUADRENDERER //
|
||||||
|
unsigned int offset = 0;
|
||||||
|
unsigned int* indices = new unsigned int[LT_MAX_QUAD * 6];
|
||||||
|
|
||||||
float vertices[] =
|
for (int i = 0; i < LT_MAX_QUAD * 6; i += 6)
|
||||||
{
|
{
|
||||||
0.0f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f,
|
indices[i + 0] = offset + 0;
|
||||||
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f,
|
indices[i + 1] = offset + 1;
|
||||||
-0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f,
|
indices[i + 2] = offset + 2;
|
||||||
};
|
|
||||||
|
|
||||||
m_VertexBuffer = std::unique_ptr<VertexBuffer>(VertexBuffer::Create(6 * sizeof(float), (2 + 4) * 3, vertices, m_SharedContext));
|
indices[i + 3] = offset + 2;
|
||||||
m_VertexLayout = std::unique_ptr<VertexLayout>(VertexLayout::Create(m_VertexBuffer.get(), m_Shader.get(), { { "POSITION", VertexElementType::Float2 },{ "COLOR", VertexElementType::Float4 } }, m_SharedContext));
|
indices[i + 4] = offset + 3;
|
||||||
|
indices[i + 5] = offset + 0;
|
||||||
|
|
||||||
|
offset += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_QuadRenderer.shader = std::unique_ptr<Shader>(Shader::Create("res/vertex.vertex", "res/fragment.fragment", m_SharedContext));
|
||||||
|
m_QuadRenderer.vertexBuffer = std::unique_ptr<VertexBuffer>(VertexBuffer::Create(sizeof(QuadRendererProgram::QuadVertexData), LT_MAX_QUAD * 4, nullptr, m_SharedContext));
|
||||||
|
m_QuadRenderer.vertexLayout = std::unique_ptr<VertexLayout>(VertexLayout::Create(m_QuadRenderer.vertexBuffer.get(), m_QuadRenderer.shader.get(), { { "POSITION", VertexElementType::Float3 },{ "COLOR", VertexElementType::Float4 } }, m_SharedContext));
|
||||||
|
m_QuadRenderer.indexBuffer = std::unique_ptr<IndexBuffer>(IndexBuffer::Create(LT_MAX_QUAD * 6, indices, m_SharedContext));
|
||||||
|
delete[] indices;
|
||||||
|
// QUADRENDERER //
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderer* Renderer::Create(std::shared_ptr<RenderCommand> renderCommand, void* sharedContext)
|
Renderer* Renderer::Create(std::shared_ptr<RenderCommand> renderCommand, void* sharedContext)
|
||||||
|
@ -32,14 +44,63 @@ namespace Light {
|
||||||
return new Renderer(renderCommand, sharedContext);
|
return new Renderer(renderCommand, sharedContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::Draw()
|
void Renderer::DrawQuad(const glm::vec3& position, const glm::vec2& size, const glm::vec4& tint)
|
||||||
{
|
{
|
||||||
m_Shader->Bind();
|
s_Context->DrawQuadImpl(position, size, tint);
|
||||||
m_VertexBuffer->Bind();
|
}
|
||||||
m_VertexLayout->Bind();
|
|
||||||
|
|
||||||
m_RenderCommand->Draw(3u);
|
void Renderer::DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, const glm::vec4& tint)
|
||||||
|
{
|
||||||
|
// check
|
||||||
|
if (m_QuadRenderer.mapCurrent + 4 >= m_QuadRenderer.mapEnd)
|
||||||
|
{
|
||||||
|
LT_ENGINE_WARN("Render::DrawQuad: max calls per frame exceeded the limit: {}", LT_MAX_QUAD);
|
||||||
|
|
||||||
|
EndScene();
|
||||||
|
m_QuadRenderer.Map();
|
||||||
|
}
|
||||||
|
|
||||||
|
// local
|
||||||
|
const float xMin = position.x;
|
||||||
|
const float yMin = position.y;
|
||||||
|
const float xMax = position.x + size.x;
|
||||||
|
const float yMax = position.y + size.y;
|
||||||
|
|
||||||
|
// TOP LEFT
|
||||||
|
m_QuadRenderer.mapCurrent->position = { xMin, yMin, position.z };
|
||||||
|
m_QuadRenderer.mapCurrent->tint = glm::vec4(1.0f, 0.1f, 0.1f, 1.0f);
|
||||||
|
m_QuadRenderer.mapCurrent++;
|
||||||
|
|
||||||
|
// TOP RIGHT
|
||||||
|
m_QuadRenderer.mapCurrent->position = { xMax, yMin, position.z };
|
||||||
|
m_QuadRenderer.mapCurrent->tint = glm::vec4(0.1f, 1.0f, 0.1f, 1.0f);
|
||||||
|
m_QuadRenderer.mapCurrent++;
|
||||||
|
|
||||||
|
// BOTTOM RIGHT
|
||||||
|
m_QuadRenderer.mapCurrent->position = { xMax, yMax, position.z };
|
||||||
|
m_QuadRenderer.mapCurrent->tint = glm::vec4(0.3f, 0.3f, 0.3f, 1.0f);
|
||||||
|
m_QuadRenderer.mapCurrent++;
|
||||||
|
|
||||||
|
// BOTTOM LEFT
|
||||||
|
m_QuadRenderer.mapCurrent->position = { xMin, yMax, position.z };
|
||||||
|
m_QuadRenderer.mapCurrent->tint = glm::vec4(0.1f, 0.1f, 1.0f, 1.0f);
|
||||||
|
m_QuadRenderer.mapCurrent++;
|
||||||
|
|
||||||
|
// advance
|
||||||
|
m_QuadRenderer.quadCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Renderer::BeginScene()
|
||||||
|
{
|
||||||
|
m_QuadRenderer.Map();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Renderer::EndScene()
|
||||||
|
{
|
||||||
|
m_QuadRenderer.Bind();
|
||||||
|
m_RenderCommand->DrawIndexed(m_QuadRenderer.quadCount * 6);
|
||||||
|
m_QuadRenderer.quadCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -6,31 +6,80 @@
|
||||||
#include "Buffers.h"
|
#include "Buffers.h"
|
||||||
#include "VertexLayout.h"
|
#include "VertexLayout.h"
|
||||||
|
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#define LT_MAX_QUAD 124
|
||||||
|
|
||||||
namespace Light {
|
namespace Light {
|
||||||
|
|
||||||
class RenderCommand;
|
class RenderCommand;
|
||||||
|
|
||||||
|
struct RendererProgram
|
||||||
|
{
|
||||||
|
virtual void Map() = 0;
|
||||||
|
virtual void Bind() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
class Renderer
|
class Renderer
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
static Renderer* m_Context;
|
struct QuadRendererProgram : RendererProgram
|
||||||
|
{
|
||||||
|
// graphics context
|
||||||
|
std::shared_ptr<Shader> shader;
|
||||||
|
std::shared_ptr<VertexLayout> vertexLayout;
|
||||||
|
std::shared_ptr<VertexBuffer> vertexBuffer;
|
||||||
|
std::shared_ptr<IndexBuffer> indexBuffer;
|
||||||
|
|
||||||
|
// buffer data
|
||||||
|
struct QuadVertexData
|
||||||
|
{
|
||||||
|
glm::vec3 position;
|
||||||
|
glm::vec4 tint;
|
||||||
|
};
|
||||||
|
|
||||||
|
QuadVertexData* mapCurrent = nullptr;
|
||||||
|
QuadVertexData* mapEnd = nullptr;
|
||||||
|
unsigned int quadCount = 0u;
|
||||||
|
|
||||||
|
// functions
|
||||||
|
void Map()
|
||||||
|
{
|
||||||
|
mapCurrent = (QuadVertexData*)vertexBuffer->Map();
|
||||||
|
mapEnd = mapCurrent + LT_MAX_QUAD * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Bind()
|
||||||
|
{
|
||||||
|
vertexBuffer->UnMap();
|
||||||
|
shader->Bind();
|
||||||
|
vertexLayout->Bind();
|
||||||
|
vertexBuffer->Bind();
|
||||||
|
indexBuffer->Bind();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static Renderer* s_Context;
|
||||||
|
|
||||||
|
QuadRendererProgram m_QuadRenderer;
|
||||||
|
|
||||||
std::shared_ptr<RenderCommand> m_RenderCommand;
|
std::shared_ptr<RenderCommand> m_RenderCommand;
|
||||||
|
|
||||||
std::unique_ptr<Shader> m_Shader;
|
|
||||||
std::unique_ptr<VertexBuffer> m_VertexBuffer;
|
|
||||||
std::unique_ptr<VertexLayout> m_VertexLayout;
|
|
||||||
|
|
||||||
void* m_SharedContext;
|
void* m_SharedContext;
|
||||||
public:
|
public:
|
||||||
static Renderer* Create(std::shared_ptr<RenderCommand> renderCommand, void* sharedContext);
|
static Renderer* Create(std::shared_ptr<RenderCommand> renderCommand, void* sharedContext);
|
||||||
|
|
||||||
void Draw();
|
static void DrawQuad(const glm::vec3& position, const glm::vec2& size, const glm::vec4& tint);
|
||||||
|
|
||||||
|
void BeginScene();
|
||||||
|
void EndScene();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Renderer(std::shared_ptr<RenderCommand> renderCommand, void* sharedContext);
|
Renderer(std::shared_ptr<RenderCommand> renderCommand, void* sharedContext);
|
||||||
|
|
||||||
|
void DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, const glm::vec4& tint);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
|
@ -33,6 +33,8 @@ namespace Light {
|
||||||
virtual void OnUpdate(float deltaTime) {}
|
virtual void OnUpdate(float deltaTime) {}
|
||||||
virtual void OnUserInterfaceUpdate() {}
|
virtual void OnUserInterfaceUpdate() {}
|
||||||
|
|
||||||
|
virtual void OnRender() {}
|
||||||
|
|
||||||
// Mouse events
|
// Mouse events
|
||||||
virtual bool OnMouseMoved(const MouseMovedEvent& event) { return false; }
|
virtual bool OnMouseMoved(const MouseMovedEvent& event) { return false; }
|
||||||
virtual bool OnButtonPressed(const ButtonPressedEvent& event) { return false; }
|
virtual bool OnButtonPressed(const ButtonPressedEvent& event) { return false; }
|
||||||
|
|
|
@ -35,6 +35,12 @@ namespace Light {
|
||||||
(*it)->OnUserInterfaceUpdate();
|
(*it)->OnUserInterfaceUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LayerStack::OnRender()
|
||||||
|
{
|
||||||
|
for (auto it = m_Begin; it != m_End; it++)
|
||||||
|
(*it)->OnRender();
|
||||||
|
}
|
||||||
|
|
||||||
void LayerStack::OnEvent(const Event& event)
|
void LayerStack::OnEvent(const Event& event)
|
||||||
{
|
{
|
||||||
switch (event.GetEventType())
|
switch (event.GetEventType())
|
||||||
|
|
|
@ -30,6 +30,8 @@ namespace Light {
|
||||||
void OnUpdate(float deltaTime);
|
void OnUpdate(float deltaTime);
|
||||||
void OnUserInterfaceUpdate();
|
void OnUserInterfaceUpdate();
|
||||||
|
|
||||||
|
void OnRender();
|
||||||
|
|
||||||
void OnEvent(const Event& event);
|
void OnEvent(const Event& event);
|
||||||
|
|
||||||
inline bool IsEmpty() { return m_Layers.empty(); }
|
inline bool IsEmpty() { return m_Layers.empty(); }
|
||||||
|
|
|
@ -17,8 +17,6 @@ namespace Light {
|
||||||
m_DeviceContext = dxContext->deviceContext;
|
m_DeviceContext = dxContext->deviceContext;
|
||||||
|
|
||||||
D3D11_BUFFER_DESC desc = { 0 };
|
D3D11_BUFFER_DESC desc = { 0 };
|
||||||
D3D11_SUBRESOURCE_DATA sd = { 0 };
|
|
||||||
|
|
||||||
|
|
||||||
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
|
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
|
||||||
desc.Usage = D3D11_USAGE_DYNAMIC;
|
desc.Usage = D3D11_USAGE_DYNAMIC;
|
||||||
|
@ -27,15 +25,24 @@ namespace Light {
|
||||||
desc.ByteWidth = count * stride;
|
desc.ByteWidth = count * stride;
|
||||||
desc.StructureByteStride = stride;
|
desc.StructureByteStride = stride;
|
||||||
|
|
||||||
sd.pSysMem = vertices;
|
DXC(m_Device->CreateBuffer(&desc, nullptr, &m_Buffer));
|
||||||
|
|
||||||
DXC(m_Device->CreateBuffer(&desc, &sd, &m_Buffer));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dxVertexBuffer::~dxVertexBuffer()
|
dxVertexBuffer::~dxVertexBuffer()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* dxVertexBuffer::Map()
|
||||||
|
{
|
||||||
|
m_DeviceContext->Map(m_Buffer.Get(), NULL, D3D11_MAP_WRITE_DISCARD, NULL, &m_Map);
|
||||||
|
return m_Map.pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dxVertexBuffer::UnMap()
|
||||||
|
{
|
||||||
|
m_DeviceContext->Unmap(m_Buffer.Get(), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void dxVertexBuffer::Bind()
|
void dxVertexBuffer::Bind()
|
||||||
{
|
{
|
||||||
static const unsigned int offset = 0u;
|
static const unsigned int offset = 0u;
|
||||||
|
@ -46,4 +53,41 @@ namespace Light {
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
dxIndexBuffer::dxIndexBuffer(unsigned int count, unsigned int* indices, void* sharedContext)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
dxSharedContext* dxContext = static_cast<dxSharedContext*>(sharedContext);
|
||||||
|
LT_ENGINE_ASSERT(dxContext, "dxShader::dxShader: invalid dxContext");
|
||||||
|
|
||||||
|
m_Device = dxContext->device;
|
||||||
|
m_DeviceContext = dxContext->deviceContext;
|
||||||
|
|
||||||
|
D3D11_BUFFER_DESC bufferDesc = { 0 };
|
||||||
|
D3D11_SUBRESOURCE_DATA sd = { 0 };
|
||||||
|
bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
|
||||||
|
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
|
||||||
|
|
||||||
|
bufferDesc.ByteWidth = count * sizeof(unsigned int);
|
||||||
|
bufferDesc.StructureByteStride = sizeof(unsigned int);
|
||||||
|
|
||||||
|
sd.pSysMem = indices;
|
||||||
|
|
||||||
|
DXC(m_Device->CreateBuffer(&bufferDesc, &sd, &m_Buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
dxIndexBuffer::~dxIndexBuffer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void dxIndexBuffer::Bind()
|
||||||
|
{
|
||||||
|
m_DeviceContext->IASetIndexBuffer(m_Buffer.Get(), DXGI_FORMAT_R32_UINT, 0u);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dxIndexBuffer::UnBind()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -17,11 +17,31 @@ namespace Light {
|
||||||
Microsoft::WRL::ComPtr<ID3D11Device> m_Device;
|
Microsoft::WRL::ComPtr<ID3D11Device> m_Device;
|
||||||
Microsoft::WRL::ComPtr<ID3D11DeviceContext> m_DeviceContext;
|
Microsoft::WRL::ComPtr<ID3D11DeviceContext> m_DeviceContext;
|
||||||
|
|
||||||
|
D3D11_MAPPED_SUBRESOURCE m_Map;
|
||||||
|
|
||||||
unsigned int m_Stride;
|
unsigned int m_Stride;
|
||||||
public:
|
public:
|
||||||
dxVertexBuffer(unsigned int count, unsigned int stride, float* vertices, void* sharedContext);
|
dxVertexBuffer(unsigned int count, unsigned int stride, float* vertices, void* sharedContext);
|
||||||
~dxVertexBuffer();
|
~dxVertexBuffer();
|
||||||
|
|
||||||
|
void* Map() override;
|
||||||
|
void UnMap() override;
|
||||||
|
|
||||||
|
void Bind() override;
|
||||||
|
void UnBind() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class dxIndexBuffer : public IndexBuffer
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Microsoft::WRL::ComPtr<ID3D11Buffer> m_Buffer;
|
||||||
|
|
||||||
|
Microsoft::WRL::ComPtr<ID3D11Device> m_Device;
|
||||||
|
Microsoft::WRL::ComPtr<ID3D11DeviceContext> m_DeviceContext;
|
||||||
|
public:
|
||||||
|
dxIndexBuffer(unsigned int count, unsigned int* indices, void* sharedContext);
|
||||||
|
~dxIndexBuffer();
|
||||||
|
|
||||||
void Bind() override;
|
void Bind() override;
|
||||||
void UnBind() override;
|
void UnBind() override;
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,8 +8,7 @@ namespace Light {
|
||||||
glVertexBuffer::glVertexBuffer(unsigned int count, float* vertices)
|
glVertexBuffer::glVertexBuffer(unsigned int count, float* vertices)
|
||||||
{
|
{
|
||||||
glCreateBuffers(1, &m_BufferID);
|
glCreateBuffers(1, &m_BufferID);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, m_BufferID);
|
glNamedBufferData(m_BufferID, count * sizeof(float), vertices, GL_DYNAMIC_DRAW);
|
||||||
glBufferData(GL_ARRAY_BUFFER, count * sizeof(float), vertices, GL_STATIC_DRAW);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glVertexBuffer::~glVertexBuffer()
|
glVertexBuffer::~glVertexBuffer()
|
||||||
|
@ -17,6 +16,16 @@ namespace Light {
|
||||||
glDeleteBuffers(1, &m_BufferID);
|
glDeleteBuffers(1, &m_BufferID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* glVertexBuffer::Map()
|
||||||
|
{
|
||||||
|
return glMapNamedBuffer(m_BufferID, GL_WRITE_ONLY);
|
||||||
|
}
|
||||||
|
|
||||||
|
void glVertexBuffer::UnMap()
|
||||||
|
{
|
||||||
|
glUnmapNamedBuffer(m_BufferID);
|
||||||
|
}
|
||||||
|
|
||||||
void glVertexBuffer::Bind()
|
void glVertexBuffer::Bind()
|
||||||
{
|
{
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, m_BufferID);
|
glBindBuffer(GL_ARRAY_BUFFER, m_BufferID);
|
||||||
|
@ -30,9 +39,7 @@ namespace Light {
|
||||||
glIndexBuffer::glIndexBuffer(unsigned int count, unsigned int* indices)
|
glIndexBuffer::glIndexBuffer(unsigned int count, unsigned int* indices)
|
||||||
{
|
{
|
||||||
glCreateBuffers(1, &m_BufferID);
|
glCreateBuffers(1, &m_BufferID);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_BufferID);
|
glNamedBufferData(m_BufferID, count * sizeof(unsigned int), indices, GL_STATIC_DRAW);
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(unsigned int), indices, GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glIndexBuffer::~glIndexBuffer()
|
glIndexBuffer::~glIndexBuffer()
|
||||||
|
|
|
@ -14,6 +14,9 @@ namespace Light {
|
||||||
glVertexBuffer(unsigned int count, float* vertices);
|
glVertexBuffer(unsigned int count, float* vertices);
|
||||||
~glVertexBuffer();
|
~glVertexBuffer();
|
||||||
|
|
||||||
|
void* Map() override;
|
||||||
|
void UnMap() override;
|
||||||
|
|
||||||
void Bind() override;
|
void Bind() override;
|
||||||
void UnBind() override;
|
void UnBind() override;
|
||||||
};
|
};
|
||||||
|
|
|
@ -28,7 +28,7 @@ namespace Light {
|
||||||
glfwSetWindowUserPointer(m_Handle, &m_EventCallback);
|
glfwSetWindowUserPointer(m_Handle, &m_EventCallback);
|
||||||
BindGlfwEvents();
|
BindGlfwEvents();
|
||||||
|
|
||||||
m_GraphicsContext = std::unique_ptr<GraphicsContext>(GraphicsContext::Create(GraphicsAPI::DirectX, m_Handle));
|
m_GraphicsContext = std::unique_ptr<GraphicsContext>(GraphicsContext::Create(GraphicsAPI::OpenGL, m_Handle));
|
||||||
LT_ENGINE_ASSERT(m_GraphicsContext, "wWindow::wWindow: graphics context creation failed");
|
LT_ENGINE_ASSERT(m_GraphicsContext, "wWindow::wWindow: graphics context creation failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@ Size=400,400
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Window][Dear ImGui Demo]
|
[Window][Dear ImGui Demo]
|
||||||
Pos=-3,-1
|
Pos=1,-3
|
||||||
Size=244,247
|
Size=405,290
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Window][Dear ImGui Metrics/Debugger]
|
[Window][Dear ImGui Metrics/Debugger]
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
float4 main(float4 Color : COLOR) : SV_Target
|
#version 440 core
|
||||||
|
|
||||||
|
in vec4 fragColor;
|
||||||
|
|
||||||
|
out vec4 FragmentColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
{
|
{
|
||||||
return Color;
|
FragmentColor = fragColor;
|
||||||
}
|
}
|
|
@ -1,13 +1,12 @@
|
||||||
struct VertexOut
|
#version 440 core
|
||||||
{
|
|
||||||
float4 Color : COLOR;
|
|
||||||
float4 Position : SV_Position;
|
|
||||||
};
|
|
||||||
|
|
||||||
VertexOut main(float2 InPosition : POSITION, float4 InColor : COLOR)
|
layout(location = 0) in vec3 a_Position;
|
||||||
|
layout(location = 1) in vec4 a_Color;
|
||||||
|
|
||||||
|
out vec4 fragColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
{
|
{
|
||||||
VertexOut vso;
|
gl_Position = vec4(a_Position, 1.0);
|
||||||
vso.Position = float4(InPosition.x, InPosition.y, 0.0f, 1.0f);
|
fragColor = a_Color;
|
||||||
vso.Color = InColor;
|
|
||||||
return vso;
|
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
#define LIGHT_ENTRY_POINT
|
#define LIGHT_ENTRY_POINT
|
||||||
#include <LightEngine.h>
|
#include <LightEngine.h>
|
||||||
|
|
||||||
#include "SandboxLayer.h"
|
#include "SandboxLayer.h"
|
||||||
|
|
||||||
class Sandbox : public Light::Application
|
class Sandbox : public Light::Application
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,4 +5,9 @@ class SandboxLayer : public Light::Layer
|
||||||
public:
|
public:
|
||||||
SandboxLayer(const std::string& name): Light::Layer(name) {}
|
SandboxLayer(const std::string& name): Light::Layer(name) {}
|
||||||
|
|
||||||
|
void OnRender() override
|
||||||
|
{
|
||||||
|
Light::Renderer::DrawQuad(glm::vec3(-0.5f, -0.5f, 0.0f), glm::vec2(1.f, 1.f), glm::vec4(1.12f, 1.41f, 1.72f, 1.0f));
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue