#include "../../../include/RenderBackend/OpenGL/DeviceMemory.hpp" #include "../../../include/RenderBackend/OpenGL/opengl.hpp" namespace amalgine { u32 getOpenglStorageType(DeviceMemory::StorageType storageType) { switch(storageType) { case DeviceMemory::StorageType::STATIC: return GL_STATIC_DRAW; case DeviceMemory::StorageType::DYNAMIC: return GL_DYNAMIC_DRAW; case DeviceMemory::StorageType::STREAM: return GL_STREAM_DRAW; } } u32 getOpenglPrimitiveType(DeviceMemory::PrimitiveType primitiveType) { switch(primitiveType) { case DeviceMemory::PrimitiveType::TRIANGLE: return GL_TRIANGLES; } } u32 getPrimitiveTypePointsPerVertices(DeviceMemory::PrimitiveType primitiveType) { switch(primitiveType) { case DeviceMemory::PrimitiveType::TRIANGLE: return 3; } } DeviceMemory::DeviceMemory() : primitiveType(0), numVertices(0) { glGenBuffers(1, &vertexBufferObjectId); } DeviceMemory::~DeviceMemory() { glDeleteBuffers(1, &vertexBufferObjectId); } void DeviceMemory::operator delete(void *data) { free(data); } void DeviceMemory::use() const { // TODO: Bind vao here? glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjectId); } void DeviceMemory::copy(const DataView &data, StorageType storageType, PrimitiveType primitiveType) { glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjectId); glBufferData(GL_ARRAY_BUFFER, data.getByteSize(), data.data, getOpenglStorageType(storageType)); this->primitiveType = getOpenglPrimitiveType(primitiveType); numVertices = getPrimitiveTypePointsPerVertices(primitiveType); } void DeviceMemory::draw() { if(primitiveType == 0) throw DeviceMemoryEmpty("Unable to draw buffer as no data has been copied to device memory"); glDrawArrays(primitiveType, 0, 3); } }