1 #include <mbgl/renderer/render_tile.hpp>
2 #include <mbgl/renderer/paint_parameters.hpp>
3 #include <mbgl/renderer/buckets/debug_bucket.hpp>
4 #include <mbgl/renderer/render_static_data.hpp>
5 #include <mbgl/programs/programs.hpp>
6 #include <mbgl/map/transform_state.hpp>
7 #include <mbgl/tile/tile.hpp>
8 #include <mbgl/util/math.hpp>
9 
10 namespace mbgl {
11 
12 using namespace style;
13 
translateVtxMatrix(const mat4 & tileMatrix,const std::array<float,2> & translation,TranslateAnchorType anchor,const TransformState & state,const bool inViewportPixelUnits) const14 mat4 RenderTile::translateVtxMatrix(const mat4& tileMatrix,
15                                     const std::array<float, 2>& translation,
16                                     TranslateAnchorType anchor,
17                                     const TransformState& state,
18                                     const bool inViewportPixelUnits) const {
19     if (translation[0] == 0 && translation[1] == 0) {
20         return tileMatrix;
21     }
22 
23     mat4 vtxMatrix;
24 
25     const float angle = inViewportPixelUnits ?
26         (anchor == TranslateAnchorType::Map ? state.getAngle() : 0) :
27         (anchor == TranslateAnchorType::Viewport ? -state.getAngle() : 0);
28 
29     Point<float> translate = util::rotate(Point<float>{ translation[0], translation[1] }, angle);
30 
31     if (inViewportPixelUnits) {
32         matrix::translate(vtxMatrix, tileMatrix, translate.x, translate.y, 0);
33     } else {
34         matrix::translate(vtxMatrix, tileMatrix,
35                           id.pixelsToTileUnits(translate.x, state.getZoom()),
36                           id.pixelsToTileUnits(translate.y, state.getZoom()),
37                           0);
38     }
39 
40     return vtxMatrix;
41 }
42 
translatedMatrix(const std::array<float,2> & translation,TranslateAnchorType anchor,const TransformState & state) const43 mat4 RenderTile::translatedMatrix(const std::array<float, 2>& translation,
44                                   TranslateAnchorType anchor,
45                                   const TransformState& state) const {
46     return translateVtxMatrix(matrix, translation, anchor, state, false);
47 }
48 
translatedClipMatrix(const std::array<float,2> & translation,TranslateAnchorType anchor,const TransformState & state) const49 mat4 RenderTile::translatedClipMatrix(const std::array<float, 2>& translation,
50                                       TranslateAnchorType anchor,
51                                       const TransformState& state) const {
52     return translateVtxMatrix(nearClippedMatrix, translation, anchor, state, false);
53 }
54 
setMask(TileMask && mask)55 void RenderTile::setMask(TileMask&& mask) {
56     tile.setMask(std::move(mask));
57 }
58 
startRender(PaintParameters & parameters)59 void RenderTile::startRender(PaintParameters& parameters) {
60     tile.upload(parameters.context);
61 
62     // Calculate two matrices for this tile: matrix is the standard tile matrix; nearClippedMatrix
63     // clips the near plane to 100 to save depth buffer precision
64     parameters.state.matrixFor(matrix, id);
65     parameters.state.matrixFor(nearClippedMatrix, id);
66     matrix::multiply(matrix, parameters.projMatrix, matrix);
67     matrix::multiply(nearClippedMatrix, parameters.nearClippedProjMatrix, nearClippedMatrix);
68 }
69 
finishRender(PaintParameters & parameters)70 void RenderTile::finishRender(PaintParameters& parameters) {
71     if (!used || parameters.debugOptions == MapDebugOptions::NoDebug)
72         return;
73 
74     static const style::Properties<>::PossiblyEvaluated properties {};
75     static const DebugProgram::PaintPropertyBinders paintAttributeData(properties, 0);
76 
77     auto& program = parameters.programs.debug;
78 
79     if (parameters.debugOptions & (MapDebugOptions::Timestamps | MapDebugOptions::ParseStatus)) {
80         if (!tile.debugBucket || tile.debugBucket->renderable != tile.isRenderable() ||
81             tile.debugBucket->complete != tile.isComplete() ||
82             !(tile.debugBucket->modified == tile.modified) ||
83             !(tile.debugBucket->expires == tile.expires) ||
84             tile.debugBucket->debugMode != parameters.debugOptions) {
85             tile.debugBucket = std::make_unique<DebugBucket>(
86                 tile.id, tile.isRenderable(), tile.isComplete(), tile.modified,
87                 tile.expires, parameters.debugOptions, parameters.context);
88         }
89 
90         const auto allAttributeBindings = program.computeAllAttributeBindings(
91             *tile.debugBucket->vertexBuffer,
92             paintAttributeData,
93             properties
94         );
95 
96         program.draw(
97             parameters.context,
98             gl::Lines { 4.0f * parameters.pixelRatio },
99             gl::DepthMode::disabled(),
100             parameters.stencilModeForClipping(clip),
101             gl::ColorMode::unblended(),
102             *tile.debugBucket->indexBuffer,
103             tile.debugBucket->segments,
104             program.computeAllUniformValues(
105                 DebugProgram::UniformValues {
106                     uniforms::u_matrix::Value{ matrix },
107                     uniforms::u_color::Value{ Color::white() }
108                 },
109                 paintAttributeData,
110                 properties,
111                 parameters.state.getZoom()
112             ),
113             allAttributeBindings,
114             "debug"
115         );
116 
117         program.draw(
118             parameters.context,
119             gl::Lines { 2.0f * parameters.pixelRatio },
120             gl::DepthMode::disabled(),
121             parameters.stencilModeForClipping(clip),
122             gl::ColorMode::unblended(),
123             *tile.debugBucket->indexBuffer,
124             tile.debugBucket->segments,
125             program.computeAllUniformValues(
126                 DebugProgram::UniformValues {
127                     uniforms::u_matrix::Value{ matrix },
128                     uniforms::u_color::Value{ Color::black() }
129                 },
130                 paintAttributeData,
131                 properties,
132                 parameters.state.getZoom()
133             ),
134             allAttributeBindings,
135             "debug"
136         );
137     }
138 
139     if (parameters.debugOptions & MapDebugOptions::TileBorders) {
140         parameters.programs.debug.draw(
141             parameters.context,
142             gl::LineStrip { 4.0f * parameters.pixelRatio },
143             gl::DepthMode::disabled(),
144             parameters.stencilModeForClipping(clip),
145             gl::ColorMode::unblended(),
146             parameters.staticData.tileBorderIndexBuffer,
147             parameters.staticData.tileBorderSegments,
148             program.computeAllUniformValues(
149                 DebugProgram::UniformValues {
150                     uniforms::u_matrix::Value{ matrix },
151                     uniforms::u_color::Value{ Color::red() }
152                 },
153                 paintAttributeData,
154                 properties,
155                 parameters.state.getZoom()
156             ),
157             program.computeAllAttributeBindings(
158                 parameters.staticData.tileVertexBuffer,
159                 paintAttributeData,
160                 properties
161             ),
162             "debug"
163         );
164     }
165 }
166 
167 } // namespace mbgl
168