feat(scene): shared zoom/pan for control and presentation

Keep effects pinned to map coordinates when the viewport changes; materials/NPC overlays stay screen-fixed.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-07-23 14:08:19 +08:00
parent 2c0e6fbf09
commit eb127c11c2
13 changed files with 688 additions and 19 deletions
+17
View File
@@ -20,6 +20,8 @@ import type {
SceneDarknessEvent,
SceneDarknessState,
SceneId,
SceneViewEvent,
SceneViewState,
VideoPlaybackEvent,
VideoPlaybackState,
} from '../types';
@@ -143,6 +145,11 @@ export const ipcChannels = {
dispatch: 'sceneDarkness.dispatch',
stateChanged: 'sceneDarkness.stateChanged',
},
sceneView: {
getState: 'sceneView.getState',
dispatch: 'sceneView.dispatch',
stateChanged: 'sceneView.stateChanged',
},
video: {
getState: 'video.getState',
dispatch: 'video.dispatch',
@@ -203,6 +210,7 @@ export type IpcEventMap = {
[ipcChannels.materialsOverlay.stateChanged]: { state: MaterialsOverlayState };
[ipcChannels.npcsOverlay.stateChanged]: { state: NpcsOverlayState };
[ipcChannels.sceneDarkness.stateChanged]: { state: SceneDarknessState };
[ipcChannels.sceneView.stateChanged]: { state: SceneViewState };
[ipcChannels.video.stateChanged]: { state: VideoPlaybackState };
[ipcChannels.license.statusChanged]: { snapshot: LicenseSnapshot };
[ipcChannels.windows.multiWindowStateChanged]: { open: boolean };
@@ -593,6 +601,14 @@ export type IpcInvokeMap = {
req: { event: SceneDarknessEvent };
res: { ok: true };
};
[ipcChannels.sceneView.getState]: {
req: Record<string, never>;
res: { state: SceneViewState };
};
[ipcChannels.sceneView.dispatch]: {
req: { event: SceneViewEvent };
res: { ok: true };
};
[ipcChannels.video.getState]: {
req: Record<string, never>;
res: { state: VideoPlaybackState };
@@ -630,6 +646,7 @@ export type LegacyIpcEventMap = {
[ipcChannels.materialsOverlay.stateChanged]: { state: MaterialsOverlayState };
[ipcChannels.npcsOverlay.stateChanged]: { state: NpcsOverlayState };
[ipcChannels.sceneDarkness.stateChanged]: { state: SceneDarknessState };
[ipcChannels.sceneView.stateChanged]: { state: SceneViewState };
[ipcChannels.video.stateChanged]: { state: VideoPlaybackState };
[ipcChannels.license.statusChanged]: Record<string, never>;
};