This commit is contained in:
syuilo 2026-05-29 08:01:39 +09:00
commit 3fca2cb664
10 changed files with 101 additions and 188 deletions

View file

@ -21,10 +21,10 @@
"built"
],
"dependencies": {
"@babylonjs/core": "9.9.0",
"@babylonjs/inspector": "9.9.0",
"@babylonjs/loaders": "9.9.0",
"@babylonjs/materials": "9.9.0",
"@babylonjs/core": "9.10.0",
"@babylonjs/inspector": "9.10.0",
"@babylonjs/loaders": "9.10.0",
"@babylonjs/materials": "9.10.0",
"@types/throttle-debounce": "5.0.2",
"eventemitter3": "5.0.4",
"seedrandom": "3.0.5",

View file

@ -6,10 +6,10 @@
import * as BABYLON from '@babylonjs/core';
import { camelToKebab, WORLD_SCALE } from 'misskey-world/src/utility.js';
import { scaleMorph, Timer } from '../utility.js';
import { convertRawOptions, type ConvertedOptions, type RawOptions } from '../mono.js';
import { getObjectDef } from './object-defs.js';
import { ModelManager, SYSTEM_MESH_NAMES } from './utility.js';
import { convertRawOptions } from './object.js';
import type { ConvertedOptions, RawOptions, RoomObjectInstance } from './object.js';
import type { RoomObjectInstance } from './object.js';
import type { RoomAttachments } from 'misskey-world/src/room/type.js';
function mergeMeshes(meshes: BABYLON.Mesh[], root: BABYLON.Mesh, hasTexture: boolean) {

View file

@ -1,114 +0,0 @@
<!--
SPDX-FileCopyrightText: syuilo and misskey-project
SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<div :class="$style.root">
<div class="_gaps_s">
<MkFolder v-for="[k, s] in Object.entries(schema.options.schema)" :key="k">
<template #label>{{ AVATAR_ACCESSORY_UI_DEFS[schema.id].options[k].label }}</template>
<template #suffix>
<span v-if="s.type === 'color'" :style="{ color: getHex(options[k]) }"></span>
<span v-else-if="s.type === 'material'" :style="{ color: getHex(options[k].color) }"></span>
</template>
<div v-if="s.type === 'color'">
<!-- debounce or throttleしないとカラーピッカー上で高速でなぞったときになぜか無限ループになるワーカーとの間でラグがあるため少し前の値がまたmodelValueとしてフィードバックされてしまうためだと思われる -->
<MkInput :modelValue="getHex(options[k])" type="color" :throttle="300" @update:modelValue="v => { const c = getRgb(v); if (c != null) emit('update', k, c); }"></MkInput>
</div>
<div v-else-if="s.type === 'material'" class="_gaps_s">
<!-- debounce or throttleしないとカラーピッカー上で高速でなぞったときになぜか無限ループになるワーカーとの間でラグがあるため少し前の値がまたmodelValueとしてフィードバックされてしまうためだと思われる -->
<MkInput :modelValue="getHex(options[k].color)" type="color" :throttle="300" @update:modelValue="v => { const c = getRgb(v); if (c != null) updateMaterialColor(k, c); }">
<template #label>{{ i18n.ts.color }}</template>
</MkInput>
<template v-if="advancedCustomize">
<MkRange :continuousUpdate="true" :min="0" :max="1" :step="0.1" :modelValue="options[k].metallic" @update:modelValue="v => updateMaterialMetallic(k, v)">
<template #label>{{ i18n.ts._miRoom.material_metallic }}</template>
</MkRange>
<MkRange :continuousUpdate="true" :min="0" :max="1" :step="0.05" :modelValue="options[k].roughness" @update:modelValue="v => updateMaterialRoughness(k, v)">
<template #label>{{ i18n.ts._miRoom.material_roughness }}</template>
</MkRange>
</template>
</div>
<div v-else-if="s.type === 'light'" class="_gaps_s">
<!-- debounce or throttleしないとカラーピッカー上で高速でなぞったときになぜか無限ループになるワーカーとの間でラグがあるため少し前の値がまたmodelValueとしてフィードバックされてしまうためだと思われる -->
<MkInput :modelValue="getHex(options[k].color)" type="color" :throttle="300" @update:modelValue="v => { const c = getRgb(v); if (c != null) updateLightColor(k, c); }">
<template #label>{{ i18n.ts.color }}</template>
</MkInput>
<MkRange :continuousUpdate="true" :min="0" :max="1" :step="0.1" :modelValue="options[k].brightness" @update:modelValue="v => updateLightBrightness(k, v)">
<template #label>{{ i18n.ts._miRoom.light_brightness }}</template>
</MkRange>
</div>
<div v-else-if="s.type === 'boolean'">
<MkSwitch :modelValue="options[k]" @update:modelValue="v => emit('update', k, v)"></MkSwitch>
</div>
<div v-else-if="s.type === 'enum'">
<MkSelect :items="s.enum.map(e => ({ label: AVATAR_ACCESSORY_UI_DEFS[schema.id].options[k].enum[e.value].label, value: e.value }))" :modelValue="options[k]" @update:modelValue="v => emit('update', k, v)"></MkSelect>
</div>
<div v-else-if="s.type === 'string'">
<MkInput type="text" :modelValue="options[k]" @update:modelValue="v => emit('update', k, v)"></MkInput>
</div>
<div v-else-if="s.type === 'range'">
<MkRange :continuousUpdate="true" :min="s.min" :max="s.max" :step="s.step" :modelValue="options[k]" @update:modelValue="v => emit('update', k, v)"></MkRange>
</div>
</MkFolder>
<MkSwitch v-model="advancedCustomize">{{ i18n.ts._miWorld.advancedCustomize }}</MkSwitch>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import * as Misskey from 'misskey-js';
import { getHex, getRgb } from 'misskey-world/src/utility.js';
import type { AccessorySchemaDef } from 'misskey-world/src/avatars/accessory.js';
import { i18n } from '@/i18n.js';
import MkButton from '@/components/MkButton.vue';
import MkSelect from '@/components/MkSelect.vue';
import * as os from '@/os.js';
import MkInput from '@/components/MkInput.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkRange from '@/components/MkRange.vue';
import MkRadios from '@/components/MkRadios.vue';
import MkFolder from '@/components/MkFolder.vue';
import { prefer } from '@/preferences.js';
import { AVATAR_ACCESSORY_UI_DEFS } from '@/world/avatars/accessory-ui-defs.js';
const props = defineProps<{
schema: AccessorySchemaDef<any>;
options: Record<string, unknown>;
}>();
const emit = defineEmits<{
(ev: 'update', k: string, v: any): void;
}>();
const advancedCustomize = ref(false);
function updateMaterialColor(k: string, color: { r: number; g: number; b: number }) {
emit('update', k, { ...props.options[k], color });
}
function updateMaterialMetallic(k: string, metallic: number) {
emit('update', k, { ...props.options[k], metallic });
}
function updateMaterialRoughness(k: string, roughness: number) {
emit('update', k, { ...props.options[k], roughness });
}
function updateLightColor(k: string, color: { r: number; g: number; b: number }) {
emit('update', k, { ...props.options[k], color });
}
function updateLightBrightness(k: string, brightness: number) {
emit('update', k, { ...props.options[k], brightness });
}
</script>
<style lang="scss" module>
.root {
}
</style>

View file

@ -113,7 +113,13 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkFolder v-for="a in avatar.accessories" :key="a.id">
<template #label>{{ AVATAR_ACCESSORY_UI_DEFS[a.type].name }}</template>
<XAccessory :schema="getAccessorySchemaDef(a.type)" :options="a.options" @update="(k, v) => { a.options[k] = v; updateAvatarOption(); }"/>
<MkWorldMonoOptionsForm
:uiDef="AVATAR_ACCESSORY_UI_DEFS[a.type]"
:schema="getAccessorySchemaDef(a.type).options.schema"
:options="a.options"
:addFileAttachment="() => {}"
@update="(k, v) => { a.options[k] = v; updateAvatarOption(); }"
/>
</MkFolder>
<MkButton primary rounded @click="addAccessory">Add accessory</MkButton>
@ -133,10 +139,10 @@ import { getHex, getRgb } from 'misskey-world/src/utility.js';
import { ACCESSORY_SCHEMA_DEFS, getAccessorySchemaDef } from 'misskey-world/src/avatars/accessory-schema-defs.js';
import { throttle } from 'throttle-debounce';
import MkFolder from './MkFolder.vue';
import XAccessory from './MkWorldAvatarEditDialog.accessory.vue';
import type { Ref } from 'vue';
import type { WorldAvatar } from 'misskey-world/src/types.js';
import type { AvatarPreviewEngineControllerOptions } from '@/world/avatarPreviewEngineController.js';
import MkWorldMonoOptionsForm from '@/components/MkWorldMonoOptionsForm.vue';
import { AvatarPreviewEngineController } from '@/world/avatarPreviewEngineController.js';
import { i18n } from '@/i18n.js';
import MkModalWindow from '@/components/MkModalWindow.vue';

View file

@ -6,8 +6,8 @@ SPDX-License-Identifier: AGPL-3.0-only
<template>
<div :class="$style.root">
<div class="_gaps_s">
<MkFolder v-for="[k, s] in Object.entries(schema.options.schema)" :key="k">
<template #label>{{ OBJECT_UI_DEFS[schema.id].options[k].label }}</template>
<MkFolder v-for="[k, s] in Object.entries(schema)" :key="k">
<template #label>{{ uiDef.options[k].label }}</template>
<template #suffix>
<span v-if="s.type === 'color'" :style="{ color: getHex(options[k]) }"></span>
<span v-else-if="s.type === 'material'" :style="{ color: getHex(options[k].color) }"></span>
@ -44,7 +44,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkSwitch :modelValue="options[k]" @update:modelValue="v => emit('update', k, v)"></MkSwitch>
</div>
<div v-else-if="s.type === 'enum'">
<MkSelect :items="s.enum.map(e => ({ label: OBJECT_UI_DEFS[schema.id].options[k].enum[e.value].label, value: e.value }))" :modelValue="options[k]" @update:modelValue="v => emit('update', k, v)"></MkSelect>
<MkSelect :items="s.enum.map(e => ({ label: uiDef.options[k].enum[e.value].label, value: e.value }))" :modelValue="options[k]" @update:modelValue="v => emit('update', k, v)"></MkSelect>
</div>
<div v-else-if="s.type === 'string'">
<MkInput type="text" :modelValue="options[k]" @update:modelValue="v => emit('update', k, v)"></MkInput>
@ -53,7 +53,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkRange :continuousUpdate="true" :min="s.min" :max="s.max" :step="s.step" :modelValue="options[k]" @update:modelValue="v => emit('update', k, v)"></MkRange>
</div>
<div v-else-if="s.type === 'image'" class="_gaps_s">
<MkSelect :items="[{ label: i18n.ts.none, value: null }, { label: i18n.ts.custom, value: '_custom_' }, ...(s.presets.length > 0 ? [{ type: 'divider' } as const] : []), ...s.presets.map(e => ({ label: OBJECT_UI_DEFS[schema.id].options[k].presets[e.value].label, value: e.value }))]" :modelValue="options[k].type" @update:modelValue="v => changeImageType(k, v)"></MkSelect>
<MkSelect :items="[{ label: i18n.ts.none, value: null }, { label: i18n.ts.custom, value: '_custom_' }, ...(s.presets.length > 0 ? [{ type: 'divider' } as const] : []), ...s.presets.map(e => ({ label: uiDef.options[k].presets[e.value].label, value: e.value }))]" :modelValue="options[k].type" @update:modelValue="v => changeImageType(k, v)"></MkSelect>
<div v-if="options[k].type === '_custom_'" class="_buttons">
<MkButton primary inline @click="changeImage(k)"><i class="ti ti-cloud"></i> {{ i18n.ts.choose }}...</MkButton>
@ -80,7 +80,8 @@ SPDX-License-Identifier: AGPL-3.0-only
import { } from 'vue';
import * as Misskey from 'misskey-js';
import { getHex, getRgb } from 'misskey-world/src/utility.js';
import type { ObjectSchemaDef, RawOptions } from 'misskey-world/src/room/object.js';
import type { OptionsSchema, RawOptions } from 'misskey-world/src/mono.js';
import type { GetOptionsSchemaUiDef } from '@/world/mono.js';
import { i18n } from '@/i18n.js';
import MkButton from '@/components/MkButton.vue';
import MkSelect from '@/components/MkSelect.vue';
@ -91,12 +92,12 @@ import MkRange from '@/components/MkRange.vue';
import { chooseDriveFile } from '@/utility/drive.js';
import MkRadios from '@/components/MkRadios.vue';
import MkFolder from '@/components/MkFolder.vue';
import { OBJECT_UI_DEFS } from '@/world/room/object-ui-defs.js';
import { prefer } from '@/preferences.js';
const props = defineProps<{
schema: ObjectSchemaDef<any>;
schema: OptionsSchema;
options: RawOptions;
uiDef: Record<string, GetOptionsSchemaUiDef<any>>;
addFileAttachment: ((file: Misskey.entities.DriveFile) => void);
}>();

View file

@ -60,7 +60,13 @@ SPDX-License-Identifier: AGPL-3.0-only
:leaveToClass="prefer.s.animation ? $style.transition_options_leaveTo : ''"
>
<div v-if="selectedObjectSchema != null && selectedInstanceId != null && showObjectOptions" :class="$style.customize">
<XObjectCustomizeForm :addFileAttachment="addFileAttachment" :schema="selectedObjectSchema" :options="selectedObjectOptionsState" @update="(k, v) => updateObjectOption(k, v)"></XObjectCustomizeForm>
<MkWorldMonoOptionsForm
:uiDef="OBJECT_UI_DEFS[selectedObjectSchema.id]"
:addFileAttachment="addFileAttachment"
:schema="selectedObjectSchema.options.schema"
:options="selectedObjectOptionsState"
@update="(k, v) => updateObjectOption(k, v)"
/>
</div>
</Transition>
</div>
@ -74,11 +80,11 @@ SPDX-License-Identifier: AGPL-3.0-only
import { ref, useTemplateRef, watch, onMounted, onUnmounted, reactive, nextTick, shallowRef, computed, triggerRef, markRaw } from 'vue';
import * as Misskey from 'misskey-js';
import { OBJECT_SCHEMA_DEFS } from 'misskey-world/src/room/object-schema-defs.js';
import XObjectCustomizeForm from './room.object-customize-form.vue';
import XItem from './room.add-object-dialog.item.vue';
import type { PreviewEngineControllerOptions } from '@/world/room/previewEngineController.js';
import type { RawOptions } from 'misskey-world/src/room/object.js';
import type { RoomAttachments } from 'misskey-world/src/room/type.js';
import type { RawOptions } from 'misskey-world/src/mono.js';
import MkWorldMonoOptionsForm from '@/components/MkWorldMonoOptionsForm.vue';
import { i18n } from '@/i18n.js';
import MkModalWindow from '@/components/MkModalWindow.vue';
import * as os from '@/os.js';
@ -90,6 +96,7 @@ import MkFoldableSection from '@/components/MkFoldableSection.vue';
import { PreviewEngineController } from '@/world/room/previewEngineController.js';
import MkInput from '@/components/MkInput.vue';
import { withTimeout } from '@/utility/promise-timeout.js';
import { OBJECT_UI_DEFS } from '@/world/room/object-ui-defs.js';
// TODO: instanceidid -> type

View file

@ -76,7 +76,13 @@ SPDX-License-Identifier: AGPL-3.0-only
<div v-if="controller.isReady.value && controller.isEditMode.value && controller.selected.value != null && !controller.grabbing.value" :key="controller.selected.value.objectId" :class="$style.overlayObjectInfoPanel">
<div style="margin-bottom: 8px; font-weight: bold; text-align: center;">{{ OBJECT_UI_DEFS[controller.selected.value.objectState.type].name }}</div>
<XObjectCustomizeForm :addFileAttachment="addFileAttachment" :schema="OBJECT_SCHEMA_DEFS[controller.selected.value.objectState.type]" :options="controller.selected.value.objectState.options" @update="(k, v) => updateObjectOption(k, v)"></XObjectCustomizeForm>
<MkWorldMonoOptionsForm
:uiDef="OBJECT_UI_DEFS[OBJECT_SCHEMA_DEFS[controller.selected.value.objectState.type].id]"
:addFileAttachment="addFileAttachment"
:schema="OBJECT_SCHEMA_DEFS[controller.selected.value.objectState.type].options.schema"
:options="controller.selected.value.objectState.options"
@update="(k, v) => updateObjectOption(k, v)"
/>
</div>
<div v-if="isRoomSettingsOpen && controller.isEditMode.value" class="_panel" :class="$style.overlayObjectInfoPanel">
@ -92,10 +98,10 @@ import { cm, getHex, getRgb, WORLD_SCALE } from 'misskey-world/src/utility.js';
import { GRAPHICS_QUALITY } from 'misskey-world-engine/src/utility.js';
import { OBJECT_SCHEMA_DEFS } from 'misskey-world/src/room/object-schema-defs.js';
import { useInterval } from '@@/js/use-interval.js';
import XObjectCustomizeForm from './room.object-customize-form.vue';
import XEnvOptions from './room.env-options.vue';
import type { RoomControllerOptions } from '@/world/room/controller.js';
import type { RoomState, RoomAttachments } from 'misskey-world/src/room/type.js';
import MkWorldMonoOptionsForm from '@/components/MkWorldMonoOptionsForm.vue';
import { i18n } from '@/i18n.js';
import MkButton from '@/components/MkButton.vue';
import * as os from '@/os.js';

View file

@ -0,0 +1,21 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import type { BooleanOptionSchema, ColorOptionSchema, EnumOptionSchema, ImageOptionSchema, LightOptionSchema, MaterialOptionSchema, NumberOptionSchema, OptionsSchema, RangeOptionSchema, SeedOptionSchema, StringOptionSchema } from 'misskey-world/src/mono.js';
export type GetOptionsSchemaUiDef<T extends OptionsSchema> = {
[K in keyof T]:
T[K] extends NumberOptionSchema ? { label: string; } :
T[K] extends BooleanOptionSchema ? { label: string; } :
T[K] extends StringOptionSchema ? { label: string; } :
T[K] extends ColorOptionSchema ? { label: string; } :
T[K] extends MaterialOptionSchema ? { label: string; } :
T[K] extends LightOptionSchema ? { label: string; } :
T[K] extends EnumOptionSchema ? { label: string; enum: Record<T[K]['enum'][number]['value'], { label: string; }>; } :
T[K] extends RangeOptionSchema ? { label: string; } :
T[K] extends ImageOptionSchema ? { label: string; presets: Record<T[K]['presets'][number]['value'], { label: string; }>; } :
T[K] extends SeedOptionSchema ? { label: string; } :
never;
};

View file

@ -3,22 +3,8 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
import type { BooleanOptionSchema, ColorOptionSchema, EnumOptionSchema, ImageOptionSchema, LightOptionSchema, MaterialOptionSchema, NumberOptionSchema, ObjectSchemaDef, OptionsSchema, RangeOptionSchema, SeedOptionSchema, StringOptionSchema } from 'misskey-world/src/room/object.js';
type GetOptionsSchemaUiDef<T extends OptionsSchema> = {
[K in keyof T]:
T[K] extends NumberOptionSchema ? { label: string; } :
T[K] extends BooleanOptionSchema ? { label: string; } :
T[K] extends StringOptionSchema ? { label: string; } :
T[K] extends ColorOptionSchema ? { label: string; } :
T[K] extends MaterialOptionSchema ? { label: string; } :
T[K] extends LightOptionSchema ? { label: string; } :
T[K] extends EnumOptionSchema ? { label: string; enum: Record<T[K]['enum'][number]['value'], { label: string; }>; } :
T[K] extends RangeOptionSchema ? { label: string; } :
T[K] extends ImageOptionSchema ? { label: string; presets: Record<T[K]['presets'][number]['value'], { label: string; }>; } :
T[K] extends SeedOptionSchema ? { label: string; } :
never;
};
import type { ObjectSchemaDef } from 'misskey-world/src/room/object.js';
import type { GetOptionsSchemaUiDef } from '../mono.js';
export type ObjectUiDef<Schema extends ObjectSchemaDef = ObjectSchemaDef> = {
name: string;

76
pnpm-lock.yaml generated
View file

@ -1173,17 +1173,17 @@ importers:
packages/frontend-misskey-world-engine:
dependencies:
'@babylonjs/core':
specifier: 9.9.0
version: 9.9.0
specifier: 9.10.0
version: 9.10.0
'@babylonjs/inspector':
specifier: 9.9.0
version: 9.9.0(37580b7f869e99cbbbef9da0435d2619)
specifier: 9.10.0
version: 9.10.0(24444c20d76daed063c52fbd141dc2f6)
'@babylonjs/loaders':
specifier: 9.9.0
version: 9.9.0(@babylonjs/core@9.9.0)(babylonjs-gltf2interface@9.6.0)
specifier: 9.10.0
version: 9.10.0(@babylonjs/core@9.10.0)(babylonjs-gltf2interface@9.6.0)
'@babylonjs/materials':
specifier: 9.9.0
version: 9.9.0(@babylonjs/core@9.9.0)
specifier: 9.10.0
version: 9.10.0(@babylonjs/core@9.10.0)
'@types/throttle-debounce':
specifier: 5.0.2
version: 5.0.2
@ -1801,8 +1801,8 @@ packages:
peerDependencies:
'@babylonjs/core': ^9.0.0
'@babylonjs/core@9.9.0':
resolution: {integrity: sha512-bvov/9CYT6SnQpv3fOmCL3YZQcvcNEsEKzsHoLna2xnqQpjcUaC2XjPowkj9Wyq3V7AkfwxhsxG1MS2zbiO6Sw==}
'@babylonjs/core@9.10.0':
resolution: {integrity: sha512-BgRHSidUqV67Pi8hbyXUnntzJMIXcb09CBGJsNxsgu5vyZWxRtlN34IHVHHfKA95d/ZLrHZ/kXMsi2DG1aLR+Q==}
'@babylonjs/gui-editor@9.7.0':
resolution: {integrity: sha512-5LGB5SqxBbgB+V7k85rGNOD1aJUybT78yvRyUzR8dCJP6XkgRDMsNqcqqEWLCg7+1Z0XVRWvJLwu8QAA0XxbcA==}
@ -1817,8 +1817,8 @@ packages:
peerDependencies:
'@babylonjs/core': ^9.0.0
'@babylonjs/inspector@9.9.0':
resolution: {integrity: sha512-sB2YzL1KRYYoBK7SIR8Z2PAw0fxJxGLSE5cghyGF98CnSRCxj/cVDILZgNARamUKOyDtK6AYVQSn27qKVz+h7g==}
'@babylonjs/inspector@9.10.0':
resolution: {integrity: sha512-ZqkHLgnU/w0lOpoEpnLJn6m9oZ4iHA/HhYbaiIkbBbg2BpsoWc/J76HPGKhyT8Q02hnfyl1mcOB6wwF5qhvg9w==}
hasBin: true
peerDependencies:
'@babylonjs/addons': ^9.0.0
@ -1836,14 +1836,14 @@ packages:
react-dom: '>=16.14.0 <20.0.0'
usehooks-ts: ^3.1.1
'@babylonjs/loaders@9.9.0':
resolution: {integrity: sha512-INDmzfYEwyLPCJZJrlXlFA/590/b0aQfyoQ21BeQh5NBJwtJIwcfODrOfbcCBdBYAzpKzHegHFin9M7/9qyxTg==}
'@babylonjs/loaders@9.10.0':
resolution: {integrity: sha512-4qC64XFy+F4SnXcn5b1wN2E3zz9cMRwat74wpmhH54UW3MvsUS06f+2f1Dw2gPhAMwogNW56zWxB1GY/MioJzQ==}
peerDependencies:
'@babylonjs/core': ^9.0.0
babylonjs-gltf2interface: ^9.0.0
'@babylonjs/materials@9.9.0':
resolution: {integrity: sha512-GMHhMHcrFRm2hETzSE8mcmuVTFJw7eCgdBtDOYRv3pFvFge/eoVatk1EB9jsSwK0+feF8gDZyI1QBX9AXrpkiQ==}
'@babylonjs/materials@9.10.0':
resolution: {integrity: sha512-CxOMnAJ+l4Zle8WF2JbtdpDBAk3grK+5tVnxbW0RohEfG5QCVZVjFCCTLCpyoTFLuFaIyOxsOIozfK7o1btsZw==}
peerDependencies:
'@babylonjs/core': ^9.0.0
@ -11830,32 +11830,32 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
'@babylonjs/addons@9.7.0(@babylonjs/core@9.9.0)':
'@babylonjs/addons@9.7.0(@babylonjs/core@9.10.0)':
dependencies:
'@babylonjs/core': 9.9.0
'@babylonjs/core': 9.10.0
'@babylonjs/core@9.9.0': {}
'@babylonjs/core@9.10.0': {}
'@babylonjs/gui-editor@9.7.0(@babylonjs/core@9.9.0)(@babylonjs/gui@9.7.0(@babylonjs/core@9.9.0))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)':
'@babylonjs/gui-editor@9.7.0(@babylonjs/core@9.10.0)(@babylonjs/gui@9.7.0(@babylonjs/core@9.10.0))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)':
dependencies:
'@babylonjs/core': 9.9.0
'@babylonjs/gui': 9.7.0(@babylonjs/core@9.9.0)
'@babylonjs/core': 9.10.0
'@babylonjs/gui': 9.7.0(@babylonjs/core@9.10.0)
'@types/react': 19.2.14
'@types/react-dom': 19.2.3(@types/react@19.2.14)
'@babylonjs/gui@9.7.0(@babylonjs/core@9.9.0)':
'@babylonjs/gui@9.7.0(@babylonjs/core@9.10.0)':
dependencies:
'@babylonjs/core': 9.9.0
'@babylonjs/core': 9.10.0
'@babylonjs/inspector@9.9.0(37580b7f869e99cbbbef9da0435d2619)':
'@babylonjs/inspector@9.10.0(24444c20d76daed063c52fbd141dc2f6)':
dependencies:
'@babylonjs/addons': 9.7.0(@babylonjs/core@9.9.0)
'@babylonjs/core': 9.9.0
'@babylonjs/gui': 9.7.0(@babylonjs/core@9.9.0)
'@babylonjs/gui-editor': 9.7.0(@babylonjs/core@9.9.0)(@babylonjs/gui@9.7.0(@babylonjs/core@9.9.0))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)
'@babylonjs/loaders': 9.9.0(@babylonjs/core@9.9.0)(babylonjs-gltf2interface@9.6.0)
'@babylonjs/materials': 9.9.0(@babylonjs/core@9.9.0)
'@babylonjs/serializers': 9.7.0(@babylonjs/core@9.9.0)(babylonjs-gltf2interface@9.6.0)
'@babylonjs/addons': 9.7.0(@babylonjs/core@9.10.0)
'@babylonjs/core': 9.10.0
'@babylonjs/gui': 9.7.0(@babylonjs/core@9.10.0)
'@babylonjs/gui-editor': 9.7.0(@babylonjs/core@9.10.0)(@babylonjs/gui@9.7.0(@babylonjs/core@9.10.0))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)
'@babylonjs/loaders': 9.10.0(@babylonjs/core@9.10.0)(babylonjs-gltf2interface@9.6.0)
'@babylonjs/materials': 9.10.0(@babylonjs/core@9.10.0)
'@babylonjs/serializers': 9.7.0(@babylonjs/core@9.10.0)(babylonjs-gltf2interface@9.6.0)
'@fluentui-contrib/react-resize-handle': 0.8.4(@fluentui/react-components@9.73.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(scheduler@0.27.0))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@fluentui-contrib/react-virtualizer': 1.0.0(@fluentui/react-shared-contexts@9.26.2(@types/react@19.2.14)(react@19.2.6))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@fluentui/react-components': 9.73.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(scheduler@0.27.0)
@ -11864,18 +11864,18 @@ snapshots:
react-dom: 19.2.6(react@19.2.6)
usehooks-ts: 3.1.1(react@19.2.6)
'@babylonjs/loaders@9.9.0(@babylonjs/core@9.9.0)(babylonjs-gltf2interface@9.6.0)':
'@babylonjs/loaders@9.10.0(@babylonjs/core@9.10.0)(babylonjs-gltf2interface@9.6.0)':
dependencies:
'@babylonjs/core': 9.9.0
'@babylonjs/core': 9.10.0
babylonjs-gltf2interface: 9.6.0
'@babylonjs/materials@9.9.0(@babylonjs/core@9.9.0)':
'@babylonjs/materials@9.10.0(@babylonjs/core@9.10.0)':
dependencies:
'@babylonjs/core': 9.9.0
'@babylonjs/core': 9.10.0
'@babylonjs/serializers@9.7.0(@babylonjs/core@9.9.0)(babylonjs-gltf2interface@9.6.0)':
'@babylonjs/serializers@9.7.0(@babylonjs/core@9.10.0)(babylonjs-gltf2interface@9.6.0)':
dependencies:
'@babylonjs/core': 9.9.0
'@babylonjs/core': 9.10.0
babylonjs-gltf2interface: 9.6.0
'@bcoe/v8-coverage@1.0.2': {}