From 445caf6184cafbce361670ea6028ff76317976bc Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 2 Oct 2022 15:29:41 +0200 Subject: a --- shaders/tile-shader.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ shaders/tile-shader.hpp | 41 +++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 shaders/tile-shader.cpp create mode 100644 shaders/tile-shader.hpp (limited to 'shaders') diff --git a/shaders/tile-shader.cpp b/shaders/tile-shader.cpp new file mode 100644 index 00000000..835f94a0 --- /dev/null +++ b/shaders/tile-shader.cpp @@ -0,0 +1,54 @@ +#include "shaders/tile-shader.hpp" +#include "loader.hpp" +#include +#include +#include +#include +#include +#include + +namespace Magnum::Examples { + +tile_shader::tile_shader() +{ + MAGNUM_ASSERT_GL_VERSION_SUPPORTED(GL::Version::GL460); + + GL::Shader vert{GL::Version::GL460, GL::Shader::Type::Vertex}; + GL::Shader frag{GL::Version::GL460, GL::Shader::Type::Fragment}; + + vert.addSource(loader.shader("shaders/tile-shader.vert")); + frag.addSource(loader.shader("shaders/tile-shader.frag")); + +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + CORRADE_INTERNAL_ASSERT_OUTPUT(GL::Shader::compile({vert, frag})); +#ifdef __clang__ +# pragma clang diagnostic pop +#endif + attachShaders({vert, frag}); + + CORRADE_INTERNAL_ASSERT_OUTPUT(link()); + + set_scale({640, 480}); + set_camera_offset({0, 0}); +} + +tile_shader& tile_shader::set_scale(const Vector2& scale) +{ + scale_ = scale; + setUniform(ScaleUniform, scale); + return *this; +} + +tile_shader& tile_shader::set_camera_offset(Vector2 camera_offset) +{ + CORRADE_INTERNAL_ASSERT(std::fabs(camera_offset[0]) <= std::scalbn(1.f, std::numeric_limits::digits)); + CORRADE_INTERNAL_ASSERT(std::fabs(camera_offset[1]) <= std::scalbn(1.f, std::numeric_limits::digits)); + camera_offset_ = camera_offset; + setUniform(OffsetUniform, camera_offset); + return *this; +} + +} // namespace Magnum::Examples diff --git a/shaders/tile-shader.hpp b/shaders/tile-shader.hpp new file mode 100644 index 00000000..a1975daf --- /dev/null +++ b/shaders/tile-shader.hpp @@ -0,0 +1,41 @@ +#pragma once +#include "tile-atlas.hpp" +#include +#include +#include +#include +#include +#include +#include + +struct tile_atlas; + +namespace Magnum::Examples { + +struct tile_shader : GL::AbstractShaderProgram +{ + typedef GL::Attribute<0, Vector3> Position; + typedef GL::Attribute<1, Vector2> TextureCoordinates; + + explicit tile_shader(); + + Vector2 scale() const { return scale_; } + tile_shader& set_scale(const Vector2& scale); + Vector2 camera_offset() const { return camera_offset_; } + tile_shader& set_camera_offset(Vector2 camera_offset); + + static inline Vector2 project(Vector3 pt); + +private: + Vector2 scale_, camera_offset_; + + enum { ScaleUniform = 0, OffsetUniform = 1, }; +}; + +Vector2 tile_shader::project(Vector3 pt) +{ + float x = pt[1], y = pt[0], z = pt[2]; + return { x-y, (x+y+z*2)*.75f }; +} + +} // namespace Magnum::Examples -- cgit v1.2.3