From 924bde233b174bd362ecc3ac06377ca235993cac Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Thu, 14 Sep 2023 22:16:16 +0100 Subject: [PATCH 01/11] Updates the project manifest, merges render cores and renderers --- CorgEng.Core/CorgEng.Core.csproj | 20 +++++ CorgEng.Core/CorgEngMain.cs | 85 +++++++++++++++---- CorgEng.Core/Rendering/RenderCore.cs | 9 +- CorgEng.GenericInterfaces/Core/IRenderCore.cs | 49 ----------- .../Rendering/Renderers/IRenderer.cs | 43 +++++++++- .../RenderCores/DefaultRenderCore.cs | 27 ++++++ .../RenderCores/DefaultRenderCoreProvider.cs | 19 +++++ 7 files changed, 180 insertions(+), 72 deletions(-) delete mode 100644 CorgEng.GenericInterfaces/Core/IRenderCore.cs create mode 100644 CorgEng.Rendering/RenderCores/DefaultRenderCore.cs create mode 100644 CorgEng.Rendering/RenderCores/DefaultRenderCoreProvider.cs diff --git a/CorgEng.Core/CorgEng.Core.csproj b/CorgEng.Core/CorgEng.Core.csproj index a9aaf6a5..cec95cc9 100644 --- a/CorgEng.Core/CorgEng.Core.csproj +++ b/CorgEng.Core/CorgEng.Core.csproj @@ -5,6 +5,16 @@ false AnyCPU;ARM32;ARM64 True + 2.0.0 + CorgEng Core + PowerfulBacon + README.md + https://github.com/PowerfulBacon/CorgEng + git + game-engine + Copyright owned by PowerfulBacon. See EULA + LICENSE + True bin\x64\Debug\ @@ -43,6 +53,16 @@ Always + + + True + \ + + + True + \ + + diff --git a/CorgEng.Core/CorgEngMain.cs b/CorgEng.Core/CorgEngMain.cs index a43c4fa2..7a540866 100644 --- a/CorgEng.Core/CorgEngMain.cs +++ b/CorgEng.Core/CorgEngMain.cs @@ -13,6 +13,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.Loader; using System.Threading.Tasks; using System.Xml.Linq; @@ -30,9 +31,22 @@ public static class CorgEngMain private static RenderMaster InternalRenderMaster { get; set; } /// - /// The main render core currently in use by the renderer + /// The render cores that are currently being used by the renderer. + /// If none is provided then a renderer provided one will be given which just draws things on its plane and performs + /// no other special effects. /// - public static RenderCore MainRenderCore { get; private set; } + private static ConcurrentDictionary renderCores { get; } = new ConcurrentDictionary(); + + /// + /// Render planes that are staged to start rendering + /// + private static SortedList stagedRenderPlanes = new SortedList(); + + /// + /// A sorted list containing the planes that are currently drawing directly to the screen. + /// Planes are drawn in order of layer when they aren't drawn to another surface first. + /// + private static SortedList renderingPlanes = new SortedList(); /// /// The window associated with the CorgEng application @@ -111,8 +125,9 @@ public static void Initialize(bool disableRendering = false) InternalRenderMaster = new RenderMaster(); InternalRenderMaster.Initialize(); Logger?.WriteLine("Successfully initialized render master", LogType.DEBUG); - //Bind the render master size to the game window size - GameWindow.OnWindowResized += InternalRenderMaster.SetWindowRenderSize; + //Bind the render master size to the game window + GameWindow.OnWindowResized += InternalRenderMaster.SetWindowRenderSize; + GameWindow.OnWindowResized += activeSizeDelegate; //Load non-priority modules ModuleInit(); } @@ -151,6 +166,15 @@ public static void TransferToRenderingThread() while (!GameWindow.ShouldClose()) { lastFrameTime = Glfw.Time; + // Move the staged rendering planes into the active queue + lock (stagedRenderPlanes) + { + foreach (var stagedPlane in stagedRenderPlanes) + { + renderingPlanes.TryAdd(stagedPlane.Key, stagedPlane.Value); + } + stagedRenderPlanes.Clear(); + } //Trigger any render thread code if (!queuedActions.IsEmpty) { @@ -173,13 +197,15 @@ public static void TransferToRenderingThread() Glfw.PollEvents(); //Handle key events GameWindow.Update(); - //Check to ensure we have a render core - if (MainRenderCore == null) - throw new NullRenderCoreException("The main CorgEng render core is not set! Use CorgEng.SetRenderCore(RenderCore) to set the primary render core."); - //Process the main render core - MainRenderCore.DoRender(); - //Pass the output image from the render core to the internal renderer - InternalRenderMaster.RenderImageToScreen(MainRenderCore); + // Perform rendering of the render planes that are not diverted to another source + foreach (var renderPlane in renderingPlanes.Values) + { + // Process the actual render + renderPlane.DoRender(); + //Pass the output image from the render core to the internal renderer + InternalRenderMaster.RenderImageToScreen(renderPlane); + } + // Update the delta time DeltaTime = Glfw.Time - lastFrameTime; #if PERFORMANCE total += DeltaTime; @@ -200,19 +226,42 @@ public static void SetMainCamera(ICamera camera) MainCamera = camera; } - private static CorgEngWindow.WindowResizeDelegate activeSizeDelegate; + /// + /// Resize all of the contained render cores when the screen size changes + /// + private static CorgEngWindow.WindowResizeDelegate activeSizeDelegate = (width, height) => { + foreach (RenderCore renderCore in renderCores.Values) + { + renderCore.Resize(width, height); + } + }; /// /// Sets the CorgEng program's render core. /// - public static void SetRenderCore(RenderCore newRenderCore) + public static void SetPlaneRenderCore(int renderCorePlane, RenderCore newRenderCore) { - MainRenderCore = newRenderCore; - MainRenderCore.Initialize(); - GameWindow.OnWindowResized -= activeSizeDelegate; - activeSizeDelegate = MainRenderCore.Resize; - GameWindow.OnWindowResized += activeSizeDelegate; + newRenderCore.Initialize(); + renderCores.AddOrUpdate(renderCorePlane, newRenderCore, (plane, oldCore) => { + oldCore.Dispose(); + return newRenderCore; + }); } + /// + /// Get the render core with the provided plane number. + /// If no render core has been set for this plane, one will be created. + /// + /// + /// + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RenderCore GetRenderCore(int renderCorePlane) + { + return renderCores.GetOrAdd(renderCorePlane, plane => { + // Fetch a default render core implementation + //return new RenderCore(); + }); + } /// /// Shuts down and cleans up all resources used by CorgEng diff --git a/CorgEng.Core/Rendering/RenderCore.cs b/CorgEng.Core/Rendering/RenderCore.cs index 6d8966da..9448d96b 100644 --- a/CorgEng.Core/Rendering/RenderCore.cs +++ b/CorgEng.Core/Rendering/RenderCore.cs @@ -8,7 +8,7 @@ namespace CorgEng.Core.Rendering { - public abstract class RenderCore : IRenderCore + public abstract class RenderCore : IRenderCore, IDisposable { [UsingDependency] @@ -304,5 +304,10 @@ public unsafe void DrawToBuffer(uint buffer, int drawX, int drawY, int bufferWid SwitchDepthMode(prevBlend); SwitchBackColour(prevColour); } - } + + /// + /// Dispose the render core and cleanup any resources + /// + public abstract void Dispose(); + } } diff --git a/CorgEng.GenericInterfaces/Core/IRenderCore.cs b/CorgEng.GenericInterfaces/Core/IRenderCore.cs deleted file mode 100644 index db9077a4..00000000 --- a/CorgEng.GenericInterfaces/Core/IRenderCore.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CorgEng.GenericInterfaces.Core -{ - public interface IRenderCore - { - - int Width { get; } - - int Height { get; } - - /// - /// The uint of the frame buffer - /// - uint FrameBufferUint { get; } - - /// - /// The uint of our render texture - /// - uint RenderTextureUint { get; } - - /// - /// Initialize the render core, run one time at the start. - /// - void Initialize(); - - /// - /// Perform rendering - /// - void DoRender(); - - /// - /// Draws the rendered frame buffer to the screen (Framebuffer 0) - /// - void DrawToBuffer(uint buffer, int drawX, int drawY, int bufferWidth, int bufferHeight); - - /// - /// Resize the render core to the specified size. - /// - /// The width in pixels of the new render core. - /// The height in pixels of the new render core. - void Resize(int width, int height); - - } -} diff --git a/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs b/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs index 6d1384f4..b63655bb 100644 --- a/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs +++ b/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs @@ -9,11 +9,48 @@ namespace CorgEng.GenericInterfaces.Rendering.Renderers public interface IRenderer { - uint NetworkIdentifier { get; } + /// + /// The width in pixels of the renderer + /// + int Width { get; } - void Initialize(); + /// + /// The height in pixels of the renderer + /// + int Height { get; } + /// + /// The uint of the frame buffer + /// + uint FrameBufferUint { get; } + + /// + /// The uint of our render texture + /// + uint RenderTextureUint { get; } + + /// + /// Initialise the renderer + /// + void Initialize(); + + /// + /// Render the context of the renderer + /// + /// void Render(ICamera camera); - } + /// + /// Draws the rendered frame buffer to the screen (Framebuffer 0) + /// + void DrawToBuffer(uint buffer, int drawX, int drawY, int bufferWidth, int bufferHeight); + + /// + /// Resize the render core to the specified size. + /// + /// The width in pixels of the new render core. + /// The height in pixels of the new render core. + void Resize(int width, int height); + + } } diff --git a/CorgEng.Rendering/RenderCores/DefaultRenderCore.cs b/CorgEng.Rendering/RenderCores/DefaultRenderCore.cs new file mode 100644 index 00000000..27fd1bd2 --- /dev/null +++ b/CorgEng.Rendering/RenderCores/DefaultRenderCore.cs @@ -0,0 +1,27 @@ +using CorgEng.Core.Rendering; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CorgEng.Rendering.RenderCores +{ + internal class DefaultRenderCore : RenderCore + { + public override void Dispose() + { + throw new NotImplementedException(); + } + + public override void Initialize() + { + throw new NotImplementedException(); + } + + public override void PerformRender() + { + throw new NotImplementedException(); + } + } +} diff --git a/CorgEng.Rendering/RenderCores/DefaultRenderCoreProvider.cs b/CorgEng.Rendering/RenderCores/DefaultRenderCoreProvider.cs new file mode 100644 index 00000000..3faf1359 --- /dev/null +++ b/CorgEng.Rendering/RenderCores/DefaultRenderCoreProvider.cs @@ -0,0 +1,19 @@ +using CorgEng.DependencyInjection.Dependencies; +using CorgEng.GenericInterfaces.Core; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CorgEng.Rendering.RenderCores +{ + [Dependency(priority = 50)] + internal class DefaultRenderCoreProvider : IRenderCoreProvider + { + public IRenderCore CreateDefaultRenderCore() + { + return new DefaultRenderCore(); + } + } +} From 5e5ad70ac7c270d7fd765245fb21f912b7f83732 Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Fri, 15 Sep 2023 14:37:27 +0100 Subject: [PATCH 02/11] Render core reworks --- CorgEng.Core/CorgEng.Core.sln | 22 -- CorgEng.Core/CorgEngMain.cs | 28 +- CorgEng.Core/Rendering/RenderCore.cs | 313 ------------------ CorgEng.Core/Rendering/RenderMaster.cs | 5 +- .../SpriteRendering/SetSpriteRendererEvent.cs | 10 +- .../SpriteRendering/SpriteRenderComponent.cs | 9 +- CorgEng.Example.Server/Program.cs | 3 - .../RenderCores/ExampleRenderCore.cs | 65 ---- CorgEng.Example/Program.cs | 4 - .../Rendering/Icons/IIcon.cs | 2 +- .../Rendering/Icons/IIconFactory.cs | 2 +- .../Rendering/Renderers/IRenderer.cs | 7 +- .../IParallaxRendererFactory.cs | 2 +- .../SpriteRendering/ISpriteRendererFactory.cs | 2 +- .../RenderCores/LightingRenderCore.cs | 63 ---- .../RenderCores/LightingRenderer.cs | 27 ++ CorgEng.Lighting/Systems/LightingSystem.cs | 2 +- CorgEng.Rendering/Icons/Icon.cs | 17 +- CorgEng.Rendering/Icons/IconFactory.cs | 2 +- CorgEng.Rendering/InstancedRenderer.cs | 42 ++- CorgEng.Rendering/PlaneRenderer.cs | 313 ++++++++++++++++++ .../RenderCores/DefaultRenderCore.cs | 27 -- .../RenderCores/DefaultRenderCoreProvider.cs | 19 -- CorgEng.Rendering/RendererLookup.cs | 32 -- .../Parallax/ParallaxRenderer.cs | 2 - .../Parallax/ParallaxRendererFactory.cs | 4 +- .../SpriteRendering/SpriteBatch.cs | 2 +- .../SpriteRendering/SpriteRenderer.cs | 7 +- .../SpriteRendering/SpriteRendererFactory.cs | 4 +- CorgEng.Tests/Stubs/IRenderCoreStubFactory.cs | 18 - CorgEng.Tests/Stubs/RenderCoreStub.cs | 45 --- .../UserInterfaceBox.cs | 15 +- .../UserInterfaceComponent.cs | 29 +- .../UserInterfaceIcon.cs | 5 +- .../UserInterfaceText.cs | 5 +- 35 files changed, 448 insertions(+), 706 deletions(-) delete mode 100644 CorgEng.Core/Rendering/RenderCore.cs delete mode 100644 CorgEng.Example.Shared/RenderCores/ExampleRenderCore.cs delete mode 100644 CorgEng.Lighting/RenderCores/LightingRenderCore.cs create mode 100644 CorgEng.Lighting/RenderCores/LightingRenderer.cs create mode 100644 CorgEng.Rendering/PlaneRenderer.cs delete mode 100644 CorgEng.Rendering/RenderCores/DefaultRenderCore.cs delete mode 100644 CorgEng.Rendering/RenderCores/DefaultRenderCoreProvider.cs delete mode 100644 CorgEng.Rendering/RendererLookup.cs delete mode 100644 CorgEng.Tests/Stubs/IRenderCoreStubFactory.cs delete mode 100644 CorgEng.Tests/Stubs/RenderCoreStub.cs diff --git a/CorgEng.Core/CorgEng.Core.sln b/CorgEng.Core/CorgEng.Core.sln index af705004..5f1ee660 100644 --- a/CorgEng.Core/CorgEng.Core.sln +++ b/CorgEng.Core/CorgEng.Core.sln @@ -34,8 +34,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CorgEng.ContentLoading", ". EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CorgEng.MapLoading", "..\CorgEng.MapLoading\CorgEng.MapLoading.csproj", "{B324FB97-A466-4E19-BA67-9536023EE5B9}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoMap", "..\AutoMap\AutoMap.csproj", "{ADA9CC94-5705-499C-9C93-888E96F87DEA}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CorgEng.UserInterface", "..\CorgEng.UserInterface\CorgEng.UserInterface.csproj", "{19E048D9-1587-40CC-BEE3-E1883A21FEC8}" ProjectSection(ProjectDependencies) = postProject {BFC5583F-3A05-43E4-9D07-81D80B1EC685} = {BFC5583F-3A05-43E4-9D07-81D80B1EC685} @@ -331,26 +329,6 @@ Global {B324FB97-A466-4E19-BA67-9536023EE5B9}.Release|x64.Build.0 = Release|x64 {B324FB97-A466-4E19-BA67-9536023EE5B9}.Release|x86.ActiveCfg = Release|x86 {B324FB97-A466-4E19-BA67-9536023EE5B9}.Release|x86.Build.0 = Release|x86 - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Debug|ARM32.ActiveCfg = Debug|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Debug|ARM32.Build.0 = Debug|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Debug|ARM64.Build.0 = Debug|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Debug|x64.ActiveCfg = Debug|x64 - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Debug|x64.Build.0 = Debug|x64 - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Debug|x86.ActiveCfg = Debug|x86 - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Debug|x86.Build.0 = Debug|x86 - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Release|Any CPU.Build.0 = Release|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Release|ARM32.ActiveCfg = Release|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Release|ARM32.Build.0 = Release|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Release|ARM64.ActiveCfg = Release|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Release|ARM64.Build.0 = Release|Any CPU - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Release|x64.ActiveCfg = Release|x64 - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Release|x64.Build.0 = Release|x64 - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Release|x86.ActiveCfg = Release|x86 - {ADA9CC94-5705-499C-9C93-888E96F87DEA}.Release|x86.Build.0 = Release|x86 {19E048D9-1587-40CC-BEE3-E1883A21FEC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19E048D9-1587-40CC-BEE3-E1883A21FEC8}.Debug|Any CPU.Build.0 = Debug|Any CPU {19E048D9-1587-40CC-BEE3-E1883A21FEC8}.Debug|ARM32.ActiveCfg = Debug|Any CPU diff --git a/CorgEng.Core/CorgEngMain.cs b/CorgEng.Core/CorgEngMain.cs index 7a540866..9e118a03 100644 --- a/CorgEng.Core/CorgEngMain.cs +++ b/CorgEng.Core/CorgEngMain.cs @@ -6,6 +6,8 @@ using CorgEng.Core.Rendering.Exceptions; using CorgEng.GenericInterfaces.Logging; using CorgEng.GenericInterfaces.Rendering; +using CorgEng.GenericInterfaces.Rendering.Renderers; +using CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering; using GLFW; using System; using System.Collections.Concurrent; @@ -23,6 +25,12 @@ namespace CorgEng.Core public static class CorgEngMain { + /// + /// Get a dependency for a default sprite renderer + /// + [UsingDependency] + private static ISpriteRendererFactory SpriteRendererFactory = null!; + /// /// The internal render master. /// Handles transfering iamges generated by the RenderCore to @@ -35,18 +43,18 @@ public static class CorgEngMain /// If none is provided then a renderer provided one will be given which just draws things on its plane and performs /// no other special effects. /// - private static ConcurrentDictionary renderCores { get; } = new ConcurrentDictionary(); + private static ConcurrentDictionary renderCores { get; } = new ConcurrentDictionary(); /// /// Render planes that are staged to start rendering /// - private static SortedList stagedRenderPlanes = new SortedList(); + private static SortedList stagedRenderPlanes = new SortedList(); /// /// A sorted list containing the planes that are currently drawing directly to the screen. /// Planes are drawn in order of layer when they aren't drawn to another surface first. /// - private static SortedList renderingPlanes = new SortedList(); + private static SortedList renderingPlanes = new SortedList(); /// /// The window associated with the CorgEng application @@ -201,7 +209,7 @@ public static void TransferToRenderingThread() foreach (var renderPlane in renderingPlanes.Values) { // Process the actual render - renderPlane.DoRender(); + renderPlane.Render(MainCamera); //Pass the output image from the render core to the internal renderer InternalRenderMaster.RenderImageToScreen(renderPlane); } @@ -230,7 +238,7 @@ public static void SetMainCamera(ICamera camera) /// Resize all of the contained render cores when the screen size changes /// private static CorgEngWindow.WindowResizeDelegate activeSizeDelegate = (width, height) => { - foreach (RenderCore renderCore in renderCores.Values) + foreach (IRenderer renderCore in renderCores.Values) { renderCore.Resize(width, height); } @@ -239,7 +247,7 @@ public static void SetMainCamera(ICamera camera) /// /// Sets the CorgEng program's render core. /// - public static void SetPlaneRenderCore(int renderCorePlane, RenderCore newRenderCore) + public static void SetPlaneRenderCore(int renderCorePlane, IRenderer newRenderCore) { newRenderCore.Initialize(); renderCores.AddOrUpdate(renderCorePlane, newRenderCore, (plane, oldCore) => { @@ -255,12 +263,14 @@ public static void SetPlaneRenderCore(int renderCorePlane, RenderCore newRenderC /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static RenderCore GetRenderCore(int renderCorePlane) + public static IRenderer GetRendererForPlane(int renderCorePlane) { return renderCores.GetOrAdd(renderCorePlane, plane => { // Fetch a default render core implementation - //return new RenderCore(); - }); + var spriteRenderer = SpriteRendererFactory.CreateSpriteRenderer(plane); + stagedRenderPlanes.Add(plane, spriteRenderer); + return spriteRenderer; + }); } /// diff --git a/CorgEng.Core/Rendering/RenderCore.cs b/CorgEng.Core/Rendering/RenderCore.cs deleted file mode 100644 index 9448d96b..00000000 --- a/CorgEng.Core/Rendering/RenderCore.cs +++ /dev/null @@ -1,313 +0,0 @@ -using CorgEng.Core.Dependencies; -using CorgEng.GenericInterfaces.Core; -using CorgEng.GenericInterfaces.Logging; -using CorgEng.GenericInterfaces.Rendering.Shaders; -using CorgEng.GenericInterfaces.UtilityTypes; -using System; -using static OpenGL.Gl; - -namespace CorgEng.Core.Rendering -{ - public abstract class RenderCore : IRenderCore, IDisposable - { - - [UsingDependency] - private static ILogger Logger; - - //Fetch shader loading from some dependency somewhere - [UsingDependency] - private static IShaderFactory ShaderFactory; - - [UsingDependency] - protected static IColourFactory ColourFactory; - - private static float[] quadVertices = { - 1, 1, 0, - 1, -1, 0, - -1, 1, 0, - -1, 1, 0, - 1, -1, 0, - -1, -1, 0 - }; - - private static bool initialized = false; - - //The vertex array and buffer objects - private static uint vertexArray; - private static uint vertexBuffer; - - private static IShaderSet shaderSet; - - private static int textureUniformLocation; - - //Create a program for rendering - private static uint programUint; - - /// - /// The uint of the frame buffer - /// - public uint FrameBufferUint { get; } - - /// - /// The uint of the render buffer - /// - public uint RenderBufferUint { get; } - - /// - /// The uint of our render texture - /// - public uint RenderTextureUint { get; } - - public int Width { get; internal set; } = 1920; - - public int Height { get; internal set; } = 1080; - - private static IColour _currentBackColour; - private static DepthModes _currentDepthMode = DepthModes.KEEP_DEPTH; - private static RenderModes _currentBlendMode = RenderModes.DEFAULT; - - /// - /// The render mode to use when drawing this render core to the framebuffer. - /// - public virtual RenderModes DrawMode { get; } = RenderModes.DEFAULT; - - /// - /// The render mode to use when rendering elements on to the render core. - /// - public virtual RenderModes BlendMode { get; } = RenderModes.DEFAULT; - - /// - /// Should we keep depth? - /// Ignoring depth causes the render core to overlay on whatever it is being drawn on. - /// - public virtual DepthModes DepthMode { get; } = DepthModes.KEEP_DEPTH; - - /// - /// The path of the shaders to use. - /// Only accessed during initialisation. - /// - public virtual string ShaderPath => "CoreShader"; - - public virtual IColour BackColour { get; } = ColourFactory.GetColour(0, 0, 0, 0); - - public unsafe RenderCore() - { - if (!CorgEngMain.IsRendering) - return; - //Generate a render buff - RenderBufferUint = glGenRenderbuffer(); - glBindRenderbuffer(RenderBufferUint); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, Width, Height); - //Generate a frame buffer - FrameBufferUint = glGenFramebuffer(); - glBindFramebuffer(GL_FRAMEBUFFER, FrameBufferUint); - //Create a render texture - glActiveTexture(GL_TEXTURE0); - RenderTextureUint = glGenTexture(); - //Bind the created texture so we can modify it - glBindTexture(GL_TEXTURE_2D, RenderTextureUint); - //Load the texture scale - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - //Set the texture parameters - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - //Bind the render depth buffer to the framebuffer - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, RenderBufferUint); - //Bind the framebuffer to the texture - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, RenderTextureUint, 0); - //Check for issues - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - { - //TODO: Introduce a rendering mode that bypasses framebuffers and just draws directly to the screen. - //Slightly broken is better than nothing. - Logger.WriteLine("WARNING: FRAMEBUFFER ERROR. Your GPU may not support this application!", LogType.ERROR); - } - //Log creation - Logger?.WriteLine($"Created RenderCore, rendering to framebuffer {FrameBufferUint} outputting texture to {RenderTextureUint}", LogType.DEBUG); - } - - public unsafe static void SetupRendering() - { - //Create stuff we need for screen rendering (static) - if (!initialized) - { - Logger?.WriteLine("Initialized RenderCore static requirements.", LogType.LOG); - //Mark initialized to be true. - initialized = true; - //create and link a program - programUint = glCreateProgram(); - //Start using the program: All operations will affect this program - glUseProgram(programUint); - //Generate a vertex array and bind it - vertexArray = glGenVertexArray(); - glBindVertexArray(vertexArray); - //Create and bind the vertex buffer - vertexBuffer = glGenBuffer(); - glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); - - //Put data into the buffer - fixed (float* vertexPointer = &quadVertices[0]) - { - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * quadVertices.Length, vertexPointer, GL_STATIC_DRAW); - } - //Create the shaders - shaderSet = ShaderFactory.CreateShaderSet("CoreShader"); - //Get the uniform location of the shaders - shaderSet.AttachShaders(programUint); - glLinkProgram(programUint); - //Fetch uniform locations - textureUniformLocation = glGetUniformLocation(programUint, "renderTexture"); - } - } - - public void PreRender() - { - //Bind our framebuffer to render to - glBindFramebuffer(GL_FRAMEBUFFER, FrameBufferUint); - //Clear the backbuffer - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - //Set the viewport - glViewport(0, 0, Width, Height); - } - - /// - /// Do rendering - /// - public void DoRender() - { - RenderModes prev = SwitchBlendMode(BlendMode); - DepthModes prevDepth = SwitchDepthMode(DepthMode); - IColour prevColour = SwitchBackColour(BackColour); - PreRender(); - PerformRender(); - SwitchBlendMode(prev); - SwitchDepthMode(prevDepth); - SwitchBackColour(prevColour); - } - - protected static RenderModes SwitchBlendMode(RenderModes newMode) - { - if (newMode == _currentBlendMode) - return newMode; - RenderModes prevMode = _currentBlendMode; - _currentBlendMode = newMode; - switch (_currentBlendMode) - { - case RenderModes.DEFAULT: - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - break; - case RenderModes.MULTIPLY: - glBlendFunc(GL_DST_COLOR, GL_ZERO); - break; - case RenderModes.ADDITIVE: - glBlendFunc(GL_ONE, GL_ONE); - break; - } - return prevMode; - } - - protected static DepthModes SwitchDepthMode(DepthModes newMode) - { - if (newMode == _currentDepthMode) - return newMode; - DepthModes prevMode = _currentDepthMode; - _currentDepthMode = newMode; - switch (_currentDepthMode) - { - case DepthModes.KEEP_DEPTH: - glDepthFunc(GL_LEQUAL); - break; - case DepthModes.IGNORE_DEPTH: - glDepthFunc(GL_ALWAYS); - break; - } - return prevMode; - } - - protected static IColour SwitchBackColour(IColour newColour) - { - if (newColour == null || newColour.Equals(_currentBackColour)) - return newColour; - IColour prevCol = _currentBackColour; - _currentBackColour = newColour; - glClearColor(newColour.Red, newColour.Green, newColour.Blue, newColour.Alpha); - return prevCol; - } - - /// - /// Called when the render core is initialized - /// - public abstract void Initialize(); - - /// - /// Perform rendering - /// - public abstract void PerformRender(); - - public unsafe void Resize(int width, int height) - { - //Set the new width - Width = width; - Height = height; - //Log - Logger?.WriteLine($"Render core resized to {Width}x{Height}", LogType.DEBUG); - if (!CorgEngMain.IsRendering) - return; - //Update the tex image - //Bind the created texture so we can modify it - glBindTexture(GL_TEXTURE_2D, RenderTextureUint); - //Load the texture scale - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - //Set the texture parameters - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } - - public unsafe void DrawToBuffer(uint buffer, int drawX, int drawY, int bufferWidth, int bufferHeight) - { - //Reset the framebuffer (We want to draw to the screen, not a frame buffer) - glBindFramebuffer(GL_FRAMEBUFFER, buffer); - //Draw to full screen - glViewport(drawX, drawY, bufferWidth, bufferHeight); - - //Setup blending - RenderModes prevRender = SwitchBlendMode(DrawMode); - DepthModes prevBlend = SwitchDepthMode(DepthMode); - IColour prevColour = SwitchBackColour(BackColour); - - //Set the using program to our program uint - glUseProgram(programUint); - //Bind uniform variables - glUniform1ui(textureUniformLocation, 0); - //Bind the vertex buffer - glEnableVertexAttribArray(0); - glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); - glVertexAttribPointer( - 0, //Attribute - Where the layout location is in the vertex shader - 3, //Size of the triangles (3 sides) - GL_FLOAT, //Type (Floats) - false, //Normalized (nope) - 0, //Stride (0) - NULL //Array buffer offset (null) - ); - //Set the vertex attrib divisor - glVertexAttribDivisor(0, 0); - //Bind the texture - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, RenderTextureUint); - //Draw - glDrawArrays(GL_TRIANGLES, 0, 6); - //Disable the vertex attrib array - glDisableVertexAttribArray(0); - - SwitchBlendMode(prevRender); - SwitchDepthMode(prevBlend); - SwitchBackColour(prevColour); - } - - /// - /// Dispose the render core and cleanup any resources - /// - public abstract void Dispose(); - } -} diff --git a/CorgEng.Core/Rendering/RenderMaster.cs b/CorgEng.Core/Rendering/RenderMaster.cs index e7c94b39..873f73f9 100644 --- a/CorgEng.Core/Rendering/RenderMaster.cs +++ b/CorgEng.Core/Rendering/RenderMaster.cs @@ -1,4 +1,5 @@ using CorgEng.Core.Dependencies; +using CorgEng.GenericInterfaces.Rendering.Renderers; using CorgEng.GenericInterfaces.Rendering.Shaders; using System; using static OpenGL.Gl; @@ -19,8 +20,6 @@ public void Initialize() { //Setup the global GL flags SetGlobalGlFlags(); - //Initialize render core - RenderCore.SetupRendering(); } private void SetGlobalGlFlags() @@ -51,7 +50,7 @@ private void SetGlobalGlFlags() /// /// Renders an image outputted by a render core to the screen. /// - public unsafe void RenderImageToScreen(RenderCore renderCore) + public unsafe void RenderImageToScreen(IRenderer renderCore) { //Reset the framebuffer (We want to draw to the screen, not a frame buffer) glBindFramebuffer(GL_FRAMEBUFFER, 0); diff --git a/CorgEng.EntityComponentSystem/Implementations/Rendering/SpriteRendering/SetSpriteRendererEvent.cs b/CorgEng.EntityComponentSystem/Implementations/Rendering/SpriteRendering/SetSpriteRendererEvent.cs index 53839f6a..210c43d9 100644 --- a/CorgEng.EntityComponentSystem/Implementations/Rendering/SpriteRendering/SetSpriteRendererEvent.cs +++ b/CorgEng.EntityComponentSystem/Implementations/Rendering/SpriteRendering/SetSpriteRendererEvent.cs @@ -21,21 +21,21 @@ public class SetSpriteRendererEvent : INetworkedEvent [UsingDependency] private static IAutoSerialiser AutoSerialiser; - public uint Target { get; set; } + public int Target { get; set; } - public SetSpriteRendererEvent(uint target) + public SetSpriteRendererEvent(int target) { Target = target; } public SetSpriteRendererEvent(ISpriteRenderer target) { - Target = target.NetworkIdentifier; + Target = target.Plane; } public void Deserialise(BinaryReader reader) { - Target = reader.ReadUInt32(); + Target = reader.ReadInt32(); } public void Serialise(BinaryWriter writer) @@ -45,7 +45,7 @@ public void Serialise(BinaryWriter writer) public int SerialisedLength() { - return sizeof(uint); + return sizeof(int); } } } diff --git a/CorgEng.EntityComponentSystem/Implementations/Rendering/SpriteRendering/SpriteRenderComponent.cs b/CorgEng.EntityComponentSystem/Implementations/Rendering/SpriteRendering/SpriteRenderComponent.cs index 75614292..64da1cdc 100644 --- a/CorgEng.EntityComponentSystem/Implementations/Rendering/SpriteRendering/SpriteRenderComponent.cs +++ b/CorgEng.EntityComponentSystem/Implementations/Rendering/SpriteRendering/SpriteRenderComponent.cs @@ -1,4 +1,5 @@ -using CorgEng.EntityComponentSystem.Components; +using CorgEng.Core; +using CorgEng.EntityComponentSystem.Components; using CorgEng.GenericInterfaces.ContentLoading; using CorgEng.GenericInterfaces.Networking.Attributes; using CorgEng.GenericInterfaces.Rendering.Icons; @@ -49,7 +50,7 @@ public class SpriteRenderComponent : Component, IInstantiatable /// The identifier of the sprite renderer to use /// [NetworkSerialized] - public uint SpriteRendererIdentifier { get; set; } + public int SpriteRendererIdentifier { get; set; } /// /// Is the sprite currently being rendered @@ -58,7 +59,7 @@ public class SpriteRenderComponent : Component, IInstantiatable internal bool WantsToRender { get; set; } = true; - private uint cachedSpriteRendererIdentifier = 0; + private int cachedSpriteRendererIdentifier = 0; private ISpriteRenderer _spriteRenderer; @@ -70,7 +71,7 @@ public ISpriteRenderer SpriteRenderer return null; if (_spriteRenderer == null || cachedSpriteRendererIdentifier != SpriteRendererIdentifier) { - _spriteRenderer = RendererLookup.GetRendererByIdentifier(SpriteRendererIdentifier); + _spriteRenderer = (ISpriteRenderer)CorgEngMain.GetRendererForPlane(SpriteRendererIdentifier); cachedSpriteRendererIdentifier = SpriteRendererIdentifier; } return _spriteRenderer; diff --git a/CorgEng.Example.Server/Program.cs b/CorgEng.Example.Server/Program.cs index e96c09e8..2c5de9a9 100644 --- a/CorgEng.Example.Server/Program.cs +++ b/CorgEng.Example.Server/Program.cs @@ -14,7 +14,6 @@ using CorgEng.Example.Shared.Components.FollowMouseComponent; using CorgEng.Example.Shared.Components.Gravity; using CorgEng.Example.Shared.Components.SandFactory; -using CorgEng.Example.Shared.RenderCores; using CorgEng.GenericInterfaces.EntityComponentSystem; using CorgEng.GenericInterfaces.Logging; using CorgEng.GenericInterfaces.Networking.Config; @@ -76,8 +75,6 @@ static void Main(string[] args) #else CorgEngMain.Initialize(); - ExampleRenderCore erc = new ExampleRenderCore(); - CorgEngMain.SetRenderCore(erc); EntityFactory.CreateEmptyEntity(entity => { IIsometricCamera camera = IsometricCameraFactory.CreateCamera(); camera.Width = 30; diff --git a/CorgEng.Example.Shared/RenderCores/ExampleRenderCore.cs b/CorgEng.Example.Shared/RenderCores/ExampleRenderCore.cs deleted file mode 100644 index 5e618a2f..00000000 --- a/CorgEng.Example.Shared/RenderCores/ExampleRenderCore.cs +++ /dev/null @@ -1,65 +0,0 @@ -using CorgEng.Core; -using CorgEng.Core.Dependencies; -using CorgEng.Core.Rendering; -using CorgEng.EntityComponentSystem.Entities; -using CorgEng.GenericInterfaces.Font.Fonts; -using CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering; -using CorgEng.GenericInterfaces.Rendering.RenderObjects.SpriteRendering; -using CorgEng.GenericInterfaces.Rendering.Text; -using CorgEng.GenericInterfaces.Rendering.Textures; -using CorgEng.GenericInterfaces.UserInterface.Components; -using CorgEng.GenericInterfaces.UserInterface.Generators; -using CorgEng.Lighting.RenderCores; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CorgEng.Example.Shared.RenderCores -{ - public class ExampleRenderCore : RenderCore - { - - private Entity renderableEntity; - - [UsingDependency] - public static ISpriteRendererFactory SpriteRendererFactory; - - public ISpriteRenderer spriteRenderer; - - [UsingDependency] - public static ISpriteRenderObjectFactory spriteRenderObjectFactory; - - [UsingDependency] - public static ITextureFactory textureFactory; - - [UsingDependency] - public static IFontFactory FontFactory; - - [UsingDependency] - public static ITextObjectFactory TextObjectFactory; - - public override void Initialize() - { - - spriteRenderer = SpriteRendererFactory.CreateSpriteRenderer(1); - spriteRenderer?.Initialize(); - - IFont font = FontFactory.GetFont("CourierCode"); - ITextObject textObject = TextObjectFactory.CreateTextObject(spriteRenderer, font, "CorgEng.Font"); - textObject.StartRendering(); - - LightingRenderCore.Resolve(); - - - } - - public override void PerformRender() - { - spriteRenderer?.Render(CorgEngMain.MainCamera); - LightingRenderCore.Singleton.DoRender(); - LightingRenderCore.Singleton.DrawToBuffer(FrameBufferUint, 0, 0, Width, Height); - } - } -} diff --git a/CorgEng.Example/Program.cs b/CorgEng.Example/Program.cs index a9c1686f..3d5d32c8 100644 --- a/CorgEng.Example/Program.cs +++ b/CorgEng.Example/Program.cs @@ -1,7 +1,6 @@ using CorgEng.Core; using CorgEng.Core.Dependencies; using CorgEng.Example.Modules.CameraScroll; -using CorgEng.Example.Shared.RenderCores; using CorgEng.GenericInterfaces.Networking.Networking.Client; using CorgEng.GenericInterfaces.Rendering.Cameras.Isometric; using System.Threading; @@ -36,9 +35,6 @@ static void Main(string[] args) IIsometricCamera camera = isometricCameraFactory.CreateCamera(); CameraScrollSystem.IsometricCamera = camera; - ExampleRenderCore erc = new ExampleRenderCore(); - CorgEngMain.SetRenderCore(erc); - //Connect to our server NetworkingClient.AttemptConnection("127.0.0.1", 5000); diff --git a/CorgEng.GenericInterfaces/Rendering/Icons/IIcon.cs b/CorgEng.GenericInterfaces/Rendering/Icons/IIcon.cs index 08d28746..6a5cc182 100644 --- a/CorgEng.GenericInterfaces/Rendering/Icons/IIcon.cs +++ b/CorgEng.GenericInterfaces/Rendering/Icons/IIcon.cs @@ -47,7 +47,7 @@ public interface IIcon : ICustomSerialisationBehaviour /// /// The plane that this icon should be renderer on. /// - uint Plane { get; set; } + int Plane { get; set; } /// /// The renderer being used to render this icon. diff --git a/CorgEng.GenericInterfaces/Rendering/Icons/IIconFactory.cs b/CorgEng.GenericInterfaces/Rendering/Icons/IIconFactory.cs index 7e558f02..0b28d845 100644 --- a/CorgEng.GenericInterfaces/Rendering/Icons/IIconFactory.cs +++ b/CorgEng.GenericInterfaces/Rendering/Icons/IIconFactory.cs @@ -10,7 +10,7 @@ namespace CorgEng.GenericInterfaces.Rendering.Icons public interface IIconFactory { - IIcon CreateIcon(string name, float layer, uint plane); + IIcon CreateIcon(string name, float layer, int plane); } } diff --git a/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs b/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs index b63655bb..808f19d0 100644 --- a/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs +++ b/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs @@ -6,7 +6,7 @@ namespace CorgEng.GenericInterfaces.Rendering.Renderers { - public interface IRenderer + public interface IRenderer : IDisposable { /// @@ -29,6 +29,11 @@ public interface IRenderer /// uint RenderTextureUint { get; } + /// + /// The plane of the renderer + /// + int Plane { get; } + /// /// Initialise the renderer /// diff --git a/CorgEng.GenericInterfaces/Rendering/Renderers/ParallaxRenderer/IParallaxRendererFactory.cs b/CorgEng.GenericInterfaces/Rendering/Renderers/ParallaxRenderer/IParallaxRendererFactory.cs index d009bda9..e6381c83 100644 --- a/CorgEng.GenericInterfaces/Rendering/Renderers/ParallaxRenderer/IParallaxRendererFactory.cs +++ b/CorgEng.GenericInterfaces/Rendering/Renderers/ParallaxRenderer/IParallaxRendererFactory.cs @@ -14,7 +14,7 @@ public interface IParallaxRendererFactory /// /// /// - IParallaxRenderer CreateParallaxRenderer(uint networkedIdentifier); + IParallaxRenderer CreateParallaxRenderer(int plane); } } diff --git a/CorgEng.GenericInterfaces/Rendering/Renderers/SpriteRendering/ISpriteRendererFactory.cs b/CorgEng.GenericInterfaces/Rendering/Renderers/SpriteRendering/ISpriteRendererFactory.cs index 8caca72a..5812ea5c 100644 --- a/CorgEng.GenericInterfaces/Rendering/Renderers/SpriteRendering/ISpriteRendererFactory.cs +++ b/CorgEng.GenericInterfaces/Rendering/Renderers/SpriteRendering/ISpriteRendererFactory.cs @@ -9,7 +9,7 @@ namespace CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering public interface ISpriteRendererFactory { - ISpriteRenderer CreateSpriteRenderer(uint networkedIdentifier); + ISpriteRenderer CreateSpriteRenderer(int plane); } } diff --git a/CorgEng.Lighting/RenderCores/LightingRenderCore.cs b/CorgEng.Lighting/RenderCores/LightingRenderCore.cs deleted file mode 100644 index e0599351..00000000 --- a/CorgEng.Lighting/RenderCores/LightingRenderCore.cs +++ /dev/null @@ -1,63 +0,0 @@ -using CorgEng.Core; -using CorgEng.Core.Dependencies; -using CorgEng.Core.Rendering; -using CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering; -using CorgEng.GenericInterfaces.UtilityTypes; -using static OpenGL.Gl; - -namespace CorgEng.Lighting.RenderCores -{ - public class LightingRenderCore : RenderCore - { - - public const int LIGHTING_PLANE = 10; - - [UsingDependency] - private static ISpriteRendererFactory SpriteRendererFactory = default!; - - private static LightingRenderCore? _singleton; - public static LightingRenderCore Singleton - { - get { - if (_singleton == null) - { - _singleton = new LightingRenderCore(); - _singleton.Initialize(); - } - return _singleton; - } - } - - public static void Resolve() - { - if (_singleton == null) - { - _singleton = new LightingRenderCore(); - _singleton.Initialize(); - } - } - - public override RenderModes DrawMode => RenderModes.MULTIPLY; - - public override RenderModes BlendMode => RenderModes.ADDITIVE; - - public override DepthModes DepthMode => DepthModes.IGNORE_DEPTH; - - public ISpriteRenderer lightRenderer = null!; - - public override IColour BackColour => ColourFactory.GetColour(0.4f, 0.4f, 0.4f, 1); - - public override void Initialize() - { - lightRenderer = SpriteRendererFactory.CreateSpriteRenderer(LIGHTING_PLANE); - lightRenderer.Initialize(); - } - - public override void PerformRender() - { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - lightRenderer.Render(CorgEngMain.MainCamera); - } - - } -} diff --git a/CorgEng.Lighting/RenderCores/LightingRenderer.cs b/CorgEng.Lighting/RenderCores/LightingRenderer.cs new file mode 100644 index 00000000..b0502a8e --- /dev/null +++ b/CorgEng.Lighting/RenderCores/LightingRenderer.cs @@ -0,0 +1,27 @@ +using CorgEng.Core; +using CorgEng.Core.Dependencies; +using CorgEng.Core.Rendering; +using CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering; +using CorgEng.GenericInterfaces.UtilityTypes; +using CorgEng.Rendering.SpriteRendering; +using static OpenGL.Gl; + +namespace CorgEng.Lighting.RenderCores +{ + public class LightingRenderer : SpriteRenderer + { + + public static int LIGHTING_PLANE = 10; + + public override RenderModes DrawMode => RenderModes.MULTIPLY; + + public override RenderModes BlendMode => RenderModes.ADDITIVE; + + public override DepthModes DepthMode => DepthModes.IGNORE_DEPTH; + + public ISpriteRenderer lightRenderer = null!; + + public override IColour BackColour => ColourFactory.GetColour(0.4f, 0.4f, 0.4f, 1); + + } +} diff --git a/CorgEng.Lighting/Systems/LightingSystem.cs b/CorgEng.Lighting/Systems/LightingSystem.cs index 11a78ea3..ae7e597c 100644 --- a/CorgEng.Lighting/Systems/LightingSystem.cs +++ b/CorgEng.Lighting/Systems/LightingSystem.cs @@ -33,7 +33,7 @@ public override void SystemSetup() //When the lighting object initialises, set it to start rendering on the specified system RegisterLocalEvent((entity, lightingComponent, signal) => { //Create an overlay lighting icon. - IIcon createdIcon = IconFactory.CreateIcon("light_mask", 100, LightingRenderCore.LIGHTING_PLANE); + IIcon createdIcon = IconFactory.CreateIcon("light_mask", 100, LightingRenderer.LIGHTING_PLANE); createdIcon.Transform = new Matrix(new float[,] { { lightingComponent.Radius, 0, 0 }, diff --git a/CorgEng.Rendering/Icons/Icon.cs b/CorgEng.Rendering/Icons/Icon.cs index 89dd4b11..2d361682 100644 --- a/CorgEng.Rendering/Icons/Icon.cs +++ b/CorgEng.Rendering/Icons/Icon.cs @@ -1,4 +1,5 @@ -using CorgEng.Core.Dependencies; +using CorgEng.Core; +using CorgEng.Core.Dependencies; using CorgEng.GenericInterfaces.Rendering.Icons; using CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering; using CorgEng.GenericInterfaces.Rendering.Textures; @@ -65,8 +66,8 @@ public float Layer /// The renderer that should be used in order to render this icon. /// Will trigger ValueChanged when updated. /// - private uint plane; - public uint Plane + private int plane; + public int Plane { get => plane; set @@ -85,7 +86,7 @@ public ISpriteRenderer Renderer get { if (_cachedRenderer == null) - _cachedRenderer = RendererLookup.GetRendererByIdentifier(Plane); + _cachedRenderer = (ISpriteRenderer)CorgEngMain.GetRendererForPlane(Plane); return _cachedRenderer; } } @@ -104,7 +105,7 @@ public IMatrix Transform } } - public Icon(string iconName, float layer, uint plane) + public Icon(string iconName, float layer, int plane) { IconName = iconName; Layer = layer; @@ -119,7 +120,7 @@ public void DeserialiseFrom(BinaryReader binaryReader) { IconName = AutoSerialiser.Deserialize(typeof(string), binaryReader) as string; Layer = (float)AutoSerialiser.Deserialize(typeof(float), binaryReader); - Plane = (uint)AutoSerialiser.Deserialize(typeof(uint), binaryReader); + Plane = (int)AutoSerialiser.Deserialize(typeof(int), binaryReader); DirectionalState = (DirectionalState)AutoSerialiser.Deserialize(typeof(int), binaryReader); Colour = (IVector)AutoSerialiser.Deserialize(typeof(Vector), binaryReader); } @@ -128,7 +129,7 @@ public int GetSerialisationLength() { return AutoSerialiser.SerialisationLength(typeof(string), IconName) + AutoSerialiser.SerialisationLength(typeof(float), Layer) - + AutoSerialiser.SerialisationLength(typeof(uint), Plane) + + AutoSerialiser.SerialisationLength(typeof(int), Plane) + AutoSerialiser.SerialisationLength(typeof(int), (int)DirectionalState) + AutoSerialiser.SerialisationLength(typeof(Vector), Colour); } @@ -137,7 +138,7 @@ public void SerialiseInto(BinaryWriter binaryWriter) { AutoSerialiser.SerializeInto(typeof(string), IconName, binaryWriter); AutoSerialiser.SerializeInto(typeof(float), Layer, binaryWriter); - AutoSerialiser.SerializeInto(typeof(uint), Plane, binaryWriter); + AutoSerialiser.SerializeInto(typeof(int), Plane, binaryWriter); AutoSerialiser.SerializeInto(typeof(int), (int)DirectionalState, binaryWriter); AutoSerialiser.SerializeInto(typeof(Vector), Colour, binaryWriter); } diff --git a/CorgEng.Rendering/Icons/IconFactory.cs b/CorgEng.Rendering/Icons/IconFactory.cs index 291e7b80..525ef043 100644 --- a/CorgEng.Rendering/Icons/IconFactory.cs +++ b/CorgEng.Rendering/Icons/IconFactory.cs @@ -13,7 +13,7 @@ namespace CorgEng.Rendering.Icons internal class IconFactory : IIconFactory { - public IIcon CreateIcon(string name, float layer, uint plane) + public IIcon CreateIcon(string name, float layer, int plane) { return new Icon(name, layer, plane); } diff --git a/CorgEng.Rendering/InstancedRenderer.cs b/CorgEng.Rendering/InstancedRenderer.cs index 02ec444a..bff40c8a 100644 --- a/CorgEng.Rendering/InstancedRenderer.cs +++ b/CorgEng.Rendering/InstancedRenderer.cs @@ -7,6 +7,7 @@ using CorgEng.GenericInterfaces.Rendering.RenderObjects; using CorgEng.GenericInterfaces.Rendering.Shaders; using CorgEng.GenericInterfaces.Rendering.SharedRenderAttributes; +using CorgEng.GenericInterfaces.UtilityTypes; using CorgEng.GenericInterfaces.UtilityTypes.Batches; using System; using System.Collections.Generic; @@ -18,14 +19,21 @@ namespace CorgEng.Rendering { - internal static class InstancedRendererDependencyHolder + public abstract class InstancedRendererDependencyHolder { [UsingDependency] internal static ILogger Logger; - } - public abstract class InstancedRenderer : IRenderer - where TSharedRenderAttributes : ISharedRenderAttributes + //Fetch shader loading from some dependency somewhere + [UsingDependency] + protected static IShaderFactory ShaderFactory; + + [UsingDependency] + protected static IColourFactory ColourFactory; + } + + public abstract partial class InstancedRenderer : PlaneRenderer, IRenderer + where TSharedRenderAttributes : ISharedRenderAttributes where TBatch : IBatch, new() { @@ -44,24 +52,13 @@ public abstract class InstancedRenderer : IRend //The location of buffers that we are using protected uint[] storedBufferLocations; - //Used to identifier the networker - public uint NetworkIdentifier { get; } - - public InstancedRenderer(uint networkIdentifier) - { - //Set the network identifier - NetworkIdentifier = networkIdentifier; - //Do the renderer lookup - if (networkIdentifier != RenderingConstants.NETWORK_RENDERING_ID_LOCAL) - { - InstancedRendererDependencyHolder.Logger.WriteLine($"Added renderer on plane ID {networkIdentifier}", LogType.DEBUG); - RendererLookup.AddRenderer(this); - } - } + public int Plane { get; private set; } - public void Initialize() + public override void Initialize() { - CreateShaders(); + base.Initialize(); + // Create the shaders + CreateShaders(); //Create a program for the renderer programUint = glCreateProgram(); //Setup the program: @@ -77,7 +74,7 @@ public void Initialize() protected abstract void CreateShaders(); - public void Render(ICamera camera) + public override void Render(ICamera camera) { //Start using our program //Shaders were loaded during init @@ -268,6 +265,5 @@ protected unsafe void BindAttribArray(uint index, uint buffer, int size) NULL //Array buffer offset (null) ); } - - } + } } diff --git a/CorgEng.Rendering/PlaneRenderer.cs b/CorgEng.Rendering/PlaneRenderer.cs new file mode 100644 index 00000000..36cf6147 --- /dev/null +++ b/CorgEng.Rendering/PlaneRenderer.cs @@ -0,0 +1,313 @@ +using CorgEng.Core; +using CorgEng.Core.Dependencies; +using CorgEng.Core.Rendering; +using CorgEng.GenericInterfaces.Core; +using CorgEng.GenericInterfaces.Logging; +using CorgEng.GenericInterfaces.Rendering; +using CorgEng.GenericInterfaces.Rendering.Renderers; +using CorgEng.GenericInterfaces.Rendering.Shaders; +using CorgEng.GenericInterfaces.Rendering.SharedRenderAttributes; +using CorgEng.GenericInterfaces.UtilityTypes; +using CorgEng.GenericInterfaces.UtilityTypes.Batches; +using System; +using static OpenGL.Gl; + +namespace CorgEng.Rendering +{ + public abstract partial class PlaneRenderer : InstancedRendererDependencyHolder, IDisposable + { + + private static float[] quadVertices = { + 1, 1, 0, + 1, -1, 0, + -1, 1, 0, + -1, 1, 0, + 1, -1, 0, + -1, -1, 0 + }; + + private static bool initialized = false; + + //The vertex array and buffer objects + private static uint vertexArray; + private static uint vertexBuffer; + + private static IShaderSet shaderSet; + + private static int textureUniformLocation; + + //Create a program for rendering + private static uint planeDrawingProgramUint; + + /// + /// The uint of the frame buffer + /// + public uint FrameBufferUint { get; private set; } + + /// + /// The uint of the render buffer + /// + public uint RenderBufferUint { get; private set; } + + /// + /// The uint of our render texture + /// + public uint RenderTextureUint { get; private set; } + + public int Width { get; internal set; } = 1920; + + public int Height { get; internal set; } = 1080; + + private static IColour _currentBackColour; + private static DepthModes _currentDepthMode = DepthModes.KEEP_DEPTH; + private static RenderModes _currentBlendMode = RenderModes.DEFAULT; + + /// + /// The render mode to use when drawing this render core to the framebuffer. + /// + public virtual RenderModes DrawMode { get; } = RenderModes.DEFAULT; + + /// + /// The render mode to use when rendering elements on to the render core. + /// + public virtual RenderModes BlendMode { get; } = RenderModes.DEFAULT; + + /// + /// Should we keep depth? + /// Ignoring depth causes the render core to overlay on whatever it is being drawn on. + /// + public virtual DepthModes DepthMode { get; } = DepthModes.KEEP_DEPTH; + + /// + /// The path of the shaders to use. + /// Only accessed during initialisation. + /// + public virtual string ShaderPath => "CoreShader"; + + public virtual IColour BackColour { get; } = ColourFactory.GetColour(0, 0, 0, 0); + + public unsafe virtual void Initialize() + { + if (!CorgEngMain.IsRendering) + return; + //Generate a render buff + RenderBufferUint = glGenRenderbuffer(); + glBindRenderbuffer(RenderBufferUint); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, Width, Height); + //Generate a frame buffer + FrameBufferUint = glGenFramebuffer(); + glBindFramebuffer(GL_FRAMEBUFFER, FrameBufferUint); + //Create a render texture + glActiveTexture(GL_TEXTURE0); + RenderTextureUint = glGenTexture(); + //Bind the created texture so we can modify it + glBindTexture(GL_TEXTURE_2D, RenderTextureUint); + //Load the texture scale + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + //Set the texture parameters + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + //Bind the render depth buffer to the framebuffer + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, RenderBufferUint); + //Bind the framebuffer to the texture + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, RenderTextureUint, 0); + //Check for issues + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + { + //TODO: Introduce a rendering mode that bypasses framebuffers and just draws directly to the screen. + //Slightly broken is better than nothing. + Logger.WriteLine("WARNING: FRAMEBUFFER ERROR. Your GPU may not support this application!", LogType.ERROR); + } + //Log creation + Logger?.WriteLine($"Created RenderCore, rendering to framebuffer {FrameBufferUint} outputting texture to {RenderTextureUint}", LogType.DEBUG); + // Prepare for rendering if we need + SetupRendering(); + } + + public unsafe static void SetupRendering() + { + //Create stuff we need for screen rendering (static) + if (!initialized) + { + Logger?.WriteLine("Initialized RenderCore static requirements.", LogType.LOG); + //Mark initialized to be true. + initialized = true; + //create and link a program + planeDrawingProgramUint = glCreateProgram(); + //Start using the program: All operations will affect this program + glUseProgram(planeDrawingProgramUint); + //Generate a vertex array and bind it + vertexArray = glGenVertexArray(); + glBindVertexArray(vertexArray); + //Create and bind the vertex buffer + vertexBuffer = glGenBuffer(); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); + + //Put data into the buffer + fixed (float* vertexPointer = &quadVertices[0]) + { + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * quadVertices.Length, vertexPointer, GL_STATIC_DRAW); + } + //Create the shaders + shaderSet = ShaderFactory.CreateShaderSet("CoreShader"); + //Get the uniform location of the shaders + shaderSet.AttachShaders(planeDrawingProgramUint); + glLinkProgram(planeDrawingProgramUint); + //Fetch uniform locations + textureUniformLocation = glGetUniformLocation(planeDrawingProgramUint, "renderTexture"); + } + } + + /// + /// Do rendering + /// + public void DoRender(ICamera camera) + { + RenderModes prev = SwitchBlendMode(BlendMode); + DepthModes prevDepth = SwitchDepthMode(DepthMode); + IColour prevColour = SwitchBackColour(BackColour); + PreRender(); + Render(camera); + SwitchBlendMode(prev); + SwitchDepthMode(prevDepth); + SwitchBackColour(prevColour); + } + + public void PreRender() + { + //Bind our framebuffer to render to + glBindFramebuffer(GL_FRAMEBUFFER, FrameBufferUint); + //Clear the backbuffer + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + //Set the viewport + glViewport(0, 0, Width, Height); + } + + /// + /// Render whatever we need to render to the plane. + /// + /// + public abstract void Render(ICamera camera); + + protected static RenderModes SwitchBlendMode(RenderModes newMode) + { + if (newMode == _currentBlendMode) + return newMode; + RenderModes prevMode = _currentBlendMode; + _currentBlendMode = newMode; + switch (_currentBlendMode) + { + case RenderModes.DEFAULT: + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + break; + case RenderModes.MULTIPLY: + glBlendFunc(GL_DST_COLOR, GL_ZERO); + break; + case RenderModes.ADDITIVE: + glBlendFunc(GL_ONE, GL_ONE); + break; + } + return prevMode; + } + + protected static DepthModes SwitchDepthMode(DepthModes newMode) + { + if (newMode == _currentDepthMode) + return newMode; + DepthModes prevMode = _currentDepthMode; + _currentDepthMode = newMode; + switch (_currentDepthMode) + { + case DepthModes.KEEP_DEPTH: + glDepthFunc(GL_LEQUAL); + break; + case DepthModes.IGNORE_DEPTH: + glDepthFunc(GL_ALWAYS); + break; + } + return prevMode; + } + + protected static IColour SwitchBackColour(IColour newColour) + { + if (newColour == null || newColour.Equals(_currentBackColour)) + return newColour; + IColour prevCol = _currentBackColour; + _currentBackColour = newColour; + glClearColor(newColour.Red, newColour.Green, newColour.Blue, newColour.Alpha); + return prevCol; + } + + public unsafe void Resize(int width, int height) + { + //Set the new width + Width = width; + Height = height; + //Log + Logger?.WriteLine($"Render core resized to {Width}x{Height}", LogType.DEBUG); + if (!CorgEngMain.IsRendering) + return; + //Update the tex image + //Bind the created texture so we can modify it + glBindTexture(GL_TEXTURE_2D, RenderTextureUint); + //Load the texture scale + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + //Set the texture parameters + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + + public unsafe void DrawToBuffer(uint buffer, int drawX, int drawY, int bufferWidth, int bufferHeight) + { + //Reset the framebuffer (We want to draw to the screen, not a frame buffer) + glBindFramebuffer(GL_FRAMEBUFFER, buffer); + //Draw to full screen + glViewport(drawX, drawY, bufferWidth, bufferHeight); + + //Setup blending + RenderModes prevRender = SwitchBlendMode(DrawMode); + DepthModes prevBlend = SwitchDepthMode(DepthMode); + IColour prevColour = SwitchBackColour(BackColour); + + //Set the using program to our program uint + glUseProgram(planeDrawingProgramUint); + //Bind uniform variables + glUniform1ui(textureUniformLocation, 0); + //Bind the vertex buffer + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); + glVertexAttribPointer( + 0, //Attribute - Where the layout location is in the vertex shader + 3, //Size of the triangles (3 sides) + GL_FLOAT, //Type (Floats) + false, //Normalized (nope) + 0, //Stride (0) + NULL //Array buffer offset (null) + ); + //Set the vertex attrib divisor + glVertexAttribDivisor(0, 0); + //Bind the texture + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, RenderTextureUint); + //Draw + glDrawArrays(GL_TRIANGLES, 0, 6); + //Disable the vertex attrib array + glDisableVertexAttribArray(0); + + SwitchBlendMode(prevRender); + SwitchDepthMode(prevBlend); + SwitchBackColour(prevColour); + } + + /// + /// Dispose the render core and cleanup any resources + /// + public void Dispose() + { + glDeleteRenderbuffer(RenderBufferUint); + glDeleteFramebuffer(FrameBufferUint); + glDeleteTexture(RenderTextureUint); + } + + } +} diff --git a/CorgEng.Rendering/RenderCores/DefaultRenderCore.cs b/CorgEng.Rendering/RenderCores/DefaultRenderCore.cs deleted file mode 100644 index 27fd1bd2..00000000 --- a/CorgEng.Rendering/RenderCores/DefaultRenderCore.cs +++ /dev/null @@ -1,27 +0,0 @@ -using CorgEng.Core.Rendering; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CorgEng.Rendering.RenderCores -{ - internal class DefaultRenderCore : RenderCore - { - public override void Dispose() - { - throw new NotImplementedException(); - } - - public override void Initialize() - { - throw new NotImplementedException(); - } - - public override void PerformRender() - { - throw new NotImplementedException(); - } - } -} diff --git a/CorgEng.Rendering/RenderCores/DefaultRenderCoreProvider.cs b/CorgEng.Rendering/RenderCores/DefaultRenderCoreProvider.cs deleted file mode 100644 index 3faf1359..00000000 --- a/CorgEng.Rendering/RenderCores/DefaultRenderCoreProvider.cs +++ /dev/null @@ -1,19 +0,0 @@ -using CorgEng.DependencyInjection.Dependencies; -using CorgEng.GenericInterfaces.Core; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CorgEng.Rendering.RenderCores -{ - [Dependency(priority = 50)] - internal class DefaultRenderCoreProvider : IRenderCoreProvider - { - public IRenderCore CreateDefaultRenderCore() - { - return new DefaultRenderCore(); - } - } -} diff --git a/CorgEng.Rendering/RendererLookup.cs b/CorgEng.Rendering/RendererLookup.cs deleted file mode 100644 index bd24f5f9..00000000 --- a/CorgEng.Rendering/RendererLookup.cs +++ /dev/null @@ -1,32 +0,0 @@ -using CorgEng.GenericInterfaces.Rendering.SharedRenderAttributes; -using CorgEng.GenericInterfaces.UtilityTypes.Batches; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CorgEng.Rendering -{ - public static class RendererLookup - { - - /// - /// The renderer lookup table - /// - private static IDictionary rendererLookup = new Dictionary(); - - internal static void AddRenderer(InstancedRenderer renderer) - where T : ISharedRenderAttributes - where R : IBatch, new() - { - rendererLookup.Add(renderer.NetworkIdentifier, renderer); - } - - public static T GetRendererByIdentifier(uint identifier) - { - return (T)rendererLookup[identifier]; - } - - } -} diff --git a/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRenderer.cs b/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRenderer.cs index ee934066..5239d8b6 100644 --- a/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRenderer.cs +++ b/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRenderer.cs @@ -9,8 +9,6 @@ namespace CorgEng.Rendering.SpriteRendering.Parallax { internal class ParallaxRenderer : SpriteRenderer, IParallaxRenderer { - internal ParallaxRenderer(uint networkedId) : base(networkedId) - { } protected override void CreateShaders() { diff --git a/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRendererFactory.cs b/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRendererFactory.cs index a27919e9..7c8bad6e 100644 --- a/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRendererFactory.cs +++ b/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRendererFactory.cs @@ -11,9 +11,9 @@ namespace CorgEng.Rendering.SpriteRendering.Parallax [Dependency] internal class ParallaxRendererFactory : IParallaxRendererFactory { - public IParallaxRenderer CreateParallaxRenderer(uint networkedIdentifier) + public IParallaxRenderer CreateParallaxRenderer(int plane) { - return new ParallaxRenderer(networkedIdentifier); + return new ParallaxRenderer(); } } } diff --git a/CorgEng.Rendering/SpriteRendering/SpriteBatch.cs b/CorgEng.Rendering/SpriteRendering/SpriteBatch.cs index 2360ea15..0ee69b1e 100644 --- a/CorgEng.Rendering/SpriteRendering/SpriteBatch.cs +++ b/CorgEng.Rendering/SpriteRendering/SpriteBatch.cs @@ -10,7 +10,7 @@ namespace CorgEng.Rendering.SpriteRendering { - internal sealed class SpriteBatch : Batch + public sealed class SpriteBatch : Batch { public override int[] BatchVectorSizes { get; } = new int[] { 3, 3, 4, 1, 4 }; diff --git a/CorgEng.Rendering/SpriteRendering/SpriteRenderer.cs b/CorgEng.Rendering/SpriteRendering/SpriteRenderer.cs index 1e6a3ff7..099225ad 100644 --- a/CorgEng.Rendering/SpriteRendering/SpriteRenderer.cs +++ b/CorgEng.Rendering/SpriteRendering/SpriteRenderer.cs @@ -20,18 +20,13 @@ namespace CorgEng.Rendering.SpriteRendering { - internal class SpriteRenderer : InstancedRenderer, ISpriteRenderer + public class SpriteRenderer : InstancedRenderer, ISpriteRenderer { - [UsingDependency] - protected static IShaderFactory ShaderFactory; - protected IShaderSet _shaderSet; protected override IShaderSet ShaderSet => _shaderSet; - internal SpriteRenderer(uint networkedId) : base(networkedId) { } - protected override void CreateShaders() { _shaderSet = ShaderFactory.CreateShaderSet("SpriteShader"); diff --git a/CorgEng.Rendering/SpriteRendering/SpriteRendererFactory.cs b/CorgEng.Rendering/SpriteRendering/SpriteRendererFactory.cs index d0ad7ccf..7304a303 100644 --- a/CorgEng.Rendering/SpriteRendering/SpriteRendererFactory.cs +++ b/CorgEng.Rendering/SpriteRendering/SpriteRendererFactory.cs @@ -12,9 +12,9 @@ namespace CorgEng.Rendering.SpriteRendering public class SpriteRendererFactory : ISpriteRendererFactory { - public ISpriteRenderer CreateSpriteRenderer(uint networkedIdentifier) + public ISpriteRenderer CreateSpriteRenderer(int plane) { - return new SpriteRenderer(networkedIdentifier); + return new SpriteRenderer(); } } diff --git a/CorgEng.Tests/Stubs/IRenderCoreStubFactory.cs b/CorgEng.Tests/Stubs/IRenderCoreStubFactory.cs deleted file mode 100644 index 53024684..00000000 --- a/CorgEng.Tests/Stubs/IRenderCoreStubFactory.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CorgEng.GenericInterfaces.Core; -using CorgEng.GenericInterfaces.UserInterface.Rendering; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CorgEng.Tests.Stubs -{ - /*internal class IRenderCoreStubFactory : IUserInterfaceRenderCoreFactory - { - public IRenderCore Create() - { - return new RenderCoreStub(); - } - }*/ -} diff --git a/CorgEng.Tests/Stubs/RenderCoreStub.cs b/CorgEng.Tests/Stubs/RenderCoreStub.cs deleted file mode 100644 index fee30874..00000000 --- a/CorgEng.Tests/Stubs/RenderCoreStub.cs +++ /dev/null @@ -1,45 +0,0 @@ -using CorgEng.GenericInterfaces.Core; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CorgEng.Tests.Stubs -{ - internal class RenderCoreStub : IRenderCore - { - public uint FrameBufferUint => 0; - - public uint RenderTextureUint => 0; - - public int Width => 0; - - public int Height => 0; - - public void DoRender() - { - return; - } - - public void DrawToBuffer() - { - return; - } - - public void DrawToBuffer(uint buffer, int drawX, int drawY, int bufferWidth, int bufferHeight) - { - return; - } - - public void Initialize() - { - return; - } - - public void Resize(int width, int height) - { - return; - } - } -} diff --git a/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceBox.cs b/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceBox.cs index 71ab3121..477b217e 100644 --- a/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceBox.cs +++ b/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceBox.cs @@ -1,6 +1,7 @@ using CorgEng.Core; using CorgEng.Core.Dependencies; using CorgEng.GenericInterfaces.Logging; +using CorgEng.GenericInterfaces.Rendering; using CorgEng.GenericInterfaces.UserInterface.Anchors; using CorgEng.GenericInterfaces.UserInterface.Components; using CorgEng.GenericInterfaces.UtilityTypes; @@ -65,11 +66,11 @@ public override void Initialize() userInterfaceBoxRenderer.StartRendering(boxRenderObject); } - public override void PerformRender() - { - if (!CorgEngMain.IsRendering) - return; - userInterfaceBoxRenderer.Render(Width, Height); - } - } + public override void Render(ICamera camera) + { + if (!CorgEngMain.IsRendering) + return; + userInterfaceBoxRenderer.Render(Width, Height); + } + } } diff --git a/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceComponent.cs b/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceComponent.cs index 43ec6cc0..a0df2459 100644 --- a/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceComponent.cs +++ b/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceComponent.cs @@ -5,10 +5,12 @@ using CorgEng.GenericInterfaces.Core; using CorgEng.GenericInterfaces.EntityComponentSystem; using CorgEng.GenericInterfaces.Logging; +using CorgEng.GenericInterfaces.Rendering; using CorgEng.GenericInterfaces.UserInterface.Anchors; using CorgEng.GenericInterfaces.UserInterface.Components; using CorgEng.GenericInterfaces.UserInterface.Rendering; using CorgEng.GenericInterfaces.UserInterface.Rendering.Renderer; +using CorgEng.Rendering; using CorgEng.UserInterface.Hooks; using CorgEng.UserInterface.Rendering; using System; @@ -20,7 +22,7 @@ namespace CorgEng.UserInterface.Components { - internal class UserInterfaceComponent : RenderCore, IUserInterfaceComponent + internal class UserInterfaceComponent : PlaneRenderer, IUserInterfaceComponent { private static int IdCounter = 0; @@ -249,20 +251,20 @@ private void ParseArguments(IDictionary arguments) // Component Rendering Interfaces //==================================== - private static void Render(UserInterfaceComponent userInterfaceComponent, uint buffer, bool drawOnTop = false) + private static void Render(ICamera camera, UserInterfaceComponent userInterfaceComponent, uint buffer, bool drawOnTop = false) { //Not initalized yet if (!userInterfaceComponent.initialized) return; //Resize if necessary - if (userInterfaceComponent.Fullscreen && userInterfaceComponent.Parent == null && (userInterfaceComponent.PixelWidth != CorgEngMain.MainRenderCore.Width || userInterfaceComponent.PixelHeight != CorgEngMain.MainRenderCore.Height)) + if (userInterfaceComponent.Fullscreen && userInterfaceComponent.Parent == null && (userInterfaceComponent.PixelWidth != CorgEngMain.GameWindow.Width || userInterfaceComponent.PixelHeight != CorgEngMain.GameWindow.Height)) { - userInterfaceComponent.SetWidth(CorgEngMain.MainRenderCore.Width, CorgEngMain.MainRenderCore.Height); + userInterfaceComponent.SetWidth(CorgEngMain.GameWindow.Width, CorgEngMain.GameWindow.Height); } //Switch to the correct render core and draw it to the framebuffer if (userInterfaceComponent.RenderInclude) { - userInterfaceComponent.DoRender(); + userInterfaceComponent.DoRender(camera); } else { @@ -275,7 +277,7 @@ private static void Render(UserInterfaceComponent userInterfaceComponent, uint b foreach (IUserInterfaceComponent childComponent in userInterfaceComponent.GetChildren()) { //Render the child component to our buffer - Render(childComponent as UserInterfaceComponent, userInterfaceComponent.FrameBufferUint); + Render(camera, childComponent as UserInterfaceComponent, userInterfaceComponent.FrameBufferUint); } } if (drawOnTop) @@ -299,7 +301,7 @@ public void DrawToFramebuffer(uint frameBuffer) { try { - Render(this, frameBuffer, drawOnTop: true); + Render(CorgEngMain.MainCamera, this, frameBuffer, drawOnTop: true); } catch (Exception e) { @@ -532,8 +534,9 @@ public void SetWidth(double width, double height) } } - public override void Initialize() + public override void Initialize() { + base.Initialize(); if (initialiseCallbackFunction != null) { UserInterfaceModule.KeyMethods[initialiseCallbackFunction].Invoke(null, new object[] { this }); @@ -542,9 +545,6 @@ public override void Initialize() initialized = true; } - public override void PerformRender() - { } - public virtual IUserInterfaceComponent Screencast(int relativeX, int relativeY) { //If outside bounds, return nothing @@ -596,5 +596,10 @@ public object GetData(string dataName) { return dataStore[dataName]; } - } + + public override void Render(ICamera camera) + { + throw new NotImplementedException(); + } + } } diff --git a/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceIcon.cs b/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceIcon.cs index 88c8f51c..5b5c5523 100644 --- a/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceIcon.cs +++ b/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceIcon.cs @@ -2,6 +2,7 @@ using CorgEng.Core; using CorgEng.Core.Dependencies; using CorgEng.GenericInterfaces.Logging; +using CorgEng.GenericInterfaces.Rendering; using CorgEng.GenericInterfaces.Rendering.Icons; using CorgEng.GenericInterfaces.Rendering.Textures; using CorgEng.GenericInterfaces.UserInterface.Anchors; @@ -71,8 +72,8 @@ public override void Initialize() userInterfaceIconRenderer.StartRendering(userInterfaceIconRenderObject); } - public override void PerformRender() - { + public override void Render(ICamera camera) + { if (!CorgEngMain.IsRendering) return; userInterfaceIconRenderer.Render(Width, Height); diff --git a/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceText.cs b/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceText.cs index e8680151..0a313c63 100644 --- a/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceText.cs +++ b/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceText.cs @@ -1,6 +1,7 @@ using CorgEng.Core; using CorgEng.Core.Dependencies; using CorgEng.GenericInterfaces.Font.Fonts; +using CorgEng.GenericInterfaces.Rendering; using CorgEng.GenericInterfaces.Rendering.Cameras.Isometric; using CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering; using CorgEng.GenericInterfaces.Rendering.Text; @@ -78,8 +79,8 @@ private void Setup(IDictionary arguments) }); } - public override void PerformRender() - { + public override void Render(ICamera camera) + { if (!ready) return; IsometricCamera.X = 0.8f; From 2b889fd2140f5a19c2ce6adf47694a3ea00e8917 Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Fri, 15 Sep 2023 14:57:03 +0100 Subject: [PATCH 03/11] Update PlaneRenderer.cs --- CorgEng.Rendering/PlaneRenderer.cs | 78 +++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 6 deletions(-) diff --git a/CorgEng.Rendering/PlaneRenderer.cs b/CorgEng.Rendering/PlaneRenderer.cs index 36cf6147..6e32ccac 100644 --- a/CorgEng.Rendering/PlaneRenderer.cs +++ b/CorgEng.Rendering/PlaneRenderer.cs @@ -10,6 +10,7 @@ using CorgEng.GenericInterfaces.UtilityTypes; using CorgEng.GenericInterfaces.UtilityTypes.Batches; using System; +using System.Collections.Generic; using static OpenGL.Gl; namespace CorgEng.Rendering @@ -34,8 +35,14 @@ public abstract partial class PlaneRenderer : InstancedRendererDependencyHolder, private static IShaderSet shaderSet; + private static IShaderSet depthShaderSet; + private static int textureUniformLocation; + private static int depthUniformLocation; + + private static int depthIncrementUniformLocation; + //Create a program for rendering private static uint planeDrawingProgramUint; @@ -54,6 +61,11 @@ public abstract partial class PlaneRenderer : InstancedRendererDependencyHolder, /// public uint RenderTextureUint { get; private set; } + /// + /// The ID of the depth texture generated by rendering this render core. + /// + public uint DepthTextureUint { get; private set; } + public int Width { get; internal set; } = 1920; public int Height { get; internal set; } = 1080; @@ -78,14 +90,32 @@ public abstract partial class PlaneRenderer : InstancedRendererDependencyHolder, /// public virtual DepthModes DepthMode { get; } = DepthModes.KEEP_DEPTH; + /// + /// The scaling mode of this render core. + /// + public virtual ScalingModes ScalingMode { get; } = ScalingModes.NEAREST_NEIGHBOUR; + + /// + /// If this is set to true, the render core will be allowed to be resized through the Resize() function. + /// + public virtual bool CanResize { get; } = true; + /// /// The path of the shaders to use. /// Only accessed during initialisation. /// public virtual string ShaderPath => "CoreShader"; + /// + /// The back colour of the plane. By default, fully transparent black. + /// public virtual IColour BackColour { get; } = ColourFactory.GetColour(0, 0, 0, 0); + /// + /// How much depth should we add to this render core? + /// + public virtual float DepthAdd { get; } = 0; + public unsafe virtual void Initialize() { if (!CorgEngMain.IsRendering) @@ -107,10 +137,21 @@ public unsafe virtual void Initialize() //Set the texture parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - //Bind the render depth buffer to the framebuffer - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, RenderBufferUint); //Bind the framebuffer to the texture glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, RenderTextureUint, 0); + + //========================= + // Setup the depth texture + //========================= + glActiveTexture(GL_TEXTURE1); + DepthTextureUint = glGenTexture(); + glBindTexture(GL_TEXTURE_2D, DepthTextureUint); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, Width, Height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, RenderBufferUint); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, DepthTextureUint, 0); + //Check for issues if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -155,9 +196,23 @@ public unsafe static void SetupRendering() glLinkProgram(planeDrawingProgramUint); //Fetch uniform locations textureUniformLocation = glGetUniformLocation(planeDrawingProgramUint, "renderTexture"); + depthUniformLocation = glGetUniformLocation(planeDrawingProgramUint, "depthTexture"); + depthIncrementUniformLocation = glGetUniformLocation(planeDrawingProgramUint, "depthIncrement"); } } + private static Dictionary loadedShaders = new Dictionary(); + + private IShaderSet GetShader(string name) + { + if (!loadedShaders.ContainsKey(name)) + { + IShaderSet createdShader = ShaderFactory.CreateShaderSet(name); + loadedShaders.Add(name, createdShader); + } + return loadedShaders[name]; + } + /// /// Do rendering /// @@ -245,7 +300,7 @@ public unsafe void Resize(int width, int height) Height = height; //Log Logger?.WriteLine($"Render core resized to {Width}x{Height}", LogType.DEBUG); - if (!CorgEngMain.IsRendering) + if (!CorgEngMain.IsRendering || !CanResize) return; //Update the tex image //Bind the created texture so we can modify it @@ -253,8 +308,15 @@ public unsafe void Resize(int width, int height) //Load the texture scale glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); //Set the texture parameters - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ScalingMode == ScalingModes.NEAREST_NEIGHBOUR ? GL_NEAREST : GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, ScalingMode == ScalingModes.NEAREST_NEIGHBOUR ? GL_NEAREST : GL_LINEAR); + // Bind the depth texture + glBindTexture(GL_TEXTURE_2D, DepthTextureUint); + //Load the texture scale + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, Width, Height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); + //Set the texture parameters + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ScalingMode == ScalingModes.NEAREST_NEIGHBOUR ? GL_NEAREST : GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, ScalingMode == ScalingModes.NEAREST_NEIGHBOUR ? GL_NEAREST : GL_LINEAR); } public unsafe void DrawToBuffer(uint buffer, int drawX, int drawY, int bufferWidth, int bufferHeight) @@ -272,7 +334,9 @@ public unsafe void DrawToBuffer(uint buffer, int drawX, int drawY, int bufferWid //Set the using program to our program uint glUseProgram(planeDrawingProgramUint); //Bind uniform variables - glUniform1ui(textureUniformLocation, 0); + glUniform1i(textureUniformLocation, 0); + glUniform1i(depthUniformLocation, 1); + glUniform1f(depthIncrementUniformLocation, DepthAdd); //Bind the vertex buffer glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); @@ -289,6 +353,8 @@ public unsafe void DrawToBuffer(uint buffer, int drawX, int drawY, int bufferWid //Bind the texture glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, RenderTextureUint); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, DepthTextureUint); //Draw glDrawArrays(GL_TRIANGLES, 0, 6); //Disable the vertex attrib array From f9f3a1d8839bccefa5876dd08b50e5c0aeb4649d Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Fri, 15 Sep 2023 15:53:17 +0100 Subject: [PATCH 04/11] Some more stuff to get compilation working --- CorgEng.Core/CorgEngMain.cs | 1 - CorgEng.Example/Program.cs | 1 + .../CorgEng.Pathfinding.csproj | 1 + CorgEng.Rendering/InstancedRenderer.cs | 21 +++++++++++++------ CorgEng.Rendering/PlaneRenderer.cs | 5 +++++ 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/CorgEng.Core/CorgEngMain.cs b/CorgEng.Core/CorgEngMain.cs index 474dd96f..feeca330 100644 --- a/CorgEng.Core/CorgEngMain.cs +++ b/CorgEng.Core/CorgEngMain.cs @@ -609,7 +609,6 @@ public static void Cleanup() } WorldList.Clear(); queuedActions.Clear(); - MainRenderCore = null; Logger.WriteLine("Full cleanup of CorgEng application completed.", LogType.DEBUG); } diff --git a/CorgEng.Example/Program.cs b/CorgEng.Example/Program.cs index 2bd76523..a425deb9 100644 --- a/CorgEng.Example/Program.cs +++ b/CorgEng.Example/Program.cs @@ -1,6 +1,7 @@ using CorgEng.Core; using CorgEng.Core.Dependencies; using CorgEng.Example.Modules.CameraScroll; +using CorgEng.GenericInterfaces.EntityComponentSystem; using CorgEng.GenericInterfaces.Networking.Networking.Client; using CorgEng.GenericInterfaces.Rendering.Cameras.Isometric; using System.Threading; diff --git a/CorgEng.Pathfinding/CorgEng.Pathfinding.csproj b/CorgEng.Pathfinding/CorgEng.Pathfinding.csproj index 757ddd99..a01854a0 100644 --- a/CorgEng.Pathfinding/CorgEng.Pathfinding.csproj +++ b/CorgEng.Pathfinding/CorgEng.Pathfinding.csproj @@ -8,6 +8,7 @@ + diff --git a/CorgEng.Rendering/InstancedRenderer.cs b/CorgEng.Rendering/InstancedRenderer.cs index c5b403df..49d637c4 100644 --- a/CorgEng.Rendering/InstancedRenderer.cs +++ b/CorgEng.Rendering/InstancedRenderer.cs @@ -1,6 +1,7 @@ using CorgEng.Constants; using CorgEng.Core; using CorgEng.Core.Dependencies; +using CorgEng.GenericInterfaces.EntityComponentSystem; using CorgEng.GenericInterfaces.Logging; using CorgEng.GenericInterfaces.Rendering; using CorgEng.GenericInterfaces.Rendering.Renderers; @@ -19,7 +20,7 @@ namespace CorgEng.Rendering { - public abstract class InstancedRendererDependencyHolder + public abstract class InstancedRendererDependencyHolder : WorldObject { [UsingDependency] internal static ILogger Logger; @@ -30,6 +31,10 @@ public abstract class InstancedRendererDependencyHolder [UsingDependency] protected static IColourFactory ColourFactory; + + protected InstancedRendererDependencyHolder(IWorld world) : base(world) + { + } } public abstract partial class InstancedRenderer : PlaneRenderer, IRenderer @@ -151,11 +156,15 @@ public override void Render(ICamera camera) private int viewMatrixUniformLocation; private int projectionMatrixUniformLocation; - /// - /// Bind the texture if your batches use textures - /// - /// - protected virtual void BindBatchTexture(TSharedRenderAttributes batchAttributes) + protected InstancedRenderer(IWorld world) : base(world) + { + } + + /// + /// Bind the texture if your batches use textures + /// + /// + protected virtual void BindBatchTexture(TSharedRenderAttributes batchAttributes) { } /// diff --git a/CorgEng.Rendering/PlaneRenderer.cs b/CorgEng.Rendering/PlaneRenderer.cs index 6e32ccac..7b7e2294 100644 --- a/CorgEng.Rendering/PlaneRenderer.cs +++ b/CorgEng.Rendering/PlaneRenderer.cs @@ -2,6 +2,7 @@ using CorgEng.Core.Dependencies; using CorgEng.Core.Rendering; using CorgEng.GenericInterfaces.Core; +using CorgEng.GenericInterfaces.EntityComponentSystem; using CorgEng.GenericInterfaces.Logging; using CorgEng.GenericInterfaces.Rendering; using CorgEng.GenericInterfaces.Rendering.Renderers; @@ -203,6 +204,10 @@ public unsafe static void SetupRendering() private static Dictionary loadedShaders = new Dictionary(); + protected PlaneRenderer(IWorld world) : base(world) + { + } + private IShaderSet GetShader(string name) { if (!loadedShaders.ContainsKey(name)) From 3c287ec329a81015dbf1f6be1168b2326f1ae6bc Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Sat, 16 Sep 2023 21:33:53 +0100 Subject: [PATCH 05/11] Fixes rendering --- CorgEng.Core/CorgEngMain.cs | 19 +++++++++++----- CorgEng.Core/Rendering/RenderMaster.cs | 12 ++++++---- .../Rendering/Renderers/IRenderer.cs | 5 +++++ .../IParallaxRendererFactory.cs | 5 +++-- .../SpriteRendering/ISpriteRendererFactory.cs | 5 +++-- .../RenderCores/LightingRenderer.cs | 9 ++++++-- .../DepthSpriteRenderComponent.cs | 2 +- .../SpriteRendering/SpriteRenderComponent.cs | 2 +- .../DepthParallax/ParallaxLayerRenderCore.cs | 22 ++++++------------- CorgEng.Rendering/InstancedRenderer.cs | 11 +++++++--- .../Parallax/ParallaxRenderer.cs | 7 ++++-- .../Parallax/ParallaxRendererFactory.cs | 5 +++-- .../SpriteRendering/SpriteRenderer.cs | 11 +++++++--- .../SpriteRendering/SpriteRendererFactory.cs | 8 ++++--- .../UserInterfaceText.cs | 2 +- 15 files changed, 79 insertions(+), 46 deletions(-) diff --git a/CorgEng.Core/CorgEngMain.cs b/CorgEng.Core/CorgEngMain.cs index feeca330..ab7f5483 100644 --- a/CorgEng.Core/CorgEngMain.cs +++ b/CorgEng.Core/CorgEngMain.cs @@ -202,7 +202,11 @@ public static void TransferToRenderingThread() foreach (var stagedPlane in stagedRenderPlanes) { renderingPlanes.TryAdd(stagedPlane.Key, stagedPlane.Value); - } + if (!stagedPlane.Value.Initialized) + { + stagedPlane.Value.Initialize(); + } + } stagedRenderPlanes.Clear(); } //Trigger any render thread code @@ -229,8 +233,10 @@ public static void TransferToRenderingThread() Glfw.PollEvents(); //Handle key events GameWindow.Update(); - // Perform rendering of the render planes that are not diverted to another source - foreach (var renderPlane in renderingPlanes.Values) + // Refresh the screen + RenderMaster.RefreshScreen(); + // Perform rendering of the render planes that are not diverted to another source + foreach (var renderPlane in renderingPlanes.Values) { // Process the actual render renderPlane.Render(MainCamera); @@ -291,8 +297,11 @@ public static IRenderer GetRendererForPlane(int renderCorePlane) { return renderCores.GetOrAdd(renderCorePlane, plane => { // Fetch a default render core implementation - var spriteRenderer = SpriteRendererFactory.CreateSpriteRenderer(plane); - stagedRenderPlanes.Add(plane, spriteRenderer); + var spriteRenderer = SpriteRendererFactory.CreateSpriteRenderer(primaryWorld, plane); + lock (stagedRenderPlanes) + { + stagedRenderPlanes.Add(plane, spriteRenderer); + } return spriteRenderer; }); } diff --git a/CorgEng.Core/Rendering/RenderMaster.cs b/CorgEng.Core/Rendering/RenderMaster.cs index 873f73f9..e92b1dae 100644 --- a/CorgEng.Core/Rendering/RenderMaster.cs +++ b/CorgEng.Core/Rendering/RenderMaster.cs @@ -47,15 +47,19 @@ private void SetGlobalGlFlags() } + public static void RefreshScreen() + { + //Reset the framebuffer (We want to draw to the screen, not a frame buffer) + glBindFramebuffer(GL_FRAMEBUFFER, 0); + //Clear the screen and reset it to the background colour + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } + /// /// Renders an image outputted by a render core to the screen. /// public unsafe void RenderImageToScreen(IRenderer renderCore) { - //Reset the framebuffer (We want to draw to the screen, not a frame buffer) - glBindFramebuffer(GL_FRAMEBUFFER, 0); - //Clear the screen and reset it to the background colour - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Draw the render core to the screen renderCore.DrawToBuffer(0, 0, 0, Width, Height); } diff --git a/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs b/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs index 808f19d0..96f0f9c8 100644 --- a/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs +++ b/CorgEng.GenericInterfaces/Rendering/Renderers/IRenderer.cs @@ -34,6 +34,11 @@ public interface IRenderer : IDisposable /// int Plane { get; } + /// + /// Has this renderer been initialised? + /// + bool Initialized { get; } + /// /// Initialise the renderer /// diff --git a/CorgEng.GenericInterfaces/Rendering/Renderers/ParallaxRenderer/IParallaxRendererFactory.cs b/CorgEng.GenericInterfaces/Rendering/Renderers/ParallaxRenderer/IParallaxRendererFactory.cs index e6381c83..2c04eef7 100644 --- a/CorgEng.GenericInterfaces/Rendering/Renderers/ParallaxRenderer/IParallaxRendererFactory.cs +++ b/CorgEng.GenericInterfaces/Rendering/Renderers/ParallaxRenderer/IParallaxRendererFactory.cs @@ -1,4 +1,5 @@ -using System; +using CorgEng.GenericInterfaces.EntityComponentSystem; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -14,7 +15,7 @@ public interface IParallaxRendererFactory /// /// /// - IParallaxRenderer CreateParallaxRenderer(int plane); + IParallaxRenderer CreateParallaxRenderer(IWorld world, int plane); } } diff --git a/CorgEng.GenericInterfaces/Rendering/Renderers/SpriteRendering/ISpriteRendererFactory.cs b/CorgEng.GenericInterfaces/Rendering/Renderers/SpriteRendering/ISpriteRendererFactory.cs index 5812ea5c..0621c1cc 100644 --- a/CorgEng.GenericInterfaces/Rendering/Renderers/SpriteRendering/ISpriteRendererFactory.cs +++ b/CorgEng.GenericInterfaces/Rendering/Renderers/SpriteRendering/ISpriteRendererFactory.cs @@ -1,4 +1,5 @@ -using System; +using CorgEng.GenericInterfaces.EntityComponentSystem; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -9,7 +10,7 @@ namespace CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering public interface ISpriteRendererFactory { - ISpriteRenderer CreateSpriteRenderer(int plane); + ISpriteRenderer CreateSpriteRenderer(IWorld world, int plane); } } diff --git a/CorgEng.Lighting/RenderCores/LightingRenderer.cs b/CorgEng.Lighting/RenderCores/LightingRenderer.cs index b0502a8e..e004e16d 100644 --- a/CorgEng.Lighting/RenderCores/LightingRenderer.cs +++ b/CorgEng.Lighting/RenderCores/LightingRenderer.cs @@ -1,6 +1,7 @@ using CorgEng.Core; using CorgEng.Core.Dependencies; using CorgEng.Core.Rendering; +using CorgEng.GenericInterfaces.EntityComponentSystem; using CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering; using CorgEng.GenericInterfaces.UtilityTypes; using CorgEng.Rendering.SpriteRendering; @@ -21,7 +22,11 @@ public class LightingRenderer : SpriteRenderer public ISpriteRenderer lightRenderer = null!; - public override IColour BackColour => ColourFactory.GetColour(0.4f, 0.4f, 0.4f, 1); + public override IColour BackColour => ColourFactory.GetColour(0.4f, 0.4f, 0.4f, 1); - } + public LightingRenderer(IWorld world) : base(world) + { + } + + } } diff --git a/CorgEng.Rendering/ComponentSystem/DepthParallax/DepthSpriteRenderComponent.cs b/CorgEng.Rendering/ComponentSystem/DepthParallax/DepthSpriteRenderComponent.cs index 535d24ce..825b0783 100644 --- a/CorgEng.Rendering/ComponentSystem/DepthParallax/DepthSpriteRenderComponent.cs +++ b/CorgEng.Rendering/ComponentSystem/DepthParallax/DepthSpriteRenderComponent.cs @@ -23,7 +23,7 @@ public override ISpriteRenderer SpriteRenderer { if (!ParallaxLayerRenderCore.parallaxRenderCores.ContainsKey((int)SpriteRendererIdentifier)) return null; - _spriteRenderer = ParallaxLayerRenderCore.parallaxRenderCores[(int)SpriteRendererIdentifier][(int)Sprite.Layer-1].renderer; + _spriteRenderer = ParallaxLayerRenderCore.parallaxRenderCores[(int)SpriteRendererIdentifier][(int)Sprite.Layer-1]; cachedSpriteRendererIdentifier = SpriteRendererIdentifier; } return _spriteRenderer; diff --git a/CorgEng.Rendering/ComponentSystem/SpriteRendering/SpriteRenderComponent.cs b/CorgEng.Rendering/ComponentSystem/SpriteRendering/SpriteRenderComponent.cs index 1e10c8aa..26c5c78e 100644 --- a/CorgEng.Rendering/ComponentSystem/SpriteRendering/SpriteRenderComponent.cs +++ b/CorgEng.Rendering/ComponentSystem/SpriteRendering/SpriteRenderComponent.cs @@ -59,7 +59,7 @@ public class SpriteRenderComponent : Component, IInstantiatable internal bool WantsToRender { get; set; } = true; - private int cachedSpriteRendererIdentifier = 0; + protected int cachedSpriteRendererIdentifier = 0; protected ISpriteRenderer _spriteRenderer; diff --git a/CorgEng.Rendering/DepthParallax/ParallaxLayerRenderCore.cs b/CorgEng.Rendering/DepthParallax/ParallaxLayerRenderCore.cs index 176e82bc..b9c92eef 100644 --- a/CorgEng.Rendering/DepthParallax/ParallaxLayerRenderCore.cs +++ b/CorgEng.Rendering/DepthParallax/ParallaxLayerRenderCore.cs @@ -2,6 +2,7 @@ using CorgEng.Core.Dependencies; using CorgEng.Core.Rendering; using CorgEng.GenericInterfaces.EntityComponentSystem; +using CorgEng.GenericInterfaces.Rendering; using CorgEng.GenericInterfaces.Rendering.Renderers; using CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering; using CorgEng.Rendering.SpriteRendering; @@ -14,7 +15,7 @@ namespace CorgEng.Rendering.DepthParallax { - public class ParallaxLayerRenderCore : RenderCore + public class ParallaxLayerRenderCore : SpriteRenderer { [UsingDependency] @@ -30,11 +31,6 @@ public class ParallaxLayerRenderCore : RenderCore /// private ParallaxLayerRenderCore? next; - /// - /// The renderer - /// - internal ISpriteRenderer renderer; - /// /// Parallax render cores that are active in the world /// @@ -56,22 +52,18 @@ public ParallaxLayerRenderCore(IWorld world, int identifier, int layer) : base(w public override void Initialize() { - renderer = SpriteRendererFactory.CreateSpriteRenderer(0); - renderer.Initialize(); + base.Initialize(); next?.Initialize(); } - public override void PerformRender() + public override void Render(ICamera camera) { - // Render our current layer then pass that on to the next render core to draw - renderer.Render(CorgEngMain.MainCamera); + base.Render(camera); // Now render the layer below us if (next != null) { - next.DoRender(() => { - DrawToBuffer(next.FrameBufferUint, 0, 0, Width, Height); - }); - // Render the layer below us onto our layer + // TODO: Make the next layer not draw to the screen too + next.Render(camera); next.DrawToBuffer(FrameBufferUint, 1, 1, Width, Height); } } diff --git a/CorgEng.Rendering/InstancedRenderer.cs b/CorgEng.Rendering/InstancedRenderer.cs index 49d637c4..f5a2d91e 100644 --- a/CorgEng.Rendering/InstancedRenderer.cs +++ b/CorgEng.Rendering/InstancedRenderer.cs @@ -59,10 +59,15 @@ public abstract partial class InstancedRenderer public int Plane { get; private set; } - public override void Initialize() + public bool Initialized { get; set; } = false; + + public override void Initialize() { - base.Initialize(); - // Create the shaders + base.Initialize(); + if (Initialized) + throw new Exception($"Render core {GetType()} is initialised already."); + Initialized = true; + // Create the shaders CreateShaders(); //Create a program for the renderer programUint = glCreateProgram(); diff --git a/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRenderer.cs b/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRenderer.cs index 5239d8b6..b7a1d738 100644 --- a/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRenderer.cs +++ b/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRenderer.cs @@ -1,4 +1,5 @@ -using CorgEng.GenericInterfaces.Rendering.Renderers.ParallaxRenderer; +using CorgEng.GenericInterfaces.EntityComponentSystem; +using CorgEng.GenericInterfaces.Rendering.Renderers.ParallaxRenderer; using System; using System.Collections.Generic; using System.Linq; @@ -9,8 +10,10 @@ namespace CorgEng.Rendering.SpriteRendering.Parallax { internal class ParallaxRenderer : SpriteRenderer, IParallaxRenderer { + public ParallaxRenderer(IWorld world) : base(world) + { } - protected override void CreateShaders() + protected override void CreateShaders() { _shaderSet = ShaderFactory.CreateShaderSet("ParallaxShader"); } diff --git a/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRendererFactory.cs b/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRendererFactory.cs index 7c8bad6e..4d3c9699 100644 --- a/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRendererFactory.cs +++ b/CorgEng.Rendering/SpriteRendering/Parallax/ParallaxRendererFactory.cs @@ -1,4 +1,5 @@ using CorgEng.DependencyInjection.Dependencies; +using CorgEng.GenericInterfaces.EntityComponentSystem; using CorgEng.GenericInterfaces.Rendering.Renderers.ParallaxRenderer; using System; using System.Collections.Generic; @@ -11,9 +12,9 @@ namespace CorgEng.Rendering.SpriteRendering.Parallax [Dependency] internal class ParallaxRendererFactory : IParallaxRendererFactory { - public IParallaxRenderer CreateParallaxRenderer(int plane) + public IParallaxRenderer CreateParallaxRenderer(IWorld world, int plane) { - return new ParallaxRenderer(); + return new ParallaxRenderer(world); } } } diff --git a/CorgEng.Rendering/SpriteRendering/SpriteRenderer.cs b/CorgEng.Rendering/SpriteRendering/SpriteRenderer.cs index 099225ad..d8b935ec 100644 --- a/CorgEng.Rendering/SpriteRendering/SpriteRenderer.cs +++ b/CorgEng.Rendering/SpriteRendering/SpriteRenderer.cs @@ -1,5 +1,6 @@ using CorgEng.Core.Dependencies; using CorgEng.DependencyInjection.Dependencies; +using CorgEng.GenericInterfaces.EntityComponentSystem; using CorgEng.GenericInterfaces.Rendering; using CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering; using CorgEng.GenericInterfaces.Rendering.RenderObjects.SpriteRendering; @@ -27,7 +28,11 @@ public class SpriteRenderer : InstancedRenderer _shaderSet; - protected override void CreateShaders() + public SpriteRenderer(IWorld world) : base(world) + { + } + + protected override void CreateShaders() { _shaderSet = ShaderFactory.CreateShaderSet("SpriteShader"); } @@ -66,9 +71,9 @@ public void StopRendering(ISpriteRenderObject spriteRenderObject) spriteRenderObject.SetBelongingBatchElement(null); } - private int textureSamplerUniformLocation; + private int textureSamplerUniformLocation; - protected override void LoadUniformVariableLocations() + protected override void LoadUniformVariableLocations() { base.LoadUniformVariableLocations(); textureSamplerUniformLocation = glGetUniformLocation(programUint, "renderTexture"); diff --git a/CorgEng.Rendering/SpriteRendering/SpriteRendererFactory.cs b/CorgEng.Rendering/SpriteRendering/SpriteRendererFactory.cs index 7304a303..6a86d7e7 100644 --- a/CorgEng.Rendering/SpriteRendering/SpriteRendererFactory.cs +++ b/CorgEng.Rendering/SpriteRendering/SpriteRendererFactory.cs @@ -1,4 +1,5 @@ using CorgEng.DependencyInjection.Dependencies; +using CorgEng.GenericInterfaces.EntityComponentSystem; using CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering; using System; using System.Collections.Generic; @@ -12,10 +13,11 @@ namespace CorgEng.Rendering.SpriteRendering public class SpriteRendererFactory : ISpriteRendererFactory { - public ISpriteRenderer CreateSpriteRenderer(int plane) + public ISpriteRenderer CreateSpriteRenderer(IWorld world, int plane) { - return new SpriteRenderer(); - } + var spriteRenderer = new SpriteRenderer(world); + return spriteRenderer; + } } } diff --git a/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceText.cs b/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceText.cs index 15b9f4d5..b37c3968 100644 --- a/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceText.cs +++ b/CorgEng.UserInterface/UserInterfaceComponents/UserInterfaceText.cs @@ -61,7 +61,7 @@ private void Setup(IDictionary arguments) //Create the camera IsometricCamera = IsometricCameraFactory.CreateCamera(); //Create the renderer (Local, since UI) - spriteRenderer = SpriteRendererFactory.CreateSpriteRenderer(Constants.RenderingConstants.NETWORK_RENDERING_ID_LOCAL); + spriteRenderer = SpriteRendererFactory.CreateSpriteRenderer(world, Constants.RenderingConstants.NETWORK_RENDERING_ID_LOCAL); spriteRenderer.Initialize(); //Get the font to use string typeface; From 20586d089c66f393e57c2f6e43417665a6273603 Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Sat, 16 Sep 2023 22:15:29 +0100 Subject: [PATCH 06/11] Optimisations --- CorgEng.Core/CorgEngMain.cs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/CorgEng.Core/CorgEngMain.cs b/CorgEng.Core/CorgEngMain.cs index ab7f5483..3c95cc5e 100644 --- a/CorgEng.Core/CorgEngMain.cs +++ b/CorgEng.Core/CorgEngMain.cs @@ -50,7 +50,7 @@ public static class CorgEngMain /// /// Render planes that are staged to start rendering /// - private static SortedList stagedRenderPlanes = new SortedList(); + private static volatile SortedList stagedRenderPlanes = new SortedList(); /// /// A sorted list containing the planes that are currently drawing directly to the screen. @@ -197,18 +197,21 @@ public static void TransferToRenderingThread() { lastFrameTime = Glfw.Time; // Move the staged rendering planes into the active queue - lock (stagedRenderPlanes) + if (stagedRenderPlanes.Count > 0) { - foreach (var stagedPlane in stagedRenderPlanes) + lock (stagedRenderPlanes) { - renderingPlanes.TryAdd(stagedPlane.Key, stagedPlane.Value); - if (!stagedPlane.Value.Initialized) + foreach (var stagedPlane in stagedRenderPlanes) { - stagedPlane.Value.Initialize(); - } - } - stagedRenderPlanes.Clear(); - } + renderingPlanes.TryAdd(stagedPlane.Key, stagedPlane.Value); + if (!stagedPlane.Value.Initialized) + { + stagedPlane.Value.Initialize(); + } + } + stagedRenderPlanes.Clear(); + } + } //Trigger any render thread code if (!queuedActions.IsEmpty) { From 16cdb2296aec1c8ba162c5f0e5e7d9d7635ad4b8 Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Sun, 12 May 2024 20:23:35 +0100 Subject: [PATCH 07/11] Changes the way we modify component values (#183) * Implements CVar * Fixes a few things that didnt work * Adds NetVar * NetVar framework * Some messy netvars * Adds the ability to queue arbitrary actions to run on a system thread This allows arbitrary actions to be called on a system without the requirement of a signal. This means that we can set the value of a variable on the thread which has ownership of that value. Note that these will not be networked and cannot be networked unlike signals. Hopefully this can be abstracted away when we introduce proper CVars and thread ownership management. * Contents no longer uses this module which doesn't exist * Cvars * Implements world to act as a container for static instances * Implements entity system setup * Implements processing systems * Implements world specific events, down to 8 failing tests * Fixes a failing test case * Optimises signal call from 30000 => 7000000 (Still only 1% of just calling methods though) * Fixes network initialisation order issues * Fixes processing systems constantly firing if control was relinquished * Fixes entity systems becoming deadlocked * Processing systems * Fixes entity system processing * Disables processing system debug * Adds in a rendering scaling mode, fixes button test * Update ExampleRenderCore.cs * Update NetCVar.cs * Fixes CVAR network communications. Deletes automap * Render Core Depth Output * Adds the ability to fetch the depth texture and render texture from render cores * Implements proper depth drawing across render core layers * Removes the depth program * Fixes the tests not compiling * Update RenderCore.cs * Update NetworkingTest.cs * Update DmiIconConversionUtility.csproj * Squashed commit of the following: commit 20586d089c66f393e57c2f6e43417665a6273603 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Sat Sep 16 22:15:29 2023 +0100 Optimisations commit 3c287ec329a81015dbf1f6be1168b2326f1ae6bc Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Sat Sep 16 21:33:53 2023 +0100 Fixes rendering commit f9f3a1d8839bccefa5876dd08b50e5c0aeb4649d Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Fri Sep 15 15:53:17 2023 +0100 Some more stuff to get compilation working commit 2b889fd2140f5a19c2ce6adf47694a3ea00e8917 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Fri Sep 15 14:57:03 2023 +0100 Update PlaneRenderer.cs commit 861e9bad4e8ba99525fde3a55fc19f7afe1d83c5 Merge: 5e5ad70 5eb6aa4 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Fri Sep 15 14:56:57 2023 +0100 Merge branch 'main' into Render-Core-Rework commit 5e5ad70ac7c270d7fd765245fb21f912b7f83732 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Fri Sep 15 14:37:27 2023 +0100 Render core reworks commit 924bde233b174bd362ecc3ac06377ca235993cac Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Thu Sep 14 22:16:16 2023 +0100 Updates the project manifest, merges render cores and renderers commit 5eb6aa4e320f0b072d5c4a7b2196664a05171405 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Thu Sep 14 21:30:24 2023 +0100 Update EULA (#179) commit 58010e2d70d49dcac553854e5403028b1433e9cf Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Thu Sep 14 21:27:51 2023 +0100 Adds the EULA (#178) commit e8efb77a3636b80665073ac297d5245145159780 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Wed Sep 13 19:15:10 2023 +0100 ECS & Networking Refactoring (#170) * Implements CVar * Fixes a few things that didnt work * Adds NetVar * NetVar framework * Some messy netvars * Adds the ability to queue arbitrary actions to run on a system thread This allows arbitrary actions to be called on a system without the requirement of a signal. This means that we can set the value of a variable on the thread which has ownership of that value. Note that these will not be networked and cannot be networked unlike signals. Hopefully this can be abstracted away when we introduce proper CVars and thread ownership management. * Contents no longer uses this module which doesn't exist * Cvars * Implements world to act as a container for static instances * Implements entity system setup * Implements processing systems * Implements world specific events, down to 8 failing tests * Fixes a failing test case * Optimises signal call from 30000 => 7000000 (Still only 1% of just calling methods though) * Fixes network initialisation order issues * Fixes processing systems constantly firing if control was relinquished * Fixes entity systems becoming deadlocked * Processing systems * Fixes entity system processing * Disables processing system debug * Adds in a rendering scaling mode, fixes button test * Update ExampleRenderCore.cs * Update NetCVar.cs * Fixes CVAR network communications. Deletes automap * Render Core Depth Output * Adds the ability to fetch the depth texture and render texture from render cores * Implements proper depth drawing across render core layers * Removes the depth program * Fixes the tests not compiling * Update RenderCore.cs * Update NetworkingTest.cs commit eb223305ca097242f1acbb760119bc6e303f4358 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Thu Apr 6 22:53:06 2023 +0100 Adds my discord link to the readme (#174) commit 52d56d519e74c570b6292ead5137319df9b9b43a Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Thu Apr 6 22:47:39 2023 +0100 Create FUNDING.yml (#172) * Squashed commit of the following: commit 20586d089c66f393e57c2f6e43417665a6273603 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Sat Sep 16 22:15:29 2023 +0100 Optimisations commit 3c287ec329a81015dbf1f6be1168b2326f1ae6bc Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Sat Sep 16 21:33:53 2023 +0100 Fixes rendering commit f9f3a1d8839bccefa5876dd08b50e5c0aeb4649d Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Fri Sep 15 15:53:17 2023 +0100 Some more stuff to get compilation working commit 2b889fd2140f5a19c2ce6adf47694a3ea00e8917 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Fri Sep 15 14:57:03 2023 +0100 Update PlaneRenderer.cs commit 861e9bad4e8ba99525fde3a55fc19f7afe1d83c5 Merge: 5e5ad70 5eb6aa4 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Fri Sep 15 14:56:57 2023 +0100 Merge branch 'main' into Render-Core-Rework commit 5e5ad70ac7c270d7fd765245fb21f912b7f83732 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Fri Sep 15 14:37:27 2023 +0100 Render core reworks commit 924bde233b174bd362ecc3ac06377ca235993cac Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Thu Sep 14 22:16:16 2023 +0100 Updates the project manifest, merges render cores and renderers commit 5eb6aa4e320f0b072d5c4a7b2196664a05171405 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Thu Sep 14 21:30:24 2023 +0100 Update EULA (#179) commit 58010e2d70d49dcac553854e5403028b1433e9cf Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Thu Sep 14 21:27:51 2023 +0100 Adds the EULA (#178) commit e8efb77a3636b80665073ac297d5245145159780 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Wed Sep 13 19:15:10 2023 +0100 ECS & Networking Refactoring (#170) * Implements CVar * Fixes a few things that didnt work * Adds NetVar * NetVar framework * Some messy netvars * Adds the ability to queue arbitrary actions to run on a system thread This allows arbitrary actions to be called on a system without the requirement of a signal. This means that we can set the value of a variable on the thread which has ownership of that value. Note that these will not be networked and cannot be networked unlike signals. Hopefully this can be abstracted away when we introduce proper CVars and thread ownership management. * Contents no longer uses this module which doesn't exist * Cvars * Implements world to act as a container for static instances * Implements entity system setup * Implements processing systems * Implements world specific events, down to 8 failing tests * Fixes a failing test case * Optimises signal call from 30000 => 7000000 (Still only 1% of just calling methods though) * Fixes network initialisation order issues * Fixes processing systems constantly firing if control was relinquished * Fixes entity systems becoming deadlocked * Processing systems * Fixes entity system processing * Disables processing system debug * Adds in a rendering scaling mode, fixes button test * Update ExampleRenderCore.cs * Update NetCVar.cs * Fixes CVAR network communications. Deletes automap * Render Core Depth Output * Adds the ability to fetch the depth texture and render texture from render cores * Implements proper depth drawing across render core layers * Removes the depth program * Fixes the tests not compiling * Update RenderCore.cs * Update NetworkingTest.cs commit eb223305ca097242f1acbb760119bc6e303f4358 Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Thu Apr 6 22:53:06 2023 +0100 Adds my discord link to the readme (#174) commit 52d56d519e74c570b6292ead5137319df9b9b43a Author: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Thu Apr 6 22:47:39 2023 +0100 Create FUNDING.yml (#172) --- DmiIconConversionUtility/DmiIconConversionUtility.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DmiIconConversionUtility/DmiIconConversionUtility.csproj b/DmiIconConversionUtility/DmiIconConversionUtility.csproj index 5be6542c..40cdfed4 100644 --- a/DmiIconConversionUtility/DmiIconConversionUtility.csproj +++ b/DmiIconConversionUtility/DmiIconConversionUtility.csproj @@ -53,6 +53,6 @@ all - + \ No newline at end of file From 83d33e1a9b86dbb5fc7c7911a99638681a013f5a Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Sun, 12 May 2024 20:24:33 +0100 Subject: [PATCH 08/11] Removes the functional module --- CorgEng.Functional/CorgEng.Functional.csproj | 9 ---- CorgEng.Functional/Monads/Result.cs | 47 -------------------- 2 files changed, 56 deletions(-) delete mode 100644 CorgEng.Functional/CorgEng.Functional.csproj delete mode 100644 CorgEng.Functional/Monads/Result.cs diff --git a/CorgEng.Functional/CorgEng.Functional.csproj b/CorgEng.Functional/CorgEng.Functional.csproj deleted file mode 100644 index 132c02c5..00000000 --- a/CorgEng.Functional/CorgEng.Functional.csproj +++ /dev/null @@ -1,9 +0,0 @@ - - - - net6.0 - enable - enable - - - diff --git a/CorgEng.Functional/Monads/Result.cs b/CorgEng.Functional/Monads/Result.cs deleted file mode 100644 index 8af271b8..00000000 --- a/CorgEng.Functional/Monads/Result.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CorgEng.Functional.Monads -{ - public class Result - { - - public virtual bool HasValue { get; } = true; - - private T value; - - public Result(T value) - { - this.value = value; - } - - public Result Fail(Action failureAction) - { - if (HasValue) - return this; - failureAction(); - return this; - } - - public Result Then(Action successAction) - { - if (!HasValue) - return this; - successAction(value); - return this; - } - - } - - public class Failure : Result - { - - public Failure() : base(default) - { } - - public override bool HasValue => false; - } -} From d70e2e36faec81a0892edf54be55ce69adf1638e Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Sun, 12 May 2024 20:46:52 +0100 Subject: [PATCH 09/11] Some changes --- CorgEng.Core/CorgEng.Core.sln | 30 ++-------- CorgEng.Core/CorgEngMain.cs | 58 +++++++++++++------ .../Systems/EntitySystemManager.cs | 2 +- .../Systems/EntitySystemThreadManager.cs | 1 - CorgEng.Example.Server/CorgEngConfig.xml | 4 ++ CorgEng.Example.Server/Program.cs | 30 +++------- CorgEng.Example/Program.cs | 25 +------- CorgEng.InputHandling/InputHandler.cs | 12 ++-- CorgEng.Logging/Logging/ConsoleLogger.cs | 5 +- .../Networking/Client/NetworkClient.cs | 4 +- .../ProcessingSystemTest.cs | 2 +- 11 files changed, 72 insertions(+), 101 deletions(-) diff --git a/CorgEng.Core/CorgEng.Core.sln b/CorgEng.Core/CorgEng.Core.sln index cbf8b97e..eb9ef141 100644 --- a/CorgEng.Core/CorgEng.Core.sln +++ b/CorgEng.Core/CorgEng.Core.sln @@ -75,8 +75,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CorgEng.Lighting", "..\Corg EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CorgEng.EntityQuery", "..\CorgEng.EntityQuery\CorgEng.EntityQuery.csproj", "{CD4E414F-536D-454B-8423-9631952EF705}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CorgEng.Functional", "..\CorgEng.Functional\CorgEng.Functional.csproj", "{0C23728A-E2A5-48A7-BF6F-C6EC865900D0}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -215,8 +213,8 @@ Global {14E8A473-E0B8-4CB2-BA76-B322FA0EDADF}.Debug|Any CPU.Build.0 = Debug|Any CPU {14E8A473-E0B8-4CB2-BA76-B322FA0EDADF}.Debug|ARM32.ActiveCfg = Debug|ARM32 {14E8A473-E0B8-4CB2-BA76-B322FA0EDADF}.Debug|ARM32.Build.0 = Debug|ARM32 - {14E8A473-E0B8-4CB2-BA76-B322FA0EDADF}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {14E8A473-E0B8-4CB2-BA76-B322FA0EDADF}.Debug|ARM64.Build.0 = Debug|ARM64 + {14E8A473-E0B8-4CB2-BA76-B322FA0EDADF}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {14E8A473-E0B8-4CB2-BA76-B322FA0EDADF}.Debug|ARM64.Build.0 = Debug|Any CPU {14E8A473-E0B8-4CB2-BA76-B322FA0EDADF}.Debug|x64.ActiveCfg = Debug|Any CPU {14E8A473-E0B8-4CB2-BA76-B322FA0EDADF}.Debug|x64.Build.0 = Debug|Any CPU {14E8A473-E0B8-4CB2-BA76-B322FA0EDADF}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -415,8 +413,8 @@ Global {EB32BAE1-083D-4ECC-9627-BC83B8300A40}.Debug|Any CPU.Build.0 = Debug|Any CPU {EB32BAE1-083D-4ECC-9627-BC83B8300A40}.Debug|ARM32.ActiveCfg = Debug|ARM32 {EB32BAE1-083D-4ECC-9627-BC83B8300A40}.Debug|ARM32.Build.0 = Debug|ARM32 - {EB32BAE1-083D-4ECC-9627-BC83B8300A40}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {EB32BAE1-083D-4ECC-9627-BC83B8300A40}.Debug|ARM64.Build.0 = Debug|ARM64 + {EB32BAE1-083D-4ECC-9627-BC83B8300A40}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {EB32BAE1-083D-4ECC-9627-BC83B8300A40}.Debug|ARM64.Build.0 = Debug|Any CPU {EB32BAE1-083D-4ECC-9627-BC83B8300A40}.Debug|x64.ActiveCfg = Debug|Any CPU {EB32BAE1-083D-4ECC-9627-BC83B8300A40}.Debug|x64.Build.0 = Debug|Any CPU {EB32BAE1-083D-4ECC-9627-BC83B8300A40}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -651,26 +649,6 @@ Global {CD4E414F-536D-454B-8423-9631952EF705}.Release|x64.Build.0 = Release|Any CPU {CD4E414F-536D-454B-8423-9631952EF705}.Release|x86.ActiveCfg = Release|Any CPU {CD4E414F-536D-454B-8423-9631952EF705}.Release|x86.Build.0 = Release|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Debug|ARM32.ActiveCfg = Debug|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Debug|ARM32.Build.0 = Debug|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Debug|ARM64.Build.0 = Debug|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Debug|x64.ActiveCfg = Debug|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Debug|x64.Build.0 = Debug|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Debug|x86.ActiveCfg = Debug|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Debug|x86.Build.0 = Debug|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Release|Any CPU.Build.0 = Release|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Release|ARM32.ActiveCfg = Release|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Release|ARM32.Build.0 = Release|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Release|ARM64.ActiveCfg = Release|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Release|ARM64.Build.0 = Release|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Release|x64.ActiveCfg = Release|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Release|x64.Build.0 = Release|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Release|x86.ActiveCfg = Release|Any CPU - {0C23728A-E2A5-48A7-BF6F-C6EC865900D0}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/CorgEng.Core/CorgEngMain.cs b/CorgEng.Core/CorgEngMain.cs index 3c95cc5e..e00ac94c 100644 --- a/CorgEng.Core/CorgEngMain.cs +++ b/CorgEng.Core/CorgEngMain.cs @@ -6,6 +6,8 @@ using CorgEng.Core.Rendering.Exceptions; using CorgEng.GenericInterfaces.EntityComponentSystem; using CorgEng.GenericInterfaces.Logging; +using CorgEng.GenericInterfaces.Networking.Networking.Client; +using CorgEng.GenericInterfaces.Networking.Networking.Server; using CorgEng.GenericInterfaces.Rendering; using CorgEng.GenericInterfaces.Rendering.Renderers; using CorgEng.GenericInterfaces.Rendering.Renderers.SpriteRendering; @@ -79,6 +81,12 @@ public static class CorgEngMain [UsingDependency] private static ILogger Logger; + /// + /// The thing that we use to create the world + /// + [UsingDependency] + private static IWorldFactory WorldFactory; + /// /// Time of the last frame /// @@ -103,17 +111,17 @@ public static class CorgEngMain public static event Action OnReadyEvents = null; - private static IWorld primaryWorld = null; + private static IWorld _primaryWorld = null; /// /// The main world to use for the game for when one isn't accessible /// - public static IWorld PrimaryWorld + public static IWorld World { - get => primaryWorld; + get => _primaryWorld; set { - primaryWorld = value; - WorldInit(primaryWorld); + _primaryWorld = value; + WorldInit(_primaryWorld); } } /// @@ -130,13 +138,14 @@ public static IWorld PrimaryWorld /// Initializes the CorgEng game engine. /// Will call initialization on all CorgEng modules. /// - public static void Initialize(bool disableRendering = false) + public static void Initialize(string filePath, bool disableRendering = false, bool awaitOnError = true) { + LoadConfig(filePath, awaitOnError); try { // Reset the world list WorldList.Clear(); - //Load priority modules (Logging) + // Load priority modules (Logging) PriorityModuleInit(); Logger?.WriteLine("Starting CorgEng Application", LogType.DEBUG); if (disableRendering) @@ -145,21 +154,33 @@ public static void Initialize(bool disableRendering = false) ModuleInit(); return; } - //Enable rendering functionality + // Enable rendering functionality IsRendering = true; - //Create a new window + // Create a new window GameWindow = new CorgEngWindow(); GameWindow.Open(); Logger?.WriteLine("Successfully created primary window", LogType.DEBUG); - //Create the internal render master + // Create the internal render master InternalRenderMaster = new RenderMaster(); InternalRenderMaster.Initialize(); Logger?.WriteLine("Successfully initialized render master", LogType.DEBUG); - //Bind the render master size to the game window + // Bind the render master size to the game window GameWindow.OnWindowResized += InternalRenderMaster.SetWindowRenderSize; GameWindow.OnWindowResized += activeSizeDelegate; - //Load non-priority modules + // Load non-priority modules ModuleInit(); + // Create the world + if (World == null) + { + if (WorldFactory != null) + { + World = WorldFactory.CreateWorld(); + } + else + { + Logger?.WriteLine($"The world module is not loaded, meaning that no base game was created.", LogType.WARNING); + } + } } catch (System.Exception e) { @@ -300,7 +321,7 @@ public static IRenderer GetRendererForPlane(int renderCorePlane) { return renderCores.GetOrAdd(renderCorePlane, plane => { // Fetch a default render core implementation - var spriteRenderer = SpriteRendererFactory.CreateSpriteRenderer(primaryWorld, plane); + var spriteRenderer = SpriteRendererFactory.CreateSpriteRenderer(_primaryWorld, plane); lock (stagedRenderPlanes) { stagedRenderPlanes.Add(plane, spriteRenderer); @@ -335,14 +356,14 @@ public static void Shutdown() /// TODO: Whitelist/blacklist types and add sandboxing /// /// - public static void LoadConfig(string filePath, bool embeddedResource = true, bool awaitOnError = true) + private static void LoadConfig(string filePath, bool awaitOnError = true) { try { string resourceName; Stream resourceStream; //Locate the config resources file - if (embeddedResource) + if (!File.Exists(filePath)) { resourceName = Assembly.GetEntryAssembly().GetManifestResourceNames().Single(str => str.EndsWith(filePath)); resourceStream = Assembly.GetEntryAssembly().GetManifestResourceStream(resourceName); @@ -384,6 +405,9 @@ public static void LoadConfig(string filePath, bool embeddedResource = true, boo } LoadedAssemblyModules = loadedAssemblies; break; + case "WindowName": + WindowName = childElement.Value; + break; default: Console.Error.WriteLine($"[CorgEng Config Error]: Error parsing config, unknown config attribute {childElement.Name}."); break; @@ -561,7 +585,6 @@ public static void ExecuteIn(Action action, double executeTime) } } double timeToFire = Time + executeTime * 0.001; - Logger.WriteLine($"Action queued to fire at {timeToFire}", LogType.WARNING); // 0 or negative execution time if (timeToFire <= Time) { @@ -614,7 +637,7 @@ internal static void CheckQueuedExecutions() public static void Cleanup() { MainCamera = null; - primaryWorld = null; + _primaryWorld = null; foreach (IWorld world in WorldList) { world.Cleanup(); @@ -623,6 +646,5 @@ public static void Cleanup() queuedActions.Clear(); Logger.WriteLine("Full cleanup of CorgEng application completed.", LogType.DEBUG); } - } } diff --git a/CorgEng.EntityComponentSystem/Systems/EntitySystemManager.cs b/CorgEng.EntityComponentSystem/Systems/EntitySystemManager.cs index e191e46a..499bd061 100644 --- a/CorgEng.EntityComponentSystem/Systems/EntitySystemManager.cs +++ b/CorgEng.EntityComponentSystem/Systems/EntitySystemManager.cs @@ -50,7 +50,7 @@ internal class EntitySystemManager : IEntitySystemManager /// internal Dictionary> RegisteredSystemSignalHandlers { get; } = new Dictionary>(); - private EntitySystemThreadManager entitySystemThreadManager = new EntitySystemThreadManager(4); + private EntitySystemThreadManager entitySystemThreadManager = new EntitySystemThreadManager(1); private IWorld world; diff --git a/CorgEng.EntityComponentSystem/Systems/EntitySystemThreadManager.cs b/CorgEng.EntityComponentSystem/Systems/EntitySystemThreadManager.cs index 99ccdc1c..30b56f8b 100644 --- a/CorgEng.EntityComponentSystem/Systems/EntitySystemThreadManager.cs +++ b/CorgEng.EntityComponentSystem/Systems/EntitySystemThreadManager.cs @@ -91,7 +91,6 @@ public void EnqueueSystemForProcessing(EntitySystem system) public void FireSystemIn(EntitySystem system, double fireTime) { CorgEngMain.ExecuteIn(() => { - Logger.WriteLine($"Attempting to queue system {system} for processing fire at {CorgEngMain.Time}", LogType.TEMP); system.QueueProcessing(); }, fireTime); } diff --git a/CorgEng.Example.Server/CorgEngConfig.xml b/CorgEng.Example.Server/CorgEngConfig.xml index 0ae947d7..2e2c8b3b 100644 --- a/CorgEng.Example.Server/CorgEngConfig.xml +++ b/CorgEng.Example.Server/CorgEngConfig.xml @@ -1,4 +1,5 @@  + CorgEng.ContentLoading @@ -18,4 +19,7 @@ CorgEng.UserInterface CorgEng.World + + CorgEngApplication Server + diff --git a/CorgEng.Example.Server/Program.cs b/CorgEng.Example.Server/Program.cs index fe43d441..41be113d 100644 --- a/CorgEng.Example.Server/Program.cs +++ b/CorgEng.Example.Server/Program.cs @@ -57,33 +57,21 @@ class Program [UsingDependency] private static INetworkConfig NetworkConfig; - [UsingDependency] - private static IWorldFactory WorldFactory; - - public static IWorld ServerWorld; - static void Main(string[] args) { - //Load the application config - CorgEngMain.LoadConfig("CorgEngConfig.xml"); - CorgEngMain.WindowName = "CorgEngApplication Server"; //Initialize CorgEng in headless mode #if !DEBUG_RENDERING - CorgEngMain.Initialize(true); + CorgEngMain.Initialize("CorgEngConfig.xml", true); #else - CorgEngMain.Initialize(); - - // Create the program world - ServerWorld = WorldFactory.CreateWorld(); - CorgEngMain.PrimaryWorld = ServerWorld; + CorgEngMain.Initialize("CorgEngConfig.xml"); //Start networking server - ServerWorld.ServerInstance.StartHosting(5000); + CorgEngMain.World.ServerInstance.StartHosting(5000); //Debug NetworkConfig.ProcessClientSystems = true; - ServerWorld.EntityManager.CreateEmptyEntity(entity => { + CorgEngMain.World.EntityManager.CreateEmptyEntity(entity => { IIsometricCamera camera = IsometricCameraFactory.CreateCamera(); camera.Width = 30; camera.Height = 30; @@ -95,7 +83,7 @@ static void Main(string[] args) }); // Create a lighting debugger - ServerWorld.EntityManager.CreateEmptyEntity(entity => { + CorgEngMain.World.EntityManager.CreateEmptyEntity(entity => { entity.AddComponent(new TransformComponent()); entity.AddComponent(new FollowCursorComponent()); entity.AddComponent(new SpriteRenderComponent()); @@ -161,7 +149,7 @@ private static void BuildWorld() { for (int yv = Math.Min(start_y, end_y); yv <= Math.Max(start_y, end_y); yv++) { - ServerWorld.EntityManager.CreateEmptyEntity(testingEntity => { + CorgEngMain.World.EntityManager.CreateEmptyEntity(testingEntity => { //Add components testingEntity.AddComponent(new NetworkTransformComponent()); testingEntity.AddComponent(new SpriteRenderComponent()); @@ -178,7 +166,7 @@ private static void BuildWorld() }); //Create a testing entity - ServerWorld.EntityManager.CreateEmptyEntity(testingEntity => { + CorgEngMain.World.EntityManager.CreateEmptyEntity(testingEntity => { //Add components testingEntity.AddComponent(new NetworkTransformComponent()); testingEntity.AddComponent(new SpriteRenderComponent()); @@ -192,13 +180,13 @@ private static void BuildWorld() private static void SetPlayerPrototype() { - ServerWorld.EntityManager.CreateEmptyEntity(playerPrototype => { + CorgEngMain.World.EntityManager.CreateEmptyEntity(playerPrototype => { playerPrototype.AddComponent(new ClientComponent()); playerPrototype.AddComponent(new NetworkTransformComponent()); playerPrototype.AddComponent(new SpriteRenderComponent() { Sprite = IconFactory.CreateIcon("human.ghost", 5, Constants.RenderingConstants.DEFAULT_RENDERER_PLANE), SpriteRendererIdentifier = 1 }); playerPrototype.AddComponent(new PlayerMovementComponent()); IPrototype prototype = PrototypeManager.GetPrototype(playerPrototype); - ServerWorld.ServerInstance.SetClientPrototype(prototype); + CorgEngMain.World.ServerInstance.SetClientPrototype(prototype); new DeleteEntityEvent().Raise(playerPrototype); }); } diff --git a/CorgEng.Example/Program.cs b/CorgEng.Example/Program.cs index a425deb9..2ba4a149 100644 --- a/CorgEng.Example/Program.cs +++ b/CorgEng.Example/Program.cs @@ -20,39 +20,18 @@ class Program static void Main(string[] args) { - //Load the application config - CorgEngMain.LoadConfig("CorgEngConfig.xml"); //Initialize CorgEng //This creates the window and loads all //modules that are dependencies - CorgEngMain.Initialize(); - - // Create the world - IWorld world = WorldFactory.CreateWorld(); - CorgEngMain.PrimaryWorld = world; - - //Set the render core - - // Prevent failures - //Thread.Sleep(5000); + CorgEngMain.Initialize("CorgEngConfig.xml"); //Camera an isometric camera IIsometricCamera camera = isometricCameraFactory.CreateCamera(); CameraScrollSystem.IsometricCamera = camera; //Connect to our server - world.ClientInstance.AttemptConnection("127.0.0.1", 5000); + CorgEngMain.World.ClientInstance.AttemptConnection("127.0.0.1", 5000); - //Create the entity to hold and move the camera - /*Entity mainCameraEntity = new Entity(); - mainCameraEntity.AddComponent(new TransformComponent()); - mainCameraEntity.AddComponent(new PlayerMovementComponent()); - mainCameraEntity.AddComponent(new CameraComponent(camera)); - mainCameraEntity.AddComponent(new SpriteRenderComponent());*/ - /* - new SetSpriteEvent("human.ghost").Raise(mainCameraEntity); - new SetSpriteRendererEvent(erc.spriteRenderer).Raise(mainCameraEntity); - */ //Set the main camera CorgEngMain.SetMainCamera(camera); //Transfer control of the main thread to the CorgEng diff --git a/CorgEng.InputHandling/InputHandler.cs b/CorgEng.InputHandling/InputHandler.cs index 352c7e7a..25ae50cb 100644 --- a/CorgEng.InputHandling/InputHandler.cs +++ b/CorgEng.InputHandling/InputHandler.cs @@ -76,7 +76,7 @@ private void HandleScroll(IntPtr window, double x, double y) { //Synchronous to prevent subsystem overloading, will not render the //next frame until this is handled. - new MouseScrollEvent(y).RaiseGlobally(CorgEngMain.PrimaryWorld, synchronous: true); + new MouseScrollEvent(y).RaiseGlobally(CorgEngMain.World, synchronous: true); //Trigger the new actions foreach (string actionName in boundScrollActions) { @@ -96,7 +96,7 @@ private void HandleCursorMove(IntPtr window, double x, double y) { //Synchronous to prevent subsystem overloading, will not render the //next frame until this is handled. - new MouseMoveEvent(x / CorgEngMain.GameWindow.Width, y / CorgEngMain.GameWindow.Height).RaiseGlobally(CorgEngMain.PrimaryWorld, synchronous: true); + new MouseMoveEvent(x / CorgEngMain.GameWindow.Width, y / CorgEngMain.GameWindow.Height).RaiseGlobally(CorgEngMain.World, synchronous: true); //Trigger the new actions foreach (string actionName in boundMouseMoveActions) { @@ -134,7 +134,7 @@ private void HandleMousePress(IntPtr window, MouseButton button, InputState stat { return; } - mousePressEvent.RaiseGlobally(CorgEngMain.PrimaryWorld); + mousePressEvent.RaiseGlobally(CorgEngMain.World); mouseDownAt = CorgEngMain.Time; //Trigger the action if (!boundMouseActions.TryGetValue(button, out action)) @@ -153,7 +153,7 @@ private void HandleMousePress(IntPtr window, MouseButton button, InputState stat MouseReleaseEvent mouseReleaseEvent = new MouseReleaseEvent(x / width, y / height, button, modifiers); mouseReleaseEvent.HeldTime = CorgEngMain.Time - mouseDownAt; //Raise synchronously, so we can determine if the event was handled - mouseReleaseEvent.RaiseGlobally(CorgEngMain.PrimaryWorld, true); + mouseReleaseEvent.RaiseGlobally(CorgEngMain.World, true); //Handle world clicks if (!mouseReleaseEvent.Handled && mouseReleaseEvent.MouseButton == MouseButton.Left) { @@ -192,7 +192,7 @@ private void HandleKeyboardPress(IntPtr window, Keys key, int scanCode, InputSta { case InputState.Press: KeyPressEvent keyPressEvent = new KeyPressEvent(key, mods); - keyPressEvent.RaiseGlobally(CorgEngMain.PrimaryWorld); + keyPressEvent.RaiseGlobally(CorgEngMain.World); lock (heldKeysDownAt) { heldKeysDownAt.Add(key, CorgEngMain.Time); @@ -214,7 +214,7 @@ private void HandleKeyboardPress(IntPtr window, Keys key, int scanCode, InputSta try { KeyReleaseEvent keyReleaseEvent = new KeyReleaseEvent(key, mods); - keyReleaseEvent.RaiseGlobally(CorgEngMain.PrimaryWorld); + keyReleaseEvent.RaiseGlobally(CorgEngMain.World); //Trigger the action if (!boundKeyActions.TryGetValue(key, out action)) return; diff --git a/CorgEng.Logging/Logging/ConsoleLogger.cs b/CorgEng.Logging/Logging/ConsoleLogger.cs index 49b654d8..0a86160f 100644 --- a/CorgEng.Logging/Logging/ConsoleLogger.cs +++ b/CorgEng.Logging/Logging/ConsoleLogger.cs @@ -1,4 +1,5 @@ -using CorgEng.Core.Modules; +using CorgEng.Core; +using CorgEng.Core.Modules; using CorgEng.DependencyInjection.Dependencies; using CorgEng.GenericInterfaces.Logging; using System; @@ -47,7 +48,7 @@ public void WriteLine(object message, LogType logType) ExceptionCount++; DateTime logTime = DateTime.Now; - string logText = $"[{Thread.CurrentThread.Name ?? $"T{Thread.CurrentThread.ManagedThreadId}"}][{logType}][{logTime}]"; + string logText = $"[{Thread.CurrentThread.Name ?? $"T{Thread.CurrentThread.ManagedThreadId}"}][{logType}][{logTime}/{CorgEngMain.Time:F3}]"; lock (consoleLock) { //Ignore this log diff --git a/CorgEng.Networking/Networking/Client/NetworkClient.cs b/CorgEng.Networking/Networking/Client/NetworkClient.cs index 4888a860..e46e3731 100644 --- a/CorgEng.Networking/Networking/Client/NetworkClient.cs +++ b/CorgEng.Networking/Networking/Client/NetworkClient.cs @@ -310,7 +310,7 @@ protected override void HandleMessage(IPEndPoint sender, PacketHeaders header, b Logger.WriteMetric("networked_global_event", raisedEvent.GetType().ToString()); //Deserialize the event raisedEvent.Deserialise(reader); - raisedEvent.RaiseGlobally(CorgEngMain.PrimaryWorld, false); + raisedEvent.RaiseGlobally(CorgEngMain.World, false); } } return; @@ -341,7 +341,7 @@ protected override void HandleMessage(IPEndPoint sender, PacketHeaders header, b double viewOffsetHeight = reader.ReadDouble(); //Update our view //Send a signal - new ModifyIsometricView(viewX + viewOffsetX, viewY + viewOffsetY, viewZ, viewOffsetWidth, viewOffsetHeight).RaiseGlobally(CorgEngMain.PrimaryWorld); + new ModifyIsometricView(viewX + viewOffsetX, viewY + viewOffsetY, viewZ, viewOffsetWidth, viewOffsetHeight).RaiseGlobally(CorgEngMain.World); } } return; diff --git a/CorgEng.Tests/EntityComponentSystem/ProcessingSystemTest.cs b/CorgEng.Tests/EntityComponentSystem/ProcessingSystemTest.cs index fe4cc63e..a59e75ec 100644 --- a/CorgEng.Tests/EntityComponentSystem/ProcessingSystemTest.cs +++ b/CorgEng.Tests/EntityComponentSystem/ProcessingSystemTest.cs @@ -58,7 +58,7 @@ public override void SystemSetup(IWorld world) public void TestProcessingSystems() { IWorld world = WorldFactory.CreateWorld(); - CorgEngMain.PrimaryWorld = world; + CorgEngMain.World = world; //Create an entity to process IEntity testEntity = world.EntityManager.CreateEmptyEntity(null); TestComponent testComponent = new TestComponent(); From d6ec3d2133bc96b34b2f80efaadcd649cf083574 Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Sun, 12 May 2024 20:53:08 +0100 Subject: [PATCH 10/11] Adds CorgEC --- .gitmodules | 3 +++ CorgEC | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 CorgEC diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..b4f62baf --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "CorgEC"] + path = CorgEC + url = https://github.com/PowerfulBacon/CorgEC diff --git a/CorgEC b/CorgEC new file mode 160000 index 00000000..0bd28adb --- /dev/null +++ b/CorgEC @@ -0,0 +1 @@ +Subproject commit 0bd28adbda007ff1999d3338f7f89caa3416e57f From 2b6c4ac1c69072077eb1a77199f79d1bd50e19b1 Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Sun, 12 May 2024 20:54:12 +0100 Subject: [PATCH 11/11] Update CorgEng.Core.sln --- CorgEng.Core/CorgEng.Core.sln | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CorgEng.Core/CorgEng.Core.sln b/CorgEng.Core/CorgEng.Core.sln index eb9ef141..d5fd894b 100644 --- a/CorgEng.Core/CorgEng.Core.sln +++ b/CorgEng.Core/CorgEng.Core.sln @@ -75,6 +75,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CorgEng.Lighting", "..\Corg EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CorgEng.EntityQuery", "..\CorgEng.EntityQuery\CorgEng.EntityQuery.csproj", "{CD4E414F-536D-454B-8423-9631952EF705}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ECCore", "..\CorgEC\ECCore\ECCore.csproj", "{CD1C4D5D-1534-4126-8F86-E52B87A50BA7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -649,6 +651,26 @@ Global {CD4E414F-536D-454B-8423-9631952EF705}.Release|x64.Build.0 = Release|Any CPU {CD4E414F-536D-454B-8423-9631952EF705}.Release|x86.ActiveCfg = Release|Any CPU {CD4E414F-536D-454B-8423-9631952EF705}.Release|x86.Build.0 = Release|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Debug|ARM32.ActiveCfg = Debug|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Debug|ARM32.Build.0 = Debug|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Debug|ARM64.Build.0 = Debug|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Debug|x64.ActiveCfg = Debug|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Debug|x64.Build.0 = Debug|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Debug|x86.ActiveCfg = Debug|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Debug|x86.Build.0 = Debug|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Release|Any CPU.Build.0 = Release|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Release|ARM32.ActiveCfg = Release|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Release|ARM32.Build.0 = Release|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Release|ARM64.ActiveCfg = Release|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Release|ARM64.Build.0 = Release|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Release|x64.ActiveCfg = Release|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Release|x64.Build.0 = Release|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Release|x86.ActiveCfg = Release|Any CPU + {CD1C4D5D-1534-4126-8F86-E52B87A50BA7}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE