changeset 73:3383e402817b

Implement pause mode and adjust the frame/FPS calculations accordingly.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 30 Dec 2019 06:16:11 +0200
parents a21f3cbaf20e
children 99d2c681789f
files gldragon.cpp
diffstat 1 files changed, 35 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/gldragon.cpp	Mon Dec 16 10:23:46 2019 +0200
+++ b/gldragon.cpp	Mon Dec 30 06:16:11 2019 +0200
@@ -95,6 +95,7 @@
 {
     bool
         exitFlag = false,
+        pauseFlag = false,
         optShowHelp = false,
         optSetInputFilename = false,
         optUseShaders = false;
@@ -106,8 +107,10 @@
     std::string optInputFilename = "dragon.scene", basePath;
     DMGLSimpleRenderer renderer;
     DMSimpleScene scene;
-    int startTime, cycleStart, cycleFrames = 0, totalFrames = 0;
-    double totalTime;
+    int cycleTime = 0,
+        cycleFrames = 0,
+        totalTime = 0,
+        totalFrames = 0;
 
     // Check commandline argument for enabling shaders
     for (int narg = 1; narg < argc; narg++)
@@ -282,11 +285,10 @@
     renderer.setupCamera(scene.camera);
 
     // Main loop starts
-    startTime = cycleStart = SDL_GetTicks();
-
     while (!exitFlag)
     {
         SDL_Event event;
+        int frameStart, frameEnd, frameDelta;
 
         // Check for quit events
         while (SDL_PollEvent(&event))
@@ -299,6 +301,11 @@
             case SDL_KEYDOWN:
                 switch (event.key.keysym.sym)
                 {
+                    case SDLK_SPACE:
+                    case SDLK_p:
+                        pauseFlag = !pauseFlag;
+                        break;
+
                     case SDLK_ESCAPE:
                     case SDLK_q:
                         exitFlag = true;
@@ -307,43 +314,48 @@
         }
 
         // Render the next frame
-        totalTime = SDL_GetTicks() - startTime;
+        frameStart = SDL_GetTicks();
         renderer.drawScene(scene, totalTime);
 
         // Draw the current frame
         renderer.swapWindow();
 
         // Rotate for 2 degrees
-        renderer.animate(scene, totalTime);
+        if (!pauseFlag)
+            renderer.animate(scene, totalTime);
+
+        frameEnd = SDL_GetTicks();
 
         // Check for errors
         renderer.checkErrors();
 
+        frameDelta = frameEnd - frameStart;
+
         // Return true if a full rotation was done
-        totalFrames++;
-        cycleFrames++;
-        if (cycleFrames >= SET_FRAMES)
+        if (!pauseFlag)
         {
-            // Get the time it took to render a full turn
-            int cycleEnd = SDL_GetTicks();
-            double cycleTime = cycleEnd - cycleStart;
+            totalFrames++;
+            cycleFrames++;
+
+            cycleTime += frameDelta;
+            totalTime += frameDelta;
 
-            // Restart the timer
-            cycleStart = SDL_GetTicks();
+            if (cycleFrames >= SET_FRAMES)
+            {
+                // Print the current frames per second
+                printf("%d ms for %d frames = %.1lf FPS\n",
+                    cycleTime, cycleFrames, (cycleFrames * 1000.0f) / cycleTime);
 
-            // Print the current frames per second
-            printf("%.1lf ms for %d frames = %.1lf FPS\n",
-                cycleTime, cycleFrames, (cycleFrames * 1000.0f) / cycleTime);
-
-            // Reset cycleFrames
-            cycleFrames = 0;
+                // Reset cycleFrames
+                cycleFrames = 0;
+                cycleTime = 0;
+            }
         }
     }
 
     // Show totals
-    totalTime = SDL_GetTicks() - startTime;
-    printf("%.1lf ms total for %d total frames = %.2lf FPS average\n",
-        totalTime, totalFrames, (totalFrames * 1000.0f) / totalTime);
+    printf("%d ms total for %d total frames = %.2lf FPS average\n",
+        totalTime, totalFrames, ((double) totalFrames * 1000.0f) / (double) totalTime);
 
 exit:
     renderer.shutdownRenderer();