diff --git a/cspell.config.yaml b/cspell.config.yaml index 77710c701..b7374b0a8 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -192,6 +192,7 @@ words: - pthread - quanlai - qwen + - Raycaster - rdev - rehype - reka diff --git a/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/Live2D.vue b/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/Live2D.vue index daf55b39f..354891ffb 100644 --- a/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/Live2D.vue +++ b/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/Live2D.vue @@ -36,7 +36,6 @@ const live2d = useLive2d() const { modelFile, motionMap, - loadSource, loadingModel, availableMotions, modelUrl, @@ -50,7 +49,6 @@ modelFileDialog.onChange((files) => { if (files && files.length > 0) { motionMap.value = {} modelFile.value = files[0] - loadSource.value = 'file' loadingModel.value = true } }) @@ -60,7 +58,7 @@ watch(loadingModel, (value) => { return } - if (loadSource.value !== 'file') { + if (!modelFile.value) { return } @@ -116,7 +114,6 @@ async function saveMotionMap() { const patchedFile = await patchMotionMap(fileFromIndexedDB, motionMap.value) modelFile.value = patchedFile - loadSource.value = 'file' loadingModel.value = true } @@ -178,7 +175,7 @@ const exportObjectUrl = useObjectUrl(modelFile)
import { Input } from '@proj-airi/ui' -import { useFileDialog } from '@vueuse/core' +import { useFileDialog, useObjectUrl } from '@vueuse/core' import { storeToRefs } from 'pinia' -import { computed, ref } from 'vue' +import { computed } from 'vue' import { useI18n } from 'vue-i18n' import { useVRM } from '../../../../stores' @@ -29,18 +29,15 @@ const modelFileDialog = useFileDialog({ const vrm = useVRM() const { modelFile, - loadSource, - loadingModel, modelUrl, modelSize, modelOffset, cameraFOV, - selectedModel, modelRotationY, cameraDistance, trackingMode, } = storeToRefs(vrm) -const localModelUrl = ref(modelUrl.value) + const trackingOptions = computed(() => [ { value: 'camera', label: t('settings.vrm.scale-and-position.eye-tracking-mode.options.option.camera'), class: 'col-start-3' }, { value: 'mouse', label: t('settings.vrm.scale-and-position.eye-tracking-mode.options.option.mouse'), class: 'col-start-4' }, @@ -50,29 +47,22 @@ const trackingOptions = computed(() => [ modelFileDialog.onChange((files) => { if (files && files.length > 0) { modelFile.value = files[0] - loadSource.value = 'file' - loadingModel.value = true - localModelUrl.value = '' } }) -function urlUploadClick() { - modelUrl.value = localModelUrl.value - // same URL will let the loader be lazy and forgot to reset loading state - // If the loading state is still true, then the URL input will be locked - if (modelUrl.value === selectedModel.value) { - console.warn('Model URL is the same as the selected model, no need to reload.') - return +const urlFile = useObjectUrl(modelFile) +const urlRef = computed({ + get: () => urlFile.value || modelUrl.value || '', + set: (value) => { + modelUrl.value = value + }, +}) + +function handleUrlLoad() { + const parsedUrl = new URL(urlRef.value, 'https://example.com') + if (parsedUrl.origin === 'https://example.com') { + modelUrl.value = urlRef.value } - // Can't let the default model URL be reentered into the loader, otherwise it will still be too lazy to reset the loading state - if (!modelUrl.value && selectedModel.value === vrm.defaultModelUrl) { - localModelUrl.value = vrm.defaultModelUrl - return - } - // Only when real different URL is entered, then the loader will be triggered - loadSource.value = 'url' - loadingModel.value = true - localModelUrl.value = selectedModel.value } @@ -156,12 +146,11 @@ function urlUploadClick() {
-
diff --git a/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/index.vue b/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/index.vue index 244accc65..d6c067fb8 100644 --- a/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/index.vue +++ b/packages/stage-ui/src/components/Scenarios/Settings/ModelSettings/index.vue @@ -6,6 +6,7 @@ import VRMScene from '../../../Scenes/VRM.vue' import Live2D from './Live2D.vue' import VRM from './VRM.vue' +import { useLive2d, useVRM } from '../../../../stores' import { useSettings } from '../../../../stores/settings' const props = defineProps<{ @@ -21,6 +22,8 @@ defineEmits<{ }>() const { stageView } = storeToRefs(useSettings()) +const { modelFile: live2dModelFile, modelUrl: live2dModelUrl } = storeToRefs(useLive2d()) +const { modelFile: vrmModelFile, modelUrl: vrmModelUrl } = storeToRefs(useVRM())