//Main loop void Main::run() { int frames = 0, frameAtBase = 0; double baseTime = highResTime(); while (true) { if(render && glfwWindowShouldClose(window)) //process close only if rendering break; if(logging) profileLog<<"Frame "<<frames<<endl; double time = highResTime(); if(render) { glfwPollEvents(); //Set camera for raycaster camera.update(); rayCaster.setCamera(camera); } //Simulate one step using OpenCL simulation->step(); if(render) { //Get image from raycaster, pass it to OpenGL rayCaster.shoot(); g.updateTexture(rayCaster.getTexture()); // Render the raycasted texture on a quad g.renderTexture(); } double delta; delta = highResTime() - time; //current time delta framesLog<<frames<<" "<<delta<<endl; //frame time log /* Limit framerate to targetFPS (turned off, let autotuner handle) while(true) { delta = highResTime() - time; double rest = (1.0/targetFPS) - delta; if(rest <= 0) break; usleep(rest / 1000000); //sleep off the rest of the frame } */ //A major change is that of the resolution, in which case //the raycaster also needs to know. bool changed = tuner.report(delta); if(render && changed) { rayCaster.setN(simulation->getN()); rayCaster.setVolume(simulation->getOutputVolume()); } //FPS counter - update once a second frames++; if(time - baseTime > 1) { cout<<"FPS "<<frames - frameAtBase<<endl; if(logging) { framesLog<<"FPS "<<frames - frameAtBase<<endl; framesLog.Commit(); profileLog.Commit(); } frameAtBase = frames; baseTime = highResTime(); } } }