light/Engine/src/Engine/Graphics/Renderer.cpp

193 lines
5.3 KiB
C++
Raw Normal View History

2021-05-30 16:45:54 +04:30
#include "ltpch.h"
#include "Renderer.h"
2021-07-09 11:56:31 +04:30
#include "Blender.h"
#include "Buffers.h"
#include "Framebuffer.h"
2021-07-29 17:12:13 +04:30
#include "RenderCommand.h"
#include "Texture.h"
#include "Camera/Camera.h"
2021-07-29 17:12:13 +04:30
#include "Events/WindowEvents.h"
#include <glm/glm.hpp>
#include <glm/matrix.hpp>
#include <glm/gtc/matrix_transform.hpp>
2021-05-30 16:45:54 +04:30
namespace Light {
Renderer* Renderer::s_Context = nullptr;
2021-05-30 16:45:54 +04:30
Renderer::Renderer(GLFWwindow* windowHandle, Ref<SharedContext> sharedContext)
: m_QuadRenderer(LT_MAX_QUAD_RENDERER_VERTICES, sharedContext),
2021-07-29 17:12:13 +04:30
m_TextureRenderer(LT_MAX_TEXTURE_RENDERER_VERTICES, sharedContext),
m_ViewProjectionBuffer(nullptr),
m_RenderCommand(nullptr),
m_Blender(nullptr),
m_Camera(nullptr),
m_TargetFramebuffer(nullptr)
2021-05-30 16:45:54 +04:30
{
LT_ENGINE_ASSERT(!s_Context, "Renderer::Renderer: an instance of 'Renderer' already exists, do not construct this class!");
s_Context = this;
2021-05-30 16:45:54 +04:30
m_ViewProjectionBuffer = ConstantBuffer::Create(ConstantBufferIndex::ViewProjection, sizeof(glm::mat4), sharedContext);
2021-07-09 11:56:31 +04:30
2021-07-29 17:12:13 +04:30
m_RenderCommand = RenderCommand::Create(windowHandle, sharedContext);
m_Blender = Blender::Create(sharedContext);
2021-05-30 16:45:54 +04:30
}
Scope<Renderer> Renderer::Create(GLFWwindow* windowHandle, Ref<SharedContext> sharedContext)
2021-05-30 16:45:54 +04:30
{
return MakeScope<Renderer>(new Renderer(windowHandle, sharedContext));
2021-05-30 16:45:54 +04:30
}
void Renderer::OnWindowResize(const WindowResizedEvent& event)
{
m_RenderCommand->SetViewport(0u, 0u, event.GetSize().x, event.GetSize().y);
}
2021-07-29 17:12:13 +04:30
//======================================== DRAW_QUAD_TINT ========================================//
void Renderer::DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, const glm::vec4& tint)
2021-05-30 16:45:54 +04:30
{
// locals
QuadRendererProgram::QuadVertexData* bufferMap = m_QuadRenderer.GetMapCurrent();
const float xMin = position.x;
const float yMin = position.y;
const float xMax = position.x + size.x;
const float yMax = position.y + size.y;
2021-07-29 17:12:13 +04:30
// top left
bufferMap[0].position = { xMin, yMin, position.z };
bufferMap[0].tint = tint;
2021-07-29 17:12:13 +04:30
// top right
bufferMap[1].position = { xMax, yMin, position.z };
bufferMap[1].tint = tint;
2021-07-29 17:12:13 +04:30
// bottom right
bufferMap[2].position = { xMax, yMax, position.z };
bufferMap[2].tint = tint;
2021-07-29 17:12:13 +04:30
// bottom left
bufferMap[3].position = { xMin, yMax, position.z };
bufferMap[3].tint = tint;
// advance
if (!m_QuadRenderer.Advance())
{
LT_ENGINE_WARN("Renderer::DrawQuadImpl: exceeded LT_MAX_QUAD_RENDERER_VERTICES: {}", LT_MAX_QUAD_RENDERER_VERTICES);
FlushScene();
}
}
2021-07-29 17:12:13 +04:30
//======================================== DRAW_QUAD_TINT ========================================//
2021-07-29 17:12:13 +04:30
//============================== DRAW_QUAD_TEXTURE ==============================//
void Renderer::DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, Ref<Texture> texture)
{
// #todo: implement a proper binding
texture->Bind();
// locals
TextureRendererProgram::TextureVertexData* bufferMap = m_TextureRenderer.GetMapCurrent();
const float xMin = position.x;
const float yMin = position.y;
const float xMax = position.x + size.x;
const float yMax = position.y + size.y;
2021-07-29 17:12:13 +04:30
// top left
bufferMap[0].position = { xMin, yMin, position.z };
bufferMap[0].texcoord = { 0.0f, 0.0f };
2021-07-29 17:12:13 +04:30
// top right
bufferMap[1].position = { xMax, yMin, position.z };
bufferMap[1].texcoord = { 1.0f, 0.0f };
2021-07-29 17:12:13 +04:30
// bottom right
bufferMap[2].position = { xMax, yMax, position.z };
bufferMap[2].texcoord = { 1.0f, 1.0f };
2021-07-29 17:12:13 +04:30
// bottom left
bufferMap[3].position = { xMin, yMax, position.z };
bufferMap[3].texcoord = { 0.0f, 1.0f };
// advance
if (!m_TextureRenderer.Advance())
{
LT_ENGINE_WARN("Renderer::DrawQuadImpl: exceeded LT_MAX_TEXTURE_RENDERER_VERTICES: {}", LT_MAX_TEXTURE_RENDERER_VERTICES);
FlushScene();
}
}
2021-07-29 17:12:13 +04:30
//============================== DRAW_QUAD_TEXTURE ==============================//
void Renderer::BeginFrame()
{
}
void Renderer::EndFrame()
{
m_RenderCommand->SwapBuffers();
m_RenderCommand->ClearBackBuffer(m_Camera->GetClearColor());
}
void Renderer::BeginSceneImpl(const Ref<Camera>& camera, const Ref<Framebuffer>& targetFrameBuffer /* = nullptr */)
{
2021-07-29 17:12:13 +04:30
// determine the target frame buffer
m_TargetFramebuffer = targetFrameBuffer;
if (targetFrameBuffer)
targetFrameBuffer->BindAsTarget();
else
m_RenderCommand->DefaultTargetFramebuffer();
2021-07-29 17:12:13 +04:30
// update view projection buffer
m_Camera = camera;
glm::mat4* map = (glm::mat4*)m_ViewProjectionBuffer->Map();
map[0] = m_Camera->GetProjection() * m_Camera->GetView();
m_ViewProjectionBuffer->UnMap();
2021-07-29 17:12:13 +04:30
// map renderers
m_QuadRenderer.Map();
m_TextureRenderer.Map();
}
void Renderer::FlushScene()
{
EndScene();
m_QuadRenderer.Map();
m_TextureRenderer.Map();
}
void Renderer::EndSceneImpl()
{
2021-07-29 17:12:13 +04:30
// enable blending
m_Blender->Enable(BlendFactor::SRC_ALPHA, BlendFactor::INVERSE_SRC_ALPHA);
2021-07-29 17:12:13 +04:30
/* quad renderer */
m_QuadRenderer.UnMap();
if (m_QuadRenderer.GetQuadCount())
2021-06-15 09:39:11 +04:30
{
m_QuadRenderer.Bind();
m_RenderCommand->DrawIndexed(m_QuadRenderer.GetQuadCount() * 6u);
2021-06-15 09:39:11 +04:30
}
2021-07-29 17:12:13 +04:30
/* text renderer */
m_TextureRenderer.UnMap();
if (m_TextureRenderer.GetQuadCount())
{
m_TextureRenderer.Bind();
m_RenderCommand->DrawIndexed(m_TextureRenderer.GetQuadCount() * 6u);
}
2021-07-29 17:12:13 +04:30
// reset frame buffer
if(m_TargetFramebuffer)
{
m_TargetFramebuffer = nullptr;
m_RenderCommand->DefaultTargetFramebuffer();
}
}
2021-05-30 16:45:54 +04:30
}