feat: better buffer binding/unbinding control
This commit is contained in:
@@ -20,19 +20,25 @@ namespace OpenGL {
|
|||||||
~Buffer();
|
~Buffer();
|
||||||
|
|
||||||
inline const BufferID GetID() const { return m_buffer; }
|
inline const BufferID GetID() const { return m_buffer; }
|
||||||
protected:
|
inline const BufferTarget GetTarget() const { return m_target; }
|
||||||
void Data(void* data, size_t size);
|
public:
|
||||||
void SubData(void *data, size_t size, size_t offset);
|
static inline const bool IsBound(const Buffer& buffer) { return m_bound == buffer.GetID(); }
|
||||||
|
static inline const bool IsBound(const Buffer* buffer) { return buffer && m_bound == buffer->GetID(); }
|
||||||
|
// static inline void Bind(const Buffer& buffer) { glBindBuffer(buffer.GetTarget(), buffer.GetID()); }
|
||||||
|
static inline void Bind(const Buffer* buffer) { glBindBuffer(buffer->GetTarget(), buffer->GetID()); m_bound = buffer->GetID(); }
|
||||||
|
static inline void Unbind(const Buffer* buffer) { glBindBuffer(buffer->GetTarget(), 0); m_bound = 0; }
|
||||||
|
|
||||||
|
static void Data(const Buffer* buffer, const void* data, size_t size);
|
||||||
|
static void SubData(const Buffer* buffer, const void *data, size_t size, size_t offset);
|
||||||
|
protected:
|
||||||
void BindBuffer(unsigned int index) const;
|
void BindBuffer(unsigned int index) const;
|
||||||
void BindBufferRanged(unsigned int index, size_t offset, size_t size) const;
|
void BindBufferRanged(unsigned int index, size_t offset, size_t size) const;
|
||||||
protected:
|
|
||||||
void Bind() const;
|
|
||||||
void Unbind() const;
|
|
||||||
private:
|
private:
|
||||||
BufferID m_buffer;
|
BufferID m_buffer;
|
||||||
BufferTarget m_target;
|
BufferTarget m_target;
|
||||||
BufferUsage m_usage;
|
BufferUsage m_usage;
|
||||||
|
private:
|
||||||
|
static BufferID m_bound;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: Implement custom fields structuring via ordered_map?
|
// TODO: Implement custom fields structuring via ordered_map?
|
||||||
@@ -44,7 +50,7 @@ namespace OpenGL {
|
|||||||
|
|
||||||
template<typename T, typename S = size_t>
|
template<typename T, typename S = size_t>
|
||||||
void UpdateUniform(void* data, S offset) {
|
void UpdateUniform(void* data, S offset) {
|
||||||
SubData(data, sizeof(T), offset);
|
SubData(this, data, sizeof(T), offset);
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
unsigned int m_uniformBinding;
|
unsigned int m_uniformBinding;
|
||||||
@@ -61,26 +67,24 @@ namespace OpenGL {
|
|||||||
public:
|
public:
|
||||||
InstanceBuffer(BufferUsage usage);
|
InstanceBuffer(BufferUsage usage);
|
||||||
|
|
||||||
void Data(void *data, size_t size) {
|
inline void StartConfigure() const { Buffer::Bind(this); }
|
||||||
Buffer::Data(data, size);
|
inline void EndConfigure() const { Buffer::Unbind(this); }
|
||||||
}
|
|
||||||
|
|
||||||
void SubData(void *data, size_t size, size_t offset) {
|
|
||||||
Buffer::SubData(data, size, offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void StartConfigure() const { Bind(); }
|
|
||||||
inline void EndConfigure() const { Unbind(); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class ENGINE_API VertexArray {
|
class ENGINE_API VertexArray {
|
||||||
public:
|
public:
|
||||||
VertexArray();
|
VertexArray();
|
||||||
|
~VertexArray();
|
||||||
|
|
||||||
void Bind();
|
void Bind();
|
||||||
void Unbind();
|
void Unbind();
|
||||||
|
|
||||||
|
void SetupVertexBuffer(BufferUsage usage);
|
||||||
|
public:
|
||||||
|
void VertexBufferData(size_t size, const void* data);
|
||||||
private:
|
private:
|
||||||
unsigned int m_id;
|
unsigned int m_id { 0 };
|
||||||
|
ArrayBuffer* m_vbo { nullptr };
|
||||||
};
|
};
|
||||||
} // namespace OpenGL
|
} // namespace OpenGL
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user