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