# HG changeset patch # User Matti Hamalainen # Date 1577679371 -7200 # Node ID 3383e402817bd7ca3b4ad5ce3133ff94037f6f53 # Parent a21f3cbaf20e6f3c6a1bdec5a6b6205d52dad985 Implement pause mode and adjust the frame/FPS calculations accordingly. diff -r a21f3cbaf20e -r 3383e402817b gldragon.cpp --- 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();