void _stdcall updateFramerate(unsigned int cmd) { // If rendering was performed, update animation step-time if((cmd == 2) || (cmd == 5)) { // FPS regulation based on previous render double maxFPS = (double)Settings::get().getCurrentFPSLimit(); double minFPS = 10.0f; double currentTime = getElapsedTime(); double deltaTime = currentTime - lastRenderTime; lastRenderTime = currentTime; // Update step-time updateAnimationStepTime((float)deltaTime, (float)minFPS, (float)maxFPS); } }
// Render Loop //---------------------------------------------------------------------------------------- void renderLoop(void) { bool run = true; DWORD threadID = GetCurrentThreadId(); int taskFunc; DWORD task; //Pointers conversion DWORD pGetTaskF = convertAddress(0x00577330); DWORD pCleanTaskF = convertAddress(0x00577450); QueryPerformanceFrequency(&timerFreq); QueryPerformanceCounter(&counterAtStart); float lastTime = 0.0f; // Render loop do { // Get Job & state _asm { PUSH 1 MOV ECX, HighGraphics CALL pGetTaskF //Get task pointer MOV task, EAX //Store task pointer (EAX) MOV ECX, [EAX+0x0C] //Get task function MOV taskFunc, ECX //Store function } if (task == (HighGraphics+0x08)) //No task break; switch (taskFunc) { // Exit loop case 0: _asm { MOV EDI, TaskFuncPtr MOV EAX, [EDI] MOV EDX, [EAX+0x0C] MOV ECX, EDI CALL EDX } run = false; break; // Start Watch-dog Thread case 1: _asm { MOV ESI, task MOV EDI, TaskFuncPtr MOV ECX, [ESI+0x2C] MOV EDX, [ESI+0x28] MOV EAX, [EDI] PUSH ECX MOV ECX, [ESI+0x24] PUSH EDX MOV EDX, [EAX+0x08] PUSH ECX MOV ECX, EDI CALL EDX } break; // Update and/or Render case 2: _asm { MOV ESI, task MOV EDI, TaskFuncPtr MOV ECX, [ESI+0x24] MOV EAX, [EDI] MOV EDX, [EAX+0x10] PUSH ECX MOV ECX, EDI CALL EDX } break; // Do nothing (was debug log) case 3: _asm { MOV EDI, TaskFuncPtr MOV EAX, [EDI] MOV EDX, [EAX+0x14] MOV ECX, TaskFuncPtr CALL EDX } break; // Do nothing (was debug log) case 4: _asm { MOV EDI, TaskFuncPtr MOV EAX, [EDI] MOV EDX, [EAX+0x18] MOV ECX, TaskFuncPtr CALL EDX } break; // Force Render (caused by watchdog timeout) case 5: _asm { MOV EDI, TaskFuncPtr MOV EAX, [EDI] MOV EDX, [EAX+0x1C] MOV ECX, TaskFuncPtr CALL EDX } break; default: break; } // If rendering was performed, update animation step-time if((taskFunc == 2) || (taskFunc == 5)) { // FPS regulation float maxFPS = (float)Settings::get().getCurrentFPSLimit(); float minFPS = 10.0f; float currentTime = getElapsedTime(); float deltaTime = currentTime - lastTime; // Update step-time updateAnimationStepTime((float)deltaTime, minFPS, maxFPS); lastTime = currentTime; } // Task cleanup _asm { MOV ESI, task PUSH ESI MOV ECX, HighGraphics CALL pCleanTaskF } } while (run); }