From 589d131246473d4e44e3b117f9495c21dd1bb18b Mon Sep 17 00:00:00 2001 From: Michel Fedde Date: Thu, 17 Sep 2020 21:28:16 +0200 Subject: [PATCH] 17.09.2020 + Generic Scene + Generic Camera + Generic Window + Contexts for drawing and updateing + very basic 2D-implermention --- SMCode/SM.Base/GenericWindow.cs | 47 -------------- SMCode/SM.Base/SM.Base.csproj | 17 ++++- SMCode/SM.Base/Scene/GenericCamera.cs | 26 ++++++++ SMCode/SM.Base/Scene/GenericScene.cs | 23 +++++++ SMCode/SM.Base/Scene/IShowCollection.cs | 9 +++ SMCode/SM.Base/Scene/IShowItem.cs | 10 +++ SMCode/SM.Base/Shader/Files/default.frag | 8 +++ SMCode/SM.Base/Shader/Files/default.vert | 9 +++ SMCode/SM.Base/Shader/InstanceShader.cs | 32 +++++++++ SMCode/SM.Base/Shader/Shaders.cs | 18 +++++ SMCode/SM.Base/TestShader.cs | 25 ------- SMCode/SM.Base/Window/Contexts/DrawContext.cs | 18 +++++ .../SM.Base/Window/Contexts/UpdateContext.cs | 7 ++ SMCode/SM.Base/Window/GenericWindow.cs | 65 +++++++++++++++++++ SMCode/SM.OGL/Shaders/GenericShader.cs | 7 +- SMCode/SM.OGL/Shaders/ShaderFileCollection.cs | 7 +- SMCode/SM2D/Drawing/DrawEmpty.cs | 24 +++++++ SMCode/SM2D/GLWindow2D.cs | 10 +++ SMCode/SM2D/OpenTK.dll.config | 25 +++++++ SMCode/SM2D/SM2D.csproj | 22 +++++++ SMCode/SM2D/Scene/Camera.cs | 22 +++++++ SMCode/SM2D/Scene/Scene.cs | 9 +++ SMCode/SM2D/packages.config | 4 ++ SM_TEST/Program.cs | 13 +++- SM_TEST/SM_TEST.csproj | 4 ++ 25 files changed, 383 insertions(+), 78 deletions(-) delete mode 100644 SMCode/SM.Base/GenericWindow.cs create mode 100644 SMCode/SM.Base/Scene/GenericCamera.cs create mode 100644 SMCode/SM.Base/Scene/GenericScene.cs create mode 100644 SMCode/SM.Base/Scene/IShowCollection.cs create mode 100644 SMCode/SM.Base/Scene/IShowItem.cs create mode 100644 SMCode/SM.Base/Shader/Files/default.frag create mode 100644 SMCode/SM.Base/Shader/Files/default.vert create mode 100644 SMCode/SM.Base/Shader/InstanceShader.cs create mode 100644 SMCode/SM.Base/Shader/Shaders.cs delete mode 100644 SMCode/SM.Base/TestShader.cs create mode 100644 SMCode/SM.Base/Window/Contexts/DrawContext.cs create mode 100644 SMCode/SM.Base/Window/Contexts/UpdateContext.cs create mode 100644 SMCode/SM.Base/Window/GenericWindow.cs create mode 100644 SMCode/SM2D/Drawing/DrawEmpty.cs create mode 100644 SMCode/SM2D/GLWindow2D.cs create mode 100644 SMCode/SM2D/OpenTK.dll.config create mode 100644 SMCode/SM2D/Scene/Camera.cs create mode 100644 SMCode/SM2D/Scene/Scene.cs create mode 100644 SMCode/SM2D/packages.config diff --git a/SMCode/SM.Base/GenericWindow.cs b/SMCode/SM.Base/GenericWindow.cs deleted file mode 100644 index c197949..0000000 --- a/SMCode/SM.Base/GenericWindow.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.IO; -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL4; -using SM.OGL.Shaders; - -namespace SM.Base -{ - public class GenericWindow : GameWindow - { - private TestShader shader; - private Matrix4 _viewMatrix; - - public GenericWindow() : base(1280, 720, GraphicsMode.Default, "Testing", GameWindowFlags.Default, DisplayDevice.Default, 0, 0, GraphicsContextFlags.Default, null, true) - { - - } - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - shader = new TestShader(new ShaderFileCollection(File.ReadAllText("test/test.vert"), File.ReadAllText("test/test.frag"))); - shader.Compile(); - } - - protected override void OnRenderFrame(FrameEventArgs e) - { - base.OnRenderFrame(e); - - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - shader.Draw(_viewMatrix); - - SwapBuffers(); - } - - protected override void OnResize(EventArgs e) - { - base.OnResize(e); - - GL.Viewport(ClientRectangle); - _viewMatrix = Matrix4.LookAt(Vector3.UnitZ, Vector3.Zero, Vector3.UnitY) * - Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(90), Width / Height, 0.1f, 100); - } - } -} \ No newline at end of file diff --git a/SMCode/SM.Base/SM.Base.csproj b/SMCode/SM.Base/SM.Base.csproj index 7a0472f..fffa410 100644 --- a/SMCode/SM.Base/SM.Base.csproj +++ b/SMCode/SM.Base/SM.Base.csproj @@ -45,14 +45,23 @@ - + + + + + + + + + - + + @@ -60,6 +69,8 @@ SM.OGL - + + + \ No newline at end of file diff --git a/SMCode/SM.Base/Scene/GenericCamera.cs b/SMCode/SM.Base/Scene/GenericCamera.cs new file mode 100644 index 0000000..ec3649b --- /dev/null +++ b/SMCode/SM.Base/Scene/GenericCamera.cs @@ -0,0 +1,26 @@ +using OpenTK; + +namespace SM.Base.Scene +{ + public abstract class GenericCamera + { + public static Matrix4 OrthographicWorld { get; protected set; } + public static Matrix4 PerspectiveWorld { get; protected set; } + public static Vector3 UpVector { get; set; } = Vector3.UnitY; + + public Matrix4 ViewMatrix { get; protected set; } + + public Matrix4 World => Orthographic ? OrthographicWorld : PerspectiveWorld; + + internal Matrix4 CalculateViewMatrix() + { + ViewMatrix = ViewCalculation(); + return ViewMatrix; + } + + public abstract Matrix4 ViewCalculation(); + + public abstract bool Orthographic { get; } + public abstract void RecalculateWorld(float width, float height); + } +} \ No newline at end of file diff --git a/SMCode/SM.Base/Scene/GenericScene.cs b/SMCode/SM.Base/Scene/GenericScene.cs new file mode 100644 index 0000000..d1da11e --- /dev/null +++ b/SMCode/SM.Base/Scene/GenericScene.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using SM.Base.Contexts; + +namespace SM.Base.Scene +{ + public abstract class GenericScene : IShowCollection + where TCamera : GenericCamera + { + + public List Objects { get; } = new List(); + public TCamera Camera { get; set; } + public Dictionary Cameras = new Dictionary(); + + public void Draw(DrawContext context) + { + if (!context.ForceViewport && Camera != null) context.View = Camera.ViewMatrix; + + for(int i = 0; i < Objects.Count; i++) + Objects[i].Draw(context); + } + + } +} \ No newline at end of file diff --git a/SMCode/SM.Base/Scene/IShowCollection.cs b/SMCode/SM.Base/Scene/IShowCollection.cs new file mode 100644 index 0000000..e7e7ad1 --- /dev/null +++ b/SMCode/SM.Base/Scene/IShowCollection.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace SM.Base.Scene +{ + public interface IShowCollection + { + List Objects { get; } + } +} \ No newline at end of file diff --git a/SMCode/SM.Base/Scene/IShowItem.cs b/SMCode/SM.Base/Scene/IShowItem.cs new file mode 100644 index 0000000..c30f43f --- /dev/null +++ b/SMCode/SM.Base/Scene/IShowItem.cs @@ -0,0 +1,10 @@ +using SM.Base.Contexts; + +namespace SM.Base.Scene +{ + public interface IShowItem + { + void Update(UpdateContext context); + void Draw(DrawContext context); + } +} \ No newline at end of file diff --git a/SMCode/SM.Base/Shader/Files/default.frag b/SMCode/SM.Base/Shader/Files/default.frag new file mode 100644 index 0000000..bf6a742 --- /dev/null +++ b/SMCode/SM.Base/Shader/Files/default.frag @@ -0,0 +1,8 @@ +#version 330 +uniform vec4 Tint; + +layout(location = 0) out vec4 color; + +void main() { + color = vec4(1,1,1,1) + Tint; +} \ No newline at end of file diff --git a/SMCode/SM.Base/Shader/Files/default.vert b/SMCode/SM.Base/Shader/Files/default.vert new file mode 100644 index 0000000..e17d5f4 --- /dev/null +++ b/SMCode/SM.Base/Shader/Files/default.vert @@ -0,0 +1,9 @@ +#version 330 +layout(location = 0) in vec3 aPos; + +uniform mat4 MVP; +uniform mat4 ModelMatrix; + +void main() { + gl_Position = MVP * ModelMatrix * vec4(aPos, 1); +} \ No newline at end of file diff --git a/SMCode/SM.Base/Shader/InstanceShader.cs b/SMCode/SM.Base/Shader/InstanceShader.cs new file mode 100644 index 0000000..cccbb7e --- /dev/null +++ b/SMCode/SM.Base/Shader/InstanceShader.cs @@ -0,0 +1,32 @@ +using System; +using OpenTK; +using OpenTK.Graphics.OpenGL4; +using SM.Base.Contexts; +using SM.Base.StaticObjects; +using SM.OGL.Shaders; + +namespace SM.Base.Shader +{ + public class InstanceShader : GenericShader + { + protected override bool AutoCompile { get; } = true; + + public Action SetUniform; + + public InstanceShader(string vertex, string fragment, Action setUniform) : base( + new ShaderFileCollection(vertex, fragment)) + { + SetUniform = setUniform; + } + public void Draw(DrawContext context) + { + GL.UseProgram(this); + + SetUniform.Invoke(Uniforms, context); + + DrawObject(context.Mesh, true); + + GL.UseProgram(0); + } + } +} \ No newline at end of file diff --git a/SMCode/SM.Base/Shader/Shaders.cs b/SMCode/SM.Base/Shader/Shaders.cs new file mode 100644 index 0000000..7546142 --- /dev/null +++ b/SMCode/SM.Base/Shader/Shaders.cs @@ -0,0 +1,18 @@ +using System.IO; +using System.Reflection; +using SM.OGL.Shaders; + +namespace SM.Base.Shader +{ + public class Shaders + { + public static InstanceShader Default = new InstanceShader(new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("SM.Base.Shader.Files.default.vert")).ReadToEnd(), + new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("SM.Base.Shader.Files.default.frag")).ReadToEnd(), + ((u, context) => + { + u["MVP"].SetMatrix4(context.View * context.World); + u["ModelMatrix"].SetMatrix4(context.ModelMatrix); + u["Tint"].SetUniform4(1,1,1,1); + })); + } +} \ No newline at end of file diff --git a/SMCode/SM.Base/TestShader.cs b/SMCode/SM.Base/TestShader.cs deleted file mode 100644 index 17d7237..0000000 --- a/SMCode/SM.Base/TestShader.cs +++ /dev/null @@ -1,25 +0,0 @@ -using OpenTK; -using OpenTK.Graphics.OpenGL4; -using SM.Base.StaticObjects; -using SM.OGL.Shaders; - -namespace SM.Base -{ - public class TestShader : GenericShader - { - public TestShader(ShaderFileCollection shaderFileFiles) : base(shaderFileFiles) - { - } - - public void Draw(Matrix4 mvp) - { - GL.UseProgram(this); - - Uniforms["MVP"].SetMatrix4(mvp); - - DrawObject(Plate.Object, true); - - GL.UseProgram(0); - } - } -} \ No newline at end of file diff --git a/SMCode/SM.Base/Window/Contexts/DrawContext.cs b/SMCode/SM.Base/Window/Contexts/DrawContext.cs new file mode 100644 index 0000000..ce68f87 --- /dev/null +++ b/SMCode/SM.Base/Window/Contexts/DrawContext.cs @@ -0,0 +1,18 @@ +using OpenTK; +using SM.Base.Scene; +using SM.OGL.Mesh; + +namespace SM.Base.Contexts +{ + public struct DrawContext + { + public bool ForceViewport; + + public Matrix4 World; + public Matrix4 View; + public Matrix4 ModelMatrix; + + public Mesh Mesh; + + } +} \ No newline at end of file diff --git a/SMCode/SM.Base/Window/Contexts/UpdateContext.cs b/SMCode/SM.Base/Window/Contexts/UpdateContext.cs new file mode 100644 index 0000000..c1cd5a8 --- /dev/null +++ b/SMCode/SM.Base/Window/Contexts/UpdateContext.cs @@ -0,0 +1,7 @@ +namespace SM.Base.Contexts +{ + public struct UpdateContext + { + public double Deltatime; + } +} \ No newline at end of file diff --git a/SMCode/SM.Base/Window/GenericWindow.cs b/SMCode/SM.Base/Window/GenericWindow.cs new file mode 100644 index 0000000..969f91c --- /dev/null +++ b/SMCode/SM.Base/Window/GenericWindow.cs @@ -0,0 +1,65 @@ +using System; +using System.IO; +using OpenTK; +using OpenTK.Graphics; +using OpenTK.Graphics.OpenGL4; +using SM.Base.Contexts; +using SM.Base.Scene; +using SM.Base.StaticObjects; +using SM.OGL.Shaders; + +namespace SM.Base +{ + public class GenericWindow : GameWindow + where TScene : GenericScene, new() + where TCamera : GenericCamera, new() + { + private TCamera _viewportCamera; + + public TScene CurrentScene { get; private set; } + public bool ForceViewportCamera { get; set; } = false; + + public GenericWindow() : base(1280, 720, GraphicsMode.Default, "Testing", GameWindowFlags.Default, DisplayDevice.Default, 0, 0, GraphicsContextFlags.Default, null, true) + { + _viewportCamera = new TCamera(); + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + } + + protected override void OnRenderFrame(FrameEventArgs e) + { + DrawContext drawContext = new DrawContext() + { + World = _viewportCamera.World, + View = _viewportCamera.CalculateViewMatrix(), + ModelMatrix = Matrix4.Identity, + Mesh = Plate.Object, + ForceViewport = ForceViewportCamera + }; + + base.OnRenderFrame(e); + + GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); + + CurrentScene.Draw(drawContext); + + SwapBuffers(); + } + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + GL.Viewport(ClientRectangle); + _viewportCamera.RecalculateWorld(Width, Height); + } + + public virtual void SetScene(TScene scene) + { + CurrentScene = scene; + } + } +} \ No newline at end of file diff --git a/SMCode/SM.OGL/Shaders/GenericShader.cs b/SMCode/SM.OGL/Shaders/GenericShader.cs index 913e6bb..246d0e4 100644 --- a/SMCode/SM.OGL/Shaders/GenericShader.cs +++ b/SMCode/SM.OGL/Shaders/GenericShader.cs @@ -15,7 +15,7 @@ namespace SM.OGL.Shaders ShaderFileFiles = shaderFileFiles; } - public void Compile() + public void Load() { _id = GL.CreateProgram(); @@ -41,6 +41,11 @@ namespace SM.OGL.Shaders } + protected override void Compile() + { + Load(); + } + public void DrawObject(Mesh.Mesh mesh, bool bindVAO = false) { if (bindVAO) GL.BindVertexArray(mesh); diff --git a/SMCode/SM.OGL/Shaders/ShaderFileCollection.cs b/SMCode/SM.OGL/Shaders/ShaderFileCollection.cs index 83ff790..ba0fa5c 100644 --- a/SMCode/SM.OGL/Shaders/ShaderFileCollection.cs +++ b/SMCode/SM.OGL/Shaders/ShaderFileCollection.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using OpenTK.Graphics.OpenGL4; namespace SM.OGL.Shaders @@ -9,6 +10,8 @@ namespace SM.OGL.Shaders public ShaderFile Geometry; public ShaderFile Fragment; + public Action SetUniforms; + public ShaderFileCollection(string vertex, string fragment) : this(new ShaderFile(vertex), new ShaderFile(fragment)) {} public ShaderFileCollection(ShaderFile vertex, ShaderFile fragment, ShaderFile geometry = default) @@ -16,6 +19,8 @@ namespace SM.OGL.Shaders Vertex = vertex; Geometry = geometry; Fragment = fragment; + + SetUniforms = u => { }; } internal void Append(GenericShader shader) diff --git a/SMCode/SM2D/Drawing/DrawEmpty.cs b/SMCode/SM2D/Drawing/DrawEmpty.cs new file mode 100644 index 0000000..4fbc996 --- /dev/null +++ b/SMCode/SM2D/Drawing/DrawEmpty.cs @@ -0,0 +1,24 @@ +using OpenTK; +using SM.Base.Contexts; +using SM.Base.Scene; +using SM.Base.Shader; +using SM.Base.StaticObjects; +using SM.OGL.Mesh; + +namespace SM2D.Drawing +{ + public class DrawEmpty : IShowItem + { + public void Update(UpdateContext context) + { + throw new System.NotImplementedException(); + } + + public void Draw(DrawContext context) + { + context.ModelMatrix = Matrix4.CreateScale(100, 100, 1); + + Shaders.Default.Draw(context); + } + } +} \ No newline at end of file diff --git a/SMCode/SM2D/GLWindow2D.cs b/SMCode/SM2D/GLWindow2D.cs new file mode 100644 index 0000000..da3b4f5 --- /dev/null +++ b/SMCode/SM2D/GLWindow2D.cs @@ -0,0 +1,10 @@ +using SM.Base; +using SM2D.Scene; + +namespace SM2D +{ + public class GLWindow2D : GenericWindow + { + + } +} \ No newline at end of file diff --git a/SMCode/SM2D/OpenTK.dll.config b/SMCode/SM2D/OpenTK.dll.config new file mode 100644 index 0000000..7098d39 --- /dev/null +++ b/SMCode/SM2D/OpenTK.dll.config @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SMCode/SM2D/SM2D.csproj b/SMCode/SM2D/SM2D.csproj index 8484d4f..3b677d6 100644 --- a/SMCode/SM2D/SM2D.csproj +++ b/SMCode/SM2D/SM2D.csproj @@ -31,6 +31,9 @@ 4 + + ..\..\packages\OpenTK.3.2\lib\net20\OpenTK.dll + @@ -41,7 +44,26 @@ + + + + + + + {8e733844-4204-43e7-b3dc-3913cddabb0d} + SM.Base + + + {f604d684-bc1d-4819-88b5-8b5d03a17be0} + SM.OGL + + + + + + + \ No newline at end of file diff --git a/SMCode/SM2D/Scene/Camera.cs b/SMCode/SM2D/Scene/Camera.cs new file mode 100644 index 0000000..81bab30 --- /dev/null +++ b/SMCode/SM2D/Scene/Camera.cs @@ -0,0 +1,22 @@ +using OpenTK; +using SM.Base.Scene; + +namespace SM2D.Scene +{ + public class Camera : GenericCamera + { + public override bool Orthographic { get; } = true; + + public Vector2 Position; + + public override Matrix4 ViewCalculation() + { + return Matrix4.LookAt(Position.X, Position.Y, -1, Position.X, Position.Y, 0, 0, 1, 0); + } + + public override void RecalculateWorld(float width, float height) + { + OrthographicWorld = Matrix4.CreateOrthographic(width, height, 0.1f, 100); + } + } +} \ No newline at end of file diff --git a/SMCode/SM2D/Scene/Scene.cs b/SMCode/SM2D/Scene/Scene.cs new file mode 100644 index 0000000..e6835d3 --- /dev/null +++ b/SMCode/SM2D/Scene/Scene.cs @@ -0,0 +1,9 @@ +using SM.Base.Scene; + +namespace SM2D.Scene +{ + public class Scene : GenericScene + { + + } +} \ No newline at end of file diff --git a/SMCode/SM2D/packages.config b/SMCode/SM2D/packages.config new file mode 100644 index 0000000..75397e4 --- /dev/null +++ b/SMCode/SM2D/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/SM_TEST/Program.cs b/SM_TEST/Program.cs index 1362f8b..6e92ef3 100644 --- a/SM_TEST/Program.cs +++ b/SM_TEST/Program.cs @@ -4,15 +4,26 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using SM.Base; +using SM2D; +using SM2D.Drawing; +using SM2D.Scene; namespace SM_TEST { class Program { + static Scene scene; static void Main(string[] args) { - GenericWindow window = new GenericWindow(); + GLWindow2D window = new GLWindow2D(); + window.SetScene(scene = new Scene()); + window.Load += WindowOnLoad; window.Run(); } + + private static void WindowOnLoad(object sender, EventArgs e) + { + scene.Objects.Add(new DrawEmpty()); + } } } diff --git a/SM_TEST/SM_TEST.csproj b/SM_TEST/SM_TEST.csproj index a9e4ca0..d93a798 100644 --- a/SM_TEST/SM_TEST.csproj +++ b/SM_TEST/SM_TEST.csproj @@ -63,6 +63,10 @@ {f604d684-bc1d-4819-88b5-8b5d03a17be0} SM.OGL + + {a4565538-625a-42c6-a330-dd4f1abb3986} + SM2D + \ No newline at end of file