diff --git a/package-lock.json b/package-lock.json index 36dc583..36acd4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2458,19 +2458,18 @@ "license": "MIT" }, "node_modules/@types/three": { - "version": "0.176.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.176.0.tgz", - "integrity": "sha512-FwfPXxCqOtP7EdYMagCFePNKoG1AGBDUEVKtluv2BTVRpSt7b+X27xNsirPCTCqY1pGYsPUzaM3jgWP7dXSxlw==", + "version": "0.184.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.184.0.tgz", + "integrity": "sha512-4mY2tZAu0y0B0567w7013BBXSpsP0+Z48NJvmNo4Y/Pf76yCyz6Jw4P3tUVs10WuYNXXZ+wmHyGWpCek3amJxA==", "dev": true, "license": "MIT", "dependencies": { - "@dimforge/rapier3d-compat": "^0.12.0", + "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", - "@types/webxr": "*", - "@webgpu/types": "*", + "@types/webxr": ">=0.5.17", "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" + "meshoptimizer": "~1.1.1" } }, "node_modules/@types/three/node_modules/@dimforge/rapier3d-compat": { @@ -3070,13 +3069,6 @@ "wavesurfer.js": ">=7.7.14" } }, - "node_modules/@webgpu/types": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.69.tgz", - "integrity": "sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/@yandeu/events": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@yandeu/events/-/events-0.0.7.tgz", @@ -6660,9 +6652,9 @@ } }, "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-1.1.1.tgz", + "integrity": "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g==", "dev": true, "license": "MIT" }, @@ -9176,9 +9168,9 @@ } }, "node_modules/three": { - "version": "0.176.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.176.0.tgz", - "integrity": "sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==", + "version": "0.184.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.184.0.tgz", + "integrity": "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg==", "license": "MIT" }, "node_modules/three-perf": { @@ -10913,12 +10905,12 @@ "@testing-library/jest-dom": "^6.9.1", "@tweakpane/plugin-essentials": "^0.2.1", "@types/express": "^5.0.3", - "@types/three": "^0.176.0", + "@types/three": "^0.184.0", "@vitejs/plugin-react": "^5.1.2", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", "jsdom": "^28.1.0", - "three": "^0.176.0", + "three": "^0.184.0", "three-perf": "^1.0.11", "tweakpane": "^4.0.5", "typescript": "5.9.2", @@ -10932,7 +10924,7 @@ "@geckos.io/server": "^3.0.0", "@tweakpane/plugin-essentials": "^0.2.1", "express": "5.1.0", - "three": "^0.176.0", + "three": "^0.184.0", "three-perf": "^1.0.11", "tweakpane": "^4.0.5", "vite": "^6.3.5", @@ -10973,13 +10965,13 @@ "@testing-library/react": "^16.3.2", "@types/react": "^19.2.10", "@types/react-dom": "^19.2.3", - "@types/three": "^0.176.0", + "@types/three": "^0.184.0", "@vitejs/plugin-react": "^5.1.2", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", "glob": "^10.5.0", "jsdom": "^28.1.0", - "three": "^0.176.0", + "three": "^0.184.0", "typescript": "5.9.2", "vite": "^6.3.5", "vite-plugin-glsl": "^1.4.1", @@ -10987,7 +10979,7 @@ }, "peerDependencies": { "@mavonengine/core": "*", - "three": "^0.176.0" + "three": "^0.184.0" } }, "packages/editor/node_modules/typescript": { diff --git a/packages/core/package.json b/packages/core/package.json index 43a611f..8ec8ff9 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -52,7 +52,7 @@ "@geckos.io/server": "^3.0.0", "@tweakpane/plugin-essentials": "^0.2.1", "express": "5.1.0", - "three": "^0.176.0", + "three": "^0.184.0", "three-perf": "^1.0.11", "tweakpane": "^4.0.5", "vite": "^6.3.5", @@ -65,12 +65,12 @@ "@testing-library/jest-dom": "^6.9.1", "@tweakpane/plugin-essentials": "^0.2.1", "@types/express": "^5.0.3", - "@types/three": "^0.176.0", + "@types/three": "^0.184.0", "@vitejs/plugin-react": "^5.1.2", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", "jsdom": "^28.1.0", - "three": "^0.176.0", + "three": "^0.184.0", "three-perf": "^1.0.11", "tweakpane": "^4.0.5", "typescript": "5.9.2", diff --git a/packages/editor/package.json b/packages/editor/package.json index 769d753..9e1259c 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -39,7 +39,7 @@ }, "peerDependencies": { "@mavonengine/core": "*", - "three": "^0.176.0" + "three": "^0.184.0" }, "dependencies": { "@tweakpane/core": "^2.0.5", @@ -57,13 +57,13 @@ "@testing-library/react": "^16.3.2", "@types/react": "^19.2.10", "@types/react-dom": "^19.2.3", - "@types/three": "^0.176.0", + "@types/three": "^0.184.0", "@vitejs/plugin-react": "^5.1.2", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", "glob": "^10.5.0", "jsdom": "^28.1.0", - "three": "^0.176.0", + "three": "^0.184.0", "typescript": "5.9.2", "vite": "^6.3.5", "vite-plugin-glsl": "^1.4.1", diff --git a/packages/editor/src/Editor/UI/Assets/Assets.tsx b/packages/editor/src/Editor/UI/Assets/Assets.tsx index 8f79782..6620754 100644 --- a/packages/editor/src/Editor/UI/Assets/Assets.tsx +++ b/packages/editor/src/Editor/UI/Assets/Assets.tsx @@ -1,6 +1,7 @@ import type { DragEvent } from 'react' import type { CubeTexture, Object3D, Scene } from 'three' import type { Font, GLTF, SVGResult } from 'three/examples/jsm/Addons.js' +import type { RawImage } from './TextureViewer' import EditorHelper from '@mavonengine/core/Editor/EditorHelper' import Game from '@mavonengine/core/Game' import { getPreviewMap, spawnParticle } from '@mavonengine/core/Particles/System/ParticlePreviewRegistry' @@ -356,7 +357,7 @@ export default () => { > {item instanceof AudioBuffer && } {'scene' in item && } - {item instanceof Texture && } + {item instanceof Texture && } />} {'particleName' in item && } ) @@ -532,7 +533,7 @@ export default () => { onDoubleClick={() => openAsset(key, item)} onDragStart={e => onItemDragStart(e, key)} draggable - src={getTextureUrl(item)} + src={getTextureUrl(item as Texture)} /> ) : ( diff --git a/packages/editor/src/Editor/UI/Assets/TextureViewer.tsx b/packages/editor/src/Editor/UI/Assets/TextureViewer.tsx index eb58e9d..6004a2e 100644 --- a/packages/editor/src/Editor/UI/Assets/TextureViewer.tsx +++ b/packages/editor/src/Editor/UI/Assets/TextureViewer.tsx @@ -3,7 +3,11 @@ import { useEffect, useRef, useState } from 'react' import AssetStats from './AssetStats' import styles from './TextureViewer.module.css' -type RawImage = HTMLImageElement | HTMLCanvasElement | ImageBitmap +export type RawImage = HTMLImageElement | HTMLCanvasElement | ImageBitmap + +function isCubeTexture(t: Texture | CubeTexture): t is CubeTexture { + return Array.isArray(t.image) +} function imageToUrl(img: RawImage): string { if (img instanceof HTMLImageElement) @@ -20,8 +24,8 @@ function imageToUrl(img: RawImage): string { return '' } -export function getTextureUrl(texture: Texture | CubeTexture): string { - const img = Array.isArray(texture.image) ? texture.image[0] : texture.image +export function getTextureUrl(texture: Texture | CubeTexture): string { + const img = isCubeTexture(texture) ? texture.image[0] : texture.image return img ? imageToUrl(img) : '' } @@ -38,7 +42,7 @@ function formatColorSpace(cs: string): string { return cs } -// Three.js CubeTexture face order: +X, -X, +Y, -Y, +Z, -Z +// Three.js CubeTexture face order: +X, -X, +Y, -Y, +Z, -Z // Cross layout (4 cols × 3 rows): // . +Y . . // -X +Z +X -Z @@ -58,9 +62,9 @@ const CUBE_FACES: Array<{ label: string, faceIndex: number } | null> = [ null, // [2,3] ] -export default ({ texture }: { texture: Texture | CubeTexture }) => { - const isCube = Array.isArray(texture.image) - const img = isCube ? texture.image[0] : texture.image +export default ({ texture }: { texture: Texture | CubeTexture }) => { + const isCube = isCubeTexture(texture) + const img = isCubeTexture(texture) ? texture.image[0] : texture.image const width = img?.width ?? 0 const height = img?.height ?? 0 @@ -136,7 +140,7 @@ export default ({ texture }: { texture: Texture | CubeTexture }) => { className={styles.zoomInner} style={{ transform: `translate(${transform.x}px, ${transform.y}px) scale(${transform.scale})` }} > - {isCube + {isCubeTexture(texture) ? (
{CUBE_FACES.map((face, i) => diff --git a/packages/multiplayer-template/client/package.json b/packages/multiplayer-template/client/package.json index 96f8f12..f4b63f5 100644 --- a/packages/multiplayer-template/client/package.json +++ b/packages/multiplayer-template/client/package.json @@ -18,7 +18,7 @@ "@vitejs/plugin-vue": "^5.2.4", "react": "^19.1.0", "react-dom": "^19.1.0", - "three": "^0.176.0", + "three": "^0.184.0", "typescript": "5.9.2", "vite": "^6.3.5", "vite-plugin-glsl": "^1.4.1" diff --git a/packages/multiplayer-template/package-lock.json b/packages/multiplayer-template/package-lock.json index 3843d3e..35c58ce 100644 --- a/packages/multiplayer-template/package-lock.json +++ b/packages/multiplayer-template/package-lock.json @@ -18,7 +18,7 @@ "devDependencies": { "@antfu/eslint-config": "^8.0.0", "@mavonengine/editor": "0.0.7", - "@types/three": "^0.176.0", + "@types/three": "^0.184.0", "concurrently": "^9.1.2", "eslint": "^10.1.0", "tsup": "^8.5.1", @@ -37,12 +37,19 @@ "@vitejs/plugin-vue": "^5.2.4", "react": "^19.1.0", "react-dom": "^19.1.0", - "three": "^0.176.0", + "three": "^0.184.0", "typescript": "5.9.2", "vite": "^6.3.5", "vite-plugin-glsl": "^1.4.1" } }, + "client/node_modules/three": { + "version": "0.184.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.184.0.tgz", + "integrity": "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg==", + "dev": true, + "license": "MIT" + }, "node_modules/@antfu/eslint-config": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-8.0.0.tgz", @@ -1741,19 +1748,18 @@ "license": "MIT" }, "node_modules/@types/three": { - "version": "0.176.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.176.0.tgz", - "integrity": "sha512-FwfPXxCqOtP7EdYMagCFePNKoG1AGBDUEVKtluv2BTVRpSt7b+X27xNsirPCTCqY1pGYsPUzaM3jgWP7dXSxlw==", + "version": "0.184.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.184.0.tgz", + "integrity": "sha512-4mY2tZAu0y0B0567w7013BBXSpsP0+Z48NJvmNo4Y/Pf76yCyz6Jw4P3tUVs10WuYNXXZ+wmHyGWpCek3amJxA==", "dev": true, "license": "MIT", "dependencies": { - "@dimforge/rapier3d-compat": "^0.12.0", + "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", - "@types/webxr": "*", - "@webgpu/types": "*", + "@types/webxr": ">=0.5.17", "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" + "meshoptimizer": "~1.1.1" } }, "node_modules/@types/three/node_modules/@dimforge/rapier3d-compat": { @@ -2199,13 +2205,6 @@ "wavesurfer.js": ">=7.7.14" } }, - "node_modules/@webgpu/types": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.69.tgz", - "integrity": "sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/@yandeu/events": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@yandeu/events/-/events-0.0.7.tgz", @@ -5337,9 +5336,9 @@ } }, "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-1.1.1.tgz", + "integrity": "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g==", "dev": true, "license": "MIT" }, @@ -7490,7 +7489,8 @@ "version": "0.176.0", "resolved": "https://registry.npmjs.org/three/-/three-0.176.0.tgz", "integrity": "sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/three-perf": { "version": "1.0.11", @@ -8785,7 +8785,7 @@ "@dimforge/rapier3d-compat": "0.18.2", "@geckos.io/server": "3.1.0", "express": "5.1.0", - "three": "^0.176.0", + "three": "^0.184.0", "winston": "^3.17.0" }, "devDependencies": { @@ -8793,6 +8793,12 @@ "@types/node": "^24.0.0", "cross-env": "^10.1.0" } + }, + "server/node_modules/three": { + "version": "0.184.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.184.0.tgz", + "integrity": "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg==", + "license": "MIT" } } } diff --git a/packages/multiplayer-template/package.json b/packages/multiplayer-template/package.json index f2d8ae5..90d8378 100644 --- a/packages/multiplayer-template/package.json +++ b/packages/multiplayer-template/package.json @@ -19,7 +19,7 @@ "devDependencies": { "@antfu/eslint-config": "^8.0.0", "@mavonengine/editor": "0.0.7", - "@types/three": "^0.176.0", + "@types/three": "^0.184.0", "concurrently": "^9.1.2", "eslint": "^10.1.0", "tsup": "^8.5.1", diff --git a/packages/multiplayer-template/server/package.json b/packages/multiplayer-template/server/package.json index 07cb203..a0df3c2 100644 --- a/packages/multiplayer-template/server/package.json +++ b/packages/multiplayer-template/server/package.json @@ -14,7 +14,7 @@ "@dimforge/rapier3d-compat": "0.18.2", "@geckos.io/server": "3.1.0", "express": "5.1.0", - "three": "^0.176.0", + "three": "^0.184.0", "winston": "^3.17.0" }, "devDependencies": {