@mml-io/mml-web-playcanvas 0.19.2 → 0.19.3

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 CHANGED
@@ -74,7 +74,7 @@ var PlayCanvasClickTrigger = class _PlayCanvasClickTrigger {
74
74
  break;
75
75
  }
76
76
  }
77
- if (mElement && mElement instanceof TransformableElement && mElement.isClickable()) {
77
+ if (mElement && TransformableElement.isTransformableElement(mElement) && mElement.isClickable()) {
78
78
  const elementRelative = getRelativePositionAndRotationRelativeToObject(
79
79
  {
80
80
  position: result.point,
@@ -1590,7 +1590,7 @@ var PlayCanvasModel = class extends ModelGraphics {
1590
1590
  this.latestAnimPromise = null;
1591
1591
  if (this.loadedState && !this.registeredParentAttachment) {
1592
1592
  const parent = this.model.parentElement;
1593
- if (parent instanceof Model2) {
1593
+ if (parent && Model2.isModel(parent)) {
1594
1594
  this.registeredParentAttachment = parent;
1595
1595
  parent.modelGraphics.registerAttachment(this.model);
1596
1596
  }
@@ -1787,7 +1787,7 @@ var PlayCanvasModel = class extends ModelGraphics {
1787
1787
  this.connectAnimationToModel();
1788
1788
  this.updateMeshCallback();
1789
1789
  const parent = this.model.parentElement;
1790
- if (parent instanceof Model2) {
1790
+ if (parent && Model2.isModel(parent)) {
1791
1791
  if (!this.latestAnimPromise && !this.animState) {
1792
1792
  this.registeredParentAttachment = parent;
1793
1793
  parent.modelGraphics.registerAttachment(this.model);
@@ -1886,7 +1886,7 @@ var PlayCanvasModel = class extends ModelGraphics {
1886
1886
  triggerSocketedChildrenTransformed() {
1887
1887
  this.socketChildrenByBone.forEach((children) => {
1888
1888
  children.forEach((child) => {
1889
- if (child instanceof TransformableElement2) {
1889
+ if (TransformableElement2.isTransformableElement(child)) {
1890
1890
  child.didUpdateTransformation();
1891
1891
  }
1892
1892
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/PlayCanvasClickTrigger.ts", "../src/elements/PlayCanvasAudio.ts", "../src/elements/PlayCanvasChatProbe.ts", "../src/elements/PlayCanvasCube.ts", "../src/elements/PlayCanvasCylinder.ts", "../src/elements/PlayCanvasDebugHelper.ts", "../src/debug-bounding-box/PlayCanvasDebugBoundingBox.ts", "../src/elements/PlayCanvasFrame.ts", "../src/elements/PlayCanvasImage.ts", "../src/plane/plane.ts", "../src/elements/PlayCanvasInteraction.ts", "../src/elements/PlayCanvasLabel.ts", "../src/elements/PlayCanvasLight.ts", "../src/elements/PlayCanvasLink.ts", "../src/elements/PlayCanvasMElement.ts", "../src/elements/PlayCanvasModel.ts", "../src/elements/PlayCanvasPlane.ts", "../src/elements/PlayCanvasPositionProbe.ts", "../src/elements/PlayCanvasPrompt.ts", "../src/elements/PlayCanvasRemoteDocument.ts", "../src/PlayCanvasReconnectingStatus.ts", "../src/elements/PlayCanvasSphere.ts", "../src/elements/PlayCanvasTransformable.ts", "../src/elements/PlayCanvasVideo.ts", "../src/PlayCanvasGraphicsInterface.ts", "../src/PlayCanvasInteractionAdapter.ts"],
4
- "sourcesContent": ["import {\n EventHandlerCollection,\n getRelativePositionAndRotationRelativeToObject,\n MElement,\n TransformableElement,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nconst mouseMovePixelsThreshold = 10;\nconst mouseMoveTimeThresholdMilliseconds = 500;\n\n/**\n * The PlayCanvasClickTrigger 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 PlayCanvasClickTrigger {\n private eventHandlerCollection: EventHandlerCollection = new EventHandlerCollection();\n private mouseDownTime: number | null = null;\n private mouseMoveDelta = 0;\n\n static init(\n playcanvasApp: playcanvas.AppBase,\n clickTarget: Document | HTMLElement,\n camera: playcanvas.Entity,\n ): PlayCanvasClickTrigger {\n return new PlayCanvasClickTrigger(playcanvasApp, clickTarget, camera);\n }\n\n private constructor(\n private playcanvasApp: playcanvas.AppBase,\n private clickTarget: Document | HTMLElement,\n private camera: playcanvas.Entity,\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 x = event.offsetX;\n y = event.offsetY;\n }\n\n const cameraEntity = this.camera;\n const from = cameraEntity.getPosition();\n const cameraComponent = cameraEntity.camera;\n if (!cameraComponent) {\n console.warn(\"No camera component found on the camera entity. Cannot raycast.\");\n return;\n }\n\n // The pc.Vec3 to raycast to (the click position projected onto the camera's far clip plane)\n const to = cameraComponent.screenToWorld(x, y, cameraComponent.farClip);\n\n // Raycast between the two points and return the closest hit result\n const rigidbodySystem = this.playcanvasApp.systems.rigidbody;\n if (!rigidbodySystem) {\n console.warn(\"No rigidbody system found in the PlayCanvas app. Cannot raycast.\");\n return;\n }\n const result = rigidbodySystem.raycastFirst(from, to);\n\n // If there was a hit, store the entity\n if (result) {\n const hitEntity = result.entity;\n let mElement;\n for (let entity: playcanvas.GraphNode = hitEntity; entity; entity = entity.parent) {\n mElement = MElement.getMElementFromObject(entity);\n if (mElement) {\n break;\n }\n }\n if (mElement && mElement instanceof TransformableElement && mElement.isClickable()) {\n // let's get the intersection point relative to the element origin\n\n const elementRelative = getRelativePositionAndRotationRelativeToObject(\n {\n position: result.point,\n rotation: {\n x: 0,\n y: 0,\n z: 0,\n },\n },\n mElement,\n );\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 dispose() {\n this.eventHandlerCollection.clear();\n }\n}\n", "import { Audio, AudioGraphics, LoadingInstanceManager } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\ntype AudioLoadedState = {\n asset: playcanvas.Asset;\n};\n\nexport class PlayCanvasAudio extends AudioGraphics<PlayCanvasGraphicsAdapter> {\n private soundComponent: playcanvas.SoundComponent;\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Audio.tagName}.src`);\n private latestSrcAudioPromise: Promise<playcanvas.Asset> | null = null;\n protected loadedState: AudioLoadedState | null = null;\n private delayedStartTimer: NodeJS.Timeout | null = null;\n private delayedPauseTimer: NodeJS.Timeout | null = null;\n private static dataAudioFileCount: number = 0;\n\n constructor(private audio: Audio<PlayCanvasGraphicsAdapter>) {\n super(audio);\n const audioEntity = this.audio.getContainer() as playcanvas.Entity;\n this.soundComponent = audioEntity.addComponent(\"sound\", {\n positional: true,\n distanceModel: \"inverse\",\n volume: audio.props.volume,\n } as playcanvas.SoundComponent) as playcanvas.SoundComponent;\n }\n\n private getPlayCanvasApp(): playcanvas.AppBase {\n return this.audio.getScene().getGraphicsAdapter().getPlayCanvasApp();\n }\n\n setSrc(src: string | null): void {\n if (this.loadedState !== null) {\n this.soundComponent.removeSlot(\"slot\");\n this.loadedState.asset.unload();\n this.loadedState = null;\n }\n if (!src) {\n this.srcLoadingInstanceManager.abortIfLoading();\n return;\n }\n\n const contentSrc = this.audio.contentSrcToContentAddress(src);\n const srcAudioPromise = this.asyncLoadSourceAsset(\n contentSrc,\n this.getAudioContext(),\n (loaded, total) => {\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n },\n );\n this.srcLoadingInstanceManager.start(this.audio.getLoadingProgressManager(), contentSrc);\n this.latestSrcAudioPromise = srcAudioPromise;\n srcAudioPromise\n .then((asset) => {\n if (this.latestSrcAudioPromise !== srcAudioPromise || !this.audio.isConnected) {\n // TODO - dispose?\n // If we've loaded a different audio since, or we're no longer connected, dispose of this one\n return;\n }\n this.latestSrcAudioPromise = null;\n this.loadedState = {\n asset,\n };\n\n const sound = asset;\n this.soundComponent.addSlot(\"slot\", {\n volume: 1,\n pitch: 1,\n asset: sound.id,\n loop: true,\n overlap: false,\n autoPlay: false,\n });\n\n const slot = this.soundComponent.slot(\"slot\");\n if (slot) {\n slot.stop();\n slot.overlap = false;\n this.syncAudioTime();\n }\n\n this.srcLoadingInstanceManager.finish();\n })\n .catch((err) => {\n console.error(\"Error loading m-audio.src\", err);\n this.srcLoadingInstanceManager.error(err);\n });\n }\n\n public setStartTime(): void {\n this.syncAudioTime();\n }\n\n public setPauseTime(): void {\n this.syncAudioTime();\n }\n\n public setLoopDuration(): void {\n this.syncAudioTime();\n }\n\n public syncAudioTime(): void {\n if (this.delayedStartTimer) {\n clearTimeout(this.delayedStartTimer);\n this.delayedStartTimer = null;\n }\n if (this.delayedPauseTimer !== null) {\n clearTimeout(this.delayedPauseTimer);\n this.delayedPauseTimer = null;\n }\n\n if (!this.audio.props.src) {\n return;\n }\n\n const slot = this.soundComponent.slot(\"slot\");\n if (slot) {\n if (!this.audio.props.enabled || this.audio.isDisabled()) {\n slot.stop();\n return;\n }\n\n if (slot.loop !== this.audio.props.loop) {\n slot.loop = this.audio.props.loop;\n }\n\n const documentTime = this.audio.getDocumentTime();\n\n if (this.audio.props.pauseTime !== null) {\n if (documentTime !== null && this.audio.props.pauseTime > documentTime) {\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 }, this.audio.props.pauseTime - documentTime);\n this.delayedPauseTimer = delayedPauseTimer;\n } else {\n slot.pause();\n return;\n }\n }\n\n let currentTime: number;\n if (documentTime) {\n currentTime = (documentTime - this.audio.props.startTime) / 1000;\n } else {\n currentTime = (this.audio.props.startTime ? this.audio.props.startTime : 0) / 1000;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const asset = slot._assets.get(slot.asset)!;\n const assetDuration: number | null = asset?.resource.duration || null;\n let targetDuration: number | null = assetDuration;\n if (this.audio.props.loopDuration !== null && this.audio.props.loop) {\n const loopDuration = this.audio.props.loopDuration / 1000;\n if (assetDuration !== null && loopDuration > assetDuration) {\n asset.resource.buffer = extendAudioToDuration(\n this.getAudioContext(),\n asset.resource.buffer,\n loopDuration,\n );\n slot.pause();\n slot.duration = loopDuration;\n }\n targetDuration = loopDuration;\n }\n if (targetDuration !== null && slot.duration !== targetDuration) {\n slot.pause();\n slot.duration = targetDuration;\n }\n\n let desiredAudioTime;\n if (currentTime < 0) {\n // The audio should not start yet\n slot.pause();\n const delayedStartTimer = setTimeout(() => {\n if (this.delayedStartTimer === delayedStartTimer) {\n this.delayedStartTimer = null;\n }\n this.syncAudioTime();\n }, -currentTime * 1000);\n this.delayedStartTimer = delayedStartTimer;\n return;\n } else if (this.audio.props.loop) {\n const slotDuration = slot.duration;\n desiredAudioTime = currentTime % slotDuration;\n } else {\n desiredAudioTime = currentTime;\n }\n\n if (desiredAudioTime >= slot.duration) {\n slot.pause();\n return;\n } else {\n // playing\n }\n\n if (slot.isLoaded && (slot.isPaused || slot.isStopped)) {\n slot.play();\n }\n\n const soundInstance = slot.instances[0];\n let delta = desiredAudioTime - soundInstance.currentTime;\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 - slot.duration;\n if (Math.abs(delta) > Math.abs(loopedDelta)) {\n delta = loopedDelta;\n }\n }\n\n if (Math.abs(delta) < 0.1) {\n // Do nothing - this is close enough - set the playback rate to 1\n slot.pitch = 1;\n } else if (Math.abs(delta) > 0.5) {\n slot.pitch = 1;\n slot.pause();\n soundInstance.currentTime = desiredAudioTime;\n slot.resume();\n return;\n } else {\n if (delta > 0) {\n slot.pitch = 1.02;\n } else {\n slot.pitch = 0.98;\n }\n }\n }\n }\n\n private getAudioContext(): AudioContext {\n const playcanvasApp = this.getPlayCanvasApp();\n const soundSystem = playcanvasApp.systems.sound;\n if (!soundSystem) {\n throw new Error(\"Playcanvas sound system not enabled\");\n }\n return soundSystem.context;\n }\n\n enable(): void {\n // TODO\n }\n disable(): void {\n // TODO\n }\n setLoop(): void {\n this.syncAudioTime();\n }\n setEnabled(): void {\n // TODO\n }\n setVolume(): void {\n this.soundComponent.volume = this.audio.props.volume;\n }\n setConeAngle(): void {\n // TODO\n }\n setConeFalloffAngle(): void {\n // TODO\n }\n setDebug(): void {\n // TODO\n }\n\n private async asyncLoadSourceAsset(\n url: string,\n audioContext: AudioContext,\n // TODO - report progress\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onProgress: (loaded: number, total: number) => void,\n ): Promise<playcanvas.Asset> {\n return new Promise<playcanvas.Asset>((resolve, reject) => {\n if (url.startsWith(\"data:\")) {\n // Construct an AudioBuffer from the data URL\n const base64 = url.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 const soundComp = new playcanvas.Sound(audioBuffer);\n const asset = new playcanvas.Asset(\n \"dataAudioFile-\" + PlayCanvasAudio.dataAudioFileCount++,\n \"audio\",\n { url },\n base64,\n );\n asset.resource = soundComp;\n asset.loaded = true;\n this.getPlayCanvasApp().assets.add(asset);\n resolve(asset);\n })\n .catch((e) => {\n console.error(\"Failed to decode data URI audio data\", e);\n });\n return;\n }\n\n const asset = new playcanvas.Asset(url, \"audio\", { url });\n this.getPlayCanvasApp().assets.add(asset);\n this.getPlayCanvasApp().assets.load(asset);\n asset.ready((asset) => {\n resolve(asset);\n });\n // Listen for errors\n asset.on(\"error\", (err) => {\n console.error(\"Error loading audio asset\", err);\n reject(err);\n });\n });\n }\n\n dispose() {\n if (this.delayedPauseTimer) {\n clearTimeout(this.delayedPauseTimer);\n this.delayedPauseTimer = null;\n }\n if (this.delayedStartTimer) {\n clearTimeout(this.delayedStartTimer);\n this.delayedStartTimer = null;\n }\n const audioEntity = this.audio.getContainer() as playcanvas.Entity;\n audioEntity.removeComponent(\"sound\");\n }\n}\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", "import { ChatProbe, ChatProbeGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasChatProbe extends ChatProbeGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity | null = null;\n private debugMaterial: playcanvas.BasicMaterial | null = null;\n\n constructor(private chatProbe: ChatProbe<PlayCanvasGraphicsAdapter>) {\n super(chatProbe);\n this.updateDebugVisualisation();\n }\n\n public disable(): void {}\n\n public enable(): void {}\n\n public setRange(): void {\n this.updateDebugVisualisation();\n }\n\n public setDebug() {\n this.updateDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.entity) {\n this.entity.destroy();\n this.entity = null;\n }\n if (this.debugMaterial) {\n this.debugMaterial.destroy();\n this.debugMaterial = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.chatProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.chatProbe.isConnected && !this.entity) {\n this.entity = new playcanvas.Entity(\n \"chat-probe-internal\",\n this.chatProbe.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n if (!this.debugMaterial) {\n this.debugMaterial = new playcanvas.BasicMaterial();\n this.debugMaterial.color = new playcanvas.Color(1, 1, 0);\n }\n this.entity.addComponent(\"model\", {\n type: \"sphere\",\n material: this.debugMaterial,\n });\n this.entity.model?.model.meshInstances.forEach((mi) => {\n mi.renderStyle = playcanvas.RENDERSTYLE_WIREFRAME;\n mi.castShadow = false;\n });\n\n this.chatProbe.getContainer().addChild(this.entity);\n }\n\n if (this.entity) {\n this.entity.setLocalScale(\n this.chatProbe.props.range * 2,\n this.chatProbe.props.range * 2,\n this.chatProbe.props.range * 2,\n );\n }\n }\n }\n\n public dispose() {\n this.clearDebugVisualisation();\n }\n}\n", "import { Cube, MCubeProps, MELEMENT_PROPERTY_NAME } from \"@mml-io/mml-web\";\nimport { CubeGraphics } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasCube extends CubeGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity;\n private renderComponent: playcanvas.RenderComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n\n constructor(private cube: Cube<PlayCanvasGraphicsAdapter>) {\n super(cube);\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"cube-internal\",\n cube.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = cube;\n this.renderComponent = this.entity.addComponent(\"render\", {\n type: \"box\",\n material: this.material,\n }) as playcanvas.RenderComponent;\n this.entity.addComponent(\"collision\", {\n type: \"box\",\n halfExtents: new playcanvas.Vec3(0.5, 0.5, 0.5),\n });\n cube.getContainer().addChild(this.entity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n setColor(color: MMLColor): void {\n this.material.diffuse.set(color.r, color.g, color.b);\n this.material.metalness = 0;\n this.material.useMetalness = true;\n this.material.update();\n }\n\n private updateSize(mCubeProps: MCubeProps): void {\n this.entity.setLocalScale(mCubeProps.width, mCubeProps.height, mCubeProps.depth);\n if (this.entity.collision) {\n this.entity.collision.halfExtents.set(\n mCubeProps.width / 2,\n mCubeProps.height / 2,\n mCubeProps.depth / 2,\n );\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n }\n\n setWidth(width: number, mCubeProps: MCubeProps): void {\n this.updateSize(mCubeProps);\n }\n\n setHeight(height: number, mCubeProps: MCubeProps): void {\n this.updateSize(mCubeProps);\n }\n\n setDepth(depth: number, mCubeProps: MCubeProps): void {\n this.updateSize(mCubeProps);\n }\n\n setCastShadows(castShadows: boolean): void {\n this.renderComponent.castShadows = castShadows;\n }\n\n setOpacity(opacity: number): void {\n if (opacity === 1) {\n this.material.blendType = playcanvas.BLEND_NONE;\n } else {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n }\n this.material.opacity = opacity;\n this.material.update();\n }\n\n dispose() {\n this.entity.destroy();\n }\n}\n", "import { Cylinder, MCylinderProps, MELEMENT_PROPERTY_NAME } from \"@mml-io/mml-web\";\nimport { CylinderGraphics } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasCylinder extends CylinderGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity;\n private renderComponent: playcanvas.RenderComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n\n constructor(private cylinder: Cylinder<PlayCanvasGraphicsAdapter>) {\n super(cylinder);\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"cylinder-internal\",\n cylinder.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = cylinder;\n this.renderComponent = this.entity.addComponent(\"render\", {\n type: \"cylinder\",\n material: this.material,\n }) as playcanvas.RenderComponent;\n const collisionComponent = this.entity.addComponent(\"collision\", {\n type: \"cylinder\",\n }) as playcanvas.CollisionComponent;\n collisionComponent.radius = 0.5;\n collisionComponent.height = 1;\n cylinder.getContainer().addChild(this.entity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n setColor(color: MMLColor): void {\n this.material.diffuse.set(color.r, color.g, color.b);\n this.material.metalness = 0;\n this.material.useMetalness = true;\n this.material.update();\n }\n\n private updateSize(mCylinderProps: MCylinderProps): void {\n this.entity.setLocalScale(\n mCylinderProps.radius * 2,\n mCylinderProps.height,\n mCylinderProps.radius * 2,\n );\n if (this.entity.collision) {\n this.entity.collision.radius = mCylinderProps.radius;\n this.entity.collision.height = mCylinderProps.height;\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n }\n\n setRadius(radius: number, mCylinderProps: MCylinderProps): void {\n this.updateSize(mCylinderProps);\n }\n\n setHeight(height: number, mCylinderProps: MCylinderProps): void {\n this.updateSize(mCylinderProps);\n }\n\n setCastShadows(castShadows: boolean): void {\n this.renderComponent.castShadows = castShadows;\n }\n\n setOpacity(opacity: number): void {\n if (opacity === 1) {\n this.material.blendType = playcanvas.BLEND_NONE;\n } else {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n }\n this.material.opacity = opacity;\n this.material.update();\n }\n\n dispose() {\n this.entity.destroy();\n }\n}\n", "import { DebugHelper, DebugHelperGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { createPlayCanvasDebugBoundingBox } from \"../debug-bounding-box/PlayCanvasDebugBoundingBox\";\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasDebugHelper extends DebugHelperGraphics<PlayCanvasGraphicsAdapter> {\n private debugAxes: playcanvas.Entity | null = null;\n\n constructor(private debugHelper: DebugHelper<PlayCanvasGraphicsAdapter>) {\n super(debugHelper);\n\n const graphicsAdapter = this.debugHelper.element.getScene().getGraphicsAdapter();\n\n const playcanvasApp = graphicsAdapter.getPlayCanvasApp();\n\n const playcanvasEntity: playcanvas.Entity = this.debugHelper.getContainer();\n this.debugAxes = new playcanvas.Entity(\"axes\", playcanvasApp);\n playcanvasEntity.addChild(this.debugAxes);\n\n const xMaterial = new playcanvas.BasicMaterial();\n xMaterial.color = new playcanvas.Color(1, 0, 0);\n const xAxis = createPlayCanvasDebugBoundingBox(graphicsAdapter, xMaterial);\n xAxis.setLocalScale(0.5, 0, 0);\n xAxis.setLocalPosition(0.25, 0, 0);\n this.debugAxes.addChild(xAxis);\n\n const yMaterial = new playcanvas.BasicMaterial();\n yMaterial.color = new playcanvas.Color(0, 1, 0);\n const yAxis = createPlayCanvasDebugBoundingBox(graphicsAdapter, yMaterial);\n yAxis.setLocalScale(0, 0.5, 0);\n yAxis.setLocalPosition(0, 0.25, 0);\n this.debugAxes.addChild(yAxis);\n\n const zMaterial = new playcanvas.BasicMaterial();\n zMaterial.color = new playcanvas.Color(0, 0, 1);\n const zAxis = createPlayCanvasDebugBoundingBox(graphicsAdapter, zMaterial);\n zAxis.setLocalScale(0, 0, 0.5);\n zAxis.setLocalPosition(0, 0, 0.25);\n this.debugAxes.addChild(zAxis);\n }\n\n dispose() {\n if (this.debugAxes) {\n this.debugHelper.getContainer().removeChild(this.debugAxes);\n this.debugAxes.destroy();\n }\n this.debugAxes = null;\n }\n}\n", "import * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport function createPlayCanvasDebugBoundingBox(\n graphicsAdapter: PlayCanvasGraphicsAdapter,\n material: playcanvas.Material,\n): playcanvas.Entity {\n const entity = new playcanvas.Entity(\"bounding-box\", graphicsAdapter.getPlayCanvasApp());\n entity.addComponent(\"model\", {\n type: \"box\",\n material,\n });\n entity.model?.model.meshInstances.forEach((mi) => {\n mi.renderStyle = playcanvas.RENDERSTYLE_WIREFRAME;\n mi.castShadow = false;\n });\n return entity;\n}\n", "import { Frame, FrameGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { createPlayCanvasDebugBoundingBox } from \"../debug-bounding-box/PlayCanvasDebugBoundingBox\";\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nfunction setEntityToBoundingBox(\n debugBoxConstraintMesh: playcanvas.Entity,\n minX: number,\n maxX: number,\n minY: number,\n maxY: number,\n minZ: number,\n maxZ: number,\n) {\n debugBoxConstraintMesh.setLocalPosition((maxX + minX) / 2, (maxY + minY) / 2, (maxZ + minZ) / 2);\n debugBoxConstraintMesh.setLocalScale(-(maxX - minX), maxY - minY, maxZ - minZ);\n}\n\nexport class PlayCanvasFrame extends FrameGraphics<PlayCanvasGraphicsAdapter> {\n private debugMaterial: playcanvas.BasicMaterial | null = null;\n private loadRangeMaterial: playcanvas.BasicMaterial | null = null;\n private unloadRangeMaterial: playcanvas.BasicMaterial | null = null;\n\n private debugMeshes: {\n debugBoxConstraintMesh: playcanvas.Entity;\n debugBoxLoadRangeMesh: playcanvas.Entity;\n debugBoxUnloadRangeMesh: playcanvas.Entity;\n } | null = null;\n\n constructor(private frame: Frame<PlayCanvasGraphicsAdapter>) {\n super(frame);\n this.updateDebugVisualisation();\n }\n\n setSrc(): void {\n // no-op\n }\n\n public setDebug(): void {\n this.updateDebugVisualisation();\n }\n public setLoadRange(): void {\n this.updateDebugVisualisation();\n }\n public setUnloadRange(): void {\n this.updateDebugVisualisation();\n }\n public setMinX(): void {\n this.updateDebugVisualisation();\n }\n public setMaxX(): void {\n this.updateDebugVisualisation();\n }\n public setMinY(): void {\n this.updateDebugVisualisation();\n }\n public setMaxY(): void {\n this.updateDebugVisualisation();\n }\n public setMinZ(): void {\n this.updateDebugVisualisation();\n }\n public setMaxZ(): void {\n this.updateDebugVisualisation();\n }\n\n disable(): void {}\n\n enable(): void {}\n\n dispose() {\n this.clearDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.debugMeshes) {\n this.debugMeshes.debugBoxConstraintMesh.destroy();\n this.debugMeshes.debugBoxLoadRangeMesh.destroy();\n this.debugMeshes.debugBoxUnloadRangeMesh.destroy();\n this.debugMeshes = null;\n }\n if (this.debugMaterial) {\n this.debugMaterial.destroy();\n this.debugMaterial = null;\n }\n if (this.loadRangeMaterial) {\n this.loadRangeMaterial.destroy();\n this.loadRangeMaterial = null;\n }\n if (this.unloadRangeMaterial) {\n this.unloadRangeMaterial.destroy();\n this.unloadRangeMaterial = 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 if (!this.debugMaterial) {\n this.debugMaterial = new playcanvas.BasicMaterial();\n this.debugMaterial.color = new playcanvas.Color(1, 0, 0);\n }\n if (!this.loadRangeMaterial) {\n this.loadRangeMaterial = new playcanvas.BasicMaterial();\n this.loadRangeMaterial.color = new playcanvas.Color(0, 1, 0);\n }\n if (!this.unloadRangeMaterial) {\n this.unloadRangeMaterial = new playcanvas.BasicMaterial();\n this.unloadRangeMaterial.color = new playcanvas.Color(0, 0, 1);\n }\n const graphicsAdapter = this.frame.getScene().getGraphicsAdapter();\n this.debugMeshes = {\n debugBoxConstraintMesh: createPlayCanvasDebugBoundingBox(\n graphicsAdapter,\n this.debugMaterial,\n ),\n debugBoxLoadRangeMesh: createPlayCanvasDebugBoundingBox(\n graphicsAdapter,\n this.loadRangeMaterial,\n ),\n debugBoxUnloadRangeMesh: createPlayCanvasDebugBoundingBox(\n graphicsAdapter,\n this.unloadRangeMaterial,\n ),\n };\n this.frame.getContainer().addChild(this.debugMeshes.debugBoxConstraintMesh);\n this.frame.getContainer().addChild(this.debugMeshes.debugBoxLoadRangeMesh);\n this.frame.getContainer().addChild(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.enabled = true;\n\n setEntityToBoundingBox(\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.enabled = false;\n this.debugMeshes.debugBoxUnloadRangeMesh.enabled = false;\n } else {\n this.debugMeshes.debugBoxLoadRangeMesh.enabled = true;\n this.debugMeshes.debugBoxUnloadRangeMesh.enabled = true;\n\n setEntityToBoundingBox(\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 setEntityToBoundingBox(\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 MELEMENT_PROPERTY_NAME,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { createPlaneModel } from \"../plane/plane\";\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\ntype ImageLoadedState = {\n asset: playcanvas.Asset;\n};\n\nexport class PlayCanvasImage extends ImageGraphics<PlayCanvasGraphicsAdapter> {\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Image.tagName}.src`);\n private latestSrcImagePromise: Promise<playcanvas.Asset> | null = null;\n private entity: playcanvas.Entity;\n\n private internalEntity: playcanvas.Entity;\n private modelComponent: playcanvas.ModelComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n protected loadedState: ImageLoadedState | null = null;\n constructor(\n private image: Image<PlayCanvasGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(image, updateMeshCallback);\n\n this.entity = image.getContainer() as playcanvas.Entity;\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.internalEntity = new playcanvas.Entity(\n \"image-internal\",\n image.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.internalEntity as any)[MELEMENT_PROPERTY_NAME] = image;\n\n const { model } = createPlaneModel(this.getPlayCanvasApp(), this.material);\n this.modelComponent = this.internalEntity.addComponent(\n \"model\",\n {},\n ) as playcanvas.ModelComponent;\n this.modelComponent.model = model;\n\n // Use the collision component of the element's entity\n this.entity.addComponent(\"collision\", {\n type: \"box\",\n halfExtents: new playcanvas.Vec3(0.5, 0, 0.5),\n });\n this.entity.addChild(this.internalEntity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getWidthAndHeight(): { width: number; height: number } {\n return {\n width: this.internalEntity.getLocalScale().x,\n height: this.internalEntity.getLocalScale().y,\n };\n }\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n private getPlayCanvasApp(): playcanvas.AppBase {\n return this.image.getScene().getGraphicsAdapter().getPlayCanvasApp();\n }\n\n private updateWidthAndHeight() {\n const loadedImage = this.loadedState?.asset.resource;\n\n const { width, height } = calculateContentSize({\n content: loadedImage ? { width: loadedImage.width, height: loadedImage.height } : undefined,\n width: this.image.props.width,\n height: this.image.props.height,\n });\n\n // Update the size of the visual representation\n this.internalEntity.setLocalScale(width, height, 1);\n\n // Update the collision shape\n if (this.entity.collision) {\n this.entity.collision.halfExtents.set(width / 2, height / 2, 0);\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n\n this.updateMeshCallback();\n }\n\n setWidth(): void {\n this.updateWidthAndHeight();\n }\n\n setHeight(): void {\n this.updateWidthAndHeight();\n }\n\n private clearImage() {\n if (this.material) {\n this.material.diffuseMap = null;\n this.material.opacityMap = null;\n this.material.emissiveMap = null;\n this.material.update();\n }\n this.updateWidthAndHeight();\n }\n\n public setSrc(src: string | null): void {\n if (this.loadedState !== null) {\n this.loadedState.asset.unload();\n this.loadedState = null;\n }\n if (!src) {\n this.clearImage();\n this.srcLoadingInstanceManager.abortIfLoading();\n return;\n }\n\n const contentSrc = this.image.contentSrcToContentAddress(src);\n const srcImagePromise = this.asyncLoadSourceAsset(contentSrc, (loaded, total) => {\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n });\n this.srcLoadingInstanceManager.start(this.image.getLoadingProgressManager(), contentSrc);\n this.latestSrcImagePromise = srcImagePromise;\n srcImagePromise\n .then((asset) => {\n if (this.latestSrcImagePromise !== srcImagePromise || !this.image.isConnected) {\n // TODO\n // If we've loaded a different image since, or we're no longer connected, dispose of this one\n return;\n }\n this.latestSrcImagePromise = null;\n this.loadedState = {\n asset,\n };\n\n const texture = asset.resource;\n texture.premultiplyAlpha = true;\n this.material.diffuseMap = texture;\n this.material.blendType = playcanvas.BLEND_NORMAL;\n this.material.opacityMap = texture;\n this.material.update();\n this.updateWidthAndHeight();\n this.updateMaterialEmissiveIntensity();\n this.srcLoadingInstanceManager.finish();\n })\n .catch((err) => {\n console.error(\"Error loading m-image.src\", err);\n this.clearImage();\n this.srcLoadingInstanceManager.error(err);\n });\n }\n\n setCastShadows(castShadows: boolean): void {\n this.modelComponent.castShadows = castShadows;\n }\n\n setOpacity(opacity: number): void {\n if (opacity === 1) {\n this.material.blendType = playcanvas.BLEND_NONE;\n } else {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n }\n this.material.opacity = opacity;\n this.material.update();\n }\n\n setEmissive(): void {\n this.updateMaterialEmissiveIntensity();\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.image.props.emissive) {\n this.material.emissiveMap = this.material.diffuseMap;\n this.material.emissiveIntensity = this.image.props.emissive;\n } else {\n this.material.emissiveMap = null;\n this.material.emissiveIntensity = 0;\n }\n this.material.update();\n }\n\n private async asyncLoadSourceAsset(\n url: string,\n // TODO - report progress\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onProgress: (loaded: number, total: number) => void,\n ): Promise<playcanvas.Asset> {\n return new Promise<playcanvas.Asset>((resolve, reject) => {\n const asset = new playcanvas.Asset(url, \"texture\", { url });\n this.getPlayCanvasApp().assets.add(asset);\n this.getPlayCanvasApp().assets.load(asset);\n asset.ready((asset) => {\n resolve(asset);\n });\n asset.on(\"error\", (err) => {\n reject(err);\n });\n });\n }\n\n dispose() {\n if (this.loadedState) {\n this.loadedState.asset.unload();\n this.loadedState = null;\n }\n this.internalEntity.destroy();\n }\n}\n", "import * as playcanvas from \"playcanvas\";\n\nexport function createPlaneMesh(app: playcanvas.AppBase): playcanvas.Mesh {\n const vertices = [\n // First triangle\n // bottom left\n -0.5, -0.5, 0,\n // bottom right\n 0.5, -0.5, 0,\n // top left\n -0.5, 0.5, 0,\n\n // Second triangle\n // bottom right\n 0.5, -0.5, 0,\n // top right\n 0.5, 0.5, 0,\n // top left\n -0.5, 0.5, 0,\n\n // First triangle\n // top left\n -0.5, 0.5, 0,\n // bottom right\n 0.5, -0.5, 0,\n // bottom left\n -0.5, -0.5, 0,\n\n // Second triangle\n // top left\n -0.5, 0.5, 0,\n // top right\n 0.5, 0.5, 0,\n // bottom right\n 0.5, -0.5, 0,\n ];\n\n const uvs = [\n // First triangle\n // bottom left\n 0, 1,\n // bottom right\n 1, 1,\n // top left\n 0, 0,\n\n // Second triangle\n // bottom right\n 1, 1,\n // top right\n 1, 0,\n // top left\n 0, 0,\n\n // First triangle\n // top left\n 0, 0,\n // bottom right\n 1, 1,\n // bottom left\n 0, 1,\n\n // Second triangle\n // top left\n 0, 0,\n // top right\n 1, 0,\n // bottom right\n 1, 1,\n ];\n\n const normals = Array.from({ length: vertices.length / 3 }).flatMap((value, index) => {\n return index < 6 ? [0, 0, 1] : [0, 0, -1];\n });\n\n const mesh = new playcanvas.Mesh(app.graphicsDevice);\n mesh.setPositions(vertices);\n mesh.setUvs(0, uvs);\n mesh.setNormals(normals);\n mesh.update();\n return mesh;\n}\n\nexport function createPlaneModel(app: playcanvas.AppBase, material: playcanvas.StandardMaterial) {\n const mesh = createPlaneMesh(app);\n const rootNode = new playcanvas.GraphNode();\n const meshInstance = new playcanvas.MeshInstance(mesh, material, rootNode);\n meshInstance.renderStyle = playcanvas.RENDERSTYLE_SOLID;\n const model = new playcanvas.Model();\n model.graph = rootNode;\n model.meshInstances.push(meshInstance);\n return { model, meshInstance };\n}\n", "import { Interaction } from \"@mml-io/mml-web\";\nimport { InteractionGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasInteraction extends InteractionGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity | null = null;\n private debugMaterial: playcanvas.BasicMaterial | null = null;\n\n constructor(private positionProbe: Interaction<PlayCanvasGraphicsAdapter>) {\n super(positionProbe);\n this.updateDebugVisualisation();\n }\n\n disable(): void {}\n\n enable(): void {}\n\n public setRange(): void {\n this.updateDebugVisualisation();\n }\n\n public setInFocus(): void {\n // no-op\n }\n\n public setLineOfSight(): void {\n // no-op\n }\n\n public setPriority(): void {\n // no-op\n }\n\n public setPrompt(): void {\n // no-op\n }\n\n public setDebug() {\n this.updateDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.entity) {\n this.entity.destroy();\n this.entity = null;\n }\n if (this.debugMaterial) {\n this.debugMaterial.destroy();\n this.debugMaterial = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.positionProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.positionProbe.isConnected && !this.entity) {\n this.entity = new playcanvas.Entity(\n \"interaction-internal\",\n this.positionProbe.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n if (!this.debugMaterial) {\n this.debugMaterial = new playcanvas.BasicMaterial();\n this.debugMaterial.color = new playcanvas.Color(0, 1, 0);\n }\n this.entity.addComponent(\"model\", {\n type: \"sphere\",\n material: this.debugMaterial,\n });\n this.entity.model?.model.meshInstances.forEach((mi) => {\n mi.renderStyle = playcanvas.RENDERSTYLE_WIREFRAME;\n mi.castShadow = false;\n });\n\n this.positionProbe.getContainer().addChild(this.entity);\n }\n\n if (this.entity) {\n this.entity.setLocalScale(\n this.positionProbe.props.range * 2,\n this.positionProbe.props.range * 2,\n this.positionProbe.props.range * 2,\n );\n }\n }\n }\n\n dispose() {\n this.clearDebugVisualisation();\n }\n}\n", "import {\n CanvasText,\n Label,\n LabelGraphics,\n MELEMENT_PROPERTY_NAME,\n MLabelProps,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasLabel extends LabelGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity;\n private renderComponent: playcanvas.RenderComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n private canvasText: CanvasText = new CanvasText();\n\n constructor(private label: Label<PlayCanvasGraphicsAdapter>) {\n super(label);\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"label-internal\",\n label.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = label;\n this.renderComponent = this.entity.addComponent(\"render\", {\n type: \"plane\",\n material: this.material,\n castShadows: this.label.props.castShadows,\n }) as playcanvas.RenderComponent;\n this.entity.rotate(90, 0, 0);\n this.entity.addComponent(\"collision\", {\n type: \"box\",\n halfExtents: new playcanvas.Vec3(0.5, 0, 0.5),\n });\n label.getContainer().addChild(this.entity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n private updateSize(mLabelProps: MLabelProps): void {\n this.entity.setLocalScale(mLabelProps.width, 1, mLabelProps.height);\n if (this.entity.collision) {\n this.entity.collision.halfExtents.set(mLabelProps.width / 2, 0, mLabelProps.height / 2);\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n }\n\n public setWidth(width: number, mLabelProps: MLabelProps): void {\n this.updateSize(mLabelProps);\n this.redrawText();\n }\n\n public setHeight(height: number, mLabelProps: MLabelProps): void {\n this.updateSize(mLabelProps);\n this.redrawText();\n }\n public setContent(): void {\n this.redrawText();\n }\n public setAlignment(): void {\n this.redrawText();\n }\n public setFontSize(): void {\n this.redrawText();\n }\n public setPadding(): void {\n this.redrawText();\n }\n public setColor(): void {\n this.redrawText();\n }\n public setFontColor(): void {\n this.redrawText();\n }\n\n public setEmissive(): void {\n this.updateMaterialEmissiveIntensity();\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.label.props.emissive) {\n this.material.emissiveMap = this.material.diffuseMap;\n this.material.emissiveIntensity = this.label.props.emissive;\n } else {\n this.material.emissiveMap = null;\n this.material.emissiveIntensity = 0;\n }\n this.material.update();\n }\n\n private redrawText() {\n if (!this.material) {\n return;\n }\n const canvas = this.canvasText.renderText(this.label.props.content, {\n bold: true,\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: this.label.props.width * 200,\n height: this.label.props.height * 200,\n },\n alignment: this.label.props.alignment,\n });\n\n const texture = new playcanvas.Texture(\n this.label.getScene().getGraphicsAdapter().getPlayCanvasApp().graphicsDevice,\n {\n width: canvas.width,\n height: canvas.height,\n },\n );\n texture.setSource(canvas);\n this.material.diffuseMap = texture;\n if ((this.label.props.color.a ?? 1) < 1) {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n this.material.opacityMap = texture;\n } else {\n this.material.blendType = playcanvas.BLEND_NONE;\n this.material.opacityMap = null;\n }\n this.material.update();\n this.updateMaterialEmissiveIntensity();\n texture.destroy();\n }\n\n setCastShadows(castShadows: boolean): void {\n this.renderComponent.castShadows = castShadows;\n }\n\n dispose() {\n this.entity.destroy();\n }\n}\n", "import { Light } from \"@mml-io/mml-web\";\nimport { LightGraphics } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nconst lightIntensityFactor = 1 / 100;\nconst lightLuminanceFactor = 4000;\n\nexport class PlayCanvasLight extends LightGraphics<PlayCanvasGraphicsAdapter> {\n private lightComponent: playcanvas.LightComponent;\n\n constructor(private light: Light<PlayCanvasGraphicsAdapter>) {\n super(light);\n this.createLight();\n }\n\n private createLight() {\n const lightEntity = this.light.getContainer() as playcanvas.Entity;\n if (this.lightComponent) {\n lightEntity.removeComponent(\"light\");\n }\n\n const { r, g, b } = this.light.props.color;\n\n if (this.light.props.type === \"spotlight\") {\n this.lightComponent = lightEntity.addComponent(\"light\", {\n type: \"spot\",\n luminance: this.light.props.intensity * lightLuminanceFactor,\n intensity: this.light.props.intensity * lightIntensityFactor,\n castShadows: this.light.props.castShadows,\n color: new playcanvas.Color(r, g, b),\n shadowBias: 0.001,\n normalOffsetBias: 0.001,\n shape: playcanvas.LIGHTSHAPE_DISK,\n innerConeAngle: this.light.props.angleDeg,\n outerConeAngle: this.light.props.angleDeg,\n range: this.light.props.distance ?? 100,\n falloffMode: playcanvas.LIGHTFALLOFF_INVERSESQUARED,\n enabled: this.light.props.enabled,\n } as playcanvas.LightComponent) as playcanvas.LightComponent;\n } else {\n this.lightComponent = lightEntity.addComponent(\"light\", {\n type: \"point\",\n luminance: this.light.props.intensity * lightLuminanceFactor,\n intensity: this.light.props.intensity * lightIntensityFactor,\n castShadows: this.light.props.castShadows,\n color: new playcanvas.Color(r, g, b),\n shadowBias: 0.001,\n normalOffsetBias: 0.001,\n range: this.light.props.distance ?? 100,\n falloffMode: playcanvas.LIGHTFALLOFF_INVERSESQUARED,\n enabled: this.light.props.enabled,\n } as playcanvas.LightComponent) as playcanvas.LightComponent;\n }\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setEnabled(enabled: boolean): void {\n this.lightComponent.enabled = enabled;\n }\n\n setCastShadows(castShadows: boolean) {\n this.lightComponent.castShadows = castShadows;\n this.lightComponent.refreshProperties();\n }\n\n setAngle(angle: number) {\n if (this.lightComponent.type !== \"spot\") {\n return;\n }\n this.lightComponent.innerConeAngle = angle;\n this.lightComponent.outerConeAngle = angle;\n this.lightComponent.refreshProperties();\n }\n\n setIntensity(intensity: number) {\n this.lightComponent.luminance = intensity * lightLuminanceFactor;\n this.lightComponent.intensity = intensity * lightIntensityFactor;\n this.lightComponent.refreshProperties();\n }\n\n setDistance(distance: number | null) {\n this.lightComponent.range = distance ?? 100;\n this.lightComponent.refreshProperties();\n }\n\n setType(): void {\n this.createLight();\n }\n\n setDebug(): void {\n // TODO\n }\n\n setColor(color: MMLColor): void {\n this.lightComponent.color.set(color.r, color.g, color.b);\n this.lightComponent.refreshProperties();\n }\n\n dispose() {\n const lightEntity = this.light.getContainer() as playcanvas.Entity;\n lightEntity.removeComponent(\"light\");\n }\n}\n", "import { Link } from \"@mml-io/mml-web\";\nimport { LinkGraphics } from \"@mml-io/mml-web\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasLink extends LinkGraphics<PlayCanvasGraphicsAdapter> {\n constructor(private link: Link<PlayCanvasGraphicsAdapter>) {\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 playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasMElement extends MElementGraphics<PlayCanvasGraphicsAdapter> {\n protected container: playcanvas.Entity;\n private currentParentContainer: playcanvas.Entity | null = null;\n\n constructor(private element: MElement<PlayCanvasGraphicsAdapter>) {\n super(element);\n this.container = new playcanvas.Entity(\n element.constructor.name,\n element.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\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.addChild(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.addChild(this.container);\n }\n\n public getContainer(): playcanvas.Entity {\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.removeChild(this.container);\n this.currentParentContainer = null;\n\n this.container.destroy();\n }\n}\n", "import {\n IVect3,\n LoadingInstanceManager,\n MElement,\n Model,\n ModelGraphics,\n TransformableElement,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { createPlayCanvasDebugBoundingBox } from \"../debug-bounding-box/PlayCanvasDebugBoundingBox\";\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\ntype PlayCanvasModelLoadState = {\n renderEntity: playcanvas.Entity;\n boundingBox: playcanvas.BoundingBox;\n collisionWorldScale: IVect3;\n bones: Map<string, playcanvas.GraphNode>;\n};\n\ntype PlayCanvasAnimLoadState = {\n animAsset: playcanvas.Asset;\n animComponent: playcanvas.AnimComponent | null;\n};\n\nexport class PlayCanvasModel extends ModelGraphics<PlayCanvasGraphicsAdapter> {\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Model.tagName}.src`);\n private animLoadingInstanceManager = new LoadingInstanceManager(`${Model.tagName}.anim`);\n private latestSrcModelPromise: Promise<playcanvas.Asset> | null = null;\n\n private debugMaterial: playcanvas.BasicMaterial | null = null;\n\n private latestAnimPromise: Promise<playcanvas.Asset> | null = null;\n private documentTimeTickListener: null | { remove: () => void } = null;\n\n private attachments = new Map<\n Model<PlayCanvasGraphicsAdapter>,\n {\n animComponent: playcanvas.AnimComponent;\n } | null\n >();\n private registeredParentAttachment: Model<PlayCanvasGraphicsAdapter> | null = null;\n\n private socketChildrenByBone = new Map<string, Set<MElement<PlayCanvasGraphicsAdapter>>>();\n\n private debugBoundingBox: playcanvas.Entity | null = null;\n\n protected loadedState: PlayCanvasModelLoadState | null = null;\n protected animState: PlayCanvasAnimLoadState | null = null;\n\n constructor(\n private model: Model<PlayCanvasGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(model, updateMeshCallback);\n }\n\n private getPlayCanvasApp(): playcanvas.AppBase {\n return this.model.getScene().getGraphicsAdapter().getPlayCanvasApp();\n }\n\n hasLoadedModel(): boolean {\n return !!this.loadedState?.renderEntity;\n }\n\n hasLoadedAnimation(): boolean {\n return !!this.animState?.animAsset;\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.model.getContainer();\n }\n\n setDebug(): void {\n this.updateDebugVisualisation();\n }\n\n setCastShadows(): void {\n // TODO\n }\n\n public registerAttachment(attachment: Model<PlayCanvasGraphicsAdapter>) {\n let animState = null;\n if (this.animState) {\n const attachmentLoadedState = (attachment.modelGraphics as PlayCanvasModel).loadedState;\n if (!attachmentLoadedState) {\n throw new Error(\"Attachment must be loaded before registering\");\n }\n const playcanvasEntity = attachmentLoadedState.renderEntity;\n const animComponent = playcanvasEntity.addComponent(\"anim\", {}) as playcanvas.AnimComponent;\n animComponent.assignAnimation(\"SingleAnimation\", this.animState.animAsset.resource);\n animState = {\n animComponent,\n };\n }\n this.attachments.set(attachment, animState);\n }\n\n public unregisterAttachment(attachment: Model<PlayCanvasGraphicsAdapter>) {\n const animState = this.attachments.get(attachment);\n if (animState) {\n animState.animComponent.reset();\n animState.animComponent.unbind();\n animState.animComponent.entity.removeComponent(\"anim\");\n }\n this.attachments.delete(attachment);\n }\n\n getBoundingBox(): { centerOffset: IVect3; size: IVect3 } | null {\n if (this.loadedState) {\n return {\n centerOffset: this.loadedState.boundingBox.center,\n size: this.loadedState.boundingBox.halfExtents,\n };\n }\n return null;\n }\n\n setAnim(anim: string): void {\n if (this.animState) {\n if (this.animState.animComponent) {\n this.animState.animComponent.reset();\n this.animState.animComponent.unbind();\n this.animState.animComponent.entity.removeComponent(\"anim\");\n }\n this.animState = null;\n // TODO - clear up the asset?\n for (const [attachment, animState] of this.attachments) {\n if (animState) {\n animState.animComponent.reset();\n animState.animComponent.unbind();\n animState.animComponent.entity.removeComponent(\"anim\");\n }\n this.attachments.set(attachment, null);\n }\n }\n if (!anim) {\n this.latestAnimPromise = null;\n // If the animation is removed then the model can be added to the parent attachment if the model is loaded\n if (this.loadedState && !this.registeredParentAttachment) {\n const parent = this.model.parentElement;\n if (parent instanceof Model) {\n this.registeredParentAttachment = parent;\n (parent.modelGraphics as PlayCanvasModel).registerAttachment(this.model);\n }\n }\n return;\n }\n const animSrc = this.model.contentSrcToContentAddress(anim);\n const animPromise = this.asyncLoadAnimAsset(animSrc, (loaded, total) => {\n this.animLoadingInstanceManager.setProgress(loaded / total);\n });\n this.animLoadingInstanceManager.start(this.model.getLoadingProgressManager(), anim);\n this.latestAnimPromise = animPromise;\n animPromise\n .then((asset) => {\n if (this.latestAnimPromise !== animPromise || !this.model.isConnected) {\n // TODO\n // If we've loaded a different model since, or we're no longer connected, dispose of this one\n // PlayCanvasModel.disposeOfGroup(result.group);\n return;\n }\n this.latestAnimPromise = null;\n this.animState = {\n animAsset: asset,\n animComponent: null,\n };\n // Play the animation\n this.connectAnimationToModel();\n\n for (const [attachment] of this.attachments) {\n const playcanvasEntity = attachment.getContainer() as playcanvas.Entity;\n const animComponent = playcanvasEntity.addComponent(\n \"anim\",\n {},\n ) as playcanvas.AnimComponent;\n animComponent.assignAnimation(\"SingleAnimation\", this.animState.animAsset.resource);\n const animState = {\n animComponent,\n };\n this.attachments.set(attachment, animState);\n }\n\n if (!this.documentTimeTickListener) {\n this.documentTimeTickListener = this.model.addDocumentTimeTickListener(\n (documentTime: number) => {\n this.updateAnimation(documentTime);\n },\n );\n }\n this.animLoadingInstanceManager.finish();\n })\n .catch((err) => {\n console.error(\"Error loading m-model.anim\", err);\n this.animLoadingInstanceManager.error(err);\n });\n }\n\n private connectAnimationToModel() {\n if (this.animState && this.loadedState) {\n const playcanvasEntity = this.loadedState.renderEntity;\n const animComponent = playcanvasEntity.addComponent(\"anim\", {}) as playcanvas.AnimComponent;\n animComponent.assignAnimation(\"SingleAnimation\", this.animState.animAsset.resource);\n this.animState.animComponent = animComponent;\n }\n }\n\n public registerSocketChild(\n child: TransformableElement<PlayCanvasGraphicsAdapter>,\n socketName: string,\n ): void {\n let children = this.socketChildrenByBone.get(socketName);\n if (!children) {\n children = new Set<MElement<PlayCanvasGraphicsAdapter>>();\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.addChild(child.getContainer());\n } else {\n this.model.getContainer().addChild(child.getContainer());\n }\n }\n }\n\n public unregisterSocketChild(\n child: TransformableElement<PlayCanvasGraphicsAdapter>,\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().addChild(child.getContainer());\n }\n if (socketChildren.size === 0) {\n this.socketChildrenByBone.delete(socketName);\n }\n }\n }\n\n public setAnimEnabled(): void {\n // no-op\n }\n\n public setAnimLoop(): void {\n // no-op\n }\n\n public setAnimStartTime(): void {\n // no-op\n }\n\n public setAnimPauseTime(): void {\n // no-op\n }\n\n public transformed(): void {\n /*\n TODO - this hack is necessary to allow scaling of collision models in\n playcanvas. The meshes are cached by id (and potentially shared between\n entities). The scale changing does not cause a cache miss, so the cached\n mesh is used with the wrong scale. This is a workaround to clear the cache.\n */\n const scale = this.loadedState?.renderEntity.getWorldTransform().getScale();\n if (scale && this.loadedState) {\n if (\n Math.abs(this.loadedState.collisionWorldScale.x - scale.x) > 0.001 ||\n Math.abs(this.loadedState.collisionWorldScale.y - scale.y) > 0.001 ||\n Math.abs(this.loadedState.collisionWorldScale.z - scale.z) > 0.001\n ) {\n this.loadedState.collisionWorldScale = { x: scale.x, y: scale.y, z: scale.z };\n\n const collisionComponent = this.loadedState.renderEntity.collision;\n if (collisionComponent) {\n for (const mesh of collisionComponent.data.render.meshes) {\n // @ts-expect-error - accessing _triMeshCache private property\n const triMesh = collisionComponent.system._triMeshCache[mesh.id];\n if (triMesh) {\n // @ts-expect-error - accessing untyped Ammo global\n window.Ammo.destroy(triMesh);\n // @ts-expect-error - accessing _triMeshCache private property\n delete collisionComponent.system._triMeshCache[mesh.id];\n }\n }\n // @ts-expect-error - accessing onSetModel private method\n collisionComponent.onSetModel();\n }\n }\n }\n }\n\n setSrc(src: string): void {\n const playcanvasEntity = this.model.getContainer() as playcanvas.Entity;\n if (this.loadedState !== null) {\n this.loadedState.renderEntity.remove();\n this.loadedState = null;\n if (this.animState) {\n this.animState.animComponent = null;\n }\n if (this.registeredParentAttachment) {\n (this.registeredParentAttachment.modelGraphics as PlayCanvasModel).unregisterAttachment(\n this.model,\n );\n this.registeredParentAttachment = null;\n }\n this.updateMeshCallback();\n this.updateDebugVisualisation();\n }\n if (!src) {\n this.srcLoadingInstanceManager.abortIfLoading();\n this.socketChildrenByBone.forEach((children) => {\n children.forEach((child) => {\n this.model.getContainer().addChild(child.getContainer());\n });\n });\n this.updateMeshCallback();\n this.updateDebugVisualisation();\n return;\n }\n\n const contentSrc = this.model.contentSrcToContentAddress(src);\n const srcModelPromise = this.asyncLoadSourceAsset(contentSrc, (loaded, total) => {\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n });\n this.srcLoadingInstanceManager.start(this.model.getLoadingProgressManager(), contentSrc);\n this.latestSrcModelPromise = srcModelPromise;\n srcModelPromise\n .then((asset) => {\n if (this.latestSrcModelPromise !== srcModelPromise || !this.model.isConnected) {\n // If we've loaded a different model since, or we're no longer connected, dispose of this one\n // PlayCanvasModel.disposeOfGroup(result.group);\n return;\n }\n this.latestSrcModelPromise = null;\n const renderEntity: playcanvas.Entity = asset.resource.instantiateRenderEntity();\n\n let boundingBox: playcanvas.BoundingBox | null = null;\n const renders = renderEntity.findComponents(\"render\") as Array<playcanvas.RenderComponent>;\n for (const render of renders) {\n for (const meshInstance of render.meshInstances) {\n if (boundingBox) {\n boundingBox.add(meshInstance.aabb);\n } else {\n boundingBox = meshInstance.aabb.clone();\n }\n }\n render.entity.addComponent(\"collision\", {\n type: \"mesh\",\n renderAsset: render.asset,\n });\n }\n if (!boundingBox) {\n boundingBox = new playcanvas.BoundingBox(\n new playcanvas.Vec3(0, 0, 0),\n new playcanvas.Vec3(0, 0, 0),\n );\n }\n boundingBox.halfExtents.mulScalar(2);\n\n const bones = new Map<string, playcanvas.GraphNode>();\n renderEntity.forEach((node) => {\n bones.set(node.name, node);\n });\n\n this.loadedState = {\n renderEntity,\n boundingBox,\n collisionWorldScale: { x: 1, y: 1, z: 1 },\n bones,\n };\n\n playcanvasEntity.addChild(renderEntity);\n\n this.transformed();\n\n for (const [boneName, children] of this.socketChildrenByBone) {\n const bone = bones.get(boneName);\n if (bone) {\n children.forEach((child) => {\n bone.addChild(child.getContainer());\n });\n }\n }\n\n this.connectAnimationToModel();\n this.updateMeshCallback();\n\n const parent = this.model.parentElement;\n if (parent instanceof Model) {\n if (!this.latestAnimPromise && !this.animState) {\n this.registeredParentAttachment = parent;\n (parent.modelGraphics as PlayCanvasModel).registerAttachment(this.model);\n }\n }\n\n this.srcLoadingInstanceManager.finish();\n\n this.updateDebugVisualisation();\n })\n .catch((err) => {\n console.error(\"Error loading m-model.src\", err);\n this.srcLoadingInstanceManager.error(err);\n });\n }\n\n private updateDebugVisualisation() {\n if (!this.model.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (!this.debugBoundingBox) {\n const graphicsAdapter = this.model.getScene().getGraphicsAdapter();\n if (!this.debugMaterial) {\n this.debugMaterial = new playcanvas.BasicMaterial();\n this.debugMaterial.color = new playcanvas.Color(1, 0, 0);\n }\n this.debugBoundingBox = createPlayCanvasDebugBoundingBox(\n graphicsAdapter,\n this.debugMaterial,\n );\n this.model.getContainer().addChild(this.debugBoundingBox);\n }\n if (this.loadedState) {\n const boundingBox = this.loadedState.boundingBox;\n this.debugBoundingBox.setLocalPosition(boundingBox.center);\n this.debugBoundingBox.setLocalScale(boundingBox.halfExtents);\n } else {\n this.debugBoundingBox.setLocalScale(0, 0, 0);\n }\n }\n }\n\n private clearDebugVisualisation() {\n if (this.debugBoundingBox) {\n this.debugBoundingBox.remove();\n this.debugBoundingBox = null;\n }\n if (this.debugMaterial) {\n this.debugMaterial.destroy();\n this.debugMaterial = null;\n }\n }\n\n async asyncLoadSourceAsset(\n url: string,\n // TODO - report progress\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onProgress: (loaded: number, total: number) => void,\n ): Promise<playcanvas.Asset> {\n return new Promise<playcanvas.Asset>((resolve, reject) => {\n /*\n Rewriting the url with an unused-for-networking fragment here causes the\n asset to be loaded uniquely across elements which allows the meshes to\n be independent and avoid a reuse of a (mis-)scaled mesh for collisions.\n */\n const rewrittenUrl = new URL(url);\n rewrittenUrl.hash = Math.random().toString(10);\n const asset = new playcanvas.Asset(url, \"container\", { url: rewrittenUrl.toString() });\n this.getPlayCanvasApp().assets.add(asset);\n this.getPlayCanvasApp().assets.load(asset);\n asset.ready((asset) => {\n resolve(asset);\n });\n asset.on(\"error\", (err) => {\n reject(err);\n });\n });\n }\n\n async asyncLoadAnimAsset(\n url: string,\n // TODO - report progress\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onProgress: (loaded: number, total: number) => void,\n ): Promise<playcanvas.Asset> {\n return new Promise<playcanvas.Asset>((resolve, reject) => {\n const asset = new playcanvas.Asset(url, \"animation\", { url });\n this.getPlayCanvasApp().assets.add(asset);\n this.getPlayCanvasApp().assets.load(asset);\n asset.ready((asset) => {\n resolve(asset);\n });\n asset.on(\"error\", (err) => {\n reject(err);\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 PlayCanvasModel)?.unregisterAttachment(\n this.model,\n );\n this.registeredParentAttachment = null;\n }\n if (this.loadedState) {\n this.loadedState.renderEntity.destroy();\n this.loadedState = null;\n }\n this.clearDebugVisualisation();\n this.animLoadingInstanceManager.dispose();\n this.srcLoadingInstanceManager.dispose();\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 (child instanceof TransformableElement) {\n child.didUpdateTransformation();\n }\n });\n });\n }\n\n private updateAnimation(docTimeMs: number) {\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 animComponent = this.animState?.animComponent;\n if (animComponent) {\n if (!this.model.props.animEnabled) {\n animComponent.playing = false;\n this.triggerSocketedChildrenTransformed();\n } else {\n animComponent.playing = true;\n // @ts-expect-error - accessing _controller private property\n const clip = animComponent.baseLayer._controller._animEvaluator.clips[0];\n if (clip) {\n clip.time = animationTimeMs / 1000;\n }\n }\n }\n\n for (const [model, animState] of this.attachments) {\n if (animState) {\n animState.animComponent.playing = this.model.props.animEnabled;\n // @ts-expect-error - accessing _controller private property\n const clip = animState.animComponent.baseLayer._controller._animEvaluator.clips[0];\n if (clip) {\n clip.time = animationTimeMs / 1000;\n (model.modelGraphics as PlayCanvasModel).triggerSocketedChildrenTransformed();\n }\n }\n }\n this.triggerSocketedChildrenTransformed();\n }\n}\n", "import { MELEMENT_PROPERTY_NAME, MPlaneProps, Plane } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport { PlaneGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasPlane extends PlaneGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity;\n private renderComponent: playcanvas.RenderComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n\n constructor(private plane: Plane<PlayCanvasGraphicsAdapter>) {\n super(plane);\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"plane-internal\",\n plane.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = plane;\n this.renderComponent = this.entity.addComponent(\"render\", {\n type: \"plane\",\n material: this.material,\n }) as playcanvas.RenderComponent;\n this.entity.rotate(90, 0, 0);\n this.entity.addComponent(\"collision\", {\n type: \"box\",\n halfExtents: new playcanvas.Vec3(0.5, 0, 0.5),\n });\n plane.getContainer().addChild(this.entity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n setColor(color: MMLColor): void {\n this.material.diffuse.set(color.r, color.g, color.b);\n this.material.update();\n }\n\n private updateSize(mPlaneProps: MPlaneProps): void {\n this.entity.setLocalScale(mPlaneProps.width, 1, mPlaneProps.height);\n if (this.entity.collision) {\n this.entity.collision.halfExtents.set(mPlaneProps.width / 2, 0, mPlaneProps.height / 2);\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n }\n\n setWidth(width: number, mPlaneProps: MPlaneProps): void {\n this.updateSize(mPlaneProps);\n }\n\n setHeight(height: number, mPlaneProps: MPlaneProps): void {\n this.updateSize(mPlaneProps);\n }\n\n setCastShadows(castShadows: boolean): void {\n // TODO - not casting shadows?\n this.renderComponent.castShadows = castShadows;\n }\n\n setOpacity(opacity: number): void {\n if (opacity === 1) {\n this.material.blendType = playcanvas.BLEND_NONE;\n } else {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n }\n this.material.opacity = opacity;\n this.material.update();\n }\n\n dispose() {\n this.entity.destroy();\n }\n}\n", "import { PositionProbe } from \"@mml-io/mml-web\";\nimport { PositionProbeGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasPositionProbe extends PositionProbeGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity | null = null;\n private debugMaterial: playcanvas.BasicMaterial | null = null;\n\n constructor(private positionProbe: PositionProbe<PlayCanvasGraphicsAdapter>) {\n super(positionProbe);\n this.updateDebugVisualisation();\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.entity) {\n this.entity.destroy();\n this.entity = null;\n }\n if (this.debugMaterial) {\n this.debugMaterial.destroy();\n this.debugMaterial = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.positionProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.positionProbe.isConnected && !this.entity) {\n this.entity = new playcanvas.Entity(\n \"position-probe-internal\",\n this.positionProbe.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n if (!this.debugMaterial) {\n this.debugMaterial = new playcanvas.BasicMaterial();\n this.debugMaterial.color = new playcanvas.Color(0, 1, 0);\n }\n this.entity.addComponent(\"model\", {\n type: \"sphere\",\n material: this.debugMaterial,\n });\n this.entity.model?.model.meshInstances.forEach((mi) => {\n mi.renderStyle = playcanvas.RENDERSTYLE_WIREFRAME;\n mi.castShadow = false;\n });\n\n this.positionProbe.getContainer().addChild(this.entity);\n }\n\n if (this.entity) {\n this.entity.setLocalScale(\n this.positionProbe.props.range * 2,\n this.positionProbe.props.range * 2,\n this.positionProbe.props.range * 2,\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 { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasPrompt extends PromptGraphics<PlayCanvasGraphicsAdapter> {\n constructor(private prompt: Prompt<PlayCanvasGraphicsAdapter>) {\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 playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\nimport { getPlayCanvasReconnectingStatus } from \"../PlayCanvasReconnectingStatus\";\n\nexport class PlayCanvasRemoteDocument extends RemoteDocumentGraphics<PlayCanvasGraphicsAdapter> {\n private statusUI: playcanvas.Entity | null = null;\n\n constructor(private element: RemoteDocument<PlayCanvasGraphicsAdapter>) {\n super(element);\n }\n\n public showError(showError: boolean): void {\n if (!showError) {\n if (this.statusUI !== null) {\n this.element.getContainer().removeChild(this.statusUI);\n this.statusUI = null;\n }\n } else {\n if (this.statusUI === null) {\n const playCanvasApp = this.element.getScene().getGraphicsAdapter().getPlayCanvasApp();\n this.statusUI = new playcanvas.Entity(\"label-internal\", playCanvasApp);\n this.statusUI.rotate(90, 0, 0);\n\n const { material, width, height } = getPlayCanvasReconnectingStatus(playCanvasApp);\n\n this.statusUI.addComponent(\"render\", {\n type: \"plane\",\n material,\n }) as playcanvas.RenderComponent;\n\n this.statusUI.setLocalScale(width, 1, height);\n\n this.statusUI.setPosition(0, height / 2, 0);\n this.element.getContainer().addChild(this.statusUI);\n }\n }\n }\n\n public dispose() {}\n}\n", "import { CanvasText } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nfunction createReconnectingStatus(playCanvasApp: playcanvas.AppBase): PlayCanvasReconnectingStatus {\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 playcanvas.Texture(playCanvasApp.graphicsDevice, {\n width: canvas.width,\n height: canvas.height,\n });\n texture.setSource(canvas);\n\n const material = new playcanvas.StandardMaterial();\n material.useLighting = false;\n material.emissiveMap = texture;\n material.update();\n\n texture.destroy();\n\n const width = canvas.width;\n const height = canvas.height;\n\n return { material, width: width / 100, height: height / 100 };\n}\n\nexport type PlayCanvasReconnectingStatus = {\n material: playcanvas.StandardMaterial;\n width: number;\n height: number;\n};\n\nlet reconnectingStatus: PlayCanvasReconnectingStatus | null = null;\n\nexport function getPlayCanvasReconnectingStatus(\n playCanvasApp: playcanvas.AppBase,\n): PlayCanvasReconnectingStatus {\n if (!reconnectingStatus) {\n reconnectingStatus = createReconnectingStatus(playCanvasApp);\n }\n return reconnectingStatus;\n}\n", "import { MELEMENT_PROPERTY_NAME, MSphereProps, Sphere } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport { SphereGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasSphere extends SphereGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity;\n private renderComponent: playcanvas.RenderComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n\n constructor(private sphere: Sphere<PlayCanvasGraphicsAdapter>) {\n super(sphere);\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"sphere-internal\",\n sphere.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = sphere;\n this.renderComponent = this.entity.addComponent(\"render\", {\n type: \"sphere\",\n material: this.material,\n }) as playcanvas.RenderComponent;\n this.entity.addComponent(\"collision\", {\n type: \"sphere\",\n });\n if (this.entity.collision) {\n this.entity.collision.radius = 1;\n }\n sphere.getContainer().addChild(this.entity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n setColor(color: MMLColor): void {\n this.material.diffuse.set(color.r, color.g, color.b);\n this.material.metalness = 0;\n this.material.useMetalness = true;\n this.material.update();\n }\n\n private updateSize(mSphereProps: MSphereProps): void {\n this.entity.setLocalScale(\n mSphereProps.radius * 2,\n mSphereProps.radius * 2,\n mSphereProps.radius * 2,\n );\n if (this.entity.collision) {\n this.entity.collision.radius = mSphereProps.radius;\n // @ts-expect-error - accessing onSetRadius private method\n this.entity.collision.onSetRadius();\n }\n }\n\n setRadius(radius: number, mSphereProps: MSphereProps): void {\n this.updateSize(mSphereProps);\n }\n\n setCastShadows(castShadows: boolean): void {\n this.renderComponent.castShadows = castShadows;\n }\n\n setOpacity(opacity: number): void {\n if (opacity === 1) {\n this.material.blendType = playcanvas.BLEND_NONE;\n } else {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n }\n this.material.opacity = opacity;\n this.material.update();\n }\n\n dispose() {\n this.entity.destroy();\n }\n}\n", "import {\n Matr4,\n Model,\n TransformableElement,\n TransformableElementProps,\n TransformableGraphics,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\nimport { PlayCanvasModel } from \"./PlayCanvasModel\";\n\nconst halfToRad = 0.5 * playcanvas.math.DEG_TO_RAD;\n\n// An implementation of XYZ ordered Euler angles in degrees to quaternion\nfunction xyzDegreesToQuaternion(x: number, y: number, z: number): [number, number, number, number] {\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n const cx = Math.cos(x);\n const cy = Math.cos(y);\n const cz = Math.cos(z);\n\n const sx = Math.sin(x);\n const sy = Math.sin(y);\n const sz = Math.sin(z);\n\n return [\n sx * cy * cz + cx * sy * sz, // x\n cx * sy * cz - sx * cy * sz, // y\n cx * cy * sz + sx * sy * cz, // z\n cx * cy * cz - sx * sy * sz, // w\n ];\n}\n\nexport class PlayCanvasTransformable extends TransformableGraphics<PlayCanvasGraphicsAdapter> {\n private socketName: string | null = null;\n private registeredSocketParent: PlayCanvasModel | null = null;\n\n constructor(private transformableElement: TransformableElement<PlayCanvasGraphicsAdapter>) {\n super(transformableElement);\n }\n\n getWorldMatrix(): Matr4 {\n return new Matr4(this.getPlayCanvasEntity().getWorldTransform().data);\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<PlayCanvasGraphicsAdapter> | undefined)\n ?.isModel\n ) {\n const parentModel = this.transformableElement\n .parentElement as Model<PlayCanvasGraphicsAdapter>;\n this.registeredSocketParent = parentModel.modelGraphics as PlayCanvasModel;\n this.registeredSocketParent.registerSocketChild(this.transformableElement, socketName);\n }\n }\n\n setVisible(visible: boolean): void {\n this.getPlayCanvasEntity().enabled = visible;\n }\n\n private updatePosition(x: number, y: number, z: number): void {\n this.getPlayCanvasEntity().setLocalPosition(x, y, z);\n }\n\n setX(x: number, transformableElementProps: TransformableElementProps): void {\n this.updatePosition(\n transformableElementProps.x,\n transformableElementProps.y,\n transformableElementProps.z,\n );\n }\n\n setY(y: number, transformableElementProps: TransformableElementProps): void {\n this.updatePosition(\n transformableElementProps.x,\n transformableElementProps.y,\n transformableElementProps.z,\n );\n }\n\n setZ(z: number, transformableElementProps: TransformableElementProps): void {\n this.updatePosition(\n transformableElementProps.x,\n transformableElementProps.y,\n transformableElementProps.z,\n );\n }\n\n private getPlayCanvasEntity(): playcanvas.Entity {\n return this.transformableElement.getContainer() as playcanvas.Entity;\n }\n\n private updateRotation(rx: number, ry: number, rz: number): void {\n this.getPlayCanvasEntity().setLocalRotation(...xyzDegreesToQuaternion(rx, ry, rz));\n }\n\n setRotationX(rotationX: number, transformableElementProps: TransformableElementProps): void {\n this.updateRotation(\n transformableElementProps.rx,\n transformableElementProps.ry,\n transformableElementProps.rz,\n );\n }\n\n setRotationY(rotationY: number, transformableElementProps: TransformableElementProps): void {\n this.updateRotation(\n transformableElementProps.rx,\n transformableElementProps.ry,\n transformableElementProps.rz,\n );\n }\n\n setRotationZ(rotationZ: number, transformableElementProps: TransformableElementProps): void {\n this.updateRotation(\n transformableElementProps.rx,\n transformableElementProps.ry,\n transformableElementProps.rz,\n );\n }\n\n private updateScale(sx: number, sy: number, sz: number): void {\n this.getPlayCanvasEntity().setLocalScale(sx, sy, sz);\n }\n\n setScaleX(scaleX: number, transformableElementProps: TransformableElementProps): void {\n this.updateScale(\n transformableElementProps.sx,\n transformableElementProps.sy,\n transformableElementProps.sz,\n );\n }\n\n setScaleY(scaleY: number, transformableElementProps: TransformableElementProps): void {\n this.updateScale(\n transformableElementProps.sx,\n transformableElementProps.sy,\n transformableElementProps.sz,\n );\n }\n\n setScaleZ(scaleZ: number, transformableElementProps: TransformableElementProps): void {\n this.updateScale(\n transformableElementProps.sx,\n transformableElementProps.sy,\n transformableElementProps.sz,\n );\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 EventHandlerCollection,\n MELEMENT_PROPERTY_NAME,\n StaticFileVideoSource,\n Video,\n VideoGraphics,\n VideoSource,\n WHEPVideoSource,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { createPlaneModel } from \"../plane/plane\";\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nconst audioRefDistance = 1;\nconst audioRolloffFactor = 1;\n\nexport class PlayCanvasVideo extends VideoGraphics<PlayCanvasGraphicsAdapter> {\n private videoSource: VideoSource | null = null;\n private videoMaterial: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n private disabledVideoMaterial = new playcanvas.StandardMaterial();\n\n private entity: playcanvas.Entity;\n private modelComponent: playcanvas.ModelComponent;\n private meshInstance: playcanvas.MeshInstance;\n\n private loadedVideoState: {\n video: HTMLVideoElement;\n videoLoadEventCollection: EventHandlerCollection;\n videoTexture: playcanvas.Texture | null;\n audio: {\n gainNode: GainNode;\n audioNode: AudioNode;\n panner: PannerNode;\n } | null;\n } | null = null;\n private documentTimeTickListener: { remove: () => void };\n\n private eventCollection = new EventHandlerCollection();\n\n constructor(\n private video: Video<PlayCanvasGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(video, updateMeshCallback);\n this.disabledVideoMaterial.diffuse = new playcanvas.Color(0, 0, 0);\n\n this.documentTimeTickListener = this.video.addDocumentTimeTickListener(() => {\n this.tick();\n });\n\n this.eventCollection.add(this.getAudioContext(), \"statechange\", () => {\n this.syncVideoTime();\n });\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"video-internal\",\n video.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = video;\n\n const { model, meshInstance } = createPlaneModel(\n this.video.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n this.disabledVideoMaterial,\n );\n this.modelComponent = this.entity.addComponent(\"model\", {}) as playcanvas.ModelComponent;\n this.modelComponent.model = model;\n this.meshInstance = meshInstance;\n\n this.entity.addComponent(\"collision\", {\n type: \"box\",\n halfExtents: new playcanvas.Vec3(0.5, 0, 0.5),\n });\n video.getContainer().addChild(this.entity);\n }\n\n private getPlayCanvasApp(): playcanvas.AppBase {\n return this.video.getScene().getGraphicsAdapter().getPlayCanvasApp();\n }\n\n getWidthAndHeight(): { width: number; height: number } {\n return {\n width: this.entity.getLocalScale().x,\n height: this.entity.getLocalScale().y,\n };\n }\n\n private getAudioContext(): AudioContext {\n const playcanvasApp = this.getPlayCanvasApp();\n const soundSystem = playcanvasApp.systems.sound;\n if (!soundSystem) {\n throw new Error(\"Playcanvas sound system not enabled\");\n }\n return soundSystem.context;\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 audioContext = this.getAudioContext();\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 public enable(): void {\n this.updateVideo();\n }\n\n public disable(): void {\n this.updateVideo();\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?.audio) {\n this.loadedVideoState.audio.gainNode.gain.value = this.video.props.volume;\n }\n }\n\n public setEmissive(): void {\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 const videoLoadEventCollection = new EventHandlerCollection();\n this.loadedVideoState = {\n video,\n videoLoadEventCollection,\n videoTexture: null,\n audio: null,\n };\n video.loop = this.video.props.loop;\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 videoLoadEventCollection.add(video, \"loadeddata\", () => {\n if (!this.loadedVideoState || this.loadedVideoState.video !== video) {\n // Video was changed before it loaded\n return;\n }\n\n // Create a texture to hold the video frame data\n this.loadedVideoState.videoTexture = new playcanvas.Texture(\n this.getPlayCanvasApp().graphicsDevice,\n {\n format: playcanvas.PIXELFORMAT_R8_G8_B8,\n mipmaps: false,\n width: video.videoWidth,\n height: video.videoHeight,\n },\n );\n this.loadedVideoState.videoTexture.setSource(this.loadedVideoState.video);\n this.videoMaterial.diffuseMap = this.loadedVideoState.videoTexture;\n this.videoMaterial.update();\n this.meshInstance.material = this.videoMaterial;\n this.syncVideoTime();\n this.updateWidthAndHeight();\n this.updateMaterialEmissiveIntensity();\n\n // playcanvas doesn't support positional audio for video elements so use the audio context directly\n const audioContext = this.getAudioContext();\n\n const pos = this.entity.getPosition();\n // TODO - initial orientation\n const orientationX = 1.0;\n const orientationY = 0.0;\n const orientationZ = 0.0;\n\n const panner = new PannerNode(audioContext, {\n panningModel: \"HRTF\",\n distanceModel: \"inverse\",\n positionX: pos.x,\n positionY: pos.y,\n positionZ: pos.z,\n orientationX,\n orientationY,\n orientationZ,\n refDistance: audioRefDistance,\n rolloffFactor: audioRolloffFactor,\n });\n\n const gainNode = audioContext.createGain();\n gainNode.gain.value = this.video.props.volume;\n const stereoPanner = new StereoPannerNode(audioContext, { pan: 0 });\n const audioNode = audioContext.createMediaElementSource(video);\n audioNode\n .connect(gainNode)\n .connect(stereoPanner)\n .connect(panner)\n .connect(audioContext.destination);\n\n this.loadedVideoState.audio = { gainNode, audioNode, panner };\n });\n }\n }\n\n if (this.videoSource) {\n this.syncVideoTime();\n }\n }\n\n private tick() {\n const videoTexture = this.loadedVideoState?.videoTexture;\n if (videoTexture) {\n videoTexture.upload();\n }\n const audio = this.loadedVideoState?.audio;\n if (audio) {\n /// Update the position\n const pos = this.entity.getPosition();\n const rotation = this.entity.getEulerAngles();\n audio.panner.positionX.value = pos.x;\n audio.panner.positionY.value = pos.y;\n audio.panner.positionZ.value = pos.z;\n audio.panner.orientationX.value = Math.cos(rotation.y);\n audio.panner.orientationY.value = 0;\n audio.panner.orientationZ.value = Math.sin(rotation.y);\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 if (this.loadedVideoState.audio) {\n this.loadedVideoState.audio.audioNode.disconnect();\n this.loadedVideoState.audio = null;\n }\n if (this.loadedVideoState.videoTexture) {\n this.loadedVideoState.videoTexture.destroy();\n this.loadedVideoState.videoTexture = null;\n }\n this.loadedVideoState.videoLoadEventCollection.clear();\n this.loadedVideoState = null;\n this.meshInstance.material = this.disabledVideoMaterial;\n this.updateWidthAndHeight();\n }\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.loadedVideoState?.videoTexture && this.video.props.emissive) {\n this.videoMaterial.emissiveMap = this.loadedVideoState.videoTexture;\n this.videoMaterial.emissiveIntensity = this.video.props.emissive;\n } else {\n this.videoMaterial.emissiveMap = null;\n this.videoMaterial.emissiveIntensity = 0;\n }\n this.videoMaterial.update();\n }\n\n dispose() {\n this.clearSource();\n this.documentTimeTickListener.remove();\n this.eventCollection.clear();\n this.entity.destroy();\n }\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n private updateWidthAndHeight() {\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\n this.entity.setLocalScale(width, height, 1);\n if (this.entity.collision) {\n this.entity.collision.halfExtents.set(width / 2, height / 2, 0);\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n\n this.updateMeshCallback();\n }\n}\n", "import { MMLGraphicsInterface } from \"@mml-io/mml-web\";\n\nimport * as PlayCanvasElements from \"./elements\";\nimport { PlayCanvasGraphicsAdapter } from \"./PlayCanvasGraphicsAdapter\";\n\nexport const PlayCanvasGraphicsInterface: MMLGraphicsInterface<PlayCanvasGraphicsAdapter> = {\n MElementGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasMElement(element),\n MMLDebugHelperGraphicsInterface: (debugHelper) =>\n new PlayCanvasElements.PlayCanvasDebugHelper(debugHelper),\n MMLAudioGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasAudio(element),\n MMLChatProbeGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasChatProbe(element),\n MMLCubeGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasCube(element),\n MMLCylinderGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasCylinder(element),\n MMLFrameGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasFrame(element),\n MMLImageGraphicsInterface: (element, updateMeshCallback: () => void) =>\n new PlayCanvasElements.PlayCanvasImage(element, updateMeshCallback),\n MMLInteractionGraphicsInterface: (element) =>\n new PlayCanvasElements.PlayCanvasInteraction(element),\n MMLLabelGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasLabel(element),\n MMLLightGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasLight(element),\n MMLLinkGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasLink(element),\n MMLModelGraphicsInterface: (element, updateMeshCallback: () => void) =>\n new PlayCanvasElements.PlayCanvasModel(element, updateMeshCallback),\n MMLPlaneGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasPlane(element),\n MMLPositionProbeGraphicsInterface: (element) =>\n new PlayCanvasElements.PlayCanvasPositionProbe(element),\n MMLPromptGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasPrompt(element),\n MMLSphereGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasSphere(element),\n MMLTransformableGraphicsInterface: (element) =>\n new PlayCanvasElements.PlayCanvasTransformable(element),\n MMLVideoGraphicsInterface: (element, updateMeshCallback: () => void) =>\n new PlayCanvasElements.PlayCanvasVideo(element, updateMeshCallback),\n RemoteDocumentGraphicsInterface: (element) =>\n new PlayCanvasElements.PlayCanvasRemoteDocument(element),\n};\n", "import { Interaction } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"./PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasInteractionAdapter {\n static interactionShouldShowDistance(\n interaction: Interaction<PlayCanvasGraphicsAdapter>,\n cameraEntity: playcanvas.Entity,\n cameraComponent: playcanvas.CameraComponent,\n app: playcanvas.AppBase,\n ): number | null {\n const worldPos = interaction.getContainer().getPosition();\n\n const cameraPos = cameraEntity.getPosition();\n const distance = cameraPos.distance(worldPos);\n if (distance > interaction.props.range) {\n return null;\n }\n\n if (interaction.props.inFocus) {\n if (!cameraComponent.frustum.containsPoint(worldPos)) {\n return null;\n }\n }\n\n if (interaction.props.lineOfSight) {\n const rigidbodySystem = app.systems.rigidbody;\n if (!rigidbodySystem) {\n console.warn(\"Rigidbody system not found. Line of sight check will not work.\");\n } else {\n const raycastResults = rigidbodySystem.raycastAll(cameraPos, worldPos);\n if (raycastResults.length > 0) {\n for (const result of raycastResults) {\n if (\n !PlayCanvasInteractionAdapter.hasAncestor(result.entity, interaction.getContainer())\n ) {\n return null;\n }\n }\n }\n }\n }\n\n return distance;\n }\n\n static hasAncestor(object: playcanvas.Entity, ancestor: playcanvas.Entity): 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"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n EventHandlerCollection,\n getRelativePositionAndRotationRelativeToObject,\n MElement,\n TransformableElement,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nconst mouseMovePixelsThreshold = 10;\nconst mouseMoveTimeThresholdMilliseconds = 500;\n\n/**\n * The PlayCanvasClickTrigger 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 PlayCanvasClickTrigger {\n private eventHandlerCollection: EventHandlerCollection = new EventHandlerCollection();\n private mouseDownTime: number | null = null;\n private mouseMoveDelta = 0;\n\n static init(\n playcanvasApp: playcanvas.AppBase,\n clickTarget: Document | HTMLElement,\n camera: playcanvas.Entity,\n ): PlayCanvasClickTrigger {\n return new PlayCanvasClickTrigger(playcanvasApp, clickTarget, camera);\n }\n\n private constructor(\n private playcanvasApp: playcanvas.AppBase,\n private clickTarget: Document | HTMLElement,\n private camera: playcanvas.Entity,\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 x = event.offsetX;\n y = event.offsetY;\n }\n\n const cameraEntity = this.camera;\n const from = cameraEntity.getPosition();\n const cameraComponent = cameraEntity.camera;\n if (!cameraComponent) {\n console.warn(\"No camera component found on the camera entity. Cannot raycast.\");\n return;\n }\n\n // The pc.Vec3 to raycast to (the click position projected onto the camera's far clip plane)\n const to = cameraComponent.screenToWorld(x, y, cameraComponent.farClip);\n\n // Raycast between the two points and return the closest hit result\n const rigidbodySystem = this.playcanvasApp.systems.rigidbody;\n if (!rigidbodySystem) {\n console.warn(\"No rigidbody system found in the PlayCanvas app. Cannot raycast.\");\n return;\n }\n const result = rigidbodySystem.raycastFirst(from, to);\n\n // If there was a hit, store the entity\n if (result) {\n const hitEntity = result.entity;\n let mElement;\n for (let entity: playcanvas.GraphNode = hitEntity; entity; entity = entity.parent) {\n mElement = MElement.getMElementFromObject(entity);\n if (mElement) {\n break;\n }\n }\n if (\n mElement &&\n TransformableElement.isTransformableElement(mElement) &&\n mElement.isClickable()\n ) {\n // let's get the intersection point relative to the element origin\n\n const elementRelative = getRelativePositionAndRotationRelativeToObject(\n {\n position: result.point,\n rotation: {\n x: 0,\n y: 0,\n z: 0,\n },\n },\n mElement,\n );\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 dispose() {\n this.eventHandlerCollection.clear();\n }\n}\n", "import { Audio, AudioGraphics, LoadingInstanceManager } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\ntype AudioLoadedState = {\n asset: playcanvas.Asset;\n};\n\nexport class PlayCanvasAudio extends AudioGraphics<PlayCanvasGraphicsAdapter> {\n private soundComponent: playcanvas.SoundComponent;\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Audio.tagName}.src`);\n private latestSrcAudioPromise: Promise<playcanvas.Asset> | null = null;\n protected loadedState: AudioLoadedState | null = null;\n private delayedStartTimer: NodeJS.Timeout | null = null;\n private delayedPauseTimer: NodeJS.Timeout | null = null;\n private static dataAudioFileCount: number = 0;\n\n constructor(private audio: Audio<PlayCanvasGraphicsAdapter>) {\n super(audio);\n const audioEntity = this.audio.getContainer() as playcanvas.Entity;\n this.soundComponent = audioEntity.addComponent(\"sound\", {\n positional: true,\n distanceModel: \"inverse\",\n volume: audio.props.volume,\n } as playcanvas.SoundComponent) as playcanvas.SoundComponent;\n }\n\n private getPlayCanvasApp(): playcanvas.AppBase {\n return this.audio.getScene().getGraphicsAdapter().getPlayCanvasApp();\n }\n\n setSrc(src: string | null): void {\n if (this.loadedState !== null) {\n this.soundComponent.removeSlot(\"slot\");\n this.loadedState.asset.unload();\n this.loadedState = null;\n }\n if (!src) {\n this.srcLoadingInstanceManager.abortIfLoading();\n return;\n }\n\n const contentSrc = this.audio.contentSrcToContentAddress(src);\n const srcAudioPromise = this.asyncLoadSourceAsset(\n contentSrc,\n this.getAudioContext(),\n (loaded, total) => {\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n },\n );\n this.srcLoadingInstanceManager.start(this.audio.getLoadingProgressManager(), contentSrc);\n this.latestSrcAudioPromise = srcAudioPromise;\n srcAudioPromise\n .then((asset) => {\n if (this.latestSrcAudioPromise !== srcAudioPromise || !this.audio.isConnected) {\n // TODO - dispose?\n // If we've loaded a different audio since, or we're no longer connected, dispose of this one\n return;\n }\n this.latestSrcAudioPromise = null;\n this.loadedState = {\n asset,\n };\n\n const sound = asset;\n this.soundComponent.addSlot(\"slot\", {\n volume: 1,\n pitch: 1,\n asset: sound.id,\n loop: true,\n overlap: false,\n autoPlay: false,\n });\n\n const slot = this.soundComponent.slot(\"slot\");\n if (slot) {\n slot.stop();\n slot.overlap = false;\n this.syncAudioTime();\n }\n\n this.srcLoadingInstanceManager.finish();\n })\n .catch((err) => {\n console.error(\"Error loading m-audio.src\", err);\n this.srcLoadingInstanceManager.error(err);\n });\n }\n\n public setStartTime(): void {\n this.syncAudioTime();\n }\n\n public setPauseTime(): void {\n this.syncAudioTime();\n }\n\n public setLoopDuration(): void {\n this.syncAudioTime();\n }\n\n public syncAudioTime(): void {\n if (this.delayedStartTimer) {\n clearTimeout(this.delayedStartTimer);\n this.delayedStartTimer = null;\n }\n if (this.delayedPauseTimer !== null) {\n clearTimeout(this.delayedPauseTimer);\n this.delayedPauseTimer = null;\n }\n\n if (!this.audio.props.src) {\n return;\n }\n\n const slot = this.soundComponent.slot(\"slot\");\n if (slot) {\n if (!this.audio.props.enabled || this.audio.isDisabled()) {\n slot.stop();\n return;\n }\n\n if (slot.loop !== this.audio.props.loop) {\n slot.loop = this.audio.props.loop;\n }\n\n const documentTime = this.audio.getDocumentTime();\n\n if (this.audio.props.pauseTime !== null) {\n if (documentTime !== null && this.audio.props.pauseTime > documentTime) {\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 }, this.audio.props.pauseTime - documentTime);\n this.delayedPauseTimer = delayedPauseTimer;\n } else {\n slot.pause();\n return;\n }\n }\n\n let currentTime: number;\n if (documentTime) {\n currentTime = (documentTime - this.audio.props.startTime) / 1000;\n } else {\n currentTime = (this.audio.props.startTime ? this.audio.props.startTime : 0) / 1000;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const asset = slot._assets.get(slot.asset)!;\n const assetDuration: number | null = asset?.resource.duration || null;\n let targetDuration: number | null = assetDuration;\n if (this.audio.props.loopDuration !== null && this.audio.props.loop) {\n const loopDuration = this.audio.props.loopDuration / 1000;\n if (assetDuration !== null && loopDuration > assetDuration) {\n asset.resource.buffer = extendAudioToDuration(\n this.getAudioContext(),\n asset.resource.buffer,\n loopDuration,\n );\n slot.pause();\n slot.duration = loopDuration;\n }\n targetDuration = loopDuration;\n }\n if (targetDuration !== null && slot.duration !== targetDuration) {\n slot.pause();\n slot.duration = targetDuration;\n }\n\n let desiredAudioTime;\n if (currentTime < 0) {\n // The audio should not start yet\n slot.pause();\n const delayedStartTimer = setTimeout(() => {\n if (this.delayedStartTimer === delayedStartTimer) {\n this.delayedStartTimer = null;\n }\n this.syncAudioTime();\n }, -currentTime * 1000);\n this.delayedStartTimer = delayedStartTimer;\n return;\n } else if (this.audio.props.loop) {\n const slotDuration = slot.duration;\n desiredAudioTime = currentTime % slotDuration;\n } else {\n desiredAudioTime = currentTime;\n }\n\n if (desiredAudioTime >= slot.duration) {\n slot.pause();\n return;\n } else {\n // playing\n }\n\n if (slot.isLoaded && (slot.isPaused || slot.isStopped)) {\n slot.play();\n }\n\n const soundInstance = slot.instances[0];\n let delta = desiredAudioTime - soundInstance.currentTime;\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 - slot.duration;\n if (Math.abs(delta) > Math.abs(loopedDelta)) {\n delta = loopedDelta;\n }\n }\n\n if (Math.abs(delta) < 0.1) {\n // Do nothing - this is close enough - set the playback rate to 1\n slot.pitch = 1;\n } else if (Math.abs(delta) > 0.5) {\n slot.pitch = 1;\n slot.pause();\n soundInstance.currentTime = desiredAudioTime;\n slot.resume();\n return;\n } else {\n if (delta > 0) {\n slot.pitch = 1.02;\n } else {\n slot.pitch = 0.98;\n }\n }\n }\n }\n\n private getAudioContext(): AudioContext {\n const playcanvasApp = this.getPlayCanvasApp();\n const soundSystem = playcanvasApp.systems.sound;\n if (!soundSystem) {\n throw new Error(\"Playcanvas sound system not enabled\");\n }\n return soundSystem.context;\n }\n\n enable(): void {\n // TODO\n }\n disable(): void {\n // TODO\n }\n setLoop(): void {\n this.syncAudioTime();\n }\n setEnabled(): void {\n // TODO\n }\n setVolume(): void {\n this.soundComponent.volume = this.audio.props.volume;\n }\n setConeAngle(): void {\n // TODO\n }\n setConeFalloffAngle(): void {\n // TODO\n }\n setDebug(): void {\n // TODO\n }\n\n private async asyncLoadSourceAsset(\n url: string,\n audioContext: AudioContext,\n // TODO - report progress\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onProgress: (loaded: number, total: number) => void,\n ): Promise<playcanvas.Asset> {\n return new Promise<playcanvas.Asset>((resolve, reject) => {\n if (url.startsWith(\"data:\")) {\n // Construct an AudioBuffer from the data URL\n const base64 = url.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 const soundComp = new playcanvas.Sound(audioBuffer);\n const asset = new playcanvas.Asset(\n \"dataAudioFile-\" + PlayCanvasAudio.dataAudioFileCount++,\n \"audio\",\n { url },\n base64,\n );\n asset.resource = soundComp;\n asset.loaded = true;\n this.getPlayCanvasApp().assets.add(asset);\n resolve(asset);\n })\n .catch((e) => {\n console.error(\"Failed to decode data URI audio data\", e);\n });\n return;\n }\n\n const asset = new playcanvas.Asset(url, \"audio\", { url });\n this.getPlayCanvasApp().assets.add(asset);\n this.getPlayCanvasApp().assets.load(asset);\n asset.ready((asset) => {\n resolve(asset);\n });\n // Listen for errors\n asset.on(\"error\", (err) => {\n console.error(\"Error loading audio asset\", err);\n reject(err);\n });\n });\n }\n\n dispose() {\n if (this.delayedPauseTimer) {\n clearTimeout(this.delayedPauseTimer);\n this.delayedPauseTimer = null;\n }\n if (this.delayedStartTimer) {\n clearTimeout(this.delayedStartTimer);\n this.delayedStartTimer = null;\n }\n const audioEntity = this.audio.getContainer() as playcanvas.Entity;\n audioEntity.removeComponent(\"sound\");\n }\n}\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", "import { ChatProbe, ChatProbeGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasChatProbe extends ChatProbeGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity | null = null;\n private debugMaterial: playcanvas.BasicMaterial | null = null;\n\n constructor(private chatProbe: ChatProbe<PlayCanvasGraphicsAdapter>) {\n super(chatProbe);\n this.updateDebugVisualisation();\n }\n\n public disable(): void {}\n\n public enable(): void {}\n\n public setRange(): void {\n this.updateDebugVisualisation();\n }\n\n public setDebug() {\n this.updateDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.entity) {\n this.entity.destroy();\n this.entity = null;\n }\n if (this.debugMaterial) {\n this.debugMaterial.destroy();\n this.debugMaterial = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.chatProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.chatProbe.isConnected && !this.entity) {\n this.entity = new playcanvas.Entity(\n \"chat-probe-internal\",\n this.chatProbe.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n if (!this.debugMaterial) {\n this.debugMaterial = new playcanvas.BasicMaterial();\n this.debugMaterial.color = new playcanvas.Color(1, 1, 0);\n }\n this.entity.addComponent(\"model\", {\n type: \"sphere\",\n material: this.debugMaterial,\n });\n this.entity.model?.model.meshInstances.forEach((mi) => {\n mi.renderStyle = playcanvas.RENDERSTYLE_WIREFRAME;\n mi.castShadow = false;\n });\n\n this.chatProbe.getContainer().addChild(this.entity);\n }\n\n if (this.entity) {\n this.entity.setLocalScale(\n this.chatProbe.props.range * 2,\n this.chatProbe.props.range * 2,\n this.chatProbe.props.range * 2,\n );\n }\n }\n }\n\n public dispose() {\n this.clearDebugVisualisation();\n }\n}\n", "import { Cube, MCubeProps, MELEMENT_PROPERTY_NAME } from \"@mml-io/mml-web\";\nimport { CubeGraphics } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasCube extends CubeGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity;\n private renderComponent: playcanvas.RenderComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n\n constructor(private cube: Cube<PlayCanvasGraphicsAdapter>) {\n super(cube);\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"cube-internal\",\n cube.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = cube;\n this.renderComponent = this.entity.addComponent(\"render\", {\n type: \"box\",\n material: this.material,\n }) as playcanvas.RenderComponent;\n this.entity.addComponent(\"collision\", {\n type: \"box\",\n halfExtents: new playcanvas.Vec3(0.5, 0.5, 0.5),\n });\n cube.getContainer().addChild(this.entity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n setColor(color: MMLColor): void {\n this.material.diffuse.set(color.r, color.g, color.b);\n this.material.metalness = 0;\n this.material.useMetalness = true;\n this.material.update();\n }\n\n private updateSize(mCubeProps: MCubeProps): void {\n this.entity.setLocalScale(mCubeProps.width, mCubeProps.height, mCubeProps.depth);\n if (this.entity.collision) {\n this.entity.collision.halfExtents.set(\n mCubeProps.width / 2,\n mCubeProps.height / 2,\n mCubeProps.depth / 2,\n );\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n }\n\n setWidth(width: number, mCubeProps: MCubeProps): void {\n this.updateSize(mCubeProps);\n }\n\n setHeight(height: number, mCubeProps: MCubeProps): void {\n this.updateSize(mCubeProps);\n }\n\n setDepth(depth: number, mCubeProps: MCubeProps): void {\n this.updateSize(mCubeProps);\n }\n\n setCastShadows(castShadows: boolean): void {\n this.renderComponent.castShadows = castShadows;\n }\n\n setOpacity(opacity: number): void {\n if (opacity === 1) {\n this.material.blendType = playcanvas.BLEND_NONE;\n } else {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n }\n this.material.opacity = opacity;\n this.material.update();\n }\n\n dispose() {\n this.entity.destroy();\n }\n}\n", "import { Cylinder, MCylinderProps, MELEMENT_PROPERTY_NAME } from \"@mml-io/mml-web\";\nimport { CylinderGraphics } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasCylinder extends CylinderGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity;\n private renderComponent: playcanvas.RenderComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n\n constructor(private cylinder: Cylinder<PlayCanvasGraphicsAdapter>) {\n super(cylinder);\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"cylinder-internal\",\n cylinder.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = cylinder;\n this.renderComponent = this.entity.addComponent(\"render\", {\n type: \"cylinder\",\n material: this.material,\n }) as playcanvas.RenderComponent;\n const collisionComponent = this.entity.addComponent(\"collision\", {\n type: \"cylinder\",\n }) as playcanvas.CollisionComponent;\n collisionComponent.radius = 0.5;\n collisionComponent.height = 1;\n cylinder.getContainer().addChild(this.entity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n setColor(color: MMLColor): void {\n this.material.diffuse.set(color.r, color.g, color.b);\n this.material.metalness = 0;\n this.material.useMetalness = true;\n this.material.update();\n }\n\n private updateSize(mCylinderProps: MCylinderProps): void {\n this.entity.setLocalScale(\n mCylinderProps.radius * 2,\n mCylinderProps.height,\n mCylinderProps.radius * 2,\n );\n if (this.entity.collision) {\n this.entity.collision.radius = mCylinderProps.radius;\n this.entity.collision.height = mCylinderProps.height;\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n }\n\n setRadius(radius: number, mCylinderProps: MCylinderProps): void {\n this.updateSize(mCylinderProps);\n }\n\n setHeight(height: number, mCylinderProps: MCylinderProps): void {\n this.updateSize(mCylinderProps);\n }\n\n setCastShadows(castShadows: boolean): void {\n this.renderComponent.castShadows = castShadows;\n }\n\n setOpacity(opacity: number): void {\n if (opacity === 1) {\n this.material.blendType = playcanvas.BLEND_NONE;\n } else {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n }\n this.material.opacity = opacity;\n this.material.update();\n }\n\n dispose() {\n this.entity.destroy();\n }\n}\n", "import { DebugHelper, DebugHelperGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { createPlayCanvasDebugBoundingBox } from \"../debug-bounding-box/PlayCanvasDebugBoundingBox\";\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasDebugHelper extends DebugHelperGraphics<PlayCanvasGraphicsAdapter> {\n private debugAxes: playcanvas.Entity | null = null;\n\n constructor(private debugHelper: DebugHelper<PlayCanvasGraphicsAdapter>) {\n super(debugHelper);\n\n const graphicsAdapter = this.debugHelper.element.getScene().getGraphicsAdapter();\n\n const playcanvasApp = graphicsAdapter.getPlayCanvasApp();\n\n const playcanvasEntity: playcanvas.Entity = this.debugHelper.getContainer();\n this.debugAxes = new playcanvas.Entity(\"axes\", playcanvasApp);\n playcanvasEntity.addChild(this.debugAxes);\n\n const xMaterial = new playcanvas.BasicMaterial();\n xMaterial.color = new playcanvas.Color(1, 0, 0);\n const xAxis = createPlayCanvasDebugBoundingBox(graphicsAdapter, xMaterial);\n xAxis.setLocalScale(0.5, 0, 0);\n xAxis.setLocalPosition(0.25, 0, 0);\n this.debugAxes.addChild(xAxis);\n\n const yMaterial = new playcanvas.BasicMaterial();\n yMaterial.color = new playcanvas.Color(0, 1, 0);\n const yAxis = createPlayCanvasDebugBoundingBox(graphicsAdapter, yMaterial);\n yAxis.setLocalScale(0, 0.5, 0);\n yAxis.setLocalPosition(0, 0.25, 0);\n this.debugAxes.addChild(yAxis);\n\n const zMaterial = new playcanvas.BasicMaterial();\n zMaterial.color = new playcanvas.Color(0, 0, 1);\n const zAxis = createPlayCanvasDebugBoundingBox(graphicsAdapter, zMaterial);\n zAxis.setLocalScale(0, 0, 0.5);\n zAxis.setLocalPosition(0, 0, 0.25);\n this.debugAxes.addChild(zAxis);\n }\n\n dispose() {\n if (this.debugAxes) {\n this.debugHelper.getContainer().removeChild(this.debugAxes);\n this.debugAxes.destroy();\n }\n this.debugAxes = null;\n }\n}\n", "import * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport function createPlayCanvasDebugBoundingBox(\n graphicsAdapter: PlayCanvasGraphicsAdapter,\n material: playcanvas.Material,\n): playcanvas.Entity {\n const entity = new playcanvas.Entity(\"bounding-box\", graphicsAdapter.getPlayCanvasApp());\n entity.addComponent(\"model\", {\n type: \"box\",\n material,\n });\n entity.model?.model.meshInstances.forEach((mi) => {\n mi.renderStyle = playcanvas.RENDERSTYLE_WIREFRAME;\n mi.castShadow = false;\n });\n return entity;\n}\n", "import { Frame, FrameGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { createPlayCanvasDebugBoundingBox } from \"../debug-bounding-box/PlayCanvasDebugBoundingBox\";\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nfunction setEntityToBoundingBox(\n debugBoxConstraintMesh: playcanvas.Entity,\n minX: number,\n maxX: number,\n minY: number,\n maxY: number,\n minZ: number,\n maxZ: number,\n) {\n debugBoxConstraintMesh.setLocalPosition((maxX + minX) / 2, (maxY + minY) / 2, (maxZ + minZ) / 2);\n debugBoxConstraintMesh.setLocalScale(-(maxX - minX), maxY - minY, maxZ - minZ);\n}\n\nexport class PlayCanvasFrame extends FrameGraphics<PlayCanvasGraphicsAdapter> {\n private debugMaterial: playcanvas.BasicMaterial | null = null;\n private loadRangeMaterial: playcanvas.BasicMaterial | null = null;\n private unloadRangeMaterial: playcanvas.BasicMaterial | null = null;\n\n private debugMeshes: {\n debugBoxConstraintMesh: playcanvas.Entity;\n debugBoxLoadRangeMesh: playcanvas.Entity;\n debugBoxUnloadRangeMesh: playcanvas.Entity;\n } | null = null;\n\n constructor(private frame: Frame<PlayCanvasGraphicsAdapter>) {\n super(frame);\n this.updateDebugVisualisation();\n }\n\n setSrc(): void {\n // no-op\n }\n\n public setDebug(): void {\n this.updateDebugVisualisation();\n }\n public setLoadRange(): void {\n this.updateDebugVisualisation();\n }\n public setUnloadRange(): void {\n this.updateDebugVisualisation();\n }\n public setMinX(): void {\n this.updateDebugVisualisation();\n }\n public setMaxX(): void {\n this.updateDebugVisualisation();\n }\n public setMinY(): void {\n this.updateDebugVisualisation();\n }\n public setMaxY(): void {\n this.updateDebugVisualisation();\n }\n public setMinZ(): void {\n this.updateDebugVisualisation();\n }\n public setMaxZ(): void {\n this.updateDebugVisualisation();\n }\n\n disable(): void {}\n\n enable(): void {}\n\n dispose() {\n this.clearDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.debugMeshes) {\n this.debugMeshes.debugBoxConstraintMesh.destroy();\n this.debugMeshes.debugBoxLoadRangeMesh.destroy();\n this.debugMeshes.debugBoxUnloadRangeMesh.destroy();\n this.debugMeshes = null;\n }\n if (this.debugMaterial) {\n this.debugMaterial.destroy();\n this.debugMaterial = null;\n }\n if (this.loadRangeMaterial) {\n this.loadRangeMaterial.destroy();\n this.loadRangeMaterial = null;\n }\n if (this.unloadRangeMaterial) {\n this.unloadRangeMaterial.destroy();\n this.unloadRangeMaterial = 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 if (!this.debugMaterial) {\n this.debugMaterial = new playcanvas.BasicMaterial();\n this.debugMaterial.color = new playcanvas.Color(1, 0, 0);\n }\n if (!this.loadRangeMaterial) {\n this.loadRangeMaterial = new playcanvas.BasicMaterial();\n this.loadRangeMaterial.color = new playcanvas.Color(0, 1, 0);\n }\n if (!this.unloadRangeMaterial) {\n this.unloadRangeMaterial = new playcanvas.BasicMaterial();\n this.unloadRangeMaterial.color = new playcanvas.Color(0, 0, 1);\n }\n const graphicsAdapter = this.frame.getScene().getGraphicsAdapter();\n this.debugMeshes = {\n debugBoxConstraintMesh: createPlayCanvasDebugBoundingBox(\n graphicsAdapter,\n this.debugMaterial,\n ),\n debugBoxLoadRangeMesh: createPlayCanvasDebugBoundingBox(\n graphicsAdapter,\n this.loadRangeMaterial,\n ),\n debugBoxUnloadRangeMesh: createPlayCanvasDebugBoundingBox(\n graphicsAdapter,\n this.unloadRangeMaterial,\n ),\n };\n this.frame.getContainer().addChild(this.debugMeshes.debugBoxConstraintMesh);\n this.frame.getContainer().addChild(this.debugMeshes.debugBoxLoadRangeMesh);\n this.frame.getContainer().addChild(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.enabled = true;\n\n setEntityToBoundingBox(\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.enabled = false;\n this.debugMeshes.debugBoxUnloadRangeMesh.enabled = false;\n } else {\n this.debugMeshes.debugBoxLoadRangeMesh.enabled = true;\n this.debugMeshes.debugBoxUnloadRangeMesh.enabled = true;\n\n setEntityToBoundingBox(\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 setEntityToBoundingBox(\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 MELEMENT_PROPERTY_NAME,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { createPlaneModel } from \"../plane/plane\";\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\ntype ImageLoadedState = {\n asset: playcanvas.Asset;\n};\n\nexport class PlayCanvasImage extends ImageGraphics<PlayCanvasGraphicsAdapter> {\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Image.tagName}.src`);\n private latestSrcImagePromise: Promise<playcanvas.Asset> | null = null;\n private entity: playcanvas.Entity;\n\n private internalEntity: playcanvas.Entity;\n private modelComponent: playcanvas.ModelComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n protected loadedState: ImageLoadedState | null = null;\n constructor(\n private image: Image<PlayCanvasGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(image, updateMeshCallback);\n\n this.entity = image.getContainer() as playcanvas.Entity;\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.internalEntity = new playcanvas.Entity(\n \"image-internal\",\n image.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.internalEntity as any)[MELEMENT_PROPERTY_NAME] = image;\n\n const { model } = createPlaneModel(this.getPlayCanvasApp(), this.material);\n this.modelComponent = this.internalEntity.addComponent(\n \"model\",\n {},\n ) as playcanvas.ModelComponent;\n this.modelComponent.model = model;\n\n // Use the collision component of the element's entity\n this.entity.addComponent(\"collision\", {\n type: \"box\",\n halfExtents: new playcanvas.Vec3(0.5, 0, 0.5),\n });\n this.entity.addChild(this.internalEntity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getWidthAndHeight(): { width: number; height: number } {\n return {\n width: this.internalEntity.getLocalScale().x,\n height: this.internalEntity.getLocalScale().y,\n };\n }\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n private getPlayCanvasApp(): playcanvas.AppBase {\n return this.image.getScene().getGraphicsAdapter().getPlayCanvasApp();\n }\n\n private updateWidthAndHeight() {\n const loadedImage = this.loadedState?.asset.resource;\n\n const { width, height } = calculateContentSize({\n content: loadedImage ? { width: loadedImage.width, height: loadedImage.height } : undefined,\n width: this.image.props.width,\n height: this.image.props.height,\n });\n\n // Update the size of the visual representation\n this.internalEntity.setLocalScale(width, height, 1);\n\n // Update the collision shape\n if (this.entity.collision) {\n this.entity.collision.halfExtents.set(width / 2, height / 2, 0);\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n\n this.updateMeshCallback();\n }\n\n setWidth(): void {\n this.updateWidthAndHeight();\n }\n\n setHeight(): void {\n this.updateWidthAndHeight();\n }\n\n private clearImage() {\n if (this.material) {\n this.material.diffuseMap = null;\n this.material.opacityMap = null;\n this.material.emissiveMap = null;\n this.material.update();\n }\n this.updateWidthAndHeight();\n }\n\n public setSrc(src: string | null): void {\n if (this.loadedState !== null) {\n this.loadedState.asset.unload();\n this.loadedState = null;\n }\n if (!src) {\n this.clearImage();\n this.srcLoadingInstanceManager.abortIfLoading();\n return;\n }\n\n const contentSrc = this.image.contentSrcToContentAddress(src);\n const srcImagePromise = this.asyncLoadSourceAsset(contentSrc, (loaded, total) => {\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n });\n this.srcLoadingInstanceManager.start(this.image.getLoadingProgressManager(), contentSrc);\n this.latestSrcImagePromise = srcImagePromise;\n srcImagePromise\n .then((asset) => {\n if (this.latestSrcImagePromise !== srcImagePromise || !this.image.isConnected) {\n // TODO\n // If we've loaded a different image since, or we're no longer connected, dispose of this one\n return;\n }\n this.latestSrcImagePromise = null;\n this.loadedState = {\n asset,\n };\n\n const texture = asset.resource;\n texture.premultiplyAlpha = true;\n this.material.diffuseMap = texture;\n this.material.blendType = playcanvas.BLEND_NORMAL;\n this.material.opacityMap = texture;\n this.material.update();\n this.updateWidthAndHeight();\n this.updateMaterialEmissiveIntensity();\n this.srcLoadingInstanceManager.finish();\n })\n .catch((err) => {\n console.error(\"Error loading m-image.src\", err);\n this.clearImage();\n this.srcLoadingInstanceManager.error(err);\n });\n }\n\n setCastShadows(castShadows: boolean): void {\n this.modelComponent.castShadows = castShadows;\n }\n\n setOpacity(opacity: number): void {\n if (opacity === 1) {\n this.material.blendType = playcanvas.BLEND_NONE;\n } else {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n }\n this.material.opacity = opacity;\n this.material.update();\n }\n\n setEmissive(): void {\n this.updateMaterialEmissiveIntensity();\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.image.props.emissive) {\n this.material.emissiveMap = this.material.diffuseMap;\n this.material.emissiveIntensity = this.image.props.emissive;\n } else {\n this.material.emissiveMap = null;\n this.material.emissiveIntensity = 0;\n }\n this.material.update();\n }\n\n private async asyncLoadSourceAsset(\n url: string,\n // TODO - report progress\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onProgress: (loaded: number, total: number) => void,\n ): Promise<playcanvas.Asset> {\n return new Promise<playcanvas.Asset>((resolve, reject) => {\n const asset = new playcanvas.Asset(url, \"texture\", { url });\n this.getPlayCanvasApp().assets.add(asset);\n this.getPlayCanvasApp().assets.load(asset);\n asset.ready((asset) => {\n resolve(asset);\n });\n asset.on(\"error\", (err) => {\n reject(err);\n });\n });\n }\n\n dispose() {\n if (this.loadedState) {\n this.loadedState.asset.unload();\n this.loadedState = null;\n }\n this.internalEntity.destroy();\n }\n}\n", "import * as playcanvas from \"playcanvas\";\n\nexport function createPlaneMesh(app: playcanvas.AppBase): playcanvas.Mesh {\n const vertices = [\n // First triangle\n // bottom left\n -0.5, -0.5, 0,\n // bottom right\n 0.5, -0.5, 0,\n // top left\n -0.5, 0.5, 0,\n\n // Second triangle\n // bottom right\n 0.5, -0.5, 0,\n // top right\n 0.5, 0.5, 0,\n // top left\n -0.5, 0.5, 0,\n\n // First triangle\n // top left\n -0.5, 0.5, 0,\n // bottom right\n 0.5, -0.5, 0,\n // bottom left\n -0.5, -0.5, 0,\n\n // Second triangle\n // top left\n -0.5, 0.5, 0,\n // top right\n 0.5, 0.5, 0,\n // bottom right\n 0.5, -0.5, 0,\n ];\n\n const uvs = [\n // First triangle\n // bottom left\n 0, 1,\n // bottom right\n 1, 1,\n // top left\n 0, 0,\n\n // Second triangle\n // bottom right\n 1, 1,\n // top right\n 1, 0,\n // top left\n 0, 0,\n\n // First triangle\n // top left\n 0, 0,\n // bottom right\n 1, 1,\n // bottom left\n 0, 1,\n\n // Second triangle\n // top left\n 0, 0,\n // top right\n 1, 0,\n // bottom right\n 1, 1,\n ];\n\n const normals = Array.from({ length: vertices.length / 3 }).flatMap((value, index) => {\n return index < 6 ? [0, 0, 1] : [0, 0, -1];\n });\n\n const mesh = new playcanvas.Mesh(app.graphicsDevice);\n mesh.setPositions(vertices);\n mesh.setUvs(0, uvs);\n mesh.setNormals(normals);\n mesh.update();\n return mesh;\n}\n\nexport function createPlaneModel(app: playcanvas.AppBase, material: playcanvas.StandardMaterial) {\n const mesh = createPlaneMesh(app);\n const rootNode = new playcanvas.GraphNode();\n const meshInstance = new playcanvas.MeshInstance(mesh, material, rootNode);\n meshInstance.renderStyle = playcanvas.RENDERSTYLE_SOLID;\n const model = new playcanvas.Model();\n model.graph = rootNode;\n model.meshInstances.push(meshInstance);\n return { model, meshInstance };\n}\n", "import { Interaction } from \"@mml-io/mml-web\";\nimport { InteractionGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasInteraction extends InteractionGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity | null = null;\n private debugMaterial: playcanvas.BasicMaterial | null = null;\n\n constructor(private positionProbe: Interaction<PlayCanvasGraphicsAdapter>) {\n super(positionProbe);\n this.updateDebugVisualisation();\n }\n\n disable(): void {}\n\n enable(): void {}\n\n public setRange(): void {\n this.updateDebugVisualisation();\n }\n\n public setInFocus(): void {\n // no-op\n }\n\n public setLineOfSight(): void {\n // no-op\n }\n\n public setPriority(): void {\n // no-op\n }\n\n public setPrompt(): void {\n // no-op\n }\n\n public setDebug() {\n this.updateDebugVisualisation();\n }\n\n private clearDebugVisualisation() {\n if (this.entity) {\n this.entity.destroy();\n this.entity = null;\n }\n if (this.debugMaterial) {\n this.debugMaterial.destroy();\n this.debugMaterial = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.positionProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.positionProbe.isConnected && !this.entity) {\n this.entity = new playcanvas.Entity(\n \"interaction-internal\",\n this.positionProbe.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n if (!this.debugMaterial) {\n this.debugMaterial = new playcanvas.BasicMaterial();\n this.debugMaterial.color = new playcanvas.Color(0, 1, 0);\n }\n this.entity.addComponent(\"model\", {\n type: \"sphere\",\n material: this.debugMaterial,\n });\n this.entity.model?.model.meshInstances.forEach((mi) => {\n mi.renderStyle = playcanvas.RENDERSTYLE_WIREFRAME;\n mi.castShadow = false;\n });\n\n this.positionProbe.getContainer().addChild(this.entity);\n }\n\n if (this.entity) {\n this.entity.setLocalScale(\n this.positionProbe.props.range * 2,\n this.positionProbe.props.range * 2,\n this.positionProbe.props.range * 2,\n );\n }\n }\n }\n\n dispose() {\n this.clearDebugVisualisation();\n }\n}\n", "import {\n CanvasText,\n Label,\n LabelGraphics,\n MELEMENT_PROPERTY_NAME,\n MLabelProps,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasLabel extends LabelGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity;\n private renderComponent: playcanvas.RenderComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n private canvasText: CanvasText = new CanvasText();\n\n constructor(private label: Label<PlayCanvasGraphicsAdapter>) {\n super(label);\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"label-internal\",\n label.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = label;\n this.renderComponent = this.entity.addComponent(\"render\", {\n type: \"plane\",\n material: this.material,\n castShadows: this.label.props.castShadows,\n }) as playcanvas.RenderComponent;\n this.entity.rotate(90, 0, 0);\n this.entity.addComponent(\"collision\", {\n type: \"box\",\n halfExtents: new playcanvas.Vec3(0.5, 0, 0.5),\n });\n label.getContainer().addChild(this.entity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n private updateSize(mLabelProps: MLabelProps): void {\n this.entity.setLocalScale(mLabelProps.width, 1, mLabelProps.height);\n if (this.entity.collision) {\n this.entity.collision.halfExtents.set(mLabelProps.width / 2, 0, mLabelProps.height / 2);\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n }\n\n public setWidth(width: number, mLabelProps: MLabelProps): void {\n this.updateSize(mLabelProps);\n this.redrawText();\n }\n\n public setHeight(height: number, mLabelProps: MLabelProps): void {\n this.updateSize(mLabelProps);\n this.redrawText();\n }\n public setContent(): void {\n this.redrawText();\n }\n public setAlignment(): void {\n this.redrawText();\n }\n public setFontSize(): void {\n this.redrawText();\n }\n public setPadding(): void {\n this.redrawText();\n }\n public setColor(): void {\n this.redrawText();\n }\n public setFontColor(): void {\n this.redrawText();\n }\n\n public setEmissive(): void {\n this.updateMaterialEmissiveIntensity();\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.label.props.emissive) {\n this.material.emissiveMap = this.material.diffuseMap;\n this.material.emissiveIntensity = this.label.props.emissive;\n } else {\n this.material.emissiveMap = null;\n this.material.emissiveIntensity = 0;\n }\n this.material.update();\n }\n\n private redrawText() {\n if (!this.material) {\n return;\n }\n const canvas = this.canvasText.renderText(this.label.props.content, {\n bold: true,\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: this.label.props.width * 200,\n height: this.label.props.height * 200,\n },\n alignment: this.label.props.alignment,\n });\n\n const texture = new playcanvas.Texture(\n this.label.getScene().getGraphicsAdapter().getPlayCanvasApp().graphicsDevice,\n {\n width: canvas.width,\n height: canvas.height,\n },\n );\n texture.setSource(canvas);\n this.material.diffuseMap = texture;\n if ((this.label.props.color.a ?? 1) < 1) {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n this.material.opacityMap = texture;\n } else {\n this.material.blendType = playcanvas.BLEND_NONE;\n this.material.opacityMap = null;\n }\n this.material.update();\n this.updateMaterialEmissiveIntensity();\n texture.destroy();\n }\n\n setCastShadows(castShadows: boolean): void {\n this.renderComponent.castShadows = castShadows;\n }\n\n dispose() {\n this.entity.destroy();\n }\n}\n", "import { Light } from \"@mml-io/mml-web\";\nimport { LightGraphics } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nconst lightIntensityFactor = 1 / 100;\nconst lightLuminanceFactor = 4000;\n\nexport class PlayCanvasLight extends LightGraphics<PlayCanvasGraphicsAdapter> {\n private lightComponent: playcanvas.LightComponent;\n\n constructor(private light: Light<PlayCanvasGraphicsAdapter>) {\n super(light);\n this.createLight();\n }\n\n private createLight() {\n const lightEntity = this.light.getContainer() as playcanvas.Entity;\n if (this.lightComponent) {\n lightEntity.removeComponent(\"light\");\n }\n\n const { r, g, b } = this.light.props.color;\n\n if (this.light.props.type === \"spotlight\") {\n this.lightComponent = lightEntity.addComponent(\"light\", {\n type: \"spot\",\n luminance: this.light.props.intensity * lightLuminanceFactor,\n intensity: this.light.props.intensity * lightIntensityFactor,\n castShadows: this.light.props.castShadows,\n color: new playcanvas.Color(r, g, b),\n shadowBias: 0.001,\n normalOffsetBias: 0.001,\n shape: playcanvas.LIGHTSHAPE_DISK,\n innerConeAngle: this.light.props.angleDeg,\n outerConeAngle: this.light.props.angleDeg,\n range: this.light.props.distance ?? 100,\n falloffMode: playcanvas.LIGHTFALLOFF_INVERSESQUARED,\n enabled: this.light.props.enabled,\n } as playcanvas.LightComponent) as playcanvas.LightComponent;\n } else {\n this.lightComponent = lightEntity.addComponent(\"light\", {\n type: \"point\",\n luminance: this.light.props.intensity * lightLuminanceFactor,\n intensity: this.light.props.intensity * lightIntensityFactor,\n castShadows: this.light.props.castShadows,\n color: new playcanvas.Color(r, g, b),\n shadowBias: 0.001,\n normalOffsetBias: 0.001,\n range: this.light.props.distance ?? 100,\n falloffMode: playcanvas.LIGHTFALLOFF_INVERSESQUARED,\n enabled: this.light.props.enabled,\n } as playcanvas.LightComponent) as playcanvas.LightComponent;\n }\n }\n\n disable(): void {}\n\n enable(): void {}\n\n setEnabled(enabled: boolean): void {\n this.lightComponent.enabled = enabled;\n }\n\n setCastShadows(castShadows: boolean) {\n this.lightComponent.castShadows = castShadows;\n this.lightComponent.refreshProperties();\n }\n\n setAngle(angle: number) {\n if (this.lightComponent.type !== \"spot\") {\n return;\n }\n this.lightComponent.innerConeAngle = angle;\n this.lightComponent.outerConeAngle = angle;\n this.lightComponent.refreshProperties();\n }\n\n setIntensity(intensity: number) {\n this.lightComponent.luminance = intensity * lightLuminanceFactor;\n this.lightComponent.intensity = intensity * lightIntensityFactor;\n this.lightComponent.refreshProperties();\n }\n\n setDistance(distance: number | null) {\n this.lightComponent.range = distance ?? 100;\n this.lightComponent.refreshProperties();\n }\n\n setType(): void {\n this.createLight();\n }\n\n setDebug(): void {\n // TODO\n }\n\n setColor(color: MMLColor): void {\n this.lightComponent.color.set(color.r, color.g, color.b);\n this.lightComponent.refreshProperties();\n }\n\n dispose() {\n const lightEntity = this.light.getContainer() as playcanvas.Entity;\n lightEntity.removeComponent(\"light\");\n }\n}\n", "import { Link } from \"@mml-io/mml-web\";\nimport { LinkGraphics } from \"@mml-io/mml-web\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasLink extends LinkGraphics<PlayCanvasGraphicsAdapter> {\n constructor(private link: Link<PlayCanvasGraphicsAdapter>) {\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 playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasMElement extends MElementGraphics<PlayCanvasGraphicsAdapter> {\n protected container: playcanvas.Entity;\n private currentParentContainer: playcanvas.Entity | null = null;\n\n constructor(private element: MElement<PlayCanvasGraphicsAdapter>) {\n super(element);\n this.container = new playcanvas.Entity(\n element.constructor.name,\n element.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\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.addChild(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.addChild(this.container);\n }\n\n public getContainer(): playcanvas.Entity {\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.removeChild(this.container);\n this.currentParentContainer = null;\n\n this.container.destroy();\n }\n}\n", "import {\n IVect3,\n LoadingInstanceManager,\n MElement,\n Model,\n ModelGraphics,\n TransformableElement,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { createPlayCanvasDebugBoundingBox } from \"../debug-bounding-box/PlayCanvasDebugBoundingBox\";\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\ntype PlayCanvasModelLoadState = {\n renderEntity: playcanvas.Entity;\n boundingBox: playcanvas.BoundingBox;\n collisionWorldScale: IVect3;\n bones: Map<string, playcanvas.GraphNode>;\n};\n\ntype PlayCanvasAnimLoadState = {\n animAsset: playcanvas.Asset;\n animComponent: playcanvas.AnimComponent | null;\n};\n\nexport class PlayCanvasModel extends ModelGraphics<PlayCanvasGraphicsAdapter> {\n private srcLoadingInstanceManager = new LoadingInstanceManager(`${Model.tagName}.src`);\n private animLoadingInstanceManager = new LoadingInstanceManager(`${Model.tagName}.anim`);\n private latestSrcModelPromise: Promise<playcanvas.Asset> | null = null;\n\n private debugMaterial: playcanvas.BasicMaterial | null = null;\n\n private latestAnimPromise: Promise<playcanvas.Asset> | null = null;\n private documentTimeTickListener: null | { remove: () => void } = null;\n\n private attachments = new Map<\n Model<PlayCanvasGraphicsAdapter>,\n {\n animComponent: playcanvas.AnimComponent;\n } | null\n >();\n private registeredParentAttachment: Model<PlayCanvasGraphicsAdapter> | null = null;\n\n private socketChildrenByBone = new Map<string, Set<MElement<PlayCanvasGraphicsAdapter>>>();\n\n private debugBoundingBox: playcanvas.Entity | null = null;\n\n protected loadedState: PlayCanvasModelLoadState | null = null;\n protected animState: PlayCanvasAnimLoadState | null = null;\n\n constructor(\n private model: Model<PlayCanvasGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(model, updateMeshCallback);\n }\n\n private getPlayCanvasApp(): playcanvas.AppBase {\n return this.model.getScene().getGraphicsAdapter().getPlayCanvasApp();\n }\n\n hasLoadedModel(): boolean {\n return !!this.loadedState?.renderEntity;\n }\n\n hasLoadedAnimation(): boolean {\n return !!this.animState?.animAsset;\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.model.getContainer();\n }\n\n setDebug(): void {\n this.updateDebugVisualisation();\n }\n\n setCastShadows(): void {\n // TODO\n }\n\n public registerAttachment(attachment: Model<PlayCanvasGraphicsAdapter>) {\n let animState = null;\n if (this.animState) {\n const attachmentLoadedState = (attachment.modelGraphics as PlayCanvasModel).loadedState;\n if (!attachmentLoadedState) {\n throw new Error(\"Attachment must be loaded before registering\");\n }\n const playcanvasEntity = attachmentLoadedState.renderEntity;\n const animComponent = playcanvasEntity.addComponent(\"anim\", {}) as playcanvas.AnimComponent;\n animComponent.assignAnimation(\"SingleAnimation\", this.animState.animAsset.resource);\n animState = {\n animComponent,\n };\n }\n this.attachments.set(attachment, animState);\n }\n\n public unregisterAttachment(attachment: Model<PlayCanvasGraphicsAdapter>) {\n const animState = this.attachments.get(attachment);\n if (animState) {\n animState.animComponent.reset();\n animState.animComponent.unbind();\n animState.animComponent.entity.removeComponent(\"anim\");\n }\n this.attachments.delete(attachment);\n }\n\n getBoundingBox(): { centerOffset: IVect3; size: IVect3 } | null {\n if (this.loadedState) {\n return {\n centerOffset: this.loadedState.boundingBox.center,\n size: this.loadedState.boundingBox.halfExtents,\n };\n }\n return null;\n }\n\n setAnim(anim: string): void {\n if (this.animState) {\n if (this.animState.animComponent) {\n this.animState.animComponent.reset();\n this.animState.animComponent.unbind();\n this.animState.animComponent.entity.removeComponent(\"anim\");\n }\n this.animState = null;\n // TODO - clear up the asset?\n for (const [attachment, animState] of this.attachments) {\n if (animState) {\n animState.animComponent.reset();\n animState.animComponent.unbind();\n animState.animComponent.entity.removeComponent(\"anim\");\n }\n this.attachments.set(attachment, null);\n }\n }\n if (!anim) {\n this.latestAnimPromise = null;\n // If the animation is removed then the model can be added to 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<PlayCanvasGraphicsAdapter>;\n (parent.modelGraphics as PlayCanvasModel).registerAttachment(this.model);\n }\n }\n return;\n }\n const animSrc = this.model.contentSrcToContentAddress(anim);\n const animPromise = this.asyncLoadAnimAsset(animSrc, (loaded, total) => {\n this.animLoadingInstanceManager.setProgress(loaded / total);\n });\n this.animLoadingInstanceManager.start(this.model.getLoadingProgressManager(), anim);\n this.latestAnimPromise = animPromise;\n animPromise\n .then((asset) => {\n if (this.latestAnimPromise !== animPromise || !this.model.isConnected) {\n // TODO\n // If we've loaded a different model since, or we're no longer connected, dispose of this one\n // PlayCanvasModel.disposeOfGroup(result.group);\n return;\n }\n this.latestAnimPromise = null;\n this.animState = {\n animAsset: asset,\n animComponent: null,\n };\n // Play the animation\n this.connectAnimationToModel();\n\n for (const [attachment] of this.attachments) {\n const playcanvasEntity = attachment.getContainer() as playcanvas.Entity;\n const animComponent = playcanvasEntity.addComponent(\n \"anim\",\n {},\n ) as playcanvas.AnimComponent;\n animComponent.assignAnimation(\"SingleAnimation\", this.animState.animAsset.resource);\n const animState = {\n animComponent,\n };\n this.attachments.set(attachment, animState);\n }\n\n if (!this.documentTimeTickListener) {\n this.documentTimeTickListener = this.model.addDocumentTimeTickListener(\n (documentTime: number) => {\n this.updateAnimation(documentTime);\n },\n );\n }\n this.animLoadingInstanceManager.finish();\n })\n .catch((err) => {\n console.error(\"Error loading m-model.anim\", err);\n this.animLoadingInstanceManager.error(err);\n });\n }\n\n private connectAnimationToModel() {\n if (this.animState && this.loadedState) {\n const playcanvasEntity = this.loadedState.renderEntity;\n const animComponent = playcanvasEntity.addComponent(\"anim\", {}) as playcanvas.AnimComponent;\n animComponent.assignAnimation(\"SingleAnimation\", this.animState.animAsset.resource);\n this.animState.animComponent = animComponent;\n }\n }\n\n public registerSocketChild(\n child: TransformableElement<PlayCanvasGraphicsAdapter>,\n socketName: string,\n ): void {\n let children = this.socketChildrenByBone.get(socketName);\n if (!children) {\n children = new Set<MElement<PlayCanvasGraphicsAdapter>>();\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.addChild(child.getContainer());\n } else {\n this.model.getContainer().addChild(child.getContainer());\n }\n }\n }\n\n public unregisterSocketChild(\n child: TransformableElement<PlayCanvasGraphicsAdapter>,\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().addChild(child.getContainer());\n }\n if (socketChildren.size === 0) {\n this.socketChildrenByBone.delete(socketName);\n }\n }\n }\n\n public setAnimEnabled(): void {\n // no-op\n }\n\n public setAnimLoop(): void {\n // no-op\n }\n\n public setAnimStartTime(): void {\n // no-op\n }\n\n public setAnimPauseTime(): void {\n // no-op\n }\n\n public transformed(): void {\n /*\n TODO - this hack is necessary to allow scaling of collision models in\n playcanvas. The meshes are cached by id (and potentially shared between\n entities). The scale changing does not cause a cache miss, so the cached\n mesh is used with the wrong scale. This is a workaround to clear the cache.\n */\n const scale = this.loadedState?.renderEntity.getWorldTransform().getScale();\n if (scale && this.loadedState) {\n if (\n Math.abs(this.loadedState.collisionWorldScale.x - scale.x) > 0.001 ||\n Math.abs(this.loadedState.collisionWorldScale.y - scale.y) > 0.001 ||\n Math.abs(this.loadedState.collisionWorldScale.z - scale.z) > 0.001\n ) {\n this.loadedState.collisionWorldScale = { x: scale.x, y: scale.y, z: scale.z };\n\n const collisionComponent = this.loadedState.renderEntity.collision;\n if (collisionComponent) {\n for (const mesh of collisionComponent.data.render.meshes) {\n // @ts-expect-error - accessing _triMeshCache private property\n const triMesh = collisionComponent.system._triMeshCache[mesh.id];\n if (triMesh) {\n // @ts-expect-error - accessing untyped Ammo global\n window.Ammo.destroy(triMesh);\n // @ts-expect-error - accessing _triMeshCache private property\n delete collisionComponent.system._triMeshCache[mesh.id];\n }\n }\n // @ts-expect-error - accessing onSetModel private method\n collisionComponent.onSetModel();\n }\n }\n }\n }\n\n setSrc(src: string): void {\n const playcanvasEntity = this.model.getContainer() as playcanvas.Entity;\n if (this.loadedState !== null) {\n this.loadedState.renderEntity.remove();\n this.loadedState = null;\n if (this.animState) {\n this.animState.animComponent = null;\n }\n if (this.registeredParentAttachment) {\n (this.registeredParentAttachment.modelGraphics as PlayCanvasModel).unregisterAttachment(\n this.model,\n );\n this.registeredParentAttachment = null;\n }\n this.updateMeshCallback();\n this.updateDebugVisualisation();\n }\n if (!src) {\n this.srcLoadingInstanceManager.abortIfLoading();\n this.socketChildrenByBone.forEach((children) => {\n children.forEach((child) => {\n this.model.getContainer().addChild(child.getContainer());\n });\n });\n this.updateMeshCallback();\n this.updateDebugVisualisation();\n return;\n }\n\n const contentSrc = this.model.contentSrcToContentAddress(src);\n const srcModelPromise = this.asyncLoadSourceAsset(contentSrc, (loaded, total) => {\n this.srcLoadingInstanceManager.setProgress(loaded / total);\n });\n this.srcLoadingInstanceManager.start(this.model.getLoadingProgressManager(), contentSrc);\n this.latestSrcModelPromise = srcModelPromise;\n srcModelPromise\n .then((asset) => {\n if (this.latestSrcModelPromise !== srcModelPromise || !this.model.isConnected) {\n // If we've loaded a different model since, or we're no longer connected, dispose of this one\n // PlayCanvasModel.disposeOfGroup(result.group);\n return;\n }\n this.latestSrcModelPromise = null;\n const renderEntity: playcanvas.Entity = asset.resource.instantiateRenderEntity();\n\n let boundingBox: playcanvas.BoundingBox | null = null;\n const renders = renderEntity.findComponents(\"render\") as Array<playcanvas.RenderComponent>;\n for (const render of renders) {\n for (const meshInstance of render.meshInstances) {\n if (boundingBox) {\n boundingBox.add(meshInstance.aabb);\n } else {\n boundingBox = meshInstance.aabb.clone();\n }\n }\n render.entity.addComponent(\"collision\", {\n type: \"mesh\",\n renderAsset: render.asset,\n });\n }\n if (!boundingBox) {\n boundingBox = new playcanvas.BoundingBox(\n new playcanvas.Vec3(0, 0, 0),\n new playcanvas.Vec3(0, 0, 0),\n );\n }\n boundingBox.halfExtents.mulScalar(2);\n\n const bones = new Map<string, playcanvas.GraphNode>();\n renderEntity.forEach((node) => {\n bones.set(node.name, node);\n });\n\n this.loadedState = {\n renderEntity,\n boundingBox,\n collisionWorldScale: { x: 1, y: 1, z: 1 },\n bones,\n };\n\n playcanvasEntity.addChild(renderEntity);\n\n this.transformed();\n\n for (const [boneName, children] of this.socketChildrenByBone) {\n const bone = bones.get(boneName);\n if (bone) {\n children.forEach((child) => {\n bone.addChild(child.getContainer());\n });\n }\n }\n\n this.connectAnimationToModel();\n this.updateMeshCallback();\n\n const parent = this.model.parentElement;\n if (parent && Model.isModel(parent)) {\n if (!this.latestAnimPromise && !this.animState) {\n this.registeredParentAttachment = parent as Model<PlayCanvasGraphicsAdapter>;\n (parent.modelGraphics as PlayCanvasModel).registerAttachment(this.model);\n }\n }\n\n this.srcLoadingInstanceManager.finish();\n\n this.updateDebugVisualisation();\n })\n .catch((err) => {\n console.error(\"Error loading m-model.src\", err);\n this.srcLoadingInstanceManager.error(err);\n });\n }\n\n private updateDebugVisualisation() {\n if (!this.model.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (!this.debugBoundingBox) {\n const graphicsAdapter = this.model.getScene().getGraphicsAdapter();\n if (!this.debugMaterial) {\n this.debugMaterial = new playcanvas.BasicMaterial();\n this.debugMaterial.color = new playcanvas.Color(1, 0, 0);\n }\n this.debugBoundingBox = createPlayCanvasDebugBoundingBox(\n graphicsAdapter,\n this.debugMaterial,\n );\n this.model.getContainer().addChild(this.debugBoundingBox);\n }\n if (this.loadedState) {\n const boundingBox = this.loadedState.boundingBox;\n this.debugBoundingBox.setLocalPosition(boundingBox.center);\n this.debugBoundingBox.setLocalScale(boundingBox.halfExtents);\n } else {\n this.debugBoundingBox.setLocalScale(0, 0, 0);\n }\n }\n }\n\n private clearDebugVisualisation() {\n if (this.debugBoundingBox) {\n this.debugBoundingBox.remove();\n this.debugBoundingBox = null;\n }\n if (this.debugMaterial) {\n this.debugMaterial.destroy();\n this.debugMaterial = null;\n }\n }\n\n async asyncLoadSourceAsset(\n url: string,\n // TODO - report progress\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onProgress: (loaded: number, total: number) => void,\n ): Promise<playcanvas.Asset> {\n return new Promise<playcanvas.Asset>((resolve, reject) => {\n /*\n Rewriting the url with an unused-for-networking fragment here causes the\n asset to be loaded uniquely across elements which allows the meshes to\n be independent and avoid a reuse of a (mis-)scaled mesh for collisions.\n */\n const rewrittenUrl = new URL(url);\n rewrittenUrl.hash = Math.random().toString(10);\n const asset = new playcanvas.Asset(url, \"container\", { url: rewrittenUrl.toString() });\n this.getPlayCanvasApp().assets.add(asset);\n this.getPlayCanvasApp().assets.load(asset);\n asset.ready((asset) => {\n resolve(asset);\n });\n asset.on(\"error\", (err) => {\n reject(err);\n });\n });\n }\n\n async asyncLoadAnimAsset(\n url: string,\n // TODO - report progress\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onProgress: (loaded: number, total: number) => void,\n ): Promise<playcanvas.Asset> {\n return new Promise<playcanvas.Asset>((resolve, reject) => {\n const asset = new playcanvas.Asset(url, \"animation\", { url });\n this.getPlayCanvasApp().assets.add(asset);\n this.getPlayCanvasApp().assets.load(asset);\n asset.ready((asset) => {\n resolve(asset);\n });\n asset.on(\"error\", (err) => {\n reject(err);\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 PlayCanvasModel)?.unregisterAttachment(\n this.model,\n );\n this.registeredParentAttachment = null;\n }\n if (this.loadedState) {\n this.loadedState.renderEntity.destroy();\n this.loadedState = null;\n }\n this.clearDebugVisualisation();\n this.animLoadingInstanceManager.dispose();\n this.srcLoadingInstanceManager.dispose();\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 updateAnimation(docTimeMs: number) {\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 animComponent = this.animState?.animComponent;\n if (animComponent) {\n if (!this.model.props.animEnabled) {\n animComponent.playing = false;\n this.triggerSocketedChildrenTransformed();\n } else {\n animComponent.playing = true;\n // @ts-expect-error - accessing _controller private property\n const clip = animComponent.baseLayer._controller._animEvaluator.clips[0];\n if (clip) {\n clip.time = animationTimeMs / 1000;\n }\n }\n }\n\n for (const [model, animState] of this.attachments) {\n if (animState) {\n animState.animComponent.playing = this.model.props.animEnabled;\n // @ts-expect-error - accessing _controller private property\n const clip = animState.animComponent.baseLayer._controller._animEvaluator.clips[0];\n if (clip) {\n clip.time = animationTimeMs / 1000;\n (model.modelGraphics as PlayCanvasModel).triggerSocketedChildrenTransformed();\n }\n }\n }\n this.triggerSocketedChildrenTransformed();\n }\n}\n", "import { MELEMENT_PROPERTY_NAME, MPlaneProps, Plane } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport { PlaneGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasPlane extends PlaneGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity;\n private renderComponent: playcanvas.RenderComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n\n constructor(private plane: Plane<PlayCanvasGraphicsAdapter>) {\n super(plane);\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"plane-internal\",\n plane.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = plane;\n this.renderComponent = this.entity.addComponent(\"render\", {\n type: \"plane\",\n material: this.material,\n }) as playcanvas.RenderComponent;\n this.entity.rotate(90, 0, 0);\n this.entity.addComponent(\"collision\", {\n type: \"box\",\n halfExtents: new playcanvas.Vec3(0.5, 0, 0.5),\n });\n plane.getContainer().addChild(this.entity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n setColor(color: MMLColor): void {\n this.material.diffuse.set(color.r, color.g, color.b);\n this.material.update();\n }\n\n private updateSize(mPlaneProps: MPlaneProps): void {\n this.entity.setLocalScale(mPlaneProps.width, 1, mPlaneProps.height);\n if (this.entity.collision) {\n this.entity.collision.halfExtents.set(mPlaneProps.width / 2, 0, mPlaneProps.height / 2);\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n }\n\n setWidth(width: number, mPlaneProps: MPlaneProps): void {\n this.updateSize(mPlaneProps);\n }\n\n setHeight(height: number, mPlaneProps: MPlaneProps): void {\n this.updateSize(mPlaneProps);\n }\n\n setCastShadows(castShadows: boolean): void {\n // TODO - not casting shadows?\n this.renderComponent.castShadows = castShadows;\n }\n\n setOpacity(opacity: number): void {\n if (opacity === 1) {\n this.material.blendType = playcanvas.BLEND_NONE;\n } else {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n }\n this.material.opacity = opacity;\n this.material.update();\n }\n\n dispose() {\n this.entity.destroy();\n }\n}\n", "import { PositionProbe } from \"@mml-io/mml-web\";\nimport { PositionProbeGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasPositionProbe extends PositionProbeGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity | null = null;\n private debugMaterial: playcanvas.BasicMaterial | null = null;\n\n constructor(private positionProbe: PositionProbe<PlayCanvasGraphicsAdapter>) {\n super(positionProbe);\n this.updateDebugVisualisation();\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.entity) {\n this.entity.destroy();\n this.entity = null;\n }\n if (this.debugMaterial) {\n this.debugMaterial.destroy();\n this.debugMaterial = null;\n }\n }\n\n private updateDebugVisualisation() {\n if (!this.positionProbe.props.debug) {\n this.clearDebugVisualisation();\n } else {\n if (this.positionProbe.isConnected && !this.entity) {\n this.entity = new playcanvas.Entity(\n \"position-probe-internal\",\n this.positionProbe.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n if (!this.debugMaterial) {\n this.debugMaterial = new playcanvas.BasicMaterial();\n this.debugMaterial.color = new playcanvas.Color(0, 1, 0);\n }\n this.entity.addComponent(\"model\", {\n type: \"sphere\",\n material: this.debugMaterial,\n });\n this.entity.model?.model.meshInstances.forEach((mi) => {\n mi.renderStyle = playcanvas.RENDERSTYLE_WIREFRAME;\n mi.castShadow = false;\n });\n\n this.positionProbe.getContainer().addChild(this.entity);\n }\n\n if (this.entity) {\n this.entity.setLocalScale(\n this.positionProbe.props.range * 2,\n this.positionProbe.props.range * 2,\n this.positionProbe.props.range * 2,\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 { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasPrompt extends PromptGraphics<PlayCanvasGraphicsAdapter> {\n constructor(private prompt: Prompt<PlayCanvasGraphicsAdapter>) {\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 playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\nimport { getPlayCanvasReconnectingStatus } from \"../PlayCanvasReconnectingStatus\";\n\nexport class PlayCanvasRemoteDocument extends RemoteDocumentGraphics<PlayCanvasGraphicsAdapter> {\n private statusUI: playcanvas.Entity | null = null;\n\n constructor(private element: RemoteDocument<PlayCanvasGraphicsAdapter>) {\n super(element);\n }\n\n public showError(showError: boolean): void {\n if (!showError) {\n if (this.statusUI !== null) {\n this.element.getContainer().removeChild(this.statusUI);\n this.statusUI = null;\n }\n } else {\n if (this.statusUI === null) {\n const playCanvasApp = this.element.getScene().getGraphicsAdapter().getPlayCanvasApp();\n this.statusUI = new playcanvas.Entity(\"label-internal\", playCanvasApp);\n this.statusUI.rotate(90, 0, 0);\n\n const { material, width, height } = getPlayCanvasReconnectingStatus(playCanvasApp);\n\n this.statusUI.addComponent(\"render\", {\n type: \"plane\",\n material,\n }) as playcanvas.RenderComponent;\n\n this.statusUI.setLocalScale(width, 1, height);\n\n this.statusUI.setPosition(0, height / 2, 0);\n this.element.getContainer().addChild(this.statusUI);\n }\n }\n }\n\n public dispose() {}\n}\n", "import { CanvasText } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nfunction createReconnectingStatus(playCanvasApp: playcanvas.AppBase): PlayCanvasReconnectingStatus {\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 playcanvas.Texture(playCanvasApp.graphicsDevice, {\n width: canvas.width,\n height: canvas.height,\n });\n texture.setSource(canvas);\n\n const material = new playcanvas.StandardMaterial();\n material.useLighting = false;\n material.emissiveMap = texture;\n material.update();\n\n texture.destroy();\n\n const width = canvas.width;\n const height = canvas.height;\n\n return { material, width: width / 100, height: height / 100 };\n}\n\nexport type PlayCanvasReconnectingStatus = {\n material: playcanvas.StandardMaterial;\n width: number;\n height: number;\n};\n\nlet reconnectingStatus: PlayCanvasReconnectingStatus | null = null;\n\nexport function getPlayCanvasReconnectingStatus(\n playCanvasApp: playcanvas.AppBase,\n): PlayCanvasReconnectingStatus {\n if (!reconnectingStatus) {\n reconnectingStatus = createReconnectingStatus(playCanvasApp);\n }\n return reconnectingStatus;\n}\n", "import { MELEMENT_PROPERTY_NAME, MSphereProps, Sphere } from \"@mml-io/mml-web\";\nimport { MMLColor } from \"@mml-io/mml-web\";\nimport { SphereGraphics } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasSphere extends SphereGraphics<PlayCanvasGraphicsAdapter> {\n private entity: playcanvas.Entity;\n private renderComponent: playcanvas.RenderComponent;\n private material: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n\n constructor(private sphere: Sphere<PlayCanvasGraphicsAdapter>) {\n super(sphere);\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"sphere-internal\",\n sphere.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = sphere;\n this.renderComponent = this.entity.addComponent(\"render\", {\n type: \"sphere\",\n material: this.material,\n }) as playcanvas.RenderComponent;\n this.entity.addComponent(\"collision\", {\n type: \"sphere\",\n });\n if (this.entity.collision) {\n this.entity.collision.radius = 1;\n }\n sphere.getContainer().addChild(this.entity);\n }\n\n disable(): void {}\n\n enable(): void {}\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n setColor(color: MMLColor): void {\n this.material.diffuse.set(color.r, color.g, color.b);\n this.material.metalness = 0;\n this.material.useMetalness = true;\n this.material.update();\n }\n\n private updateSize(mSphereProps: MSphereProps): void {\n this.entity.setLocalScale(\n mSphereProps.radius * 2,\n mSphereProps.radius * 2,\n mSphereProps.radius * 2,\n );\n if (this.entity.collision) {\n this.entity.collision.radius = mSphereProps.radius;\n // @ts-expect-error - accessing onSetRadius private method\n this.entity.collision.onSetRadius();\n }\n }\n\n setRadius(radius: number, mSphereProps: MSphereProps): void {\n this.updateSize(mSphereProps);\n }\n\n setCastShadows(castShadows: boolean): void {\n this.renderComponent.castShadows = castShadows;\n }\n\n setOpacity(opacity: number): void {\n if (opacity === 1) {\n this.material.blendType = playcanvas.BLEND_NONE;\n } else {\n this.material.blendType = playcanvas.BLEND_NORMAL;\n }\n this.material.opacity = opacity;\n this.material.update();\n }\n\n dispose() {\n this.entity.destroy();\n }\n}\n", "import {\n Matr4,\n Model,\n TransformableElement,\n TransformableElementProps,\n TransformableGraphics,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\nimport { PlayCanvasModel } from \"./PlayCanvasModel\";\n\nconst halfToRad = 0.5 * playcanvas.math.DEG_TO_RAD;\n\n// An implementation of XYZ ordered Euler angles in degrees to quaternion\nfunction xyzDegreesToQuaternion(x: number, y: number, z: number): [number, number, number, number] {\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n const cx = Math.cos(x);\n const cy = Math.cos(y);\n const cz = Math.cos(z);\n\n const sx = Math.sin(x);\n const sy = Math.sin(y);\n const sz = Math.sin(z);\n\n return [\n sx * cy * cz + cx * sy * sz, // x\n cx * sy * cz - sx * cy * sz, // y\n cx * cy * sz + sx * sy * cz, // z\n cx * cy * cz - sx * sy * sz, // w\n ];\n}\n\nexport class PlayCanvasTransformable extends TransformableGraphics<PlayCanvasGraphicsAdapter> {\n private socketName: string | null = null;\n private registeredSocketParent: PlayCanvasModel | null = null;\n\n constructor(private transformableElement: TransformableElement<PlayCanvasGraphicsAdapter>) {\n super(transformableElement);\n }\n\n getWorldMatrix(): Matr4 {\n return new Matr4(this.getPlayCanvasEntity().getWorldTransform().data);\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<PlayCanvasGraphicsAdapter> | undefined)\n ?.isModel\n ) {\n const parentModel = this.transformableElement\n .parentElement as Model<PlayCanvasGraphicsAdapter>;\n this.registeredSocketParent = parentModel.modelGraphics as PlayCanvasModel;\n this.registeredSocketParent.registerSocketChild(this.transformableElement, socketName);\n }\n }\n\n setVisible(visible: boolean): void {\n this.getPlayCanvasEntity().enabled = visible;\n }\n\n private updatePosition(x: number, y: number, z: number): void {\n this.getPlayCanvasEntity().setLocalPosition(x, y, z);\n }\n\n setX(x: number, transformableElementProps: TransformableElementProps): void {\n this.updatePosition(\n transformableElementProps.x,\n transformableElementProps.y,\n transformableElementProps.z,\n );\n }\n\n setY(y: number, transformableElementProps: TransformableElementProps): void {\n this.updatePosition(\n transformableElementProps.x,\n transformableElementProps.y,\n transformableElementProps.z,\n );\n }\n\n setZ(z: number, transformableElementProps: TransformableElementProps): void {\n this.updatePosition(\n transformableElementProps.x,\n transformableElementProps.y,\n transformableElementProps.z,\n );\n }\n\n private getPlayCanvasEntity(): playcanvas.Entity {\n return this.transformableElement.getContainer() as playcanvas.Entity;\n }\n\n private updateRotation(rx: number, ry: number, rz: number): void {\n this.getPlayCanvasEntity().setLocalRotation(...xyzDegreesToQuaternion(rx, ry, rz));\n }\n\n setRotationX(rotationX: number, transformableElementProps: TransformableElementProps): void {\n this.updateRotation(\n transformableElementProps.rx,\n transformableElementProps.ry,\n transformableElementProps.rz,\n );\n }\n\n setRotationY(rotationY: number, transformableElementProps: TransformableElementProps): void {\n this.updateRotation(\n transformableElementProps.rx,\n transformableElementProps.ry,\n transformableElementProps.rz,\n );\n }\n\n setRotationZ(rotationZ: number, transformableElementProps: TransformableElementProps): void {\n this.updateRotation(\n transformableElementProps.rx,\n transformableElementProps.ry,\n transformableElementProps.rz,\n );\n }\n\n private updateScale(sx: number, sy: number, sz: number): void {\n this.getPlayCanvasEntity().setLocalScale(sx, sy, sz);\n }\n\n setScaleX(scaleX: number, transformableElementProps: TransformableElementProps): void {\n this.updateScale(\n transformableElementProps.sx,\n transformableElementProps.sy,\n transformableElementProps.sz,\n );\n }\n\n setScaleY(scaleY: number, transformableElementProps: TransformableElementProps): void {\n this.updateScale(\n transformableElementProps.sx,\n transformableElementProps.sy,\n transformableElementProps.sz,\n );\n }\n\n setScaleZ(scaleZ: number, transformableElementProps: TransformableElementProps): void {\n this.updateScale(\n transformableElementProps.sx,\n transformableElementProps.sy,\n transformableElementProps.sz,\n );\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 EventHandlerCollection,\n MELEMENT_PROPERTY_NAME,\n StaticFileVideoSource,\n Video,\n VideoGraphics,\n VideoSource,\n WHEPVideoSource,\n} from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { createPlaneModel } from \"../plane/plane\";\nimport { PlayCanvasGraphicsAdapter } from \"../PlayCanvasGraphicsAdapter\";\n\nconst audioRefDistance = 1;\nconst audioRolloffFactor = 1;\n\nexport class PlayCanvasVideo extends VideoGraphics<PlayCanvasGraphicsAdapter> {\n private videoSource: VideoSource | null = null;\n private videoMaterial: playcanvas.StandardMaterial = new playcanvas.StandardMaterial();\n private disabledVideoMaterial = new playcanvas.StandardMaterial();\n\n private entity: playcanvas.Entity;\n private modelComponent: playcanvas.ModelComponent;\n private meshInstance: playcanvas.MeshInstance;\n\n private loadedVideoState: {\n video: HTMLVideoElement;\n videoLoadEventCollection: EventHandlerCollection;\n videoTexture: playcanvas.Texture | null;\n audio: {\n gainNode: GainNode;\n audioNode: AudioNode;\n panner: PannerNode;\n } | null;\n } | null = null;\n private documentTimeTickListener: { remove: () => void };\n\n private eventCollection = new EventHandlerCollection();\n\n constructor(\n private video: Video<PlayCanvasGraphicsAdapter>,\n private updateMeshCallback: () => void,\n ) {\n super(video, updateMeshCallback);\n this.disabledVideoMaterial.diffuse = new playcanvas.Color(0, 0, 0);\n\n this.documentTimeTickListener = this.video.addDocumentTimeTickListener(() => {\n this.tick();\n });\n\n this.eventCollection.add(this.getAudioContext(), \"statechange\", () => {\n this.syncVideoTime();\n });\n\n /*\n The primitive must be in an internal entity to allow using setLocalScale\n without affecting children.\n */\n this.entity = new playcanvas.Entity(\n \"video-internal\",\n video.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n );\n (this.entity as any)[MELEMENT_PROPERTY_NAME] = video;\n\n const { model, meshInstance } = createPlaneModel(\n this.video.getScene().getGraphicsAdapter().getPlayCanvasApp(),\n this.disabledVideoMaterial,\n );\n this.modelComponent = this.entity.addComponent(\"model\", {}) as playcanvas.ModelComponent;\n this.modelComponent.model = model;\n this.meshInstance = meshInstance;\n\n this.entity.addComponent(\"collision\", {\n type: \"box\",\n halfExtents: new playcanvas.Vec3(0.5, 0, 0.5),\n });\n video.getContainer().addChild(this.entity);\n }\n\n private getPlayCanvasApp(): playcanvas.AppBase {\n return this.video.getScene().getGraphicsAdapter().getPlayCanvasApp();\n }\n\n getWidthAndHeight(): { width: number; height: number } {\n return {\n width: this.entity.getLocalScale().x,\n height: this.entity.getLocalScale().y,\n };\n }\n\n private getAudioContext(): AudioContext {\n const playcanvasApp = this.getPlayCanvasApp();\n const soundSystem = playcanvasApp.systems.sound;\n if (!soundSystem) {\n throw new Error(\"Playcanvas sound system not enabled\");\n }\n return soundSystem.context;\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 audioContext = this.getAudioContext();\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 public enable(): void {\n this.updateVideo();\n }\n\n public disable(): void {\n this.updateVideo();\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?.audio) {\n this.loadedVideoState.audio.gainNode.gain.value = this.video.props.volume;\n }\n }\n\n public setEmissive(): void {\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 const videoLoadEventCollection = new EventHandlerCollection();\n this.loadedVideoState = {\n video,\n videoLoadEventCollection,\n videoTexture: null,\n audio: null,\n };\n video.loop = this.video.props.loop;\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 videoLoadEventCollection.add(video, \"loadeddata\", () => {\n if (!this.loadedVideoState || this.loadedVideoState.video !== video) {\n // Video was changed before it loaded\n return;\n }\n\n // Create a texture to hold the video frame data\n this.loadedVideoState.videoTexture = new playcanvas.Texture(\n this.getPlayCanvasApp().graphicsDevice,\n {\n format: playcanvas.PIXELFORMAT_R8_G8_B8,\n mipmaps: false,\n width: video.videoWidth,\n height: video.videoHeight,\n },\n );\n this.loadedVideoState.videoTexture.setSource(this.loadedVideoState.video);\n this.videoMaterial.diffuseMap = this.loadedVideoState.videoTexture;\n this.videoMaterial.update();\n this.meshInstance.material = this.videoMaterial;\n this.syncVideoTime();\n this.updateWidthAndHeight();\n this.updateMaterialEmissiveIntensity();\n\n // playcanvas doesn't support positional audio for video elements so use the audio context directly\n const audioContext = this.getAudioContext();\n\n const pos = this.entity.getPosition();\n // TODO - initial orientation\n const orientationX = 1.0;\n const orientationY = 0.0;\n const orientationZ = 0.0;\n\n const panner = new PannerNode(audioContext, {\n panningModel: \"HRTF\",\n distanceModel: \"inverse\",\n positionX: pos.x,\n positionY: pos.y,\n positionZ: pos.z,\n orientationX,\n orientationY,\n orientationZ,\n refDistance: audioRefDistance,\n rolloffFactor: audioRolloffFactor,\n });\n\n const gainNode = audioContext.createGain();\n gainNode.gain.value = this.video.props.volume;\n const stereoPanner = new StereoPannerNode(audioContext, { pan: 0 });\n const audioNode = audioContext.createMediaElementSource(video);\n audioNode\n .connect(gainNode)\n .connect(stereoPanner)\n .connect(panner)\n .connect(audioContext.destination);\n\n this.loadedVideoState.audio = { gainNode, audioNode, panner };\n });\n }\n }\n\n if (this.videoSource) {\n this.syncVideoTime();\n }\n }\n\n private tick() {\n const videoTexture = this.loadedVideoState?.videoTexture;\n if (videoTexture) {\n videoTexture.upload();\n }\n const audio = this.loadedVideoState?.audio;\n if (audio) {\n /// Update the position\n const pos = this.entity.getPosition();\n const rotation = this.entity.getEulerAngles();\n audio.panner.positionX.value = pos.x;\n audio.panner.positionY.value = pos.y;\n audio.panner.positionZ.value = pos.z;\n audio.panner.orientationX.value = Math.cos(rotation.y);\n audio.panner.orientationY.value = 0;\n audio.panner.orientationZ.value = Math.sin(rotation.y);\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 if (this.loadedVideoState.audio) {\n this.loadedVideoState.audio.audioNode.disconnect();\n this.loadedVideoState.audio = null;\n }\n if (this.loadedVideoState.videoTexture) {\n this.loadedVideoState.videoTexture.destroy();\n this.loadedVideoState.videoTexture = null;\n }\n this.loadedVideoState.videoLoadEventCollection.clear();\n this.loadedVideoState = null;\n this.meshInstance.material = this.disabledVideoMaterial;\n this.updateWidthAndHeight();\n }\n }\n\n private updateMaterialEmissiveIntensity() {\n if (this.loadedVideoState?.videoTexture && this.video.props.emissive) {\n this.videoMaterial.emissiveMap = this.loadedVideoState.videoTexture;\n this.videoMaterial.emissiveIntensity = this.video.props.emissive;\n } else {\n this.videoMaterial.emissiveMap = null;\n this.videoMaterial.emissiveIntensity = 0;\n }\n this.videoMaterial.update();\n }\n\n dispose() {\n this.clearSource();\n this.documentTimeTickListener.remove();\n this.eventCollection.clear();\n this.entity.destroy();\n }\n\n getCollisionElement(): playcanvas.Entity {\n return this.entity;\n }\n\n private updateWidthAndHeight() {\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\n this.entity.setLocalScale(width, height, 1);\n if (this.entity.collision) {\n this.entity.collision.halfExtents.set(width / 2, height / 2, 0);\n // @ts-expect-error - accessing onSetHalfExtents private method\n this.entity.collision.onSetHalfExtents();\n }\n\n this.updateMeshCallback();\n }\n}\n", "import { MMLGraphicsInterface } from \"@mml-io/mml-web\";\n\nimport * as PlayCanvasElements from \"./elements\";\nimport { PlayCanvasGraphicsAdapter } from \"./PlayCanvasGraphicsAdapter\";\n\nexport const PlayCanvasGraphicsInterface: MMLGraphicsInterface<PlayCanvasGraphicsAdapter> = {\n MElementGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasMElement(element),\n MMLDebugHelperGraphicsInterface: (debugHelper) =>\n new PlayCanvasElements.PlayCanvasDebugHelper(debugHelper),\n MMLAudioGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasAudio(element),\n MMLChatProbeGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasChatProbe(element),\n MMLCubeGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasCube(element),\n MMLCylinderGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasCylinder(element),\n MMLFrameGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasFrame(element),\n MMLImageGraphicsInterface: (element, updateMeshCallback: () => void) =>\n new PlayCanvasElements.PlayCanvasImage(element, updateMeshCallback),\n MMLInteractionGraphicsInterface: (element) =>\n new PlayCanvasElements.PlayCanvasInteraction(element),\n MMLLabelGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasLabel(element),\n MMLLightGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasLight(element),\n MMLLinkGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasLink(element),\n MMLModelGraphicsInterface: (element, updateMeshCallback: () => void) =>\n new PlayCanvasElements.PlayCanvasModel(element, updateMeshCallback),\n MMLPlaneGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasPlane(element),\n MMLPositionProbeGraphicsInterface: (element) =>\n new PlayCanvasElements.PlayCanvasPositionProbe(element),\n MMLPromptGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasPrompt(element),\n MMLSphereGraphicsInterface: (element) => new PlayCanvasElements.PlayCanvasSphere(element),\n MMLTransformableGraphicsInterface: (element) =>\n new PlayCanvasElements.PlayCanvasTransformable(element),\n MMLVideoGraphicsInterface: (element, updateMeshCallback: () => void) =>\n new PlayCanvasElements.PlayCanvasVideo(element, updateMeshCallback),\n RemoteDocumentGraphicsInterface: (element) =>\n new PlayCanvasElements.PlayCanvasRemoteDocument(element),\n};\n", "import { Interaction } from \"@mml-io/mml-web\";\nimport * as playcanvas from \"playcanvas\";\n\nimport { PlayCanvasGraphicsAdapter } from \"./PlayCanvasGraphicsAdapter\";\n\nexport class PlayCanvasInteractionAdapter {\n static interactionShouldShowDistance(\n interaction: Interaction<PlayCanvasGraphicsAdapter>,\n cameraEntity: playcanvas.Entity,\n cameraComponent: playcanvas.CameraComponent,\n app: playcanvas.AppBase,\n ): number | null {\n const worldPos = interaction.getContainer().getPosition();\n\n const cameraPos = cameraEntity.getPosition();\n const distance = cameraPos.distance(worldPos);\n if (distance > interaction.props.range) {\n return null;\n }\n\n if (interaction.props.inFocus) {\n if (!cameraComponent.frustum.containsPoint(worldPos)) {\n return null;\n }\n }\n\n if (interaction.props.lineOfSight) {\n const rigidbodySystem = app.systems.rigidbody;\n if (!rigidbodySystem) {\n console.warn(\"Rigidbody system not found. Line of sight check will not work.\");\n } else {\n const raycastResults = rigidbodySystem.raycastAll(cameraPos, worldPos);\n if (raycastResults.length > 0) {\n for (const result of raycastResults) {\n if (\n !PlayCanvasInteractionAdapter.hasAncestor(result.entity, interaction.getContainer())\n ) {\n return null;\n }\n }\n }\n }\n }\n\n return distance;\n }\n\n static hasAncestor(object: playcanvas.Entity, ancestor: playcanvas.Entity): 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"],
5
+ "mappings": "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",
6
6
  "names": ["asset", "playcanvas", "playcanvas", "MELEMENT_PROPERTY_NAME", "playcanvas", "playcanvas", "playcanvas", "playcanvas", "LoadingInstanceManager", "MELEMENT_PROPERTY_NAME", "playcanvas", "playcanvas", "LoadingInstanceManager", "MELEMENT_PROPERTY_NAME", "asset", "playcanvas", "MELEMENT_PROPERTY_NAME", "playcanvas", "playcanvas", "MELEMENT_PROPERTY_NAME", "playcanvas", "LoadingInstanceManager", "Model", "TransformableElement", "playcanvas", "LoadingInstanceManager", "Model", "asset", "TransformableElement", "MELEMENT_PROPERTY_NAME", "playcanvas", "playcanvas", "playcanvas", "CanvasText", "playcanvas", "MELEMENT_PROPERTY_NAME", "playcanvas", "playcanvas", "calculateContentSize", "EventHandlerCollection", "MELEMENT_PROPERTY_NAME", "playcanvas", "EventHandlerCollection", "MELEMENT_PROPERTY_NAME", "calculateContentSize"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mml-io/mml-web-playcanvas",
3
- "version": "0.19.2",
3
+ "version": "0.19.3",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -20,7 +20,7 @@
20
20
  "test-iterate": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --watch"
21
21
  },
22
22
  "dependencies": {
23
- "@mml-io/mml-web": "^0.19.2"
23
+ "@mml-io/mml-web": "^0.19.3"
24
24
  },
25
25
  "peerDependencies": {
26
26
  "playcanvas": "*"
@@ -38,5 +38,5 @@
38
38
  "@babel/preset-typescript"
39
39
  ]
40
40
  },
41
- "gitHead": "e1926507273fca794f77211d76fbcef178318987"
41
+ "gitHead": "929c3a449e6a0cce7300341bb759a3565d2a4bd5"
42
42
  }