metaforce/Runtime/GuiSys/CGuiTextPane.cpp

120 lines
4.4 KiB
C++
Raw Normal View History

#include "CGuiTextPane.hpp"
2016-03-22 02:27:46 +00:00
#include "CFontImageDef.hpp"
#include "CGuiFrame.hpp"
#include "CGuiSys.hpp"
#include "CGuiWidgetDrawParms.hpp"
#include "Graphics/CGraphics.hpp"
#include "Graphics/CGraphicsPalette.hpp"
2018-12-08 05:30:43 +00:00
namespace urde {
CGuiTextPane::CGuiTextPane(const CGuiWidgetParms& parms, CSimplePool* sp, const zeus::CVector2f& dim,
2017-08-13 05:26:14 +00:00
const zeus::CVector3f& vec, CAssetId fontId, const CGuiTextProperties& props,
2018-12-08 05:30:43 +00:00
const zeus::CColor& fontCol, const zeus::CColor& outlineCol, s32 extentX, s32 extentY)
: CGuiPane(parms, dim, vec)
, xd4_textSupport(fontId, props, fontCol, outlineCol, zeus::CColor::skWhite, extentX, extentY, sp, xac_drawFlags) {}
2016-03-22 02:27:46 +00:00
2018-12-08 05:30:43 +00:00
void CGuiTextPane::Update(float dt) {
CGuiWidget::Update(dt);
xd4_textSupport.Update(dt);
2016-03-22 02:27:46 +00:00
}
2018-12-08 05:30:43 +00:00
bool CGuiTextPane::GetIsFinishedLoadingWidgetSpecific() const {
return xd4_textSupport.GetIsTextSupportFinishedLoading();
2016-03-22 02:27:46 +00:00
}
2018-12-08 05:30:43 +00:00
void CGuiTextPane::SetDimensions(const zeus::CVector2f& dim, bool initVBO) {
CGuiPane::SetDimensions(dim, initVBO);
if (initVBO)
InitializeBuffers();
}
2018-12-08 05:30:43 +00:00
void CGuiTextPane::ScaleDimensions(const zeus::CVector3f& scale) {}
void CGuiTextPane::Draw(const CGuiWidgetDrawParms& parms) const {
if (!GetIsVisible())
return;
2016-03-22 02:27:46 +00:00
2018-12-08 05:30:43 +00:00
zeus::CVector2f dims = GetDimensions();
2016-03-22 02:27:46 +00:00
2018-12-08 05:30:43 +00:00
if (xd4_textSupport.x34_extentX)
dims.x() /= float(xd4_textSupport.x34_extentX);
else
dims.x() = 0.f;
2016-03-22 02:27:46 +00:00
2018-12-08 05:30:43 +00:00
if (xd4_textSupport.x38_extentY)
dims.y() /= float(xd4_textSupport.x38_extentY);
else
dims.y() = 0.f;
2016-03-22 02:27:46 +00:00
2018-12-08 05:30:43 +00:00
zeus::CTransform local = zeus::CTransform::Translate(xc0_verts.front().m_pos + xc8_scaleCenter) *
zeus::CTransform::Scale(dims.x(), 1.f, dims.y());
CGraphics::SetModelMatrix(x34_worldXF * local);
2016-03-22 02:27:46 +00:00
2018-12-08 05:30:43 +00:00
zeus::CColor geomCol = xa8_color2;
geomCol.a() *= parms.x0_alphaMod;
const_cast<CGuiTextPane*>(this)->xd4_textSupport.SetGeometryColor(geomCol);
2016-03-22 02:27:46 +00:00
2018-01-26 09:48:42 +00:00
#if 0
CGraphics::SetDepthWriteMode(xb6_31_depthTest, ERglEnum::LEqual, xb7_24_depthWrite);
2016-03-22 02:27:46 +00:00
switch (xac_drawFlags)
2016-03-22 02:27:46 +00:00
{
case EGuiModelDrawFlags::Shadeless:
case EGuiModelDrawFlags::Opaque:
CGraphics::SetBlendMode(ERglBlendMode::Blend, ERglBlendFactor::One,
ERglBlendFactor::Zero, ERglLogicOp::Clear);
xd4_textSupport.Render();
2016-03-22 02:27:46 +00:00
break;
case EGuiModelDrawFlags::Alpha:
CGraphics::SetBlendMode(ERglBlendMode::Blend, ERglBlendFactor::SrcAlpha,
ERglBlendFactor::InvSrcAlpha, ERglLogicOp::Clear);
xd4_textSupport.Render();
2016-03-22 02:27:46 +00:00
break;
case EGuiModelDrawFlags::Additive:
CGraphics::SetBlendMode(ERglBlendMode::Blend, ERglBlendFactor::SrcAlpha,
ERglBlendFactor::One, ERglLogicOp::Clear);
xd4_textSupport.Render();
2016-03-22 02:27:46 +00:00
break;
case EGuiModelDrawFlags::AlphaAdditiveOverdraw:
CGraphics::SetBlendMode(ERglBlendMode::Blend, ERglBlendFactor::SrcAlpha,
ERglBlendFactor::InvSrcAlpha, ERglLogicOp::Clear);
xd4_textSupport.Render();
const_cast<CGuiTextPane*>(this)->xd4_textSupport.SetGeometryColor
2016-03-22 02:27:46 +00:00
(geomCol * zeus::CColor(geomCol.a, geomCol.a, geomCol.a, 1.f));
CGraphics::SetBlendMode(ERglBlendMode::Blend, ERglBlendFactor::One,
ERglBlendFactor::One, ERglLogicOp::Clear);
xd4_textSupport.Render();
2016-03-22 02:27:46 +00:00
break;
}
2017-01-29 03:58:16 +00:00
#else
2018-12-08 05:30:43 +00:00
xd4_textSupport.Render();
2017-01-29 03:58:16 +00:00
#endif
2016-03-22 02:27:46 +00:00
}
2018-12-08 05:30:43 +00:00
std::shared_ptr<CGuiWidget> CGuiTextPane::Create(CGuiFrame* frame, CInputStream& in, CSimplePool* sp) {
CGuiWidgetParms parms = ReadWidgetHeader(frame, in);
zeus::CVector2f dim = zeus::CVector2f::ReadBig(in);
zeus::CVector3f vec = zeus::CVector3f::ReadBig(in);
u32 fontId = in.readUint32Big();
bool wordWrap = in.readBool();
bool horizontal = in.readBool();
EJustification justification = EJustification(in.readUint32Big());
EVerticalJustification vJustification = EVerticalJustification(in.readUint32Big());
CGuiTextProperties props(wordWrap, horizontal, justification, vJustification);
zeus::CColor fontCol;
fontCol.readRGBABig(in);
zeus::CColor outlineCol;
outlineCol.readRGBABig(in);
int extentX = in.readFloatBig();
int extentY = in.readFloatBig();
std::shared_ptr<CGuiTextPane> ret =
std::make_shared<CGuiTextPane>(parms, sp, dim, vec, fontId, props, fontCol, outlineCol, extentX, extentY);
ret->ParseBaseInfo(frame, in, parms);
ret->InitializeBuffers();
ret->TextSupport().SetText(u"");
return ret;
}
2018-12-08 05:30:43 +00:00
} // namespace urde