feat(control): инструмент «Маркер» на области видимости

Добавлена кисть маркера на пульте и презентации с настройками в панели эффектов; штрихи привязаны к жёлтой рамке, ластик и очистка работают с отдельным сессионным слоем.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-09-02 12:53:06 +08:00
parent 153be98780
commit 8b28a9b11a
18 changed files with 906 additions and 32 deletions
+17
View File
@@ -27,6 +27,8 @@ import type {
Scene,
SceneDarknessEvent,
SceneDarknessState,
SceneMarkerEvent,
SceneMarkerState,
SceneGrid,
SceneId,
SceneNpcToken,
@@ -182,6 +184,11 @@ export const ipcChannels = {
dispatch: 'sceneDarkness.dispatch',
stateChanged: 'sceneDarkness.stateChanged',
},
sceneMarker: {
getState: 'sceneMarker.getState',
dispatch: 'sceneMarker.dispatch',
stateChanged: 'sceneMarker.stateChanged',
},
sceneTraps: {
getState: 'sceneTraps.getState',
dispatch: 'sceneTraps.dispatch',
@@ -315,6 +322,7 @@ export type IpcEventMap = {
[ipcChannels.materialsOverlay.stateChanged]: { state: MaterialsOverlayState };
[ipcChannels.npcsOverlay.stateChanged]: { state: NpcsOverlayState };
[ipcChannels.sceneDarkness.stateChanged]: { state: SceneDarknessState };
[ipcChannels.sceneMarker.stateChanged]: { state: SceneMarkerState };
[ipcChannels.sceneTraps.stateChanged]: { state: SceneTrapsState };
[ipcChannels.sceneView.stateChanged]: { state: SceneViewState };
[ipcChannels.tokens.stateChanged]: { tokens: AppToken[] };
@@ -771,6 +779,14 @@ export type IpcInvokeMap = {
req: { event: SceneDarknessEvent };
res: { ok: true };
};
[ipcChannels.sceneMarker.getState]: {
req: Record<string, never>;
res: { state: SceneMarkerState };
};
[ipcChannels.sceneMarker.dispatch]: {
req: { event: SceneMarkerEvent };
res: { ok: true };
};
[ipcChannels.sceneTraps.getState]: {
req: Record<string, never>;
res: { state: SceneTrapsState };
@@ -952,6 +968,7 @@ export type LegacyIpcEventMap = {
[ipcChannels.materialsOverlay.stateChanged]: { state: MaterialsOverlayState };
[ipcChannels.npcsOverlay.stateChanged]: { state: NpcsOverlayState };
[ipcChannels.sceneDarkness.stateChanged]: { state: SceneDarknessState };
[ipcChannels.sceneMarker.stateChanged]: { state: SceneMarkerState };
[ipcChannels.sceneTraps.stateChanged]: { state: SceneTrapsState };
[ipcChannels.sceneView.stateChanged]: { state: SceneViewState };
[ipcChannels.tokens.stateChanged]: { tokens: AppToken[] };