//----------------------------------------------------------------------------// void CEGuiBaseApplication::updateFPS(const float elapsed) { // another frame ++d_FPSFrames; if ((d_FPSElapsed += elapsed) >= 1.0f) { if (d_FPSFrames != d_FPSValue) { d_FPSValue = d_FPSFrames; CEGUI::Font* fnt = CEGUI::System::getSingleton().getDefaultGUIContext().getDefaultFont(); if (!fnt) return; // update FPS imagery char fps_textbuff[16]; sprintf(fps_textbuff , "FPS: %d", d_FPSValue); d_FPSGeometry->reset(); fnt->drawText(*d_FPSGeometry, fps_textbuff, CEGUI::Vector2f(0, 0), 0, CEGUI::Colour(0xFFFFFFFF)); } // reset counter state d_FPSFrames = 0; float modValue = 1.f; d_FPSElapsed = std::modf(d_FPSElapsed, &modValue); } }
/************************************************************************* Does whatever is required in one single frame *************************************************************************/ void CEGuiOpenGLBaseApplication::drawFrame(void) { CEGUI::System& guiSystem = CEGUI::System::getSingleton(); // do time based updates int thisTime = glutGet(GLUT_ELAPSED_TIME); float elapsed = static_cast<float>(thisTime - d_lastFrameTime); d_lastFrameTime = thisTime; // inject the time pulse guiSystem.injectTimePulse(elapsed / 1000.0f); // update fps fields doFPSUpdate(); // do rendering for this frame. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 12, 0.0, 0.0, -100, 0.0, 1.0, 0.0); guiSystem.renderGUI(); // render FPS: CEGUI::Font* fnt = guiSystem.getDefaultFont(); if (fnt) { guiSystem.getRenderer()->setQueueingEnabled(false); fnt->drawText(d_fps_textbuff, CEGUI::Vector3(0, 0, 0), guiSystem.getRenderer()->getRect()); } glFlush(); glutPostRedisplay(); glutSwapBuffers(); // here we check the 'quitting' state and cleanup as required. // this is probably not the best way to do this, but since we're // using glut, and glutMainLoop can never return, we need some // way of checking when to exit. And this is it... if (d_quitFlag) { // cleanup cegui system CEGUI::Renderer* renderer = guiSystem.getRenderer(); delete CEGUI::System::getSingletonPtr(); delete renderer; // exit exit(0); } }
//----------------------------------------------------------------------------// void CEGuiBaseApplication::updateFPS(const float elapsed) { // another frame ++d_FPSFrames; if ((d_FPSElapsed += elapsed) >= 1.0f) { if (d_FPSFrames != d_FPSValue) { d_FPSValue = d_FPSFrames; CEGUI::Font* fnt = CEGUI::System::getSingleton().getDefaultGUIContext().getDefaultFont(); if (!fnt) return; // update FPS imagery char fps_textbuff[16]; sprintf(fps_textbuff , "FPS: %d", d_FPSValue); const size_t bufferCount = d_FPSGeometry.size(); for (size_t i = 0; i < bufferCount; ++i) d_renderer->destroyGeometryBuffer(*d_FPSGeometry.at(i)); d_FPSGeometry.clear(); fnt->drawText(d_FPSGeometry, fps_textbuff, glm::vec2(0, 0), 0, false, CEGUI::Colour(0xFFFFFFFF)); updateFPSGeometry(); } // reset counter state d_FPSFrames = 0; float modValue = 1.0f; d_FPSElapsed = std::modf(d_FPSElapsed, &modValue); } }
//----------------------------------------------------------------------------// bool CEGuiD3D10BaseApplication::execute(CEGuiSample* sampleApp) { sampleApp->initialiseSample(); float clear_colour[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; // // This is basically a modified Win32 message pump // bool idle; while (Win32AppHelper::doWin32Events(idle)) { if (idle) { CEGUI::System& guiSystem = CEGUI::System::getSingleton(); // do time based updates DWORD thisTime = GetTickCount(); float elapsed = static_cast<float>(thisTime - d_lastFrameTime); d_lastFrameTime = thisTime; // inject the time pulse guiSystem.injectTimePulse(elapsed / 1000.0f); updateFPS(); char fpsbuff[16]; sprintf(fpsbuff, "FPS: %d", d_FPS); Win32AppHelper::doDirectInputEvents(pimpl->d_directInput); // get render target view // this is a bit wasteful, but done like this for now since the // resize code can change the view from under us. ID3D10RenderTargetView* rtview; pimpl->d_device->OMGetRenderTargets(1, &rtview, 0); // clear display pimpl->d_device->ClearRenderTargetView(rtview, clear_colour); // main CEGUI rendering call guiSystem.renderGUI(); // render FPS: CEGUI::Font* fnt = guiSystem.getDefaultFont(); if (fnt) { guiSystem.getRenderer()->setQueueingEnabled(false); fnt->drawText(fpsbuff, CEGUI::Vector3(0, 0, 0), guiSystem.getRenderer()->getRect()); } pimpl->d_swapChain->Present(0, 0); rtview->Release(); } // check if the application is quitting, and break the loop next time // around if so. if (isQuitting()) PostQuitMessage(0); } return true; }