#include #include #include #include #include #include namespace mbgl { using namespace style; static_assert(sizeof(FillExtrusionLayoutVertex) == 12, "expected FillExtrusionLayoutVertex size"); std::array FillExtrusionProgram::lightColor(const EvaluatedLight& light) { const auto color = light.get(); return {{color.r, color.g, color.b}}; } std::array FillExtrusionProgram::lightPosition(const EvaluatedLight& light, const TransformState& state) { auto lightPos = light.get().getCartesian(); mat3 lightMat; matrix::identity(lightMat); if (light.get() == LightAnchorType::Viewport) { matrix::rotate(lightMat, lightMat, -state.getBearing()); } matrix::transformMat3f(lightPos, lightPos, lightMat); return lightPos; } float FillExtrusionProgram::lightIntensity(const EvaluatedLight& light) { return light.get(); } FillExtrusionProgram::LayoutUniformValues FillExtrusionProgram::layoutUniformValues(const mat4& matrix, const TransformState& state, const float opacity, const EvaluatedLight& light, const float verticalGradient) { return {uniforms::matrix::Value(matrix), uniforms::opacity::Value(opacity), uniforms::lightcolor::Value(FillExtrusionProgram::lightColor(light)), uniforms::lightpos::Value(FillExtrusionProgram::lightPosition(light, state)), uniforms::lightintensity::Value(FillExtrusionProgram::lightIntensity(light)), uniforms::vertical_gradient::Value(verticalGradient)}; } FillExtrusionPatternProgram::LayoutUniformValues FillExtrusionPatternProgram::layoutUniformValues( const mat4& matrix, const Size atlasSize, const CrossfadeParameters& crossfade, const UnwrappedTileID& tileID, const TransformState& state, const float opacity, const float heightFactor, const float pixelRatio, const EvaluatedLight& light, const float verticalGradient) { const auto tileRatio = 1 / tileID.pixelsToTileUnits(1, state.getIntegerZoom()); const int32_t tileSizeAtNearestZoom = static_cast( util::tileSize_D * state.zoomScale(state.getIntegerZoom() - tileID.canonical.z)); const int32_t pixelX = static_cast( tileSizeAtNearestZoom * (tileID.canonical.x + tileID.wrap * state.zoomScale(tileID.canonical.z))); const int32_t pixelY = tileSizeAtNearestZoom * tileID.canonical.y; return {uniforms::matrix::Value(matrix), uniforms::opacity::Value(opacity), uniforms::scale::Value({{pixelRatio, tileRatio, crossfade.fromScale, crossfade.toScale}}), uniforms::texsize::Value(atlasSize), uniforms::fade::Value(crossfade.t), uniforms::pixel_coord_upper::Value( std::array{{static_cast(pixelX >> 16), static_cast(pixelY >> 16)}}), uniforms::pixel_coord_lower::Value( std::array{{static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}}), uniforms::height_factor::Value(heightFactor), uniforms::lightcolor::Value(FillExtrusionProgram::lightColor(light)), uniforms::lightpos::Value(FillExtrusionProgram::lightPosition(light, state)), uniforms::lightintensity::Value(FillExtrusionProgram::lightIntensity(light)), uniforms::vertical_gradient::Value(verticalGradient)}; } } // namespace mbgl