diff options
Diffstat (limited to 'src/mbgl/renderer/painter_terrain.cpp')
-rw-r--r-- | src/mbgl/renderer/painter_terrain.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/mbgl/renderer/painter_terrain.cpp b/src/mbgl/renderer/painter_terrain.cpp new file mode 100644 index 000000000..c59182c2e --- /dev/null +++ b/src/mbgl/renderer/painter_terrain.cpp @@ -0,0 +1,84 @@ +#include <mbgl/renderer/painter.hpp> +#include <mbgl/renderer/paint_parameters.hpp> +#include <mbgl/renderer/render_tile.hpp> +#include <mbgl/gl/gl.hpp> +#include <mbgl/renderer/terrain_bucket.hpp> +#include <mbgl/style/layers/terrain_layer.hpp> +#include <mbgl/style/layers/terrain_layer_impl.hpp> +#include <mbgl/shader/shaders.hpp> +#include <mbgl/util/offscreen_texture.hpp> + +namespace mbgl { + +using namespace style; + +void Painter::renderTerrain(PaintParameters& parameters, + TerrainBucket& bucket, + const TerrainLayer& layer, + const RenderTile& tile) { + if (pass != RenderPass::Translucent) return; + + if (!bucket.prepared) { + OffscreenTexture view(context, { 256, 256 }); + view.bind(); + + context.bindTexture(*bucket.dem, 0, gl::TextureFilter::Linear, gl::TextureMipMap::Yes); + + mat4 mat; + matrix::ortho(mat, 0, util::EXTENT, -util::EXTENT, 0, 0, 1); + matrix::translate(mat, mat, 0, -util::EXTENT, 0); + + context.clear(Color::red(), {}, {}); + context.draw({ + gl::DepthMode::disabled(), + gl::StencilMode::disabled(), + gl::ColorMode::unblended(), + parameters.shaders.terrainPrepare, + TerrainPrepareUniforms::Values { + mat, + 0, + { {{ 512, 512 }} }, + tile.id.canonical.z + }, + gl::Unindexed<gl::TriangleStrip>(rasterVertexBuffer) + }); + + bucket.texture = std::move(view.getTexture()); + bucket.prepared = true; + + parameters.view.bind(); + } + + const TerrainPaintProperties& properties = layer.impl->paint; + + double azimuth = (-properties.terrainIlluminationDirection - 90) * util::DEG2RAD; + if (properties.terrainIlluminationAlignment == style::AlignmentType::Viewport) { + azimuth -= state.getAngle(); + } + + context.bindTexture(*bucket.texture, 0, gl::TextureFilter::Linear); + + context.draw({ + depthModeForSublayer(0, gl::DepthMode::ReadOnly), + stencilModeForClipping(tile.clip), + colorModeForRenderPass(), + parameters.shaders.terrain, + TerrainUniforms::Values { + tile.matrix, + 0, // image + 8, // mode + { {{ 256, 256 }} }, + tile.id.canonical.z, + azimuth, + 60 * util::DEG2RAD, // zenith + 0, // mipmap + properties.terrainExaggeration.value, + properties.terrainShadowColor.value, + properties.terrainHighlightColor.value, + properties.terrainAccentColor.value + }, + gl::Unindexed<gl::TriangleStrip>(rasterVertexBuffer) + }); +} + +} // namespace mbgl |