diff --git a/examples/simple/main.cpp b/examples/simple/main.cpp index 7662c49..cee9607 100644 --- a/examples/simple/main.cpp +++ b/examples/simple/main.cpp @@ -24,13 +24,15 @@ layout (location = 0) in vec3 vertices; layout (location = 1) in vec3 normals; layout (location = 2) in vec2 texture_coords; -uniform vec4 pivot = vec4( 0.5, 0.5, 0.0, 1.0 ); +uniform vec2 pivot = vec2( 0.0, 0.0 ); + +vec4 pivot_3d = vec4( pivot , 0.0, 1.0 ); out vec2 tex_c; void main() { tex_c = texture_coords; - gl_Position = vec4(vertices, 1.0) + pivot; + gl_Position = vec4(vertices, 1.0) + pivot_3d; } )"; @@ -94,13 +96,21 @@ auto main() -> int { // eine sehr rudimentäre Eingabebehandlung. Bei vorhandenen // Eingaben landen diese hier. Wer sich am Design beteiligen - // möchte, kann hier einen eleganteren Vorschlag machen + // möchte: hier gibt es viel Potential zur Verbesserung ;) window.set_keyboardcallback( [&](auto& w, int key, int scancode, int action, int mods) { - if (key == 'Q' || key == 256) + if (key == 'Q' || key == 256) // Q oder ESC beenden das Programm want_close = true; - else if (key == 'A') { + else if (key == 'B') { // kleine Spielerei slider_value += 10; + } else if (key == 'W') { + sprite.pivot.y() += 0.1f; + } else if (key == 'S') { + sprite.pivot.y() -= 0.1f; + } else if (key == 'A') { + sprite.pivot.x() -= 0.1f; + } else if (key == 'D') { + sprite.pivot.x() += 0.1f; } }); @@ -119,13 +129,16 @@ auto main() -> int { // werden ctx.set_viewport(paradiso::Rectangle{ .size = - w.client_size().minimal_extent() // wir wollen das + w.client_size().maximal_extent() // wir wollen das // Seitenverhältnis beibehalten }); // hier wird das eigentliche löschen des vorherigen Inhalts ausgelöst ctx.clear(); + // wir setzen den pivot der sprite über den shader + shader.set_uniform("pivot", sprite.pivot); + // Ein `renderer` kann nur mit einer Sprite verwendet werden! // Aber ein Shader kann man für mehrere Sprite-Renderer Kombis verwenden renderer.draw(sprite, shader); diff --git a/src/lib/include/paradiso/geometry.hpp b/src/lib/include/paradiso/geometry.hpp index fc058ac..e3a8393 100644 --- a/src/lib/include/paradiso/geometry.hpp +++ b/src/lib/include/paradiso/geometry.hpp @@ -27,11 +27,18 @@ namespace paradiso { +/** + * @brief position with integral type + */ + struct Point final { using value_type = int32_t; value_type x{0}, y{0}; }; +/** + * @brief size with integral type + */ struct Size final { using value_type = uint32_t; value_type width{0}, height{0}; @@ -42,11 +49,20 @@ struct Size final { return {.width = std::min(width, height), .height = std::min(width, height)}; } + + constexpr Size maximal_extent() const noexcept { + return {.width = std::max(width, height), + .height = std::max(width, height)}; + } }; -struct Rectangle { - Point position; - Size size; +/** + * @brief position and size with integral type + */ + +struct Rectangle final { + Point position{.x = 0, .y = 0}; + Size size{}; constexpr bool contains(const Point& p) const noexcept { return p.x >= position.x && p.x <= position.x + size.width && diff --git a/src/lib/include/paradiso/shader.hpp b/src/lib/include/paradiso/shader.hpp index 3655a0b..53833c6 100644 --- a/src/lib/include/paradiso/shader.hpp +++ b/src/lib/include/paradiso/shader.hpp @@ -24,6 +24,8 @@ #define PARADISO_SHADER_HPP #include +#include +#include #include #include @@ -60,6 +62,9 @@ struct Shader final { set_uniform_at_location(int location, int32_t v) const; //!< sets a 32bit signed in a shader + const Shader& + set_uniform_at_location(int location, + const Vector2& v) const; //!< sets a 2D float vector /** * @brief retrieves the position of a uniform * @param name of the uniform @@ -77,7 +82,7 @@ struct Shader final { } /** - * sets data of the + * sets data of the uniform inside a shader program */ template const Shader& set_uniform(std::string const& name, T&& value) const { @@ -87,7 +92,7 @@ struct Shader final { using uniform_t = std::variant; + double ,Vector2/*vector3f,vector4f,matrix4x4f*/>; using uniform_entry_t = std::tuple; using uniform_cache_t = std::vector; diff --git a/src/lib/src/shader.cpp b/src/lib/src/shader.cpp index 92232c4..14a613b 100644 --- a/src/lib/src/shader.cpp +++ b/src/lib/src/shader.cpp @@ -172,16 +172,19 @@ struct Shader::impl { // glUniformMatrix4fv(location,1,GL_FALSE,m.ptr()); // } - // void bind(int location,const vector4f& v) - // { - // glUniform4fv(location,1,v.ptr()); - // } + void bind(int location, const Vector2& v) const { + glUniform2fv(location, 1, v.ptr()); + } void bind(int location, const float& v) const { glUniform1f(location, v); } - void bind(int location, const uint32_t& i) const { glUniform1ui(location, i); } + void bind(int location, const uint32_t& i) const { + glUniform1ui(location, i); + } - void bind(int location, const int32_t& i) const { glUniform1i(location, i); } + void bind(int location, const int32_t& i) const { + glUniform1i(location, i); + } // void bind(int location,const texture& v) // { @@ -211,11 +214,11 @@ const Shader& Shader::set_uniform_at_location(int location, int32_t v) const { return *this; } -// Shader &Shader::set_uniform_at_location(int location, vector4f const &v) -// { -// impl_->bind(location, v); -// return *this; -// } +const Shader &Shader::set_uniform_at_location(int location, Vector2 const &v) const +{ + impl_->bind(location, v); + return *this; +} // Shader &Shader::set_uniform_at_location(int location, matrix4x4f const &v) // {