aboutsummaryrefslogtreecommitdiff
path: root/source/Renderer.cpp
blob: dec24ea9861271db81195d17477a6cbd71cdee61 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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);
}