Added vertex buffers/data handling and shader/program handling

This commit is contained in:
NaifBanana
2026-08-20 08:14:28 -05:00
parent 52a01debd6
commit ecd6db5eab
14 changed files with 386 additions and 1109 deletions
+48 -48
View File
@@ -12,6 +12,27 @@
namespace nb {
static uint8_t GLSLTypeSize(GLenum type) {
switch(type) {
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_HALF_FLOAT:
return 2;
break;
case GL_INT:
case GL_UNSIGNED_INT:
case GL_FLOAT:
return 4;
break;
case GL_DOUBLE:
return 8;
break;
default:
return 1;
break;
}
}
struct VertexAttributeLayout {
int32_t offset = 0;
GLsizei stride = 0;
@@ -53,42 +74,6 @@ class VAOError : public Error<VAOError> {
static const ErrorCodeMap ErrorMessages;
};
template <bool Immutable=false>
class VertexBuffer : public ArrayBuffer<false>{
using Base = ArrayBuffer<false>;
public:
template<typename... Args>
VertexBuffer(const VertexAttributeList& vas={}, Args... args)
: attributes(vas) {
if (sizeof...(Args)) {
data(args...);
}
}
VertexBuffer(VertexBuffer&& rhs)
: attributes(rhs.attributes), Base(std::move(rhs)){}
using Base::Target;
const VertexAttributeList attributes;
protected:
using Base::_usage;
};
template <>
class VertexBuffer<true>
: public virtual VertexBuffer<false>, public virtual ImmutableBuffer<ArrayBuffer<true>> {
using Base = ArrayBuffer<false>;
using BufferType = ImmutableBuffer<ArrayBuffer<true>>;
using BufferType::BufferType;
public:
using Base::Target;
};
class VAO : public OpenGLObject {
using Base = OpenGLObject;
using Codes = VAOError::Codes;
@@ -139,25 +124,40 @@ class VAO : public OpenGLObject {
};
using VBO = ArrayBuffer<false>;
using VertBufVec = SharedVector<VBO>;
using EBO = ElementBuffer<false>;
struct VertexData {
std::shared_ptr<VBO> vbo;
VertexAttributeList attrs;
};
using VertexDataVec = std::vector<VertexData>;
class VertexGroup {
public:
VertexGroup(VertexGroup&&);
VertexGroup& operator=(VertexGroup&&);
VertexGroup(const VertexData&);
VertexGroup(const VertexDataVec&);
VertexGroup(const ByteVector&, const VertexAttributeList&);
void bind() const {
_elmt_buf.bind();
_vao.bind();
_ebo->bind();
_vao->bind();
}
void unbind() const {
_vao.bind();
_elmt_buf.unbind();
_vao->unbind();
_ebo->unbind();
}
VertexBuffer<false>& buffer(size_t);
size_t buffer(VertexBuffer<false>&&);
std::vector<std::shared_ptr<VertexBuffer<false>>> buffers();
size_t buffers(std::vector<VertexBuffer<false>>&&);
VertexBuffer<false>&& dropBuffer(size_t);
VertexDataVec getBuffers();
VertexData getBuffers(size_t);
size_t setBuffers(const VertexDataVec&);
size_t addBuffer(const VertexData&);
VertexData dropBuffer(size_t);
VertexAttributePointer attribute(size_t) const;
void enableAttr(GLuint);
@@ -168,9 +168,9 @@ class VertexGroup {
void disable();
protected:
std::vector<std::shared_ptr<VertexBuffer<false>>> _vertex_data;
ElementBuffer<false> _elmt_buf;
VAO _vao;
VertexDataVec _vertex_data;
std::shared_ptr<EBO> _ebo;
std::shared_ptr<VAO> _vao;
};
} // namespace nb