From a7b769a9aa098a719e70139903c3263a4df4ec45 Mon Sep 17 00:00:00 2001 From: LukasPoque Date: Thu, 21 Nov 2024 11:43:36 +0100 Subject: [PATCH] Add cesium native initialization options to enable / disable caching and the cache path --- lib/cesium_3d_tiles.dart | 1 + lib/src/cesium_native/src/cesium_native.dart | 25 +++++++++++- .../cesium_native/src/cesium_native.g.dart | 3 +- .../src/cesium_native_options.dart | 12 ++++++ native/include/CesiumTilesetCApi.h | 2 +- native/src/CesiumTilesetCApi.cpp | 40 ++++++++++--------- 6 files changed, 62 insertions(+), 21 deletions(-) create mode 100644 lib/src/cesium_native/src/cesium_native_options.dart diff --git a/lib/cesium_3d_tiles.dart b/lib/cesium_3d_tiles.dart index cdf830f..a61a397 100644 --- a/lib/cesium_3d_tiles.dart +++ b/lib/cesium_3d_tiles.dart @@ -3,3 +3,4 @@ library; export 'src/cesium_3d_tiles/cesium_3d_tiles.dart'; export 'src/cesium_native/cesium_native.dart'; export 'src/cesium_ion/cesium_ion.dart'; +export 'src/cesium_native/src/cesium_native_options.dart'; diff --git a/lib/src/cesium_native/src/cesium_native.dart b/lib/src/cesium_native/src/cesium_native.dart index 05f90c7..f94371e 100644 --- a/lib/src/cesium_native/src/cesium_native.dart +++ b/lib/src/cesium_native/src/cesium_native.dart @@ -14,6 +14,7 @@ import 'package:logging/logging.dart'; import 'package:vector_math/vector_math_64.dart'; import 'cesium_tile_selection_state.dart'; +import 'cesium_native_options.dart'; class CesiumTileset { final Pointer _ptr; @@ -66,10 +67,32 @@ class CesiumNative { } CesiumNative._() { - g.CesiumTileset_initialize(16); _errorMessage = calloc(256); } + static bool _initialized = false; + + static void initialize([CesiumNativeOptions? options]) { + if (_initialized) return; + + final opts = options ?? const CesiumNativeOptions(); + + final cachePathPtr = + opts.cacheDbPath != null && opts.cacheDbPath!.isNotEmpty + ? opts.cacheDbPath!.toNativeUtf8().cast() + : nullptr; + + try { + g.CesiumTileset_initialize(opts.numThreads, cachePathPtr); + _initialized = true; + _errorMessage = calloc(256); + } finally { + if (cachePathPtr != nullptr) { + calloc.free(cachePathPtr.cast()); + } + } + } + /// /// Load a CesiumTileset from a CesiumIonAsset with the specified token. /// diff --git a/lib/src/cesium_native/src/cesium_native.g.dart b/lib/src/cesium_native/src/cesium_native.g.dart index 6707a95..deedc9b 100644 --- a/lib/src/cesium_native/src/cesium_native.g.dart +++ b/lib/src/cesium_native/src/cesium_native.g.dart @@ -7,9 +7,10 @@ library; import 'dart:ffi' as ffi; -@ffi.Native() +@ffi.Native)>() external void CesiumTileset_initialize( int numThreads, + ffi.Pointer cacheDbPath, ); @ffi.Native() diff --git a/lib/src/cesium_native/src/cesium_native_options.dart b/lib/src/cesium_native/src/cesium_native_options.dart new file mode 100644 index 0000000..0eb2436 --- /dev/null +++ b/lib/src/cesium_native/src/cesium_native_options.dart @@ -0,0 +1,12 @@ +class CesiumNativeOptions { + /// The path where the SQLite cache database will be stored + final String? cacheDbPath; + + /// Number of threads to use for processing tasks + final int numThreads; + + const CesiumNativeOptions({ + this.cacheDbPath, + this.numThreads = 16, + }); +} diff --git a/native/include/CesiumTilesetCApi.h b/native/include/CesiumTilesetCApi.h index c87508e..8755d97 100644 --- a/native/include/CesiumTilesetCApi.h +++ b/native/include/CesiumTilesetCApi.h @@ -164,7 +164,7 @@ typedef struct SerializedCesiumGltfModel SerializedCesiumGltfModel; // Initializes all bindings. Must be called before any other CesiumTileset_ function. // numThreads refers to the number of threads that will be created for the Async system (job queue). // -API_EXPORT void CesiumTileset_initialize(uint32_t numThreads); +API_EXPORT void CesiumTileset_initialize(uint32_t numThreads, const char* cacheDbPath); API_EXPORT void CesiumTileset_pumpAsyncQueue(); diff --git a/native/src/CesiumTilesetCApi.cpp b/native/src/CesiumTilesetCApi.cpp index 1e688f9..bf4a5a6 100644 --- a/native/src/CesiumTilesetCApi.cpp +++ b/native/src/CesiumTilesetCApi.cpp @@ -134,7 +134,7 @@ static std::shared_ptr pAssetAccessor; static std::shared_ptr pCacheDatabase; static std::shared_ptr pMockedCreditSystem; static std::thread *main; -API_EXPORT void CesiumTileset_initialize(uint32_t numThreads) { +API_EXPORT void CesiumTileset_initialize(uint32_t numThreads, const char* cacheDbPath) { if(pResourcePreparer) { return; } @@ -151,25 +151,29 @@ API_EXPORT void CesiumTileset_initialize(uint32_t numThreads) { spdlog::enable_backtrace(32); // Keep a backtrace of 32 messages pAssetAccessor = std::make_shared(); - //TODO: make this a user-configurable path - std::string cacheDbPath = "cesium_tile_cache.db"; - pCacheDatabase = std::make_shared( - spdlog::default_logger(), - cacheDbPath, - 4096 - ); - if (pCacheDatabase) { - spdlog::default_logger()->info("SQLite cache created successfully"); + + // Only create caching if a valid path is provided + if (cacheDbPath && strlen(cacheDbPath) > 0) { + pCacheDatabase = std::make_shared( + spdlog::default_logger(), + cacheDbPath, + 4096 + ); + if (pCacheDatabase) { + spdlog::default_logger()->info("SQLite cache created successfully at: {}", cacheDbPath); + pAssetAccessor = std::make_shared( + spdlog::default_logger(), + pAssetAccessor, + pCacheDatabase, + 10000 + ); + spdlog::default_logger()->info("CachingAssetAccessor created with database: {}", cacheDbPath); + } else { + spdlog::default_logger()->error("Failed to create SQLite cache at: {}", cacheDbPath); + } } else { - spdlog::default_logger()->error("Failed to create SQLite cache"); + spdlog::default_logger()->info("No cache path provided, running without tile caching"); } - pAssetAccessor = std::make_shared( - spdlog::default_logger(), - pAssetAccessor, - pCacheDatabase, - 10000 - ); - spdlog::default_logger()->info("CachingAssetAccessor created with database: {}", cacheDbPath); asyncSystem = CesiumAsync::AsyncSystem { std::make_shared(numThreads) };