@mml-io/mml-web-threejs 0.24.1 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/elements/ThreeJSAnimation.ts", "../src/elements/ThreeJSAudio.ts", "../src/elements/ThreeJSChatProbe.ts", "../src/elements/ThreeJSCube.ts", "../src/elements/ThreeJSCylinder.ts", "../src/elements/ThreeJSDebugHelper.ts", "../src/elements/ThreeJSFrame.ts", "../src/elements/ThreeJSImage.ts", "../src/elements/ThreeJSInteraction.ts", "../src/elements/ThreeJSLabel.ts", "../src/elements/ThreeJSLight.ts", "../src/elements/ThreeJSLink.ts", "../src/elements/ThreeJSMElement.ts", "../src/elements/ThreeJSModel.ts", "../src/elements/ThreeJSOverlay.ts", "../src/elements/ThreeJSPlane.ts", "../src/elements/ThreeJSPositionProbe.ts", "../src/elements/ThreeJSPrompt.ts", "../src/elements/ThreeJSRemoteDocument.ts", "../src/ThreeJSReconnectingStatus.ts", "../src/elements/ThreeJSSphere.ts", "../src/elements/ThreeJSTransformable.ts", "../src/elements/ThreeJSVideo.ts", "../src/resources/ThreeJSImageHandle.ts", "../src/resources/ThreeJSImageResource.ts", "../src/resources/ThreeJSImageLoader.ts", "../src/resources/ThreeJSLabelHandle.ts", "../src/resources/ThreeJSLabelResource.ts", "../src/resources/ThreeJSModelHandle.ts", "../src/resources/ThreeJSModelResource.ts", "../src/resources/ThreeJSResourceManager.ts", "../src/ThreeJSClickTrigger.ts", "../src/ThreeJSGraphicsInterface.ts", "../src/ThreeJSInteractionAdapter.ts", "../src/ThreeJSMemoryInspector.ts"],
|
|
4
|
-
"sourcesContent": ["import { Animation, Model } from \"@mml-io/mml-web\";\nimport { AnimationGraphics } from \"@mml-io/mml-web\";\nimport { LoadingInstanceManager } from \"@mml-io/mml-web\";\nimport { ModelLoadResult } from \"@mml-io/model-loader\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSModelHandle } from \"../resources/ThreeJSModelHandle\";\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport type ThreeJSAnimationState = {\n animationClip: THREE.AnimationClip | null;\n weight: number;\n speed: number;\n ratio: number | null;\n loop: boolean;\n startTime: number;\n pauseTime: number | null;\n};\n\nexport class ThreeJSAnimation extends AnimationGraphics<ThreeJSGraphicsAdapter> {\n private loadingInstanceManager = new LoadingInstanceManager(`${Animation.tagName}.src`);\n private latestSrcModelHandle: ThreeJSModelHandle | null = null;\n\n private animationState: ThreeJSAnimationState;\n private parentModel: Model<ThreeJSGraphicsAdapter> | null = null;\n\n constructor(private animation: Animation<ThreeJSGraphicsAdapter>) {\n super(animation);\n\n if (animation.parentElement && Model.isModel(animation.parentElement)) {\n this.parentModel = animation.parentElement as Model<ThreeJSGraphicsAdapter>;\n }\n this.animationState = {\n animationClip: null,\n weight: animation.props.weight,\n speed: animation.props.speed,\n ratio: animation.props.ratio,\n loop: animation.props.loop,\n startTime: animation.props.startTime,\n pauseTime: animation.props.pauseTime,\n };\n }\n\n setSrc(src: string | null): void {\n if (this.latestSrcModelHandle?.url === src) {\n // already loading the same src\n return;\n }\n if (this.latestSrcModelHandle) {\n this.latestSrcModelHandle.dispose();\n this.loadingInstanceManager.abortIfLoading();\n }\n this.latestSrcModelHandle = null;\n\n if (this.animationState.animationClip) {\n this.animationState.animationClip = null;\n }\n\n if (!src) {\n this.latestSrcModelHandle = null;\n this.loadingInstanceManager.abortIfLoading();\n return;\n }\n\n const contentSrc = this.animation.contentSrcToContentAddress(src);\n this.loadingInstanceManager.start(this.animation.getLoadingProgressManager(), contentSrc);\n const srcModelHandle = this.animation\n .getScene()\n .getGraphicsAdapter()\n .getResourceManager()\n .loadModel(contentSrc);\n this.latestSrcModelHandle = srcModelHandle;\n srcModelHandle.onProgress((loaded, total) => {\n if (this.latestSrcModelHandle !== srcModelHandle) {\n return;\n }\n this.loadingInstanceManager.setProgress(loaded / total);\n });\n srcModelHandle.onLoad((result: ModelLoadResult | Error) => {\n if (result instanceof Error) {\n console.error(\"Error loading m-animation.src\", result);\n this.latestSrcModelHandle = null;\n this.loadingInstanceManager.error(result);\n return;\n }\n if (this.latestSrcModelHandle !== srcModelHandle || !this.animation.isConnected) {\n return;\n }\n\n const animationClip = result.animations[0];\n\n this.animationState.animationClip = animationClip;\n\n this.updateParentAnimation();\n this.loadingInstanceManager.finish();\n });\n }\n\n parentModelUpdated(): void {\n this.updateParentAnimation();\n }\n\n setWeight(weight: number): void {\n this.animationState.weight = weight;\n this.updateParentAnimation();\n }\n\n setSpeed(speed: number): void {\n this.animationState.speed = speed;\n this.updateParentAnimation();\n }\n\n setRatio(ratio: number | null): void {\n this.animationState.ratio = ratio;\n this.updateParentAnimation();\n }\n\n setLoop(loop: boolean): void {\n this.animationState.loop = loop;\n this.updateParentAnimation();\n }\n\n setStartTime(startTime: number): void {\n this.animationState.startTime = startTime;\n this.updateParentAnimation();\n }\n\n setPauseTime(pauseTime: number | null): void {\n this.animationState.pauseTime = pauseTime;\n this.updateParentAnimation();\n }\n\n private updateParentAnimation() {\n if (!this.parentModel || !this.animationState.animationClip) {\n return;\n }\n\n // notify parent model that anim changed\n if (this.parentModel.modelGraphics) {\n this.parentModel.modelGraphics.updateChildAnimation?.(this.animation, this.animationState);\n } else {\n console.error(\"updateParentAnimation: parent model has no modelGraphics\");\n }\n }\n\n dispose() {\n if (this.latestSrcModelHandle) {\n this.latestSrcModelHandle.dispose();\n }\n this.latestSrcModelHandle = null;\n this.loadingInstanceManager.dispose();\n\n if (this.parentModel && this.parentModel.modelGraphics) {\n this.parentModel.modelGraphics.removeChildAnimation?.(this.animation);\n }\n\n this.animationState.animationClip = null;\n }\n}\n", "import { Audio, MAudioProps } from \"@mml-io/mml-web\";\nimport { AudioGraphics } from \"@mml-io/mml-web\";\nimport { LoadingInstanceManager } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\nimport { PositionalAudioHelper } from \"three/addons/helpers/PositionalAudioHelper.js\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nconst debugAudioSphereSize = 0.25;\nconst debugAudioGeometry = new THREE.SphereGeometry(debugAudioSphereSize, 4, 2);\nconst debugAudioMaterial = new THREE.MeshBasicMaterial({\n wireframe: true,\n fog: false,\n toneMapped: false,\n color: 0x00ff00,\n});\nconst audioRefDistance = 1;\nconst audioRolloffFactor = 1;\n\nfunction extendAudioToDuration(\n context: AudioContext,\n buffer: AudioBuffer,\n seconds: number,\n): AudioBuffer {\n const updatedBuffer = context.createBuffer(\n buffer.numberOfChannels,\n Math.ceil(seconds * buffer.sampleRate),\n buffer.sampleRate,\n );\n for (let channelNumber = 0; channelNumber < buffer.numberOfChannels; channelNumber++) {\n const channelData = buffer.getChannelData(channelNumber);\n const updatedChannelData = updatedBuffer.getChannelData(channelNumber);\n updatedChannelData.set(channelData, 0);\n }\n return updatedBuffer;\n}\n\nexport class ThreeJSAudio extends AudioGraphics<ThreeJSGraphicsAdapter> {\n private audioDebugHelper: THREE.Mesh<THREE.SphereGeometry, THREE.MeshBasicMaterial> | null = null;\n private audioDebugConeX: PositionalAudioHelper | null;\n private audioDebugConeY: PositionalAudioHelper | null;\n private audioContextStateChangedListener = () => {\n this.syncAudioTime();\n };\n\n private documentTimeListener: { remove: () => void };\n private delayedPauseTimer: NodeJS.Timeout | null = null;\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Audio.tagName}.src`);\n\n private positionalAudio: THREE.PositionalAudio;\n\n private loadedAudioState: {\n loadedAudio:\n | {\n mode: \"LOADED\";\n buffer: AudioBuffer;\n currentSource: {\n sourceNode: AudioBufferSourceNode;\n contextStartTime: number;\n } | null;\n paddedBuffer?: {\n buffer: AudioBuffer;\n totalDuration: number;\n };\n }\n | {\n mode: \"LOADING\";\n srcLoadPromise: Promise<AudioBuffer>;\n abortController: AbortController;\n }\n | null;\n currentSrc: string;\n } | null = null;\n\n constructor(private audio: Audio<ThreeJSGraphicsAdapter>) {\n super(audio);\n\n this.documentTimeListener = this.audio.addDocumentTimeListener(() => {\n if (this.loadedAudioState) {\n this.syncAudioTime();\n }\n });\n\n const audioListener = this.getAudioListener();\n this.positionalAudio = new THREE.PositionalAudio(audioListener);\n this.positionalAudio.context.addEventListener(\n \"statechange\",\n this.audioContextStateChangedListener,\n );\n this.positionalAudio.setVolume(this.audio.props.volume);\n this.positionalAudio.setDirectionalCone(\n this.audio.props.coneFalloffAngle ?? 360,\n this.audio.props.coneAngle,\n 0,\n );\n this.positionalAudio.setRefDistance(audioRefDistance);\n this.positionalAudio.setRolloffFactor(audioRolloffFactor);\n this.audio.getContainer().add(this.positionalAudio);\n\n this.updateAudio();\n this.updateDebugVisualisation();\n }\n\n disable(): void {}\n\n enable(): void {}\n\n public syncAudioTime() {\n const audioContext = this.positionalAudio.context;\n if (audioContext.state !== \"running\") {\n return;\n }\n\n if (this.delayedPauseTimer !== null) {\n clearTimeout(this.delayedPauseTimer);\n this.delayedPauseTimer = null;\n }\n\n if (\n !this.loadedAudioState ||\n !this.loadedAudioState.loadedAudio ||\n this.loadedAudioState.loadedAudio.mode !== \"LOADED\"\n ) {\n return;\n }\n\n const loadedAudio = this.loadedAudioState.loadedAudio;\n const audioBuffer = loadedAudio.buffer;\n let currentSource = loadedAudio.currentSource;\n\n if (!this.audio.props.enabled || this.audio.isDisabled()) {\n if (currentSource) {\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n }\n return;\n }\n\n const documentTime = this.audio.getDocumentTime();\n if (this.audio.props.pauseTime !== null) {\n const timeUntilPause = this.audio.props.pauseTime - documentTime;\n if (timeUntilPause < 2) {\n // The audio should be paused because the pauseTime is in the past or very close\n if (currentSource) {\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n }\n return;\n } else {\n // The pause time is in the future\n const delayedPauseTimer = setTimeout(() => {\n if (this.delayedPauseTimer === delayedPauseTimer) {\n this.delayedPauseTimer = null;\n }\n this.syncAudioTime();\n }, timeUntilPause);\n this.delayedPauseTimer = delayedPauseTimer;\n }\n }\n\n const currentTime = (documentTime - this.audio.props.startTime) / 1000;\n const audioDuration = audioBuffer.duration;\n\n let loopDurationSeconds: number | null = null;\n if (this.audio.props.loopDuration !== null && this.audio.props.loopDuration > 0) {\n loopDurationSeconds = this.audio.props.loopDuration / 1000;\n }\n\n let desiredAudioTime: number;\n if (this.audio.props.loop) {\n if (currentTime < 0) {\n desiredAudioTime = currentTime;\n } else {\n if (loopDurationSeconds === null) {\n desiredAudioTime = currentTime % audioDuration;\n } else {\n desiredAudioTime = currentTime % loopDurationSeconds;\n }\n }\n } else {\n desiredAudioTime = currentTime;\n if (desiredAudioTime > audioDuration) {\n // The audio should stop because it has reached the end\n if (currentSource) {\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n }\n return;\n }\n }\n\n const loopDurationLongerThanAudioDuration =\n loopDurationSeconds && loopDurationSeconds > audioDuration;\n const playbackLength = loopDurationSeconds ? loopDurationSeconds : audioDuration;\n\n if (currentSource) {\n if (currentSource.sourceNode.loop !== this.audio.props.loop) {\n // The loop setting has changed - remove the existing audio source and a new one will be created\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else if (\n loopDurationSeconds !== null &&\n loopDurationLongerThanAudioDuration &&\n (!loadedAudio.paddedBuffer || loadedAudio.paddedBuffer.totalDuration < loopDurationSeconds)\n ) {\n /*\n The loop duration is set, and it is longer than the audio file, and\n either there is no existing padding, or the existing padding is too\n short. Dispose of the existing audio source and create a new one.\n */\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else if (\n loopDurationSeconds === null &&\n currentSource.sourceNode.loopEnd !== audioBuffer.duration\n ) {\n // The loop duration has been removed - reset the loop end to the audio duration\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else {\n if (this.audio.props.startTime > documentTime) {\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else {\n const unloopedCurrentAudioPoint =\n (audioContext.currentTime - currentSource.contextStartTime) /\n currentSource.sourceNode.playbackRate.value;\n\n if (unloopedCurrentAudioPoint < 0) {\n // Audio should not be playing yet, so stop it and it will be rescheduled\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else {\n if (\n loopDurationSeconds !== null &&\n currentSource.sourceNode.loopEnd !== loopDurationSeconds\n ) {\n currentSource.sourceNode.loopEnd = loopDurationSeconds;\n }\n\n const currentAudioPoint = unloopedCurrentAudioPoint % playbackLength;\n\n let delta = desiredAudioTime - currentAudioPoint;\n if (this.audio.props.loop) {\n // Check if the delta wrapping around is smaller (i.e. the desired and current are closer together if we wrap around)\n const loopedDelta = delta - playbackLength;\n if (Math.abs(delta) > Math.abs(loopedDelta)) {\n delta = loopedDelta;\n }\n }\n\n if (Math.abs(delta) > 0.5) {\n // We need to skip to the correct point as playback has drifted too far. Remove the audio source and a new one will be created\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else {\n if (Math.abs(delta) < 0.1) {\n // Do nothing - this is close enough - set the playback rate to 1\n currentSource.sourceNode.playbackRate.value = 1;\n } else {\n if (delta > 0) {\n currentSource.sourceNode.playbackRate.value = 1.01;\n } else {\n currentSource.sourceNode.playbackRate.value = 0.99;\n }\n }\n // Calculate a start time that produces the current time as calculated time the next time it is checked\n currentSource.contextStartTime =\n audioContext.currentTime -\n currentAudioPoint / currentSource.sourceNode.playbackRate.value;\n }\n }\n }\n }\n }\n\n if (!currentSource) {\n // There is no current source (or it was removed) - create a new one\n const currentSourceNode = this.positionalAudio.context.createBufferSource();\n\n let buffer = audioBuffer;\n if (loopDurationSeconds && loopDurationLongerThanAudioDuration) {\n // The loop duration requires longer audio than the original audio - pad it with silence\n if (\n loadedAudio.paddedBuffer &&\n loadedAudio.paddedBuffer.totalDuration === loopDurationSeconds\n ) {\n // The padding is already the correct length\n buffer = loadedAudio.paddedBuffer.buffer;\n } else {\n const paddedBuffer = extendAudioToDuration(\n this.positionalAudio.context,\n audioBuffer,\n loopDurationSeconds,\n );\n loadedAudio.paddedBuffer = {\n buffer: paddedBuffer,\n totalDuration: loopDurationSeconds,\n };\n buffer = paddedBuffer;\n }\n }\n\n currentSourceNode.buffer = buffer;\n currentSourceNode.loop = this.audio.props.loop;\n currentSourceNode.loopStart = 0;\n if (loopDurationSeconds) {\n currentSourceNode.loopEnd = loopDurationSeconds;\n } else {\n currentSourceNode.loopEnd = audioBuffer.duration;\n }\n let contextStartTime;\n if (desiredAudioTime < 0) {\n // The audio should not have started yet - schedule it to start in the future\n const timeFromNowToStart = -desiredAudioTime;\n contextStartTime = audioContext.currentTime + timeFromNowToStart;\n currentSourceNode.start(contextStartTime);\n } else {\n /*\n The audio should have been playing already. Start playing from an\n offset into the file and set the contextStartTime to when it should\n have started\n */\n contextStartTime = audioContext.currentTime - desiredAudioTime;\n currentSourceNode.start(0, desiredAudioTime);\n }\n loadedAudio.currentSource = {\n sourceNode: currentSourceNode,\n contextStartTime,\n };\n this.positionalAudio.setNodeSource(currentSourceNode);\n }\n }\n\n private clearAudio() {\n if (this.loadedAudioState) {\n if (this.loadedAudioState.loadedAudio) {\n if (this.loadedAudioState.loadedAudio.mode === \"LOADING\") {\n this.loadedAudioState.loadedAudio.abortController.abort();\n } else {\n if (this.loadedAudioState.loadedAudio.currentSource?.sourceNode) {\n this.loadedAudioState.loadedAudio.currentSource.sourceNode.stop();\n }\n }\n }\n this.loadedAudioState = null;\n }\n }\n\n private updateAudio() {\n if (!this.audio.isConnected) {\n return;\n }\n\n const audioListener = this.getAudioListener();\n const audioContext = audioListener.context;\n\n if (!this.audio.props.src) {\n this.clearAudio();\n } else {\n const contentAddress = this.audio.contentSrcToContentAddress(this.audio.props.src);\n if (this.loadedAudioState && this.loadedAudioState.currentSrc === contentAddress) {\n // Already loaded this audio src\n } else {\n this.clearAudio();\n\n const abortController = new AbortController();\n\n this.srcLoadingInstanceManager.start(\n this.audio.getLoadingProgressManager(),\n contentAddress,\n );\n const srcLoadPromise = this.asyncLoadSourceAsset(\n contentAddress,\n abortController,\n audioContext,\n (loaded, total) => {\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n },\n );\n this.loadedAudioState = {\n loadedAudio: {\n mode: \"LOADING\",\n abortController,\n srcLoadPromise,\n },\n currentSrc: contentAddress,\n };\n srcLoadPromise\n .then((buffer) => {\n if (\n this.loadedAudioState &&\n this.loadedAudioState.loadedAudio?.mode === \"LOADING\" &&\n this.loadedAudioState.loadedAudio.srcLoadPromise === srcLoadPromise\n ) {\n this.loadedAudioState.loadedAudio = {\n mode: \"LOADED\",\n buffer,\n currentSource: null,\n };\n this.srcLoadingInstanceManager.finish();\n this.syncAudioTime();\n }\n })\n .catch((e) => {\n if (\n this.loadedAudioState &&\n this.loadedAudioState.loadedAudio?.mode === \"LOADING\" &&\n this.loadedAudioState.loadedAudio.srcLoadPromise === srcLoadPromise\n ) {\n console.error(\"Failed to load audio\", e);\n this.srcLoadingInstanceManager.error(e);\n this.clearAudio();\n }\n });\n }\n }\n\n this.syncAudioTime();\n }\n\n async asyncLoadSourceAsset(\n contentAddress: string,\n abortController: AbortController,\n audioContext: AudioContext,\n // TODO - implement progress\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onProgress: (loaded: number, total: number) => void,\n ): Promise<AudioBuffer> {\n return new Promise((resolve, reject) => {\n (async () => {\n if (contentAddress.startsWith(\"data:\")) {\n // Construct an AudioBuffer from the data URL\n const base64 = contentAddress.split(\",\", 2)[1];\n if (!base64) {\n reject(new Error(\"Invalid data URL\"));\n return;\n }\n let arrayBuffer;\n\n try {\n const binary = atob(base64);\n const uint8Array = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n uint8Array[i] = binary.charCodeAt(i);\n }\n arrayBuffer = uint8Array.buffer;\n } catch (e) {\n console.error(\"Failed to decode base64 data URL\", e);\n return;\n }\n audioContext\n .decodeAudioData(arrayBuffer)\n .then((audioBuffer) => {\n if (abortController.signal.aborted) {\n return;\n }\n resolve(audioBuffer);\n })\n .catch((e) => {\n console.error(\"Failed to decode data URI audio data\", e);\n });\n return;\n }\n\n const response = await fetch(contentAddress, {\n signal: abortController.signal,\n });\n\n if (response.ok) {\n response\n .arrayBuffer()\n .then((buffer) => {\n if (abortController.signal.aborted) {\n return;\n }\n audioContext.decodeAudioData(buffer).then((audioBuffer) => {\n if (abortController.signal.aborted) {\n return;\n }\n resolve(audioBuffer);\n });\n })\n .catch((e) => {\n console.error(\"Failed to decode fetched audio data\", e);\n });\n } else {\n console.error(\"Failed to fetch audio data\", response);\n }\n })();\n });\n }\n\n setSrc(): void {\n this.updateAudio();\n }\n setStartTime(): void {\n if (this.loadedAudioState) {\n this.syncAudioTime();\n }\n }\n setPauseTime(): void {\n if (this.loadedAudioState) {\n this.syncAudioTime();\n }\n }\n setLoopDuration(): void {\n if (this.loadedAudioState) {\n this.syncAudioTime();\n }\n }\n setLoop(): void {\n this.updateAudio();\n }\n setEnabled(): void {\n this.updateAudio();\n }\n setVolume(volume: number): void {\n this.positionalAudio.setVolume(volume);\n }\n setConeAngle(coneAngle: number | null, mAudioProps: MAudioProps): void {\n this.positionalAudio.setDirectionalCone(\n mAudioProps.coneAngle,\n mAudioProps.coneFalloffAngle ?? 360,\n 0,\n );\n this.updateDebugVisualisation();\n }\n setConeFalloffAngle(coneFalloffAngle: number | null, mAudioProps: MAudioProps): void {\n this.positionalAudio.setDirectionalCone(\n mAudioProps.coneAngle,\n mAudioProps.coneFalloffAngle ?? 360,\n 0,\n );\n this.updateDebugVisualisation();\n }\n\n setDebug(): void {\n this.updateDebugVisualisation();\n }\n\n dispose() {\n if (this.positionalAudio) {\n this.positionalAudio.context.removeEventListener(\n \"statechange\",\n this.audioContextStateChangedListener,\n );\n this.positionalAudio.disconnect();\n this.positionalAudio.removeFromParent();\n }\n\n this.clearAudio();\n\n if (this.delayedPauseTimer) {\n clearTimeout(this.delayedPauseTimer);\n this.delayedPauseTimer = null;\n }\n this.documentTimeListener.remove();\n this.clearDebugVisualisation();\n this.srcLoadingInstanceManager.dispose();\n }\n\n private clearDebugVisualisation() {\n if (this.audioDebugHelper) {\n this.audioDebugHelper.removeFromParent();\n this.audioDebugHelper = null;\n }\n if (this.audioDebugConeX) {\n this.audioDebugConeX.removeFromParent();\n this.audioDebugConeX = null;\n this.audioDebugConeY?.removeFromParent();\n this.audioDebugConeY = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.audio.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (!this.audioDebugHelper) {\n this.audioDebugHelper = new THREE.Mesh(debugAudioGeometry, debugAudioMaterial);\n this.audio.getContainer().add(this.audioDebugHelper);\n }\n if (!this.audioDebugConeX && this.audio.props.coneAngle) {\n this.audioDebugConeX = new PositionalAudioHelper(this.positionalAudio, 10);\n this.positionalAudio.add(this.audioDebugConeX);\n this.audioDebugConeY = new PositionalAudioHelper(this.positionalAudio, 10);\n this.audioDebugConeY.rotation.z = Math.PI / 2;\n this.positionalAudio.add(this.audioDebugConeY);\n }\n if (!this.audio.props.coneAngle && this.audioDebugConeX) {\n this.audioDebugConeX.removeFromParent();\n this.audioDebugConeX = null;\n this.audioDebugConeY?.removeFromParent();\n this.audioDebugConeY = null;\n }\n }\n this.audioDebugConeX?.update();\n this.audioDebugConeY?.update();\n }\n\n private getAudioListener() {\n return this.audio.getScene().getGraphicsAdapter().getAudioListener();\n }\n}\n", "import { ChatProbe } from \"@mml-io/mml-web\";\nimport { ChatProbeGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSChatProbe extends ChatProbeGraphics<ThreeJSGraphicsAdapter> {\n private static DebugGeometry = new THREE.SphereGeometry(1, 16, 16, 1);\n private static DebugMaterial = new THREE.MeshBasicMaterial({\n color: 0xffff00,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n\n private debugMesh: THREE.Mesh<THREE.SphereGeometry, THREE.MeshBasicMaterial> | null = null;\n\n constructor(private chatProbe: ChatProbe<ThreeJSGraphicsAdapter>) {\n super(chatProbe);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setRange(): void {\n this.updateDebugVisualisation();\n }\n\n setDebug() {\n this.updateDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.debugMesh) {\n this.debugMesh.removeFromParent();\n this.debugMesh = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.chatProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.chatProbe.isConnected && !this.debugMesh) {\n const mesh = new THREE.Mesh(ThreeJSChatProbe.DebugGeometry, ThreeJSChatProbe.DebugMaterial);\n mesh.castShadow = false;\n mesh.receiveShadow = false;\n this.debugMesh = mesh;\n this.chatProbe.getContainer().add(this.debugMesh);\n }\n\n if (this.debugMesh) {\n this.debugMesh.scale.set(\n this.chatProbe.props.range,\n this.chatProbe.props.range,\n this.chatProbe.props.range,\n );\n }\n }\n }\n\n dispose() {\n this.clearDebugVisualisation();\n }\n}\n", "import { Cube } from \"@mml-io/mml-web\";\nimport { CubeGraphics } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSCube extends CubeGraphics<ThreeJSGraphicsAdapter> {\n static boxGeometry = new THREE.BoxGeometry(1, 1, 1);\n private mesh: THREE.Mesh<THREE.BoxGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial;\n constructor(private cube: Cube<ThreeJSGraphicsAdapter>) {\n super(cube);\n\n this.material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(cube.props.color.r, cube.props.color.g, cube.props.color.b),\n });\n this.mesh = new THREE.Mesh(ThreeJSCube.boxGeometry, this.material);\n this.mesh.castShadow = cube.props.castShadows;\n this.mesh.receiveShadow = true;\n this.cube.getContainer().add(this.mesh);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D<THREE.Object3DEventMap> {\n return this.mesh;\n }\n\n setColor(color: MMLColor): void {\n this.material.color = new THREE.Color(color.r, color.g, color.b);\n }\n\n setWidth(width: number): void {\n this.mesh.scale.x = width;\n }\n\n setHeight(height: number): void {\n this.mesh.scale.y = height;\n }\n\n setDepth(depth: number): void {\n this.mesh.scale.z = depth;\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n setOpacity(opacity: number): void {\n const needsUpdate = this.material.transparent === (opacity === 1);\n this.material.transparent = opacity !== 1;\n this.material.needsUpdate = needsUpdate;\n this.material.opacity = opacity;\n }\n\n dispose() {}\n}\n", "import { Cylinder, CylinderGraphics, MMLColor } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSCylinder extends CylinderGraphics<ThreeJSGraphicsAdapter> {\n static cylinderGeometry = new THREE.CylinderGeometry(0.5, 0.5, 1);\n private mesh: THREE.Mesh<THREE.CylinderGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial;\n\n constructor(private cylinder: Cylinder<ThreeJSGraphicsAdapter>) {\n super(cylinder);\n\n this.material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(\n cylinder.props.color.r,\n cylinder.props.color.g,\n cylinder.props.color.b,\n ),\n });\n this.mesh = new THREE.Mesh(ThreeJSCylinder.cylinderGeometry, this.material);\n this.mesh.castShadow = cylinder.props.castShadows;\n this.mesh.receiveShadow = true;\n this.cylinder.getContainer().add(this.mesh);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n setColor(color: MMLColor): void {\n this.material.color = new THREE.Color(color.r, color.g, color.b);\n }\n\n setRadius(radius: number): void {\n this.mesh.scale.x = radius * 2;\n this.mesh.scale.z = radius * 2;\n }\n\n setHeight(height: number): void {\n this.mesh.scale.y = height;\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n setOpacity(opacity: number): void {\n const needsUpdate = this.material.transparent === (opacity === 1);\n this.material.transparent = opacity !== 1;\n this.material.needsUpdate = needsUpdate;\n this.material.opacity = opacity;\n }\n\n dispose() {}\n}\n", "import { DebugHelper, DebugHelperGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSDebugHelper extends DebugHelperGraphics<ThreeJSGraphicsAdapter> {\n private debugAxes: THREE.AxesHelper | null = null;\n\n constructor(private debugHelper: DebugHelper<ThreeJSGraphicsAdapter>) {\n super(debugHelper);\n this.debugAxes = new THREE.AxesHelper(1);\n this.debugHelper.getContainer().add(this.debugAxes);\n }\n\n dispose() {\n if (this.debugAxes) {\n this.debugHelper.getContainer().remove(this.debugAxes);\n }\n this.debugAxes = null;\n }\n}\n", "import { Frame } from \"@mml-io/mml-web\";\nimport { FrameGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nfunction setMeshToBoundingBox(\n mesh: THREE.Mesh,\n minX: number,\n maxX: number,\n minY: number,\n maxY: number,\n minZ: number,\n maxZ: number,\n) {\n mesh.scale.set(maxX - minX, maxY - minY, maxZ - minZ);\n mesh.position.set((maxX + minX) / 2, (maxY + minY) / 2, (maxZ + minZ) / 2);\n}\n\nexport class ThreeJSFrame extends FrameGraphics<ThreeJSGraphicsAdapter> {\n private static DebugBoxGeometry = new THREE.BoxGeometry(1, 1, 1, 1, 1, 1);\n private static DebugConstraintMaterial = new THREE.MeshBasicMaterial({\n color: 0xff0000,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n private static DebugLoadRangeMaterial = new THREE.MeshBasicMaterial({\n color: 0x00ff00,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n private static DebugUnloadRangeMaterial = new THREE.MeshBasicMaterial({\n color: 0x0000ff,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n\n private debugMeshes: {\n debugBoxConstraintMesh: THREE.Mesh<THREE.BoxGeometry, THREE.MeshBasicMaterial>;\n debugBoxLoadRangeMesh: THREE.Mesh<THREE.BoxGeometry, THREE.MeshBasicMaterial>;\n debugBoxUnloadRangeMesh: THREE.Mesh<THREE.BoxGeometry, THREE.MeshBasicMaterial>;\n } | null = null;\n\n constructor(private frame: Frame<ThreeJSGraphicsAdapter>) {\n super(frame);\n }\n\n setSrc() {\n // no-op\n }\n\n setDebug(): void {\n this.updateDebugVisualisation();\n }\n setLoadRange(): void {\n this.updateDebugVisualisation();\n }\n setUnloadRange(): void {\n this.updateDebugVisualisation();\n }\n setMinX(): void {\n this.updateDebugVisualisation();\n }\n setMaxX(): void {\n this.updateDebugVisualisation();\n }\n setMinY(): void {\n this.updateDebugVisualisation();\n }\n setMaxY(): void {\n this.updateDebugVisualisation();\n }\n setMinZ(): void {\n this.updateDebugVisualisation();\n }\n setMaxZ(): void {\n this.updateDebugVisualisation();\n }\n\n disable(): void {}\n\n enable(): void {}\n\n dispose() {}\n\n private clearDebugVisualisation() {\n if (this.debugMeshes) {\n this.debugMeshes.debugBoxConstraintMesh.removeFromParent();\n this.debugMeshes.debugBoxLoadRangeMesh.removeFromParent();\n this.debugMeshes.debugBoxUnloadRangeMesh.removeFromParent();\n this.debugMeshes = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.frame.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (!this.frame.isConnected) {\n return;\n }\n if (!this.debugMeshes) {\n this.debugMeshes = {\n debugBoxConstraintMesh: new THREE.Mesh(\n ThreeJSFrame.DebugBoxGeometry,\n ThreeJSFrame.DebugConstraintMaterial,\n ),\n debugBoxLoadRangeMesh: new THREE.Mesh(\n ThreeJSFrame.DebugBoxGeometry,\n ThreeJSFrame.DebugLoadRangeMaterial,\n ),\n debugBoxUnloadRangeMesh: new THREE.Mesh(\n ThreeJSFrame.DebugBoxGeometry,\n ThreeJSFrame.DebugUnloadRangeMaterial,\n ),\n };\n this.frame.getContainer().add(this.debugMeshes.debugBoxConstraintMesh);\n this.frame.getContainer().add(this.debugMeshes.debugBoxLoadRangeMesh);\n this.frame.getContainer().add(this.debugMeshes.debugBoxUnloadRangeMesh);\n }\n\n let boxBounds = this.frame.getDefinedBoxBounds();\n if (!boxBounds) {\n boxBounds = [0, 0, 0, 0, 0, 0];\n }\n\n const [minX, maxX, minY, maxY, minZ, maxZ] = boxBounds;\n this.debugMeshes.debugBoxConstraintMesh.visible = true;\n this.debugMeshes.debugBoxLoadRangeMesh.visible = true;\n this.debugMeshes.debugBoxUnloadRangeMesh.visible = true;\n\n setMeshToBoundingBox(\n this.debugMeshes.debugBoxConstraintMesh,\n minX,\n maxX,\n minY,\n maxY,\n minZ,\n maxZ,\n );\n\n if (this.frame.props.loadRange === null) {\n this.debugMeshes.debugBoxLoadRangeMesh.visible = false;\n this.debugMeshes.debugBoxUnloadRangeMesh.visible = false;\n } else {\n this.debugMeshes.debugBoxLoadRangeMesh.visible = true;\n this.debugMeshes.debugBoxUnloadRangeMesh.visible = true;\n\n setMeshToBoundingBox(\n this.debugMeshes.debugBoxLoadRangeMesh,\n minX - this.frame.props.loadRange,\n maxX + this.frame.props.loadRange,\n minY - this.frame.props.loadRange,\n maxY + this.frame.props.loadRange,\n minZ - this.frame.props.loadRange,\n maxZ + this.frame.props.loadRange,\n );\n\n setMeshToBoundingBox(\n this.debugMeshes.debugBoxUnloadRangeMesh,\n minX - this.frame.props.loadRange - this.frame.props.unloadRange,\n maxX + this.frame.props.loadRange + this.frame.props.unloadRange,\n minY - this.frame.props.loadRange - this.frame.props.unloadRange,\n maxY + this.frame.props.loadRange + this.frame.props.unloadRange,\n minZ - this.frame.props.loadRange - this.frame.props.unloadRange,\n maxZ + this.frame.props.loadRange + this.frame.props.unloadRange,\n );\n }\n }\n }\n}\n", "import {\n calculateContentSize,\n Image,\n ImageGraphics,\n LoadingInstanceManager,\n} from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSImageHandle, ThreeJSImageResourceResult } from \"../resources/ThreeJSImageHandle\";\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSImage extends ImageGraphics<ThreeJSGraphicsAdapter> {\n private static planeGeometry = new THREE.PlaneGeometry(1, 1);\n private mesh: THREE.Mesh<THREE.PlaneGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial;\n\n private latestImageHandle: ThreeJSImageHandle | null = null;\n private loadedImageDimensions: { width: number; height: number } | null;\n private loadedImageHasTransparency = false;\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Image.tagName}.src`);\n constructor(\n private image: Image<ThreeJSGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(image, updateMeshCallback);\n\n this.material = new THREE.MeshStandardMaterial({\n color: 0xffffff,\n transparent: this.image.props.opacity !== 1 || this.loadedImageHasTransparency,\n opacity: this.image.props.opacity,\n side: THREE.DoubleSide,\n });\n this.mesh = new THREE.Mesh(ThreeJSImage.planeGeometry, this.material);\n this.mesh.castShadow = image.props.castShadows;\n this.mesh.receiveShadow = true;\n this.image.getContainer().add(this.mesh);\n }\n\n public getWidthAndHeight(): { width: number; height: number } {\n return {\n width: this.mesh.scale.x,\n height: this.mesh.scale.y,\n };\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n setWidth(): void {\n this.updateWidthAndHeight();\n }\n\n setHeight(): void {\n this.updateWidthAndHeight();\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n setOpacity(opacity: number): void {\n const shouldBeTransparent = opacity !== 1 || this.loadedImageHasTransparency;\n const needsUpdate = this.material.transparent !== shouldBeTransparent;\n\n this.material.transparent = shouldBeTransparent;\n this.material.opacity = opacity;\n\n if (needsUpdate) {\n this.material.needsUpdate = true;\n }\n }\n\n setEmissive() {\n this.updateMaterialEmissiveIntensity();\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.material) {\n const map = this.material.map as THREE.Texture;\n if (this.image.props.emissive > 0) {\n this.material.emissive = new THREE.Color(0xffffff);\n this.material.emissiveMap = map;\n this.material.emissiveIntensity = this.image.props.emissive;\n this.material.needsUpdate = true;\n } else {\n this.material.emissive = new THREE.Color(0x000000);\n this.material.emissiveMap = null;\n this.material.emissiveIntensity = 1;\n this.material.needsUpdate = true;\n }\n }\n }\n\n setSrc(newValue: string | null): void {\n if (this.latestImageHandle?.url === newValue) {\n // already loading the same src\n return;\n }\n if (this.latestImageHandle) {\n this.latestImageHandle.dispose();\n this.srcLoadingInstanceManager.abortIfLoading();\n }\n this.latestImageHandle = null;\n\n const src = (newValue || \"\").trim();\n const isDataUri = src.startsWith(\"data:image/\");\n if (this.loadedImageDimensions !== null && !isDataUri) {\n // if the image has already been loaded, remove the image data from the THREE material\n this.clearImage();\n }\n if (!src) {\n // if the src attribute is empty, reset the dimensions and return\n this.updateWidthAndHeight();\n this.srcLoadingInstanceManager.abortIfLoading();\n return;\n }\n if (!this.material) {\n // if the element is not yet connected, return\n return;\n }\n\n if (isDataUri) {\n // if the src is a data url, load it directly rather than using the loader - this avoids a potential frame skip\n const image = document.createElement(\"img\");\n image.src = src;\n this.loadedImageDimensions = {\n width: image.width,\n height: image.height,\n };\n const finalize = () => {\n const texture = new THREE.CanvasTexture(image);\n const result: ThreeJSImageResourceResult = {\n texture,\n width: image.width,\n height: image.height,\n hasTransparency: hasTransparency(image),\n };\n this.applyTexture(result);\n };\n if (image.complete) {\n finalize();\n } else {\n image.addEventListener(\"load\", finalize);\n }\n this.srcLoadingInstanceManager.abortIfLoading();\n return;\n }\n\n const contentSrc = this.image.contentSrcToContentAddress(src);\n this.srcLoadingInstanceManager.start(this.image.getLoadingProgressManager(), contentSrc);\n const imageHandle = this.image\n .getScene()\n .getGraphicsAdapter()\n .getResourceManager()\n .loadImage(contentSrc);\n this.latestImageHandle = imageHandle;\n imageHandle.onProgress((loaded, total) => {\n if (this.latestImageHandle !== imageHandle) {\n return;\n }\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n });\n imageHandle.onLoad((result: ThreeJSImageResourceResult | Error) => {\n if (result instanceof Error) {\n console.error(\"Error loading image:\", newValue, result);\n this.srcLoadingInstanceManager.error(result);\n return;\n }\n if (this.latestImageHandle !== imageHandle || !this.material) {\n // If we've loaded a different image since, or we're no longer connected, ignore this image\n return;\n }\n this.applyTexture(result);\n this.srcLoadingInstanceManager.finish();\n });\n }\n\n private updateWidthAndHeight() {\n const mesh = this.mesh;\n\n const { width, height } = calculateContentSize({\n content: this.loadedImageDimensions\n ? { width: this.loadedImageDimensions.width, height: this.loadedImageDimensions.height }\n : undefined,\n width: this.image.props.width,\n height: this.image.props.height,\n });\n mesh.scale.x = width;\n mesh.scale.y = height;\n\n this.updateMeshCallback();\n }\n\n private applyTexture(result: ThreeJSImageResourceResult) {\n this.loadedImageHasTransparency = result.hasTransparency;\n if (!this.material) {\n return;\n }\n\n this.loadedImageDimensions = {\n width: result.width,\n height: result.height,\n };\n this.material.map = result.texture;\n this.material.transparent = this.image.props.opacity !== 1 || result.hasTransparency;\n this.material.alphaTest = 0.01;\n this.material.needsUpdate = true;\n this.updateMaterialEmissiveIntensity();\n this.updateWidthAndHeight();\n }\n\n private clearImage() {\n this.loadedImageDimensions = null;\n if (this.material && this.material.map) {\n // Do not dispose shared texture here\n this.material.needsUpdate = true;\n this.material.map = null;\n this.material.alphaMap = null;\n this.material.alphaTest = 0;\n }\n this.updateWidthAndHeight();\n }\n\n dispose() {\n if (this.latestImageHandle) {\n this.latestImageHandle.dispose();\n }\n this.latestImageHandle = null;\n // Do not dispose shared texture\n this.material.map = null;\n if (this.material.emissiveMap) {\n this.material.emissiveMap.dispose();\n this.material.emissiveMap = null;\n }\n this.material.dispose();\n this.loadedImageDimensions = null;\n this.srcLoadingInstanceManager.dispose();\n }\n}\n\nfunction hasTransparency(image: HTMLImageElement) {\n if (image.width === 0 || image.height === 0) {\n return false;\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = image.width;\n canvas.height = image.height;\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true }) as CanvasRenderingContext2D;\n ctx.drawImage(image, 0, 0);\n\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;\n\n for (let i = 3, n = imageData.length; i < n; i += 4) {\n if (imageData[i] < 255) {\n return true;\n }\n }\n return false;\n}\n", "import { Interaction } from \"@mml-io/mml-web\";\nimport { InteractionGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSInteraction extends InteractionGraphics<ThreeJSGraphicsAdapter> {\n private static DebugGeometry = new THREE.SphereGeometry(1, 16, 16, 1);\n private static DebugMaterial = new THREE.MeshBasicMaterial({\n color: 0x00aa00,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n\n private debugMesh: THREE.Mesh<THREE.SphereGeometry, THREE.MeshBasicMaterial> | null = null;\n\n constructor(private positionProbe: Interaction<ThreeJSGraphicsAdapter>) {\n super(positionProbe);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setRange(): void {\n this.updateDebugVisualisation();\n }\n\n setInFocus(): void {\n // no-op\n }\n\n setLineOfSight(): void {\n // no-op\n }\n\n setPriority(): void {\n // no-op\n }\n\n setPrompt(): void {\n // no-op\n }\n\n setDebug() {\n this.updateDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.debugMesh) {\n this.debugMesh.removeFromParent();\n this.debugMesh = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.positionProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.positionProbe.isConnected && !this.debugMesh) {\n const mesh = new THREE.Mesh(\n ThreeJSInteraction.DebugGeometry,\n ThreeJSInteraction.DebugMaterial,\n );\n mesh.castShadow = false;\n mesh.receiveShadow = false;\n this.debugMesh = mesh;\n this.positionProbe.getContainer().add(this.debugMesh);\n }\n\n if (this.debugMesh) {\n this.debugMesh.scale.set(\n this.positionProbe.props.range,\n this.positionProbe.props.range,\n this.positionProbe.props.range,\n );\n }\n }\n }\n\n dispose() {\n this.clearDebugVisualisation();\n }\n}\n", "import { Label, LabelGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSLabelHandle, ThreeJSLabelResourceResult } from \"../resources/ThreeJSLabelHandle\";\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSLabel extends LabelGraphics<ThreeJSGraphicsAdapter> {\n static labelGeometry = new THREE.PlaneGeometry(1, 1);\n private mesh: THREE.Mesh<THREE.PlaneGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial | null = null;\n private latestLabelHandle: ThreeJSLabelHandle | null = null;\n private shouldDrawText: boolean = false;\n\n constructor(private label: Label<ThreeJSGraphicsAdapter>) {\n super(label);\n\n this.material = new THREE.MeshStandardMaterial({\n transparent: false,\n });\n this.mesh = new THREE.Mesh(ThreeJSLabel.labelGeometry, this.material);\n this.mesh.material = this.material;\n this.mesh.scale.x = this.label.props.width;\n this.mesh.scale.y = this.label.props.height;\n this.mesh.castShadow = this.label.props.castShadows;\n this.mesh.receiveShadow = true;\n this.redrawText();\n this.label.getContainer().add(this.mesh);\n }\n\n allAttributesObserved(): void {\n // Only start drawing text after all attributes have been observed\n this.shouldDrawText = true;\n this.redrawText();\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n setContent(): void {\n this.redrawText();\n }\n\n setAlignment(): void {\n this.redrawText();\n }\n\n setFontSize(): void {\n this.redrawText();\n }\n\n setPadding(): void {\n this.redrawText();\n }\n\n setFontColor(): void {\n this.redrawText();\n }\n\n setEmissive(): void {\n this.updateMaterialEmissiveIntensity();\n }\n\n setColor(): void {\n this.redrawText();\n }\n\n setWidth(width: number): void {\n this.mesh.scale.x = width;\n this.redrawText();\n }\n\n setHeight(height: number): void {\n this.mesh.scale.y = height;\n this.redrawText();\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n private redrawText() {\n if (!this.shouldDrawText) {\n return;\n }\n if (!this.material) {\n return;\n }\n if (this.latestLabelHandle) {\n this.latestLabelHandle.dispose();\n this.latestLabelHandle = null;\n }\n\n // Clamp the width and height to 1024px whilst maintaining the aspect ratio\n const desiredWidth = this.label.props.width * 200;\n const desiredHeight = this.label.props.height * 200;\n\n const handle = this.label\n .getScene()\n .getGraphicsAdapter()\n .getResourceManager()\n .loadLabel({\n content: this.label.props.content,\n fontSize: this.label.props.fontSize * 2,\n paddingPx: this.label.props.padding,\n textColorRGB255A1: {\n r: this.label.props.fontColor.r * 255,\n g: this.label.props.fontColor.g * 255,\n b: this.label.props.fontColor.b * 255,\n a: this.label.props.fontColor.a ?? 1,\n },\n backgroundColorRGB255A1: {\n r: this.label.props.color.r * 255,\n g: this.label.props.color.g * 255,\n b: this.label.props.color.b * 255,\n a: this.label.props.color.a ?? 1,\n },\n dimensions: {\n width: desiredWidth,\n height: desiredHeight,\n },\n alignment: this.label.props.alignment,\n bold: true,\n });\n\n this.latestLabelHandle = handle;\n\n const apply = (result: ThreeJSLabelResourceResult | Error) => {\n if (result instanceof Error || !this.material) {\n return;\n }\n this.material.map = result.texture;\n const hasTransparency = (this.label.props.color.a ?? 1) < 1;\n this.material.transparent = hasTransparency;\n this.material.alphaTest = hasTransparency ? 0.01 : 0;\n this.material.needsUpdate = true;\n this.updateMaterialEmissiveIntensity();\n };\n\n const result = handle.getResult();\n if (result) {\n apply(result);\n } else {\n handle.onLoad(apply);\n }\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.material) {\n const map = this.material.map as THREE.Texture;\n if (this.label.props.emissive > 0) {\n this.material.emissive = new THREE.Color(0xffffff);\n this.material.emissiveMap = map;\n this.material.emissiveIntensity = this.label.props.emissive;\n this.material.needsUpdate = true;\n } else {\n this.material.emissive = new THREE.Color(0x000000);\n this.material.emissiveMap = null;\n this.material.emissiveIntensity = 1;\n this.material.needsUpdate = true;\n }\n }\n }\n\n dispose() {\n if (this.latestLabelHandle) {\n this.latestLabelHandle.dispose();\n this.latestLabelHandle = null;\n }\n if (this.material) {\n // Do not dispose shared texture here\n this.material.map = null;\n if (this.material.emissiveMap) {\n this.material.emissiveMap.dispose();\n this.material.emissiveMap = null;\n }\n this.material.dispose();\n this.material = null;\n }\n }\n}\n", "import { Light, LightTypes } from \"@mml-io/mml-web\";\nimport { LightGraphics } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\ndeclare type LightHelper = THREE.PointLightHelper | THREE.SpotLightHelper;\n\nconst debugSphereSize = 0.25;\n\nexport class ThreeJSLight extends LightGraphics<ThreeJSGraphicsAdapter> {\n private threeLight: THREE.PointLight | THREE.SpotLight;\n private threeLightHelper: LightHelper | null;\n\n constructor(private light: Light<ThreeJSGraphicsAdapter>) {\n super(light);\n this.createLight();\n }\n\n private createLight() {\n if (this.threeLight) {\n this.threeLight.removeFromParent();\n }\n\n const { r, g, b } = this.light.props.color;\n const color = new THREE.Color(r, g, b);\n\n switch (this.light.props.type) {\n case LightTypes.spotlight: {\n const light = new THREE.SpotLight(\n color,\n this.light.props.intensity,\n this.light.props.distance ?? undefined,\n THREE.MathUtils.degToRad(this.light.props.angleDeg),\n );\n // create a target\n const target = new THREE.Object3D();\n target.position.set(0, -1, 0);\n light.position.set(0, 0, 0);\n light.add(target);\n light.target = target;\n this.threeLight = light;\n break;\n }\n case LightTypes.point:\n this.threeLight = new THREE.PointLight(\n color,\n this.light.props.intensity,\n this.light.props.distance ?? undefined,\n );\n break;\n }\n\n if (this.threeLight.shadow) {\n this.threeLight.castShadow = this.light.props.castShadows;\n this.threeLight.shadow.mapSize.width = 512;\n this.threeLight.shadow.mapSize.height = 512;\n if (this.threeLight.shadow.camera.isPerspectiveCamera) {\n this.threeLight.shadow.camera.near = 0.5;\n this.threeLight.shadow.camera.far = 500;\n }\n this.threeLight.shadow.bias = -0.001;\n this.threeLight.shadow.normalBias = 0.01;\n const d = 10;\n const c = this.threeLight.shadow.camera as any;\n c.left = -d;\n c.right = d;\n c.top = d;\n c.bottom = -d;\n }\n\n this.threeLight.intensity = this.light.props.intensity;\n\n this.light.getContainer().add(this.threeLight);\n\n if (this.threeLightHelper) {\n this.makeLightHelper();\n }\n if (!this.light.props.enabled) {\n this.threeLight.visible = false;\n if (this.threeLightHelper) {\n this.threeLightHelper.visible = false;\n }\n }\n }\n\n private makeLightHelper() {\n if (this.threeLightHelper) {\n this.threeLightHelper.removeFromParent();\n this.threeLightHelper = null;\n }\n\n if (this.light instanceof THREE.PointLight) {\n this.threeLightHelper = new THREE.PointLightHelper(this.light, debugSphereSize);\n } else if (this.light instanceof THREE.SpotLight) {\n this.threeLightHelper = new THREE.SpotLightHelper(this.light);\n }\n\n if (this.threeLightHelper) {\n this.light.getContainer().add(this.threeLightHelper);\n this.threeLightHelper.matrix = this.threeLight.matrix;\n this.threeLightHelper.visible = this.threeLight.visible;\n }\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setEnabled(enabled: boolean): void {\n this.threeLight.visible = enabled;\n if (this.threeLightHelper) {\n this.threeLightHelper.visible = enabled;\n }\n }\n\n setCastShadows(castShadows: boolean) {\n this.threeLight.castShadow = castShadows;\n }\n\n setAngle(angle: number) {\n if ((this.threeLight as THREE.SpotLight).isSpotLight) {\n (this.threeLight as THREE.SpotLight).angle = THREE.MathUtils.degToRad(angle);\n }\n }\n\n setIntensity(intensity: number) {\n this.threeLight.intensity = intensity;\n }\n\n setDistance(distance: number) {\n this.threeLight.distance = distance;\n }\n\n setType(): void {\n this.createLight();\n }\n\n setDebug(debug: boolean): void {\n if (debug && !this.threeLightHelper) {\n this.makeLightHelper();\n } else if (!debug && this.threeLightHelper) {\n this.threeLightHelper.removeFromParent();\n this.threeLightHelper = null;\n }\n }\n\n setColor(color: MMLColor): void {\n this.threeLight.color.set(new THREE.Color(color.r, color.g, color.b));\n if (this.threeLightHelper) {\n this.threeLightHelper.color = new THREE.Color(color.r, color.g, color.b);\n }\n }\n\n dispose() {\n this.light.getContainer().remove(this.threeLight);\n if (this.threeLightHelper) {\n this.threeLightHelper.removeFromParent();\n }\n }\n}\n", "import { Link } from \"@mml-io/mml-web\";\nimport { LinkGraphics } from \"@mml-io/mml-web\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSLink extends LinkGraphics<ThreeJSGraphicsAdapter> {\n constructor(private link: Link<ThreeJSGraphicsAdapter>) {\n super(link);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setHref(): void {\n // no-op\n }\n\n setTarget(): void {\n // no-op\n }\n\n dispose() {}\n}\n", "import { MElement, MELEMENT_PROPERTY_NAME } from \"@mml-io/mml-web\";\nimport { MElementGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSMElement extends MElementGraphics<ThreeJSGraphicsAdapter> {\n protected container: THREE.Object3D;\n private currentParentContainer: THREE.Object3D | null = null;\n\n constructor(private element: MElement<ThreeJSGraphicsAdapter>) {\n super(element);\n this.container = new THREE.Group();\n this.container.name = this.constructor.name;\n (this.container as any)[MELEMENT_PROPERTY_NAME] = element;\n\n if (this.currentParentContainer !== null) {\n throw new Error(\"Already connected to a parent\");\n }\n\n const mElementParent = this.element.getMElementParent();\n if (mElementParent) {\n this.currentParentContainer = mElementParent.getContainer();\n this.currentParentContainer.add(this.container);\n return;\n }\n\n // If none of the ancestors are MElements then this element may be directly connected to the body (without a wrapper).\n // Attempt to use a global scene that has been configured to attach this element to.\n const scene = this.element.getScene();\n this.currentParentContainer = scene.getGraphicsAdapter().getRootContainer();\n this.currentParentContainer.add(this.container);\n }\n\n public getContainer(): THREE.Object3D {\n return this.container;\n }\n\n public dispose() {\n if (this.currentParentContainer === null) {\n throw new Error(\"Was not connected to a parent\");\n }\n\n this.currentParentContainer.remove(this.container);\n this.currentParentContainer = null;\n }\n}\n", "import { Animation, MElement, Model, TransformableElement } from \"@mml-io/mml-web\";\nimport { ModelGraphics } from \"@mml-io/mml-web\";\nimport { LoadingInstanceManager } from \"@mml-io/mml-web\";\nimport { IVect3 } from \"@mml-io/mml-web\";\nimport { ModelLoadResult } from \"@mml-io/model-loader\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSModelHandle } from \"../resources/ThreeJSModelHandle\";\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\nimport { ThreeJSAnimationState } from \"./ThreeJSAnimation\";\n\ntype ThreeJSModelLoadState = {\n group: THREE.Object3D;\n bones: Map<string, THREE.Bone>;\n nodeNames: Set<string>;\n boundingBox: {\n size: THREE.Vector3;\n centerOffset: THREE.Vector3;\n };\n};\n\ntype ThreeJSModelAnimState = {\n currentAnimationClip: THREE.AnimationClip;\n appliedAnimation: {\n animationGroup: THREE.AnimationObjectGroup;\n animationMixer: THREE.AnimationMixer;\n animationAction: THREE.AnimationAction;\n } | null;\n};\n\nfunction createFilteredClip(\n clip: THREE.AnimationClip,\n nodeNames: Set<string>,\n): THREE.AnimationClip {\n // filter out tracks that don't have corresponding nodes\n const compatibleTracks = clip.tracks.filter((track: THREE.KeyframeTrack) => {\n const trackName = track.name;\n const nodeName = trackName.split(\".\")[0];\n return nodeNames.has(nodeName);\n });\n\n const filteredClip = new THREE.AnimationClip(clip.name, clip.duration, compatibleTracks);\n\n return filteredClip;\n}\n\ntype AttachmentAnimState = {\n directAnimation: {\n animationMixer: THREE.AnimationMixer | null;\n animationAction: THREE.AnimationAction | null;\n } | null;\n childAnimations: {\n animationMixer: THREE.AnimationMixer;\n animations: Map<\n Animation<ThreeJSGraphicsAdapter>,\n {\n action: THREE.AnimationAction | null;\n clip: THREE.AnimationClip | null;\n animationState: ThreeJSAnimationState;\n }\n >;\n };\n};\n\nexport class ThreeJSModel extends ModelGraphics<ThreeJSGraphicsAdapter> {\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Model.tagName}.src`);\n private animLoadingInstanceManager = new LoadingInstanceManager(`${Model.tagName}.anim`);\n private latestSrcModelHandle: ThreeJSModelHandle | null = null;\n private latestAnimModelHandle: ThreeJSModelHandle | null = null;\n\n private socketChildrenByBone = new Map<string, Set<MElement<ThreeJSGraphicsAdapter>>>();\n\n private attachments = new Map<Model<ThreeJSGraphicsAdapter>, AttachmentAnimState>();\n private registeredParentAttachment: Model<ThreeJSGraphicsAdapter> | null = null;\n\n private static DebugBoundingBoxGeometry = new THREE.BoxGeometry(1, 1, 1, 1, 1, 1);\n private static DebugBoundingBoxMaterial = new THREE.MeshBasicMaterial({\n color: 0xff0000,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n private debugBoundingBox: THREE.Mesh | null = null;\n\n protected loadedState: ThreeJSModelLoadState | null = null;\n protected animState: ThreeJSModelAnimState | null = null;\n\n private documentTimeTickListener: null | { remove: () => void } = null;\n\n private childAnimationMixer: THREE.AnimationMixer | null = null;\n private childAnimations = new Map<\n Animation<ThreeJSGraphicsAdapter>,\n {\n action: THREE.AnimationAction | null;\n clip: THREE.AnimationClip | null;\n animationState: ThreeJSAnimationState;\n }\n >();\n\n constructor(\n private model: Model<ThreeJSGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(model, updateMeshCallback);\n }\n\n hasLoadedModel(): boolean {\n return !!this.loadedState?.group;\n }\n\n hasLoadedAnimation(): boolean {\n return !!this.animState?.appliedAnimation;\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getBoundingBox(): { centerOffset: IVect3; size: IVect3 } | null {\n if (this.loadedState) {\n return {\n centerOffset: this.loadedState.boundingBox.centerOffset,\n size: this.loadedState.boundingBox.size,\n };\n }\n return null;\n }\n\n getCollisionElement(): THREE.Object3D<THREE.Object3DEventMap> | null {\n return this.loadedState?.group ?? null;\n }\n\n setDebug(): void {\n this.updateDebugVisualisation();\n }\n\n setCastShadows(castShadows: boolean): void {\n if (this.loadedState) {\n this.loadedState.group.traverse((object) => {\n if ((object as THREE.Mesh).isMesh) {\n const mesh = object as THREE.Mesh;\n mesh.castShadow = castShadows;\n }\n });\n }\n }\n\n updateChildAnimation(\n animation: Animation<ThreeJSGraphicsAdapter>,\n animationState: ThreeJSAnimationState,\n ) {\n let childAnimation = this.childAnimations.get(animation);\n\n if (!this.childAnimationMixer || !this.loadedState) {\n this.childAnimations.set(animation, {\n action: null,\n clip: null,\n animationState,\n });\n } else {\n if (\n childAnimation &&\n childAnimation.action &&\n childAnimation.clip !== animationState.animationClip\n ) {\n // if the animation clip has changed, stop the old action and dispose it\n childAnimation.action.stop();\n this.childAnimationMixer.uncacheAction(\n childAnimation.action.getClip(),\n this.loadedState.group,\n );\n childAnimation.action = null;\n childAnimation = undefined;\n }\n\n if (!childAnimation) {\n childAnimation = {\n action: null,\n clip: null,\n animationState,\n };\n this.childAnimations.set(animation, childAnimation);\n } else {\n childAnimation.animationState = animationState;\n }\n\n if (!childAnimation.action && animationState && animationState.animationClip) {\n const filteredClip = createFilteredClip(\n animationState.animationClip,\n this.loadedState.nodeNames,\n );\n const action = this.childAnimationMixer.clipAction(filteredClip, this.loadedState.group);\n action.enabled = true;\n this.childAnimations.set(animation, {\n action,\n clip: animationState.animationClip,\n animationState,\n });\n }\n }\n\n for (const [attachment, attachmentAnimState] of this.attachments) {\n this.updateAnimationForAttachment(attachment, attachmentAnimState, animation, animationState);\n }\n\n const documentTime = this.model.getDocumentTime();\n this.updateAnimation(documentTime);\n }\n\n private updateAnimationForAttachment(\n attachment: Model<ThreeJSGraphicsAdapter>,\n attachmentAnimState: AttachmentAnimState,\n animation: Animation<ThreeJSGraphicsAdapter>,\n animationState: ThreeJSAnimationState,\n ) {\n let attachmentChildAnimation = attachmentAnimState.childAnimations.animations.get(animation);\n const attachmentChildAnimationMixer = attachmentAnimState.childAnimations.animationMixer;\n\n const attachmentLoadedState = (attachment.modelGraphics as ThreeJSModel).loadedState;\n if (!attachmentLoadedState) {\n throw new Error(\"Attachment must be loaded before registering\");\n }\n\n if (\n attachmentChildAnimation &&\n attachmentChildAnimation.action &&\n attachmentChildAnimation.clip &&\n attachmentChildAnimation.clip !== animationState.animationClip\n ) {\n // if the animation clip has changed, stop the old action and dispose it\n attachmentChildAnimation.action.stop();\n attachmentChildAnimationMixer.uncacheAction(\n attachmentChildAnimation.clip,\n attachmentLoadedState.group,\n );\n attachmentChildAnimation.action = null;\n attachmentChildAnimation = undefined;\n }\n\n if (!attachmentChildAnimation) {\n attachmentChildAnimation = {\n action: null,\n clip: null,\n animationState,\n };\n attachmentAnimState.childAnimations.animations.set(animation, attachmentChildAnimation);\n } else {\n attachmentChildAnimation.animationState = animationState;\n }\n\n if (!attachmentChildAnimation.action && animationState && animationState.animationClip) {\n const filteredClip = createFilteredClip(\n animationState.animationClip,\n attachmentLoadedState.nodeNames,\n );\n const action = attachmentChildAnimationMixer.clipAction(\n filteredClip,\n attachmentLoadedState.group,\n );\n action.enabled = true;\n action.play();\n attachmentAnimState.childAnimations.animations.set(animation, {\n action,\n clip: animationState.animationClip,\n animationState,\n });\n }\n }\n\n removeChildAnimation(animation: Animation<ThreeJSGraphicsAdapter>) {\n const childAnimation = this.childAnimations.get(animation);\n if (childAnimation) {\n const action = childAnimation.action;\n if (action) {\n action.stop();\n if (this.childAnimationMixer && this.loadedState) {\n this.childAnimationMixer.uncacheAction(action.getClip(), this.loadedState.group);\n }\n }\n this.childAnimations.delete(animation);\n\n for (const [attachment, attachmentAnimState] of this.attachments) {\n this.removeAnimationForAttachment(attachment, attachmentAnimState, animation);\n }\n }\n }\n\n private removeAnimationForAttachment(\n attachment: Model<ThreeJSGraphicsAdapter>,\n attachmentAnimState: AttachmentAnimState,\n animation: Animation<ThreeJSGraphicsAdapter>,\n ) {\n const attachmentChildAnimation = attachmentAnimState.childAnimations.animations.get(animation);\n if (attachmentChildAnimation) {\n const action = attachmentChildAnimation.action;\n if (action) {\n action.stop();\n const attachmentLoadedState = (attachment.modelGraphics as ThreeJSModel).loadedState;\n if (attachmentLoadedState) {\n attachmentAnimState.childAnimations.animationMixer.uncacheAction(\n action.getClip(),\n attachmentLoadedState.group,\n );\n }\n attachmentChildAnimation.action = null;\n }\n }\n attachmentAnimState.childAnimations.animations.delete(animation);\n }\n\n setAnim(anim: string | null): void {\n if (this.latestAnimModelHandle?.url === anim) {\n // already loading the same animation\n return;\n }\n if (this.latestAnimModelHandle) {\n this.latestAnimModelHandle.dispose();\n this.animLoadingInstanceManager.abortIfLoading();\n }\n this.latestAnimModelHandle = null;\n\n this.resetAnimationMixer();\n this.animState = null;\n for (const [, attachmentAnimState] of this.attachments) {\n if (attachmentAnimState) {\n attachmentAnimState.directAnimation?.animationMixer?.stopAllAction();\n\n // Reset attachment to default pose by clearing all animations and updating mixer\n if (attachmentAnimState.directAnimation?.animationMixer) {\n attachmentAnimState.directAnimation.animationMixer.update(0);\n }\n\n // Also reset the child animation mixer to ensure clean state\n attachmentAnimState.childAnimations.animationMixer.stopAllAction();\n attachmentAnimState.childAnimations.animationMixer.update(0);\n\n attachmentAnimState.directAnimation = null;\n }\n }\n\n if (!anim) {\n this.animLoadingInstanceManager.abortIfLoading();\n\n // if the animation is removed then the model can be added to\n // the parent attachment if the model is loaded\n if (this.loadedState && !this.registeredParentAttachment) {\n const parent = this.model.parentElement;\n if (parent && Model.isModel(parent)) {\n this.registeredParentAttachment = parent as Model<ThreeJSGraphicsAdapter>;\n (parent.modelGraphics as ThreeJSModel).registerAttachment(this.model);\n }\n }\n\n // restore document time tick listener if model is loaded (for future child animations)\n if (this.loadedState && !this.documentTimeTickListener) {\n this.documentTimeTickListener = this.model.addDocumentTimeTickListener(\n (documentTime: number) => {\n this.updateAnimation(documentTime);\n },\n );\n }\n\n // Restore child animations for all attachments when anim attribute is removed\n for (const [attachment, attachmentAnimState] of this.attachments) {\n for (const [animation, childAnimation] of this.childAnimations) {\n this.updateAnimationForAttachment(\n attachment,\n attachmentAnimState,\n animation,\n childAnimation.animationState,\n );\n }\n }\n\n return;\n }\n\n if (this.registeredParentAttachment) {\n (this.registeredParentAttachment.modelGraphics as ThreeJSModel).unregisterAttachment(\n this.model,\n );\n this.registeredParentAttachment = null;\n }\n\n const animSrc = this.model.contentSrcToContentAddress(anim);\n this.animLoadingInstanceManager.start(this.model.getLoadingProgressManager(), animSrc);\n const animModelHandle = this.model\n .getScene()\n .getGraphicsAdapter()\n .getResourceManager()\n .loadModel(animSrc);\n this.latestAnimModelHandle = animModelHandle;\n animModelHandle.onProgress((loaded, total) => {\n if (this.latestAnimModelHandle !== animModelHandle) {\n return;\n }\n this.animLoadingInstanceManager.setProgress(loaded / total);\n });\n animModelHandle.onLoad((result: ModelLoadResult | Error) => {\n if (result instanceof Error) {\n console.error(\"Error loading m-model.anim\", result);\n this.latestAnimModelHandle = null;\n this.animLoadingInstanceManager.error(result);\n return;\n }\n if (this.latestAnimModelHandle !== animModelHandle || !this.model.isConnected) {\n return;\n }\n const animationClip = result.animations[0];\n if (this.loadedState) {\n const filteredClip = createFilteredClip(animationClip, this.loadedState.nodeNames);\n this.playAnimation(filteredClip);\n } else {\n this.playAnimation(animationClip);\n }\n\n for (const [model] of this.attachments) {\n this.registerAttachment(model);\n }\n\n this.animLoadingInstanceManager.finish();\n });\n }\n\n setAnimEnabled(): void {\n if (this.model.props.animEnabled) {\n if (this.animState && !this.animState.appliedAnimation) {\n for (const [attachment] of this.attachments) {\n this.registerAttachment(attachment);\n }\n this.playAnimation(this.animState.currentAnimationClip);\n }\n } else if (!this.model.props.animEnabled) {\n for (const [attachment, attachmentAnimState] of this.attachments) {\n if (attachmentAnimState) {\n attachmentAnimState.directAnimation?.animationMixer?.stopAllAction();\n\n // Reset attachment to default pose by clearing all animations and updating mixer\n if (attachmentAnimState.directAnimation?.animationMixer) {\n attachmentAnimState.directAnimation.animationMixer.update(0);\n }\n\n // Also reset the child animation mixer to ensure clean state\n attachmentAnimState.childAnimations.animationMixer.stopAllAction();\n attachmentAnimState.childAnimations.animationMixer.update(0);\n\n attachmentAnimState.directAnimation = null;\n }\n this.model.getContainer().add(attachment.getContainer());\n }\n }\n }\n\n setAnimLoop(): void {\n // no-op - property is observed in animation tick\n }\n\n setAnimStartTime(): void {\n // no-op - property is observed in animation tick\n }\n\n setAnimPauseTime(): void {\n // no-op - property is observed in animation tick\n }\n\n transformed(): void {\n // no-op\n }\n\n setSrc(src: string | null): void {\n if (this.latestSrcModelHandle?.url === src) {\n // already loading the same src\n return;\n }\n if (this.latestSrcModelHandle) {\n this.latestSrcModelHandle.dispose();\n this.srcLoadingInstanceManager.abortIfLoading();\n }\n this.latestSrcModelHandle = null;\n\n if (this.loadedState !== null) {\n this.loadedState.group.removeFromParent();\n if (this.registeredParentAttachment) {\n (this.registeredParentAttachment.modelGraphics as ThreeJSModel).unregisterAttachment(\n this.model,\n );\n this.registeredParentAttachment = null;\n }\n ThreeJSModel.disposeOfGroup(this.loadedState.group);\n this.loadedState = null;\n this.updateMeshCallback();\n this.updateDebugVisualisation();\n }\n\n // Clean up animation mixer\n if (this.childAnimationMixer) {\n this.childAnimationMixer.stopAllAction();\n this.childAnimationMixer = null;\n }\n for (const [, childAnimation] of this.childAnimations) {\n // The actions will need to be recreated when the new model is loaded\n childAnimation.action?.stop();\n childAnimation.action = null;\n }\n\n if (!src) {\n this.latestSrcModelHandle = null;\n this.srcLoadingInstanceManager.abortIfLoading();\n this.socketChildrenByBone.forEach((children) => {\n children.forEach((child) => {\n this.model.getContainer().add(child.getContainer());\n });\n });\n this.updateMeshCallback();\n this.updateDebugVisualisation();\n return;\n }\n\n const contentSrc = this.model.contentSrcToContentAddress(src);\n this.srcLoadingInstanceManager.start(this.model.getLoadingProgressManager(), contentSrc);\n const srcModelHandle = this.model\n .getScene()\n .getGraphicsAdapter()\n .getResourceManager()\n .loadModel(contentSrc);\n this.latestSrcModelHandle = srcModelHandle;\n srcModelHandle.onProgress((loaded, total) => {\n if (this.latestSrcModelHandle !== srcModelHandle) {\n return;\n }\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n });\n srcModelHandle.onLoad((result: ModelLoadResult | Error) => {\n if (result instanceof Error) {\n console.error(\"Error loading m-model.src\", result);\n this.latestSrcModelHandle = null;\n this.srcLoadingInstanceManager.error(result);\n return;\n }\n result.group.traverse((child: THREE.Object3D) => {\n if ((child as THREE.Mesh).isMesh) {\n child.castShadow = this.model.props.castShadows;\n child.receiveShadow = true;\n }\n });\n const group = result.group;\n const bones = new Map<string, THREE.Bone>();\n const nodeNames = new Set<string>();\n group.traverse((object: THREE.Object3D) => {\n nodeNames.add(object.name);\n if (object instanceof THREE.Bone) {\n bones.set(object.name, object);\n }\n });\n\n const boundingBox = new THREE.Box3();\n group.updateWorldMatrix(true, true);\n boundingBox.expandByObject(group);\n\n this.loadedState = {\n group,\n bones,\n nodeNames,\n boundingBox: {\n size: boundingBox.getSize(new THREE.Vector3(0, 0, 0)),\n centerOffset: boundingBox.getCenter(new THREE.Vector3(0, 0, 0)),\n },\n };\n this.model.getContainer().add(group);\n\n this.childAnimationMixer = new THREE.AnimationMixer(group);\n\n if (!this.documentTimeTickListener) {\n this.documentTimeTickListener = this.model.addDocumentTimeTickListener(\n (documentTime: number) => {\n this.updateAnimation(documentTime);\n },\n );\n }\n\n for (const [boneName, children] of this.socketChildrenByBone) {\n const bone = bones.get(boneName);\n if (bone) {\n children.forEach((child) => {\n bone.add(child.getContainer());\n });\n }\n }\n\n this.updateMeshCallback();\n\n const parent = this.model.parentElement;\n if (parent && Model.isModel(parent)) {\n if (!this.latestAnimModelHandle && !this.animState) {\n this.registeredParentAttachment = parent as Model<ThreeJSGraphicsAdapter>;\n (parent.modelGraphics as ThreeJSModel).registerAttachment(this.model);\n }\n }\n\n if (this.animState) {\n this.playAnimation(this.animState.currentAnimationClip);\n }\n this.srcLoadingInstanceManager.finish();\n this.updateDebugVisualisation();\n\n for (const [animation, childAnimation] of this.childAnimations) {\n this.updateChildAnimation(animation, childAnimation.animationState);\n }\n });\n }\n\n public registerAttachment(attachment: Model<ThreeJSGraphicsAdapter>) {\n const childAnimationGroup = new THREE.AnimationObjectGroup();\n const childAnimationMixer = new THREE.AnimationMixer(childAnimationGroup);\n const animState: AttachmentAnimState = {\n directAnimation: null,\n childAnimations: {\n animationMixer: childAnimationMixer,\n animations: new Map(),\n },\n };\n\n for (const [animation, childAnimation] of this.childAnimations) {\n this.updateAnimationForAttachment(\n attachment,\n animState,\n animation,\n childAnimation.animationState,\n );\n }\n\n if (this.animState) {\n // There is an existing animation specified on the model itself\n const attachmentLoadedState = (attachment.modelGraphics as ThreeJSModel).loadedState;\n if (!attachmentLoadedState) {\n throw new Error(\"Attachment must be loaded before registering\");\n }\n const animationGroup = new THREE.AnimationObjectGroup();\n const animationMixer = new THREE.AnimationMixer(animationGroup);\n const action = animationMixer.clipAction(this.animState.currentAnimationClip);\n animState.directAnimation = {\n animationMixer,\n animationAction: action,\n };\n animationGroup.add(attachmentLoadedState.group);\n action.play();\n }\n this.attachments.set(attachment, animState);\n }\n\n public unregisterAttachment(attachment: Model<ThreeJSGraphicsAdapter>) {\n const attachmentState = this.attachments.get(attachment);\n if (attachmentState) {\n if (attachmentState.directAnimation) {\n attachmentState.directAnimation.animationMixer?.stopAllAction();\n }\n attachmentState.childAnimations.animationMixer.stopAllAction();\n }\n this.attachments.delete(attachment);\n }\n\n private updateDebugVisualisation() {\n if (!this.model.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (!this.debugBoundingBox) {\n this.debugBoundingBox = new THREE.Mesh(\n ThreeJSModel.DebugBoundingBoxGeometry,\n ThreeJSModel.DebugBoundingBoxMaterial,\n );\n this.model.getContainer().add(this.debugBoundingBox);\n }\n if (this.loadedState) {\n const boundingBox = this.loadedState.boundingBox;\n if (boundingBox.centerOffset) {\n this.debugBoundingBox.position.copy(boundingBox.centerOffset);\n } else {\n this.debugBoundingBox.position.set(0, 0, 0);\n }\n this.debugBoundingBox.scale.copy(boundingBox.size);\n } else {\n this.debugBoundingBox.scale.set(0, 0, 0);\n }\n }\n }\n\n private clearDebugVisualisation() {\n if (this.debugBoundingBox) {\n this.debugBoundingBox.removeFromParent();\n this.debugBoundingBox = null;\n }\n }\n\n private resetAnimationMixer() {\n if (this.documentTimeTickListener) {\n this.documentTimeTickListener.remove();\n this.documentTimeTickListener = null;\n }\n if (this.animState) {\n const appliedAnimation = this.animState.appliedAnimation;\n if (appliedAnimation) {\n appliedAnimation.animationMixer.stopAllAction();\n }\n this.animState.appliedAnimation = null;\n }\n }\n\n public registerSocketChild(\n child: TransformableElement<ThreeJSGraphicsAdapter>,\n socketName: string,\n ): void {\n let children = this.socketChildrenByBone.get(socketName);\n if (!children) {\n children = new Set<MElement<ThreeJSGraphicsAdapter>>();\n this.socketChildrenByBone.set(socketName, children);\n }\n children.add(child);\n\n if (this.loadedState) {\n const bone = this.loadedState.bones.get(socketName);\n if (bone) {\n bone.add(child.getContainer());\n } else {\n this.model.getContainer().add(child.getContainer());\n }\n }\n }\n\n public unregisterSocketChild(\n child: TransformableElement<ThreeJSGraphicsAdapter>,\n socketName: string,\n addToRoot: boolean = true,\n ): void {\n const socketChildren = this.socketChildrenByBone.get(socketName);\n if (socketChildren) {\n socketChildren.delete(child);\n if (addToRoot) {\n this.model.getContainer().add(child.getContainer());\n }\n if (socketChildren.size === 0) {\n this.socketChildrenByBone.delete(socketName);\n }\n }\n }\n\n private triggerSocketedChildrenTransformed() {\n // Socketed children need to be updated when the animation is updated as their position may have updated\n this.socketChildrenByBone.forEach((children) => {\n children.forEach((child) => {\n if (TransformableElement.isTransformableElement(child)) {\n child.didUpdateTransformation();\n }\n });\n });\n }\n\n private playAnimation(anim: THREE.AnimationClip) {\n this.resetAnimationMixer();\n this.animState = {\n currentAnimationClip: anim,\n appliedAnimation: null,\n };\n const animationGroup = new THREE.AnimationObjectGroup();\n const animationMixer = new THREE.AnimationMixer(animationGroup);\n const action = animationMixer.clipAction(anim);\n this.animState.appliedAnimation = {\n animationGroup,\n animationMixer,\n animationAction: action,\n };\n if (this.loadedState) {\n animationGroup.add(this.loadedState.group);\n }\n action.play();\n if (!this.documentTimeTickListener) {\n this.documentTimeTickListener = this.model.addDocumentTimeTickListener(\n (documentTime: number) => {\n this.updateAnimation(documentTime);\n },\n );\n }\n }\n\n private updateAnimation(docTimeMs: number, force: boolean = false) {\n if (this.animState) {\n if (!this.model.props.animEnabled && this.animState.appliedAnimation) {\n this.resetAnimationMixer();\n this.triggerSocketedChildrenTransformed();\n } else {\n if (!this.animState.appliedAnimation) {\n this.playAnimation(this.animState.currentAnimationClip);\n }\n let animationTimeMs = docTimeMs - this.model.props.animStartTime;\n if (docTimeMs < this.model.props.animStartTime) {\n animationTimeMs = 0;\n } else if (this.model.props.animPauseTime !== null) {\n if (docTimeMs > this.model.props.animPauseTime) {\n animationTimeMs = this.model.props.animPauseTime - this.model.props.animStartTime;\n }\n }\n\n const clip = this.animState.currentAnimationClip;\n if (clip !== null) {\n if (!this.model.props.animLoop) {\n if (animationTimeMs > clip.duration * 1000) {\n animationTimeMs = clip.duration * 1000;\n }\n }\n }\n\n for (const [model, attachmentAnimState] of this.attachments) {\n if (attachmentAnimState.directAnimation) {\n attachmentAnimState.directAnimation.animationMixer?.setTime(animationTimeMs / 1000);\n (model.modelGraphics as ThreeJSModel).triggerSocketedChildrenTransformed();\n }\n }\n\n if (force) {\n this.animState.appliedAnimation?.animationMixer.setTime((animationTimeMs + 1) / 1000);\n }\n this.animState.appliedAnimation?.animationMixer.setTime(animationTimeMs / 1000);\n this.triggerSocketedChildrenTransformed();\n }\n } else if (this.childAnimationMixer) {\n // Handle child animations\n if (this.model.props.animEnabled) {\n // Map of animation to animationTimeMs | null\n const animationTimes = new Map<Animation<ThreeJSGraphicsAdapter>, number>();\n\n let hasActiveAnimations = false;\n\n // Update each child animation based on its individual timing properties\n for (const [animation, childAnimation] of this.childAnimations) {\n const animationState = childAnimation.animationState;\n const action = childAnimation.action;\n if (animationState && action) {\n // Check if this animation should be active based on timing\n let shouldBeActive = true;\n let animationTimeMs = 0;\n\n // Handle start time - animation doesn't start until start time\n if (docTimeMs < animationState.startTime) {\n shouldBeActive = false;\n } else {\n animationTimeMs = docTimeMs - animationState.startTime;\n }\n\n // Handle pause time - animation stops at pause time\n if (shouldBeActive && animationState.pauseTime !== null) {\n if (docTimeMs > animationState.pauseTime) {\n shouldBeActive = false; // Stop the animation when pause time is reached\n }\n }\n\n const durationMs = (animationState.animationClip?.duration ?? 1) * 1000;\n\n animationTimeMs = animationTimeMs * animationState.speed;\n\n if (animationState.ratio !== null) {\n animationTimeMs = animationState.ratio * durationMs;\n }\n\n // Handle loop and duration\n if (shouldBeActive && animationState.animationClip) {\n if (!animationState.loop) {\n if (animationTimeMs > durationMs) {\n animationTimeMs = durationMs;\n shouldBeActive = false; // Stop the animation when it reaches the end\n }\n }\n }\n\n // Control the action based on timing\n if (shouldBeActive) {\n animationTimes.set(animation, animationTimeMs);\n action.enabled = true;\n action.setEffectiveWeight(animationState.weight);\n if (animationState.weight > 0) {\n hasActiveAnimations = true;\n action.play();\n } else {\n action.stop();\n }\n action.time = (animationTimeMs % durationMs) / 1000;\n } else {\n action.enabled = false;\n action.stop();\n }\n }\n }\n\n if (!hasActiveAnimations) {\n // No active animations, stop all actions and reset to t-pose\n this.childAnimationMixer.stopAllAction();\n }\n this.childAnimationMixer.update(0);\n\n for (const [, attachmentAnimState] of this.attachments) {\n for (const [animation, childAnimation] of attachmentAnimState.childAnimations\n .animations) {\n const animationTimeMs = animationTimes.get(animation);\n const action = childAnimation.action;\n if (action) {\n if (animationTimeMs !== undefined) {\n action.enabled = true;\n action.setEffectiveWeight(childAnimation.animationState.weight);\n if (childAnimation.animationState.weight > 0) {\n action.play();\n } else {\n action.stop();\n }\n action.time = animationTimeMs / 1000;\n } else {\n action.enabled = false;\n action.stop();\n }\n }\n }\n\n if (!hasActiveAnimations) {\n attachmentAnimState.childAnimations.animationMixer.stopAllAction();\n }\n attachmentAnimState.childAnimations.animationMixer.update(0.000000001);\n }\n\n this.triggerSocketedChildrenTransformed();\n } else {\n this.childAnimationMixer.stopAllAction();\n }\n }\n }\n\n dispose() {\n if (this.documentTimeTickListener) {\n this.documentTimeTickListener.remove();\n this.documentTimeTickListener = null;\n }\n if (this.registeredParentAttachment) {\n (this.registeredParentAttachment?.modelGraphics as ThreeJSModel)?.unregisterAttachment(\n this.model,\n );\n this.registeredParentAttachment = null;\n }\n if (this.loadedState) {\n this.loadedState.group.removeFromParent();\n ThreeJSModel.disposeOfGroup(this.loadedState.group);\n this.loadedState = null;\n }\n this.clearDebugVisualisation();\n if (this.latestSrcModelHandle) {\n this.latestSrcModelHandle.dispose();\n }\n this.latestSrcModelHandle = null;\n if (this.latestAnimModelHandle) {\n this.latestAnimModelHandle.dispose();\n }\n this.latestAnimModelHandle = null;\n this.animLoadingInstanceManager.dispose();\n this.srcLoadingInstanceManager.dispose();\n\n if (this.childAnimationMixer) {\n this.childAnimationMixer.stopAllAction();\n this.childAnimationMixer = null;\n }\n this.childAnimations.clear();\n }\n\n private static disposeOfGroup(group: THREE.Object3D) {\n group.traverse((child) => {\n if ((child as THREE.Mesh).isMesh) {\n const mesh = child as THREE.Mesh;\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n for (const material of mesh.material) {\n ThreeJSModel.disposeOfMaterial(material);\n }\n } else if (mesh.material) {\n ThreeJSModel.disposeOfMaterial(mesh.material);\n }\n }\n });\n }\n\n private static disposeOfMaterial(material: THREE.Material) {\n material.dispose();\n for (const key of Object.keys(material)) {\n const value = (material as any)[key];\n if (value && typeof value === \"object\" && \"minFilter\" in value) {\n value.dispose();\n }\n }\n }\n}\n", "import { Overlay, OverlayGraphics } from \"@mml-io/mml-web\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSOverlay extends OverlayGraphics<ThreeJSGraphicsAdapter> {\n constructor(private overlay: Overlay<ThreeJSGraphicsAdapter>) {\n super(overlay);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setAnchor(): void {\n // no-op\n }\n\n setOffsetX(): void {\n // no-op\n }\n\n setOffsetY(): void {\n // no-op\n }\n\n dispose() {}\n}\n", "import { Plane } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport { PlaneGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSPlane extends PlaneGraphics<ThreeJSGraphicsAdapter> {\n static planeGeometry = new THREE.PlaneGeometry(1, 1);\n private mesh: THREE.Mesh<THREE.PlaneGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial;\n\n constructor(private plane: Plane<ThreeJSGraphicsAdapter>) {\n super(plane);\n\n this.material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(plane.props.color.r, plane.props.color.g, plane.props.color.b),\n });\n this.mesh = new THREE.Mesh(ThreeJSPlane.planeGeometry, this.material);\n this.mesh.castShadow = plane.props.castShadows;\n this.mesh.receiveShadow = true;\n this.plane.getContainer().add(this.mesh);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n setColor(color: MMLColor): void {\n this.material.color = new THREE.Color(color.r, color.g, color.b);\n }\n\n setWidth(width: number): void {\n this.mesh.scale.x = width;\n }\n\n setHeight(height: number): void {\n this.mesh.scale.y = height;\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n setOpacity(opacity: number): void {\n const needsUpdate = this.material.transparent === (opacity === 1);\n this.material.transparent = opacity !== 1;\n this.material.needsUpdate = needsUpdate;\n this.material.opacity = opacity;\n }\n\n dispose() {}\n}\n", "import { PositionProbe } from \"@mml-io/mml-web\";\nimport { PositionProbeGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSPositionProbe extends PositionProbeGraphics<ThreeJSGraphicsAdapter> {\n private static DebugGeometry = new THREE.SphereGeometry(1, 16, 16, 1);\n private static DebugMaterial = new THREE.MeshBasicMaterial({\n color: 0xff0000,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n\n private debugMesh: THREE.Mesh<THREE.SphereGeometry, THREE.MeshBasicMaterial> | null = null;\n\n constructor(private positionProbe: PositionProbe<ThreeJSGraphicsAdapter>) {\n super(positionProbe);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setRange(): void {\n this.updateDebugVisualisation();\n }\n\n setDebug() {\n this.updateDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.debugMesh) {\n this.debugMesh.removeFromParent();\n this.debugMesh = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.positionProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.positionProbe.isConnected && !this.debugMesh) {\n const mesh = new THREE.Mesh(\n ThreeJSPositionProbe.DebugGeometry,\n ThreeJSPositionProbe.DebugMaterial,\n );\n mesh.castShadow = false;\n mesh.receiveShadow = false;\n this.debugMesh = mesh;\n this.positionProbe.getContainer().add(this.debugMesh);\n }\n\n if (this.debugMesh) {\n this.debugMesh.scale.set(\n this.positionProbe.props.range,\n this.positionProbe.props.range,\n this.positionProbe.props.range,\n );\n }\n }\n }\n\n dispose() {\n this.clearDebugVisualisation();\n }\n}\n", "import { Prompt } from \"@mml-io/mml-web\";\nimport { PromptGraphics } from \"@mml-io/mml-web\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSPrompt extends PromptGraphics<ThreeJSGraphicsAdapter> {\n constructor(private prompt: Prompt<ThreeJSGraphicsAdapter>) {\n super(prompt);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setMessage(): void {\n // no-op\n }\n\n setPlaceholder(): void {\n // no-op\n }\n\n setPrefill(): void {\n // no-op\n }\n\n setDebug(): void {\n // no-op\n }\n\n dispose() {}\n}\n", "import { RemoteDocument, RemoteDocumentGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\nimport { getThreeJSReconnectingStatus } from \"../ThreeJSReconnectingStatus\";\n\nexport class ThreeJSRemoteDocument extends RemoteDocumentGraphics<ThreeJSGraphicsAdapter> {\n private statusUI: THREE.Mesh | null = null;\n\n constructor(private element: RemoteDocument<ThreeJSGraphicsAdapter>) {\n super(element);\n }\n\n public showError(showError: boolean): void {\n if (!showError) {\n if (this.statusUI !== null) {\n this.element.getContainer().remove(this.statusUI);\n this.statusUI = null;\n }\n } else {\n if (this.statusUI === null) {\n const { geometry, material, height } = getThreeJSReconnectingStatus();\n const mesh: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial> = new THREE.Mesh(\n geometry,\n material,\n );\n mesh.position.set(0, height / 2, 0);\n this.statusUI = mesh;\n this.element.getContainer().add(this.statusUI);\n }\n }\n }\n\n public dispose() {}\n}\n", "import { CanvasText } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nfunction createReconnectingStatus() {\n const canvas = new CanvasText().renderText(\"Reconnecting\", {\n bold: true,\n fontSize: 32,\n paddingPx: 10,\n textColorRGB255A1: {\n r: 255,\n g: 0,\n b: 0,\n a: 1.0,\n },\n backgroundColorRGB255A1: {\n r: 255,\n g: 255,\n b: 255,\n a: 1.0,\n },\n alignment: \"center\",\n });\n\n const texture = new THREE.Texture(canvas);\n texture.minFilter = THREE.LinearFilter;\n texture.magFilter = THREE.LinearFilter;\n texture.format = THREE.RGBAFormat;\n texture.needsUpdate = true;\n\n const width = canvas.width;\n const height = canvas.height;\n\n const material = new THREE.MeshBasicMaterial({\n map: texture,\n side: THREE.DoubleSide,\n });\n const geometry = new THREE.PlaneGeometry(width / 100, height / 100, 1, 1);\n return { geometry, material, width: width / 100, height: height / 100 };\n}\n\nexport type ThreeJSReconnectingStatus = {\n geometry: THREE.PlaneGeometry;\n material: THREE.MeshBasicMaterial;\n width: number;\n height: number;\n};\n\nlet reconnectingStatus: ThreeJSReconnectingStatus | null = null;\n\nexport function getThreeJSReconnectingStatus(): ThreeJSReconnectingStatus {\n if (!reconnectingStatus) {\n reconnectingStatus = createReconnectingStatus();\n }\n return reconnectingStatus;\n}\n", "import { Sphere } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport { SphereGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nconst defaultSphereWidthSegments = 16;\nconst defaultSphereHeightSegments = 16;\n\nexport class ThreeJSSphere extends SphereGraphics<ThreeJSGraphicsAdapter> {\n static sphereGeometry = new THREE.SphereGeometry(\n 0.5,\n defaultSphereWidthSegments,\n defaultSphereHeightSegments,\n );\n private mesh: THREE.Mesh<THREE.SphereGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial;\n\n constructor(private sphere: Sphere<ThreeJSGraphicsAdapter>) {\n super(sphere);\n\n this.material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(sphere.props.color.r, sphere.props.color.g, sphere.props.color.b),\n });\n this.mesh = new THREE.Mesh(ThreeJSSphere.sphereGeometry, this.material);\n this.mesh.castShadow = sphere.props.castShadows;\n this.mesh.receiveShadow = true;\n this.sphere.getContainer().add(this.mesh);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n setColor(color: MMLColor): void {\n this.material.color = new THREE.Color(color.r, color.g, color.b);\n }\n\n setRadius(radius: number): void {\n this.mesh.scale.x = radius * 2;\n this.mesh.scale.y = radius * 2;\n this.mesh.scale.z = radius * 2;\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n setOpacity(opacity: number): void {\n const needsUpdate = this.material.transparent === (opacity === 1);\n this.material.transparent = opacity !== 1;\n this.material.needsUpdate = needsUpdate;\n this.material.opacity = opacity;\n }\n\n dispose() {}\n}\n", "import {\n IVect3,\n Matr4,\n Matr4Data,\n Model,\n TransformableElement,\n TransformableGraphics,\n} from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\nimport { ThreeJSModel } from \"./ThreeJSModel\";\n\nexport class ThreeJSTransformable extends TransformableGraphics<ThreeJSGraphicsAdapter> {\n private socketName: string | null = null;\n private registeredSocketParent: ThreeJSModel | null = null;\n\n constructor(private transformableElement: TransformableElement<ThreeJSGraphicsAdapter>) {\n super(transformableElement);\n }\n\n getWorldMatrix(): Matr4 {\n // TODO - optimize/reduce calls to updateWorldMatrix\n const container = this.getContainer();\n container.updateWorldMatrix(true, false);\n return new Matr4(container.matrixWorld.elements as Matr4Data);\n }\n\n getWorldPosition(): IVect3 {\n return this.getContainer().getWorldPosition(new THREE.Vector3());\n }\n\n getLocalPosition(): IVect3 {\n return this.getContainer().position;\n }\n\n getVisible(): boolean {\n return this.getContainer().visible;\n }\n\n setVisible(visible: boolean): void {\n this.getContainer().visible = visible;\n }\n\n setSocket(socketName: string | null): void {\n if (this.socketName !== socketName) {\n if (this.socketName !== null && this.registeredSocketParent) {\n this.registeredSocketParent.unregisterSocketChild(\n this.transformableElement,\n this.socketName,\n );\n }\n this.socketName = socketName;\n if (socketName !== null) {\n this.registerWithParentModel(socketName);\n }\n } else {\n this.socketName = socketName;\n }\n }\n\n private registerWithParentModel(socketName: string): void {\n if (\n (this.transformableElement.parentElement as Model<ThreeJSGraphicsAdapter> | undefined)\n ?.isModel\n ) {\n const parentModel = this.transformableElement.parentElement as Model<ThreeJSGraphicsAdapter>;\n this.registeredSocketParent = parentModel.modelGraphics as ThreeJSModel;\n this.registeredSocketParent.registerSocketChild(this.transformableElement, socketName);\n }\n }\n\n private getContainer(): THREE.Group {\n return this.transformableElement.getContainer() as THREE.Group;\n }\n\n setX(x: number): void {\n this.getContainer().position.x = x;\n }\n\n setY(y: number): void {\n this.getContainer().position.y = y;\n }\n\n setZ(z: number): void {\n this.getContainer().position.z = z;\n }\n\n setRotationX(rotationX: number): void {\n this.getContainer().rotation.x = rotationX * THREE.MathUtils.DEG2RAD;\n }\n\n setRotationY(rotationY: number): void {\n this.getContainer().rotation.y = rotationY * THREE.MathUtils.DEG2RAD;\n }\n\n setRotationZ(rotationZ: number): void {\n this.getContainer().rotation.z = rotationZ * THREE.MathUtils.DEG2RAD;\n }\n\n setScaleX(scaleX: number): void {\n this.getContainer().scale.x = scaleX;\n }\n\n setScaleY(scaleY: number): void {\n this.getContainer().scale.y = scaleY;\n }\n\n setScaleZ(scaleZ: number): void {\n this.getContainer().scale.z = scaleZ;\n }\n\n dispose() {\n if (this.socketName && this.registeredSocketParent !== null) {\n this.registeredSocketParent.unregisterSocketChild(\n this.transformableElement,\n this.socketName,\n false,\n );\n }\n }\n}\n", "import {\n calculateContentSize,\n StaticFileVideoSource,\n Video,\n VideoGraphics,\n VideoSource,\n WHEPVideoSource,\n} from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nconst audioRefDistance = 1;\nconst audioRolloffFactor = 1;\n\nconst disabledVideoMaterial = new THREE.MeshStandardMaterial({\n color: 0x000000,\n side: THREE.DoubleSide,\n});\n\nexport class ThreeJSVideo extends VideoGraphics<ThreeJSGraphicsAdapter> {\n private videoSource: VideoSource | null = null;\n private videoMaterial: THREE.MeshStandardMaterial;\n\n private mesh: THREE.Mesh<\n THREE.PlaneGeometry,\n THREE.MeshStandardMaterial | THREE.MeshBasicMaterial\n >;\n\n private loadedVideoState: {\n video: HTMLVideoElement;\n audio: THREE.PositionalAudio;\n videoTexture: THREE.VideoTexture | null;\n } | null = null;\n\n constructor(\n private video: Video<ThreeJSGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(video, updateMeshCallback);\n\n const geometry = new THREE.PlaneGeometry(1, 1, 1, 1);\n // Video material is only applied once a video is played\n this.videoMaterial = new THREE.MeshStandardMaterial({\n color: 0xffffff,\n transparent: false,\n side: THREE.DoubleSide,\n });\n this.mesh = new THREE.Mesh(geometry, disabledVideoMaterial);\n this.mesh.castShadow = true;\n this.mesh.receiveShadow = false;\n this.video.getContainer().add(this.mesh);\n }\n\n public getWidthAndHeight(): { width: number; height: number } {\n return {\n width: this.mesh.scale.x,\n height: this.mesh.scale.y,\n };\n }\n\n public syncVideoTime() {\n if (this.loadedVideoState) {\n const videoTag = this.loadedVideoState.video;\n if (videoTag.readyState === 0) {\n return;\n }\n\n const audioListener = this.getAudioListener();\n const audioContext = audioListener.context;\n if (audioContext.state === \"running\") {\n videoTag.muted = false;\n }\n\n if (this.video.isDisabled()) {\n videoTag.muted = true;\n }\n\n if (this.videoSource) {\n this.videoSource.syncVideoSource(this.video.props);\n }\n }\n }\n\n private getAudioListener() {\n return this.video.getScene().getGraphicsAdapter().getAudioListener();\n }\n\n public enable(): void {\n this.updateVideo();\n }\n public disable(): void {\n this.updateVideo();\n }\n\n public getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n public setSrc(): void {\n this.updateVideo();\n }\n\n public setWidth(): void {\n this.updateWidthAndHeight();\n }\n\n public setHeight(): void {\n this.updateWidthAndHeight();\n }\n\n public setEnabled(): void {\n this.updateVideo();\n }\n\n public setCastShadows(): void {\n this.updateVideo();\n }\n\n public setLoop(): void {\n this.updateVideo();\n }\n\n public setVolume(): void {\n if (this.loadedVideoState) {\n this.loadedVideoState.audio.setVolume(this.video.props.volume);\n }\n }\n\n public setEmissive(): void {\n this.updateVideo();\n this.updateMaterialEmissiveIntensity();\n }\n\n public setStartTime(): void {\n this.updateVideo();\n }\n\n public setPauseTime(): void {\n this.updateVideo();\n }\n\n private updateVideo() {\n if (!this.video.isConnected) {\n return;\n }\n\n if (!this.video.props.enabled) {\n this.clearSource();\n return;\n }\n\n if (!this.video.props.src) {\n this.clearSource();\n } else {\n const contentAddress = this.video.contentSrcToContentAddress(this.video.props.src);\n if (this.videoSource === null || this.videoSource.getContentAddress() !== contentAddress) {\n this.clearSource();\n\n const video = document.createElement(\"video\");\n video.playsInline = true;\n // Muted allows autoplay immediately without the user needing to interact with the document\n // Video will be unmuted when the audiocontext is available\n video.muted = true;\n video.autoplay = true;\n video.crossOrigin = \"anonymous\";\n\n const audioListener = this.getAudioListener();\n const audioContext = audioListener.context;\n\n const audio = new THREE.PositionalAudio(audioListener);\n audio.setMediaElementSource(video);\n audio.setVolume(this.video.props.volume);\n audio.setRefDistance(audioRefDistance);\n audio.setRolloffFactor(audioRolloffFactor);\n this.loadedVideoState = {\n video,\n audio,\n videoTexture: null,\n };\n this.updateMaterialEmissiveIntensity();\n this.video.getContainer().add(audio);\n\n const url = new URL(contentAddress);\n if (WHEPVideoSource.isWHEPURL(url)) {\n this.videoSource = new WHEPVideoSource(url, video);\n } else {\n this.videoSource = new StaticFileVideoSource(url, video, this.video.props, () => {\n return this.video.getDocumentTime();\n });\n }\n\n audioContext.addEventListener(\"statechange\", () => {\n this.syncVideoTime();\n });\n video.addEventListener(\"loadeddata\", () => {\n if (!this.loadedVideoState || this.loadedVideoState.video !== video) {\n // Video was changed before it loaded\n return;\n }\n\n const videoTexture = new THREE.VideoTexture(video);\n this.videoMaterial.map = videoTexture;\n this.videoMaterial.needsUpdate = true;\n this.mesh.material = this.videoMaterial;\n this.loadedVideoState.videoTexture = videoTexture;\n\n this.syncVideoTime();\n this.updateWidthAndHeight();\n this.updateMaterialEmissiveIntensity();\n });\n }\n }\n\n if (this.videoSource) {\n this.syncVideoTime();\n }\n }\n\n private clearSource() {\n if (this.videoSource) {\n this.videoSource.dispose();\n this.videoSource = null;\n }\n if (this.loadedVideoState) {\n const tag = this.loadedVideoState.video;\n // There is an existing src - stop playing to allow changing it\n tag.pause();\n tag.src = \"\";\n tag.load();\n this.loadedVideoState = null;\n this.mesh.material = disabledVideoMaterial;\n this.updateWidthAndHeight();\n }\n }\n\n dispose() {\n this.clearSource();\n if (this.loadedVideoState) {\n this.loadedVideoState = null;\n }\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.loadedVideoState && this.loadedVideoState.videoTexture) {\n if (this.video.props.emissive > 0) {\n this.videoMaterial.emissive = new THREE.Color(0xffffff);\n this.videoMaterial.emissiveMap = this.loadedVideoState.videoTexture;\n this.videoMaterial.emissiveIntensity = this.video.props.emissive;\n this.videoMaterial.needsUpdate = true;\n } else {\n this.videoMaterial.emissive = new THREE.Color(0x000000);\n this.videoMaterial.emissiveMap = null;\n this.videoMaterial.emissiveIntensity = 1;\n this.videoMaterial.needsUpdate = true;\n }\n }\n }\n\n private updateWidthAndHeight() {\n const mesh = this.mesh;\n\n const { width, height } = calculateContentSize({\n content: this.loadedVideoState\n ? {\n width: this.loadedVideoState.video.videoWidth,\n height: this.loadedVideoState.video.videoHeight,\n }\n : undefined,\n width: this.video.props.width,\n height: this.video.props.height,\n });\n mesh.scale.x = width;\n mesh.scale.y = height;\n\n this.updateMeshCallback();\n }\n}\n", "import * as THREE from \"three\";\n\nimport { ThreeJSImageResource } from \"./ThreeJSImageResource\";\n\nexport interface ThreeJSImageResourceResult {\n texture: THREE.Texture;\n width: number;\n height: number;\n hasTransparency: boolean;\n}\n\nexport interface ThreeJSImageHandle {\n readonly url: string;\n onProgress(onProgress: (loaded: number, total: number) => void): void;\n onLoad(onLoad: (result: ThreeJSImageResourceResult | Error) => void): void;\n getResult(): ThreeJSImageResourceResult | Error | null;\n dispose(): void;\n}\n\nexport class ThreeJSImageHandleImpl implements ThreeJSImageHandle {\n private onLoadCallbacks = new Set<(result: ThreeJSImageResourceResult | Error) => void>();\n private onProgressCallbacks = new Set<(loaded: number, total: number) => void>();\n private result: ThreeJSImageResourceResult | Error | null = null;\n public readonly url: string;\n\n constructor(private imageResource: ThreeJSImageResource) {\n this.url = imageResource.url;\n }\n\n onProgress(onProgress: (loaded: number, total: number) => void): void {\n this.onProgressCallbacks.add(onProgress);\n }\n\n onLoad(onLoad: (result: ThreeJSImageResourceResult | Error) => void): void {\n this.onLoadCallbacks.add(onLoad);\n if (this.result) {\n onLoad(this.result);\n }\n }\n\n getResult(): ThreeJSImageResourceResult | Error | null {\n return this.result;\n }\n\n handleProgress(loaded: number, total: number): void {\n for (const onProgressCallback of this.onProgressCallbacks) {\n onProgressCallback(loaded, total);\n }\n }\n\n handleLoaded(result: ThreeJSImageResourceResult): void {\n this.result = result;\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(result);\n }\n }\n\n handleError(error: Error): void {\n this.result = error;\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(error);\n }\n }\n\n dispose(): void {\n this.imageResource.disposeHandle(this);\n }\n}\n", "import * as THREE from \"three\";\n\nimport {\n ThreeJSImageHandle,\n ThreeJSImageHandleImpl,\n ThreeJSImageResourceResult,\n} from \"./ThreeJSImageHandle\";\nimport { ThreeJSImageLoader } from \"./ThreeJSImageLoader\";\n\nexport class ThreeJSImageResource {\n private imageHandles = new Set<ThreeJSImageHandleImpl>();\n private imageElement: HTMLImageElement | null = null;\n private texture: THREE.CanvasTexture | null = null;\n private hasTransparency: boolean = false;\n\n private abortController: AbortController | null = null;\n\n constructor(\n public readonly url: string,\n private onRemove: () => void,\n ) {\n this.abortController = new AbortController();\n\n // Load the image\n ThreeJSImageLoader.load(\n url,\n (image: HTMLImageElement) => {\n // Image loaded successfully\n this.imageElement = image;\n this.hasTransparency = hasTransparency(image);\n this.texture = new THREE.CanvasTexture(\n image,\n ) as unknown as THREE.CanvasTexture<HTMLCanvasElement>;\n const result: ThreeJSImageResourceResult = {\n texture: this.texture,\n width: image.width,\n height: image.height,\n hasTransparency: this.hasTransparency,\n };\n for (const imageHandle of this.imageHandles) {\n imageHandle.handleLoaded(result);\n }\n this.abortController = null;\n },\n (error: ErrorEvent) => {\n // Error loading\n const errorObj = new Error(`Failed to load image: ${error.message}`);\n for (const imageHandle of this.imageHandles) {\n imageHandle.handleError(errorObj);\n }\n this.abortController = null;\n },\n this.abortController.signal,\n );\n }\n\n public getResult(): ThreeJSImageResourceResult | null {\n if (this.texture && this.imageElement) {\n return {\n texture: this.texture,\n width: this.imageElement.width,\n height: this.imageElement.height,\n hasTransparency: this.hasTransparency,\n };\n }\n return null;\n }\n\n public createHandle(): ThreeJSImageHandle {\n const imageHandle = new ThreeJSImageHandleImpl(this);\n this.imageHandles.add(imageHandle);\n const result = this.getResult();\n if (result !== null) {\n imageHandle.handleLoaded(result);\n }\n return imageHandle;\n }\n\n public disposeHandle(imageHandle: ThreeJSImageHandleImpl): void {\n this.imageHandles.delete(imageHandle);\n if (this.imageHandles.size === 0) {\n this.abortController?.abort();\n this.abortController = null;\n if (this.texture) {\n this.texture.dispose();\n this.texture = null;\n }\n this.imageElement = null;\n this.onRemove();\n }\n }\n}\n\nfunction hasTransparency(image: HTMLImageElement) {\n if (image.width === 0 || image.height === 0) {\n return false;\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = image.width;\n canvas.height = image.height;\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true }) as CanvasRenderingContext2D;\n ctx.drawImage(image, 0, 0);\n\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;\n\n for (let i = 3, n = imageData.length; i < n; i += 4) {\n if (imageData[i] < 255) {\n return true;\n }\n }\n return false;\n}\n", "export class ThreeJSImageLoader {\n static load(\n url: string,\n onLoad: (image: HTMLImageElement) => void,\n onError: (error: ErrorEvent) => void,\n abortSignal: AbortSignal,\n ) {\n const image = document.createElement(\"img\");\n image.crossOrigin = \"anonymous\";\n\n function onImageLoad() {\n removeEventListeners();\n onLoad(this);\n }\n\n function onImageError(event: ErrorEvent) {\n removeEventListeners();\n onError(event);\n }\n\n function removeEventListeners() {\n image.removeEventListener(\"load\", onImageLoad, false);\n image.removeEventListener(\"error\", onImageError, false);\n }\n\n abortSignal.addEventListener(\"abort\", () => {\n removeEventListeners();\n image.src = \"\";\n });\n\n image.addEventListener(\"load\", onImageLoad, false);\n image.addEventListener(\"error\", onImageError, false);\n\n image.src = url;\n\n return image;\n }\n}\n", "import * as THREE from \"three\";\n\nexport interface ThreeJSLabelResourceResult {\n texture: THREE.CanvasTexture | THREE.DataTexture;\n width: number;\n height: number;\n}\n\nexport interface ThreeJSLabelHandle {\n onLoad(onLoad: (result: ThreeJSLabelResourceResult | Error) => void): void;\n getResult(): ThreeJSLabelResourceResult | Error | null;\n dispose(): void;\n}\n\nexport class ThreeJSLabelHandleImpl implements ThreeJSLabelHandle {\n private onLoadCallbacks = new Set<(result: ThreeJSLabelResourceResult | Error) => void>();\n private result: ThreeJSLabelResourceResult | Error | null = null;\n\n constructor(private labelResource: { disposeHandle: (handle: ThreeJSLabelHandleImpl) => void }) {}\n\n onLoad(onLoad: (result: ThreeJSLabelResourceResult | Error) => void): void {\n this.onLoadCallbacks.add(onLoad);\n if (this.result) {\n onLoad(this.result);\n }\n }\n\n getResult(): ThreeJSLabelResourceResult | Error | null {\n return this.result;\n }\n\n handleLoaded(result: ThreeJSLabelResourceResult): void {\n this.result = result;\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(result);\n }\n }\n\n handleError(error: Error): void {\n this.result = error;\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(error);\n }\n }\n\n dispose(): void {\n this.labelResource.disposeHandle(this);\n }\n}\n", "import { CanvasText } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport {\n ThreeJSLabelHandle,\n ThreeJSLabelHandleImpl,\n ThreeJSLabelResourceResult,\n} from \"./ThreeJSLabelHandle\";\n\nexport type ThreeJSLabelResourceOptions = {\n content: string;\n fontSize: number;\n paddingPx: number;\n textColorRGB255A1: { r: number; g: number; b: number; a: number };\n backgroundColorRGB255A1: { r: number; g: number; b: number; a: number };\n dimensions: { width: number; height: number };\n alignment: string;\n bold: boolean;\n};\n\nexport class ThreeJSLabelResource {\n private static readonly DEFAULT_MAX_TEXTURE_SIZE = 1024;\n private static sharedCanvasText: CanvasText | null = null;\n private handles = new Set<ThreeJSLabelHandleImpl>();\n private result: { texture: THREE.DataTexture; width: number; height: number } | null = null;\n\n constructor(\n options: ThreeJSLabelResourceOptions,\n private onRemove: () => void,\n private maxTextureSize: number = ThreeJSLabelResource.DEFAULT_MAX_TEXTURE_SIZE,\n ) {\n // Synchronously generate texture\n if (!ThreeJSLabelResource.sharedCanvasText) {\n ThreeJSLabelResource.sharedCanvasText = new CanvasText();\n }\n const scale = Math.min(\n 1,\n Math.min(\n this.maxTextureSize / options.dimensions.width,\n this.maxTextureSize / options.dimensions.height,\n ),\n );\n const clampedDimensions = {\n width: options.dimensions.width * scale,\n height: options.dimensions.height * scale,\n };\n\n const canvasText = ThreeJSLabelResource.sharedCanvasText;\n const canvas = canvasText.renderText(options.content, {\n bold: options.bold,\n fontSize: options.fontSize * scale,\n paddingPx: options.paddingPx * scale,\n textColorRGB255A1: options.textColorRGB255A1,\n backgroundColorRGB255A1: options.backgroundColorRGB255A1,\n dimensions: clampedDimensions,\n alignment: options.alignment,\n });\n\n let texture: THREE.DataTexture;\n // If the canvas has zero dimensions, return a minimal transparent texture to avoid IndexSizeError\n if (canvas.width === 0 || canvas.height === 0) {\n const emptyPixel = new Uint8Array([0, 0, 0, 0]);\n texture = new THREE.DataTexture(emptyPixel, 1, 1, THREE.RGBAFormat);\n } else {\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true }) as CanvasRenderingContext2D;\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n texture = new THREE.DataTexture(\n imageData.data as unknown as Uint8Array,\n canvas.width,\n canvas.height,\n THREE.RGBAFormat,\n );\n }\n texture.flipY = true;\n texture.colorSpace = THREE.NoColorSpace;\n texture.premultiplyAlpha = true;\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipmapLinearFilter;\n texture.generateMipmaps = true;\n texture.needsUpdate = true;\n this.result = {\n texture,\n width: canvas.width,\n height: canvas.height,\n };\n }\n\n public getResult(): ThreeJSLabelResourceResult | null {\n return this.result;\n }\n\n public createHandle(): ThreeJSLabelHandle {\n const handle = new ThreeJSLabelHandleImpl({\n disposeHandle: this.disposeHandle.bind(this),\n });\n this.handles.add(handle);\n if (this.result) {\n handle.handleLoaded(this.result);\n }\n return handle;\n }\n\n public disposeHandle(handle: ThreeJSLabelHandleImpl): void {\n this.handles.delete(handle);\n if (this.handles.size === 0) {\n if (this.result && this.result.texture) {\n this.result.texture.dispose();\n }\n this.result = null;\n this.onRemove();\n }\n }\n}\n", "import { ModelLoadResult } from \"@mml-io/model-loader\";\nimport { Group } from \"three\";\nimport * as SkeletonUtils from \"three/examples/jsm/utils/SkeletonUtils.js\";\n\nimport { ThreeJSModelResource } from \"./ThreeJSModelResource\";\n\nexport interface ThreeJSModelHandle {\n readonly url: string;\n onProgress(onProgress: (loaded: number, total: number) => void): void;\n onLoad(onLoad: (result: ModelLoadResult | Error) => void): void;\n getResult(): ModelLoadResult | Error | null;\n dispose(): void;\n}\n\nexport class ThreeJSModelHandleImpl implements ThreeJSModelHandle {\n private onLoadCallbacks = new Set<(result: ModelLoadResult | Error) => void>();\n\n private onProgressCallbacks = new Set<(loaded: number, total: number) => void>();\n\n private result: ModelLoadResult | Error | null = null;\n public readonly url: string;\n\n constructor(private modelResource: ThreeJSModelResource) {\n this.url = modelResource.url;\n }\n\n onProgress(onProgress: (loaded: number, total: number) => void): void {\n this.onProgressCallbacks.add(onProgress);\n }\n\n onLoad(onLoad: (result: ModelLoadResult | Error) => void): void {\n this.onLoadCallbacks.add(onLoad);\n if (this.result) {\n onLoad(this.result);\n }\n }\n\n getResult(): ModelLoadResult | Error | null {\n return this.result;\n }\n\n handleProgress(loaded: number, total: number): void {\n for (const onProgressCallback of this.onProgressCallbacks) {\n onProgressCallback(loaded, total);\n }\n }\n\n handleLoaded(result: ModelLoadResult): void {\n // This is a model result, so we need to clone it (shallow clone to reuse material instances)\n const clonedGroup = SkeletonUtils.clone(result.group);\n this.result = {\n group: clonedGroup as Group,\n animations: result.animations,\n };\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(this.result);\n }\n }\n\n handleError(error: Error): void {\n this.result = error;\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(error);\n }\n }\n\n dispose(): void {\n this.modelResource.disposeHandle(this);\n }\n}\n", "import { ModelLoader, ModelLoadResult } from \"@mml-io/model-loader\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSModelHandle, ThreeJSModelHandleImpl } from \"./ThreeJSModelHandle\";\n\nexport class ThreeJSModelResource {\n private static readonly DEFAULT_MAX_TEXTURE_SIZE = 2048;\n\n private static modelLoader: ModelLoader | null = null;\n private static getModelLoader(): ModelLoader {\n if (!ThreeJSModelResource.modelLoader) {\n ThreeJSModelResource.modelLoader = new ModelLoader();\n }\n return ThreeJSModelResource.modelLoader;\n }\n\n private modelHandles = new Set<ThreeJSModelHandleImpl>();\n private modelResult: ModelLoadResult | null = null;\n\n private abortController: AbortController | null = null;\n\n constructor(\n public readonly url: string,\n private onRemove: () => void,\n private maxTextureSize: number = ThreeJSModelResource.DEFAULT_MAX_TEXTURE_SIZE,\n ) {\n this.abortController = new AbortController();\n ThreeJSModelResource.getModelLoader()\n .load(\n url,\n (loaded, total) => {\n // progress\n for (const modelHandle of this.modelHandles) {\n modelHandle.handleProgress(loaded, total);\n }\n },\n this.abortController,\n )\n .then((result) => {\n // load\n this.modelResult = result;\n // Clamp all material textures on this model to a maximum size\n try {\n ThreeJSModelResource.clampTexturesToMaxSize(result.group, this.maxTextureSize);\n } catch (e) {\n // Ignore texture clamping errors to avoid blocking model load\n\n console.warn(\"Texture clamping failed\", e);\n }\n\n for (const modelHandle of this.modelHandles) {\n modelHandle.handleLoaded(result);\n }\n })\n .finally(() => {\n this.abortController = null;\n });\n }\n\n public getResult(): ModelLoadResult | null {\n return this.modelResult;\n }\n\n public createHandle(): ThreeJSModelHandle {\n const modelHandle = new ThreeJSModelHandleImpl(this);\n this.modelHandles.add(modelHandle);\n if (this.modelResult !== null) {\n modelHandle.handleLoaded(this.modelResult);\n }\n return modelHandle;\n }\n\n public disposeHandle(modelHandle: ThreeJSModelHandleImpl): void {\n this.modelHandles.delete(modelHandle);\n if (this.modelHandles.size === 0) {\n this.abortController?.abort();\n this.abortController = null;\n this.onRemove();\n }\n }\n\n private static clampTexturesToMaxSize(root: THREE.Object3D, maxSize: number): void {\n const processedTextures = new Set<THREE.Texture>();\n\n root.traverse((object) => {\n const maybeMesh = object as unknown as THREE.Mesh;\n if ((maybeMesh as any).isMesh) {\n const material = maybeMesh.material as THREE.Material | THREE.Material[] | undefined;\n if (!material) {\n return;\n }\n if (Array.isArray(material)) {\n for (const mat of material) {\n ThreeJSModelResource.processMaterialTextures(mat, maxSize, processedTextures);\n }\n } else {\n ThreeJSModelResource.processMaterialTextures(material, maxSize, processedTextures);\n }\n }\n });\n }\n\n private static processMaterialTextures(\n material: THREE.Material,\n maxSize: number,\n processed: Set<THREE.Texture>,\n ): void {\n const materialAny = material as any;\n for (const key of Object.keys(materialAny)) {\n const value = materialAny[key];\n if (value && typeof value === \"object\" && (value as any).isTexture) {\n const texture = value as THREE.Texture;\n if (processed.has(texture)) {\n continue;\n }\n processed.add(texture);\n ThreeJSModelResource.resizeTextureIfTooLarge(texture, maxSize);\n }\n }\n }\n\n private static resizeTextureIfTooLarge(texture: THREE.Texture, maxSize: number): void {\n const texAny = texture as any;\n if (texAny.isCompressedTexture || texAny.isCubeTexture || texAny.isVideoTexture) {\n return;\n }\n\n const image: any = texAny.image ?? texAny.source?.data;\n if (!image || typeof image.width !== \"number\" || typeof image.height !== \"number\") {\n return;\n }\n\n const width: number = image.width;\n const height: number = image.height;\n if (width <= maxSize && height <= maxSize) {\n return;\n }\n\n console.warn(\n \"Texture resizing is being performed. Original size: \",\n width,\n height,\n \"Maximum size: \",\n maxSize,\n );\n\n const scale = Math.min(maxSize / width, maxSize / height);\n const newWidth = Math.max(1, Math.floor(width * scale));\n const newHeight = Math.max(1, Math.floor(height * scale));\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = newWidth;\n canvas.height = newHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n try {\n ctx.drawImage(image, 0, 0, newWidth, newHeight);\n if (texAny.source && texAny.source.data !== undefined) {\n texAny.source.data = canvas;\n }\n texture.image = canvas;\n texture.needsUpdate = true;\n } catch {\n // Ignore draw errors (e.g., cross-origin or unsupported image types)\n }\n }\n}\n", "import { ThreeJSImageHandle } from \"./ThreeJSImageHandle\";\nimport { ThreeJSImageResource } from \"./ThreeJSImageResource\";\nimport { ThreeJSLabelHandle } from \"./ThreeJSLabelHandle\";\nimport { ThreeJSLabelResource, ThreeJSLabelResourceOptions } from \"./ThreeJSLabelResource\";\nimport { ThreeJSModelHandle } from \"./ThreeJSModelHandle\";\nimport { ThreeJSModelResource } from \"./ThreeJSModelResource\";\n\nexport type ThreeJSResourceManagerOptions = {\n modelMaxTextureSize?: number;\n labelMaxTextureSize?: number;\n};\n\nexport class ThreeJSResourceManager {\n private modelResources = new Map<string, ThreeJSModelResource>();\n private imageResources = new Map<string, ThreeJSImageResource>();\n private labelResources = new Map<string, ThreeJSLabelResource>();\n\n constructor(private options: ThreeJSResourceManagerOptions = {}) {}\n\n public loadModel(url: string): ThreeJSModelHandle {\n let modelResource = this.modelResources.get(url);\n if (!modelResource) {\n modelResource = new ThreeJSModelResource(\n url,\n () => {\n this.modelResources.delete(url);\n },\n this.options.modelMaxTextureSize,\n );\n this.modelResources.set(url, modelResource);\n }\n return modelResource.createHandle();\n }\n\n public loadImage(url: string): ThreeJSImageHandle {\n let imageResource = this.imageResources.get(url);\n if (!imageResource) {\n imageResource = new ThreeJSImageResource(url, () => {\n this.imageResources.delete(url);\n });\n this.imageResources.set(url, imageResource);\n }\n return imageResource.createHandle();\n }\n\n public loadLabel(options: ThreeJSLabelResourceOptions): ThreeJSLabelHandle {\n const key = buildLabelResourceKey(options);\n let labelResource = this.labelResources.get(key);\n if (!labelResource) {\n labelResource = new ThreeJSLabelResource(\n options,\n () => {\n this.labelResources.delete(key);\n },\n this.options.labelMaxTextureSize,\n );\n this.labelResources.set(key, labelResource);\n }\n return labelResource.createHandle();\n }\n}\n\nfunction buildLabelResourceKey(options: ThreeJSLabelResourceOptions): string {\n const key = {\n content: options.content,\n fontSize: options.fontSize * 2,\n paddingPx: options.paddingPx,\n textColorRGB255A1: {\n r: Math.round(options.textColorRGB255A1.r * 255),\n g: Math.round(options.textColorRGB255A1.g * 255),\n b: Math.round(options.textColorRGB255A1.b * 255),\n a: options.textColorRGB255A1.a ?? 1,\n },\n backgroundColorRGB255A1: {\n r: Math.round(options.backgroundColorRGB255A1.r * 255),\n g: Math.round(options.backgroundColorRGB255A1.g * 255),\n b: Math.round(options.backgroundColorRGB255A1.b * 255),\n a: options.backgroundColorRGB255A1.a ?? 1,\n },\n dimensions: {\n width: options.dimensions.width * 200,\n height: options.dimensions.height * 200,\n },\n alignment: options.alignment,\n bold: true,\n };\n return JSON.stringify(key);\n}\n", "import {\n EventHandlerCollection,\n getRelativePositionAndRotationRelativeToObject,\n MElement,\n} from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nconst mouseMovePixelsThreshold = 10;\nconst mouseMoveTimeThresholdMilliseconds = 500;\n\n/**\n * The ThreeJSClickTrigger class is responsible for handling click events on the MML scene and raycasts into the scene to\n * determine which object was clicked and then dispatches events to those elements.\n */\nexport class ThreeJSClickTrigger {\n private eventHandlerCollection: EventHandlerCollection = new EventHandlerCollection();\n private raycaster: THREE.Raycaster;\n private mouseDownTime: number | null = null;\n private mouseMoveDelta = 0;\n\n static init(\n clickTarget: Document | HTMLElement,\n rootContainer: THREE.Object3D,\n camera: THREE.Camera,\n ): ThreeJSClickTrigger {\n return new ThreeJSClickTrigger(clickTarget, rootContainer, camera);\n }\n\n private constructor(\n private clickTarget: Document | HTMLElement,\n private rootContainer: THREE.Object3D,\n private camera: THREE.Camera,\n ) {\n this.raycaster = new THREE.Raycaster();\n\n this.eventHandlerCollection.add(clickTarget, \"mousedown\", this.handleMouseDown.bind(this));\n this.eventHandlerCollection.add(clickTarget, \"mouseup\", this.handleMouseUp.bind(this));\n this.eventHandlerCollection.add(clickTarget, \"mousemove\", this.handleMouseMove.bind(this));\n }\n\n private handleMouseDown() {\n this.mouseDownTime = Date.now();\n this.mouseMoveDelta = 0;\n }\n\n private handleMouseUp(event: MouseEvent) {\n if (!this.mouseDownTime) {\n return;\n }\n const duration = Date.now() - this.mouseDownTime;\n this.mouseDownTime = null;\n if (\n this.mouseMoveDelta < mouseMovePixelsThreshold &&\n duration < mouseMoveTimeThresholdMilliseconds\n ) {\n this.handleClick(event);\n }\n }\n\n private handleMouseMove(event: MouseEvent) {\n if (this.mouseDownTime) {\n this.mouseMoveDelta += Math.abs(event.movementX) + Math.abs(event.movementY);\n }\n }\n\n private handleClick(event: MouseEvent) {\n if ((event.detail as any).element) {\n // Avoid infinite loop of handling click events that originated from this trigger\n return;\n }\n let x = 0;\n let y = 0;\n if (!document.pointerLockElement) {\n let width = window.innerWidth;\n let height = window.innerHeight;\n if (this.clickTarget instanceof HTMLElement) {\n width = this.clickTarget.offsetWidth;\n height = this.clickTarget.offsetHeight;\n }\n x = (event.offsetX / width) * 2 - 1;\n y = -((event.offsetY / height) * 2 - 1);\n }\n this.raycaster.setFromCamera(new THREE.Vector2(x, y), this.camera);\n const intersections = this.raycaster.intersectObject(this.rootContainer, true);\n if (intersections.length > 0) {\n for (const intersection of intersections) {\n let obj: THREE.Object3D | null = intersection.object;\n currentIntersection: while (obj) {\n /*\n Ignore scene objects that have a transparent or wireframe material\n */\n if (this.isMaterialIgnored(obj)) {\n break currentIntersection;\n }\n\n const mElement = MElement.getMElementFromObject(obj);\n if (!mElement) {\n // The intersection object is not an MElement, so we move up to the parent recursively which may be an MElement\n obj = obj.parent;\n continue currentIntersection;\n }\n\n if (!mElement.isClickable()) {\n // This is not a clickable element (or it is explicitly set to not be clickable), so we ignore it and pass through to the next intersection\n break currentIntersection;\n }\n\n // This is a clickable element, so we dispatch the click event to it\n const elementRelative = getRelativePositionAndRotationRelativeToObject(\n {\n position: intersection.point,\n rotation: {\n x: 0,\n y: 0,\n z: 0,\n },\n },\n mElement,\n );\n mElement.dispatchEvent(\n new CustomEvent(\"click\", {\n bubbles: true,\n detail: {\n position: {\n ...elementRelative.position,\n },\n },\n }),\n );\n return;\n }\n }\n }\n }\n\n dispose() {\n this.eventHandlerCollection.clear();\n }\n\n private isMaterialIgnored(obj: THREE.Object3D): boolean {\n const mesh = obj as THREE.Mesh;\n if (mesh) {\n if (\n ((mesh.material as THREE.MeshLambertMaterial) &&\n (mesh.material as THREE.MeshLambertMaterial).wireframe) ||\n ((mesh.material as THREE.MeshPhongMaterial) &&\n (mesh.material as THREE.MeshPhongMaterial).wireframe) ||\n ((mesh.material as THREE.MeshPhysicalMaterial) &&\n (mesh.material as THREE.MeshPhysicalMaterial).wireframe) ||\n ((mesh.material as THREE.MeshStandardMaterial) &&\n (mesh.material as THREE.MeshStandardMaterial).wireframe) ||\n ((mesh.material as THREE.LineBasicMaterial) &&\n (mesh.material as THREE.LineBasicMaterial).isLineBasicMaterial)\n ) {\n return true;\n }\n }\n return false;\n }\n}\n", "import { MMLGraphicsInterface } from \"@mml-io/mml-web\";\n\nimport * as ThreeJSElements from \"./elements\";\nimport { ThreeJSGraphicsAdapter } from \"./ThreeJSGraphicsAdapter\";\n\nexport const ThreeJSGraphicsInterface: MMLGraphicsInterface<ThreeJSGraphicsAdapter> = {\n MElementGraphicsInterface: (element) => new ThreeJSElements.ThreeJSMElement(element),\n MMLDebugHelperGraphicsInterface: (debugHelper) =>\n new ThreeJSElements.ThreeJSDebugHelper(debugHelper),\n MMLAudioGraphicsInterface: (element) => new ThreeJSElements.ThreeJSAudio(element),\n MMLChatProbeGraphicsInterface: (element) => new ThreeJSElements.ThreeJSChatProbe(element),\n MMLCubeGraphicsInterface: (element) => new ThreeJSElements.ThreeJSCube(element),\n MMLCylinderGraphicsInterface: (element) => new ThreeJSElements.ThreeJSCylinder(element),\n MMLFrameGraphicsInterface: (element) => new ThreeJSElements.ThreeJSFrame(element),\n MMLImageGraphicsInterface: (element, updateMeshCallback) =>\n new ThreeJSElements.ThreeJSImage(element, updateMeshCallback),\n MMLInteractionGraphicsInterface: (element) => new ThreeJSElements.ThreeJSInteraction(element),\n MMLLabelGraphicsInterface: (element) => new ThreeJSElements.ThreeJSLabel(element),\n MMLLightGraphicsInterface: (element) => new ThreeJSElements.ThreeJSLight(element),\n MMLOverlayGraphicsInterface: (element) => new ThreeJSElements.ThreeJSOverlay(element),\n MMLLinkGraphicsInterface: (element) => new ThreeJSElements.ThreeJSLink(element),\n MMLModelGraphicsInterface: (element, updateMeshCallback) =>\n new ThreeJSElements.ThreeJSModel(element, updateMeshCallback),\n MMLPlaneGraphicsInterface: (element) => new ThreeJSElements.ThreeJSPlane(element),\n MMLPositionProbeGraphicsInterface: (element) => new ThreeJSElements.ThreeJSPositionProbe(element),\n MMLPromptGraphicsInterface: (element) => new ThreeJSElements.ThreeJSPrompt(element),\n MMLSphereGraphicsInterface: (element) => new ThreeJSElements.ThreeJSSphere(element),\n MMLTransformableGraphicsInterface: (element) => new ThreeJSElements.ThreeJSTransformable(element),\n MMLVideoGraphicsInterface: (element, updateMeshCallback: () => void) =>\n new ThreeJSElements.ThreeJSVideo(element, updateMeshCallback),\n MMLAnimationGraphicsInterface: (element) => new ThreeJSElements.ThreeJSAnimation(element),\n RemoteDocumentGraphicsInterface: (element) => new ThreeJSElements.ThreeJSRemoteDocument(element),\n};\n", "import { Interaction } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"./ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSInteractionAdapter {\n private static worldPos = new THREE.Vector3();\n\n private static matrix = new THREE.Matrix4();\n private static frustum = new THREE.Frustum();\n\n private static raycaster = new THREE.Raycaster();\n private static intersections = new Array<THREE.Intersection<THREE.Object3D>>();\n private static direction = new THREE.Vector3();\n\n static interactionShouldShowDistance(\n interaction: Interaction<ThreeJSGraphicsAdapter>,\n camera: THREE.Camera,\n scene: THREE.Scene,\n ): number | null {\n const worldPos = interaction\n .getContainer()\n .getWorldPosition(ThreeJSInteractionAdapter.worldPos);\n\n const cameraPos = camera.position;\n const distance = cameraPos.distanceTo(worldPos);\n if (distance > interaction.props.range) {\n return null;\n }\n\n if (interaction.props.inFocus) {\n ThreeJSInteractionAdapter.matrix.multiplyMatrices(\n camera.projectionMatrix,\n camera.matrixWorldInverse,\n );\n ThreeJSInteractionAdapter.frustum.setFromProjectionMatrix(ThreeJSInteractionAdapter.matrix);\n if (!ThreeJSInteractionAdapter.frustum.containsPoint(worldPos)) {\n return null;\n }\n }\n\n if (interaction.props.lineOfSight) {\n const raycastResults = ThreeJSInteractionAdapter.getRaycastResults(\n cameraPos,\n worldPos,\n distance,\n scene,\n );\n if (raycastResults.length > 0) {\n for (const result of raycastResults) {\n if (!ThreeJSInteractionAdapter.hasAncestor(result.object, interaction.getContainer())) {\n return null;\n }\n }\n }\n }\n\n return distance;\n }\n\n static getRaycastResults(\n a: THREE.Vector3,\n b: THREE.Vector3,\n distance: number,\n scene: THREE.Scene,\n ) {\n ThreeJSInteractionAdapter.direction.copy(b);\n ThreeJSInteractionAdapter.direction.sub(a);\n ThreeJSInteractionAdapter.direction.normalize();\n\n ThreeJSInteractionAdapter.raycaster.set(a, ThreeJSInteractionAdapter.direction);\n ThreeJSInteractionAdapter.raycaster.near = 0;\n ThreeJSInteractionAdapter.raycaster.far = distance;\n\n ThreeJSInteractionAdapter.intersections.length = 0;\n ThreeJSInteractionAdapter.raycaster.intersectObject(\n scene,\n true,\n ThreeJSInteractionAdapter.intersections,\n );\n return ThreeJSInteractionAdapter.intersections;\n }\n\n static hasAncestor(object: THREE.Object3D, ancestor: THREE.Object3D): boolean {\n let parent = object.parent;\n while (parent !== null) {\n if (parent === ancestor) {\n return true;\n }\n parent = parent.parent;\n }\n return false;\n }\n}\n", "import * as THREE from \"three\";\n\ninterface GeometryInfo {\n name: string;\n uuid: string;\n memoryBytes: number;\n vertexCount: number;\n triangleCount: number;\n usedByObjects: string[];\n objectPaths: string[];\n usedByObjectInstanceIds: string[];\n}\n\ninterface TextureInfo {\n name: string;\n uuid: string;\n memoryBytes: number;\n width: number;\n height: number;\n format: string;\n usedByMaterials: string[];\n usedByObjects: string[];\n usedByObjectPaths: string[];\n usedByObjectInstanceIds: string[];\n url?: string;\n sourceType: string;\n}\n\ninterface MaterialInfo {\n name: string;\n uuid: string;\n textureCount: number;\n textures: TextureInfo[];\n usedByObjects: string[];\n}\n\ninterface MemoryStats {\n totalGeometryMemory: number;\n totalTextureMemory: number;\n totalMemory: number;\n geometryCount: number;\n textureCount: number;\n materialCount: number;\n}\n\nexport class ThreeJSMemoryInspector {\n /**\n * Opens a new window with a comprehensive memory report including thumbnails\n */\n public static openMemoryReport(scene: THREE.Scene): void {\n const reportWindow = window.open(\n \"\",\n \"_blank\",\n \"width=1200,height=800,scrollbars=yes,resizable=yes\",\n );\n\n if (!reportWindow) {\n console.error(\"Failed to open memory report window. Please check popup blockers.\");\n return;\n }\n\n // Collect memory data and generate thumbnails\n const { geometries, textures, materials, stats } = ThreeJSMemoryInspector.analyzeScene(scene);\n const textureThumbnails = ThreeJSMemoryInspector.generateTextureThumbnails(scene);\n const geometryPreviews = ThreeJSMemoryInspector.generateGeometryPreviews(scene);\n\n // Build the UI programmatically in the popup window\n ThreeJSMemoryInspector.buildReportUI(\n reportWindow.document,\n geometries,\n textures,\n materials,\n stats,\n textureThumbnails,\n geometryPreviews,\n );\n }\n\n public static analyzeScene(scene: THREE.Scene): {\n geometries: Map<string, GeometryInfo>;\n textures: Map<string, TextureInfo>;\n materials: Map<string, MaterialInfo>;\n stats: MemoryStats;\n } {\n const geometries = new Map<string, GeometryInfo>();\n const textures = new Map<string, TextureInfo>();\n const materials = new Map<string, MaterialInfo>();\n\n // First pass: collect all assets and their relationships\n scene.traverse((object) => {\n const asMesh = object as THREE.Mesh;\n if (asMesh.isMesh) {\n const objectPath = ThreeJSMemoryInspector.getObjectPath(asMesh, scene);\n const objectName = ThreeJSMemoryInspector.getObjectDisplayName(asMesh);\n\n // Collect geometry info\n if (asMesh.geometry) {\n const geometry = asMesh.geometry;\n if (!geometries.has(geometry.uuid)) {\n geometries.set(\n geometry.uuid,\n ThreeJSMemoryInspector.analyzeGeometry(geometry, objectName, objectPath, asMesh.uuid),\n );\n } else {\n // Add this instance to geometry usage (dedupe by instance id)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const geometryInfo = geometries.get(geometry.uuid)!;\n if (!geometryInfo.usedByObjectInstanceIds.includes(asMesh.uuid)) {\n geometryInfo.usedByObjectInstanceIds.push(asMesh.uuid);\n geometryInfo.usedByObjects.push(objectName);\n geometryInfo.objectPaths.push(objectPath);\n }\n }\n }\n\n // Collect material info\n const materialsArray = Array.isArray(asMesh.material) ? asMesh.material : [asMesh.material];\n materialsArray.forEach((material) => {\n if (material) {\n if (!materials.has(material.uuid)) {\n const materialInfo = ThreeJSMemoryInspector.analyzeMaterial(\n material,\n objectName,\n objectPath,\n asMesh.uuid,\n );\n materials.set(material.uuid, materialInfo);\n\n // Collect textures from this material\n materialInfo.textures.forEach((textureInfo) => {\n if (!textures.has(textureInfo.uuid)) {\n textures.set(textureInfo.uuid, textureInfo);\n } else {\n // Add this instance to the existing texture's usage (dedupe by instance id)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const existingTexture = textures.get(textureInfo.uuid)!;\n if (\n !existingTexture.usedByMaterials.includes(\n material.name || material.uuid.substring(0, 8),\n )\n ) {\n existingTexture.usedByMaterials.push(\n material.name || material.uuid.substring(0, 8),\n );\n }\n if (!existingTexture.usedByObjectInstanceIds.includes(asMesh.uuid)) {\n existingTexture.usedByObjectInstanceIds.push(asMesh.uuid);\n existingTexture.usedByObjects.push(objectName);\n existingTexture.usedByObjectPaths.push(objectPath);\n }\n }\n });\n } else {\n // Add this object to the existing material's usage list\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const materialInfo = materials.get(material.uuid)!;\n if (!materialInfo.usedByObjects.includes(objectName)) {\n materialInfo.usedByObjects.push(objectName);\n }\n\n // Always update textures usage for this material instance\n const materialName = material.name || material.uuid.substring(0, 8);\n const textureProperties = [\n \"map\",\n \"normalMap\",\n \"roughnessMap\",\n \"metalnessMap\",\n \"aoMap\",\n \"emissiveMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"alphaMap\",\n \"lightMap\",\n \"envMap\",\n ];\n textureProperties.forEach((prop) => {\n const texture = (material as any)[prop];\n if (texture && texture.isTexture) {\n if (!textures.has(texture.uuid)) {\n textures.set(\n texture.uuid,\n ThreeJSMemoryInspector.analyzeTexture(\n texture,\n materialName,\n objectName,\n objectPath,\n asMesh.uuid,\n ),\n );\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const existingTexture = textures.get(texture.uuid)!;\n if (!existingTexture.usedByMaterials.includes(materialName)) {\n existingTexture.usedByMaterials.push(materialName);\n }\n if (!existingTexture.usedByObjectInstanceIds.includes(asMesh.uuid)) {\n existingTexture.usedByObjectInstanceIds.push(asMesh.uuid);\n existingTexture.usedByObjects.push(objectName);\n existingTexture.usedByObjectPaths.push(objectPath);\n }\n }\n }\n });\n }\n }\n });\n }\n });\n\n // Calculate totals\n const totalGeometryMemory = Array.from(geometries.values()).reduce(\n (sum, geo) => sum + geo.memoryBytes,\n 0,\n );\n\n const totalTextureMemory = Array.from(textures.values()).reduce(\n (sum, tex) => sum + tex.memoryBytes,\n 0,\n );\n\n const totalMemory = totalGeometryMemory + totalTextureMemory;\n\n const stats: MemoryStats = {\n geometryCount: geometries.size,\n textureCount: textures.size,\n materialCount: materials.size,\n totalGeometryMemory,\n totalTextureMemory,\n totalMemory,\n };\n\n return { geometries, textures, materials, stats };\n }\n\n private static analyzeGeometry(\n geometry: THREE.BufferGeometry,\n objectName: string,\n objectPath: string,\n objectInstanceId: string,\n ): GeometryInfo {\n let memoryBytes = 0;\n let vertexCount = 0;\n let triangleCount = 0;\n\n // Calculate memory usage from attributes\n for (const name in geometry.attributes) {\n const attribute = geometry.attributes[name];\n memoryBytes += attribute.count * attribute.itemSize * attribute.array.BYTES_PER_ELEMENT;\n }\n\n // Add index buffer memory if present\n if (geometry.index) {\n memoryBytes += geometry.index.count * geometry.index.array.BYTES_PER_ELEMENT;\n triangleCount = geometry.index.count / 3;\n }\n\n // Get vertex count\n if (geometry.attributes.position) {\n vertexCount = geometry.attributes.position.count;\n if (!geometry.index) {\n triangleCount = vertexCount / 3;\n }\n }\n\n return {\n name: geometry.name || `Geometry_${geometry.uuid.substring(0, 8)}`,\n uuid: geometry.uuid,\n memoryBytes,\n vertexCount,\n triangleCount,\n usedByObjects: [objectName],\n objectPaths: [objectPath],\n usedByObjectInstanceIds: [objectInstanceId],\n };\n }\n\n private static analyzeMaterial(\n material: THREE.Material,\n objectName: string,\n objectPath: string,\n objectInstanceId: string,\n ): MaterialInfo {\n const textures: TextureInfo[] = [];\n let textureCount = 0;\n\n // Check common texture properties\n const textureProperties = [\n \"map\",\n \"normalMap\",\n \"roughnessMap\",\n \"metalnessMap\",\n \"aoMap\",\n \"emissiveMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"alphaMap\",\n \"lightMap\",\n \"envMap\",\n ];\n\n textureProperties.forEach((prop) => {\n const texture = (material as any)[prop];\n if (texture && texture.isTexture) {\n textures.push(\n ThreeJSMemoryInspector.analyzeTexture(\n texture,\n material.name || material.uuid.substring(0, 8),\n objectName,\n objectPath,\n objectInstanceId,\n ),\n );\n textureCount++;\n }\n });\n\n return {\n name: material.name || `Material_${material.uuid.substring(0, 8)}`,\n uuid: material.uuid,\n textureCount,\n textures,\n usedByObjects: [objectName],\n };\n }\n\n private static analyzeTexture(\n texture: THREE.Texture,\n materialName: string,\n objectName: string,\n objectPath?: string,\n objectInstanceId?: string,\n ): TextureInfo {\n let memoryBytes = 0;\n let width = 0;\n let height = 0;\n let format = \"Unknown\";\n\n // Check if this is a compressed texture (e.g., KTX2)\n const textureAny = texture as any;\n if (textureAny.isCompressedTexture) {\n // For compressed textures, calculate actual GPU memory from mipmaps\n const result = ThreeJSMemoryInspector.calculateCompressedTextureMemory(texture);\n memoryBytes = result.memoryBytes;\n width = result.width;\n height = result.height;\n format = result.format;\n } else if (textureAny.isDataTexture && texture.image) {\n // DataTexture has image: { data: TypedArray, width: number, height: number }\n const dataImage = texture.image as {\n data: ArrayBufferView;\n width: number;\n height: number;\n };\n width = dataImage.width || 0;\n height = dataImage.height || 0;\n\n // Calculate actual memory from the data array\n if (dataImage.data && dataImage.data.byteLength) {\n // For DataTexture, use actual byte length\n memoryBytes = dataImage.data.byteLength;\n // If mipmaps are generated, add their memory (approximately 1/3 additional)\n if (texture.generateMipmaps) {\n memoryBytes *= 1.333;\n }\n } else {\n // Fallback estimation: width * height * bytes per pixel\n memoryBytes = width * height * 4;\n if (texture.generateMipmaps) {\n memoryBytes *= 1.333;\n }\n }\n\n if (texture.format) {\n format = ThreeJSMemoryInspector.getTextureFormatName(texture.format);\n }\n } else if (texture.image) {\n const imageSource = texture.image as HTMLImageElement | HTMLCanvasElement | HTMLVideoElement;\n width = imageSource.width || 0;\n height = imageSource.height || 0;\n\n // Estimate memory usage: width * height * bytes per pixel * mipmap factor\n // Assuming RGBA (4 bytes per pixel) and including mipmaps (factor of 1.333)\n memoryBytes = width * height * 4 * 1.333;\n\n // Adjust for different formats if we can detect them\n if (texture.format) {\n format = ThreeJSMemoryInspector.getTextureFormatName(texture.format);\n }\n }\n\n // Try to get the texture URL and source type\n let url: string | undefined;\n let sourceType = \"Unknown\";\n\n if (textureAny.isCompressedTexture) {\n sourceType = \"Compressed Texture (KTX2)\";\n url = `${width}x${height} - ${format}`;\n } else if (textureAny.isDataTexture) {\n sourceType = \"DataTexture (Label/Generated)\";\n url = `${width}x${height} - ${format}`;\n } else if (texture.source && texture.source.data) {\n const sourceData = texture.source.data;\n\n const sourceDataWithSrc = sourceData as { src?: string };\n if (sourceDataWithSrc.src) {\n url = sourceDataWithSrc.src;\n if (url && url.startsWith(\"data:\")) {\n sourceType = \"Data URL\";\n url = `${url.substring(0, 50)}...`; // Truncate data URLs\n } else if (url && url.startsWith(\"blob:\")) {\n sourceType = \"Blob URL\";\n } else {\n sourceType = \"File URL\";\n }\n } else if (sourceData instanceof HTMLCanvasElement) {\n sourceType = \"Canvas\";\n url = `Canvas(${sourceData.width}x${sourceData.height})`;\n } else if (sourceData instanceof ImageData) {\n sourceType = \"ImageData\";\n url = `ImageData(${(sourceData as ImageData).width}x${(sourceData as ImageData).height})`;\n } else if (sourceData instanceof HTMLVideoElement) {\n sourceType = \"Video\";\n url = sourceData.src || \"Video Element\";\n } else if (sourceData.constructor.name === \"ImageBitmap\") {\n sourceType = \"ImageBitmap\";\n url = `ImageBitmap(${(sourceData as any).width}x${(sourceData as any).height})`;\n } else if (\n typeof sourceData === \"object\" &&\n sourceData !== null &&\n \"data\" in sourceData &&\n \"width\" in sourceData &&\n \"height\" in sourceData\n ) {\n // This is a DataTexture-like structure\n const dataSource = sourceData as { data: unknown; width: number; height: number };\n sourceType = \"DataTexture (Raw Data)\";\n url = `${dataSource.width}x${dataSource.height}`;\n }\n } else if ((texture as any).image) {\n const image = (texture as any).image as\n | { src?: string; width?: number; height?: number; data?: unknown }\n | undefined;\n if (image && image.src) {\n url = image.src;\n if (url && url.startsWith(\"data:\")) {\n sourceType = \"Data URL\";\n url = `${url.substring(0, 50)}...`;\n } else if (url && url.startsWith(\"blob:\")) {\n sourceType = \"Blob URL\";\n } else {\n sourceType = \"File URL\";\n }\n } else if (image instanceof HTMLCanvasElement) {\n sourceType = \"Canvas\";\n url = `Canvas(${image.width}x${image.height})`;\n } else if (image && image.data && image.width && image.height) {\n // This is a DataTexture-like structure in the image property\n sourceType = \"DataTexture (Raw Data)\";\n url = `${image.width}x${image.height}`;\n }\n }\n\n return {\n name: texture.name || `Texture_${texture.uuid.substring(0, 8)}`,\n uuid: texture.uuid,\n memoryBytes,\n width,\n height,\n format,\n usedByMaterials: [materialName],\n usedByObjects: [objectName],\n usedByObjectPaths: [objectPath || objectName],\n usedByObjectInstanceIds: [objectInstanceId || \"unknown\"],\n url,\n sourceType,\n };\n }\n\n private static getTextureFormatName(format: number): string {\n // Map Three.js texture format constants to readable names\n const formatNames: { [key: number]: string } = {\n 1023: \"RGBA\",\n 1022: \"RGB\",\n 1024: \"RGBAInteger\",\n 1025: \"RGBInteger\",\n 1026: \"DepthComponent\",\n 1027: \"DepthStencil\",\n 1028: \"LuminanceAlpha\",\n 1029: \"Luminance\",\n 1030: \"Alpha\",\n 1031: \"Red\",\n 1032: \"RedInteger\",\n 1033: \"RG\",\n 1034: \"RGInteger\",\n // Compressed formats\n 33776: \"RGB_S3TC_DXT1\",\n 33777: \"RGBA_S3TC_DXT1\",\n 33778: \"RGBA_S3TC_DXT3\",\n 33779: \"RGBA_S3TC_DXT5\",\n 35840: \"RGB_PVRTC_4BPPV1\",\n 35841: \"RGB_PVRTC_2BPPV1\",\n 35842: \"RGBA_PVRTC_4BPPV1\",\n 35843: \"RGBA_PVRTC_2BPPV1\",\n 36196: \"RGB_ETC1\",\n 37808: \"RGBA_ASTC_4x4\",\n 37809: \"RGBA_ASTC_5x4\",\n 37810: \"RGBA_ASTC_5x5\",\n 37811: \"RGBA_ASTC_6x5\",\n 37812: \"RGBA_ASTC_6x6\",\n 37813: \"RGBA_ASTC_8x5\",\n 37814: \"RGBA_ASTC_8x6\",\n 37815: \"RGBA_ASTC_8x8\",\n 37816: \"RGBA_ASTC_10x5\",\n 37817: \"RGBA_ASTC_10x6\",\n 37818: \"RGBA_ASTC_10x8\",\n 37819: \"RGBA_ASTC_10x10\",\n 37820: \"RGBA_ASTC_12x10\",\n 37821: \"RGBA_ASTC_12x12\",\n 37492: \"RGBA_BPTC_UNORM\",\n 36492: \"RGB_ETC2\",\n 36494: \"RGBA_ETC2_EAC\",\n };\n\n return formatNames[format] || `Format_${format}`;\n }\n\n private static calculateCompressedTextureMemory(texture: THREE.Texture): {\n memoryBytes: number;\n width: number;\n height: number;\n format: string;\n } {\n const textureAny = texture as any;\n let totalMemory = 0;\n let width = 0;\n let height = 0;\n let format = \"Unknown Compressed\";\n\n if (texture.format) {\n format = ThreeJSMemoryInspector.getTextureFormatName(texture.format);\n }\n\n // Compressed textures store data in mipmaps array\n if (textureAny.mipmaps && Array.isArray(textureAny.mipmaps)) {\n for (const mipmap of textureAny.mipmaps) {\n if (mipmap.data && mipmap.data.byteLength) {\n totalMemory += mipmap.data.byteLength;\n // Use the largest mipmap (first one) for dimensions\n if (width === 0) {\n width = mipmap.width || 0;\n height = mipmap.height || 0;\n }\n }\n }\n }\n\n // If we couldn't get dimensions from mipmaps, try the texture's image property\n if (width === 0 && textureAny.image) {\n width = textureAny.image.width || 0;\n height = textureAny.image.height || 0;\n }\n\n return {\n memoryBytes: totalMemory,\n width,\n height,\n format,\n };\n }\n\n private static getObjectPath(object: any, scene: THREE.Scene): string {\n const path: string[] = [];\n let current = object;\n\n while (current && current !== scene) {\n const name = current.name || current.constructor.name || \"Object\";\n path.unshift(name);\n current = current.parent;\n }\n\n return path.join(\" > \");\n }\n\n private static getObjectDisplayName(object: any): string {\n if (object.name) {\n return object.name;\n }\n\n // Try to find a meaningful parent name\n let current = object.parent;\n while (current && current !== object.parent?.parent) {\n if (current.name) {\n return `${current.name} > ${object.constructor.name}`;\n }\n current = current.parent;\n }\n\n return `${object.constructor.name}_${object.uuid.substring(0, 8)}`;\n }\n\n private static generateTextureThumbnails(scene: THREE.Scene): Map<string, string> {\n const thumbnails = new Map<string, string>();\n\n // Find all unique textures in the scene\n const textureMap = new Map<string, THREE.Texture>();\n\n scene.traverse((object) => {\n const asMesh = object as THREE.Mesh;\n if (asMesh.isMesh) {\n const materialsArray = Array.isArray(asMesh.material) ? asMesh.material : [asMesh.material];\n materialsArray.forEach((material) => {\n if (material) {\n const textureProperties = [\n \"map\",\n \"normalMap\",\n \"roughnessMap\",\n \"metalnessMap\",\n \"aoMap\",\n \"emissiveMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"alphaMap\",\n \"lightMap\",\n \"envMap\",\n ];\n\n textureProperties.forEach((prop) => {\n const texture = (material as any)[prop];\n if (texture && texture.isTexture && !textureMap.has(texture.uuid)) {\n textureMap.set(texture.uuid, texture);\n }\n });\n }\n });\n }\n });\n\n // Generate thumbnails for each texture\n textureMap.forEach((texture, uuid) => {\n try {\n const thumbnail = ThreeJSMemoryInspector.createTextureThumbnail(texture);\n if (thumbnail) {\n thumbnails.set(uuid, thumbnail);\n }\n } catch (error) {\n console.warn(`Failed to generate thumbnail for texture ${uuid}:`, error);\n }\n });\n\n return thumbnails;\n }\n\n private static generateGeometryPreviews(scene: THREE.Scene): Map<string, string> {\n const previews = new Map<string, string>();\n\n // Find all unique geometries in the scene\n const geometryMap = new Map<string, THREE.BufferGeometry>();\n\n scene.traverse((object) => {\n const asMesh = object as THREE.Mesh;\n if (asMesh.isMesh && asMesh.geometry) {\n const geometry = asMesh.geometry;\n if (!geometryMap.has(geometry.uuid)) {\n geometryMap.set(geometry.uuid, geometry);\n }\n }\n });\n\n // Create a single renderer to reuse for all previews\n let sharedRenderer: THREE.WebGLRenderer | null = null;\n try {\n sharedRenderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n sharedRenderer.setSize(200, 200);\n sharedRenderer.setClearColor(0x222222, 0);\n\n // Generate previews for each geometry using the shared renderer\n geometryMap.forEach((geometry, uuid) => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const preview = ThreeJSMemoryInspector.createGeometryPreview(geometry, sharedRenderer!);\n if (preview) {\n previews.set(uuid, preview);\n }\n } catch (error) {\n console.warn(`Failed to generate preview for geometry ${uuid}:`, error);\n }\n });\n } catch (error) {\n console.warn(\"Failed to initialize shared WebGLRenderer for geometry previews:\", error);\n } finally {\n if (sharedRenderer) {\n sharedRenderer.dispose();\n }\n }\n\n return previews;\n }\n\n private static createTextureThumbnail(texture: THREE.Texture): string | null {\n try {\n const textureAny = texture as any;\n\n // Check if this is a compressed texture\n if (textureAny.isCompressedTexture) {\n return ThreeJSMemoryInspector.createCompressedTextureThumbnail(texture);\n }\n\n // Check if this is a DataTexture - render it using WebGL\n if (textureAny.isDataTexture) {\n return ThreeJSMemoryInspector.createCompressedTextureThumbnail(texture);\n }\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return null;\n }\n\n let sourceElement: any = null;\n\n // Try to get the source element from the texture\n if (texture.source && texture.source.data) {\n sourceElement = texture.source.data;\n } else if ((texture as any).image) {\n sourceElement = (texture as any).image;\n }\n\n if (!sourceElement) {\n return null;\n }\n\n // Set canvas size for thumbnail (max 200x200)\n const maxSize = 200;\n let width = 0;\n let height = 0;\n\n // Get dimensions based on source type\n if (sourceElement instanceof HTMLCanvasElement) {\n width = sourceElement.width;\n height = sourceElement.height;\n } else if (sourceElement instanceof ImageData) {\n width = sourceElement.width;\n height = sourceElement.height;\n } else if (sourceElement instanceof HTMLVideoElement) {\n width = sourceElement.videoWidth || sourceElement.width;\n height = sourceElement.videoHeight || sourceElement.height;\n } else if (sourceElement.constructor.name === \"ImageBitmap\") {\n width = (sourceElement as any).width;\n height = (sourceElement as any).height;\n } else if (sourceElement instanceof HTMLImageElement) {\n width = sourceElement.naturalWidth || sourceElement.width;\n height = sourceElement.naturalHeight || sourceElement.height;\n }\n\n if (width === 0 || height === 0) {\n return null;\n }\n\n // Calculate thumbnail dimensions maintaining aspect ratio\n const scale = Math.min(maxSize / width, maxSize / height);\n canvas.width = Math.floor(width * scale);\n canvas.height = Math.floor(height * scale);\n\n // Draw the texture to canvas\n if (sourceElement instanceof ImageData) {\n // Create a temporary canvas for ImageData\n const tempCanvas = document.createElement(\"canvas\");\n const tempCtx = tempCanvas.getContext(\"2d\");\n if (tempCtx) {\n tempCanvas.width = sourceElement.width;\n tempCanvas.height = sourceElement.height;\n tempCtx.putImageData(sourceElement, 0, 0);\n ctx.drawImage(tempCanvas, 0, 0, canvas.width, canvas.height);\n }\n } else if (\n sourceElement instanceof HTMLCanvasElement ||\n sourceElement instanceof HTMLImageElement ||\n sourceElement instanceof HTMLVideoElement ||\n sourceElement.constructor.name === \"ImageBitmap\"\n ) {\n ctx.drawImage(sourceElement, 0, 0, canvas.width, canvas.height);\n } else {\n return null;\n }\n\n // Convert to base64 data URI\n return canvas.toDataURL(\"image/png\");\n } catch (error) {\n console.warn(\"Error creating texture thumbnail:\", error);\n return null;\n }\n }\n\n private static createCompressedTextureThumbnail(texture: THREE.Texture): string | null {\n let renderer: THREE.WebGLRenderer | null = null;\n\n try {\n // Get texture dimensions\n const textureAny = texture as any;\n let width = 0;\n let height = 0;\n\n if (textureAny.mipmaps && textureAny.mipmaps.length > 0) {\n width = textureAny.mipmaps[0].width || 0;\n height = textureAny.mipmaps[0].height || 0;\n }\n\n if (width === 0 || (height === 0 && textureAny.image)) {\n width = textureAny.image.width || 0;\n height = textureAny.image.height || 0;\n }\n\n if (width === 0 || height === 0) {\n return null;\n }\n\n // Calculate thumbnail dimensions maintaining aspect ratio\n const maxSize = 200;\n const scale = Math.min(maxSize / width, maxSize / height);\n const thumbWidth = Math.floor(width * scale);\n const thumbHeight = Math.floor(height * scale);\n\n // Create a temporary WebGL renderer\n renderer = new THREE.WebGLRenderer({ antialias: false, alpha: true });\n renderer.setSize(thumbWidth, thumbHeight);\n renderer.setClearColor(0x000000, 0);\n\n // Create a simple scene with a plane\n const scene = new THREE.Scene();\n const camera = new THREE.OrthographicCamera(-0.5, 0.5, 0.5, -0.5, 0, 1);\n camera.position.z = 0.5;\n\n // Create a plane geometry with the texture\n const geometry = new THREE.PlaneGeometry(1, 1);\n const material = new THREE.MeshBasicMaterial({\n map: texture,\n side: THREE.DoubleSide,\n transparent: true,\n });\n const plane = new THREE.Mesh(geometry, material);\n scene.add(plane);\n\n // Render the scene\n renderer.render(scene, camera);\n\n // Get the canvas and convert to data URL\n const canvas = renderer.domElement;\n const dataURL = canvas.toDataURL(\"image/png\");\n\n // Clean up\n geometry.dispose();\n material.dispose();\n\n return dataURL;\n } catch (error) {\n console.warn(\"Error creating compressed texture thumbnail:\", error);\n return null;\n } finally {\n if (renderer) {\n renderer.dispose();\n }\n }\n }\n\n private static createGeometryPreview(\n geometry: THREE.BufferGeometry,\n renderer: THREE.WebGLRenderer,\n ): string | null {\n try {\n // Create a temporary scene for rendering\n const tempScene = new THREE.Scene();\n const tempCamera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);\n\n // Ensure renderer is configured for preview\n renderer.setSize(200, 200);\n renderer.setClearColor(0x222222, 0);\n\n // Create a mesh with a light gray material and overlay wireframe lines\n const material = new THREE.MeshStandardMaterial({\n color: 0xeeeeee,\n roughness: 0.9,\n metalness: 0.0,\n side: THREE.DoubleSide,\n polygonOffset: true,\n polygonOffsetFactor: 1,\n polygonOffsetUnits: 1,\n });\n const mesh = new THREE.Mesh(geometry, material);\n const wireGeom = new THREE.WireframeGeometry(geometry);\n const wireMaterial = new THREE.LineBasicMaterial({ color: 0xffffff });\n const wireframe = new THREE.LineSegments(wireGeom, wireMaterial);\n wireframe.renderOrder = 1;\n\n // Prefer tight fit using bounding sphere; fallback to bounding box\n geometry.computeBoundingSphere();\n let radius = 0;\n let center = new THREE.Vector3();\n if (geometry.boundingSphere) {\n radius = geometry.boundingSphere.radius;\n center.copy(geometry.boundingSphere.center);\n } else {\n geometry.computeBoundingBox();\n const box = geometry.boundingBox;\n if (!box) {\n return null;\n }\n center = new THREE.Vector3();\n box.getCenter(center);\n const size = new THREE.Vector3();\n box.getSize(size);\n radius = Math.max(size.x, size.y, size.z) * 0.5;\n }\n\n // Center geometry at origin\n mesh.position.sub(center);\n wireframe.position.copy(mesh.position);\n\n // Compute camera distance to tightly fit the sphere within the vertical FOV\n const fovRad = (tempCamera.fov * Math.PI) / 180;\n let distance = radius / Math.sin(fovRad / 2);\n // Add a small margin to avoid clipping while keeping it tight\n distance *= 1.05;\n\n // Place camera along an isometric direction at the computed distance\n const dir = new THREE.Vector3(1, 1, 1).normalize();\n tempCamera.position.copy(dir.multiplyScalar(distance));\n tempCamera.lookAt(0, 0, 0);\n\n // Add lighting\n const ambientLight = new THREE.AmbientLight(0x404040, 0.6);\n const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);\n directionalLight.position.set(1, 1, 1);\n\n tempScene.add(mesh);\n tempScene.add(wireframe);\n tempScene.add(ambientLight);\n tempScene.add(directionalLight);\n\n // Render the scene\n renderer.render(tempScene, tempCamera);\n\n // Get the canvas and convert to data URL\n const canvas = renderer.domElement;\n const dataURL = canvas.toDataURL(\"image/png\");\n\n // Clean up\n material.dispose();\n wireMaterial.dispose();\n wireGeom.dispose();\n\n return dataURL;\n } catch (error) {\n console.warn(\"Error creating geometry preview:\", error);\n return null;\n }\n }\n\n private static buildReportUI(\n doc: Document,\n geometries: Map<string, GeometryInfo>,\n textures: Map<string, TextureInfo>,\n materials: Map<string, MaterialInfo>,\n stats: MemoryStats,\n textureThumbnails: Map<string, string>,\n geometryPreviews: Map<string, string>,\n ): void {\n // Set document title\n doc.title = \"Three.js Memory Report\";\n\n // Add styles\n const style = doc.createElement(\"style\");\n style.textContent = ThreeJSMemoryInspector.getReportStyles();\n doc.head.appendChild(style);\n\n // Clear body\n doc.body.innerHTML = \"\";\n\n // Create container\n const container = doc.createElement(\"div\");\n container.className = \"container\";\n\n // Create stats grid\n const statsGrid = ThreeJSMemoryInspector.createStatsGrid(doc, stats);\n container.appendChild(statsGrid);\n\n // Create main section\n const section = doc.createElement(\"div\");\n section.className = \"section\";\n\n // Create controls\n const controls = ThreeJSMemoryInspector.createControls(doc, stats);\n section.appendChild(controls);\n\n // Create content area\n const sectionContent = doc.createElement(\"div\");\n sectionContent.className = \"section-content\";\n\n const resultsInfo = doc.createElement(\"div\");\n resultsInfo.className = \"results-info\";\n resultsInfo.id = \"resultsInfo\";\n sectionContent.appendChild(resultsInfo);\n\n const itemList = doc.createElement(\"div\");\n itemList.className = \"item-list\";\n itemList.id = \"itemList\";\n sectionContent.appendChild(itemList);\n\n section.appendChild(sectionContent);\n container.appendChild(section);\n\n doc.body.appendChild(container);\n\n // Initialize interactivity\n ThreeJSMemoryInspector.initializeReportInteractivity(\n doc,\n geometries,\n textures,\n textureThumbnails,\n geometryPreviews,\n );\n }\n\n private static getReportStyles(): string {\n return `\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #1a1a1a;\n color: #e0e0e0;\n line-height: 1.6;\n }\n\n .container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n }\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 40px;\n }\n\n .stat-card {\n background: #2a2a2a;\n padding: 20px;\n border-radius: 8px;\n text-align: center;\n border: 1px solid #444;\n }\n\n .stat-value {\n font-size: 2em;\n font-weight: bold;\n color: #4CAF50;\n margin-bottom: 5px;\n }\n\n .stat-label {\n color: #aaa;\n font-size: 0.9em;\n }\n\n .section {\n background: #2a2a2a;\n border-radius: 8px;\n margin-bottom: 30px;\n overflow: hidden;\n border: 1px solid #444;\n }\n\n .section-content {\n padding: 20px;\n }\n\n .controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n background: #333;\n border-bottom: 1px solid #444;\n }\n .control-group {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n }\n .checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #2a2a2a;\n padding: 6px 10px;\n border: 1px solid #555;\n border-radius: 6px;\n }\n .filter-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n color: #ccc;\n }\n .clear-btn {\n background: transparent;\n border: 1px solid #666;\n color: #ccc;\n padding: 4px 8px;\n border-radius: 4px;\n cursor: pointer;\n }\n .clear-btn:hover { border-color: #888; color: #fff; }\n\n .item-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .item-row {\n display: flex;\n gap: 12px;\n align-items: center;\n background: #333;\n border: 1px solid #555;\n border-radius: 8px;\n padding: 12px;\n }\n .item-media {\n flex: 0 0 160px;\n height: 100px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #222;\n border: 1px solid #555;\n border-radius: 6px;\n overflow: hidden;\n }\n .item-media img { max-width: 100%; max-height: 100%; object-fit: contain; }\n .item-media .placeholder { color: #666; font-size: 0.85em; text-align: center; padding: 0 8px; }\n .item-content { flex: 1; min-width: 0; }\n .item-title { display: flex; gap: 10px; align-items: center; margin-bottom: 6px; }\n .item-name { font-weight: bold; color: #fff; font-size: 1.05em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .type-badge { font-size: 0.75em; padding: 2px 6px; border-radius: 4px; border: 1px solid #555; color: #ddd; }\n .type-geometry { background: #263238; }\n .type-texture { background: #2e3a29; }\n .item-details { color: #ccc; font-size: 0.9em; }\n .item-detail-line { margin-bottom: 2px; }\n .item-meta { min-width: 140px; text-align: right; }\n .item-size { background: #4CAF50; color: #fff; padding: 4px 8px; border-radius: 4px; font-size: 0.8em; font-weight: bold; display: inline-block; }\n .item-usage { margin-top: 8px; color: #aaa; font-size: 0.85em; }\n .usage-list { margin-top: 6px; display: flex; gap: 6px; flex-wrap: wrap; }\n .usage-chip { background: #444; color: #ddd; border: 1px solid #666; border-radius: 14px; padding: 2px 8px; font-size: 0.75em; cursor: pointer; }\n .usage-chip:hover { background: #4a4a4a; border-color: #888; color: #fff; }\n .results-info { color: #aaa; font-size: 0.85em; margin-bottom: 12px; }\n .loading {\n text-align: center;\n color: #666;\n font-style: italic;\n }\n .more-items {\n color: #888;\n font-size: 0.75em;\n margin-left: 4px;\n }\n `;\n }\n\n private static createStatsGrid(doc: Document, stats: MemoryStats): HTMLElement {\n const statsGrid = doc.createElement(\"div\");\n statsGrid.className = \"stats-grid\";\n\n const formatBytes = (bytes: number) => `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n\n // Total Memory card\n statsGrid.appendChild(\n ThreeJSMemoryInspector.createStatCard(doc, formatBytes(stats.totalMemory), \"Total Memory\"),\n );\n\n // Geometry Memory card\n statsGrid.appendChild(\n ThreeJSMemoryInspector.createStatCard(\n doc,\n formatBytes(stats.totalGeometryMemory),\n \"Geometry Memory\",\n ),\n );\n\n // Texture Memory card\n statsGrid.appendChild(\n ThreeJSMemoryInspector.createStatCard(\n doc,\n formatBytes(stats.totalTextureMemory),\n \"Texture Memory\",\n ),\n );\n\n // Geometries count card\n statsGrid.appendChild(\n ThreeJSMemoryInspector.createStatCard(doc, String(stats.geometryCount), \"Geometries\"),\n );\n\n // Textures count card\n statsGrid.appendChild(\n ThreeJSMemoryInspector.createStatCard(doc, String(stats.textureCount), \"Textures\"),\n );\n\n return statsGrid;\n }\n\n private static createStatCard(doc: Document, value: string, label: string): HTMLElement {\n const card = doc.createElement(\"div\");\n card.className = \"stat-card\";\n\n const valueDiv = doc.createElement(\"div\");\n valueDiv.className = \"stat-value\";\n valueDiv.textContent = value;\n card.appendChild(valueDiv);\n\n const labelDiv = doc.createElement(\"div\");\n labelDiv.className = \"stat-label\";\n labelDiv.textContent = label;\n card.appendChild(labelDiv);\n\n return card;\n }\n\n private static createControls(doc: Document, stats: MemoryStats): HTMLElement {\n const controls = doc.createElement(\"div\");\n controls.className = \"controls\";\n\n // Control group (checkboxes)\n const controlGroup = doc.createElement(\"div\");\n controlGroup.className = \"control-group\";\n\n // Textures checkbox\n const texturesLabel = doc.createElement(\"label\");\n texturesLabel.className = \"checkbox\";\n\n const texturesCheckbox = doc.createElement(\"input\");\n texturesCheckbox.type = \"checkbox\";\n texturesCheckbox.id = \"toggleTextures\";\n texturesCheckbox.checked = true;\n texturesLabel.appendChild(texturesCheckbox);\n\n texturesLabel.appendChild(doc.createTextNode(` Textures (${stats.textureCount})`));\n controlGroup.appendChild(texturesLabel);\n\n // Geometries checkbox\n const geometriesLabel = doc.createElement(\"label\");\n geometriesLabel.className = \"checkbox\";\n\n const geometriesCheckbox = doc.createElement(\"input\");\n geometriesCheckbox.type = \"checkbox\";\n geometriesCheckbox.id = \"toggleGeometries\";\n geometriesCheckbox.checked = true;\n geometriesLabel.appendChild(geometriesCheckbox);\n\n geometriesLabel.appendChild(doc.createTextNode(` Geometries (${stats.geometryCount})`));\n controlGroup.appendChild(geometriesLabel);\n\n controls.appendChild(controlGroup);\n\n // Filter bar\n const filterBar = doc.createElement(\"div\");\n filterBar.className = \"filter-bar\";\n\n const filterStatus = doc.createElement(\"span\");\n filterStatus.id = \"filterStatus\";\n filterStatus.textContent = \"No object filter\";\n filterBar.appendChild(filterStatus);\n\n const clearButton = doc.createElement(\"button\");\n clearButton.id = \"clearFilter\";\n clearButton.className = \"clear-btn\";\n clearButton.textContent = \"Clear filter\";\n clearButton.style.display = \"none\";\n filterBar.appendChild(clearButton);\n\n controls.appendChild(filterBar);\n\n return controls;\n }\n\n private static initializeReportInteractivity(\n doc: Document,\n geometries: Map<string, GeometryInfo>,\n textures: Map<string, TextureInfo>,\n textureThumbnails: Map<string, string>,\n geometryPreviews: Map<string, string>,\n ): void {\n // Prepare data arrays\n const texturesData = Array.from(textures.values())\n .map((tex) => ({\n type: \"texture\" as const,\n uuid: tex.uuid,\n name: tex.name,\n memoryBytes: tex.memoryBytes,\n width: tex.width,\n height: tex.height,\n format: tex.format,\n sourceType: tex.sourceType,\n url: tex.url,\n usedByObjects: tex.usedByObjects,\n usedByObjectPaths: tex.usedByObjectPaths,\n usedByObjectInstanceIds: tex.usedByObjectInstanceIds,\n instanceCount: tex.usedByObjectInstanceIds.length,\n thumbnail: textureThumbnails.get(tex.uuid) || null,\n }))\n .sort((a, b) => b.memoryBytes - a.memoryBytes);\n\n const geometriesData = Array.from(geometries.values())\n .map((geo) => ({\n type: \"geometry\" as const,\n uuid: geo.uuid,\n name: geo.name,\n memoryBytes: geo.memoryBytes,\n vertexCount: geo.vertexCount,\n triangleCount: geo.triangleCount,\n usedByObjects: geo.usedByObjects,\n usedByObjectPaths: geo.objectPaths,\n usedByObjectInstanceIds: geo.usedByObjectInstanceIds,\n instanceCount: geo.usedByObjectInstanceIds.length,\n preview: geometryPreviews.get(geo.uuid) || null,\n }))\n .sort((a, b) => b.memoryBytes - a.memoryBytes);\n\n const itemList = doc.getElementById(\"itemList\");\n const resultsInfo = doc.getElementById(\"resultsInfo\");\n const toggleTextures = doc.getElementById(\"toggleTextures\") as HTMLInputElement | null;\n const toggleGeometries = doc.getElementById(\"toggleGeometries\") as HTMLInputElement | null;\n const filterStatus = doc.getElementById(\"filterStatus\");\n const clearFilterBtn = doc.getElementById(\"clearFilter\");\n\n if (!itemList || !resultsInfo || !filterStatus || !clearFilterBtn) {\n return;\n }\n\n let activeObjectFilter: string | null = null;\n\n const formatBytes = (bytes: number) => `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n\n const render = () => {\n const includeTextures = toggleTextures?.checked ?? true;\n const includeGeometries = toggleGeometries?.checked ?? true;\n\n let items: Array<(typeof texturesData)[0] | (typeof geometriesData)[0]> = [];\n if (includeTextures) items.push(...texturesData);\n if (includeGeometries) items.push(...geometriesData);\n\n const total = items.length;\n\n if (activeObjectFilter) {\n const filter = activeObjectFilter;\n items = items.filter((item) => item.usedByObjectInstanceIds.includes(filter));\n }\n\n items.sort((a, b) => b.memoryBytes - a.memoryBytes);\n\n // Clear item list\n itemList.innerHTML = \"\";\n\n if (items.length === 0) {\n const loading = doc.createElement(\"div\");\n loading.className = \"loading\";\n loading.textContent = \"No items match the current filters.\";\n itemList.appendChild(loading);\n } else {\n items.forEach((item) => {\n const itemRow = ThreeJSMemoryInspector.createItemRow(\n doc,\n item,\n formatBytes,\n (objectId: string) => {\n activeObjectFilter = objectId;\n updateFilterBar();\n render();\n },\n );\n itemList.appendChild(itemRow);\n });\n }\n\n resultsInfo.textContent = `Showing ${items.length} of ${total} item(s)`;\n };\n\n const updateFilterBar = () => {\n if (activeObjectFilter) {\n filterStatus.textContent = `Object filter: ${activeObjectFilter}`;\n clearFilterBtn.style.display = \"\";\n } else {\n filterStatus.textContent = \"No object filter\";\n clearFilterBtn.style.display = \"none\";\n }\n };\n\n // Event listeners\n toggleTextures?.addEventListener(\"change\", render);\n toggleGeometries?.addEventListener(\"change\", render);\n clearFilterBtn.addEventListener(\"click\", () => {\n activeObjectFilter = null;\n updateFilterBar();\n render();\n });\n\n // Initial render\n updateFilterBar();\n render();\n }\n\n private static createItemRow(\n doc: Document,\n item: any,\n formatBytes: (bytes: number) => string,\n onObjectClick: (objectId: string) => void,\n ): HTMLElement {\n const itemRow = doc.createElement(\"div\");\n itemRow.className = \"item-row\";\n\n // Media section\n const itemMedia = doc.createElement(\"div\");\n itemMedia.className = \"item-media\";\n\n const isTexture = item.type === \"texture\";\n const mediaSource = isTexture ? item.thumbnail : item.preview;\n\n if (mediaSource) {\n const img = doc.createElement(\"img\");\n img.src = mediaSource;\n img.alt = item.name;\n itemMedia.appendChild(img);\n } else {\n const placeholder = doc.createElement(\"div\");\n placeholder.className = \"placeholder\";\n placeholder.textContent = isTexture\n ? `${item.width} \u00D7 ${item.height}`\n : `${item.vertexCount.toLocaleString()} vertices`;\n itemMedia.appendChild(placeholder);\n }\n\n itemRow.appendChild(itemMedia);\n\n // Content section\n const itemContent = doc.createElement(\"div\");\n itemContent.className = \"item-content\";\n\n // Title\n const itemTitle = doc.createElement(\"div\");\n itemTitle.className = \"item-title\";\n\n const itemName = doc.createElement(\"div\");\n itemName.className = \"item-name\";\n itemName.textContent = item.name;\n itemTitle.appendChild(itemName);\n\n const typeBadge = doc.createElement(\"div\");\n typeBadge.className = `type-badge ${isTexture ? \"type-texture\" : \"type-geometry\"}`;\n typeBadge.textContent = isTexture ? \"Texture\" : \"Geometry\";\n itemTitle.appendChild(typeBadge);\n\n itemContent.appendChild(itemTitle);\n\n // Details\n const itemDetails = doc.createElement(\"div\");\n itemDetails.className = \"item-details\";\n\n if (isTexture) {\n const line1 = doc.createElement(\"div\");\n line1.className = \"item-detail-line\";\n line1.textContent = `${item.width} \u00D7 ${item.height} \u2022 ${item.format}`;\n itemDetails.appendChild(line1);\n\n const line2 = doc.createElement(\"div\");\n line2.className = \"item-detail-line\";\n line2.textContent = `Source: ${item.sourceType}`;\n itemDetails.appendChild(line2);\n\n if (item.url) {\n const line3 = doc.createElement(\"div\");\n line3.className = \"item-detail-line\";\n line3.textContent = `URL: ${item.url}`;\n itemDetails.appendChild(line3);\n }\n } else {\n const line1 = doc.createElement(\"div\");\n line1.className = \"item-detail-line\";\n line1.textContent = `${item.vertexCount.toLocaleString()} vertices \u2022 ${item.triangleCount.toLocaleString()} triangles`;\n itemDetails.appendChild(line1);\n }\n\n itemContent.appendChild(itemDetails);\n\n // Usage section\n const itemUsage = doc.createElement(\"div\");\n itemUsage.className = \"item-usage\";\n\n const usageLabel = doc.createElement(\"div\");\n usageLabel.textContent = `Used by ${item.usedByObjects.length} object(s):`;\n itemUsage.appendChild(usageLabel);\n\n const usageList = doc.createElement(\"div\");\n usageList.className = \"usage-list\";\n\n const maxChips = 10;\n const objectsToShow = item.usedByObjects.slice(0, maxChips);\n\n objectsToShow.forEach((objName: string, idx: number) => {\n const chip = doc.createElement(\"button\");\n chip.className = \"usage-chip\";\n chip.type = \"button\";\n chip.textContent = objName;\n chip.title = item.usedByObjectPaths[idx] || objName;\n chip.addEventListener(\"click\", () => {\n onObjectClick(item.usedByObjectInstanceIds[idx]);\n });\n usageList.appendChild(chip);\n });\n\n if (item.usedByObjects.length > maxChips) {\n const more = doc.createElement(\"span\");\n more.className = \"more-items\";\n more.textContent = `+${item.usedByObjects.length - maxChips} more`;\n usageList.appendChild(more);\n }\n\n itemUsage.appendChild(usageList);\n itemContent.appendChild(itemUsage);\n\n itemRow.appendChild(itemContent);\n\n // Meta section\n const itemMeta = doc.createElement(\"div\");\n itemMeta.className = \"item-meta\";\n\n const itemSize = doc.createElement(\"div\");\n itemSize.className = \"item-size\";\n itemSize.textContent = formatBytes(item.memoryBytes);\n itemMeta.appendChild(itemSize);\n\n const instanceCount = doc.createElement(\"div\");\n instanceCount.style.marginTop = \"6px\";\n instanceCount.style.color = \"#bbb\";\n instanceCount.style.fontSize = \"0.8em\";\n instanceCount.textContent = `${item.instanceCount} instance(s)`;\n itemMeta.appendChild(instanceCount);\n\n itemRow.appendChild(itemMeta);\n\n return itemRow;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["LoadingInstanceManager", "THREE", "THREE", "THREE", "THREE", "THREE", "LoadingInstanceManager", "THREE", "THREE", "THREE", "result", "hasTransparency", "THREE", "THREE", "Model", "LoadingInstanceManager", "THREE", "THREE", "THREE", "THREE", "THREE", "THREE", "THREE", "calculateContentSize", "THREE", "audioRefDistance", "audioRolloffFactor", "THREE", "hasTransparency", "CanvasText", "THREE", "CanvasText", "MElement", "THREE", "THREE", "THREE"]
|
|
3
|
+
"sources": ["../src/elements/ThreeJSAnimation.ts", "../src/elements/ThreeJSAudio.ts", "../src/elements/ThreeJSChatProbe.ts", "../src/elements/ThreeJSCube.ts", "../src/elements/ThreeJSCylinder.ts", "../src/elements/ThreeJSDebugHelper.ts", "../src/elements/ThreeJSFrame.ts", "../src/elements/ThreeJSImage.ts", "../src/elements/ThreeJSInteraction.ts", "../src/elements/ThreeJSLabel.ts", "../src/elements/ThreeJSLight.ts", "../src/elements/ThreeJSLink.ts", "../src/elements/ThreeJSMElement.ts", "../src/elements/ThreeJSModel.ts", "../src/ThreeJSAutoInstanceScene.ts", "../src/elements/ThreeJSOverlay.ts", "../src/elements/ThreeJSPlane.ts", "../src/elements/ThreeJSPositionProbe.ts", "../src/elements/ThreeJSPrompt.ts", "../src/elements/ThreeJSRemoteDocument.ts", "../src/ThreeJSReconnectingStatus.ts", "../src/elements/ThreeJSSphere.ts", "../src/elements/ThreeJSTransformable.ts", "../src/elements/ThreeJSVideo.ts", "../src/resources/ThreeJSImageHandle.ts", "../src/resources/ThreeJSImageResource.ts", "../src/resources/ThreeJSImageLoader.ts", "../src/resources/ThreeJSLabelHandle.ts", "../src/resources/ThreeJSLabelResource.ts", "../src/resources/ThreeJSModelHandle.ts", "../src/resources/ThreeJSModelResource.ts", "../src/resources/ThreeJSResourceManager.ts", "../src/ThreeJSClickTrigger.ts", "../src/ThreeJSGraphicsInterface.ts", "../src/ThreeJSInteractionAdapter.ts", "../src/ThreeJSMemoryInspector.ts"],
|
|
4
|
+
"sourcesContent": ["import { Animation, Model } from \"@mml-io/mml-web\";\nimport { AnimationGraphics } from \"@mml-io/mml-web\";\nimport { LoadingInstanceManager } from \"@mml-io/mml-web\";\nimport { ModelLoadResult } from \"@mml-io/model-loader\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSModelHandle } from \"../resources/ThreeJSModelHandle\";\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport type ThreeJSAnimationState = {\n animationClip: THREE.AnimationClip | null;\n weight: number;\n speed: number;\n ratio: number | null;\n loop: boolean;\n startTime: number;\n pauseTime: number | null;\n};\n\nexport class ThreeJSAnimation extends AnimationGraphics<ThreeJSGraphicsAdapter> {\n private loadingInstanceManager = new LoadingInstanceManager(`${Animation.tagName}.src`);\n private latestSrcModelHandle: ThreeJSModelHandle | null = null;\n\n private animationState: ThreeJSAnimationState;\n private parentModel: Model<ThreeJSGraphicsAdapter> | null = null;\n\n constructor(private animation: Animation<ThreeJSGraphicsAdapter>) {\n super(animation);\n\n if (animation.parentElement && Model.isModel(animation.parentElement)) {\n this.parentModel = animation.parentElement as Model<ThreeJSGraphicsAdapter>;\n }\n this.animationState = {\n animationClip: null,\n weight: animation.props.weight,\n speed: animation.props.speed,\n ratio: animation.props.ratio,\n loop: animation.props.loop,\n startTime: animation.props.startTime,\n pauseTime: animation.props.pauseTime,\n };\n }\n\n setSrc(src: string | null): void {\n if (this.latestSrcModelHandle?.url === src) {\n // already loading the same src\n return;\n }\n if (this.latestSrcModelHandle) {\n this.latestSrcModelHandle.dispose();\n this.loadingInstanceManager.abortIfLoading();\n }\n this.latestSrcModelHandle = null;\n\n if (this.animationState.animationClip) {\n this.animationState.animationClip = null;\n }\n\n if (!src) {\n this.latestSrcModelHandle = null;\n this.loadingInstanceManager.abortIfLoading();\n return;\n }\n\n const contentSrc = this.animation.contentSrcToContentAddress(src);\n this.loadingInstanceManager.start(this.animation.getLoadingProgressManager(), contentSrc);\n const srcModelHandle = this.animation\n .getScene()\n .getGraphicsAdapter()\n .getResourceManager()\n .loadModel(contentSrc);\n this.latestSrcModelHandle = srcModelHandle;\n srcModelHandle.onProgress((loaded, total) => {\n if (this.latestSrcModelHandle !== srcModelHandle) {\n return;\n }\n this.loadingInstanceManager.setProgress(loaded / total);\n });\n srcModelHandle.onLoad((result: ModelLoadResult | Error) => {\n if (result instanceof Error) {\n console.error(\"Error loading m-animation.src\", result);\n this.latestSrcModelHandle = null;\n this.loadingInstanceManager.error(result);\n return;\n }\n if (this.latestSrcModelHandle !== srcModelHandle || !this.animation.isConnected) {\n return;\n }\n\n const animationClip = result.animations[0];\n\n this.animationState.animationClip = animationClip;\n\n this.updateParentAnimation();\n this.loadingInstanceManager.finish();\n });\n }\n\n parentModelUpdated(): void {\n this.updateParentAnimation();\n }\n\n setWeight(weight: number): void {\n this.animationState.weight = weight;\n this.updateParentAnimation();\n }\n\n setSpeed(speed: number): void {\n this.animationState.speed = speed;\n this.updateParentAnimation();\n }\n\n setRatio(ratio: number | null): void {\n this.animationState.ratio = ratio;\n this.updateParentAnimation();\n }\n\n setLoop(loop: boolean): void {\n this.animationState.loop = loop;\n this.updateParentAnimation();\n }\n\n setStartTime(startTime: number): void {\n this.animationState.startTime = startTime;\n this.updateParentAnimation();\n }\n\n setPauseTime(pauseTime: number | null): void {\n this.animationState.pauseTime = pauseTime;\n this.updateParentAnimation();\n }\n\n private updateParentAnimation() {\n if (!this.parentModel || !this.animationState.animationClip) {\n return;\n }\n\n // notify parent model that anim changed\n if (this.parentModel.modelGraphics) {\n this.parentModel.modelGraphics.updateChildAnimation?.(this.animation, this.animationState);\n } else {\n console.error(\"updateParentAnimation: parent model has no modelGraphics\");\n }\n }\n\n dispose() {\n if (this.latestSrcModelHandle) {\n this.latestSrcModelHandle.dispose();\n }\n this.latestSrcModelHandle = null;\n this.loadingInstanceManager.dispose();\n\n if (this.parentModel && this.parentModel.modelGraphics) {\n this.parentModel.modelGraphics.removeChildAnimation?.(this.animation);\n }\n\n this.animationState.animationClip = null;\n }\n}\n", "import { Audio, MAudioProps } from \"@mml-io/mml-web\";\nimport { AudioGraphics } from \"@mml-io/mml-web\";\nimport { LoadingInstanceManager } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\nimport { PositionalAudioHelper } from \"three/addons/helpers/PositionalAudioHelper.js\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nconst debugAudioSphereSize = 0.25;\nconst debugAudioGeometry = new THREE.SphereGeometry(debugAudioSphereSize, 4, 2);\nconst debugAudioMaterial = new THREE.MeshBasicMaterial({\n wireframe: true,\n fog: false,\n toneMapped: false,\n color: 0x00ff00,\n});\nconst audioRefDistance = 1;\nconst audioRolloffFactor = 1;\n\nfunction extendAudioToDuration(\n context: AudioContext,\n buffer: AudioBuffer,\n seconds: number,\n): AudioBuffer {\n const updatedBuffer = context.createBuffer(\n buffer.numberOfChannels,\n Math.ceil(seconds * buffer.sampleRate),\n buffer.sampleRate,\n );\n for (let channelNumber = 0; channelNumber < buffer.numberOfChannels; channelNumber++) {\n const channelData = buffer.getChannelData(channelNumber);\n const updatedChannelData = updatedBuffer.getChannelData(channelNumber);\n updatedChannelData.set(channelData, 0);\n }\n return updatedBuffer;\n}\n\nexport class ThreeJSAudio extends AudioGraphics<ThreeJSGraphicsAdapter> {\n private audioDebugHelper: THREE.Mesh<THREE.SphereGeometry, THREE.MeshBasicMaterial> | null = null;\n private audioDebugConeX: PositionalAudioHelper | null;\n private audioDebugConeY: PositionalAudioHelper | null;\n private audioContextStateChangedListener = () => {\n this.syncAudioTime();\n };\n\n private documentTimeListener: { remove: () => void };\n private delayedPauseTimer: NodeJS.Timeout | null = null;\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Audio.tagName}.src`);\n\n private positionalAudio: THREE.PositionalAudio;\n\n private loadedAudioState: {\n loadedAudio:\n | {\n mode: \"LOADED\";\n buffer: AudioBuffer;\n currentSource: {\n sourceNode: AudioBufferSourceNode;\n contextStartTime: number;\n } | null;\n paddedBuffer?: {\n buffer: AudioBuffer;\n totalDuration: number;\n };\n }\n | {\n mode: \"LOADING\";\n srcLoadPromise: Promise<AudioBuffer>;\n abortController: AbortController;\n }\n | null;\n currentSrc: string;\n } | null = null;\n\n constructor(private audio: Audio<ThreeJSGraphicsAdapter>) {\n super(audio);\n\n this.documentTimeListener = this.audio.addDocumentTimeListener(() => {\n if (this.loadedAudioState) {\n this.syncAudioTime();\n }\n });\n\n const audioListener = this.getAudioListener();\n this.positionalAudio = new THREE.PositionalAudio(audioListener);\n this.positionalAudio.context.addEventListener(\n \"statechange\",\n this.audioContextStateChangedListener,\n );\n this.positionalAudio.setVolume(this.audio.props.volume);\n this.positionalAudio.setDirectionalCone(\n this.audio.props.coneFalloffAngle ?? 360,\n this.audio.props.coneAngle,\n 0,\n );\n this.positionalAudio.setRefDistance(audioRefDistance);\n this.positionalAudio.setRolloffFactor(audioRolloffFactor);\n this.audio.getContainer().add(this.positionalAudio);\n\n this.updateAudio();\n this.updateDebugVisualisation();\n }\n\n disable(): void {}\n\n enable(): void {}\n\n public syncAudioTime() {\n const audioContext = this.positionalAudio.context;\n if (audioContext.state !== \"running\") {\n return;\n }\n\n if (this.delayedPauseTimer !== null) {\n clearTimeout(this.delayedPauseTimer);\n this.delayedPauseTimer = null;\n }\n\n if (\n !this.loadedAudioState ||\n !this.loadedAudioState.loadedAudio ||\n this.loadedAudioState.loadedAudio.mode !== \"LOADED\"\n ) {\n return;\n }\n\n const loadedAudio = this.loadedAudioState.loadedAudio;\n const audioBuffer = loadedAudio.buffer;\n let currentSource = loadedAudio.currentSource;\n\n if (!this.audio.props.enabled || this.audio.isDisabled()) {\n if (currentSource) {\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n }\n return;\n }\n\n const documentTime = this.audio.getDocumentTime();\n if (this.audio.props.pauseTime !== null) {\n const timeUntilPause = this.audio.props.pauseTime - documentTime;\n if (timeUntilPause < 2) {\n // The audio should be paused because the pauseTime is in the past or very close\n if (currentSource) {\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n }\n return;\n } else {\n // The pause time is in the future\n const delayedPauseTimer = setTimeout(() => {\n if (this.delayedPauseTimer === delayedPauseTimer) {\n this.delayedPauseTimer = null;\n }\n this.syncAudioTime();\n }, timeUntilPause);\n this.delayedPauseTimer = delayedPauseTimer;\n }\n }\n\n const currentTime = (documentTime - this.audio.props.startTime) / 1000;\n const audioDuration = audioBuffer.duration;\n\n let loopDurationSeconds: number | null = null;\n if (this.audio.props.loopDuration !== null && this.audio.props.loopDuration > 0) {\n loopDurationSeconds = this.audio.props.loopDuration / 1000;\n }\n\n let desiredAudioTime: number;\n if (this.audio.props.loop) {\n if (currentTime < 0) {\n desiredAudioTime = currentTime;\n } else {\n if (loopDurationSeconds === null) {\n desiredAudioTime = currentTime % audioDuration;\n } else {\n desiredAudioTime = currentTime % loopDurationSeconds;\n }\n }\n } else {\n desiredAudioTime = currentTime;\n if (desiredAudioTime > audioDuration) {\n // The audio should stop because it has reached the end\n if (currentSource) {\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n }\n return;\n }\n }\n\n const loopDurationLongerThanAudioDuration =\n loopDurationSeconds && loopDurationSeconds > audioDuration;\n const playbackLength = loopDurationSeconds ? loopDurationSeconds : audioDuration;\n\n if (currentSource) {\n if (currentSource.sourceNode.loop !== this.audio.props.loop) {\n // The loop setting has changed - remove the existing audio source and a new one will be created\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else if (\n loopDurationSeconds !== null &&\n loopDurationLongerThanAudioDuration &&\n (!loadedAudio.paddedBuffer || loadedAudio.paddedBuffer.totalDuration < loopDurationSeconds)\n ) {\n /*\n The loop duration is set, and it is longer than the audio file, and\n either there is no existing padding, or the existing padding is too\n short. Dispose of the existing audio source and create a new one.\n */\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else if (\n loopDurationSeconds === null &&\n currentSource.sourceNode.loopEnd !== audioBuffer.duration\n ) {\n // The loop duration has been removed - reset the loop end to the audio duration\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else {\n if (this.audio.props.startTime > documentTime) {\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else {\n const unloopedCurrentAudioPoint =\n (audioContext.currentTime - currentSource.contextStartTime) /\n currentSource.sourceNode.playbackRate.value;\n\n if (unloopedCurrentAudioPoint < 0) {\n // Audio should not be playing yet, so stop it and it will be rescheduled\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else {\n if (\n loopDurationSeconds !== null &&\n currentSource.sourceNode.loopEnd !== loopDurationSeconds\n ) {\n currentSource.sourceNode.loopEnd = loopDurationSeconds;\n }\n\n const currentAudioPoint = unloopedCurrentAudioPoint % playbackLength;\n\n let delta = desiredAudioTime - currentAudioPoint;\n if (this.audio.props.loop) {\n // Check if the delta wrapping around is smaller (i.e. the desired and current are closer together if we wrap around)\n const loopedDelta = delta - playbackLength;\n if (Math.abs(delta) > Math.abs(loopedDelta)) {\n delta = loopedDelta;\n }\n }\n\n if (Math.abs(delta) > 0.5) {\n // We need to skip to the correct point as playback has drifted too far. Remove the audio source and a new one will be created\n currentSource.sourceNode.stop();\n loadedAudio.currentSource = null;\n currentSource = null;\n } else {\n if (Math.abs(delta) < 0.1) {\n // Do nothing - this is close enough - set the playback rate to 1\n currentSource.sourceNode.playbackRate.value = 1;\n } else {\n if (delta > 0) {\n currentSource.sourceNode.playbackRate.value = 1.01;\n } else {\n currentSource.sourceNode.playbackRate.value = 0.99;\n }\n }\n // Calculate a start time that produces the current time as calculated time the next time it is checked\n currentSource.contextStartTime =\n audioContext.currentTime -\n currentAudioPoint / currentSource.sourceNode.playbackRate.value;\n }\n }\n }\n }\n }\n\n if (!currentSource) {\n // There is no current source (or it was removed) - create a new one\n const currentSourceNode = this.positionalAudio.context.createBufferSource();\n\n let buffer = audioBuffer;\n if (loopDurationSeconds && loopDurationLongerThanAudioDuration) {\n // The loop duration requires longer audio than the original audio - pad it with silence\n if (\n loadedAudio.paddedBuffer &&\n loadedAudio.paddedBuffer.totalDuration === loopDurationSeconds\n ) {\n // The padding is already the correct length\n buffer = loadedAudio.paddedBuffer.buffer;\n } else {\n const paddedBuffer = extendAudioToDuration(\n this.positionalAudio.context,\n audioBuffer,\n loopDurationSeconds,\n );\n loadedAudio.paddedBuffer = {\n buffer: paddedBuffer,\n totalDuration: loopDurationSeconds,\n };\n buffer = paddedBuffer;\n }\n }\n\n currentSourceNode.buffer = buffer;\n currentSourceNode.loop = this.audio.props.loop;\n currentSourceNode.loopStart = 0;\n if (loopDurationSeconds) {\n currentSourceNode.loopEnd = loopDurationSeconds;\n } else {\n currentSourceNode.loopEnd = audioBuffer.duration;\n }\n let contextStartTime;\n if (desiredAudioTime < 0) {\n // The audio should not have started yet - schedule it to start in the future\n const timeFromNowToStart = -desiredAudioTime;\n contextStartTime = audioContext.currentTime + timeFromNowToStart;\n currentSourceNode.start(contextStartTime);\n } else {\n /*\n The audio should have been playing already. Start playing from an\n offset into the file and set the contextStartTime to when it should\n have started\n */\n contextStartTime = audioContext.currentTime - desiredAudioTime;\n currentSourceNode.start(0, desiredAudioTime);\n }\n loadedAudio.currentSource = {\n sourceNode: currentSourceNode,\n contextStartTime,\n };\n this.positionalAudio.setNodeSource(currentSourceNode);\n }\n }\n\n private clearAudio() {\n if (this.loadedAudioState) {\n if (this.loadedAudioState.loadedAudio) {\n if (this.loadedAudioState.loadedAudio.mode === \"LOADING\") {\n this.loadedAudioState.loadedAudio.abortController.abort();\n } else {\n if (this.loadedAudioState.loadedAudio.currentSource?.sourceNode) {\n this.loadedAudioState.loadedAudio.currentSource.sourceNode.stop();\n }\n }\n }\n this.loadedAudioState = null;\n }\n }\n\n private updateAudio() {\n if (!this.audio.isConnected) {\n return;\n }\n\n const audioListener = this.getAudioListener();\n const audioContext = audioListener.context;\n\n if (!this.audio.props.src) {\n this.clearAudio();\n } else {\n const contentAddress = this.audio.contentSrcToContentAddress(this.audio.props.src);\n if (this.loadedAudioState && this.loadedAudioState.currentSrc === contentAddress) {\n // Already loaded this audio src\n } else {\n this.clearAudio();\n\n const abortController = new AbortController();\n\n this.srcLoadingInstanceManager.start(\n this.audio.getLoadingProgressManager(),\n contentAddress,\n );\n const srcLoadPromise = this.asyncLoadSourceAsset(\n contentAddress,\n abortController,\n audioContext,\n (loaded, total) => {\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n },\n );\n this.loadedAudioState = {\n loadedAudio: {\n mode: \"LOADING\",\n abortController,\n srcLoadPromise,\n },\n currentSrc: contentAddress,\n };\n srcLoadPromise\n .then((buffer) => {\n if (\n this.loadedAudioState &&\n this.loadedAudioState.loadedAudio?.mode === \"LOADING\" &&\n this.loadedAudioState.loadedAudio.srcLoadPromise === srcLoadPromise\n ) {\n this.loadedAudioState.loadedAudio = {\n mode: \"LOADED\",\n buffer,\n currentSource: null,\n };\n this.srcLoadingInstanceManager.finish();\n this.syncAudioTime();\n }\n })\n .catch((e) => {\n if (\n this.loadedAudioState &&\n this.loadedAudioState.loadedAudio?.mode === \"LOADING\" &&\n this.loadedAudioState.loadedAudio.srcLoadPromise === srcLoadPromise\n ) {\n console.error(\"Failed to load audio\", e);\n this.srcLoadingInstanceManager.error(e);\n this.clearAudio();\n }\n });\n }\n }\n\n this.syncAudioTime();\n }\n\n async asyncLoadSourceAsset(\n contentAddress: string,\n abortController: AbortController,\n audioContext: AudioContext,\n // TODO - implement progress\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onProgress: (loaded: number, total: number) => void,\n ): Promise<AudioBuffer> {\n return new Promise((resolve, reject) => {\n (async () => {\n if (contentAddress.startsWith(\"data:\")) {\n // Construct an AudioBuffer from the data URL\n const base64 = contentAddress.split(\",\", 2)[1];\n if (!base64) {\n reject(new Error(\"Invalid data URL\"));\n return;\n }\n let arrayBuffer;\n\n try {\n const binary = atob(base64);\n const uint8Array = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n uint8Array[i] = binary.charCodeAt(i);\n }\n arrayBuffer = uint8Array.buffer;\n } catch (e) {\n console.error(\"Failed to decode base64 data URL\", e);\n return;\n }\n audioContext\n .decodeAudioData(arrayBuffer)\n .then((audioBuffer) => {\n if (abortController.signal.aborted) {\n return;\n }\n resolve(audioBuffer);\n })\n .catch((e) => {\n console.error(\"Failed to decode data URI audio data\", e);\n });\n return;\n }\n\n const response = await fetch(contentAddress, {\n signal: abortController.signal,\n });\n\n if (response.ok) {\n response\n .arrayBuffer()\n .then((buffer) => {\n if (abortController.signal.aborted) {\n return;\n }\n audioContext.decodeAudioData(buffer).then((audioBuffer) => {\n if (abortController.signal.aborted) {\n return;\n }\n resolve(audioBuffer);\n });\n })\n .catch((e) => {\n console.error(\"Failed to decode fetched audio data\", e);\n });\n } else {\n console.error(\"Failed to fetch audio data\", response);\n }\n })();\n });\n }\n\n setSrc(): void {\n this.updateAudio();\n }\n setStartTime(): void {\n if (this.loadedAudioState) {\n this.syncAudioTime();\n }\n }\n setPauseTime(): void {\n if (this.loadedAudioState) {\n this.syncAudioTime();\n }\n }\n setLoopDuration(): void {\n if (this.loadedAudioState) {\n this.syncAudioTime();\n }\n }\n setLoop(): void {\n this.updateAudio();\n }\n setEnabled(): void {\n this.updateAudio();\n }\n setVolume(volume: number): void {\n this.positionalAudio.setVolume(volume);\n }\n setConeAngle(coneAngle: number | null, mAudioProps: MAudioProps): void {\n this.positionalAudio.setDirectionalCone(\n mAudioProps.coneAngle,\n mAudioProps.coneFalloffAngle ?? 360,\n 0,\n );\n this.updateDebugVisualisation();\n }\n setConeFalloffAngle(coneFalloffAngle: number | null, mAudioProps: MAudioProps): void {\n this.positionalAudio.setDirectionalCone(\n mAudioProps.coneAngle,\n mAudioProps.coneFalloffAngle ?? 360,\n 0,\n );\n this.updateDebugVisualisation();\n }\n\n setDebug(): void {\n this.updateDebugVisualisation();\n }\n\n dispose() {\n if (this.positionalAudio) {\n this.positionalAudio.context.removeEventListener(\n \"statechange\",\n this.audioContextStateChangedListener,\n );\n this.positionalAudio.disconnect();\n this.positionalAudio.removeFromParent();\n }\n\n this.clearAudio();\n\n if (this.delayedPauseTimer) {\n clearTimeout(this.delayedPauseTimer);\n this.delayedPauseTimer = null;\n }\n this.documentTimeListener.remove();\n this.clearDebugVisualisation();\n this.srcLoadingInstanceManager.dispose();\n }\n\n private clearDebugVisualisation() {\n if (this.audioDebugHelper) {\n this.audioDebugHelper.removeFromParent();\n this.audioDebugHelper = null;\n }\n if (this.audioDebugConeX) {\n this.audioDebugConeX.removeFromParent();\n this.audioDebugConeX = null;\n this.audioDebugConeY?.removeFromParent();\n this.audioDebugConeY = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.audio.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (!this.audioDebugHelper) {\n this.audioDebugHelper = new THREE.Mesh(debugAudioGeometry, debugAudioMaterial);\n this.audio.getContainer().add(this.audioDebugHelper);\n }\n if (!this.audioDebugConeX && this.audio.props.coneAngle) {\n this.audioDebugConeX = new PositionalAudioHelper(this.positionalAudio, 10);\n this.positionalAudio.add(this.audioDebugConeX);\n this.audioDebugConeY = new PositionalAudioHelper(this.positionalAudio, 10);\n this.audioDebugConeY.rotation.z = Math.PI / 2;\n this.positionalAudio.add(this.audioDebugConeY);\n }\n if (!this.audio.props.coneAngle && this.audioDebugConeX) {\n this.audioDebugConeX.removeFromParent();\n this.audioDebugConeX = null;\n this.audioDebugConeY?.removeFromParent();\n this.audioDebugConeY = null;\n }\n }\n this.audioDebugConeX?.update();\n this.audioDebugConeY?.update();\n }\n\n private getAudioListener() {\n return this.audio.getScene().getGraphicsAdapter().getAudioListener();\n }\n}\n", "import { ChatProbe } from \"@mml-io/mml-web\";\nimport { ChatProbeGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSChatProbe extends ChatProbeGraphics<ThreeJSGraphicsAdapter> {\n private static DebugGeometry = new THREE.SphereGeometry(1, 16, 16, 1);\n private static DebugMaterial = new THREE.MeshBasicMaterial({\n color: 0xffff00,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n\n private debugMesh: THREE.Mesh<THREE.SphereGeometry, THREE.MeshBasicMaterial> | null = null;\n\n constructor(private chatProbe: ChatProbe<ThreeJSGraphicsAdapter>) {\n super(chatProbe);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setRange(): void {\n this.updateDebugVisualisation();\n }\n\n setDebug() {\n this.updateDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.debugMesh) {\n this.debugMesh.removeFromParent();\n this.debugMesh = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.chatProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.chatProbe.isConnected && !this.debugMesh) {\n const mesh = new THREE.Mesh(ThreeJSChatProbe.DebugGeometry, ThreeJSChatProbe.DebugMaterial);\n mesh.castShadow = false;\n mesh.receiveShadow = false;\n this.debugMesh = mesh;\n this.chatProbe.getContainer().add(this.debugMesh);\n }\n\n if (this.debugMesh) {\n this.debugMesh.scale.set(\n this.chatProbe.props.range,\n this.chatProbe.props.range,\n this.chatProbe.props.range,\n );\n }\n }\n }\n\n dispose() {\n this.clearDebugVisualisation();\n }\n}\n", "import { Cube } from \"@mml-io/mml-web\";\nimport { CubeGraphics } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSCube extends CubeGraphics<ThreeJSGraphicsAdapter> {\n static boxGeometry = new THREE.BoxGeometry(1, 1, 1);\n private mesh: THREE.Mesh<THREE.BoxGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial;\n constructor(private cube: Cube<ThreeJSGraphicsAdapter>) {\n super(cube);\n\n this.material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(cube.props.color.r, cube.props.color.g, cube.props.color.b),\n });\n this.mesh = new THREE.Mesh(ThreeJSCube.boxGeometry, this.material);\n this.mesh.castShadow = cube.props.castShadows;\n this.mesh.receiveShadow = true;\n this.cube.getContainer().add(this.mesh);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D<THREE.Object3DEventMap> {\n return this.mesh;\n }\n\n setColor(color: MMLColor): void {\n this.material.color = new THREE.Color(color.r, color.g, color.b);\n }\n\n setWidth(width: number): void {\n this.mesh.scale.x = width;\n }\n\n setHeight(height: number): void {\n this.mesh.scale.y = height;\n }\n\n setDepth(depth: number): void {\n this.mesh.scale.z = depth;\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n setOpacity(opacity: number): void {\n const needsUpdate = this.material.transparent === (opacity === 1);\n this.material.transparent = opacity !== 1;\n this.material.needsUpdate = needsUpdate;\n this.material.opacity = opacity;\n }\n\n dispose() {}\n}\n", "import { Cylinder, CylinderGraphics, MMLColor } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSCylinder extends CylinderGraphics<ThreeJSGraphicsAdapter> {\n static cylinderGeometry = new THREE.CylinderGeometry(0.5, 0.5, 1);\n private mesh: THREE.Mesh<THREE.CylinderGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial;\n\n constructor(private cylinder: Cylinder<ThreeJSGraphicsAdapter>) {\n super(cylinder);\n\n this.material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(\n cylinder.props.color.r,\n cylinder.props.color.g,\n cylinder.props.color.b,\n ),\n });\n this.mesh = new THREE.Mesh(ThreeJSCylinder.cylinderGeometry, this.material);\n this.mesh.castShadow = cylinder.props.castShadows;\n this.mesh.receiveShadow = true;\n this.cylinder.getContainer().add(this.mesh);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n setColor(color: MMLColor): void {\n this.material.color = new THREE.Color(color.r, color.g, color.b);\n }\n\n setRadius(radius: number): void {\n this.mesh.scale.x = radius * 2;\n this.mesh.scale.z = radius * 2;\n }\n\n setHeight(height: number): void {\n this.mesh.scale.y = height;\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n setOpacity(opacity: number): void {\n const needsUpdate = this.material.transparent === (opacity === 1);\n this.material.transparent = opacity !== 1;\n this.material.needsUpdate = needsUpdate;\n this.material.opacity = opacity;\n }\n\n dispose() {}\n}\n", "import { DebugHelper, DebugHelperGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSDebugHelper extends DebugHelperGraphics<ThreeJSGraphicsAdapter> {\n private debugAxes: THREE.AxesHelper | null = null;\n\n constructor(private debugHelper: DebugHelper<ThreeJSGraphicsAdapter>) {\n super(debugHelper);\n this.debugAxes = new THREE.AxesHelper(1);\n this.debugHelper.getContainer().add(this.debugAxes);\n }\n\n dispose() {\n if (this.debugAxes) {\n this.debugHelper.getContainer().remove(this.debugAxes);\n }\n this.debugAxes = null;\n }\n}\n", "import { Frame } from \"@mml-io/mml-web\";\nimport { FrameGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nfunction setMeshToBoundingBox(\n mesh: THREE.Mesh,\n minX: number,\n maxX: number,\n minY: number,\n maxY: number,\n minZ: number,\n maxZ: number,\n) {\n mesh.scale.set(maxX - minX, maxY - minY, maxZ - minZ);\n mesh.position.set((maxX + minX) / 2, (maxY + minY) / 2, (maxZ + minZ) / 2);\n}\n\nexport class ThreeJSFrame extends FrameGraphics<ThreeJSGraphicsAdapter> {\n private static DebugBoxGeometry = new THREE.BoxGeometry(1, 1, 1, 1, 1, 1);\n private static DebugConstraintMaterial = new THREE.MeshBasicMaterial({\n color: 0xff0000,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n private static DebugLoadRangeMaterial = new THREE.MeshBasicMaterial({\n color: 0x00ff00,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n private static DebugUnloadRangeMaterial = new THREE.MeshBasicMaterial({\n color: 0x0000ff,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n\n private debugMeshes: {\n debugBoxConstraintMesh: THREE.Mesh<THREE.BoxGeometry, THREE.MeshBasicMaterial>;\n debugBoxLoadRangeMesh: THREE.Mesh<THREE.BoxGeometry, THREE.MeshBasicMaterial>;\n debugBoxUnloadRangeMesh: THREE.Mesh<THREE.BoxGeometry, THREE.MeshBasicMaterial>;\n } | null = null;\n\n constructor(private frame: Frame<ThreeJSGraphicsAdapter>) {\n super(frame);\n }\n\n setSrc() {\n // no-op\n }\n\n setDebug(): void {\n this.updateDebugVisualisation();\n }\n setLoadRange(): void {\n this.updateDebugVisualisation();\n }\n setUnloadRange(): void {\n this.updateDebugVisualisation();\n }\n setMinX(): void {\n this.updateDebugVisualisation();\n }\n setMaxX(): void {\n this.updateDebugVisualisation();\n }\n setMinY(): void {\n this.updateDebugVisualisation();\n }\n setMaxY(): void {\n this.updateDebugVisualisation();\n }\n setMinZ(): void {\n this.updateDebugVisualisation();\n }\n setMaxZ(): void {\n this.updateDebugVisualisation();\n }\n\n disable(): void {}\n\n enable(): void {}\n\n dispose() {}\n\n private clearDebugVisualisation() {\n if (this.debugMeshes) {\n this.debugMeshes.debugBoxConstraintMesh.removeFromParent();\n this.debugMeshes.debugBoxLoadRangeMesh.removeFromParent();\n this.debugMeshes.debugBoxUnloadRangeMesh.removeFromParent();\n this.debugMeshes = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.frame.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (!this.frame.isConnected) {\n return;\n }\n if (!this.debugMeshes) {\n this.debugMeshes = {\n debugBoxConstraintMesh: new THREE.Mesh(\n ThreeJSFrame.DebugBoxGeometry,\n ThreeJSFrame.DebugConstraintMaterial,\n ),\n debugBoxLoadRangeMesh: new THREE.Mesh(\n ThreeJSFrame.DebugBoxGeometry,\n ThreeJSFrame.DebugLoadRangeMaterial,\n ),\n debugBoxUnloadRangeMesh: new THREE.Mesh(\n ThreeJSFrame.DebugBoxGeometry,\n ThreeJSFrame.DebugUnloadRangeMaterial,\n ),\n };\n this.frame.getContainer().add(this.debugMeshes.debugBoxConstraintMesh);\n this.frame.getContainer().add(this.debugMeshes.debugBoxLoadRangeMesh);\n this.frame.getContainer().add(this.debugMeshes.debugBoxUnloadRangeMesh);\n }\n\n let boxBounds = this.frame.getDefinedBoxBounds();\n if (!boxBounds) {\n boxBounds = [0, 0, 0, 0, 0, 0];\n }\n\n const [minX, maxX, minY, maxY, minZ, maxZ] = boxBounds;\n this.debugMeshes.debugBoxConstraintMesh.visible = true;\n this.debugMeshes.debugBoxLoadRangeMesh.visible = true;\n this.debugMeshes.debugBoxUnloadRangeMesh.visible = true;\n\n setMeshToBoundingBox(\n this.debugMeshes.debugBoxConstraintMesh,\n minX,\n maxX,\n minY,\n maxY,\n minZ,\n maxZ,\n );\n\n if (this.frame.props.loadRange === null) {\n this.debugMeshes.debugBoxLoadRangeMesh.visible = false;\n this.debugMeshes.debugBoxUnloadRangeMesh.visible = false;\n } else {\n this.debugMeshes.debugBoxLoadRangeMesh.visible = true;\n this.debugMeshes.debugBoxUnloadRangeMesh.visible = true;\n\n setMeshToBoundingBox(\n this.debugMeshes.debugBoxLoadRangeMesh,\n minX - this.frame.props.loadRange,\n maxX + this.frame.props.loadRange,\n minY - this.frame.props.loadRange,\n maxY + this.frame.props.loadRange,\n minZ - this.frame.props.loadRange,\n maxZ + this.frame.props.loadRange,\n );\n\n setMeshToBoundingBox(\n this.debugMeshes.debugBoxUnloadRangeMesh,\n minX - this.frame.props.loadRange - this.frame.props.unloadRange,\n maxX + this.frame.props.loadRange + this.frame.props.unloadRange,\n minY - this.frame.props.loadRange - this.frame.props.unloadRange,\n maxY + this.frame.props.loadRange + this.frame.props.unloadRange,\n minZ - this.frame.props.loadRange - this.frame.props.unloadRange,\n maxZ + this.frame.props.loadRange + this.frame.props.unloadRange,\n );\n }\n }\n }\n}\n", "import {\n calculateContentSize,\n Image,\n ImageGraphics,\n LoadingInstanceManager,\n} from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSImageHandle, ThreeJSImageResourceResult } from \"../resources/ThreeJSImageHandle\";\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSImage extends ImageGraphics<ThreeJSGraphicsAdapter> {\n private static planeGeometry = new THREE.PlaneGeometry(1, 1);\n private mesh: THREE.Mesh<THREE.PlaneGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial;\n\n private latestImageHandle: ThreeJSImageHandle | null = null;\n private loadedImageDimensions: { width: number; height: number } | null;\n private loadedImageHasTransparency = false;\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Image.tagName}.src`);\n constructor(\n private image: Image<ThreeJSGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(image, updateMeshCallback);\n\n this.material = new THREE.MeshStandardMaterial({\n color: 0xffffff,\n transparent: this.image.props.opacity !== 1 || this.loadedImageHasTransparency,\n opacity: this.image.props.opacity,\n side: THREE.DoubleSide,\n });\n this.mesh = new THREE.Mesh(ThreeJSImage.planeGeometry, this.material);\n this.mesh.castShadow = image.props.castShadows;\n this.mesh.receiveShadow = true;\n this.image.getContainer().add(this.mesh);\n }\n\n public getWidthAndHeight(): { width: number; height: number } {\n return {\n width: this.mesh.scale.x,\n height: this.mesh.scale.y,\n };\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n setWidth(): void {\n this.updateWidthAndHeight();\n }\n\n setHeight(): void {\n this.updateWidthAndHeight();\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n setOpacity(opacity: number): void {\n const shouldBeTransparent = opacity !== 1 || this.loadedImageHasTransparency;\n const needsUpdate = this.material.transparent !== shouldBeTransparent;\n\n this.material.transparent = shouldBeTransparent;\n this.material.opacity = opacity;\n\n if (needsUpdate) {\n this.material.needsUpdate = true;\n }\n }\n\n setEmissive() {\n this.updateMaterialEmissiveIntensity();\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.material) {\n const map = this.material.map as THREE.Texture;\n if (this.image.props.emissive > 0) {\n this.material.emissive = new THREE.Color(0xffffff);\n this.material.emissiveMap = map;\n this.material.emissiveIntensity = this.image.props.emissive;\n this.material.needsUpdate = true;\n } else {\n this.material.emissive = new THREE.Color(0x000000);\n this.material.emissiveMap = null;\n this.material.emissiveIntensity = 1;\n this.material.needsUpdate = true;\n }\n }\n }\n\n setSrc(newValue: string | null): void {\n if (this.latestImageHandle?.url === newValue) {\n // already loading the same src\n return;\n }\n if (this.latestImageHandle) {\n this.latestImageHandle.dispose();\n this.srcLoadingInstanceManager.abortIfLoading();\n }\n this.latestImageHandle = null;\n\n const src = (newValue || \"\").trim();\n const isDataUri = src.startsWith(\"data:image/\");\n if (this.loadedImageDimensions !== null && !isDataUri) {\n // if the image has already been loaded, remove the image data from the THREE material\n this.clearImage();\n }\n if (!src) {\n // if the src attribute is empty, reset the dimensions and return\n this.updateWidthAndHeight();\n this.srcLoadingInstanceManager.abortIfLoading();\n return;\n }\n if (!this.material) {\n // if the element is not yet connected, return\n return;\n }\n\n if (isDataUri) {\n // if the src is a data url, load it directly rather than using the loader - this avoids a potential frame skip\n const image = document.createElement(\"img\");\n image.src = src;\n this.loadedImageDimensions = {\n width: image.width,\n height: image.height,\n };\n const finalize = () => {\n const texture = new THREE.CanvasTexture(image);\n const result: ThreeJSImageResourceResult = {\n texture,\n width: image.width,\n height: image.height,\n hasTransparency: hasTransparency(image),\n };\n this.applyTexture(result);\n };\n if (image.complete) {\n finalize();\n } else {\n image.addEventListener(\"load\", finalize);\n }\n this.srcLoadingInstanceManager.abortIfLoading();\n return;\n }\n\n const contentSrc = this.image.contentSrcToContentAddress(src);\n this.srcLoadingInstanceManager.start(this.image.getLoadingProgressManager(), contentSrc);\n const imageHandle = this.image\n .getScene()\n .getGraphicsAdapter()\n .getResourceManager()\n .loadImage(contentSrc);\n this.latestImageHandle = imageHandle;\n imageHandle.onProgress((loaded, total) => {\n if (this.latestImageHandle !== imageHandle) {\n return;\n }\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n });\n imageHandle.onLoad((result: ThreeJSImageResourceResult | Error) => {\n if (result instanceof Error) {\n console.error(\"Error loading image:\", newValue, result);\n this.srcLoadingInstanceManager.error(result);\n return;\n }\n if (this.latestImageHandle !== imageHandle || !this.material) {\n // If we've loaded a different image since, or we're no longer connected, ignore this image\n return;\n }\n this.applyTexture(result);\n this.srcLoadingInstanceManager.finish();\n });\n }\n\n private updateWidthAndHeight() {\n const mesh = this.mesh;\n\n const { width, height } = calculateContentSize({\n content: this.loadedImageDimensions\n ? { width: this.loadedImageDimensions.width, height: this.loadedImageDimensions.height }\n : undefined,\n width: this.image.props.width,\n height: this.image.props.height,\n });\n mesh.scale.x = width;\n mesh.scale.y = height;\n\n this.updateMeshCallback();\n }\n\n private applyTexture(result: ThreeJSImageResourceResult) {\n this.loadedImageHasTransparency = result.hasTransparency;\n if (!this.material) {\n return;\n }\n\n this.loadedImageDimensions = {\n width: result.width,\n height: result.height,\n };\n this.material.map = result.texture;\n this.material.transparent = this.image.props.opacity !== 1 || result.hasTransparency;\n this.material.alphaTest = 0.01;\n this.material.needsUpdate = true;\n this.updateMaterialEmissiveIntensity();\n this.updateWidthAndHeight();\n }\n\n private clearImage() {\n this.loadedImageDimensions = null;\n if (this.material && this.material.map) {\n // Do not dispose shared texture here\n this.material.needsUpdate = true;\n this.material.map = null;\n this.material.alphaMap = null;\n this.material.alphaTest = 0;\n }\n this.updateWidthAndHeight();\n }\n\n dispose() {\n if (this.latestImageHandle) {\n this.latestImageHandle.dispose();\n }\n this.latestImageHandle = null;\n // Do not dispose shared texture\n this.material.map = null;\n if (this.material.emissiveMap) {\n this.material.emissiveMap.dispose();\n this.material.emissiveMap = null;\n }\n this.material.dispose();\n this.loadedImageDimensions = null;\n this.srcLoadingInstanceManager.dispose();\n }\n}\n\nfunction hasTransparency(image: HTMLImageElement) {\n if (image.width === 0 || image.height === 0) {\n return false;\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = image.width;\n canvas.height = image.height;\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true }) as CanvasRenderingContext2D;\n ctx.drawImage(image, 0, 0);\n\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;\n\n for (let i = 3, n = imageData.length; i < n; i += 4) {\n if (imageData[i] < 255) {\n return true;\n }\n }\n return false;\n}\n", "import { Interaction } from \"@mml-io/mml-web\";\nimport { InteractionGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSInteraction extends InteractionGraphics<ThreeJSGraphicsAdapter> {\n private static DebugGeometry = new THREE.SphereGeometry(1, 16, 16, 1);\n private static DebugMaterial = new THREE.MeshBasicMaterial({\n color: 0x00aa00,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n\n private debugMesh: THREE.Mesh<THREE.SphereGeometry, THREE.MeshBasicMaterial> | null = null;\n\n constructor(private positionProbe: Interaction<ThreeJSGraphicsAdapter>) {\n super(positionProbe);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setRange(): void {\n this.updateDebugVisualisation();\n }\n\n setInFocus(): void {\n // no-op\n }\n\n setLineOfSight(): void {\n // no-op\n }\n\n setPriority(): void {\n // no-op\n }\n\n setPrompt(): void {\n // no-op\n }\n\n setDebug() {\n this.updateDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.debugMesh) {\n this.debugMesh.removeFromParent();\n this.debugMesh = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.positionProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.positionProbe.isConnected && !this.debugMesh) {\n const mesh = new THREE.Mesh(\n ThreeJSInteraction.DebugGeometry,\n ThreeJSInteraction.DebugMaterial,\n );\n mesh.castShadow = false;\n mesh.receiveShadow = false;\n this.debugMesh = mesh;\n this.positionProbe.getContainer().add(this.debugMesh);\n }\n\n if (this.debugMesh) {\n this.debugMesh.scale.set(\n this.positionProbe.props.range,\n this.positionProbe.props.range,\n this.positionProbe.props.range,\n );\n }\n }\n }\n\n dispose() {\n this.clearDebugVisualisation();\n }\n}\n", "import { Label, LabelGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSLabelHandle, ThreeJSLabelResourceResult } from \"../resources/ThreeJSLabelHandle\";\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSLabel extends LabelGraphics<ThreeJSGraphicsAdapter> {\n static labelGeometry = new THREE.PlaneGeometry(1, 1);\n private mesh: THREE.Mesh<THREE.PlaneGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial | null = null;\n private latestLabelHandle: ThreeJSLabelHandle | null = null;\n private shouldDrawText: boolean = false;\n\n constructor(private label: Label<ThreeJSGraphicsAdapter>) {\n super(label);\n\n this.material = new THREE.MeshStandardMaterial({\n transparent: false,\n });\n this.mesh = new THREE.Mesh(ThreeJSLabel.labelGeometry, this.material);\n this.mesh.material = this.material;\n this.mesh.scale.x = this.label.props.width;\n this.mesh.scale.y = this.label.props.height;\n this.mesh.castShadow = this.label.props.castShadows;\n this.mesh.receiveShadow = true;\n this.redrawText();\n this.label.getContainer().add(this.mesh);\n }\n\n allAttributesObserved(): void {\n // Only start drawing text after all attributes have been observed\n this.shouldDrawText = true;\n this.redrawText();\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n setContent(): void {\n this.redrawText();\n }\n\n setAlignment(): void {\n this.redrawText();\n }\n\n setFontSize(): void {\n this.redrawText();\n }\n\n setPadding(): void {\n this.redrawText();\n }\n\n setFontColor(): void {\n this.redrawText();\n }\n\n setEmissive(): void {\n this.updateMaterialEmissiveIntensity();\n }\n\n setColor(): void {\n this.redrawText();\n }\n\n setWidth(width: number): void {\n this.mesh.scale.x = width;\n this.redrawText();\n }\n\n setHeight(height: number): void {\n this.mesh.scale.y = height;\n this.redrawText();\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n private redrawText() {\n if (!this.shouldDrawText) {\n return;\n }\n if (!this.material) {\n return;\n }\n if (this.latestLabelHandle) {\n this.latestLabelHandle.dispose();\n this.latestLabelHandle = null;\n }\n\n // Clamp the width and height to 1024px whilst maintaining the aspect ratio\n const desiredWidth = this.label.props.width * 200;\n const desiredHeight = this.label.props.height * 200;\n\n const handle = this.label\n .getScene()\n .getGraphicsAdapter()\n .getResourceManager()\n .loadLabel({\n content: this.label.props.content,\n fontSize: this.label.props.fontSize * 2,\n paddingPx: this.label.props.padding,\n textColorRGB255A1: {\n r: this.label.props.fontColor.r * 255,\n g: this.label.props.fontColor.g * 255,\n b: this.label.props.fontColor.b * 255,\n a: this.label.props.fontColor.a ?? 1,\n },\n backgroundColorRGB255A1: {\n r: this.label.props.color.r * 255,\n g: this.label.props.color.g * 255,\n b: this.label.props.color.b * 255,\n a: this.label.props.color.a ?? 1,\n },\n dimensions: {\n width: desiredWidth,\n height: desiredHeight,\n },\n alignment: this.label.props.alignment,\n bold: true,\n });\n\n this.latestLabelHandle = handle;\n\n const apply = (result: ThreeJSLabelResourceResult | Error) => {\n if (result instanceof Error || !this.material) {\n return;\n }\n this.material.map = result.texture;\n const hasTransparency = (this.label.props.color.a ?? 1) < 1;\n this.material.transparent = hasTransparency;\n this.material.alphaTest = hasTransparency ? 0.01 : 0;\n this.material.needsUpdate = true;\n this.updateMaterialEmissiveIntensity();\n };\n\n const result = handle.getResult();\n if (result) {\n apply(result);\n } else {\n handle.onLoad(apply);\n }\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.material) {\n const map = this.material.map as THREE.Texture;\n if (this.label.props.emissive > 0) {\n this.material.emissive = new THREE.Color(0xffffff);\n this.material.emissiveMap = map;\n this.material.emissiveIntensity = this.label.props.emissive;\n this.material.needsUpdate = true;\n } else {\n this.material.emissive = new THREE.Color(0x000000);\n this.material.emissiveMap = null;\n this.material.emissiveIntensity = 1;\n this.material.needsUpdate = true;\n }\n }\n }\n\n dispose() {\n if (this.latestLabelHandle) {\n this.latestLabelHandle.dispose();\n this.latestLabelHandle = null;\n }\n if (this.material) {\n // Do not dispose shared texture here\n this.material.map = null;\n if (this.material.emissiveMap) {\n this.material.emissiveMap.dispose();\n this.material.emissiveMap = null;\n }\n this.material.dispose();\n this.material = null;\n }\n }\n}\n", "import { Light, LightTypes } from \"@mml-io/mml-web\";\nimport { LightGraphics } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\ndeclare type LightHelper = THREE.PointLightHelper | THREE.SpotLightHelper;\n\nconst debugSphereSize = 0.25;\n\nexport class ThreeJSLight extends LightGraphics<ThreeJSGraphicsAdapter> {\n private threeLight: THREE.PointLight | THREE.SpotLight;\n private threeLightHelper: LightHelper | null;\n\n constructor(private light: Light<ThreeJSGraphicsAdapter>) {\n super(light);\n this.createLight();\n }\n\n private createLight() {\n if (this.threeLight) {\n this.threeLight.removeFromParent();\n }\n\n const { r, g, b } = this.light.props.color;\n const color = new THREE.Color(r, g, b);\n\n switch (this.light.props.type) {\n case LightTypes.spotlight: {\n const light = new THREE.SpotLight(\n color,\n this.light.props.intensity,\n this.light.props.distance ?? undefined,\n THREE.MathUtils.degToRad(this.light.props.angleDeg),\n );\n // create a target\n const target = new THREE.Object3D();\n target.position.set(0, -1, 0);\n light.position.set(0, 0, 0);\n light.add(target);\n light.target = target;\n this.threeLight = light;\n break;\n }\n case LightTypes.point:\n this.threeLight = new THREE.PointLight(\n color,\n this.light.props.intensity,\n this.light.props.distance ?? undefined,\n );\n break;\n }\n\n if (this.threeLight.shadow) {\n this.threeLight.castShadow = this.light.props.castShadows;\n this.threeLight.shadow.mapSize.width = 512;\n this.threeLight.shadow.mapSize.height = 512;\n if (this.threeLight.shadow.camera.isPerspectiveCamera) {\n this.threeLight.shadow.camera.near = 0.5;\n this.threeLight.shadow.camera.far = 500;\n }\n this.threeLight.shadow.bias = -0.001;\n this.threeLight.shadow.normalBias = 0.01;\n const d = 10;\n const c = this.threeLight.shadow.camera as any;\n c.left = -d;\n c.right = d;\n c.top = d;\n c.bottom = -d;\n }\n\n this.threeLight.intensity = this.light.props.intensity;\n\n this.light.getContainer().add(this.threeLight);\n\n if (this.threeLightHelper) {\n this.makeLightHelper();\n }\n if (!this.light.props.enabled) {\n this.threeLight.visible = false;\n if (this.threeLightHelper) {\n this.threeLightHelper.visible = false;\n }\n }\n }\n\n private makeLightHelper() {\n if (this.threeLightHelper) {\n this.threeLightHelper.removeFromParent();\n this.threeLightHelper = null;\n }\n\n if (this.light instanceof THREE.PointLight) {\n this.threeLightHelper = new THREE.PointLightHelper(this.light, debugSphereSize);\n } else if (this.light instanceof THREE.SpotLight) {\n this.threeLightHelper = new THREE.SpotLightHelper(this.light);\n }\n\n if (this.threeLightHelper) {\n this.light.getContainer().add(this.threeLightHelper);\n this.threeLightHelper.matrix = this.threeLight.matrix;\n this.threeLightHelper.visible = this.threeLight.visible;\n }\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setEnabled(enabled: boolean): void {\n this.threeLight.visible = enabled;\n if (this.threeLightHelper) {\n this.threeLightHelper.visible = enabled;\n }\n }\n\n setCastShadows(castShadows: boolean) {\n this.threeLight.castShadow = castShadows;\n }\n\n setAngle(angle: number) {\n if ((this.threeLight as THREE.SpotLight).isSpotLight) {\n (this.threeLight as THREE.SpotLight).angle = THREE.MathUtils.degToRad(angle);\n }\n }\n\n setIntensity(intensity: number) {\n this.threeLight.intensity = intensity;\n }\n\n setDistance(distance: number) {\n this.threeLight.distance = distance;\n }\n\n setType(): void {\n this.createLight();\n }\n\n setDebug(debug: boolean): void {\n if (debug && !this.threeLightHelper) {\n this.makeLightHelper();\n } else if (!debug && this.threeLightHelper) {\n this.threeLightHelper.removeFromParent();\n this.threeLightHelper = null;\n }\n }\n\n setColor(color: MMLColor): void {\n this.threeLight.color.set(new THREE.Color(color.r, color.g, color.b));\n if (this.threeLightHelper) {\n this.threeLightHelper.color = new THREE.Color(color.r, color.g, color.b);\n }\n }\n\n dispose() {\n this.light.getContainer().remove(this.threeLight);\n if (this.threeLightHelper) {\n this.threeLightHelper.removeFromParent();\n }\n }\n}\n", "import { Link } from \"@mml-io/mml-web\";\nimport { LinkGraphics } from \"@mml-io/mml-web\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSLink extends LinkGraphics<ThreeJSGraphicsAdapter> {\n constructor(private link: Link<ThreeJSGraphicsAdapter>) {\n super(link);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setHref(): void {\n // no-op\n }\n\n setTarget(): void {\n // no-op\n }\n\n dispose() {}\n}\n", "import { MElement, MELEMENT_PROPERTY_NAME } from \"@mml-io/mml-web\";\nimport { MElementGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSMElement extends MElementGraphics<ThreeJSGraphicsAdapter> {\n protected container: THREE.Object3D;\n private currentParentContainer: THREE.Object3D | null = null;\n\n constructor(private element: MElement<ThreeJSGraphicsAdapter>) {\n super(element);\n this.container = new THREE.Group();\n this.container.name = this.constructor.name;\n (this.container as any)[MELEMENT_PROPERTY_NAME] = element;\n\n if (this.currentParentContainer !== null) {\n throw new Error(\"Already connected to a parent\");\n }\n\n const mElementParent = this.element.getMElementParent();\n if (mElementParent) {\n this.currentParentContainer = mElementParent.getContainer();\n this.currentParentContainer.add(this.container);\n return;\n }\n\n // If none of the ancestors are MElements then this element may be directly connected to the body (without a wrapper).\n // Attempt to use a global scene that has been configured to attach this element to.\n const scene = this.element.getScene();\n this.currentParentContainer = scene.getGraphicsAdapter().getRootContainer();\n this.currentParentContainer.add(this.container);\n }\n\n public getContainer(): THREE.Object3D {\n return this.container;\n }\n\n public dispose() {\n if (this.currentParentContainer === null) {\n throw new Error(\"Was not connected to a parent\");\n }\n\n this.currentParentContainer.remove(this.container);\n this.currentParentContainer = null;\n }\n}\n", "import { Animation, MElement, Model, TransformableElement } from \"@mml-io/mml-web\";\nimport { ModelGraphics } from \"@mml-io/mml-web\";\nimport { LoadingInstanceManager } from \"@mml-io/mml-web\";\nimport { IVect3 } from \"@mml-io/mml-web\";\nimport { ModelLoadResult } from \"@mml-io/model-loader\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSModelHandle } from \"../resources/ThreeJSModelHandle\";\nimport { autoInstanceScene } from \"../ThreeJSAutoInstanceScene\";\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\nimport { ThreeJSAnimationState } from \"./ThreeJSAnimation\";\n\ntype ThreeJSModelLoadState = {\n group: THREE.Object3D;\n bones: Map<string, THREE.Bone>;\n nodeNames: Set<string>;\n boundingBox: {\n size: THREE.Vector3;\n centerOffset: THREE.Vector3;\n };\n};\n\ntype ThreeJSModelAnimState = {\n currentAnimationClip: THREE.AnimationClip;\n appliedAnimation: {\n animationGroup: THREE.AnimationObjectGroup;\n animationMixer: THREE.AnimationMixer;\n animationAction: THREE.AnimationAction;\n } | null;\n};\n\nfunction createFilteredClip(\n clip: THREE.AnimationClip,\n nodeNames: Set<string>,\n): THREE.AnimationClip {\n // filter out tracks that don't have corresponding nodes\n const compatibleTracks = clip.tracks.filter((track: THREE.KeyframeTrack) => {\n const trackName = track.name;\n const nodeName = trackName.split(\".\")[0];\n return nodeNames.has(nodeName);\n });\n\n const filteredClip = new THREE.AnimationClip(clip.name, clip.duration, compatibleTracks);\n\n return filteredClip;\n}\n\ntype AttachmentAnimState = {\n directAnimation: {\n animationMixer: THREE.AnimationMixer | null;\n animationAction: THREE.AnimationAction | null;\n } | null;\n childAnimations: {\n animationMixer: THREE.AnimationMixer;\n animations: Map<\n Animation<ThreeJSGraphicsAdapter>,\n {\n action: THREE.AnimationAction | null;\n clip: THREE.AnimationClip | null;\n animationState: ThreeJSAnimationState;\n }\n >;\n };\n};\n\nexport class ThreeJSModel extends ModelGraphics<ThreeJSGraphicsAdapter> {\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Model.tagName}.src`);\n private animLoadingInstanceManager = new LoadingInstanceManager(`${Model.tagName}.anim`);\n private latestSrcModelHandle: ThreeJSModelHandle | null = null;\n private latestAnimModelHandle: ThreeJSModelHandle | null = null;\n\n private socketChildrenByBone = new Map<string, Set<MElement<ThreeJSGraphicsAdapter>>>();\n\n private attachments = new Map<Model<ThreeJSGraphicsAdapter>, AttachmentAnimState>();\n private registeredParentAttachment: Model<ThreeJSGraphicsAdapter> | null = null;\n\n private static DebugBoundingBoxGeometry = new THREE.BoxGeometry(1, 1, 1, 1, 1, 1);\n private static DebugBoundingBoxMaterial = new THREE.MeshBasicMaterial({\n color: 0xff0000,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n private debugBoundingBox: THREE.Mesh | null = null;\n\n protected loadedState: ThreeJSModelLoadState | null = null;\n protected animState: ThreeJSModelAnimState | null = null;\n\n private documentTimeTickListener: null | { remove: () => void } = null;\n\n private childAnimationMixer: THREE.AnimationMixer | null = null;\n private childAnimations = new Map<\n Animation<ThreeJSGraphicsAdapter>,\n {\n action: THREE.AnimationAction | null;\n clip: THREE.AnimationClip | null;\n animationState: ThreeJSAnimationState;\n }\n >();\n\n constructor(\n private model: Model<ThreeJSGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(model, updateMeshCallback);\n }\n\n hasLoadedModel(): boolean {\n return !!this.loadedState?.group;\n }\n\n hasLoadedAnimation(): boolean {\n return !!this.animState?.appliedAnimation;\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getBoundingBox(): { centerOffset: IVect3; size: IVect3 } | null {\n if (this.loadedState) {\n return {\n centerOffset: this.loadedState.boundingBox.centerOffset,\n size: this.loadedState.boundingBox.size,\n };\n }\n return null;\n }\n\n getCollisionElement(): THREE.Object3D<THREE.Object3DEventMap> | null {\n return this.loadedState?.group ?? null;\n }\n\n setDebug(): void {\n this.updateDebugVisualisation();\n }\n\n setCastShadows(castShadows: boolean): void {\n if (this.loadedState) {\n this.loadedState.group.traverse((object) => {\n if ((object as THREE.Mesh).isMesh) {\n const mesh = object as THREE.Mesh;\n mesh.castShadow = castShadows;\n }\n });\n }\n }\n\n updateChildAnimation(\n animation: Animation<ThreeJSGraphicsAdapter>,\n animationState: ThreeJSAnimationState,\n ) {\n let childAnimation = this.childAnimations.get(animation);\n\n if (!this.childAnimationMixer || !this.loadedState) {\n this.childAnimations.set(animation, {\n action: null,\n clip: null,\n animationState,\n });\n } else {\n if (\n childAnimation &&\n childAnimation.action &&\n childAnimation.clip !== animationState.animationClip\n ) {\n // if the animation clip has changed, stop the old action and dispose it\n childAnimation.action.stop();\n this.childAnimationMixer.uncacheAction(\n childAnimation.action.getClip(),\n this.loadedState.group,\n );\n childAnimation.action = null;\n childAnimation = undefined;\n }\n\n if (!childAnimation) {\n childAnimation = {\n action: null,\n clip: null,\n animationState,\n };\n this.childAnimations.set(animation, childAnimation);\n } else {\n childAnimation.animationState = animationState;\n }\n\n if (!childAnimation.action && animationState && animationState.animationClip) {\n const filteredClip = createFilteredClip(\n animationState.animationClip,\n this.loadedState.nodeNames,\n );\n const action = this.childAnimationMixer.clipAction(filteredClip, this.loadedState.group);\n action.enabled = true;\n this.childAnimations.set(animation, {\n action,\n clip: animationState.animationClip,\n animationState,\n });\n }\n }\n\n for (const [attachment, attachmentAnimState] of this.attachments) {\n this.updateAnimationForAttachment(attachment, attachmentAnimState, animation, animationState);\n }\n\n const documentTime = this.model.getDocumentTime();\n this.updateAnimation(documentTime);\n }\n\n private updateAnimationForAttachment(\n attachment: Model<ThreeJSGraphicsAdapter>,\n attachmentAnimState: AttachmentAnimState,\n animation: Animation<ThreeJSGraphicsAdapter>,\n animationState: ThreeJSAnimationState,\n ) {\n let attachmentChildAnimation = attachmentAnimState.childAnimations.animations.get(animation);\n const attachmentChildAnimationMixer = attachmentAnimState.childAnimations.animationMixer;\n\n const attachmentLoadedState = (attachment.modelGraphics as ThreeJSModel).loadedState;\n if (!attachmentLoadedState) {\n throw new Error(\"Attachment must be loaded before registering\");\n }\n\n if (\n attachmentChildAnimation &&\n attachmentChildAnimation.action &&\n attachmentChildAnimation.clip &&\n attachmentChildAnimation.clip !== animationState.animationClip\n ) {\n // if the animation clip has changed, stop the old action and dispose it\n attachmentChildAnimation.action.stop();\n attachmentChildAnimationMixer.uncacheAction(\n attachmentChildAnimation.clip,\n attachmentLoadedState.group,\n );\n attachmentChildAnimation.action = null;\n attachmentChildAnimation = undefined;\n }\n\n if (!attachmentChildAnimation) {\n attachmentChildAnimation = {\n action: null,\n clip: null,\n animationState,\n };\n attachmentAnimState.childAnimations.animations.set(animation, attachmentChildAnimation);\n } else {\n attachmentChildAnimation.animationState = animationState;\n }\n\n if (!attachmentChildAnimation.action && animationState && animationState.animationClip) {\n const filteredClip = createFilteredClip(\n animationState.animationClip,\n attachmentLoadedState.nodeNames,\n );\n const action = attachmentChildAnimationMixer.clipAction(\n filteredClip,\n attachmentLoadedState.group,\n );\n action.enabled = true;\n action.play();\n attachmentAnimState.childAnimations.animations.set(animation, {\n action,\n clip: animationState.animationClip,\n animationState,\n });\n }\n }\n\n removeChildAnimation(animation: Animation<ThreeJSGraphicsAdapter>) {\n const childAnimation = this.childAnimations.get(animation);\n if (childAnimation) {\n const action = childAnimation.action;\n if (action) {\n action.stop();\n if (this.childAnimationMixer && this.loadedState) {\n this.childAnimationMixer.uncacheAction(action.getClip(), this.loadedState.group);\n }\n }\n this.childAnimations.delete(animation);\n\n for (const [attachment, attachmentAnimState] of this.attachments) {\n this.removeAnimationForAttachment(attachment, attachmentAnimState, animation);\n }\n }\n }\n\n private removeAnimationForAttachment(\n attachment: Model<ThreeJSGraphicsAdapter>,\n attachmentAnimState: AttachmentAnimState,\n animation: Animation<ThreeJSGraphicsAdapter>,\n ) {\n const attachmentChildAnimation = attachmentAnimState.childAnimations.animations.get(animation);\n if (attachmentChildAnimation) {\n const action = attachmentChildAnimation.action;\n if (action) {\n action.stop();\n const attachmentLoadedState = (attachment.modelGraphics as ThreeJSModel).loadedState;\n if (attachmentLoadedState) {\n attachmentAnimState.childAnimations.animationMixer.uncacheAction(\n action.getClip(),\n attachmentLoadedState.group,\n );\n }\n attachmentChildAnimation.action = null;\n }\n }\n attachmentAnimState.childAnimations.animations.delete(animation);\n }\n\n setAnim(anim: string | null): void {\n if (this.latestAnimModelHandle?.url === anim) {\n // already loading the same animation\n return;\n }\n if (this.latestAnimModelHandle) {\n this.latestAnimModelHandle.dispose();\n this.animLoadingInstanceManager.abortIfLoading();\n }\n this.latestAnimModelHandle = null;\n\n this.resetAnimationMixer();\n this.animState = null;\n for (const [, attachmentAnimState] of this.attachments) {\n if (attachmentAnimState) {\n attachmentAnimState.directAnimation?.animationMixer?.stopAllAction();\n\n // Reset attachment to default pose by clearing all animations and updating mixer\n if (attachmentAnimState.directAnimation?.animationMixer) {\n attachmentAnimState.directAnimation.animationMixer.update(0);\n }\n\n // Also reset the child animation mixer to ensure clean state\n attachmentAnimState.childAnimations.animationMixer.stopAllAction();\n attachmentAnimState.childAnimations.animationMixer.update(0);\n\n attachmentAnimState.directAnimation = null;\n }\n }\n\n if (!anim) {\n this.animLoadingInstanceManager.abortIfLoading();\n\n // if the animation is removed then the model can be added to\n // the parent attachment if the model is loaded\n if (this.loadedState && !this.registeredParentAttachment) {\n const parent = this.model.parentElement;\n if (parent && Model.isModel(parent)) {\n this.registeredParentAttachment = parent as Model<ThreeJSGraphicsAdapter>;\n (parent.modelGraphics as ThreeJSModel).registerAttachment(this.model);\n }\n }\n\n // restore document time tick listener if model is loaded (for future child animations)\n if (this.loadedState && !this.documentTimeTickListener) {\n this.documentTimeTickListener = this.model.addDocumentTimeTickListener(\n (documentTime: number) => {\n this.updateAnimation(documentTime);\n },\n );\n }\n\n // Restore child animations for all attachments when anim attribute is removed\n for (const [attachment, attachmentAnimState] of this.attachments) {\n for (const [animation, childAnimation] of this.childAnimations) {\n this.updateAnimationForAttachment(\n attachment,\n attachmentAnimState,\n animation,\n childAnimation.animationState,\n );\n }\n }\n\n return;\n }\n\n if (this.registeredParentAttachment) {\n (this.registeredParentAttachment.modelGraphics as ThreeJSModel).unregisterAttachment(\n this.model,\n );\n this.registeredParentAttachment = null;\n }\n\n const animSrc = this.model.contentSrcToContentAddress(anim);\n this.animLoadingInstanceManager.start(this.model.getLoadingProgressManager(), animSrc);\n const animModelHandle = this.model\n .getScene()\n .getGraphicsAdapter()\n .getResourceManager()\n .loadModel(animSrc);\n this.latestAnimModelHandle = animModelHandle;\n animModelHandle.onProgress((loaded, total) => {\n if (this.latestAnimModelHandle !== animModelHandle) {\n return;\n }\n this.animLoadingInstanceManager.setProgress(loaded / total);\n });\n animModelHandle.onLoad((result: ModelLoadResult | Error) => {\n if (result instanceof Error) {\n console.error(\"Error loading m-model.anim\", result);\n this.latestAnimModelHandle = null;\n this.animLoadingInstanceManager.error(result);\n return;\n }\n if (this.latestAnimModelHandle !== animModelHandle || !this.model.isConnected) {\n return;\n }\n const animationClip = result.animations[0];\n if (this.loadedState) {\n const filteredClip = createFilteredClip(animationClip, this.loadedState.nodeNames);\n this.playAnimation(filteredClip);\n } else {\n this.playAnimation(animationClip);\n }\n\n for (const [model] of this.attachments) {\n this.registerAttachment(model);\n }\n\n this.animLoadingInstanceManager.finish();\n });\n }\n\n setAnimEnabled(): void {\n if (this.model.props.animEnabled) {\n if (this.animState && !this.animState.appliedAnimation) {\n for (const [attachment] of this.attachments) {\n this.registerAttachment(attachment);\n }\n this.playAnimation(this.animState.currentAnimationClip);\n }\n } else if (!this.model.props.animEnabled) {\n for (const [attachment, attachmentAnimState] of this.attachments) {\n if (attachmentAnimState) {\n attachmentAnimState.directAnimation?.animationMixer?.stopAllAction();\n\n // Reset attachment to default pose by clearing all animations and updating mixer\n if (attachmentAnimState.directAnimation?.animationMixer) {\n attachmentAnimState.directAnimation.animationMixer.update(0);\n }\n\n // Also reset the child animation mixer to ensure clean state\n attachmentAnimState.childAnimations.animationMixer.stopAllAction();\n attachmentAnimState.childAnimations.animationMixer.update(0);\n\n attachmentAnimState.directAnimation = null;\n }\n this.model.getContainer().add(attachment.getContainer());\n }\n }\n }\n\n setAnimLoop(): void {\n // no-op - property is observed in animation tick\n }\n\n setAnimStartTime(): void {\n // no-op - property is observed in animation tick\n }\n\n setAnimPauseTime(): void {\n // no-op - property is observed in animation tick\n }\n\n transformed(): void {\n // no-op\n }\n\n setSrc(src: string | null): void {\n if (this.latestSrcModelHandle?.url === src) {\n // already loading the same src\n return;\n }\n if (this.latestSrcModelHandle) {\n this.latestSrcModelHandle.dispose();\n this.srcLoadingInstanceManager.abortIfLoading();\n }\n this.latestSrcModelHandle = null;\n\n if (this.loadedState !== null) {\n this.loadedState.group.removeFromParent();\n if (this.registeredParentAttachment) {\n (this.registeredParentAttachment.modelGraphics as ThreeJSModel).unregisterAttachment(\n this.model,\n );\n this.registeredParentAttachment = null;\n }\n ThreeJSModel.disposeOfGroup(this.loadedState.group);\n this.loadedState = null;\n this.updateMeshCallback();\n this.updateDebugVisualisation();\n }\n\n // Clean up animation mixer\n if (this.childAnimationMixer) {\n this.childAnimationMixer.stopAllAction();\n this.childAnimationMixer = null;\n }\n for (const [, childAnimation] of this.childAnimations) {\n // The actions will need to be recreated when the new model is loaded\n childAnimation.action?.stop();\n childAnimation.action = null;\n }\n\n if (!src) {\n this.latestSrcModelHandle = null;\n this.srcLoadingInstanceManager.abortIfLoading();\n this.socketChildrenByBone.forEach((children) => {\n children.forEach((child) => {\n this.model.getContainer().add(child.getContainer());\n });\n });\n this.updateMeshCallback();\n this.updateDebugVisualisation();\n return;\n }\n\n const contentSrc = this.model.contentSrcToContentAddress(src);\n this.srcLoadingInstanceManager.start(this.model.getLoadingProgressManager(), contentSrc);\n const srcModelHandle = this.model\n .getScene()\n .getGraphicsAdapter()\n .getResourceManager()\n .loadModel(contentSrc);\n this.latestSrcModelHandle = srcModelHandle;\n srcModelHandle.onProgress((loaded, total) => {\n if (this.latestSrcModelHandle !== srcModelHandle) {\n return;\n }\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n });\n srcModelHandle.onLoad((result: ModelLoadResult | Error) => {\n if (result instanceof Error) {\n console.error(\"Error loading m-model.src\", result);\n this.latestSrcModelHandle = null;\n this.srcLoadingInstanceManager.error(result);\n return;\n }\n result.group.traverse((child: THREE.Object3D) => {\n if ((child as THREE.Mesh).isMesh) {\n child.castShadow = this.model.props.castShadows;\n child.receiveShadow = true;\n }\n });\n autoInstanceScene(result.group);\n const group = result.group;\n const bones = new Map<string, THREE.Bone>();\n const nodeNames = new Set<string>();\n group.traverse((object: THREE.Object3D) => {\n nodeNames.add(object.name);\n if (object instanceof THREE.Bone) {\n bones.set(object.name, object);\n }\n });\n\n const boundingBox = new THREE.Box3();\n group.updateWorldMatrix(true, true);\n boundingBox.expandByObject(group);\n\n this.loadedState = {\n group,\n bones,\n nodeNames,\n boundingBox: {\n size: boundingBox.getSize(new THREE.Vector3(0, 0, 0)),\n centerOffset: boundingBox.getCenter(new THREE.Vector3(0, 0, 0)),\n },\n };\n this.model.getContainer().add(group);\n\n this.childAnimationMixer = new THREE.AnimationMixer(group);\n\n if (!this.documentTimeTickListener) {\n this.documentTimeTickListener = this.model.addDocumentTimeTickListener(\n (documentTime: number) => {\n this.updateAnimation(documentTime);\n },\n );\n }\n\n for (const [boneName, children] of this.socketChildrenByBone) {\n const bone = bones.get(boneName);\n if (bone) {\n children.forEach((child) => {\n bone.add(child.getContainer());\n });\n }\n }\n\n this.updateMeshCallback();\n\n const parent = this.model.parentElement;\n if (parent && Model.isModel(parent)) {\n if (!this.latestAnimModelHandle && !this.animState) {\n this.registeredParentAttachment = parent as Model<ThreeJSGraphicsAdapter>;\n (parent.modelGraphics as ThreeJSModel).registerAttachment(this.model);\n }\n }\n\n if (this.animState) {\n this.playAnimation(this.animState.currentAnimationClip);\n }\n this.srcLoadingInstanceManager.finish();\n this.updateDebugVisualisation();\n\n for (const [animation, childAnimation] of this.childAnimations) {\n this.updateChildAnimation(animation, childAnimation.animationState);\n }\n });\n }\n\n public registerAttachment(attachment: Model<ThreeJSGraphicsAdapter>) {\n const childAnimationGroup = new THREE.AnimationObjectGroup();\n const childAnimationMixer = new THREE.AnimationMixer(childAnimationGroup);\n const animState: AttachmentAnimState = {\n directAnimation: null,\n childAnimations: {\n animationMixer: childAnimationMixer,\n animations: new Map(),\n },\n };\n\n for (const [animation, childAnimation] of this.childAnimations) {\n this.updateAnimationForAttachment(\n attachment,\n animState,\n animation,\n childAnimation.animationState,\n );\n }\n\n if (this.animState) {\n // There is an existing animation specified on the model itself\n const attachmentLoadedState = (attachment.modelGraphics as ThreeJSModel).loadedState;\n if (!attachmentLoadedState) {\n throw new Error(\"Attachment must be loaded before registering\");\n }\n const animationGroup = new THREE.AnimationObjectGroup();\n const animationMixer = new THREE.AnimationMixer(animationGroup);\n const action = animationMixer.clipAction(this.animState.currentAnimationClip);\n animState.directAnimation = {\n animationMixer,\n animationAction: action,\n };\n animationGroup.add(attachmentLoadedState.group);\n action.play();\n }\n this.attachments.set(attachment, animState);\n }\n\n public unregisterAttachment(attachment: Model<ThreeJSGraphicsAdapter>) {\n const attachmentState = this.attachments.get(attachment);\n if (attachmentState) {\n if (attachmentState.directAnimation) {\n attachmentState.directAnimation.animationMixer?.stopAllAction();\n }\n attachmentState.childAnimations.animationMixer.stopAllAction();\n }\n this.attachments.delete(attachment);\n }\n\n private updateDebugVisualisation() {\n if (!this.model.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (!this.debugBoundingBox) {\n this.debugBoundingBox = new THREE.Mesh(\n ThreeJSModel.DebugBoundingBoxGeometry,\n ThreeJSModel.DebugBoundingBoxMaterial,\n );\n this.model.getContainer().add(this.debugBoundingBox);\n }\n if (this.loadedState) {\n const boundingBox = this.loadedState.boundingBox;\n if (boundingBox.centerOffset) {\n this.debugBoundingBox.position.copy(boundingBox.centerOffset);\n } else {\n this.debugBoundingBox.position.set(0, 0, 0);\n }\n this.debugBoundingBox.scale.copy(boundingBox.size);\n } else {\n this.debugBoundingBox.scale.set(0, 0, 0);\n }\n }\n }\n\n private clearDebugVisualisation() {\n if (this.debugBoundingBox) {\n this.debugBoundingBox.removeFromParent();\n this.debugBoundingBox = null;\n }\n }\n\n private resetAnimationMixer() {\n if (this.documentTimeTickListener) {\n this.documentTimeTickListener.remove();\n this.documentTimeTickListener = null;\n }\n if (this.animState) {\n const appliedAnimation = this.animState.appliedAnimation;\n if (appliedAnimation) {\n appliedAnimation.animationMixer.stopAllAction();\n }\n this.animState.appliedAnimation = null;\n }\n }\n\n public registerSocketChild(\n child: TransformableElement<ThreeJSGraphicsAdapter>,\n socketName: string,\n ): void {\n let children = this.socketChildrenByBone.get(socketName);\n if (!children) {\n children = new Set<MElement<ThreeJSGraphicsAdapter>>();\n this.socketChildrenByBone.set(socketName, children);\n }\n children.add(child);\n\n if (this.loadedState) {\n const bone = this.loadedState.bones.get(socketName);\n if (bone) {\n bone.add(child.getContainer());\n } else {\n this.model.getContainer().add(child.getContainer());\n }\n }\n }\n\n public unregisterSocketChild(\n child: TransformableElement<ThreeJSGraphicsAdapter>,\n socketName: string,\n addToRoot: boolean = true,\n ): void {\n const socketChildren = this.socketChildrenByBone.get(socketName);\n if (socketChildren) {\n socketChildren.delete(child);\n if (addToRoot) {\n this.model.getContainer().add(child.getContainer());\n }\n if (socketChildren.size === 0) {\n this.socketChildrenByBone.delete(socketName);\n }\n }\n }\n\n private triggerSocketedChildrenTransformed() {\n // Socketed children need to be updated when the animation is updated as their position may have updated\n this.socketChildrenByBone.forEach((children) => {\n children.forEach((child) => {\n if (TransformableElement.isTransformableElement(child)) {\n child.didUpdateTransformation();\n }\n });\n });\n }\n\n private playAnimation(anim: THREE.AnimationClip) {\n this.resetAnimationMixer();\n this.animState = {\n currentAnimationClip: anim,\n appliedAnimation: null,\n };\n const animationGroup = new THREE.AnimationObjectGroup();\n const animationMixer = new THREE.AnimationMixer(animationGroup);\n const action = animationMixer.clipAction(anim);\n this.animState.appliedAnimation = {\n animationGroup,\n animationMixer,\n animationAction: action,\n };\n if (this.loadedState) {\n animationGroup.add(this.loadedState.group);\n }\n action.play();\n if (!this.documentTimeTickListener) {\n this.documentTimeTickListener = this.model.addDocumentTimeTickListener(\n (documentTime: number) => {\n this.updateAnimation(documentTime);\n },\n );\n }\n }\n\n private updateAnimation(docTimeMs: number, force: boolean = false) {\n if (this.animState) {\n if (!this.model.props.animEnabled && this.animState.appliedAnimation) {\n this.resetAnimationMixer();\n this.triggerSocketedChildrenTransformed();\n } else {\n if (!this.animState.appliedAnimation) {\n this.playAnimation(this.animState.currentAnimationClip);\n }\n let animationTimeMs = docTimeMs - this.model.props.animStartTime;\n if (docTimeMs < this.model.props.animStartTime) {\n animationTimeMs = 0;\n } else if (this.model.props.animPauseTime !== null) {\n if (docTimeMs > this.model.props.animPauseTime) {\n animationTimeMs = this.model.props.animPauseTime - this.model.props.animStartTime;\n }\n }\n\n const clip = this.animState.currentAnimationClip;\n if (clip !== null) {\n if (!this.model.props.animLoop) {\n if (animationTimeMs > clip.duration * 1000) {\n animationTimeMs = clip.duration * 1000;\n }\n }\n }\n\n for (const [model, attachmentAnimState] of this.attachments) {\n if (attachmentAnimState.directAnimation) {\n attachmentAnimState.directAnimation.animationMixer?.setTime(animationTimeMs / 1000);\n (model.modelGraphics as ThreeJSModel).triggerSocketedChildrenTransformed();\n }\n }\n\n if (force) {\n this.animState.appliedAnimation?.animationMixer.setTime((animationTimeMs + 1) / 1000);\n }\n this.animState.appliedAnimation?.animationMixer.setTime(animationTimeMs / 1000);\n this.triggerSocketedChildrenTransformed();\n }\n } else if (this.childAnimationMixer) {\n // Handle child animations\n if (this.model.props.animEnabled) {\n // Map of animation to animationTimeMs | null\n const animationTimes = new Map<Animation<ThreeJSGraphicsAdapter>, number>();\n\n let hasActiveAnimations = false;\n\n // Update each child animation based on its individual timing properties\n for (const [animation, childAnimation] of this.childAnimations) {\n const animationState = childAnimation.animationState;\n const action = childAnimation.action;\n if (animationState && action) {\n // Check if this animation should be active based on timing\n let shouldBeActive = true;\n let animationTimeMs = 0;\n\n // Handle start time - animation doesn't start until start time\n if (docTimeMs < animationState.startTime) {\n shouldBeActive = false;\n } else {\n animationTimeMs = docTimeMs - animationState.startTime;\n }\n\n // Handle pause time - animation stops at pause time\n if (shouldBeActive && animationState.pauseTime !== null) {\n if (docTimeMs > animationState.pauseTime) {\n shouldBeActive = false; // Stop the animation when pause time is reached\n }\n }\n\n const durationMs = (animationState.animationClip?.duration ?? 1) * 1000;\n\n animationTimeMs = animationTimeMs * animationState.speed;\n\n if (animationState.ratio !== null) {\n animationTimeMs = animationState.ratio * durationMs;\n }\n\n // Handle loop and duration\n if (shouldBeActive && animationState.animationClip) {\n if (!animationState.loop) {\n if (animationTimeMs > durationMs) {\n animationTimeMs = durationMs;\n shouldBeActive = false; // Stop the animation when it reaches the end\n }\n }\n }\n\n // Control the action based on timing\n if (shouldBeActive) {\n animationTimes.set(animation, animationTimeMs);\n action.enabled = true;\n action.setEffectiveWeight(animationState.weight);\n if (animationState.weight > 0) {\n hasActiveAnimations = true;\n action.play();\n } else {\n action.stop();\n }\n action.time = (animationTimeMs % durationMs) / 1000;\n } else {\n action.enabled = false;\n action.stop();\n }\n }\n }\n\n if (!hasActiveAnimations) {\n // No active animations, stop all actions and reset to t-pose\n this.childAnimationMixer.stopAllAction();\n }\n this.childAnimationMixer.update(0);\n\n for (const [, attachmentAnimState] of this.attachments) {\n for (const [animation, childAnimation] of attachmentAnimState.childAnimations\n .animations) {\n const animationTimeMs = animationTimes.get(animation);\n const action = childAnimation.action;\n if (action) {\n if (animationTimeMs !== undefined) {\n action.enabled = true;\n action.setEffectiveWeight(childAnimation.animationState.weight);\n if (childAnimation.animationState.weight > 0) {\n action.play();\n } else {\n action.stop();\n }\n action.time = animationTimeMs / 1000;\n } else {\n action.enabled = false;\n action.stop();\n }\n }\n }\n\n if (!hasActiveAnimations) {\n attachmentAnimState.childAnimations.animationMixer.stopAllAction();\n }\n attachmentAnimState.childAnimations.animationMixer.update(0.000000001);\n }\n\n this.triggerSocketedChildrenTransformed();\n } else {\n this.childAnimationMixer.stopAllAction();\n }\n }\n }\n\n dispose() {\n if (this.documentTimeTickListener) {\n this.documentTimeTickListener.remove();\n this.documentTimeTickListener = null;\n }\n if (this.registeredParentAttachment) {\n (this.registeredParentAttachment?.modelGraphics as ThreeJSModel)?.unregisterAttachment(\n this.model,\n );\n this.registeredParentAttachment = null;\n }\n if (this.loadedState) {\n this.loadedState.group.removeFromParent();\n ThreeJSModel.disposeOfGroup(this.loadedState.group);\n this.loadedState = null;\n }\n this.clearDebugVisualisation();\n if (this.latestSrcModelHandle) {\n this.latestSrcModelHandle.dispose();\n }\n this.latestSrcModelHandle = null;\n if (this.latestAnimModelHandle) {\n this.latestAnimModelHandle.dispose();\n }\n this.latestAnimModelHandle = null;\n this.animLoadingInstanceManager.dispose();\n this.srcLoadingInstanceManager.dispose();\n\n if (this.childAnimationMixer) {\n this.childAnimationMixer.stopAllAction();\n this.childAnimationMixer = null;\n }\n this.childAnimations.clear();\n }\n\n private static disposeOfGroup(group: THREE.Object3D) {\n group.traverse((child) => {\n if ((child as THREE.Mesh).isMesh) {\n const mesh = child as THREE.Mesh;\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n for (const material of mesh.material) {\n ThreeJSModel.disposeOfMaterial(material);\n }\n } else if (mesh.material) {\n ThreeJSModel.disposeOfMaterial(mesh.material);\n }\n }\n });\n }\n\n private static disposeOfMaterial(material: THREE.Material) {\n material.dispose();\n for (const key of Object.keys(material)) {\n const value = (material as any)[key];\n if (value && typeof value === \"object\" && \"minFilter\" in value) {\n value.dispose();\n }\n }\n }\n}\n", "import * as THREE from \"three\";\n\n/**\n * post-processes a loaded GLTF scene graph to detect duplicate meshes\n * (same geometry + material) and replace them with InstancedMesh,\n * reducing draw calls from N to 1 per unique geometry + material pair.\n *\n * NOTE: instanced meshes are reparented as direct children of `root` with\n * baked world transforms. This means they will not follow if an intermediate\n * parent's transform is later modified (e.g. by animation). This is intended\n * for static scene geometry only.\n */\nexport function autoInstanceScene(root: THREE.Object3D, debug?: boolean): void {\n // 1) collect eligible meshes\n const eligibleMeshes: THREE.Mesh[] = [];\n root.traverse((object) => {\n if (!(object as THREE.Mesh).isMesh) return;\n const mesh = object as THREE.Mesh;\n // Skip SkinnedMesh\n if ((mesh as THREE.SkinnedMesh).isSkinnedMesh) return;\n // Skip meshes with morph targets\n if (mesh.geometry.morphAttributes && Object.keys(mesh.geometry.morphAttributes).length > 0)\n return;\n // Skip meshes with multi-material arrays\n if (Array.isArray(mesh.material)) return;\n eligibleMeshes.push(mesh);\n });\n\n if (eligibleMeshes.length === 0) return;\n\n // 2) fingerprint meshes by geometry + material and group into buckets\n // key: \"materialId|geometryFingerprint\" -> meshes\n const buckets = new Map<string, THREE.Mesh[]>();\n\n // assign stable IDs to materials by reference so meshes sharing the\n // same material instance get the same bucket key\n const materialIds = new Map<THREE.Material, number>();\n let nextMaterialId = 0;\n\n for (const mesh of eligibleMeshes) {\n const mat = mesh.material as THREE.Material;\n if (!materialIds.has(mat)) {\n materialIds.set(mat, nextMaterialId++);\n }\n const materialId = materialIds.get(mat);\n const geomFingerprint = computeGeometryFingerprint(mesh.geometry);\n const key = `${materialId}|${geomFingerprint}`;\n\n let bucket = buckets.get(key);\n if (!bucket) {\n bucket = [];\n buckets.set(key, bucket);\n }\n bucket.push(mesh);\n }\n\n // 3) verify geometry equality within each bucket via full buffer comparison\n // sub-group into verified-equal sets\n const verifiedGroups: THREE.Mesh[][] = [];\n for (const bucket of buckets.values()) {\n if (bucket.length < 2) continue;\n const subGroups = verifyGeometryEquality(bucket);\n for (const subGroup of subGroups) {\n if (subGroup.length >= 2) {\n verifiedGroups.push(subGroup);\n }\n }\n }\n\n if (verifiedGroups.length === 0) return;\n\n // ensure world matrices are up-to-date\n root.updateWorldMatrix(true, true);\n const rootInverse = new THREE.Matrix4().copy(root.matrixWorld).invert();\n\n // 4) replace groups of 2+ with InstancedMesh\n let totalMeshesInstanced = 0;\n let totalInstancedMeshes = 0;\n let totalDuplicatesRemoved = 0;\n\n const tempMatrix = new THREE.Matrix4();\n // used to compensate mirrored instance matrices (flip is its own inverse)\n const flipMatrix = new THREE.Matrix4().makeScale(-1, 1, 1);\n\n for (const group of verifiedGroups) {\n // compute instance matrices and deduplicate overlapping transforms.\n // two meshes are considered true duplicates only when all 16 matrix\n // elements match within an epsilon \u2014 this covers position, rotation,\n // and scale so rotated/scaled copies at the same origin are kept.\n const seenMatrixKeys = new Set<string>();\n const uniqueMatrices: THREE.Matrix4[] = [];\n for (const mesh of group) {\n tempMatrix.multiplyMatrices(rootInverse, mesh.matrixWorld);\n const key = matrixKey(tempMatrix);\n if (!seenMatrixKeys.has(key)) {\n seenMatrixKeys.add(key);\n uniqueMatrices.push(tempMatrix.clone());\n }\n }\n\n const duplicatesInGroup = group.length - uniqueMatrices.length;\n totalDuplicatesRemoved += duplicatesInGroup;\n\n // after dedup, need at least 2 unique instances to justify instancing\n if (uniqueMatrices.length < 2) {\n // only 1 unique transform: leave the first mesh as-is, remove the rest\n for (let i = 1; i < group.length; i++) {\n group[i].removeFromParent();\n if (group[i].geometry !== group[0].geometry) {\n group[i].geometry.dispose();\n }\n const mat = group[i].material as THREE.Material;\n if (mat !== (group[0].material as THREE.Material)) {\n mat.dispose();\n }\n }\n continue;\n }\n\n // split by transform determinant sign. mirrored transforms (negative\n // determinant) flip triangle winding order. Three.js sets the front face\n // winding once per InstancedMesh (from its own matrixWorld determinant),\n // not per-instance. mixing mirrored and non-mirrored instances in the\n // same InstancedMesh causes the mirrored ones to show inner faces.\n const normalMatrices = uniqueMatrices.filter((m) => m.determinant() >= 0);\n const mirroredMatrices = uniqueMatrices.filter((m) => m.determinant() < 0);\n\n const referenceMesh = group[0];\n\n // remove all original meshes and dispose non-shared resources\n const keptGeometry = referenceMesh.geometry;\n const keptMaterial = referenceMesh.material as THREE.Material;\n for (const mesh of group) {\n mesh.removeFromParent();\n if (mesh.geometry !== keptGeometry) {\n mesh.geometry.dispose();\n }\n const mat = mesh.material as THREE.Material;\n if (mat !== keptMaterial) {\n mat.dispose();\n }\n }\n\n // create InstancedMesh for non-mirrored instances\n if (normalMatrices.length > 0) {\n const instancedMesh = new THREE.InstancedMesh(\n referenceMesh.geometry,\n referenceMesh.material as THREE.Material,\n normalMatrices.length,\n );\n instancedMesh.castShadow = referenceMesh.castShadow;\n instancedMesh.receiveShadow = referenceMesh.receiveShadow;\n for (let i = 0; i < normalMatrices.length; i++) {\n instancedMesh.setMatrixAt(i, normalMatrices[i]);\n }\n instancedMesh.instanceMatrix.needsUpdate = true;\n root.add(instancedMesh);\n totalMeshesInstanced += normalMatrices.length;\n totalInstancedMeshes++;\n }\n\n // create InstancedMesh for mirrored instances\n if (mirroredMatrices.length > 0) {\n const instancedMesh = new THREE.InstancedMesh(\n referenceMesh.geometry,\n referenceMesh.material as THREE.Material,\n mirroredMatrices.length,\n );\n instancedMesh.castShadow = referenceMesh.castShadow;\n instancedMesh.receiveShadow = referenceMesh.receiveShadow;\n // apply a flip to the InstancedMesh itself so its matrixWorld has a\n // negative determinant, causing Three.js to reverse the front face\n // winding for all instances in this batch. compensate in each instance\n // matrix: final = root * flip * (flip * original) = root * original\n instancedMesh.scale.set(-1, 1, 1);\n for (let i = 0; i < mirroredMatrices.length; i++) {\n tempMatrix.multiplyMatrices(flipMatrix, mirroredMatrices[i]);\n instancedMesh.setMatrixAt(i, tempMatrix);\n }\n instancedMesh.instanceMatrix.needsUpdate = true;\n root.add(instancedMesh);\n totalMeshesInstanced += mirroredMatrices.length;\n totalInstancedMeshes++;\n }\n }\n\n const drawCallsSaved = totalMeshesInstanced - totalInstancedMeshes;\n const duplicates =\n totalDuplicatesRemoved > 0\n ? `, removed ${totalDuplicatesRemoved} duplicate overlapping meshes`\n : \"\";\n if (debug) {\n console.log(`autoInstanceScene:\nInstanced ${totalMeshesInstanced} meshes into ${totalInstancedMeshes} InstancedMesh objects\nSavings: ${drawCallsSaved} draw calls\n${duplicates}`);\n }\n}\n\nfunction computeGeometryFingerprint(geometry: THREE.BufferGeometry): string {\n const posAttr = geometry.getAttribute(\"position\");\n const indexAttr = geometry.index;\n\n const vertexCount = posAttr ? posAttr.count : 0;\n const indexCount = indexAttr ? indexAttr.count : 0;\n\n let posHash = 0;\n if (posAttr) {\n posHash = hashTypedArray(posAttr.array as ArrayLike<number>);\n }\n\n let idxHash = 0;\n if (indexAttr) {\n idxHash = hashTypedArray(indexAttr.array as ArrayLike<number>);\n }\n\n // include normals and UVs in the fingerprint so meshes with the same\n // positions but different normals/UVs are not incorrectly grouped.\n const normalAttr = geometry.getAttribute(\"normal\");\n let normalHash = 0;\n if (normalAttr) {\n normalHash = hashTypedArray(normalAttr.array as ArrayLike<number>);\n }\n\n const uvAttr = geometry.getAttribute(\"uv\");\n let uvHash = 0;\n if (uvAttr) {\n uvHash = hashTypedArray(uvAttr.array as ArrayLike<number>);\n }\n\n return `${vertexCount}:${indexCount}:${posHash}:${idxHash}:${normalHash}:${uvHash}`;\n}\n\n// reusable buffer for reading IEEE 754 bit patterns from floats\nconst _hashFloat32 = new Float32Array(1);\nconst _hashDataView = new DataView(_hashFloat32.buffer);\n\nfunction hashTypedArray(arr: ArrayLike<number>): number {\n // sample-based FNV-1a-like hash for performance on large buffers\n let hash = 2166136261;\n const len = arr.length;\n // sample up to 256 evenly-spaced elements for large arrays\n const step = len > 256 ? Math.floor(len / 256) : 1;\n for (let i = 0; i < len; i += step) {\n // read IEEE 754 bit pattern for lossless float hashing\n _hashFloat32[0] = arr[i];\n const intBits = _hashDataView.getInt32(0, true);\n hash ^= intBits;\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0; // ensure unsigned\n}\n\nfunction verifyGeometryEquality(meshes: THREE.Mesh[]): THREE.Mesh[][] {\n const groups: THREE.Mesh[][] = [];\n\n for (const mesh of meshes) {\n let placed = false;\n for (const group of groups) {\n if (geometriesAreEqual(group[0].geometry, mesh.geometry)) {\n group.push(mesh);\n placed = true;\n break;\n }\n }\n if (!placed) {\n groups.push([mesh]);\n }\n }\n\n return groups;\n}\n\nfunction geometriesAreEqual(a: THREE.BufferGeometry, b: THREE.BufferGeometry): boolean {\n // fast path: same reference\n if (a === b) return true;\n\n // compare all named attributes (position, normal, uv, etc.)\n const attrNamesA = Object.keys(a.attributes);\n const attrNamesB = Object.keys(b.attributes);\n if (attrNamesA.length !== attrNamesB.length) return false;\n\n for (const name of attrNamesA) {\n const attrA = a.getAttribute(name);\n const attrB = b.getAttribute(name);\n if (!attrA || !attrB) return false;\n if (attrA.count !== attrB.count) return false;\n if (attrA.itemSize !== attrB.itemSize) return false;\n if (!typedArraysEqual(attrA.array as ArrayLike<number>, attrB.array as ArrayLike<number>))\n return false;\n }\n\n // compare index\n const idxA = a.index;\n const idxB = b.index;\n if ((idxA === null) !== (idxB === null)) return false;\n if (idxA && idxB) {\n if (idxA.count !== idxB.count) return false;\n if (!typedArraysEqual(idxA.array as ArrayLike<number>, idxB.array as ArrayLike<number>))\n return false;\n }\n\n return true;\n}\n\nfunction typedArraysEqual(a: ArrayLike<number>, b: ArrayLike<number>): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nconst MATRIX_QUANTIZE = 1e5; // reciprocal of epsilon \u2014 quantize to 1e-5 grid\n\nfunction matrixKey(m: THREE.Matrix4): string {\n const e = m.elements;\n let s = \"\" + Math.round(e[0] * MATRIX_QUANTIZE);\n for (let i = 1; i < 16; i++) {\n s += \",\" + Math.round(e[i] * MATRIX_QUANTIZE);\n }\n return s;\n}\n", "import { Overlay, OverlayGraphics } from \"@mml-io/mml-web\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSOverlay extends OverlayGraphics<ThreeJSGraphicsAdapter> {\n constructor(private overlay: Overlay<ThreeJSGraphicsAdapter>) {\n super(overlay);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setAnchor(): void {\n // no-op\n }\n\n setOffsetX(): void {\n // no-op\n }\n\n setOffsetY(): void {\n // no-op\n }\n\n dispose() {}\n}\n", "import { Plane } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport { PlaneGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSPlane extends PlaneGraphics<ThreeJSGraphicsAdapter> {\n static planeGeometry = new THREE.PlaneGeometry(1, 1);\n private mesh: THREE.Mesh<THREE.PlaneGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial;\n\n constructor(private plane: Plane<ThreeJSGraphicsAdapter>) {\n super(plane);\n\n this.material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(plane.props.color.r, plane.props.color.g, plane.props.color.b),\n });\n this.mesh = new THREE.Mesh(ThreeJSPlane.planeGeometry, this.material);\n this.mesh.castShadow = plane.props.castShadows;\n this.mesh.receiveShadow = true;\n this.plane.getContainer().add(this.mesh);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n setColor(color: MMLColor): void {\n this.material.color = new THREE.Color(color.r, color.g, color.b);\n }\n\n setWidth(width: number): void {\n this.mesh.scale.x = width;\n }\n\n setHeight(height: number): void {\n this.mesh.scale.y = height;\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n setOpacity(opacity: number): void {\n const needsUpdate = this.material.transparent === (opacity === 1);\n this.material.transparent = opacity !== 1;\n this.material.needsUpdate = needsUpdate;\n this.material.opacity = opacity;\n }\n\n dispose() {}\n}\n", "import { PositionProbe } from \"@mml-io/mml-web\";\nimport { PositionProbeGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSPositionProbe extends PositionProbeGraphics<ThreeJSGraphicsAdapter> {\n private static DebugGeometry = new THREE.SphereGeometry(1, 16, 16, 1);\n private static DebugMaterial = new THREE.MeshBasicMaterial({\n color: 0xff0000,\n wireframe: true,\n transparent: true,\n opacity: 0.3,\n });\n\n private debugMesh: THREE.Mesh<THREE.SphereGeometry, THREE.MeshBasicMaterial> | null = null;\n\n constructor(private positionProbe: PositionProbe<ThreeJSGraphicsAdapter>) {\n super(positionProbe);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setRange(): void {\n this.updateDebugVisualisation();\n }\n\n setDebug() {\n this.updateDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.debugMesh) {\n this.debugMesh.removeFromParent();\n this.debugMesh = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.positionProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.positionProbe.isConnected && !this.debugMesh) {\n const mesh = new THREE.Mesh(\n ThreeJSPositionProbe.DebugGeometry,\n ThreeJSPositionProbe.DebugMaterial,\n );\n mesh.castShadow = false;\n mesh.receiveShadow = false;\n this.debugMesh = mesh;\n this.positionProbe.getContainer().add(this.debugMesh);\n }\n\n if (this.debugMesh) {\n this.debugMesh.scale.set(\n this.positionProbe.props.range,\n this.positionProbe.props.range,\n this.positionProbe.props.range,\n );\n }\n }\n }\n\n dispose() {\n this.clearDebugVisualisation();\n }\n}\n", "import { Prompt } from \"@mml-io/mml-web\";\nimport { PromptGraphics } from \"@mml-io/mml-web\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSPrompt extends PromptGraphics<ThreeJSGraphicsAdapter> {\n constructor(private prompt: Prompt<ThreeJSGraphicsAdapter>) {\n super(prompt);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setMessage(): void {\n // no-op\n }\n\n setPlaceholder(): void {\n // no-op\n }\n\n setPrefill(): void {\n // no-op\n }\n\n setDebug(): void {\n // no-op\n }\n\n dispose() {}\n}\n", "import { RemoteDocument, RemoteDocumentGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\nimport { getThreeJSReconnectingStatus } from \"../ThreeJSReconnectingStatus\";\n\nexport class ThreeJSRemoteDocument extends RemoteDocumentGraphics<ThreeJSGraphicsAdapter> {\n private statusUI: THREE.Mesh | null = null;\n\n constructor(private element: RemoteDocument<ThreeJSGraphicsAdapter>) {\n super(element);\n }\n\n public showError(showError: boolean): void {\n if (!showError) {\n if (this.statusUI !== null) {\n this.element.getContainer().remove(this.statusUI);\n this.statusUI = null;\n }\n } else {\n if (this.statusUI === null) {\n const { geometry, material, height } = getThreeJSReconnectingStatus();\n const mesh: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial> = new THREE.Mesh(\n geometry,\n material,\n );\n mesh.position.set(0, height / 2, 0);\n this.statusUI = mesh;\n this.element.getContainer().add(this.statusUI);\n }\n }\n }\n\n public dispose() {}\n}\n", "import { CanvasText } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nfunction createReconnectingStatus() {\n const canvas = new CanvasText().renderText(\"Reconnecting\", {\n bold: true,\n fontSize: 32,\n paddingPx: 10,\n textColorRGB255A1: {\n r: 255,\n g: 0,\n b: 0,\n a: 1.0,\n },\n backgroundColorRGB255A1: {\n r: 255,\n g: 255,\n b: 255,\n a: 1.0,\n },\n alignment: \"center\",\n });\n\n const texture = new THREE.Texture(canvas);\n texture.minFilter = THREE.LinearFilter;\n texture.magFilter = THREE.LinearFilter;\n texture.format = THREE.RGBAFormat;\n texture.needsUpdate = true;\n\n const width = canvas.width;\n const height = canvas.height;\n\n const material = new THREE.MeshBasicMaterial({\n map: texture,\n side: THREE.DoubleSide,\n });\n const geometry = new THREE.PlaneGeometry(width / 100, height / 100, 1, 1);\n return { geometry, material, width: width / 100, height: height / 100 };\n}\n\nexport type ThreeJSReconnectingStatus = {\n geometry: THREE.PlaneGeometry;\n material: THREE.MeshBasicMaterial;\n width: number;\n height: number;\n};\n\nlet reconnectingStatus: ThreeJSReconnectingStatus | null = null;\n\nexport function getThreeJSReconnectingStatus(): ThreeJSReconnectingStatus {\n if (!reconnectingStatus) {\n reconnectingStatus = createReconnectingStatus();\n }\n return reconnectingStatus;\n}\n", "import { Sphere } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport { SphereGraphics } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nconst defaultSphereWidthSegments = 16;\nconst defaultSphereHeightSegments = 16;\n\nexport class ThreeJSSphere extends SphereGraphics<ThreeJSGraphicsAdapter> {\n static sphereGeometry = new THREE.SphereGeometry(\n 0.5,\n defaultSphereWidthSegments,\n defaultSphereHeightSegments,\n );\n private mesh: THREE.Mesh<THREE.SphereGeometry, THREE.Material | Array<THREE.Material>>;\n private material: THREE.MeshStandardMaterial;\n\n constructor(private sphere: Sphere<ThreeJSGraphicsAdapter>) {\n super(sphere);\n\n this.material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(sphere.props.color.r, sphere.props.color.g, sphere.props.color.b),\n });\n this.mesh = new THREE.Mesh(ThreeJSSphere.sphereGeometry, this.material);\n this.mesh.castShadow = sphere.props.castShadows;\n this.mesh.receiveShadow = true;\n this.sphere.getContainer().add(this.mesh);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n setColor(color: MMLColor): void {\n this.material.color = new THREE.Color(color.r, color.g, color.b);\n }\n\n setRadius(radius: number): void {\n this.mesh.scale.x = radius * 2;\n this.mesh.scale.y = radius * 2;\n this.mesh.scale.z = radius * 2;\n }\n\n setCastShadows(castShadows: boolean): void {\n this.mesh.castShadow = castShadows;\n }\n\n setOpacity(opacity: number): void {\n const needsUpdate = this.material.transparent === (opacity === 1);\n this.material.transparent = opacity !== 1;\n this.material.needsUpdate = needsUpdate;\n this.material.opacity = opacity;\n }\n\n dispose() {}\n}\n", "import {\n IVect3,\n Matr4,\n Matr4Data,\n Model,\n TransformableElement,\n TransformableGraphics,\n} from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\nimport { ThreeJSModel } from \"./ThreeJSModel\";\n\nexport class ThreeJSTransformable extends TransformableGraphics<ThreeJSGraphicsAdapter> {\n private socketName: string | null = null;\n private registeredSocketParent: ThreeJSModel | null = null;\n\n constructor(private transformableElement: TransformableElement<ThreeJSGraphicsAdapter>) {\n super(transformableElement);\n }\n\n getWorldMatrix(): Matr4 {\n // TODO - optimize/reduce calls to updateWorldMatrix\n const container = this.getContainer();\n container.updateWorldMatrix(true, false);\n return new Matr4(container.matrixWorld.elements as Matr4Data);\n }\n\n getWorldPosition(): IVect3 {\n return this.getContainer().getWorldPosition(new THREE.Vector3());\n }\n\n getLocalPosition(): IVect3 {\n return this.getContainer().position;\n }\n\n getVisible(): boolean {\n return this.getContainer().visible;\n }\n\n setVisible(visible: boolean): void {\n this.getContainer().visible = visible;\n }\n\n setSocket(socketName: string | null): void {\n if (this.socketName !== socketName) {\n if (this.socketName !== null && this.registeredSocketParent) {\n this.registeredSocketParent.unregisterSocketChild(\n this.transformableElement,\n this.socketName,\n );\n }\n this.socketName = socketName;\n if (socketName !== null) {\n this.registerWithParentModel(socketName);\n }\n } else {\n this.socketName = socketName;\n }\n }\n\n private registerWithParentModel(socketName: string): void {\n if (\n (this.transformableElement.parentElement as Model<ThreeJSGraphicsAdapter> | undefined)\n ?.isModel\n ) {\n const parentModel = this.transformableElement.parentElement as Model<ThreeJSGraphicsAdapter>;\n this.registeredSocketParent = parentModel.modelGraphics as ThreeJSModel;\n this.registeredSocketParent.registerSocketChild(this.transformableElement, socketName);\n }\n }\n\n private getContainer(): THREE.Group {\n return this.transformableElement.getContainer() as THREE.Group;\n }\n\n setX(x: number): void {\n this.getContainer().position.x = x;\n }\n\n setY(y: number): void {\n this.getContainer().position.y = y;\n }\n\n setZ(z: number): void {\n this.getContainer().position.z = z;\n }\n\n setRotationX(rotationX: number): void {\n this.getContainer().rotation.x = rotationX * THREE.MathUtils.DEG2RAD;\n }\n\n setRotationY(rotationY: number): void {\n this.getContainer().rotation.y = rotationY * THREE.MathUtils.DEG2RAD;\n }\n\n setRotationZ(rotationZ: number): void {\n this.getContainer().rotation.z = rotationZ * THREE.MathUtils.DEG2RAD;\n }\n\n setScaleX(scaleX: number): void {\n this.getContainer().scale.x = scaleX;\n }\n\n setScaleY(scaleY: number): void {\n this.getContainer().scale.y = scaleY;\n }\n\n setScaleZ(scaleZ: number): void {\n this.getContainer().scale.z = scaleZ;\n }\n\n dispose() {\n if (this.socketName && this.registeredSocketParent !== null) {\n this.registeredSocketParent.unregisterSocketChild(\n this.transformableElement,\n this.socketName,\n false,\n );\n }\n }\n}\n", "import {\n calculateContentSize,\n StaticFileVideoSource,\n Video,\n VideoGraphics,\n VideoSource,\n WHEPVideoSource,\n} from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"../ThreeJSGraphicsAdapter\";\n\nconst audioRefDistance = 1;\nconst audioRolloffFactor = 1;\n\nconst disabledVideoMaterial = new THREE.MeshStandardMaterial({\n color: 0x000000,\n side: THREE.DoubleSide,\n});\n\nexport class ThreeJSVideo extends VideoGraphics<ThreeJSGraphicsAdapter> {\n private videoSource: VideoSource | null = null;\n private videoMaterial: THREE.MeshStandardMaterial;\n\n private mesh: THREE.Mesh<\n THREE.PlaneGeometry,\n THREE.MeshStandardMaterial | THREE.MeshBasicMaterial\n >;\n\n private loadedVideoState: {\n video: HTMLVideoElement;\n audio: THREE.PositionalAudio;\n videoTexture: THREE.VideoTexture | null;\n } | null = null;\n\n constructor(\n private video: Video<ThreeJSGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(video, updateMeshCallback);\n\n const geometry = new THREE.PlaneGeometry(1, 1, 1, 1);\n // Video material is only applied once a video is played\n this.videoMaterial = new THREE.MeshStandardMaterial({\n color: 0xffffff,\n transparent: false,\n side: THREE.DoubleSide,\n });\n this.mesh = new THREE.Mesh(geometry, disabledVideoMaterial);\n this.mesh.castShadow = true;\n this.mesh.receiveShadow = false;\n this.video.getContainer().add(this.mesh);\n }\n\n public getWidthAndHeight(): { width: number; height: number } {\n return {\n width: this.mesh.scale.x,\n height: this.mesh.scale.y,\n };\n }\n\n public syncVideoTime() {\n if (this.loadedVideoState) {\n const videoTag = this.loadedVideoState.video;\n if (videoTag.readyState === 0) {\n return;\n }\n\n const audioListener = this.getAudioListener();\n const audioContext = audioListener.context;\n if (audioContext.state === \"running\") {\n videoTag.muted = false;\n }\n\n if (this.video.isDisabled()) {\n videoTag.muted = true;\n }\n\n if (this.videoSource) {\n this.videoSource.syncVideoSource(this.video.props);\n }\n }\n }\n\n private getAudioListener() {\n return this.video.getScene().getGraphicsAdapter().getAudioListener();\n }\n\n public enable(): void {\n this.updateVideo();\n }\n public disable(): void {\n this.updateVideo();\n }\n\n public getCollisionElement(): THREE.Object3D {\n return this.mesh;\n }\n\n public setSrc(): void {\n this.updateVideo();\n }\n\n public setWidth(): void {\n this.updateWidthAndHeight();\n }\n\n public setHeight(): void {\n this.updateWidthAndHeight();\n }\n\n public setEnabled(): void {\n this.updateVideo();\n }\n\n public setCastShadows(): void {\n this.updateVideo();\n }\n\n public setLoop(): void {\n this.updateVideo();\n }\n\n public setVolume(): void {\n if (this.loadedVideoState) {\n this.loadedVideoState.audio.setVolume(this.video.props.volume);\n }\n }\n\n public setEmissive(): void {\n this.updateVideo();\n this.updateMaterialEmissiveIntensity();\n }\n\n public setStartTime(): void {\n this.updateVideo();\n }\n\n public setPauseTime(): void {\n this.updateVideo();\n }\n\n private updateVideo() {\n if (!this.video.isConnected) {\n return;\n }\n\n if (!this.video.props.enabled) {\n this.clearSource();\n return;\n }\n\n if (!this.video.props.src) {\n this.clearSource();\n } else {\n const contentAddress = this.video.contentSrcToContentAddress(this.video.props.src);\n if (this.videoSource === null || this.videoSource.getContentAddress() !== contentAddress) {\n this.clearSource();\n\n const video = document.createElement(\"video\");\n video.playsInline = true;\n // Muted allows autoplay immediately without the user needing to interact with the document\n // Video will be unmuted when the audiocontext is available\n video.muted = true;\n video.autoplay = true;\n video.crossOrigin = \"anonymous\";\n\n const audioListener = this.getAudioListener();\n const audioContext = audioListener.context;\n\n const audio = new THREE.PositionalAudio(audioListener);\n audio.setMediaElementSource(video);\n audio.setVolume(this.video.props.volume);\n audio.setRefDistance(audioRefDistance);\n audio.setRolloffFactor(audioRolloffFactor);\n this.loadedVideoState = {\n video,\n audio,\n videoTexture: null,\n };\n this.updateMaterialEmissiveIntensity();\n this.video.getContainer().add(audio);\n\n const url = new URL(contentAddress);\n if (WHEPVideoSource.isWHEPURL(url)) {\n this.videoSource = new WHEPVideoSource(url, video);\n } else {\n this.videoSource = new StaticFileVideoSource(url, video, this.video.props, () => {\n return this.video.getDocumentTime();\n });\n }\n\n audioContext.addEventListener(\"statechange\", () => {\n this.syncVideoTime();\n });\n video.addEventListener(\"loadeddata\", () => {\n if (!this.loadedVideoState || this.loadedVideoState.video !== video) {\n // Video was changed before it loaded\n return;\n }\n\n const videoTexture = new THREE.VideoTexture(video);\n this.videoMaterial.map = videoTexture;\n this.videoMaterial.needsUpdate = true;\n this.mesh.material = this.videoMaterial;\n this.loadedVideoState.videoTexture = videoTexture;\n\n this.syncVideoTime();\n this.updateWidthAndHeight();\n this.updateMaterialEmissiveIntensity();\n });\n }\n }\n\n if (this.videoSource) {\n this.syncVideoTime();\n }\n }\n\n private clearSource() {\n if (this.videoSource) {\n this.videoSource.dispose();\n this.videoSource = null;\n }\n if (this.loadedVideoState) {\n const tag = this.loadedVideoState.video;\n // There is an existing src - stop playing to allow changing it\n tag.pause();\n tag.src = \"\";\n tag.load();\n this.loadedVideoState = null;\n this.mesh.material = disabledVideoMaterial;\n this.updateWidthAndHeight();\n }\n }\n\n dispose() {\n this.clearSource();\n if (this.loadedVideoState) {\n this.loadedVideoState = null;\n }\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.loadedVideoState && this.loadedVideoState.videoTexture) {\n if (this.video.props.emissive > 0) {\n this.videoMaterial.emissive = new THREE.Color(0xffffff);\n this.videoMaterial.emissiveMap = this.loadedVideoState.videoTexture;\n this.videoMaterial.emissiveIntensity = this.video.props.emissive;\n this.videoMaterial.needsUpdate = true;\n } else {\n this.videoMaterial.emissive = new THREE.Color(0x000000);\n this.videoMaterial.emissiveMap = null;\n this.videoMaterial.emissiveIntensity = 1;\n this.videoMaterial.needsUpdate = true;\n }\n }\n }\n\n private updateWidthAndHeight() {\n const mesh = this.mesh;\n\n const { width, height } = calculateContentSize({\n content: this.loadedVideoState\n ? {\n width: this.loadedVideoState.video.videoWidth,\n height: this.loadedVideoState.video.videoHeight,\n }\n : undefined,\n width: this.video.props.width,\n height: this.video.props.height,\n });\n mesh.scale.x = width;\n mesh.scale.y = height;\n\n this.updateMeshCallback();\n }\n}\n", "import * as THREE from \"three\";\n\nimport { ThreeJSImageResource } from \"./ThreeJSImageResource\";\n\nexport interface ThreeJSImageResourceResult {\n texture: THREE.Texture;\n width: number;\n height: number;\n hasTransparency: boolean;\n}\n\nexport interface ThreeJSImageHandle {\n readonly url: string;\n onProgress(onProgress: (loaded: number, total: number) => void): void;\n onLoad(onLoad: (result: ThreeJSImageResourceResult | Error) => void): void;\n getResult(): ThreeJSImageResourceResult | Error | null;\n dispose(): void;\n}\n\nexport class ThreeJSImageHandleImpl implements ThreeJSImageHandle {\n private onLoadCallbacks = new Set<(result: ThreeJSImageResourceResult | Error) => void>();\n private onProgressCallbacks = new Set<(loaded: number, total: number) => void>();\n private result: ThreeJSImageResourceResult | Error | null = null;\n public readonly url: string;\n\n constructor(private imageResource: ThreeJSImageResource) {\n this.url = imageResource.url;\n }\n\n onProgress(onProgress: (loaded: number, total: number) => void): void {\n this.onProgressCallbacks.add(onProgress);\n }\n\n onLoad(onLoad: (result: ThreeJSImageResourceResult | Error) => void): void {\n this.onLoadCallbacks.add(onLoad);\n if (this.result) {\n onLoad(this.result);\n }\n }\n\n getResult(): ThreeJSImageResourceResult | Error | null {\n return this.result;\n }\n\n handleProgress(loaded: number, total: number): void {\n for (const onProgressCallback of this.onProgressCallbacks) {\n onProgressCallback(loaded, total);\n }\n }\n\n handleLoaded(result: ThreeJSImageResourceResult): void {\n this.result = result;\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(result);\n }\n }\n\n handleError(error: Error): void {\n this.result = error;\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(error);\n }\n }\n\n dispose(): void {\n this.imageResource.disposeHandle(this);\n }\n}\n", "import * as THREE from \"three\";\n\nimport {\n ThreeJSImageHandle,\n ThreeJSImageHandleImpl,\n ThreeJSImageResourceResult,\n} from \"./ThreeJSImageHandle\";\nimport { ThreeJSImageLoader } from \"./ThreeJSImageLoader\";\n\nexport class ThreeJSImageResource {\n private imageHandles = new Set<ThreeJSImageHandleImpl>();\n private imageElement: HTMLImageElement | null = null;\n private texture: THREE.CanvasTexture | null = null;\n private hasTransparency: boolean = false;\n\n private abortController: AbortController | null = null;\n\n constructor(\n public readonly url: string,\n private onRemove: () => void,\n ) {\n this.abortController = new AbortController();\n\n // Load the image\n ThreeJSImageLoader.load(\n url,\n (image: HTMLImageElement) => {\n // Image loaded successfully\n this.imageElement = image;\n this.hasTransparency = hasTransparency(image);\n this.texture = new THREE.CanvasTexture(\n image,\n ) as unknown as THREE.CanvasTexture<HTMLCanvasElement>;\n const result: ThreeJSImageResourceResult = {\n texture: this.texture,\n width: image.width,\n height: image.height,\n hasTransparency: this.hasTransparency,\n };\n for (const imageHandle of this.imageHandles) {\n imageHandle.handleLoaded(result);\n }\n this.abortController = null;\n },\n (error: ErrorEvent) => {\n // Error loading\n const errorObj = new Error(`Failed to load image: ${error.message}`);\n for (const imageHandle of this.imageHandles) {\n imageHandle.handleError(errorObj);\n }\n this.abortController = null;\n },\n this.abortController.signal,\n );\n }\n\n public getResult(): ThreeJSImageResourceResult | null {\n if (this.texture && this.imageElement) {\n return {\n texture: this.texture,\n width: this.imageElement.width,\n height: this.imageElement.height,\n hasTransparency: this.hasTransparency,\n };\n }\n return null;\n }\n\n public createHandle(): ThreeJSImageHandle {\n const imageHandle = new ThreeJSImageHandleImpl(this);\n this.imageHandles.add(imageHandle);\n const result = this.getResult();\n if (result !== null) {\n imageHandle.handleLoaded(result);\n }\n return imageHandle;\n }\n\n public disposeHandle(imageHandle: ThreeJSImageHandleImpl): void {\n this.imageHandles.delete(imageHandle);\n if (this.imageHandles.size === 0) {\n this.abortController?.abort();\n this.abortController = null;\n if (this.texture) {\n this.texture.dispose();\n this.texture = null;\n }\n this.imageElement = null;\n this.onRemove();\n }\n }\n}\n\nfunction hasTransparency(image: HTMLImageElement) {\n if (image.width === 0 || image.height === 0) {\n return false;\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = image.width;\n canvas.height = image.height;\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true }) as CanvasRenderingContext2D;\n ctx.drawImage(image, 0, 0);\n\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;\n\n for (let i = 3, n = imageData.length; i < n; i += 4) {\n if (imageData[i] < 255) {\n return true;\n }\n }\n return false;\n}\n", "export class ThreeJSImageLoader {\n static load(\n url: string,\n onLoad: (image: HTMLImageElement) => void,\n onError: (error: ErrorEvent) => void,\n abortSignal: AbortSignal,\n ) {\n const image = document.createElement(\"img\");\n image.crossOrigin = \"anonymous\";\n\n function onImageLoad() {\n removeEventListeners();\n onLoad(this);\n }\n\n function onImageError(event: ErrorEvent) {\n removeEventListeners();\n onError(event);\n }\n\n function removeEventListeners() {\n image.removeEventListener(\"load\", onImageLoad, false);\n image.removeEventListener(\"error\", onImageError, false);\n }\n\n abortSignal.addEventListener(\"abort\", () => {\n removeEventListeners();\n image.src = \"\";\n });\n\n image.addEventListener(\"load\", onImageLoad, false);\n image.addEventListener(\"error\", onImageError, false);\n\n image.src = url;\n\n return image;\n }\n}\n", "import * as THREE from \"three\";\n\nexport interface ThreeJSLabelResourceResult {\n texture: THREE.CanvasTexture | THREE.DataTexture;\n width: number;\n height: number;\n}\n\nexport interface ThreeJSLabelHandle {\n onLoad(onLoad: (result: ThreeJSLabelResourceResult | Error) => void): void;\n getResult(): ThreeJSLabelResourceResult | Error | null;\n dispose(): void;\n}\n\nexport class ThreeJSLabelHandleImpl implements ThreeJSLabelHandle {\n private onLoadCallbacks = new Set<(result: ThreeJSLabelResourceResult | Error) => void>();\n private result: ThreeJSLabelResourceResult | Error | null = null;\n\n constructor(private labelResource: { disposeHandle: (handle: ThreeJSLabelHandleImpl) => void }) {}\n\n onLoad(onLoad: (result: ThreeJSLabelResourceResult | Error) => void): void {\n this.onLoadCallbacks.add(onLoad);\n if (this.result) {\n onLoad(this.result);\n }\n }\n\n getResult(): ThreeJSLabelResourceResult | Error | null {\n return this.result;\n }\n\n handleLoaded(result: ThreeJSLabelResourceResult): void {\n this.result = result;\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(result);\n }\n }\n\n handleError(error: Error): void {\n this.result = error;\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(error);\n }\n }\n\n dispose(): void {\n this.labelResource.disposeHandle(this);\n }\n}\n", "import { CanvasText } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport {\n ThreeJSLabelHandle,\n ThreeJSLabelHandleImpl,\n ThreeJSLabelResourceResult,\n} from \"./ThreeJSLabelHandle\";\n\nexport type ThreeJSLabelResourceOptions = {\n content: string;\n fontSize: number;\n paddingPx: number;\n textColorRGB255A1: { r: number; g: number; b: number; a: number };\n backgroundColorRGB255A1: { r: number; g: number; b: number; a: number };\n dimensions: { width: number; height: number };\n alignment: string;\n bold: boolean;\n};\n\nexport class ThreeJSLabelResource {\n private static readonly DEFAULT_MAX_TEXTURE_SIZE = 1024;\n private static sharedCanvasText: CanvasText | null = null;\n private handles = new Set<ThreeJSLabelHandleImpl>();\n private result: { texture: THREE.DataTexture; width: number; height: number } | null = null;\n\n constructor(\n options: ThreeJSLabelResourceOptions,\n private onRemove: () => void,\n private maxTextureSize: number = ThreeJSLabelResource.DEFAULT_MAX_TEXTURE_SIZE,\n ) {\n // Synchronously generate texture\n if (!ThreeJSLabelResource.sharedCanvasText) {\n ThreeJSLabelResource.sharedCanvasText = new CanvasText();\n }\n const scale = Math.min(\n 1,\n Math.min(\n this.maxTextureSize / options.dimensions.width,\n this.maxTextureSize / options.dimensions.height,\n ),\n );\n const clampedDimensions = {\n width: options.dimensions.width * scale,\n height: options.dimensions.height * scale,\n };\n\n const canvasText = ThreeJSLabelResource.sharedCanvasText;\n const canvas = canvasText.renderText(options.content, {\n bold: options.bold,\n fontSize: options.fontSize * scale,\n paddingPx: options.paddingPx * scale,\n textColorRGB255A1: options.textColorRGB255A1,\n backgroundColorRGB255A1: options.backgroundColorRGB255A1,\n dimensions: clampedDimensions,\n alignment: options.alignment,\n });\n\n let texture: THREE.DataTexture;\n // If the canvas has zero dimensions, return a minimal transparent texture to avoid IndexSizeError\n if (canvas.width === 0 || canvas.height === 0) {\n const emptyPixel = new Uint8Array([0, 0, 0, 0]);\n texture = new THREE.DataTexture(emptyPixel, 1, 1, THREE.RGBAFormat);\n } else {\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true }) as CanvasRenderingContext2D;\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n texture = new THREE.DataTexture(\n imageData.data as unknown as Uint8Array,\n canvas.width,\n canvas.height,\n THREE.RGBAFormat,\n );\n }\n texture.flipY = true;\n texture.colorSpace = THREE.NoColorSpace;\n texture.premultiplyAlpha = true;\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipmapLinearFilter;\n texture.generateMipmaps = true;\n texture.needsUpdate = true;\n this.result = {\n texture,\n width: canvas.width,\n height: canvas.height,\n };\n }\n\n public getResult(): ThreeJSLabelResourceResult | null {\n return this.result;\n }\n\n public createHandle(): ThreeJSLabelHandle {\n const handle = new ThreeJSLabelHandleImpl({\n disposeHandle: this.disposeHandle.bind(this),\n });\n this.handles.add(handle);\n if (this.result) {\n handle.handleLoaded(this.result);\n }\n return handle;\n }\n\n public disposeHandle(handle: ThreeJSLabelHandleImpl): void {\n this.handles.delete(handle);\n if (this.handles.size === 0) {\n if (this.result && this.result.texture) {\n this.result.texture.dispose();\n }\n this.result = null;\n this.onRemove();\n }\n }\n}\n", "import { ModelLoadResult } from \"@mml-io/model-loader\";\nimport { Group } from \"three\";\nimport * as SkeletonUtils from \"three/examples/jsm/utils/SkeletonUtils.js\";\n\nimport { ThreeJSModelResource } from \"./ThreeJSModelResource\";\n\nexport interface ThreeJSModelHandle {\n readonly url: string;\n onProgress(onProgress: (loaded: number, total: number) => void): void;\n onLoad(onLoad: (result: ModelLoadResult | Error) => void): void;\n getResult(): ModelLoadResult | Error | null;\n dispose(): void;\n}\n\nexport class ThreeJSModelHandleImpl implements ThreeJSModelHandle {\n private onLoadCallbacks = new Set<(result: ModelLoadResult | Error) => void>();\n\n private onProgressCallbacks = new Set<(loaded: number, total: number) => void>();\n\n private result: ModelLoadResult | Error | null = null;\n public readonly url: string;\n\n constructor(private modelResource: ThreeJSModelResource) {\n this.url = modelResource.url;\n }\n\n onProgress(onProgress: (loaded: number, total: number) => void): void {\n this.onProgressCallbacks.add(onProgress);\n }\n\n onLoad(onLoad: (result: ModelLoadResult | Error) => void): void {\n this.onLoadCallbacks.add(onLoad);\n if (this.result) {\n onLoad(this.result);\n }\n }\n\n getResult(): ModelLoadResult | Error | null {\n return this.result;\n }\n\n handleProgress(loaded: number, total: number): void {\n for (const onProgressCallback of this.onProgressCallbacks) {\n onProgressCallback(loaded, total);\n }\n }\n\n handleLoaded(result: ModelLoadResult): void {\n // This is a model result, so we need to clone it (shallow clone to reuse material instances)\n const clonedGroup = SkeletonUtils.clone(result.group);\n this.result = {\n group: clonedGroup as Group,\n animations: result.animations,\n };\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(this.result);\n }\n }\n\n handleError(error: Error): void {\n this.result = error;\n for (const onLoadCallback of this.onLoadCallbacks) {\n onLoadCallback(error);\n }\n }\n\n dispose(): void {\n this.modelResource.disposeHandle(this);\n }\n}\n", "import { ModelLoader, ModelLoadResult } from \"@mml-io/model-loader\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSModelHandle, ThreeJSModelHandleImpl } from \"./ThreeJSModelHandle\";\n\nexport class ThreeJSModelResource {\n private static readonly DEFAULT_MAX_TEXTURE_SIZE = 2048;\n\n private static modelLoader: ModelLoader | null = null;\n private static getModelLoader(): ModelLoader {\n if (!ThreeJSModelResource.modelLoader) {\n ThreeJSModelResource.modelLoader = new ModelLoader();\n }\n return ThreeJSModelResource.modelLoader;\n }\n\n private modelHandles = new Set<ThreeJSModelHandleImpl>();\n private modelResult: ModelLoadResult | null = null;\n\n private abortController: AbortController | null = null;\n\n constructor(\n public readonly url: string,\n private onRemove: () => void,\n private maxTextureSize: number = ThreeJSModelResource.DEFAULT_MAX_TEXTURE_SIZE,\n ) {\n this.abortController = new AbortController();\n ThreeJSModelResource.getModelLoader()\n .load(\n url,\n (loaded, total) => {\n // progress\n for (const modelHandle of this.modelHandles) {\n modelHandle.handleProgress(loaded, total);\n }\n },\n this.abortController,\n )\n .then((result) => {\n // load\n this.modelResult = result;\n // Clamp all material textures on this model to a maximum size\n try {\n ThreeJSModelResource.clampTexturesToMaxSize(result.group, this.maxTextureSize);\n } catch (e) {\n // Ignore texture clamping errors to avoid blocking model load\n\n console.warn(\"Texture clamping failed\", e);\n }\n\n for (const modelHandle of this.modelHandles) {\n modelHandle.handleLoaded(result);\n }\n })\n .finally(() => {\n this.abortController = null;\n });\n }\n\n public getResult(): ModelLoadResult | null {\n return this.modelResult;\n }\n\n public createHandle(): ThreeJSModelHandle {\n const modelHandle = new ThreeJSModelHandleImpl(this);\n this.modelHandles.add(modelHandle);\n if (this.modelResult !== null) {\n modelHandle.handleLoaded(this.modelResult);\n }\n return modelHandle;\n }\n\n public disposeHandle(modelHandle: ThreeJSModelHandleImpl): void {\n this.modelHandles.delete(modelHandle);\n if (this.modelHandles.size === 0) {\n this.abortController?.abort();\n this.abortController = null;\n this.onRemove();\n }\n }\n\n private static clampTexturesToMaxSize(root: THREE.Object3D, maxSize: number): void {\n const processedTextures = new Set<THREE.Texture>();\n\n root.traverse((object) => {\n const maybeMesh = object as unknown as THREE.Mesh;\n if ((maybeMesh as any).isMesh) {\n const material = maybeMesh.material as THREE.Material | THREE.Material[] | undefined;\n if (!material) {\n return;\n }\n if (Array.isArray(material)) {\n for (const mat of material) {\n ThreeJSModelResource.processMaterialTextures(mat, maxSize, processedTextures);\n }\n } else {\n ThreeJSModelResource.processMaterialTextures(material, maxSize, processedTextures);\n }\n }\n });\n }\n\n private static processMaterialTextures(\n material: THREE.Material,\n maxSize: number,\n processed: Set<THREE.Texture>,\n ): void {\n const materialAny = material as any;\n for (const key of Object.keys(materialAny)) {\n const value = materialAny[key];\n if (value && typeof value === \"object\" && (value as any).isTexture) {\n const texture = value as THREE.Texture;\n if (processed.has(texture)) {\n continue;\n }\n processed.add(texture);\n ThreeJSModelResource.resizeTextureIfTooLarge(texture, maxSize);\n }\n }\n }\n\n private static resizeTextureIfTooLarge(texture: THREE.Texture, maxSize: number): void {\n const texAny = texture as any;\n if (texAny.isCompressedTexture || texAny.isCubeTexture || texAny.isVideoTexture) {\n return;\n }\n\n const image: any = texAny.image ?? texAny.source?.data;\n if (!image || typeof image.width !== \"number\" || typeof image.height !== \"number\") {\n return;\n }\n\n const width: number = image.width;\n const height: number = image.height;\n if (width <= maxSize && height <= maxSize) {\n return;\n }\n\n console.warn(\n \"Texture resizing is being performed. Original size: \",\n width,\n height,\n \"Maximum size: \",\n maxSize,\n );\n\n const scale = Math.min(maxSize / width, maxSize / height);\n const newWidth = Math.max(1, Math.floor(width * scale));\n const newHeight = Math.max(1, Math.floor(height * scale));\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = newWidth;\n canvas.height = newHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n try {\n ctx.drawImage(image, 0, 0, newWidth, newHeight);\n if (texAny.source && texAny.source.data !== undefined) {\n texAny.source.data = canvas;\n }\n texture.image = canvas;\n texture.needsUpdate = true;\n } catch {\n // Ignore draw errors (e.g., cross-origin or unsupported image types)\n }\n }\n}\n", "import { ThreeJSImageHandle } from \"./ThreeJSImageHandle\";\nimport { ThreeJSImageResource } from \"./ThreeJSImageResource\";\nimport { ThreeJSLabelHandle } from \"./ThreeJSLabelHandle\";\nimport { ThreeJSLabelResource, ThreeJSLabelResourceOptions } from \"./ThreeJSLabelResource\";\nimport { ThreeJSModelHandle } from \"./ThreeJSModelHandle\";\nimport { ThreeJSModelResource } from \"./ThreeJSModelResource\";\n\nexport type ThreeJSResourceManagerOptions = {\n modelMaxTextureSize?: number;\n labelMaxTextureSize?: number;\n};\n\nexport class ThreeJSResourceManager {\n private modelResources = new Map<string, ThreeJSModelResource>();\n private imageResources = new Map<string, ThreeJSImageResource>();\n private labelResources = new Map<string, ThreeJSLabelResource>();\n\n constructor(private options: ThreeJSResourceManagerOptions = {}) {}\n\n public loadModel(url: string): ThreeJSModelHandle {\n let modelResource = this.modelResources.get(url);\n if (!modelResource) {\n modelResource = new ThreeJSModelResource(\n url,\n () => {\n this.modelResources.delete(url);\n },\n this.options.modelMaxTextureSize,\n );\n this.modelResources.set(url, modelResource);\n }\n return modelResource.createHandle();\n }\n\n public loadImage(url: string): ThreeJSImageHandle {\n let imageResource = this.imageResources.get(url);\n if (!imageResource) {\n imageResource = new ThreeJSImageResource(url, () => {\n this.imageResources.delete(url);\n });\n this.imageResources.set(url, imageResource);\n }\n return imageResource.createHandle();\n }\n\n public loadLabel(options: ThreeJSLabelResourceOptions): ThreeJSLabelHandle {\n const key = buildLabelResourceKey(options);\n let labelResource = this.labelResources.get(key);\n if (!labelResource) {\n labelResource = new ThreeJSLabelResource(\n options,\n () => {\n this.labelResources.delete(key);\n },\n this.options.labelMaxTextureSize,\n );\n this.labelResources.set(key, labelResource);\n }\n return labelResource.createHandle();\n }\n}\n\nfunction buildLabelResourceKey(options: ThreeJSLabelResourceOptions): string {\n const key = {\n content: options.content,\n fontSize: options.fontSize * 2,\n paddingPx: options.paddingPx,\n textColorRGB255A1: {\n r: Math.round(options.textColorRGB255A1.r * 255),\n g: Math.round(options.textColorRGB255A1.g * 255),\n b: Math.round(options.textColorRGB255A1.b * 255),\n a: options.textColorRGB255A1.a ?? 1,\n },\n backgroundColorRGB255A1: {\n r: Math.round(options.backgroundColorRGB255A1.r * 255),\n g: Math.round(options.backgroundColorRGB255A1.g * 255),\n b: Math.round(options.backgroundColorRGB255A1.b * 255),\n a: options.backgroundColorRGB255A1.a ?? 1,\n },\n dimensions: {\n width: options.dimensions.width * 200,\n height: options.dimensions.height * 200,\n },\n alignment: options.alignment,\n bold: true,\n };\n return JSON.stringify(key);\n}\n", "import {\n EventHandlerCollection,\n getRelativePositionAndRotationRelativeToObject,\n MElement,\n} from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nconst mouseMovePixelsThreshold = 10;\nconst mouseMoveTimeThresholdMilliseconds = 500;\n\n/**\n * The ThreeJSClickTrigger class is responsible for handling click events on the MML scene and raycasts into the scene to\n * determine which object was clicked and then dispatches events to those elements.\n */\nexport class ThreeJSClickTrigger {\n private eventHandlerCollection: EventHandlerCollection = new EventHandlerCollection();\n private raycaster: THREE.Raycaster;\n private mouseDownTime: number | null = null;\n private mouseMoveDelta = 0;\n\n static init(\n clickTarget: Document | HTMLElement,\n rootContainer: THREE.Object3D,\n camera: THREE.Camera,\n ): ThreeJSClickTrigger {\n return new ThreeJSClickTrigger(clickTarget, rootContainer, camera);\n }\n\n private constructor(\n private clickTarget: Document | HTMLElement,\n private rootContainer: THREE.Object3D,\n private camera: THREE.Camera,\n ) {\n this.raycaster = new THREE.Raycaster();\n\n this.eventHandlerCollection.add(clickTarget, \"mousedown\", this.handleMouseDown.bind(this));\n this.eventHandlerCollection.add(clickTarget, \"mouseup\", this.handleMouseUp.bind(this));\n this.eventHandlerCollection.add(clickTarget, \"mousemove\", this.handleMouseMove.bind(this));\n }\n\n private handleMouseDown() {\n this.mouseDownTime = Date.now();\n this.mouseMoveDelta = 0;\n }\n\n private handleMouseUp(event: MouseEvent) {\n if (!this.mouseDownTime) {\n return;\n }\n const duration = Date.now() - this.mouseDownTime;\n this.mouseDownTime = null;\n if (\n this.mouseMoveDelta < mouseMovePixelsThreshold &&\n duration < mouseMoveTimeThresholdMilliseconds\n ) {\n this.handleClick(event);\n }\n }\n\n private handleMouseMove(event: MouseEvent) {\n if (this.mouseDownTime) {\n this.mouseMoveDelta += Math.abs(event.movementX) + Math.abs(event.movementY);\n }\n }\n\n private handleClick(event: MouseEvent) {\n if ((event.detail as any).element) {\n // Avoid infinite loop of handling click events that originated from this trigger\n return;\n }\n let x = 0;\n let y = 0;\n if (!document.pointerLockElement) {\n let width = window.innerWidth;\n let height = window.innerHeight;\n if (this.clickTarget instanceof HTMLElement) {\n width = this.clickTarget.offsetWidth;\n height = this.clickTarget.offsetHeight;\n }\n x = (event.offsetX / width) * 2 - 1;\n y = -((event.offsetY / height) * 2 - 1);\n }\n this.raycaster.setFromCamera(new THREE.Vector2(x, y), this.camera);\n const intersections = this.raycaster.intersectObject(this.rootContainer, true);\n if (intersections.length > 0) {\n for (const intersection of intersections) {\n let obj: THREE.Object3D | null = intersection.object;\n currentIntersection: while (obj) {\n /*\n Ignore scene objects that have a transparent or wireframe material\n */\n if (this.isMaterialIgnored(obj)) {\n break currentIntersection;\n }\n\n const mElement = MElement.getMElementFromObject(obj);\n if (!mElement) {\n // The intersection object is not an MElement, so we move up to the parent recursively which may be an MElement\n obj = obj.parent;\n continue currentIntersection;\n }\n\n if (!mElement.isClickable()) {\n // This is not a clickable element (or it is explicitly set to not be clickable), so we ignore it and pass through to the next intersection\n break currentIntersection;\n }\n\n // This is a clickable element, so we dispatch the click event to it\n const elementRelative = getRelativePositionAndRotationRelativeToObject(\n {\n position: intersection.point,\n rotation: {\n x: 0,\n y: 0,\n z: 0,\n },\n },\n mElement,\n );\n mElement.dispatchEvent(\n new CustomEvent(\"click\", {\n bubbles: true,\n detail: {\n position: {\n ...elementRelative.position,\n },\n },\n }),\n );\n return;\n }\n }\n }\n }\n\n dispose() {\n this.eventHandlerCollection.clear();\n }\n\n private isMaterialIgnored(obj: THREE.Object3D): boolean {\n const mesh = obj as THREE.Mesh;\n if (mesh) {\n if (\n ((mesh.material as THREE.MeshLambertMaterial) &&\n (mesh.material as THREE.MeshLambertMaterial).wireframe) ||\n ((mesh.material as THREE.MeshPhongMaterial) &&\n (mesh.material as THREE.MeshPhongMaterial).wireframe) ||\n ((mesh.material as THREE.MeshPhysicalMaterial) &&\n (mesh.material as THREE.MeshPhysicalMaterial).wireframe) ||\n ((mesh.material as THREE.MeshStandardMaterial) &&\n (mesh.material as THREE.MeshStandardMaterial).wireframe) ||\n ((mesh.material as THREE.LineBasicMaterial) &&\n (mesh.material as THREE.LineBasicMaterial).isLineBasicMaterial)\n ) {\n return true;\n }\n }\n return false;\n }\n}\n", "import { MMLGraphicsInterface } from \"@mml-io/mml-web\";\n\nimport * as ThreeJSElements from \"./elements\";\nimport { ThreeJSGraphicsAdapter } from \"./ThreeJSGraphicsAdapter\";\n\nexport const ThreeJSGraphicsInterface: MMLGraphicsInterface<ThreeJSGraphicsAdapter> = {\n MElementGraphicsInterface: (element) => new ThreeJSElements.ThreeJSMElement(element),\n MMLDebugHelperGraphicsInterface: (debugHelper) =>\n new ThreeJSElements.ThreeJSDebugHelper(debugHelper),\n MMLAudioGraphicsInterface: (element) => new ThreeJSElements.ThreeJSAudio(element),\n MMLChatProbeGraphicsInterface: (element) => new ThreeJSElements.ThreeJSChatProbe(element),\n MMLCubeGraphicsInterface: (element) => new ThreeJSElements.ThreeJSCube(element),\n MMLCylinderGraphicsInterface: (element) => new ThreeJSElements.ThreeJSCylinder(element),\n MMLFrameGraphicsInterface: (element) => new ThreeJSElements.ThreeJSFrame(element),\n MMLImageGraphicsInterface: (element, updateMeshCallback) =>\n new ThreeJSElements.ThreeJSImage(element, updateMeshCallback),\n MMLInteractionGraphicsInterface: (element) => new ThreeJSElements.ThreeJSInteraction(element),\n MMLLabelGraphicsInterface: (element) => new ThreeJSElements.ThreeJSLabel(element),\n MMLLightGraphicsInterface: (element) => new ThreeJSElements.ThreeJSLight(element),\n MMLOverlayGraphicsInterface: (element) => new ThreeJSElements.ThreeJSOverlay(element),\n MMLLinkGraphicsInterface: (element) => new ThreeJSElements.ThreeJSLink(element),\n MMLModelGraphicsInterface: (element, updateMeshCallback) =>\n new ThreeJSElements.ThreeJSModel(element, updateMeshCallback),\n MMLPlaneGraphicsInterface: (element) => new ThreeJSElements.ThreeJSPlane(element),\n MMLPositionProbeGraphicsInterface: (element) => new ThreeJSElements.ThreeJSPositionProbe(element),\n MMLPromptGraphicsInterface: (element) => new ThreeJSElements.ThreeJSPrompt(element),\n MMLSphereGraphicsInterface: (element) => new ThreeJSElements.ThreeJSSphere(element),\n MMLTransformableGraphicsInterface: (element) => new ThreeJSElements.ThreeJSTransformable(element),\n MMLVideoGraphicsInterface: (element, updateMeshCallback: () => void) =>\n new ThreeJSElements.ThreeJSVideo(element, updateMeshCallback),\n MMLAnimationGraphicsInterface: (element) => new ThreeJSElements.ThreeJSAnimation(element),\n RemoteDocumentGraphicsInterface: (element) => new ThreeJSElements.ThreeJSRemoteDocument(element),\n};\n", "import { Interaction } from \"@mml-io/mml-web\";\nimport * as THREE from \"three\";\n\nimport { ThreeJSGraphicsAdapter } from \"./ThreeJSGraphicsAdapter\";\n\nexport class ThreeJSInteractionAdapter {\n private static worldPos = new THREE.Vector3();\n\n private static matrix = new THREE.Matrix4();\n private static frustum = new THREE.Frustum();\n\n private static raycaster = new THREE.Raycaster();\n private static intersections = new Array<THREE.Intersection<THREE.Object3D>>();\n private static direction = new THREE.Vector3();\n\n static interactionShouldShowDistance(\n interaction: Interaction<ThreeJSGraphicsAdapter>,\n camera: THREE.Camera,\n scene: THREE.Scene,\n ): number | null {\n const worldPos = interaction\n .getContainer()\n .getWorldPosition(ThreeJSInteractionAdapter.worldPos);\n\n const cameraPos = camera.position;\n const distance = cameraPos.distanceTo(worldPos);\n if (distance > interaction.props.range) {\n return null;\n }\n\n if (interaction.props.inFocus) {\n ThreeJSInteractionAdapter.matrix.multiplyMatrices(\n camera.projectionMatrix,\n camera.matrixWorldInverse,\n );\n ThreeJSInteractionAdapter.frustum.setFromProjectionMatrix(ThreeJSInteractionAdapter.matrix);\n if (!ThreeJSInteractionAdapter.frustum.containsPoint(worldPos)) {\n return null;\n }\n }\n\n if (interaction.props.lineOfSight) {\n const raycastResults = ThreeJSInteractionAdapter.getRaycastResults(\n cameraPos,\n worldPos,\n distance,\n scene,\n );\n if (raycastResults.length > 0) {\n for (const result of raycastResults) {\n if (!ThreeJSInteractionAdapter.hasAncestor(result.object, interaction.getContainer())) {\n return null;\n }\n }\n }\n }\n\n return distance;\n }\n\n static getRaycastResults(\n a: THREE.Vector3,\n b: THREE.Vector3,\n distance: number,\n scene: THREE.Scene,\n ) {\n ThreeJSInteractionAdapter.direction.copy(b);\n ThreeJSInteractionAdapter.direction.sub(a);\n ThreeJSInteractionAdapter.direction.normalize();\n\n ThreeJSInteractionAdapter.raycaster.set(a, ThreeJSInteractionAdapter.direction);\n ThreeJSInteractionAdapter.raycaster.near = 0;\n ThreeJSInteractionAdapter.raycaster.far = distance;\n\n ThreeJSInteractionAdapter.intersections.length = 0;\n ThreeJSInteractionAdapter.raycaster.intersectObject(\n scene,\n true,\n ThreeJSInteractionAdapter.intersections,\n );\n return ThreeJSInteractionAdapter.intersections;\n }\n\n static hasAncestor(object: THREE.Object3D, ancestor: THREE.Object3D): boolean {\n let parent = object.parent;\n while (parent !== null) {\n if (parent === ancestor) {\n return true;\n }\n parent = parent.parent;\n }\n return false;\n }\n}\n", "import * as THREE from \"three\";\n\ninterface GeometryInfo {\n name: string;\n uuid: string;\n memoryBytes: number;\n vertexCount: number;\n triangleCount: number;\n usedByObjects: string[];\n objectPaths: string[];\n usedByObjectInstanceIds: string[];\n}\n\ninterface TextureInfo {\n name: string;\n uuid: string;\n memoryBytes: number;\n width: number;\n height: number;\n format: string;\n usedByMaterials: string[];\n usedByObjects: string[];\n usedByObjectPaths: string[];\n usedByObjectInstanceIds: string[];\n url?: string;\n sourceType: string;\n}\n\ninterface MaterialInfo {\n name: string;\n uuid: string;\n textureCount: number;\n textures: TextureInfo[];\n usedByObjects: string[];\n}\n\ninterface MemoryStats {\n totalGeometryMemory: number;\n totalTextureMemory: number;\n totalMemory: number;\n geometryCount: number;\n textureCount: number;\n materialCount: number;\n}\n\nexport class ThreeJSMemoryInspector {\n /**\n * Opens a new window with a comprehensive memory report including thumbnails\n */\n public static openMemoryReport(scene: THREE.Scene): void {\n const reportWindow = window.open(\n \"\",\n \"_blank\",\n \"width=1200,height=800,scrollbars=yes,resizable=yes\",\n );\n\n if (!reportWindow) {\n console.error(\"Failed to open memory report window. Please check popup blockers.\");\n return;\n }\n\n // Collect memory data and generate thumbnails\n const { geometries, textures, materials, stats } = ThreeJSMemoryInspector.analyzeScene(scene);\n const textureThumbnails = ThreeJSMemoryInspector.generateTextureThumbnails(scene);\n const geometryPreviews = ThreeJSMemoryInspector.generateGeometryPreviews(scene);\n\n // Build the UI programmatically in the popup window\n ThreeJSMemoryInspector.buildReportUI(\n reportWindow.document,\n geometries,\n textures,\n materials,\n stats,\n textureThumbnails,\n geometryPreviews,\n );\n }\n\n public static analyzeScene(scene: THREE.Scene): {\n geometries: Map<string, GeometryInfo>;\n textures: Map<string, TextureInfo>;\n materials: Map<string, MaterialInfo>;\n stats: MemoryStats;\n } {\n const geometries = new Map<string, GeometryInfo>();\n const textures = new Map<string, TextureInfo>();\n const materials = new Map<string, MaterialInfo>();\n\n // First pass: collect all assets and their relationships\n scene.traverse((object) => {\n const asMesh = object as THREE.Mesh;\n if (asMesh.isMesh) {\n const objectPath = ThreeJSMemoryInspector.getObjectPath(asMesh, scene);\n const objectName = ThreeJSMemoryInspector.getObjectDisplayName(asMesh);\n\n // Collect geometry info\n if (asMesh.geometry) {\n const geometry = asMesh.geometry;\n if (!geometries.has(geometry.uuid)) {\n geometries.set(\n geometry.uuid,\n ThreeJSMemoryInspector.analyzeGeometry(geometry, objectName, objectPath, asMesh.uuid),\n );\n } else {\n // Add this instance to geometry usage (dedupe by instance id)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const geometryInfo = geometries.get(geometry.uuid)!;\n if (!geometryInfo.usedByObjectInstanceIds.includes(asMesh.uuid)) {\n geometryInfo.usedByObjectInstanceIds.push(asMesh.uuid);\n geometryInfo.usedByObjects.push(objectName);\n geometryInfo.objectPaths.push(objectPath);\n }\n }\n }\n\n // Collect material info\n const materialsArray = Array.isArray(asMesh.material) ? asMesh.material : [asMesh.material];\n materialsArray.forEach((material) => {\n if (material) {\n if (!materials.has(material.uuid)) {\n const materialInfo = ThreeJSMemoryInspector.analyzeMaterial(\n material,\n objectName,\n objectPath,\n asMesh.uuid,\n );\n materials.set(material.uuid, materialInfo);\n\n // Collect textures from this material\n materialInfo.textures.forEach((textureInfo) => {\n if (!textures.has(textureInfo.uuid)) {\n textures.set(textureInfo.uuid, textureInfo);\n } else {\n // Add this instance to the existing texture's usage (dedupe by instance id)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const existingTexture = textures.get(textureInfo.uuid)!;\n if (\n !existingTexture.usedByMaterials.includes(\n material.name || material.uuid.substring(0, 8),\n )\n ) {\n existingTexture.usedByMaterials.push(\n material.name || material.uuid.substring(0, 8),\n );\n }\n if (!existingTexture.usedByObjectInstanceIds.includes(asMesh.uuid)) {\n existingTexture.usedByObjectInstanceIds.push(asMesh.uuid);\n existingTexture.usedByObjects.push(objectName);\n existingTexture.usedByObjectPaths.push(objectPath);\n }\n }\n });\n } else {\n // Add this object to the existing material's usage list\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const materialInfo = materials.get(material.uuid)!;\n if (!materialInfo.usedByObjects.includes(objectName)) {\n materialInfo.usedByObjects.push(objectName);\n }\n\n // Always update textures usage for this material instance\n const materialName = material.name || material.uuid.substring(0, 8);\n const textureProperties = [\n \"map\",\n \"normalMap\",\n \"roughnessMap\",\n \"metalnessMap\",\n \"aoMap\",\n \"emissiveMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"alphaMap\",\n \"lightMap\",\n \"envMap\",\n ];\n textureProperties.forEach((prop) => {\n const texture = (material as any)[prop];\n if (texture && texture.isTexture) {\n if (!textures.has(texture.uuid)) {\n textures.set(\n texture.uuid,\n ThreeJSMemoryInspector.analyzeTexture(\n texture,\n materialName,\n objectName,\n objectPath,\n asMesh.uuid,\n ),\n );\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const existingTexture = textures.get(texture.uuid)!;\n if (!existingTexture.usedByMaterials.includes(materialName)) {\n existingTexture.usedByMaterials.push(materialName);\n }\n if (!existingTexture.usedByObjectInstanceIds.includes(asMesh.uuid)) {\n existingTexture.usedByObjectInstanceIds.push(asMesh.uuid);\n existingTexture.usedByObjects.push(objectName);\n existingTexture.usedByObjectPaths.push(objectPath);\n }\n }\n }\n });\n }\n }\n });\n }\n });\n\n // Calculate totals\n const totalGeometryMemory = Array.from(geometries.values()).reduce(\n (sum, geo) => sum + geo.memoryBytes,\n 0,\n );\n\n const totalTextureMemory = Array.from(textures.values()).reduce(\n (sum, tex) => sum + tex.memoryBytes,\n 0,\n );\n\n const totalMemory = totalGeometryMemory + totalTextureMemory;\n\n const stats: MemoryStats = {\n geometryCount: geometries.size,\n textureCount: textures.size,\n materialCount: materials.size,\n totalGeometryMemory,\n totalTextureMemory,\n totalMemory,\n };\n\n return { geometries, textures, materials, stats };\n }\n\n private static analyzeGeometry(\n geometry: THREE.BufferGeometry,\n objectName: string,\n objectPath: string,\n objectInstanceId: string,\n ): GeometryInfo {\n let memoryBytes = 0;\n let vertexCount = 0;\n let triangleCount = 0;\n\n // Calculate memory usage from attributes\n for (const name in geometry.attributes) {\n const attribute = geometry.attributes[name];\n memoryBytes += attribute.count * attribute.itemSize * attribute.array.BYTES_PER_ELEMENT;\n }\n\n // Add index buffer memory if present\n if (geometry.index) {\n memoryBytes += geometry.index.count * geometry.index.array.BYTES_PER_ELEMENT;\n triangleCount = geometry.index.count / 3;\n }\n\n // Get vertex count\n if (geometry.attributes.position) {\n vertexCount = geometry.attributes.position.count;\n if (!geometry.index) {\n triangleCount = vertexCount / 3;\n }\n }\n\n return {\n name: geometry.name || `Geometry_${geometry.uuid.substring(0, 8)}`,\n uuid: geometry.uuid,\n memoryBytes,\n vertexCount,\n triangleCount,\n usedByObjects: [objectName],\n objectPaths: [objectPath],\n usedByObjectInstanceIds: [objectInstanceId],\n };\n }\n\n private static analyzeMaterial(\n material: THREE.Material,\n objectName: string,\n objectPath: string,\n objectInstanceId: string,\n ): MaterialInfo {\n const textures: TextureInfo[] = [];\n let textureCount = 0;\n\n // Check common texture properties\n const textureProperties = [\n \"map\",\n \"normalMap\",\n \"roughnessMap\",\n \"metalnessMap\",\n \"aoMap\",\n \"emissiveMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"alphaMap\",\n \"lightMap\",\n \"envMap\",\n ];\n\n textureProperties.forEach((prop) => {\n const texture = (material as any)[prop];\n if (texture && texture.isTexture) {\n textures.push(\n ThreeJSMemoryInspector.analyzeTexture(\n texture,\n material.name || material.uuid.substring(0, 8),\n objectName,\n objectPath,\n objectInstanceId,\n ),\n );\n textureCount++;\n }\n });\n\n return {\n name: material.name || `Material_${material.uuid.substring(0, 8)}`,\n uuid: material.uuid,\n textureCount,\n textures,\n usedByObjects: [objectName],\n };\n }\n\n private static analyzeTexture(\n texture: THREE.Texture,\n materialName: string,\n objectName: string,\n objectPath?: string,\n objectInstanceId?: string,\n ): TextureInfo {\n let memoryBytes = 0;\n let width = 0;\n let height = 0;\n let format = \"Unknown\";\n\n // Check if this is a compressed texture (e.g., KTX2)\n const textureAny = texture as any;\n if (textureAny.isCompressedTexture) {\n // For compressed textures, calculate actual GPU memory from mipmaps\n const result = ThreeJSMemoryInspector.calculateCompressedTextureMemory(texture);\n memoryBytes = result.memoryBytes;\n width = result.width;\n height = result.height;\n format = result.format;\n } else if (textureAny.isDataTexture && texture.image) {\n // DataTexture has image: { data: TypedArray, width: number, height: number }\n const dataImage = texture.image as {\n data: ArrayBufferView;\n width: number;\n height: number;\n };\n width = dataImage.width || 0;\n height = dataImage.height || 0;\n\n // Calculate actual memory from the data array\n if (dataImage.data && dataImage.data.byteLength) {\n // For DataTexture, use actual byte length\n memoryBytes = dataImage.data.byteLength;\n // If mipmaps are generated, add their memory (approximately 1/3 additional)\n if (texture.generateMipmaps) {\n memoryBytes *= 1.333;\n }\n } else {\n // Fallback estimation: width * height * bytes per pixel\n memoryBytes = width * height * 4;\n if (texture.generateMipmaps) {\n memoryBytes *= 1.333;\n }\n }\n\n if (texture.format) {\n format = ThreeJSMemoryInspector.getTextureFormatName(texture.format);\n }\n } else if (texture.image) {\n const imageSource = texture.image as HTMLImageElement | HTMLCanvasElement | HTMLVideoElement;\n width = imageSource.width || 0;\n height = imageSource.height || 0;\n\n // Estimate memory usage: width * height * bytes per pixel * mipmap factor\n // Assuming RGBA (4 bytes per pixel) and including mipmaps (factor of 1.333)\n memoryBytes = width * height * 4 * 1.333;\n\n // Adjust for different formats if we can detect them\n if (texture.format) {\n format = ThreeJSMemoryInspector.getTextureFormatName(texture.format);\n }\n }\n\n // Try to get the texture URL and source type\n let url: string | undefined;\n let sourceType = \"Unknown\";\n\n if (textureAny.isCompressedTexture) {\n sourceType = \"Compressed Texture (KTX2)\";\n url = `${width}x${height} - ${format}`;\n } else if (textureAny.isDataTexture) {\n sourceType = \"DataTexture (Label/Generated)\";\n url = `${width}x${height} - ${format}`;\n } else if (texture.source && texture.source.data) {\n const sourceData = texture.source.data;\n\n const sourceDataWithSrc = sourceData as { src?: string };\n if (sourceDataWithSrc.src) {\n url = sourceDataWithSrc.src;\n if (url && url.startsWith(\"data:\")) {\n sourceType = \"Data URL\";\n url = `${url.substring(0, 50)}...`; // Truncate data URLs\n } else if (url && url.startsWith(\"blob:\")) {\n sourceType = \"Blob URL\";\n } else {\n sourceType = \"File URL\";\n }\n } else if (sourceData instanceof HTMLCanvasElement) {\n sourceType = \"Canvas\";\n url = `Canvas(${sourceData.width}x${sourceData.height})`;\n } else if (sourceData instanceof ImageData) {\n sourceType = \"ImageData\";\n url = `ImageData(${(sourceData as ImageData).width}x${(sourceData as ImageData).height})`;\n } else if (sourceData instanceof HTMLVideoElement) {\n sourceType = \"Video\";\n url = sourceData.src || \"Video Element\";\n } else if (sourceData.constructor.name === \"ImageBitmap\") {\n sourceType = \"ImageBitmap\";\n url = `ImageBitmap(${(sourceData as any).width}x${(sourceData as any).height})`;\n } else if (\n typeof sourceData === \"object\" &&\n sourceData !== null &&\n \"data\" in sourceData &&\n \"width\" in sourceData &&\n \"height\" in sourceData\n ) {\n // This is a DataTexture-like structure\n const dataSource = sourceData as { data: unknown; width: number; height: number };\n sourceType = \"DataTexture (Raw Data)\";\n url = `${dataSource.width}x${dataSource.height}`;\n }\n } else if ((texture as any).image) {\n const image = (texture as any).image as\n | { src?: string; width?: number; height?: number; data?: unknown }\n | undefined;\n if (image && image.src) {\n url = image.src;\n if (url && url.startsWith(\"data:\")) {\n sourceType = \"Data URL\";\n url = `${url.substring(0, 50)}...`;\n } else if (url && url.startsWith(\"blob:\")) {\n sourceType = \"Blob URL\";\n } else {\n sourceType = \"File URL\";\n }\n } else if (image instanceof HTMLCanvasElement) {\n sourceType = \"Canvas\";\n url = `Canvas(${image.width}x${image.height})`;\n } else if (image && image.data && image.width && image.height) {\n // This is a DataTexture-like structure in the image property\n sourceType = \"DataTexture (Raw Data)\";\n url = `${image.width}x${image.height}`;\n }\n }\n\n return {\n name: texture.name || `Texture_${texture.uuid.substring(0, 8)}`,\n uuid: texture.uuid,\n memoryBytes,\n width,\n height,\n format,\n usedByMaterials: [materialName],\n usedByObjects: [objectName],\n usedByObjectPaths: [objectPath || objectName],\n usedByObjectInstanceIds: [objectInstanceId || \"unknown\"],\n url,\n sourceType,\n };\n }\n\n private static getTextureFormatName(format: number): string {\n // Map Three.js texture format constants to readable names\n const formatNames: { [key: number]: string } = {\n 1023: \"RGBA\",\n 1022: \"RGB\",\n 1024: \"RGBAInteger\",\n 1025: \"RGBInteger\",\n 1026: \"DepthComponent\",\n 1027: \"DepthStencil\",\n 1028: \"LuminanceAlpha\",\n 1029: \"Luminance\",\n 1030: \"Alpha\",\n 1031: \"Red\",\n 1032: \"RedInteger\",\n 1033: \"RG\",\n 1034: \"RGInteger\",\n // Compressed formats\n 33776: \"RGB_S3TC_DXT1\",\n 33777: \"RGBA_S3TC_DXT1\",\n 33778: \"RGBA_S3TC_DXT3\",\n 33779: \"RGBA_S3TC_DXT5\",\n 35840: \"RGB_PVRTC_4BPPV1\",\n 35841: \"RGB_PVRTC_2BPPV1\",\n 35842: \"RGBA_PVRTC_4BPPV1\",\n 35843: \"RGBA_PVRTC_2BPPV1\",\n 36196: \"RGB_ETC1\",\n 37808: \"RGBA_ASTC_4x4\",\n 37809: \"RGBA_ASTC_5x4\",\n 37810: \"RGBA_ASTC_5x5\",\n 37811: \"RGBA_ASTC_6x5\",\n 37812: \"RGBA_ASTC_6x6\",\n 37813: \"RGBA_ASTC_8x5\",\n 37814: \"RGBA_ASTC_8x6\",\n 37815: \"RGBA_ASTC_8x8\",\n 37816: \"RGBA_ASTC_10x5\",\n 37817: \"RGBA_ASTC_10x6\",\n 37818: \"RGBA_ASTC_10x8\",\n 37819: \"RGBA_ASTC_10x10\",\n 37820: \"RGBA_ASTC_12x10\",\n 37821: \"RGBA_ASTC_12x12\",\n 37492: \"RGBA_BPTC_UNORM\",\n 36492: \"RGB_ETC2\",\n 36494: \"RGBA_ETC2_EAC\",\n };\n\n return formatNames[format] || `Format_${format}`;\n }\n\n private static calculateCompressedTextureMemory(texture: THREE.Texture): {\n memoryBytes: number;\n width: number;\n height: number;\n format: string;\n } {\n const textureAny = texture as any;\n let totalMemory = 0;\n let width = 0;\n let height = 0;\n let format = \"Unknown Compressed\";\n\n if (texture.format) {\n format = ThreeJSMemoryInspector.getTextureFormatName(texture.format);\n }\n\n // Compressed textures store data in mipmaps array\n if (textureAny.mipmaps && Array.isArray(textureAny.mipmaps)) {\n for (const mipmap of textureAny.mipmaps) {\n if (mipmap.data && mipmap.data.byteLength) {\n totalMemory += mipmap.data.byteLength;\n // Use the largest mipmap (first one) for dimensions\n if (width === 0) {\n width = mipmap.width || 0;\n height = mipmap.height || 0;\n }\n }\n }\n }\n\n // If we couldn't get dimensions from mipmaps, try the texture's image property\n if (width === 0 && textureAny.image) {\n width = textureAny.image.width || 0;\n height = textureAny.image.height || 0;\n }\n\n return {\n memoryBytes: totalMemory,\n width,\n height,\n format,\n };\n }\n\n private static getObjectPath(object: any, scene: THREE.Scene): string {\n const path: string[] = [];\n let current = object;\n\n while (current && current !== scene) {\n const name = current.name || current.constructor.name || \"Object\";\n path.unshift(name);\n current = current.parent;\n }\n\n return path.join(\" > \");\n }\n\n private static getObjectDisplayName(object: any): string {\n if (object.name) {\n return object.name;\n }\n\n // Try to find a meaningful parent name\n let current = object.parent;\n while (current && current !== object.parent?.parent) {\n if (current.name) {\n return `${current.name} > ${object.constructor.name}`;\n }\n current = current.parent;\n }\n\n return `${object.constructor.name}_${object.uuid.substring(0, 8)}`;\n }\n\n private static generateTextureThumbnails(scene: THREE.Scene): Map<string, string> {\n const thumbnails = new Map<string, string>();\n\n // Find all unique textures in the scene\n const textureMap = new Map<string, THREE.Texture>();\n\n scene.traverse((object) => {\n const asMesh = object as THREE.Mesh;\n if (asMesh.isMesh) {\n const materialsArray = Array.isArray(asMesh.material) ? asMesh.material : [asMesh.material];\n materialsArray.forEach((material) => {\n if (material) {\n const textureProperties = [\n \"map\",\n \"normalMap\",\n \"roughnessMap\",\n \"metalnessMap\",\n \"aoMap\",\n \"emissiveMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"alphaMap\",\n \"lightMap\",\n \"envMap\",\n ];\n\n textureProperties.forEach((prop) => {\n const texture = (material as any)[prop];\n if (texture && texture.isTexture && !textureMap.has(texture.uuid)) {\n textureMap.set(texture.uuid, texture);\n }\n });\n }\n });\n }\n });\n\n // Generate thumbnails for each texture\n textureMap.forEach((texture, uuid) => {\n try {\n const thumbnail = ThreeJSMemoryInspector.createTextureThumbnail(texture);\n if (thumbnail) {\n thumbnails.set(uuid, thumbnail);\n }\n } catch (error) {\n console.warn(`Failed to generate thumbnail for texture ${uuid}:`, error);\n }\n });\n\n return thumbnails;\n }\n\n private static generateGeometryPreviews(scene: THREE.Scene): Map<string, string> {\n const previews = new Map<string, string>();\n\n // Find all unique geometries in the scene\n const geometryMap = new Map<string, THREE.BufferGeometry>();\n\n scene.traverse((object) => {\n const asMesh = object as THREE.Mesh;\n if (asMesh.isMesh && asMesh.geometry) {\n const geometry = asMesh.geometry;\n if (!geometryMap.has(geometry.uuid)) {\n geometryMap.set(geometry.uuid, geometry);\n }\n }\n });\n\n // Create a single renderer to reuse for all previews\n let sharedRenderer: THREE.WebGLRenderer | null = null;\n try {\n sharedRenderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n sharedRenderer.setSize(200, 200);\n sharedRenderer.setClearColor(0x222222, 0);\n\n // Generate previews for each geometry using the shared renderer\n geometryMap.forEach((geometry, uuid) => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const preview = ThreeJSMemoryInspector.createGeometryPreview(geometry, sharedRenderer!);\n if (preview) {\n previews.set(uuid, preview);\n }\n } catch (error) {\n console.warn(`Failed to generate preview for geometry ${uuid}:`, error);\n }\n });\n } catch (error) {\n console.warn(\"Failed to initialize shared WebGLRenderer for geometry previews:\", error);\n } finally {\n if (sharedRenderer) {\n sharedRenderer.dispose();\n }\n }\n\n return previews;\n }\n\n private static createTextureThumbnail(texture: THREE.Texture): string | null {\n try {\n const textureAny = texture as any;\n\n // Check if this is a compressed texture\n if (textureAny.isCompressedTexture) {\n return ThreeJSMemoryInspector.createCompressedTextureThumbnail(texture);\n }\n\n // Check if this is a DataTexture - render it using WebGL\n if (textureAny.isDataTexture) {\n return ThreeJSMemoryInspector.createCompressedTextureThumbnail(texture);\n }\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return null;\n }\n\n let sourceElement: any = null;\n\n // Try to get the source element from the texture\n if (texture.source && texture.source.data) {\n sourceElement = texture.source.data;\n } else if ((texture as any).image) {\n sourceElement = (texture as any).image;\n }\n\n if (!sourceElement) {\n return null;\n }\n\n // Set canvas size for thumbnail (max 200x200)\n const maxSize = 200;\n let width = 0;\n let height = 0;\n\n // Get dimensions based on source type\n if (sourceElement instanceof HTMLCanvasElement) {\n width = sourceElement.width;\n height = sourceElement.height;\n } else if (sourceElement instanceof ImageData) {\n width = sourceElement.width;\n height = sourceElement.height;\n } else if (sourceElement instanceof HTMLVideoElement) {\n width = sourceElement.videoWidth || sourceElement.width;\n height = sourceElement.videoHeight || sourceElement.height;\n } else if (sourceElement.constructor.name === \"ImageBitmap\") {\n width = (sourceElement as any).width;\n height = (sourceElement as any).height;\n } else if (sourceElement instanceof HTMLImageElement) {\n width = sourceElement.naturalWidth || sourceElement.width;\n height = sourceElement.naturalHeight || sourceElement.height;\n }\n\n if (width === 0 || height === 0) {\n return null;\n }\n\n // Calculate thumbnail dimensions maintaining aspect ratio\n const scale = Math.min(maxSize / width, maxSize / height);\n canvas.width = Math.floor(width * scale);\n canvas.height = Math.floor(height * scale);\n\n // Draw the texture to canvas\n if (sourceElement instanceof ImageData) {\n // Create a temporary canvas for ImageData\n const tempCanvas = document.createElement(\"canvas\");\n const tempCtx = tempCanvas.getContext(\"2d\");\n if (tempCtx) {\n tempCanvas.width = sourceElement.width;\n tempCanvas.height = sourceElement.height;\n tempCtx.putImageData(sourceElement, 0, 0);\n ctx.drawImage(tempCanvas, 0, 0, canvas.width, canvas.height);\n }\n } else if (\n sourceElement instanceof HTMLCanvasElement ||\n sourceElement instanceof HTMLImageElement ||\n sourceElement instanceof HTMLVideoElement ||\n sourceElement.constructor.name === \"ImageBitmap\"\n ) {\n ctx.drawImage(sourceElement, 0, 0, canvas.width, canvas.height);\n } else {\n return null;\n }\n\n // Convert to base64 data URI\n return canvas.toDataURL(\"image/png\");\n } catch (error) {\n console.warn(\"Error creating texture thumbnail:\", error);\n return null;\n }\n }\n\n private static createCompressedTextureThumbnail(texture: THREE.Texture): string | null {\n let renderer: THREE.WebGLRenderer | null = null;\n\n try {\n // Get texture dimensions\n const textureAny = texture as any;\n let width = 0;\n let height = 0;\n\n if (textureAny.mipmaps && textureAny.mipmaps.length > 0) {\n width = textureAny.mipmaps[0].width || 0;\n height = textureAny.mipmaps[0].height || 0;\n }\n\n if (width === 0 || (height === 0 && textureAny.image)) {\n width = textureAny.image.width || 0;\n height = textureAny.image.height || 0;\n }\n\n if (width === 0 || height === 0) {\n return null;\n }\n\n // Calculate thumbnail dimensions maintaining aspect ratio\n const maxSize = 200;\n const scale = Math.min(maxSize / width, maxSize / height);\n const thumbWidth = Math.floor(width * scale);\n const thumbHeight = Math.floor(height * scale);\n\n // Create a temporary WebGL renderer\n renderer = new THREE.WebGLRenderer({ antialias: false, alpha: true });\n renderer.setSize(thumbWidth, thumbHeight);\n renderer.setClearColor(0x000000, 0);\n\n // Create a simple scene with a plane\n const scene = new THREE.Scene();\n const camera = new THREE.OrthographicCamera(-0.5, 0.5, 0.5, -0.5, 0, 1);\n camera.position.z = 0.5;\n\n // Create a plane geometry with the texture\n const geometry = new THREE.PlaneGeometry(1, 1);\n const material = new THREE.MeshBasicMaterial({\n map: texture,\n side: THREE.DoubleSide,\n transparent: true,\n });\n const plane = new THREE.Mesh(geometry, material);\n scene.add(plane);\n\n // Render the scene\n renderer.render(scene, camera);\n\n // Get the canvas and convert to data URL\n const canvas = renderer.domElement;\n const dataURL = canvas.toDataURL(\"image/png\");\n\n // Clean up\n geometry.dispose();\n material.dispose();\n\n return dataURL;\n } catch (error) {\n console.warn(\"Error creating compressed texture thumbnail:\", error);\n return null;\n } finally {\n if (renderer) {\n renderer.dispose();\n }\n }\n }\n\n private static createGeometryPreview(\n geometry: THREE.BufferGeometry,\n renderer: THREE.WebGLRenderer,\n ): string | null {\n try {\n // Create a temporary scene for rendering\n const tempScene = new THREE.Scene();\n const tempCamera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);\n\n // Ensure renderer is configured for preview\n renderer.setSize(200, 200);\n renderer.setClearColor(0x222222, 0);\n\n // Create a mesh with a light gray material and overlay wireframe lines\n const material = new THREE.MeshStandardMaterial({\n color: 0xeeeeee,\n roughness: 0.9,\n metalness: 0.0,\n side: THREE.DoubleSide,\n polygonOffset: true,\n polygonOffsetFactor: 1,\n polygonOffsetUnits: 1,\n });\n const mesh = new THREE.Mesh(geometry, material);\n const wireGeom = new THREE.WireframeGeometry(geometry);\n const wireMaterial = new THREE.LineBasicMaterial({ color: 0xffffff });\n const wireframe = new THREE.LineSegments(wireGeom, wireMaterial);\n wireframe.renderOrder = 1;\n\n // Prefer tight fit using bounding sphere; fallback to bounding box\n geometry.computeBoundingSphere();\n let radius = 0;\n let center = new THREE.Vector3();\n if (geometry.boundingSphere) {\n radius = geometry.boundingSphere.radius;\n center.copy(geometry.boundingSphere.center);\n } else {\n geometry.computeBoundingBox();\n const box = geometry.boundingBox;\n if (!box) {\n return null;\n }\n center = new THREE.Vector3();\n box.getCenter(center);\n const size = new THREE.Vector3();\n box.getSize(size);\n radius = Math.max(size.x, size.y, size.z) * 0.5;\n }\n\n // Center geometry at origin\n mesh.position.sub(center);\n wireframe.position.copy(mesh.position);\n\n // Compute camera distance to tightly fit the sphere within the vertical FOV\n const fovRad = (tempCamera.fov * Math.PI) / 180;\n let distance = radius / Math.sin(fovRad / 2);\n // Add a small margin to avoid clipping while keeping it tight\n distance *= 1.05;\n\n // Place camera along an isometric direction at the computed distance\n const dir = new THREE.Vector3(1, 1, 1).normalize();\n tempCamera.position.copy(dir.multiplyScalar(distance));\n tempCamera.lookAt(0, 0, 0);\n\n // Add lighting\n const ambientLight = new THREE.AmbientLight(0x404040, 0.6);\n const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);\n directionalLight.position.set(1, 1, 1);\n\n tempScene.add(mesh);\n tempScene.add(wireframe);\n tempScene.add(ambientLight);\n tempScene.add(directionalLight);\n\n // Render the scene\n renderer.render(tempScene, tempCamera);\n\n // Get the canvas and convert to data URL\n const canvas = renderer.domElement;\n const dataURL = canvas.toDataURL(\"image/png\");\n\n // Clean up\n material.dispose();\n wireMaterial.dispose();\n wireGeom.dispose();\n\n return dataURL;\n } catch (error) {\n console.warn(\"Error creating geometry preview:\", error);\n return null;\n }\n }\n\n private static buildReportUI(\n doc: Document,\n geometries: Map<string, GeometryInfo>,\n textures: Map<string, TextureInfo>,\n materials: Map<string, MaterialInfo>,\n stats: MemoryStats,\n textureThumbnails: Map<string, string>,\n geometryPreviews: Map<string, string>,\n ): void {\n // Set document title\n doc.title = \"Three.js Memory Report\";\n\n // Add styles\n const style = doc.createElement(\"style\");\n style.textContent = ThreeJSMemoryInspector.getReportStyles();\n doc.head.appendChild(style);\n\n // Clear body\n doc.body.innerHTML = \"\";\n\n // Create container\n const container = doc.createElement(\"div\");\n container.className = \"container\";\n\n // Create stats grid\n const statsGrid = ThreeJSMemoryInspector.createStatsGrid(doc, stats);\n container.appendChild(statsGrid);\n\n // Create main section\n const section = doc.createElement(\"div\");\n section.className = \"section\";\n\n // Create controls\n const controls = ThreeJSMemoryInspector.createControls(doc, stats);\n section.appendChild(controls);\n\n // Create content area\n const sectionContent = doc.createElement(\"div\");\n sectionContent.className = \"section-content\";\n\n const resultsInfo = doc.createElement(\"div\");\n resultsInfo.className = \"results-info\";\n resultsInfo.id = \"resultsInfo\";\n sectionContent.appendChild(resultsInfo);\n\n const itemList = doc.createElement(\"div\");\n itemList.className = \"item-list\";\n itemList.id = \"itemList\";\n sectionContent.appendChild(itemList);\n\n section.appendChild(sectionContent);\n container.appendChild(section);\n\n doc.body.appendChild(container);\n\n // Initialize interactivity\n ThreeJSMemoryInspector.initializeReportInteractivity(\n doc,\n geometries,\n textures,\n textureThumbnails,\n geometryPreviews,\n );\n }\n\n private static getReportStyles(): string {\n return `\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #1a1a1a;\n color: #e0e0e0;\n line-height: 1.6;\n }\n\n .container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n }\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 40px;\n }\n\n .stat-card {\n background: #2a2a2a;\n padding: 20px;\n border-radius: 8px;\n text-align: center;\n border: 1px solid #444;\n }\n\n .stat-value {\n font-size: 2em;\n font-weight: bold;\n color: #4CAF50;\n margin-bottom: 5px;\n }\n\n .stat-label {\n color: #aaa;\n font-size: 0.9em;\n }\n\n .section {\n background: #2a2a2a;\n border-radius: 8px;\n margin-bottom: 30px;\n overflow: hidden;\n border: 1px solid #444;\n }\n\n .section-content {\n padding: 20px;\n }\n\n .controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n background: #333;\n border-bottom: 1px solid #444;\n }\n .control-group {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n }\n .checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #2a2a2a;\n padding: 6px 10px;\n border: 1px solid #555;\n border-radius: 6px;\n }\n .filter-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n color: #ccc;\n }\n .clear-btn {\n background: transparent;\n border: 1px solid #666;\n color: #ccc;\n padding: 4px 8px;\n border-radius: 4px;\n cursor: pointer;\n }\n .clear-btn:hover { border-color: #888; color: #fff; }\n\n .item-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .item-row {\n display: flex;\n gap: 12px;\n align-items: center;\n background: #333;\n border: 1px solid #555;\n border-radius: 8px;\n padding: 12px;\n }\n .item-media {\n flex: 0 0 160px;\n height: 100px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #222;\n border: 1px solid #555;\n border-radius: 6px;\n overflow: hidden;\n }\n .item-media img { max-width: 100%; max-height: 100%; object-fit: contain; }\n .item-media .placeholder { color: #666; font-size: 0.85em; text-align: center; padding: 0 8px; }\n .item-content { flex: 1; min-width: 0; }\n .item-title { display: flex; gap: 10px; align-items: center; margin-bottom: 6px; }\n .item-name { font-weight: bold; color: #fff; font-size: 1.05em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .type-badge { font-size: 0.75em; padding: 2px 6px; border-radius: 4px; border: 1px solid #555; color: #ddd; }\n .type-geometry { background: #263238; }\n .type-texture { background: #2e3a29; }\n .item-details { color: #ccc; font-size: 0.9em; }\n .item-detail-line { margin-bottom: 2px; }\n .item-meta { min-width: 140px; text-align: right; }\n .item-size { background: #4CAF50; color: #fff; padding: 4px 8px; border-radius: 4px; font-size: 0.8em; font-weight: bold; display: inline-block; }\n .item-usage { margin-top: 8px; color: #aaa; font-size: 0.85em; }\n .usage-list { margin-top: 6px; display: flex; gap: 6px; flex-wrap: wrap; }\n .usage-chip { background: #444; color: #ddd; border: 1px solid #666; border-radius: 14px; padding: 2px 8px; font-size: 0.75em; cursor: pointer; }\n .usage-chip:hover { background: #4a4a4a; border-color: #888; color: #fff; }\n .results-info { color: #aaa; font-size: 0.85em; margin-bottom: 12px; }\n .loading {\n text-align: center;\n color: #666;\n font-style: italic;\n }\n .more-items {\n color: #888;\n font-size: 0.75em;\n margin-left: 4px;\n }\n `;\n }\n\n private static createStatsGrid(doc: Document, stats: MemoryStats): HTMLElement {\n const statsGrid = doc.createElement(\"div\");\n statsGrid.className = \"stats-grid\";\n\n const formatBytes = (bytes: number) => `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n\n // Total Memory card\n statsGrid.appendChild(\n ThreeJSMemoryInspector.createStatCard(doc, formatBytes(stats.totalMemory), \"Total Memory\"),\n );\n\n // Geometry Memory card\n statsGrid.appendChild(\n ThreeJSMemoryInspector.createStatCard(\n doc,\n formatBytes(stats.totalGeometryMemory),\n \"Geometry Memory\",\n ),\n );\n\n // Texture Memory card\n statsGrid.appendChild(\n ThreeJSMemoryInspector.createStatCard(\n doc,\n formatBytes(stats.totalTextureMemory),\n \"Texture Memory\",\n ),\n );\n\n // Geometries count card\n statsGrid.appendChild(\n ThreeJSMemoryInspector.createStatCard(doc, String(stats.geometryCount), \"Geometries\"),\n );\n\n // Textures count card\n statsGrid.appendChild(\n ThreeJSMemoryInspector.createStatCard(doc, String(stats.textureCount), \"Textures\"),\n );\n\n return statsGrid;\n }\n\n private static createStatCard(doc: Document, value: string, label: string): HTMLElement {\n const card = doc.createElement(\"div\");\n card.className = \"stat-card\";\n\n const valueDiv = doc.createElement(\"div\");\n valueDiv.className = \"stat-value\";\n valueDiv.textContent = value;\n card.appendChild(valueDiv);\n\n const labelDiv = doc.createElement(\"div\");\n labelDiv.className = \"stat-label\";\n labelDiv.textContent = label;\n card.appendChild(labelDiv);\n\n return card;\n }\n\n private static createControls(doc: Document, stats: MemoryStats): HTMLElement {\n const controls = doc.createElement(\"div\");\n controls.className = \"controls\";\n\n // Control group (checkboxes)\n const controlGroup = doc.createElement(\"div\");\n controlGroup.className = \"control-group\";\n\n // Textures checkbox\n const texturesLabel = doc.createElement(\"label\");\n texturesLabel.className = \"checkbox\";\n\n const texturesCheckbox = doc.createElement(\"input\");\n texturesCheckbox.type = \"checkbox\";\n texturesCheckbox.id = \"toggleTextures\";\n texturesCheckbox.checked = true;\n texturesLabel.appendChild(texturesCheckbox);\n\n texturesLabel.appendChild(doc.createTextNode(` Textures (${stats.textureCount})`));\n controlGroup.appendChild(texturesLabel);\n\n // Geometries checkbox\n const geometriesLabel = doc.createElement(\"label\");\n geometriesLabel.className = \"checkbox\";\n\n const geometriesCheckbox = doc.createElement(\"input\");\n geometriesCheckbox.type = \"checkbox\";\n geometriesCheckbox.id = \"toggleGeometries\";\n geometriesCheckbox.checked = true;\n geometriesLabel.appendChild(geometriesCheckbox);\n\n geometriesLabel.appendChild(doc.createTextNode(` Geometries (${stats.geometryCount})`));\n controlGroup.appendChild(geometriesLabel);\n\n controls.appendChild(controlGroup);\n\n // Filter bar\n const filterBar = doc.createElement(\"div\");\n filterBar.className = \"filter-bar\";\n\n const filterStatus = doc.createElement(\"span\");\n filterStatus.id = \"filterStatus\";\n filterStatus.textContent = \"No object filter\";\n filterBar.appendChild(filterStatus);\n\n const clearButton = doc.createElement(\"button\");\n clearButton.id = \"clearFilter\";\n clearButton.className = \"clear-btn\";\n clearButton.textContent = \"Clear filter\";\n clearButton.style.display = \"none\";\n filterBar.appendChild(clearButton);\n\n controls.appendChild(filterBar);\n\n return controls;\n }\n\n private static initializeReportInteractivity(\n doc: Document,\n geometries: Map<string, GeometryInfo>,\n textures: Map<string, TextureInfo>,\n textureThumbnails: Map<string, string>,\n geometryPreviews: Map<string, string>,\n ): void {\n // Prepare data arrays\n const texturesData = Array.from(textures.values())\n .map((tex) => ({\n type: \"texture\" as const,\n uuid: tex.uuid,\n name: tex.name,\n memoryBytes: tex.memoryBytes,\n width: tex.width,\n height: tex.height,\n format: tex.format,\n sourceType: tex.sourceType,\n url: tex.url,\n usedByObjects: tex.usedByObjects,\n usedByObjectPaths: tex.usedByObjectPaths,\n usedByObjectInstanceIds: tex.usedByObjectInstanceIds,\n instanceCount: tex.usedByObjectInstanceIds.length,\n thumbnail: textureThumbnails.get(tex.uuid) || null,\n }))\n .sort((a, b) => b.memoryBytes - a.memoryBytes);\n\n const geometriesData = Array.from(geometries.values())\n .map((geo) => ({\n type: \"geometry\" as const,\n uuid: geo.uuid,\n name: geo.name,\n memoryBytes: geo.memoryBytes,\n vertexCount: geo.vertexCount,\n triangleCount: geo.triangleCount,\n usedByObjects: geo.usedByObjects,\n usedByObjectPaths: geo.objectPaths,\n usedByObjectInstanceIds: geo.usedByObjectInstanceIds,\n instanceCount: geo.usedByObjectInstanceIds.length,\n preview: geometryPreviews.get(geo.uuid) || null,\n }))\n .sort((a, b) => b.memoryBytes - a.memoryBytes);\n\n const itemList = doc.getElementById(\"itemList\");\n const resultsInfo = doc.getElementById(\"resultsInfo\");\n const toggleTextures = doc.getElementById(\"toggleTextures\") as HTMLInputElement | null;\n const toggleGeometries = doc.getElementById(\"toggleGeometries\") as HTMLInputElement | null;\n const filterStatus = doc.getElementById(\"filterStatus\");\n const clearFilterBtn = doc.getElementById(\"clearFilter\");\n\n if (!itemList || !resultsInfo || !filterStatus || !clearFilterBtn) {\n return;\n }\n\n let activeObjectFilter: string | null = null;\n\n const formatBytes = (bytes: number) => `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n\n const render = () => {\n const includeTextures = toggleTextures?.checked ?? true;\n const includeGeometries = toggleGeometries?.checked ?? true;\n\n let items: Array<(typeof texturesData)[0] | (typeof geometriesData)[0]> = [];\n if (includeTextures) items.push(...texturesData);\n if (includeGeometries) items.push(...geometriesData);\n\n const total = items.length;\n\n if (activeObjectFilter) {\n const filter = activeObjectFilter;\n items = items.filter((item) => item.usedByObjectInstanceIds.includes(filter));\n }\n\n items.sort((a, b) => b.memoryBytes - a.memoryBytes);\n\n // Clear item list\n itemList.innerHTML = \"\";\n\n if (items.length === 0) {\n const loading = doc.createElement(\"div\");\n loading.className = \"loading\";\n loading.textContent = \"No items match the current filters.\";\n itemList.appendChild(loading);\n } else {\n items.forEach((item) => {\n const itemRow = ThreeJSMemoryInspector.createItemRow(\n doc,\n item,\n formatBytes,\n (objectId: string) => {\n activeObjectFilter = objectId;\n updateFilterBar();\n render();\n },\n );\n itemList.appendChild(itemRow);\n });\n }\n\n resultsInfo.textContent = `Showing ${items.length} of ${total} item(s)`;\n };\n\n const updateFilterBar = () => {\n if (activeObjectFilter) {\n filterStatus.textContent = `Object filter: ${activeObjectFilter}`;\n clearFilterBtn.style.display = \"\";\n } else {\n filterStatus.textContent = \"No object filter\";\n clearFilterBtn.style.display = \"none\";\n }\n };\n\n // Event listeners\n toggleTextures?.addEventListener(\"change\", render);\n toggleGeometries?.addEventListener(\"change\", render);\n clearFilterBtn.addEventListener(\"click\", () => {\n activeObjectFilter = null;\n updateFilterBar();\n render();\n });\n\n // Initial render\n updateFilterBar();\n render();\n }\n\n private static createItemRow(\n doc: Document,\n item: any,\n formatBytes: (bytes: number) => string,\n onObjectClick: (objectId: string) => void,\n ): HTMLElement {\n const itemRow = doc.createElement(\"div\");\n itemRow.className = \"item-row\";\n\n // Media section\n const itemMedia = doc.createElement(\"div\");\n itemMedia.className = \"item-media\";\n\n const isTexture = item.type === \"texture\";\n const mediaSource = isTexture ? item.thumbnail : item.preview;\n\n if (mediaSource) {\n const img = doc.createElement(\"img\");\n img.src = mediaSource;\n img.alt = item.name;\n itemMedia.appendChild(img);\n } else {\n const placeholder = doc.createElement(\"div\");\n placeholder.className = \"placeholder\";\n placeholder.textContent = isTexture\n ? `${item.width} \u00D7 ${item.height}`\n : `${item.vertexCount.toLocaleString()} vertices`;\n itemMedia.appendChild(placeholder);\n }\n\n itemRow.appendChild(itemMedia);\n\n // Content section\n const itemContent = doc.createElement(\"div\");\n itemContent.className = \"item-content\";\n\n // Title\n const itemTitle = doc.createElement(\"div\");\n itemTitle.className = \"item-title\";\n\n const itemName = doc.createElement(\"div\");\n itemName.className = \"item-name\";\n itemName.textContent = item.name;\n itemTitle.appendChild(itemName);\n\n const typeBadge = doc.createElement(\"div\");\n typeBadge.className = `type-badge ${isTexture ? \"type-texture\" : \"type-geometry\"}`;\n typeBadge.textContent = isTexture ? \"Texture\" : \"Geometry\";\n itemTitle.appendChild(typeBadge);\n\n itemContent.appendChild(itemTitle);\n\n // Details\n const itemDetails = doc.createElement(\"div\");\n itemDetails.className = \"item-details\";\n\n if (isTexture) {\n const line1 = doc.createElement(\"div\");\n line1.className = \"item-detail-line\";\n line1.textContent = `${item.width} \u00D7 ${item.height} \u2022 ${item.format}`;\n itemDetails.appendChild(line1);\n\n const line2 = doc.createElement(\"div\");\n line2.className = \"item-detail-line\";\n line2.textContent = `Source: ${item.sourceType}`;\n itemDetails.appendChild(line2);\n\n if (item.url) {\n const line3 = doc.createElement(\"div\");\n line3.className = \"item-detail-line\";\n line3.textContent = `URL: ${item.url}`;\n itemDetails.appendChild(line3);\n }\n } else {\n const line1 = doc.createElement(\"div\");\n line1.className = \"item-detail-line\";\n line1.textContent = `${item.vertexCount.toLocaleString()} vertices \u2022 ${item.triangleCount.toLocaleString()} triangles`;\n itemDetails.appendChild(line1);\n }\n\n itemContent.appendChild(itemDetails);\n\n // Usage section\n const itemUsage = doc.createElement(\"div\");\n itemUsage.className = \"item-usage\";\n\n const usageLabel = doc.createElement(\"div\");\n usageLabel.textContent = `Used by ${item.usedByObjects.length} object(s):`;\n itemUsage.appendChild(usageLabel);\n\n const usageList = doc.createElement(\"div\");\n usageList.className = \"usage-list\";\n\n const maxChips = 10;\n const objectsToShow = item.usedByObjects.slice(0, maxChips);\n\n objectsToShow.forEach((objName: string, idx: number) => {\n const chip = doc.createElement(\"button\");\n chip.className = \"usage-chip\";\n chip.type = \"button\";\n chip.textContent = objName;\n chip.title = item.usedByObjectPaths[idx] || objName;\n chip.addEventListener(\"click\", () => {\n onObjectClick(item.usedByObjectInstanceIds[idx]);\n });\n usageList.appendChild(chip);\n });\n\n if (item.usedByObjects.length > maxChips) {\n const more = doc.createElement(\"span\");\n more.className = \"more-items\";\n more.textContent = `+${item.usedByObjects.length - maxChips} more`;\n usageList.appendChild(more);\n }\n\n itemUsage.appendChild(usageList);\n itemContent.appendChild(itemUsage);\n\n itemRow.appendChild(itemContent);\n\n // Meta section\n const itemMeta = doc.createElement(\"div\");\n itemMeta.className = \"item-meta\";\n\n const itemSize = doc.createElement(\"div\");\n itemSize.className = \"item-size\";\n itemSize.textContent = formatBytes(item.memoryBytes);\n itemMeta.appendChild(itemSize);\n\n const instanceCount = doc.createElement(\"div\");\n instanceCount.style.marginTop = \"6px\";\n instanceCount.style.color = \"#bbb\";\n instanceCount.style.fontSize = \"0.8em\";\n instanceCount.textContent = `${item.instanceCount} instance(s)`;\n itemMeta.appendChild(instanceCount);\n\n itemRow.appendChild(itemMeta);\n\n return itemRow;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["LoadingInstanceManager", "THREE", "THREE", "THREE", "THREE", "THREE", "LoadingInstanceManager", "THREE", "THREE", "THREE", "result", "hasTransparency", "THREE", "THREE", "Model", "LoadingInstanceManager", "THREE", "THREE", "LoadingInstanceManager", "Model", "THREE", "THREE", "THREE", "THREE", "THREE", "THREE", "calculateContentSize", "THREE", "audioRefDistance", "audioRolloffFactor", "THREE", "hasTransparency", "CanvasText", "THREE", "CanvasText", "MElement", "THREE", "THREE", "THREE"]
|
|
7
7
|
}
|