So loud added, changed how dependencies are organized.

This commit is contained in:
Harrison Deng 2020-07-05 22:50:54 -05:00
parent 02c1ceae14
commit 63a31c491d
11 changed files with 516 additions and 464 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,21 +0,0 @@
using System;
namespace SlatedGameToolkit.Framework.Exceptions
{
/// <summary>
/// Any errors generated by an SDL feature that the engine requires are wrapped in the form of this type of exception.
/// </summary>
public class FrameworkSDLException : SDLException {
public FrameworkSDLException() : base() {
}
public FrameworkSDLException(string message) : base(message) {
}
public FrameworkSDLException(string message, Exception inner) : base(message, inner) {
}
}
}

View File

@ -2,17 +2,20 @@ using System;
namespace SlatedGameToolkit.Framework.Exceptions
{
/// <summary>
/// An exception that is thrown when an error occurrs on the game framework level that shouldn't have occurred and is definitely considered a bug.
/// </summary>
internal class InternalFrameworkException : FrameworkException {
const string ADDITIONAL_MESSAGE = "\nThis exception is a framework bug!";
const string ADDITIONAL_MESSAGE = "**This exception is a framework bug!**";
public InternalFrameworkException() : base() {
}
public InternalFrameworkException(string message) : base(message + ADDITIONAL_MESSAGE) {
public InternalFrameworkException(string message) : base(message + ' ' + ADDITIONAL_MESSAGE) {
}
public InternalFrameworkException(string message, Exception inner) : base(message + ADDITIONAL_MESSAGE, inner) {
public InternalFrameworkException(string message, Exception inner) : base(message + ' ' + ADDITIONAL_MESSAGE, inner) {
}
}
}

View File

@ -7,7 +7,7 @@ namespace SlatedGameToolkit.Framework.Exceptions
/// An SDLException is defined as an exception that is thrown whenever an error occurrs in any SDL functions.
/// </summary>
[Serializable]
public abstract class SDLException : Exception {
public class SDLException : FrameworkException {
public string SDLMessage { get; }
/// <summary>

View File

@ -0,0 +1,20 @@
using System;
namespace SlatedGameToolkit.Framework.Exceptions
{
public class SoLoudException : FrameworkException
{
public int ErrorCode { get; private set; }
public SoLoudException(int errorCode) : base(GameEngine.SoLoudEngine.getErrorString(errorCode) + " SoLoud error has occurred.")
{
}
public SoLoudException(int errorCode, string message) : base(GameEngine.SoLoudEngine.getErrorString(errorCode) + " SoLoud error has occurred: " + message)
{
}
public SoLoudException(int errorCode, string message, Exception inner) : base(GameEngine.SoLoudEngine.getErrorString(errorCode) + " SoLoud error has occurred: " + message, inner)
{
}
}
}

View File

@ -3,18 +3,19 @@ using System.Runtime.InteropServices;
using System.Threading;
using SDL2;
using SlatedGameToolkit.Framework.Exceptions;
using SlatedGameToolkit.Framework.Graphics.OpenGL;
using SlatedGameToolkit.Framework.Graphics.Window;
using SlatedGameToolkit.Framework.Input.Devices;
using SlatedGameToolkit.Framework.Logging;
using SlatedGameToolkit.Framework.StateSystem;
using SlatedGameToolkit.Framework.StateSystem.States;
using SoLoud;
namespace SlatedGameToolkit.Framework {
/// <summary>
/// The main engine that will host the game loop.
/// </summary>
public static class GameEngine {
private const int GL_MAJOR_VER = 3, GL_MINOR_VER = 3;
public static bool Debugging { get; set; }
private static readonly object ignitionLock = new object();
private static readonly object deltaUpdateLock = new object();
@ -73,7 +74,9 @@ namespace SlatedGameToolkit.Framework {
}
}
private static void Loop(Object o) {
public static Soloud SoLoudEngine { get; private set; }
private static void Run(Object o) {
if (!(o is IState)) throw new InternalFrameworkException(String.Format("Expected initial state object for asynchronous loop. Got {0}", o));
StateManager manager = new StateManager();
IState initialState = (IState) o;
@ -180,6 +183,7 @@ namespace SlatedGameToolkit.Framework {
stopped = true;
manager.Dispose();
SDL.SDL_Quit();
SoLoudEngine.deinit();
WindowContextsManager.DisposeAllWindowContexts();
Logger.Log("Game engine has gracefully stopped.");
Logger.FlushListeners();
@ -223,19 +227,37 @@ namespace SlatedGameToolkit.Framework {
}
}
exit = false;
Logger.Log("Initializing SDL video subsystem.");
if (SDL.SDL_Init(SDL.SDL_INIT_VIDEO) != 0) {
throw new FrameworkSDLException();
}
if (SDL.SDL_Init(SDL.SDL_INIT_AUDIO) != 0) {
throw new FrameworkSDLException();
throw new SDLException();
}
if (SDL.SDL_GL_SetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_MAJOR_VERSION, GL_MAJOR_VER) < 0 ||
SDL.SDL_GL_SetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_MINOR_VERSION, GL_MINOR_VER) < 0 ||
Logger.Log("Initializing SDL audio subsystem.");
if (SDL.SDL_Init(SDL.SDL_INIT_AUDIO) != 0) {
throw new SDLException();
}
Logger.Log("Initializing SoLoud Engine.");
SoLoudEngine = new Soloud();
int error = SoLoudEngine.init(aBackend: Soloud.SDL2);
if (error != 0) {
throw new SoLoudException(error);
}
uint soLoudVer = SoLoudEngine.getVersion();
if (soLoudVer != Soloud.SOLOUD_VER) {
if (soLoudVer < Soloud.SOLOUD_VER) {
throw new FrameworkUsageException(string.Format("SoLoud version is out-dated! Detected version {0}. Minimum version requirement is {1}", soLoudVer, Soloud.SOLOUD_VER));
} else {
Logger.Log(string.Format("SoLoud version detected is {0} which is newer than version used to build framework (ver. {1}).", soLoudVer, Soloud.SOLOUD_VER), LogLevel.WARNING);
}
}
if (SDL.SDL_GL_SetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_MAJOR_VERSION, GLContext.GL_MAJOR_VER) < 0 ||
SDL.SDL_GL_SetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_MINOR_VERSION, GLContext.GL_MINOR_VER) < 0 ||
SDL.SDL_GL_SetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_PROFILE_MASK, SDL.SDL_GLprofile.SDL_GL_CONTEXT_PROFILE_CORE) < 0)
throw new FrameworkSDLException(string.Format("Unable to load correct OpenGL version {0}.{1}.0 Core.", GL_MINOR_VER, GL_MAJOR_VER));
throw new SDLException(string.Format("Unable to retrieve correct OpenGL version {0}.{1}.0 Core.", GLContext.GL_MINOR_VER, GLContext.GL_MAJOR_VER));
Logger.Log(string.Format("OpenGL version set to {0}.{1}.0 Core.", GLContext.GL_MAJOR_VER, GLContext.GL_MINOR_VER));
thread = new Thread(Loop);
thread = new Thread(Run);
thread.Name = "SGTK-Engine";
thread.Priority = ThreadPriority.AboveNormal;
thread.Start(initialState);

View File

@ -13,6 +13,7 @@ namespace SlatedGameToolkit.Framework.Graphics.OpenGL
[SuppressMessage("ReSharper", "InconsistentNaming")]
public class GLContext : IDisposable
{
public const int GL_MAJOR_VER = 3, GL_MINOR_VER = 3;
#region OpenGLFunctions
public IntPtr Handle { get; private set; }
@ -3173,7 +3174,7 @@ namespace SlatedGameToolkit.Framework.Graphics.OpenGL
GetProcAddressHandler loader = SDL.SDL_GL_GetProcAddress;
Handle = SDL.SDL_GL_CreateContext(windowHandle);
if (Handle == null) {
throw new FrameworkSDLException();
throw new SDLException();
}
#region OpenGLDelegateAssignment

View File

@ -248,7 +248,7 @@ namespace SlatedGameToolkit.Framework.Graphics.Window
internal uint WindowID {
get {
uint id = SDL.SDL_GetWindowID(windowHandle);
if (id == 0) throw new FrameworkSDLException();
if (id == 0) throw new SDLException();
return id;
}
}
@ -260,7 +260,7 @@ namespace SlatedGameToolkit.Framework.Graphics.Window
Logger.Log(String.Format("Starting openGL window with title \"{0}\"", title));
windowHandle = SDL.SDL_CreateWindow(title, x < 0 ? SDL.SDL_WINDOWPOS_CENTERED : x, y < 0 ? SDL.SDL_WINDOWPOS_CENTERED : y, width, height, SDL.SDL_WindowFlags.SDL_WINDOW_INPUT_FOCUS | SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL | SDL.SDL_WindowFlags.SDL_WINDOW_MOUSE_FOCUS | options);
if (windowHandle == null) {
throw new FrameworkSDLException();
throw new SDLException();
}
this.Context = new GLContext(windowHandle);
@ -338,7 +338,7 @@ namespace SlatedGameToolkit.Framework.Graphics.Window
/// <returns>An integer representing the display this window resides within.</returns>
public int GetDisplayIndex() {
int index = SDL.SDL_GetWindowDisplayIndex(windowHandle);
if (index < 0) throw new FrameworkSDLException();
if (index < 0) throw new SDLException();
return index;
}

View File

@ -12,6 +12,5 @@
<ItemGroup>
<EmbeddedResource Include="Resources/**"/>
<Content Include="deps/**"/>
</ItemGroup>
</Project>