#pragma once #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { namespace style { class SymbolPropertyValues; } // namespace style class RenderTile; class TransformState; namespace uniforms { MBGL_DEFINE_UNIFORM_VECTOR(float, 2, u_texsize); MBGL_DEFINE_UNIFORM_SCALAR(bool, u_rotate_with_map); MBGL_DEFINE_UNIFORM_SCALAR(bool, u_pitch_with_map); MBGL_DEFINE_UNIFORM_SCALAR(gl::TextureUnit, u_texture); MBGL_DEFINE_UNIFORM_SCALAR(gl::TextureUnit, u_fadetexture); MBGL_DEFINE_UNIFORM_SCALAR(float, u_aspect_ratio); MBGL_DEFINE_UNIFORM_SCALAR(bool, u_is_halo); MBGL_DEFINE_UNIFORM_SCALAR(float, u_font_scale); MBGL_DEFINE_UNIFORM_SCALAR(float, u_gamma_scale); } // namespace uniforms struct SymbolLayoutAttributes : gl::Attributes< attributes::a_pos_offset, attributes::a_texture_pos, attributes::a_data<4>> { static Vertex vertex(Point a, Point o, uint16_t tx, uint16_t ty, float minzoom, float maxzoom, float labelminzoom, uint8_t labelangle) { return Vertex { // combining pos and offset to reduce number of vertex attributes passed to shader (8 max for some devices) {{ static_cast(a.x), static_cast(a.y), static_cast(::round(o.x * 64)), // use 1/64 pixels for placement static_cast(::round(o.y * 64)) }}, {{ static_cast(tx / 4), static_cast(ty / 4) }}, {{ static_cast(labelminzoom * 10), // 1/10 zoom levels: z16 == 160 static_cast(labelangle), static_cast(minzoom * 10), static_cast(::fmin(maxzoom, 25) * 10) }} }; } }; class SymbolIconProgram : public Program< shaders::symbol_icon, gl::Triangle, SymbolLayoutAttributes, gl::Uniforms< uniforms::u_matrix, uniforms::u_extrude_scale, uniforms::u_texsize, uniforms::u_zoom, uniforms::u_rotate_with_map, uniforms::u_texture, uniforms::u_fadetexture>, style::IconPaintProperties> { public: using Program::Program; static UniformValues uniformValues(const style::SymbolPropertyValues&, const Size& texsize, const std::array& pixelsToGLUnits, const RenderTile&, const TransformState&); }; enum class SymbolSDFPart { Fill = 1, Halo = 0 }; template class SymbolSDFProgram : public Program< shaders::symbol_sdf, gl::Triangle, SymbolLayoutAttributes, gl::Uniforms< uniforms::u_matrix, uniforms::u_extrude_scale, uniforms::u_texsize, uniforms::u_zoom, uniforms::u_rotate_with_map, uniforms::u_texture, uniforms::u_fadetexture, uniforms::u_font_scale, uniforms::u_gamma_scale, uniforms::u_pitch, uniforms::u_bearing, uniforms::u_aspect_ratio, uniforms::u_pitch_with_map, uniforms::u_is_halo>, PaintProperties> { public: using BaseProgram = Program, PaintProperties>; using UniformValues = typename BaseProgram::UniformValues; using BaseProgram::BaseProgram; static UniformValues uniformValues(const style::SymbolPropertyValues&, const Size& texsize, const std::array& pixelsToGLUnits, const RenderTile&, const TransformState&, const SymbolSDFPart); }; using SymbolSDFIconProgram = SymbolSDFProgram; using SymbolSDFTextProgram = SymbolSDFProgram; using SymbolLayoutVertex = SymbolLayoutAttributes::Vertex; using SymbolIconAttributes = SymbolIconProgram::Attributes; using SymbolTextAttributes = SymbolSDFTextProgram::Attributes; } // namespace mbgl