/* +------------------------------------------------------+ ____/ \____ /| - Open source game framework licensed to freely use, | \ / / | copy, modify and sell without restriction | +--\ ^__^ /--+ | | | ~/ \~ | | - created for | | ~~~~~~~~~~~~ | +------------------------------------------------------+ | SPACE ~~~~~ | / | ~~~~~~~ BOX |/ +-------------*/ #include "VBO.hpp" using namespace sb; VBO::VBO() : Buffer(GL_ARRAY_BUFFER) {} void VBO::generate() { Buffer::generate(); offset = 0; } void VBO::allocate(GLsizeiptr size, GLenum usage) { /* Create data store, making sure the buffer currently bound matches this object's ID */ GLint bound_id; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &bound_id); if (static_cast(bound_id) == id()) { glBufferData(target(), size, nullptr, usage); } else { std::ostringstream message; message << "Error allocating vertex memory for " << *this << ": "; if (bound_id == 0) { message << "no buffer is currently bound"; } else { message << "currently bound buffer ID " << bound_id << " does not match " << *this; } throw std::runtime_error(message.str()); } /* Debug */ std::ostringstream message; message << "After allocating memory for " << *this; sb::Log::gl_errors(message.str()); } GLintptr VBO::add(sb::Attributes& attributes) { /* Set memory and update offset value in attributes object */ glBufferSubData(target(), offset, attributes.size(), attributes); attributes.offset(offset); /* Debug */ std::ostringstream initialization_message; initialization_message << "After setting " << attributes.size() << " bytes in " << *this; sb::Log::gl_errors(initialization_message.str()); /* Increase offset and return */ offset += attributes.size(); return offset; } std::ostream& sb::operator<<(std::ostream& out, const VBO& vbo) { out << ""; return out; }