From e40cec48a1f2f80a85be0fada897262d69769788 Mon Sep 17 00:00:00 2001 From: Jerboa-app Date: Thu, 2 Nov 2023 08:07:17 +0000 Subject: [PATCH] g# This is a combination of 2 commits. set projection in example must rebind textures before draw, redesign it --- examples/Sprite/main.cpp | 47 +++-------------- examples/Sprite/resource/texture/saturn.png | Bin 0 -> 46711 bytes include/jGL/OpenGL/glSpriteRenderer.h | 8 +-- include/jGL/spriteRenderer.h | 2 +- src/jGL/OpenGL/glSpriteRenderer.cpp | 54 ++++++++++++-------- 5 files changed, 45 insertions(+), 66 deletions(-) create mode 100644 examples/Sprite/resource/texture/saturn.png diff --git a/examples/Sprite/main.cpp b/examples/Sprite/main.cpp index 6af507ea..3177dc67 100644 --- a/examples/Sprite/main.cpp +++ b/examples/Sprite/main.cpp @@ -26,60 +26,26 @@ int main(int argv, char ** argc) std::shared_ptr heart = jGLInstance->createTexture ( - "resource/texture/HEART.png", + "resource/texture/saturn.png", jGL::Texture::Type::RGBA ); - heart->bind(0); - - std::shared_ptr Pi = jGLInstance->createTexture - ( - "resource/texture/Pi.png", - jGL::Texture::Type::RGBA - ); - - Pi->bind(1); - - std::shared_ptr random = jGLInstance->createTexture - ( - "resource/texture/random.png", - jGL::Texture::Type::RGBA - ); - - random->bind(2); - std::shared_ptr sprites = jGLInstance->createSpriteRenderer ( - 3 + 1 ); + + sprites->setProjection(camera.getVP()); sprites->add ( { - jGL::Transform(0.0f, 0.0f, 0.0f, 1.0f), + jGL::Transform(0.5f, 0.5f, 0.0f, 0.5f), jGL::TextureOffset(0.0f, 0.0f, 0) }, "sHeart" ); - sprites->add - ( - { - jGL::Transform(0.0f, 0.0f, 0.0f, 1.0f), - jGL::TextureOffset(0.0f, 0.0f, 0) - }, - "sPi" - ); - - sprites->add - ( - { - jGL::Transform(0.0f, 0.0f, 0.0f, 1.0f), - jGL::TextureOffset(0.0f, 0.0f, 0) - }, - "sRandom" - ); - double delta = 0.0; while (display.isOpen()) @@ -88,7 +54,8 @@ int main(int argv, char ** argc) jGLInstance->clear(); - sprites->draw({"sHeart", "sPi", "sRandom"}); + heart->bind(0); + sprites->draw({"sHeart"}); delta = 0.0; for (int n = 0; n < 60; n++) diff --git a/examples/Sprite/resource/texture/saturn.png b/examples/Sprite/resource/texture/saturn.png new file mode 100644 index 0000000000000000000000000000000000000000..45d928d38ad1584bd9b68f40aaad2d912e32dabb GIT binary patch literal 46711 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 c8F24ph6UKyHbxvaFdvVcl(J;4xJl^$0saHq)$ literal 0 HcmV?d00001 diff --git a/include/jGL/OpenGL/glSpriteRenderer.h b/include/jGL/OpenGL/glSpriteRenderer.h index f44ac301..e8f116d3 100644 --- a/include/jGL/OpenGL/glSpriteRenderer.h +++ b/include/jGL/OpenGL/glSpriteRenderer.h @@ -17,7 +17,10 @@ namespace jGL::GL offsets = std::vector(sizeHint*4+padSprites*4,0.0f); textureOffsets = std::vector(sizeHint*3+padSprites*3,0.0f); initGL(); - defaultShader = std::make_shared(vertexShader, fragmentShader); + defaultShader = std::static_pointer_cast + ( + std::make_shared(vertexShader, fragmentShader) + ); defaultShader->use(); } @@ -45,8 +48,7 @@ namespace jGL::GL }; std::vector offsets; // offset x, y, theta, scale - std::vector textureOffsets; // tx, ty (atlas coords) - std::vector textureUnits; // texture unit + std::vector textureOffsets; // tx, ty (atlas coords), texture unit size_t padSprites = 8; diff --git a/include/jGL/spriteRenderer.h b/include/jGL/spriteRenderer.h index a7fb39ba..5c74845c 100644 --- a/include/jGL/spriteRenderer.h +++ b/include/jGL/spriteRenderer.h @@ -18,7 +18,7 @@ namespace jGL public: - SpriteRenderer(size_t sizeHint = 64) + SpriteRenderer(size_t sizeHint = 8) { sprites.reserve(sizeHint); } diff --git a/src/jGL/OpenGL/glSpriteRenderer.cpp b/src/jGL/OpenGL/glSpriteRenderer.cpp index db2b124f..555c91c9 100644 --- a/src/jGL/OpenGL/glSpriteRenderer.cpp +++ b/src/jGL/OpenGL/glSpriteRenderer.cpp @@ -30,36 +30,46 @@ namespace jGL::GL shader->use(); shader->setUniform("proj", projection); - shader->setUniform("sampler", 0); + shader->setUniform("sampler", Sampler2D(0)); glBindVertexArray(vao); - glBindBuffer(GL_ARRAY_BUFFER, a_offset); - glBufferSubData - ( - GL_ARRAY_BUFFER, - 0, - 4*n*sizeof(float), - &offsets[0] - ); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - glBindBuffer(GL_ARRAY_BUFFER, a_textureOffset); + glBindBuffer(GL_ARRAY_BUFFER, a_offset); + glBufferSubData + ( + GL_ARRAY_BUFFER, + 0, + 4*n*sizeof(float), + &offsets[0] + ); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glBindBuffer(GL_ARRAY_BUFFER, a_textureOffset); + + glBufferSubData + ( + GL_ARRAY_BUFFER, + 0, + 3*n*sizeof(float), + &textureOffsets[0] + ); + + glBindBuffer(GL_ARRAY_BUFFER, 0); - glBufferSubData - ( - GL_ARRAY_BUFFER, - 0, - 3*n*sizeof(float), - &textureOffsets[0] - ); + glBindVertexArray(0); - glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(vao); - glDrawArraysInstanced(GL_TRIANGLES, 0, 6, n); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_DEPTH_TEST); + + glDrawArraysInstanced(GL_TRIANGLES, 0, 6, n); glBindVertexArray(0); + glError("sprite draw"); + } void glSpriteRenderer::freeGL() @@ -84,7 +94,7 @@ namespace jGL::GL glBufferData ( GL_ARRAY_BUFFER, - sizeof(quad), + sizeof(float)*6*4, &quad[0], GL_STATIC_DRAW );