metaforce/Runtime/GuiSys/CGuiSys.cpp

97 lines
3.2 KiB
C++
Raw Permalink Normal View History

#include "Runtime/GuiSys/CGuiSys.hpp"
#include "Runtime/CSimplePool.hpp"
#include "Runtime/GuiSys/CAuiEnergyBarT01.hpp"
#include "Runtime/GuiSys/CAuiImagePane.hpp"
#include "Runtime/GuiSys/CAuiMeter.hpp"
#include "Runtime/GuiSys/CGuiCamera.hpp"
#include "Runtime/GuiSys/CGuiFrame.hpp"
#include "Runtime/GuiSys/CGuiGroup.hpp"
#include "Runtime/GuiSys/CGuiHeadWidget.hpp"
#include "Runtime/GuiSys/CGuiLight.hpp"
#include "Runtime/GuiSys/CGuiModel.hpp"
#include "Runtime/GuiSys/CGuiPane.hpp"
#include "Runtime/GuiSys/CGuiSliderGroup.hpp"
#include "Runtime/GuiSys/CGuiTableGroup.hpp"
#include "Runtime/GuiSys/CGuiTextPane.hpp"
#include "Runtime/GuiSys/CGuiWidget.hpp"
#include "Runtime/GuiSys/CTextExecuteBuffer.hpp"
#include "Runtime/GuiSys/CTextParser.hpp"
2016-03-10 16:23:16 -08:00
2021-04-10 01:42:06 -07:00
namespace metaforce {
2016-03-10 16:23:16 -08:00
2016-03-18 20:58:01 -07:00
CGuiSys* g_GuiSys = nullptr;
2016-03-21 15:01:19 -07:00
CTextExecuteBuffer* g_TextExecuteBuf = nullptr;
CTextParser* g_TextParser = nullptr;
2016-03-18 20:58:01 -07:00
2018-12-07 21:30:43 -08:00
std::shared_ptr<CGuiWidget> CGuiSys::CreateWidgetInGame(FourCC type, CInputStream& in, CGuiFrame* frame,
CSimplePool* sp, u32 version) {
2019-07-19 21:27:21 -07:00
switch (type.toUint32()) {
2018-12-07 21:30:43 -08:00
case SBIG('BWIG'):
return CGuiWidget::Create(frame, in, sp);
case SBIG('HWIG'):
return CGuiHeadWidget::Create(frame, in, sp);
case SBIG('LITE'):
return CGuiLight::Create(frame, in, sp);
case SBIG('CAMR'):
return CGuiCamera::Create(frame, in, sp);
case SBIG('GRUP'):
return CGuiGroup::Create(frame, in, sp);
case SBIG('PANE'):
return CGuiPane::Create(frame, in, sp);
case SBIG('IMGP'):
return CAuiImagePane::Create(frame, in, sp);
case SBIG('METR'):
return CAuiMeter::Create(frame, in, sp);
case SBIG('MODL'):
return CGuiModel::Create(frame, in, sp);
case SBIG('TBGP'):
return CGuiTableGroup::Create(frame, in, sp);
case SBIG('SLGP'):
return CGuiSliderGroup::Create(frame, in, sp);
case SBIG('TXPN'):
return CGuiTextPane::Create(frame, in, sp, version);
2018-12-07 21:30:43 -08:00
case SBIG('ENRG'):
return CAuiEnergyBarT01::Create(frame, in, sp);
default:
2019-07-19 21:27:21 -07:00
return {};
2018-12-07 21:30:43 -08:00
}
}
2016-03-10 16:23:16 -08:00
CGuiSys::CGuiSys(IFactory& resFactory, CSimplePool& resStore, EUsageMode mode)
2018-12-07 21:30:43 -08:00
: x0_resFactory(resFactory)
, x4_resStore(resStore)
, x8_mode(mode)
, xc_textExecuteBuf(std::make_unique<CTextExecuteBuffer>())
, x10_textParser(std::make_unique<CTextParser>(resStore)) {
2018-12-07 21:30:43 -08:00
g_TextExecuteBuf = xc_textExecuteBuf.get();
g_TextParser = x10_textParser.get();
2016-03-10 16:23:16 -08:00
}
2018-12-07 21:30:43 -08:00
void CGuiSys::OnViewportResize() {
for (CGuiFrame* frame : m_registeredFrames)
ViewportResizeFrame(frame);
2017-01-29 20:16:20 -08:00
}
2018-12-07 21:30:43 -08:00
void CGuiSys::ViewportResizeFrame(CGuiFrame* frame) {
if (frame->m_aspectConstraint > 0.f) {
float hPad, vPad;
2022-02-27 14:46:15 -08:00
if (CGraphics::GetViewportAspect() >= frame->m_aspectConstraint) {
hPad = frame->m_aspectConstraint / CGraphics::GetViewportAspect();
2018-12-07 21:30:43 -08:00
vPad = frame->m_aspectConstraint / 1.38f;
} else {
hPad = 1.f;
2022-02-27 14:46:15 -08:00
vPad = CGraphics::GetViewportAspect() / 1.38f;
}
2018-12-07 21:30:43 -08:00
frame->m_aspectTransform = zeus::CTransform::Scale({hPad, 1.f, vPad});
} else if (frame->m_maxAspect > 0.f) {
2022-02-27 14:46:15 -08:00
if (CGraphics::GetViewportAspect() > frame->m_maxAspect)
frame->m_aspectTransform =
zeus::CTransform::Scale({frame->m_maxAspect / CGraphics::GetViewportAspect(), 1.f, 1.f});
2018-12-07 21:30:43 -08:00
else
frame->m_aspectTransform = zeus::CTransform();
2018-12-07 21:30:43 -08:00
}
2017-01-29 20:16:20 -08:00
}
2021-04-10 01:42:06 -07:00
} // namespace metaforce