112 lines
3.7 KiB
C++
Executable File
112 lines
3.7 KiB
C++
Executable File
#include "renderer/texture.hpp"
|
|
#include <cstdint>
|
|
#include <pch.hpp>
|
|
|
|
#include <renderer/render_command.hpp>
|
|
#include <renderer/shader.hpp>
|
|
#include <renderer/vertex_array.hpp>
|
|
#include <renderer/renderer2d.hpp>
|
|
|
|
#include <glm/fwd.hpp>
|
|
#include <glm/ext/matrix_transform.hpp>
|
|
|
|
namespace OpenEngine {
|
|
struct Renderer2DData
|
|
{
|
|
Ref<VertexArray> vertex_array;
|
|
Ref<Shader> texture_shader;
|
|
Ref<Texture2D> white_texture;
|
|
};
|
|
|
|
static Renderer2DData* renderer_data;
|
|
|
|
void Renderer2D::Init()
|
|
{
|
|
renderer_data = new Renderer2DData();
|
|
renderer_data->vertex_array = VertexArray::Create();
|
|
|
|
float square_vertices[5 * 4] = {
|
|
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
|
|
0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
|
|
0.5f, 0.5f, 0.0f, 1.0f, 1.0f,
|
|
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
|
|
};
|
|
|
|
Ref<VertexBuffer> vertex_buffer;
|
|
vertex_buffer.reset(VertexBuffer::Create(square_vertices, sizeof(square_vertices)));
|
|
|
|
BufferLayout layout = {
|
|
{ ShaderDataType::Float3, "a_Position" },
|
|
{ ShaderDataType::Float2, "a_TextCoord" }
|
|
};
|
|
|
|
vertex_buffer->SetLayout(layout);
|
|
renderer_data->vertex_array->AddVertexBuffer(vertex_buffer);
|
|
|
|
uint32_t indices[6] = { 0, 1, 2, 2, 3, 0 };
|
|
Ref<IndexBuffer> index_buffer;
|
|
index_buffer.reset(IndexBuffer::Create(indices, sizeof(indices) / sizeof(uint32_t)));
|
|
|
|
renderer_data->vertex_array->SetIndexBuffer(index_buffer);
|
|
|
|
renderer_data->white_texture = Texture2D::Create(1, 1);
|
|
uint32_t white_texture_data = 0xffffffff;
|
|
renderer_data->white_texture->SetData(&white_texture_data, sizeof(uint32_t));
|
|
|
|
renderer_data->texture_shader = Shader::Create("assets/shaders/texture.glsl");
|
|
|
|
renderer_data->texture_shader->Bind();
|
|
renderer_data->texture_shader->SetInt("u_Texture", 0);
|
|
}
|
|
|
|
void Renderer2D::Shutdown()
|
|
{
|
|
delete renderer_data;
|
|
}
|
|
|
|
void Renderer2D::BeginScene(const OrthographicCamera& camera)
|
|
{
|
|
renderer_data->texture_shader->Bind();
|
|
renderer_data->texture_shader->SetMat4("u_ViewProjection", camera.GetViewProjectionMatrix());
|
|
renderer_data->texture_shader->SetMat4("u_ViewProjection", camera.GetViewProjectionMatrix());
|
|
}
|
|
|
|
void Renderer2D::EndScene()
|
|
{
|
|
}
|
|
|
|
void Renderer2D::DrawQuad(const glm::vec2& position, const glm::vec2& size, const Ref<Texture2D>& texture)
|
|
{
|
|
DrawQuad(glm::vec3(position, 0.0f), size, texture);
|
|
}
|
|
void Renderer2D::DrawQuad(const glm::vec3& position, const glm::vec2& size, const Ref<Texture2D>& texture)
|
|
{
|
|
renderer_data->texture_shader->SetVec4("u_Color", glm::vec4(1.0f));
|
|
texture->Bind();
|
|
|
|
glm::mat4 transform = glm::translate(glm::mat4(1.0f), position) *
|
|
glm::scale(glm::mat4(1.0f), {size.x, size.y, 1.0f});
|
|
renderer_data->texture_shader->SetMat4("u_Transform", transform);
|
|
|
|
renderer_data->vertex_array->Bind();
|
|
RenderCommand::DrawIndexed(renderer_data->vertex_array);
|
|
}
|
|
|
|
void Renderer2D::DrawQuad(const glm::vec2& position, const glm::vec2& size, const glm::vec4& color)
|
|
{
|
|
DrawQuad(glm::vec3(position, 0.0f), size, color);
|
|
}
|
|
void Renderer2D::DrawQuad(const glm::vec3& position, const glm::vec2& size, const glm::vec4& color)
|
|
{
|
|
renderer_data->texture_shader->SetVec4("u_Color", color);
|
|
renderer_data->white_texture->Bind();
|
|
|
|
glm::mat4 transform = glm::translate(glm::mat4(1.0f), position) *
|
|
glm::scale(glm::mat4(1.0f), {size.x, size.y, 1.0f});
|
|
renderer_data->texture_shader->SetMat4("u_Transform", transform);
|
|
|
|
renderer_data->vertex_array->Bind();
|
|
RenderCommand::DrawIndexed(renderer_data->vertex_array);
|
|
}
|
|
}
|