## Summary This PR adds the first usable camera and view-state loop for the experimental Godot stage. The main design direction is that Godot owns the stage view state, while Electron and the settings page act as lifecycle/transport/control surfaces. The settings UI can now edit Godot camera state, and camera changes from the Godot window can flow back to the UI. ## What Changed - Added the shared Godot view-state contract for camera pose, avatar bounds, snapshots, patches, and errors. - Added Electron main bridge APIs for Godot status, scene input, view snapshots, and view patches. - Added Godot-side camera runtime: - initial camera bootstrap from loaded avatar bounds - avatar facing normalisation - orbit, pan, wheel movement, and WASD-style camera movement - idle persistence for camera position, yaw, pitch, and FOV - Added settings-page Godot camera controls with coalesced updates, restart-safe session handling, and stale request protection. - Kept scene input simple: Electron does not cache the selected model for replay. Each Godot start receives the current model selection from the renderer. ## File Guide Shared contracts: - `packages/stage-shared/src/godot-stage/view-state.ts` defines the Godot view-state contract and schema validation. - `packages/stage-shared/src/godot-stage/index.ts` exports the Godot shared contract surface. - `packages/stage-shared/package.json` exposes the new shared entry. Electron / renderer bridge: - `apps/stage-tamagotchi/src/shared/eventa/index.ts` adds the Eventa contracts for Godot status, scene input, view snapshot, patch, and error events. - `apps/stage-tamagotchi/src/main/services/airi/godot-stage/index.ts` owns the Godot sidecar lifecycle, local WebSocket bridge, scene input forwarding, and view-state forwarding. Settings page: - `apps/stage-tamagotchi/src/renderer/pages/settings/models/index.vue` wires the settings page to Godot status, scene input, snapshots, and patches. - `apps/stage-tamagotchi/src/renderer/pages/settings/models/godot-view-patch-queue.ts` coalesces high-frequency camera edits before sending them to Godot. - `apps/stage-tamagotchi/src/renderer/pages/settings/models/godot-view-session.ts` tracks renderer-local Godot session epochs so stale async results are ignored. Shared settings UI: - `packages/stage-ui/src/components/scenarios/settings/model-settings/godot.vue` renders the Godot camera controls. - `packages/stage-ui/src/components/scenarios/settings/model-settings/panel.vue` routes the model settings panel between Live2D, VRM, and Godot settings. - `packages/stage-ui/src/components/scenarios/settings/model-settings/runtime.ts` resolves model-settings runtime display state and Godot camera control range. - `packages/stage-ui/src/components/data-pane/property-number.vue` updates number control behavior so config changes such as min/max/range are reflected correctly. Godot runtime: - `engines/stage-tamagotchi-godot/scripts/StageRoot.cs` wires scene loading, view runtime, and transport together. - `engines/stage-tamagotchi-godot/scripts/scene/StageSceneController.cs` loads VRM avatars and normalizes avatar facing direction. - `engines/stage-tamagotchi-godot/scripts/view/StageViewRuntime.cs` owns Godot view-state updates, snapshots, patch application, and idle persistence. - `engines/stage-tamagotchi-godot/scripts/view/StageCameraPoseController.cs` computes avatar bounds, bootstraps the camera, applies camera pose, and handles camera movement math. - `engines/stage-tamagotchi-godot/scripts/view/StageCameraInputController.cs` maps mouse and keyboard input into camera operations. - `engines/stage-tamagotchi-godot/scripts/view/StageViewStateRules.cs` centralizes view-state defaults and validation rules. - `engines/stage-tamagotchi-godot/scripts/view/StageViewStateStore.cs` persists and loads Godot camera view state. - `engines/stage-tamagotchi-godot/scripts/transport/StageViewJson.cs` parses and serializes view-state transport payloads. - `engines/stage-tamagotchi-godot/scripts/transport/StageViewPayloads.cs` defines the C# payload records used by the transport layer. --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
47 lines
1.3 KiB
JSON
47 lines
1.3 KiB
JSON
{
|
|
"name": "@proj-airi/stage-shared",
|
|
"type": "module",
|
|
"private": true,
|
|
"description": "Shared",
|
|
"author": {
|
|
"name": "Moeru AI Project AIRI Team",
|
|
"email": "airi@moeru.ai",
|
|
"url": "https://github.com/moeru-ai"
|
|
},
|
|
"license": "MIT",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/moeru-ai/airi.git",
|
|
"directory": "packages/stage-shared"
|
|
},
|
|
"exports": {
|
|
".": "./src/index.ts",
|
|
"./auth": "./src/auth/index.ts",
|
|
"./beat-sync": "./src/beat-sync/index.ts",
|
|
"./global-shortcut": "./src/global-shortcut/index.ts",
|
|
"./godot-stage": "./src/godot-stage/index.ts",
|
|
"./server-channel-qr": "./src/server-channel-qr.ts",
|
|
"./electron-renderer": "./src/electron-renderer.d.ts",
|
|
"./composables": "./src/composables/index.ts",
|
|
"./webgpu": "./src/webgpu/index.ts"
|
|
},
|
|
"scripts": {
|
|
"typecheck": "tsc --noEmit"
|
|
},
|
|
"dependencies": {
|
|
"@moeru/std": "catalog:",
|
|
"@vueuse/core": "catalog:",
|
|
"gpuu": "^1.0.7",
|
|
"pinia": "catalog:",
|
|
"valibot": "catalog:",
|
|
"vue": "catalog:"
|
|
},
|
|
"devDependencies": {
|
|
"@electron-toolkit/preload": "^3.0.2",
|
|
"@moeru/eventa": "catalog:",
|
|
"@nekopaw/tempora": "catalog:",
|
|
"@proj-airi/electron-screen-capture": "workspace:^",
|
|
"@types/audioworklet": "catalog:"
|
|
}
|
|
}
|