diff --git a/Blarg.GameFramework.SDL2/Blarg.GameFramework.SDL2.csproj b/Blarg.GameFramework.SDL2/Blarg.GameFramework.SDL2.csproj index d625a37..3d25f28 100644 --- a/Blarg.GameFramework.SDL2/Blarg.GameFramework.SDL2.csproj +++ b/Blarg.GameFramework.SDL2/Blarg.GameFramework.SDL2.csproj @@ -51,7 +51,6 @@ - diff --git a/Blarg.GameFramework.SDL2/SDLLooper.cs b/Blarg.GameFramework.SDL2/SDLLooper.cs index 7221640..9e90ff3 100644 --- a/Blarg.GameFramework.SDL2/SDLLooper.cs +++ b/Blarg.GameFramework.SDL2/SDLLooper.cs @@ -1,6 +1,8 @@ using System; using System.Diagnostics; using SDL2; +using PortableGL; +using PortableGL.SDL; using Blarg.GameFramework.Graphics; using Blarg.GameFramework.Input; using Blarg.GameFramework.IO; @@ -14,63 +16,78 @@ namespace Blarg.GameFramework bool _isSDLinited; IntPtr _window; IntPtr _glContext; + SDLLogger _logger; SDLKeyboard _keyboard; SDLMouse _mouse; SDLFileSystem _filesystem; + SDLGL20 _gl; SDLWindow _windowInfo; + PlatformOS _os; bool _isWindowActive; bool _isPaused; bool _isQuitting; - int _fps; - float _frameTime; - int _rendersPerSecond; - int _updatesPerSecond; - int _renderTime; - int _updateTime; - int _targetUpdatesPerSecond; int _ticksPerUpdate; float _fixedUpdateInterval; float _fixedRenderInterval; int _maxFrameSkip = 10; - public override int FPS + public override PlatformOS OperatingSystem { - get { return _fps; } + get { return _os; } } - public override float FrameTime + public override PlatformType Type { - get { return _frameTime; } + get { return PlatformType.Desktop; } } - public override int RendersPerSecond + public override IPlatformLogger Logger { - get { return _rendersPerSecond; } + get { return _logger; } } - public override int UpdatesPerSecond + public override IFileSystem FileSystem { - get { return _updatesPerSecond; } + get { return _filesystem; } } - public override int RenderTime + public override IKeyboard Keyboard { - get { return _renderTime; } + get { return _keyboard; } } - public override int UpdateTime + public override IMouse Mouse { - get { return _updateTime; } + get { return _mouse; } + } + + public override ITouchScreen TouchScreen + { + get { return null; } + } + + public override GL20 GL + { + get { return _gl; } } public SDLLooper() { - Platform.Services = new SDLPlatformServices(); + _logger = new SDLLogger(); _windowInfo = new SDLWindow(); + if (CurrentOS.IsWindows) + _os = PlatformOS.Windows; + else if (CurrentOS.IsLinux) + _os = PlatformOS.Linux; + else if (CurrentOS.IsMac) + _os = PlatformOS.MacOS; + else + throw new Exception("Unable to determine OS."); + SetUpdateFrequency(60); } @@ -85,47 +102,44 @@ namespace Blarg.GameFramework if (!(config is SDLConfiguration)) throw new ArgumentException("Must pass a SDLConfiguration object.", "config"); - Platform.Services.Logger.Info(LOOPER_TAG, "Running..."); + Logger.Info(LOOPER_TAG, "Running..."); SDLConfiguration sdlConfig = (SDLConfiguration)config; - Platform.Services.Logger.Info(LOOPER_TAG, "Received SDL configuration:"); - Platform.Services.Logger.Info(LOOPER_TAG, "\tTitle: {0}", sdlConfig.Title); - Platform.Services.Logger.Info(LOOPER_TAG, "\tWidth: {0}", sdlConfig.Width); - Platform.Services.Logger.Info(LOOPER_TAG, "\tHeight: {0}", sdlConfig.Height); - Platform.Services.Logger.Info(LOOPER_TAG, "\tFullscreen: {0}", sdlConfig.Fullscreen); - Platform.Services.Logger.Info(LOOPER_TAG, "\tResizeable: {0}", sdlConfig.Resizeable); - Platform.Services.Logger.Info(LOOPER_TAG, "GL Doublebuffer: {0}", sdlConfig.glDoubleBuffer); - Platform.Services.Logger.Info(LOOPER_TAG, "GL Depth Buffer Size: {0}", sdlConfig.glDepthBufferSize); - Platform.Services.Logger.Info(LOOPER_TAG, "GL Red Size: {0}", sdlConfig.glRedSize); - Platform.Services.Logger.Info(LOOPER_TAG, "GL Green Size: {0}", sdlConfig.glGreenSize); - Platform.Services.Logger.Info(LOOPER_TAG, "GL Blue Size: {0}", sdlConfig.glBlueSize); - Platform.Services.Logger.Info(LOOPER_TAG, "GL Alpha Size: {0}", sdlConfig.glAlphaSize); + Logger.Info(LOOPER_TAG, "Received SDL configuration:"); + Logger.Info(LOOPER_TAG, "\tTitle: {0}", sdlConfig.Title); + Logger.Info(LOOPER_TAG, "\tWidth: {0}", sdlConfig.Width); + Logger.Info(LOOPER_TAG, "\tHeight: {0}", sdlConfig.Height); + Logger.Info(LOOPER_TAG, "\tFullscreen: {0}", sdlConfig.Fullscreen); + Logger.Info(LOOPER_TAG, "\tResizeable: {0}", sdlConfig.Resizeable); + Logger.Info(LOOPER_TAG, "GL Doublebuffer: {0}", sdlConfig.glDoubleBuffer); + Logger.Info(LOOPER_TAG, "GL Depth Buffer Size: {0}", sdlConfig.glDepthBufferSize); + Logger.Info(LOOPER_TAG, "GL Red Size: {0}", sdlConfig.glRedSize); + Logger.Info(LOOPER_TAG, "GL Green Size: {0}", sdlConfig.glGreenSize); + Logger.Info(LOOPER_TAG, "GL Blue Size: {0}", sdlConfig.glBlueSize); + Logger.Info(LOOPER_TAG, "GL Alpha Size: {0}", sdlConfig.glAlphaSize); if (!InitSDL()) { - Platform.Services.Logger.Error(LOOPER_TAG, "SDL initialization failed. Aborting."); + Logger.Error(LOOPER_TAG, "SDL initialization failed. Aborting."); return; } if (!InitSDLWindow(sdlConfig)) { - Platform.Services.Logger.Error(LOOPER_TAG, "SDL window creation failed. Aborting."); + Logger.Error(LOOPER_TAG, "SDL window creation failed. Aborting."); return; } - (Platform.Services as SDLPlatformServices).Keyboard = _keyboard; - (Platform.Services as SDLPlatformServices).Mouse = _mouse; - (Platform.Services as SDLPlatformServices).FileSystem = _filesystem; - (Platform.Services as SDLPlatformServices).GL = new PortableGL.SDL.SDLGL20(); + Platform.Set(this); OnNewContext(); OnResize(ScreenOrientation.Rotation0, _windowInfo.ClientRectangle); OnLoad(); - Platform.Services.Logger.Info(LOOPER_TAG, "Main loop starting."); + Logger.Info(LOOPER_TAG, "Main loop starting."); MainLoop(); - Platform.Services.Logger.Info(LOOPER_TAG, "Main loop finished."); + Logger.Info(LOOPER_TAG, "Main loop finished."); OnUnload(); OnLostContext(); @@ -138,61 +152,61 @@ namespace Blarg.GameFramework private bool InitSDL() { - Platform.Services.Logger.Info(LOOPER_TAG, "SDL initialization starting."); + Logger.Info(LOOPER_TAG, "SDL initialization starting."); SDL.SDL_version sdlVersion; SDL.SDL_VERSION(out sdlVersion); - Platform.Services.Logger.Info(LOOPER_TAG, "SDL Runtime Version: {0}.{1}.{2}", sdlVersion.major, sdlVersion.minor, sdlVersion.patch); - Platform.Services.Logger.Info(LOOPER_TAG, "SDL Linked Version: {0}.{1}.{2}", SDL.SDL_MAJOR_VERSION, SDL.SDL_MINOR_VERSION, SDL.SDL_PATCHLEVEL); + Logger.Info(LOOPER_TAG, "SDL Runtime Version: {0}.{1}.{2}", sdlVersion.major, sdlVersion.minor, sdlVersion.patch); + Logger.Info(LOOPER_TAG, "SDL Linked Version: {0}.{1}.{2}", SDL.SDL_MAJOR_VERSION, SDL.SDL_MINOR_VERSION, SDL.SDL_PATCHLEVEL); if (SDL.SDL_Init(SDL.SDL_INIT_VIDEO | SDL.SDL_INIT_AUDIO | SDL.SDL_INIT_GAMECONTROLLER | SDL.SDL_INIT_JOYSTICK | SDL.SDL_INIT_TIMER) == -1) { - Platform.Services.Logger.Error(LOOPER_TAG, "SDL_Init() failed: {0}", SDL.SDL_GetError()); + Logger.Error(LOOPER_TAG, "SDL_Init() failed: {0}", SDL.SDL_GetError()); return false; } _isSDLinited = true; _keyboard = new SDLKeyboard(); - Platform.Services.Logger.Info(LOOPER_TAG, "Keyboard input device ready."); + Logger.Info(LOOPER_TAG, "Keyboard input device ready."); _mouse = new SDLMouse(); - Platform.Services.Logger.Info(LOOPER_TAG, "Mouse input device ready."); + Logger.Info(LOOPER_TAG, "Mouse input device ready."); int numJoysticks = SDL.SDL_NumJoysticks(); - Platform.Services.Logger.Info(LOOPER_TAG, "{0} joystick input devices found.", numJoysticks); + Logger.Info(LOOPER_TAG, "{0} joystick input devices found.", numJoysticks); for (int i = 0; i < numJoysticks; ++i) { - Platform.Services.Logger.Info(LOOPER_TAG, "Joystick #{0}. {1}:", (i + 1), SDL.SDL_JoystickNameForIndex(i)); + Logger.Info(LOOPER_TAG, "Joystick #{0}. {1}:", (i + 1), SDL.SDL_JoystickNameForIndex(i)); IntPtr joystick = SDL.SDL_JoystickOpen(i); if (joystick != IntPtr.Zero) { - Platform.Services.Logger.Info(LOOPER_TAG, "\tAxes: {0}", SDL.SDL_JoystickNumAxes(joystick)); - Platform.Services.Logger.Info(LOOPER_TAG, "\tBalls: {0}", SDL.SDL_JoystickNumBalls(joystick)); - Platform.Services.Logger.Info(LOOPER_TAG, "\tHats: {0}", SDL.SDL_JoystickNumHats(joystick)); - Platform.Services.Logger.Info(LOOPER_TAG, "\tButtons: {0}", SDL.SDL_JoystickNumButtons(joystick)); + Logger.Info(LOOPER_TAG, "\tAxes: {0}", SDL.SDL_JoystickNumAxes(joystick)); + Logger.Info(LOOPER_TAG, "\tBalls: {0}", SDL.SDL_JoystickNumBalls(joystick)); + Logger.Info(LOOPER_TAG, "\tHats: {0}", SDL.SDL_JoystickNumHats(joystick)); + Logger.Info(LOOPER_TAG, "\tButtons: {0}", SDL.SDL_JoystickNumButtons(joystick)); SDL.SDL_JoystickClose(joystick); } else - Platform.Services.Logger.Warn(LOOPER_TAG, "\tMore information could not be obtained."); + Logger.Warn(LOOPER_TAG, "\tMore information could not be obtained."); } _filesystem = new SDLFileSystem(); - Platform.Services.Logger.Info(LOOPER_TAG, "Filesystem access initialized."); + Logger.Info(LOOPER_TAG, "Filesystem access initialized."); int numVideoDrivers = SDL.SDL_GetNumVideoDrivers(); - Platform.Services.Logger.Info(LOOPER_TAG, "Video drivers present: {0}.", numVideoDrivers); + Logger.Info(LOOPER_TAG, "Video drivers present: {0}.", numVideoDrivers); for (int i = 0; i < numVideoDrivers; ++i) - Platform.Services.Logger.Info(LOOPER_TAG, "\t{0}: {1}", (i + 1), SDL.SDL_GetVideoDriver(i)); - Platform.Services.Logger.Info(LOOPER_TAG, "Currently using video driver: {0}", SDL.SDL_GetCurrentVideoDriver()); + Logger.Info(LOOPER_TAG, "\t{0}: {1}", (i + 1), SDL.SDL_GetVideoDriver(i)); + Logger.Info(LOOPER_TAG, "Currently using video driver: {0}", SDL.SDL_GetCurrentVideoDriver()); int numAudioDrivers = SDL.SDL_GetNumAudioDrivers(); - Platform.Services.Logger.Info(LOOPER_TAG, "Audio drivers present: {0}", numAudioDrivers); + Logger.Info(LOOPER_TAG, "Audio drivers present: {0}", numAudioDrivers); for (int i = 0; i < numAudioDrivers; ++i) - Platform.Services.Logger.Info(LOOPER_TAG, "\t{0}: {1}", (i + 1), SDL.SDL_GetAudioDriver(i)); - Platform.Services.Logger.Info(LOOPER_TAG, "Currently using audio driver: {0}", SDL.SDL_GetCurrentAudioDriver()); + Logger.Info(LOOPER_TAG, "\t{0}: {1}", (i + 1), SDL.SDL_GetAudioDriver(i)); + Logger.Info(LOOPER_TAG, "Currently using audio driver: {0}", SDL.SDL_GetCurrentAudioDriver()); - Platform.Services.Logger.Info(LOOPER_TAG, "SDL initialization finished."); + Logger.Info(LOOPER_TAG, "SDL initialization finished."); return true; } @@ -214,8 +228,6 @@ namespace Blarg.GameFramework int timeElapsed = 0; bool isDirty = false; - bool isRunningSlowly = false; - int updateTime = 0; int renderTime = 0; int numUpdates = 0; @@ -241,13 +253,13 @@ namespace Blarg.GameFramework // every second recalculate the FPS if (timeElapsed >= 1000) { - _fps = numLoops; - _frameTime = 1000.0f / _fps; + FPS = numLoops; + FrameTime = 1000.0f / FPS; - _rendersPerSecond = numRenders; - _updatesPerSecond = numUpdates; - _renderTime = renderTime; - _updateTime = updateTime; + RendersPerSecond = numRenders; + UpdatesPerSecond = numUpdates; + RenderTime = renderTime; + UpdateTime = updateTime; numUpdates = 0; numRenders = 0; @@ -258,15 +270,15 @@ namespace Blarg.GameFramework // we're "running slowly" if we're more then one update behind if (currentTime > nextUpdateAt + _ticksPerUpdate) - isRunningSlowly = true; + IsRunningSlowly = true; else - isRunningSlowly = false; + IsRunningSlowly = false; numUpdatesThisFrame = 0; while (Environment.TickCount >= nextUpdateAt && numUpdatesThisFrame < _maxFrameSkip) { if (numUpdatesThisFrame > 0) - isRunningSlowly = true; + IsRunningSlowly = true; int before = Environment.TickCount; DoEvents(); @@ -304,7 +316,7 @@ namespace Blarg.GameFramework private bool InitSDLWindow(SDLConfiguration config) { - Platform.Services.Logger.Info(LOOPER_TAG, "SDL Window initialization starting."); + Logger.Info(LOOPER_TAG, "SDL Window initialization starting."); int flags = (int)SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL | (int)SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN; if (config.Fullscreen) @@ -318,42 +330,42 @@ namespace Blarg.GameFramework if (!CreateOpenGLContext(config)) return false; - Platform.Services.Logger.Info(LOOPER_TAG, "SDL Window initialization finished."); + Logger.Info(LOOPER_TAG, "SDL Window initialization finished."); return true; } private bool CreateWindow(string title, int width, int height, int flags) { - Platform.Services.Logger.Info(LOOPER_TAG, "Attempting to set up new window with dimensions {0}x{1}.", width, height); + Logger.Info(LOOPER_TAG, "Attempting to set up new window with dimensions {0}x{1}.", width, height); if (_window != IntPtr.Zero) throw new InvalidOperationException("Cannot create new window before destorying existing one."); _window = SDL.SDL_CreateWindow(title, SDL.SDL_WINDOWPOS_UNDEFINED, SDL.SDL_WINDOWPOS_UNDEFINED, width, height, (SDL.SDL_WindowFlags)flags); if (_window == IntPtr.Zero) { - Platform.Services.Logger.Error(LOOPER_TAG, "Window creation failed: {0}", SDL.SDL_GetError()); + Logger.Error(LOOPER_TAG, "Window creation failed: {0}", SDL.SDL_GetError()); return false; } SetWindowInfo(); - Platform.Services.Logger.Info(LOOPER_TAG, "Window creation succeeded."); + Logger.Info(LOOPER_TAG, "Window creation succeeded."); return true; } private bool DestroyWindow() { - Platform.Services.Logger.Info(LOOPER_TAG, "Destroying window."); + Logger.Info(LOOPER_TAG, "Destroying window."); if (_window == IntPtr.Zero) { - Platform.Services.Logger.Warn(LOOPER_TAG, "No window currently exists, not doing anything."); + Logger.Warn(LOOPER_TAG, "No window currently exists, not doing anything."); return true; } SDL.SDL_DestroyWindow(_window); _window = IntPtr.Zero; - Platform.Services.Logger.Info(LOOPER_TAG, "Window destroyed."); + Logger.Info(LOOPER_TAG, "Window destroyed."); return true; } @@ -374,7 +386,7 @@ namespace Blarg.GameFramework _windowInfo.ClientHeight = clientHeight; _windowInfo.ClientRectangle = new Rect(0, 0, clientWidth, clientHeight); - Platform.Services.Logger.Info(LOOPER_TAG, "Window content area set to {0}", _windowInfo.ClientRectangle); + Logger.Info(LOOPER_TAG, "Window content area set to {0}", _windowInfo.ClientRectangle); } #endregion @@ -383,7 +395,7 @@ namespace Blarg.GameFramework private bool CreateOpenGLContext(SDLConfiguration config) { - Platform.Services.Logger.Info(LOOPER_TAG, "Attempting to create OpenGL context."); + Logger.Info(LOOPER_TAG, "Attempting to create OpenGL context."); if (_glContext != IntPtr.Zero) throw new InvalidOperationException("Cannoy create new OpenGL context before destroying existing one."); if (_window == IntPtr.Zero) @@ -400,16 +412,18 @@ namespace Blarg.GameFramework _glContext = SDL.SDL_GL_CreateContext(_window); if (_glContext == IntPtr.Zero) { - Platform.Services.Logger.Error(LOOPER_TAG, "OpenGL context creation failed: {0}", SDL.SDL_GetError()); + Logger.Error(LOOPER_TAG, "OpenGL context creation failed: {0}", SDL.SDL_GetError()); return false; } - Platform.Services.Logger.Info(LOOPER_TAG, "OpenGL context creation succeeded."); + Logger.Info(LOOPER_TAG, "OpenGL context creation succeeded."); - Platform.Services.Logger.Info(LOOPER_TAG, "Setting OpenTK's OpenGL context and loading OpenGL extensions."); + Logger.Info(LOOPER_TAG, "Setting OpenTK's OpenGL context and loading OpenGL extensions."); OpenTK.Graphics.GraphicsContext.CurrentContext = _glContext; OpenTK.Graphics.OpenGL.GL.LoadAll(); + _gl = new SDLGL20(); + int redSize; int greenSize; int blueSize; @@ -448,41 +462,41 @@ namespace Blarg.GameFramework SDL.SDL_GL_GetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_MAJOR_VERSION, out contextMajorVersion); SDL.SDL_GL_GetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_MINOR_VERSION, out contextMinorVersion); - Platform.Services.Logger.Info(LOOPER_TAG, "OpenGL context attributes:"); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_RED_SIZE: {0}", redSize); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_GREEN_SIZE: {0}", greenSize); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_BLUE_SIZE: {0}", blueSize); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_ALPHA_SIZE: {0}", alphaSize); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_BUFFER_SIZE: {0}", bufferSize); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_DOUBLEBUFFER: {0}", doubleBuffer); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_DEPTH_SIZE: {0}", depthSize); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_STENCIL_SIZE: {0}", stencilSize); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_ACCUM_RED_SIZE: {0}", accumRedSize); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_ACCUM_GREEN_SIZE: {0}", accumGreenSize); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_ACCUM_BLUE_SIZE: {0}", accumBlueSize); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_ACCUM_ALPHA_SIZE: {0}", accumAlphaSize); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_STEREO: {0}", stereo); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_MULTISAMPLEBUFFERS: {0}", multisampleBuffers); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_MULTISAMPLESAMPLES: {0}", multisampleSamples); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_ACCELERATED_VISUAL: {0}", acceleratedVisual); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_CONTEXT_MAJOR_VERSION: {0}", contextMajorVersion); - Platform.Services.Logger.Info(LOOPER_TAG, "\tGL_CONTEXT_MINOR_VERSION: {0}", contextMinorVersion); + Logger.Info(LOOPER_TAG, "OpenGL context attributes:"); + Logger.Info(LOOPER_TAG, "\tGL_RED_SIZE: {0}", redSize); + Logger.Info(LOOPER_TAG, "\tGL_GREEN_SIZE: {0}", greenSize); + Logger.Info(LOOPER_TAG, "\tGL_BLUE_SIZE: {0}", blueSize); + Logger.Info(LOOPER_TAG, "\tGL_ALPHA_SIZE: {0}", alphaSize); + Logger.Info(LOOPER_TAG, "\tGL_BUFFER_SIZE: {0}", bufferSize); + Logger.Info(LOOPER_TAG, "\tGL_DOUBLEBUFFER: {0}", doubleBuffer); + Logger.Info(LOOPER_TAG, "\tGL_DEPTH_SIZE: {0}", depthSize); + Logger.Info(LOOPER_TAG, "\tGL_STENCIL_SIZE: {0}", stencilSize); + Logger.Info(LOOPER_TAG, "\tGL_ACCUM_RED_SIZE: {0}", accumRedSize); + Logger.Info(LOOPER_TAG, "\tGL_ACCUM_GREEN_SIZE: {0}", accumGreenSize); + Logger.Info(LOOPER_TAG, "\tGL_ACCUM_BLUE_SIZE: {0}", accumBlueSize); + Logger.Info(LOOPER_TAG, "\tGL_ACCUM_ALPHA_SIZE: {0}", accumAlphaSize); + Logger.Info(LOOPER_TAG, "\tGL_STEREO: {0}", stereo); + Logger.Info(LOOPER_TAG, "\tGL_MULTISAMPLEBUFFERS: {0}", multisampleBuffers); + Logger.Info(LOOPER_TAG, "\tGL_MULTISAMPLESAMPLES: {0}", multisampleSamples); + Logger.Info(LOOPER_TAG, "\tGL_ACCELERATED_VISUAL: {0}", acceleratedVisual); + Logger.Info(LOOPER_TAG, "\tGL_CONTEXT_MAJOR_VERSION: {0}", contextMajorVersion); + Logger.Info(LOOPER_TAG, "\tGL_CONTEXT_MINOR_VERSION: {0}", contextMinorVersion); - Platform.Services.Logger.Info(LOOPER_TAG, "Attempting to enable V-sync."); + Logger.Info(LOOPER_TAG, "Attempting to enable V-sync."); if (SDL.SDL_GL_SetSwapInterval(1) != 0) - Platform.Services.Logger.Warn(LOOPER_TAG, "Could not set swap interval: {0}", SDL.SDL_GetError()); + Logger.Warn(LOOPER_TAG, "Could not set swap interval: {0}", SDL.SDL_GetError()); else - Platform.Services.Logger.Info(LOOPER_TAG, "Swap interval set successful."); + Logger.Info(LOOPER_TAG, "Swap interval set successful."); return true; } private bool DestroyOpenGLContext() { - Platform.Services.Logger.Info(LOOPER_TAG, "Destroying OpenGL context."); + Logger.Info(LOOPER_TAG, "Destroying OpenGL context."); if (_glContext == IntPtr.Zero) { - Platform.Services.Logger.Warn(LOOPER_TAG, "No OpenGL context currently exists, not doing anything."); + Logger.Warn(LOOPER_TAG, "No OpenGL context currently exists, not doing anything."); return true; } @@ -490,7 +504,7 @@ namespace Blarg.GameFramework OpenTK.Graphics.GraphicsContext.CurrentContext = IntPtr.Zero; _glContext = IntPtr.Zero; - Platform.Services.Logger.Info(LOOPER_TAG, "OpenGL context destroyed."); + Logger.Info(LOOPER_TAG, "OpenGL context destroyed."); return true; } @@ -508,35 +522,35 @@ namespace Blarg.GameFramework switch (e.window.windowEvent) { case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_MINIMIZED: - Platform.Services.Logger.Info(LOOPER_TAG, "Window focus lost."); - Platform.Services.Logger.Info(LOOPER_TAG, "Window marked inactive."); + Logger.Info(LOOPER_TAG, "Window focus lost."); + Logger.Info(LOOPER_TAG, "Window marked inactive."); break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_RESTORED: - Platform.Services.Logger.Info(LOOPER_TAG, "Window focus gained."); - Platform.Services.Logger.Info(LOOPER_TAG, "Window marked active."); + Logger.Info(LOOPER_TAG, "Window focus gained."); + Logger.Info(LOOPER_TAG, "Window marked active."); break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_ENTER: - Platform.Services.Logger.Info(LOOPER_TAG, "Gained mouse focus."); + Logger.Info(LOOPER_TAG, "Gained mouse focus."); break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_LEAVE: - Platform.Services.Logger.Info(LOOPER_TAG, "Lost mouse focus."); + Logger.Info(LOOPER_TAG, "Lost mouse focus."); break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED: - Platform.Services.Logger.Info(LOOPER_TAG, "Gained input device focus."); + Logger.Info(LOOPER_TAG, "Gained input device focus."); OnAppGainFocus(); break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST: - Platform.Services.Logger.Info(LOOPER_TAG, "Lost input device focus."); + Logger.Info(LOOPER_TAG, "Lost input device focus."); OnAppLostFocus(); break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_RESIZED: - Platform.Services.Logger.Info(LOOPER_TAG, "Window resized to {0}x{1}.", e.window.data1, e.window.data2); + Logger.Info(LOOPER_TAG, "Window resized to {0}x{1}.", e.window.data1, e.window.data2); Rect size = new Rect(); size.Right = e.window.data1; size.Bottom = e.window.data2; @@ -550,7 +564,7 @@ namespace Blarg.GameFramework switch (e.type) { case SDL.SDL_EventType.SDL_QUIT: - Platform.Services.Logger.Info(LOOPER_TAG, "Event: SQL_QUIT"); + Logger.Info(LOOPER_TAG, "Event: SQL_QUIT"); _isQuitting = true; break; @@ -581,14 +595,14 @@ namespace Blarg.GameFramework if (!_isSDLinited) return; - Platform.Services.Logger.Info(LOOPER_TAG, "Releasing SDL."); + Logger.Info(LOOPER_TAG, "Releasing SDL."); DestroyOpenGLContext(); DestroyWindow(); SDL.SDL_Quit(); _isSDLinited = false; - Platform.Services.Logger.Info(LOOPER_TAG, "SDL shutdown."); + Logger.Info(LOOPER_TAG, "SDL shutdown."); } ~SDLLooper() diff --git a/Blarg.GameFramework.SDL2/SDLPlatformServices.cs b/Blarg.GameFramework.SDL2/SDLPlatformServices.cs deleted file mode 100644 index 9417f62..0000000 --- a/Blarg.GameFramework.SDL2/SDLPlatformServices.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using PortableGL; -using Blarg.GameFramework.Input; -using Blarg.GameFramework.IO; - -namespace Blarg.GameFramework -{ - public class SDLPlatformServices : IPlatformServices - { - public SDLPlatformServices() - { - if (CurrentOS.IsWindows) - OperatingSystem = PlatformOS.Windows; - else if (CurrentOS.IsLinux) - OperatingSystem = PlatformOS.Linux; - else if (CurrentOS.IsMac) - OperatingSystem = PlatformOS.MacOS; - else - throw new Exception("Unable to determine OS."); - - Logger = new SDLLogger(); - } - - public PlatformOS OperatingSystem { get; private set; } - public PlatformType Type - { - get { return PlatformType.Desktop; } - } - - public IPlatformLogger Logger { get; internal set; } - public IFileSystem FileSystem { get; internal set; } - public IKeyboard Keyboard { get; internal set; } - public IMouse Mouse { get; internal set; } - public ITouchScreen TouchScreen { get; internal set; } - public GL20 GL { get; internal set; } - } -} - diff --git a/Blarg.GameFramework/BaseLooper.cs b/Blarg.GameFramework/BaseLooper.cs index f0a96a9..9a17494 100644 --- a/Blarg.GameFramework/BaseLooper.cs +++ b/Blarg.GameFramework/BaseLooper.cs @@ -1,30 +1,32 @@ using System; +using PortableGL; using Blarg.GameFramework.Graphics; +using Blarg.GameFramework.Input; +using Blarg.GameFramework.IO; namespace Blarg.GameFramework { public abstract class BaseLooper : ILooper { - IGameApp _gameApp; + protected IGameApp GameApp { get; set; } - public IGameApp GameApp - { - get - { - return _gameApp; - } - protected set - { - _gameApp = value; - } - } + public abstract PlatformOS OperatingSystem { get; } + public abstract PlatformType Type { get; } - public abstract int FPS { get; } - public abstract float FrameTime { get; } - public abstract int RendersPerSecond { get; } - public abstract int UpdatesPerSecond { get; } - public abstract int RenderTime { get; } - public abstract int UpdateTime { get; } + public abstract IPlatformLogger Logger { get; } + public abstract IFileSystem FileSystem { get; } + public abstract IKeyboard Keyboard { get; } + public abstract IMouse Mouse { get; } + public abstract ITouchScreen TouchScreen { get; } + public abstract GL20 GL { get; } + + public int FPS { get; protected set; } + public float FrameTime { get; protected set; } + public int RendersPerSecond { get; protected set; } + public int UpdatesPerSecond { get; protected set; } + public int RenderTime { get; protected set; } + public int UpdateTime { get; protected set; } + public bool IsRunningSlowly { get; protected set; } public abstract void Run(IGameApp gameApp, IPlatformConfiguration config); diff --git a/Blarg.GameFramework/Blarg.GameFramework.csproj b/Blarg.GameFramework/Blarg.GameFramework.csproj index 3f6e104..19e3822 100644 --- a/Blarg.GameFramework/Blarg.GameFramework.csproj +++ b/Blarg.GameFramework/Blarg.GameFramework.csproj @@ -76,7 +76,6 @@ - diff --git a/Blarg.GameFramework/ILooper.cs b/Blarg.GameFramework/ILooper.cs index 507eb9c..e2bb76c 100644 --- a/Blarg.GameFramework/ILooper.cs +++ b/Blarg.GameFramework/ILooper.cs @@ -1,15 +1,29 @@ using System; +using PortableGL; +using Blarg.GameFramework.Input; +using Blarg.GameFramework.IO; namespace Blarg.GameFramework { public interface ILooper : IDisposable { + PlatformOS OperatingSystem { get; } + PlatformType Type { get; } + + IPlatformLogger Logger { get; } + IFileSystem FileSystem { get; } + IKeyboard Keyboard { get; } + IMouse Mouse { get; } + ITouchScreen TouchScreen { get; } + GL20 GL { get; } + int FPS { get; } float FrameTime { get; } int RendersPerSecond { get; } int UpdatesPerSecond { get; } int RenderTime { get; } int UpdateTime { get; } + bool IsRunningSlowly { get; } void Run(IGameApp gameApp, IPlatformConfiguration config); } diff --git a/Blarg.GameFramework/IPlatformServices.cs b/Blarg.GameFramework/IPlatformServices.cs deleted file mode 100644 index 6fd0266..0000000 --- a/Blarg.GameFramework/IPlatformServices.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using PortableGL; -using Blarg.GameFramework.Input; -using Blarg.GameFramework.IO; - -namespace Blarg.GameFramework -{ - public interface IPlatformServices - { - PlatformOS OperatingSystem { get; } - PlatformType Type { get; } - - IPlatformLogger Logger { get; } - IFileSystem FileSystem { get; } - IKeyboard Keyboard { get; } - IMouse Mouse { get; } - ITouchScreen TouchScreen { get; } - GL20 GL { get; } - } -} - diff --git a/Blarg.GameFramework/Platform.cs b/Blarg.GameFramework/Platform.cs index d7505fb..7bf2ab8 100644 --- a/Blarg.GameFramework/Platform.cs +++ b/Blarg.GameFramework/Platform.cs @@ -1,4 +1,8 @@ using System; +using PortableGL; +using Blarg.GameFramework.Graphics; +using Blarg.GameFramework.Input; +using Blarg.GameFramework.IO; namespace Blarg.GameFramework { @@ -19,18 +23,31 @@ namespace Blarg.GameFramework public static class Platform { - static IPlatformServices _services; + public static PlatformOS OperatingSystem { get; private set; } + public static PlatformType Type { get; private set; } - public static IPlatformServices Services + public static ILooper Looper { get; private set; } + public static IPlatformLogger Logger { get; private set; } + public static IFileSystem FileSystem { get; private set; } + public static IKeyboard Keyboard { get; private set; } + public static IMouse Mouse { get; private set; } + public static ITouchScreen TouchScreen { get; private set; } + public static GL20 GL { get; private set; } + + public static void Set(ILooper looper) { - get { return _services; } - set - { - if (_services != null) - throw new InvalidOperationException(); - else - _services = value; - } + if (Looper != null) + throw new InvalidOperationException(); + + Looper = looper; + OperatingSystem = Looper.OperatingSystem; + Type = Looper.Type; + Logger = Looper.Logger; + FileSystem = Looper.FileSystem; + Keyboard = Looper.Keyboard; + Mouse = Looper.Mouse; + TouchScreen = Looper.TouchScreen; + GL = Looper.GL; } } } diff --git a/Game.Core/GameApp.cs b/Game.Core/GameApp.cs index 3337205..820cb56 100644 --- a/Game.Core/GameApp.cs +++ b/Game.Core/GameApp.cs @@ -45,8 +45,8 @@ namespace Game public void OnRender(float delta) { - Platform.Services.GL.glClear(GL20.GL_DEPTH_BUFFER_BIT | GL20.GL_COLOR_BUFFER_BIT); - Platform.Services.GL.glClearColor(0.25f, 0.5f, 1.0f, 1.0f); + Platform.GL.glClear(GL20.GL_DEPTH_BUFFER_BIT | GL20.GL_COLOR_BUFFER_BIT); + Platform.GL.glClearColor(0.25f, 0.5f, 1.0f, 1.0f); } public void OnResize(ScreenOrientation orientation, Rect size)