light/Engine/src/Platform/GraphicsAPI/OpenGL/glBuffers.cpp

132 lines
2.9 KiB
C++
Raw Normal View History

2021-05-28 13:13:45 +04:30
#include "glBuffers.h"
2021-05-28 05:12:23 +04:30
#include <glad/glad.h>
namespace Light {
2021-07-29 17:12:13 +04:30
//==================== CONSTANT_BUFFER ====================//
glConstantBuffer::glConstantBuffer(ConstantBufferIndex index, unsigned int size)
2021-07-29 17:12:13 +04:30
: m_BufferID(NULL),
m_Index(static_cast<int>(index))
{
glCreateBuffers(1, &m_BufferID);
glNamedBufferData(m_BufferID, size, nullptr, GL_DYNAMIC_DRAW);
Bind();
}
glConstantBuffer::~glConstantBuffer()
{
glDeleteBuffers(1, &m_BufferID);
}
void glConstantBuffer::Bind()
{
glBindBufferBase(GL_UNIFORM_BUFFER, m_Index, m_BufferID);
}
void* glConstantBuffer::Map()
{
void* map = glMapNamedBuffer(m_BufferID, GL_WRITE_ONLY);
return map;
}
void glConstantBuffer::UnMap()
{
glUnmapNamedBuffer(m_BufferID);
}
2021-07-29 17:12:13 +04:30
//==================== CONSTANT_BUFFER ====================//
2021-07-29 17:12:13 +04:30
//==================== VERTEX_BUFFER ====================//
glVertexBuffer::glVertexBuffer(float* vertices, unsigned int stride, unsigned int count)
2021-07-29 17:12:13 +04:30
: m_BufferID(NULL)
2021-05-28 05:12:23 +04:30
{
glCreateBuffers(1, &m_BufferID);
glNamedBufferData(m_BufferID, stride * count, vertices, GL_DYNAMIC_DRAW);
2021-05-28 05:12:23 +04:30
}
glVertexBuffer::~glVertexBuffer()
{
glDeleteBuffers(1, &m_BufferID);
}
2021-07-29 17:12:13 +04:30
void glVertexBuffer::Bind()
{
2021-07-29 17:12:13 +04:30
glBindBuffer(GL_ARRAY_BUFFER, m_BufferID);
}
2021-07-29 17:12:13 +04:30
void glVertexBuffer::UnBind()
{
2021-07-29 17:12:13 +04:30
glBindBuffer(GL_ARRAY_BUFFER, NULL);
}
2021-07-29 17:12:13 +04:30
void* glVertexBuffer::Map()
2021-05-28 05:12:23 +04:30
{
2021-07-29 17:12:13 +04:30
return glMapNamedBuffer(m_BufferID, GL_WRITE_ONLY);
2021-05-28 05:12:23 +04:30
}
2021-07-29 17:12:13 +04:30
void glVertexBuffer::UnMap()
2021-05-28 05:12:23 +04:30
{
2021-07-29 17:12:13 +04:30
glUnmapNamedBuffer(m_BufferID);
2021-05-28 05:12:23 +04:30
}
2021-07-29 17:12:13 +04:30
//==================== VERTEX_BUFFER ====================//
2021-05-28 05:12:23 +04:30
2021-07-29 17:12:13 +04:30
//==================== INDEX_BUFFER ====================//
glIndexBuffer::glIndexBuffer(unsigned int* indices, unsigned int count)
2021-07-29 17:12:13 +04:30
: m_BufferID(NULL)
2021-05-28 13:13:45 +04:30
{
// generate indices if not provided
bool hasIndices = !!indices;
if (!hasIndices)
{
// check
if (count % 6 != 0)
{
LT_ENGINE_WARN("glIndexBuffer::dxIndexBuffer: 'indices' can only be null if count is multiple of 6");
LT_ENGINE_WARN("glIndexBuffer::glIndexBuffer: adding {} to 'count' -> {}", (6 - (count % 6)), count + (6 - (count % 6)));
count = count + (6 - (count % 6));
}
// create indices
indices = new unsigned int[count];
2021-07-29 17:12:13 +04:30
unsigned int offset = 0u;
for (unsigned int i = 0u; i < count; i += 6u)
{
2021-07-29 17:12:13 +04:30
indices[i + 0] = offset + 0u;
indices[i + 1] = offset + 1u;
indices[i + 2] = offset + 2u;
2021-07-29 17:12:13 +04:30
indices[i + 3] = offset + 2u;
indices[i + 4] = offset + 3u;
indices[i + 5] = offset + 0u;
2021-07-29 17:12:13 +04:30
offset += 4u;
}
}
// create buffer
2021-05-28 13:13:45 +04:30
glCreateBuffers(1, &m_BufferID);
glNamedBufferData(m_BufferID, count * sizeof(unsigned int), indices, GL_STATIC_DRAW);
// delete indices
if (!hasIndices)
delete[] indices;
2021-05-28 13:13:45 +04:30
}
glIndexBuffer::~glIndexBuffer()
{
glDeleteBuffers(1, &m_BufferID);
}
void glIndexBuffer::Bind()
{
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_BufferID);
}
void glIndexBuffer::UnBind()
{
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL);
}
2021-07-29 17:12:13 +04:30
//==================== INDEX_BUFFER ====================//
2021-05-28 13:13:45 +04:30
2021-05-28 05:12:23 +04:30
}