bmh/FlightSimulation/Plugins/CesiumForUnreal_5.4/Source/CesiumRuntime/Private/CesiumRuntime.cpp
2025-02-07 22:52:32 +08:00

128 lines
3.9 KiB
C++

// Copyright 2020-2024 CesiumGS, Inc. and Contributors
#include "CesiumRuntime.h"
#include "Cesium3DTilesContent/registerAllTileContentTypes.h"
#include "CesiumAsync/CachingAssetAccessor.h"
#include "CesiumAsync/GunzipAssetAccessor.h"
#include "CesiumAsync/SqliteCache.h"
#include "CesiumRuntimeSettings.h"
#include "CesiumUtility/Tracing.h"
#include "HAL/FileManager.h"
#include "HttpModule.h"
#include "Interfaces/IPluginManager.h"
#include "Misc/Paths.h"
#include "ShaderCore.h"
#include "SpdlogUnrealLoggerSink.h"
#include "UnrealAssetAccessor.h"
#include "UnrealTaskProcessor.h"
#include <CesiumAsync/AsyncSystem.h>
#include <CesiumAsync/IAssetAccessor.h>
#include <Modules/ModuleManager.h>
#include <spdlog/spdlog.h>
#if CESIUM_TRACING_ENABLED
#include <chrono>
#endif
#define LOCTEXT_NAMESPACE "FCesiumRuntimeModule"
DEFINE_LOG_CATEGORY(LogCesium);
void FCesiumRuntimeModule::StartupModule() {
Cesium3DTilesContent::registerAllTileContentTypes();
std::shared_ptr<spdlog::logger> pLogger = spdlog::default_logger();
pLogger->sinks() = {std::make_shared<SpdlogUnrealLoggerSink>()};
FModuleManager::Get().LoadModuleChecked(TEXT("HTTP"));
CESIUM_TRACE_INIT(
"cesium-trace-" +
std::to_string(std::chrono::time_point_cast<std::chrono::microseconds>(
std::chrono::steady_clock::now())
.time_since_epoch()
.count()) +
".json");
FString PluginShaderDir = FPaths::Combine(
IPluginManager::Get().FindPlugin(TEXT("CesiumForUnreal"))->GetBaseDir(),
TEXT("Shaders"));
AddShaderSourceDirectoryMapping(
TEXT("/Plugin/CesiumForUnreal"),
PluginShaderDir);
}
void FCesiumRuntimeModule::ShutdownModule() { CESIUM_TRACE_SHUTDOWN(); }
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FCesiumRuntimeModule, CesiumRuntime)
FCesium3DTilesetIonTroubleshooting OnCesium3DTilesetIonTroubleshooting{};
FCesiumRasterOverlayIonTroubleshooting
OnCesiumRasterOverlayIonTroubleshooting{};
CesiumAsync::AsyncSystem& getAsyncSystem() noexcept {
static CesiumAsync::AsyncSystem asyncSystem(
std::make_shared<UnrealTaskProcessor>());
return asyncSystem;
}
namespace {
std::string getCacheDatabaseName() {
#if PLATFORM_ANDROID
FString BaseDirectory = FPaths::ProjectPersistentDownloadDir();
#elif PLATFORM_IOS
FString BaseDirectory =
FPaths::Combine(*FPaths::ProjectSavedDir(), TEXT("Cesium"));
if (!IFileManager::Get().DirectoryExists(*BaseDirectory)) {
IFileManager::Get().MakeDirectory(*BaseDirectory, true);
}
#else
FString BaseDirectory = FPaths::EngineUserDir();
#endif
FString CesiumDBFile =
FPaths::Combine(*BaseDirectory, TEXT("cesium-request-cache.sqlite"));
FString PlatformAbsolutePath =
IFileManager::Get().ConvertToAbsolutePathForExternalAppForWrite(
*CesiumDBFile);
UE_LOG(
LogCesium,
Display,
TEXT("Caching Cesium requests in %s"),
*PlatformAbsolutePath);
return TCHAR_TO_UTF8(*PlatformAbsolutePath);
}
} // namespace
std::shared_ptr<CesiumAsync::ICacheDatabase>& getCacheDatabase() {
static int MaxCacheItems =
GetDefault<UCesiumRuntimeSettings>()->MaxCacheItems;
static std::shared_ptr<CesiumAsync::ICacheDatabase> pCacheDatabase =
std::make_shared<CesiumAsync::SqliteCache>(
spdlog::default_logger(),
getCacheDatabaseName(),
MaxCacheItems);
return pCacheDatabase;
}
const std::shared_ptr<CesiumAsync::IAssetAccessor>& getAssetAccessor() {
static int RequestsPerCachePrune =
GetDefault<UCesiumRuntimeSettings>()->RequestsPerCachePrune;
static std::shared_ptr<CesiumAsync::IAssetAccessor> pAssetAccessor =
std::make_shared<CesiumAsync::GunzipAssetAccessor>(
std::make_shared<CesiumAsync::CachingAssetAccessor>(
spdlog::default_logger(),
std::make_shared<UnrealAssetAccessor>(),
getCacheDatabase(),
RequestsPerCachePrune));
return pAssetAccessor;
}