changeset 63:d6ffc59bb84d

Move more of the SDL and GL setup code to the renderer class.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 14 Dec 2019 20:13:32 +0200
parents baccf2044289
children e8100c1c5d99
files dmglrender.cpp dmglrender.h dmrender.h gldragon.cpp
diffstat 4 files changed, 63 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/dmglrender.cpp	Sat Dec 14 16:39:20 2019 +0200
+++ b/dmglrender.cpp	Sat Dec 14 20:13:32 2019 +0200
@@ -103,7 +103,10 @@
 }
 
 
-bool DMGLSimpleRenderer::initRender1(void)
+bool DMGLSimpleRenderer::initRenderer1(const char *title,
+        const int width, const int height,
+        const int sdlWindowHPos, const int sdlWindowVPos,
+        const int sdlFlags)
 {
     // Set GL attributes
     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
@@ -119,14 +122,16 @@
     //SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
 
-    return true;
-}
-
+    // Attempt to create a window
+    if (!DMSimpleRenderer::initRenderer1(
+        title,
+        width, height,
+        sdlWindowHPos, sdlWindowVPos,
+        sdlFlags | SDL_WINDOW_OPENGL))
+        return false;
 
-bool DMGLSimpleRenderer::initRender2(SDL_Window *window)
-{
     // Create OpenGL context
-    if ((glContext = SDL_GL_CreateContext(window)) == NULL)
+    if ((sdlGLContext = SDL_GL_CreateContext(sdlWindow)) == NULL)
     {
         dmError("Unable to create SDL OpenGL context: %s\n",
             SDL_GetError());
@@ -160,7 +165,7 @@
 }
 
 
-bool DMGLSimpleRenderer::initRender3(const int width, const int height)
+bool DMGLSimpleRenderer::initRenderer2(void)
 {
     // Dump some information
     dmMsg("GL_VENDOR   : %s\n", glGetString(GL_VENDOR));
@@ -171,12 +176,12 @@
         return false;
 
     // Setup the window and view port
-    glViewport(0, 0, width, height);
+    glViewport(0, 0, windowWidth, windowHeight);
 
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
 
-    gluPerspective(45.0f, GLfloat(width) / GLfloat(height), 0.1f, 1000.0f);
+    gluPerspective(45.0f, GLfloat(windowWidth) / GLfloat(windowHeight), 0.1f, 1000.0f);
 
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
@@ -231,8 +236,10 @@
 
 void DMGLSimpleRenderer::shutdownRenderer(void)
 {
-    if (glContext != NULL)
-        SDL_GL_DeleteContext(glContext);
+    if (sdlGLContext != NULL)
+        SDL_GL_DeleteContext(sdlGLContext);
+
+    DMSimpleRenderer::shutdownRenderer();
 }
 
 
--- a/dmglrender.h	Sat Dec 14 16:39:20 2019 +0200
+++ b/dmglrender.h	Sat Dec 14 20:13:32 2019 +0200
@@ -15,17 +15,21 @@
 
 struct DMGLSimpleRenderer : DMSimpleRenderer
 {
-    SDL_GLContext glContext;
+    SDL_GLContext sdlGLContext;
 
     DMGLSimpleRenderer()
     {
-        glContext = NULL;
+        sdlWindow = NULL;
+        sdlGLContext = NULL;
     }
 
     bool checkErrors(void);
-    bool initRender1(void);
-    bool initRender2(SDL_Window *window);
-    bool initRender3(const int width, const int height);
+
+    bool initRenderer1(const char *title,
+        const int width, const int height,
+        const int sdlWindowHPos, const int sdlWindowVPos,
+        const int sdlFlags);
+    bool initRenderer2(void);
     void shutdownRenderer(void);
 
     void drawModel(const DMSimpleScene &scene, const DMModel &model, const float time);
--- a/dmrender.h	Sat Dec 14 16:39:20 2019 +0200
+++ b/dmrender.h	Sat Dec 14 20:13:32 2019 +0200
@@ -16,10 +16,13 @@
 struct DMSimpleRenderer
 {
     bool useShaders;
+    int windowWidth, windowHeight;
+    SDL_Window *sdlWindow;
 
     DMSimpleRenderer()
     {
         useShaders = false;
+        sdlWindow = NULL;
     }
 
     virtual bool checkErrors(void)
@@ -27,27 +30,42 @@
         return true;
     }
 
-    virtual bool initRender1(void)
+    virtual bool initRenderer1(const char *title,
+        const int width, const int height,
+        const int sdlWindowHPos, const int sdlWindowVPos,
+        const int sdlFlags)
     {
-        return false;
+        windowWidth = width;
+        windowHeight = height;
+
+        if ((sdlWindow = SDL_CreateWindow(title,
+            sdlWindowHPos, sdlWindowVPos,
+            windowWidth, windowHeight,
+            sdlFlags)) == NULL)
+        {
+            dmError("Could not create SDL window: %s",
+                SDL_GetError());
+
+            return false;
+        }
+        else
+            return true;
     }
 
-    virtual bool initRender2(SDL_Window *window)
+    virtual bool initRenderer2(void)
     {
-        (void) window;
-        return false;
-    }
-
-    virtual bool initRender3(const int width, const int height)
-    {
-        (void) width;
-        (void) height;
-
         return false;
     }
 
     virtual void shutdownRenderer(void)
     {
+        if (sdlWindow != NULL)
+            SDL_DestroyWindow(sdlWindow);
+    }
+
+    virtual void swapWindow(void)
+    {
+        SDL_GL_SwapWindow(sdlWindow);
     }
 
     virtual void drawModel(const DMSimpleScene &scene, const DMModel &model, const float time)
--- a/gldragon.cpp	Sat Dec 14 16:39:20 2019 +0200
+++ b/gldragon.cpp	Sat Dec 14 20:13:32 2019 +0200
@@ -28,11 +28,6 @@
        optVSyncMode = 1;
 
 
-/* Globals
- */
-SDL_Window *dmWindow = NULL;
-
-
 /* Helpers
  */
 bool dmInitSDL(DMSimpleRenderer &renderer, const int width, const int height, const char *title)
@@ -49,25 +44,11 @@
     }
 
     // Part 1 of initialization
-    if (!renderer.initRender1())
+    if (!renderer.initRenderer1(title, width, height,
+        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
+        SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE))
         return false;
 
-    // Attempt to create a window
-    if ((dmWindow = SDL_CreateWindow(title,
-            SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
-            width, height,
-            SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE)) == NULL)
-    {
-        dmError("Could not create SDL window: %s",
-            SDL_GetError());
-        return false;
-    }
-
-    // Part 2 of initialization
-    if (!renderer.initRender2(dmWindow))
-        return false;
-
-
     // Check if we want to attempt to use vsync
     switch (optVSyncMode)
     {
@@ -105,7 +86,7 @@
     }
 
     // Part 3 of initialization
-    if (!renderer.initRender3(width, height))
+    if (!renderer.initRenderer2())
         return false;
 
     dmMsg("VSync mode  : %s\n", msg.c_str());
@@ -307,7 +288,7 @@
         renderer.drawScene(scene, totalTime);
 
         // Draw the current frame
-        SDL_GL_SwapWindow(dmWindow);
+        renderer.swapWindow();
 
         // Rotate for 2 degrees
         renderer.animate(scene, totalTime);
@@ -343,9 +324,6 @@
 exit:
     renderer.shutdownRenderer();
 
-    if (dmWindow != NULL)
-        SDL_DestroyWindow(dmWindow);
-
     SDL_Quit();
 
     return 0;