Vivid
Loading...
Searching...
No Matches
Renderer3D.cpp
1#include "Renderer3D.h"
2#include "editor/camera/movable/EditorCamera.h"
3#include "editor/Application.h"
4#include "common/maths/Vec.h"
5
6namespace Vivid
7{
8 Storage3D Renderer3D::s_Storage3D;
9
10 void Renderer3D::Init()
11 {
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 },
15 { 1.0f, 1.0f },
16 { 0.0f, 1.0f, 0.0f },
17 { 1.0f, 1.0f, 1.0f } };
18 Vertex squareVert2 = { { 100.0f, 100.0f, -20.0f },
19 { 1.0f, 1.0f },
20 { 0.0f, 1.0f, 0.0f },
21 { 1.0f, 1.0f, 1.0f } };
22 Vertex squareVert3 = { { 100.0f, 0.0f, -20.0f },
23 { 1.0f, 1.0f },
24 { 0.0f, 1.0f, 0.0f },
25 { 1.0f, 1.0f, 1.0f } };
26 Vertex squareVert4 = { { 0.0f, 0.0f, -20.0f },
27 { 1.0f, 1.0f },
28 { 0.0f, 1.0f, 0.0f },
29 { 1.0f, 1.0f, 1.0f } };
30
31 Vector<Vertex> verts = { squareVert1, squareVert2, squareVert3, squareVert4 };
32
33 Vector<unsigned int> indices = {
34 0, 1, 2,
35 2, 3, 0
36 };
37
38 VertexBuffer vb(verts);
39 VertexBufferLayout layout;
40 layout.AddFloat(3); // Position
41 layout.AddFloat(2); // Texcoord
42 layout.AddFloat(3); // Color
43 layout.AddFloat(3); // Normal
44
45 IndexBuffer ib(indices);
46
47 s_Storage3D.vao = MakeRef<VertexArray>();
48 s_Storage3D.vao->AddVertexBuffer(vb, layout, s_Storage3D.quadVertices);
49 s_Storage3D.vao->AddIndexBuffer(ib);
50
51 s_Storage3D.quadVertices.reserve(100000);
52 s_Storage3D.triangleVertices.reserve(100000);
53 }
54
55 void Renderer3D::BeginScene()
56 {
57 Camera* camera = Application::GetInstance()->GetCamera();
58
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());
63 }
64
65 void Renderer3D::EndScene()
66 {
67 if (!s_Storage3D.triangleVertices.empty())
68 {
69 VertexBuffer vb(s_Storage3D.triangleVertices);
70 IndexBuffer ib(s_Storage3D.triangleIndices);
71
72 VertexBufferLayout layout;
73 layout.AddFloat(3);
74 layout.AddFloat(2);
75 layout.AddFloat(3);
76 layout.AddFloat(3);
77
78 s_Storage3D.vao->AddVertexBuffer(vb, layout, s_Storage3D.triangleVertices);
79 s_Storage3D.vao->AddIndexBuffer(ib);
80
81 // Draw call
82 s_Storage3D.quadShader->Bind();
83 Renderer::Draw(s_Storage3D.vao, ib.GetCount());
84
85 s_Storage3D.triangleVertices.clear();
86 s_Storage3D.triangleIndices.clear();
87 }
88
89 if (!s_Storage3D.quadVertices.empty())
90 {
91 VertexBuffer vb(s_Storage3D.quadVertices);
92 IndexBuffer ib(s_Storage3D.quadIndices);
93
94 VertexBufferLayout layout;
95 layout.AddFloat(3);
96 layout.AddFloat(2);
97 layout.AddFloat(3);
98 layout.AddFloat(3);
99
100 s_Storage3D.vao->AddVertexBuffer(vb, layout, s_Storage3D.quadVertices);
101 s_Storage3D.vao->AddIndexBuffer(ib);
102
103 // Draw call
104 s_Storage3D.quadShader->Bind();
105 Renderer::Draw(s_Storage3D.vao, ib.GetCount());
106
107 s_Storage3D.quadVertices.clear();
108 s_Storage3D.quadIndices.clear();
109 }
110 }
111
112 void Renderer3D::DrawQuad(Maths::Vec3 vertex1, Maths::Vec3 vertex2, Maths::Vec3 vertex3, Maths::Vec3 vertex4, Maths::Vec3 color)
113 {
114 Vertex quadVert1 = { { vertex1.x, vertex1.y, vertex1.z },
115 { 0.0f, 0.0f },
116 { color.x, color.y, color.z },
117 { 1.0f, 1.0f, 1.0f } };
118 Vertex quadVert2 = { { vertex2.x, vertex2.y, vertex2.z },
119 { 1.0f, 0.0f },
120 { color.x, color.y, color.z },
121 { 1.0f, 1.0f, 1.0f } };
122 Vertex quadVert3 = { { vertex3.x, vertex3.y, vertex3.z },
123 { 1.0f, 1.0f },
124 { color.x, color.y, color.z },
125 { 1.0f, 1.0f, 1.0f } };
126 Vertex quadVert4 = { { vertex4.x, vertex4.y, vertex4.z },
127 { 0.0f, 1.0f },
128 { color.x, color.y, color.z },
129 { 1.0f, 1.0f, 1.0f } };
130
131 Vector<unsigned int> indices = {
132 0, 1, 2,
133 2, 3, 0
134 };
135
136 // Indices
137 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size()); // 0
138 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 1); // 1
139 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 2); // 2
140 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 2); // 2
141 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 3); // 3
142 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size()); // 0
143
144 // Vertices
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);
149 }
150
151 void Renderer3D::DrawTriangle(Maths::Vec3 vertex1, Maths::Vec3 vertex2, Maths::Vec3 vertex3, Maths::Vec3 color)
152 {
153 Vertex quadVert1 = { { vertex1.x, vertex1.y, vertex1.z },
154 { 0.0f, 0.0f },
155 { color.x, color.y, color.z },
156 { 1.0f, 1.0f, 1.0f } };
157 Vertex quadVert2 = { { vertex2.x, vertex2.y, vertex2.z },
158 { 1.0f, 0.0f },
159 { color.x, color.y, color.z },
160 { 1.0f, 1.0f, 1.0f } };
161 Vertex quadVert3 = { { vertex3.x, vertex3.y, vertex3.z },
162 { 1.0f, 1.0f },
163 { color.x, color.y, color.z },
164 { 1.0f, 1.0f, 1.0f } };
165
166 Vector<unsigned int> indices = {
167 0,
168 1,
169 2,
170 };
171
172 // Indices
173 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size()); // 0
174 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 1); // 1
175 s_Storage3D.quadIndices.emplace_back(s_Storage3D.quadVertices.size() + 2); // 2
176
177 // Vertices
178 s_Storage3D.quadVertices.emplace_back(quadVert1);
179 s_Storage3D.quadVertices.emplace_back(quadVert2);
180 s_Storage3D.quadVertices.emplace_back(quadVert3);
181 }
182
183 void Renderer3D::DrawCube(Maths::Vec3 center, float edgeLength, Maths::Vec3 color)
184 {
185 float halfEdgeLength = edgeLength / 2.0f;
186
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 };
195
196 // Front
197 DrawQuad(vertex1, vertex2, vertex3, vertex4, color);
198 // Back
199 DrawQuad(vertex5, vertex6, vertex7, vertex8, color);
200 // Left
201 DrawQuad(vertex1, vertex5, vertex8, vertex4, color);
202 // Right
203 DrawQuad(vertex2, vertex6, vertex7, vertex3, color);
204 // Top
205 DrawQuad(vertex4, vertex3, vertex7, vertex8, color);
206 // Bottom
207 DrawQuad(vertex1, vertex2, vertex6, vertex5, color);
208 }
209}
A class that represents the camera.
Definition: Camera.h:25
static void Draw(Ref< VertexArray > va, unsigned int indexCount, unsigned int instanceCount=1)
Initializes the Renderer.
Definition: Renderer.cpp:5