9#include "Dom/JsonObject.h"
10#include "HAL/FileManager.h"
11#include "JsonObjectConverter.h"
12#include "Misc/FileHelper.h"
13#include "Serialization/JsonSerializer.h"
17 TSharedRef<FJsonObject> LoadJsonRoot(
const FString& Path)
20 TSharedPtr<FJsonObject> Root;
21 if (FFileHelper::LoadFileToString(InputString, *Path))
23 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(InputString);
24 FJsonSerializer::Deserialize(Reader, Root);
26 return Root.IsValid() ? Root.ToSharedRef() : MakeShared<FJsonObject>();
29 bool SaveJsonRoot(
const TSharedRef<FJsonObject>& Root,
const FString& Path)
32 TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutputString);
33 if (!FJsonSerializer::Serialize(Root, Writer))
35 IFileManager::Get().MakeDirectory(*FPaths::GetPath(Path),
true);
36 return FFileHelper::SaveStringToFile(OutputString, *Path);
41 TSharedRef<FJsonObject> GetOrCreateCatalog(
const TSharedRef<FJsonObject>& Root,
const TCHAR* CatalogKey)
43 const TSharedPtr<FJsonObject>* Existing =
nullptr;
44 if (Root->TryGetObjectField(CatalogKey, Existing) && Existing->IsValid())
45 return Existing->ToSharedRef();
46 TSharedRef<FJsonObject> Catalog = MakeShared<FJsonObject>();
47 Root->SetObjectField(CatalogKey, Catalog);
51 template <
typename TPresetStruct>
52 bool SavePreset(
const TPresetStruct& Preset,
const FString& Name,
const TCHAR* CatalogKey)
55 TSharedRef<FJsonObject> Catalog = GetOrCreateCatalog(Root, CatalogKey);
57 TSharedPtr<FJsonObject> PresetObject = FJsonObjectConverter::UStructToJsonObject(Preset);
58 if (!PresetObject.IsValid())
60 Catalog->SetObjectField(Name, PresetObject);
65 template <
typename TPresetStruct>
66 bool LoadPreset(TPresetStruct& OutPreset,
const FString& Name,
const TCHAR* CatalogKey)
69 const TSharedPtr<FJsonObject>* Catalog =
nullptr;
70 if (!Root->TryGetObjectField(CatalogKey, Catalog) || !Catalog->IsValid())
73 const TSharedPtr<FJsonObject>* PresetObject =
nullptr;
74 if (!(*Catalog)->TryGetObjectField(Name, PresetObject) || !PresetObject->IsValid())
77 return FJsonObjectConverter::JsonObjectToUStruct(PresetObject->ToSharedRef(), &OutPreset);
80 TArray<FString> GetCatalogNames(
const TCHAR* CatalogKey)
82 TArray<FString> Names;
84 const TSharedPtr<FJsonObject>* Catalog =
nullptr;
85 if (Root->TryGetObjectField(CatalogKey, Catalog) && Catalog->IsValid())
87 for (
const auto& Pair : (*Catalog)->Values)
88 Names.Add(FString(Pair.Key));
97 return SavePreset(Preset, Name, TEXT(
"time"));
102 return LoadPreset(OutPreset, Name, TEXT(
"time"));
107 return SavePreset(Preset, Name, TEXT(
"conditions"));
112 return LoadPreset(OutPreset, Name, TEXT(
"conditions"));
117 return GetCatalogNames(TEXT(
"time"));
122 return GetCatalogNames(TEXT(
"conditions"));
153 const TSharedPtr<FJsonObject>* MapEntry =
nullptr;
154 if (!Root->TryGetObjectField(MapName, MapEntry) || !MapEntry->IsValid())
157 return (*MapEntry)->TryGetStringField(TEXT(
"time"), OutTimeName)
158 && (*MapEntry)->TryGetStringField(TEXT(
"condition"), OutConditionName);
165 TSharedRef<FJsonObject> MapEntry = MakeShared<FJsonObject>();
166 MapEntry->SetStringField(TEXT(
"time"), TimeName);
167 MapEntry->SetStringField(TEXT(
"condition"), ConditionName);
168 Root->SetObjectField(MapName, MapEntry);
176 const TSharedPtr<FJsonObject>* MapEntry =
nullptr;
177 if (!Root->TryGetObjectField(MapName, MapEntry) || !MapEntry->IsValid())
180 FString TimeName, ConditionName;
181 const bool bIsPresetPair = (*MapEntry)->TryGetStringField(TEXT(
"time"), TimeName)
182 && (*MapEntry)->TryGetStringField(TEXT(
"condition"), ConditionName);
198 return FJsonObjectConverter::JsonObjectToUStruct((*MapEntry).ToSharedRef(), &OutWeather);
205 TSharedPtr<FJsonObject> WeatherObject = FJsonObjectConverter::UStructToJsonObject(
Weather);
206 if (!WeatherObject.IsValid())
208 Root->SetObjectField(MapName, WeatherObject);
static FWeatherParameters MergeWeatherPresets(const FWeatherParameters &Base, const FWeatherTimePreset &TimePreset, const FWeatherConditionPreset &ConditionPreset)
static bool SaveConditionPreset(const FWeatherConditionPreset &Preset, const FString &Name)
static bool GetMapDefaultWeather(const FString &MapName, const FWeatherParameters &Base, UPARAM(ref) FWeatherParameters &OutWeather)
static FString GetPresetsPath()
static TArray< FString > GetAvailableConditionPresetNames()
static bool GetMapDefaultPresetNames(const FString &MapName, FString &OutTimeName, FString &OutConditionName)
static bool LoadConditionPreset(UPARAM(ref) FWeatherConditionPreset &OutPreset, const FString &Name)
static bool SaveTimePreset(const FWeatherTimePreset &Preset, const FString &Name)
static bool SetMapDefaultWeather(const FString &MapName, const FWeatherParameters &Weather)
static TArray< FString > GetAvailableTimePresetNames()
static FString GetMapDefaultsPath()
static bool LoadTimePreset(UPARAM(ref) FWeatherTimePreset &OutPreset, const FString &Name)
static bool SetMapDefaultPresetNames(const FString &MapName, const FString &TimeName, const FString &ConditionName)
float RayleighScatteringScale
float PrecipitationDeposits
float ScatteringIntensity
float RayleighScatteringScale
float PrecipitationDeposits
float ScatteringIntensity