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);
+ }
+ }
+ }
}
}