thunderbrew/src/ui/CBackdropGenerator.cpp

385 lines
14 KiB
C++

#include "ui/CBackdropGenerator.hpp"
#include "ui/CSimpleFrame.hpp"
#include "ui/CSimpleTexture.hpp"
#include "ui/LoadXML.hpp"
#include "ui/Util.hpp"
#include "util/CStatus.hpp"
#include "util/StringTo.hpp"
#include <common/XML.hpp>
#include <storm/Error.hpp>
CBackdropGenerator::CBackdropGenerator() {
this->m_color.Set(1.0f, 1.0f, 1.0f, 1.0f);
this->m_borderColor.Set(1.0f, 1.0f, 1.0f, 1.0f);
}
void CBackdropGenerator::Generate(const CRect* rect) {
STORM_ASSERT(rect);
C2Vector texCoords[4];
float v3 = rect->maxX - rect->minX;
float v7 = rect->maxY - rect->minY;
float v4 = 1.0f / this->m_cornerSize;
float v5 = v4 * v3 - 2.0f;
float v9 = v4 * v7 - 2.0f;
float v34 = v5 < 0.0f ? 0.0f : v5;
float v17 = v9 < 0.0f ? 0.0f : v9;
const char* background = this->m_background.GetString();
if (background && *background && this->m_tileBackground) {
float v13 = this->m_backgroundSize == 0.0f
? this->m_cornerSize
: this->m_backgroundSize;
texCoords[0] = { 0.0f, 0.0f };
texCoords[1] = { 0.0f, v7 / v13 };
texCoords[2] = { v3 / v13, 0.0f };
texCoords[3] = { v3 / v13, v7 / v13 };
this->m_backgroundTexture->SetTexCoord(texCoords);
}
if (this->m_pieces & 0x1) {
texCoords[0] = { 0.0078125f, 0.0625f };
texCoords[1] = { 0.0078125f, v17 - 0.0625f };
texCoords[2] = { 0.1171875f, 0.0625f };
texCoords[3] = { 0.1171875f, v17 - 0.0625f };
this->m_leftTexture->SetTexCoord(texCoords);
}
if (this->m_pieces & 0x2) {
texCoords[0] = { 0.1328125f, 0.0625f };
texCoords[1] = { 0.1328125f, v17 - 0.0625f };
texCoords[2] = { 0.2421875f, 0.0625f };
texCoords[3] = { 0.2421875f, v17 - 0.0625f };
this->m_rightTexture->SetTexCoord(texCoords);
}
if (this->m_pieces & 0x4) {
texCoords[0] = { 0.2578125f, v34 - 0.0625f };
texCoords[1] = { 0.3671875f, v34 - 0.0625f };
texCoords[2] = { 0.2578125f, 0.0625f };
texCoords[3] = { 0.3671875f, 0.0625f };
this->m_topTexture->SetTexCoord(texCoords);
}
if (this->m_pieces & 0x8) {
texCoords[0] = { 0.3828125f, v34 - 0.0625f };
texCoords[1] = { 0.4921875f, v34 - 0.0625f };
texCoords[2] = { 0.3828125f, 0.0625f };
texCoords[3] = { 0.4921875f, 0.0625f };
this->m_bottomTexture->SetTexCoord(texCoords);
}
if (this->m_backgroundTexture) {
this->m_backgroundTexture->SetVertexColor(this->m_color);
}
this->SetBorderVertexColor(this->m_borderColor);
}
void CBackdropGenerator::LoadXML(XMLNode* node, CStatus* status) {
const char* bgFileAttr = node->GetAttributeByName("bgFile");
const char* edgeFileAttr = node->GetAttributeByName("edgeFile");
const char* tileAttr = node->GetAttributeByName("tile");
const char* alphaModeAttr = node->GetAttributeByName("alphaMode");
this->m_background.Copy(bgFileAttr);
this->m_border.Copy(edgeFileAttr);
this->m_tileBackground = tileAttr && *tileAttr
? StringToBOOL(tileAttr)
: 0;
this->m_pieces = edgeFileAttr && *edgeFileAttr
? 0xFF
: 0;
this->m_blend = GxBlend_Alpha;
if (alphaModeAttr && *alphaModeAttr) {
StringToBlendMode(alphaModeAttr, this->m_blend);
}
for (auto child = node->m_child; child; child = child->m_next) {
if (!SStrCmpI(child->GetName(), "TileSize", STORM_MAX_STR)) {
float backgroundSize;
if (LoadXML_Value(child, backgroundSize, status)) {
this->m_backgroundSize = backgroundSize;
}
} else if (!SStrCmpI(child->GetName(), "EdgeSize", STORM_MAX_STR)) {
float cornerSize;
if (LoadXML_Value(child, cornerSize, status)) {
this->m_cornerSize = cornerSize;
}
} else if (!SStrCmpI(child->GetName(), "BackgroundInsets", STORM_MAX_STR)) {
float leftInset, rightInset, topInset, bottomInset;
if (LoadXML_Insets(child, leftInset, rightInset, topInset, bottomInset, status)) {
this->m_leftInset = leftInset;
this->m_rightInset = rightInset;
this->m_topInset = topInset;
this->m_bottomInset = bottomInset;
}
} else if (!SStrCmpI(child->GetName(), "Color", STORM_MAX_STR)) {
// TODO
} else if (!SStrCmpI(child->GetName(), "BorderColor", STORM_MAX_STR)) {
CImVector borderColor = { 0 };
LoadXML_Color(child, borderColor);
this->SetBorderVertexColor(borderColor);
} else {
status->Add(
STATUS_WARNING,
"Unknown child node in %s element: %s",
node->GetName(),
child->GetName()
);
}
}
}
void CBackdropGenerator::SetBorderVertexColor(const CImVector& borderColor) {
this->m_borderColor = borderColor;
if (this->m_leftTexture) {
this->m_leftTexture->SetVertexColor(borderColor);
}
if (this->m_rightTexture) {
this->m_rightTexture->SetVertexColor(borderColor);
}
if (this->m_topTexture) {
this->m_topTexture->SetVertexColor(borderColor);
}
if (this->m_bottomTexture) {
this->m_bottomTexture->SetVertexColor(borderColor);
}
if (this->m_topLeftTexture) {
this->m_topLeftTexture->SetVertexColor(borderColor);
}
if (this->m_topRightTexture) {
this->m_topRightTexture->SetVertexColor(borderColor);
}
if (this->m_bottomLeftTexture) {
this->m_bottomLeftTexture->SetVertexColor(borderColor);
}
if (this->m_bottomRightTexture) {
this->m_bottomRightTexture->SetVertexColor(borderColor);
}
}
void CBackdropGenerator::SetOutput(CSimpleFrame* frame) {
STORM_ASSERT(frame);
C2Vector texCoords[4];
const char* background = this->m_background.GetString();
const char* border = this->m_border.GetString();
if (background && *background) {
// TODO
// CSimpleTexture* backgroundTexture = CSimpleTexture::s_allocator.GetData(0, __FILE__, __LINE__);
auto m = SMemAlloc(sizeof(CSimpleTexture), __FILE__, __LINE__, 0x0);
auto backgroundTexture = new (m) CSimpleTexture(frame, DRAWLAYER_BACKGROUND, 1);
this->m_backgroundTexture = backgroundTexture;
backgroundTexture->SetPoint(FRAMEPOINT_TOPLEFT, frame, FRAMEPOINT_TOPLEFT, this->m_leftInset, -this->m_topInset, 0);
backgroundTexture->SetPoint(FRAMEPOINT_TOPRIGHT, frame, FRAMEPOINT_TOPRIGHT, -this->m_rightInset, -this->m_topInset, 0);
backgroundTexture->SetPoint(FRAMEPOINT_BOTTOMLEFT, frame, FRAMEPOINT_BOTTOMLEFT, this->m_leftInset, this->m_bottomInset, 0);
backgroundTexture->SetPoint(FRAMEPOINT_BOTTOMRIGHT, frame, FRAMEPOINT_BOTTOMRIGHT, -this->m_rightInset, this->m_topInset, 0);
backgroundTexture->Resize(0);
backgroundTexture->SetTexture(background, this->m_tileBackground, 0, CSimpleTexture::s_textureFilterMode, ImageMode_UI);
}
if (this->m_pieces & 0x1) {
// TODO
// CSimpleTexture* leftTexture = CSimpleTexture::s_allocator.GetData(0, __FILE__, __LINE__);
auto m = SMemAlloc(sizeof(CSimpleTexture), __FILE__, __LINE__, 0x0);
auto leftTexture = new (m) CSimpleTexture(frame, DRAWLAYER_BACKGROUND_BORDER, 1);
this->m_leftTexture = leftTexture;
leftTexture->SetWidth(this->m_cornerSize);
leftTexture->SetPoint(FRAMEPOINT_TOPLEFT, frame, FRAMEPOINT_TOPLEFT, 0.0f, -this->m_cornerSize, 0);
leftTexture->SetPoint(FRAMEPOINT_BOTTOMLEFT, frame, FRAMEPOINT_BOTTOMLEFT, 0.0f, this->m_cornerSize, 0);
leftTexture->Resize(0);
leftTexture->SetTexture(border, 1, 1, CSimpleTexture::s_textureFilterMode, ImageMode_UI);
leftTexture->SetBlendMode(this->m_blend);
}
if (this->m_pieces & 0x2) {
// TODO
// CSimpleTexture* rightTexture = CSimpleTexture::s_allocator.GetData(0, __FILE__, __LINE__);
auto m = SMemAlloc(sizeof(CSimpleTexture), __FILE__, __LINE__, 0x0);
auto rightTexture = new (m) CSimpleTexture(frame, DRAWLAYER_BACKGROUND_BORDER, 1);
this->m_rightTexture = rightTexture;
rightTexture->SetWidth(this->m_cornerSize);
rightTexture->SetPoint(FRAMEPOINT_TOPRIGHT, frame, FRAMEPOINT_TOPRIGHT, 0.0f, -this->m_cornerSize, 0);
rightTexture->SetPoint(FRAMEPOINT_BOTTOMRIGHT, frame, FRAMEPOINT_BOTTOMRIGHT, 0.0f, this->m_cornerSize, 0);
rightTexture->Resize(0);
rightTexture->SetTexture(border, 1, 1, CSimpleTexture::s_textureFilterMode, ImageMode_UI);
rightTexture->SetBlendMode(this->m_blend);
}
if (this->m_pieces & 0x4) {
// TODO
// CSimpleTexture* topTexture = CSimpleTexture::s_allocator.GetData(0, __FILE__, __LINE__);
auto m = SMemAlloc(sizeof(CSimpleTexture), __FILE__, __LINE__, 0x0);
auto topTexture = new (m) CSimpleTexture(frame, DRAWLAYER_BACKGROUND_BORDER, 1);
this->m_topTexture = topTexture;
topTexture->SetHeight(this->m_cornerSize);
topTexture->SetPoint(FRAMEPOINT_TOPLEFT, frame, FRAMEPOINT_TOPLEFT, this->m_cornerSize, 0.0f, 0);
topTexture->SetPoint(FRAMEPOINT_TOPRIGHT, frame, FRAMEPOINT_TOPRIGHT, -this->m_cornerSize, 0.0f, 0);
topTexture->Resize(0);
topTexture->SetTexture(border, 1, 1, CSimpleTexture::s_textureFilterMode, ImageMode_UI);
topTexture->SetBlendMode(this->m_blend);
}
if (this->m_pieces & 0x8) {
// TODO
// CSimpleTexture* bottomTexture = CSimpleTexture::s_allocator.GetData(0, __FILE__, __LINE__);
auto m = SMemAlloc(sizeof(CSimpleTexture), __FILE__, __LINE__, 0x0);
auto bottomTexture = new (m) CSimpleTexture(frame, DRAWLAYER_BACKGROUND_BORDER, 1);
this->m_bottomTexture = bottomTexture;
bottomTexture->SetHeight(this->m_cornerSize);
bottomTexture->SetPoint(FRAMEPOINT_BOTTOMLEFT, frame, FRAMEPOINT_BOTTOMLEFT, this->m_cornerSize, 0.0f, 0);
bottomTexture->SetPoint(FRAMEPOINT_BOTTOMRIGHT, frame, FRAMEPOINT_BOTTOMRIGHT, -this->m_cornerSize, 0.0f, 0);
bottomTexture->Resize(0);
bottomTexture->SetTexture(border, 1, 1, CSimpleTexture::s_textureFilterMode, ImageMode_UI);
bottomTexture->SetBlendMode(this->m_blend);
}
if (this->m_pieces & 0x10) {
// TODO
// CSimpleTexture* topLeftTexture = CSimpleTexture::s_allocator.GetData(0, __FILE__, __LINE__);
auto m = SMemAlloc(sizeof(CSimpleTexture), __FILE__, __LINE__, 0x0);
auto topLeftTexture = new (m) CSimpleTexture(frame, DRAWLAYER_BACKGROUND_BORDER, 1);
this->m_topLeftTexture = topLeftTexture;
topLeftTexture->SetWidth(this->m_cornerSize);
topLeftTexture->SetHeight(this->m_cornerSize);
topLeftTexture->SetPoint(FRAMEPOINT_TOPLEFT, frame, FRAMEPOINT_TOPLEFT, 0.0f, 0.0f, 1);
texCoords[0] = { 0.5078125f, 0.0625f };
texCoords[1] = { 0.5078125f, 0.9375f };
texCoords[2] = { 0.6171875f, 0.0625f };
texCoords[3] = { 0.6171875f, 0.9375f };
topLeftTexture->SetTexture(border, 0, 0, CSimpleTexture::s_textureFilterMode, ImageMode_UI);
topLeftTexture->SetTexCoord(texCoords);
topLeftTexture->SetBlendMode(this->m_blend);
}
if (this->m_pieces & 0x20) {
// TODO
// CSimpleTexture* topRightTexture = CSimpleTexture::s_allocator.GetData(0, __FILE__, __LINE__);
auto m = SMemAlloc(sizeof(CSimpleTexture), __FILE__, __LINE__, 0x0);
auto topRightTexture = new (m) CSimpleTexture(frame, DRAWLAYER_BACKGROUND_BORDER, 1);
this->m_topRightTexture = topRightTexture;
topRightTexture->SetWidth(this->m_cornerSize);
topRightTexture->SetHeight(this->m_cornerSize);
topRightTexture->SetPoint(FRAMEPOINT_TOPRIGHT, frame, FRAMEPOINT_TOPRIGHT, 0.0f, 0.0f, 1);
texCoords[0] = { 0.6328125f, 0.0625f };
texCoords[1] = { 0.6328125f, 0.9375f };
texCoords[2] = { 0.7421875f, 0.0625f };
texCoords[3] = { 0.7421875f, 0.9375f };
topRightTexture->SetTexture(border, 0, 0, CSimpleTexture::s_textureFilterMode, ImageMode_UI);
topRightTexture->SetTexCoord(texCoords);
topRightTexture->SetBlendMode(this->m_blend);
}
if (this->m_pieces & 0x40) {
// TODO
// CSimpleTexture* bottomLeftTexture = CSimpleTexture::s_allocator.GetData(0, __FILE__, __LINE__);
auto m = SMemAlloc(sizeof(CSimpleTexture), __FILE__, __LINE__, 0x0);
auto bottomLeftTexture = new (m) CSimpleTexture(frame, DRAWLAYER_BACKGROUND_BORDER, 1);
this->m_bottomLeftTexture = bottomLeftTexture;
bottomLeftTexture->SetWidth(this->m_cornerSize);
bottomLeftTexture->SetHeight(this->m_cornerSize);
bottomLeftTexture->SetPoint(FRAMEPOINT_BOTTOMLEFT, frame, FRAMEPOINT_BOTTOMLEFT, 0.0f, 0.0f, 1);
texCoords[0] = { 0.7578125f, 0.0625f };
texCoords[1] = { 0.7578125f, 0.9375f };
texCoords[2] = { 0.8671875f, 0.0625f };
texCoords[3] = { 0.8671875f, 0.9375f };
bottomLeftTexture->SetTexture(border, 0, 0, CSimpleTexture::s_textureFilterMode, ImageMode_UI);
bottomLeftTexture->SetTexCoord(texCoords);
bottomLeftTexture->SetBlendMode(this->m_blend);
}
if (this->m_pieces & 0x80) {
// TODO
// CSimpleTexture* bottomRightTexture = CSimpleTexture::s_allocator.GetData(0, __FILE__, __LINE__);
auto m = SMemAlloc(sizeof(CSimpleTexture), __FILE__, __LINE__, 0x0);
auto bottomRightTexture = new (m) CSimpleTexture(frame, DRAWLAYER_BACKGROUND_BORDER, 1);
this->m_bottomRightTexture = bottomRightTexture;
bottomRightTexture->SetWidth(this->m_cornerSize);
bottomRightTexture->SetHeight(this->m_cornerSize);
bottomRightTexture->SetPoint(FRAMEPOINT_BOTTOMRIGHT, frame, FRAMEPOINT_BOTTOMRIGHT, 0.0f, 0.0f, 1);
texCoords[0] = { 0.8828125f, 0.0625f };
texCoords[1] = { 0.8828125f, 0.9375f };
texCoords[2] = { 0.9921875f, 0.0625f };
texCoords[3] = { 0.9921875f, 0.9375f };
bottomRightTexture->SetTexture(border, 0, 0, CSimpleTexture::s_textureFilterMode, ImageMode_UI);
bottomRightTexture->SetTexCoord(texCoords);
bottomRightTexture->SetBlendMode(this->m_blend);
}
}