From 85627d34adf372aff87ed48a448d66a34b314476 Mon Sep 17 00:00:00 2001 From: DrHuangMHT Date: Wed, 6 May 2026 17:04:18 +0800 Subject: [PATCH] feat(stage-*): allow setting character offset in landscape (#1696) --- apps/stage-pocket/src/pages/index.vue | 5 - .../src/renderer/pages/index.vue | 6 - apps/stage-web/src/pages/index.vue | 5 - .../InteractiveArea/Actions/ViewControls.vue | 57 +++-- .../Layouts/MobileInteractiveArea.vue | 21 +- .../Layouts/ViewControls/Inputs.vue | 215 ------------------ .../components/Widgets/ChatActionButtons.vue | 3 + .../ViewControls/SliderControls.vue | 67 ++++++ .../src/components/scenes/Live2D.vue | 15 +- .../src/components/scenes/live2d/Model.vue | 28 +-- packages/stage-ui-live2d/src/stores/index.ts | 1 + packages/stage-ui-live2d/src/stores/live2d.ts | 16 +- .../src/stores/view-control.ts | 76 +++++++ .../src/components/Controls/OrbitControls.vue | 1 + .../components/Controls/SliderControls.vue | 86 +++++++ .../src/components/Controls/index.ts | 1 + .../src/components/ThreeScene.vue | 7 +- packages/stage-ui-three/src/index.ts | 2 + .../stage-ui-three/src/stores/model-store.ts | 14 +- .../stage-ui-three/src/stores/view-control.ts | 103 +++++++++ .../settings/model-settings/preview-stage.vue | 5 +- .../stage-ui/src/components/scenes/Stage.vue | 6 - .../src/composables/use-data-maintenance.ts | 3 + packages/stage-ui/src/stores/live2d.ts | 2 +- packages/stage-ui/src/stores/three.ts | 1 + .../src/components/form/range/round-range.vue | 49 +++- 26 files changed, 456 insertions(+), 339 deletions(-) delete mode 100644 packages/stage-layouts/src/components/Layouts/ViewControls/Inputs.vue create mode 100644 packages/stage-ui-live2d/src/components/ViewControls/SliderControls.vue create mode 100644 packages/stage-ui-live2d/src/stores/view-control.ts create mode 100644 packages/stage-ui-three/src/components/Controls/SliderControls.vue create mode 100644 packages/stage-ui-three/src/stores/view-control.ts create mode 100644 packages/stage-ui/src/stores/three.ts diff --git a/apps/stage-pocket/src/pages/index.vue b/apps/stage-pocket/src/pages/index.vue index 33ddfd0e7..6ca63e1f7 100644 --- a/apps/stage-pocket/src/pages/index.vue +++ b/apps/stage-pocket/src/pages/index.vue @@ -15,7 +15,6 @@ import { WidgetStage } from '@proj-airi/stage-ui/components/scenes' import { useAudioRecorder } from '@proj-airi/stage-ui/composables/audio/audio-recorder' import { useVAD } from '@proj-airi/stage-ui/stores/ai/models/vad' import { useChatOrchestratorStore } from '@proj-airi/stage-ui/stores/chat' -import { useLive2d } from '@proj-airi/stage-ui/stores/live2d' import { useConsciousnessStore } from '@proj-airi/stage-ui/stores/modules/consciousness' import { useHearingSpeechInputPipeline } from '@proj-airi/stage-ui/stores/modules/hearing' import { useProvidersStore } from '@proj-airi/stage-ui/stores/providers' @@ -33,7 +32,6 @@ function handleSettingsOpen(open: boolean) { } const positionCursor = useMouse() -const { scale, position, positionInPercentageString } = storeToRefs(useLive2d()) const breakpoints = useBreakpoints(breakpointsTailwind) const isMobile = breakpoints.smaller('md') @@ -199,9 +197,6 @@ watch([stream, () => vadLoaded.value], async ([s, loaded]) => { x: positionCursor.x.value, y: positionCursor.y.value, }" - :x-offset="`${isMobile ? position.x : position.x - 10}%`" - :y-offset="positionInPercentageString.y" - :scale="scale" /> diff --git a/apps/stage-tamagotchi/src/renderer/pages/index.vue b/apps/stage-tamagotchi/src/renderer/pages/index.vue index 878d8f297..3c6174714 100644 --- a/apps/stage-tamagotchi/src/renderer/pages/index.vue +++ b/apps/stage-tamagotchi/src/renderer/pages/index.vue @@ -25,7 +25,6 @@ import { WidgetStage } from '@proj-airi/stage-ui/components/scenes' import { useAudioRecorder } from '@proj-airi/stage-ui/composables/audio/audio-recorder' import { useCanvasPixelIsTransparentAtPoint } from '@proj-airi/stage-ui/composables/canvas-alpha' import { useVAD } from '@proj-airi/stage-ui/stores/ai/models/vad' -import { useLive2d } from '@proj-airi/stage-ui/stores/live2d' import { useHearingSpeechInputPipeline } from '@proj-airi/stage-ui/stores/modules/hearing' import { useOnboardingStore } from '@proj-airi/stage-ui/stores/onboarding' import { useSettings, useSettingsAudioDevice } from '@proj-airi/stage-ui/stores/settings' @@ -113,8 +112,6 @@ const isAroundWindowBorderFor250Ms = refDebounced(isAroundWindowBorder, 250) const setIgnoreMouseEvents = useElectronEventaInvoke(electron.window.setIgnoreMouseEvents) -const live2dStore = useLive2d() -const { scale, positionInPercentageString } = storeToRefs(live2dStore) const { live2dLookAtX, live2dLookAtY } = storeToRefs(useWindowStore()) const { pause, resume } = watch(isTransparent, (transparent) => { @@ -484,9 +481,6 @@ watch([stream, () => vadLoaded.value], async ([s, loaded]) => { flex-1 :paused="stagePaused" :focus-at="{ x: live2dLookAtX, y: live2dLookAtY }" - :scale="scale" - :x-offset="positionInPercentageString.x" - :y-offset="positionInPercentageString.y" /> vadLoaded.value], async ([s, loaded]) => { x: positionCursor.x.value, y: positionCursor.y.value, }" - :x-offset="`${isMobile ? position.x : position.x - 10}%`" - :y-offset="positionInPercentageString.y" - :scale="scale" /> diff --git a/packages/stage-layouts/src/components/Layouts/InteractiveArea/Actions/ViewControls.vue b/packages/stage-layouts/src/components/Layouts/InteractiveArea/Actions/ViewControls.vue index e3ee30932..be44ebb59 100644 --- a/packages/stage-layouts/src/components/Layouts/InteractiveArea/Actions/ViewControls.vue +++ b/packages/stage-layouts/src/components/Layouts/InteractiveArea/Actions/ViewControls.vue @@ -1,42 +1,57 @@