3#include "../OGC3DTiles.h"
4#include "../Components/OGC3DTilesComponent.h"
7#include "Systems/ComponentSystem.h"
8#include "Scene/GetBounds.h"
9#include "Services/TaskManager.h"
10#include "Resources/DataFetcherManager.h"
12#include "Foundation/Geometry/Glm.hpp"
13#include "Foundation/Geometry/BoundingBox.hpp"
14#include "Foundation/Platform/Threads.h"
19#include <unordered_map>
20#include <unordered_set>
25 namespace OGC3DTilesTileset {
30 namespace OGC3DTilesSubtree {
34 struct OGC3DTilesData;
35 struct OGC3DTilesDataHolder;
36 class OGC3DTilesBounds;
55 std::vector<std::string> URLs;
57 Cogs::Geometry::DBoundingBox bbox;
63 double timestampLastUsed = 0.0;
66 std::string uniqueName;
67 uint32_t frameNumberAtArrival = 0;
74 uint64_t fetchAndInitializeTileset(
const uint64_t tilesetGUID,
const std::string& tilesetURL,
OGC3DTilesComponent* component, uint32_t uniqueComponentId);
75 Cogs::Core::DataFetcherManager::FetchId fetchAndInitializeAsset(
OGC3DTilesComponent* component, uint32_t uniqueComponentId);
79 bool replaceRefine =
false;
84 std::map<uint64_t, Node> children;
86 std::unordered_map<uint64_t, Node> children;
93 const std::string& tileIdStr,
94 const glm::mat4& currentTransform,
95 const glm::mat4& globalTransform,
96 std::unordered_set<const OGC3DTilesTileset::Tileset*>& visitedTilesets)
const;
101 const glm::mat4& globalTransform)
const;
109 bool tileHasSubTilesetRequests(
const OGC3DTilesData* componentState, uint64_t tileId)
const;
111 void setVisibilityForAllTiles(
const OGC3DTilesData* componentState,
bool onoff)
const;
112 bool modelIsReady(
const ModelHandle& modelhandle)
const;
131 bool hasPendingRequests(
const OGC3DTilesData* componentState)
const;
134 bool isInsideFrustum(
const Cogs::Geometry::DBoundingBox& box)
const;
135 glm::dvec3 getCurrentCameraPosition()
const;
142 static bool modelIsEmpty(
const ModelHandle handle);
143 std::string addOptionalURLParameters(
const OGC3DTilesData* componentState,
const std::string& url)
const;
149 static void printDebugStats(
const OGC3DTilesData* componentState);
150 static std::string compileURL(
const std::string& baseURL,
const std::string& tilesetPath,
const std::string& modelPath);
153 std::string accessToken =
"";
155 double timestampOfLastCameraMovement = 0.0;
156 glm::mat4 lastCameraViewProjection = glm::mat4(-1);
164 std::unordered_map<uint64_t, std::vector<OGC3DTilesSystem::LoadedModel>> tileCache;
165 std::unordered_set<uint64_t> pendingModelRequests;
166 std::unordered_map<uint64_t, EntityPtr> bboxIndicatorCache;
167 std::unordered_map<uint32_t, std::unordered_map<uint64_t, OGC3DTilesSubtree::Subtree*>> subtreeCache;
168 std::unordered_map<std::string, OGC3DTilesTileset::Tileset*> subTilesets;
169 std::unordered_map<std::string, std::pair<OGC3DTilesSystem::TileCandidate, ModelHandle>> modelRequests;
170 std::unordered_map<std::string, OGC3DTiles::Coord> subtreeRequests;
171 std::unordered_map<uint64_t, Cogs::Core::DataFetcherManager::FetchId> subtreeFetchIds;
172 double timestampOfLastTraversal = 0.0;
173 bool candidateForDelayedTraversal =
false;
175 std::unordered_map<const OGC3DTilesTileset::Tileset*, State> states;
177 std::unordered_map<std::string, std::pair<uint64_t, const OGC3DTilesTileset::Tileset*>> subTilesetRequests;
178 std::vector<const OGC3DTilesTileset::Tileset*> tilesets;
179 std::set<std::string> loadedSubTilesets;
181 Entity* parentEntity =
nullptr;
182 uint32_t uniqueComponentId = 0;
183 glm::dmat4 originalRootTransform;
184 std::string baseURL =
"";
185 std::string additionalURLParameters =
"";
186 std::string tileBaseURL =
"";
187 std::string optionalAccessKey =
"";
188 std::string optionalSessionKey =
"";
189 float detailFactor = 1.0;
191 bool requiresTraversal =
false;
193 unsigned int numberOfModelsBeingPrepared = 0;
194 bool showTileBBoxes =
false;
195 bool neverDiscardRootTiles =
true;
196 bool waitForTileSiblings =
true;
197 bool enableCaching =
false;
198 bool colorTileAccordingToTreeDepth =
false;
199 bool dontRenderLeaves =
false;
201 Cogs::Core::DataFetcherManager::FetchId assetsFetchId = Cogs::Core::DataFetcherManager::NoFetchId;
202 std::unordered_map<uint64_t, Cogs::Core::DataFetcherManager::FetchId> tilesetFetchIds;
205 int traversedDepth = 0;
206 int numberOfCancelledRequests = 0;
207 int numberOfPendingRequests = 0;
208 int numberOfVisitedSubTilesets = 0;
214 std::unique_ptr<OGC3DTilesData> data;
Container for components, providing composition of dynamic entities.
Context * context
Pointer to the Context instance the system lives in.
void update()
Updates the system state to that of the current frame.
Component system with parallel data per component stored in a pool similar to how the components them...
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Node buildImplicitTree(OGC3DTilesData *componentState, const OGC3DTilesTileset::Tileset *tileset, const OGC3DTiles::Coord &coord, const glm::mat4 &globalTransform) const
bool requestModel(OGC3DTilesData *componentState, const OGC3DTilesTileset::Tileset *tileset, const TileCandidate &tile, const std::string URL) const
static uint64_t makeCacheKey(const OGC3DTiles::Coord &coord)
bool allChildrenAreReady(OGC3DTilesData *componentState, const OGC3DTilesTileset::Tileset *tileset, const Node *node) const
void collectTileCandidates(OGC3DTilesData *componentState, const Node *node, std::unordered_map< uint64_t, TileCandidate > &target) const
static bool componentIsStale(Context *context, uint32_t id)
void loadMissingModels(OGC3DTilesData *componentState, const OGC3DTilesTileset::Tileset *tileset, const std::unordered_map< uint64_t, TileCandidate > &toBeLoaded) const
void requestSubtree(OGC3DTilesData *componentState, const OGC3DTilesTileset::Tileset *tileset, const OGC3DTiles::Coord &coord) const
Node buildExplicitTree(OGC3DTilesData *componentState, const OGC3DTilesTileset::Tileset *tileset, const OGC3DTilesTileset::Tile *tile, const std::string &tileIdStr, const glm::mat4 ¤tTransform, const glm::mat4 &globalTransform, std::unordered_set< const OGC3DTilesTileset::Tileset * > &visitedTilesets) const
OGC3DTilesSubtree::Subtree * getSubtreeForTileCoord(OGC3DTilesData *componentState, const OGC3DTilesTileset::Tileset *tileset, const OGC3DTiles::Coord &coord) const
bool tileHasReadyContent(OGC3DTilesData *componentState, const OGC3DTilesTileset::Tileset *tileset, uint64_t tileId) const
void cleanupPendingSubtreeRequests(OGC3DTilesData *componentState, const OGC3DTilesTileset::Tileset *tileset) const
bool extractAndStoreOptionalSessionKeys(OGC3DTilesData *componentState, const std::string &url) const
size_t pruneTileCache(OGC3DTilesData *componentState, const OGC3DTilesTileset::Tileset *tileset, float gracePeriodBeforeTileRemoval) const
ComponentHandle createComponent() override
void calculateTileVisibilities(OGC3DTilesData *componentState, const OGC3DTilesTileset::Tileset *tileset, const Node *node) const
void addModelToScene(const std::string &uniqueName, TileCandidate tile, ModelHandle handle, const OGC3DTilesData *componentState) const
void initialize(Context *context) override
Initialize the system.
void destroyComponent(ComponentHandle component) override
Base allocator implementation.
Contains all Cogs related functionality.
uint32_t ComponentIndex
Type used to track component indexes in pools.
Handle to a Component instance.