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