Skip to content

Commit 9ceb7fc

Browse files
authored
feat(stage-ui): add shadow toggle for live2d (#750)
1 parent 84dbf3f commit 9ceb7fc

File tree

5 files changed

+30
-11
lines changed

5 files changed

+30
-11
lines changed

packages/stage-pages/src/pages/settings/providers/store.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,3 @@ export const useProvidersPageStore = defineStore('providersPage', {
1515
},
1616
},
1717
})
18-

packages/stage-ui/src/components/scenarios/settings/model-settings/Live2D.vue

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ defineEmits<{
2121
const { t } = useI18n()
2222
2323
const settings = useSettings()
24-
const { live2dDisableFocus, live2dIdleAnimationEnabled, live2dAutoBlinkEnabled } = storeToRefs(settings)
24+
const { live2dDisableFocus, live2dIdleAnimationEnabled, live2dAutoBlinkEnabled, live2dShadowEnabled } = storeToRefs(settings)
2525
2626
const live2d = useLive2d()
2727
const {
@@ -273,7 +273,7 @@ onUnmounted(() => {
273273
size="sm"
274274
:expand="true"
275275
>
276-
<FieldRange v-model="scale" as="div" :min="0.5" :max="2" :step="0.01" :label="t('settings.live2d.scale-and-position.scale')">
276+
<FieldRange v-model="scale" as="div" :min="0.1" :max="3" :step="0.01" :label="t('settings.live2d.scale-and-position.scale')">
277277
<template #label>
278278
<div flex items-center>
279279
<div>{{ t('settings.live2d.scale-and-position.scale') }}</div>
@@ -283,7 +283,7 @@ onUnmounted(() => {
283283
</div>
284284
</template>
285285
</FieldRange>
286-
<FieldRange v-model="position.x" as="div" :min="-100" :max="100" :step="1" :label="t('settings.live2d.scale-and-position.x')">
286+
<FieldRange v-model="position.x" as="div" :min="-1000" :max="1000" :step="1" :label="t('settings.live2d.scale-and-position.x')">
287287
<template #label>
288288
<div flex items-center>
289289
<div>{{ t('settings.live2d.scale-and-position.x') }}</div>
@@ -293,7 +293,7 @@ onUnmounted(() => {
293293
</div>
294294
</template>
295295
</FieldRange>
296-
<FieldRange v-model="position.y" as="div" :min="-100" :max="100" :step="1" :label="t('settings.live2d.scale-and-position.y')">
296+
<FieldRange v-model="position.y" as="div" :min="-1000" :max="1000" :step="1" :label="t('settings.live2d.scale-and-position.y')">
297297
<template #label>
298298
<div flex items-center>
299299
<div>{{ t('settings.live2d.scale-and-position.y') }}</div>
@@ -398,6 +398,11 @@ onUnmounted(() => {
398398
<Checkbox v-model="live2dAutoBlinkEnabled" />
399399
</div>
400400

401+
<div mt-4 flex items-center justify-between>
402+
<span text-sm text-neutral-600 dark:text-neutral-400>Shadow</span>
403+
<Checkbox v-model="live2dShadowEnabled" />
404+
</div>
405+
401406
<button
402407

403408
mt-4 w-full border rounded bg-neutral-100 px-4 py-2 text-sm text-neutral-700 font-medium transition-colors dark:border-neutral-700 dark:bg-neutral-800 hover:bg-neutral-200 dark:text-neutral-300 dark:hover:bg-neutral-700

packages/stage-ui/src/components/scenes/Live2D.vue

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
<script setup lang="ts">
2+
import { storeToRefs } from 'pinia'
23
import { ref, watch } from 'vue'
34
45
import Screen from '../misc/Screen.vue'
56
import Live2DCanvas from './live2d/Canvas.vue'
67
import Live2DModel from './live2d/Model.vue'
78
9+
import { useLive2d } from '../../stores/live2d'
10+
811
import '../../utils/live2d-zip-loader'
912
1013
withDefaults(defineProps<{
@@ -14,9 +17,6 @@ withDefaults(defineProps<{
1417
mouthOpenSize?: number
1518
focusAt?: { x: number, y: number }
1619
disableFocusAt?: boolean
17-
xOffset?: number | string
18-
yOffset?: number | string
19-
scale?: number
2020
}>(), {
2121
paused: false,
2222
focusAt: () => ({ x: 0, y: 0 }),
@@ -31,6 +31,12 @@ const componentStateModel = defineModel<'pending' | 'loading' | 'mounted'>('mode
3131
3232
const live2dCanvasRef = ref<InstanceType<typeof Live2DCanvas>>()
3333
34+
const live2d = useLive2d()
35+
const {
36+
scale,
37+
position,
38+
} = storeToRefs(live2d)
39+
3440
watch([componentStateModel, componentStateCanvas], () => {
3541
componentState.value = (componentStateModel.value === 'mounted' && componentStateCanvas.value === 'mounted')
3642
? 'mounted'
@@ -64,8 +70,8 @@ defineExpose({
6470
:height="height"
6571
:paused="paused"
6672
:focus-at="focusAt"
67-
:x-offset="xOffset"
68-
:y-offset="yOffset"
73+
:x-offset="position.x"
74+
:y-offset="position.y"
6975
:scale="scale"
7076
:disable-focus-at="disableFocusAt"
7177
/>

packages/stage-ui/src/components/scenes/live2d/Model.vue

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ const {
133133
themeColorsHue,
134134
themeColorsHueDynamic,
135135
live2dIdleAnimationEnabled,
136+
live2dShadowEnabled,
136137
} = storeToRefs(useSettings())
137138
138139
const localCurrentMotion = ref<{ group: string, index: number }>({ group: 'Idle', index: 0 })
@@ -388,14 +389,20 @@ function updateDropShadowFilter() {
388389
if (model.value) {
389390
const color = getComputedStyle(dropShadowColorComputer.value!).backgroundColor
390391
dropShadowFilter.value.color = Number(formatHex(color)!.replace('#', '0x'))
391-
model.value.filters = [dropShadowFilter.value]
392+
if (live2dShadowEnabled.value) {
393+
model.value.filters = [dropShadowFilter.value]
394+
}
395+
else {
396+
model.value.filters = []
397+
}
392398
}
393399
}
394400
395401
watch([() => props.width, () => props.height], () => handleResize())
396402
watch(modelSrcRef, async () => await loadModel(), { immediate: true })
397403
watch(dark, updateDropShadowFilter, { immediate: true })
398404
watch([model, themeColorsHue], updateDropShadowFilter)
405+
watch(live2dShadowEnabled, updateDropShadowFilter)
399406
watch(offset, setScaleAndPosition)
400407
watch(() => props.scale, setScaleAndPosition)
401408

packages/stage-ui/src/stores/settings.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ export const useSettings = defineStore('settings', () => {
102102
const live2dDisableFocus = useLocalStorage('settings/live2d/disable-focus', false)
103103
const live2dIdleAnimationEnabled = useLocalStorage('settings/live2d/idle-animation-enabled', true)
104104
const live2dAutoBlinkEnabled = useLocalStorage('settings/live2d/auto-blink-enabled', true)
105+
const live2dShadowEnabled = useLocalStorage('settings/live2d/shadow-enabled', false)
105106

106107
const disableTransitions = useLocalStorage('settings/disable-transitions', true)
107108
const usePageSpecificTransitions = useLocalStorage('settings/use-page-specific-transitions', true)
@@ -174,6 +175,7 @@ export const useSettings = defineStore('settings', () => {
174175
live2dDisableFocus,
175176
live2dIdleAnimationEnabled,
176177
live2dAutoBlinkEnabled,
178+
live2dShadowEnabled,
177179
themeColorsHue,
178180
themeColorsHueDynamic,
179181

0 commit comments

Comments
 (0)