aboutsummaryrefslogtreecommitdiff
path: root/source/Renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Renderer.cpp')
-rw-r--r--source/Renderer.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/source/Renderer.cpp b/source/Renderer.cpp
new file mode 100644
index 0000000..dec24ea
--- /dev/null
+++ b/source/Renderer.cpp
@@ -0,0 +1,43 @@
+#include "Renderer.hpp"
+
+RenderObject::RenderObject(GpuMesh* mesh, Material* material) {
+ glGenVertexArrays(1, &mVao);
+ glBindVertexArray(mVao);
+
+ auto& vf = mesh->vertFormat;
+ auto& vBindings = mesh->vertBufBindings.bindings;
+ auto& shaderInfo = material->GetShader()->GetInfo();
+
+ // Setup vertex buffers
+ for (auto& elm : vf->elements) {
+ assert(elm.bindingIndex < vBindings.size());
+ auto& buffer = vBindings[elm.bindingIndex];
+
+ int index = material->GetShader()->GetInfo().FindInputLocation(elm.semantic);
+ glBindBuffer(GL_ARRAY_BUFFER, buffer->handle);
+ glEnableVertexAttribArray(index);
+ glVertexAttribPointer(
+ index,
+ Tags::VectorLenOf(elm.type),
+ Tags::FindGLType(elm.type),
+ Tags::IsNormalized(elm.type),
+ vf->vertexSize,
+ (void*)(uintptr_t)elm.offset);
+ }
+
+ // Setup index buffer
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->indexBuf->handle);
+
+ glBindVertexArray(GL_NONE);
+}
+
+RenderObject::~RenderObject() {
+ glDeleteVertexArrays(1, &mVao);
+}
+
+void Renderer::Draw(RenderObject& object) {
+ auto indexType = object.GetMesh()->indexBuf->indexType;
+
+ glBindVertexArray(object.GetGLVao());
+ glDrawElements(GL_TRIANGLES, 0, Tags::FindGLType(indexType), 0);
+}