Spaces:
Sleeping
Sleeping
| // @flow | |
| import StencilMode from '../gl/stencil_mode'; | |
| import DepthMode from '../gl/depth_mode'; | |
| import CullFaceMode from '../gl/cull_face_mode'; | |
| import { | |
| backgroundUniformValues, | |
| backgroundPatternUniformValues | |
| } from './program/background_program'; | |
| import type Painter from './painter'; | |
| import type SourceCache from '../source/source_cache'; | |
| import type BackgroundStyleLayer from '../style/style_layer/background_style_layer'; | |
| export default drawBackground; | |
| function drawBackground(painter: Painter, sourceCache: SourceCache, layer: BackgroundStyleLayer) { | |
| const color = layer.paint.get('background-color'); | |
| const opacity = layer.paint.get('background-opacity'); | |
| if (opacity === 0) return; | |
| const context = painter.context; | |
| const gl = context.gl; | |
| const transform = painter.transform; | |
| const tileSize = transform.tileSize; | |
| const image = layer.paint.get('background-pattern'); | |
| if (painter.isPatternMissing(image)) return; | |
| const pass = (!image && color.a === 1 && opacity === 1 && painter.opaquePassEnabledForLayer()) ? 'opaque' : 'translucent'; | |
| if (painter.renderPass !== pass) return; | |
| const stencilMode = StencilMode.disabled; | |
| const depthMode = painter.depthModeForSublayer(0, pass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly); | |
| const colorMode = painter.colorModeForRenderPass(); | |
| const program = painter.useProgram(image ? 'backgroundPattern' : 'background'); | |
| const tileIDs = transform.coveringTiles({tileSize}); | |
| if (image) { | |
| context.activeTexture.set(gl.TEXTURE0); | |
| painter.imageManager.bind(painter.context); | |
| } | |
| const crossfade = layer.getCrossfadeParameters(); | |
| for (const tileID of tileIDs) { | |
| const matrix = painter.transform.calculatePosMatrix(tileID.toUnwrapped()); | |
| const uniformValues = image ? | |
| backgroundPatternUniformValues(matrix, opacity, painter, image, {tileID, tileSize}, crossfade) : | |
| backgroundUniformValues(matrix, opacity, color); | |
| program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, | |
| uniformValues, layer.id, painter.tileExtentBuffer, | |
| painter.quadTriangleIndexBuffer, painter.tileExtentSegments); | |
| } | |
| } | |