mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-17 10:59:17 +00:00
8dfe00cdf8
Rename short local variables and parameters in the viewer loading, sidecar, and BonsaiViewer command paths to make their responsibilities clearer.\n\nGenerated with the assistance of an AI coding tool.
110 lines
4.9 KiB
C++
110 lines
4.9 KiB
C++
/********************************************************************************
|
|
* *
|
|
* This file is part of IfcOpenShell. *
|
|
* *
|
|
* IfcOpenShell is free software: you can redistribute it and/or modify *
|
|
* it under the terms of the Lesser GNU General Public License as published by *
|
|
* the Free Software Foundation, either version 3.0 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* IfcOpenShell is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* Lesser GNU General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the Lesser GNU General Public License *
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
|
* *
|
|
********************************************************************************/
|
|
|
|
#include <QApplication>
|
|
#include <QCommandLineParser>
|
|
#include <QMainWindow>
|
|
#include <QWidget>
|
|
#include <QVBoxLayout>
|
|
|
|
#include "Log.h"
|
|
#include "LogQt.h"
|
|
#include "ViewportWindow.h"
|
|
|
|
// Stage-1 driver: opens a single window with the wgpu viewport embedded,
|
|
// clears to background colour, and exits on close. The shape mirrors
|
|
// ifcviewer-minimal so subsequent stages can grow this into a full
|
|
// benchmark-comparable binary.
|
|
int main(int argc, char* argv[]) {
|
|
QApplication app(argc, argv);
|
|
app.setApplicationName("IfcViewerMinimal");
|
|
app.setOrganizationName("IfcOpenShell");
|
|
|
|
QCommandLineParser parser;
|
|
parser.setApplicationDescription(
|
|
"IfcOpenShell minimal wgpu IFC viewer");
|
|
parser.addHelpOption();
|
|
parser.addPositionalArgument("files",
|
|
"Sidecar (.ifcview) files to load. Stem-based: foo.ifc resolves to foo.ifcview.",
|
|
"[files...]");
|
|
parser.addOption({{"s", "screenshot"},
|
|
"Render one frame, save to PATH as PNG, exit.", "path"});
|
|
parser.addOption({{"b", "benchmark"},
|
|
"Render N frames (yaw-sweeping the camera), print stats, exit.", "frames"});
|
|
parser.addOption({{"c", "camera"},
|
|
"Set camera as tx,ty,tz,dist,yaw,pitch (same format as IfcViewerMinimal).",
|
|
"params"});
|
|
parser.addOption({"no-hiz",
|
|
"Disable HiZ occlusion culling for perf diagnostics."});
|
|
parser.addOption({"web-limits",
|
|
"Request the WebGPU mandatory floor limits (128MB max storage binding) "
|
|
"instead of the adapter's actual max. Use to verify scenes fit through "
|
|
"browser constraints."});
|
|
parser.process(app);
|
|
|
|
auto* viewport = new ViewportWindow;
|
|
viewport->resize(1280, 800);
|
|
if (parser.isSet("no-hiz")) viewport->hiz_enabled_ = false;
|
|
if (parser.isSet("web-limits")) viewport->web_limits_ = true;
|
|
|
|
QWidget* container = QWidget::createWindowContainer(viewport);
|
|
container->setMinimumSize(320, 240);
|
|
|
|
QMainWindow main_window;
|
|
main_window.setWindowTitle("IfcViewer (wgpu) — stage 2");
|
|
main_window.setCentralWidget(container);
|
|
main_window.resize(1280, 800);
|
|
main_window.show();
|
|
|
|
// Queue sidecars; they're loaded after wgpu init completes in
|
|
// exposeEvent. Ordering matches the command line.
|
|
for (const QString& path : parser.positionalArguments()) {
|
|
viewport->queueLoadSidecar(path.toStdString());
|
|
}
|
|
|
|
if (parser.isSet("camera")) {
|
|
const QStringList parts = parser.value("camera").split(',');
|
|
if (parts.size() == 6) {
|
|
bool ok = true;
|
|
float camera_values[6];
|
|
for (int i = 0; i < 6 && ok; ++i) camera_values[i] = parts[i].toFloat(&ok);
|
|
if (ok) {
|
|
viewport->setCamera(camera_values[0], camera_values[1], camera_values[2],
|
|
camera_values[3], camera_values[4], camera_values[5]);
|
|
} else {
|
|
Log::warn() << "--camera: failed to parse "
|
|
<< parser.value("camera");
|
|
}
|
|
} else {
|
|
Log::warn() << "--camera: expected 6 comma-separated floats, got "
|
|
<< parts.size();
|
|
}
|
|
}
|
|
|
|
if (parser.isSet("screenshot")) {
|
|
viewport->captureNextFrameToPng(parser.value("screenshot").toStdString(),
|
|
/*quit_after=*/true);
|
|
}
|
|
if (parser.isSet("benchmark")) {
|
|
viewport->setBenchmarkFrames(parser.value("benchmark").toInt());
|
|
}
|
|
|
|
return app.exec();
|
|
}
|