Explorar el Código

vertext buffer and vertext attributes

Kajetan Johannes Hammerle hace 3 años
padre
commit
9398efdd34
Se han modificado 5 ficheros con 163 adiciones y 1 borrados
  1. 3 1
      meson.build
  2. 35 0
      wrapper/Attributes.cpp
  3. 28 0
      wrapper/Attributes.h
  4. 60 0
      wrapper/VertexBuffer.cpp
  5. 37 0
      wrapper/VertexBuffer.h

+ 3 - 1
meson.build

@@ -34,7 +34,9 @@ sources = ['Main.cpp',
     'wrapper/GL.cpp',
     'wrapper/GLFW.cpp',
     'wrapper/GLEW.cpp', 
-    'wrapper/Shader.cpp']
+    'wrapper/Shader.cpp', 
+    'wrapper/VertexBuffer.cpp',
+    'wrapper/Attributes.cpp']
 
 glewDep = dependency('glew')
 glfwDep = dependency('glfw3')

+ 35 - 0
wrapper/Attributes.cpp

@@ -0,0 +1,35 @@
+#include <GL/glew.h>
+
+#include "wrapper/Attributes.h"
+
+Attributes& Attributes::addFloat(int count) {
+    attributes.add({count, sizeof (float), GL_FLOAT, false});
+    return *this;
+}
+
+Attributes& Attributes::addColor4() {
+    attributes.add({4, sizeof (unsigned char), GL_UNSIGNED_BYTE, true});
+    return *this;
+}
+
+Attributes& Attributes::addSpacer(int count, int size) {
+    attributes.add({count, size, -1, false});
+    return *this;
+}
+
+void Attributes::set() const {
+    int size = 0;
+    for(const Attribute& a : attributes) {
+        size += a.count * a.size;
+    }
+    int index = 0;
+    int offset = 0;
+    for(const Attribute& a : attributes) {
+        if(a.type != -1) {
+            glVertexAttribPointer(index, a.count, a.type, a.normalized, size, static_cast<char*> (0) + offset);
+            glEnableVertexAttribArray(index);
+        }
+        offset += a.count * a.size;
+        index++;
+    }
+}

+ 28 - 0
wrapper/Attributes.h

@@ -0,0 +1,28 @@
+#ifndef ATTRIBUTES_H
+#define ATTRIBUTES_H
+
+#include "utils/List.h"
+
+class Attributes final {
+
+    struct Attribute final {
+        int count;
+        int size;
+        int type;
+        bool normalized;
+    };
+
+    List<Attribute, 10> attributes;
+
+    friend class VertexBuffer;
+
+public:
+    Attributes& addFloat(int count);
+    Attributes& addColor4();
+    Attributes& addSpacer(int count, int size);
+
+private:
+    void set() const;
+};
+
+#endif

+ 60 - 0
wrapper/VertexBuffer.cpp

@@ -0,0 +1,60 @@
+#include "wrapper/VertexBuffer.h"
+
+VertexBuffer::VertexBuffer() : vertexArray(0), vertexBuffer(0) {
+    glGenVertexArrays(1, &vertexArray);
+    glGenBuffers(1, &vertexBuffer);
+}
+
+VertexBuffer::~VertexBuffer() {
+    glDeleteBuffers(1, &vertexBuffer);
+    glDeleteVertexArrays(1, &vertexArray);
+}
+
+void VertexBuffer::bindArray() const {
+    glBindVertexArray(vertexArray);
+}
+
+void VertexBuffer::bindBuffer() const {
+    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
+}
+
+void VertexBuffer::setAttributes(const Attributes& attributes) {
+    bindArray();
+    bindBuffer();
+    attributes.set();
+}
+
+void VertexBuffer::setData(int size, const void* data, int flag) {
+    bindBuffer();
+    glBufferData(GL_ARRAY_BUFFER, size, data, flag);
+}
+
+void VertexBuffer::setStaticData(int size, const void* data) {
+    setData(size, data, GL_STATIC_DRAW);
+}
+
+void VertexBuffer::setStreamData(int size, const void* data) {
+    setData(size, data, GL_STREAM_DRAW);
+}
+
+void VertexBuffer::setDynamicData(int size, const void* data) {
+    setData(size, data, GL_DYNAMIC_DRAW);
+}
+
+void VertexBuffer::updateData(int offset, int size, const void* data) {
+    bindBuffer();
+    glBufferSubData(GL_ARRAY_BUFFER, offset, size, data);
+}
+
+void VertexBuffer::draw(int vertices, int mode, int offset) {
+    bindArray();
+    glDrawArrays(mode, offset, vertices);
+}
+
+void VertexBuffer::draw(int vertices, int offset) {
+    draw(vertices, GL_TRIANGLES, offset);
+}
+
+void VertexBuffer::drawStrip(int vertices, int offset) {
+    draw(vertices, GL_TRIANGLE_STRIP, offset);
+}

+ 37 - 0
wrapper/VertexBuffer.h

@@ -0,0 +1,37 @@
+#ifndef VERTEXBUFFER_H
+#define VERTEXBUFFER_H
+
+#include <GL/glew.h>
+
+#include "wrapper/Attributes.h"
+
+class VertexBuffer final {
+    GLuint vertexArray;
+    GLuint vertexBuffer;
+
+public:
+    VertexBuffer();
+    ~VertexBuffer();
+    VertexBuffer(const VertexBuffer& other) = delete;
+    VertexBuffer(VertexBuffer&& other) = delete;
+    VertexBuffer& operator=(const VertexBuffer& other) = delete;
+    VertexBuffer& operator=(VertexBuffer&& other) = delete;
+
+    void setAttributes(const Attributes& attributes);
+    void setStaticData(int size, const void* data = nullptr);
+    void setStreamData(int size, const void* data = nullptr);
+    void setDynamicData(int size, const void* data = nullptr);
+    void updateData(int offset, int size, const void* data);
+
+    void draw(int vertices, int offset = 0);
+    void drawStrip(int vertices, int offset = 0);
+
+private:
+    void draw(int vertices, int mode, int offset = 0);
+    void setData(int size, const void* data, int flag);
+    void bindArray() const;
+    void bindBuffer() const;
+};
+
+
+#endif