#include "Mesh.hpp" #include GpuVertexBuffer::GpuVertexBuffer() { glGenBuffers(1, &handle); } GpuVertexBuffer::~GpuVertexBuffer() { glDeleteBuffers(1, &handle); } void GpuVertexBuffer::Upload(const std::byte* data, size_t sizeInBytes) { glBindBuffer(GL_ARRAY_BUFFER, handle); glBufferData(GL_ARRAY_BUFFER, sizeInBytes, data, GL_DYNAMIC_DRAW); } GpuIndexBuffer::GpuIndexBuffer() { glGenBuffers(1, &handle); } GpuIndexBuffer::~GpuIndexBuffer() { glDeleteBuffers(1, &handle); } void GpuIndexBuffer::Upload(const std::byte* data, size_t count) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle); glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * Tags::SizeOf(indexType), data, GL_DYNAMIC_DRAW); } void GpuIndexBuffer::Upload(const std::byte* data, Tags::IndexType type, size_t count) { indexType = type; glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle); glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * Tags::SizeOf(type), data, GL_DYNAMIC_DRAW); } int BufferBindings::GetMaxBindingIndex() const { return bindings.size() - 1; } GpuVertexBuffer* BufferBindings::GetBinding(int index) const { if (index >= 0 && index < bindings.size()) { return bindings[index].Get(); } else { return nullptr; } } void BufferBindings::SetBinding(int index, GpuVertexBuffer* buffer) { int maxBindingIndex = GetMaxBindingIndex(); if (index > maxBindingIndex) { int countDelta = index - maxBindingIndex; bindings.resize(bindings.size() + countDelta); } bindings[index].Attach(buffer); if (index == maxBindingIndex && buffer == nullptr) { bindings.pop_back(); } } void BufferBindings::Clear() { bindings.clear(); } int VertexElementFormat::GetStride() const { return Tags::SizeOf(type); } void VertexFormat::AddElement(VertexElementFormat element) { vertexSize += element.GetStride(); int lastIdx = (int)elements.size() - 1; if (lastIdx >= 0) { auto& last = elements[lastIdx]; element.offset = last.offset + last.GetStride(); } else { element.offset = 0; } elements.push_back(std::move(element)); } void VertexFormat::RemoveElement(int index) { auto& element = elements[index]; vertexSize -= element.GetStride(); elements.erase(elements.begin() + index); } GpuMesh::GpuMesh() { } GpuMesh::~GpuMesh() { } bool GpuMesh::IsEmpty() const { return vertFormat == nullptr || indexBuf == nullptr; }