From f03042b6e9cf95523400da6be43c62a96c6b1fbb Mon Sep 17 00:00:00 2001 From: frank <420@shampoo.ooo> Date: Tue, 28 Sep 2021 02:11:09 -0400 Subject: [PATCH] started implementing vao and vbo classes --- Makefile | 2 +- lib/sb | 2 +- resource/tile/puddingtile.jpg | Bin 0 -> 23664 bytes resource/tile/rat1tile.jpg | Bin 0 -> 33500 bytes src/Pudding.cpp | 58 ++++++++++++++++++++++++++---- src/Pudding.hpp | 66 +++++++++++++++------------------- 6 files changed, 82 insertions(+), 46 deletions(-) create mode 100644 resource/tile/puddingtile.jpg create mode 100644 resource/tile/rat1tile.jpg diff --git a/Makefile b/Makefile index 93e6b9b..48bdf14 100644 --- a/Makefile +++ b/Makefile @@ -69,7 +69,7 @@ $(SB_SRC_DIR)Box.o : $(addprefix $(SB_SRC_DIR),extension.hpp Segment.hpp) $(SB_SRC_DIR)Segment.o : $(addprefix $(SB_SRC_DIR),extension.hpp Box.hpp) $(SB_SRC_DIR)Pixels.o : $(addprefix $(SB_SRC_DIR),Box.hpp extension.hpp) $(SB_SRC_DIR)Audio.o : $(addprefix $(SB_SRC_DIR),Node.hpp Display.hpp Configuration.hpp Box.hpp filesystem.hpp extension.hpp) -$(SB_SRC_DIR)Texture.o : $(addprefix $(SB_SRC_DIR),GLObject.cpp filesystem.hpp Game.hpp) +$(SB_SRC_DIR)Texture.o : $(addprefix $(SB_SRC_DIR),GLObject.hpp filesystem.hpp Game.hpp) $(SRC_DIR)Item.o : $(addprefix $(SB_SRC_DIR),extension.hpp Node.hpp Texture.hpp) $(SRC_DIR)Pudding.o : $(SRC_H_FILES) $(SB_H_FILES) %.o : %.cpp %.hpp diff --git a/lib/sb b/lib/sb index 6adac98..f03d58d 160000 --- a/lib/sb +++ b/lib/sb @@ -1 +1 @@ -Subproject commit 6adac9806faba1483da80895de4d9edb783cdb1f +Subproject commit f03d58dae13d673f4db26af88710e541a892cb77 diff --git a/resource/tile/puddingtile.jpg b/resource/tile/puddingtile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..edc333e14869a35fa367da5eac34762b53cab68c GIT binary patch literal 23664 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 literal 0 HcmV?d00001 diff --git a/resource/tile/rat1tile.jpg b/resource/tile/rat1tile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62cbd6ea6e8ffb24a13309d2c366e0669a114b35 GIT binary patch literal 33500 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
  • bYC$rQ(s_!;o?+@hyshsUd@;0;iYi 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 YI3xELeR{y04sCH1rjVmjz~k!w080KfivR!s literal 0 HcmV?d00001 diff --git a/src/Pudding.cpp b/src/Pudding.cpp index 844051d..fe66502 100644 --- a/src/Pudding.cpp +++ b/src/Pudding.cpp @@ -161,10 +161,9 @@ void Pudding::load_gl_context() { log("could not create capture frame thread context"); } - /* Allocate a vertex array object, bind it as current, doesn't need to be a member var because the same one is always bound */ - GLuint vao; - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); + /* Generate a vertex array object ID, bind it as current */ + vao.generate(); + vao.bind(); /* 2D vertices for any texture that is a plane spanning the screen */ std::array rectangle_vertices = {{ {-1.0f, 1.0f}, {1.0f, 1.0f}, {-1.0f, -1.0f}, @@ -178,9 +177,8 @@ void Pudding::load_gl_context() /* Generate one vertex buffer object to hold all vertices and rectangle UV map. Since we're using one buffer, data * will be copied in one after the other, offset to after the previous data location. The same buffer offset will * be passed to the vertex attributes for each data. */ - GLuint vbo; - glGenBuffers(1, &vbo); - glBindBuffer(GL_ARRAY_BUFFER, vbo); + vbo.generate(); + vbo.bind(); /* allocate space for vertices, UV and colors, and copy rectangle vertices in at initialization */ GLsizeiptr vbo_size = (rectangle_vertices.size() + rectangle_uv.size() + pudding_uv.size()) * sizeof(glm::vec2) + (pudding_vertices.size() + pudding_colors.size()) * sizeof(glm::vec3); @@ -855,3 +853,49 @@ void Pudding::update() previous_barcode = current_barcode; } } + +VAO::VAO() : GLObject(vao_deleter) {} + +/* Bind this VAO to the current GL context */ +void VAO::bind() const +{ + glBindVertexArray(id()); +} + +/* Forward the GL VAO generate function to the base class */ +void VAO::generate() +{ + GLObject::generate(glGenVertexArrays); +} + +/* This function gets passed to the abstract base class for deleting the VAO data when the ID + * pointer goes out of scope (when all instances of this VAO and its copies are out of scope) */ +void vao_deleter(GLuint* id) +{ + /* not sure why SDL_Log works here on program exit but SDL_LogDebug and SDL_LogInfo don't */ + SDL_Log("destroying VAO ID %i", *id); + glDeleteVertexArrays(1, id); +} + +VBO::VBO() : GLObject(vbo_deleter) {} + +/* Bind this VBO to the current GL context */ +void VBO::bind() const +{ + glBindBuffer(GL_ARRAY_BUFFER, id()); +} + +/* Forward the GL buffer generate function to the base class */ +void VBO::generate() +{ + GLObject::generate(glGenBuffers); +} + +/* This function gets passed to the abstract base class for deleting the VBO data when the ID + * pointer goes out of scope (when all instances of this VBO and its copies are out of scope) */ +void vbo_deleter(GLuint* id) +{ + /* not sure why SDL_Log works here on program exit but SDL_LogDebug and SDL_LogInfo don't */ + SDL_Log("destroying VBO ID %i", *id); + glDeleteBuffers(1, id); +} diff --git a/src/Pudding.hpp b/src/Pudding.hpp index 5e7f078..215e69a 100644 --- a/src/Pudding.hpp +++ b/src/Pudding.hpp @@ -26,6 +26,33 @@ #include "Item.hpp" #include "Animation.hpp" #include "Texture.hpp" +#include "GLObject.hpp" + +class VAO : public GLObject +{ + +public: + + VAO(); + void generate(); + void bind() const; + +}; + +void vao_deleter(GLuint*); + +class VBO : public GLObject +{ + +public: + + VBO(); + void generate(); + void bind() const; + +}; + +void vbo_deleter(GLuint*); class Pudding : public Game { @@ -79,6 +106,8 @@ private: std::vector tiles; Texture capture_texture_front_buffer, capture_texture_back_buffer; Texture& capture_texture = capture_texture_front_buffer; + VAO vao; + VBO vbo; void set_pudding_model(float, float, int, int = 1, float = -1, float = 1, float = 0.3f); void load_gl_context(); @@ -109,43 +138,6 @@ public: }; -class VAO -{ - -private: - - std::shared_ptr array_id = nullptr; - -public: - - VAO() {}; - void generate(); - void id(GLuint); - GLuint id() const; - void bind() const; - static void destroy(GLuint*); - -}; - -class Buffer -{ - -private: - - std::shared_ptr buffer_id = nullptr; - -public: - - Buffer() {}; - void generate(); - void id(GLuint); - -}; - -class VBO : public Buffer -{ -}; - class Attributes { };