From 7f9eeb715d2de5c5c64a32a323ab3bc7fadcdeef Mon Sep 17 00:00:00 2001 From: DrHuangMHT Date: Wed, 20 May 2026 22:30:38 +0800 Subject: [PATCH] fix(stage-*): improve cursor tracking (#1842) --- .../src/renderer/pages/index.vue | 16 +- apps/stage-web/package.json | 1 + apps/stage-web/src/pages/index.vue | 19 +- packages/i18n/src/locales/en/settings.yaml | 79 +++++- packages/i18n/src/locales/es/settings.yaml | 26 +- packages/i18n/src/locales/fr/settings.yaml | 26 +- packages/i18n/src/locales/ja/settings.yaml | 26 +- packages/i18n/src/locales/ko/settings.yaml | 8 +- packages/i18n/src/locales/ru/settings.yaml | 8 +- packages/i18n/src/locales/vi/settings.yaml | 8 +- .../i18n/src/locales/zh-Hans/settings.yaml | 77 ++++- .../i18n/src/locales/zh-Hant/settings.yaml | 8 +- packages/stage-ui-live2d/package.json | 2 +- .../src/components/scenes/Live2D.vue | 47 ++-- .../src/components/scenes/live2d/Model.vue | 82 +++--- .../src/composables/live2d/eye-tracking.ts | 46 +++ .../src/composables/live2d/fit-model.ts | 42 +++ .../src/composables/live2d/index.ts | 2 + .../src/composables/live2d/live2d.ts | 74 +++++ .../src/composables/live2d/motion-manager.ts | 8 +- packages/stage-ui-live2d/src/stores/index.ts | 2 +- .../stores/{live2d.ts => model-parameters.ts} | 2 +- .../src/stores/view-control.ts | 2 +- .../src/components/Model/VRMModel.vue | 88 +----- .../src/components/ThreeScene.vue | 32 ++- .../src/composables/eye-tracking.ts | 55 ++++ .../stage-ui-three/src/stores/model-store.ts | 19 +- .../components/data-pane/property-point.vue | 21 +- .../dialogs/model-selector/model-selector.vue | 12 +- .../settings/model-settings/live2d.vue | 190 ++++++++----- .../settings/model-settings/panel.vue | 25 +- .../settings/model-settings/preview-stage.vue | 33 ++- .../stage-ui/src/components/scenes/Stage.vue | 24 +- .../src/composables/use-data-maintenance.ts | 8 +- .../stage-ui/src/stores/settings/index.ts | 15 - .../stage-ui/src/stores/settings/live2d.ts | 54 ---- packages/ui/src/components/layouts/screen.vue | 4 + pnpm-lock.yaml | 263 ++++++++++++++++-- 38 files changed, 983 insertions(+), 471 deletions(-) create mode 100644 packages/stage-ui-live2d/src/composables/live2d/eye-tracking.ts create mode 100644 packages/stage-ui-live2d/src/composables/live2d/fit-model.ts create mode 100644 packages/stage-ui-live2d/src/composables/live2d/live2d.ts rename packages/stage-ui-live2d/src/stores/{live2d.ts => model-parameters.ts} (97%) create mode 100644 packages/stage-ui-three/src/composables/eye-tracking.ts delete mode 100644 packages/stage-ui/src/stores/settings/live2d.ts diff --git a/apps/stage-tamagotchi/src/renderer/pages/index.vue b/apps/stage-tamagotchi/src/renderer/pages/index.vue index adbaab4e0..09afbde99 100644 --- a/apps/stage-tamagotchi/src/renderer/pages/index.vue +++ b/apps/stage-tamagotchi/src/renderer/pages/index.vue @@ -15,6 +15,7 @@ import { useElectronRelativeMouse, } from '@proj-airi/electron-vueuse' import { IS_DEV } from '@proj-airi/stage-shared' +import { useSettingsLive2d } from '@proj-airi/stage-ui-live2d' import { useModelStore, useThreeSceneIsTransparentAtPoint } from '@proj-airi/stage-ui-three' import { HoloCoupon } from '@proj-airi/stage-ui/components' import { @@ -41,7 +42,6 @@ import { modelSettingsRuntimeSnapshotChannelName } from '../../shared/model-sett import { useChatSyncStore } from '../stores/chat-sync' import { useControlsIslandStore } from '../stores/controls-island' import { useStageWindowLifecycleStore } from '../stores/stage-window-lifecycle' -import { useWindowStore } from '../stores/window' import { shouldSampleStageTransparency } from '../utils/stage-three-transparency' const controlsIslandRef = ref>() @@ -112,8 +112,6 @@ const isAroundWindowBorderFor250Ms = refDebounced(isAroundWindowBorder, 250) const setIgnoreMouseEvents = useElectronEventaInvoke(electron.window.setIgnoreMouseEvents) -const { live2dLookAtX, live2dLookAtY } = storeToRefs(useWindowStore()) - const { pause, resume } = watch(isTransparent, (transparent) => { shouldFadeOnCursorWithin.value = fadeOnHoverEnabled.value && !transparent }, { immediate: true }) @@ -457,6 +455,17 @@ watch([stream, () => vadLoaded.value], async ([s, loaded]) => { }) // Assistant caption is broadcast from Stage.vue via the same channel + +const { live2dEyeTrackingSource } = storeToRefs(useSettingsLive2d()) +live2dEyeTrackingSource.value = computed(() => ({ + x: relativeMouseX.value, + y: relativeMouseY.value, +})) +const { trackingSource } = storeToRefs(useModelStore()) +trackingSource.value = computed(() => ({ + x: relativeMouseX.value, + y: relativeMouseY.value, +}))