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