69 changed files with 4296 additions and 4160 deletions
			
			
		@ -1,298 +1,379 @@
					 | 
				
			||||
#include "glad/glad.h" | 
				
			||||
 | 
				
			||||
#include "ruc/meta/assert.h" | 
				
			||||
#include "inferno/core.h" | 
				
			||||
#include "inferno/io/log.h" | 
				
			||||
#include "inferno/render/buffer.h" | 
				
			||||
#include "ruc/meta/assert.h" | 
				
			||||
 | 
				
			||||
namespace Inferno { | 
				
			||||
 | 
				
			||||
// -----------------------------------------
 | 
				
			||||
 | 
				
			||||
	BufferElement::BufferElement(BufferElementType type, std::string name, bool normalized) : | 
				
			||||
			m_type(type), | 
				
			||||
			m_name(name), | 
				
			||||
			m_size(BufferElement::getTypeSize(type)), | 
				
			||||
			m_normalized(normalized) | 
				
			||||
	{ | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	uint32_t BufferElement::getTypeSize() const | 
				
			||||
	{ | 
				
			||||
		return BufferElement::getTypeSize(m_type); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	uint32_t BufferElement::getTypeCount() const | 
				
			||||
	{ | 
				
			||||
		return BufferElement::getTypeCount(m_type); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	uint32_t BufferElement::getTypeGL() const | 
				
			||||
	{ | 
				
			||||
		return BufferElement::getTypeGL(m_type); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	uint32_t BufferElement::getTypeSize(const BufferElementType type) | 
				
			||||
	{ | 
				
			||||
		switch (type) { | 
				
			||||
			case BufferElementType::None:       return 0; | 
				
			||||
			case BufferElementType::Bool:       return sizeof(bool); | 
				
			||||
			case BufferElementType::Bool2:      return sizeof(bool) * 2; | 
				
			||||
			case BufferElementType::Bool3:      return sizeof(bool) * 3; | 
				
			||||
			case BufferElementType::Bool4:      return sizeof(bool) * 4; | 
				
			||||
			case BufferElementType::Int:        return sizeof(int32_t); | 
				
			||||
			case BufferElementType::Int2:       return sizeof(int32_t) * 2; | 
				
			||||
			case BufferElementType::Int3:       return sizeof(int32_t) * 3; | 
				
			||||
			case BufferElementType::Int4:       return sizeof(int32_t) * 4; | 
				
			||||
			case BufferElementType::Uint:       return sizeof(uint32_t); | 
				
			||||
			case BufferElementType::Uint2:      return sizeof(uint32_t) * 2; | 
				
			||||
			case BufferElementType::Uint3:      return sizeof(uint32_t) * 3; | 
				
			||||
			case BufferElementType::Uint4:      return sizeof(uint32_t) * 4; | 
				
			||||
			case BufferElementType::Float:      return sizeof(float); | 
				
			||||
			case BufferElementType::Vec2:       return sizeof(float) * 2; | 
				
			||||
			case BufferElementType::Vec3:       return sizeof(float) * 3; | 
				
			||||
			case BufferElementType::Vec4:       return sizeof(float) * 4; | 
				
			||||
			case BufferElementType::Double:     return sizeof(double); | 
				
			||||
			case BufferElementType::Double2:    return sizeof(double); | 
				
			||||
			case BufferElementType::Double3:    return sizeof(double); | 
				
			||||
			case BufferElementType::Double4:    return sizeof(double); | 
				
			||||
			case BufferElementType::Mat2:       return sizeof(float) * 2 * 2; | 
				
			||||
			case BufferElementType::Mat3:       return sizeof(float) * 3 * 3; | 
				
			||||
			case BufferElementType::Mat4:       return sizeof(float) * 4 * 4; | 
				
			||||
			case BufferElementType::DoubleMat2: return sizeof(double) * 2 * 2; | 
				
			||||
			case BufferElementType::DoubleMat3: return sizeof(double) * 3 * 3; | 
				
			||||
			case BufferElementType::DoubleMat4: return sizeof(double) * 4 * 4; | 
				
			||||
		}; | 
				
			||||
 | 
				
			||||
		VERIFY(false, "BufferElement unknown BufferElementType size!"); | 
				
			||||
BufferElement::BufferElement(BufferElementType type, std::string name, bool normalized) | 
				
			||||
	: m_type(type) | 
				
			||||
	, m_name(name) | 
				
			||||
	, m_size(BufferElement::getTypeSize(type)) | 
				
			||||
	, m_normalized(normalized) | 
				
			||||
{ | 
				
			||||
} | 
				
			||||
 | 
				
			||||
uint32_t BufferElement::getTypeSize() const | 
				
			||||
{ | 
				
			||||
	return BufferElement::getTypeSize(m_type); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
uint32_t BufferElement::getTypeCount() const | 
				
			||||
{ | 
				
			||||
	return BufferElement::getTypeCount(m_type); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
uint32_t BufferElement::getTypeGL() const | 
				
			||||
{ | 
				
			||||
	return BufferElement::getTypeGL(m_type); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
uint32_t BufferElement::getTypeSize(const BufferElementType type) | 
				
			||||
{ | 
				
			||||
	switch (type) { | 
				
			||||
	case BufferElementType::None: | 
				
			||||
		return 0; | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	uint32_t BufferElement::getTypeCount(const BufferElementType type) | 
				
			||||
	{ | 
				
			||||
		switch (type) { | 
				
			||||
			case BufferElementType::None:       return 0; | 
				
			||||
			case BufferElementType::Bool:       return 1; | 
				
			||||
			case BufferElementType::Bool2:      return 2; | 
				
			||||
			case BufferElementType::Bool3:      return 3; | 
				
			||||
			case BufferElementType::Bool4:      return 4; | 
				
			||||
			case BufferElementType::Int:        return 1; | 
				
			||||
			case BufferElementType::Int2:       return 2; | 
				
			||||
			case BufferElementType::Int3:       return 3; | 
				
			||||
			case BufferElementType::Int4:       return 4; | 
				
			||||
			case BufferElementType::Uint:       return 1; | 
				
			||||
			case BufferElementType::Uint2:      return 2; | 
				
			||||
			case BufferElementType::Uint3:      return 3; | 
				
			||||
			case BufferElementType::Uint4:      return 4; | 
				
			||||
			case BufferElementType::Float:      return 1; | 
				
			||||
			case BufferElementType::Vec2:       return 2; | 
				
			||||
			case BufferElementType::Vec3:       return 3; | 
				
			||||
			case BufferElementType::Vec4:       return 4; | 
				
			||||
			case BufferElementType::Double:     return 1; | 
				
			||||
			case BufferElementType::Double2:    return 2; | 
				
			||||
			case BufferElementType::Double3:    return 3; | 
				
			||||
			case BufferElementType::Double4:    return 4; | 
				
			||||
			case BufferElementType::Mat2:       return 2 * 2; | 
				
			||||
			case BufferElementType::Mat3:       return 3 * 3; | 
				
			||||
			case BufferElementType::Mat4:       return 4 * 4; | 
				
			||||
			case BufferElementType::DoubleMat2: return 2 * 2; | 
				
			||||
			case BufferElementType::DoubleMat3: return 3 * 3; | 
				
			||||
			case BufferElementType::DoubleMat4: return 4 * 4; | 
				
			||||
		}; | 
				
			||||
 | 
				
			||||
		VERIFY(false, "BufferElement unknown BufferElementType count!"); | 
				
			||||
	case BufferElementType::Bool: | 
				
			||||
		return sizeof(bool); | 
				
			||||
	case BufferElementType::Bool2: | 
				
			||||
		return sizeof(bool) * 2; | 
				
			||||
	case BufferElementType::Bool3: | 
				
			||||
		return sizeof(bool) * 3; | 
				
			||||
	case BufferElementType::Bool4: | 
				
			||||
		return sizeof(bool) * 4; | 
				
			||||
	case BufferElementType::Int: | 
				
			||||
		return sizeof(int32_t); | 
				
			||||
	case BufferElementType::Int2: | 
				
			||||
		return sizeof(int32_t) * 2; | 
				
			||||
	case BufferElementType::Int3: | 
				
			||||
		return sizeof(int32_t) * 3; | 
				
			||||
	case BufferElementType::Int4: | 
				
			||||
		return sizeof(int32_t) * 4; | 
				
			||||
	case BufferElementType::Uint: | 
				
			||||
		return sizeof(uint32_t); | 
				
			||||
	case BufferElementType::Uint2: | 
				
			||||
		return sizeof(uint32_t) * 2; | 
				
			||||
	case BufferElementType::Uint3: | 
				
			||||
		return sizeof(uint32_t) * 3; | 
				
			||||
	case BufferElementType::Uint4: | 
				
			||||
		return sizeof(uint32_t) * 4; | 
				
			||||
	case BufferElementType::Float: | 
				
			||||
		return sizeof(float); | 
				
			||||
	case BufferElementType::Vec2: | 
				
			||||
		return sizeof(float) * 2; | 
				
			||||
	case BufferElementType::Vec3: | 
				
			||||
		return sizeof(float) * 3; | 
				
			||||
	case BufferElementType::Vec4: | 
				
			||||
		return sizeof(float) * 4; | 
				
			||||
	case BufferElementType::Double: | 
				
			||||
		return sizeof(double); | 
				
			||||
	case BufferElementType::Double2: | 
				
			||||
		return sizeof(double); | 
				
			||||
	case BufferElementType::Double3: | 
				
			||||
		return sizeof(double); | 
				
			||||
	case BufferElementType::Double4: | 
				
			||||
		return sizeof(double); | 
				
			||||
	case BufferElementType::Mat2: | 
				
			||||
		return sizeof(float) * 2 * 2; | 
				
			||||
	case BufferElementType::Mat3: | 
				
			||||
		return sizeof(float) * 3 * 3; | 
				
			||||
	case BufferElementType::Mat4: | 
				
			||||
		return sizeof(float) * 4 * 4; | 
				
			||||
	case BufferElementType::DoubleMat2: | 
				
			||||
		return sizeof(double) * 2 * 2; | 
				
			||||
	case BufferElementType::DoubleMat3: | 
				
			||||
		return sizeof(double) * 3 * 3; | 
				
			||||
	case BufferElementType::DoubleMat4: | 
				
			||||
		return sizeof(double) * 4 * 4; | 
				
			||||
	}; | 
				
			||||
 | 
				
			||||
	VERIFY(false, "BufferElement unknown BufferElementType size!"); | 
				
			||||
	return 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
uint32_t BufferElement::getTypeCount(const BufferElementType type) | 
				
			||||
{ | 
				
			||||
	switch (type) { | 
				
			||||
	case BufferElementType::None: | 
				
			||||
		return 0; | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	uint32_t BufferElement::getTypeGL(const BufferElementType type) | 
				
			||||
	{ | 
				
			||||
		switch (type) { | 
				
			||||
			case BufferElementType::None:       return GL_NONE; | 
				
			||||
			case BufferElementType::Bool:       return GL_BOOL; | 
				
			||||
			case BufferElementType::Bool2:      return GL_BOOL; | 
				
			||||
			case BufferElementType::Bool3:      return GL_BOOL; | 
				
			||||
			case BufferElementType::Bool4:      return GL_BOOL; | 
				
			||||
			case BufferElementType::Int:        return GL_INT; | 
				
			||||
			case BufferElementType::Int2:       return GL_INT; | 
				
			||||
			case BufferElementType::Int3:       return GL_INT; | 
				
			||||
			case BufferElementType::Int4:       return GL_INT; | 
				
			||||
			case BufferElementType::Uint:       return GL_UNSIGNED_INT; | 
				
			||||
			case BufferElementType::Uint2:      return GL_UNSIGNED_INT; | 
				
			||||
			case BufferElementType::Uint3:      return GL_UNSIGNED_INT; | 
				
			||||
			case BufferElementType::Uint4:      return GL_UNSIGNED_INT; | 
				
			||||
			case BufferElementType::Float:      return GL_FLOAT; | 
				
			||||
			case BufferElementType::Vec2:       return GL_FLOAT; | 
				
			||||
			case BufferElementType::Vec3:       return GL_FLOAT; | 
				
			||||
			case BufferElementType::Vec4:       return GL_FLOAT; | 
				
			||||
			case BufferElementType::Double:     return GL_DOUBLE; | 
				
			||||
			case BufferElementType::Double2:    return GL_DOUBLE; | 
				
			||||
			case BufferElementType::Double3:    return GL_DOUBLE; | 
				
			||||
			case BufferElementType::Double4:    return GL_DOUBLE; | 
				
			||||
			case BufferElementType::Mat2:       return GL_FLOAT; | 
				
			||||
			case BufferElementType::Mat3:       return GL_FLOAT; | 
				
			||||
			case BufferElementType::Mat4:       return GL_FLOAT; | 
				
			||||
			case BufferElementType::DoubleMat2: return GL_DOUBLE; | 
				
			||||
			case BufferElementType::DoubleMat3: return GL_DOUBLE; | 
				
			||||
			case BufferElementType::DoubleMat4: return GL_DOUBLE; | 
				
			||||
		}; | 
				
			||||
 | 
				
			||||
		VERIFY(false, "BufferElement unknown BufferElementType GL!"); | 
				
			||||
		return 0; | 
				
			||||
	} | 
				
			||||
	case BufferElementType::Bool: | 
				
			||||
		return 1; | 
				
			||||
	case BufferElementType::Bool2: | 
				
			||||
		return 2; | 
				
			||||
	case BufferElementType::Bool3: | 
				
			||||
		return 3; | 
				
			||||
	case BufferElementType::Bool4: | 
				
			||||
		return 4; | 
				
			||||
	case BufferElementType::Int: | 
				
			||||
		return 1; | 
				
			||||
	case BufferElementType::Int2: | 
				
			||||
		return 2; | 
				
			||||
	case BufferElementType::Int3: | 
				
			||||
		return 3; | 
				
			||||
	case BufferElementType::Int4: | 
				
			||||
		return 4; | 
				
			||||
	case BufferElementType::Uint: | 
				
			||||
		return 1; | 
				
			||||
	case BufferElementType::Uint2: | 
				
			||||
		return 2; | 
				
			||||
	case BufferElementType::Uint3: | 
				
			||||
		return 3; | 
				
			||||
	case BufferElementType::Uint4: | 
				
			||||
		return 4; | 
				
			||||
	case BufferElementType::Float: | 
				
			||||
		return 1; | 
				
			||||
	case BufferElementType::Vec2: | 
				
			||||
		return 2; | 
				
			||||
	case BufferElementType::Vec3: | 
				
			||||
		return 3; | 
				
			||||
	case BufferElementType::Vec4: | 
				
			||||
		return 4; | 
				
			||||
	case BufferElementType::Double: | 
				
			||||
		return 1; | 
				
			||||
	case BufferElementType::Double2: | 
				
			||||
		return 2; | 
				
			||||
	case BufferElementType::Double3: | 
				
			||||
		return 3; | 
				
			||||
	case BufferElementType::Double4: | 
				
			||||
		return 4; | 
				
			||||
	case BufferElementType::Mat2: | 
				
			||||
		return 2 * 2; | 
				
			||||
	case BufferElementType::Mat3: | 
				
			||||
		return 3 * 3; | 
				
			||||
	case BufferElementType::Mat4: | 
				
			||||
		return 4 * 4; | 
				
			||||
	case BufferElementType::DoubleMat2: | 
				
			||||
		return 2 * 2; | 
				
			||||
	case BufferElementType::DoubleMat3: | 
				
			||||
		return 3 * 3; | 
				
			||||
	case BufferElementType::DoubleMat4: | 
				
			||||
		return 4 * 4; | 
				
			||||
	}; | 
				
			||||
 | 
				
			||||
	VERIFY(false, "BufferElement unknown BufferElementType count!"); | 
				
			||||
	return 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
uint32_t BufferElement::getTypeGL(const BufferElementType type) | 
				
			||||
{ | 
				
			||||
	switch (type) { | 
				
			||||
	case BufferElementType::None: | 
				
			||||
		return GL_NONE; | 
				
			||||
	case BufferElementType::Bool: | 
				
			||||
		return GL_BOOL; | 
				
			||||
	case BufferElementType::Bool2: | 
				
			||||
		return GL_BOOL; | 
				
			||||
	case BufferElementType::Bool3: | 
				
			||||
		return GL_BOOL; | 
				
			||||
	case BufferElementType::Bool4: | 
				
			||||
		return GL_BOOL; | 
				
			||||
	case BufferElementType::Int: | 
				
			||||
		return GL_INT; | 
				
			||||
	case BufferElementType::Int2: | 
				
			||||
		return GL_INT; | 
				
			||||
	case BufferElementType::Int3: | 
				
			||||
		return GL_INT; | 
				
			||||
	case BufferElementType::Int4: | 
				
			||||
		return GL_INT; | 
				
			||||
	case BufferElementType::Uint: | 
				
			||||
		return GL_UNSIGNED_INT; | 
				
			||||
	case BufferElementType::Uint2: | 
				
			||||
		return GL_UNSIGNED_INT; | 
				
			||||
	case BufferElementType::Uint3: | 
				
			||||
		return GL_UNSIGNED_INT; | 
				
			||||
	case BufferElementType::Uint4: | 
				
			||||
		return GL_UNSIGNED_INT; | 
				
			||||
	case BufferElementType::Float: | 
				
			||||
		return GL_FLOAT; | 
				
			||||
	case BufferElementType::Vec2: | 
				
			||||
		return GL_FLOAT; | 
				
			||||
	case BufferElementType::Vec3: | 
				
			||||
		return GL_FLOAT; | 
				
			||||
	case BufferElementType::Vec4: | 
				
			||||
		return GL_FLOAT; | 
				
			||||
	case BufferElementType::Double: | 
				
			||||
		return GL_DOUBLE; | 
				
			||||
	case BufferElementType::Double2: | 
				
			||||
		return GL_DOUBLE; | 
				
			||||
	case BufferElementType::Double3: | 
				
			||||
		return GL_DOUBLE; | 
				
			||||
	case BufferElementType::Double4: | 
				
			||||
		return GL_DOUBLE; | 
				
			||||
	case BufferElementType::Mat2: | 
				
			||||
		return GL_FLOAT; | 
				
			||||
	case BufferElementType::Mat3: | 
				
			||||
		return GL_FLOAT; | 
				
			||||
	case BufferElementType::Mat4: | 
				
			||||
		return GL_FLOAT; | 
				
			||||
	case BufferElementType::DoubleMat2: | 
				
			||||
		return GL_DOUBLE; | 
				
			||||
	case BufferElementType::DoubleMat3: | 
				
			||||
		return GL_DOUBLE; | 
				
			||||
	case BufferElementType::DoubleMat4: | 
				
			||||
		return GL_DOUBLE; | 
				
			||||
	}; | 
				
			||||
 | 
				
			||||
	VERIFY(false, "BufferElement unknown BufferElementType GL!"); | 
				
			||||
	return 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// -----------------------------------------
 | 
				
			||||
 | 
				
			||||
	BufferLayout::BufferLayout(const std::initializer_list<BufferElement>& elements) | 
				
			||||
		: m_elements(elements) | 
				
			||||
	{ | 
				
			||||
		calculateOffsetsAndStride(); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	void BufferLayout::calculateOffsetsAndStride() | 
				
			||||
	{ | 
				
			||||
		m_stride = 0; | 
				
			||||
		for (auto& element : m_elements) { | 
				
			||||
			element.setOffset(m_stride); | 
				
			||||
			m_stride += element.getSize(); | 
				
			||||
		} | 
				
			||||
BufferLayout::BufferLayout(const std::initializer_list<BufferElement>& elements) | 
				
			||||
	: m_elements(elements) | 
				
			||||
{ | 
				
			||||
	calculateOffsetsAndStride(); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
void BufferLayout::calculateOffsetsAndStride() | 
				
			||||
{ | 
				
			||||
	m_stride = 0; | 
				
			||||
	for (auto& element : m_elements) { | 
				
			||||
		element.setOffset(m_stride); | 
				
			||||
		m_stride += element.getSize(); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// -----------------------------------------
 | 
				
			||||
 | 
				
			||||
	VertexBuffer::VertexBuffer(size_t size) | 
				
			||||
	{ | 
				
			||||
		glGenBuffers(1, &m_id); | 
				
			||||
		bind(); | 
				
			||||
VertexBuffer::VertexBuffer(size_t size) | 
				
			||||
{ | 
				
			||||
	glGenBuffers(1, &m_id); | 
				
			||||
	bind(); | 
				
			||||
 | 
				
			||||
		// Reserve data on the GPU
 | 
				
			||||
		glBufferData(GL_ARRAY_BUFFER, size, nullptr, GL_DYNAMIC_DRAW); | 
				
			||||
	// Reserve data on the GPU
 | 
				
			||||
	glBufferData(GL_ARRAY_BUFFER, size, nullptr, GL_DYNAMIC_DRAW); | 
				
			||||
 | 
				
			||||
		unbind(); | 
				
			||||
	} | 
				
			||||
	unbind(); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
	VertexBuffer::VertexBuffer(float* vertices, size_t size) | 
				
			||||
	{ | 
				
			||||
		glGenBuffers(1, &m_id); | 
				
			||||
		bind(); | 
				
			||||
VertexBuffer::VertexBuffer(float* vertices, size_t size) | 
				
			||||
{ | 
				
			||||
	glGenBuffers(1, &m_id); | 
				
			||||
	bind(); | 
				
			||||
 | 
				
			||||
		// Upload data to the GPU
 | 
				
			||||
		glBufferData(GL_ARRAY_BUFFER, size, vertices, GL_STATIC_DRAW); | 
				
			||||
	// Upload data to the GPU
 | 
				
			||||
	glBufferData(GL_ARRAY_BUFFER, size, vertices, GL_STATIC_DRAW); | 
				
			||||
 | 
				
			||||
		unbind(); | 
				
			||||
	} | 
				
			||||
	unbind(); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
	VertexBuffer::~VertexBuffer() | 
				
			||||
	{ | 
				
			||||
		glDeleteBuffers(1, &m_id); | 
				
			||||
	} | 
				
			||||
VertexBuffer::~VertexBuffer() | 
				
			||||
{ | 
				
			||||
	glDeleteBuffers(1, &m_id); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
	void VertexBuffer::bind() const | 
				
			||||
	{ | 
				
			||||
		glBindBuffer(GL_ARRAY_BUFFER, m_id); | 
				
			||||
	} | 
				
			||||
void VertexBuffer::bind() const | 
				
			||||
{ | 
				
			||||
	glBindBuffer(GL_ARRAY_BUFFER, m_id); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
	void VertexBuffer::unbind() const | 
				
			||||
	{ | 
				
			||||
		glBindBuffer(GL_ARRAY_BUFFER, 0); | 
				
			||||
	} | 
				
			||||
void VertexBuffer::unbind() const | 
				
			||||
{ | 
				
			||||
	glBindBuffer(GL_ARRAY_BUFFER, 0); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
	void VertexBuffer::uploadData(const void* data, uint32_t size) | 
				
			||||
	{ | 
				
			||||
		bind(); | 
				
			||||
void VertexBuffer::uploadData(const void* data, uint32_t size) | 
				
			||||
{ | 
				
			||||
	bind(); | 
				
			||||
 | 
				
			||||
		// Upload data to the GPU
 | 
				
			||||
		glBufferSubData(GL_ARRAY_BUFFER, 0, size, data); | 
				
			||||
	// Upload data to the GPU
 | 
				
			||||
	glBufferSubData(GL_ARRAY_BUFFER, 0, size, data); | 
				
			||||
 | 
				
			||||
		unbind(); | 
				
			||||
	} | 
				
			||||
	unbind(); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// -----------------------------------------
 | 
				
			||||
 | 
				
			||||
	IndexBuffer::IndexBuffer(uint32_t* indices, size_t size) : | 
				
			||||
		m_count(size / sizeof(uint32_t)) | 
				
			||||
	{ | 
				
			||||
		glCreateBuffers(1, &m_id); | 
				
			||||
		bind(); | 
				
			||||
IndexBuffer::IndexBuffer(uint32_t* indices, size_t size) | 
				
			||||
	: m_count(size / sizeof(uint32_t)) | 
				
			||||
{ | 
				
			||||
	glCreateBuffers(1, &m_id); | 
				
			||||
	bind(); | 
				
			||||
 | 
				
			||||
		// Upload data to the GPU
 | 
				
			||||
		glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, indices, GL_STATIC_DRAW); | 
				
			||||
	// Upload data to the GPU
 | 
				
			||||
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, indices, GL_STATIC_DRAW); | 
				
			||||
 | 
				
			||||
		unbind(); | 
				
			||||
	} | 
				
			||||
	unbind(); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
	IndexBuffer::~IndexBuffer() | 
				
			||||
	{ | 
				
			||||
		glDeleteBuffers(1, &m_id); | 
				
			||||
	} | 
				
			||||
IndexBuffer::~IndexBuffer() | 
				
			||||
{ | 
				
			||||
	glDeleteBuffers(1, &m_id); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
	void IndexBuffer::bind() const | 
				
			||||
	{ | 
				
			||||
		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id); | 
				
			||||
	} | 
				
			||||
void IndexBuffer::bind() const | 
				
			||||
{ | 
				
			||||
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
	void IndexBuffer::unbind() const | 
				
			||||
	{ | 
				
			||||
		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); | 
				
			||||
	} | 
				
			||||
void IndexBuffer::unbind() const | 
				
			||||
{ | 
				
			||||
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// -----------------------------------------
 | 
				
			||||
 | 
				
			||||
	VertexArray::VertexArray() | 
				
			||||
	{ | 
				
			||||
		glCreateVertexArrays(1, &m_id); | 
				
			||||
VertexArray::VertexArray() | 
				
			||||
{ | 
				
			||||
	glCreateVertexArrays(1, &m_id); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
VertexArray::~VertexArray() | 
				
			||||
{ | 
				
			||||
	glDeleteVertexArrays(1, &m_id); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
void VertexArray::bind() const | 
				
			||||
{ | 
				
			||||
	glBindVertexArray(m_id); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
void VertexArray::unbind() const | 
				
			||||
{ | 
				
			||||
	glBindVertexArray(0); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
void VertexArray::addVertexBuffer(std::shared_ptr<VertexBuffer> vertexBuffer) | 
				
			||||
{ | 
				
			||||
	const auto& layout = vertexBuffer->getLayout(); | 
				
			||||
	VERIFY(layout.getElements().size(), "VertexBuffer has no layout"); | 
				
			||||
 | 
				
			||||
	bind(); | 
				
			||||
	vertexBuffer->bind(); | 
				
			||||
 | 
				
			||||
	uint32_t index = 0; | 
				
			||||
	for (const auto& element : layout) { | 
				
			||||
		glEnableVertexAttribArray(index); | 
				
			||||
		glVertexAttribPointer( | 
				
			||||
			index, | 
				
			||||
			element.getTypeCount(), | 
				
			||||
			element.getTypeGL(), | 
				
			||||
			element.getNormalized() ? GL_TRUE : GL_FALSE, | 
				
			||||
			layout.getStride(), | 
				
			||||
			reinterpret_cast<const void*>(element.getOffset())); | 
				
			||||
 | 
				
			||||
		index++; | 
				
			||||
	} | 
				
			||||
	m_vertexBuffers.push_back(std::move(vertexBuffer)); | 
				
			||||
 | 
				
			||||
	VertexArray::~VertexArray() | 
				
			||||
	{ | 
				
			||||
		glDeleteVertexArrays(1, &m_id); | 
				
			||||
	} | 
				
			||||
	unbind(); | 
				
			||||
	vertexBuffer->unbind(); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
	void VertexArray::bind() const | 
				
			||||
	{ | 
				
			||||
		glBindVertexArray(m_id); | 
				
			||||
	} | 
				
			||||
void VertexArray::setIndexBuffer(std::shared_ptr<IndexBuffer> indexBuffer) | 
				
			||||
{ | 
				
			||||
	bind(); | 
				
			||||
	indexBuffer->bind(); | 
				
			||||
 | 
				
			||||
	void VertexArray::unbind() const | 
				
			||||
	{ | 
				
			||||
		glBindVertexArray(0); | 
				
			||||
	} | 
				
			||||
	m_indexBuffer = std::move(indexBuffer); | 
				
			||||
 | 
				
			||||
	void VertexArray::addVertexBuffer(std::shared_ptr<VertexBuffer> vertexBuffer) | 
				
			||||
	{ | 
				
			||||
		const auto& layout = vertexBuffer->getLayout(); | 
				
			||||
		VERIFY(layout.getElements().size(), "VertexBuffer has no layout"); | 
				
			||||
 | 
				
			||||
		bind(); | 
				
			||||
		vertexBuffer->bind(); | 
				
			||||
 | 
				
			||||
		uint32_t index = 0; | 
				
			||||
		for (const auto& element : layout) { | 
				
			||||
			glEnableVertexAttribArray(index); | 
				
			||||
			glVertexAttribPointer( | 
				
			||||
				index, | 
				
			||||
				element.getTypeCount(), | 
				
			||||
				element.getTypeGL(), | 
				
			||||
				element.getNormalized() ? GL_TRUE : GL_FALSE, | 
				
			||||
				layout.getStride(), | 
				
			||||
				reinterpret_cast<const void*>(element.getOffset())); | 
				
			||||
 | 
				
			||||
			index++; | 
				
			||||
		} | 
				
			||||
		m_vertexBuffers.push_back(std::move(vertexBuffer)); | 
				
			||||
 | 
				
			||||
		unbind(); | 
				
			||||
		vertexBuffer->unbind(); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	void VertexArray::setIndexBuffer(std::shared_ptr<IndexBuffer> indexBuffer) | 
				
			||||
	{ | 
				
			||||
		bind(); | 
				
			||||
		indexBuffer->bind(); | 
				
			||||
 | 
				
			||||
		m_indexBuffer = std::move(indexBuffer); | 
				
			||||
 | 
				
			||||
		unbind(); | 
				
			||||
		indexBuffer->unbind(); | 
				
			||||
	} | 
				
			||||
	unbind(); | 
				
			||||
	indexBuffer->unbind(); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
} // namespace Inferno
 | 
				
			||||
					 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue