Right-click now creates a transient ZoomSceneElement at z-index 1 whose pixels are a genuine 2x magnified sample of the backdrop (live capture under art), composited into stream/recording like any layer while the output crop stays the tier. All shapes are centered on the click and clamped to frame; healed on load/scene-create, never persisted, hidden from the layers list + element template (IsZoomLayer). BuildCompositorOptions is now internal = always tier crop (test seam). ZoomFrameBuilder is a pure static sampler (box/2 window centered on the box center, single-slot cache) proven by a banded-backdrop test; LayerReorderPersistenceTests drag resolves rows by item since the collapsed zoom row shifts container indices. Also books TASK 51 (webcam background Remove + Blur) and syncs memory docs (HANDOFF, MyMistakes, indexes). Full suite: 405 passed, 0 warnings.
4.4 KiB
4.4 KiB
HANDOFF — 2026-10-08
Branch
- main (no feature branch)
Dirty files (NOT mine — the in-flight "pinned chat" work unit; do NOT commit or co-edit)
Models/YouTube.csViewModels/MainViewModel.Chat.csControls/LeftPanel.xaml(pinned-message UI; restored viagit stash popafter this commit)- Untracked:
Helpers/RelayCommandGeneric.cs
What just happened (2026-10-08 zoom build)
- TASK 51 booked (webcam background Remove + Blur as a v1 requirement):
TASKS/task-51-webcam-bg-effects.mdcreated; TASKS.md row 51 + the two prior "background removal excluded" rulings (~line 180webcam cadence + "Out of product — permanently") reversed 2026-10-08. NVIDIA VFX SDK stays ruled out. Implementation queued after the zoom build. - Zoom rebuilt from "loupe + output crop" into a REAL composited layer:
- New
Models/ZoomSceneElement.cs(z-index 1 above the background, below every other layer;IsZoomActiveflipsKindStatic→Dynamic; never persisted, never shown in the layers list or element template).SceneElement.IsZoomLayervirtual added. - New
ViewModels/MainViewModel.Zoom.cs:ActivateZoom(all shapes CENTERED on the click, clamped to the master), move/dismiss,HealZoomLayers/EnsureZoomLayer(load +AddScene),BuildZoomFrame(resolves live-capture-under-art exactly likeSceneCompositor.Render, single-slot cache keyed on frame identity+Epoch+box ints so the per-tick resolver allocates nothing idle), and the pure staticZoomFrameBuilder.Build(2x bilinear sample of the box/2 window centered on the box centre). BuildCompositorOptionsnow ALWAYS returns the tier crop (internal = test seam); zoom-as-crop branch +RebuildDimRectsForZoomold version removed.ResolveOutputFrameCoregained theZoomSceneElementcase; output composites the zoom like any layer.- Preview: backdrop images wrapped in
BackdropLayer;ZoomBoxmoved INSIDEOverlayCanvasunder the element Layers (renders below layers = honest preview);ZoomVisualBrushnow samplesBackdropLayerat(X+W/4, Y+H/4, W/2, H/2)+Stretch=Fill(2x); element template + LeftPanel list collapseIsZoomLayer.
- New
- Tests:
ZoomBoxInteractionTestsrewritten (center-anchor for all shapes, placeholder at Elements[1], Kind flips, tier crop asserted, dismiss resets); newZoomFrameBuilderTests= the genuine-magnification proof (4-band backdrop, box straddling two bands, all output pixels must be the center band → a 1x or mis-positioned window fails hard).LayerReorderPersistenceTestsupdated: cross-type reload compares persisted elements only (the zoom placeholder never persists), and the real-mouse drag targets rows by ITEM (the collapsed zoom row shifts container indices — the handlers hit-test visually so real dragging is unaffected). - Full suite: 405 passed / 0 failed / 0 warnings.
Zoom feature state
- Models:
ZoomState.cs,ZoomShape.cs(Circle/VerticalRectangle/HorizontalRectangle),ZoomSceneElement.cs(TASK 51 build). - ViewModel (all in
MainViewModel.Zoom.cs): activation/move/dismiss + layer healing +BuildZoomFrame;MainViewModel.cscore no longer holds zoom methods. - Output: zoom layer composited at z-index 1; output crop = tier; dim rects show the box frame while active.
- Preview:
ZoomBoxsamplesBackdropLayerat 2x, circle→ellipse clip, rect/square outline per shape;LeftPanelhides the placeholder row viaIsZoomLayer.
Known issues / follow-ups
- Background "Use default background" toggle still not working (carried from 2026-10-07): binding exists (
UseDefaultBackground), VM handler invalidates bake; investigate Source background logic when time permits. AudioPipelineTests.Mix_HonorsProviderGains_AndGameMute_KillsTheLoopbackflaked once in a full-suite run (passed in isolation 27/27 and in the final full run) — treat as machine-contention flake, not a zoom regression.RealMouseDrag_OnTheLayerList_PersistsTheReorderneeds an interactive desktop (documented) — it passes when the window is live; don't read a failure there as a code bug without re-running.
Next step
- User runs the app live/test to eyeball the zoom: right-click preview → centered box per shape, output contains a genuine 2x magnified backdrop under the other layers, dimming + outline correct, layers list unchanged. Then TASK 51 (webcam background Remove + Blur) implementation per
TASKS/task-51-webcam-bg-effects.md, and the background-toggle investigation if still open.