VOID HGE_Impl::_InitPowerStatus() { hKrnl32 = LoadLibraryA("kernel32.dll"); if(hKrnl32 != NULL) lpfnGetSystemPowerStatus = (GetSystemPowerStatusFunc)GetProcAddress(hKrnl32, "GetSystemPowerStatus"); _UpdatePowerStatus(); }
bool CALL HGE_Impl::System_Start() { MSG msg; if(!hwnd) { _PostError("System_Start: System_Initiate wasn't called"); return false; } if(!procFrameFunc) { _PostError("System_Start: No frame function defined"); return false; } bActive=true; // MAIN LOOP for(;;) { // Process window messages if not in "child mode" // (if in "child mode" the parent application will do this for us) if(!hwndParent) { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if (msg.message == WM_QUIT) break; // TranslateMessage(&msg); DispatchMessage(&msg); continue; } } // Check if mouse is over HGE window for Input_IsMouseOver _UpdateMouse(); // If HGE window is focused or we have the "don't suspend" state - process the main loop if(bActive || bDontSuspend) { // Ensure we have at least 1ms time step // to not confuse user's code with 0 do { dt=timeGetTime() - t0; } while(dt < 1); // If we reached the time for the next frame // or we just run in unlimited FPS mode, then // do the stuff if(dt >= nFixedDelta) { // fDeltaTime = time step in seconds returned by Timer_GetDelta fDeltaTime=dt/1000.0f; // Cap too large time steps usually caused by lost focus to avoid jerks if(fDeltaTime > 0.2f) { fDeltaTime = nFixedDelta ? nFixedDelta/1000.0f : 0.01f; } // Update time counter returned Timer_GetTime fTime += fDeltaTime; // Store current time for the next frame // and count FPS t0=timeGetTime(); if(t0-t0fps <= 1000) cfps++; else { nFPS=cfps; cfps=0; t0fps=t0; _UpdatePowerStatus(); } // Do user's stuff if(procFrameFunc()) break; if(procRenderFunc) procRenderFunc(); // If if "child mode" - return after processing single frame if(hwndParent) break; // Clean up input events that were generated by // WindowProc and weren't handled by user's code _ClearQueue(); // If we use VSYNC - we could afford a little // sleep to lower CPU usage // if(!bWindowed && nHGEFPS==HGEFPS_VSYNC) Sleep(1); } // If we have a fixed frame rate and the time // for the next frame isn't too close, sleep a bit else { if(nFixedDelta && dt+3 < nFixedDelta) Sleep(1); } } // If main loop is suspended - just sleep a bit // (though not too much to allow instant window // redraw if requested by OS) else Sleep(1); } _ClearQueue(); bActive=false; return true; }