2#include "editor/Application.h"
3#include "common/maths/Vec.h"
7 Storage Renderer2D::s_Storage;
12 s_Storage.quadShader = MakeRef<Shader>(
"./../assets/shaders/quad.vertexShader.glsl",
13 "./../assets/shaders/quad.pixelShader.glsl");
14 s_Storage.lineShader = MakeRef<Shader>(
"./../assets/shaders/quad.vertexShader.glsl",
15 "./../assets/shaders/line.pixelShader.glsl");
16 s_Storage.ellipseShader = MakeRef<Shader>(
"./../assets/shaders/quad.vertexShader.glsl",
17 "./../assets/shaders/ellipse.pixelShader.glsl");
19 Vertex squareVert1 = { { 0.0f, 100.0f, -20.0f },
22 { 1.0f, 1.0f, 1.0f } };
23 Vertex squareVert2 = { { 100.0f, 100.0f, -20.0f },
26 { 1.0f, 1.0f, 1.0f } };
27 Vertex squareVert3 = { { 100.0f, 0.0f, -20.0f },
30 { 1.0f, 1.0f, 1.0f } };
31 Vertex squareVert4 = { { 0.0f, 0.0f, -20.0f },
34 { 1.0f, 1.0f, 1.0f } };
36 Vector<Vertex> verts = { squareVert1, squareVert2, squareVert3, squareVert4 };
38 Vector<unsigned int> indices = {
52 s_Storage.vao = MakeRef<VertexArray>();
53 s_Storage.vao->AddVertexBuffer(vb, layout, verts);
54 s_Storage.vao->AddIndexBuffer(ib);
56 s_Storage.quadVertices.reserve(reserveVertices);
57 s_Storage.quadIndices.reserve(reserveVertices);
58 s_Storage.ellipseVertices.reserve(reserveVertices);
59 s_Storage.ellipseIndices.reserve(reserveVertices);
60 s_Storage.lineVertices.reserve(reserveVertices);
61 s_Storage.lineIndices.reserve(reserveVertices);
63 Camera* camera = Application::GetInstance()->GetCamera();
64 camera->SetPerspective(glm::ortho(-960.0f, 960.0f, -540.0f, 540.0f, 0.1f, 100.0f));
69 Camera* camera = Application::GetInstance()->GetCamera();
71 s_Storage.quadShader->Bind();
72 s_Storage.quadShader->SetUniformMat4f(
"u_Model", glm::mat4(1.0f));
73 s_Storage.quadShader->SetUniformMat4f(
"u_View", camera->GetViewMatrix());
74 s_Storage.quadShader->SetUniformMat4f(
"u_Proj", camera->GetProjectionMatrix());
76 s_Storage.lineShader->Bind();
77 s_Storage.lineShader->SetUniformMat4f(
"u_Model", glm::mat4(1.0f));
78 s_Storage.lineShader->SetUniformMat4f(
"u_View", camera->GetViewMatrix());
79 s_Storage.lineShader->SetUniformMat4f(
"u_Proj", camera->GetProjectionMatrix());
81 s_Storage.ellipseShader->Bind();
82 s_Storage.ellipseShader->SetUniformMat4f(
"u_Model", glm::mat4(1.0f));
83 s_Storage.ellipseShader->SetUniformMat4f(
"u_View", camera->GetViewMatrix());
84 s_Storage.ellipseShader->SetUniformMat4f(
"u_Proj", camera->GetProjectionMatrix());
89 drawQuad(x, y, width, height, color);
95 drawQuad(vertex1, vertex2, vertex3, vertex4, color);
100 Maths::Vec2 vertex1 = start + (end - start).Perpendicular().Normalize() * thickness;
101 Maths::Vec2 vertex2 = end + (end - start).Perpendicular().Normalize() * thickness;
102 Maths::Vec2 vertex3 = end - (end - start).Perpendicular().Normalize() * thickness;
103 Maths::Vec2 vertex4 = start - (end - start).Perpendicular().Normalize() * thickness;
105 drawLine(vertex1, vertex2, vertex3, vertex4, color);
110 drawEllipse(center, radiusX, radiusY, color);
115 drawEllipse(center, radius, radius, color);
121 if (!s_Storage.quadVertices.empty())
132 s_Storage.vao->AddVertexBuffer(vb, layout, s_Storage.quadVertices);
133 s_Storage.vao->AddIndexBuffer(ib);
136 s_Storage.quadShader->Bind();
139 s_Storage.quadVertices.clear();
140 s_Storage.quadIndices.clear();
143 if (!s_Storage.ellipseVertices.empty())
154 s_Storage.vao->AddVertexBuffer(vb, layout, s_Storage.ellipseVertices);
155 s_Storage.vao->AddIndexBuffer(ib);
158 s_Storage.ellipseShader->Bind();
161 s_Storage.ellipseVertices.clear();
162 s_Storage.ellipseIndices.clear();
165 if (!s_Storage.lineVertices.empty())
176 s_Storage.vao->AddVertexBuffer(vb, layout, s_Storage.lineVertices);
177 s_Storage.vao->AddIndexBuffer(ib);
180 s_Storage.lineShader->Bind();
183 s_Storage.lineVertices.clear();
184 s_Storage.lineIndices.clear();
189 void Renderer2D::drawQuad(
float x,
float y,
float width,
float height,
const Maths::Vec3& color)
196 void Renderer2D::drawQuad(Maths::Vec2 vertex1, Maths::Vec2 vertex2, Maths::Vec2 vertex3, Maths::Vec2 vertex4, Maths::Vec3 color)
198 Vertex quadVert1 = { { vertex1.x, vertex1.y, -20.0f },
200 { color.x, color.y, color.z },
201 { 1.0f, 1.0f, 1.0f } };
202 Vertex quadVert2 = { { vertex2.x, vertex2.y, -20.0f },
204 { color.x, color.y, color.z },
205 { 1.0f, 1.0f, 1.0f } };
206 Vertex quadVert3 = { { vertex3.x, vertex3.y, -20.0f },
208 { color.x, color.y, color.z },
209 { 1.0f, 1.0f, 1.0f } };
210 Vertex quadVert4 = { { vertex4.x, vertex4.y, -20.0f },
212 { color.x, color.y, color.z },
213 { 1.0f, 1.0f, 1.0f } };
215 Vector<unsigned int> indices = {
221 s_Storage.quadIndices.emplace_back(s_Storage.quadVertices.size());
222 s_Storage.quadIndices.emplace_back(s_Storage.quadVertices.size() + 1);
223 s_Storage.quadIndices.emplace_back(s_Storage.quadVertices.size() + 2);
224 s_Storage.quadIndices.emplace_back(s_Storage.quadVertices.size() + 2);
225 s_Storage.quadIndices.emplace_back(s_Storage.quadVertices.size() + 3);
226 s_Storage.quadIndices.emplace_back(s_Storage.quadVertices.size());
229 s_Storage.quadVertices.emplace_back(quadVert1);
230 s_Storage.quadVertices.emplace_back(quadVert2);
231 s_Storage.quadVertices.emplace_back(quadVert3);
232 s_Storage.quadVertices.emplace_back(quadVert4);
235 void Renderer2D::drawEllipse(Maths::Vec2 center,
float radiusX,
float radiusY, Maths::Vec3 color)
237 Vertex vertex1 = { { center.x - radiusX, center.y - radiusY, -20.0f },
239 { color.x, color.y, color.z },
240 { 1.0f, 1.0f, 1.0f } };
241 Vertex vertex2 = { { center.x + radiusX, center.y - radiusY, -20.0f },
243 { color.x, color.y, color.z },
244 { 1.0f, 1.0f, 1.0f } };
245 Vertex vertex3 = { { center.x + radiusX, center.y + radiusY, -20.0f },
247 { color.x, color.y, color.z },
248 { 1.0f, 1.0f, 1.0f } };
249 Vertex vertex4 = { { center.x - radiusX, center.y + radiusY, -20.0f },
251 { color.x, color.y, color.z },
252 { 1.0f, 1.0f, 1.0f } };
254 Vector<unsigned int> indices = {
260 s_Storage.ellipseIndices.push_back(s_Storage.ellipseVertices.size());
261 s_Storage.ellipseIndices.push_back(s_Storage.ellipseVertices.size() + 1);
262 s_Storage.ellipseIndices.push_back(s_Storage.ellipseVertices.size() + 2);
263 s_Storage.ellipseIndices.push_back(s_Storage.ellipseVertices.size() + 2);
264 s_Storage.ellipseIndices.push_back(s_Storage.ellipseVertices.size() + 3);
265 s_Storage.ellipseIndices.push_back(s_Storage.ellipseVertices.size());
268 s_Storage.ellipseVertices.push_back(vertex1);
269 s_Storage.ellipseVertices.push_back(vertex2);
270 s_Storage.ellipseVertices.push_back(vertex3);
271 s_Storage.ellipseVertices.push_back(vertex4);
274 void Renderer2D::drawLine(Maths::Vec2 vertex1, Maths::Vec2 vertex2, Maths::Vec2 vertex3, Maths::Vec2 vertex4, Maths::Vec3 color)
276 Vertex lineVert1 = { { vertex1.x, vertex1.y, -20.0f },
278 { color.x, color.y, color.z },
279 { 1.0f, 1.0f, 1.0f } };
280 Vertex lineVert2 = { { vertex2.x, vertex2.y, -20.0f },
282 { color.x, color.y, color.z },
283 { 1.0f, 1.0f, 1.0f } };
284 Vertex lineVert3 = { { vertex3.x, vertex3.y, -20.0f },
286 { color.x, color.y, color.z },
287 { 1.0f, 1.0f, 1.0f } };
288 Vertex lineVert4 = { { vertex4.x, vertex4.y, -20.0f },
290 { color.x, color.y, color.z },
291 { 1.0f, 1.0f, 1.0f } };
293 Vector<unsigned int> indices = {
299 s_Storage.lineIndices.push_back(s_Storage.lineVertices.size());
300 s_Storage.lineIndices.push_back(s_Storage.lineVertices.size() + 1);
301 s_Storage.lineIndices.push_back(s_Storage.lineVertices.size() + 2);
302 s_Storage.lineIndices.push_back(s_Storage.lineVertices.size() + 2);
303 s_Storage.lineIndices.push_back(s_Storage.lineVertices.size() + 3);
304 s_Storage.lineIndices.push_back(s_Storage.lineVertices.size());
307 s_Storage.lineVertices.push_back(lineVert1);
308 s_Storage.lineVertices.push_back(lineVert2);
309 s_Storage.lineVertices.push_back(lineVert3);
310 s_Storage.lineVertices.push_back(lineVert4);
A class that represents the camera.
Manages the IndexBuffer. For more information on IndexBuffers, visit https://learnopengl....
static void BeginScene()
Begins the scene.
static void DrawEllipse(Maths::Vec2 center, float radiusX, float radiusY, Maths::Vec3 color)
Draws an ellipse.
static void Init(int reserveVertices=10000)
Initializes the Renderer2D.
static void EndScene()
Ends the scene.
static void DrawLine(Maths::Vec2 start, Maths::Vec2 end, float thickness, Maths::Vec3 color)
Draws a line.
static void DrawQuad(float x, float y, float width, float height, const Maths::Vec3 &color)
Draws a quad.
static void DrawCircle(Maths::Vec2 center, float radius, Maths::Vec3 color)
Draws a circle.
static void Draw(Ref< VertexArray > va, unsigned int indexCount, unsigned int instanceCount=1)
Initializes the Renderer.
A class for the VertexBuffer.