diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-06-14 16:07:21 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-06-16 13:27:15 -0700 |
commit | 900568cfb0b84a298395f4d84488fd9323552c63 (patch) | |
tree | e2c315656ca57a07ba48e38df5743fb05debb115 /src/mbgl/style/source.cpp | |
parent | 19158d9f01909bf566616524f23e0acb635562f7 (diff) | |
download | qtlocation-mapboxgl-900568cfb0b84a298395f4d84488fd9323552c63.tar.gz |
[core] Runtime source API: private impls
Diffstat (limited to 'src/mbgl/style/source.cpp')
-rw-r--r-- | src/mbgl/style/source.cpp | 279 |
1 files changed, 0 insertions, 279 deletions
diff --git a/src/mbgl/style/source.cpp b/src/mbgl/style/source.cpp deleted file mode 100644 index 5f4949c94c..0000000000 --- a/src/mbgl/style/source.cpp +++ /dev/null @@ -1,279 +0,0 @@ -#include <mbgl/style/source.hpp> -#include <mbgl/style/source_observer.hpp> -#include <mbgl/map/transform.hpp> -#include <mbgl/renderer/render_tile.hpp> -#include <mbgl/renderer/painter.hpp> -#include <mbgl/style/update_parameters.hpp> -#include <mbgl/style/query_parameters.hpp> -#include <mbgl/platform/log.hpp> -#include <mbgl/math/clamp.hpp> -#include <mbgl/util/tile_cover.hpp> -#include <mbgl/util/enum.hpp> - -#include <mbgl/algorithm/update_renderables.hpp> -#include <mbgl/algorithm/generate_clip_ids.hpp> -#include <mbgl/algorithm/generate_clip_ids_impl.hpp> - -#include <mapbox/geometry/envelope.hpp> - -#include <algorithm> - -namespace mbgl { -namespace style { - -static SourceObserver nullObserver; - -Source::Source(SourceType type_, std::string id_) - : type(type_), - id(std::move(id_)), - observer(&nullObserver) { -} - -Source::~Source() = default; - -bool Source::isLoaded() const { - if (!loaded) return false; - - for (const auto& pair : tiles) { - if (!pair.second->isComplete()) { - return false; - } - } - - return true; -} - -void Source::invalidateTiles() { - tiles.clear(); - renderTiles.clear(); - cache.clear(); -} - -void Source::startRender(algorithm::ClipIDGenerator& generator, - const mat4& projMatrix, - const TransformState& transform) { - if (type == SourceType::Vector || - type == SourceType::GeoJSON || - type == SourceType::Annotations) { - generator.update(renderTiles); - } - - for (auto& pair : renderTiles) { - auto& tile = pair.second; - transform.matrixFor(tile.matrix, tile.id); - matrix::multiply(tile.matrix, projMatrix, tile.matrix); - } -} - -void Source::finishRender(Painter& painter) { - for (auto& pair : renderTiles) { - auto& tile = pair.second; - painter.renderTileDebug(tile); - } -} - -const std::map<UnwrappedTileID, RenderTile>& Source::getRenderTiles() const { - return renderTiles; -} - -Tile* Source::getTile(const OverscaledTileID& overscaledTileID) const { - auto it = tiles.find(overscaledTileID); - if (it != tiles.end()) { - return it->second.get(); - } else { - return nullptr; - } -} - -bool Source::update(const UpdateParameters& parameters) { - bool allTilesUpdated = true; - - if (!loaded || parameters.animationTime <= updated) { - return allTilesUpdated; - } - - const uint16_t tileSize = getTileSize(); - const Range<uint8_t> zoomRange = getZoomRange(); - - // Determine the overzooming/underzooming amounts and required tiles. - int32_t overscaledZoom = util::coveringZoomLevel(parameters.transformState.getZoom(), type, tileSize); - int32_t dataTileZoom = overscaledZoom; - - std::vector<UnwrappedTileID> idealTiles; - if (overscaledZoom >= zoomRange.min) { - int32_t idealZoom = std::min<int32_t>(zoomRange.max, overscaledZoom); - - // Make sure we're not reparsing overzoomed raster tiles. - if (type == SourceType::Raster) { - dataTileZoom = idealZoom; - } - - idealTiles = util::tileCover(parameters.transformState, idealZoom); - } - - // Stores a list of all the data tiles that we're definitely going to retain. There are two - // kinds of tiles we need: the ideal tiles determined by the tile cover. They may not yet be in - // use because they're still loading. In addition to that, we also need to retain all tiles that - // we're actively using, e.g. as a replacement for tile that aren't loaded yet. - std::set<OverscaledTileID> retain; - - auto retainTileFn = [&retain](Tile& tile, bool required) -> void { - retain.emplace(tile.id); - tile.setNecessity(required ? Tile::Necessity::Required - : Tile::Necessity::Optional); - }; - auto getTileFn = [this](const OverscaledTileID& dataTileID) -> Tile* { - return getTile(dataTileID); - }; - auto createTileFn = [this, ¶meters](const OverscaledTileID& dataTileID) -> Tile* { - std::unique_ptr<Tile> data = cache.get(dataTileID); - if (!data) { - data = createTile(dataTileID, parameters); - if (data) { - data->setObserver(this); - } - } - if (data) { - return tiles.emplace(dataTileID, std::move(data)).first->second.get(); - } else { - return nullptr; - } - }; - auto renderTileFn = [this](const UnwrappedTileID& renderTileID, Tile& tile) { - renderTiles.emplace(renderTileID, RenderTile{ renderTileID, tile }); - }; - - renderTiles.clear(); - algorithm::updateRenderables(getTileFn, createTileFn, retainTileFn, renderTileFn, - idealTiles, zoomRange, dataTileZoom); - - if (type != SourceType::Raster && type != SourceType::Annotations && cache.getSize() == 0) { - size_t conservativeCacheSize = - ((float)parameters.transformState.getWidth() / util::tileSize) * - ((float)parameters.transformState.getHeight() / util::tileSize) * - (parameters.transformState.getMaxZoom() - parameters.transformState.getMinZoom() + 1) * - 0.5; - cache.setSize(conservativeCacheSize); - } - - // Remove stale data tiles from the active set of tiles. - // This goes through the (sorted!) tiles and retain set in lockstep and removes items from - // tiles that don't have the corresponding key in the retain set. - auto dataIt = tiles.begin(); - auto retainIt = retain.begin(); - while (dataIt != tiles.end()) { - if (retainIt == retain.end() || dataIt->first < *retainIt) { - dataIt->second->setNecessity(Tile::Necessity::Optional); - cache.add(dataIt->first, std::move(dataIt->second)); - tiles.erase(dataIt++); - } else { - if (!(*retainIt < dataIt->first)) { - ++dataIt; - } - ++retainIt; - } - } - - const PlacementConfig newConfig{ parameters.transformState.getAngle(), - parameters.transformState.getPitch(), - parameters.debugOptions & MapDebugOptions::Collision }; - for (auto& pair : tiles) { - auto tile = pair.second.get(); - if (parameters.shouldReparsePartialTiles && tile->isIncomplete()) { - if (!tile->parsePending()) { - allTilesUpdated = false; - } - } else { - tile->redoPlacement(newConfig); - } - } - - updated = parameters.animationTime; - - return allTilesUpdated; -} - -static Point<int16_t> coordinateToTilePoint(const UnwrappedTileID& tileID, const Point<double>& p) { - auto zoomedCoord = TileCoordinate { p, 0 }.zoomTo(tileID.canonical.z); - return { - int16_t(util::clamp<int64_t>((zoomedCoord.p.x - tileID.canonical.x - tileID.wrap * std::pow(2, tileID.canonical.z)) * util::EXTENT, - std::numeric_limits<int16_t>::min(), - std::numeric_limits<int16_t>::max())), - int16_t(util::clamp<int64_t>((zoomedCoord.p.y - tileID.canonical.y) * util::EXTENT, - std::numeric_limits<int16_t>::min(), - std::numeric_limits<int16_t>::max())) - }; -} - -std::unordered_map<std::string, std::vector<Feature>> Source::queryRenderedFeatures(const QueryParameters& parameters) const { - LineString<double> queryGeometry; - - for (const auto& p : parameters.geometry) { - queryGeometry.push_back(TileCoordinate::fromScreenCoordinate( - parameters.transformState, 0, { p.x, parameters.transformState.getHeight() - p.y }).p); - } - - mapbox::geometry::box<double> box = mapbox::geometry::envelope(queryGeometry); - - std::unordered_map<std::string, std::vector<Feature>> result; - - for (const auto& tilePtr : renderTiles) { - const RenderTile& tile = tilePtr.second; - - Point<int16_t> tileSpaceBoundsMin = coordinateToTilePoint(tile.id, box.min); - Point<int16_t> tileSpaceBoundsMax = coordinateToTilePoint(tile.id, box.max); - - if (tileSpaceBoundsMin.x >= util::EXTENT || tileSpaceBoundsMin.y >= util::EXTENT || - tileSpaceBoundsMax.x < 0 || tileSpaceBoundsMax.y < 0) continue; - - GeometryCoordinates tileSpaceQueryGeometry; - - for (const auto& c : queryGeometry) { - tileSpaceQueryGeometry.push_back(coordinateToTilePoint(tile.id, c)); - } - - tile.tile.queryRenderedFeatures(result, - tileSpaceQueryGeometry, - parameters.transformState, - parameters.layerIDs); - } - - return result; -} - -void Source::setCacheSize(size_t size) { - cache.setSize(size); -} - -void Source::onLowMemory() { - cache.clear(); -} - -void Source::setObserver(SourceObserver* observer_) { - observer = observer_; -} - -void Source::onTileLoaded(Tile& tile, bool isNewTile) { - observer->onTileLoaded(*this, tile.id, isNewTile); -} - -void Source::onTileError(Tile& tile, std::exception_ptr error) { - observer->onTileError(*this, tile.id, error); -} - -void Source::onNeedsRepaint() { - observer->onNeedsRepaint(); -} - -void Source::dumpDebugLogs() const { - Log::Info(Event::General, "Source::id: %s", id.c_str()); - Log::Info(Event::General, "Source::loaded: %d", loaded); - - for (const auto& pair : tiles) { - auto& tile = pair.second; - tile->dumpDebugLogs(); - } -} - -} // namespace style -} // namespace mbgl |