{"id":47790664,"url":"https://github.com/deadronos/3d-cube-desktop","last_synced_at":"2026-04-03T15:36:30.643Z","repository":{"id":345964024,"uuid":"1187973466","full_name":"deadronos/3d-cube-desktop","owner":"deadronos","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-21T16:02:39.000Z","size":62,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-22T05:12:13.270Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deadronos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-21T12:54:45.000Z","updated_at":"2026-03-21T16:02:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/deadronos/3d-cube-desktop","commit_stats":null,"previous_names":["deadronos/3d-cube-desktop"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/deadronos/3d-cube-desktop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deadronos%2F3d-cube-desktop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deadronos%2F3d-cube-desktop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deadronos%2F3d-cube-desktop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deadronos%2F3d-cube-desktop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deadronos","download_url":"https://codeload.github.com/deadronos/3d-cube-desktop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deadronos%2F3d-cube-desktop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31360807,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T15:19:21.178Z","status":"ssl_error","status_checked_at":"2026-04-03T15:19:20.670Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-03T15:36:30.004Z","updated_at":"2026-04-03T15:36:30.632Z","avatar_url":"https://github.com/deadronos.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 3D Cube Desktop\n\n`3d-cube-desktop` is a Windows-first WPF prototype for a spatial desktop shell. The current `main` branch implements an inward-facing open-room workspace: a floor, left wall, back wall, and right wall rendered in `Viewport3D`, with layouts that assign windows, grouped workspaces, and dashboards to those surfaces.\n\nThis is still a prototype shell, not a replacement desktop environment or compositor. Its purpose is to validate the interaction model, visual metaphor, and workspace assignment system.\n\n## Current State\n\nWhat `main` currently includes:\n\n- an inward-facing open-room scene instead of an exterior cube\n- 4 visible presentation surfaces: `Floor`, `LeftWall`, `BackWall`, `RightWall`\n- saved layouts loaded from JSON\n- two shell window modes: `FullscreenPresentation` and `WindowedDev`\n- overview/work mode transitions\n- an inspect mode for free look / debugging\n- per-window capture using `Windows.Graphics.Capture`\n- grouped window surfaces resolved by process/title matching rules\n- dashboard surfaces with launchable shortcuts\n- selected-surface input forwarding\n- persisted shell state between runs\n\nWhat it does not include yet:\n\n- a true virtual desktop implementation\n- simultaneous full interaction on every visible surface\n- multi-window compositing on grouped surfaces\n- runtime face editing from inside the app\n- head tracking or camera parallax input\n\n## Concept\n\nThe repo started from the idea in [idea.md](/D:/GitHub/3d-cube-desktop/idea.md): make the desktop feel spatial instead of flat. The implementation now on `main` is the open-room version of that idea, not the older exterior cube shell.\n\n## Tech Stack\n\n- C#\n- .NET 9\n- WPF\n- `Viewport3D`\n- Win32 interop for window enumeration and input forwarding\n- `Windows.Graphics.Capture` for per-window capture\n- D3D11/WinRT interop for capture session plumbing\n\n## Project Layout\n\n- [DesktopCube.sln](/D:/GitHub/3d-cube-desktop/DesktopCube.sln): solution entrypoint\n- [src/DesktopCube.App](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App): WPF shell app\n- [src/DesktopCube.App/MainWindow.xaml](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/MainWindow.xaml): viewport and HUD shell\n- [src/DesktopCube.App/MainWindow.xaml.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/MainWindow.xaml.cs): scene orchestration, camera control, layout switching, source refresh, interaction\n- [src/DesktopCube.App/Core](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Core): config and runtime models\n- [src/DesktopCube.App/Rendering/RoomGeometryFactory.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Rendering/RoomGeometryFactory.cs): open-room geometry\n- [src/DesktopCube.App/Services/WindowCaptureService.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Services/WindowCaptureService.cs): live per-window capture\n- [src/DesktopCube.App/Services/GraphicsCaptureInterop.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Services/GraphicsCaptureInterop.cs): WinRT / D3D interop for capture\n- [src/DesktopCube.App/Services/FaceSourceResolverService.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Services/FaceSourceResolverService.cs): grouped-window resolution and active-source selection\n- [src/DesktopCube.App/Services/WindowInventoryService.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Services/WindowInventoryService.cs): top-level window discovery and activation\n- [src/DesktopCube.App/Services/InputForwarder.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Services/InputForwarder.cs): selected-face input routing\n- [src/DesktopCube.App/Services/PlaceholderTextureFactory.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Services/PlaceholderTextureFactory.cs): synthetic textures for grouped/dashboard/fallback surfaces\n- [src/DesktopCube.App/face-config.json](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/face-config.json): default layouts and launcher config\n- [plan.md](/D:/GitHub/3d-cube-desktop/plan.md): open-room implementation plan\n\n## How It Works\n\n### Scene Model\n\nThe room is an inward-facing box with four visible surfaces:\n\n- `BackWall`\n- `LeftWall`\n- `RightWall`\n- `Floor`\n\nEach layout assigns one face definition to each visible slot. The renderer uses [RoomGeometryFactory.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Rendering/RoomGeometryFactory.cs) to build those surfaces and maps a texture to each one.\n\n### Source Types\n\nEach surface uses one of these source types:\n\n- `WindowCapture`: a single active window rendered live through `Windows.Graphics.Capture`\n- `WorkspaceGroup`: a grouped workspace that resolves multiple matching windows and selects one active source\n- `Dashboard`: a synthetic launcher surface\n- `StaticFallback`: a synthetic fallback card when no live source is available\n\nThe enum lives in [FaceSourceType.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Core/FaceSourceType.cs).\n\n### Capture Model\n\nLive window-backed surfaces use [WindowCaptureService.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Services/WindowCaptureService.cs), which:\n\n- creates a `GraphicsCaptureItem` for a target window\n- starts a `Direct3D11CaptureFramePool`\n- receives frames on a free-threaded capture session\n- converts each frame into a WPF `BitmapSource`\n\nThis avoids the old recursive whole-monitor capture problem. The shell explicitly excludes its own window handle from source resolution and capture.\n\n### Workspace Grouping\n\nGrouped surfaces use [FaceSourceResolverService.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Services/FaceSourceResolverService.cs) and [WindowInventoryService.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Services/WindowInventoryService.cs) to:\n\n- enumerate visible, non-minimized, top-level windows\n- filter them by configured substrings\n- sort them by configured priorities and foreground state\n- pick one active window for the surface\n- retain the rest as candidates for cycling\n\nGrouped surfaces are still synthetic summaries plus one active source target. They are not yet live composites of multiple windows.\n\n### Interaction Model\n\nThe shell has three useful states:\n\n- locked overview\n- work mode\n- inspect mode\n\nIn work mode:\n\n- the camera moves toward the selected surface\n- only the selected live surface is directly interactive\n- cursor hit testing is raycast into the 3D scene\n- UV coordinates are mapped back to the active window bounds\n- click input is forwarded to the selected target window\n\nThis is intentionally a selected-surface interaction model, not a general-purpose embedded multi-window environment.\n\n## Requirements\n\n- Windows 10 version 2004+ or Windows 11\n- .NET 9 SDK\n- a machine and driver stack capable of WPF 3D and `Windows.Graphics.Capture`\n\nThe project targets Windows only. The csproj is currently set to `net9.0-windows10.0.19041.0`.\n\n## Getting Started\n\n### Build\n\n```powershell\ndotnet build DesktopCube.sln\n```\n\n### Run\n\n```powershell\ndotnet run --project src/DesktopCube.App/DesktopCube.App.csproj\n```\n\nBy default the shell starts in fullscreen presentation mode.\n\n## Controls\n\n### Mouse\n\n- Click a surface: select it\n- Double-click in overview: enter work mode on the selected surface\n- Drag in inspect mode: orbit / inspect the room\n- Mouse wheel in inspect mode: adjust inspect pitch\n\n### Keyboard\n\n- `Enter` or `Tab`: toggle work mode\n- `Esc`: leave work mode or exit inspect mode\n- `F5`: refresh sources\n- `F11`: toggle `FullscreenPresentation` / `WindowedDev`\n- `I`: toggle inspect mode\n- `PageUp` / `[` : previous layout\n- `PageDown` / `]` : next layout\n- `Ctrl+1..9`: jump directly to a layout\n- `C`: cycle active source on grouped surfaces\n- `W`: activate the selected source window\n- `1..9`: launch dashboard shortcuts while a dashboard surface is selected in work mode\n\n## Default Layouts\n\nThe shipped config defines two layouts in [face-config.json](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/face-config.json).\n\n### Builder Room\n\nPurpose:\n\n- coding\n- docs\n- chat\n- terminals\n\nDefault surfaces:\n\n- `BackWall`: `Code Wall` as `WorkspaceGroup`\n- `LeftWall`: `Research Wall` as `WorkspaceGroup`\n- `RightWall`: `Comms Wall` as `WorkspaceGroup`\n- `Floor`: `Ops Floor` as `WorkspaceGroup`\n\n### Review Room\n\nPurpose:\n\n- PR review\n- issue triage\n- browser-focused work\n- quick launches\n\nDefault surfaces:\n\n- `BackWall`: `PR Wall` as `WorkspaceGroup`\n- `LeftWall`: `Browser Wall` as `WindowCapture`\n- `RightWall`: `Issues Wall` as `WorkspaceGroup`\n- `Floor`: `Launch Floor` as `Dashboard`\n\n## Configuration\n\nThe shell config is loaded from [face-config.json](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/face-config.json).\n\n### Top-Level Config\n\nImportant top-level properties:\n\n- `captureFps`\n- `activeLayoutId`\n- `selectedFace`\n- `defaultShellWindowMode`\n- `launchers`\n- `layouts`\n\n### Face Config\n\nEach face can define:\n\n- `id`\n- `slot`\n- `label`\n- `sourceType`\n- `workspaceKey`\n- `accentHex`\n- `notes`\n- `group`\n- `launcherIds`\n\n### Group Rules\n\nGrouped surfaces use:\n\n- `windowFilters`: broad match terms\n- `priorityFilters`: preferred ordering when multiple windows match\n\nThat makes the active surface deterministic while still allowing cycling between candidates.\n\n### Persisted State\n\nRuntime state is stored in `workspace-state.json` next to the app output. That includes:\n\n- active layout\n- selected face\n- shell window mode\n- current work/overview state\n- active source index per grouped surface\n\n## Limitations\n\nThese are the main current constraints.\n\n### Grouped surfaces are not live composites\n\n`WorkspaceGroup` surfaces still summarize a grouped workspace and point interaction at one active source. They do not yet render multiple windows composited together.\n\n### Only the selected surface is interactive\n\nThe shell forwards input only for the selected live surface in work mode. This is by design for the current milestone.\n\n### Minimized and hidden windows are excluded\n\n[WindowInventoryService.cs](/D:/GitHub/3d-cube-desktop/src/DesktopCube.App/Services/WindowInventoryService.cs) only tracks visible, non-minimized, top-level windows. If a candidate window is hidden or minimized, it drops out of the workspace model.\n\n### Some apps may still capture poorly\n\n`Windows.Graphics.Capture` is much better than the old screen-copy path, but some protected, accelerated, or unusual windows may still fail to render correctly or may momentarily fall back to placeholder content.\n\n### Docs are ahead of the internal architecture notes\n\n[docs/architecture.md](/D:/GitHub/3d-cube-desktop/docs/architecture.md) still describes the older Phase 4 cube shell. The README reflects the current open-room `main` branch more accurately.\n\n## Architecture Summary\n\nAt a high level:\n\n1. The app loads layouts, launchers, and defaults from JSON.\n2. `MainWindow` builds the open-room scene and camera rig.\n3. Window inventory is refreshed on a timer.\n4. Each surface resolves to a live source, grouped source, dashboard, or fallback.\n5. Live windows are captured with `Windows.Graphics.Capture`.\n6. HUD panels expose the selected surface, active layout, and candidate state.\n7. Work mode routes selected-surface input back to the active target window.\n\n## Roadmap\n\nReasonable next steps from the current merged implementation:\n\n1. Promote grouped surfaces from synthetic summaries to richer live multi-window compositions.\n2. Add in-app editing and saving of layouts.\n3. Improve input routing and focus handoff.\n4. Add stronger per-face source management instead of purely filter-based grouping.\n5. Add optional head-tracked or parallax camera input.\n\n## Contributing\n\nIf you extend this prototype, keep the distinction between current behavior and planned behavior explicit. The easiest ways to make the codebase easier to work with are:\n\n- keep layout behavior data-driven in config\n- document user-facing controls when you change them\n- call out prototype-only hacks in code comments or docs\n- avoid pretending grouped surfaces are true composited desktops if they are not\n\n## Quick Summary\n\nThis repo currently ships an open-room 3D workspace shell for Windows with:\n\n- four inward-facing surfaces\n- saved layouts\n- grouped workspace assignments\n- one real live window-capture surface\n- dashboard launchers\n- overview/work/inspect transitions\n- selected-surface input forwarding\n\nIt is a credible spatial workspace prototype, but it is still not a full desktop compositor.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeadronos%2F3d-cube-desktop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeadronos%2F3d-cube-desktop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeadronos%2F3d-cube-desktop/lists"}