2#include "editor/camera/movable/EditorCamera.h"
3#include "editor/Application.h"
4#include "common/maths/Vec.h"
8 Storage3D Renderer3D::s_Storage3D;
10 void Renderer3D::Init()
12 s_Storage3D.quadShader = MakeRef<Shader>(
"./../assets/shaders/quad.vertexShader.glsl",
13 "./../assets/shaders/quad.pixelShader.glsl");
14 Vertex squareVert1 = { { 0.0f, 100.0f, -20.0f },
17 { 1.0f, 1.0f, 1.0f } };
18 Vertex squareVert2 = { { 100.0f, 100.0f, -20.0f },
21 { 1.0f, 1.0f, 1.0f } };
22 Vertex squareVert3 = { { 100.0f, 0.0f, -20.0f },
25 { 1.0f, 1.0f, 1.0f } };
26 Vertex squareVert4 = { { 0.0f, 0.0f, -20.0f },
29 { 1.0f, 1.0f, 1.0f } };
31 Vector<Vertex> verts = { squareVert1, squareVert2, squareVert3, squareVert4 };
33 Vector<unsigned int> indices = {
38 VertexBuffer vb(verts);
39 VertexBufferLayout layout;
45 IndexBuffer ib(indices);
47 s_Storage3D.vao = MakeRef<VertexArray>();
48 s_Storage3D.vao->AddVertexBuffer(vb, layout, s_Storage3D.quadVertices);
49 s_Storage3D.vao->AddIndexBuffer(ib);
51 s_Storage3D.quadVertices.reserve(100000);
52 s_Storage3D.triangleVertices.reserve(100000);
55 void Renderer3D::BeginScene()
57 Camera* camera = Application::GetInstance()->GetCamera();
59 s_Storage3D.quadShader->Bind();
60 s_Storage3D.quadShader->SetUniformMat4f(
"u_Model", glm::mat4(1.0f));
61 s_Storage3D.quadShader->SetUniformMat4f(
"u_View", camera->GetViewMatrix());
62 s_Storage3D.quadShader->SetUniformMat4f(
"u_Proj", camera->GetProjectionMatrix());
65 void Renderer3D::EndScene()
67 if (!s_Storage3D.triangleVertices.empty())
69 VertexBuffer vb(s_Storage3D.triangleVertices);
70 IndexBuffer ib(s_Storage3D.triangleIndices);
72 VertexBufferLayout layout;
78 s_Storage3D.vao->AddVertexBuffer(vb, layout, s_Storage3D.triangleVertices);
79 s_Storage3D.vao->AddIndexBuffer(ib);
82 s_Storage3D.quadShader->Bind();
85 s_Storage3D.triangleVertices.clear();
86 s_Storage3D.triangleIndices.clear();
89 if (!s_Storage3D.quadVertices.empty())
91 VertexBuffer vb(s_Storage3D.quadVertices);
92 IndexBuffer ib(s_Storage3D.quadIndices);
94 VertexBufferLayout layout;
100 s_Storage3D.vao->AddVertexBuffer(vb, layout, s_Storage3D.quadVertices);
101 s_Storage3D.vao->AddIndexBuffer(ib);
104 s_Storage3D.quadShader->Bind();
107 s_Storage3D.quadVertices.clear();
108 s_Storage3D.quadIndices.clear();
112 void Renderer3D::DrawQuad(Maths::Vec3 vertex1, Maths::Vec3 vertex2, Maths::Vec3 vertex3, Maths::Vec3 vertex4, Maths::Vec3 color)
114 Vertex quadVert1 = { { vertex1.x, vertex1.y, vertex1.z },
116 { color.x, color.y, color.z },
117 { 1.0f, 1.0f, 1.0f } };
118 Vertex quadVert2 = { { vertex2.x, vertex2.y, vertex2.z },
120 { color.x, color.y, color.z },
121 { 1.0f, 1.0f, 1.0f } };
122 Vertex quadVert3 = { { vertex3.x, vertex3.y, vertex3.z },
124 { color.x, color.y, color.z },
125 { 1.0f, 1.0f, 1.0f } };
126 Vertex quadVert4 = { { vertex4.x, vertex4.y, vertex4.z },
128 { color.x, color.y, color.z },
129 { 1.0f, 1.0f, 1.0f } };
131 Vector<unsigned int> indices = {
137 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size());
138 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 1);
139 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 2);
140 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 2);
141 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 3);
142 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size());
145 s_Storage3D.quadVertices.emplace_back(quadVert1);
146 s_Storage3D.quadVertices.emplace_back(quadVert2);
147 s_Storage3D.quadVertices.emplace_back(quadVert3);
148 s_Storage3D.quadVertices.emplace_back(quadVert4);
151 void Renderer3D::DrawTriangle(Maths::Vec3 vertex1, Maths::Vec3 vertex2, Maths::Vec3 vertex3, Maths::Vec3 color)
153 Vertex quadVert1 = { { vertex1.x, vertex1.y, vertex1.z },
155 { color.x, color.y, color.z },
156 { 1.0f, 1.0f, 1.0f } };
157 Vertex quadVert2 = { { vertex2.x, vertex2.y, vertex2.z },
159 { color.x, color.y, color.z },
160 { 1.0f, 1.0f, 1.0f } };
161 Vertex quadVert3 = { { vertex3.x, vertex3.y, vertex3.z },
163 { color.x, color.y, color.z },
164 { 1.0f, 1.0f, 1.0f } };
166 Vector<unsigned int> indices = {
173 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size());
174 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 1);
175 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 2);
178 s_Storage3D.quadVertices.emplace_back(quadVert1);
179 s_Storage3D.quadVertices.emplace_back(quadVert2);
180 s_Storage3D.quadVertices.emplace_back(quadVert3);
183 void Renderer3D::DrawCube(Maths::Vec3 center,
float edgeLength, Maths::Vec3 color)
185 float halfEdgeLength = edgeLength / 2.0f;
187 Maths::Vec3 vertex1 = { center.x - halfEdgeLength, center.y - halfEdgeLength, center.z - halfEdgeLength };
188 Maths::Vec3 vertex2 = { center.x + halfEdgeLength, center.y - halfEdgeLength, center.z - halfEdgeLength };
189 Maths::Vec3 vertex3 = { center.x + halfEdgeLength, center.y + halfEdgeLength, center.z - halfEdgeLength };
190 Maths::Vec3 vertex4 = { center.x - halfEdgeLength, center.y + halfEdgeLength, center.z - halfEdgeLength };
191 Maths::Vec3 vertex5 = { center.x - halfEdgeLength, center.y - halfEdgeLength, center.z + halfEdgeLength };
192 Maths::Vec3 vertex6 = { center.x + halfEdgeLength, center.y - halfEdgeLength, center.z + halfEdgeLength };
193 Maths::Vec3 vertex7 = { center.x + halfEdgeLength, center.y + halfEdgeLength, center.z + halfEdgeLength };
194 Maths::Vec3 vertex8 = { center.x - halfEdgeLength, center.y + halfEdgeLength, center.z + halfEdgeLength };
197 DrawQuad(vertex1, vertex2, vertex3, vertex4, color);
199 DrawQuad(vertex5, vertex6, vertex7, vertex8, color);
201 DrawQuad(vertex1, vertex5, vertex8, vertex4, color);
203 DrawQuad(vertex2, vertex6, vertex7, vertex3, color);
205 DrawQuad(vertex4, vertex3, vertex7, vertex8, color);
207 DrawQuad(vertex1, vertex2, vertex6, vertex5, color);
A class that represents the camera.
static void Draw(Ref< VertexArray > va, unsigned int indexCount, unsigned int instanceCount=1)
Initializes the Renderer.