From 66808619f3b61d5c093f7f1e3dfddb26e40f6824 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Tue, 13 May 2025 16:08:19 -0400 Subject: [PATCH] Load a bunch of possible LGB files This now loads the various LGB names I know of when opening a map in the editor, and they are properly categorized in the object list widget. The next step is drawing these in the view or adding a property pane. --- apps/mapeditor/include/appstate.h | 2 +- apps/mapeditor/src/mainwindow.cpp | 21 +++++++++++--- apps/mapeditor/src/objectlistmodel.cpp | 40 ++++++++++++++------------ 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/apps/mapeditor/include/appstate.h b/apps/mapeditor/include/appstate.h index 09273b3..8663624 100644 --- a/apps/mapeditor/include/appstate.h +++ b/apps/mapeditor/include/appstate.h @@ -12,7 +12,7 @@ class AppState : public QObject public: explicit AppState(QObject *parent = nullptr); - physis_LayerGroup bgGroup; + std::vector> lgbFiles; Q_SIGNALS: void mapLoaded(); diff --git a/apps/mapeditor/src/mainwindow.cpp b/apps/mapeditor/src/mainwindow.cpp index d7a1957..5633d0e 100644 --- a/apps/mapeditor/src/mainwindow.cpp +++ b/apps/mapeditor/src/mainwindow.cpp @@ -85,11 +85,24 @@ void MainWindow::openMap(const QString &basePath) setWindowTitle(basePath); - QString lgbPath = QStringLiteral("bg/%1/level/bg.lgb").arg(base2Path); - std::string bgLgbPathStd = lgbPath.toStdString(); + const auto loadLgb = [this, base2Path](const QString &name) { + QString lgbPath = QStringLiteral("bg/%1/level/%2.lgb").arg(base2Path, name); + std::string bgLgbPathStd = lgbPath.toStdString(); - auto bg_buffer = physis_gamedata_extract_file(data, bgLgbPathStd.c_str()); - m_appState->bgGroup = physis_layergroup_read(bg_buffer); + auto bg_buffer = physis_gamedata_extract_file(data, bgLgbPathStd.c_str()); + auto lgb = physis_layergroup_read(bg_buffer); + if (lgb.num_chunks > 0) { + m_appState->lgbFiles.push_back({name, lgb}); + } + }; + + loadLgb(QStringLiteral("planevent")); + loadLgb(QStringLiteral("vfx")); + loadLgb(QStringLiteral("planmap")); + loadLgb(QStringLiteral("planner")); + loadLgb(QStringLiteral("bg")); + loadLgb(QStringLiteral("sound")); + loadLgb(QStringLiteral("planlive")); Q_EMIT m_appState->mapLoaded(); } diff --git a/apps/mapeditor/src/objectlistmodel.cpp b/apps/mapeditor/src/objectlistmodel.cpp index 0419b45..fbecff1 100644 --- a/apps/mapeditor/src/objectlistmodel.cpp +++ b/apps/mapeditor/src/objectlistmodel.cpp @@ -103,26 +103,30 @@ void ObjectListModel::refresh() { beginResetModel(); - auto fileItem = new TreeInformation(); - fileItem->type = TreeType::File; - fileItem->parent = m_rootItem; - fileItem->name = QStringLiteral("bg"); - m_rootItem->children.push_back(fileItem); + for (int y = 0; y < m_appState->lgbFiles.size(); y++) { + const auto &[name, lgb] = m_appState->lgbFiles[y]; - for (int i = 0; i < m_appState->bgGroup.num_chunks; i++) { - const auto chunk = m_appState->bgGroup.chunks[i]; - for (int j = 0; j < chunk.num_layers; j++) { - const auto layer = chunk.layers[j]; - for (int z = 0; z < layer.num_objects; z++) { - const auto object = layer.objects[z]; - const QString name = QString::fromLatin1(object.name); + auto fileItem = new TreeInformation(); + fileItem->type = TreeType::File; + fileItem->parent = m_rootItem; + fileItem->name = name; + fileItem->row = y; + m_rootItem->children.push_back(fileItem); - auto objectItem = new TreeInformation(); - objectItem->type = TreeType::Object; - objectItem->parent = fileItem; - objectItem->name = i18n("Unknown (%1)", object.instance_id); // TODO: do display names if we have them - objectItem->row = z; - fileItem->children.push_back(objectItem); + for (int i = 0; i < lgb.num_chunks; i++) { + const auto chunk = lgb.chunks[i]; + for (int j = 0; j < chunk.num_layers; j++) { + const auto layer = chunk.layers[j]; + for (int z = 0; z < layer.num_objects; z++) { + const auto object = layer.objects[z]; + + auto objectItem = new TreeInformation(); + objectItem->type = TreeType::Object; + objectItem->parent = fileItem; + objectItem->name = i18n("Unknown (%1)", object.instance_id); // TODO: do display names if we have them + objectItem->row = z; + fileItem->children.push_back(objectItem); + } } } }