mirror of https://github.com/AxioDL/metaforce.git
GuiSys Image geometry fixes
This commit is contained in:
parent
e276bd3be9
commit
83baca806d
|
@ -34,20 +34,29 @@ void CTextSupportShader::CharacterInstance::SetMetrics(const CGlyph& glyph,
|
||||||
m_uv[3].assign(glyph.GetEndU(), 1.f - glyph.GetEndV(), layer);
|
m_uv[3].assign(glyph.GetEndU(), 1.f - glyph.GetEndV(), layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTextSupportShader::ImageInstance::SetMetrics(const zeus::CVector2f& imgSize,
|
void CTextSupportShader::ImageInstance::SetMetrics(const CFontImageDef& imgDef,
|
||||||
const zeus::CVector2i& offset)
|
const zeus::CVector2i& offset)
|
||||||
{
|
{
|
||||||
|
zeus::CVector2f imgSize;
|
||||||
|
if (imgDef.x4_texs.size())
|
||||||
|
{
|
||||||
|
const CTexture& tex = *imgDef.x4_texs[0].GetObj();
|
||||||
|
imgSize.assign(tex.GetWidth() * imgDef.x14_cropFactor.x,
|
||||||
|
tex.GetHeight() * imgDef.x14_cropFactor.y);
|
||||||
|
}
|
||||||
|
zeus::CVector2f cropPad = imgDef.x14_cropFactor * 0.5f;
|
||||||
|
|
||||||
m_pos[0].assign(offset.x, 0.f, offset.y);
|
m_pos[0].assign(offset.x, 0.f, offset.y);
|
||||||
m_uv[0].assign(0.f, 1.f);
|
m_uv[0].assign(0.5f - cropPad.x, 0.5f + cropPad.y);
|
||||||
|
|
||||||
m_pos[1].assign(offset.x + imgSize.x, 0.f, offset.y);
|
m_pos[1].assign(offset.x + imgSize.x, 0.f, offset.y);
|
||||||
m_uv[1].assign(1.f, 1.f);
|
m_uv[1].assign(0.5f + cropPad.x, 0.5f + cropPad.y);
|
||||||
|
|
||||||
m_pos[2].assign(offset.x, 0.f, offset.y + imgSize.y);
|
m_pos[2].assign(offset.x, 0.f, offset.y + imgSize.y);
|
||||||
m_uv[2].assign(0.f, 0.f);
|
m_uv[2].assign(0.5f - cropPad.x, 0.5f - cropPad.y);
|
||||||
|
|
||||||
m_pos[3].assign(offset.x + imgSize.x, 0.f, offset.y + imgSize.y);
|
m_pos[3].assign(offset.x + imgSize.x, 0.f, offset.y + imgSize.y);
|
||||||
m_uv[3].assign(1.f, 0.f);
|
m_uv[3].assign(0.5f + cropPad.x, 0.5f - cropPad.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTextSupportShader::Shutdown()
|
void CTextSupportShader::Shutdown()
|
||||||
|
|
|
@ -10,6 +10,7 @@ namespace urde
|
||||||
{
|
{
|
||||||
class CGlyph;
|
class CGlyph;
|
||||||
class CTextRenderBuffer;
|
class CTextRenderBuffer;
|
||||||
|
class CFontImageDef;
|
||||||
|
|
||||||
class CTextSupportShader
|
class CTextSupportShader
|
||||||
{
|
{
|
||||||
|
@ -48,7 +49,7 @@ class CTextSupportShader
|
||||||
zeus::CVector3f m_pos[4];
|
zeus::CVector3f m_pos[4];
|
||||||
zeus::CVector2f m_uv[4];
|
zeus::CVector2f m_uv[4];
|
||||||
zeus::CColor m_color;
|
zeus::CColor m_color;
|
||||||
void SetMetrics(const zeus::CVector2f& imgSize, const zeus::CVector2i& offset);
|
void SetMetrics(const CFontImageDef& imgDef, const zeus::CVector2i& offset);
|
||||||
};
|
};
|
||||||
|
|
||||||
static hecl::VertexBufferPool<CharacterInstance> s_CharInsts;
|
static hecl::VertexBufferPool<CharacterInstance> s_CharInsts;
|
||||||
|
|
|
@ -5,16 +5,16 @@ namespace urde
|
||||||
{
|
{
|
||||||
|
|
||||||
CFontImageDef::CFontImageDef(const std::vector<TToken<CTexture>>& texs,
|
CFontImageDef::CFontImageDef(const std::vector<TToken<CTexture>>& texs,
|
||||||
float interval, const zeus::CVector2f& vec)
|
float interval, const zeus::CVector2f& cropFactor)
|
||||||
: x0_fps(interval), x14_pointsPerTexel(vec)
|
: x0_fps(interval), x14_cropFactor(cropFactor)
|
||||||
{
|
{
|
||||||
x4_texs.reserve(texs.size());
|
x4_texs.reserve(texs.size());
|
||||||
for (const TToken<CTexture>& tok : texs)
|
for (const TToken<CTexture>& tok : texs)
|
||||||
x4_texs.push_back(tok);
|
x4_texs.push_back(tok);
|
||||||
}
|
}
|
||||||
|
|
||||||
CFontImageDef::CFontImageDef(const TToken<CTexture>& tex, const zeus::CVector2f& vec)
|
CFontImageDef::CFontImageDef(const TToken<CTexture>& tex, const zeus::CVector2f& cropFactor)
|
||||||
: x0_fps(0.f), x14_pointsPerTexel(vec)
|
: x0_fps(0.f), x14_cropFactor(cropFactor)
|
||||||
{
|
{
|
||||||
x4_texs.push_back(tex);
|
x4_texs.push_back(tex);
|
||||||
}
|
}
|
||||||
|
@ -30,13 +30,13 @@ bool CFontImageDef::IsLoaded() const
|
||||||
s32 CFontImageDef::CalculateBaseline() const
|
s32 CFontImageDef::CalculateBaseline() const
|
||||||
{
|
{
|
||||||
const CTexture* tex = x4_texs.front().GetObj();
|
const CTexture* tex = x4_texs.front().GetObj();
|
||||||
return s32(tex->GetHeight() * x14_pointsPerTexel.y) * 2.5f / 3.f;
|
return s32(tex->GetHeight() * x14_cropFactor.y) * 2.5f / 3.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 CFontImageDef::CalculateHeight() const
|
s32 CFontImageDef::CalculateHeight() const
|
||||||
{
|
{
|
||||||
const CTexture* tex = x4_texs.front().GetObj();
|
const CTexture* tex = x4_texs.front().GetObj();
|
||||||
s32 scaledH = tex->GetHeight() * x14_pointsPerTexel.y;
|
s32 scaledH = tex->GetHeight() * x14_cropFactor.y;
|
||||||
return scaledH - (scaledH - CalculateBaseline());
|
return scaledH - (scaledH - CalculateBaseline());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,11 +14,11 @@ class CFontImageDef
|
||||||
public:
|
public:
|
||||||
float x0_fps;
|
float x0_fps;
|
||||||
std::vector<TLockedToken<CTexture>> x4_texs;
|
std::vector<TLockedToken<CTexture>> x4_texs;
|
||||||
zeus::CVector2f x14_pointsPerTexel;
|
zeus::CVector2f x14_cropFactor;
|
||||||
|
|
||||||
CFontImageDef(const std::vector<TToken<CTexture>>& texs, float fps,
|
CFontImageDef(const std::vector<TToken<CTexture>>& texs, float fps,
|
||||||
const zeus::CVector2f& vec);
|
const zeus::CVector2f& cropFactor);
|
||||||
CFontImageDef(const TToken<CTexture>& tex, const zeus::CVector2f& vec);
|
CFontImageDef(const TToken<CTexture>& tex, const zeus::CVector2f& cropFactor);
|
||||||
bool IsLoaded() const;
|
bool IsLoaded() const;
|
||||||
s32 CalculateBaseline() const;
|
s32 CalculateBaseline() const;
|
||||||
s32 CalculateHeight() const;
|
s32 CalculateHeight() const;
|
||||||
|
|
|
@ -84,12 +84,12 @@ void CGuiSys::ViewportResizeFrame(CGuiFrame* frame)
|
||||||
if (vpAspectRatio >= frame->m_aspectConstraint)
|
if (vpAspectRatio >= frame->m_aspectConstraint)
|
||||||
{
|
{
|
||||||
hPad = frame->m_aspectConstraint / vpAspectRatio;
|
hPad = frame->m_aspectConstraint / vpAspectRatio;
|
||||||
vPad = frame->m_aspectConstraint / 1.36f;
|
vPad = frame->m_aspectConstraint / 1.38f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hPad = 1.f;
|
hPad = 1.f;
|
||||||
vPad = vpAspectRatio / 1.36f;
|
vPad = vpAspectRatio / 1.38f;
|
||||||
}
|
}
|
||||||
frame->m_aspectTransform = zeus::CTransform::Scale({hPad, 1.f, vPad});
|
frame->m_aspectTransform = zeus::CTransform::Scale({hPad, 1.f, vPad});
|
||||||
}
|
}
|
||||||
|
|
|
@ -252,11 +252,11 @@ void CImageInstruction::Invoke(CFontRenderState& state, CTextRenderBuffer* buf)
|
||||||
zeus::CVector2i coords(state.xd4_curX, y);
|
zeus::CVector2i coords(state.xd4_curX, y);
|
||||||
buf->AddImage(coords, x4_image);
|
buf->AddImage(coords, x4_image);
|
||||||
}
|
}
|
||||||
state.xd4_curX = state.xd4_curX + tex->GetWidth() * x4_image.x14_pointsPerTexel.y;
|
state.xd4_curX = state.xd4_curX + tex->GetWidth() * x4_image.x14_cropFactor.y;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int scale = state.xdc_currentLineInst->x8_curX - tex->GetWidth() * x4_image.x14_pointsPerTexel.y;
|
int scale = state.xdc_currentLineInst->x8_curX - tex->GetWidth() * x4_image.x14_cropFactor.y;
|
||||||
if (buf)
|
if (buf)
|
||||||
{
|
{
|
||||||
zeus::CVector2i coords(scale / 2 + state.xd4_curX, state.xd8_curY);
|
zeus::CVector2i coords(scale / 2 + state.xd4_curX, state.xd8_curY);
|
||||||
|
|
|
@ -387,8 +387,8 @@ void CTextExecuteBuffer::AddImage(const CFontImageDef& image)
|
||||||
if (xa0_curBlock)
|
if (xa0_curBlock)
|
||||||
{
|
{
|
||||||
const CTexture* tex = image.x4_texs[0].GetObj();
|
const CTexture* tex = image.x4_texs[0].GetObj();
|
||||||
int width = tex->GetWidth() * image.x14_pointsPerTexel.x;
|
int width = tex->GetWidth() * image.x14_cropFactor.x;
|
||||||
int height = tex->GetHeight() * image.x14_pointsPerTexel.y;
|
int height = tex->GetHeight() * image.x14_cropFactor.y;
|
||||||
|
|
||||||
if (xa4_curLine->x8_curX + width > xa0_curBlock->xc_blockExtentX && xa4_curLine->x4_wordCount > 0)
|
if (xa4_curLine->x8_curX + width > xa0_curBlock->xc_blockExtentX && xa4_curLine->x4_wordCount > 0)
|
||||||
StartNewLine();
|
StartNewLine();
|
||||||
|
|
|
@ -250,11 +250,11 @@ CFontImageDef CTextParser::GetImage(const char16_t* str, int len)
|
||||||
AdvanceTokenPos();
|
AdvanceTokenPos();
|
||||||
|
|
||||||
AdvanceCommaPos();
|
AdvanceCommaPos();
|
||||||
float scaleX = u16stof(&iterable[tokenPos]);
|
float cropX = u16stof(&iterable[tokenPos]);
|
||||||
AdvanceTokenPos();
|
AdvanceTokenPos();
|
||||||
|
|
||||||
AdvanceCommaPos();
|
AdvanceCommaPos();
|
||||||
float scaleY = u16stof(&iterable[tokenPos]);
|
float cropY = u16stof(&iterable[tokenPos]);
|
||||||
AdvanceTokenPos();
|
AdvanceTokenPos();
|
||||||
|
|
||||||
std::vector<TToken<CTexture>> texs;
|
std::vector<TToken<CTexture>> texs;
|
||||||
|
@ -267,17 +267,17 @@ CFontImageDef CTextParser::GetImage(const char16_t* str, int len)
|
||||||
AdvanceTokenPos();
|
AdvanceTokenPos();
|
||||||
} while (commaPos != iterable.size());
|
} while (commaPos != iterable.size());
|
||||||
|
|
||||||
return CFontImageDef(texs, interval, zeus::CVector2f(scaleX, scaleY));
|
return CFontImageDef(texs, interval, zeus::CVector2f(cropX, cropY));
|
||||||
}
|
}
|
||||||
else if (BeginsWith(str, len, u"SI"))
|
else if (BeginsWith(str, len, u"SI"))
|
||||||
{
|
{
|
||||||
/* Scaled single texture */
|
/* Scaled single texture */
|
||||||
AdvanceCommaPos();
|
AdvanceCommaPos();
|
||||||
float scaleX = u16stof(&iterable[tokenPos]);
|
float cropX = u16stof(&iterable[tokenPos]);
|
||||||
AdvanceTokenPos();
|
AdvanceTokenPos();
|
||||||
|
|
||||||
AdvanceCommaPos();
|
AdvanceCommaPos();
|
||||||
float scaleY = u16stof(&iterable[tokenPos]);
|
float cropY = u16stof(&iterable[tokenPos]);
|
||||||
AdvanceTokenPos();
|
AdvanceTokenPos();
|
||||||
|
|
||||||
AdvanceCommaPos();
|
AdvanceCommaPos();
|
||||||
|
@ -285,7 +285,7 @@ CFontImageDef CTextParser::GetImage(const char16_t* str, int len)
|
||||||
GetAssetIdFromString(&iterable[tokenPos])});
|
GetAssetIdFromString(&iterable[tokenPos])});
|
||||||
AdvanceTokenPos();
|
AdvanceTokenPos();
|
||||||
|
|
||||||
return CFontImageDef(tex, zeus::CVector2f(scaleX, scaleY));
|
return CFontImageDef(tex, zeus::CVector2f(cropX, cropY));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,15 +18,7 @@ CTextRenderBuffer::CTextRenderBuffer(EMode mode, CGuiWidget::EGuiModelDrawFlags
|
||||||
CTextRenderBuffer::BooImage::BooImage(const CFontImageDef& imgDef, const zeus::CVector2i& offset)
|
CTextRenderBuffer::BooImage::BooImage(const CFontImageDef& imgDef, const zeus::CVector2i& offset)
|
||||||
: m_imageDef(imgDef)
|
: m_imageDef(imgDef)
|
||||||
{
|
{
|
||||||
zeus::CVector2f imgSize;
|
m_imageData.SetMetrics(imgDef, offset);
|
||||||
if (imgDef.x4_texs.size())
|
|
||||||
{
|
|
||||||
const CTexture& tex = *imgDef.x4_texs[0].GetObj();
|
|
||||||
imgSize.assign(tex.GetWidth() * imgDef.x14_pointsPerTexel.x,
|
|
||||||
tex.GetHeight() * imgDef.x14_pointsPerTexel.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_imageData.SetMetrics(imgSize, offset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTextRenderBuffer::BooPrimitiveMark::SetOpacity(CTextRenderBuffer& rb, float opacity)
|
void CTextRenderBuffer::BooPrimitiveMark::SetOpacity(CTextRenderBuffer& rb, float opacity)
|
||||||
|
|
Loading…
Reference in New Issue