From f6e79d70735361438655f279c8699a786d25458c Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Thu, 27 Apr 2017 15:56:55 -0700 Subject: [core] Render fill-extrusion layers (#8431) --- src/mbgl/programs/fill_extrusion_program.cpp | 81 ++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/mbgl/programs/fill_extrusion_program.cpp (limited to 'src/mbgl/programs/fill_extrusion_program.cpp') diff --git a/src/mbgl/programs/fill_extrusion_program.cpp b/src/mbgl/programs/fill_extrusion_program.cpp new file mode 100644 index 0000000000..67426c8d9d --- /dev/null +++ b/src/mbgl/programs/fill_extrusion_program.cpp @@ -0,0 +1,81 @@ +#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.getAngle()); + } + matrix::transformMat3f(lightPos, lightPos, lightMat); + return lightPos; +} + +float lightIntensity(const EvaluatedLight& light) { + return light.get(); +} + +FillExtrusionUniforms::Values +FillExtrusionUniforms::values(mat4 matrix, + const TransformState& state, + const EvaluatedLight& light) { + return FillExtrusionUniforms::Values{ + uniforms::u_matrix::Value{ matrix }, + uniforms::u_lightcolor::Value{ lightColor(light) }, + uniforms::u_lightpos::Value{ lightPosition(light, state) }, + uniforms::u_lightintensity::Value{ lightIntensity(light) } + }; +} + +FillExtrusionPatternUniforms::Values +FillExtrusionPatternUniforms::values(mat4 matrix, + const SpriteAtlasElement& a, + const SpriteAtlasElement& b, + const Faded& fading, + const UnwrappedTileID& tileID, + const TransformState& state, + const float heightFactor, + const EvaluatedLight& light) { + 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 FillExtrusionPatternUniforms::Values{ + uniforms::u_matrix::Value{ matrix }, + uniforms::u_pattern_tl_a::Value{ a.tl }, + uniforms::u_pattern_br_a::Value{ a.br }, + uniforms::u_pattern_tl_b::Value{ b.tl }, + uniforms::u_pattern_br_b::Value{ b.br }, + uniforms::u_pattern_size_a::Value{ a.size }, + uniforms::u_pattern_size_b::Value{ b.size }, + uniforms::u_scale_a::Value{ fading.fromScale }, + uniforms::u_scale_b::Value{ fading.toScale }, + uniforms::u_mix::Value{ fading.t }, + uniforms::u_image::Value{ 0 }, + uniforms::u_pixel_coord_upper::Value{ std::array{{ float(pixelX >> 16), float(pixelY >> 16) }} }, + uniforms::u_pixel_coord_lower::Value{ std::array{{ float(pixelX & 0xFFFF), float(pixelY & 0xFFFF) }} }, + uniforms::u_tile_units_to_pixels::Value{ 1.0f / tileID.pixelsToTileUnits(1.0f, state.getIntegerZoom()) }, + uniforms::u_height_factor::Value{ heightFactor }, + uniforms::u_lightcolor::Value{ lightColor(light) }, + uniforms::u_lightpos::Value{ lightPosition(light, state) }, + uniforms::u_lightintensity::Value{ lightIntensity(light) }, + }; +} + +} // namespace mbgl -- cgit v1.2.1