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);
158 std::vector<MaterialInstanceHandle> debugTileTreeDepthColorMaterials;
166 std::unordered_map<uint64_t, std::vector<OGC3DTilesSystem::LoadedModel>> tileCache;
167 std::unordered_set<uint64_t> pendingModelRequests;
168 std::unordered_map<uint64_t, EntityPtr> bboxIndicatorCache;
169 std::unordered_map<uint32_t, std::unordered_map<uint64_t, OGC3DTilesSubtree::Subtree*>> subtreeCache;
170 std::unordered_map<std::string, OGC3DTilesTileset::Tileset*> subTilesets;
171 std::unordered_map<std::string, std::pair<OGC3DTilesSystem::TileCandidate, ModelHandle>> modelRequests;
172 std::unordered_map<std::string, OGC3DTiles::Coord> subtreeRequests;
173 std::unordered_map<uint64_t, Cogs::Core::DataFetcherManager::FetchId> subtreeFetchIds;
174 double timestampOfLastTraversal = 0.0;
175 bool candidateForDelayedTraversal =
false;
177 std::unordered_map<const OGC3DTilesTileset::Tileset*, State> states;
179 std::unordered_map<std::string, std::pair<uint64_t, const OGC3DTilesTileset::Tileset*>> subTilesetRequests;
180 std::vector<const OGC3DTilesTileset::Tileset*> tilesets;
181 std::set<std::string> loadedSubTilesets;
183 Entity* parentEntity =
nullptr;
184 uint32_t uniqueComponentId = 0;
185 glm::dmat4 originalRootTransform;
186 std::string baseURL =
"";
187 std::string additionalURLParameters =
"";
188 std::string tileBaseURL =
"";
189 std::string optionalAccessKey =
"";
190 std::string optionalSessionKey =
"";
191 float detailFactor = 1.0;
193 bool requiresTraversal =
false;
195 unsigned int numberOfModelsBeingPrepared = 0;
196 bool showTileBBoxes =
false;
197 bool neverDiscardRootTiles =
true;
198 bool waitForTileSiblings =
true;
199 bool enableCaching =
false;
200 bool colorTileAccordingToTreeDepth =
false;
201 bool dontRenderLeaves =
false;
202 bool loadAllSiblings =
false;
204 Cogs::Core::DataFetcherManager::FetchId assetsFetchId = Cogs::Core::DataFetcherManager::NoFetchId;
205 std::unordered_map<uint64_t, Cogs::Core::DataFetcherManager::FetchId> tilesetFetchIds;
208 int traversedDepth = 0;
209 int numberOfCancelledRequests = 0;
210 int numberOfPendingRequests = 0;
211 int numberOfVisitedSubTilesets = 0;
217 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.