#include #include #include #include #include #include #include #include #include #include namespace mbgl { using namespace style; struct alignas(16) FillDrawableUBO { std::array matrix; /* 64 */ std::array scale; std::array world; /* 88 */ std::array pixel_coord_upper; /* 96 */ std::array pixel_coord_lower; /* 104 */ std::array texsize; /* 112 */ float fade; // Attribute interpolations (used without HAS_UNIFORM_u_*) /* 116 */ float color_t; /* 120 */ float opacity_t; /* 124 */ float outline_color_t; /* 128 */ float pattern_from_t; /* 132 */ float pattern_to_t; // Uniform alternates for attributes (used with HAS_UNIFORM_u_*) /* 136 */ std::array color; /* 144 */ std::array opacity; /* 152 */ std::array outline_color_pad; /* 160 */ std::array outline_color; /* 176 */ std::array pattern_from; /* 208 */ std::array pattern_to; // Pattern texture /* ? */ // Drawable::TextureAttachment? image; /* */ // std::array padding; /* 208 */ }; static_assert(sizeof(FillDrawableUBO) == 208); void FillLayerTweaker::execute(LayerGroup& layerGroup, const RenderTree& renderTree, const PaintParameters& parameters) { const auto& props = static_cast(*evaluatedProperties); const auto& evaluated = props.evaluated; const auto& crossfade = props.crossfade; layerGroup.observeDrawables([&](gfx::Drawable& drawable) { if (!drawable.getTileID()) { return; } /*mat4 matrix = drawable.getMatrix(); if (drawable.getTileID()) { const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); const auto tileMat = parameters.matrixForTile(tileID); matrix::multiply(matrix, drawable.getMatrix(), tileMat); matrix = tileMat; } const auto renderableSize = parameters.backend.getDefaultRenderable().getSize(); gfx::DrawableUBO drawableUBO; drawableUBO.matrix = util::cast(matrix); drawableUBO.world = {(float)renderableSize.width, (float)renderableSize.height}; auto uniformBuffer = context.createUniformBuffer(&drawableUBO, sizeof(drawableUBO)); drawable.mutableUniformBuffers().addOrReplace("DrawableUBO", uniformBuffer);*/ const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped(); const auto& translation = evaluated.get(); const auto anchor = evaluated.get(); constexpr bool inViewportPixelUnits = false; // from RenderTile::translatedMatrix const auto matrix = getTileMatrix( tileID, renderTree, parameters.state, translation, anchor, inViewportPixelUnits); // from FillPatternProgram::layoutUniformValues const auto renderableSize = parameters.backend.getDefaultRenderable().getSize(); const auto intZoom = parameters.state.getIntegerZoom(); const auto tileRatio = 1 / tileID.pixelsToTileUnits(1, intZoom); const int32_t tileSizeAtNearestZoom = static_cast( util::tileSize_D * parameters.state.zoomScale(intZoom - tileID.canonical.z)); const int32_t pixelX = static_cast( tileSizeAtNearestZoom * (tileID.canonical.x + tileID.wrap * parameters.state.zoomScale(tileID.canonical.z))); const int32_t pixelY = tileSizeAtNearestZoom * tileID.canonical.y; const auto pixelRatio = parameters.pixelRatio; const FillDrawableUBO drawableUBO = { /*.matrix=*/util::cast(matrix), /*.scale=*/{pixelRatio, tileRatio, crossfade.fromScale, crossfade.toScale}, /*.world=*/{(float)renderableSize.width, (float)renderableSize.height}, /*.pixel_coord_upper=*/{static_cast(pixelX >> 16), static_cast(pixelY >> 16)}, /*.pixel_coord_lower=*/{static_cast(pixelX & 0xFFFF), static_cast(pixelY & 0xFFFF)}, /*.texsize=*/{0.0f, 0.0f}, // tile.getIconAtlasTexture().size /*.fade=*/crossfade.t, /*.color_t=*/0.0f, /*.opacity_t=*/0.0f, /*.outline_color_t=*/0.0f, /*.pattern_from_t=*/0.0f, /*.pattern_to_t=*/0.0f, /*.color=*/{0.0f}, /*.opacity=*/{0.0f}, /*.outline_color_pad=*/{0.0f}, /*.outline_color=*/{0.0f}, /*.pattern_from=*/{0.0f}, /*.pattern_to=*/{0.0f}, /*.image=*/ // TextureAttachment(tile.getIconAtlasTexture().getResource(), Linear) }; auto drawableUniformBuffer = parameters.context.createUniformBuffer(&drawableUBO, sizeof(drawableUBO)); drawable.mutableUniformBuffers().addOrReplace("FillDrawableUBO", drawableUniformBuffer); }); } } // namespace mbgl