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"
|
2021-07-05 14:36:36 +04:30
|
|
|
#include "Buffers.h"
|
2021-07-09 11:56:31 +04:30
|
|
|
#include "Texture.h"
|
|
|
|
#include "RenderCommand.h"
|
2021-07-15 15:46:28 +04:30
|
|
|
#include "Framebuffer.h"
|
2021-07-05 14:36:36 +04:30
|
|
|
|
2021-07-14 00:17:30 +04:30
|
|
|
#include "Events/WindowEvents.h"
|
|
|
|
|
2021-07-05 14:36:36 +04:30
|
|
|
#include "Camera/Camera.h"
|
|
|
|
|
|
|
|
#include <glm/glm.hpp>
|
|
|
|
#include <glm/matrix.hpp>
|
|
|
|
#include <glm/gtc/matrix_transform.hpp>
|
2021-06-29 11:01:11 +04:30
|
|
|
|
2021-05-30 16:45:54 +04:30
|
|
|
namespace Light {
|
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
Renderer* Renderer::s_Context = nullptr;
|
2021-05-30 16:45:54 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
Renderer::Renderer(GLFWwindow* windowHandle, std::shared_ptr<SharedContext> sharedContext)
|
|
|
|
: m_QuadRenderer(LT_MAX_QUAD_RENDERER_VERTICES, sharedContext),
|
|
|
|
m_TextureRenderer(LT_MAX_TEXTURE_RENDERER_VERTICES, sharedContext)
|
2021-05-30 16:45:54 +04:30
|
|
|
{
|
2021-07-01 19:25:46 +04:30
|
|
|
LT_ENGINE_ASSERT(!s_Context, "Renderer::Renderer: an instance of 'Renderer' already exists, do not construct this class!");
|
2021-06-13 19:35:48 +04:30
|
|
|
s_Context = this;
|
2021-05-30 16:45:54 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
m_RenderCommand = std::unique_ptr<RenderCommand>(RenderCommand::Create(windowHandle, sharedContext));
|
2021-07-05 14:36:36 +04:30
|
|
|
|
|
|
|
m_ViewProjectionBuffer = std::unique_ptr<ConstantBuffer>(ConstantBuffer::Create(ConstantBufferIndex::ViewProjection, sizeof(glm::mat4), sharedContext));
|
2021-07-09 11:56:31 +04:30
|
|
|
|
|
|
|
m_Blender = std::unique_ptr<Blender>(Blender::Create(sharedContext));
|
2021-07-14 00:17:30 +04:30
|
|
|
m_Blender->Enable(BlendFactor::SRC_ALPHA, BlendFactor::INVERSE_SRC_ALPHA);
|
2021-05-30 16:45:54 +04:30
|
|
|
}
|
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
Renderer* Renderer::Create(GLFWwindow* windowHandle, std::shared_ptr<SharedContext> sharedContext)
|
2021-05-30 16:45:54 +04:30
|
|
|
{
|
2021-07-01 19:25:46 +04:30
|
|
|
return new Renderer(windowHandle, sharedContext);
|
2021-05-30 16:45:54 +04:30
|
|
|
}
|
|
|
|
|
2021-07-14 00:17:30 +04:30
|
|
|
void Renderer::OnWindowResize(const WindowResizedEvent& event)
|
|
|
|
{
|
|
|
|
m_RenderCommand->SetViewport(0u, 0u, event.GetSize().x, event.GetSize().y);
|
|
|
|
}
|
|
|
|
|
2021-06-13 19:35:48 +04:30
|
|
|
void Renderer::DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, const glm::vec4& tint)
|
2021-05-30 16:45:54 +04:30
|
|
|
{
|
2021-06-14 17:02:56 +04:30
|
|
|
// locals
|
2021-07-01 19:25:46 +04:30
|
|
|
QuadRendererProgram::QuadVertexData* bufferMap = m_QuadRenderer.GetMapCurrent();
|
|
|
|
|
2021-06-13 19:35:48 +04:30
|
|
|
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-01 19:25:46 +04:30
|
|
|
//** TOP_LEFT **//
|
|
|
|
bufferMap[0].position = { xMin, yMin, position.z };
|
|
|
|
bufferMap[0].tint = tint;
|
2021-06-29 11:01:11 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
//** TOP_RIGHT **//
|
|
|
|
bufferMap[1].position = { xMax, yMin, position.z };
|
|
|
|
bufferMap[1].tint = tint;
|
2021-06-13 19:35:48 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
//** BOTTOM_RIGHT **//
|
|
|
|
bufferMap[2].position = { xMax, yMax, position.z };
|
|
|
|
bufferMap[2].tint = tint;
|
2021-06-13 19:35:48 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
//** BOTTOM_LEFT **//
|
|
|
|
bufferMap[3].position = { xMin, yMax, position.z };
|
|
|
|
bufferMap[3].tint = tint;
|
2021-06-13 19:35:48 +04:30
|
|
|
|
|
|
|
// advance
|
2021-07-01 19:25:46 +04:30
|
|
|
if (!m_QuadRenderer.Advance())
|
2021-06-29 11:01:11 +04:30
|
|
|
{
|
2021-07-14 00:17:30 +04:30
|
|
|
LT_ENGINE_WARN("Renderer::DrawQuadImpl: exceeded LT_MAX_QUAD_RENDERER_VERTICES: {}", LT_MAX_QUAD_RENDERER_VERTICES);
|
|
|
|
FlushScene();
|
2021-06-29 11:01:11 +04:30
|
|
|
}
|
2021-07-01 19:25:46 +04:30
|
|
|
}
|
2021-06-29 11:01:11 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
void Renderer::DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, std::shared_ptr<Texture> texture)
|
|
|
|
{
|
2021-06-29 11:01:11 +04:30
|
|
|
// #todo: implement a proper binding
|
|
|
|
texture->Bind();
|
|
|
|
|
|
|
|
// locals
|
2021-07-01 19:25:46 +04:30
|
|
|
TextureRendererProgram::TextureVertexData* bufferMap = m_TextureRenderer.GetMapCurrent();
|
|
|
|
|
2021-06-29 11:01:11 +04:30
|
|
|
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-01 19:25:46 +04:30
|
|
|
//** TOP_LEFT **//
|
|
|
|
bufferMap[0].position = { xMin, yMin, position.z };
|
|
|
|
bufferMap[0].texcoord = { 0.0f, 0.0f };
|
2021-06-29 11:01:11 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
//** TOP_RIGHT **//
|
|
|
|
bufferMap[1].position = { xMax, yMin, position.z };
|
|
|
|
bufferMap[1].texcoord = { 1.0f, 0.0f };
|
2021-06-29 11:01:11 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
//** BOTTOM_RIGHT **//
|
|
|
|
bufferMap[2].position = { xMax, yMax, position.z };
|
|
|
|
bufferMap[2].texcoord = { 1.0f, 1.0f };
|
2021-06-29 11:01:11 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
//** BOTTOM_LEFT **//
|
|
|
|
bufferMap[3].position = { xMin, yMax, position.z };
|
|
|
|
bufferMap[3].texcoord = { 0.0f, 1.0f };
|
2021-06-29 11:01:11 +04:30
|
|
|
|
|
|
|
// advance
|
2021-07-01 19:25:46 +04:30
|
|
|
if (!m_TextureRenderer.Advance())
|
|
|
|
{
|
2021-07-14 00:17:30 +04:30
|
|
|
LT_ENGINE_WARN("Renderer::DrawQuadImpl: exceeded LT_MAX_TEXTURE_RENDERER_VERTICES: {}", LT_MAX_TEXTURE_RENDERER_VERTICES);
|
|
|
|
FlushScene();
|
2021-07-01 19:25:46 +04:30
|
|
|
}
|
2021-06-29 11:01:11 +04:30
|
|
|
}
|
|
|
|
|
2021-07-05 01:59:18 +04:30
|
|
|
void Renderer::BeginFrame()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void Renderer::EndFrame()
|
|
|
|
{
|
2021-07-14 02:19:52 +04:30
|
|
|
m_RenderCommand->SwapBuffers();
|
|
|
|
m_RenderCommand->ClearBackBuffer();
|
2021-07-05 01:59:18 +04:30
|
|
|
}
|
|
|
|
|
2021-07-15 15:46:28 +04:30
|
|
|
void Renderer::BeginSceneImpl(const std::shared_ptr<Camera>& camera, const std::shared_ptr<Framebuffer>& targetFrameBuffer /* = nullptr */)
|
2021-06-13 19:35:48 +04:30
|
|
|
{
|
2021-07-15 15:46:28 +04:30
|
|
|
m_TargetFramebuffer = targetFrameBuffer;
|
|
|
|
|
|
|
|
if (targetFrameBuffer)
|
|
|
|
targetFrameBuffer->BindAsTarget();
|
|
|
|
else
|
|
|
|
m_RenderCommand->DefaultTargetFramebuffer();
|
|
|
|
|
|
|
|
|
2021-07-05 14:36:36 +04:30
|
|
|
glm::mat4* map = (glm::mat4*)m_ViewProjectionBuffer->Map();
|
2021-07-14 00:17:30 +04:30
|
|
|
map[0] = camera->GetProjection() * camera->GetView();
|
2021-07-05 14:36:36 +04:30
|
|
|
m_ViewProjectionBuffer->UnMap();
|
|
|
|
|
2021-06-13 19:35:48 +04:30
|
|
|
m_QuadRenderer.Map();
|
2021-06-29 11:01:11 +04:30
|
|
|
m_TextureRenderer.Map();
|
2021-06-13 19:35:48 +04:30
|
|
|
}
|
|
|
|
|
2021-07-14 00:17:30 +04:30
|
|
|
void Renderer::FlushScene()
|
|
|
|
{
|
|
|
|
EndScene();
|
|
|
|
|
|
|
|
m_QuadRenderer.Map();
|
|
|
|
m_TextureRenderer.Map();
|
|
|
|
}
|
|
|
|
|
2021-07-05 01:59:18 +04:30
|
|
|
void Renderer::EndSceneImpl()
|
2021-06-13 19:35:48 +04:30
|
|
|
{
|
2021-07-15 15:46:28 +04:30
|
|
|
// m_Blender->Disable();
|
|
|
|
m_Blender->Enable(BlendFactor::SRC_ALPHA, BlendFactor::INVERSE_SRC_ALPHA);
|
2021-07-05 14:36:36 +04:30
|
|
|
m_QuadRenderer.UnMap();
|
|
|
|
m_TextureRenderer.UnMap();
|
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
//** QUAD_RENDERER **//
|
|
|
|
if (m_QuadRenderer.GetQuadCount())
|
2021-06-15 09:39:11 +04:30
|
|
|
{
|
|
|
|
m_QuadRenderer.Bind();
|
2021-07-01 19:25:46 +04:30
|
|
|
m_RenderCommand->DrawIndexed(m_QuadRenderer.GetQuadCount() * 6u);
|
2021-06-15 09:39:11 +04:30
|
|
|
}
|
2021-06-29 11:01:11 +04:30
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
//** TEXT_RENDERER **//
|
|
|
|
if (m_TextureRenderer.GetQuadCount())
|
2021-06-29 11:01:11 +04:30
|
|
|
{
|
|
|
|
m_TextureRenderer.Bind();
|
2021-07-01 19:25:46 +04:30
|
|
|
m_RenderCommand->DrawIndexed(m_TextureRenderer.GetQuadCount() * 6u);
|
2021-06-29 11:01:11 +04:30
|
|
|
}
|
2021-07-15 15:46:28 +04:30
|
|
|
|
|
|
|
if(m_TargetFramebuffer)
|
|
|
|
{
|
|
|
|
m_TargetFramebuffer = nullptr;
|
|
|
|
m_RenderCommand->DefaultTargetFramebuffer();
|
|
|
|
}
|
2021-06-13 19:35:48 +04:30
|
|
|
}
|
|
|
|
|
2021-05-30 16:45:54 +04:30
|
|
|
}
|