diff --git a/src/SlatedGameToolkit.Framework/GameEngine.cs b/src/SlatedGameToolkit.Framework/GameEngine.cs
index e0c2801..a7685c1 100644
--- a/src/SlatedGameToolkit.Framework/GameEngine.cs
+++ b/src/SlatedGameToolkit.Framework/GameEngine.cs
@@ -15,6 +15,7 @@ namespace SlatedGameToolkit.Framework {
/// The main engine that will host the game loop.
///
public static class GameEngine {
+ public static bool Debugging { get; set; }
public static Logger Logger { get; private set; }
private static readonly object ignitionLock = new object();
private static readonly object deltaUpdateLock = new object();
@@ -77,103 +78,106 @@ namespace SlatedGameToolkit.Framework {
if (!(o is IState)) throw new InternalFrameworkException(String.Format("Expected initial state object for asynchronous loop. Got {0}", o));
IState initialState = (IState) o;
Manager manager = new Manager(initialState);
- DateTime currentTime = DateTime.Now;
- TimeSpan timePassedFromLastUpdate = TimeSpan.Zero;
- TimeSpan timePassedFromLastRender = TimeSpan.Zero;
- TimeSpan updateDeltaTime = GameEngine.updateDeltaTime;
- TimeSpan frameDeltaTime = GameEngine.frameDeltaTime;
- deltaChanged = true;
- stopped = false;
- Logger.Information("Game engine initiated.");
- while (!exit) {
- //Pull latest deltas.
- if (deltaChanged) {
- lock (deltaUpdateLock) {
- updateDeltaTime = GameEngine.updateDeltaTime;
- frameDeltaTime = GameEngine.frameDeltaTime;
- Logger.Information(String.Format("Deltas were set. Update Delta: {0}, Render target Delta: {1}", updateDeltaTime.TotalSeconds, frameDeltaTime.TotalSeconds));
+ try {
+ DateTime currentTime = DateTime.Now;
+ TimeSpan timePassedFromLastUpdate = TimeSpan.Zero;
+ TimeSpan timePassedFromLastRender = TimeSpan.Zero;
+ TimeSpan updateDeltaTime = GameEngine.updateDeltaTime;
+ TimeSpan frameDeltaTime = GameEngine.frameDeltaTime;
+ deltaChanged = true;
+ stopped = false;
+ Logger.Information("Game engine initiated.");
+ while (!exit) {
+ //Pull latest deltas.
+ if (deltaChanged) {
+ lock (deltaUpdateLock) {
+ updateDeltaTime = GameEngine.updateDeltaTime;
+ frameDeltaTime = GameEngine.frameDeltaTime;
+ Logger.Information(String.Format("Deltas were set. Update Delta: {0}, Render target Delta: {1}", updateDeltaTime.TotalSeconds, frameDeltaTime.TotalSeconds));
+ }
+ deltaChanged = false;
}
- deltaChanged = false;
- }
- //Events
- SDL.SDL_Event SDL_Event;
- while (SDL.SDL_PollEvent(out SDL_Event) != 0) {
- switch (SDL_Event.type) {
- case SDL.SDL_EventType.SDL_MOUSEMOTION:
- Mouse.OnMouseMoved(SDL_Event.motion.x, SDL_Event.motion.y);
- break;
- case SDL.SDL_EventType.SDL_MOUSEWHEEL:
- Mouse.OnScroll(SDL_Event.wheel.x, SDL_Event.wheel.y);
- break;
- case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN:
- if (SDL.SDL_BUTTON_LEFT == SDL_Event.button.button) {
- Mouse.OnLeftChange(true);
- } else if (SDL.SDL_BUTTON_RIGHT == SDL_Event.button.button) {
- Mouse.OnRightChange(true);
- } else if (SDL.SDL_BUTTON_MIDDLE == SDL_Event.button.button) {
- Mouse.OnMiddleChange(true);
- }
- break;
- case SDL.SDL_EventType.SDL_MOUSEBUTTONUP:
- if (SDL.SDL_BUTTON_LEFT == SDL_Event.button.button) {
- Mouse.OnLeftChange(false);
- } else if (SDL.SDL_BUTTON_RIGHT == SDL_Event.button.button) {
- Mouse.OnRightChange(false);
- } else if (SDL.SDL_BUTTON_MIDDLE == SDL_Event.button.button) {
- Mouse.OnMiddleChange(false);
- }
- break;
- case SDL.SDL_EventType.SDL_KEYDOWN:
- Keyboard.OnKeyPressed((Key) SDL_Event.key.keysym.sym);
- break;
- case SDL.SDL_EventType.SDL_KEYUP:
- Keyboard.OnKeyReleased((Key) SDL_Event.key.keysym.sym);
- break;
- case SDL.SDL_EventType.SDL_WINDOWEVENT:
- WindowContext handle = WindowContextsManager.ContextFromWindowID(SDL_Event.window.windowID);
- switch (SDL_Event.window.windowEvent)
- {
- case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_SIZE_CHANGED:
- handle.OnResize(SDL_Event.window.data1, SDL_Event.window.data2);
- break;
- case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST:
- handle.OnFocusLost();
- break;
- case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED:
- handle.OnFocusGained();
- break;
- }
+ //Events
+ SDL.SDL_Event SDL_Event;
+ while (SDL.SDL_PollEvent(out SDL_Event) != 0) {
+ switch (SDL_Event.type) {
+ case SDL.SDL_EventType.SDL_MOUSEMOTION:
+ Mouse.OnMouseMoved(SDL_Event.motion.x, SDL_Event.motion.y);
break;
- case SDL.SDL_EventType.SDL_QUIT:
- Stop();
- break;
+ case SDL.SDL_EventType.SDL_MOUSEWHEEL:
+ Mouse.OnScroll(SDL_Event.wheel.x, SDL_Event.wheel.y);
+ break;
+ case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN:
+ if (SDL.SDL_BUTTON_LEFT == SDL_Event.button.button) {
+ Mouse.OnLeftChange(true);
+ } else if (SDL.SDL_BUTTON_RIGHT == SDL_Event.button.button) {
+ Mouse.OnRightChange(true);
+ } else if (SDL.SDL_BUTTON_MIDDLE == SDL_Event.button.button) {
+ Mouse.OnMiddleChange(true);
+ }
+ break;
+ case SDL.SDL_EventType.SDL_MOUSEBUTTONUP:
+ if (SDL.SDL_BUTTON_LEFT == SDL_Event.button.button) {
+ Mouse.OnLeftChange(false);
+ } else if (SDL.SDL_BUTTON_RIGHT == SDL_Event.button.button) {
+ Mouse.OnRightChange(false);
+ } else if (SDL.SDL_BUTTON_MIDDLE == SDL_Event.button.button) {
+ Mouse.OnMiddleChange(false);
+ }
+ break;
+ case SDL.SDL_EventType.SDL_KEYDOWN:
+ Keyboard.OnKeyPressed((Key) SDL_Event.key.keysym.sym);
+ break;
+ case SDL.SDL_EventType.SDL_KEYUP:
+ Keyboard.OnKeyReleased((Key) SDL_Event.key.keysym.sym);
+ break;
+ case SDL.SDL_EventType.SDL_WINDOWEVENT:
+ WindowContext handle = WindowContextsManager.ContextFromWindowID(SDL_Event.window.windowID);
+ switch (SDL_Event.window.windowEvent)
+ {
+ case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_SIZE_CHANGED:
+ handle.OnResize(SDL_Event.window.data1, SDL_Event.window.data2);
+ break;
+ case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST:
+ handle.OnFocusLost();
+ break;
+ case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED:
+ handle.OnFocusGained();
+ break;
+ }
+ break;
+ case SDL.SDL_EventType.SDL_QUIT:
+ Stop();
+ break;
+ }
+ }
+ DateTime frameStart = DateTime.Now;
+ TimeSpan difference = frameStart - currentTime;
+ currentTime = frameStart;
+
+ timePassedFromLastUpdate += difference;
+ while (timePassedFromLastUpdate > updateDeltaTime) {
+ //Updates.
+ manager.update(updateDeltaTime.TotalMilliseconds <= 0 ? timePassedFromLastUpdate.TotalSeconds : updateDeltaTime.TotalSeconds);
+ timePassedFromLastUpdate -= updateDeltaTime;
+ if (updateDeltaTime.TotalSeconds <= 0) break;
+ }
+
+ timePassedFromLastRender += difference;
+ if (timePassedFromLastRender > frameDeltaTime) {
+ //Draw calls.
+ manager.render(timePassedFromLastUpdate.TotalSeconds);
+ timePassedFromLastRender = TimeSpan.Zero;
}
}
- DateTime frameStart = DateTime.Now;
- TimeSpan difference = frameStart - currentTime;
- currentTime = frameStart;
-
- timePassedFromLastUpdate += difference;
- while (timePassedFromLastUpdate > updateDeltaTime) {
- //Updates.
- manager.update(updateDeltaTime.TotalMilliseconds <= 0 ? timePassedFromLastUpdate.TotalSeconds : updateDeltaTime.TotalSeconds);
- timePassedFromLastUpdate -= updateDeltaTime;
- if (updateDeltaTime.TotalSeconds <= 0) break;
- }
-
- timePassedFromLastRender += difference;
- if (timePassedFromLastRender > frameDeltaTime) {
- //Draw calls.
- manager.render(timePassedFromLastUpdate.TotalSeconds);
- timePassedFromLastRender = TimeSpan.Zero;
- }
+ } finally {
+ stopped = true;
+ manager.Dispose();
+ SDL.SDL_Quit();
+ Logger.Information("Game engine has stopped.");
+ Logger.Dispose();
+ Logger = null;
}
- stopped = true;
- manager.Dispose();
- SDL.SDL_Quit();
- Logger.Information("Game engine has stopped.");
- Logger.Dispose();
- Logger = null;
}
///
diff --git a/src/SlatedGameToolkit.Framework/Graphics/GLFunctionDelegates.cs b/src/SlatedGameToolkit.Framework/Graphics/GLFunctionDelegates.cs
index 5c02247..4f6bbb6 100644
--- a/src/SlatedGameToolkit.Framework/Graphics/GLFunctionDelegates.cs
+++ b/src/SlatedGameToolkit.Framework/Graphics/GLFunctionDelegates.cs
@@ -5,55 +5,102 @@ using SlatedGameToolkit.Framework.Exceptions;
namespace SlatedGameToolkit.Framework.Graphics
{
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLClearColour(float r, float g, float b);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLClear(GLEnums flags);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLViewport(int x, int y, int width, int height);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate UIntPtr GLCreateShader(GLEnums type);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate UIntPtr GLShaderSource(UIntPtr shaderHandle, uint count, string program, int[] length);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLCompileShader(UIntPtr shaderHandle);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLGetShaderLogInfo(UIntPtr shader, uint maxLength, out uint writtenLength, out string output);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate UIntPtr GLCreateProgram();
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate UIntPtr GLDeleteProgram(UIntPtr program);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLAttachShader(UIntPtr program, UIntPtr shader);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLDetachShader(UIntPtr program, UIntPtr shader);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLDeleteShader(UIntPtr shader);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLBindAttribLocation(UIntPtr program, uint index, string name);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLGetProgramInfoLog(UIntPtr program, uint maxLength, out uint writtenLength, out string output);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLLinkProgram(UIntPtr program);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLProgramParameter(UIntPtr program, GLEnums parameterName, int value);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLUseProgram(UIntPtr program);
- internal delegate void GLGenProgramPipelines(uint size, out UIntPtr[] pipelines);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GLGenProgramPipelines(uint size, UIntPtr[] pipelines);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLDeleteProgramPipelines(uint size, UIntPtr[] pipelines);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLBindProgramPipeline(UIntPtr pipeline);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLUseProgramStages(UIntPtr pipeline, GLEnums bitField, UIntPtr program);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate uint GLGetError();
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate int GLGetAttribLocation(UIntPtr program, string attribName);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLBindBuffer(GLEnums target, UIntPtr buffer);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLGenBuffers(uint size, UIntPtr[] buffers);
- internal unsafe delegate void GLBufferData(GLEnums target, uint size, void* data, GLEnums usage);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal unsafe delegate void GLBufferData(GLEnums target, uint size, Array data, GLEnums usage);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLDeleteBuffers(uint size, UIntPtr[] buffers);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLVertexAttribPointer(uint index, int size, GLEnums type, bool normalized, uint stride, uint offset);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLGenVertexArrays(uint amount, UIntPtr[] arrays);
- internal delegate void GLDeleteVertexArrays(uint amount, UIntPtr[] arrays);
- internal delegate void GLBindVertexArray(UIntPtr array);
- internal delegate void GLEnableVertexAttribArray(uint attribIndex);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GLDeleteVertexArrays(uint amount, UIntPtr[] arrays);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GLBindVertexArray(UIntPtr array);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GLEnableVertexAttribArray(uint attribIndex);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLDisableVertexAttribArray(uint attribIndex);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLDrawArrays(GLEnums mode, int first, uint count);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLDrawElements(GLEnums mode, uint count, int offset);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLMultiDrawArrays(GLEnums mode, int[] first, uint[] count, uint primout);
- internal delegate void GLMultiDrawElements(GLEnums mode, uint[] count, GLEnums type, uint[] indices);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GLMultiDrawElements(GLEnums mode, uint[] count, GLEnums type, IntPtr indices, int length);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLGenTextures(uint n, UIntPtr[] textureHandles);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLBindTexture(GLEnums target, UIntPtr texture);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLDeleteTextures(uint n, UIntPtr[] textureHandles);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLTexParameteri(GLEnums target, GLEnums pname, int value);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLTexParameterf(GLEnums target, GLEnums pname, float value);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLTexParameteriv(GLEnums target, GLEnums pname, int[] values);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLTexParameterfv(GLEnums target, GLEnums pname, float[] values);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLTexImage2D(GLEnums target, int level, int internalFormat, uint width, uint height, int border, GLEnums format, GLEnums type, byte[] data);
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void GLGenerateMipMap(GLEnums target);
internal static class GLFunctionUtils {
public static T RetrieveGLDelegate(string functionName) where T : Delegate {
+ GameEngine.Logger.Debug(String.Format("Retrieving function with name: {0}", functionName));
IntPtr functionAddress = SDL.SDL_GL_GetProcAddress(functionName);
if (functionAddress == null) throw new FrameworkSDLException();
return Marshal.GetDelegateForFunctionPointer(functionAddress);
diff --git a/src/SlatedGameToolkit.Framework/Graphics/Meshes/IMeshable.cs b/src/SlatedGameToolkit.Framework/Graphics/Meshes/IMeshable.cs
index 87773c0..618a91e 100644
--- a/src/SlatedGameToolkit.Framework/Graphics/Meshes/IMeshable.cs
+++ b/src/SlatedGameToolkit.Framework/Graphics/Meshes/IMeshable.cs
@@ -12,9 +12,11 @@ namespace SlatedGameToolkit.Framework.Graphics.Meshes
///
///
ValueTuple[] Vertices { get; }
+
+ ///
+ /// Returns indicies representing the vertices to use to create the mesh.
+ ///
+ /// unsigned integers that are the indices of the vertices to use.
uint[] Elements { get; }
- Vector3 Rotation { get; set; }
- Vector3 Translation { get; set; }
- Vector3 Scale { get; set; }
}
}
\ No newline at end of file
diff --git a/src/SlatedGameToolkit.Framework/Graphics/Meshes/RectangleMesh.cs b/src/SlatedGameToolkit.Framework/Graphics/Meshes/RectangleMesh.cs
index 04f85f4..da337c7 100644
--- a/src/SlatedGameToolkit.Framework/Graphics/Meshes/RectangleMesh.cs
+++ b/src/SlatedGameToolkit.Framework/Graphics/Meshes/RectangleMesh.cs
@@ -4,13 +4,13 @@ using System.Numerics;
namespace SlatedGameToolkit.Framework.Graphics.Meshes
{
- public class RectangleMesh : IMeshable
+ public abstract class RectangleMesh : IMeshable
{
private bool changed = true;
private Matrix4x4 matRot, matTrans, matScale;
private Vector3 rotation, translation, scale;
private Vector2 origin, dimensions;
- public readonly Vector2[] texCoords = new Vector2[4];
+ protected readonly Vector2[] textureCoords = new Vector2[4];
private ValueTuple[] vertices = new ValueTuple[4];
private uint[] indices = new uint[] {0, 1, 3, 1, 2, 3};
@@ -28,8 +28,9 @@ namespace SlatedGameToolkit.Framework.Graphics.Meshes
return origin.X;
}
- set
+ protected set
{
+ changed = true;
origin.X = X;
}
}
@@ -40,8 +41,9 @@ namespace SlatedGameToolkit.Framework.Graphics.Meshes
return origin.Y;
}
- set
+ protected set
{
+ changed = true;
origin.Y = value;
}
}
@@ -53,7 +55,9 @@ namespace SlatedGameToolkit.Framework.Graphics.Meshes
return dimensions.X;
}
- set {
+ protected set
+ {
+ changed = true;
dimensions.X = value;
}
}
@@ -65,8 +69,9 @@ namespace SlatedGameToolkit.Framework.Graphics.Meshes
return dimensions.Y;
}
- set
+ protected set
{
+ changed = true;
dimensions.Y = value;
}
}
@@ -75,10 +80,12 @@ namespace SlatedGameToolkit.Framework.Graphics.Meshes
public Vector3 Translation
{
- get {
+ get
+ {
return rotation;
}
- set {
+ set
+ {
changed = true;
translation = value;
matTrans = Matrix4x4.CreateTranslation(value);
@@ -87,11 +94,13 @@ namespace SlatedGameToolkit.Framework.Graphics.Meshes
public Vector3 Scale
{
- get {
+ get
+ {
return scale;
}
- set {
+ set
+ {
changed = true;
scale = value;
matScale = Matrix4x4.CreateScale(value);
@@ -122,7 +131,7 @@ namespace SlatedGameToolkit.Framework.Graphics.Meshes
Matrix4x4 transform = matTrans * matRot * matScale;
for (int i = 0; i < vertices.Length; i++)
{
- vertices[i] = new ValueTuple(Vector3.Transform(baseVerts[i], transform), texCoords[i]);
+ vertices[i] = new ValueTuple(Vector3.Transform(baseVerts[i], transform), textureCoords[i]);
}
changed = false;
}
diff --git a/src/SlatedGameToolkit.Framework/Graphics/Render/Batch.cs b/src/SlatedGameToolkit.Framework/Graphics/Render/Batch.cs
index 97d7018..62b64bf 100644
--- a/src/SlatedGameToolkit.Framework/Graphics/Render/Batch.cs
+++ b/src/SlatedGameToolkit.Framework/Graphics/Render/Batch.cs
@@ -22,7 +22,7 @@ namespace SlatedGameToolkit.Framework.Graphics.Render
private uint dataIndex, indicesIndex, lengthsIndex;
public Batch(uint BatchVertexSize = 4096) {
- multiDrawElements = GLFunctionUtils.RetrieveGLDelegate("glMultDrawElements");
+ multiDrawElements = GLFunctionUtils.RetrieveGLDelegate("glMultiDrawElements");
indices = new uint[BatchVertexSize];
lengths = new uint[BatchVertexSize];
offsets = new uint[BatchVertexSize];
@@ -50,7 +50,7 @@ namespace SlatedGameToolkit.Framework.Graphics.Render
vertexArray.Dispose();
}
- public virtual void Draw(IMeshable meshable, Color color) {
+ public virtual void Add(IMeshable meshable, Color color) {
ValueTuple[] vertices = meshable.Vertices;
uint[] indices = meshable.Elements;
if (vertices.Length * VERTEX_LENGTH + dataIndex >= data.Length || indices.Length + indicesIndex >= indicesIndex) Flush();
@@ -93,7 +93,7 @@ namespace SlatedGameToolkit.Framework.Graphics.Render
dataIndex = 0;
indicesIndex = 0;
lengthsIndex = 0;
- multiDrawElements(GLEnums.GL_TRIANGLE_STRIP, lengths, GLEnums.GL_UNSIGNED_INT, offsets);
+ multiDrawElements(GLEnums.GL_TRIANGLE_STRIP, lengths, GLEnums.GL_UNSIGNED_INT, IntPtr.Zero, lengths.Length);
}
}
}
\ No newline at end of file
diff --git a/src/SlatedGameToolkit.Framework/Graphics/Render/Renderer.cs b/src/SlatedGameToolkit.Framework/Graphics/Render/Renderer.cs
index 98022eb..f27c776 100644
--- a/src/SlatedGameToolkit.Framework/Graphics/Render/Renderer.cs
+++ b/src/SlatedGameToolkit.Framework/Graphics/Render/Renderer.cs
@@ -1,13 +1,27 @@
+using System;
using System.Drawing;
using SlatedGameToolkit.Framework.Graphics.Textures;
namespace SlatedGameToolkit.Framework.Graphics.Render
{
- public class Renderer
+ public class Renderer : IDisposable
{
private Batch batch;
private Texture currentTexture;
+ public Renderer(Batch batch) {
+ this.batch = batch;
+ }
+
+ public Renderer() {
+ this.batch = new Batch();
+ }
+
+ public void Dispose()
+ {
+ batch.Dispose();
+ }
+
public void Queue(IRenderable renderable, Color color) {
if (renderable.Texture != currentTexture) {
if (batch.Batching) batch.End();
@@ -15,7 +29,7 @@ namespace SlatedGameToolkit.Framework.Graphics.Render
currentTexture.Use();
batch.Begin(currentTexture);
}
- batch.Draw(renderable, color);
+ batch.Add(renderable, color);
}
public void Render() {
diff --git a/src/SlatedGameToolkit.Framework/Graphics/Render/Sprite2D.cs b/src/SlatedGameToolkit.Framework/Graphics/Render/Sprite2D.cs
index 54716d7..b7223cc 100644
--- a/src/SlatedGameToolkit.Framework/Graphics/Render/Sprite2D.cs
+++ b/src/SlatedGameToolkit.Framework/Graphics/Render/Sprite2D.cs
@@ -1,6 +1,24 @@
+using SlatedGameToolkit.Framework.Graphics.Meshes;
+using SlatedGameToolkit.Framework.Graphics.Textures;
+
namespace SlatedGameToolkit.Framework.Graphics.Render
{
- public class Sprite2D
+ public class Sprite2D : RectangleMesh, IRenderable
{
+ public Texture Texture { get; private set; }
+ public Sprite2D(Texture texture) {
+ this.Texture = texture;
+ this.textureCoords[0].X = -1;
+ this.textureCoords[0].Y = -1;
+
+ this.textureCoords[1].X = 1;
+ this.textureCoords[1].Y = -1;
+
+ this.textureCoords[2].X = 1;
+ this.textureCoords[2].Y = 1;
+
+ this.textureCoords[3].X = -1;
+ this.textureCoords[3].Y = 1;
+ }
}
}
\ No newline at end of file
diff --git a/src/SlatedGameToolkit.Framework/Graphics/Shaders/GLVertexArraySet.cs b/src/SlatedGameToolkit.Framework/Graphics/Shaders/GLVertexArraySet.cs
index 5202eb3..486dc67 100644
--- a/src/SlatedGameToolkit.Framework/Graphics/Shaders/GLVertexArraySet.cs
+++ b/src/SlatedGameToolkit.Framework/Graphics/Shaders/GLVertexArraySet.cs
@@ -20,7 +20,6 @@ namespace SlatedGameToolkit.Framework.Graphics.Shaders
private GLEnableVertexAttribArray enableVertexAttribArray;
private GLDisableVertexAttribArray disableVertexAttribArray;
private GLBufferData bufferData;
-
public GLVertexArraySet(uint amount) {
if (amount > int.MaxValue) throw new ArgumentOutOfRangeException("amount");
this.Count = (int)amount;
@@ -34,12 +33,15 @@ namespace SlatedGameToolkit.Framework.Graphics.Shaders
enableVertexAttribArray = GLFunctionUtils.RetrieveGLDelegate("glEnableVertexAttribArray");
disableVertexAttribArray = GLFunctionUtils.RetrieveGLDelegate("glDisableVertexAttribArray");
bufferData = GLFunctionUtils.RetrieveGLDelegate("glBufferData");
-
+ arrayBufferHandles = new UIntPtr[amount];
+ vertexArrayHandles = new UIntPtr[amount];
+ indexArrayHandles = new UIntPtr[amount];
genBuffers(amount, arrayBufferHandles);
OpenGLErrorException.CheckGLErrorStatus();
genVertexArrays(amount, vertexArrayHandles);
OpenGLErrorException.CheckGLErrorStatus();
genBuffers(amount, indexArrayHandles);
+ OpenGLErrorException.CheckGLErrorStatus();
}
public void Use(uint index) {
@@ -52,17 +54,13 @@ namespace SlatedGameToolkit.Framework.Graphics.Shaders
public unsafe void BufferVertices(uint index, float[] data, bool dynamic) {
Use(index);
- fixed (void* arrayData = &data[0]) {
- bufferData(GLEnums.GL_ARRAY_BUFFER, (uint) (sizeof(float) * data.Length), arrayData, dynamic ? GLEnums.GL_DYNAMIC_DRAW : GLEnums.GL_STATIC_DRAW);
- }
+ bufferData(GLEnums.GL_ARRAY_BUFFER, (uint) (sizeof(float) * data.Length), data, dynamic ? GLEnums.GL_DYNAMIC_DRAW : GLEnums.GL_STATIC_DRAW);
OpenGLErrorException.CheckGLErrorStatus();
}
public unsafe void BufferIndices(uint index, uint[] data, bool dynamic) {
Use(index);
- fixed (void* arrayData = &data[0]) {
- bufferData(GLEnums.GL_ELEMENT_ARRAY_BUFFER, (uint) (sizeof(float) * data.Length), arrayData, dynamic ? GLEnums.GL_DYNAMIC_DRAW : GLEnums.GL_STATIC_DRAW);
- }
+ bufferData(GLEnums.GL_ELEMENT_ARRAY_BUFFER, (uint) (sizeof(float) * data.Length), data, dynamic ? GLEnums.GL_DYNAMIC_DRAW : GLEnums.GL_STATIC_DRAW);
OpenGLErrorException.CheckGLErrorStatus();
}
diff --git a/src/SlatedGameToolkit.Framework/Graphics/Shaders/VertexArray.cs b/src/SlatedGameToolkit.Framework/Graphics/Shaders/VertexArray.cs
index 5a5547c..d2e020e 100644
--- a/src/SlatedGameToolkit.Framework/Graphics/Shaders/VertexArray.cs
+++ b/src/SlatedGameToolkit.Framework/Graphics/Shaders/VertexArray.cs
@@ -17,11 +17,11 @@ namespace SlatedGameToolkit.Framework.Graphics.Shaders
this.index = 0;
}
- public unsafe void BufferVertices(float[] data, bool dynamic = true) {
+ public void BufferVertices(float[] data, bool dynamic = true) {
glVertexArraySet.BufferVertices(index, data, dynamic);
}
- public unsafe void BufferIndices(uint[] data, bool dynamic = true) {
+ public void BufferIndices(uint[] data, bool dynamic = true) {
glVertexArraySet.BufferIndices(index, data, dynamic);
}
diff --git a/src/SlatedGameToolkit.Framework/Graphics/Textures/GLTexture2DSet.cs b/src/SlatedGameToolkit.Framework/Graphics/Textures/GLTexture2DSet.cs
index 1e7da56..b21902b 100644
--- a/src/SlatedGameToolkit.Framework/Graphics/Textures/GLTexture2DSet.cs
+++ b/src/SlatedGameToolkit.Framework/Graphics/Textures/GLTexture2DSet.cs
@@ -22,6 +22,7 @@ namespace SlatedGameToolkit.Framework.Graphics
public GLTexture2DSet(TextureData[] textureDatas, bool linear = false, bool mipmap = false)
{
this.linear = linear;
+ this.mipmap = mipmap;
genTextures = GLFunctionUtils.RetrieveGLDelegate("glGenTextures");
deleteTextures = GLFunctionUtils.RetrieveGLDelegate("glDeleteTextures");
bindTexture = GLFunctionUtils.RetrieveGLDelegate("glBindTexture");
@@ -29,7 +30,7 @@ namespace SlatedGameToolkit.Framework.Graphics
texParameterfv = GLFunctionUtils.RetrieveGLDelegate("glTexParameterfv");
texImage2D = GLFunctionUtils.RetrieveGLDelegate("glTexImage2D");
generateMipMap = GLFunctionUtils.RetrieveGLDelegate("glGenerateMipMap");
-
+ handle = new UIntPtr[textureDatas.Length];
genTextures((uint)textureDatas.Length, handle);
for (uint i = 0; i < textureDatas.Length; i++) {
Setup(i, textureDatas[i]);
diff --git a/src/SlatedGameToolkit.Tools/Utilities/GraphicalPlayground/MainState.cs b/src/SlatedGameToolkit.Tools/Utilities/GraphicalPlayground/MainState.cs
index 9d5ab32..94f7123 100644
--- a/src/SlatedGameToolkit.Tools/Utilities/GraphicalPlayground/MainState.cs
+++ b/src/SlatedGameToolkit.Tools/Utilities/GraphicalPlayground/MainState.cs
@@ -1,6 +1,8 @@
using System;
using SlatedGameToolkit.Framework.Graphics.Programs;
+using SlatedGameToolkit.Framework.Graphics.Render;
using SlatedGameToolkit.Framework.Graphics.Shaders;
+using SlatedGameToolkit.Framework.Graphics.Textures;
using SlatedGameToolkit.Framework.Graphics.Window;
using SlatedGameToolkit.Framework.StateSystem;
using SlatedGameToolkit.Framework.StateSystem.States;
@@ -10,6 +12,8 @@ namespace SlatedGameToolkit.Tools.Utilities.GraphicalPlayground
public class MainState : IState
{
private WindowContext window;
+ private Renderer renderer;
+ private Sprite2D sprite;
public WindowContext CurrentWindow { get { return window;}}
@@ -36,7 +40,7 @@ namespace SlatedGameToolkit.Tools.Utilities.GraphicalPlayground
public void Initialize(Manager manager)
{
window = new WindowContext("SlatedGameToolkit Playground");
- window.RaiseToTop();
+ renderer = new Renderer();
}
public void Render(double delta)