From b6691561e8c8762186cd61b4f6d7c6cc7075dd8e Mon Sep 17 00:00:00 2001 From: Hartmut Seichter Date: Sat, 1 Jul 2023 10:20:24 +0200 Subject: [PATCH] sync --- CMakeLists.txt | 3 ++- examples/simple/CMakeLists.txt | 16 ++++++++++++++ {src => examples/simple}/main.cpp | 15 +++++++------ src/CMakeLists.txt | 16 -------------- src/lib/include/paradiso/rgba.hpp | 9 +++++--- src/lib/include/paradiso/sprite.hpp | 17 ++++++++++----- src/lib/src/renderer.cpp | 33 ++++++++++++----------------- 7 files changed, 58 insertions(+), 51 deletions(-) create mode 100644 examples/simple/CMakeLists.txt rename {src => examples/simple}/main.cpp (87%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e41077..dd327d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,4 +20,5 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) -add_subdirectory(src) \ No newline at end of file +add_subdirectory(src) +add_subdirectory(examples/simple) \ No newline at end of file diff --git a/examples/simple/CMakeLists.txt b/examples/simple/CMakeLists.txt new file mode 100644 index 0000000..62f3f94 --- /dev/null +++ b/examples/simple/CMakeLists.txt @@ -0,0 +1,16 @@ +set(paradiso_src + main.cpp + ) + +add_executable( + paradiso + ${paradiso_src} + ) + +target_link_libraries(paradiso + paradiso_core + ) + +target_include_directories(paradiso + PRIVATE + lib) \ No newline at end of file diff --git a/src/main.cpp b/examples/simple/main.cpp similarity index 87% rename from src/main.cpp rename to examples/simple/main.cpp index 0e02a5e..2cd449a 100644 --- a/src/main.cpp +++ b/examples/simple/main.cpp @@ -62,10 +62,11 @@ auto main() -> int { auto checker_board = paradiso::Bitmap::empty(paradiso::Size{4, 4}); auto checker_board_2 = paradiso::Bitmap::from_data( - paradiso::Size{2, 2}, paradiso::RGBA::from_rgb(0x00, 0xFF, 0x00), - paradiso::RGBA::from_rgb(0x00, 0xFF, 0x00), - paradiso::RGBA::from_rgb(0x00, 0xFF, 0x00), - paradiso::RGBA::from_rgb(0x00, 0xFF, 0x00)); + paradiso::Size{2, 2}, + paradiso::RGBA::from_rgb(0x00, 0xFF, 0x00), // G + paradiso::RGBA::from_rgb(0xFF, 0x00, 0x00), // R + paradiso::RGBA::from_rgb(0x00, 0x00, 0xFF), // B + paradiso::RGBA::from_rgb(0xFF, 0x00, 0xFF));// C auto window = paradiso::Window(); @@ -102,9 +103,9 @@ auto main() -> int { while (window.update([&](auto& w) -> bool { ctx.set_clearcolor(paradiso::RGBA::from_rgb(0xFF, green_slider, 0x00)); - // ctx.set_viewport(paradiso::Rectangle{ - // .size = w.client_size() - // }); + ctx.set_viewport(paradiso::Rectangle{ + .size = w.client_size() + }); ctx.clear(); renderer.draw(sprite, shader); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 11531ba..1522fb0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,18 +1,2 @@ add_subdirectory(lib) -set(paradiso_src - main.cpp - ) - -add_executable( - paradiso - ${paradiso_src} - ) - -target_link_libraries(paradiso - paradiso_core - ) - -target_include_directories(paradiso - PRIVATE - lib) \ No newline at end of file diff --git a/src/lib/include/paradiso/rgba.hpp b/src/lib/include/paradiso/rgba.hpp index 46f8a66..f021c8a 100644 --- a/src/lib/include/paradiso/rgba.hpp +++ b/src/lib/include/paradiso/rgba.hpp @@ -38,8 +38,8 @@ struct RGBA final { static constexpr RGBA from_rgba(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) noexcept { return {.pixel = - (value_type)(((((red << 8) | green) << 8) | blue) << 8) | - alpha}; + (value_type)(((((alpha << 8) | blue) << 8) | green) << 8) | + red}; } constexpr void to_float(float rgba_f[4]) const noexcept { @@ -58,7 +58,10 @@ struct RGBA final { constexpr uint8_t blue() const noexcept { return uint8_t((pixel & 0xFF00) >> 8); } - constexpr uint8_t alpha() const noexcept { return uint8_t(pixel & 0xFF); } + constexpr uint8_t alpha() const noexcept { + return uint8_t(pixel & 0xFF); + } + constexpr RGBA& set_red(uint8_t v) noexcept { pixel = (pixel & 0x00FFFFFF) | (v << 24); diff --git a/src/lib/include/paradiso/sprite.hpp b/src/lib/include/paradiso/sprite.hpp index 90ca7a8..cf0064e 100644 --- a/src/lib/include/paradiso/sprite.hpp +++ b/src/lib/include/paradiso/sprite.hpp @@ -30,6 +30,13 @@ namespace paradiso { +// 0 3 | y +// +------+ | ^ +// | \ | | -- + - > x +// | \ | | / | +// +------+ | z +// 1 2 | + struct Sprite final { using ChangeCountType = std::uint64_t; @@ -39,7 +46,7 @@ struct Sprite final { Vector2 pivot{Vector2::zero()}; - std::array indices{0, 3, 2, 2, 1, 0}; + std::array indices{0, 2, 1, 0, 3, 2}; std::array, 4> vertices{ Vector3::make(-1.0f, -1.0f, 0.0f), @@ -52,10 +59,10 @@ struct Sprite final { Vector3::z_axis(), Vector3::z_axis()}; std::array, 4> texture_coordinates{ - Vector2::make(0.0f, 0.0f), /// 0 - Vector2::make(0.0f, 1.0f), /// 1 - Vector2::make(1.0f, 1.0f), /// 2 - Vector2::make(1.0f, 0.0f) /// 3 + Vector2::make(0.0f, 0.0f), + Vector2::make(1.0f, 0.0f), + Vector2::make(1.0f, 1.0f), + Vector2::make(0.0f, 1.0f) }; ChangeCountType change_count{}; diff --git a/src/lib/src/renderer.cpp b/src/lib/src/renderer.cpp index 5cf4df0..2898c0d 100644 --- a/src/lib/src/renderer.cpp +++ b/src/lib/src/renderer.cpp @@ -22,8 +22,8 @@ */ #include "paradiso/renderer.hpp" #include "paradiso/bitmap.hpp" -#include "paradiso/sprite.hpp" #include "paradiso/shader.hpp" +#include "paradiso/sprite.hpp" #include "glad/glad.h" @@ -53,7 +53,6 @@ struct Renderer::impl { GL_TRUE == glIsVertexArray(vertex_array_obj); } - bool build(const Sprite& sprite) { // reset if the Renderer already in use if (ready()) @@ -114,7 +113,6 @@ struct Renderer::impl { return ready(); } - void texture_bind() { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture_id); @@ -124,6 +122,9 @@ struct Renderer::impl { void texture_update(const Bitmap& image) { if (GL_FALSE == glIsTexture(texture_id)) { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glGenTextures(1, &texture_id); glActiveTexture(GL_TEXTURE0 + 0); @@ -139,21 +140,19 @@ struct Renderer::impl { // setup new texture glTexImage2D(GL_TEXTURE_2D, // target 0, // level - GL_RGB, // internal format + GL_RGBA, // internal format image.size.width, // width image.size.height, // height 0, // border - GL_RGBA, // format + GL_BGRA, // format GL_UNSIGNED_BYTE, // type image.data.data() // pointer to data ); -#if 0 + // generate MipMaps + glGenerateMipmap(GL_TEXTURE_2D); + glGenerateTextureMipmap(texture_id); - // generate MipMaps - glGenerateMipmap(GL_TEXTURE_2D); - glGenerateTextureMipmap(_textureId); -#endif } else { glActiveTexture(GL_TEXTURE0); @@ -167,18 +166,15 @@ struct Renderer::impl { 0, // y-offset image.size.width, // width image.size.height, // height - GL_RGBA, // format + GL_BGRA, // format GL_UNSIGNED_BYTE, // type image.data.data()); // pointer } - // glBindTexture(GL_TEXTURE_2D, 0); + glBindTexture(GL_TEXTURE_2D, 0); } - void texture_release() - { - glDeleteTextures(1, &texture_id); - } + void texture_release() { glDeleteTextures(1, &texture_id); } void release() { @@ -189,7 +185,6 @@ struct Renderer::impl { glDeleteVertexArrays(1, &vertex_array_obj); texture_release(); - } void just_draw(const Sprite& sprite) { @@ -237,9 +232,9 @@ bool Renderer::draw(const Sprite& sprite, const Shader& shader) { impl_->just_draw(sprite); - //Renderer::impl::fetch_errors(__PRETTY_FUNCTION__); + // Renderer::impl::fetch_errors(__PRETTY_FUNCTION__); - // impl_->texture_unbind(); + impl_->texture_unbind(); // overkill but some cards are finicky return true; }