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/circle.hpp>
7 #include <mbgl/util/geometry.hpp>
8 #include <mbgl/style/layers/circle_layer_properties.hpp>
9 
10 namespace mbgl {
11 
12 namespace uniforms {
13 MBGL_DEFINE_UNIFORM_SCALAR(bool, u_scale_with_map);
14 } // namespace uniforms
15 
16 class CircleProgram : public Program<
17     shaders::circle,
18     gl::Triangle,
19     gl::Attributes<
20         attributes::a_pos>,
21     gl::Uniforms<
22         uniforms::u_matrix,
23         uniforms::u_scale_with_map,
24         uniforms::u_extrude_scale,
25         uniforms::u_camera_to_center_distance,
26         uniforms::u_pitch_with_map>,
27     style::CirclePaintProperties>
28 {
29 public:
30     using Program::Program;
31 
32     /*
33      * @param {number} x vertex position
34      * @param {number} y vertex position
35      * @param {number} ex extrude normal
36      * @param {number} ey extrude normal
37      */
vertex(Point<int16_t> p,float ex,float ey)38     static LayoutVertex vertex(Point<int16_t> p, float ex, float ey) {
39         return LayoutVertex {
40             {{
41                 static_cast<int16_t>((p.x * 2) + ((ex + 1) / 2)),
42                 static_cast<int16_t>((p.y * 2) + ((ey + 1) / 2))
43             }}
44         };
45     }
46 };
47 
48 using CircleLayoutVertex = CircleProgram::LayoutVertex;
49 using CircleAttributes = CircleProgram::Attributes;
50 
51 } // namespace mbgl
52