@shopware-ag/dive 1.18.5-beta.2 → 1.18.5-beta.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/AR-BzVanQ-t.js +722 -0
- package/build/AR-BzVanQ-t.js.map +1 -0
- package/build/AR-ySzrfSW3.cjs +2 -0
- package/build/AR-ySzrfSW3.cjs.map +1 -0
- package/build/IO-BTWL9Zfp.cjs +19 -0
- package/build/IO-BTWL9Zfp.cjs.map +1 -0
- package/build/{IO-BgiJzKrU.js → IO-CYzpSt1J.js} +257 -225
- package/build/IO-CYzpSt1J.js.map +1 -0
- package/build/{MediaCreator-4zmvmUWH.js → MediaCreator-BFa3Xfwk.js} +2 -2
- package/build/{MediaCreator-4zmvmUWH.js.map → MediaCreator-BFa3Xfwk.js.map} +1 -1
- package/build/{MediaCreator-BNxZVYyZ.cjs → MediaCreator-BqLcaXbl.cjs} +2 -2
- package/build/{MediaCreator-BNxZVYyZ.cjs.map → MediaCreator-BqLcaXbl.cjs.map} +1 -1
- package/build/{dive-_-yiZbhn.cjs → dive-BTQZqHRt.cjs} +3 -3
- package/build/{dive-_-yiZbhn.cjs.map → dive-BTQZqHRt.cjs.map} +1 -1
- package/build/{dive-Mi8g8Khn.js → dive-Dk0rFfvA.js} +35 -35
- package/build/{dive-Mi8g8Khn.js.map → dive-Dk0rFfvA.js.map} +1 -1
- package/build/dive.cjs +1 -1
- package/build/dive.js +1 -1
- package/build/src/ar/arquicklook/ARQuickLook.d.ts +2 -3
- package/package.json +1 -1
- package/src/ar/arquicklook/ARQuickLook.ts +75 -48
- package/src/ar/arquicklook/__test__/ARQuickLook.test.ts +45 -80
- package/src/ar/sceneviewer/__test__/SceneViewer.test.ts +0 -12
- package/build/AR-B-g0updz.js +0 -1450
- package/build/AR-B-g0updz.js.map +0 -1
- package/build/AR-BWQebw6-.cjs +0 -153
- package/build/AR-BWQebw6-.cjs.map +0 -1
- package/build/IO-BgiJzKrU.js.map +0 -1
- package/build/IO-CuYml7Y5.cjs +0 -2
- package/build/IO-CuYml7Y5.cjs.map +0 -1
- package/build/TextureUtils-CxpuVgwF.js +0 -38
- package/build/TextureUtils-CxpuVgwF.js.map +0 -1
- package/build/TextureUtils-DNG-yR77.cjs +0 -19
- package/build/TextureUtils-DNG-yR77.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AR-BzVanQ-t.js","sources":["../src/helper/isInterface/implementsInterface.ts","../src/helper/findInterface/findInterface.ts","../src/ar/arquicklook/ARQuickLook.ts","../src/ar/webxr/overlay/Overlay.ts","../src/ar/webxr/crosshair/WebXRCrosshair.ts","../src/ar/webxr/raycaster/ar/WebXRRaycasterAR.ts","../src/ar/webxr/raycaster/three/WebXRRaycasterTHREE.ts","../src/events/EventExecutor.ts","../src/ar/webxr/raycaster/WebXRRaycaster.ts","../src/ar/webxr/origin/WebXROrigin.ts","../src/ar/webxr/touchscreencontrols/WebXRTouchscreenControls.ts","../src/ar/webxr/controller/WebXRController.ts","../src/ar/webxr/WebXR.ts","../src/ar/sceneviewer/SceneViewer.ts","../src/ar/AR.ts"],"sourcesContent":["import { type Object3D } from 'three';\n\nexport function implementsInterface<T>(\n object: Object3D | null | undefined,\n discriminator: string,\n): object is Object3D & T {\n if (!object) return false;\n return discriminator in object;\n}\n","import { implementsInterface } from '../isInterface/implementsInterface';\nimport { type Object3D } from 'three';\n\nexport function findInterface<T>(\n object: Object3D | null | undefined,\n discriminator: string,\n): (Object3D & T) | undefined {\n if (!object) return undefined;\n\n if (implementsInterface<T>(object, discriminator)) return object;\n\n return findInterface<T>(object.parent, discriminator);\n}\n","import { type DIVEScene } from '../../scene/Scene';\nimport { type DIVEAROptions } from '../AR';\n\nexport class DIVEARQuickLook {\n public static Launch(\n scene: DIVEScene,\n options?: DIVEAROptions,\n ): Promise<void> {\n const url = this.findARQuickLookSrc(scene);\n\n // launch ARQuickLook\n return this.launchARQuickLook(url, options);\n }\n\n private static launchARQuickLook(\n uri: string,\n options?: DIVEAROptions,\n ): Promise<void> {\n return new Promise((resolve) => {\n if (options?.arScale === 'fixed') {\n uri = uri.concat('#allowsContentScaling=0');\n }\n\n // launch ARQuickLook\n const a = document.createElement('a');\n a.innerHTML = '<picture></picture>'; // This is actually needed so the viewer opens instantly\n a.rel = 'ar';\n a.href = uri;\n a.download = 'scene.usdz';\n resolve();\n a.click();\n });\n }\n\n private static findARQuickLookSrc(scene: DIVEScene): string {\n let uri: string | null = null;\n\n scene.traverse((object) => {\n if (uri) return;\n if (object.userData.uri) {\n uri = object.userData.uri;\n }\n });\n\n if (!uri) {\n throw new Error('No model found in scene');\n }\n\n return uri;\n }\n\n // private static extractModels(scene: DIVEScene): Object3D[] {\n // // extract models\n // return scene.Root.children;\n // }\n\n // private static launchARFromNode(\n // node: Object3D,\n // options?: DIVEAROptions,\n // ): Promise<void> {\n // // bundle USDZ\n // return this._usdzExporter\n // .parse(node, {\n // quickLookCompatible: true,\n // ar: {\n // anchoring: { type: 'plane' },\n // planeAnchoring: {\n // alignment:\n // options?.arPlacement === 'vertical'\n // ? 'vertical'\n // : 'horizontal',\n // },\n // },\n // })\n // .then((usdz: Uint8Array) => {\n // // create blob\n // const blob = new Blob([usdz], { type: 'model/vnd.usdz+zip' });\n // let url = URL.createObjectURL(blob);\n\n // if (options?.arScale === 'fixed') {\n // url = url.concat('#allowsContentScaling=0');\n // }\n\n // // launch ARQuickLook\n // const a = document.createElement('a');\n // a.innerHTML = '<picture></picture>'; // This is actually needed so the viewer opens instantly\n // a.rel = 'ar';\n // a.href = url;\n // a.download = 'scene.usdz';\n // a.click();\n // });\n // }\n}\n","export class Overlay {\n private _element: HTMLDivElement;\n public get Element(): HTMLDivElement {\n return this._element;\n }\n\n private _closeButton: SVGSVGElement;\n public get CloseButton(): SVGSVGElement {\n return this._closeButton;\n }\n\n constructor() {\n // create div\n this._element = document.createElement('div');\n\n // create and append close button to overlay\n this._closeButton = this.createCloseButton();\n this._element.appendChild(this._closeButton);\n\n // append overlay to body\n document.body.appendChild(this._element);\n }\n\n private createCloseButton(): SVGSVGElement {\n // create svg path\n const path = document.createElementNS(\n 'http://www.w3.org/2000/svg',\n 'path',\n );\n path.setAttribute('d', 'M 12,12 L 28,28 M 28,12 12,28');\n path.setAttribute('stroke', '#fff');\n path.setAttribute('stroke-width', '2');\n\n // create svg\n const svg = document.createElementNS(\n 'http://www.w3.org/2000/svg',\n 'svg',\n );\n svg.setAttribute('width', '38');\n svg.setAttribute('height', '38');\n svg.style.position = 'absolute';\n svg.style.right = '20px';\n svg.style.top = '20px';\n\n // append path to svg\n svg.appendChild(path);\n\n return svg;\n }\n}\n","import { Mesh, MeshBasicMaterial, Object3D, RingGeometry } from 'three';\n\nexport class DIVEWebXRCrosshair extends Object3D {\n public set mesh(mesh: Mesh | undefined) {\n this.clear();\n\n if (mesh) {\n this.add(mesh);\n }\n }\n\n constructor(mesh?: Mesh) {\n super();\n\n if (mesh) {\n this.mesh = mesh;\n } else {\n this.UseDefaultMesh();\n }\n\n this.matrixAutoUpdate = false;\n\n return this;\n }\n\n public UseDefaultMesh(): void {\n const geometry = new RingGeometry(0.08, 0.1, 32).rotateX(-Math.PI / 2);\n const material = new MeshBasicMaterial();\n this.mesh = new Mesh(geometry, material);\n }\n\n public UpdateFromPose(pose: XRPose): void {\n this.matrix.fromArray(pose.transform.matrix);\n }\n}\n","import { Matrix4, Vector3 } from 'three';\nimport { type DIVERenderer } from '../../../../renderer/Renderer';\nimport { type DIVEHitResult } from '../WebXRRaycaster';\n\nexport class DIVEWebXRRaycasterAR {\n private _session: XRSession;\n private _renderer: DIVERenderer;\n\n private _transientHitTestSource: XRTransientInputHitTestSource | undefined;\n private _referenceSpaceBuffer: XRReferenceSpace | null = null;\n\n private _requesting: boolean = false;\n private _initialized: boolean = false;\n\n private _hitMatrixBuffer: Matrix4;\n\n constructor(session: XRSession, renderer: DIVERenderer) {\n this._session = session;\n this._renderer = renderer;\n\n this._hitMatrixBuffer = new Matrix4();\n }\n\n public Dispose(): void {\n this._transientHitTestSource?.cancel();\n this._transientHitTestSource = undefined;\n\n this._initialized = false;\n }\n\n public async Init(): Promise<this> {\n if (!this._session) {\n console.error(\n 'DIVEWebXRRaycaster: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._requesting) {\n console.error(\n 'DIVEWebXRRaycaster: Currently initializing! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._initialized) {\n console.error(\n 'DIVEWebXRRaycaster: Already initialized! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n this._requesting = true;\n this._transientHitTestSource = await this._session\n .requestHitTestSourceForTransientInput!({\n profile: 'generic-touchscreen',\n });\n this._referenceSpaceBuffer = this._renderer.xr.getReferenceSpace();\n this._requesting = false;\n\n if (!this._transientHitTestSource) {\n return Promise.reject();\n }\n\n this._initialized = true;\n\n console.log('DIVEWebXRRaycasterAR: Initialized');\n\n return Promise.resolve(this);\n }\n\n public GetIntersections(frame: XRFrame): DIVEHitResult[] {\n if (!this._transientHitTestSource) return [];\n\n const touches = frame.getHitTestResultsForTransientInput(\n this._transientHitTestSource,\n );\n if (touches.length === 0) return [];\n\n const hits = touches.map((touch: XRTransientInputHitTestResult) => {\n if (!this._referenceSpaceBuffer) return undefined;\n if (!touch.results[0]) return undefined;\n if (!touch.results[0].getPose) return undefined;\n\n const pose = touch.results[0].getPose(this._referenceSpaceBuffer);\n if (!pose) return undefined;\n\n this._hitMatrixBuffer.fromArray(pose.transform.matrix);\n const position = new Vector3().setFromMatrixPosition(\n this._hitMatrixBuffer,\n );\n\n return {\n point: position,\n matrix: this._hitMatrixBuffer,\n object: undefined,\n };\n });\n\n return hits.filter((hit) => hit !== undefined) as DIVEHitResult[];\n }\n}\n","import {\n type Intersection,\n type Mesh,\n Raycaster,\n type XRTargetRaySpace,\n} from 'three';\nimport { type DIVERenderer } from '../../../../renderer/Renderer';\nimport { type DIVEScene } from '../../../../scene/Scene';\nimport { type DIVEHitResult } from '../WebXRRaycaster';\n\nexport class DIVEWebXRRaycasterTHREE {\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n\n private _controller: XRTargetRaySpace;\n\n // internal raycaster\n private _raycaster: Raycaster = new Raycaster();\n\n constructor(renderer: DIVERenderer, scene: DIVEScene) {\n this._renderer = renderer;\n this._scene = scene;\n\n this._controller = this._renderer.xr.getController(0);\n }\n\n public async Init(): Promise<this> {\n console.log('DIVEWebXRRaycasterTHREE: Initialized');\n return Promise.resolve(this);\n }\n\n public GetIntersections(): DIVEHitResult[] {\n this._controller.updateMatrixWorld();\n this._raycaster.setFromXRController(this._controller);\n const intersections = this._raycaster.intersectObjects(\n this._scene.XRRoot.XRModelRoot.children,\n );\n\n if (intersections.length === 0) return [];\n\n return intersections.map((intersection: Intersection) => {\n return {\n point: intersection.point,\n matrix: intersection.object.matrixWorld,\n object: intersection.object as Mesh,\n };\n });\n }\n}\n","export class DIVEEventExecutor<T> {\n private _listeners: Map<keyof T, ((payload: T[keyof T]) => void)[]> =\n new Map();\n\n public Subscribe<S extends keyof T>(\n type: S,\n listener: (payload: T[S]) => void,\n ): () => boolean {\n if (!this._listeners.get(type)) this._listeners.set(type, []);\n\n this._listeners\n .get(type)!\n .push(listener as (payload: T[keyof T]) => void);\n\n return () => {\n const listenerArray = this._listeners.get(type);\n if (!listenerArray) return false;\n\n const existingIndex = listenerArray.findIndex(\n (entry) => entry === listener,\n );\n if (existingIndex === -1) return false;\n\n listenerArray.splice(existingIndex, 1);\n return true;\n };\n }\n\n protected dispatch<S extends keyof T>(type: S, payload?: T[S]): void {\n const listenerArray = this._listeners.get(type);\n if (!listenerArray) return;\n\n listenerArray.forEach((listener) => listener(payload as T[S]));\n }\n}\n","import { Matrix4, Mesh, Vector3 } from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\nimport { DIVEWebXRRaycasterAR } from './ar/WebXRRaycasterAR';\nimport { DIVEWebXRRaycasterTHREE } from './three/WebXRRaycasterTHREE';\nimport { DIVEScene } from '../../../scene/Scene';\nimport { DIVEEventExecutor } from '../../../events/EventExecutor';\n\n/**\n * object is undefined when AR world is hit.\n */\nexport type DIVEHitResult = {\n point: Vector3;\n matrix: Matrix4;\n object?: Mesh;\n};\n\nexport type DIVEWebXRRaycasterEvents = {\n AR_HIT_FOUND: {\n hit: DIVEHitResult;\n };\n AR_HIT_LOST: undefined;\n SCENE_HIT_FOUND: {\n hit: DIVEHitResult;\n };\n SCENE_HIT_LOST: undefined;\n};\n\nexport class DIVEWebXRRaycaster extends DIVEEventExecutor<DIVEWebXRRaycasterEvents> {\n private _session: XRSession;\n\n private _initialized: boolean = false;\n\n private _threeRaycaster: DIVEWebXRRaycasterTHREE;\n private _arRaycaster: DIVEWebXRRaycasterAR;\n\n private _arHitResultBuffer: DIVEHitResult[] = [];\n private _sceneHitResultBuffer: DIVEHitResult[] = [];\n\n // buffers\n private _hasHit: boolean = false;\n\n constructor(session: XRSession, renderer: DIVERenderer, scene: DIVEScene) {\n super();\n\n this._session = session;\n\n this._threeRaycaster = new DIVEWebXRRaycasterTHREE(renderer, scene);\n this._arRaycaster = new DIVEWebXRRaycasterAR(session, renderer);\n }\n\n public Dispose(): void {\n // dispose code here\n this._initialized = false;\n }\n\n public async Init(): Promise<this> {\n if (!this._session) {\n console.error(\n 'DIVEWebXRRaycaster: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._initialized) {\n console.error(\n 'DIVEWebXRRaycaster: Already initialized! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n await this._threeRaycaster.Init();\n await this._arRaycaster.Init();\n\n console.log('DIVEWebXRRaycaster: Initialized');\n\n this._initialized = true;\n\n return Promise.resolve(this);\n }\n\n public GetARIntersections(frame: XRFrame): DIVEHitResult[] {\n // check for ar hits\n this._arHitResultBuffer = this._arRaycaster.GetIntersections(frame);\n if (this._arHitResultBuffer.length > 0) {\n // hit found\n this.onARHitFound(this._arHitResultBuffer[0]);\n } else {\n // hit nothing\n this.onARHitLost();\n }\n return this._arHitResultBuffer;\n }\n\n public GetSceneIntersections(): DIVEHitResult[] {\n // check for scene hits\n this._sceneHitResultBuffer = this._threeRaycaster.GetIntersections();\n if (this._sceneHitResultBuffer.length > 0) {\n // scene hit found\n this.onSceneHitFound(this._sceneHitResultBuffer[0]);\n // early return to prevent ar raycaster from overriding scene hit\n } else {\n // scene hit nothing\n this.onSceneHitLost();\n }\n return this._sceneHitResultBuffer;\n }\n\n private onARHitFound(hit: DIVEHitResult): void {\n this._hasHit = true;\n this.dispatch('AR_HIT_FOUND', { hit });\n }\n\n private onARHitLost(): void {\n if (!this._hasHit) return;\n\n this._hasHit = false;\n this.dispatch('AR_HIT_LOST');\n }\n\n private onSceneHitFound(hit: DIVEHitResult): void {\n this._hasHit = true;\n this.dispatch('SCENE_HIT_FOUND', { hit });\n }\n\n private onSceneHitLost(): void {\n if (!this._hasHit) return;\n\n this._hasHit = false;\n this.dispatch('SCENE_HIT_LOST');\n }\n}\n","import { Matrix4, Quaternion, Vector3 } from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\n\nexport class DIVEWebXROrigin {\n private _renderer: DIVERenderer;\n private _session: XRSession;\n\n private _requesting: boolean;\n private _initialized: boolean;\n\n private _referenceSpaceBuffer: XRReferenceSpace | null;\n private _hitTestSource: XRHitTestSource | null;\n\n private _entityTypes: XRHitTestTrackableType[];\n\n private _hitTestResultBuffer: XRHitTestResult[];\n private _raycastHitCounter: number = 0;\n\n private _originSet: Promise<void>;\n private _originSetResolve: (value: void) => void = () => {};\n public get originSet(): Promise<void> {\n return this._originSet;\n }\n\n private _matrix: Matrix4;\n public get matrix(): Matrix4 {\n return this._matrix;\n }\n private set matrix(value: Matrix4) {\n this._matrix = value;\n this._matrix.decompose(this._position, this._quaternion, this._scale);\n }\n\n private _position: Vector3;\n public get position(): Vector3 {\n return this._position;\n }\n\n private _quaternion: Quaternion;\n public get quaternion(): Quaternion {\n return this._quaternion;\n }\n\n private _scale: Vector3;\n public get scale(): Vector3 {\n return this._scale;\n }\n\n constructor(\n session: XRSession,\n renderer: DIVERenderer,\n entityTypes?: XRHitTestTrackableType[],\n ) {\n this._renderer = renderer;\n this._session = session;\n\n this._originSet = new Promise<void>((resolve) => {\n this._originSetResolve = resolve;\n });\n\n this._requesting = false;\n this._initialized = false;\n\n this._referenceSpaceBuffer = null;\n this._hitTestSource = null;\n\n this._entityTypes = entityTypes || ['plane'];\n\n this._hitTestResultBuffer = [];\n\n // set up promises and executors\n this._matrix = new Matrix4();\n this._position = new Vector3();\n this._quaternion = new Quaternion();\n this._scale = new Vector3();\n\n // when origin is set, decompose matrix into position, quaternion and scale\n this._originSet.then(() => {\n // decompose matrix into position, quaternion and scale\n this._matrix.decompose(\n this._position,\n this._quaternion,\n this._scale,\n );\n });\n }\n\n public async Init(): Promise<this> {\n if (this._initialized) {\n return Promise.resolve(this);\n }\n\n if (!this._session) {\n console.error(\n 'DIVEWebXROrigin: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._requesting) {\n console.error(\n 'DIVEWebXROrigin: Currently initializing! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n this._requesting = true;\n const referenceSpace =\n await this._session.requestReferenceSpace('viewer');\n this._hitTestSource =\n (await this._session.requestHitTestSource!({\n space: referenceSpace,\n entityTypes: this._entityTypes,\n })) || null;\n this._requesting = false;\n\n if (!this._hitTestSource) {\n return Promise.reject();\n }\n\n this._initialized = true;\n\n return Promise.resolve(this);\n }\n\n public Dispose(): void {\n this._initialized = false;\n this._requesting = false;\n\n this._hitTestSource?.cancel();\n\n this._hitTestSource = null;\n this._hitTestResultBuffer = [];\n\n this._matrix = new Matrix4();\n this._position = new Vector3();\n this._quaternion = new Quaternion();\n this._scale = new Vector3();\n }\n\n public Update(frame: XRFrame): void {\n if (!this._initialized) return;\n\n if (!this._hitTestSource) {\n throw new Error(\n 'DIVEWebXRRaycaster: Critical Error: HitTestSource not available but WebXROrigin is initialized!',\n );\n }\n\n // get hit test results\n this._hitTestResultBuffer = frame.getHitTestResults(\n this._hitTestSource,\n );\n if (this._hitTestResultBuffer.length > 0) {\n // hit found\n this._referenceSpaceBuffer = this._renderer.xr.getReferenceSpace();\n\n // if there is no reference space, hit will be counted as lost for this frame\n if (!this._referenceSpaceBuffer) {\n this.onHitLost();\n return;\n }\n\n const pose = this._hitTestResultBuffer[0].getPose(\n this._referenceSpaceBuffer,\n );\n if (!pose) {\n this.onHitLost();\n return;\n }\n\n this.onHitFound(pose);\n } else {\n this.onHitLost();\n }\n }\n\n private onHitFound(pose: XRPose): void {\n this._raycastHitCounter++;\n\n this.matrix.fromArray(pose.transform.matrix);\n\n // we have to wait for a certain amount of frames to make sure the origin is set\n if (this._raycastHitCounter > 50) {\n this._originSetResolve();\n }\n }\n\n private onHitLost(): void {\n this._raycastHitCounter = 0;\n }\n}\n","import { Vector2 } from 'three';\nimport { DIVEEventExecutor } from '../../../events/EventExecutor';\n\nexport type DIVETouchscreenEvents = {\n TOUCH_START: {\n touches: {\n current: Vector2;\n }[];\n touchCount: number;\n };\n TOUCH_MOVE: {\n touches: {\n current: Vector2;\n delta: Vector2;\n }[];\n touchCount: number;\n };\n TOUCH_END: {\n touches: {\n current: Vector2;\n }[];\n touchCount: number;\n };\n ROTATE_START: {\n current: number;\n };\n ROTATE_MOVE: {\n current: number;\n delta: number;\n };\n ROTATE_END: {\n current: number;\n };\n PINCH_START: {\n current: number;\n };\n PINCH_MOVE: {\n current: number;\n delta: number;\n };\n PINCH_END: {\n current: number;\n };\n};\n\ntype DIVETouch = {\n start: Vector2;\n current: Vector2;\n delta: Vector2;\n};\n\nexport class DIVEWebXRTouchscreenControls extends DIVEEventExecutor<DIVETouchscreenEvents> {\n // general members\n private _session: XRSession;\n\n // touch members\n private _touchCount: number = 0;\n private _touches: DIVETouch[] = [];\n\n // rotate members\n private _handleRotateStarted: boolean = false;\n private _handleRotateMoved: boolean = false;\n private _handleRotateEnded: boolean = false;\n\n private _startAngle: number = 0;\n private _lastAngle: number = 0;\n private _angleDelta: number = 0;\n\n // scale members\n private _handlePinchStarted: boolean = false;\n private _handlePinchMoved: boolean = false;\n private _handlePinchEnded: boolean = false;\n\n private _scaleDistanceStart: number = 0;\n private _currentDistance: number = 1;\n private _deltaDistance: number = 0;\n\n constructor(session: XRSession) {\n super();\n\n this._session = session;\n\n this._touches = [\n {\n start: new Vector2(),\n current: new Vector2(),\n delta: new Vector2(),\n },\n {\n start: new Vector2(),\n current: new Vector2(),\n delta: new Vector2(),\n },\n ];\n\n this._handleRotateStarted = false;\n\n window.addEventListener('touchstart', (e: TouchEvent) =>\n this.onTouchStart(e),\n );\n window.addEventListener('touchmove', (e: TouchEvent) =>\n this.onTouchMove(e),\n );\n window.addEventListener('touchend', (e: TouchEvent) =>\n this.onTouchEnd(e),\n );\n\n this._session.addEventListener('selectstart', () =>\n this.onSessionSelectStart(),\n );\n this._session.addEventListener('selectend', () =>\n this.onSessionSelectEnd(),\n );\n }\n\n public Dispose(): void {\n window.removeEventListener('touchstart', (e: TouchEvent) =>\n this.onTouchStart(e),\n );\n window.removeEventListener('touchmove', (e: TouchEvent) =>\n this.onTouchMove(e),\n );\n window.removeEventListener('touchend', (e: TouchEvent) =>\n this.onTouchEnd(e),\n );\n\n this._session.removeEventListener('selectstart', () =>\n this.onSessionSelectStart(),\n );\n this._session.removeEventListener('selectend', () =>\n this.onSessionSelectEnd(),\n );\n }\n\n private onTouchStart(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n this._touches[0].start.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].current.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].delta.set(0, 0);\n\n if (this._touchCount > 1) {\n this._touches[1].start.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].current.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].delta.set(0, 0);\n }\n\n if (this._touchCount === 2) {\n this.handleRotateStart();\n this.handlePinchStart();\n }\n\n if (this._handleRotateStarted) {\n this.dispatch('ROTATE_START', {\n current: 0,\n });\n this._handleRotateStarted = false;\n }\n\n if (this._handlePinchStarted) {\n this.dispatch('PINCH_START', {\n current: 0,\n });\n this._handlePinchStarted = false;\n }\n }\n\n private onTouchMove(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n this._touches[0].start.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].current.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].delta.copy(\n this._touches[0].current.clone().sub(this._touches[0].start),\n );\n\n if (this._touchCount > 1) {\n this._touches[1].start.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].current.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].delta.copy(\n this._touches[1].current.clone().sub(this._touches[1].start),\n );\n }\n\n if (this._touchCount === 2) {\n this.handleRotateMoved();\n this.handlePinchMoved();\n }\n\n if (this._touchCount === 1) {\n this.dispatch('TOUCH_MOVE', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n delta: this._touches[0].delta.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n delta: this._touches[1].delta.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n if (this._touchCount === 2) {\n if (this._handleRotateMoved) {\n this.dispatch('ROTATE_MOVE', {\n current: this._lastAngle,\n delta: this._angleDelta,\n });\n this._handleRotateMoved = false;\n }\n\n if (this._handlePinchMoved) {\n this.dispatch('PINCH_MOVE', {\n current: this._currentDistance,\n delta: this._deltaDistance,\n });\n this._handlePinchMoved = false;\n }\n }\n }\n\n private onTouchEnd(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n if (this._touchCount === 0) {\n this._touches[0].start.set(0, 0);\n this._touches[0].current.set(0, 0);\n this._touches[0].delta.set(0, 0);\n }\n\n if (this._touchCount === 1) {\n this.handleRotateEnded();\n this.handlePinchEnded();\n\n this._touches[1].start.set(0, 0);\n this._touches[1].current.set(0, 0);\n this._touches[1].delta.set(0, 0);\n }\n\n if (this._handleRotateEnded) {\n this.dispatch('ROTATE_END', {\n current: this._lastAngle,\n });\n this._handleRotateEnded = false;\n }\n\n if (this._handlePinchEnded) {\n this.dispatch('PINCH_END', {\n current: this._currentDistance,\n });\n this._handlePinchEnded = false;\n }\n }\n\n private onSessionSelectStart(): void {\n this.dispatch('TOUCH_START', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n private onSessionSelectEnd(): void {\n this.dispatch('TOUCH_END', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n // rotation handler\n private handleRotateStart(): void {\n this._handleRotateStarted = true;\n this._startAngle = this._touches[1].start\n .clone()\n .sub(this._touches[0].current)\n .angle();\n }\n\n private handleRotateMoved(): void {\n this._handleRotateMoved = true;\n const currentAngle = this._touches[1].current\n .clone()\n .sub(this._touches[0].current)\n .angle();\n this._angleDelta = currentAngle - this._startAngle;\n this._lastAngle = this._angleDelta * -1;\n }\n\n private handleRotateEnded(): void {\n this._handleRotateEnded = true;\n }\n\n // pinch handler\n private handlePinchStart(): void {\n this._handlePinchStarted = true;\n\n this._scaleDistanceStart = this._touches[1].start.distanceTo(\n this._touches[0].current,\n );\n }\n\n private handlePinchMoved(): void {\n this._handlePinchMoved = true;\n\n const beforeDistance = this._currentDistance;\n const distance = this._touches[1].current.distanceTo(\n this._touches[0].current,\n );\n this._currentDistance = distance / this._scaleDistanceStart;\n this._deltaDistance = this._currentDistance - beforeDistance;\n }\n\n private handlePinchEnded(): void {\n this._handlePinchEnded = true;\n }\n}\n","import {\n Matrix4,\n Mesh,\n Object3D,\n Quaternion,\n Vector3,\n WebXRArrayCamera,\n} from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\nimport { DIVEScene } from '../../../scene/Scene';\nimport { DIVEWebXRCrosshair } from '../crosshair/WebXRCrosshair';\nimport { DIVEWebXRRaycaster } from '../raycaster/WebXRRaycaster';\nimport { DIVEWebXROrigin } from '../origin/WebXROrigin';\nimport {\n DIVETouchscreenEvents,\n DIVEWebXRTouchscreenControls,\n} from '../touchscreencontrols/WebXRTouchscreenControls';\nimport { type DIVEMovable } from '../.././../interface/Movable';\nimport { findInterface } from '../../../helper/findInterface/findInterface';\n\nexport class DIVEWebXRController extends Object3D {\n // general members\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n private _session: XRSession;\n\n private _frameBuffer: XRFrame | null = null;\n\n // raycaster members\n private _xrRaycaster: DIVEWebXRRaycaster;\n private _origin: DIVEWebXROrigin;\n\n // crosshair\n private _crosshair: DIVEWebXRCrosshair;\n\n // controller members\n private _touchscreenControls: DIVEWebXRTouchscreenControls;\n private _handNodeInitialPosition = new Vector3();\n private _xrCamera: WebXRArrayCamera;\n private _placed: boolean = false;\n\n // grabbing\n private _grabbedObject: Object3D | null = null;\n private _arHitPosition: Vector3 = new Vector3();\n private _arHitQuaternion: Quaternion = new Quaternion();\n private _arHitScale: Vector3 = new Vector3(1, 1, 1);\n\n // grabbing position\n private _initialObjectPosition: Vector3 | null = null;\n private _initialRaycastHit: Vector3 | null = null;\n private _deltaRaycastHit: Vector3 = new Vector3();\n\n // grabbing rotation\n private _touchQuaterion: Quaternion = new Quaternion();\n\n // grabbing scale\n private _touchScale: number = 1;\n private _scaleThreshold: number = 0.1;\n\n constructor(session: XRSession, renderer: DIVERenderer, scene: DIVEScene) {\n super();\n\n this._renderer = renderer;\n this._scene = scene;\n this._session = session;\n\n this._xrRaycaster = new DIVEWebXRRaycaster(session, renderer, scene);\n this._origin = new DIVEWebXROrigin(this._session, this._renderer, [\n 'plane',\n ]);\n\n this._crosshair = new DIVEWebXRCrosshair();\n this._crosshair.visible = false;\n\n this._xrCamera = this._renderer.xr.getCamera();\n\n this._scene.XRRoot.XRHandNode.position.set(0, -0.05, -0.25);\n this._handNodeInitialPosition =\n this._scene.XRRoot.XRHandNode.position.clone();\n\n this._touchscreenControls = new DIVEWebXRTouchscreenControls(\n this._session,\n );\n\n // translating\n this._touchscreenControls.Subscribe('TOUCH_START', () =>\n this.onTouchStart(),\n );\n this._touchscreenControls.Subscribe('TOUCH_MOVE', () =>\n this.onTouchMove(),\n );\n this._touchscreenControls.Subscribe('TOUCH_END', (p) =>\n this.onTouchEnd(p),\n );\n\n // rotating\n this._touchscreenControls.Subscribe('ROTATE_START', () =>\n this.onRotateStart(),\n );\n this._touchscreenControls.Subscribe('ROTATE_MOVE', (p) =>\n this.onRotateMove(p),\n );\n\n // scaling\n this._touchscreenControls.Subscribe('PINCH_START', () =>\n this.onPinchStart(),\n );\n this._touchscreenControls.Subscribe('PINCH_MOVE', (p) =>\n this.onPinchMove(p),\n );\n }\n\n public async Init(): Promise<this> {\n this.prepareScene();\n\n await this.initOrigin();\n await this.initRaycaster();\n\n return Promise.resolve(this);\n }\n\n public Dispose(): void {\n this.restoreScene();\n\n this._origin.Dispose();\n this._xrRaycaster.Dispose();\n\n // reset placement members\n this._placed = false;\n }\n\n public Update(frame: XRFrame): void {\n this._frameBuffer = frame;\n\n if (!this._placed) {\n this.updateHandNode();\n\n if (this._origin) {\n this._origin.Update(frame);\n }\n }\n }\n\n private updateHandNode(): void {\n this._xrCamera.updateMatrixWorld();\n this._scene.XRRoot.XRHandNode.position.copy(\n this._handNodeInitialPosition\n .clone()\n .applyMatrix4(this._xrCamera.matrixWorld),\n );\n this._scene.XRRoot.XRHandNode.quaternion.setFromRotationMatrix(\n this._xrCamera.matrixWorld,\n );\n }\n\n // placement\n private async initOrigin(): Promise<void> {\n // initialize origin\n this._origin = await this._origin.Init();\n\n // set resolve callback: place objects at origin when it is set\n this._origin.originSet.then(() => {\n this.placeObjects(this._origin.matrix);\n });\n }\n\n private placeObjects(matrix: Matrix4): void {\n this._scene.XRRoot.XRModelRoot.matrix.copy(matrix);\n\n // we are copying children to a new array to keep the original array intact\n [...this._scene.XRRoot.XRHandNode.children].forEach((child) => {\n this._scene.XRRoot.XRModelRoot.add(child);\n });\n this._placed = true;\n }\n\n // grabbing\n private updateObject(): void {\n if (!this._grabbedObject) return;\n\n this._grabbedObject.position.copy(this._arHitPosition);\n this._grabbedObject.quaternion.copy(\n this._arHitQuaternion.clone().multiply(this._touchQuaterion),\n );\n this._grabbedObject.scale.copy(\n new Vector3(\n this._touchScale,\n this._touchScale,\n this._touchScale,\n ).multiply(this._arHitScale),\n );\n }\n\n private onTouchStart(): void {\n const sceneHits = this._xrRaycaster.GetSceneIntersections();\n console.log('sceneHits', sceneHits);\n if (sceneHits.length === 0) return;\n if (!sceneHits[0].object) return;\n\n const moveable = findInterface<DIVEMovable>(\n sceneHits[0].object,\n 'isMovable',\n );\n if (!moveable) return;\n\n this._grabbedObject = moveable;\n }\n\n private onTouchMove(): void {\n // raycast ar\n if (!this._frameBuffer) return;\n if (!this._grabbedObject) return;\n\n const intersections = this._xrRaycaster.GetARIntersections(\n this._frameBuffer,\n );\n if (intersections.length === 0) {\n this._crosshair.visible = false;\n return;\n }\n\n const hit = intersections[0];\n\n this._crosshair.visible = true;\n this._crosshair.matrix.copy(hit.matrix);\n\n if (!this._grabbedObject) return;\n\n // if initial values have been reset by TOUCH_END event then set them again\n if (!this._initialObjectPosition || !this._initialRaycastHit) {\n this._initialObjectPosition = this._grabbedObject.position.clone();\n this._initialRaycastHit = hit.point.clone();\n }\n\n // decompose hit matrix to apply hit matrix to object\n hit.matrix.decompose(\n this._arHitPosition,\n this._arHitQuaternion,\n this._arHitScale,\n );\n\n // calculate raycast hit delta\n this._deltaRaycastHit.copy(\n hit.point.clone().sub(this._initialRaycastHit),\n );\n\n // apply moved raycast delta to actual object position\n this._arHitPosition.copy(\n this._initialObjectPosition.clone().add(this._deltaRaycastHit),\n );\n\n console.log('arHitPosition', this._arHitPosition);\n\n this.updateObject();\n }\n\n private onTouchEnd(payload: DIVETouchscreenEvents['TOUCH_END']): void {\n if (payload.touchCount === 0) {\n this._crosshair.visible = false;\n\n // reset grab\n this._initialObjectPosition = null;\n this._initialRaycastHit = null;\n this._grabbedObject = null;\n }\n }\n\n private _startTouchQuaternion: Quaternion = new Quaternion();\n private onRotateStart(): void {\n this._startTouchQuaternion = this._touchQuaterion.clone();\n }\n\n private onRotateMove(payload: DIVETouchscreenEvents['ROTATE_MOVE']): void {\n this._touchQuaterion.setFromAxisAngle(\n new Vector3(0, -1, 0),\n payload.delta * 3,\n );\n this._touchQuaterion.multiply(this._startTouchQuaternion);\n this.updateObject();\n }\n\n private _startTouchScale: number = 1;\n private onPinchStart(): void {\n this._startTouchScale = this._touchScale;\n }\n\n private onPinchMove(payload: DIVETouchscreenEvents['PINCH_MOVE']): void {\n this._touchScale = this._startTouchScale * payload.current;\n this.updateObject();\n }\n\n // prepare & cleanup scene\n private prepareScene(): void {\n this._scene.XRRoot.XRModelRoot.matrixAutoUpdate = false;\n\n // initialize crosshair\n this._scene.add(this._crosshair);\n\n // hang current scene children to hand node\n const children: Object3D[] = [];\n this._scene.Root.children.forEach((child) => {\n const clone = child.clone();\n clone.layers.enableAll();\n clone.traverse((obj) => {\n obj.layers.enableAll();\n if (obj instanceof Mesh) {\n obj.scale.set(0.1, 0.1, 0.1);\n }\n });\n clone.position.set(0, 0, 0);\n children.push(clone);\n });\n this._scene.XRRoot.XRHandNode.add(...children);\n }\n\n private restoreScene(): void {\n this._scene.remove(this._crosshair);\n\n // clear hand node and remove attached models\n this._scene.XRRoot.XRHandNode.clear();\n this._scene.XRRoot.XRModelRoot.clear();\n\n this._scene.XRRoot.XRModelRoot.matrixAutoUpdate = true;\n }\n\n // raycast\n private async initRaycaster(): Promise<void> {\n // initialize raycaster\n await this._xrRaycaster.Init();\n\n // check if successful\n if (!this._xrRaycaster) {\n console.error(\n 'Raycaster not initialized successfully. Aborting WebXR...',\n );\n this.Dispose();\n return Promise.reject();\n }\n }\n}\n","import { Vector3 } from 'three';\nimport DIVEOrbitControls from '../../controls/OrbitControls';\nimport { type DIVERenderer } from '../../renderer/Renderer';\nimport { type DIVEScene } from '../../scene/Scene';\nimport { Overlay } from './overlay/Overlay';\nimport { DIVEWebXRController } from './controller/WebXRController';\n\nexport class DIVEWebXR {\n // general members\n private static _renderer: DIVERenderer;\n private static _scene: DIVEScene;\n private static _controller: DIVEOrbitControls;\n\n // camera reset members\n private static _cameraPosition: Vector3;\n private static _cameraTarget: Vector3;\n\n // render loop members\n private static _renderCallbackId: string | null = null;\n\n // setup members\n private static _session: XRSession | null = null;\n private static _referenceSpaceType: XRReferenceSpaceType = 'local';\n private static _overlay: Overlay | null = null;\n private static _options = {\n requiredFeatures: [\n 'local',\n 'hit-test',\n ],\n optionalFeatures: [\n 'light-estimation',\n 'local-floor',\n 'dom-overlay',\n 'depth-sensing',\n ],\n depthSensing: {\n usagePreference: ['gpu-optimized'],\n dataFormatPreference: [],\n },\n domOverlay: { root: {} as HTMLElement },\n };\n\n private static _xrController: DIVEWebXRController | null = null;\n\n public static async Launch(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controller: DIVEOrbitControls,\n ): Promise<void> {\n this._renderer = renderer;\n this._scene = scene;\n this._controller = controller;\n\n // setting camera reset values\n this._cameraPosition = this._controller.object.position.clone();\n this._cameraTarget = this._controller.target.clone();\n\n if (!navigator.xr) {\n console.error('WebXR not supported');\n return Promise.reject();\n }\n\n // setup current instance\n this._renderer.xr.enabled = true;\n this._scene.InitXR(renderer);\n\n // creating overlay\n if (!DIVEWebXR._overlay) {\n const overlay = new Overlay();\n DIVEWebXR._overlay = overlay;\n }\n DIVEWebXR._options.domOverlay = { root: DIVEWebXR._overlay.Element };\n\n // request session\n const session = await navigator.xr.requestSession(\n 'immersive-ar',\n this._options,\n );\n session.addEventListener('end', () => {\n this._onSessionEnded();\n });\n\n // build up session\n renderer.xr.setReferenceSpaceType(this._referenceSpaceType);\n await renderer.xr.setSession(session);\n DIVEWebXR._overlay.Element.style.display = '';\n this._session = session;\n\n // add end session event listener\n DIVEWebXR._overlay.CloseButton.addEventListener('click', () =>\n this.End(),\n );\n\n // start session\n await this._onSessionStarted();\n\n return Promise.resolve();\n }\n\n public static Update(_time: DOMHighResTimeStamp, frame: XRFrame): void {\n if (!this._session) return;\n\n if (this._xrController) {\n this._xrController.Update(frame);\n }\n }\n\n public static End(): void {\n if (!this._session) return;\n this._session.end();\n }\n\n private static async _onSessionStarted(): Promise<void> {\n if (!this._session) return;\n\n // add update callback to render loop\n this._renderCallbackId = this._renderer.AddPreRenderCallback(\n (time: DOMHighResTimeStamp, frame: XRFrame) => {\n this.Update(time, frame);\n },\n );\n\n this._xrController = new DIVEWebXRController(\n this._session,\n this._renderer,\n this._scene,\n );\n await this._xrController.Init().catch(() => {\n this.End();\n });\n\n return Promise.resolve();\n }\n\n private static _onSessionEnded(): void {\n if (!this._session) return;\n\n if (this._xrController) {\n this._xrController.Dispose();\n }\n\n // remove Update() callback\n if (this._renderCallbackId) {\n this._renderer.RemovePreRenderCallback(this._renderCallbackId);\n this._renderCallbackId = null;\n }\n\n // disable XR on renderer to restore canvas rendering\n this._renderer.xr.enabled = false;\n\n // resize renderer\n const canvasWrapper = this._renderer.domElement.parentElement;\n if (canvasWrapper) {\n const { clientWidth, clientHeight } = canvasWrapper;\n this._renderer.OnResize(clientWidth, clientHeight);\n\n // resize camera\n this._controller.object.OnResize(clientWidth, clientHeight);\n }\n\n // reset camera\n this._controller.object.position.copy(this._cameraPosition);\n this._controller.target.copy(this._cameraTarget);\n\n // reset camera values\n this._cameraPosition.set(0, 0, 0);\n this._cameraTarget.set(0, 0, 0);\n\n // dispose xr scene\n this._scene.DisposeXR();\n\n this._session.removeEventListener('end', this._onSessionEnded);\n DIVEWebXR._overlay!.Element.style.display = 'none';\n this._session = null;\n }\n}\n","import { type DIVEScene } from '../../scene/Scene';\nimport { type DIVEAROptions } from '../AR';\n\nexport class DIVESceneViewer {\n public static Launch(scene: DIVEScene, options?: DIVEAROptions): void {\n // find url in scene (first object found that has a set uri)\n const url = this.findSceneViewerSrc(scene);\n\n // launch SceneViewer\n this.launchSceneViewer(url, options);\n }\n\n private static launchSceneViewer(\n url: string,\n options?: DIVEAROptions,\n ): void {\n const anchor = document.createElement('a');\n const noArViewerSigil = '#model-viewer-no-ar-fallback';\n\n const location = self.location.toString();\n const locationUrl = new URL(location);\n const modelUrl = new URL(url, location);\n const params = new URLSearchParams(modelUrl.search);\n\n locationUrl.hash = noArViewerSigil;\n\n // modelUrl can contain title/link/sound etc.\n params.set('mode', 'ar_only');\n\n if (options?.arScale === 'fixed') {\n params.set('resizable', 'false');\n }\n\n if (options?.arPlacement === 'vertical') {\n params.set('enable_vertical_placement', 'true');\n }\n\n // will be added later if needed\n // if (params.has('sound')) {\n // const soundUrl = new URL(params.get('sound')!, location);\n // params.set('sound', soundUrl.toString());\n // }\n // if (params.has('link')) {\n // const linkUrl = new URL(params.get('link')!, location);\n // params.set('link', linkUrl.toString());\n // }\n\n const intent = `intent://arvr.google.com/scene-viewer/1.2?${\n params.toString() + '&file=' + modelUrl.toString()\n }#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;S.browser_fallback_url=${encodeURIComponent(\n locationUrl.toString(),\n )};end;`;\n\n anchor.setAttribute('href', intent);\n anchor.click();\n }\n\n private static findSceneViewerSrc(scene: DIVEScene): string {\n let uri: string | null = null;\n\n scene.traverse((object) => {\n if (uri) return;\n if (object.userData.uri) {\n uri = object.userData.uri;\n }\n });\n\n if (!uri) {\n throw new Error('No model found in scene');\n }\n\n return uri;\n }\n}\n","import { DIVEInfo, WebXRUnsupportedReason } from '../info/Info';\nimport { DIVEARQuickLook } from './arquicklook/ARQuickLook';\nimport { DIVEWebXR } from './webxr/WebXR';\nimport { type DIVEScene } from '../scene/Scene';\nimport { type DIVERenderer } from '../renderer/Renderer';\nimport DIVEOrbitControls from '../controls/OrbitControls';\nimport { DIVESceneViewer } from './sceneviewer/SceneViewer';\n\nexport type DIVEAROptions = {\n arPlacement: 'horizontal' | 'vertical';\n arScale: 'auto' | 'fixed';\n /**\n * experimental, currently deactivated\n */\n useWebXR: false;\n};\n\nexport class DIVEAR {\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n private _controller: DIVEOrbitControls;\n\n constructor(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controller: DIVEOrbitControls,\n ) {\n this._renderer = renderer;\n this._scene = scene;\n this._controller = controller;\n }\n\n public async Launch(options?: DIVEAROptions): Promise<void> {\n const system = DIVEInfo.GetSystem();\n\n if (system === 'iOS') {\n return this.tryARQuickLook();\n }\n\n if (system === 'Android') {\n if (options?.useWebXR) {\n console.warn('DIVE: WebXR is experimental on Android.');\n return this.tryWebXR();\n }\n\n return this.trySceneViewer();\n }\n\n console.log(\n 'DIVE: AR not supported. Not a mobile system. (System is ' +\n system +\n ')',\n );\n }\n\n private async tryARQuickLook(options?: DIVEAROptions): Promise<void> {\n const support = DIVEInfo.GetSupportsARQuickLook();\n if (!support) {\n console.log('ARQuickLook not supported');\n return Promise.reject();\n }\n\n console.log('DIVE: Launching AR with ARQuickLook ...');\n\n // Launch ARQuickLook\n await DIVEARQuickLook.Launch(this._scene, options);\n return Promise.resolve();\n }\n\n private async tryWebXR(): Promise<void> {\n const support = await DIVEInfo.GetSupportsWebXR();\n if (!support) {\n console.log(\n 'WebXR not supported. Reason: ' +\n WebXRUnsupportedReason[\n DIVEInfo.GetWebXRUnsupportedReason()!\n ],\n );\n return Promise.reject();\n }\n\n console.log('DIVE: Launching AR with WebXR ...');\n // Launch WebXR\n await DIVEWebXR.Launch(this._renderer, this._scene, this._controller);\n return Promise.resolve();\n }\n\n private async trySceneViewer(options?: DIVEAROptions): Promise<void> {\n // actually we don't have to try here, because SceneViewer is supported on all devices by now.\n // if there are no AR services (ARCore) installed on the device, SceneViewer will only show the model in 3D.\n // we also have no options to detect if SceneViewer is supported.\n\n console.log('DIVE: Launching AR with SceneViewer ...');\n\n DIVESceneViewer.Launch(this._scene, options);\n return Promise.resolve();\n }\n}\n"],"names":["implementsInterface","object","discriminator","findInterface","DIVEARQuickLook","scene","options","url","uri","resolve","a","Overlay","path","svg","DIVEWebXRCrosshair","Object3D","mesh","geometry","RingGeometry","material","MeshBasicMaterial","Mesh","pose","DIVEWebXRRaycasterAR","session","renderer","Matrix4","_a","frame","touches","touch","Vector3","hit","DIVEWebXRRaycasterTHREE","Raycaster","intersections","intersection","DIVEEventExecutor","type","listener","listenerArray","existingIndex","entry","payload","DIVEWebXRRaycaster","DIVEWebXROrigin","entityTypes","Quaternion","value","referenceSpace","DIVEWebXRTouchscreenControls","Vector2","e","event","currentAngle","beforeDistance","distance","DIVEWebXRController","p","matrix","child","sceneHits","moveable","children","clone","obj","_DIVEWebXR","controller","overlay","_time","time","canvasWrapper","clientWidth","clientHeight","DIVEWebXR","DIVESceneViewer","anchor","noArViewerSigil","location","locationUrl","modelUrl","params","intent","DIVEAR","system","DIVEInfo","WebXRUnsupportedReason"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./dive-BTQZqHRt.cjs");function R(n,t){return n?t in n:!1}function _(n,t){if(n)return R(n,t)?n:_(n.parent,t)}class p{static Launch(t,e){const i=this.findARQuickLookSrc(t);return this.launchARQuickLook(i,e)}static launchARQuickLook(t,e){return new Promise(i=>{(e==null?void 0:e.arScale)==="fixed"&&(t=t.concat("#allowsContentScaling=0"));const r=document.createElement("a");r.innerHTML="<picture></picture>",r.rel="ar",r.href=t,r.download="scene.usdz",i(),r.click()})}static findARQuickLookSrc(t){let e=null;if(t.traverse(i=>{e||i.userData.uri&&(e=i.userData.uri)}),!e)throw new Error("No model found in scene");return e}}class S{get Element(){return this._element}get CloseButton(){return this._closeButton}constructor(){this._element=document.createElement("div"),this._closeButton=this.createCloseButton(),this._element.appendChild(this._closeButton),document.body.appendChild(this._element)}createCloseButton(){const t=document.createElementNS("http://www.w3.org/2000/svg","path");t.setAttribute("d","M 12,12 L 28,28 M 28,12 12,28"),t.setAttribute("stroke","#fff"),t.setAttribute("stroke-width","2");const e=document.createElementNS("http://www.w3.org/2000/svg","svg");return e.setAttribute("width","38"),e.setAttribute("height","38"),e.style.position="absolute",e.style.right="20px",e.style.top="20px",e.appendChild(t),e}}class m extends s.Object3D{set mesh(t){this.clear(),t&&this.add(t)}constructor(t){return super(),t?this.mesh=t:this.UseDefaultMesh(),this.matrixAutoUpdate=!1,this}UseDefaultMesh(){const t=new s.RingGeometry(.08,.1,32).rotateX(-Math.PI/2),e=new s.MeshBasicMaterial;this.mesh=new s.Mesh(t,e)}UpdateFromPose(t){this.matrix.fromArray(t.transform.matrix)}}class g{constructor(t,e){this._referenceSpaceBuffer=null,this._requesting=!1,this._initialized=!1,this._session=t,this._renderer=e,this._hitMatrixBuffer=new s.Matrix4}Dispose(){var t;(t=this._transientHitTestSource)==null||t.cancel(),this._transientHitTestSource=void 0,this._initialized=!1}async Init(){return this._session?this._requesting?(console.error("DIVEWebXRRaycaster: Currently initializing! Aborting initialization..."),Promise.reject()):this._initialized?(console.error("DIVEWebXRRaycaster: Already initialized! Aborting initialization..."),Promise.reject()):(this._requesting=!0,this._transientHitTestSource=await this._session.requestHitTestSourceForTransientInput({profile:"generic-touchscreen"}),this._referenceSpaceBuffer=this._renderer.xr.getReferenceSpace(),this._requesting=!1,this._transientHitTestSource?(this._initialized=!0,console.log("DIVEWebXRRaycasterAR: Initialized"),Promise.resolve(this)):Promise.reject()):(console.error("DIVEWebXRRaycaster: No session set in Init()! Aborting initialization..."),Promise.reject())}GetIntersections(t){if(!this._transientHitTestSource)return[];const e=t.getHitTestResultsForTransientInput(this._transientHitTestSource);return e.length===0?[]:e.map(r=>{if(!this._referenceSpaceBuffer||!r.results[0]||!r.results[0].getPose)return;const a=r.results[0].getPose(this._referenceSpaceBuffer);return a?(this._hitMatrixBuffer.fromArray(a.transform.matrix),{point:new s.Vector3().setFromMatrixPosition(this._hitMatrixBuffer),matrix:this._hitMatrixBuffer,object:void 0}):void 0}).filter(r=>r!==void 0)}}class b{constructor(t,e){this._raycaster=new s.Raycaster,this._renderer=t,this._scene=e,this._controller=this._renderer.xr.getController(0)}async Init(){return console.log("DIVEWebXRRaycasterTHREE: Initialized"),Promise.resolve(this)}GetIntersections(){this._controller.updateMatrixWorld(),this._raycaster.setFromXRController(this._controller);const t=this._raycaster.intersectObjects(this._scene.XRRoot.XRModelRoot.children);return t.length===0?[]:t.map(e=>({point:e.point,matrix:e.object.matrixWorld,object:e.object}))}}class d{constructor(){this._listeners=new Map}Subscribe(t,e){return this._listeners.get(t)||this._listeners.set(t,[]),this._listeners.get(t).push(e),()=>{const i=this._listeners.get(t);if(!i)return!1;const r=i.findIndex(a=>a===e);return r===-1?!1:(i.splice(r,1),!0)}}dispatch(t,e){const i=this._listeners.get(t);i&&i.forEach(r=>r(e))}}class y extends d{constructor(t,e,i){super(),this._initialized=!1,this._arHitResultBuffer=[],this._sceneHitResultBuffer=[],this._hasHit=!1,this._session=t,this._threeRaycaster=new b(e,i),this._arRaycaster=new g(t,e)}Dispose(){this._initialized=!1}async Init(){return this._session?this._initialized?(console.error("DIVEWebXRRaycaster: Already initialized! Aborting initialization..."),Promise.reject()):(await this._threeRaycaster.Init(),await this._arRaycaster.Init(),console.log("DIVEWebXRRaycaster: Initialized"),this._initialized=!0,Promise.resolve(this)):(console.error("DIVEWebXRRaycaster: No session set in Init()! Aborting initialization..."),Promise.reject())}GetARIntersections(t){return this._arHitResultBuffer=this._arRaycaster.GetIntersections(t),this._arHitResultBuffer.length>0?this.onARHitFound(this._arHitResultBuffer[0]):this.onARHitLost(),this._arHitResultBuffer}GetSceneIntersections(){return this._sceneHitResultBuffer=this._threeRaycaster.GetIntersections(),this._sceneHitResultBuffer.length>0?this.onSceneHitFound(this._sceneHitResultBuffer[0]):this.onSceneHitLost(),this._sceneHitResultBuffer}onARHitFound(t){this._hasHit=!0,this.dispatch("AR_HIT_FOUND",{hit:t})}onARHitLost(){this._hasHit&&(this._hasHit=!1,this.dispatch("AR_HIT_LOST"))}onSceneHitFound(t){this._hasHit=!0,this.dispatch("SCENE_HIT_FOUND",{hit:t})}onSceneHitLost(){this._hasHit&&(this._hasHit=!1,this.dispatch("SCENE_HIT_LOST"))}}class E{constructor(t,e,i){this._raycastHitCounter=0,this._originSetResolve=()=>{},this._renderer=e,this._session=t,this._originSet=new Promise(r=>{this._originSetResolve=r}),this._requesting=!1,this._initialized=!1,this._referenceSpaceBuffer=null,this._hitTestSource=null,this._entityTypes=i||["plane"],this._hitTestResultBuffer=[],this._matrix=new s.Matrix4,this._position=new s.Vector3,this._quaternion=new s.Quaternion,this._scale=new s.Vector3,this._originSet.then(()=>{this._matrix.decompose(this._position,this._quaternion,this._scale)})}get originSet(){return this._originSet}get matrix(){return this._matrix}set matrix(t){this._matrix=t,this._matrix.decompose(this._position,this._quaternion,this._scale)}get position(){return this._position}get quaternion(){return this._quaternion}get scale(){return this._scale}async Init(){if(this._initialized)return Promise.resolve(this);if(!this._session)return console.error("DIVEWebXROrigin: No session set in Init()! Aborting initialization..."),Promise.reject();if(this._requesting)return console.error("DIVEWebXROrigin: Currently initializing! Aborting initialization..."),Promise.reject();this._requesting=!0;const t=await this._session.requestReferenceSpace("viewer");return this._hitTestSource=await this._session.requestHitTestSource({space:t,entityTypes:this._entityTypes})||null,this._requesting=!1,this._hitTestSource?(this._initialized=!0,Promise.resolve(this)):Promise.reject()}Dispose(){var t;this._initialized=!1,this._requesting=!1,(t=this._hitTestSource)==null||t.cancel(),this._hitTestSource=null,this._hitTestResultBuffer=[],this._matrix=new s.Matrix4,this._position=new s.Vector3,this._quaternion=new s.Quaternion,this._scale=new s.Vector3}Update(t){if(this._initialized){if(!this._hitTestSource)throw new Error("DIVEWebXRRaycaster: Critical Error: HitTestSource not available but WebXROrigin is initialized!");if(this._hitTestResultBuffer=t.getHitTestResults(this._hitTestSource),this._hitTestResultBuffer.length>0){if(this._referenceSpaceBuffer=this._renderer.xr.getReferenceSpace(),!this._referenceSpaceBuffer){this.onHitLost();return}const e=this._hitTestResultBuffer[0].getPose(this._referenceSpaceBuffer);if(!e){this.onHitLost();return}this.onHitFound(e)}else this.onHitLost()}}onHitFound(t){this._raycastHitCounter++,this.matrix.fromArray(t.transform.matrix),this._raycastHitCounter>50&&this._originSetResolve()}onHitLost(){this._raycastHitCounter=0}}class w extends d{constructor(t){super(),this._touchCount=0,this._touches=[],this._handleRotateStarted=!1,this._handleRotateMoved=!1,this._handleRotateEnded=!1,this._startAngle=0,this._lastAngle=0,this._angleDelta=0,this._handlePinchStarted=!1,this._handlePinchMoved=!1,this._handlePinchEnded=!1,this._scaleDistanceStart=0,this._currentDistance=1,this._deltaDistance=0,this._session=t,this._touches=[{start:new s.Vector2,current:new s.Vector2,delta:new s.Vector2},{start:new s.Vector2,current:new s.Vector2,delta:new s.Vector2}],this._handleRotateStarted=!1,window.addEventListener("touchstart",e=>this.onTouchStart(e)),window.addEventListener("touchmove",e=>this.onTouchMove(e)),window.addEventListener("touchend",e=>this.onTouchEnd(e)),this._session.addEventListener("selectstart",()=>this.onSessionSelectStart()),this._session.addEventListener("selectend",()=>this.onSessionSelectEnd())}Dispose(){window.removeEventListener("touchstart",t=>this.onTouchStart(t)),window.removeEventListener("touchmove",t=>this.onTouchMove(t)),window.removeEventListener("touchend",t=>this.onTouchEnd(t)),this._session.removeEventListener("selectstart",()=>this.onSessionSelectStart()),this._session.removeEventListener("selectend",()=>this.onSessionSelectEnd())}onTouchStart(t){this._touchCount=t.touches.length,this._touches[0].start.set(t.touches[0].clientX,t.touches[0].clientY),this._touches[0].current.set(t.touches[0].clientX,t.touches[0].clientY),this._touches[0].delta.set(0,0),this._touchCount>1&&(this._touches[1].start.set(t.touches[1].clientX,t.touches[1].clientY),this._touches[1].current.set(t.touches[1].clientX,t.touches[1].clientY),this._touches[1].delta.set(0,0)),this._touchCount===2&&(this.handleRotateStart(),this.handlePinchStart()),this._handleRotateStarted&&(this.dispatch("ROTATE_START",{current:0}),this._handleRotateStarted=!1),this._handlePinchStarted&&(this.dispatch("PINCH_START",{current:0}),this._handlePinchStarted=!1)}onTouchMove(t){this._touchCount=t.touches.length,this._touches[0].start.set(t.touches[0].clientX,t.touches[0].clientY),this._touches[0].current.set(t.touches[0].clientX,t.touches[0].clientY),this._touches[0].delta.copy(this._touches[0].current.clone().sub(this._touches[0].start)),this._touchCount>1&&(this._touches[1].start.set(t.touches[1].clientX,t.touches[1].clientY),this._touches[1].current.set(t.touches[1].clientX,t.touches[1].clientY),this._touches[1].delta.copy(this._touches[1].current.clone().sub(this._touches[1].start))),this._touchCount===2&&(this.handleRotateMoved(),this.handlePinchMoved()),this._touchCount===1&&this.dispatch("TOUCH_MOVE",{touches:[{current:this._touches[0].current.clone(),delta:this._touches[0].delta.clone()},{current:this._touches[1].current.clone(),delta:this._touches[1].delta.clone()}],touchCount:this._touchCount}),this._touchCount===2&&(this._handleRotateMoved&&(this.dispatch("ROTATE_MOVE",{current:this._lastAngle,delta:this._angleDelta}),this._handleRotateMoved=!1),this._handlePinchMoved&&(this.dispatch("PINCH_MOVE",{current:this._currentDistance,delta:this._deltaDistance}),this._handlePinchMoved=!1))}onTouchEnd(t){this._touchCount=t.touches.length,this._touchCount===0&&(this._touches[0].start.set(0,0),this._touches[0].current.set(0,0),this._touches[0].delta.set(0,0)),this._touchCount===1&&(this.handleRotateEnded(),this.handlePinchEnded(),this._touches[1].start.set(0,0),this._touches[1].current.set(0,0),this._touches[1].delta.set(0,0)),this._handleRotateEnded&&(this.dispatch("ROTATE_END",{current:this._lastAngle}),this._handleRotateEnded=!1),this._handlePinchEnded&&(this.dispatch("PINCH_END",{current:this._currentDistance}),this._handlePinchEnded=!1)}onSessionSelectStart(){this.dispatch("TOUCH_START",{touches:[{current:this._touches[0].current.clone()},{current:this._touches[1].current.clone()}],touchCount:this._touchCount})}onSessionSelectEnd(){this.dispatch("TOUCH_END",{touches:[{current:this._touches[0].current.clone()},{current:this._touches[1].current.clone()}],touchCount:this._touchCount})}handleRotateStart(){this._handleRotateStarted=!0,this._startAngle=this._touches[1].start.clone().sub(this._touches[0].current).angle()}handleRotateMoved(){this._handleRotateMoved=!0;const t=this._touches[1].current.clone().sub(this._touches[0].current).angle();this._angleDelta=t-this._startAngle,this._lastAngle=this._angleDelta*-1}handleRotateEnded(){this._handleRotateEnded=!0}handlePinchStart(){this._handlePinchStarted=!0,this._scaleDistanceStart=this._touches[1].start.distanceTo(this._touches[0].current)}handlePinchMoved(){this._handlePinchMoved=!0;const t=this._currentDistance,e=this._touches[1].current.distanceTo(this._touches[0].current);this._currentDistance=e/this._scaleDistanceStart,this._deltaDistance=this._currentDistance-t}handlePinchEnded(){this._handlePinchEnded=!0}}class T extends s.Object3D{constructor(t,e,i){super(),this._frameBuffer=null,this._handNodeInitialPosition=new s.Vector3,this._placed=!1,this._grabbedObject=null,this._arHitPosition=new s.Vector3,this._arHitQuaternion=new s.Quaternion,this._arHitScale=new s.Vector3(1,1,1),this._initialObjectPosition=null,this._initialRaycastHit=null,this._deltaRaycastHit=new s.Vector3,this._touchQuaterion=new s.Quaternion,this._touchScale=1,this._scaleThreshold=.1,this._startTouchQuaternion=new s.Quaternion,this._startTouchScale=1,this._renderer=e,this._scene=i,this._session=t,this._xrRaycaster=new y(t,e,i),this._origin=new E(this._session,this._renderer,["plane"]),this._crosshair=new m,this._crosshair.visible=!1,this._xrCamera=this._renderer.xr.getCamera(),this._scene.XRRoot.XRHandNode.position.set(0,-.05,-.25),this._handNodeInitialPosition=this._scene.XRRoot.XRHandNode.position.clone(),this._touchscreenControls=new w(this._session),this._touchscreenControls.Subscribe("TOUCH_START",()=>this.onTouchStart()),this._touchscreenControls.Subscribe("TOUCH_MOVE",()=>this.onTouchMove()),this._touchscreenControls.Subscribe("TOUCH_END",r=>this.onTouchEnd(r)),this._touchscreenControls.Subscribe("ROTATE_START",()=>this.onRotateStart()),this._touchscreenControls.Subscribe("ROTATE_MOVE",r=>this.onRotateMove(r)),this._touchscreenControls.Subscribe("PINCH_START",()=>this.onPinchStart()),this._touchscreenControls.Subscribe("PINCH_MOVE",r=>this.onPinchMove(r))}async Init(){return this.prepareScene(),await this.initOrigin(),await this.initRaycaster(),Promise.resolve(this)}Dispose(){this.restoreScene(),this._origin.Dispose(),this._xrRaycaster.Dispose(),this._placed=!1}Update(t){this._frameBuffer=t,this._placed||(this.updateHandNode(),this._origin&&this._origin.Update(t))}updateHandNode(){this._xrCamera.updateMatrixWorld(),this._scene.XRRoot.XRHandNode.position.copy(this._handNodeInitialPosition.clone().applyMatrix4(this._xrCamera.matrixWorld)),this._scene.XRRoot.XRHandNode.quaternion.setFromRotationMatrix(this._xrCamera.matrixWorld)}async initOrigin(){this._origin=await this._origin.Init(),this._origin.originSet.then(()=>{this.placeObjects(this._origin.matrix)})}placeObjects(t){this._scene.XRRoot.XRModelRoot.matrix.copy(t),[...this._scene.XRRoot.XRHandNode.children].forEach(e=>{this._scene.XRRoot.XRModelRoot.add(e)}),this._placed=!0}updateObject(){this._grabbedObject&&(this._grabbedObject.position.copy(this._arHitPosition),this._grabbedObject.quaternion.copy(this._arHitQuaternion.clone().multiply(this._touchQuaterion)),this._grabbedObject.scale.copy(new s.Vector3(this._touchScale,this._touchScale,this._touchScale).multiply(this._arHitScale)))}onTouchStart(){const t=this._xrRaycaster.GetSceneIntersections();if(console.log("sceneHits",t),t.length===0||!t[0].object)return;const e=_(t[0].object,"isMovable");e&&(this._grabbedObject=e)}onTouchMove(){if(!this._frameBuffer||!this._grabbedObject)return;const t=this._xrRaycaster.GetARIntersections(this._frameBuffer);if(t.length===0){this._crosshair.visible=!1;return}const e=t[0];this._crosshair.visible=!0,this._crosshair.matrix.copy(e.matrix),this._grabbedObject&&((!this._initialObjectPosition||!this._initialRaycastHit)&&(this._initialObjectPosition=this._grabbedObject.position.clone(),this._initialRaycastHit=e.point.clone()),e.matrix.decompose(this._arHitPosition,this._arHitQuaternion,this._arHitScale),this._deltaRaycastHit.copy(e.point.clone().sub(this._initialRaycastHit)),this._arHitPosition.copy(this._initialObjectPosition.clone().add(this._deltaRaycastHit)),console.log("arHitPosition",this._arHitPosition),this.updateObject())}onTouchEnd(t){t.touchCount===0&&(this._crosshair.visible=!1,this._initialObjectPosition=null,this._initialRaycastHit=null,this._grabbedObject=null)}onRotateStart(){this._startTouchQuaternion=this._touchQuaterion.clone()}onRotateMove(t){this._touchQuaterion.setFromAxisAngle(new s.Vector3(0,-1,0),t.delta*3),this._touchQuaterion.multiply(this._startTouchQuaternion),this.updateObject()}onPinchStart(){this._startTouchScale=this._touchScale}onPinchMove(t){this._touchScale=this._startTouchScale*t.current,this.updateObject()}prepareScene(){this._scene.XRRoot.XRModelRoot.matrixAutoUpdate=!1,this._scene.add(this._crosshair);const t=[];this._scene.Root.children.forEach(e=>{const i=e.clone();i.layers.enableAll(),i.traverse(r=>{r.layers.enableAll(),r instanceof s.Mesh&&r.scale.set(.1,.1,.1)}),i.position.set(0,0,0),t.push(i)}),this._scene.XRRoot.XRHandNode.add(...t)}restoreScene(){this._scene.remove(this._crosshair),this._scene.XRRoot.XRHandNode.clear(),this._scene.XRRoot.XRModelRoot.clear(),this._scene.XRRoot.XRModelRoot.matrixAutoUpdate=!0}async initRaycaster(){if(await this._xrRaycaster.Init(),!this._xrRaycaster)return console.error("Raycaster not initialized successfully. Aborting WebXR..."),this.Dispose(),Promise.reject()}}const o=class o{static async Launch(t,e,i){if(this._renderer=t,this._scene=e,this._controller=i,this._cameraPosition=this._controller.object.position.clone(),this._cameraTarget=this._controller.target.clone(),!navigator.xr)return console.error("WebXR not supported"),Promise.reject();if(this._renderer.xr.enabled=!0,this._scene.InitXR(t),!o._overlay){const a=new S;o._overlay=a}o._options.domOverlay={root:o._overlay.Element};const r=await navigator.xr.requestSession("immersive-ar",this._options);return r.addEventListener("end",()=>{this._onSessionEnded()}),t.xr.setReferenceSpaceType(this._referenceSpaceType),await t.xr.setSession(r),o._overlay.Element.style.display="",this._session=r,o._overlay.CloseButton.addEventListener("click",()=>this.End()),await this._onSessionStarted(),Promise.resolve()}static Update(t,e){this._session&&this._xrController&&this._xrController.Update(e)}static End(){this._session&&this._session.end()}static async _onSessionStarted(){if(this._session)return this._renderCallbackId=this._renderer.AddPreRenderCallback((t,e)=>{this.Update(t,e)}),this._xrController=new T(this._session,this._renderer,this._scene),await this._xrController.Init().catch(()=>{this.End()}),Promise.resolve()}static _onSessionEnded(){if(!this._session)return;this._xrController&&this._xrController.Dispose(),this._renderCallbackId&&(this._renderer.RemovePreRenderCallback(this._renderCallbackId),this._renderCallbackId=null),this._renderer.xr.enabled=!1;const t=this._renderer.domElement.parentElement;if(t){const{clientWidth:e,clientHeight:i}=t;this._renderer.OnResize(e,i),this._controller.object.OnResize(e,i)}this._controller.object.position.copy(this._cameraPosition),this._controller.target.copy(this._cameraTarget),this._cameraPosition.set(0,0,0),this._cameraTarget.set(0,0,0),this._scene.DisposeXR(),this._session.removeEventListener("end",this._onSessionEnded),o._overlay.Element.style.display="none",this._session=null}};o._renderCallbackId=null,o._session=null,o._referenceSpaceType="local",o._overlay=null,o._options={requiredFeatures:["local","hit-test"],optionalFeatures:["light-estimation","local-floor","dom-overlay","depth-sensing"],depthSensing:{usagePreference:["gpu-optimized"],dataFormatPreference:[]},domOverlay:{root:{}}},o._xrController=null;let l=o;class H{static Launch(t,e){const i=this.findSceneViewerSrc(t);this.launchSceneViewer(i,e)}static launchSceneViewer(t,e){const i=document.createElement("a"),r="#model-viewer-no-ar-fallback",a=self.location.toString(),c=new URL(a),u=new URL(t,a),h=new URLSearchParams(u.search);c.hash=r,h.set("mode","ar_only"),(e==null?void 0:e.arScale)==="fixed"&&h.set("resizable","false"),(e==null?void 0:e.arPlacement)==="vertical"&&h.set("enable_vertical_placement","true");const f=`intent://arvr.google.com/scene-viewer/1.2?${h.toString()+"&file="+u.toString()}#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;S.browser_fallback_url=${encodeURIComponent(c.toString())};end;`;i.setAttribute("href",f),i.click()}static findSceneViewerSrc(t){let e=null;if(t.traverse(i=>{e||i.userData.uri&&(e=i.userData.uri)}),!e)throw new Error("No model found in scene");return e}}class v{constructor(t,e,i){this._renderer=t,this._scene=e,this._controller=i}async Launch(t){const e=s.DIVEInfo.GetSystem();if(e==="iOS")return this.tryARQuickLook();if(e==="Android")return t!=null&&t.useWebXR?(console.warn("DIVE: WebXR is experimental on Android."),this.tryWebXR()):this.trySceneViewer();console.log("DIVE: AR not supported. Not a mobile system. (System is "+e+")")}async tryARQuickLook(t){return s.DIVEInfo.GetSupportsARQuickLook()?(console.log("DIVE: Launching AR with ARQuickLook ..."),await p.Launch(this._scene,t),Promise.resolve()):(console.log("ARQuickLook not supported"),Promise.reject())}async tryWebXR(){return await s.DIVEInfo.GetSupportsWebXR()?(console.log("DIVE: Launching AR with WebXR ..."),await l.Launch(this._renderer,this._scene,this._controller),Promise.resolve()):(console.log("WebXR not supported. Reason: "+s.WebXRUnsupportedReason[s.DIVEInfo.GetWebXRUnsupportedReason()]),Promise.reject())}async trySceneViewer(t){return console.log("DIVE: Launching AR with SceneViewer ..."),H.Launch(this._scene,t),Promise.resolve()}}exports.DIVEAR=v;
|
|
2
|
+
//# sourceMappingURL=AR-ySzrfSW3.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AR-ySzrfSW3.cjs","sources":["../src/helper/isInterface/implementsInterface.ts","../src/helper/findInterface/findInterface.ts","../src/ar/arquicklook/ARQuickLook.ts","../src/ar/webxr/overlay/Overlay.ts","../src/ar/webxr/crosshair/WebXRCrosshair.ts","../src/ar/webxr/raycaster/ar/WebXRRaycasterAR.ts","../src/ar/webxr/raycaster/three/WebXRRaycasterTHREE.ts","../src/events/EventExecutor.ts","../src/ar/webxr/raycaster/WebXRRaycaster.ts","../src/ar/webxr/origin/WebXROrigin.ts","../src/ar/webxr/touchscreencontrols/WebXRTouchscreenControls.ts","../src/ar/webxr/controller/WebXRController.ts","../src/ar/webxr/WebXR.ts","../src/ar/sceneviewer/SceneViewer.ts","../src/ar/AR.ts"],"sourcesContent":["import { type Object3D } from 'three';\n\nexport function implementsInterface<T>(\n object: Object3D | null | undefined,\n discriminator: string,\n): object is Object3D & T {\n if (!object) return false;\n return discriminator in object;\n}\n","import { implementsInterface } from '../isInterface/implementsInterface';\nimport { type Object3D } from 'three';\n\nexport function findInterface<T>(\n object: Object3D | null | undefined,\n discriminator: string,\n): (Object3D & T) | undefined {\n if (!object) return undefined;\n\n if (implementsInterface<T>(object, discriminator)) return object;\n\n return findInterface<T>(object.parent, discriminator);\n}\n","import { type DIVEScene } from '../../scene/Scene';\nimport { type DIVEAROptions } from '../AR';\n\nexport class DIVEARQuickLook {\n public static Launch(\n scene: DIVEScene,\n options?: DIVEAROptions,\n ): Promise<void> {\n const url = this.findARQuickLookSrc(scene);\n\n // launch ARQuickLook\n return this.launchARQuickLook(url, options);\n }\n\n private static launchARQuickLook(\n uri: string,\n options?: DIVEAROptions,\n ): Promise<void> {\n return new Promise((resolve) => {\n if (options?.arScale === 'fixed') {\n uri = uri.concat('#allowsContentScaling=0');\n }\n\n // launch ARQuickLook\n const a = document.createElement('a');\n a.innerHTML = '<picture></picture>'; // This is actually needed so the viewer opens instantly\n a.rel = 'ar';\n a.href = uri;\n a.download = 'scene.usdz';\n resolve();\n a.click();\n });\n }\n\n private static findARQuickLookSrc(scene: DIVEScene): string {\n let uri: string | null = null;\n\n scene.traverse((object) => {\n if (uri) return;\n if (object.userData.uri) {\n uri = object.userData.uri;\n }\n });\n\n if (!uri) {\n throw new Error('No model found in scene');\n }\n\n return uri;\n }\n\n // private static extractModels(scene: DIVEScene): Object3D[] {\n // // extract models\n // return scene.Root.children;\n // }\n\n // private static launchARFromNode(\n // node: Object3D,\n // options?: DIVEAROptions,\n // ): Promise<void> {\n // // bundle USDZ\n // return this._usdzExporter\n // .parse(node, {\n // quickLookCompatible: true,\n // ar: {\n // anchoring: { type: 'plane' },\n // planeAnchoring: {\n // alignment:\n // options?.arPlacement === 'vertical'\n // ? 'vertical'\n // : 'horizontal',\n // },\n // },\n // })\n // .then((usdz: Uint8Array) => {\n // // create blob\n // const blob = new Blob([usdz], { type: 'model/vnd.usdz+zip' });\n // let url = URL.createObjectURL(blob);\n\n // if (options?.arScale === 'fixed') {\n // url = url.concat('#allowsContentScaling=0');\n // }\n\n // // launch ARQuickLook\n // const a = document.createElement('a');\n // a.innerHTML = '<picture></picture>'; // This is actually needed so the viewer opens instantly\n // a.rel = 'ar';\n // a.href = url;\n // a.download = 'scene.usdz';\n // a.click();\n // });\n // }\n}\n","export class Overlay {\n private _element: HTMLDivElement;\n public get Element(): HTMLDivElement {\n return this._element;\n }\n\n private _closeButton: SVGSVGElement;\n public get CloseButton(): SVGSVGElement {\n return this._closeButton;\n }\n\n constructor() {\n // create div\n this._element = document.createElement('div');\n\n // create and append close button to overlay\n this._closeButton = this.createCloseButton();\n this._element.appendChild(this._closeButton);\n\n // append overlay to body\n document.body.appendChild(this._element);\n }\n\n private createCloseButton(): SVGSVGElement {\n // create svg path\n const path = document.createElementNS(\n 'http://www.w3.org/2000/svg',\n 'path',\n );\n path.setAttribute('d', 'M 12,12 L 28,28 M 28,12 12,28');\n path.setAttribute('stroke', '#fff');\n path.setAttribute('stroke-width', '2');\n\n // create svg\n const svg = document.createElementNS(\n 'http://www.w3.org/2000/svg',\n 'svg',\n );\n svg.setAttribute('width', '38');\n svg.setAttribute('height', '38');\n svg.style.position = 'absolute';\n svg.style.right = '20px';\n svg.style.top = '20px';\n\n // append path to svg\n svg.appendChild(path);\n\n return svg;\n }\n}\n","import { Mesh, MeshBasicMaterial, Object3D, RingGeometry } from 'three';\n\nexport class DIVEWebXRCrosshair extends Object3D {\n public set mesh(mesh: Mesh | undefined) {\n this.clear();\n\n if (mesh) {\n this.add(mesh);\n }\n }\n\n constructor(mesh?: Mesh) {\n super();\n\n if (mesh) {\n this.mesh = mesh;\n } else {\n this.UseDefaultMesh();\n }\n\n this.matrixAutoUpdate = false;\n\n return this;\n }\n\n public UseDefaultMesh(): void {\n const geometry = new RingGeometry(0.08, 0.1, 32).rotateX(-Math.PI / 2);\n const material = new MeshBasicMaterial();\n this.mesh = new Mesh(geometry, material);\n }\n\n public UpdateFromPose(pose: XRPose): void {\n this.matrix.fromArray(pose.transform.matrix);\n }\n}\n","import { Matrix4, Vector3 } from 'three';\nimport { type DIVERenderer } from '../../../../renderer/Renderer';\nimport { type DIVEHitResult } from '../WebXRRaycaster';\n\nexport class DIVEWebXRRaycasterAR {\n private _session: XRSession;\n private _renderer: DIVERenderer;\n\n private _transientHitTestSource: XRTransientInputHitTestSource | undefined;\n private _referenceSpaceBuffer: XRReferenceSpace | null = null;\n\n private _requesting: boolean = false;\n private _initialized: boolean = false;\n\n private _hitMatrixBuffer: Matrix4;\n\n constructor(session: XRSession, renderer: DIVERenderer) {\n this._session = session;\n this._renderer = renderer;\n\n this._hitMatrixBuffer = new Matrix4();\n }\n\n public Dispose(): void {\n this._transientHitTestSource?.cancel();\n this._transientHitTestSource = undefined;\n\n this._initialized = false;\n }\n\n public async Init(): Promise<this> {\n if (!this._session) {\n console.error(\n 'DIVEWebXRRaycaster: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._requesting) {\n console.error(\n 'DIVEWebXRRaycaster: Currently initializing! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._initialized) {\n console.error(\n 'DIVEWebXRRaycaster: Already initialized! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n this._requesting = true;\n this._transientHitTestSource = await this._session\n .requestHitTestSourceForTransientInput!({\n profile: 'generic-touchscreen',\n });\n this._referenceSpaceBuffer = this._renderer.xr.getReferenceSpace();\n this._requesting = false;\n\n if (!this._transientHitTestSource) {\n return Promise.reject();\n }\n\n this._initialized = true;\n\n console.log('DIVEWebXRRaycasterAR: Initialized');\n\n return Promise.resolve(this);\n }\n\n public GetIntersections(frame: XRFrame): DIVEHitResult[] {\n if (!this._transientHitTestSource) return [];\n\n const touches = frame.getHitTestResultsForTransientInput(\n this._transientHitTestSource,\n );\n if (touches.length === 0) return [];\n\n const hits = touches.map((touch: XRTransientInputHitTestResult) => {\n if (!this._referenceSpaceBuffer) return undefined;\n if (!touch.results[0]) return undefined;\n if (!touch.results[0].getPose) return undefined;\n\n const pose = touch.results[0].getPose(this._referenceSpaceBuffer);\n if (!pose) return undefined;\n\n this._hitMatrixBuffer.fromArray(pose.transform.matrix);\n const position = new Vector3().setFromMatrixPosition(\n this._hitMatrixBuffer,\n );\n\n return {\n point: position,\n matrix: this._hitMatrixBuffer,\n object: undefined,\n };\n });\n\n return hits.filter((hit) => hit !== undefined) as DIVEHitResult[];\n }\n}\n","import {\n type Intersection,\n type Mesh,\n Raycaster,\n type XRTargetRaySpace,\n} from 'three';\nimport { type DIVERenderer } from '../../../../renderer/Renderer';\nimport { type DIVEScene } from '../../../../scene/Scene';\nimport { type DIVEHitResult } from '../WebXRRaycaster';\n\nexport class DIVEWebXRRaycasterTHREE {\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n\n private _controller: XRTargetRaySpace;\n\n // internal raycaster\n private _raycaster: Raycaster = new Raycaster();\n\n constructor(renderer: DIVERenderer, scene: DIVEScene) {\n this._renderer = renderer;\n this._scene = scene;\n\n this._controller = this._renderer.xr.getController(0);\n }\n\n public async Init(): Promise<this> {\n console.log('DIVEWebXRRaycasterTHREE: Initialized');\n return Promise.resolve(this);\n }\n\n public GetIntersections(): DIVEHitResult[] {\n this._controller.updateMatrixWorld();\n this._raycaster.setFromXRController(this._controller);\n const intersections = this._raycaster.intersectObjects(\n this._scene.XRRoot.XRModelRoot.children,\n );\n\n if (intersections.length === 0) return [];\n\n return intersections.map((intersection: Intersection) => {\n return {\n point: intersection.point,\n matrix: intersection.object.matrixWorld,\n object: intersection.object as Mesh,\n };\n });\n }\n}\n","export class DIVEEventExecutor<T> {\n private _listeners: Map<keyof T, ((payload: T[keyof T]) => void)[]> =\n new Map();\n\n public Subscribe<S extends keyof T>(\n type: S,\n listener: (payload: T[S]) => void,\n ): () => boolean {\n if (!this._listeners.get(type)) this._listeners.set(type, []);\n\n this._listeners\n .get(type)!\n .push(listener as (payload: T[keyof T]) => void);\n\n return () => {\n const listenerArray = this._listeners.get(type);\n if (!listenerArray) return false;\n\n const existingIndex = listenerArray.findIndex(\n (entry) => entry === listener,\n );\n if (existingIndex === -1) return false;\n\n listenerArray.splice(existingIndex, 1);\n return true;\n };\n }\n\n protected dispatch<S extends keyof T>(type: S, payload?: T[S]): void {\n const listenerArray = this._listeners.get(type);\n if (!listenerArray) return;\n\n listenerArray.forEach((listener) => listener(payload as T[S]));\n }\n}\n","import { Matrix4, Mesh, Vector3 } from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\nimport { DIVEWebXRRaycasterAR } from './ar/WebXRRaycasterAR';\nimport { DIVEWebXRRaycasterTHREE } from './three/WebXRRaycasterTHREE';\nimport { DIVEScene } from '../../../scene/Scene';\nimport { DIVEEventExecutor } from '../../../events/EventExecutor';\n\n/**\n * object is undefined when AR world is hit.\n */\nexport type DIVEHitResult = {\n point: Vector3;\n matrix: Matrix4;\n object?: Mesh;\n};\n\nexport type DIVEWebXRRaycasterEvents = {\n AR_HIT_FOUND: {\n hit: DIVEHitResult;\n };\n AR_HIT_LOST: undefined;\n SCENE_HIT_FOUND: {\n hit: DIVEHitResult;\n };\n SCENE_HIT_LOST: undefined;\n};\n\nexport class DIVEWebXRRaycaster extends DIVEEventExecutor<DIVEWebXRRaycasterEvents> {\n private _session: XRSession;\n\n private _initialized: boolean = false;\n\n private _threeRaycaster: DIVEWebXRRaycasterTHREE;\n private _arRaycaster: DIVEWebXRRaycasterAR;\n\n private _arHitResultBuffer: DIVEHitResult[] = [];\n private _sceneHitResultBuffer: DIVEHitResult[] = [];\n\n // buffers\n private _hasHit: boolean = false;\n\n constructor(session: XRSession, renderer: DIVERenderer, scene: DIVEScene) {\n super();\n\n this._session = session;\n\n this._threeRaycaster = new DIVEWebXRRaycasterTHREE(renderer, scene);\n this._arRaycaster = new DIVEWebXRRaycasterAR(session, renderer);\n }\n\n public Dispose(): void {\n // dispose code here\n this._initialized = false;\n }\n\n public async Init(): Promise<this> {\n if (!this._session) {\n console.error(\n 'DIVEWebXRRaycaster: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._initialized) {\n console.error(\n 'DIVEWebXRRaycaster: Already initialized! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n await this._threeRaycaster.Init();\n await this._arRaycaster.Init();\n\n console.log('DIVEWebXRRaycaster: Initialized');\n\n this._initialized = true;\n\n return Promise.resolve(this);\n }\n\n public GetARIntersections(frame: XRFrame): DIVEHitResult[] {\n // check for ar hits\n this._arHitResultBuffer = this._arRaycaster.GetIntersections(frame);\n if (this._arHitResultBuffer.length > 0) {\n // hit found\n this.onARHitFound(this._arHitResultBuffer[0]);\n } else {\n // hit nothing\n this.onARHitLost();\n }\n return this._arHitResultBuffer;\n }\n\n public GetSceneIntersections(): DIVEHitResult[] {\n // check for scene hits\n this._sceneHitResultBuffer = this._threeRaycaster.GetIntersections();\n if (this._sceneHitResultBuffer.length > 0) {\n // scene hit found\n this.onSceneHitFound(this._sceneHitResultBuffer[0]);\n // early return to prevent ar raycaster from overriding scene hit\n } else {\n // scene hit nothing\n this.onSceneHitLost();\n }\n return this._sceneHitResultBuffer;\n }\n\n private onARHitFound(hit: DIVEHitResult): void {\n this._hasHit = true;\n this.dispatch('AR_HIT_FOUND', { hit });\n }\n\n private onARHitLost(): void {\n if (!this._hasHit) return;\n\n this._hasHit = false;\n this.dispatch('AR_HIT_LOST');\n }\n\n private onSceneHitFound(hit: DIVEHitResult): void {\n this._hasHit = true;\n this.dispatch('SCENE_HIT_FOUND', { hit });\n }\n\n private onSceneHitLost(): void {\n if (!this._hasHit) return;\n\n this._hasHit = false;\n this.dispatch('SCENE_HIT_LOST');\n }\n}\n","import { Matrix4, Quaternion, Vector3 } from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\n\nexport class DIVEWebXROrigin {\n private _renderer: DIVERenderer;\n private _session: XRSession;\n\n private _requesting: boolean;\n private _initialized: boolean;\n\n private _referenceSpaceBuffer: XRReferenceSpace | null;\n private _hitTestSource: XRHitTestSource | null;\n\n private _entityTypes: XRHitTestTrackableType[];\n\n private _hitTestResultBuffer: XRHitTestResult[];\n private _raycastHitCounter: number = 0;\n\n private _originSet: Promise<void>;\n private _originSetResolve: (value: void) => void = () => {};\n public get originSet(): Promise<void> {\n return this._originSet;\n }\n\n private _matrix: Matrix4;\n public get matrix(): Matrix4 {\n return this._matrix;\n }\n private set matrix(value: Matrix4) {\n this._matrix = value;\n this._matrix.decompose(this._position, this._quaternion, this._scale);\n }\n\n private _position: Vector3;\n public get position(): Vector3 {\n return this._position;\n }\n\n private _quaternion: Quaternion;\n public get quaternion(): Quaternion {\n return this._quaternion;\n }\n\n private _scale: Vector3;\n public get scale(): Vector3 {\n return this._scale;\n }\n\n constructor(\n session: XRSession,\n renderer: DIVERenderer,\n entityTypes?: XRHitTestTrackableType[],\n ) {\n this._renderer = renderer;\n this._session = session;\n\n this._originSet = new Promise<void>((resolve) => {\n this._originSetResolve = resolve;\n });\n\n this._requesting = false;\n this._initialized = false;\n\n this._referenceSpaceBuffer = null;\n this._hitTestSource = null;\n\n this._entityTypes = entityTypes || ['plane'];\n\n this._hitTestResultBuffer = [];\n\n // set up promises and executors\n this._matrix = new Matrix4();\n this._position = new Vector3();\n this._quaternion = new Quaternion();\n this._scale = new Vector3();\n\n // when origin is set, decompose matrix into position, quaternion and scale\n this._originSet.then(() => {\n // decompose matrix into position, quaternion and scale\n this._matrix.decompose(\n this._position,\n this._quaternion,\n this._scale,\n );\n });\n }\n\n public async Init(): Promise<this> {\n if (this._initialized) {\n return Promise.resolve(this);\n }\n\n if (!this._session) {\n console.error(\n 'DIVEWebXROrigin: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._requesting) {\n console.error(\n 'DIVEWebXROrigin: Currently initializing! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n this._requesting = true;\n const referenceSpace =\n await this._session.requestReferenceSpace('viewer');\n this._hitTestSource =\n (await this._session.requestHitTestSource!({\n space: referenceSpace,\n entityTypes: this._entityTypes,\n })) || null;\n this._requesting = false;\n\n if (!this._hitTestSource) {\n return Promise.reject();\n }\n\n this._initialized = true;\n\n return Promise.resolve(this);\n }\n\n public Dispose(): void {\n this._initialized = false;\n this._requesting = false;\n\n this._hitTestSource?.cancel();\n\n this._hitTestSource = null;\n this._hitTestResultBuffer = [];\n\n this._matrix = new Matrix4();\n this._position = new Vector3();\n this._quaternion = new Quaternion();\n this._scale = new Vector3();\n }\n\n public Update(frame: XRFrame): void {\n if (!this._initialized) return;\n\n if (!this._hitTestSource) {\n throw new Error(\n 'DIVEWebXRRaycaster: Critical Error: HitTestSource not available but WebXROrigin is initialized!',\n );\n }\n\n // get hit test results\n this._hitTestResultBuffer = frame.getHitTestResults(\n this._hitTestSource,\n );\n if (this._hitTestResultBuffer.length > 0) {\n // hit found\n this._referenceSpaceBuffer = this._renderer.xr.getReferenceSpace();\n\n // if there is no reference space, hit will be counted as lost for this frame\n if (!this._referenceSpaceBuffer) {\n this.onHitLost();\n return;\n }\n\n const pose = this._hitTestResultBuffer[0].getPose(\n this._referenceSpaceBuffer,\n );\n if (!pose) {\n this.onHitLost();\n return;\n }\n\n this.onHitFound(pose);\n } else {\n this.onHitLost();\n }\n }\n\n private onHitFound(pose: XRPose): void {\n this._raycastHitCounter++;\n\n this.matrix.fromArray(pose.transform.matrix);\n\n // we have to wait for a certain amount of frames to make sure the origin is set\n if (this._raycastHitCounter > 50) {\n this._originSetResolve();\n }\n }\n\n private onHitLost(): void {\n this._raycastHitCounter = 0;\n }\n}\n","import { Vector2 } from 'three';\nimport { DIVEEventExecutor } from '../../../events/EventExecutor';\n\nexport type DIVETouchscreenEvents = {\n TOUCH_START: {\n touches: {\n current: Vector2;\n }[];\n touchCount: number;\n };\n TOUCH_MOVE: {\n touches: {\n current: Vector2;\n delta: Vector2;\n }[];\n touchCount: number;\n };\n TOUCH_END: {\n touches: {\n current: Vector2;\n }[];\n touchCount: number;\n };\n ROTATE_START: {\n current: number;\n };\n ROTATE_MOVE: {\n current: number;\n delta: number;\n };\n ROTATE_END: {\n current: number;\n };\n PINCH_START: {\n current: number;\n };\n PINCH_MOVE: {\n current: number;\n delta: number;\n };\n PINCH_END: {\n current: number;\n };\n};\n\ntype DIVETouch = {\n start: Vector2;\n current: Vector2;\n delta: Vector2;\n};\n\nexport class DIVEWebXRTouchscreenControls extends DIVEEventExecutor<DIVETouchscreenEvents> {\n // general members\n private _session: XRSession;\n\n // touch members\n private _touchCount: number = 0;\n private _touches: DIVETouch[] = [];\n\n // rotate members\n private _handleRotateStarted: boolean = false;\n private _handleRotateMoved: boolean = false;\n private _handleRotateEnded: boolean = false;\n\n private _startAngle: number = 0;\n private _lastAngle: number = 0;\n private _angleDelta: number = 0;\n\n // scale members\n private _handlePinchStarted: boolean = false;\n private _handlePinchMoved: boolean = false;\n private _handlePinchEnded: boolean = false;\n\n private _scaleDistanceStart: number = 0;\n private _currentDistance: number = 1;\n private _deltaDistance: number = 0;\n\n constructor(session: XRSession) {\n super();\n\n this._session = session;\n\n this._touches = [\n {\n start: new Vector2(),\n current: new Vector2(),\n delta: new Vector2(),\n },\n {\n start: new Vector2(),\n current: new Vector2(),\n delta: new Vector2(),\n },\n ];\n\n this._handleRotateStarted = false;\n\n window.addEventListener('touchstart', (e: TouchEvent) =>\n this.onTouchStart(e),\n );\n window.addEventListener('touchmove', (e: TouchEvent) =>\n this.onTouchMove(e),\n );\n window.addEventListener('touchend', (e: TouchEvent) =>\n this.onTouchEnd(e),\n );\n\n this._session.addEventListener('selectstart', () =>\n this.onSessionSelectStart(),\n );\n this._session.addEventListener('selectend', () =>\n this.onSessionSelectEnd(),\n );\n }\n\n public Dispose(): void {\n window.removeEventListener('touchstart', (e: TouchEvent) =>\n this.onTouchStart(e),\n );\n window.removeEventListener('touchmove', (e: TouchEvent) =>\n this.onTouchMove(e),\n );\n window.removeEventListener('touchend', (e: TouchEvent) =>\n this.onTouchEnd(e),\n );\n\n this._session.removeEventListener('selectstart', () =>\n this.onSessionSelectStart(),\n );\n this._session.removeEventListener('selectend', () =>\n this.onSessionSelectEnd(),\n );\n }\n\n private onTouchStart(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n this._touches[0].start.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].current.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].delta.set(0, 0);\n\n if (this._touchCount > 1) {\n this._touches[1].start.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].current.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].delta.set(0, 0);\n }\n\n if (this._touchCount === 2) {\n this.handleRotateStart();\n this.handlePinchStart();\n }\n\n if (this._handleRotateStarted) {\n this.dispatch('ROTATE_START', {\n current: 0,\n });\n this._handleRotateStarted = false;\n }\n\n if (this._handlePinchStarted) {\n this.dispatch('PINCH_START', {\n current: 0,\n });\n this._handlePinchStarted = false;\n }\n }\n\n private onTouchMove(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n this._touches[0].start.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].current.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].delta.copy(\n this._touches[0].current.clone().sub(this._touches[0].start),\n );\n\n if (this._touchCount > 1) {\n this._touches[1].start.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].current.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].delta.copy(\n this._touches[1].current.clone().sub(this._touches[1].start),\n );\n }\n\n if (this._touchCount === 2) {\n this.handleRotateMoved();\n this.handlePinchMoved();\n }\n\n if (this._touchCount === 1) {\n this.dispatch('TOUCH_MOVE', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n delta: this._touches[0].delta.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n delta: this._touches[1].delta.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n if (this._touchCount === 2) {\n if (this._handleRotateMoved) {\n this.dispatch('ROTATE_MOVE', {\n current: this._lastAngle,\n delta: this._angleDelta,\n });\n this._handleRotateMoved = false;\n }\n\n if (this._handlePinchMoved) {\n this.dispatch('PINCH_MOVE', {\n current: this._currentDistance,\n delta: this._deltaDistance,\n });\n this._handlePinchMoved = false;\n }\n }\n }\n\n private onTouchEnd(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n if (this._touchCount === 0) {\n this._touches[0].start.set(0, 0);\n this._touches[0].current.set(0, 0);\n this._touches[0].delta.set(0, 0);\n }\n\n if (this._touchCount === 1) {\n this.handleRotateEnded();\n this.handlePinchEnded();\n\n this._touches[1].start.set(0, 0);\n this._touches[1].current.set(0, 0);\n this._touches[1].delta.set(0, 0);\n }\n\n if (this._handleRotateEnded) {\n this.dispatch('ROTATE_END', {\n current: this._lastAngle,\n });\n this._handleRotateEnded = false;\n }\n\n if (this._handlePinchEnded) {\n this.dispatch('PINCH_END', {\n current: this._currentDistance,\n });\n this._handlePinchEnded = false;\n }\n }\n\n private onSessionSelectStart(): void {\n this.dispatch('TOUCH_START', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n private onSessionSelectEnd(): void {\n this.dispatch('TOUCH_END', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n // rotation handler\n private handleRotateStart(): void {\n this._handleRotateStarted = true;\n this._startAngle = this._touches[1].start\n .clone()\n .sub(this._touches[0].current)\n .angle();\n }\n\n private handleRotateMoved(): void {\n this._handleRotateMoved = true;\n const currentAngle = this._touches[1].current\n .clone()\n .sub(this._touches[0].current)\n .angle();\n this._angleDelta = currentAngle - this._startAngle;\n this._lastAngle = this._angleDelta * -1;\n }\n\n private handleRotateEnded(): void {\n this._handleRotateEnded = true;\n }\n\n // pinch handler\n private handlePinchStart(): void {\n this._handlePinchStarted = true;\n\n this._scaleDistanceStart = this._touches[1].start.distanceTo(\n this._touches[0].current,\n );\n }\n\n private handlePinchMoved(): void {\n this._handlePinchMoved = true;\n\n const beforeDistance = this._currentDistance;\n const distance = this._touches[1].current.distanceTo(\n this._touches[0].current,\n );\n this._currentDistance = distance / this._scaleDistanceStart;\n this._deltaDistance = this._currentDistance - beforeDistance;\n }\n\n private handlePinchEnded(): void {\n this._handlePinchEnded = true;\n }\n}\n","import {\n Matrix4,\n Mesh,\n Object3D,\n Quaternion,\n Vector3,\n WebXRArrayCamera,\n} from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\nimport { DIVEScene } from '../../../scene/Scene';\nimport { DIVEWebXRCrosshair } from '../crosshair/WebXRCrosshair';\nimport { DIVEWebXRRaycaster } from '../raycaster/WebXRRaycaster';\nimport { DIVEWebXROrigin } from '../origin/WebXROrigin';\nimport {\n DIVETouchscreenEvents,\n DIVEWebXRTouchscreenControls,\n} from '../touchscreencontrols/WebXRTouchscreenControls';\nimport { type DIVEMovable } from '../.././../interface/Movable';\nimport { findInterface } from '../../../helper/findInterface/findInterface';\n\nexport class DIVEWebXRController extends Object3D {\n // general members\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n private _session: XRSession;\n\n private _frameBuffer: XRFrame | null = null;\n\n // raycaster members\n private _xrRaycaster: DIVEWebXRRaycaster;\n private _origin: DIVEWebXROrigin;\n\n // crosshair\n private _crosshair: DIVEWebXRCrosshair;\n\n // controller members\n private _touchscreenControls: DIVEWebXRTouchscreenControls;\n private _handNodeInitialPosition = new Vector3();\n private _xrCamera: WebXRArrayCamera;\n private _placed: boolean = false;\n\n // grabbing\n private _grabbedObject: Object3D | null = null;\n private _arHitPosition: Vector3 = new Vector3();\n private _arHitQuaternion: Quaternion = new Quaternion();\n private _arHitScale: Vector3 = new Vector3(1, 1, 1);\n\n // grabbing position\n private _initialObjectPosition: Vector3 | null = null;\n private _initialRaycastHit: Vector3 | null = null;\n private _deltaRaycastHit: Vector3 = new Vector3();\n\n // grabbing rotation\n private _touchQuaterion: Quaternion = new Quaternion();\n\n // grabbing scale\n private _touchScale: number = 1;\n private _scaleThreshold: number = 0.1;\n\n constructor(session: XRSession, renderer: DIVERenderer, scene: DIVEScene) {\n super();\n\n this._renderer = renderer;\n this._scene = scene;\n this._session = session;\n\n this._xrRaycaster = new DIVEWebXRRaycaster(session, renderer, scene);\n this._origin = new DIVEWebXROrigin(this._session, this._renderer, [\n 'plane',\n ]);\n\n this._crosshair = new DIVEWebXRCrosshair();\n this._crosshair.visible = false;\n\n this._xrCamera = this._renderer.xr.getCamera();\n\n this._scene.XRRoot.XRHandNode.position.set(0, -0.05, -0.25);\n this._handNodeInitialPosition =\n this._scene.XRRoot.XRHandNode.position.clone();\n\n this._touchscreenControls = new DIVEWebXRTouchscreenControls(\n this._session,\n );\n\n // translating\n this._touchscreenControls.Subscribe('TOUCH_START', () =>\n this.onTouchStart(),\n );\n this._touchscreenControls.Subscribe('TOUCH_MOVE', () =>\n this.onTouchMove(),\n );\n this._touchscreenControls.Subscribe('TOUCH_END', (p) =>\n this.onTouchEnd(p),\n );\n\n // rotating\n this._touchscreenControls.Subscribe('ROTATE_START', () =>\n this.onRotateStart(),\n );\n this._touchscreenControls.Subscribe('ROTATE_MOVE', (p) =>\n this.onRotateMove(p),\n );\n\n // scaling\n this._touchscreenControls.Subscribe('PINCH_START', () =>\n this.onPinchStart(),\n );\n this._touchscreenControls.Subscribe('PINCH_MOVE', (p) =>\n this.onPinchMove(p),\n );\n }\n\n public async Init(): Promise<this> {\n this.prepareScene();\n\n await this.initOrigin();\n await this.initRaycaster();\n\n return Promise.resolve(this);\n }\n\n public Dispose(): void {\n this.restoreScene();\n\n this._origin.Dispose();\n this._xrRaycaster.Dispose();\n\n // reset placement members\n this._placed = false;\n }\n\n public Update(frame: XRFrame): void {\n this._frameBuffer = frame;\n\n if (!this._placed) {\n this.updateHandNode();\n\n if (this._origin) {\n this._origin.Update(frame);\n }\n }\n }\n\n private updateHandNode(): void {\n this._xrCamera.updateMatrixWorld();\n this._scene.XRRoot.XRHandNode.position.copy(\n this._handNodeInitialPosition\n .clone()\n .applyMatrix4(this._xrCamera.matrixWorld),\n );\n this._scene.XRRoot.XRHandNode.quaternion.setFromRotationMatrix(\n this._xrCamera.matrixWorld,\n );\n }\n\n // placement\n private async initOrigin(): Promise<void> {\n // initialize origin\n this._origin = await this._origin.Init();\n\n // set resolve callback: place objects at origin when it is set\n this._origin.originSet.then(() => {\n this.placeObjects(this._origin.matrix);\n });\n }\n\n private placeObjects(matrix: Matrix4): void {\n this._scene.XRRoot.XRModelRoot.matrix.copy(matrix);\n\n // we are copying children to a new array to keep the original array intact\n [...this._scene.XRRoot.XRHandNode.children].forEach((child) => {\n this._scene.XRRoot.XRModelRoot.add(child);\n });\n this._placed = true;\n }\n\n // grabbing\n private updateObject(): void {\n if (!this._grabbedObject) return;\n\n this._grabbedObject.position.copy(this._arHitPosition);\n this._grabbedObject.quaternion.copy(\n this._arHitQuaternion.clone().multiply(this._touchQuaterion),\n );\n this._grabbedObject.scale.copy(\n new Vector3(\n this._touchScale,\n this._touchScale,\n this._touchScale,\n ).multiply(this._arHitScale),\n );\n }\n\n private onTouchStart(): void {\n const sceneHits = this._xrRaycaster.GetSceneIntersections();\n console.log('sceneHits', sceneHits);\n if (sceneHits.length === 0) return;\n if (!sceneHits[0].object) return;\n\n const moveable = findInterface<DIVEMovable>(\n sceneHits[0].object,\n 'isMovable',\n );\n if (!moveable) return;\n\n this._grabbedObject = moveable;\n }\n\n private onTouchMove(): void {\n // raycast ar\n if (!this._frameBuffer) return;\n if (!this._grabbedObject) return;\n\n const intersections = this._xrRaycaster.GetARIntersections(\n this._frameBuffer,\n );\n if (intersections.length === 0) {\n this._crosshair.visible = false;\n return;\n }\n\n const hit = intersections[0];\n\n this._crosshair.visible = true;\n this._crosshair.matrix.copy(hit.matrix);\n\n if (!this._grabbedObject) return;\n\n // if initial values have been reset by TOUCH_END event then set them again\n if (!this._initialObjectPosition || !this._initialRaycastHit) {\n this._initialObjectPosition = this._grabbedObject.position.clone();\n this._initialRaycastHit = hit.point.clone();\n }\n\n // decompose hit matrix to apply hit matrix to object\n hit.matrix.decompose(\n this._arHitPosition,\n this._arHitQuaternion,\n this._arHitScale,\n );\n\n // calculate raycast hit delta\n this._deltaRaycastHit.copy(\n hit.point.clone().sub(this._initialRaycastHit),\n );\n\n // apply moved raycast delta to actual object position\n this._arHitPosition.copy(\n this._initialObjectPosition.clone().add(this._deltaRaycastHit),\n );\n\n console.log('arHitPosition', this._arHitPosition);\n\n this.updateObject();\n }\n\n private onTouchEnd(payload: DIVETouchscreenEvents['TOUCH_END']): void {\n if (payload.touchCount === 0) {\n this._crosshair.visible = false;\n\n // reset grab\n this._initialObjectPosition = null;\n this._initialRaycastHit = null;\n this._grabbedObject = null;\n }\n }\n\n private _startTouchQuaternion: Quaternion = new Quaternion();\n private onRotateStart(): void {\n this._startTouchQuaternion = this._touchQuaterion.clone();\n }\n\n private onRotateMove(payload: DIVETouchscreenEvents['ROTATE_MOVE']): void {\n this._touchQuaterion.setFromAxisAngle(\n new Vector3(0, -1, 0),\n payload.delta * 3,\n );\n this._touchQuaterion.multiply(this._startTouchQuaternion);\n this.updateObject();\n }\n\n private _startTouchScale: number = 1;\n private onPinchStart(): void {\n this._startTouchScale = this._touchScale;\n }\n\n private onPinchMove(payload: DIVETouchscreenEvents['PINCH_MOVE']): void {\n this._touchScale = this._startTouchScale * payload.current;\n this.updateObject();\n }\n\n // prepare & cleanup scene\n private prepareScene(): void {\n this._scene.XRRoot.XRModelRoot.matrixAutoUpdate = false;\n\n // initialize crosshair\n this._scene.add(this._crosshair);\n\n // hang current scene children to hand node\n const children: Object3D[] = [];\n this._scene.Root.children.forEach((child) => {\n const clone = child.clone();\n clone.layers.enableAll();\n clone.traverse((obj) => {\n obj.layers.enableAll();\n if (obj instanceof Mesh) {\n obj.scale.set(0.1, 0.1, 0.1);\n }\n });\n clone.position.set(0, 0, 0);\n children.push(clone);\n });\n this._scene.XRRoot.XRHandNode.add(...children);\n }\n\n private restoreScene(): void {\n this._scene.remove(this._crosshair);\n\n // clear hand node and remove attached models\n this._scene.XRRoot.XRHandNode.clear();\n this._scene.XRRoot.XRModelRoot.clear();\n\n this._scene.XRRoot.XRModelRoot.matrixAutoUpdate = true;\n }\n\n // raycast\n private async initRaycaster(): Promise<void> {\n // initialize raycaster\n await this._xrRaycaster.Init();\n\n // check if successful\n if (!this._xrRaycaster) {\n console.error(\n 'Raycaster not initialized successfully. Aborting WebXR...',\n );\n this.Dispose();\n return Promise.reject();\n }\n }\n}\n","import { Vector3 } from 'three';\nimport DIVEOrbitControls from '../../controls/OrbitControls';\nimport { type DIVERenderer } from '../../renderer/Renderer';\nimport { type DIVEScene } from '../../scene/Scene';\nimport { Overlay } from './overlay/Overlay';\nimport { DIVEWebXRController } from './controller/WebXRController';\n\nexport class DIVEWebXR {\n // general members\n private static _renderer: DIVERenderer;\n private static _scene: DIVEScene;\n private static _controller: DIVEOrbitControls;\n\n // camera reset members\n private static _cameraPosition: Vector3;\n private static _cameraTarget: Vector3;\n\n // render loop members\n private static _renderCallbackId: string | null = null;\n\n // setup members\n private static _session: XRSession | null = null;\n private static _referenceSpaceType: XRReferenceSpaceType = 'local';\n private static _overlay: Overlay | null = null;\n private static _options = {\n requiredFeatures: [\n 'local',\n 'hit-test',\n ],\n optionalFeatures: [\n 'light-estimation',\n 'local-floor',\n 'dom-overlay',\n 'depth-sensing',\n ],\n depthSensing: {\n usagePreference: ['gpu-optimized'],\n dataFormatPreference: [],\n },\n domOverlay: { root: {} as HTMLElement },\n };\n\n private static _xrController: DIVEWebXRController | null = null;\n\n public static async Launch(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controller: DIVEOrbitControls,\n ): Promise<void> {\n this._renderer = renderer;\n this._scene = scene;\n this._controller = controller;\n\n // setting camera reset values\n this._cameraPosition = this._controller.object.position.clone();\n this._cameraTarget = this._controller.target.clone();\n\n if (!navigator.xr) {\n console.error('WebXR not supported');\n return Promise.reject();\n }\n\n // setup current instance\n this._renderer.xr.enabled = true;\n this._scene.InitXR(renderer);\n\n // creating overlay\n if (!DIVEWebXR._overlay) {\n const overlay = new Overlay();\n DIVEWebXR._overlay = overlay;\n }\n DIVEWebXR._options.domOverlay = { root: DIVEWebXR._overlay.Element };\n\n // request session\n const session = await navigator.xr.requestSession(\n 'immersive-ar',\n this._options,\n );\n session.addEventListener('end', () => {\n this._onSessionEnded();\n });\n\n // build up session\n renderer.xr.setReferenceSpaceType(this._referenceSpaceType);\n await renderer.xr.setSession(session);\n DIVEWebXR._overlay.Element.style.display = '';\n this._session = session;\n\n // add end session event listener\n DIVEWebXR._overlay.CloseButton.addEventListener('click', () =>\n this.End(),\n );\n\n // start session\n await this._onSessionStarted();\n\n return Promise.resolve();\n }\n\n public static Update(_time: DOMHighResTimeStamp, frame: XRFrame): void {\n if (!this._session) return;\n\n if (this._xrController) {\n this._xrController.Update(frame);\n }\n }\n\n public static End(): void {\n if (!this._session) return;\n this._session.end();\n }\n\n private static async _onSessionStarted(): Promise<void> {\n if (!this._session) return;\n\n // add update callback to render loop\n this._renderCallbackId = this._renderer.AddPreRenderCallback(\n (time: DOMHighResTimeStamp, frame: XRFrame) => {\n this.Update(time, frame);\n },\n );\n\n this._xrController = new DIVEWebXRController(\n this._session,\n this._renderer,\n this._scene,\n );\n await this._xrController.Init().catch(() => {\n this.End();\n });\n\n return Promise.resolve();\n }\n\n private static _onSessionEnded(): void {\n if (!this._session) return;\n\n if (this._xrController) {\n this._xrController.Dispose();\n }\n\n // remove Update() callback\n if (this._renderCallbackId) {\n this._renderer.RemovePreRenderCallback(this._renderCallbackId);\n this._renderCallbackId = null;\n }\n\n // disable XR on renderer to restore canvas rendering\n this._renderer.xr.enabled = false;\n\n // resize renderer\n const canvasWrapper = this._renderer.domElement.parentElement;\n if (canvasWrapper) {\n const { clientWidth, clientHeight } = canvasWrapper;\n this._renderer.OnResize(clientWidth, clientHeight);\n\n // resize camera\n this._controller.object.OnResize(clientWidth, clientHeight);\n }\n\n // reset camera\n this._controller.object.position.copy(this._cameraPosition);\n this._controller.target.copy(this._cameraTarget);\n\n // reset camera values\n this._cameraPosition.set(0, 0, 0);\n this._cameraTarget.set(0, 0, 0);\n\n // dispose xr scene\n this._scene.DisposeXR();\n\n this._session.removeEventListener('end', this._onSessionEnded);\n DIVEWebXR._overlay!.Element.style.display = 'none';\n this._session = null;\n }\n}\n","import { type DIVEScene } from '../../scene/Scene';\nimport { type DIVEAROptions } from '../AR';\n\nexport class DIVESceneViewer {\n public static Launch(scene: DIVEScene, options?: DIVEAROptions): void {\n // find url in scene (first object found that has a set uri)\n const url = this.findSceneViewerSrc(scene);\n\n // launch SceneViewer\n this.launchSceneViewer(url, options);\n }\n\n private static launchSceneViewer(\n url: string,\n options?: DIVEAROptions,\n ): void {\n const anchor = document.createElement('a');\n const noArViewerSigil = '#model-viewer-no-ar-fallback';\n\n const location = self.location.toString();\n const locationUrl = new URL(location);\n const modelUrl = new URL(url, location);\n const params = new URLSearchParams(modelUrl.search);\n\n locationUrl.hash = noArViewerSigil;\n\n // modelUrl can contain title/link/sound etc.\n params.set('mode', 'ar_only');\n\n if (options?.arScale === 'fixed') {\n params.set('resizable', 'false');\n }\n\n if (options?.arPlacement === 'vertical') {\n params.set('enable_vertical_placement', 'true');\n }\n\n // will be added later if needed\n // if (params.has('sound')) {\n // const soundUrl = new URL(params.get('sound')!, location);\n // params.set('sound', soundUrl.toString());\n // }\n // if (params.has('link')) {\n // const linkUrl = new URL(params.get('link')!, location);\n // params.set('link', linkUrl.toString());\n // }\n\n const intent = `intent://arvr.google.com/scene-viewer/1.2?${\n params.toString() + '&file=' + modelUrl.toString()\n }#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;S.browser_fallback_url=${encodeURIComponent(\n locationUrl.toString(),\n )};end;`;\n\n anchor.setAttribute('href', intent);\n anchor.click();\n }\n\n private static findSceneViewerSrc(scene: DIVEScene): string {\n let uri: string | null = null;\n\n scene.traverse((object) => {\n if (uri) return;\n if (object.userData.uri) {\n uri = object.userData.uri;\n }\n });\n\n if (!uri) {\n throw new Error('No model found in scene');\n }\n\n return uri;\n }\n}\n","import { DIVEInfo, WebXRUnsupportedReason } from '../info/Info';\nimport { DIVEARQuickLook } from './arquicklook/ARQuickLook';\nimport { DIVEWebXR } from './webxr/WebXR';\nimport { type DIVEScene } from '../scene/Scene';\nimport { type DIVERenderer } from '../renderer/Renderer';\nimport DIVEOrbitControls from '../controls/OrbitControls';\nimport { DIVESceneViewer } from './sceneviewer/SceneViewer';\n\nexport type DIVEAROptions = {\n arPlacement: 'horizontal' | 'vertical';\n arScale: 'auto' | 'fixed';\n /**\n * experimental, currently deactivated\n */\n useWebXR: false;\n};\n\nexport class DIVEAR {\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n private _controller: DIVEOrbitControls;\n\n constructor(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controller: DIVEOrbitControls,\n ) {\n this._renderer = renderer;\n this._scene = scene;\n this._controller = controller;\n }\n\n public async Launch(options?: DIVEAROptions): Promise<void> {\n const system = DIVEInfo.GetSystem();\n\n if (system === 'iOS') {\n return this.tryARQuickLook();\n }\n\n if (system === 'Android') {\n if (options?.useWebXR) {\n console.warn('DIVE: WebXR is experimental on Android.');\n return this.tryWebXR();\n }\n\n return this.trySceneViewer();\n }\n\n console.log(\n 'DIVE: AR not supported. Not a mobile system. (System is ' +\n system +\n ')',\n );\n }\n\n private async tryARQuickLook(options?: DIVEAROptions): Promise<void> {\n const support = DIVEInfo.GetSupportsARQuickLook();\n if (!support) {\n console.log('ARQuickLook not supported');\n return Promise.reject();\n }\n\n console.log('DIVE: Launching AR with ARQuickLook ...');\n\n // Launch ARQuickLook\n await DIVEARQuickLook.Launch(this._scene, options);\n return Promise.resolve();\n }\n\n private async tryWebXR(): Promise<void> {\n const support = await DIVEInfo.GetSupportsWebXR();\n if (!support) {\n console.log(\n 'WebXR not supported. Reason: ' +\n WebXRUnsupportedReason[\n DIVEInfo.GetWebXRUnsupportedReason()!\n ],\n );\n return Promise.reject();\n }\n\n console.log('DIVE: Launching AR with WebXR ...');\n // Launch WebXR\n await DIVEWebXR.Launch(this._renderer, this._scene, this._controller);\n return Promise.resolve();\n }\n\n private async trySceneViewer(options?: DIVEAROptions): Promise<void> {\n // actually we don't have to try here, because SceneViewer is supported on all devices by now.\n // if there are no AR services (ARCore) installed on the device, SceneViewer will only show the model in 3D.\n // we also have no options to detect if SceneViewer is supported.\n\n console.log('DIVE: Launching AR with SceneViewer ...');\n\n DIVESceneViewer.Launch(this._scene, options);\n return Promise.resolve();\n }\n}\n"],"names":["implementsInterface","object","discriminator","findInterface","DIVEARQuickLook","scene","options","url","uri","resolve","a","Overlay","path","svg","DIVEWebXRCrosshair","Object3D","mesh","geometry","RingGeometry","material","MeshBasicMaterial","Mesh","pose","DIVEWebXRRaycasterAR","session","renderer","Matrix4","_a","frame","touches","touch","Vector3","hit","DIVEWebXRRaycasterTHREE","Raycaster","intersections","intersection","DIVEEventExecutor","type","listener","listenerArray","existingIndex","entry","payload","DIVEWebXRRaycaster","DIVEWebXROrigin","entityTypes","Quaternion","value","referenceSpace","DIVEWebXRTouchscreenControls","Vector2","e","event","currentAngle","beforeDistance","distance","DIVEWebXRController","p","matrix","child","sceneHits","moveable","children","clone","obj","_DIVEWebXR","controller","overlay","_time","time","canvasWrapper","clientWidth","clientHeight","DIVEWebXR","DIVESceneViewer","anchor","noArViewerSigil","location","locationUrl","modelUrl","params","intent","DIVEAR","system","DIVEInfo","WebXRUnsupportedReason"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("./dive-BTQZqHRt.cjs");let F,P,_,D;function z(a,e=1/0,t=null){P||(P=new f.PlaneGeometry(2,2,1,1)),_||(_=new f.ShaderMaterial({uniforms:{blitTexture:new f.Uniform(a)},vertexShader:`
|
|
2
|
+
varying vec2 vUv;
|
|
3
|
+
void main(){
|
|
4
|
+
vUv = uv;
|
|
5
|
+
gl_Position = vec4(position.xy * 1.0,0.,.999999);
|
|
6
|
+
}`,fragmentShader:`
|
|
7
|
+
uniform sampler2D blitTexture;
|
|
8
|
+
varying vec2 vUv;
|
|
9
|
+
|
|
10
|
+
void main(){
|
|
11
|
+
gl_FragColor = vec4(vUv.xy, 0, 1);
|
|
12
|
+
|
|
13
|
+
#ifdef IS_SRGB
|
|
14
|
+
gl_FragColor = LinearTosRGB( texture2D( blitTexture, vUv) );
|
|
15
|
+
#else
|
|
16
|
+
gl_FragColor = texture2D( blitTexture, vUv);
|
|
17
|
+
#endif
|
|
18
|
+
}`})),_.uniforms.blitTexture.value=a,_.defines.IS_SRGB=a.colorSpace==f.SRGBColorSpace,_.needsUpdate=!0,D||(D=new f.Mesh(P,_),D.frustumCulled=!1);const n=new f.PerspectiveCamera,s=new f.Scene;s.add(D),t===null&&(t=F=new f.WebGLRenderer({antialias:!1}));const i=Math.min(a.image.width,e),r=Math.min(a.image.height,e);t.setSize(i,r),t.clear(),t.render(s,n);const o=document.createElement("canvas"),c=o.getContext("2d");o.width=i,o.height=r,c.drawImage(t.domElement,0,0,i,r);const l=new f.CanvasTexture(o);return l.minFilter=a.minFilter,l.magFilter=a.magFilter,l.wrapS=a.wrapS,l.wrapT=a.wrapT,l.name=a.name,F&&(F.forceContextLoss(),F.dispose(),F=null),l}const Y={POSITION:["byte","byte normalized","unsigned byte","unsigned byte normalized","short","short normalized","unsigned short","unsigned short normalized"],NORMAL:["byte normalized","short normalized"],TANGENT:["byte normalized","short normalized"],TEXCOORD:["byte","byte normalized","unsigned byte","short","short normalized","unsigned short"]};class V{constructor(){this.pluginCallbacks=[],this.register(function(e){return new ce(e)}),this.register(function(e){return new le(e)}),this.register(function(e){return new he(e)}),this.register(function(e){return new pe(e)}),this.register(function(e){return new de(e)}),this.register(function(e){return new xe(e)}),this.register(function(e){return new ue(e)}),this.register(function(e){return new fe(e)}),this.register(function(e){return new ge(e)}),this.register(function(e){return new Te(e)}),this.register(function(e){return new me(e)}),this.register(function(e){return new Me(e)}),this.register(function(e){return new ye(e)})}register(e){return this.pluginCallbacks.indexOf(e)===-1&&this.pluginCallbacks.push(e),this}unregister(e){return this.pluginCallbacks.indexOf(e)!==-1&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,n,s){const i=new ae,r=[];for(let o=0,c=this.pluginCallbacks.length;o<c;o++)r.push(this.pluginCallbacks[o](i));i.setPlugins(r),i.write(e,t,s).catch(n)}parseAsync(e,t){const n=this;return new Promise(function(s,i){n.parse(e,s,i,t)})}}const m={POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,BYTE:5120,UNSIGNED_BYTE:5121,SHORT:5122,UNSIGNED_SHORT:5123,INT:5124,UNSIGNED_INT:5125,FLOAT:5126,ARRAY_BUFFER:34962,ELEMENT_ARRAY_BUFFER:34963,NEAREST:9728,LINEAR:9729,NEAREST_MIPMAP_NEAREST:9984,LINEAR_MIPMAP_NEAREST:9985,NEAREST_MIPMAP_LINEAR:9986,LINEAR_MIPMAP_LINEAR:9987,CLAMP_TO_EDGE:33071,MIRRORED_REPEAT:33648,REPEAT:10497},k="KHR_mesh_quantization",b={};b[f.NearestFilter]=m.NEAREST;b[f.NearestMipmapNearestFilter]=m.NEAREST_MIPMAP_NEAREST;b[f.NearestMipmapLinearFilter]=m.NEAREST_MIPMAP_LINEAR;b[f.LinearFilter]=m.LINEAR;b[f.LinearMipmapNearestFilter]=m.LINEAR_MIPMAP_NEAREST;b[f.LinearMipmapLinearFilter]=m.LINEAR_MIPMAP_LINEAR;b[f.ClampToEdgeWrapping]=m.CLAMP_TO_EDGE;b[f.RepeatWrapping]=m.REPEAT;b[f.MirroredRepeatWrapping]=m.MIRRORED_REPEAT;const K={scale:"scale",position:"translation",quaternion:"rotation",morphTargetInfluences:"weights"},$=new f.Color,q=12,ee=1179937895,te=2,W=8,se=1313821514,ne=5130562;function O(a,e){return a.length===e.length&&a.every(function(t,n){return t===e[n]})}function re(a){return new TextEncoder().encode(a).buffer}function ie(a){return O(a.elements,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}function oe(a,e,t){const n={min:new Array(a.itemSize).fill(Number.POSITIVE_INFINITY),max:new Array(a.itemSize).fill(Number.NEGATIVE_INFINITY)};for(let s=e;s<e+t;s++)for(let i=0;i<a.itemSize;i++){let r;a.itemSize>4?r=a.array[s*a.itemSize+i]:(i===0?r=a.getX(s):i===1?r=a.getY(s):i===2?r=a.getZ(s):i===3&&(r=a.getW(s)),a.normalized===!0&&(r=f.MathUtils.normalize(r,a.array))),n.min[i]=Math.min(n.min[i],r),n.max[i]=Math.max(n.max[i],r)}return n}function Q(a){return Math.ceil(a/4)*4}function H(a,e=0){const t=Q(a.byteLength);if(t!==a.byteLength){const n=new Uint8Array(t);if(n.set(new Uint8Array(a)),e!==0)for(let s=a.byteLength;s<t;s++)n[s]=e;return n.buffer}return a}function X(){return typeof document>"u"&&typeof OffscreenCanvas<"u"?new OffscreenCanvas(1,1):document.createElement("canvas")}function J(a,e){if(a.toBlob!==void 0)return new Promise(n=>a.toBlob(n,e));let t;return e==="image/jpeg"?t=.92:e==="image/webp"&&(t=.8),a.convertToBlob({type:e,quality:t})}class ae{constructor(){this.plugins=[],this.options={},this.pending=[],this.buffers=[],this.byteOffset=0,this.buffers=[],this.nodeMap=new Map,this.skins=[],this.extensionsUsed={},this.extensionsRequired={},this.uids=new Map,this.uid=0,this.json={asset:{version:"2.0",generator:"THREE.GLTFExporter"}},this.cache={meshes:new Map,attributes:new Map,attributesNormalized:new Map,materials:new Map,textures:new Map,images:new Map}}setPlugins(e){this.plugins=e}async write(e,t,n={}){this.options=Object.assign({binary:!1,trs:!1,onlyVisible:!0,maxTextureSize:1/0,animations:[],includeCustomExtensions:!1},n),this.options.animations.length>0&&(this.options.trs=!0),this.processInput(e),await Promise.all(this.pending);const s=this,i=s.buffers,r=s.json;n=s.options;const o=s.extensionsUsed,c=s.extensionsRequired,l=new Blob(i,{type:"application/octet-stream"}),p=Object.keys(o),u=Object.keys(c);if(p.length>0&&(r.extensionsUsed=p),u.length>0&&(r.extensionsRequired=u),r.buffers&&r.buffers.length>0&&(r.buffers[0].byteLength=l.size),n.binary===!0){const M=new FileReader;M.readAsArrayBuffer(l),M.onloadend=function(){const h=H(M.result),d=new DataView(new ArrayBuffer(W));d.setUint32(0,h.byteLength,!0),d.setUint32(4,ne,!0);const x=H(re(JSON.stringify(r)),32),T=new DataView(new ArrayBuffer(W));T.setUint32(0,x.byteLength,!0),T.setUint32(4,se,!0);const w=new ArrayBuffer(q),S=new DataView(w);S.setUint32(0,ee,!0),S.setUint32(4,te,!0);const B=q+T.byteLength+x.byteLength+d.byteLength+h.byteLength;S.setUint32(8,B,!0);const g=new Blob([w,T,x,d,h],{type:"application/octet-stream"}),y=new FileReader;y.readAsArrayBuffer(g),y.onloadend=function(){t(y.result)}}}else if(r.buffers&&r.buffers.length>0){const M=new FileReader;M.readAsDataURL(l),M.onloadend=function(){const h=M.result;r.buffers[0].uri=h,t(r)}}else t(r)}serializeUserData(e,t){if(Object.keys(e.userData).length===0)return;const n=this.options,s=this.extensionsUsed;try{const i=JSON.parse(JSON.stringify(e.userData));if(n.includeCustomExtensions&&i.gltfExtensions){t.extensions===void 0&&(t.extensions={});for(const r in i.gltfExtensions)t.extensions[r]=i.gltfExtensions[r],s[r]=!0;delete i.gltfExtensions}Object.keys(i).length>0&&(t.extras=i)}catch(i){console.warn("THREE.GLTFExporter: userData of '"+e.name+"' won't be serialized because of JSON.stringify error - "+i.message)}}getUID(e,t=!1){if(this.uids.has(e)===!1){const s=new Map;s.set(!0,this.uid++),s.set(!1,this.uid++),this.uids.set(e,s)}return this.uids.get(e).get(t)}isNormalizedNormalAttribute(e){if(this.cache.attributesNormalized.has(e))return!1;const n=new f.Vector3;for(let s=0,i=e.count;s<i;s++)if(Math.abs(n.fromBufferAttribute(e,s).length()-1)>5e-4)return!1;return!0}createNormalizedNormalAttribute(e){const t=this.cache;if(t.attributesNormalized.has(e))return t.attributesNormalized.get(e);const n=e.clone(),s=new f.Vector3;for(let i=0,r=n.count;i<r;i++)s.fromBufferAttribute(n,i),s.x===0&&s.y===0&&s.z===0?s.setX(1):s.normalize(),n.setXYZ(i,s.x,s.y,s.z);return t.attributesNormalized.set(e,n),n}applyTextureTransform(e,t){let n=!1;const s={};(t.offset.x!==0||t.offset.y!==0)&&(s.offset=t.offset.toArray(),n=!0),t.rotation!==0&&(s.rotation=t.rotation,n=!0),(t.repeat.x!==1||t.repeat.y!==1)&&(s.scale=t.repeat.toArray(),n=!0),n&&(e.extensions=e.extensions||{},e.extensions.KHR_texture_transform=s,this.extensionsUsed.KHR_texture_transform=!0)}buildMetalRoughTexture(e,t){if(e===t)return e;function n(h){return h.colorSpace===f.SRGBColorSpace?function(x){return x<.04045?x*.0773993808:Math.pow(x*.9478672986+.0521327014,2.4)}:function(x){return x}}console.warn("THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures."),e instanceof f.CompressedTexture&&(e=z(e)),t instanceof f.CompressedTexture&&(t=z(t));const s=e?e.image:null,i=t?t.image:null,r=Math.max(s?s.width:0,i?i.width:0),o=Math.max(s?s.height:0,i?i.height:0),c=X();c.width=r,c.height=o;const l=c.getContext("2d");l.fillStyle="#00ffff",l.fillRect(0,0,r,o);const p=l.getImageData(0,0,r,o);if(s){l.drawImage(s,0,0,r,o);const h=n(e),d=l.getImageData(0,0,r,o).data;for(let x=2;x<d.length;x+=4)p.data[x]=h(d[x]/256)*256}if(i){l.drawImage(i,0,0,r,o);const h=n(t),d=l.getImageData(0,0,r,o).data;for(let x=1;x<d.length;x+=4)p.data[x]=h(d[x]/256)*256}l.putImageData(p,0,0);const M=(e||t).clone();return M.source=new f.Source(c),M.colorSpace=f.NoColorSpace,M.channel=(e||t).channel,e&&t&&e.channel!==t.channel&&console.warn("THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match."),M}processBuffer(e){const t=this.json,n=this.buffers;return t.buffers||(t.buffers=[{byteLength:0}]),n.push(e),0}processBufferView(e,t,n,s,i){const r=this.json;r.bufferViews||(r.bufferViews=[]);let o;switch(t){case m.BYTE:case m.UNSIGNED_BYTE:o=1;break;case m.SHORT:case m.UNSIGNED_SHORT:o=2;break;default:o=4}let c=e.itemSize*o;i===m.ARRAY_BUFFER&&(c=Math.ceil(c/4)*4);const l=Q(s*c),p=new DataView(new ArrayBuffer(l));let u=0;for(let d=n;d<n+s;d++){for(let x=0;x<e.itemSize;x++){let T;e.itemSize>4?T=e.array[d*e.itemSize+x]:(x===0?T=e.getX(d):x===1?T=e.getY(d):x===2?T=e.getZ(d):x===3&&(T=e.getW(d)),e.normalized===!0&&(T=f.MathUtils.normalize(T,e.array))),t===m.FLOAT?p.setFloat32(u,T,!0):t===m.INT?p.setInt32(u,T,!0):t===m.UNSIGNED_INT?p.setUint32(u,T,!0):t===m.SHORT?p.setInt16(u,T,!0):t===m.UNSIGNED_SHORT?p.setUint16(u,T,!0):t===m.BYTE?p.setInt8(u,T):t===m.UNSIGNED_BYTE&&p.setUint8(u,T),u+=o}u%c!==0&&(u+=c-u%c)}const M={buffer:this.processBuffer(p.buffer),byteOffset:this.byteOffset,byteLength:l};return i!==void 0&&(M.target=i),i===m.ARRAY_BUFFER&&(M.byteStride=c),this.byteOffset+=l,r.bufferViews.push(M),{id:r.bufferViews.length-1,byteLength:0}}processBufferViewImage(e){const t=this,n=t.json;return n.bufferViews||(n.bufferViews=[]),new Promise(function(s){const i=new FileReader;i.readAsArrayBuffer(e),i.onloadend=function(){const r=H(i.result),o={buffer:t.processBuffer(r),byteOffset:t.byteOffset,byteLength:r.byteLength};t.byteOffset+=r.byteLength,s(n.bufferViews.push(o)-1)}})}processAccessor(e,t,n,s){const i=this.json,r={1:"SCALAR",2:"VEC2",3:"VEC3",4:"VEC4",9:"MAT3",16:"MAT4"};let o;if(e.array.constructor===Float32Array)o=m.FLOAT;else if(e.array.constructor===Int32Array)o=m.INT;else if(e.array.constructor===Uint32Array)o=m.UNSIGNED_INT;else if(e.array.constructor===Int16Array)o=m.SHORT;else if(e.array.constructor===Uint16Array)o=m.UNSIGNED_SHORT;else if(e.array.constructor===Int8Array)o=m.BYTE;else if(e.array.constructor===Uint8Array)o=m.UNSIGNED_BYTE;else throw new Error("THREE.GLTFExporter: Unsupported bufferAttribute component type: "+e.array.constructor.name);if(n===void 0&&(n=0),(s===void 0||s===1/0)&&(s=e.count),s===0)return null;const c=oe(e,n,s);let l;t!==void 0&&(l=e===t.index?m.ELEMENT_ARRAY_BUFFER:m.ARRAY_BUFFER);const p=this.processBufferView(e,o,n,s,l),u={bufferView:p.id,byteOffset:p.byteOffset,componentType:o,count:s,max:c.max,min:c.min,type:r[e.itemSize]};return e.normalized===!0&&(u.normalized=!0),i.accessors||(i.accessors=[]),i.accessors.push(u)-1}processImage(e,t,n,s="image/png"){if(e!==null){const i=this,r=i.cache,o=i.json,c=i.options,l=i.pending;r.images.has(e)||r.images.set(e,{});const p=r.images.get(e),u=s+":flipY/"+n.toString();if(p[u]!==void 0)return p[u];o.images||(o.images=[]);const M={mimeType:s},h=X();h.width=Math.min(e.width,c.maxTextureSize),h.height=Math.min(e.height,c.maxTextureSize);const d=h.getContext("2d");if(n===!0&&(d.translate(0,h.height),d.scale(1,-1)),e.data!==void 0){t!==f.RGBAFormat&&console.error("GLTFExporter: Only RGBAFormat is supported.",t),(e.width>c.maxTextureSize||e.height>c.maxTextureSize)&&console.warn("GLTFExporter: Image size is bigger than maxTextureSize",e);const T=new Uint8ClampedArray(e.height*e.width*4);for(let w=0;w<T.length;w+=4)T[w+0]=e.data[w+0],T[w+1]=e.data[w+1],T[w+2]=e.data[w+2],T[w+3]=e.data[w+3];d.putImageData(new ImageData(T,e.width,e.height),0,0)}else if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap||typeof OffscreenCanvas<"u"&&e instanceof OffscreenCanvas)d.drawImage(e,0,0,h.width,h.height);else throw new Error("THREE.GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.");c.binary===!0?l.push(J(h,s).then(T=>i.processBufferViewImage(T)).then(T=>{M.bufferView=T})):h.toDataURL!==void 0?M.uri=h.toDataURL(s):l.push(J(h,s).then(T=>new FileReader().readAsDataURL(T)).then(T=>{M.uri=T}));const x=o.images.push(M)-1;return p[u]=x,x}else throw new Error("THREE.GLTFExporter: No valid image data found. Unable to process texture.")}processSampler(e){const t=this.json;t.samplers||(t.samplers=[]);const n={magFilter:b[e.magFilter],minFilter:b[e.minFilter],wrapS:b[e.wrapS],wrapT:b[e.wrapT]};return t.samplers.push(n)-1}processTexture(e){const n=this.options,s=this.cache,i=this.json;if(s.textures.has(e))return s.textures.get(e);i.textures||(i.textures=[]),e instanceof f.CompressedTexture&&(e=z(e,n.maxTextureSize));let r=e.userData.mimeType;r==="image/webp"&&(r="image/png");const o={sampler:this.processSampler(e),source:this.processImage(e.image,e.format,e.flipY,r)};e.name&&(o.name=e.name),this._invokeAll(function(l){l.writeTexture&&l.writeTexture(e,o)});const c=i.textures.push(o)-1;return s.textures.set(e,c),c}processMaterial(e){const t=this.cache,n=this.json;if(t.materials.has(e))return t.materials.get(e);if(e.isShaderMaterial)return console.warn("GLTFExporter: THREE.ShaderMaterial not supported."),null;n.materials||(n.materials=[]);const s={pbrMetallicRoughness:{}};e.isMeshStandardMaterial!==!0&&e.isMeshBasicMaterial!==!0&&console.warn("GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.");const i=e.color.toArray().concat([e.opacity]);if(O(i,[1,1,1,1])||(s.pbrMetallicRoughness.baseColorFactor=i),e.isMeshStandardMaterial?(s.pbrMetallicRoughness.metallicFactor=e.metalness,s.pbrMetallicRoughness.roughnessFactor=e.roughness):(s.pbrMetallicRoughness.metallicFactor=.5,s.pbrMetallicRoughness.roughnessFactor=.5),e.metalnessMap||e.roughnessMap){const o=this.buildMetalRoughTexture(e.metalnessMap,e.roughnessMap),c={index:this.processTexture(o),channel:o.channel};this.applyTextureTransform(c,o),s.pbrMetallicRoughness.metallicRoughnessTexture=c}if(e.map){const o={index:this.processTexture(e.map),texCoord:e.map.channel};this.applyTextureTransform(o,e.map),s.pbrMetallicRoughness.baseColorTexture=o}if(e.emissive){const o=e.emissive;if(Math.max(o.r,o.g,o.b)>0&&(s.emissiveFactor=e.emissive.toArray()),e.emissiveMap){const l={index:this.processTexture(e.emissiveMap),texCoord:e.emissiveMap.channel};this.applyTextureTransform(l,e.emissiveMap),s.emissiveTexture=l}}if(e.normalMap){const o={index:this.processTexture(e.normalMap),texCoord:e.normalMap.channel};e.normalScale&&e.normalScale.x!==1&&(o.scale=e.normalScale.x),this.applyTextureTransform(o,e.normalMap),s.normalTexture=o}if(e.aoMap){const o={index:this.processTexture(e.aoMap),texCoord:e.aoMap.channel};e.aoMapIntensity!==1&&(o.strength=e.aoMapIntensity),this.applyTextureTransform(o,e.aoMap),s.occlusionTexture=o}e.transparent?s.alphaMode="BLEND":e.alphaTest>0&&(s.alphaMode="MASK",s.alphaCutoff=e.alphaTest),e.side===f.DoubleSide&&(s.doubleSided=!0),e.name!==""&&(s.name=e.name),this.serializeUserData(e,s),this._invokeAll(function(o){o.writeMaterial&&o.writeMaterial(e,s)});const r=n.materials.push(s)-1;return t.materials.set(e,r),r}processMesh(e){const t=this.cache,n=this.json,s=[e.geometry.uuid];if(Array.isArray(e.material))for(let g=0,y=e.material.length;g<y;g++)s.push(e.material[g].uuid);else s.push(e.material.uuid);const i=s.join(":");if(t.meshes.has(i))return t.meshes.get(i);const r=e.geometry;let o;e.isLineSegments?o=m.LINES:e.isLineLoop?o=m.LINE_LOOP:e.isLine?o=m.LINE_STRIP:e.isPoints?o=m.POINTS:o=e.material.wireframe?m.LINES:m.TRIANGLES;const c={},l={},p=[],u=[],M={uv:"TEXCOORD_0",uv1:"TEXCOORD_1",uv2:"TEXCOORD_2",uv3:"TEXCOORD_3",color:"COLOR_0",skinWeight:"WEIGHTS_0",skinIndex:"JOINTS_0"},h=r.getAttribute("normal");h!==void 0&&!this.isNormalizedNormalAttribute(h)&&(console.warn("THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one."),r.setAttribute("normal",this.createNormalizedNormalAttribute(h)));let d=null;for(let g in r.attributes){if(g.slice(0,5)==="morph")continue;const y=r.attributes[g];if(g=M[g]||g.toUpperCase(),/^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/.test(g)||(g="_"+g),t.attributes.has(this.getUID(y))){l[g]=t.attributes.get(this.getUID(y));continue}d=null;const I=y.array;g==="JOINTS_0"&&!(I instanceof Uint16Array)&&!(I instanceof Uint8Array)&&(console.warn('GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.'),d=new f.BufferAttribute(new Uint16Array(I),y.itemSize,y.normalized));const R=this.processAccessor(d||y,r);R!==null&&(g.startsWith("_")||this.detectMeshQuantization(g,y),l[g]=R,t.attributes.set(this.getUID(y),R))}if(h!==void 0&&r.setAttribute("normal",h),Object.keys(l).length===0)return null;if(e.morphTargetInfluences!==void 0&&e.morphTargetInfluences.length>0){const g=[],y=[],E={};if(e.morphTargetDictionary!==void 0)for(const I in e.morphTargetDictionary)E[e.morphTargetDictionary[I]]=I;for(let I=0;I<e.morphTargetInfluences.length;++I){const R={};let j=!1;for(const C in r.morphAttributes){if(C!=="position"&&C!=="normal"){j||(console.warn("GLTFExporter: Only POSITION and NORMAL morph are supported."),j=!0);continue}const N=r.morphAttributes[C][I],G=C.toUpperCase(),U=r.attributes[C];if(t.attributes.has(this.getUID(N,!0))){R[G]=t.attributes.get(this.getUID(N,!0));continue}const v=N.clone();if(!r.morphTargetsRelative)for(let A=0,Z=N.count;A<Z;A++)for(let L=0;L<N.itemSize;L++)L===0&&v.setX(A,N.getX(A)-U.getX(A)),L===1&&v.setY(A,N.getY(A)-U.getY(A)),L===2&&v.setZ(A,N.getZ(A)-U.getZ(A)),L===3&&v.setW(A,N.getW(A)-U.getW(A));R[G]=this.processAccessor(v,r),t.attributes.set(this.getUID(U,!0),R[G])}u.push(R),g.push(e.morphTargetInfluences[I]),e.morphTargetDictionary!==void 0&&y.push(E[I])}c.weights=g,y.length>0&&(c.extras={},c.extras.targetNames=y)}const x=Array.isArray(e.material);if(x&&r.groups.length===0)return null;let T=!1;if(x&&r.index===null){const g=[];for(let y=0,E=r.attributes.position.count;y<E;y++)g[y]=y;r.setIndex(g),T=!0}const w=x?e.material:[e.material],S=x?r.groups:[{materialIndex:0,start:void 0,count:void 0}];for(let g=0,y=S.length;g<y;g++){const E={mode:o,attributes:l};if(this.serializeUserData(r,E),u.length>0&&(E.targets=u),r.index!==null){let R=this.getUID(r.index);(S[g].start!==void 0||S[g].count!==void 0)&&(R+=":"+S[g].start+":"+S[g].count),t.attributes.has(R)?E.indices=t.attributes.get(R):(E.indices=this.processAccessor(r.index,r,S[g].start,S[g].count),t.attributes.set(R,E.indices)),E.indices===null&&delete E.indices}const I=this.processMaterial(w[S[g].materialIndex]);I!==null&&(E.material=I),p.push(E)}T===!0&&r.setIndex(null),c.primitives=p,n.meshes||(n.meshes=[]),this._invokeAll(function(g){g.writeMesh&&g.writeMesh(e,c)});const B=n.meshes.push(c)-1;return t.meshes.set(i,B),B}detectMeshQuantization(e,t){if(this.extensionsUsed[k])return;let n;switch(t.array.constructor){case Int8Array:n="byte";break;case Uint8Array:n="unsigned byte";break;case Int16Array:n="short";break;case Uint16Array:n="unsigned short";break;default:return}t.normalized&&(n+=" normalized");const s=e.split("_",1)[0];Y[s]&&Y[s].includes(n)&&(this.extensionsUsed[k]=!0,this.extensionsRequired[k]=!0)}processCamera(e){const t=this.json;t.cameras||(t.cameras=[]);const n=e.isOrthographicCamera,s={type:n?"orthographic":"perspective"};return n?s.orthographic={xmag:e.right*2,ymag:e.top*2,zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near}:s.perspective={aspectRatio:e.aspect,yfov:f.MathUtils.degToRad(e.fov),zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near},e.name!==""&&(s.name=e.type),t.cameras.push(s)-1}processAnimation(e,t){const n=this.json,s=this.nodeMap;n.animations||(n.animations=[]),e=V.Utils.mergeMorphTargetTracks(e.clone(),t);const i=e.tracks,r=[],o=[];for(let c=0;c<i.length;++c){const l=i[c],p=f.PropertyBinding.parseTrackName(l.name);let u=f.PropertyBinding.findNode(t,p.nodeName);const M=K[p.propertyName];if(p.objectName==="bones"&&(u.isSkinnedMesh===!0?u=u.skeleton.getBoneByName(p.objectIndex):u=void 0),!u||!M)return console.warn('THREE.GLTFExporter: Could not export animation track "%s".',l.name),null;const h=1;let d=l.values.length/l.times.length;M===K.morphTargetInfluences&&(d/=u.morphTargetInfluences.length);let x;l.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline===!0?(x="CUBICSPLINE",d/=3):l.getInterpolation()===f.InterpolateDiscrete?x="STEP":x="LINEAR",o.push({input:this.processAccessor(new f.BufferAttribute(l.times,h)),output:this.processAccessor(new f.BufferAttribute(l.values,d)),interpolation:x}),r.push({sampler:o.length-1,target:{node:s.get(u),path:M}})}return n.animations.push({name:e.name||"clip_"+n.animations.length,samplers:o,channels:r}),n.animations.length-1}processSkin(e){const t=this.json,n=this.nodeMap,s=t.nodes[n.get(e)],i=e.skeleton;if(i===void 0)return null;const r=e.skeleton.bones[0];if(r===void 0)return null;const o=[],c=new Float32Array(i.bones.length*16),l=new f.Matrix4;for(let u=0;u<i.bones.length;++u)o.push(n.get(i.bones[u])),l.copy(i.boneInverses[u]),l.multiply(e.bindMatrix).toArray(c,u*16);return t.skins===void 0&&(t.skins=[]),t.skins.push({inverseBindMatrices:this.processAccessor(new f.BufferAttribute(c,16)),joints:o,skeleton:n.get(r)}),s.skin=t.skins.length-1}processNode(e){const t=this.json,n=this.options,s=this.nodeMap;t.nodes||(t.nodes=[]);const i={};if(n.trs){const o=e.quaternion.toArray(),c=e.position.toArray(),l=e.scale.toArray();O(o,[0,0,0,1])||(i.rotation=o),O(c,[0,0,0])||(i.translation=c),O(l,[1,1,1])||(i.scale=l)}else e.matrixAutoUpdate&&e.updateMatrix(),ie(e.matrix)===!1&&(i.matrix=e.matrix.elements);if(e.name!==""&&(i.name=String(e.name)),this.serializeUserData(e,i),e.isMesh||e.isLine||e.isPoints){const o=this.processMesh(e);o!==null&&(i.mesh=o)}else e.isCamera&&(i.camera=this.processCamera(e));if(e.isSkinnedMesh&&this.skins.push(e),e.children.length>0){const o=[];for(let c=0,l=e.children.length;c<l;c++){const p=e.children[c];if(p.visible||n.onlyVisible===!1){const u=this.processNode(p);u!==null&&o.push(u)}}o.length>0&&(i.children=o)}this._invokeAll(function(o){o.writeNode&&o.writeNode(e,i)});const r=t.nodes.push(i)-1;return s.set(e,r),r}processScene(e){const t=this.json,n=this.options;t.scenes||(t.scenes=[],t.scene=0);const s={};e.name!==""&&(s.name=e.name),t.scenes.push(s);const i=[];for(let r=0,o=e.children.length;r<o;r++){const c=e.children[r];if(c.visible||n.onlyVisible===!1){const l=this.processNode(c);l!==null&&i.push(l)}}i.length>0&&(s.nodes=i),this.serializeUserData(e,s)}processObjects(e){const t=new f.Scene;t.name="AuxScene";for(let n=0;n<e.length;n++)t.children.push(e[n]);this.processScene(t)}processInput(e){const t=this.options;e=e instanceof Array?e:[e],this._invokeAll(function(s){s.beforeParse&&s.beforeParse(e)});const n=[];for(let s=0;s<e.length;s++)e[s]instanceof f.Scene?this.processScene(e[s]):n.push(e[s]);n.length>0&&this.processObjects(n);for(let s=0;s<this.skins.length;++s)this.processSkin(this.skins[s]);for(let s=0;s<t.animations.length;++s)this.processAnimation(t.animations[s],e[0]);this._invokeAll(function(s){s.afterParse&&s.afterParse(e)})}_invokeAll(e){for(let t=0,n=this.plugins.length;t<n;t++)e(this.plugins[t])}}class ce{constructor(e){this.writer=e,this.name="KHR_lights_punctual"}writeNode(e,t){if(!e.isLight)return;if(!e.isDirectionalLight&&!e.isPointLight&&!e.isSpotLight){console.warn("THREE.GLTFExporter: Only directional, point, and spot lights are supported.",e);return}const n=this.writer,s=n.json,i=n.extensionsUsed,r={};e.name&&(r.name=e.name),r.color=e.color.toArray(),r.intensity=e.intensity,e.isDirectionalLight?r.type="directional":e.isPointLight?(r.type="point",e.distance>0&&(r.range=e.distance)):e.isSpotLight&&(r.type="spot",e.distance>0&&(r.range=e.distance),r.spot={},r.spot.innerConeAngle=(1-e.penumbra)*e.angle,r.spot.outerConeAngle=e.angle),e.decay!==void 0&&e.decay!==2&&console.warn("THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, and expects light.decay=2."),e.target&&(e.target.parent!==e||e.target.position.x!==0||e.target.position.y!==0||e.target.position.z!==-1)&&console.warn("THREE.GLTFExporter: Light direction may be lost. For best results, make light.target a child of the light with position 0,0,-1."),i[this.name]||(s.extensions=s.extensions||{},s.extensions[this.name]={lights:[]},i[this.name]=!0);const o=s.extensions[this.name].lights;o.push(r),t.extensions=t.extensions||{},t.extensions[this.name]={light:o.length-1}}}class le{constructor(e){this.writer=e,this.name="KHR_materials_unlit"}writeMaterial(e,t){if(!e.isMeshBasicMaterial)return;const s=this.writer.extensionsUsed;t.extensions=t.extensions||{},t.extensions[this.name]={},s[this.name]=!0,t.pbrMetallicRoughness.metallicFactor=0,t.pbrMetallicRoughness.roughnessFactor=.9}}class ue{constructor(e){this.writer=e,this.name="KHR_materials_clearcoat"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||e.clearcoat===0)return;const n=this.writer,s=n.extensionsUsed,i={};if(i.clearcoatFactor=e.clearcoat,e.clearcoatMap){const r={index:n.processTexture(e.clearcoatMap),texCoord:e.clearcoatMap.channel};n.applyTextureTransform(r,e.clearcoatMap),i.clearcoatTexture=r}if(i.clearcoatRoughnessFactor=e.clearcoatRoughness,e.clearcoatRoughnessMap){const r={index:n.processTexture(e.clearcoatRoughnessMap),texCoord:e.clearcoatRoughnessMap.channel};n.applyTextureTransform(r,e.clearcoatRoughnessMap),i.clearcoatRoughnessTexture=r}if(e.clearcoatNormalMap){const r={index:n.processTexture(e.clearcoatNormalMap),texCoord:e.clearcoatNormalMap.channel};n.applyTextureTransform(r,e.clearcoatNormalMap),i.clearcoatNormalTexture=r}t.extensions=t.extensions||{},t.extensions[this.name]=i,s[this.name]=!0}}class fe{constructor(e){this.writer=e,this.name="KHR_materials_iridescence"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||e.iridescence===0)return;const n=this.writer,s=n.extensionsUsed,i={};if(i.iridescenceFactor=e.iridescence,e.iridescenceMap){const r={index:n.processTexture(e.iridescenceMap),texCoord:e.iridescenceMap.channel};n.applyTextureTransform(r,e.iridescenceMap),i.iridescenceTexture=r}if(i.iridescenceIor=e.iridescenceIOR,i.iridescenceThicknessMinimum=e.iridescenceThicknessRange[0],i.iridescenceThicknessMaximum=e.iridescenceThicknessRange[1],e.iridescenceThicknessMap){const r={index:n.processTexture(e.iridescenceThicknessMap),texCoord:e.iridescenceThicknessMap.channel};n.applyTextureTransform(r,e.iridescenceThicknessMap),i.iridescenceThicknessTexture=r}t.extensions=t.extensions||{},t.extensions[this.name]=i,s[this.name]=!0}}class he{constructor(e){this.writer=e,this.name="KHR_materials_transmission"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||e.transmission===0)return;const n=this.writer,s=n.extensionsUsed,i={};if(i.transmissionFactor=e.transmission,e.transmissionMap){const r={index:n.processTexture(e.transmissionMap),texCoord:e.transmissionMap.channel};n.applyTextureTransform(r,e.transmissionMap),i.transmissionTexture=r}t.extensions=t.extensions||{},t.extensions[this.name]=i,s[this.name]=!0}}class pe{constructor(e){this.writer=e,this.name="KHR_materials_volume"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||e.transmission===0)return;const n=this.writer,s=n.extensionsUsed,i={};if(i.thicknessFactor=e.thickness,e.thicknessMap){const r={index:n.processTexture(e.thicknessMap),texCoord:e.thicknessMap.channel};n.applyTextureTransform(r,e.thicknessMap),i.thicknessTexture=r}i.attenuationDistance=e.attenuationDistance,i.attenuationColor=e.attenuationColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=i,s[this.name]=!0}}class de{constructor(e){this.writer=e,this.name="KHR_materials_ior"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||e.ior===1.5)return;const s=this.writer.extensionsUsed,i={};i.ior=e.ior,t.extensions=t.extensions||{},t.extensions[this.name]=i,s[this.name]=!0}}class xe{constructor(e){this.writer=e,this.name="KHR_materials_specular"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||e.specularIntensity===1&&e.specularColor.equals($)&&!e.specularIntensityMap&&!e.specularColorMap)return;const n=this.writer,s=n.extensionsUsed,i={};if(e.specularIntensityMap){const r={index:n.processTexture(e.specularIntensityMap),texCoord:e.specularIntensityMap.channel};n.applyTextureTransform(r,e.specularIntensityMap),i.specularTexture=r}if(e.specularColorMap){const r={index:n.processTexture(e.specularColorMap),texCoord:e.specularColorMap.channel};n.applyTextureTransform(r,e.specularColorMap),i.specularColorTexture=r}i.specularFactor=e.specularIntensity,i.specularColorFactor=e.specularColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=i,s[this.name]=!0}}class ge{constructor(e){this.writer=e,this.name="KHR_materials_sheen"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||e.sheen==0)return;const n=this.writer,s=n.extensionsUsed,i={};if(e.sheenRoughnessMap){const r={index:n.processTexture(e.sheenRoughnessMap),texCoord:e.sheenRoughnessMap.channel};n.applyTextureTransform(r,e.sheenRoughnessMap),i.sheenRoughnessTexture=r}if(e.sheenColorMap){const r={index:n.processTexture(e.sheenColorMap),texCoord:e.sheenColorMap.channel};n.applyTextureTransform(r,e.sheenColorMap),i.sheenColorTexture=r}i.sheenRoughnessFactor=e.sheenRoughness,i.sheenColorFactor=e.sheenColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=i,s[this.name]=!0}}class Te{constructor(e){this.writer=e,this.name="KHR_materials_anisotropy"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||e.anisotropy==0)return;const n=this.writer,s=n.extensionsUsed,i={};if(e.anisotropyMap){const r={index:n.processTexture(e.anisotropyMap)};n.applyTextureTransform(r,e.anisotropyMap),i.anisotropyTexture=r}i.anisotropyStrength=e.anisotropy,i.anisotropyRotation=e.anisotropyRotation,t.extensions=t.extensions||{},t.extensions[this.name]=i,s[this.name]=!0}}class me{constructor(e){this.writer=e,this.name="KHR_materials_emissive_strength"}writeMaterial(e,t){if(!e.isMeshStandardMaterial||e.emissiveIntensity===1)return;const s=this.writer.extensionsUsed,i={};i.emissiveStrength=e.emissiveIntensity,t.extensions=t.extensions||{},t.extensions[this.name]=i,s[this.name]=!0}}class Me{constructor(e){this.writer=e,this.name="EXT_materials_bump"}writeMaterial(e,t){if(!e.isMeshStandardMaterial||e.bumpScale===1&&!e.bumpMap)return;const n=this.writer,s=n.extensionsUsed,i={};if(e.bumpMap){const r={index:n.processTexture(e.bumpMap),texCoord:e.bumpMap.channel};n.applyTextureTransform(r,e.bumpMap),i.bumpTexture=r}i.bumpFactor=e.bumpScale,t.extensions=t.extensions||{},t.extensions[this.name]=i,s[this.name]=!0}}class ye{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(!e.isInstancedMesh)return;const n=this.writer,s=e,i=new Float32Array(s.count*3),r=new Float32Array(s.count*4),o=new Float32Array(s.count*3),c=new f.Matrix4,l=new f.Vector3,p=new f.Quaternion,u=new f.Vector3;for(let h=0;h<s.count;h++)s.getMatrixAt(h,c),c.decompose(l,p,u),l.toArray(i,h*3),p.toArray(r,h*4),u.toArray(o,h*3);const M={TRANSLATION:n.processAccessor(new f.BufferAttribute(i,3)),ROTATION:n.processAccessor(new f.BufferAttribute(r,4)),SCALE:n.processAccessor(new f.BufferAttribute(o,3))};s.instanceColor&&(M._COLOR_0=n.processAccessor(s.instanceColor)),t.extensions=t.extensions||{},t.extensions[this.name]={attributes:M},n.extensionsUsed[this.name]=!0,n.extensionsRequired[this.name]=!0}}V.Utils={insertKeyframe:function(a,e){const n=a.getValueSize(),s=new a.TimeBufferType(a.times.length+1),i=new a.ValueBufferType(a.values.length+n),r=a.createInterpolant(new a.ValueBufferType(n));let o;if(a.times.length===0){s[0]=e;for(let c=0;c<n;c++)i[c]=0;o=0}else if(e<a.times[0]){if(Math.abs(a.times[0]-e)<.001)return 0;s[0]=e,s.set(a.times,1),i.set(r.evaluate(e),0),i.set(a.values,n),o=0}else if(e>a.times[a.times.length-1]){if(Math.abs(a.times[a.times.length-1]-e)<.001)return a.times.length-1;s[s.length-1]=e,s.set(a.times,0),i.set(a.values,0),i.set(r.evaluate(e),a.values.length),o=s.length-1}else for(let c=0;c<a.times.length;c++){if(Math.abs(a.times[c]-e)<.001)return c;if(a.times[c]<e&&a.times[c+1]>e){s.set(a.times.slice(0,c+1),0),s[c+1]=e,s.set(a.times.slice(c+1),c+2),i.set(a.values.slice(0,(c+1)*n),0),i.set(r.evaluate(e),(c+1)*n),i.set(a.values.slice((c+1)*n),(c+2)*n),o=c+1;break}}return a.times=s,a.values=i,o},mergeMorphTargetTracks:function(a,e){const t=[],n={},s=a.tracks;for(let i=0;i<s.length;++i){let r=s[i];const o=f.PropertyBinding.parseTrackName(r.name),c=f.PropertyBinding.findNode(e,o.nodeName);if(o.propertyName!=="morphTargetInfluences"||o.propertyIndex===void 0){t.push(r);continue}if(r.createInterpolant!==r.InterpolantFactoryMethodDiscrete&&r.createInterpolant!==r.InterpolantFactoryMethodLinear){if(r.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline)throw new Error("THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.");console.warn("THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead."),r=r.clone(),r.setInterpolation(f.InterpolateLinear)}const l=c.morphTargetInfluences.length,p=c.morphTargetDictionary[o.propertyIndex];if(p===void 0)throw new Error("THREE.GLTFExporter: Morph target name not found: "+o.propertyIndex);let u;if(n[c.uuid]===void 0){u=r.clone();const h=new u.ValueBufferType(l*u.times.length);for(let d=0;d<u.times.length;d++)h[d*l+p]=u.values[d];u.name=(o.nodeName||"")+".morphTargetInfluences",u.values=h,n[c.uuid]=u,t.push(u);continue}const M=r.createInterpolant(new r.ValueBufferType(1));u=n[c.uuid];for(let h=0;h<u.times.length;h++)u.values[h*l+p]=M.evaluate(u.times[h]);for(let h=0;h<r.times.length;h++){const d=this.insertKeyframe(u,r.times[h]);u.values[d*l+p]=r.values[h]}}return a.tracks=t,a}};class we{constructor(){this._importer=new f.GLTFLoader,this._exporter=new V}Import(e,t){return this._importer.loadAsync(e,n=>{t&&t(n.loaded/n.total)})}Export(e,t,n){return t?this._exporter.parseAsync(e,{binary:t,onlyVisible:n}):this._exporter.parseAsync(e,{binary:t,onlyVisible:n})}}class Ee{constructor(e){this._scene=e,this._gltfIO=new we}Import(e,t){switch(e){case"glb":return this._gltfIO.Import(t).catch(n=>(console.error(n),null));default:return console.error("DIVEIO.Import: Unsupported file type: "+e),Promise.reject()}}Export(e){switch(e){case"glb":return this._gltfIO.Export(this._scene,!0,!0).then(t=>this._createBlobURL(t)).catch(t=>(console.error(t),null));default:return console.error("DIVEIO.Export: Unsupported file type: "+e),Promise.reject()}}_createBlobURL(e){return URL.createObjectURL(new Blob([e]))}}exports.DIVEIO=Ee;
|
|
19
|
+
//# sourceMappingURL=IO-BTWL9Zfp.cjs.map
|