From 839d543a8c62b9c8abf5e01483cc96e6a52fa3da Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Wed, 20 Sep 2023 22:06:07 -0700 Subject: [PATCH] JUTProcBar --- include/JSystem/JUtility/JUTProcBar.h | 16 +- src/JSystem/JUtility/JUTProcBar.cpp | 263 +++++++++++++++++++++++--- 2 files changed, 256 insertions(+), 23 deletions(-) diff --git a/include/JSystem/JUtility/JUTProcBar.h b/include/JSystem/JUtility/JUTProcBar.h index 5fb899e6f..99d94e11e 100644 --- a/include/JSystem/JUtility/JUTProcBar.h +++ b/include/JSystem/JUtility/JUTProcBar.h @@ -10,7 +10,13 @@ class JUTProcBar { public: class CTime { public: - /* 802E7340 */ CTime(); + /* 802E7340 */ CTime() { clear(); } + + void clear() { + mCost = 0; + field_0x8 = 0; + field_0xc = 0; + } void start(u8 param_0, u8 param_1, u8 param_2) { mR = param_0; @@ -51,6 +57,14 @@ public: /* 0x08 */ int mPosY; /* 0x0C */ int mWidth; /* 0x10 */ int mUserPosition; + + void setBarWidth(int width) { mBarWidth = width; } + void setPosition(int x, int y) { + mPosX = x; + mPosY = y; + } + void setWidth(int width) { mWidth = width; } + void setUserPosition(int userPos) { mUserPosition = userPos; } }; /* 802E5888 */ JUTProcBar(); diff --git a/src/JSystem/JUtility/JUTProcBar.cpp b/src/JSystem/JUtility/JUTProcBar.cpp index 7b71da8b3..b712ffcfa 100644 --- a/src/JSystem/JUtility/JUTProcBar.cpp +++ b/src/JSystem/JUtility/JUTProcBar.cpp @@ -4,74 +4,293 @@ // #include "JSystem/JUtility/JUTProcBar.h" +#include "JSystem/J2DGraph/J2DOrthoGraph.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTVideo.h" #include "dolphin/types.h" /* 802C882C-802C8944 .text __ct__10JUTProcBarFv */ +// missing instruction JUTProcBar::JUTProcBar() { /* Nonmatching */ + mVisible = true; + mHeapBarVisible = true; + field_0x108 = 0; + u16 height = JUTVideo::getManager()->getXfbHeight(); + if (height > 400) { + mParams.setBarWidth(2); + mParams.setPosition(39, height - 40); + mParams.setWidth(562); + mParams.setUserPosition(height - 70); + } else { + mParams.setBarWidth(1); + mParams.setPosition(39, height - 20); + mParams.setWidth(562); + mParams.setUserPosition(height - 35); + } + field_0x110 = 1; + field_0x128 = 0; + mWatchHeap = NULL; } +JUTProcBar* JUTProcBar::sManager; + /* 802C8944-802C8988 .text __dt__10JUTProcBarFv */ JUTProcBar::~JUTProcBar() { - /* Nonmatching */ + sManager = NULL; } /* 802C8988-802C89D0 .text create__10JUTProcBarFv */ -void JUTProcBar::create() { - /* Nonmatching */ +JUTProcBar* JUTProcBar::create() { + if (!sManager) { + sManager = new JUTProcBar(); + } + return sManager; } /* 802C89D0-802C8A08 .text destroy__10JUTProcBarFv */ void JUTProcBar::destroy() { - /* Nonmatching */ + if (sManager) { + delete sManager; + } + sManager = NULL; } +static f32 oneFrameRate = 8.0f; +static f32 oneFrameRateUser = 10.0f; + /* 802C8A08-802C8AD8 .text clear__10JUTProcBarFv */ void JUTProcBar::clear() { - /* Nonmatching */ + sManager->idleStart(); + sManager->cpuStart(); + sManager->gpStart(); + sManager->wholeLoopStart(); + sManager->mCostFrame = 0; + oneFrameRate = 8.0f; + oneFrameRateUser = 10.0f; } /* 802C8AD8-802C8C6C .text bar_subroutine__10JUTProcBarFiiiiiiiQ28JUtility6TColorQ28JUtility6TColor */ -void JUTProcBar::bar_subroutine(int, int, int, int, int, int, int, JUtility::TColor, JUtility::TColor) { - /* Nonmatching */ +void JUTProcBar::bar_subroutine(int param_0, int param_1, int param_2, int param_3, int param_4, int param_5, int param_6, JUtility::TColor param_7, JUtility::TColor param_8) { + int var1 = param_6 * param_3 / param_4; + J2DFillBox(param_0, param_1, param_5 * param_3 / param_4, param_2, param_7); + if (var1 < 0) { + return; + } + if (var1 < 6) { + J2DFillBox(param_0, param_1, var1, param_2, param_8); + } else { + J2DFillBox(param_0 + var1 - 6, param_1, 6.0f, param_2, param_8); + } } /* 802C8C6C-802C8DB0 .text adjustMeterLength__10JUTProcBarFUlPfffPi */ -void JUTProcBar::adjustMeterLength(unsigned long, float*, float, float, int*) { - /* Nonmatching */ +void JUTProcBar::adjustMeterLength(u32 param_0, f32* param_1, f32 param_2, f32 param_3, int* param_4) { + BOOL var2 = false; + float var1 = *param_1; + while (var1 > param_2) { + if (param_0 * var1 * 20.0f / 16666.0f <= + mParams.mWidth - 30.0f) + break; + + var1 -= (1.0f / 10.0f); + var2 = true; + } + + if (var1 >= param_3) + *param_4 = 0; + if (var1 > param_3 - (1.0f / 5.0f)) + var1 = param_3; + + while (!var2 && var1 < param_3) { + (*param_4)++; + if (*param_4 < 0x1e) + break; + if ((param_0 * var1 * 20.0f / 16666.0f) < + (mParams.mWidth - 60.0f)) + var1 += (1.0f / 5.0f); + break; + } + *param_1 = var1; } /* 802C8DB0-802C8DE4 .text draw__10JUTProcBarFv */ void JUTProcBar::draw() { - /* Nonmatching */ + drawProcessBar(); + drawHeapBar(); } /* 802C8DE4-802C9CE4 .text drawProcessBar__10JUTProcBarFv */ void JUTProcBar::drawProcessBar() { - /* Nonmatching */ + if (mVisible) { + int frameDuration = 16666; // duration in miliseconds? for how long a frame takes, + if (JUTVideo::getManager() && ((JUTVideo::getManager()->getRenderMode()->vi_tv_mode >> 2) & 0x0f) == 1) // possibly a define + frameDuration = 20000; // duration for PAL + + static int cnt = 0; + adjustMeterLength(mWholeLoop.mCost, &oneFrameRate, 1.0f, 10.0f, &cnt); + int r28 = oneFrameRate * 20.0f; + int r27 = mParams.mBarWidth * 8; + int r26 = mParams.mBarWidth * 2; + int r25 = mParams.mBarWidth * 10; + int r24 = (mParams.mWidth - 4 + r28) / r28; + + mIdle.accumePeek(); + mGp.accumePeek(); + mCpu.accumePeek(); + + u32 totalTime = (mGp.mCost - mGpWait.mCost) - mCpu.mCost; // unsure of types + u32 gpuTime = (mGp.mCost - mGpWait.mCost); + J2DFillBox(mParams.mPosX, mParams.mPosY, mParams.mWidth, r27, JUtility::TColor(0, 0, 50, 200)); + J2DDrawFrame(mParams.mPosX, mParams.mPosY, mParams.mWidth, r27, JUtility::TColor(50, 50, 150, 255), 6); + if (mCostFrame > r24) + J2DFillBox(mParams.mPosX, mParams.mPosY + r27 + 1, mParams.mWidth, 1.0f, JUtility::TColor(250, 0, 0, 200)); + else + J2DFillBox(mParams.mPosX, mParams.mPosY + r27 + 1, mCostFrame * r28 + 2, 1.0f, JUtility::TColor(0, 250, 250, 200)); + + int stack92 = mWholeLoop.mCost * r28 / frameDuration; + if (stack92 > mParams.mWidth) + J2DFillBox(mParams.mPosX, mParams.mPosY, mParams.mWidth, 1.0f, JUtility::TColor(255, 100, 0, 255)); + else + J2DFillBox(mParams.mPosX, mParams.mPosY, stack92, 1.0f, JUtility::TColor(50, 255, 0, 255)); + + if (field_0x110 == 0) { + int r23 = mParams.mPosY + mParams.mBarWidth; + bar_subroutine(mParams.mPosX + 1, r23, r26, r28, frameDuration, mGp.mCost, mGp.field_0x8, JUtility::TColor(80, 255, 80, 255), + JUtility::TColor(100, 255, 120, 255)); + r23 += mParams.mBarWidth * 2; + bar_subroutine(mParams.mPosX + 1, r23, r26, r28, frameDuration, mCpu.mCost, mCpu.field_0x8, JUtility::TColor(255, 80, 80, 255), + JUtility::TColor(255, 100, 100, 255)); + r23 += mParams.mBarWidth * 2; + bar_subroutine(mParams.mPosX + 1, r23, r26, r28, frameDuration, mIdle.mCost, mIdle.field_0x8, JUtility::TColor(180, 180, 160, 255), + JUtility::TColor(200, 200, 200, 255)); + } else { + int r22 = mParams.mPosY + mParams.mBarWidth; + int r21 = mParams.mPosX + 1; + bar_subroutine(r21, r22, r26, r28, frameDuration, gpuTime, -1, JUtility::TColor(80, 255, 80, 255), + JUtility::TColor(80, 255, 80, 255)); + int thingy1 = gpuTime * r28 / frameDuration + r21; // inline or define? + J2DFillBox(thingy1, r22, mGpWait.calcBarSize(r28, frameDuration), r26, JUtility::TColor(0, 255, 0, 255)); + int r30 = mGp.calcBarSize(r28, frameDuration) + r21; + r21 += totalTime * r28 / frameDuration; + r22 += mParams.mBarWidth * 2; + bar_subroutine(r21, r22, r26, r28, frameDuration, mCpu.mCost, -1, JUtility::TColor(255, 80, 80, 255), + JUtility::TColor(255, 80, 80, 255)); + r22 += mParams.mBarWidth * 2; + bar_subroutine(r30, r22, r26, r28, frameDuration, mIdle.mCost, -1, JUtility::TColor(180, 180, 160, 255), + JUtility::TColor(180, 180, 160, 255)); + } + for (int i = 1; i < r24; i++) { + int temp2 = mParams.mPosX + i * r28 + 1; + J2DDrawLine(temp2, mParams.mPosY + mParams.mBarWidth, temp2, mParams.mPosY + r27 - mParams.mBarWidth, + (i % 5) != 0 ? JUtility::TColor(100, 100, 255, 255) : JUtility::TColor(180, 255, 255, 255), 12); + } + u32 temp3 = 0; + for (int i = 0; i < 8; i++) { + CTime* time = &mUsers[i]; + if (++time->field_0xc >= 0x10 || time->mCost > time->field_0x8) { + time->field_0x8 = time->mCost; + time->field_0xc = 0; + } + if (time->field_0x8 > temp3) + temp3 = time->field_0x8; + } + if ((bool)temp3 == true) { + static int cntUser = 0; + adjustMeterLength(temp3, &oneFrameRateUser, 1.0f, 10.0f, &cntUser); + int r21 = oneFrameRateUser * 20.0f; + J2DFillBox(mParams.mPosX, mParams.mUserPosition, mParams.mWidth, r25, JUtility::TColor(0, 0, 50, 200)); + J2DDrawFrame(mParams.mPosX, mParams.mUserPosition, mParams.mWidth, r25, JUtility::TColor(50, 50, 150, 255), 6); + for (int i = 0; i < 8; i++) { + CTime* time = &mUsers[i]; + if (++time->field_0xc >= 0x10 || time->mCost > time->field_0x8) { + time->field_0x8 = time->mCost; + time->field_0xc = 0; + } + if (time->mCost != 0 || time->field_0x8 != 0) { + int temp4 = time->mCost * r21 / frameDuration; + int temp5 = time->field_0x8 * r21 / frameDuration; + time->mCost = 0; + J2DFillBox(mParams.mPosX + 1, mParams.mUserPosition + mParams.mBarWidth + i * mParams.mBarWidth, temp4, + mParams.mBarWidth, JUtility::TColor(time->mR, time->mG, time->mB, 255)); + + if (temp5 < 3u) + J2DFillBox(mParams.mPosX, mParams.mUserPosition + mParams.mBarWidth + i * mParams.mBarWidth, temp5, + mParams.mBarWidth, JUtility::TColor(255, 200, 50, 255)); + else + J2DFillBox(mParams.mPosX + temp5 - 3, mParams.mUserPosition + mParams.mBarWidth + i * mParams.mBarWidth, 3.0f, + mParams.mBarWidth, JUtility::TColor(255, 200, 50, 255)); + } + } + + int r22 = (mParams.mWidth - 4 + r21) / r21; + + for (int i = 1; i < r22; i++) { + int temp6 = mParams.mPosX + i * r21 + 1; + J2DDrawLine(temp6, mParams.mUserPosition + mParams.mBarWidth, temp6, mParams.mUserPosition + r25 - mParams.mBarWidth, + (i % 5) != 0 ? JUtility::TColor(100, 100, 255, 255) : JUtility::TColor(180, 255, 255, 255), 12); + } + } + field_0x108 = 0; + } } /* 802C9CE4-802C9D4C .text addrToXPos__FPvi */ -void addrToXPos(void*, int) { - /* Nonmatching */ +int addrToXPos(void* param_0, int param_1) { + return param_1 * (((u32)param_0 - 0x80000000) / (float)JKRHeap::mMemorySize); } /* 802C9D4C-802C9DB4 .text byteToXLen__Fii */ -void byteToXLen(int, int) { - /* Nonmatching */ +int byteToXLen(int param_0, int param_1) { + return param_1 * (param_0 / (float)JKRHeap::mMemorySize); } /* 802C9DB4-802C9F48 .text heapBar__FP7JKRHeapiiiii */ -void heapBar(JKRHeap*, int, int, int, int, int) { - /* Nonmatching */ +void heapBar(JKRHeap* param_0, int param_1, int param_2, int param_3, int param_4, int param_5) { + int stack52 = param_1 + addrToXPos(param_0->getStartAddr(), param_4); + int var1 = param_1 + addrToXPos(param_0->getEndAddr(), param_4); + int stack36 = byteToXLen(param_0->getTotalFreeSize(), param_4); + J2DFillBox(stack52, param_2 - param_5 * 2 + param_5 / 2, var1 - stack52, param_5 / 2, + JUtility::TColor(255, 0, 200, 255)); + J2DFillBox(stack52, param_2 - param_5 * 2 + param_5 / 2, stack36, param_5 / 2, + JUtility::TColor(255, 180, 250, 255)); } /* 802C9F48-802CA2E8 .text drawHeapBar__10JUTProcBarFv */ void JUTProcBar::drawHeapBar() { - /* Nonmatching */ -} + if (mHeapBarVisible) { + int start; // required/workaround for regswaps, end might be a shared variable too, however doesn't seem to be needed? + int posX = mParams.mPosX; + int posY = mParams.mPosY; + int barHeight = mParams.mBarWidth * 2; + int width = mParams.mWidth; + int height = mParams.mBarWidth * 2; -/* 802CA2E8-802CA2FC .text __ct__Q210JUTProcBar5CTimeFv */ -JUTProcBar::CTime::CTime() { - /* Nonmatching */ + // draw main box in opaque bordeaux red and main frame in purple? + J2DFillBox(posX, posY - (height * 2), width, height, JUtility::TColor(100, 0, 50, 200)); + J2DDrawFrame(posX, posY - (height * 2), width, height, JUtility::TColor(100, 50, 150, 255), 6); + + // Draws a pink line that shows the size of the memstart to start of arenalow? + start = posX + addrToXPos(JKRHeap::getCodeStart(), width); + int codeEnd = posX + addrToXPos(JKRHeap::getCodeEnd(), width); + J2DFillBox(start, posY - (height * 2), codeEnd - start, height, JUtility::TColor(255, 50, 150, 255)); + + // draws a dark blue line that shows how much memory is free? + start = posX + addrToXPos(JKRHeap::getUserRamStart(), width); + int userEnd = posX + addrToXPos(JKRHeap::getUserRamEnd(), width); + J2DFillBox(start, posY - (height * 2), userEnd - start, height, JUtility::TColor(0, 50, 150, 255)); + + // draws a light blue line that shows how much memory is free in the root heap(blends to light pink, not sure how this works) + int size = byteToXLen(JKRHeap::getRootHeap()->getTotalFreeSize(), width); + J2DFillBox(start, posY - (height * 2), size, height / 2, JUtility::TColor(0, 250, 250, 255)); + if (field_0x128 == 0) + { + // draws a line of either the watch heap(if available), otherwise draw the current heap + JKRHeap *heap = mWatchHeap ? mWatchHeap : JKRGetCurrentHeap(); + if (heap != JKRHeap::getSystemHeap()) { + heapBar(heap, posX, posY, barHeight, width, height); + } + + } + } }