2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-05-13 15:51:22 +00:00
metaforce/Runtime/GuiSys/CAuiMeter.cpp
Lioncash 221cc5c6b8 RuntimeCommonB: Normalize cpp file includes
Like the prior changes normalizing the inclusions within headers, this
tackles the cpp files of the RuntimeCommonB target, making these source
files consistent with their headers.
2019-12-22 18:12:04 -05:00

102 lines
2.8 KiB
C++

#include "Runtime/GuiSys/CAuiMeter.hpp"
#include <algorithm>
#include <memory>
#include <zeus/Math.hpp>
namespace urde {
CAuiMeter::CAuiMeter(const CGuiWidgetParms& parms, bool noRoundUp, u32 maxCapacity, u32 workerCount)
: CGuiGroup(parms, 0, false), xc4_noRoundUp(noRoundUp), xc8_maxCapacity(maxCapacity), xcc_capacity(maxCapacity) {
xd4_workers.reserve(workerCount);
}
void CAuiMeter::UpdateMeterWorkers() {
float scale = xd4_workers.size() / float(xc8_maxCapacity);
size_t etankCap;
if (xc4_noRoundUp)
etankCap = xcc_capacity * scale;
else
etankCap = xcc_capacity * scale + 0.5f;
size_t etankFill;
if (xc4_noRoundUp)
etankFill = xd0_value * scale;
else
etankFill = xd0_value * scale + 0.5f;
for (size_t i = 0; i < xd4_workers.size(); ++i) {
CGuiGroup* worker = xd4_workers[i];
if (!worker)
continue;
CGuiWidget* fullTank = worker->GetWorkerWidget(0);
CGuiWidget* emptyTank = worker->GetWorkerWidget(1);
if (i < etankFill) {
if (fullTank)
fullTank->SetIsVisible(true);
if (emptyTank)
emptyTank->SetIsVisible(false);
} else if (i < etankCap) {
if (fullTank)
fullTank->SetIsVisible(false);
if (emptyTank)
emptyTank->SetIsVisible(true);
} else {
if (fullTank)
fullTank->SetIsVisible(false);
if (emptyTank)
emptyTank->SetIsVisible(false);
}
}
}
void CAuiMeter::OnVisibleChange() {
if (GetIsVisible())
UpdateMeterWorkers();
}
void CAuiMeter::SetCurrValue(s32 val) {
xd0_value = zeus::clamp(0, val, xcc_capacity);
UpdateMeterWorkers();
}
void CAuiMeter::SetCapacity(s32 cap) {
xcc_capacity = zeus::clamp(0, cap, xc8_maxCapacity);
xd0_value = std::min(xcc_capacity, xd0_value);
UpdateMeterWorkers();
}
void CAuiMeter::SetMaxCapacity(s32 cap) {
xc8_maxCapacity = std::max(0, cap);
xcc_capacity = std::min(xc8_maxCapacity, xcc_capacity);
xd0_value = std::min(xcc_capacity, xd0_value);
UpdateMeterWorkers();
}
CGuiWidget* CAuiMeter::GetWorkerWidget(int id) const { return xd4_workers[id]; }
bool CAuiMeter::AddWorkerWidget(CGuiWidget* worker) {
CGuiGroup::AddWorkerWidget(worker);
if (worker->GetWorkerId() >= xd4_workers.size())
xd4_workers.resize(worker->GetWorkerId() + 1);
xd4_workers[worker->GetWorkerId()] = static_cast<CGuiGroup*>(worker);
return true;
}
std::shared_ptr<CGuiWidget> CAuiMeter::Create(CGuiFrame* frame, CInputStream& in, CSimplePool* sp) {
CGuiWidgetParms parms = ReadWidgetHeader(frame, in);
in.readBool();
bool noRoundUp = in.readBool();
u32 maxCapacity = in.readUint32Big();
u32 workerCount = in.readUint32Big();
std::shared_ptr<CAuiMeter> ret = std::make_shared<CAuiMeter>(parms, noRoundUp, maxCapacity, workerCount);
ret->ParseBaseInfo(frame, in, parms);
return ret;
}
} // namespace urde