From d4a5c76c8271ad5861641b40eca991b7822b4b8e Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Mon, 20 Jan 2025 23:47:51 +0100 Subject: [PATCH] Add serialization of game settings for proper upgrade when loading deprecated data --- Source/Engine/Core/Config/GameSettings.cpp | 33 +++++++++++++++++-- Source/Engine/Core/Config/GraphicsSettings.h | 7 ++-- .../Engine/Core/Config/LayersTagsSettings.h | 3 ++ Source/Engine/Input/Input.cpp | 1 - Source/Engine/Localization/Localization.cpp | 11 +++++++ .../Localization/LocalizationSettings.h | 3 ++ Source/Engine/Navigation/Navigation.cpp | 22 +++++++++++++ Source/Engine/Navigation/NavigationSettings.h | 3 ++ Source/Engine/Physics/Physics.cpp | 32 +++++++++++++++++- Source/Engine/Physics/PhysicsSettings.h | 5 ++- Source/Engine/Streaming/Streaming.cpp | 5 --- Source/Engine/Streaming/StreamingSettings.h | 7 ++-- 12 files changed, 113 insertions(+), 19 deletions(-) diff --git a/Source/Engine/Core/Config/GameSettings.cpp b/Source/Engine/Core/Config/GameSettings.cpp index 11617612f..9fdcec3c8 100644 --- a/Source/Engine/Core/Config/GameSettings.cpp +++ b/Source/Engine/Core/Config/GameSettings.cpp @@ -42,6 +42,14 @@ public: }; IMPLEMENT_ENGINE_SETTINGS_GETTER(BuildSettings, GameCooking); + +#include "Engine/Content/Deprecated.h" +void GraphicsSettings::SetUeeHDRProbes(bool value) +{ + MARK_CONTENT_DEPRECATED(); + UseHDRProbes = value; +} + IMPLEMENT_ENGINE_SETTINGS_GETTER(GraphicsSettings, Graphics); IMPLEMENT_ENGINE_SETTINGS_GETTER(NetworkSettings, Network); IMPLEMENT_ENGINE_SETTINGS_GETTER(LayersAndTagsSettings, LayersAndTags); @@ -260,6 +268,27 @@ void GameSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* mo DESERIALIZE(iOSPlatform); } +#if USE_EDITOR + +void LayersAndTagsSettings::Serialize(SerializeStream& stream, const void* otherObj) +{ + SERIALIZE_GET_OTHER_OBJ(LayersAndTagsSettings); + + stream.JKEY("Tags"); + stream.StartArray(); + for (const String& e : Tags) + stream.String(e); + stream.EndArray(); + + stream.JKEY("Layers"); + stream.StartArray(); + for (const String& e : Layers) + stream.String(e); + stream.EndArray(); +} + +#endif + void LayersAndTagsSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) { const auto tags = stream.FindMember("Tags"); @@ -280,7 +309,7 @@ void LayersAndTagsSettings::Deserialize(DeserializeStream& stream, ISerializeMod if (layers != stream.MemberEnd() && layers->value.IsArray()) { auto& layersArray = layers->value; - for (uint32 i = 0; i < layersArray.Size() && i < 32; i++) + for (uint32 i = 0; i < layersArray.Size() && i < ARRAY_COUNT(Layers); i++) { auto& v = layersArray[i]; if (v.IsString()) @@ -288,7 +317,7 @@ void LayersAndTagsSettings::Deserialize(DeserializeStream& stream, ISerializeMod else Layers[i].Clear(); } - for (uint32 i = layersArray.Size(); i < 32; i++) + for (uint32 i = layersArray.Size(); i < ARRAY_COUNT(Layers); i++) { Layers[i].Clear(); } diff --git a/Source/Engine/Core/Config/GraphicsSettings.h b/Source/Engine/Core/Config/GraphicsSettings.h index 9fe3db4c0..8e42748e3 100644 --- a/Source/Engine/Core/Config/GraphicsSettings.h +++ b/Source/Engine/Core/Config/GraphicsSettings.h @@ -145,15 +145,12 @@ private: /// Renamed UeeHDRProbes into UseHDRProbes /// [Deprecated on 12.10.2022, expires on 12.10.2024] /// - API_PROPERTY(Attributes="Serialize, Obsolete, NoUndo") bool GetUeeHDRProbes() const + API_PROPERTY(Attributes="Serialize, Obsolete, NoUndo") DEPRECATED("Use UseHDRProbes instead.") bool GetUeeHDRProbes() const { return UseHDRProbes; } - API_PROPERTY(Attributes="Serialize, Obsolete, NoUndo") void SetUeeHDRProbes(bool value) - { - UseHDRProbes = value; - } + API_PROPERTY(Attributes="Serialize, Obsolete, NoUndo") DEPRECATED("Use UseHDRProbes instead.") void SetUeeHDRProbes(bool value); public: /// diff --git a/Source/Engine/Core/Config/LayersTagsSettings.h b/Source/Engine/Core/Config/LayersTagsSettings.h index 20e3977a7..6d10d88f8 100644 --- a/Source/Engine/Core/Config/LayersTagsSettings.h +++ b/Source/Engine/Core/Config/LayersTagsSettings.h @@ -32,5 +32,8 @@ public: // [SettingsBase] void Apply() override; +#if USE_EDITOR + void Serialize(SerializeStream& stream, const void* otherObj) override; +#endif void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override; }; diff --git a/Source/Engine/Input/Input.cpp b/Source/Engine/Input/Input.cpp index d1ccd367e..1a505831a 100644 --- a/Source/Engine/Input/Input.cpp +++ b/Source/Engine/Input/Input.cpp @@ -5,7 +5,6 @@ #include "Keyboard.h" #include "Mouse.h" #include "Gamepad.h" -#include "FlaxEngine.Gen.h" #include "Engine/Platform/Window.h" #include "Engine/Engine/Engine.h" #include "Engine/Engine/EngineService.h" diff --git a/Source/Engine/Localization/Localization.cpp b/Source/Engine/Localization/Localization.cpp index bc921c28e..325a99a36 100644 --- a/Source/Engine/Localization/Localization.cpp +++ b/Source/Engine/Localization/Localization.cpp @@ -80,6 +80,17 @@ void LocalizationSettings::Apply() Instance.OnLocalizationChanged(); } +#if USE_EDITOR + +void LocalizationSettings::Serialize(SerializeStream& stream, const void* otherObj) +{ + SERIALIZE_GET_OTHER_OBJ(LocalizationSettings); + SERIALIZE(LocalizedStringTables); + SERIALIZE(DefaultFallbackLanguage); +} + +#endif + void LocalizationSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) { DESERIALIZE(LocalizedStringTables); diff --git a/Source/Engine/Localization/LocalizationSettings.h b/Source/Engine/Localization/LocalizationSettings.h index cfd391cc3..7560aea42 100644 --- a/Source/Engine/Localization/LocalizationSettings.h +++ b/Source/Engine/Localization/LocalizationSettings.h @@ -34,5 +34,8 @@ public: // [SettingsBase] void Apply() override; +#if USE_EDITOR + void Serialize(SerializeStream& stream, const void* otherObj) override; +#endif void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override; }; diff --git a/Source/Engine/Navigation/Navigation.cpp b/Source/Engine/Navigation/Navigation.cpp index 5d7bb7889..595de0fd4 100644 --- a/Source/Engine/Navigation/Navigation.cpp +++ b/Source/Engine/Navigation/Navigation.cpp @@ -235,6 +235,28 @@ void NavigationSettings::Apply() #endif } +#if USE_EDITOR + +void NavigationSettings::Serialize(SerializeStream& stream, const void* otherObj) +{ + SERIALIZE_GET_OTHER_OBJ(NavigationSettings); + SERIALIZE(AutoAddMissingNavMeshes); + SERIALIZE(AutoRemoveMissingNavMeshes); + SERIALIZE(CellHeight); + SERIALIZE(CellSize); + SERIALIZE(TileSize); + SERIALIZE(MinRegionArea); + SERIALIZE(MergeRegionArea); + SERIALIZE(MaxEdgeLen); + SERIALIZE(MaxEdgeError); + SERIALIZE(DetailSamplingDist); + SERIALIZE(MaxDetailSamplingError); + SERIALIZE(NavMeshes); + SERIALIZE(NavAreas); +} + +#endif + void NavigationSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) { DESERIALIZE(AutoAddMissingNavMeshes); diff --git a/Source/Engine/Navigation/NavigationSettings.h b/Source/Engine/Navigation/NavigationSettings.h index f4e6c26fa..d73f9fffb 100644 --- a/Source/Engine/Navigation/NavigationSettings.h +++ b/Source/Engine/Navigation/NavigationSettings.h @@ -104,5 +104,8 @@ public: // [SettingsBase] void Apply() override; +#if USE_EDITOR + void Serialize(SerializeStream& stream, const void* otherObj) override; +#endif void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override; }; diff --git a/Source/Engine/Physics/Physics.cpp b/Source/Engine/Physics/Physics.cpp index 66d5a76bf..092837e47 100644 --- a/Source/Engine/Physics/Physics.cpp +++ b/Source/Engine/Physics/Physics.cpp @@ -49,6 +49,36 @@ PhysicsSettings::PhysicsSettings() LayerMasks[i] = MAX_uint32; } +#if USE_EDITOR + +void PhysicsSettings::Serialize(SerializeStream& stream, const void* otherObj) +{ + SERIALIZE_GET_OTHER_OBJ(PhysicsSettings); + + SERIALIZE(DefaultGravity); + SERIALIZE(TriangleMeshTriangleMinAreaThreshold); + SERIALIZE(BounceThresholdVelocity); + SERIALIZE(FrictionCombineMode); + SERIALIZE(RestitutionCombineMode); + SERIALIZE(DisableCCD); + SERIALIZE(BroadPhaseType); + SERIALIZE(SolverType); + SERIALIZE(MaxDeltaTime); + SERIALIZE(EnableSubstepping); + SERIALIZE(SubstepDeltaTime); + SERIALIZE(MaxSubsteps); + SERIALIZE(QueriesHitTriggers); + SERIALIZE(SupportCookingAtRuntime); + + stream.JKEY("LayerMasks"); + stream.StartArray(); + for (uint32 e : LayerMasks) + stream.Uint(e); + stream.EndArray(); +} + +#endif + void PhysicsSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) { DESERIALIZE(DefaultGravity); @@ -71,7 +101,7 @@ void PhysicsSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* { auto& layersArray = layers->value; ASSERT(layersArray.IsArray()); - for (uint32 i = 0; i < layersArray.Size() && i < 32; i++) + for (uint32 i = 0; i < layersArray.Size() && i < ARRAY_COUNT(LayerMasks); i++) { LayerMasks[i] = layersArray[i].GetUint(); } diff --git a/Source/Engine/Physics/PhysicsSettings.h b/Source/Engine/Physics/PhysicsSettings.h index 728a18367..4360e7dae 100644 --- a/Source/Engine/Physics/PhysicsSettings.h +++ b/Source/Engine/Physics/PhysicsSettings.h @@ -143,7 +143,7 @@ public: float TriangleMeshTriangleMinAreaThreshold = 5.0f; /// - /// If enabled, any Raycast or other scene query that intersects with a Collider marked as a Trigger will returns with a hit. Individual raycasts can override this behavior. + /// If enabled, any Raycast or other scene query that intersects with a Collider marked as a Trigger will return with a hit. Individual raycasts can override this behavior. /// API_FIELD(Attributes="EditorOrder(1200), EditorDisplay(\"Other\")") bool QueriesHitTriggers = true; @@ -166,5 +166,8 @@ public: // [SettingsBase] void Apply() override; +#if USE_EDITOR + void Serialize(SerializeStream& stream, const void* otherObj) override; +#endif void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override; }; diff --git a/Source/Engine/Streaming/Streaming.cpp b/Source/Engine/Streaming/Streaming.cpp index fa5112d70..6d89af588 100644 --- a/Source/Engine/Streaming/Streaming.cpp +++ b/Source/Engine/Streaming/Streaming.cpp @@ -60,11 +60,6 @@ void StreamingSettings::Apply() TextureGroupSamplers.Resize(TextureGroups.Count(), false); } -void StreamingSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) -{ - DESERIALIZE(TextureGroups); -} - StreamableResource::StreamableResource(StreamingGroup* group) : _group(group) , _isDynamic(true) diff --git a/Source/Engine/Streaming/StreamingSettings.h b/Source/Engine/Streaming/StreamingSettings.h index 0bc0347e9..89c0c6802 100644 --- a/Source/Engine/Streaming/StreamingSettings.h +++ b/Source/Engine/Streaming/StreamingSettings.h @@ -10,9 +10,10 @@ /// API_CLASS(sealed, Namespace="FlaxEditor.Content.Settings", NoConstructor) class FLAXENGINE_API StreamingSettings : public SettingsBase { -DECLARE_SCRIPTING_TYPE_MINIMAL(StreamingSettings); -public: + DECLARE_SCRIPTING_TYPE_MINIMAL(StreamingSettings); + API_AUTO_SERIALIZATION(); +public: /// /// Textures streaming configuration (per-group). /// @@ -20,7 +21,6 @@ public: Array> TextureGroups; public: - /// /// Gets the instance of the settings asset (default value if missing). Object returned by this method is always loaded with valid data to use. /// @@ -28,5 +28,4 @@ public: // [SettingsBase] void Apply() override; - void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override; };