#pragma once #include "tile-defs.hpp" #include #include #include #include #include #include #include "Magnum/GL/RectangleTexture.h" namespace Magnum::Examples { struct tile_shader; namespace wireframe { template concept traits = requires (const T& x) { {T::num_vertices} -> std::convertible_to; {x.primitive} -> std::convertible_to; {x.make_vertex_array() } -> std::convertible_to>; {x.on_draw()} -> std::same_as; }; struct mesh_base { static GL::RectangleTexture make_constant_texture(); GL::Buffer _vertex_buffer, _texcoords_buffer; GL::RectangleTexture _texture = make_constant_texture(); GL::Mesh _mesh; mesh_base(GL::MeshPrimitive primitive, std::size_t num_vertices); void draw(tile_shader& shader); }; } // namespace wireframe template struct wireframe_mesh final : private wireframe::mesh_base { wireframe_mesh(); void draw(tile_shader& shader, T traits); }; template wireframe_mesh::wireframe_mesh() : wireframe::mesh_base{T::primitive, T::num_vertices} {} template void wireframe_mesh::draw(tile_shader& shader, T x) { _vertex_buffer.setData(x.make_vertex_array(), GL::BufferUsage::DynamicDraw); mesh_base::draw(shader); } } // namespace Magnum::Examples