diff --git a/Source/Editor/Scripting/TypeUtils.cs b/Source/Editor/Scripting/TypeUtils.cs index 84d7340f9..54616990e 100644 --- a/Source/Editor/Scripting/TypeUtils.cs +++ b/Source/Editor/Scripting/TypeUtils.cs @@ -127,15 +127,9 @@ namespace FlaxEditor.Scripting return ChannelMask.Red; if (type.Type == typeof(MaterialSceneTextures)) return MaterialSceneTextures.BaseColor; - if (type.IsValueType) - { - var value = type.CreateInstance(); - Utilities.Utils.InitDefaultValues(value); - return value; - } if (ScriptType.Object.IsAssignableFrom(type)) return null; - if (type.CanCreateInstance) + if (type.IsValueType || type.CanCreateInstance) { var value = type.CreateInstance(); Utilities.Utils.InitDefaultValues(value); diff --git a/Source/Engine/Core/Config/GraphicsSettings.cpp b/Source/Engine/Core/Config/GraphicsSettings.cpp index 33e669034..75f302701 100644 --- a/Source/Engine/Core/Config/GraphicsSettings.cpp +++ b/Source/Engine/Core/Config/GraphicsSettings.cpp @@ -16,4 +16,5 @@ void GraphicsSettings::Apply() Graphics::GlobalSDFQuality = GlobalSDFQuality; Graphics::GIQuality = GIQuality; Graphics::GlobalSurfaceAtlasResolution = GlobalSurfaceAtlasResolution; + Graphics::PostProcessSettings = PostProcessSettings; } diff --git a/Source/Engine/Core/Config/GraphicsSettings.h b/Source/Engine/Core/Config/GraphicsSettings.h index 0e42fafd0..920a3cc0f 100644 --- a/Source/Engine/Core/Config/GraphicsSettings.h +++ b/Source/Engine/Core/Config/GraphicsSettings.h @@ -5,11 +5,12 @@ #include "Engine/Core/Config/Settings.h" #include "Engine/Serialization/Serialization.h" #include "Engine/Graphics/Enums.h" +#include "Engine/Graphics/PostProcessSettings.h" /// /// Graphics rendering settings. /// -API_CLASS(sealed, Namespace="FlaxEditor.Content.Settings") class FLAXENGINE_API GraphicsSettings : public SettingsBase +API_CLASS(sealed, Namespace="FlaxEditor.Content.Settings", NoConstructor) class FLAXENGINE_API GraphicsSettings : public SettingsBase { API_AUTO_SERIALIZATION(); DECLARE_SCRIPTING_TYPE_MINIMAL(GraphicsSettings); @@ -94,6 +95,12 @@ public: API_FIELD(Attributes="EditorOrder(2130), Limit(256, 8192), EditorDisplay(\"Global Illumination\")") int32 GlobalSurfaceAtlasResolution = 2048; + /// + /// The default Post Process settings. Can be overriden by PostFxVolume on a level locally, per camera or for a whole map. + /// + API_FIELD(Attributes="EditorOrder(10000), EditorDisplay(\"Post Process Settings\", EditorDisplayAttribute.InlineStyle)") + PostProcessSettings PostProcessSettings; + 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. diff --git a/Source/Engine/Graphics/Graphics.cpp b/Source/Engine/Graphics/Graphics.cpp index 6e6ee5731..316ed8c36 100644 --- a/Source/Engine/Graphics/Graphics.cpp +++ b/Source/Engine/Graphics/Graphics.cpp @@ -17,6 +17,7 @@ bool Graphics::AllowCSMBlending = false; Quality Graphics::GlobalSDFQuality = Quality::High; Quality Graphics::GIQuality = Quality::High; int32 Graphics::GlobalSurfaceAtlasResolution = 2048; +PostProcessSettings Graphics::PostProcessSettings; #if GRAPHICS_API_NULL extern GPUDevice* CreateGPUDeviceNull(); diff --git a/Source/Engine/Graphics/Graphics.h b/Source/Engine/Graphics/Graphics.h index a49380e9a..0575213fa 100644 --- a/Source/Engine/Graphics/Graphics.h +++ b/Source/Engine/Graphics/Graphics.h @@ -3,6 +3,7 @@ #pragma once #include "Engine/Scripting/ScriptingType.h" +#include "PostProcessSettings.h" #include "Enums.h" /// @@ -68,6 +69,11 @@ public: /// API_FIELD() static int32 GlobalSurfaceAtlasResolution; + /// + /// The default Post Process settings. Can be overriden by PostFxVolume on a level locally, per camera or for a whole map. + /// + API_FIELD() static PostProcessSettings PostProcessSettings; + public: /// diff --git a/Source/Engine/Graphics/PostProcessSettings.h b/Source/Engine/Graphics/PostProcessSettings.h index a96bdf6bc..9ef7644b6 100644 --- a/Source/Engine/Graphics/PostProcessSettings.h +++ b/Source/Engine/Graphics/PostProcessSettings.h @@ -9,6 +9,8 @@ #include "Engine/Content/Assets/Texture.h" #include "Engine/Content/Assets/MaterialBase.h" +API_INJECT_CODE(csharp, "using Newtonsoft.Json;"); + /// /// Global Illumination effect rendering modes. /// @@ -1910,79 +1912,79 @@ API_STRUCT() struct FLAXENGINE_API PostProcessSettings : ISerializable /// /// The ambient occlusion effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Ambient Occlusion\"), EditorOrder(100), JsonProperty(\"AO\")") AmbientOcclusionSettings AmbientOcclusion; /// /// The global illumination effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Global Illumination\"), EditorOrder(150), JsonProperty(\"GI\")") GlobalIlluminationSettings GlobalIllumination; /// /// The bloom effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Bloom\"), EditorOrder(200)") BloomSettings Bloom; /// /// The tone mapping effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Tone Mapping\"), EditorOrder(300)") ToneMappingSettings ToneMapping; /// /// The color grading effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Color Grading\"), EditorOrder(400)") ColorGradingSettings ColorGrading; /// /// The eye adaptation effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Eye Adaptation\"), EditorOrder(500)") EyeAdaptationSettings EyeAdaptation; /// /// The camera artifacts effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Camera Artifacts\"), EditorOrder(600)") CameraArtifactsSettings CameraArtifacts; /// /// The lens flares effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Lens Flares\"), EditorOrder(700)") LensFlaresSettings LensFlares; /// /// The depth of field effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Depth Of Field\"), EditorOrder(800)") DepthOfFieldSettings DepthOfField; /// /// The motion blur effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Motion Blur\"), EditorOrder(900)") MotionBlurSettings MotionBlur; /// /// The screen space reflections effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Screen Space Reflections\"), EditorOrder(1000), JsonProperty(\"SSR\")") ScreenSpaceReflectionsSettings ScreenSpaceReflections; /// /// The anti-aliasing effect settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"Anti Aliasing\"), EditorOrder(1100), JsonProperty(\"AA\")") AntiAliasingSettings AntiAliasing; /// /// The PostFx materials rendering settings. /// - API_FIELD() + API_FIELD(Attributes="EditorDisplay(\"PostFx Materials\"), NoAnimate, EditorOrder(1200)") PostFxMaterialsSettings PostFxMaterials; public: diff --git a/Source/Engine/Platform/SettingsBase.cs b/Source/Engine/Platform/SettingsBase.cs index 52ac1be66..84f02129d 100644 --- a/Source/Engine/Platform/SettingsBase.cs +++ b/Source/Engine/Platform/SettingsBase.cs @@ -8,4 +8,41 @@ namespace FlaxEditor.Content.Settings public abstract class SettingsBase { } + + partial class GraphicsSettings + { + /// + /// Initializes a new instance of the . + /// + public GraphicsSettings() + { + // Initialize PostFx settings with default options (C# structs doesn't support it) + PostProcessSettings = FlaxEngine.PostProcessSettings.Default; + } + } +} + +namespace FlaxEngine +{ + partial struct PostProcessSettings + { + private static PostProcessSettings _default; + + /// + /// The default . + /// + public static PostProcessSettings Default + { + get + { + if (!_default.AmbientOcclusion.Enabled) + { + object obj = _default; + Utils.InitStructure(obj, typeof(PostProcessSettings)); + _default = (PostProcessSettings)obj; + } + return _default; + } + } + } } diff --git a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp index e3056a191..0cd7c977e 100644 --- a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp +++ b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp @@ -506,7 +506,7 @@ bool GlobalSignDistanceFieldPass::Render(RenderContext& renderContext, GPUContex auto& cascade = sdfData.Cascades[cascadeIndex]; const float cascadeDistance = distanceExtent * cascadesDistanceScales[cascadeIndex]; const float cascadeMaxDistance = cascadeDistance * 2; - const float cascadeVoxelSize = cascadeMaxDistance / resolution; + const float cascadeVoxelSize = cascadeMaxDistance / (float)resolution; const float cascadeChunkSize = cascadeVoxelSize * GLOBAL_SDF_RASTERIZE_CHUNK_SIZE; static_assert(GLOBAL_SDF_RASTERIZE_CHUNK_SIZE % GLOBAL_SDF_RASTERIZE_MIP_FACTOR == 0, "Adjust chunk size to match the mip factor scale."); const Vector3 center = Vector3::Floor(viewOrigin / cascadeChunkSize) * cascadeChunkSize; diff --git a/Source/Engine/Renderer/RenderList.cpp b/Source/Engine/Renderer/RenderList.cpp index 4414581d9..640f95c18 100644 --- a/Source/Engine/Renderer/RenderList.cpp +++ b/Source/Engine/Renderer/RenderList.cpp @@ -12,6 +12,7 @@ #include "Engine/Graphics/RenderTools.h" #include "Engine/Profiler/Profiler.h" #include "Engine/Content/Assets/CubeTexture.h" +#include "Engine/Graphics/Graphics.h" #include "Engine/Level/Scene/Lightmap.h" #include "Engine/Level/Actors/PostFxVolume.h" @@ -192,9 +193,8 @@ void RenderList::AddSettingsBlend(IPostFxSettingsProvider* provider, float weigh void RenderList::BlendSettings() { PROFILE_CPU(); - Sorting::QuickSort(Blendable.Get(), Blendable.Count()); - + Settings = Graphics::PostProcessSettings; for (auto& b : Blendable) { b.Provider->Blend(Settings, b.Weight); diff --git a/Source/Engine/Utilities/Utils.cs b/Source/Engine/Utilities/Utils.cs index 6e200ce7f..a2eb05c58 100644 --- a/Source/Engine/Utilities/Utils.cs +++ b/Source/Engine/Utilities/Utils.cs @@ -927,5 +927,29 @@ namespace FlaxEngine else stream.Write(0); } + + internal static void InitStructure(object obj, Type type) + { + var fields = type.GetFields(BindingFlags.Default | BindingFlags.Instance | BindingFlags.Public); + for (var i = 0; i < fields.Length; i++) + { + var field = fields[i]; + var fieldType = field.FieldType; + var attr = field.GetCustomAttribute(); + if (attr != null) + { + var value = attr.Value; + if (value != null && value.GetType() != fieldType) + value = Convert.ChangeType(value, fieldType); + field.SetValue(obj, value); + } + else if (fieldType.IsValueType) + { + var fieldValue = Activator.CreateInstance(fieldType); + InitStructure(fieldValue, fieldType); + field.SetValue(obj, fieldValue); + } + } + } } }