WIP: Graphics Overhaul #2

Draft
naifb wants to merge 18 commits from buffer_update into main
3 changed files with 16 additions and 10 deletions
Showing only changes of commit 8a05052516 - Show all commits

View File

@ -138,7 +138,7 @@ class Buffer : public OpenGLObject {
_usage = usage_; _usage = usage_;
} }
virtual void data(const ByteVector& data_, GLenum usage_=GL_STATIC_DRAW) { virtual void data(const ByteVector& data_, GLenum usage_=GL_STATIC_DRAW) {
data(Target, data_.size(), data_.data(), usage_); data(data_.data(), data_.size(), usage_);
} }
virtual void subdata(void* data_, GLsizeiptr size_, GLintptr offset_=0) { virtual void subdata(void* data_, GLsizeiptr size_, GLintptr offset_=0) {

View File

@ -51,16 +51,19 @@ class VAOError : public Error<VAOError> {
template <bool Immutable=false> template <bool Immutable=false>
class VertexBuffer : public ArrayBuffer<false>{ class VertexBuffer : public ArrayBuffer<false>{
using Base = ArrayBuffer<Immutable>; using Base = ArrayBuffer<false>;
public: public:
template<typename... Args> template<typename... Args>
VertexBuffer(const VertexAttributeList& vas, Args... args) VertexBuffer(const VertexAttributeList& vas={}, Args... args)
: attributes(vas) { : attributes(vas) {
if (sizeof...(Args)) { if (sizeof...(Args)) {
data(args...); data(args...);
} }
} }
VertexBuffer(VertexBuffer&& rhs)
: attributes(rhs.attributes), Base(std::move(rhs)){}
using Base::Target; using Base::Target;
const VertexAttributeList attributes; const VertexAttributeList attributes;
@ -104,7 +107,7 @@ class VAO : public OpenGLObject {
if(_id) { if(_id) {
glBindVertexArray(_id); glBindVertexArray(_id);
} else { } else {
THROW(Codes::INVALID_VAO); THROW(VAOError(Codes::INVALID_VAO));
} }
} }
virtual void unbind() const override { glBindVertexArray(0); } virtual void unbind() const override { glBindVertexArray(0); }

View File

@ -141,7 +141,7 @@ std::vector<std::shared_ptr<VertexBuffer<false>>> VertexGroup::buffers() {
} }
size_t VertexGroup::buffers(std::vector<VertexBuffer<false>>&& bufs_) { size_t VertexGroup::buffers(std::vector<VertexBuffer<false>>&& bufs_) {
_vertex_data = {}; _vertex_data.clear();
for (auto& buf : bufs_) { for (auto& buf : bufs_) {
_vertex_data.emplace_back( _vertex_data.emplace_back(
std::make_shared<VertexBuffer<false>>(std::move(buf)) std::make_shared<VertexBuffer<false>>(std::move(buf))
@ -166,13 +166,16 @@ VertexBuffer<false>&& VertexGroup::dropBuffer(size_t idx) {
THROW(BufferError(BufferError::Codes::INVALID_BUFFER)); THROW(BufferError(BufferError::Codes::INVALID_BUFFER));
} }
std::vector<VertexBuffer<false>> tmp; std::vector<VertexBuffer<false>> tmp;
std::shared_ptr<VertexBuffer<false>> ret_ptr;
size_t i = 0;
for (auto buf : _vertex_data) { for (auto buf : _vertex_data) {
tmp.emplace_back(std::move(*buf)); if (i == idx) {
ret_ptr = std::make_shared<VertexBuffer<false>>(std::move(tmp[idx]));
} else {
tmp.emplace_back(std::move(*buf));
}
i++;
} }
_vertex_data.clear();
std::shared_ptr<VertexBuffer<false>> ret_ptr =
std::make_shared<VertexBuffer<false>>(std::move(tmp[idx]));
tmp.erase(tmp.begin()+idx);
buffers(std::move(tmp)); buffers(std::move(tmp));
return std::move(*ret_ptr); return std::move(*ret_ptr);
} }