2024-08-01 23:32:51 +00:00
|
|
|
#include <glad/glad.h>
|
|
|
|
#include "Renderer.h"
|
|
|
|
#include "Engine.h"
|
|
|
|
|
|
|
|
RendererData Renderer::s_Data;
|
|
|
|
|
|
|
|
Renderer::Renderer() = default;
|
|
|
|
|
|
|
|
Renderer::~Renderer()
|
|
|
|
{
|
|
|
|
Shutdown();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Renderer::Init()
|
|
|
|
{
|
|
|
|
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
|
|
|
|
std::cerr << "Failed to initialize GLAD" << std::endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
LoadShaders();
|
|
|
|
SetupBuffers();
|
2024-08-22 16:34:22 +00:00
|
|
|
|
|
|
|
glfwSetWindowSizeCallback(Engine::Get().GetWindow().GetWindow(), [](GLFWwindow* window, int width, int height)
|
|
|
|
{
|
|
|
|
SetupBuffers();
|
|
|
|
});
|
|
|
|
glfwSetFramebufferSizeCallback(Engine::Get().GetWindow().GetWindow(), [](GLFWwindow* window, int width, int height)
|
|
|
|
{
|
|
|
|
glViewport(0, 0, width, height);
|
|
|
|
});
|
2024-08-01 23:32:51 +00:00
|
|
|
}
|
|
|
|
|
2024-08-22 15:55:30 +00:00
|
|
|
RendererData Renderer::GetData()
|
|
|
|
{
|
|
|
|
return s_Data;
|
|
|
|
}
|
|
|
|
|
2024-08-01 23:32:51 +00:00
|
|
|
void Renderer::LoadShaders()
|
|
|
|
{
|
2024-08-22 15:55:30 +00:00
|
|
|
s_Data.m_Shader = new Shader(RESOURCES_PATH"shaders/vertex.glsl", RESOURCES_PATH"shaders/fragment.glsl");
|
2024-08-01 23:32:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Renderer::SetupBuffers()
|
|
|
|
{
|
|
|
|
float vertices[] = {
|
|
|
|
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,
|
|
|
|
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f,
|
|
|
|
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f
|
|
|
|
};
|
|
|
|
|
2024-08-22 15:55:30 +00:00
|
|
|
s_Data.m_FBO = new FrameBuffer();
|
2024-08-22 16:34:22 +00:00
|
|
|
WindowSize windowSize = Engine::Get().GetWindow().GetSize();
|
|
|
|
s_Data.m_FBO->AttachTexture(windowSize.Width, windowSize.Height);
|
2024-08-01 23:32:51 +00:00
|
|
|
|
|
|
|
s_Data.m_VAO = new VertexArray();
|
|
|
|
s_Data.m_VBO = new VertexBuffer();
|
|
|
|
|
|
|
|
s_Data.m_VAO->Bind();
|
|
|
|
|
|
|
|
s_Data.m_VBO->SetData(sizeof(vertices), vertices);
|
|
|
|
|
|
|
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
|
|
|
|
glEnableVertexAttribArray(0);
|
|
|
|
|
|
|
|
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
|
|
|
|
glEnableVertexAttribArray(1);
|
|
|
|
|
|
|
|
VertexArray::Unbind();
|
|
|
|
VertexBuffer::Unbind();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Renderer::Render() {
|
|
|
|
glClearColor(0.0f, 0.1f, 0.2f, 1.0f);
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
s_Data.m_FBO->Bind();
|
|
|
|
|
|
|
|
s_Data.m_Shader->Use();
|
2024-08-22 15:55:30 +00:00
|
|
|
auto transform = glm::mat4(1.0f);
|
|
|
|
transform = glm::translate(transform, glm::vec3(UI::GetData().m_Position[0], UI::GetData().m_Position[1], UI::GetData().m_Position[2]));
|
2024-08-22 18:05:08 +00:00
|
|
|
glUniformMatrix4fv(s_Data.m_Shader->GetUniformLocation("transform"), 1, GL_FALSE, glm::value_ptr(transform));
|
|
|
|
glUniform3fv(s_Data.m_Shader->GetUniformLocation("color"), 1, UI::GetData().m_Color);
|
2024-08-01 23:32:51 +00:00
|
|
|
s_Data.m_VAO->Bind();
|
|
|
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
|
|
|
FrameBuffer::Unbind();
|
|
|
|
}
|
|
|
|
|
2024-08-22 15:55:30 +00:00
|
|
|
void Renderer::End()
|
|
|
|
{
|
|
|
|
glfwSwapBuffers(Engine::Get().GetWindow().GetWindow());
|
|
|
|
glfwPollEvents();
|
|
|
|
}
|
|
|
|
|
2024-08-01 23:32:51 +00:00
|
|
|
void Renderer::Shutdown()
|
|
|
|
{
|
|
|
|
s_Data.m_VAO->Shutdown();
|
|
|
|
s_Data.m_VBO->Shutdown();
|
|
|
|
s_Data.m_FBO->Shutdown();
|
|
|
|
s_Data.m_Shader->Shutdown();
|
|
|
|
}
|