diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2022-10-18 03:00:56 +0200 |
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2022-10-18 03:00:56 +0200 |
| commit | 1a95ead477a0bebbb7017b6b0423ce82cca3ea78 (patch) | |
| tree | dbc6728ff50ec2721ea2f61a0f13e3252d3eb763 /shaders | |
| parent | b7c90db8cc966ed7bff33fba1a49de2c384e5e38 (diff) | |
a
Diffstat (limited to 'shaders')
| -rw-r--r-- | shaders/tile-shader.cpp | 16 | ||||
| -rw-r--r-- | shaders/tile-shader.hpp | 16 |
2 files changed, 25 insertions, 7 deletions
diff --git a/shaders/tile-shader.cpp b/shaders/tile-shader.cpp index bda7114c..93c6a5c8 100644 --- a/shaders/tile-shader.cpp +++ b/shaders/tile-shader.cpp @@ -42,11 +42,7 @@ tile_shader& tile_shader::set_camera_offset(Vector2d camera_offset) static constexpr auto MAX = std::numeric_limits<std::int32_t>::max(); ASSERT(std::fabs(camera_offset[0]) <= MAX); ASSERT(std::fabs(camera_offset[1]) <= MAX); - if (camera_offset != _camera_offset) - { - _camera_offset = camera_offset; - setUniform(OffsetUniform, Vector2i{std::int32_t(camera_offset[0]*2), std::int32_t(camera_offset[1]*2)}); - } + _camera_offset = camera_offset; return *this; } @@ -58,4 +54,14 @@ tile_shader& tile_shader::set_tint(const Vector4& tint) return *this; } +void tile_shader::on_draw() +{ + if (const auto offset = Vector2i{(std::int32_t)_camera_offset[0], (std::int32_t)_camera_offset[1]}; + offset != _real_camera_offset) + { + _real_camera_offset = offset; + setUniform(OffsetUniform, offset); + } +} + } // namespace floormat diff --git a/shaders/tile-shader.hpp b/shaders/tile-shader.hpp index 50402030..1856f63b 100644 --- a/shaders/tile-shader.hpp +++ b/shaders/tile-shader.hpp @@ -23,6 +23,10 @@ struct tile_shader : GL::AbstractShaderProgram static constexpr Vector2d project(Vector3d pt); static constexpr Vector2d unproject(Vector2d px); + template<typename T, typename... Xs> + auto draw(T&& mesh, Xs&&... xs) -> + decltype(GL::AbstractShaderProgram::draw(std::forward<T>(mesh), std::forward<Xs>(xs)...)); + private: void on_draw(); @@ -34,10 +38,18 @@ private: enum { ScaleUniform = 0, OffsetUniform = 1, TintUniform = 2, }; }; +template<typename T, typename... Xs> +auto tile_shader::draw(T&& mesh, Xs&&... xs) -> + decltype(GL::AbstractShaderProgram::draw(std::forward<T>(mesh), std::forward<Xs>(xs)...)) +{ + on_draw(); + return GL::AbstractShaderProgram::draw(std::forward<T>(mesh), std::forward<Xs>(xs)...); +} + constexpr Vector2d tile_shader::project(const Vector3d pt) { - const auto x = -pt[0]*.5, y = pt[1]*.5, z = pt[2]; - return { (x-y), (x+y+z)*.59 }; + const auto x = -pt[0], y = pt[1], z = pt[2]; + return { (x-y), (x+y+z*2)*.59 }; } constexpr Vector2d tile_shader::unproject(const Vector2d px) |
