Added vertex buffers/data handling and shader/program handling
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user