#include #include #include #include #include #include #include namespace mbgl { using namespace style; static_assert(sizeof(LineLayoutVertex) == 8, "expected LineLayoutVertex size"); template Values makeValues(const style::LinePaintProperties::PossiblyEvaluated& properties, const RenderTile& tile, const TransformState& state, const std::array& pixelsToGLUnits, const float pixelRatio, Args&&... args) { return Values{uniforms::matrix::Value(tile.translatedMatrix( properties.get(), properties.get(), state)), uniforms::ratio::Value(1.0f / tile.id.pixelsToTileUnits(1.0f, static_cast(state.getZoom()))), uniforms::units_to_pixels::Value({{1.0f / pixelsToGLUnits[0], 1.0f / pixelsToGLUnits[1]}}), uniforms::device_pixel_ratio::Value(pixelRatio), std::forward(args)...}; } LineProgram::LayoutUniformValues LineProgram::layoutUniformValues( const style::LinePaintProperties::PossiblyEvaluated& properties, const RenderTile& tile, const TransformState& state, const std::array& pixelsToGLUnits, const float pixelRatio) { return makeValues(properties, tile, state, pixelsToGLUnits, pixelRatio); } LineSDFProgram::LayoutUniformValues LineSDFProgram::layoutUniformValues( const style::LinePaintProperties::PossiblyEvaluated& properties, float pixelRatio, const RenderTile& tile, const TransformState& state, const std::array& pixelsToGLUnits, const LinePatternPos& posA, const LinePatternPos& posB, const CrossfadeParameters& crossfade, float atlasWidth) { const float widthA = posA.width * crossfade.fromScale; const float widthB = posB.width * crossfade.toScale; std::array scaleA{ {1.0f / tile.id.pixelsToTileUnits(widthA, state.getIntegerZoom()), -posA.height / 2.0f}}; std::array scaleB{ {1.0f / tile.id.pixelsToTileUnits(widthB, state.getIntegerZoom()), -posB.height / 2.0f}}; return makeValues( properties, tile, state, pixelsToGLUnits, pixelRatio, uniforms::patternscale_a::Value(scaleA), uniforms::patternscale_b::Value(scaleB), uniforms::tex_y_a::Value(posA.y), uniforms::tex_y_b::Value(posB.y), uniforms::mix::Value(crossfade.t), uniforms::sdfgamma::Value(atlasWidth / (std::min(widthA, widthB) * 256.0f * pixelRatio) / 2.0f)); } LinePatternProgram::LayoutUniformValues LinePatternProgram::layoutUniformValues( const style::LinePaintProperties::PossiblyEvaluated& properties, const RenderTile& tile, const TransformState& state, const std::array& pixelsToGLUnits, const float pixelRatio, const Size atlasSize, const CrossfadeParameters& crossfade) { const auto tileRatio = 1 / tile.id.pixelsToTileUnits(1, state.getIntegerZoom()); return makeValues( properties, tile, state, pixelsToGLUnits, pixelRatio, uniforms::scale::Value({{pixelRatio, tileRatio, crossfade.fromScale, crossfade.toScale}}), uniforms::texsize::Value(atlasSize), uniforms::fade::Value(crossfade.t)); } LineGradientProgram::LayoutUniformValues LineGradientProgram::layoutUniformValues( const style::LinePaintProperties::PossiblyEvaluated& properties, const RenderTile& tile, const TransformState& state, const std::array& pixelsToGLUnits, const float pixelRatio) { return makeValues(properties, tile, state, pixelsToGLUnits, pixelRatio); } } // namespace mbgl