#include #include #include #include #include #include namespace mbgl { using namespace style; static_assert(sizeof(FillExtrusionLayoutVertex) == 12, "expected FillExtrusionLayoutVertex size"); std::array lightColor(const EvaluatedLight& light) { const auto color = light.get(); return {{ color.r, color.g, color.b }}; } std::array 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 lightIntensity(const EvaluatedLight& light) { return light.get(); } FillExtrusionProgram::LayoutUniformValues FillExtrusionProgram::layoutUniformValues( 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( lightColor(light) ), uniforms::lightpos::Value( lightPosition(light, state) ), uniforms::lightintensity::Value( lightIntensity(light) ), uniforms::vertical_gradient::Value( verticalGradient ) }; } FillExtrusionPatternProgram::LayoutUniformValues FillExtrusionPatternProgram::layoutUniformValues(mat4 matrix, 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()); int32_t tileSizeAtNearestZoom = util::tileSize * state.zoomScale(state.getIntegerZoom() - tileID.canonical.z); int32_t pixelX = tileSizeAtNearestZoom * (tileID.canonical.x + tileID.wrap * state.zoomScale(tileID.canonical.z)); 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{{ float(pixelX >> 16), float(pixelY >> 16) }} ), uniforms::pixel_coord_lower::Value( std::array{{ float(pixelX & 0xFFFF), float(pixelY & 0xFFFF) }} ), uniforms::height_factor::Value( heightFactor ), uniforms::lightcolor::Value( lightColor(light) ), uniforms::lightpos::Value( lightPosition(light, state) ), uniforms::lightintensity::Value( lightIntensity(light) ), uniforms::vertical_gradient::Value( verticalGradient ) }; } } // namespace mbgl