You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .planning/ROADMAP.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2549,7 +2549,7 @@ Plans:
2549
2549
Plans:
2550
2550
- [~] 999.58-01-PLAN.md — Material + Light config relocation onto the Inspector MaterialController/LightController; route applyPreferences material+light + the light-refresh sites off the dialogs (wave 1). **Code+build COMPLETE 2026-05-22** (MaterialController owns the full default-material field set incl. the 3 colors + `applyDefaultMaterial()`; LightController owns the full per-light list + `syncFromStage()`; scene.C `applyPreferences` + all 5 light-refresh sites routed through the controllers; no live MaterialSettings/LightSettings reach-throughs remain on Scene's render path; BALLView.app links clean BALL_UI_V2=ON). **BLOCKING running-BALLView render UAT PENDING** (lights + materials must still visibly drive the scene) — VIEW-CLEAN-03 stays incomplete (phase-spanning).
2551
2551
- [~] 999.58-02-PLAN.md — Full non-stereo Stage render config relocation onto StageController (vertex buffers, downsampling, projection, FPS, preview, offscreen, renderer switch, etc.); route applyPreferences stage branch + getGLSettings off stage_settings_ (wave 2). **Code+build COMPLETE 2026-05-22** (StageController grew the full non-stereo render-config field set — projection / show-lights / animation-smoothness / offscreen+factor / capping / FPS / preview / vertex-buffers incl. rep-delete side effect / smooth-lines / downsampling / renderer-switch / mouse+wheel-sensitivity — applied through the same Scene/Stage/Camera/GLRenderer/ClippingPlane backend behind the re-entrancy shield + a new MainControl::isBusy() defer-guard; scene.C `applyPreferences` routed through a transient StageController; non-load-bearing `getGLSettings()` init readback removed; swap-side-by-side left to StereoController; BALLView.app links clean BALL_UI_V2=ON). **BLOCKING running-BALLView render UAT PENDING** (stage controls must still visibly drive the scene; no regression to background/fog/eye/focal) — VIEW-CLEAN-03 stays incomplete (phase-spanning).
2552
-
- [ ] 999.58-03-PLAN.md — Remove the 3 dialog constructions (scene.C:142/143/162) + Preferences-stack rewire; Scene-owned stereo-screen config for the deferred stereo bodies; in-Scene applyStereoDefaults; demoTutorial repoint; grep proof scene.C is dialog-free (wave 3).
2552
+
- [~] 999.58-03-PLAN.md — Remove the 3 dialog constructions (scene.C:142/143/162) + Preferences-stack rewire; Scene-owned stereo-screen config for the deferred stereo bodies; in-Scene applyStereoDefaults; demoTutorial repoint; grep proof scene.C is dialog-free (wave 3). **Code+build COMPLETE 2026-05-22** (scene.C constructs/registers none of LightSettings/MaterialSettings/StageSettings; members/forward-decls/getStageSettings()/getMaterialSettings() accessors removed from scene.h; the four guard-and-deferred stereo bodies read a Scene-owned `StereoScreenConfig` struct instead of `stage_settings_->get*` — guard-and-return preserved, stereo NOT re-enabled; `applyStereoDefaults` inlines the geometry math in-Scene; demoTutorialDialog repointed off all 6 dialog-accessor reach-throughs with the dormant RTfact Stage-setup logic preserved; unused dialog includes dropped from both consumers; BALLView.app links clean BALL_UI_V2=ON). VIEW-CLEAN-03 construction grep proof PASSES — **999.53 unblocked to delete the 3 dialog triples**. **BLOCKING running-BALLView render UAT PENDING** (materials/lights/stage must still visibly drive the scene; stereo menu must defer cleanly without crash) — VIEW-CLEAN-03 stays incomplete (phase-spanning).
2553
2553
2554
2554
> **Deferred / blocked v1.7.x items (NOT promoted to phases):** v1.7.x-03 (Stereo checkbox) is **blocked** on the SEED-001 step-5 Renderer/RenderSurface stereo-mode boundary; v1.7.x-04 (Geometric/Dataset highlight) and v1.7.x-05 (macOS QSS overlay) are **dormant** pending a user re-file / concrete trigger. They stay in [`v1.7.x-PATCH-QUEUE.md`](v1.7.x-PATCH-QUEUE.md) with their gating conditions. v1.7.x-34 (www.ball-project.org outage) is external/Tübingen-side infra, not a code phase.
- [Phase 999.58-scene-settings-stereo-cutover Plan 03 — FINAL]: scene.C is now dialog-free for the three settings dialogs. Removed the constructor constructions (`new LightSettings`/`new MaterialSettings`/`new StageSettings`), the Preferences-stack `insertEntry`/`removeEntry` of all three (EditSettings preserved), the `REMOVE_COORDINATE_SYSTEM` `stage_settings_->updateFromStage()` readback, the stale `if (light_settings_ == 0) return;` applyPreferences guard, and the members/forward-decls/`getStageSettings()`/`getMaterialSettings()` accessors from scene.h. Added a Scene-owned `StereoScreenConfig` struct (9 fields — 3 screen indices default -1, 2 default-empty QRect eye geometries, 2 renderer types default `OPENGL_RENDERER`, 1 stereo mode default `NO_STEREO`) so the four guard-and-deferred stereo bodies (`enterStereo`/`enterDualStereo`/`enterDualStereoDifferentDisplays`) compile without `stage_settings_->get*` — eye/focal/swap deliberately NOT mirrored (Stage/StereoController-owned, avoids T-99858-05). Each body's unconditional guard-and-return is unchanged — no stereo path re-enabled (T-99858-07). `applyStereoDefaults()` inlines `StageSettings::computeDefaultPressed()`'s geometry math in-Scene (dialog-only slider refreshes dropped; .ui distance defaults 150/6 inlined as constants; downsampling uses the live `downsampling_factor_`). `demoTutorialDialog.C` repointed off all 6 scene dialog-accessor reach-throughs (dormant `#ifdef BALL_HAS_RTFACT` Stage-setup logic + `applyPreferences()` preserved). Dropped the now-unused dialog header includes from both consumers (Rule 2, for the 999.53 deletion hand-off). Task commits `f1cb34ad28` (stereo config + applyStereoDefaults), `16a661a9b7` (constructions + Preferences stack), `8c702ddb46` (demoTutorial). BALLView.app links clean (BALL_UI_V2=ON). VIEW-CLEAN-03 construction grep proof PASSES; **999.53 unblocked to delete the dialog triples**. **VIEW-CLEAN-03 remains PARTIAL** — gated on the BLOCKING phase-level GUI render UAT (this plan's checkpoint + 999.58-01/02's), NOT marked complete.
105
107
- [Phase 999.58-scene-settings-stereo-cutover Plan 02]: StageController (the 999.44 read-only-mirror exemplar) was grown to own the COMPLETE non-stereo stage render config the legacy `StageSettings::apply()` (stageSettings.C:233-309) wrote — projection mode, show-light-sources, animation smoothness, offscreen rendering (+factor), capping color, FPS, preview, vertex buffers (incl. the rep-delete-on-toggle side effect), smooth lines, downsampling, the OpenGL/RTfact renderer switch, and mouse/wheel sensitivity — on top of the already-migrated background/coord/fog/eye/focal. `apply()` drives each through the same Scene/Stage/Camera/GLRenderer/ClippingPlane/InteractionModeManager backend the dialog used, behind the existing `ControllerApplyGuard` re-entrancy shield PLUS a newly-added `MainControl::isBusy()` defer-guard (the renderer-switch + bulk rep-rebuild must not run mid-busy-cycle — T-99858-04). `scene.C::applyPreferences()` now applies the stage through a transient `StageController(stage_, this)` (revert + apply, the 999.58-01 pattern) instead of `stage_settings_->apply()`, and the non-load-bearing `getGLSettings()` init readback was removed from `initializePreferencesTab()`. Mouse/wheel sensitivity are write-only mirrors (InteractionModeManager has no getter) using an unset sentinel (`< 0`) so the controller-driven path never clobbers the live value. swap-side-by-side stays owned by StereoController (0 occurrences in stageController.C — avoids the double-write race T-99858-05). The `stage_settings_` construction (scene.C:169), Preferences-stack registration, and stereo accessors are UNTOUCHED — Plan 03 owns them. One remaining `stage_settings_->updateFromStage()` at scene.C:388 is a dialog-widget readback (no render mutation), out of this plan's scope, left intact and documented honestly. Task commits `b2f905941a` (controller), `d4aec20ff8` (scene.C). BALLView.app links clean (BALL_UI_V2=ON). **VIEW-CLEAN-03 remains PARTIAL** (phase-spanning 999.58-01/02/03; gated on the BLOCKING GUI render UAT — NOT marked complete).
106
108
- [Phase 999.57-inspector-controller-cutover Plan 02]: Relocated `createColorProcessor` + its `applySettingsTo` override-application out of `ColoringSettingsDialog` into a headless `ColorProcessorFactory` (`include/BALL/VIEW/MODELS/colorProcessorFactory.{h,C}`), mirroring Plan 01's ModelProcessorFactory. `ColorProcessorFactory::create(ColoringMethod, const ColoringOverrides&)` constructs the per-method processor (which already loads its compiled default color map) then layers an explicit `ColoringOverrides` value object — zero Qt-widget dependency. `ColoringOverrides` carries the dialog's color tables (element/residue-name/chain/molecule as empty==no-override containers) + color-button/slider groups (residue-number/charge/distance/occupancy/secondary-structure/temperature-factor/force/residue-type, each gated by a `has_*` presence flag). CONFIG-01 invariant preserved: a default-constructed `ColoringOverrides` layers nothing → compiled-default processor, byte-equivalent to the molecule-load default-rep render. `ColoringSettingsDialog::createColorProcessor` thinned to `ColorProcessorFactory::create(method, buildColoringOverrides_())`; `applySettingsTo` kept INTACT (displayProperties.C:502 still calls it on the render path — Plan 03 repoints it). Render path (displayProperties.C:487 + coloringController.C:100) UNCHANGED this plan (verified via `git diff --name-only HEAD`). libVIEW builds clean (BALL_UI_V2=ON). Task commits `f414c3d572` (header), `d47e98f554` (impl+cmake), `fadbc571f9` (dialog delegation). **VIEW-CLEAN-02 remains PARTIAL** (phase-spanning; finishes in Plan 03 + GUI verify — NOT marked complete).
107
109
- [Phase 999.52-inspector-transparency Plan 01]: The Inspector Material-tab Transparency control drives the **working** interactive-GL path — `Representation::setTransparency()` (0-255 per-vertex alpha) + `rep_->update(false)` — NOT `Stage::Material.transparency`, which only POVRay/RTfact read (RTfact disabled) and which GLRenderer::setMaterial_ never consumes. Writing the dead field is exactly the #527 bug; the negative-grep acceptance criterion (`material.transparency =` must NOT appear) enforces this. The Material control shares the SAME Representation transparency state as the existing Model-section slider (`revert()` reads `rep_->getTransparency()`), so they stay mutually consistent — a deliberate second entry point onto one backend, not a divergent duplicate. `rep_->update(false)` (cheap, no composite re-walk) chosen because the material intensities flow through the separate scene-material path; this is the Rule 3 build fix for the plan's argument-less `rep_->update()` (Representation::update(bool) has no default). MaterialController int `transparency` property mirrors ModelController exactly (Q_PROPERTY/getter/setTransparency slot/transparencyChanged signal/transparency_ member; setter guards-on-equal + emits). Legacy MaterialSettings dialog left untouched (Phase 999.53 deletes it). VIEW-INSP-03 implementation-complete; **BLOCKING GUI human-verify pending** (compile is necessary-but-not-sufficient for a GUI control). Task commits `ce4061a93d` (controller), `7374d42ae8` (section + build fix). libVIEW + BALLView.app built clean under BALL_UI_V2=ON (build-ui-on).
0 commit comments