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