#include "shaders/tile.hpp" #include "loader/loader.hpp" #include "compat/assert.hpp" #include "local-coords.hpp" #include #include #include #include #include #include namespace floormat { tile_shader::tile_shader() { constexpr auto min_version = GL::Version::GL330; const auto version = GL::Context::current().version(); if (version < min_version) fm_abort("floormat requires OpenGL version %d, only %d is supported", (int)min_version, (int)version); GL::Shader vert{version, GL::Shader::Type::Vertex}; GL::Shader frag{version, GL::Shader::Type::Fragment}; vert.addSource(loader.shader("shaders/tile.vert")); frag.addSource(loader.shader("shaders/tile.frag")); CORRADE_INTERNAL_ASSERT_OUTPUT(vert.compile()); CORRADE_INTERNAL_ASSERT_OUTPUT(frag.compile()); attachShaders({vert, frag}); CORRADE_INTERNAL_ASSERT_OUTPUT(link()); set_scale({640, 480}); set_tint({1, 1, 1, 1}); setUniform(OffsetUniform, Vector3{}); } tile_shader::~tile_shader() = default; tile_shader& tile_shader::set_scale(const Vector2& scale) { if (scale != _scale) setUniform(ScaleUniform, 2.f/(_scale = scale)); return *this; } tile_shader& tile_shader::set_camera_offset(const Vector2d& camera_offset, float depth_offset) { _camera_offset = camera_offset; _depth_offset = depth_offset; return *this; } tile_shader& tile_shader::set_tint(const Vector4& tint) { _tint = tint; return *this; } void tile_shader::_draw() { fm_assert(std::fabs(_camera_offset[0]) < 1 << 24 && std::fabs(_camera_offset[1]) < 1 << 24); fm_assert(std::fabs(_depth_offset) < 1 << 24); if (_tint != _real_tint) setUniform(TintUniform, _real_tint = _tint); if (const auto offset = Vector3((float)_camera_offset[0], (float)_camera_offset[1], _depth_offset); offset != _real_camera_offset) { _real_camera_offset = offset; setUniform(OffsetUniform, offset); } } float tile_shader::depth_value(const local_coords& xy, float offset) noexcept { return (xy.to_index() + offset)*depth_tile_size; } } // namespace floormat