gramps
71d0e87cac
feat(blur): a privacy blur layer for the Live scene — boxes and circles over the desktop
...
Creator request 2026-11-01: a layer that hides part of the desktop from viewers. Box or circle,
drag/resize like any layer, one strength slider, several allowed.
**Z-order is policy, not preference.** `AddSource` inserts a blur directly above the background
and therefore below the brand logo, and `OnSceneElementsReordered` pushes any blur that ends up
above the brand back down. Nothing else in the app can move it into the brand's way.
**Overlap = the strongest single blur, never a stack.** `SceneCompositor.ApplyBlurLayers` collects
every visible blur the first time one is reached in the z-order, sorts them strongest-first, and
shares one coverage map: a pixel already covered by a stronger blur is skipped. Blurring
back-to-front would have produced something stronger than any slider setting allows, which is
exactly what was ruled out.
**One blur curve, shared with the webcam.** `RegionBlur` carries the constants the webcam blur
already used — downscale 4, radius 1–6 downscaled px, `RadiusFor(strength)` — and
`BackgroundEffectProcessor` now delegates to it instead of holding its own copy. The layer's
slider is the same 0–1 scale with the same 0.5 default, so "half strength" means the same blur in
both features. Cost is proportional to the blur's own rect, not the frame.
**Live scene only**, enforced in `AddSource` as well as the (+) menu (`CanAddBlur`), so a stale
menu item or a scripted call cannot plant one on BRB. `ElementKind.Dynamic`, so it is never baked
into the static base and every render path gets it — pump, preview, thumbnails, scene dump.
Persistence: `Source.BlurAmount` column + migration; shape rides the existing `ClipShape`.
Properties panel: Box | Circle plus the strength slider, gated on `IsBlurSelected`.
4 tests: outside the mask is byte-identical, inside loses its hard edges, a circle leaves its
box corners alone, and two identical stacked blurs equal one (the coverage map). Release builds
at 0 warnings.
2026-11-01 09:55:04 -08:00
..
2026-10-09 09:24:13 -07:00
Monetization policy locked + dev pause recorded (docs changeset, 2026-08-14): the one paid line becomes an annual subscription — early access $49.99/yr → $99/yr list at GA, grandfather-while-subscribed with lapse → list on renewal (no escalation matrix); free tier unchanged (branding flash is the free tier's billboard + no Alerts, which is the one paid feature); billing NOT locked to itch.io (hunted fact: itch.io has no native subscription billing — candidates Gumroad, whose native affiliate program is the tiebreaker, and Lemon Squeezy); support = in-app bug-report → git issues with a when-I-get-around-to-it cadence + emergency patches. ai.md Monetization section rewritten + stale paid-unlock seams fixed (L115 subscription-entitlement wording, the About hub's tabled billing PremiumUrl seam); TASKS.md gains TASK 23 (Monetization — billing provider decision, unlock mechanism with lapse→flash-returns enforcement, in-app bug-report loop, Unlock Premium seam lighting, Alerts gating, and line-item pointers for the early-access strategy, affiliate/ads phase 2, and the channel revival); HANDOFF.md records the decisions + the development pause (resume streaming = pair-programming dev streams via OBS + The Division 2 under the gramps/GOAT persona, 67 and gaming since 1981, 3D-printing content retired; dogfood switch to ytLlive once TASK 5 lands; resume point = TASK 5). Stale itch.io assertions corrected across comments and indexes (MainViewModel.cs PremiumUrl/IsPremium seams, MainWindow.xaml tooltip, AboutHubTests comment, ViewModels/index.md, TASK 9 out-of-scope note). Build 0 warnings, 196 tests passing
2026-08-14 18:48:42 -07:00
2026-09-26 14:44:57 -07:00
2026-09-26 12:45:40 -07:00
2026-09-26 14:44:57 -07:00
2026-09-24 08:27:00 -07:00
2026-09-26 12:08:27 -07:00
2026-09-27 09:43:26 -07:00
2026-10-30 14:42:40 -07:00
2026-10-22 06:51:04 -07:00
2026-11-01 07:01:50 -08:00
2026-10-30 12:39:36 -07:00
2026-10-30 13:18:23 -07:00
2026-10-09 13:27:53 -07:00
2026-10-09 13:27:53 -07:00
2026-09-14 12:30:44 -07:00
2026-10-10 07:08:01 -07:00
2026-08-23 13:33:33 -07:00
2026-08-31 19:32:41 -07:00
2026-10-21 23:09:11 -07:00
2026-10-28 13:09:15 -07:00
2026-10-09 13:22:52 -07:00
2026-11-01 09:16:27 -08:00
2026-10-27 09:25:49 -07:00
2026-10-04 15:05:28 -07:00
2026-10-04 15:28:05 -07:00
2026-09-05 14:31:03 -07:00
2026-10-30 07:53:37 -07:00
2026-10-09 22:15:59 -07:00
2026-09-23 16:45:56 -07:00
2026-08-24 09:08:03 -07:00
2026-09-04 11:01:51 -07:00
2026-10-16 18:23:20 -07:00
2026-10-30 08:29:28 -07:00
2026-10-10 11:52:17 -07:00
2026-10-30 09:18:50 -07:00
2026-11-01 08:51:28 -08:00
2026-09-10 09:32:55 -07:00
2026-08-31 19:45:48 -07:00
2026-09-28 11:53:52 -07:00
2026-10-05 11:10:22 -07:00
2026-10-16 19:02:14 -07:00
2026-10-30 12:32:07 -07:00
2026-10-30 13:46:05 -07:00
2026-10-30 08:30:33 -07:00
2026-10-21 22:19:13 -07:00
2026-08-26 06:48:14 -07:00
2026-08-26 06:48:14 -07:00
2026-09-28 11:53:52 -07:00
2026-10-28 13:09:15 -07:00
2026-10-09 10:19:48 -07:00
2026-10-30 13:18:23 -07:00
2026-09-15 19:25:39 -07:00
2026-08-31 19:52:10 -07:00
2026-08-31 19:52:10 -07:00
2026-10-30 14:01:29 -07:00
2026-10-30 12:46:57 -07:00
2026-10-30 13:32:24 -07:00
2026-08-23 12:25:04 -07:00
2026-08-23 12:25:04 -07:00
2026-10-30 09:58:52 -07:00
2026-10-30 09:30:56 -07:00
2026-11-01 07:11:49 -08:00
2026-09-22 17:57:06 -07:00
2026-11-01 07:46:10 -08:00
2026-10-27 10:20:53 -07:00
2026-10-09 13:32:38 -07:00
2026-10-21 19:58:28 -07:00
2026-10-21 19:46:25 -07:00
2026-09-27 08:55:55 -07:00
2026-09-27 15:37:46 -07:00
2026-09-27 15:37:46 -07:00
2026-11-01 09:55:04 -08:00
2026-09-18 10:20:25 -07:00
2026-09-14 16:14:00 -07:00
2026-08-23 13:33:33 -07:00
2026-10-05 18:54:47 -07:00
2026-08-31 17:53:34 -07:00
Scene strip now renders in canonical F-key order regardless of persisted SortOrder. The strip loads Scenes ORDER BY SortOrder while each tab's F-key label is name-derived, so a session that persisted Chat before BRB (found on the creator's DB: SortOrder 2/3) showed tabs 'Chat F4' then 'BRB F3'. MainViewModel.LoadLayout now calls the new ReorderScenesToCanonical() - the five canonical scenes reorder to Starting, Live, BRB, Chat, Ending (F1-F5, stable among renamed non-canonical scenes), and the next auto-save re-stamps SortOrder so the heal persists. One integration test (SceneOrderTests) seeds the swapped-order DB and asserts loaded order, F1-F5 labels, and that a save persists the corrected ordering. 423 pass, 0 build warnings. (Unit: scene order)
2026-10-10 12:09:07 -07:00
2026-10-28 13:09:15 -07:00
2026-10-30 14:54:05 -07:00
2026-10-30 14:50:20 -07:00
2026-10-30 15:05:33 -07:00
2026-10-30 14:36:56 -07:00
2026-10-30 15:19:28 -07:00
2026-10-30 15:24:14 -07:00
2026-10-30 14:36:13 -07:00
2026-10-30 15:24:14 -07:00
2026-10-30 15:11:35 -07:00
2026-10-30 14:35:42 -07:00
2026-09-14 18:40:20 -07:00
2026-08-13 08:57:56 -07:00
2026-10-28 13:09:15 -07:00
2026-10-30 11:17:11 -07:00
2026-09-01 22:25:20 -07:00
2026-10-30 09:06:53 -07:00
2026-08-13 11:04:32 -07:00
2026-08-19 11:51:32 -07:00
2026-10-30 10:02:06 -07:00
2026-08-13 09:29:58 -07:00
2026-09-28 11:53:52 -07:00
2026-10-28 13:09:15 -07:00
2026-10-30 12:33:40 -07:00
2026-11-01 07:01:50 -08:00
2026-08-16 17:48:37 -07:00
2026-10-30 13:16:19 -07:00
2026-09-25 08:18:25 -07:00
2026-10-30 10:29:22 -07:00
2026-08-06 09:38:35 -07:00
2026-09-23 16:53:25 -07:00
2026-10-27 08:39:49 -07:00
2026-10-27 09:12:37 -07:00
2026-10-30 13:46:05 -07:00
2026-10-04 09:24:12 -07:00
2026-10-30 13:22:13 -07:00
2026-10-30 11:18:36 -07:00
2026-10-21 19:23:29 -07:00
2026-10-21 08:58:24 -07:00
2026-10-09 10:31:11 -07:00
2026-09-17 09:16:56 -07:00
2026-09-01 22:25:20 -07:00
Screen backdrop (schema v5/v6) + five-scene catalog + webcam polish: live desktop/game capture as a permanent non-deletable bottom layer (Source.IsBackdrop), auto full-screen game detection (Win32FullScreenDetector) else primary display, GraphicsCapturePicker re-designation, refcounted shared ScreenCaptureManager, Live-only backdrop by policy (HasBackdrop + v5-v6 backfill + EnforceBackdropPolicy, checkbox gone), SceneCatalog (Starting/Live/BRB/Chat/Ending) with + button re-adding missing scenes, webcam mid-session transparent-container fix (GetPreviewBitmap propagation), Chat half-screen-area cap, 'Add Webcam' always opens the picker (SwapWebcamIdentityAsync, no silent resurrect), WindowsRuntimeMarshal frame-read + 5s-throttled errors, docs updated, tests (65 passing)
2026-08-07 14:15:50 -07:00
2026-09-17 08:56:04 -07:00
2026-09-14 16:14:00 -07:00
2026-09-22 07:00:47 -07:00
2026-10-04 15:28:05 -07:00
2026-10-27 09:12:59 -07:00
2026-10-30 14:42:40 -07:00
2026-10-04 15:27:01 -07:00
2026-09-23 16:45:56 -07:00
2026-10-09 10:01:38 -07:00
2026-10-28 13:09:15 -07:00
2026-11-01 08:51:28 -08:00
2026-10-08 08:26:29 -07:00