1 #pragma once 2 3 #include <mbgl/programs/program.hpp> 4 #include <mbgl/programs/attributes.hpp> 5 #include <mbgl/programs/uniforms.hpp> 6 #include <mbgl/shaders/fill_extrusion.hpp> 7 #include <mbgl/shaders/fill_extrusion_pattern.hpp> 8 #include <mbgl/util/geometry.hpp> 9 #include <mbgl/util/mat4.hpp> 10 #include <mbgl/util/size.hpp> 11 #include <mbgl/style/layers/fill_extrusion_layer_properties.hpp> 12 #include <mbgl/style/style.hpp> 13 #include <mbgl/renderer/render_light.hpp> 14 15 #include <string> 16 17 namespace mbgl { 18 19 class ImagePosition; 20 class UnwrappedTileID; 21 class TransformState; 22 template <class> class Faded; 23 24 namespace uniforms { 25 MBGL_DEFINE_UNIFORM_VECTOR(float, 3, u_lightpos); 26 MBGL_DEFINE_UNIFORM_VECTOR(float, 3, u_lightcolor); 27 MBGL_DEFINE_UNIFORM_SCALAR(float, u_lightintensity); 28 MBGL_DEFINE_UNIFORM_SCALAR(float, u_height_factor); 29 } // namespace uniforms 30 31 struct FillExtrusionLayoutAttributes : gl::Attributes< 32 attributes::a_pos, 33 attributes::a_normal_ed> 34 {}; 35 36 struct FillExtrusionUniforms : gl::Uniforms< 37 uniforms::u_matrix, 38 uniforms::u_lightcolor, 39 uniforms::u_lightpos, 40 uniforms::u_lightintensity> 41 { 42 static Values values(mat4, 43 const TransformState&, 44 const EvaluatedLight&); 45 }; 46 47 struct FillExtrusionPatternUniforms : gl::Uniforms< 48 uniforms::u_matrix, 49 uniforms::u_pattern_tl_a, 50 uniforms::u_pattern_br_a, 51 uniforms::u_pattern_tl_b, 52 uniforms::u_pattern_br_b, 53 uniforms::u_pattern_size_a, 54 uniforms::u_pattern_size_b, 55 uniforms::u_scale_a, 56 uniforms::u_scale_b, 57 uniforms::u_texsize, 58 uniforms::u_mix, 59 uniforms::u_image, 60 uniforms::u_pixel_coord_upper, 61 uniforms::u_pixel_coord_lower, 62 uniforms::u_tile_units_to_pixels, 63 uniforms::u_height_factor, 64 uniforms::u_lightcolor, 65 uniforms::u_lightpos, 66 uniforms::u_lightintensity> 67 { 68 static Values values(mat4, 69 Size atlasSize, 70 const ImagePosition&, 71 const ImagePosition&, 72 const Faded<std::string>&, 73 const UnwrappedTileID&, 74 const TransformState&, 75 const float, 76 const EvaluatedLight&); 77 }; 78 79 class FillExtrusionProgram : public Program< 80 shaders::fill_extrusion, 81 gl::Triangle, 82 FillExtrusionLayoutAttributes, 83 FillExtrusionUniforms, 84 style::FillExtrusionPaintProperties> 85 { 86 public: 87 using Program::Program; 88 layoutVertex(Point<int16_t> p,double nx,double ny,double nz,unsigned short t,uint16_t e)89 static LayoutVertex layoutVertex(Point<int16_t> p, double nx, double ny, double nz, unsigned short t, uint16_t e) { 90 const auto factor = pow(2, 13); 91 92 return LayoutVertex { 93 {{ 94 p.x, 95 p.y 96 }}, 97 {{ 98 // Multiply normal vector components by 2^14 to pack them into integers 99 // We pack a bool (`t`) into the x component indicating whether it is an upper or lower vertex 100 static_cast<int16_t>(floor(nx * factor) * 2 + t), 101 static_cast<int16_t>(ny * factor * 2), 102 static_cast<int16_t>(nz * factor * 2), 103 // The edgedistance attribute is used for wrapping fill_extrusion patterns 104 static_cast<int16_t>(e) 105 }} 106 }; 107 } 108 }; 109 110 class FillExtrusionPatternProgram : public Program< 111 shaders::fill_extrusion_pattern, 112 gl::Triangle, 113 FillExtrusionLayoutAttributes, 114 FillExtrusionPatternUniforms, 115 style::FillExtrusionPaintProperties> 116 { 117 public: 118 using Program::Program; 119 }; 120 121 using FillExtrusionLayoutVertex = FillExtrusionProgram::LayoutVertex; 122 using FillExtrusionAttributes = FillExtrusionProgram::Attributes; 123 124 } // namespace mbgl 125