Make menu to state machine
This commit is contained in:
1 parent
ac551122d9
commit
4af20c65e6
14 files changed
+480
-335
No files matched your search
@@ -169,6 +169,54 @@ namespace ZL {
|
||||
renderer.DisableVertexAttribArray(vTexCoordName);
|
||||
}
|
||||
|
||||
void UiStaticImage::buildMesh() {
|
||||
mesh.data.PositionData.clear();
|
||||
mesh.data.TexCoordData.clear();
|
||||
|
||||
float x0 = rect.x;
|
||||
float y0 = rect.y;
|
||||
float x1 = rect.x + rect.w;
|
||||
float y1 = rect.y + rect.h;
|
||||
|
||||
mesh.data.PositionData.push_back({ x0, y0, 0 });
|
||||
mesh.data.TexCoordData.push_back({ 0, 0 });
|
||||
|
||||
mesh.data.PositionData.push_back({ x0, y1, 0 });
|
||||
mesh.data.TexCoordData.push_back({ 0, 1 });
|
||||
|
||||
mesh.data.PositionData.push_back({ x1, y1, 0 });
|
||||
mesh.data.TexCoordData.push_back({ 1, 1 });
|
||||
|
||||
mesh.data.PositionData.push_back({ x0, y0, 0 });
|
||||
mesh.data.TexCoordData.push_back({ 0, 0 });
|
||||
|
||||
mesh.data.PositionData.push_back({ x1, y1, 0 });
|
||||
mesh.data.TexCoordData.push_back({ 1, 1 });
|
||||
|
||||
mesh.data.PositionData.push_back({ x1, y0, 0 });
|
||||
mesh.data.TexCoordData.push_back({ 1, 0 });
|
||||
|
||||
mesh.RefreshVBO();
|
||||
}
|
||||
|
||||
void UiStaticImage::draw(Renderer& renderer) const {
|
||||
if (!texture) return;
|
||||
|
||||
static const std::string vPositionName = "vPosition";
|
||||
static const std::string vTexCoordName = "vTexCoord";
|
||||
static const std::string textureUniformName = "Texture";
|
||||
|
||||
renderer.RenderUniform1i(textureUniformName, 0);
|
||||
renderer.EnableVertexAttribArray(vPositionName);
|
||||
renderer.EnableVertexAttribArray(vTexCoordName);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, texture->getTexID());
|
||||
renderer.DrawVertexRenderStruct(mesh);
|
||||
|
||||
renderer.DisableVertexAttribArray(vPositionName);
|
||||
renderer.DisableVertexAttribArray(vTexCoordName);
|
||||
}
|
||||
|
||||
void UiTextField::draw(Renderer& renderer) const {
|
||||
if (textRenderer) {
|
||||
float textX = rect.x + 10.0f;
|
||||
@@ -249,6 +297,7 @@ namespace ZL {
|
||||
if (j.contains("horizontal_gravity")) {
|
||||
std::string hg = j["horizontal_gravity"].get<std::string>();
|
||||
if (hg == "right") node->layoutSettings.hGravity = HorizontalGravity::Right;
|
||||
else if (hg == "center") node->layoutSettings.hGravity = HorizontalGravity::Center;
|
||||
else node->layoutSettings.hGravity = HorizontalGravity::Left;
|
||||
}
|
||||
|
||||
@@ -256,6 +305,7 @@ namespace ZL {
|
||||
if (j.contains("vertical_gravity")) {
|
||||
std::string vg = j["vertical_gravity"].get<std::string>();
|
||||
if (vg == "bottom") node->layoutSettings.vGravity = VerticalGravity::Bottom;
|
||||
else if (vg == "center") node->layoutSettings.vGravity = VerticalGravity::Center;
|
||||
else node->layoutSettings.vGravity = VerticalGravity::Top;
|
||||
}
|
||||
|
||||
@@ -403,6 +453,32 @@ namespace ZL {
|
||||
}
|
||||
}
|
||||
|
||||
if (typeStr == "StaticImage") {
|
||||
auto img = std::make_shared<UiStaticImage>();
|
||||
img->name = node->name;
|
||||
img->rect = initialRect;
|
||||
|
||||
std::string texPath;
|
||||
if (j.contains("texture") && j["texture"].is_string()) {
|
||||
texPath = j["texture"].get<std::string>();
|
||||
}
|
||||
else if (j.contains("textures") && j["textures"].is_object() && j["textures"].contains("normal")) {
|
||||
texPath = j["textures"]["normal"].get<std::string>();
|
||||
}
|
||||
|
||||
if (!texPath.empty()) {
|
||||
try {
|
||||
auto data = CreateTextureDataFromPng(texPath.c_str(), zipFile.c_str());
|
||||
img->texture = std::make_shared<Texture>(data);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "UiManager: failed load texture for StaticImage '" << img->name << "' : " << e.what() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
node->staticImage = img;
|
||||
}
|
||||
|
||||
if (typeStr == "TextView") {
|
||||
auto tv = std::make_shared<UiTextView>();
|
||||
|
||||
@@ -492,6 +568,7 @@ namespace ZL {
|
||||
sliders.clear();
|
||||
textViews.clear();
|
||||
textFields.clear();
|
||||
staticImages.clear();
|
||||
collectButtonsAndSliders(root);
|
||||
|
||||
nodeActiveAnims.clear();
|
||||
@@ -503,6 +580,9 @@ namespace ZL {
|
||||
s->buildTrackMesh();
|
||||
s->buildKnobMesh();
|
||||
}
|
||||
for (auto& img : staticImages) {
|
||||
img->buildMesh();
|
||||
}
|
||||
}
|
||||
|
||||
void UiManager::loadFromFile(const std::string& path, Renderer& renderer, const std::string& zipFile) {
|
||||
@@ -618,9 +698,15 @@ namespace ZL {
|
||||
if (child->layoutSettings.hGravity == HorizontalGravity::Right) {
|
||||
fLX = currentW - childW - child->localX;
|
||||
}
|
||||
else if (child->layoutSettings.hGravity == HorizontalGravity::Center) {
|
||||
fLX = (currentW - childW) / 2.0f + child->localX;
|
||||
}
|
||||
if (child->layoutSettings.vGravity == VerticalGravity::Top) {
|
||||
fLY = currentH - childH - child->localY;
|
||||
}
|
||||
else if (child->layoutSettings.vGravity == VerticalGravity::Center) {
|
||||
fLY = (currentH - childH) / 2.0f + child->localY;
|
||||
}
|
||||
|
||||
// Передаем рассчитанные fLX, fLY в рекурсию
|
||||
layoutNode(child, node->screenRect.x, node->screenRect.y, currentW, currentH, fLX, fLY);
|
||||
@@ -661,6 +747,12 @@ namespace ZL {
|
||||
node->textField->rect = node->screenRect;
|
||||
// Аналогично для курсора и фонового меша
|
||||
}
|
||||
|
||||
// 5. Обновляем статическое изображение
|
||||
if (node->staticImage) {
|
||||
node->staticImage->rect = node->screenRect;
|
||||
node->staticImage->buildMesh();
|
||||
}
|
||||
}
|
||||
|
||||
void UiManager::updateAllLayouts() {
|
||||
@@ -690,6 +782,9 @@ namespace ZL {
|
||||
if (node->textField) {
|
||||
textFields.push_back(node->textField);
|
||||
}
|
||||
if (node->staticImage) {
|
||||
staticImages.push_back(node->staticImage);
|
||||
}
|
||||
for (auto& c : node->children) collectButtonsAndSliders(c);
|
||||
}
|
||||
|
||||
@@ -788,6 +883,7 @@ namespace ZL {
|
||||
prev.buttons = buttons;
|
||||
prev.sliders = sliders;
|
||||
prev.textFields = textFields;
|
||||
prev.staticImages = staticImages;
|
||||
prev.pressedButton = pressedButton;
|
||||
prev.pressedSlider = pressedSlider;
|
||||
prev.focusedTextField = focusedTextField;
|
||||
@@ -838,6 +934,7 @@ namespace ZL {
|
||||
buttons = s.buttons;
|
||||
sliders = s.sliders;
|
||||
textFields = s.textFields;
|
||||
staticImages = s.staticImages;
|
||||
pressedButton = s.pressedButton;
|
||||
pressedSlider = s.pressedSlider;
|
||||
focusedTextField = s.focusedTextField;
|
||||
@@ -872,6 +969,9 @@ namespace ZL {
|
||||
renderer.PushMatrix();
|
||||
renderer.LoadIdentity();
|
||||
|
||||
for (const auto& img : staticImages) {
|
||||
img->draw(renderer);
|
||||
}
|
||||
for (const auto& b : buttons) {
|
||||
b->draw(renderer);
|
||||
}
|
||||
@@ -1261,6 +1361,13 @@ namespace ZL {
|
||||
return true;
|
||||
}
|
||||
|
||||
std::shared_ptr<UiStaticImage> UiManager::findStaticImage(const std::string& name) {
|
||||
for (auto& img : staticImages) {
|
||||
if (img->name == name) return img;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<UiTextView> UiManager::findTextView(const std::string& name) {
|
||||
for (auto& tv : textViews) {
|
||||
if (tv->name == name) return tv;
|
||||
|
||||
Reference in new issue
Block a user