Mercurial > hg > forks > gldragon
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();