diff --git a/SMCode/SM.Base/PostEffects/BloomEffect.cs b/SMCode/SM.Base/PostEffects/BloomEffect.cs
index f2d108f..a68552a 100644
--- a/SMCode/SM.Base/PostEffects/BloomEffect.cs
+++ b/SMCode/SM.Base/PostEffects/BloomEffect.cs
@@ -15,6 +15,8 @@ namespace SM.Base.PostEffects
{
public class BloomEffect : PostProcessEffect
{
+ private static BezierCurve _defaultCurve = new BezierCurve(Vector2.UnitY, new Vector2(0.32f, 1), new Vector2(0.432f, 0), new Vector2(1,0));
+
private const float _defaultTextureScale = .75f;
private static readonly BezierCurve _defaultCurve = new BezierCurve(Vector2.UnitY, new Vector2(0.32f, 1),
@@ -39,10 +41,9 @@ namespace SM.Base.PostEffects
private BezierCurve _weightCurve;
private float[] _weights;
- private ColorAttachment _xBuffer;
- private ColorAttachment _yBuffer;
- public TextureBase AmountMap;
- public TextureTransformation AmountTransform = new TextureTransformation();
+ public int Iterations = 1;
+ public float Threshold = .8f;
+ public float Power = 1;
public bool Enable = true;
diff --git a/SMCode/SM.Base/SM.Base.csproj b/SMCode/SM.Base/SM.Base.csproj
index 99268ba..e804a2f 100644
--- a/SMCode/SM.Base/SM.Base.csproj
+++ b/SMCode/SM.Base/SM.Base.csproj
@@ -65,6 +65,7 @@
+
@@ -75,6 +76,7 @@
+
diff --git a/SMCode/SM.Base/Scene/GenericItemCollection.cs b/SMCode/SM.Base/Scene/GenericItemCollection.cs
index 2468914..0b341aa 100644
--- a/SMCode/SM.Base/Scene/GenericItemCollection.cs
+++ b/SMCode/SM.Base/Scene/GenericItemCollection.cs
@@ -3,7 +3,7 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using SM.Base.Drawing;
-using SM.Base.Window;
+using SM.Base.Windows;
#endregion
@@ -12,9 +12,9 @@ namespace SM.Base.Scene
///
/// Contains a list of show items.
///
- public abstract class GenericItemCollection : List, IShowItem, IShowCollection, IScriptable
+ public abstract class GenericItemCollection : List, IShowItem, IShowCollection, IScriptable, IFixedScriptable
{
- private readonly List _scriptableObjects = new List();
+ private List _scriptableObjects = new List();
///
/// Currently active script objects.
@@ -43,6 +43,16 @@ namespace SM.Base.Scene
///
public bool RenderActive { get; set; } = true;
+ public virtual void FixedUpdate(FixedUpdateContext context)
+ {
+ if (!Active || !UpdateActive) return;
+
+ for (int i = 0; i < _fixedScriptables.Count; i++)
+ {
+ _fixedScriptables[i].FixedUpdate(context);
+ }
+ }
+
///
public virtual void Draw(DrawContext context)
{
@@ -88,6 +98,8 @@ namespace SM.Base.Scene
if (item is IScriptable scriptable)
AddScript(scriptable);
+
+ if (item is IFixedScriptable fixedScriptable) _fixedScriptables.Add(fixedScriptable);
}
}
@@ -109,6 +121,7 @@ namespace SM.Base.Scene
public void AddScript(IScriptable item)
{
_scriptableObjects.Add(item);
+ if (item is IFixedScriptable fs) _fixedScriptables.Add(fs);
}
public void Remove(params IShowItem[] items)
@@ -119,6 +132,9 @@ namespace SM.Base.Scene
if (item is IScriptable scriptable)
RemoveScript(scriptable);
+
+ if (item is IFixedScriptable fixedScriptable)
+ _fixedScriptables.Remove(fixedScriptable);
}
}
@@ -140,6 +156,7 @@ namespace SM.Base.Scene
public void RemoveScript(IScriptable item)
{
_scriptableObjects.Remove(item);
+ if (item is IFixedScriptable fs) _fixedScriptables.Remove(fs);
}
public ICollection GetAllItems(bool includeCollections = false)
diff --git a/SMCode/SM.Base/Scene/GenericScene.cs b/SMCode/SM.Base/Scene/GenericScene.cs
index 57e7da6..c88af9f 100644
--- a/SMCode/SM.Base/Scene/GenericScene.cs
+++ b/SMCode/SM.Base/Scene/GenericScene.cs
@@ -110,6 +110,12 @@ namespace SM.Base.Scene
_hud?.Update(context);
}
+ public virtual void FixedUpdate(FixedUpdateContext context)
+ {
+ _objectCollection?.FixedUpdate(context);
+ _hud?.FixedUpdate(context);
+ }
+
///
/// Draws this scene.
///
diff --git a/SMCode/SM.Base/Scene/IFixedScriptable.cs b/SMCode/SM.Base/Scene/IFixedScriptable.cs
new file mode 100644
index 0000000..e29f4ac
--- /dev/null
+++ b/SMCode/SM.Base/Scene/IFixedScriptable.cs
@@ -0,0 +1,15 @@
+using SM.Base.Window.Contexts;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SM.Base.Scene
+{
+ public interface IFixedScriptable
+ {
+ void FixedUpdate(FixedUpdateContext context);
+
+ }
+}
diff --git a/SMCode/SM.Base/Shaders/MaterialShader.cs b/SMCode/SM.Base/Shaders/MaterialShader.cs
index 93e6323..470ad01 100644
--- a/SMCode/SM.Base/Shaders/MaterialShader.cs
+++ b/SMCode/SM.Base/Shaders/MaterialShader.cs
@@ -14,6 +14,8 @@ namespace SM.Base.Shaders
///
public abstract class MaterialShader : GenericShader
{
+ static bool _canLineWidth = true;
+
///
protected MaterialShader(string combinedData) : base(combinedData)
{
@@ -39,10 +41,20 @@ namespace SM.Base.Shaders
context.Mesh.Activate();
- if (context.Mesh is ILineMesh lineMesh)
- GL.LineWidth(context.Material.ShaderArguments.Get("LineWidth", lineMesh.LineWidth));
- else if (context.Material.ShaderArguments.ContainsKey("LineWidth"))
- GL.LineWidth((float) context.Material.ShaderArguments["LineWidth"]);
+ if (_canLineWidth)
+ {
+ try
+ {
+ if (context.Mesh is ILineMesh lineMesh)
+ GL.LineWidth(context.Material.ShaderArguments.Get("LineWidth", lineMesh.LineWidth));
+ else if (context.Material.ShaderArguments.ContainsKey("LineWidth"))
+ GL.LineWidth((float)context.Material.ShaderArguments["LineWidth"]);
+ }
+ catch
+ {
+ _canLineWidth = false;
+ }
+ }
if (context.Material.Blending)
{
diff --git a/SMCode/SM.Base/Utility/Deltatime.cs b/SMCode/SM.Base/Utility/Deltatime.cs
index 3e9248f..21a0171 100644
--- a/SMCode/SM.Base/Utility/Deltatime.cs
+++ b/SMCode/SM.Base/Utility/Deltatime.cs
@@ -17,6 +17,24 @@
///
public bool UseRender;
+
+ ///
+ /// The current update delta time.
+ ///
+ public static float UpdateDelta { get; internal set; }
+
+ public static float FixedUpdateDelta { get; set; }
+
+ ///
+ /// The current render delta time.
+ ///
+ public static float RenderDelta { get; internal set; }
+
+ ///
+ /// The calculated delta time.
+ ///
+ public float DeltaTime => (UseRender ? RenderDelta : UpdateDelta) * Scale;
+
///
/// Creates a delta time assistant.
///
@@ -30,20 +48,5 @@
UseRender = useRender;
Scale = scale;
}
-
- ///
- /// The current update delta time.
- ///
- public static float UpdateDelta { get; internal set; }
-
- ///
- /// The current render delta time.
- ///
- public static float RenderDelta { get; internal set; }
-
- ///
- /// The calculated delta time.
- ///
- public float DeltaTime => (UseRender ? RenderDelta : UpdateDelta) * Scale;
}
}
\ No newline at end of file
diff --git a/SMCode/SM.Base/Window/Contexts/FixedUpdateContext.cs b/SMCode/SM.Base/Window/Contexts/FixedUpdateContext.cs
new file mode 100644
index 0000000..f2b22e7
--- /dev/null
+++ b/SMCode/SM.Base/Window/Contexts/FixedUpdateContext.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SM.Base.Window.Contexts
+{
+ public struct FixedUpdateContext
+ {
+
+ }
+}
diff --git a/SMCode/SM.Base/Window/GLWindow.cs b/SMCode/SM.Base/Window/GLWindow.cs
index 2df6521..cb72eab 100644
--- a/SMCode/SM.Base/Window/GLWindow.cs
+++ b/SMCode/SM.Base/Window/GLWindow.cs
@@ -6,7 +6,9 @@ using OpenTK;
using OpenTK.Graphics;
using OpenTK.Input;
using SM.Base.Scene;
+using SM.Base.Window.Contexts;
using SM.OGL;
+using SM.Utility;
using Mouse = SM.Base.Controls.Mouse;
#endregion
@@ -16,6 +18,7 @@ namespace SM.Base.Window
public class GLWindow : GameWindow, IGenericWindow
{
private Vector2 _flagWindowSize;
+ private Thread _fixedUpdateThread;
public WindowFlags WindowFlags;
@@ -149,6 +152,47 @@ namespace SM.Base.Window
Mouse.MouseMoveEvent(e, this);
}
+ protected override void OnClosing(CancelEventArgs e)
+ {
+ base.OnClosing(e);
+ _fixedUpdateThread.Abort();
+ }
+
+ public void Update(UpdateContext context)
+ {
+
+ }
+
+ public void ApplySetup(ISetup setup)
+ {
+ AppliedSetup = setup;
+ setup.Applied(this);
+ }
+
+ public void SetScene(GenericScene scene)
+ {
+ if (Loading)
+ {
+ Loaded += window => SetScene(scene);
+ return;
+ }
+
+ WindowCode.PrepareScene(this, scene);
+ CurrentScene = scene;
+ }
+
+ public void SetRenderPipeline(RenderPipeline renderPipeline)
+ {
+ if (Loading)
+ {
+ Loaded += window => SetRenderPipeline(renderPipeline);
+ return;
+ }
+
+ WindowCode.PreparePipeline(this, renderPipeline);
+ CurrentRenderPipeline = renderPipeline;
+ }
+
public void ChangeWindowFlag(WindowFlags newFlag)
{
WindowFlags = newFlag;
@@ -175,12 +219,29 @@ namespace SM.Base.Window
default:
throw new ArgumentOutOfRangeException(nameof(newFlag), newFlag, null);
}
+ }
- if (newFlag == WindowFlags.BorderlessWindow)
+ public void RunFixedUpdate(float updatesPerSecond)
+ {
+ Deltatime.FixedUpdateDelta = 1 / (float)updatesPerSecond;
+
+ _fixedUpdateThread = new Thread(ExecuteFixedUpdate);
+ _fixedUpdateThread.Start();
+ }
+
+ private void ExecuteFixedUpdate()
+ {
+ Stopwatch deltaStop = new Stopwatch();
+ while (Thread.CurrentThread.ThreadState != System.Threading.ThreadState.AbortRequested)
{
- WindowBorder = WindowBorder.Hidden;
- X = Screen.PrimaryScreen.Bounds.X;
- Y = Screen.PrimaryScreen.Bounds.Y;
+ deltaStop.Restart();
+
+ FixedUpdateContext context = new FixedUpdateContext();
+
+ CurrentScene?.FixedUpdate(context);
+
+ long delta = deltaStop.ElapsedMilliseconds;
+ Thread.Sleep(Math.Max((int)(Deltatime.FixedUpdateDelta * 1000) - (int)delta, 0));
}
}
}
diff --git a/SM_TEST/Program.cs b/SM_TEST/Program.cs
index fcb8015..ecceac9 100644
--- a/SM_TEST/Program.cs
+++ b/SM_TEST/Program.cs
@@ -53,7 +53,7 @@ namespace SM_TEST
DrawObject2D box = new DrawObject2D();
scene.Objects.Add(box);
- DrawText text = new DrawText(font, "Text");
+ DrawText text = new DrawText(font, "Test Text");
text.Transform.Position.Set(50, 0);
text.Transform.Size.Set(2);
scene.Objects.Add(text);
diff --git a/SM_TEST/TestRenderPipeline.cs b/SM_TEST/TestRenderPipeline.cs
index 0a4512f..c2e5c5f 100644
--- a/SM_TEST/TestRenderPipeline.cs
+++ b/SM_TEST/TestRenderPipeline.cs
@@ -17,9 +17,12 @@ namespace SM_TEST
_postBuffer = CreateWindowFramebuffer();
Framebuffers.Add(_postBuffer);
+ _bloom = new BloomEffect(hdr: true)
+ {
+ Threshold = .8f,
+ };
- _bloom = new BloomEffect(_postBuffer, hdr: true);
_bloom.Initilize(this);
base.Initialization();
}