/** * @fn Display() * @brief GLUT display callback. */ void Display() { //g_timer.Reset(); if (!g_bPause || g_bSingleStep) { g_bSingleStep = false; // set parameters that may have changed g_pFlo->SetViscosity(g_rViscosity); g_pFlo->EnablePressureClear(g_bClearPressure); g_pFlo->SetNumPoissonSteps(g_iNumPoissonSteps); g_pFlo->SetMassColor(g_rInkRGB); g_pFlo->SetInkLongevity(g_rInkLongevity); g_pFlo->SetTimeStep(g_rTimestep); g_pFlo->SetGridScale(g_rGridScale); g_pFlo->SetVorticityConfinementScale(g_rVCScale); if (g_displayMode == Flo::DISPLAY_VORTICITY || g_bComputeVorticity) g_pFlo->EnableVorticityComputation(true); else g_pFlo->EnableVorticityComputation(false); // For benchmarking... if (g_bTiming) { if (g_perfTimer.GetNumStarts() == 100) { g_bTiming = false; g_perfTimer.Stop(); printf("Average iteration time: %f\n", g_perfTimer.GetAvgTime()); } g_perfTimer.Start(); } // Take a simulation timestep. g_pFlo->Update(); } if (g_bDisplayFluid) { // Display the fluid. g_pFlo->Display(g_displayMode, g_bBilerp, g_bMakeTex, g_bArbitraryBC); // Display user interface. if (g_bDisplaySliders) { paramlist->Render(0, 0); } glutSwapBuffers(); } // Frame rate update g_iFrameCount++; if (g_timer.GetTime() > 0.5) { char title[100]; sprintf(title, "Flo Fluid Simulator: %f FPS", g_iFrameCount / g_timer.GetTime()); glutSetWindowTitle(title); g_iFrameCount = 0; g_timer.Reset(); } }