ifcviewer: promote runtime perf knobs, drop always-on settings

Promotes five env-var-driven knobs to AppSettings + the settings dialog
(min pixel radius, motion min pixel radius, LOD1 pixel threshold, HiZ
resolution, HiZ on/off).  Defaults: motion min pixel radius is now 10
(was 0/disabled) and IFC_HIZ_MOTION is on by default — the strict
view-projection gate reverts via env var =0 when chasing HiZ
correctness bugs.  ViewportWindow connects each *Changed signal so
changes invalidate cached cull state and take effect on the next
frame.

Removes "Load Property Data Source" and "Apply Coordinate Operation"
from the settings dialog: both are now hardcoded on.  The basic-info
property fallback (used when there's no live IFC source for an object,
e.g. .ifcview without a sibling) now triggers organically when
ElementRegistry::findEntity returns null instead of being gated on a
user toggle.  Federation::guessFederatedFalseOrigin lost its
apply_coordinate_operation parameter and now uses
georef.has_coordinate_operation directly.

src/ifcviewer/settings.rst documents the remaining diagnostic env vars
(IFC_HIZ_MOTION, IFC_CULL_THREADS, IFC_SKIP_MDI, IFC_MAX_SUBDRAWS,
IFC_FPS_HITCH_MS, IFC_SUBDRAW_DIAG, IFC_LOD_*) plus a cross-walk from
the old promoted-knob env-var names to their new QSettings keys.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Dion Moult
2026-05-10 19:37:20 +10:00
parent 0a297babea
commit a900f2c437
14 changed files with 324 additions and 185 deletions
+1 -10
View File
@@ -241,7 +241,7 @@ void SceneLoader::applySidecarData(uint32_t mid, SidecarData data) {
// Restore the cached CoordinateOperation into the model so
// modelGeoref(mid) returns it without needing the IFC source. Prevents
// sidecar-loaded models from silently losing their georef when the
// .ifc/.rdb sibling is absent or AppSettings.loadDataSource is off.
// .ifc/.rdb sibling is absent.
{
ModelGeoref& gr = model.georef;
gr.has_coordinate_operation = data.has_coordinate_operation != 0;
@@ -276,8 +276,6 @@ void SceneLoader::applySidecarData(uint32_t mid, SidecarData data) {
}
void SceneLoader::startDataSourceLoad(uint32_t mid) {
if (!AppSettings::instance().loadDataSource()) return;
auto it = models_.find(mid);
if (it == models_.end()) return;
@@ -355,13 +353,6 @@ void SceneLoader::onStreamerFinished() {
qint64 ms = it->second.load_timer.elapsed();
emit loadedFromStream(mid, ms);
// Slot(s) above run synchronously (sidecar write uses element_map_,
// not ifcFile()); drop the parsed file now to save memory if the
// user has opted out of keeping a property data source.
if (!AppSettings::instance().loadDataSource()) {
it->second.streamer->setIfcFile(nullptr);
}
}
}