diff --git a/apps/stage-web/src/pages/devtools/polaroid.vue b/apps/stage-web/src/pages/devtools/polaroid.vue new file mode 100644 index 000000000..ac95e14aa --- /dev/null +++ b/apps/stage-web/src/pages/devtools/polaroid.vue @@ -0,0 +1,87 @@ + + + diff --git a/packages/stage-ui/src/components/Live2D/Canvas.vue b/packages/stage-ui/src/components/Live2D/Canvas.vue index 17ce8a14c..2d4c74324 100644 --- a/packages/stage-ui/src/components/Live2D/Canvas.vue +++ b/packages/stage-ui/src/components/Live2D/Canvas.vue @@ -23,11 +23,10 @@ async function initLive2DPixiStage(parent: HTMLDivElement) { extensions.add(TickerPlugin) pixiApp.value = new Application({ - width: props.width, - height: props.height, + width: props.width * props.resolution, + height: props.height * props.resolution, backgroundAlpha: 0, preserveDrawingBuffer: true, - resolution: props.resolution ?? 1, // Add resolution setting }) pixiAppCanvas.value = pixiApp.value.view @@ -73,8 +72,13 @@ async function captureFrame() { return frame } +function canvasElement() { + return pixiAppCanvas.value +} + defineExpose({ captureFrame, + canvasElement, }) diff --git a/packages/stage-ui/src/components/Live2D/Model.vue b/packages/stage-ui/src/components/Live2D/Model.vue index 20cda714e..bab8b5834 100644 --- a/packages/stage-ui/src/components/Live2D/Model.vue +++ b/packages/stage-ui/src/components/Live2D/Model.vue @@ -24,12 +24,18 @@ const props = withDefaults(defineProps<{ height: number paused?: boolean focusAt?: { x: number, y: number } + disableFocusAt?: boolean }>(), { mouthOpenSize: 0, paused: false, focusAt: () => ({ x: 0, y: 0 }), + disableFocusAt: false, }) +const emits = defineEmits<{ + (e: 'modelLoaded'): void +}>() + const pixiApp = toRef(() => props.app) const paused = toRef(() => props.paused) const focusAt = toRef(() => props.focusAt) @@ -153,6 +159,7 @@ async function loadModel() { if (motionManager.state.currentGroup === motionManager.groups.idle) { idleEyeFocus.update(internalModel, now) } + return true } @@ -165,6 +172,7 @@ async function loadModel() { await localforage.setItem('live2dModel', live2dModelFile.value) } + emits('modelLoaded') loadingLive2dModel.value = false } @@ -246,6 +254,8 @@ watch(paused, value => value ? pixiApp.value?.stop() : pixiApp.value?.start()) watch(focusAt, (value) => { if (!model.value) return + if (!props.disableFocusAt) + return model.value.focus(value.x, value.y) }) @@ -262,6 +272,15 @@ onUnmounted(() => { cancelAnimationFrame(dropShadowAnimationId.value) model.value && pixiApp.value?.stage.removeChild(model.value) }) + +function listMotionGroups() { + return availableLive2dMotions.value +} + +defineExpose({ + setMotion, + listMotionGroups, +})