diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-09-26 12:53:32 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-10-28 17:14:01 -0700 |
commit | 0e57d10d77e555a9229f7d522d83f87df7d5180d (patch) | |
tree | 2a3c3b0dd4ed6edf385ba8d390d919e469b7a96a /src/mbgl/renderer/painter_background.cpp | |
parent | a4c82b8a3b5e48f3bbccf32be80d45ca78d51515 (diff) | |
download | qtlocation-mapboxgl-0e57d10d77e555a9229f7d522d83f87df7d5180d.tar.gz |
[core] Modern C++ bindings for OpenGL
Diffstat (limited to 'src/mbgl/renderer/painter_background.cpp')
-rw-r--r-- | src/mbgl/renderer/painter_background.cpp | 102 |
1 files changed, 40 insertions, 62 deletions
diff --git a/src/mbgl/renderer/painter_background.cpp b/src/mbgl/renderer/painter_background.cpp index 61ec76d1d8..93c0fe982a 100644 --- a/src/mbgl/renderer/painter_background.cpp +++ b/src/mbgl/renderer/painter_background.cpp @@ -1,12 +1,10 @@ #include <mbgl/renderer/painter.hpp> #include <mbgl/renderer/paint_parameters.hpp> -#include <mbgl/gl/gl.hpp> - #include <mbgl/style/layers/background_layer.hpp> #include <mbgl/style/layers/background_layer_impl.hpp> #include <mbgl/shader/shaders.hpp> +#include <mbgl/shader/fill_uniforms.hpp> #include <mbgl/sprite/sprite_atlas.hpp> -#include <mbgl/util/mat4.hpp> #include <mbgl/util/tile_cover.hpp> namespace mbgl { @@ -18,73 +16,53 @@ void Painter::renderBackground(PaintParameters& parameters, const BackgroundLaye // glClear rather than this method. const BackgroundPaintProperties& properties = layer.impl->paint; - bool isPatterned = !properties.backgroundPattern.value.to.empty();// && false; - optional<SpriteAtlasPosition> imagePosA; - optional<SpriteAtlasPosition> imagePosB; - - auto& patternShader = parameters.shaders.fillPattern; - auto& plainShader = parameters.shaders.fill; - auto& arrayBackgroundPattern = parameters.shaders.backgroundPatternArray; - auto& arrayBackground = parameters.shaders.backgroundArray; - - if (isPatterned) { - imagePosA = spriteAtlas->getPosition(properties.backgroundPattern.value.from, - SpritePatternMode::Repeating); - imagePosB = spriteAtlas->getPosition(properties.backgroundPattern.value.to, - SpritePatternMode::Repeating); + if (!properties.backgroundPattern.value.to.empty()) { + optional<SpriteAtlasPosition> imagePosA = spriteAtlas->getPosition( + properties.backgroundPattern.value.from, SpritePatternMode::Repeating); + optional<SpriteAtlasPosition> imagePosB = spriteAtlas->getPosition( + properties.backgroundPattern.value.to, SpritePatternMode::Repeating); if (!imagePosA || !imagePosB) return; - context.program = patternShader.getID(); - patternShader.u_matrix = identityMatrix; - patternShader.u_pattern_tl_a = imagePosA->tl; - patternShader.u_pattern_br_a = imagePosA->br; - patternShader.u_pattern_tl_b = imagePosB->tl; - patternShader.u_pattern_br_b = imagePosB->br; - patternShader.u_mix = properties.backgroundPattern.value.t; - patternShader.u_opacity = properties.backgroundOpacity; - spriteAtlas->bind(true, context, 0); - arrayBackgroundPattern.bind(patternShader, tileTriangleVertexBuffer, BUFFER_OFFSET(0), context); + for (const auto& tileID : util::tileCover(state, state.getIntegerZoom())) { + context.draw({ + depthModeForSublayer(0, gl::DepthMode::ReadOnly), + gl::StencilMode::disabled(), + colorModeForRenderPass(), + parameters.shaders.fillPattern, + FillPatternUniforms::values( + matrixForTile(tileID), + properties.backgroundOpacity.value, + context.viewport.getCurrentValue().size, + *imagePosA, + *imagePosB, + properties.backgroundPattern.value, + tileID, + state + ), + gl::Unindexed<gl::TriangleStrip>(tileTriangleVertexBuffer) + }); + } } else { - context.program = plainShader.getID(); - plainShader.u_color = properties.backgroundColor; - plainShader.u_opacity = properties.backgroundOpacity; - - arrayBackground.bind(plainShader, tileTriangleVertexBuffer, BUFFER_OFFSET(0), context); - } - - context.stencilTest = false; - context.depthFunc = gl::DepthTestFunction::LessEqual; - context.depthTest = true; - context.depthMask = false; - setDepthSublayer(0); - - for (const auto& tileID : util::tileCover(state, state.getIntegerZoom())) { - mat4 vertexMatrix; - state.matrixFor(vertexMatrix, tileID); - matrix::multiply(vertexMatrix, projMatrix, vertexMatrix); - - if (isPatterned) { - patternShader.u_matrix = vertexMatrix; - patternShader.u_pattern_size_a = imagePosA->size; - patternShader.u_pattern_size_b = imagePosB->size; - patternShader.u_scale_a = properties.backgroundPattern.value.fromScale; - patternShader.u_scale_b = properties.backgroundPattern.value.toScale; - patternShader.u_tile_units_to_pixels = 1.0f / tileID.pixelsToTileUnits(1.0f, state.getIntegerZoom()); - - GLint tileSizeAtNearestZoom = util::tileSize * state.zoomScale(state.getIntegerZoom() - tileID.canonical.z); - GLint pixelX = tileSizeAtNearestZoom * (tileID.canonical.x + tileID.wrap * state.zoomScale(tileID.canonical.z)); - GLint pixelY = tileSizeAtNearestZoom * tileID.canonical.y; - patternShader.u_pixel_coord_upper = {{ float(pixelX >> 16), float(pixelY >> 16) }}; - patternShader.u_pixel_coord_lower = {{ float(pixelX & 0xFFFF), float(pixelY & 0xFFFF) }}; - } else { - plainShader.u_matrix = vertexMatrix; + for (const auto& tileID : util::tileCover(state, state.getIntegerZoom())) { + context.draw({ + depthModeForSublayer(0, gl::DepthMode::ReadOnly), + gl::StencilMode::disabled(), + colorModeForRenderPass(), + parameters.shaders.fill, + FillColorUniforms::values( + matrixForTile(tileID), + properties.backgroundOpacity.value, + properties.backgroundColor.value, + properties.backgroundColor.value, + context.viewport.getCurrentValue().size + ), + gl::Unindexed<gl::TriangleStrip>(tileTriangleVertexBuffer) + }); } - - MBGL_CHECK_ERROR(glDrawArrays(GL_TRIANGLE_STRIP, 0, static_cast<GLsizei>(tileTriangleVertexBuffer.vertexCount))); } } |