three-stdlib 2.31.0 → 2.32.1
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/_polyfill/uv1.cjs +6 -0
- package/_polyfill/uv1.cjs.map +1 -0
- package/_polyfill/uv1.d.ts +5 -0
- package/_polyfill/uv1.js +6 -0
- package/_polyfill/uv1.js.map +1 -0
- package/controls/ArcballControls.cjs.map +1 -1
- package/controls/ArcballControls.d.ts +2 -2
- package/controls/ArcballControls.js.map +1 -1
- package/controls/FirstPersonControls.cjs.map +1 -1
- package/controls/FirstPersonControls.d.ts +1 -1
- package/controls/FirstPersonControls.js.map +1 -1
- package/exporters/ColladaExporter.cjs +3 -2
- package/exporters/ColladaExporter.cjs.map +1 -1
- package/exporters/ColladaExporter.js +3 -2
- package/exporters/ColladaExporter.js.map +1 -1
- package/lines/LineSegments2.cjs +3 -2
- package/lines/LineSegments2.cjs.map +1 -1
- package/lines/LineSegments2.js +3 -2
- package/lines/LineSegments2.js.map +1 -1
- package/loaders/ColladaLoader.cjs +7 -6
- package/loaders/ColladaLoader.cjs.map +1 -1
- package/loaders/ColladaLoader.js +7 -6
- package/loaders/ColladaLoader.js.map +1 -1
- package/loaders/FBXLoader.cjs +4 -4
- package/loaders/FBXLoader.cjs.map +1 -1
- package/loaders/FBXLoader.js +4 -4
- package/loaders/FBXLoader.js.map +1 -1
- package/loaders/LWOLoader.cjs +3 -1
- package/loaders/LWOLoader.cjs.map +1 -1
- package/loaders/LWOLoader.js +3 -1
- package/loaders/LWOLoader.js.map +1 -1
- package/misc/ProgressiveLightmap.cjs +12 -10
- package/misc/ProgressiveLightmap.cjs.map +1 -1
- package/misc/ProgressiveLightmap.js +12 -10
- package/misc/ProgressiveLightmap.js.map +1 -1
- package/modifiers/TessellateModifier.cjs +20 -19
- package/modifiers/TessellateModifier.cjs.map +1 -1
- package/modifiers/TessellateModifier.js +20 -19
- package/modifiers/TessellateModifier.js.map +1 -1
- package/package.json +1 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FirstPersonControls.cjs","sources":["../../src/controls/FirstPersonControls.ts"],"sourcesContent":["import { MathUtils, Spherical, Vector3, EventDispatcher, Camera } from 'three'\n\nconst targetPosition = new Vector3()\n\nexport class FirstPersonControls extends EventDispatcher {\n public object: Camera\n public domElement?: HTMLElement | null\n\n public enabled = true\n\n public movementSpeed = 1.0\n public lookSpeed = 0.005\n\n public lookVertical = true\n public autoForward = false\n\n public activeLook = true\n\n public heightSpeed = false\n public heightCoef = 1.0\n public heightMin = 0.0\n public heightMax = 1.0\n\n public constrainVertical = false\n public verticalMin = 0\n public verticalMax = Math.PI\n\n public mouseDragOn = false\n\n // internals\n\n private autoSpeedFactor = 0.0\n\n private mouseX = 0\n private mouseY = 0\n\n private moveForward = false\n private moveBackward = false\n private moveLeft = false\n private moveRight = false\n private moveUp = false\n private moveDown = false\n\n private viewHalfX = 0\n private viewHalfY = 0\n\n private lat = 0\n private lon = 0\n\n private lookDirection = new Vector3()\n private spherical = new Spherical()\n private target = new Vector3()\n\n constructor(object: Camera, domElement?: HTMLElement | null) {\n super()\n\n this.object = object\n this.domElement = domElement\n\n this.setOrientation()\n\n if (domElement) this.connect(domElement)\n }\n\n public connect = (domElement: HTMLElement): void => {\n domElement.setAttribute('tabindex', '-1')\n\n domElement.style.touchAction = 'none'\n\n domElement.addEventListener('contextmenu', this.contextmenu)\n domElement.addEventListener('mousemove', this.onMouseMove)\n domElement.addEventListener('mousedown', this.onMouseDown)\n domElement.addEventListener('mouseup', this.onMouseUp)\n\n this.domElement = domElement\n\n window.addEventListener('keydown', this.onKeyDown)\n window.addEventListener('keyup', this.onKeyUp)\n\n this.handleResize()\n }\n\n public dispose = (): void => {\n this.domElement?.removeEventListener('contextmenu', this.contextmenu)\n this.domElement?.removeEventListener('mousedown', this.onMouseDown)\n this.domElement?.removeEventListener('mousemove', this.onMouseMove)\n this.domElement?.removeEventListener('mouseup', this.onMouseUp)\n\n window.removeEventListener('keydown', this.onKeyDown)\n window.removeEventListener('keyup', this.onKeyUp)\n }\n\n public handleResize = (): void => {\n if (this.domElement) {\n this.viewHalfX = this.domElement.offsetWidth / 2\n this.viewHalfY = this.domElement.offsetHeight / 2\n }\n }\n\n private onMouseDown = (event: MouseEvent): void => {\n this.domElement?.focus()\n\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = true\n break\n case 2:\n this.moveBackward = true\n break\n }\n }\n\n this.mouseDragOn = true\n }\n\n private onMouseUp = (event: MouseEvent): void => {\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = false\n break\n case 2:\n this.moveBackward = false\n break\n }\n }\n\n this.mouseDragOn = false\n }\n\n private onMouseMove = (event: MouseEvent): void => {\n if (this.domElement) {\n this.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX\n this.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY\n }\n }\n\n private onKeyDown = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = true\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = true\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = true\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = true\n break\n\n case 'KeyR':\n this.moveUp = true\n break\n case 'KeyF':\n this.moveDown = true\n break\n }\n }\n\n private onKeyUp = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = false\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = false\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = false\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = false\n break\n\n case 'KeyR':\n this.moveUp = false\n break\n case 'KeyF':\n this.moveDown = false\n break\n }\n }\n\n public lookAt = (x: Vector3 | number, y?: number, z?: number): this => {\n if (x instanceof Vector3) {\n this.target.copy(x)\n } else if (y && z) {\n this.target.set(x, y, z)\n }\n\n this.object.lookAt(this.target)\n\n this.setOrientation()\n\n return this\n }\n\n public update = (delta: number): void => {\n if (!this.enabled) return\n\n if (this.heightSpeed) {\n const y = MathUtils.clamp(this.object.position.y, this.heightMin, this.heightMax)\n const heightDelta = y - this.heightMin\n\n this.autoSpeedFactor = delta * (heightDelta * this.heightCoef)\n } else {\n this.autoSpeedFactor = 0.0\n }\n\n const actualMoveSpeed = delta * this.movementSpeed\n\n if (this.moveForward || (this.autoForward && !this.moveBackward)) {\n this.object.translateZ(-(actualMoveSpeed + this.autoSpeedFactor))\n }\n if (this.moveBackward) this.object.translateZ(actualMoveSpeed)\n\n if (this.moveLeft) this.object.translateX(-actualMoveSpeed)\n if (this.moveRight) this.object.translateX(actualMoveSpeed)\n\n if (this.moveUp) this.object.translateY(actualMoveSpeed)\n if (this.moveDown) this.object.translateY(-actualMoveSpeed)\n\n let actualLookSpeed = delta * this.lookSpeed\n\n if (!this.activeLook) {\n actualLookSpeed = 0\n }\n\n let verticalLookRatio = 1\n\n if (this.constrainVertical) {\n verticalLookRatio = Math.PI / (this.verticalMax - this.verticalMin)\n }\n\n this.lon -= this.mouseX * actualLookSpeed\n if (this.lookVertical) this.lat -= this.mouseY * actualLookSpeed * verticalLookRatio\n\n this.lat = Math.max(-85, Math.min(85, this.lat))\n\n let phi = MathUtils.degToRad(90 - this.lat)\n const theta = MathUtils.degToRad(this.lon)\n\n if (this.constrainVertical) {\n phi = MathUtils.mapLinear(phi, 0, Math.PI, this.verticalMin, this.verticalMax)\n }\n\n const position = this.object.position\n\n targetPosition.setFromSphericalCoords(1, phi, theta).add(position)\n\n this.object.lookAt(targetPosition)\n }\n\n private contextmenu = (event: Event): void => event.preventDefault()\n\n private setOrientation = (): void => {\n this.lookDirection.set(0, 0, -1).applyQuaternion(this.object.quaternion)\n this.spherical.setFromVector3(this.lookDirection)\n this.lat = 90 - MathUtils.radToDeg(this.spherical.phi)\n this.lon = MathUtils.radToDeg(this.spherical.theta)\n }\n}\n"],"names":["Vector3","EventDispatcher","Spherical","MathUtils"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"FirstPersonControls.cjs","sources":["../../src/controls/FirstPersonControls.ts"],"sourcesContent":["import { MathUtils, Spherical, Vector3, EventDispatcher, Camera } from 'three'\n\nconst targetPosition = new Vector3()\n\nexport class FirstPersonControls extends EventDispatcher {\n public object: Camera\n public domElement?: HTMLElement | null\n\n public enabled = true\n\n public movementSpeed = 1.0\n public lookSpeed = 0.005\n\n public lookVertical = true\n public autoForward = false\n\n public activeLook = true\n\n public heightSpeed = false\n public heightCoef = 1.0\n public heightMin = 0.0\n public heightMax = 1.0\n\n public constrainVertical = false\n public verticalMin = 0\n public verticalMax = Math.PI\n\n public mouseDragOn = false\n\n // internals\n\n private autoSpeedFactor = 0.0\n\n private mouseX = 0\n private mouseY = 0\n\n private moveForward = false\n private moveBackward = false\n private moveLeft = false\n private moveRight = false\n private moveUp = false\n private moveDown = false\n\n private viewHalfX = 0\n private viewHalfY = 0\n\n private lat = 0\n private lon = 0\n\n private lookDirection = new Vector3()\n private spherical = new Spherical()\n readonly target = new Vector3()\n\n constructor(object: Camera, domElement?: HTMLElement | null) {\n super()\n\n this.object = object\n this.domElement = domElement\n\n this.setOrientation()\n\n if (domElement) this.connect(domElement)\n }\n\n public connect = (domElement: HTMLElement): void => {\n domElement.setAttribute('tabindex', '-1')\n\n domElement.style.touchAction = 'none'\n\n domElement.addEventListener('contextmenu', this.contextmenu)\n domElement.addEventListener('mousemove', this.onMouseMove)\n domElement.addEventListener('mousedown', this.onMouseDown)\n domElement.addEventListener('mouseup', this.onMouseUp)\n\n this.domElement = domElement\n\n window.addEventListener('keydown', this.onKeyDown)\n window.addEventListener('keyup', this.onKeyUp)\n\n this.handleResize()\n }\n\n public dispose = (): void => {\n this.domElement?.removeEventListener('contextmenu', this.contextmenu)\n this.domElement?.removeEventListener('mousedown', this.onMouseDown)\n this.domElement?.removeEventListener('mousemove', this.onMouseMove)\n this.domElement?.removeEventListener('mouseup', this.onMouseUp)\n\n window.removeEventListener('keydown', this.onKeyDown)\n window.removeEventListener('keyup', this.onKeyUp)\n }\n\n public handleResize = (): void => {\n if (this.domElement) {\n this.viewHalfX = this.domElement.offsetWidth / 2\n this.viewHalfY = this.domElement.offsetHeight / 2\n }\n }\n\n private onMouseDown = (event: MouseEvent): void => {\n this.domElement?.focus()\n\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = true\n break\n case 2:\n this.moveBackward = true\n break\n }\n }\n\n this.mouseDragOn = true\n }\n\n private onMouseUp = (event: MouseEvent): void => {\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = false\n break\n case 2:\n this.moveBackward = false\n break\n }\n }\n\n this.mouseDragOn = false\n }\n\n private onMouseMove = (event: MouseEvent): void => {\n if (this.domElement) {\n this.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX\n this.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY\n }\n }\n\n private onKeyDown = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = true\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = true\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = true\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = true\n break\n\n case 'KeyR':\n this.moveUp = true\n break\n case 'KeyF':\n this.moveDown = true\n break\n }\n }\n\n private onKeyUp = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = false\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = false\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = false\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = false\n break\n\n case 'KeyR':\n this.moveUp = false\n break\n case 'KeyF':\n this.moveDown = false\n break\n }\n }\n\n public lookAt = (x: Vector3 | number, y?: number, z?: number): this => {\n if (x instanceof Vector3) {\n this.target.copy(x)\n } else if (y && z) {\n this.target.set(x, y, z)\n }\n\n this.object.lookAt(this.target)\n\n this.setOrientation()\n\n return this\n }\n\n public update = (delta: number): void => {\n if (!this.enabled) return\n\n if (this.heightSpeed) {\n const y = MathUtils.clamp(this.object.position.y, this.heightMin, this.heightMax)\n const heightDelta = y - this.heightMin\n\n this.autoSpeedFactor = delta * (heightDelta * this.heightCoef)\n } else {\n this.autoSpeedFactor = 0.0\n }\n\n const actualMoveSpeed = delta * this.movementSpeed\n\n if (this.moveForward || (this.autoForward && !this.moveBackward)) {\n this.object.translateZ(-(actualMoveSpeed + this.autoSpeedFactor))\n }\n if (this.moveBackward) this.object.translateZ(actualMoveSpeed)\n\n if (this.moveLeft) this.object.translateX(-actualMoveSpeed)\n if (this.moveRight) this.object.translateX(actualMoveSpeed)\n\n if (this.moveUp) this.object.translateY(actualMoveSpeed)\n if (this.moveDown) this.object.translateY(-actualMoveSpeed)\n\n let actualLookSpeed = delta * this.lookSpeed\n\n if (!this.activeLook) {\n actualLookSpeed = 0\n }\n\n let verticalLookRatio = 1\n\n if (this.constrainVertical) {\n verticalLookRatio = Math.PI / (this.verticalMax - this.verticalMin)\n }\n\n this.lon -= this.mouseX * actualLookSpeed\n if (this.lookVertical) this.lat -= this.mouseY * actualLookSpeed * verticalLookRatio\n\n this.lat = Math.max(-85, Math.min(85, this.lat))\n\n let phi = MathUtils.degToRad(90 - this.lat)\n const theta = MathUtils.degToRad(this.lon)\n\n if (this.constrainVertical) {\n phi = MathUtils.mapLinear(phi, 0, Math.PI, this.verticalMin, this.verticalMax)\n }\n\n const position = this.object.position\n\n targetPosition.setFromSphericalCoords(1, phi, theta).add(position)\n\n this.object.lookAt(targetPosition)\n }\n\n private contextmenu = (event: Event): void => event.preventDefault()\n\n private setOrientation = (): void => {\n this.lookDirection.set(0, 0, -1).applyQuaternion(this.object.quaternion)\n this.spherical.setFromVector3(this.lookDirection)\n this.lat = 90 - MathUtils.radToDeg(this.spherical.phi)\n this.lon = MathUtils.radToDeg(this.spherical.theta)\n }\n}\n"],"names":["Vector3","EventDispatcher","Spherical","MathUtils"],"mappings":"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"}
|
@@ -31,7 +31,7 @@ export declare class FirstPersonControls extends EventDispatcher {
|
|
31
31
|
private lon;
|
32
32
|
private lookDirection;
|
33
33
|
private spherical;
|
34
|
-
|
34
|
+
readonly target: Vector3;
|
35
35
|
constructor(object: Camera, domElement?: HTMLElement | null);
|
36
36
|
connect: (domElement: HTMLElement) => void;
|
37
37
|
dispose: () => void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FirstPersonControls.js","sources":["../../src/controls/FirstPersonControls.ts"],"sourcesContent":["import { MathUtils, Spherical, Vector3, EventDispatcher, Camera } from 'three'\n\nconst targetPosition = new Vector3()\n\nexport class FirstPersonControls extends EventDispatcher {\n public object: Camera\n public domElement?: HTMLElement | null\n\n public enabled = true\n\n public movementSpeed = 1.0\n public lookSpeed = 0.005\n\n public lookVertical = true\n public autoForward = false\n\n public activeLook = true\n\n public heightSpeed = false\n public heightCoef = 1.0\n public heightMin = 0.0\n public heightMax = 1.0\n\n public constrainVertical = false\n public verticalMin = 0\n public verticalMax = Math.PI\n\n public mouseDragOn = false\n\n // internals\n\n private autoSpeedFactor = 0.0\n\n private mouseX = 0\n private mouseY = 0\n\n private moveForward = false\n private moveBackward = false\n private moveLeft = false\n private moveRight = false\n private moveUp = false\n private moveDown = false\n\n private viewHalfX = 0\n private viewHalfY = 0\n\n private lat = 0\n private lon = 0\n\n private lookDirection = new Vector3()\n private spherical = new Spherical()\n private target = new Vector3()\n\n constructor(object: Camera, domElement?: HTMLElement | null) {\n super()\n\n this.object = object\n this.domElement = domElement\n\n this.setOrientation()\n\n if (domElement) this.connect(domElement)\n }\n\n public connect = (domElement: HTMLElement): void => {\n domElement.setAttribute('tabindex', '-1')\n\n domElement.style.touchAction = 'none'\n\n domElement.addEventListener('contextmenu', this.contextmenu)\n domElement.addEventListener('mousemove', this.onMouseMove)\n domElement.addEventListener('mousedown', this.onMouseDown)\n domElement.addEventListener('mouseup', this.onMouseUp)\n\n this.domElement = domElement\n\n window.addEventListener('keydown', this.onKeyDown)\n window.addEventListener('keyup', this.onKeyUp)\n\n this.handleResize()\n }\n\n public dispose = (): void => {\n this.domElement?.removeEventListener('contextmenu', this.contextmenu)\n this.domElement?.removeEventListener('mousedown', this.onMouseDown)\n this.domElement?.removeEventListener('mousemove', this.onMouseMove)\n this.domElement?.removeEventListener('mouseup', this.onMouseUp)\n\n window.removeEventListener('keydown', this.onKeyDown)\n window.removeEventListener('keyup', this.onKeyUp)\n }\n\n public handleResize = (): void => {\n if (this.domElement) {\n this.viewHalfX = this.domElement.offsetWidth / 2\n this.viewHalfY = this.domElement.offsetHeight / 2\n }\n }\n\n private onMouseDown = (event: MouseEvent): void => {\n this.domElement?.focus()\n\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = true\n break\n case 2:\n this.moveBackward = true\n break\n }\n }\n\n this.mouseDragOn = true\n }\n\n private onMouseUp = (event: MouseEvent): void => {\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = false\n break\n case 2:\n this.moveBackward = false\n break\n }\n }\n\n this.mouseDragOn = false\n }\n\n private onMouseMove = (event: MouseEvent): void => {\n if (this.domElement) {\n this.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX\n this.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY\n }\n }\n\n private onKeyDown = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = true\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = true\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = true\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = true\n break\n\n case 'KeyR':\n this.moveUp = true\n break\n case 'KeyF':\n this.moveDown = true\n break\n }\n }\n\n private onKeyUp = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = false\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = false\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = false\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = false\n break\n\n case 'KeyR':\n this.moveUp = false\n break\n case 'KeyF':\n this.moveDown = false\n break\n }\n }\n\n public lookAt = (x: Vector3 | number, y?: number, z?: number): this => {\n if (x instanceof Vector3) {\n this.target.copy(x)\n } else if (y && z) {\n this.target.set(x, y, z)\n }\n\n this.object.lookAt(this.target)\n\n this.setOrientation()\n\n return this\n }\n\n public update = (delta: number): void => {\n if (!this.enabled) return\n\n if (this.heightSpeed) {\n const y = MathUtils.clamp(this.object.position.y, this.heightMin, this.heightMax)\n const heightDelta = y - this.heightMin\n\n this.autoSpeedFactor = delta * (heightDelta * this.heightCoef)\n } else {\n this.autoSpeedFactor = 0.0\n }\n\n const actualMoveSpeed = delta * this.movementSpeed\n\n if (this.moveForward || (this.autoForward && !this.moveBackward)) {\n this.object.translateZ(-(actualMoveSpeed + this.autoSpeedFactor))\n }\n if (this.moveBackward) this.object.translateZ(actualMoveSpeed)\n\n if (this.moveLeft) this.object.translateX(-actualMoveSpeed)\n if (this.moveRight) this.object.translateX(actualMoveSpeed)\n\n if (this.moveUp) this.object.translateY(actualMoveSpeed)\n if (this.moveDown) this.object.translateY(-actualMoveSpeed)\n\n let actualLookSpeed = delta * this.lookSpeed\n\n if (!this.activeLook) {\n actualLookSpeed = 0\n }\n\n let verticalLookRatio = 1\n\n if (this.constrainVertical) {\n verticalLookRatio = Math.PI / (this.verticalMax - this.verticalMin)\n }\n\n this.lon -= this.mouseX * actualLookSpeed\n if (this.lookVertical) this.lat -= this.mouseY * actualLookSpeed * verticalLookRatio\n\n this.lat = Math.max(-85, Math.min(85, this.lat))\n\n let phi = MathUtils.degToRad(90 - this.lat)\n const theta = MathUtils.degToRad(this.lon)\n\n if (this.constrainVertical) {\n phi = MathUtils.mapLinear(phi, 0, Math.PI, this.verticalMin, this.verticalMax)\n }\n\n const position = this.object.position\n\n targetPosition.setFromSphericalCoords(1, phi, theta).add(position)\n\n this.object.lookAt(targetPosition)\n }\n\n private contextmenu = (event: Event): void => event.preventDefault()\n\n private setOrientation = (): void => {\n this.lookDirection.set(0, 0, -1).applyQuaternion(this.object.quaternion)\n this.spherical.setFromVector3(this.lookDirection)\n this.lat = 90 - MathUtils.radToDeg(this.spherical.phi)\n this.lon = MathUtils.radToDeg(this.spherical.theta)\n }\n}\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"FirstPersonControls.js","sources":["../../src/controls/FirstPersonControls.ts"],"sourcesContent":["import { MathUtils, Spherical, Vector3, EventDispatcher, Camera } from 'three'\n\nconst targetPosition = new Vector3()\n\nexport class FirstPersonControls extends EventDispatcher {\n public object: Camera\n public domElement?: HTMLElement | null\n\n public enabled = true\n\n public movementSpeed = 1.0\n public lookSpeed = 0.005\n\n public lookVertical = true\n public autoForward = false\n\n public activeLook = true\n\n public heightSpeed = false\n public heightCoef = 1.0\n public heightMin = 0.0\n public heightMax = 1.0\n\n public constrainVertical = false\n public verticalMin = 0\n public verticalMax = Math.PI\n\n public mouseDragOn = false\n\n // internals\n\n private autoSpeedFactor = 0.0\n\n private mouseX = 0\n private mouseY = 0\n\n private moveForward = false\n private moveBackward = false\n private moveLeft = false\n private moveRight = false\n private moveUp = false\n private moveDown = false\n\n private viewHalfX = 0\n private viewHalfY = 0\n\n private lat = 0\n private lon = 0\n\n private lookDirection = new Vector3()\n private spherical = new Spherical()\n readonly target = new Vector3()\n\n constructor(object: Camera, domElement?: HTMLElement | null) {\n super()\n\n this.object = object\n this.domElement = domElement\n\n this.setOrientation()\n\n if (domElement) this.connect(domElement)\n }\n\n public connect = (domElement: HTMLElement): void => {\n domElement.setAttribute('tabindex', '-1')\n\n domElement.style.touchAction = 'none'\n\n domElement.addEventListener('contextmenu', this.contextmenu)\n domElement.addEventListener('mousemove', this.onMouseMove)\n domElement.addEventListener('mousedown', this.onMouseDown)\n domElement.addEventListener('mouseup', this.onMouseUp)\n\n this.domElement = domElement\n\n window.addEventListener('keydown', this.onKeyDown)\n window.addEventListener('keyup', this.onKeyUp)\n\n this.handleResize()\n }\n\n public dispose = (): void => {\n this.domElement?.removeEventListener('contextmenu', this.contextmenu)\n this.domElement?.removeEventListener('mousedown', this.onMouseDown)\n this.domElement?.removeEventListener('mousemove', this.onMouseMove)\n this.domElement?.removeEventListener('mouseup', this.onMouseUp)\n\n window.removeEventListener('keydown', this.onKeyDown)\n window.removeEventListener('keyup', this.onKeyUp)\n }\n\n public handleResize = (): void => {\n if (this.domElement) {\n this.viewHalfX = this.domElement.offsetWidth / 2\n this.viewHalfY = this.domElement.offsetHeight / 2\n }\n }\n\n private onMouseDown = (event: MouseEvent): void => {\n this.domElement?.focus()\n\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = true\n break\n case 2:\n this.moveBackward = true\n break\n }\n }\n\n this.mouseDragOn = true\n }\n\n private onMouseUp = (event: MouseEvent): void => {\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = false\n break\n case 2:\n this.moveBackward = false\n break\n }\n }\n\n this.mouseDragOn = false\n }\n\n private onMouseMove = (event: MouseEvent): void => {\n if (this.domElement) {\n this.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX\n this.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY\n }\n }\n\n private onKeyDown = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = true\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = true\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = true\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = true\n break\n\n case 'KeyR':\n this.moveUp = true\n break\n case 'KeyF':\n this.moveDown = true\n break\n }\n }\n\n private onKeyUp = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = false\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = false\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = false\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = false\n break\n\n case 'KeyR':\n this.moveUp = false\n break\n case 'KeyF':\n this.moveDown = false\n break\n }\n }\n\n public lookAt = (x: Vector3 | number, y?: number, z?: number): this => {\n if (x instanceof Vector3) {\n this.target.copy(x)\n } else if (y && z) {\n this.target.set(x, y, z)\n }\n\n this.object.lookAt(this.target)\n\n this.setOrientation()\n\n return this\n }\n\n public update = (delta: number): void => {\n if (!this.enabled) return\n\n if (this.heightSpeed) {\n const y = MathUtils.clamp(this.object.position.y, this.heightMin, this.heightMax)\n const heightDelta = y - this.heightMin\n\n this.autoSpeedFactor = delta * (heightDelta * this.heightCoef)\n } else {\n this.autoSpeedFactor = 0.0\n }\n\n const actualMoveSpeed = delta * this.movementSpeed\n\n if (this.moveForward || (this.autoForward && !this.moveBackward)) {\n this.object.translateZ(-(actualMoveSpeed + this.autoSpeedFactor))\n }\n if (this.moveBackward) this.object.translateZ(actualMoveSpeed)\n\n if (this.moveLeft) this.object.translateX(-actualMoveSpeed)\n if (this.moveRight) this.object.translateX(actualMoveSpeed)\n\n if (this.moveUp) this.object.translateY(actualMoveSpeed)\n if (this.moveDown) this.object.translateY(-actualMoveSpeed)\n\n let actualLookSpeed = delta * this.lookSpeed\n\n if (!this.activeLook) {\n actualLookSpeed = 0\n }\n\n let verticalLookRatio = 1\n\n if (this.constrainVertical) {\n verticalLookRatio = Math.PI / (this.verticalMax - this.verticalMin)\n }\n\n this.lon -= this.mouseX * actualLookSpeed\n if (this.lookVertical) this.lat -= this.mouseY * actualLookSpeed * verticalLookRatio\n\n this.lat = Math.max(-85, Math.min(85, this.lat))\n\n let phi = MathUtils.degToRad(90 - this.lat)\n const theta = MathUtils.degToRad(this.lon)\n\n if (this.constrainVertical) {\n phi = MathUtils.mapLinear(phi, 0, Math.PI, this.verticalMin, this.verticalMax)\n }\n\n const position = this.object.position\n\n targetPosition.setFromSphericalCoords(1, phi, theta).add(position)\n\n this.object.lookAt(targetPosition)\n }\n\n private contextmenu = (event: Event): void => event.preventDefault()\n\n private setOrientation = (): void => {\n this.lookDirection.set(0, 0, -1).applyQuaternion(this.object.quaternion)\n this.spherical.setFromVector3(this.lookDirection)\n this.lat = 90 - MathUtils.radToDeg(this.spherical.phi)\n this.lon = MathUtils.radToDeg(this.spherical.theta)\n }\n}\n"],"names":[],"mappings":"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"}
|
@@ -7,6 +7,7 @@ var __publicField = (obj, key, value) => {
|
|
7
7
|
};
|
8
8
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
9
9
|
const THREE = require("three");
|
10
|
+
const uv1 = require("../_polyfill/uv1.cjs");
|
10
11
|
class ColladaExporter {
|
11
12
|
constructor() {
|
12
13
|
__publicField(this, "options");
|
@@ -191,9 +192,9 @@ class ColladaExporter {
|
|
191
192
|
gnode += this.getAttribute(bufferGeometry.attributes.uv, uvName, ["S", "T"], "float");
|
192
193
|
triangleInputs += `<input semantic="TEXCOORD" source="#${uvName}" offset="0" set="0" />`;
|
193
194
|
}
|
194
|
-
if (
|
195
|
+
if (uv1.UV1 in bufferGeometry.attributes) {
|
195
196
|
const uvName = `${meshid}-texcoord2`;
|
196
|
-
gnode += this.getAttribute(bufferGeometry.attributes.
|
197
|
+
gnode += this.getAttribute(bufferGeometry.attributes[uv1.UV1], uvName, ["S", "T"], "float");
|
197
198
|
triangleInputs += `<input semantic="TEXCOORD" source="#${uvName}" offset="0" set="1" />`;
|
198
199
|
}
|
199
200
|
if ("color" in bufferGeometry.attributes) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ColladaExporter.cjs","sources":["../../src/exporters/ColladaExporter.ts"],"sourcesContent":["import {\n BufferAttribute,\n BufferGeometry,\n Color,\n DoubleSide,\n InterleavedBufferAttribute,\n Material,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshPhongMaterial,\n Object3D,\n Texture,\n} from 'three'\nimport type { TypedArray, TypedArrayConstructors } from '../types/shared'\n\n/**\n * https://github.com/gkjohnson/collada-exporter-js\n *\n * Usage:\n * const exporter = new ColladaExporter();\n *\n * const data = exporter.parse(mesh);\n *\n * Format Definition:\n * https://www.khronos.org/collada/\n */\n\nexport interface ColladaExporterOptions {\n author?: string\n textureDirectory?: string\n version?: string\n}\n\nexport interface ColladaExporterResult {\n data: string\n textures: object[]\n}\n\ntype GeometryInfo = { meshid: string; bufferGeometry: BufferGeometry }\n\ntype MaterialRepresentation = MeshPhongMaterial | MeshBasicMaterial | MeshLambertMaterial\n\nclass ColladaExporter {\n private options: {\n version: string\n author: string | null\n textureDirectory: string\n upAxis: string\n unitName: string | null\n unitMeter: string | null\n }\n\n private geometryInfo: WeakMap<BufferGeometry, GeometryInfo>\n private materialMap: WeakMap<MaterialRepresentation, string>\n private imageMap: WeakMap<Texture, string>\n private textures: {\n directory: string\n name: string\n ext: string\n data: Uint8Array\n original: Texture\n }[]\n\n private libraryImages: string[]\n private libraryGeometries: string[]\n private libraryEffects: string[]\n private libraryMaterials: string[]\n\n private canvas: HTMLCanvasElement | null\n private ctx: CanvasRenderingContext2D | null\n\n private transMat: Matrix4 | null\n\n private getFuncs = ['getX', 'getY', 'getZ', 'getW'] as const\n\n constructor() {\n this.options = {\n version: '1.4.1',\n author: null,\n textureDirectory: '',\n upAxis: 'Y_UP',\n unitName: null,\n unitMeter: null,\n }\n\n this.geometryInfo = new WeakMap()\n this.materialMap = new WeakMap()\n this.imageMap = new WeakMap()\n this.textures = []\n\n this.libraryImages = []\n this.libraryGeometries = []\n this.libraryEffects = []\n this.libraryMaterials = []\n\n this.canvas = null\n this.ctx = null\n\n this.transMat = null\n }\n\n public parse(\n object: Object3D,\n onDone: (res: ColladaExporterResult) => void,\n options: ColladaExporterOptions = {},\n ): ColladaExporterResult | null {\n this.options = { ...this.options, ...options }\n\n if (this.options.upAxis.match(/^[XYZ]_UP$/) === null) {\n console.error('ColladaExporter: Invalid upAxis: valid values are X_UP, Y_UP or Z_UP.')\n return null\n }\n\n if (this.options.unitName !== null && this.options.unitMeter === null) {\n console.error('ColladaExporter: unitMeter needs to be specified if unitName is specified.')\n return null\n }\n\n if (this.options.unitMeter !== null && this.options.unitName === null) {\n console.error('ColladaExporter: unitName needs to be specified if unitMeter is specified.')\n return null\n }\n\n if (this.options.textureDirectory !== '') {\n this.options.textureDirectory = `${this.options.textureDirectory}/`.replace(/\\\\/g, '/').replace(/\\/+/g, '/')\n }\n\n if (this.options.version !== '1.4.1' && this.options.version !== '1.5.0') {\n console.warn(`ColladaExporter : Version ${this.options.version} not supported for export. Only 1.4.1 and 1.5.0.`)\n return null\n }\n\n const libraryVisualScenes = this.processObject(object)\n\n const specLink =\n this.options.version === '1.4.1'\n ? 'http://www.collada.org/2005/11/COLLADASchema'\n : 'https://www.khronos.org/collada/'\n let dae = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>${`<COLLADA xmlns=\"${specLink}\" version=\"${this.options.version}\">`}<asset><contributor><authoring_tool>three.js Collada Exporter</authoring_tool>${\n this.options.author !== null ? `<author>${this.options.author}</author>` : ''\n }</contributor>${`<created>${new Date().toISOString()}</created>`}${`<modified>${new Date().toISOString()}</modified>`}<up_axis>Y_UP</up_axis></asset>`\n\n dae += `<library_images>${this.libraryImages.join('')}</library_images>`\n\n dae += `<library_effects>${this.libraryEffects.join('')}</library_effects>`\n\n dae += `<library_materials>${this.libraryMaterials.join('')}</library_materials>`\n\n dae += `<library_geometries>${this.libraryGeometries.join('')}</library_geometries>`\n\n dae += `<library_visual_scenes><visual_scene id=\"Scene\" name=\"scene\">${libraryVisualScenes}</visual_scene></library_visual_scenes>`\n\n dae += '<scene><instance_visual_scene url=\"#Scene\"/></scene>'\n\n dae += '</COLLADA>'\n\n const res = {\n data: this.format(dae),\n textures: this.textures,\n }\n\n if (typeof onDone === 'function') {\n requestAnimationFrame(() => onDone(res))\n }\n\n return res\n }\n\n // Convert the urdf xml into a well-formatted, indented format\n private format(urdf: string): string {\n const IS_END_TAG = /^<\\//\n const IS_SELF_CLOSING = /(\\?>$)|(\\/>$)/\n const HAS_TEXT = /<[^>]+>[^<]*<\\/[^<]+>/\n\n const pad = (ch: string, num: number): string => (num > 0 ? ch + pad(ch, num - 1) : '')\n\n let tagnum = 0\n\n return (\n urdf\n .match(/(<[^>]+>[^<]+<\\/[^<]+>)|(<[^>]+>)/g)\n ?.map((tag) => {\n if (!HAS_TEXT.test(tag) && !IS_SELF_CLOSING.test(tag) && IS_END_TAG.test(tag)) {\n tagnum--\n }\n\n const res = `${pad(' ', tagnum)}${tag}`\n\n if (!HAS_TEXT.test(tag) && !IS_SELF_CLOSING.test(tag) && !IS_END_TAG.test(tag)) {\n tagnum++\n }\n\n return res\n })\n .join('\\n') ?? ''\n )\n }\n\n // Convert an image into a png format for saving\n private base64ToBuffer(str: string): Uint8Array {\n const b = atob(str)\n const buf = new Uint8Array(b.length)\n\n for (let i = 0, l = buf.length; i < l; i++) {\n buf[i] = b.charCodeAt(i)\n }\n\n return buf\n }\n\n private imageToData(image: CanvasImageSource, ext: string): Uint8Array {\n this.canvas = this.canvas || document.createElement('canvas')\n this.ctx = this.ctx || this.canvas.getContext('2d')\n\n this.canvas.width = image.width instanceof SVGAnimatedLength ? 0 : image.width\n this.canvas.height = image.height instanceof SVGAnimatedLength ? 0 : image.height\n\n this.ctx?.drawImage(image, 0, 0)\n\n // Get the base64 encoded data\n const base64data = this.canvas.toDataURL(`image/${ext}`, 1).replace(/^data:image\\/(png|jpg);base64,/, '')\n\n // Convert to a uint8 array\n return this.base64ToBuffer(base64data)\n }\n\n // gets the attribute array. Generate a new array if the attribute is interleaved\n private attrBufferToArray(attr: InterleavedBufferAttribute | BufferAttribute): number[] | ArrayLike<number> {\n if (attr instanceof InterleavedBufferAttribute && attr.isInterleavedBufferAttribute) {\n // use the typed array constructor to save on memory\n const TypedArrayConstructor: TypedArrayConstructors = attr.array.constructor\n // @ts-ignore\n const arr: number[] = new TypedArrayConstructor(attr.count * attr.itemSize)\n const size = attr.itemSize\n\n for (let i = 0, l = attr.count; i < l; i++) {\n for (let j = 0; j < size; j++) {\n arr[i * size + j] = attr[this.getFuncs[j]](i)\n }\n }\n\n return arr\n } else {\n return attr.array\n }\n }\n\n // Returns an array of the same type starting at the `st` index,\n // and `ct` length\n private subArray(arr: number[] | ArrayLike<number>, st: number, ct: number): TypedArray | number[] {\n if (Array.isArray(arr)) {\n return arr.slice(st, st + ct)\n } else {\n const TypedArrayConstructor: TypedArrayConstructors = arr.constructor\n // @ts-ignore\n return new TypedArrayConstructor(arr.buffer, st * arr.BYTES_PER_ELEMENT, ct)\n }\n }\n\n // Returns the string for a geometry's attribute\n private getAttribute(\n attr: InterleavedBufferAttribute | BufferAttribute,\n name: string,\n params: string[],\n type: string,\n ): string {\n const array = this.attrBufferToArray(attr)\n const res = Array.isArray(array)\n ? `${\n `<source id=\"${name}\">` + `<float_array id=\"${name}-array\" count=\"${array.length}\">` + array.join(' ')\n }</float_array><technique_common>${`<accessor source=\"#${name}-array\" count=\"${Math.floor(\n array.length / attr.itemSize,\n )}\" stride=\"${attr.itemSize}\">`}${params\n .map((n) => `<param name=\"${n}\" type=\"${type}\" />`)\n .join('')}</accessor></technique_common></source>`\n : ''\n\n return res\n }\n\n // Returns the string for a node's transform information\n private getTransform(o: Object3D): string {\n // ensure the object's matrix is up to date\n // before saving the transform\n o.updateMatrix()\n\n this.transMat = this.transMat || new Matrix4()\n this.transMat.copy(o.matrix)\n this.transMat.transpose()\n return `<matrix>${this.transMat.toArray().join(' ')}</matrix>`\n }\n\n // Process the given piece of geometry into the geometry library\n // Returns the mesh id\n private processGeometry(g: BufferGeometry): GeometryInfo {\n let info = this.geometryInfo.get(g)\n\n if (!info) {\n // convert the geometry to bufferGeometry if it isn't already\n const bufferGeometry = g\n\n if (!bufferGeometry.isBufferGeometry) {\n throw new Error('THREE.ColladaExporter: Geometry is not of type THREE.BufferGeometry.')\n }\n\n const meshid = `Mesh${this.libraryGeometries.length + 1}`\n\n const indexCount = bufferGeometry.index\n ? bufferGeometry.index.count * bufferGeometry.index.itemSize\n : bufferGeometry.attributes.position.count\n\n const groups =\n bufferGeometry.groups != null && bufferGeometry.groups.length !== 0\n ? bufferGeometry.groups\n : [{ start: 0, count: indexCount, materialIndex: 0 }]\n\n const gname = g.name ? ` name=\"${g.name}\"` : ''\n let gnode = `<geometry id=\"${meshid}\"${gname}><mesh>`\n\n // define the geometry node and the vertices for the geometry\n const posName = `${meshid}-position`\n const vertName = `${meshid}-vertices`\n gnode += this.getAttribute(bufferGeometry.attributes.position, posName, ['X', 'Y', 'Z'], 'float')\n gnode += `<vertices id=\"${vertName}\"><input semantic=\"POSITION\" source=\"#${posName}\" /></vertices>`\n\n // NOTE: We're not optimizing the attribute arrays here, so they're all the same length and\n // can therefore share the same triangle indices. However, MeshLab seems to have trouble opening\n // models with attributes that share an offset.\n // MeshLab Bug#424: https://sourceforge.net/p/meshlab/bugs/424/\n\n // serialize normals\n let triangleInputs = `<input semantic=\"VERTEX\" source=\"#${vertName}\" offset=\"0\" />`\n if ('normal' in bufferGeometry.attributes) {\n const normName = `${meshid}-normal`\n gnode += this.getAttribute(bufferGeometry.attributes.normal, normName, ['X', 'Y', 'Z'], 'float')\n triangleInputs += `<input semantic=\"NORMAL\" source=\"#${normName}\" offset=\"0\" />`\n }\n\n // serialize uvs\n if ('uv' in bufferGeometry.attributes) {\n const uvName = `${meshid}-texcoord`\n gnode += this.getAttribute(bufferGeometry.attributes.uv, uvName, ['S', 'T'], 'float')\n triangleInputs += `<input semantic=\"TEXCOORD\" source=\"#${uvName}\" offset=\"0\" set=\"0\" />`\n }\n\n // serialize lightmap uvs\n if ('uv2' in bufferGeometry.attributes) {\n const uvName = `${meshid}-texcoord2`\n gnode += this.getAttribute(bufferGeometry.attributes.uv2, uvName, ['S', 'T'], 'float')\n triangleInputs += `<input semantic=\"TEXCOORD\" source=\"#${uvName}\" offset=\"0\" set=\"1\" />`\n }\n\n // serialize colors\n if ('color' in bufferGeometry.attributes) {\n const colName = `${meshid}-color`\n gnode += this.getAttribute(bufferGeometry.attributes.color, colName, ['X', 'Y', 'Z'], 'uint8')\n triangleInputs += `<input semantic=\"COLOR\" source=\"#${colName}\" offset=\"0\" />`\n }\n\n let indexArray: number[] | ArrayLike<number> | null = null\n if (bufferGeometry.index) {\n indexArray = this.attrBufferToArray(bufferGeometry.index)\n } else {\n indexArray = new Array(indexCount)\n for (let i = 0, l = indexArray.length; i < l && Array.isArray(indexArray); i++) indexArray[i] = i\n }\n\n for (let i = 0, l = groups.length; i < l; i++) {\n const group = groups[i]\n const subarr = this.subArray(indexArray, group.start, group.count)\n const polycount = subarr.length / 3\n gnode += `<triangles material=\"MESH_MATERIAL_${group.materialIndex}\" count=\"${polycount}\">`\n gnode += triangleInputs\n\n gnode += `<p>${subarr.join(' ')}</p>`\n gnode += '</triangles>'\n }\n\n gnode += '</mesh></geometry>'\n\n this.libraryGeometries.push(gnode)\n\n info = { meshid, bufferGeometry }\n this.geometryInfo.set(g, info)\n }\n\n return info\n }\n\n // Process the given texture into the image library\n // Returns the image library\n private processTexture(tex: Texture): string {\n let texid = this.imageMap.get(tex)\n if (texid == null) {\n texid = `image-${this.libraryImages.length + 1}`\n\n const ext = 'png'\n const name = tex.name || texid\n let imageNode = `<image id=\"${texid}\" name=\"${name}\">`\n\n if (this.options.version === '1.5.0') {\n imageNode += `<init_from><ref>${this.options.textureDirectory}${name}.${ext}</ref></init_from>`\n } else {\n // version image node 1.4.1\n imageNode += `<init_from>${this.options.textureDirectory}${name}.${ext}</init_from>`\n }\n\n imageNode += '</image>'\n\n this.libraryImages.push(imageNode)\n this.imageMap.set(tex, texid)\n this.textures.push({\n directory: this.options.textureDirectory,\n name,\n ext,\n data: this.imageToData(tex.image, ext),\n original: tex,\n })\n }\n\n return texid\n }\n\n // Process the given material into the material and effect libraries\n // Returns the material id\n private processMaterial(m: MaterialRepresentation): string {\n let matid = this.materialMap.get(m)\n\n if (matid == null) {\n matid = `Mat${this.libraryEffects.length + 1}`\n\n let type = 'phong'\n\n if (m instanceof MeshLambertMaterial) {\n type = 'lambert'\n } else if (m instanceof MeshBasicMaterial) {\n type = 'constant'\n\n if (m.map !== null) {\n // The Collada spec does not support diffuse texture maps with the\n // constant shader type.\n // mrdoob/three.js#15469\n console.warn('ColladaExporter: Texture maps not supported with MeshBasicMaterial.')\n }\n }\n\n if (m instanceof MeshPhongMaterial) {\n const emissive = m.emissive ? m.emissive : new Color(0, 0, 0)\n const diffuse = m.color ? m.color : new Color(0, 0, 0)\n const specular = m.specular ? m.specular : new Color(1, 1, 1)\n const shininess = m.shininess || 0\n const reflectivity = m.reflectivity || 0\n\n // Do not export and alpha map for the reasons mentioned in issue (#13792)\n // in three.js alpha maps are black and white, but collada expects the alpha\n // channel to specify the transparency\n let transparencyNode = ''\n if (m.transparent) {\n transparencyNode += `<transparent>${\n m.map ? '<texture texture=\"diffuse-sampler\"></texture>' : '<float>1</float>'\n }</transparent>`\n\n if (m.opacity < 1) {\n transparencyNode += `<transparency><float>${m.opacity}</float></transparency>`\n }\n }\n\n const techniqueNode = `${`<technique sid=\"common\"><${type}>`}<emission>${\n m.emissiveMap\n ? '<texture texture=\"emissive-sampler\" texcoord=\"TEXCOORD\" />'\n : `<color sid=\"emission\">${emissive.r} ${emissive.g} ${emissive.b} 1</color>`\n }</emission>${\n type !== 'constant'\n ? `<diffuse>${\n m.map\n ? '<texture texture=\"diffuse-sampler\" texcoord=\"TEXCOORD\" />'\n : `<color sid=\"diffuse\">${diffuse.r} ${diffuse.g} ${diffuse.b} 1</color>`\n }</diffuse>`\n : ''\n }${\n type !== 'constant'\n ? `<bump>${m.normalMap ? '<texture texture=\"bump-sampler\" texcoord=\"TEXCOORD\" />' : ''}</bump>`\n : ''\n }${\n type === 'phong'\n ? `${`<specular><color sid=\"specular\">${specular.r} ${specular.g} ${specular.b} 1</color></specular>`}<shininess>${\n m.specularMap\n ? '<texture texture=\"specular-sampler\" texcoord=\"TEXCOORD\" />'\n : `<float sid=\"shininess\">${shininess}</float>`\n }</shininess>`\n : ''\n }${`<reflective><color>${diffuse.r} ${diffuse.g} ${diffuse.b} 1</color></reflective>`}${`<reflectivity><float>${reflectivity}</float></reflectivity>`}${transparencyNode}${`</${type}></technique>`}`\n\n const effectnode = `${`<effect id=\"${matid}-effect\">`}<profile_COMMON>${\n m.map\n ? `<newparam sid=\"diffuse-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.map,\n )}</init_from>`}</surface></newparam><newparam sid=\"diffuse-sampler\"><sampler2D><source>diffuse-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.specularMap\n ? `<newparam sid=\"specular-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.specularMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"specular-sampler\"><sampler2D><source>specular-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.emissiveMap\n ? `<newparam sid=\"emissive-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.emissiveMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"emissive-sampler\"><sampler2D><source>emissive-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.normalMap\n ? `<newparam sid=\"bump-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.normalMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"bump-sampler\"><sampler2D><source>bump-surface</source></sampler2D></newparam>`\n : ''\n }${techniqueNode}${\n m.side === DoubleSide\n ? '<extra><technique profile=\"THREEJS\"><double_sided sid=\"double_sided\" type=\"int\">1</double_sided></technique></extra>'\n : ''\n }</profile_COMMON></effect>`\n\n const materialName = m.name ? ` name=\"${m.name}\"` : ''\n const materialNode = `<material id=\"${matid}\"${materialName}><instance_effect url=\"#${matid}-effect\" /></material>`\n\n this.libraryMaterials.push(materialNode)\n this.libraryEffects.push(effectnode)\n this.materialMap.set(m, matid)\n }\n }\n\n return matid\n }\n\n // Recursively process the object into a scene\n private processObject(o: Object3D): string {\n let node = `<node name=\"${o.name}\">`\n\n node += this.getTransform(o)\n const a: Mesh<BufferGeometry, Material | Material[]> = new Mesh()\n a.geometry\n\n if (o instanceof Mesh && o.isMesh && o.geometry !== null) {\n // function returns the id associated with the mesh and a \"BufferGeometry\" version\n // of the geometry in case it's not a geometry.\n const geomInfo = this.processGeometry(o.geometry)\n const meshid = geomInfo.meshid\n const geometry = geomInfo.bufferGeometry\n\n // ids of the materials to bind to the geometry\n let matids = null\n let matidsArray\n\n // get a list of materials to bind to the sub groups of the geometry.\n // If the amount of subgroups is greater than the materials, than reuse\n // the materials.\n const mat: MaterialRepresentation | MaterialRepresentation[] = o.material || new MeshBasicMaterial()\n const materials = Array.isArray(mat) ? mat : [mat]\n\n if (geometry.groups.length > materials.length) {\n matidsArray = new Array(geometry.groups.length)\n } else {\n matidsArray = new Array(materials.length)\n }\n\n matids = matidsArray.fill(null).map((_, i) => this.processMaterial(materials[i % materials.length]))\n\n node += `${\n `<instance_geometry url=\"#${meshid}\">` +\n (matids != null\n ? `<bind_material><technique_common>${matids\n .map(\n (id, i) =>\n `${`<instance_material symbol=\"MESH_MATERIAL_${i}\" target=\"#${id}\" >`}<bind_vertex_input semantic=\"TEXCOORD\" input_semantic=\"TEXCOORD\" input_set=\"0\" /></instance_material>`,\n )\n .join('')}</technique_common></bind_material>`\n : '')\n }</instance_geometry>`\n }\n\n o.children.forEach((c) => (node += this.processObject(c)))\n\n node += '</node>'\n\n return node\n }\n}\n\nexport { ColladaExporter }\n"],"names":["InterleavedBufferAttribute","Matrix4","MeshLambertMaterial","MeshBasicMaterial","MeshPhongMaterial","Color","DoubleSide","Mesh"],"mappings":";;;;;;;;;AA4CA,MAAM,gBAAgB;AAAA,EAiCpB,cAAc;AAhCN;AASA;AACA;AACA;AACA;AAQA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA,oCAAW,CAAC,QAAQ,QAAQ,QAAQ,MAAM;AAGhD,SAAK,UAAU;AAAA,MACb,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAGR,SAAA,mCAAmB;AACnB,SAAA,kCAAkB;AAClB,SAAA,+BAAe;AACpB,SAAK,WAAW;AAEhB,SAAK,gBAAgB;AACrB,SAAK,oBAAoB;AACzB,SAAK,iBAAiB;AACtB,SAAK,mBAAmB;AAExB,SAAK,SAAS;AACd,SAAK,MAAM;AAEX,SAAK,WAAW;AAAA,EAClB;AAAA,EAEO,MACL,QACA,QACA,UAAkC,CAAA,GACJ;AAC9B,SAAK,UAAU,EAAE,GAAG,KAAK,SAAS,GAAG;AAErC,QAAI,KAAK,QAAQ,OAAO,MAAM,YAAY,MAAM,MAAM;AACpD,cAAQ,MAAM,uEAAuE;AAC9E,aAAA;AAAA,IACT;AAEA,QAAI,KAAK,QAAQ,aAAa,QAAQ,KAAK,QAAQ,cAAc,MAAM;AACrE,cAAQ,MAAM,4EAA4E;AACnF,aAAA;AAAA,IACT;AAEA,QAAI,KAAK,QAAQ,cAAc,QAAQ,KAAK,QAAQ,aAAa,MAAM;AACrE,cAAQ,MAAM,4EAA4E;AACnF,aAAA;AAAA,IACT;AAEI,QAAA,KAAK,QAAQ,qBAAqB,IAAI;AACxC,WAAK,QAAQ,mBAAmB,GAAG,KAAK,QAAQ,oBAAoB,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,GAAG;AAAA,IAC7G;AAEA,QAAI,KAAK,QAAQ,YAAY,WAAW,KAAK,QAAQ,YAAY,SAAS;AACxE,cAAQ,KAAK,6BAA6B,KAAK,QAAQ,yDAAyD;AACzG,aAAA;AAAA,IACT;AAEM,UAAA,sBAAsB,KAAK,cAAc,MAAM;AAErD,UAAM,WACJ,KAAK,QAAQ,YAAY,UACrB,iDACA;AACF,QAAA,MAAM,0DAA0D,mBAAmB,sBAAsB,KAAK,QAAQ,4FACxH,KAAK,QAAQ,WAAW,OAAO,WAAW,KAAK,QAAQ,oBAAoB,mBAC5D,aAAY,oBAAI,QAAO,4BAA4B,cAAa,oBAAI,KAAK,GAAE;AAE5F,WAAO,mBAAmB,KAAK,cAAc,KAAK,EAAE;AAEpD,WAAO,oBAAoB,KAAK,eAAe,KAAK,EAAE;AAEtD,WAAO,sBAAsB,KAAK,iBAAiB,KAAK,EAAE;AAE1D,WAAO,uBAAuB,KAAK,kBAAkB,KAAK,EAAE;AAE5D,WAAO,gEAAgE;AAEhE,WAAA;AAEA,WAAA;AAEP,UAAM,MAAM;AAAA,MACV,MAAM,KAAK,OAAO,GAAG;AAAA,MACrB,UAAU,KAAK;AAAA,IAAA;AAGb,QAAA,OAAO,WAAW,YAAY;AACV,4BAAA,MAAM,OAAO,GAAG,CAAC;AAAA,IACzC;AAEO,WAAA;AAAA,EACT;AAAA;AAAA,EAGQ,OAAO,MAAsB;;AACnC,UAAM,aAAa;AACnB,UAAM,kBAAkB;AACxB,UAAM,WAAW;AAEX,UAAA,MAAM,CAAC,IAAY,QAAyB,MAAM,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI;AAEpF,QAAI,SAAS;AAEb,YACE,gBACG,MAAM,oCAAoC,MAD7C,mBAEI,IAAI,CAAC,QAAQ;AACb,UAAI,CAAC,SAAS,KAAK,GAAG,KAAK,CAAC,gBAAgB,KAAK,GAAG,KAAK,WAAW,KAAK,GAAG,GAAG;AAC7E;AAAA,MACF;AAEA,YAAM,MAAM,GAAG,IAAI,MAAM,MAAM,IAAI;AAEnC,UAAI,CAAC,SAAS,KAAK,GAAG,KAAK,CAAC,gBAAgB,KAAK,GAAG,KAAK,CAAC,WAAW,KAAK,GAAG,GAAG;AAC9E;AAAA,MACF;AAEO,aAAA;AAAA,IACR,GACA,KAAK,UAfR,YAeiB;AAAA,EAErB;AAAA;AAAA,EAGQ,eAAe,KAAyB;AACxC,UAAA,IAAI,KAAK,GAAG;AAClB,UAAM,MAAM,IAAI,WAAW,EAAE,MAAM;AAEnC,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAI,GAAG,KAAK;AAC1C,UAAI,CAAC,IAAI,EAAE,WAAW,CAAC;AAAA,IACzB;AAEO,WAAA;AAAA,EACT;AAAA,EAEQ,YAAY,OAA0B,KAAyB;;AACrE,SAAK,SAAS,KAAK,UAAU,SAAS,cAAc,QAAQ;AAC5D,SAAK,MAAM,KAAK,OAAO,KAAK,OAAO,WAAW,IAAI;AAElD,SAAK,OAAO,QAAQ,MAAM,iBAAiB,oBAAoB,IAAI,MAAM;AACzE,SAAK,OAAO,SAAS,MAAM,kBAAkB,oBAAoB,IAAI,MAAM;AAE3E,eAAK,QAAL,mBAAU,UAAU,OAAO,GAAG;AAGxB,UAAA,aAAa,KAAK,OAAO,UAAU,SAAS,OAAO,CAAC,EAAE,QAAQ,kCAAkC,EAAE;AAGjG,WAAA,KAAK,eAAe,UAAU;AAAA,EACvC;AAAA;AAAA,EAGQ,kBAAkB,MAAkF;AACtG,QAAA,gBAAgBA,MAAAA,8BAA8B,KAAK,8BAA8B;AAE7E,YAAA,wBAAgD,KAAK,MAAM;AAEjE,YAAM,MAAgB,IAAI,sBAAsB,KAAK,QAAQ,KAAK,QAAQ;AAC1E,YAAM,OAAO,KAAK;AAElB,eAAS,IAAI,GAAG,IAAI,KAAK,OAAO,IAAI,GAAG,KAAK;AAC1C,iBAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AACzB,cAAA,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,EAAE,CAAC;AAAA,QAC9C;AAAA,MACF;AAEO,aAAA;AAAA,IAAA,OACF;AACL,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA,EAIQ,SAAS,KAAmC,IAAY,IAAmC;AAC7F,QAAA,MAAM,QAAQ,GAAG,GAAG;AACtB,aAAO,IAAI,MAAM,IAAI,KAAK,EAAE;AAAA,IAAA,OACvB;AACL,YAAM,wBAAgD,IAAI;AAE1D,aAAO,IAAI,sBAAsB,IAAI,QAAQ,KAAK,IAAI,mBAAmB,EAAE;AAAA,IAC7E;AAAA,EACF;AAAA;AAAA,EAGQ,aACN,MACA,MACA,QACA,MACQ;AACF,UAAA,QAAQ,KAAK,kBAAkB,IAAI;AACzC,UAAM,MAAM,MAAM,QAAQ,KAAK,IAC3B,GACE,eAAe,0BAA+B,sBAAsB,MAAM,aAAa,MAAM,KAAK,GAAG,oCACpE,sBAAsB,sBAAsB,KAAK;AAAA,MAClF,MAAM,SAAS,KAAK;AAAA,IAAA,cACR,KAAK,eAAe,OAC/B,IAAI,CAAC,MAAM,gBAAgB,YAAY,UAAU,EACjD,KAAK,EAAE,6CACV;AAEG,WAAA;AAAA,EACT;AAAA;AAAA,EAGQ,aAAa,GAAqB;AAGxC,MAAE,aAAa;AAEf,SAAK,WAAW,KAAK,YAAY,IAAIC,MAAQ,QAAA;AACxC,SAAA,SAAS,KAAK,EAAE,MAAM;AAC3B,SAAK,SAAS;AACd,WAAO,WAAW,KAAK,SAAS,QAAQ,EAAE,KAAK,GAAG;AAAA,EACpD;AAAA;AAAA;AAAA,EAIQ,gBAAgB,GAAiC;AACvD,QAAI,OAAO,KAAK,aAAa,IAAI,CAAC;AAElC,QAAI,CAAC,MAAM;AAET,YAAM,iBAAiB;AAEnB,UAAA,CAAC,eAAe,kBAAkB;AAC9B,cAAA,IAAI,MAAM,sEAAsE;AAAA,MACxF;AAEA,YAAM,SAAS,OAAO,KAAK,kBAAkB,SAAS;AAEhD,YAAA,aAAa,eAAe,QAC9B,eAAe,MAAM,QAAQ,eAAe,MAAM,WAClD,eAAe,WAAW,SAAS;AAEvC,YAAM,SACJ,eAAe,UAAU,QAAQ,eAAe,OAAO,WAAW,IAC9D,eAAe,SACf,CAAC,EAAE,OAAO,GAAG,OAAO,YAAY,eAAe,GAAG;AAExD,YAAM,QAAQ,EAAE,OAAO,UAAU,EAAE,UAAU;AACzC,UAAA,QAAQ,iBAAiB,UAAU;AAGvC,YAAM,UAAU,GAAG;AACnB,YAAM,WAAW,GAAG;AACX,eAAA,KAAK,aAAa,eAAe,WAAW,UAAU,SAAS,CAAC,KAAK,KAAK,GAAG,GAAG,OAAO;AAChG,eAAS,iBAAiB,iDAAiD;AAQ3E,UAAI,iBAAiB,qCAAqC;AACtD,UAAA,YAAY,eAAe,YAAY;AACzC,cAAM,WAAW,GAAG;AACX,iBAAA,KAAK,aAAa,eAAe,WAAW,QAAQ,UAAU,CAAC,KAAK,KAAK,GAAG,GAAG,OAAO;AAC/F,0BAAkB,qCAAqC;AAAA,MACzD;AAGI,UAAA,QAAQ,eAAe,YAAY;AACrC,cAAM,SAAS,GAAG;AACT,iBAAA,KAAK,aAAa,eAAe,WAAW,IAAI,QAAQ,CAAC,KAAK,GAAG,GAAG,OAAO;AACpF,0BAAkB,uCAAuC;AAAA,MAC3D;AAGI,UAAA,SAAS,eAAe,YAAY;AACtC,cAAM,SAAS,GAAG;AACT,iBAAA,KAAK,aAAa,eAAe,WAAW,KAAK,QAAQ,CAAC,KAAK,GAAG,GAAG,OAAO;AACrF,0BAAkB,uCAAuC;AAAA,MAC3D;AAGI,UAAA,WAAW,eAAe,YAAY;AACxC,cAAM,UAAU,GAAG;AACV,iBAAA,KAAK,aAAa,eAAe,WAAW,OAAO,SAAS,CAAC,KAAK,KAAK,GAAG,GAAG,OAAO;AAC7F,0BAAkB,oCAAoC;AAAA,MACxD;AAEA,UAAI,aAAkD;AACtD,UAAI,eAAe,OAAO;AACX,qBAAA,KAAK,kBAAkB,eAAe,KAAK;AAAA,MAAA,OACnD;AACQ,qBAAA,IAAI,MAAM,UAAU;AACxB,iBAAA,IAAI,GAAG,IAAI,WAAW,QAAQ,IAAI,KAAK,MAAM,QAAQ,UAAU,GAAG;AAAK,qBAAW,CAAC,IAAI;AAAA,MAClG;AAEA,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAK;AACvC,cAAA,QAAQ,OAAO,CAAC;AACtB,cAAM,SAAS,KAAK,SAAS,YAAY,MAAM,OAAO,MAAM,KAAK;AAC3D,cAAA,YAAY,OAAO,SAAS;AACzB,iBAAA,sCAAsC,MAAM,yBAAyB;AACrE,iBAAA;AAEA,iBAAA,MAAM,OAAO,KAAK,GAAG;AACrB,iBAAA;AAAA,MACX;AAES,eAAA;AAEJ,WAAA,kBAAkB,KAAK,KAAK;AAE1B,aAAA,EAAE,QAAQ;AACZ,WAAA,aAAa,IAAI,GAAG,IAAI;AAAA,IAC/B;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAIQ,eAAe,KAAsB;AAC3C,QAAI,QAAQ,KAAK,SAAS,IAAI,GAAG;AACjC,QAAI,SAAS,MAAM;AACT,cAAA,SAAS,KAAK,cAAc,SAAS;AAE7C,YAAM,MAAM;AACN,YAAA,OAAO,IAAI,QAAQ;AACrB,UAAA,YAAY,cAAc,gBAAgB;AAE1C,UAAA,KAAK,QAAQ,YAAY,SAAS;AACpC,qBAAa,mBAAmB,KAAK,QAAQ,mBAAmB,QAAQ;AAAA,MAAA,OACnE;AAEL,qBAAa,cAAc,KAAK,QAAQ,mBAAmB,QAAQ;AAAA,MACrE;AAEa,mBAAA;AAER,WAAA,cAAc,KAAK,SAAS;AAC5B,WAAA,SAAS,IAAI,KAAK,KAAK;AAC5B,WAAK,SAAS,KAAK;AAAA,QACjB,WAAW,KAAK,QAAQ;AAAA,QACxB;AAAA,QACA;AAAA,QACA,MAAM,KAAK,YAAY,IAAI,OAAO,GAAG;AAAA,QACrC,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAIQ,gBAAgB,GAAmC;AACzD,QAAI,QAAQ,KAAK,YAAY,IAAI,CAAC;AAElC,QAAI,SAAS,MAAM;AACT,cAAA,MAAM,KAAK,eAAe,SAAS;AAE3C,UAAI,OAAO;AAEX,UAAI,aAAaC,MAAAA,qBAAqB;AAC7B,eAAA;AAAA,MAAA,WACE,aAAaC,yBAAmB;AAClC,eAAA;AAEH,YAAA,EAAE,QAAQ,MAAM;AAIlB,kBAAQ,KAAK,qEAAqE;AAAA,QACpF;AAAA,MACF;AAEA,UAAI,aAAaC,MAAAA,mBAAmB;AAC5B,cAAA,WAAW,EAAE,WAAW,EAAE,WAAW,IAAIC,MAAAA,MAAM,GAAG,GAAG,CAAC;AACtD,cAAA,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAIA,MAAAA,MAAM,GAAG,GAAG,CAAC;AAC/C,cAAA,WAAW,EAAE,WAAW,EAAE,WAAW,IAAIA,MAAAA,MAAM,GAAG,GAAG,CAAC;AACtD,cAAA,YAAY,EAAE,aAAa;AAC3B,cAAA,eAAe,EAAE,gBAAgB;AAKvC,YAAI,mBAAmB;AACvB,YAAI,EAAE,aAAa;AACG,8BAAA,gBAClB,EAAE,MAAM,kDAAkD;AAGxD,cAAA,EAAE,UAAU,GAAG;AACjB,gCAAoB,wBAAwB,EAAE;AAAA,UAChD;AAAA,QACF;AAEA,cAAM,gBAAgB,GAAG,4BAA4B,oBACnD,EAAE,cACE,+DACA,yBAAyB,SAAS,KAAK,SAAS,KAAK,SAAS,2BAElE,SAAS,aACL,YACE,EAAE,MACE,8DACA,wBAAwB,QAAQ,KAAK,QAAQ,KAAK,QAAQ,4BAEhE,KAEJ,SAAS,aACL,SAAS,EAAE,YAAY,2DAA2D,cAClF,KAEJ,SAAS,UACL,GAAG,mCAAmC,SAAS,KAAK,SAAS,KAAK,SAAS,sCACzE,EAAE,cACE,+DACA,0BAA0B,oCAEhC,KACH,sBAAsB,QAAQ,KAAK,QAAQ,KAAK,QAAQ,6BAA6B,wBAAwB,wCAAwC,mBAAmB,KAAK;AAE1K,cAAA,aAAa,GAAG,eAAe,mCACnC,EAAE,MACE,sDAAsD,cAAc,KAAK;AAAA,UACvE,EAAE;AAAA,mJAEJ,KAEJ,EAAE,cACE,uDAAuD,cAAc,KAAK;AAAA,UACxE,EAAE;AAAA,qJAEJ,KAEJ,EAAE,cACE,uDAAuD,cAAc,KAAK;AAAA,UACxE,EAAE;AAAA,qJAEJ,KAEJ,EAAE,YACE,mDAAmD,cAAc,KAAK;AAAA,UACpE,EAAE;AAAA,6IAEJ,KACH,gBACD,EAAE,SAASC,mBACP,yHACA;AAGN,cAAM,eAAe,EAAE,OAAO,UAAU,EAAE,UAAU;AAC9C,cAAA,eAAe,iBAAiB,SAAS,uCAAuC;AAEjF,aAAA,iBAAiB,KAAK,YAAY;AAClC,aAAA,eAAe,KAAK,UAAU;AAC9B,aAAA,YAAY,IAAI,GAAG,KAAK;AAAA,MAC/B;AAAA,IACF;AAEO,WAAA;AAAA,EACT;AAAA;AAAA,EAGQ,cAAc,GAAqB;AACrC,QAAA,OAAO,eAAe,EAAE;AAEpB,YAAA,KAAK,aAAa,CAAC;AACrB,UAAA,IAAiD,IAAIC,MAAAA;AACzD,MAAA;AAEF,QAAI,aAAaA,MAAAA,QAAQ,EAAE,UAAU,EAAE,aAAa,MAAM;AAGxD,YAAM,WAAW,KAAK,gBAAgB,EAAE,QAAQ;AAChD,YAAM,SAAS,SAAS;AACxB,YAAM,WAAW,SAAS;AAG1B,UAAI,SAAS;AACT,UAAA;AAKJ,YAAM,MAAyD,EAAE,YAAY,IAAIJ,MAAkB,kBAAA;AACnG,YAAM,YAAY,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG;AAEjD,UAAI,SAAS,OAAO,SAAS,UAAU,QAAQ;AAC7C,sBAAc,IAAI,MAAM,SAAS,OAAO,MAAM;AAAA,MAAA,OACzC;AACS,sBAAA,IAAI,MAAM,UAAU,MAAM;AAAA,MAC1C;AAEA,eAAS,YAAY,KAAK,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,KAAK,gBAAgB,UAAU,IAAI,UAAU,MAAM,CAAC,CAAC;AAEnG,cAAQ,GACN,4BAA4B,cAC3B,UAAU,OACP,oCAAoC,OACjC;AAAA,QACC,CAAC,IAAI,MACH,GAAG,4CAA4C,eAAe;AAAA,MAAA,EAEjE,KAAK,EAAE,yCACV;AAAA,IAER;AAEE,MAAA,SAAS,QAAQ,CAAC,MAAO,QAAQ,KAAK,cAAc,CAAC,CAAE;AAEjD,YAAA;AAED,WAAA;AAAA,EACT;AACF;;"}
|
1
|
+
{"version":3,"file":"ColladaExporter.cjs","sources":["../../src/exporters/ColladaExporter.ts"],"sourcesContent":["import {\n BufferAttribute,\n BufferGeometry,\n Color,\n DoubleSide,\n InterleavedBufferAttribute,\n Material,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshPhongMaterial,\n Object3D,\n Texture,\n} from 'three'\nimport type { TypedArray, TypedArrayConstructors } from '../types/shared'\nimport { UV1 } from '../_polyfill/uv1'\n\n/**\n * https://github.com/gkjohnson/collada-exporter-js\n *\n * Usage:\n * const exporter = new ColladaExporter();\n *\n * const data = exporter.parse(mesh);\n *\n * Format Definition:\n * https://www.khronos.org/collada/\n */\n\nexport interface ColladaExporterOptions {\n author?: string\n textureDirectory?: string\n version?: string\n}\n\nexport interface ColladaExporterResult {\n data: string\n textures: object[]\n}\n\ntype GeometryInfo = { meshid: string; bufferGeometry: BufferGeometry }\n\ntype MaterialRepresentation = MeshPhongMaterial | MeshBasicMaterial | MeshLambertMaterial\n\nclass ColladaExporter {\n private options: {\n version: string\n author: string | null\n textureDirectory: string\n upAxis: string\n unitName: string | null\n unitMeter: string | null\n }\n\n private geometryInfo: WeakMap<BufferGeometry, GeometryInfo>\n private materialMap: WeakMap<MaterialRepresentation, string>\n private imageMap: WeakMap<Texture, string>\n private textures: {\n directory: string\n name: string\n ext: string\n data: Uint8Array\n original: Texture\n }[]\n\n private libraryImages: string[]\n private libraryGeometries: string[]\n private libraryEffects: string[]\n private libraryMaterials: string[]\n\n private canvas: HTMLCanvasElement | null\n private ctx: CanvasRenderingContext2D | null\n\n private transMat: Matrix4 | null\n\n private getFuncs = ['getX', 'getY', 'getZ', 'getW'] as const\n\n constructor() {\n this.options = {\n version: '1.4.1',\n author: null,\n textureDirectory: '',\n upAxis: 'Y_UP',\n unitName: null,\n unitMeter: null,\n }\n\n this.geometryInfo = new WeakMap()\n this.materialMap = new WeakMap()\n this.imageMap = new WeakMap()\n this.textures = []\n\n this.libraryImages = []\n this.libraryGeometries = []\n this.libraryEffects = []\n this.libraryMaterials = []\n\n this.canvas = null\n this.ctx = null\n\n this.transMat = null\n }\n\n public parse(\n object: Object3D,\n onDone: (res: ColladaExporterResult) => void,\n options: ColladaExporterOptions = {},\n ): ColladaExporterResult | null {\n this.options = { ...this.options, ...options }\n\n if (this.options.upAxis.match(/^[XYZ]_UP$/) === null) {\n console.error('ColladaExporter: Invalid upAxis: valid values are X_UP, Y_UP or Z_UP.')\n return null\n }\n\n if (this.options.unitName !== null && this.options.unitMeter === null) {\n console.error('ColladaExporter: unitMeter needs to be specified if unitName is specified.')\n return null\n }\n\n if (this.options.unitMeter !== null && this.options.unitName === null) {\n console.error('ColladaExporter: unitName needs to be specified if unitMeter is specified.')\n return null\n }\n\n if (this.options.textureDirectory !== '') {\n this.options.textureDirectory = `${this.options.textureDirectory}/`.replace(/\\\\/g, '/').replace(/\\/+/g, '/')\n }\n\n if (this.options.version !== '1.4.1' && this.options.version !== '1.5.0') {\n console.warn(`ColladaExporter : Version ${this.options.version} not supported for export. Only 1.4.1 and 1.5.0.`)\n return null\n }\n\n const libraryVisualScenes = this.processObject(object)\n\n const specLink =\n this.options.version === '1.4.1'\n ? 'http://www.collada.org/2005/11/COLLADASchema'\n : 'https://www.khronos.org/collada/'\n let dae = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>${`<COLLADA xmlns=\"${specLink}\" version=\"${this.options.version}\">`}<asset><contributor><authoring_tool>three.js Collada Exporter</authoring_tool>${\n this.options.author !== null ? `<author>${this.options.author}</author>` : ''\n }</contributor>${`<created>${new Date().toISOString()}</created>`}${`<modified>${new Date().toISOString()}</modified>`}<up_axis>Y_UP</up_axis></asset>`\n\n dae += `<library_images>${this.libraryImages.join('')}</library_images>`\n\n dae += `<library_effects>${this.libraryEffects.join('')}</library_effects>`\n\n dae += `<library_materials>${this.libraryMaterials.join('')}</library_materials>`\n\n dae += `<library_geometries>${this.libraryGeometries.join('')}</library_geometries>`\n\n dae += `<library_visual_scenes><visual_scene id=\"Scene\" name=\"scene\">${libraryVisualScenes}</visual_scene></library_visual_scenes>`\n\n dae += '<scene><instance_visual_scene url=\"#Scene\"/></scene>'\n\n dae += '</COLLADA>'\n\n const res = {\n data: this.format(dae),\n textures: this.textures,\n }\n\n if (typeof onDone === 'function') {\n requestAnimationFrame(() => onDone(res))\n }\n\n return res\n }\n\n // Convert the urdf xml into a well-formatted, indented format\n private format(urdf: string): string {\n const IS_END_TAG = /^<\\//\n const IS_SELF_CLOSING = /(\\?>$)|(\\/>$)/\n const HAS_TEXT = /<[^>]+>[^<]*<\\/[^<]+>/\n\n const pad = (ch: string, num: number): string => (num > 0 ? ch + pad(ch, num - 1) : '')\n\n let tagnum = 0\n\n return (\n urdf\n .match(/(<[^>]+>[^<]+<\\/[^<]+>)|(<[^>]+>)/g)\n ?.map((tag) => {\n if (!HAS_TEXT.test(tag) && !IS_SELF_CLOSING.test(tag) && IS_END_TAG.test(tag)) {\n tagnum--\n }\n\n const res = `${pad(' ', tagnum)}${tag}`\n\n if (!HAS_TEXT.test(tag) && !IS_SELF_CLOSING.test(tag) && !IS_END_TAG.test(tag)) {\n tagnum++\n }\n\n return res\n })\n .join('\\n') ?? ''\n )\n }\n\n // Convert an image into a png format for saving\n private base64ToBuffer(str: string): Uint8Array {\n const b = atob(str)\n const buf = new Uint8Array(b.length)\n\n for (let i = 0, l = buf.length; i < l; i++) {\n buf[i] = b.charCodeAt(i)\n }\n\n return buf\n }\n\n private imageToData(image: CanvasImageSource, ext: string): Uint8Array {\n this.canvas = this.canvas || document.createElement('canvas')\n this.ctx = this.ctx || this.canvas.getContext('2d')\n\n this.canvas.width = image.width instanceof SVGAnimatedLength ? 0 : image.width\n this.canvas.height = image.height instanceof SVGAnimatedLength ? 0 : image.height\n\n this.ctx?.drawImage(image, 0, 0)\n\n // Get the base64 encoded data\n const base64data = this.canvas.toDataURL(`image/${ext}`, 1).replace(/^data:image\\/(png|jpg);base64,/, '')\n\n // Convert to a uint8 array\n return this.base64ToBuffer(base64data)\n }\n\n // gets the attribute array. Generate a new array if the attribute is interleaved\n private attrBufferToArray(attr: InterleavedBufferAttribute | BufferAttribute): number[] | ArrayLike<number> {\n if (attr instanceof InterleavedBufferAttribute && attr.isInterleavedBufferAttribute) {\n // use the typed array constructor to save on memory\n const TypedArrayConstructor: TypedArrayConstructors = attr.array.constructor\n // @ts-ignore\n const arr: number[] = new TypedArrayConstructor(attr.count * attr.itemSize)\n const size = attr.itemSize\n\n for (let i = 0, l = attr.count; i < l; i++) {\n for (let j = 0; j < size; j++) {\n arr[i * size + j] = attr[this.getFuncs[j]](i)\n }\n }\n\n return arr\n } else {\n return attr.array\n }\n }\n\n // Returns an array of the same type starting at the `st` index,\n // and `ct` length\n private subArray(arr: number[] | ArrayLike<number>, st: number, ct: number): TypedArray | number[] {\n if (Array.isArray(arr)) {\n return arr.slice(st, st + ct)\n } else {\n const TypedArrayConstructor: TypedArrayConstructors = arr.constructor\n // @ts-ignore\n return new TypedArrayConstructor(arr.buffer, st * arr.BYTES_PER_ELEMENT, ct)\n }\n }\n\n // Returns the string for a geometry's attribute\n private getAttribute(\n attr: InterleavedBufferAttribute | BufferAttribute,\n name: string,\n params: string[],\n type: string,\n ): string {\n const array = this.attrBufferToArray(attr)\n const res = Array.isArray(array)\n ? `${\n `<source id=\"${name}\">` + `<float_array id=\"${name}-array\" count=\"${array.length}\">` + array.join(' ')\n }</float_array><technique_common>${`<accessor source=\"#${name}-array\" count=\"${Math.floor(\n array.length / attr.itemSize,\n )}\" stride=\"${attr.itemSize}\">`}${params\n .map((n) => `<param name=\"${n}\" type=\"${type}\" />`)\n .join('')}</accessor></technique_common></source>`\n : ''\n\n return res\n }\n\n // Returns the string for a node's transform information\n private getTransform(o: Object3D): string {\n // ensure the object's matrix is up to date\n // before saving the transform\n o.updateMatrix()\n\n this.transMat = this.transMat || new Matrix4()\n this.transMat.copy(o.matrix)\n this.transMat.transpose()\n return `<matrix>${this.transMat.toArray().join(' ')}</matrix>`\n }\n\n // Process the given piece of geometry into the geometry library\n // Returns the mesh id\n private processGeometry(g: BufferGeometry): GeometryInfo {\n let info = this.geometryInfo.get(g)\n\n if (!info) {\n // convert the geometry to bufferGeometry if it isn't already\n const bufferGeometry = g\n\n if (!bufferGeometry.isBufferGeometry) {\n throw new Error('THREE.ColladaExporter: Geometry is not of type THREE.BufferGeometry.')\n }\n\n const meshid = `Mesh${this.libraryGeometries.length + 1}`\n\n const indexCount = bufferGeometry.index\n ? bufferGeometry.index.count * bufferGeometry.index.itemSize\n : bufferGeometry.attributes.position.count\n\n const groups =\n bufferGeometry.groups != null && bufferGeometry.groups.length !== 0\n ? bufferGeometry.groups\n : [{ start: 0, count: indexCount, materialIndex: 0 }]\n\n const gname = g.name ? ` name=\"${g.name}\"` : ''\n let gnode = `<geometry id=\"${meshid}\"${gname}><mesh>`\n\n // define the geometry node and the vertices for the geometry\n const posName = `${meshid}-position`\n const vertName = `${meshid}-vertices`\n gnode += this.getAttribute(bufferGeometry.attributes.position, posName, ['X', 'Y', 'Z'], 'float')\n gnode += `<vertices id=\"${vertName}\"><input semantic=\"POSITION\" source=\"#${posName}\" /></vertices>`\n\n // NOTE: We're not optimizing the attribute arrays here, so they're all the same length and\n // can therefore share the same triangle indices. However, MeshLab seems to have trouble opening\n // models with attributes that share an offset.\n // MeshLab Bug#424: https://sourceforge.net/p/meshlab/bugs/424/\n\n // serialize normals\n let triangleInputs = `<input semantic=\"VERTEX\" source=\"#${vertName}\" offset=\"0\" />`\n if ('normal' in bufferGeometry.attributes) {\n const normName = `${meshid}-normal`\n gnode += this.getAttribute(bufferGeometry.attributes.normal, normName, ['X', 'Y', 'Z'], 'float')\n triangleInputs += `<input semantic=\"NORMAL\" source=\"#${normName}\" offset=\"0\" />`\n }\n\n // serialize uvs\n if ('uv' in bufferGeometry.attributes) {\n const uvName = `${meshid}-texcoord`\n gnode += this.getAttribute(bufferGeometry.attributes.uv, uvName, ['S', 'T'], 'float')\n triangleInputs += `<input semantic=\"TEXCOORD\" source=\"#${uvName}\" offset=\"0\" set=\"0\" />`\n }\n\n // serialize lightmap uvs\n if (UV1 in bufferGeometry.attributes) {\n const uvName = `${meshid}-texcoord2`\n gnode += this.getAttribute(bufferGeometry.attributes[UV1], uvName, ['S', 'T'], 'float')\n triangleInputs += `<input semantic=\"TEXCOORD\" source=\"#${uvName}\" offset=\"0\" set=\"1\" />`\n }\n\n // serialize colors\n if ('color' in bufferGeometry.attributes) {\n const colName = `${meshid}-color`\n gnode += this.getAttribute(bufferGeometry.attributes.color, colName, ['X', 'Y', 'Z'], 'uint8')\n triangleInputs += `<input semantic=\"COLOR\" source=\"#${colName}\" offset=\"0\" />`\n }\n\n let indexArray: number[] | ArrayLike<number> | null = null\n if (bufferGeometry.index) {\n indexArray = this.attrBufferToArray(bufferGeometry.index)\n } else {\n indexArray = new Array(indexCount)\n for (let i = 0, l = indexArray.length; i < l && Array.isArray(indexArray); i++) indexArray[i] = i\n }\n\n for (let i = 0, l = groups.length; i < l; i++) {\n const group = groups[i]\n const subarr = this.subArray(indexArray, group.start, group.count)\n const polycount = subarr.length / 3\n gnode += `<triangles material=\"MESH_MATERIAL_${group.materialIndex}\" count=\"${polycount}\">`\n gnode += triangleInputs\n\n gnode += `<p>${subarr.join(' ')}</p>`\n gnode += '</triangles>'\n }\n\n gnode += '</mesh></geometry>'\n\n this.libraryGeometries.push(gnode)\n\n info = { meshid, bufferGeometry }\n this.geometryInfo.set(g, info)\n }\n\n return info\n }\n\n // Process the given texture into the image library\n // Returns the image library\n private processTexture(tex: Texture): string {\n let texid = this.imageMap.get(tex)\n if (texid == null) {\n texid = `image-${this.libraryImages.length + 1}`\n\n const ext = 'png'\n const name = tex.name || texid\n let imageNode = `<image id=\"${texid}\" name=\"${name}\">`\n\n if (this.options.version === '1.5.0') {\n imageNode += `<init_from><ref>${this.options.textureDirectory}${name}.${ext}</ref></init_from>`\n } else {\n // version image node 1.4.1\n imageNode += `<init_from>${this.options.textureDirectory}${name}.${ext}</init_from>`\n }\n\n imageNode += '</image>'\n\n this.libraryImages.push(imageNode)\n this.imageMap.set(tex, texid)\n this.textures.push({\n directory: this.options.textureDirectory,\n name,\n ext,\n data: this.imageToData(tex.image, ext),\n original: tex,\n })\n }\n\n return texid\n }\n\n // Process the given material into the material and effect libraries\n // Returns the material id\n private processMaterial(m: MaterialRepresentation): string {\n let matid = this.materialMap.get(m)\n\n if (matid == null) {\n matid = `Mat${this.libraryEffects.length + 1}`\n\n let type = 'phong'\n\n if (m instanceof MeshLambertMaterial) {\n type = 'lambert'\n } else if (m instanceof MeshBasicMaterial) {\n type = 'constant'\n\n if (m.map !== null) {\n // The Collada spec does not support diffuse texture maps with the\n // constant shader type.\n // mrdoob/three.js#15469\n console.warn('ColladaExporter: Texture maps not supported with MeshBasicMaterial.')\n }\n }\n\n if (m instanceof MeshPhongMaterial) {\n const emissive = m.emissive ? m.emissive : new Color(0, 0, 0)\n const diffuse = m.color ? m.color : new Color(0, 0, 0)\n const specular = m.specular ? m.specular : new Color(1, 1, 1)\n const shininess = m.shininess || 0\n const reflectivity = m.reflectivity || 0\n\n // Do not export and alpha map for the reasons mentioned in issue (#13792)\n // in three.js alpha maps are black and white, but collada expects the alpha\n // channel to specify the transparency\n let transparencyNode = ''\n if (m.transparent) {\n transparencyNode += `<transparent>${\n m.map ? '<texture texture=\"diffuse-sampler\"></texture>' : '<float>1</float>'\n }</transparent>`\n\n if (m.opacity < 1) {\n transparencyNode += `<transparency><float>${m.opacity}</float></transparency>`\n }\n }\n\n const techniqueNode = `${`<technique sid=\"common\"><${type}>`}<emission>${\n m.emissiveMap\n ? '<texture texture=\"emissive-sampler\" texcoord=\"TEXCOORD\" />'\n : `<color sid=\"emission\">${emissive.r} ${emissive.g} ${emissive.b} 1</color>`\n }</emission>${\n type !== 'constant'\n ? `<diffuse>${\n m.map\n ? '<texture texture=\"diffuse-sampler\" texcoord=\"TEXCOORD\" />'\n : `<color sid=\"diffuse\">${diffuse.r} ${diffuse.g} ${diffuse.b} 1</color>`\n }</diffuse>`\n : ''\n }${\n type !== 'constant'\n ? `<bump>${m.normalMap ? '<texture texture=\"bump-sampler\" texcoord=\"TEXCOORD\" />' : ''}</bump>`\n : ''\n }${\n type === 'phong'\n ? `${`<specular><color sid=\"specular\">${specular.r} ${specular.g} ${specular.b} 1</color></specular>`}<shininess>${\n m.specularMap\n ? '<texture texture=\"specular-sampler\" texcoord=\"TEXCOORD\" />'\n : `<float sid=\"shininess\">${shininess}</float>`\n }</shininess>`\n : ''\n }${`<reflective><color>${diffuse.r} ${diffuse.g} ${diffuse.b} 1</color></reflective>`}${`<reflectivity><float>${reflectivity}</float></reflectivity>`}${transparencyNode}${`</${type}></technique>`}`\n\n const effectnode = `${`<effect id=\"${matid}-effect\">`}<profile_COMMON>${\n m.map\n ? `<newparam sid=\"diffuse-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.map,\n )}</init_from>`}</surface></newparam><newparam sid=\"diffuse-sampler\"><sampler2D><source>diffuse-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.specularMap\n ? `<newparam sid=\"specular-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.specularMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"specular-sampler\"><sampler2D><source>specular-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.emissiveMap\n ? `<newparam sid=\"emissive-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.emissiveMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"emissive-sampler\"><sampler2D><source>emissive-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.normalMap\n ? `<newparam sid=\"bump-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.normalMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"bump-sampler\"><sampler2D><source>bump-surface</source></sampler2D></newparam>`\n : ''\n }${techniqueNode}${\n m.side === DoubleSide\n ? '<extra><technique profile=\"THREEJS\"><double_sided sid=\"double_sided\" type=\"int\">1</double_sided></technique></extra>'\n : ''\n }</profile_COMMON></effect>`\n\n const materialName = m.name ? ` name=\"${m.name}\"` : ''\n const materialNode = `<material id=\"${matid}\"${materialName}><instance_effect url=\"#${matid}-effect\" /></material>`\n\n this.libraryMaterials.push(materialNode)\n this.libraryEffects.push(effectnode)\n this.materialMap.set(m, matid)\n }\n }\n\n return matid\n }\n\n // Recursively process the object into a scene\n private processObject(o: Object3D): string {\n let node = `<node name=\"${o.name}\">`\n\n node += this.getTransform(o)\n const a: Mesh<BufferGeometry, Material | Material[]> = new Mesh()\n a.geometry\n\n if (o instanceof Mesh && o.isMesh && o.geometry !== null) {\n // function returns the id associated with the mesh and a \"BufferGeometry\" version\n // of the geometry in case it's not a geometry.\n const geomInfo = this.processGeometry(o.geometry)\n const meshid = geomInfo.meshid\n const geometry = geomInfo.bufferGeometry\n\n // ids of the materials to bind to the geometry\n let matids = null\n let matidsArray\n\n // get a list of materials to bind to the sub groups of the geometry.\n // If the amount of subgroups is greater than the materials, than reuse\n // the materials.\n const mat: MaterialRepresentation | MaterialRepresentation[] = o.material || new MeshBasicMaterial()\n const materials = Array.isArray(mat) ? mat : [mat]\n\n if (geometry.groups.length > materials.length) {\n matidsArray = new Array(geometry.groups.length)\n } else {\n matidsArray = new Array(materials.length)\n }\n\n matids = matidsArray.fill(null).map((_, i) => this.processMaterial(materials[i % materials.length]))\n\n node += `${\n `<instance_geometry url=\"#${meshid}\">` +\n (matids != null\n ? `<bind_material><technique_common>${matids\n .map(\n (id, i) =>\n `${`<instance_material symbol=\"MESH_MATERIAL_${i}\" target=\"#${id}\" >`}<bind_vertex_input semantic=\"TEXCOORD\" input_semantic=\"TEXCOORD\" input_set=\"0\" /></instance_material>`,\n )\n .join('')}</technique_common></bind_material>`\n : '')\n }</instance_geometry>`\n }\n\n o.children.forEach((c) => (node += this.processObject(c)))\n\n node += '</node>'\n\n return node\n }\n}\n\nexport { ColladaExporter }\n"],"names":["InterleavedBufferAttribute","Matrix4","UV1","MeshLambertMaterial","MeshBasicMaterial","MeshPhongMaterial","Color","DoubleSide","Mesh"],"mappings":"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"}
|
@@ -5,6 +5,7 @@ var __publicField = (obj, key, value) => {
|
|
5
5
|
return value;
|
6
6
|
};
|
7
7
|
import { InterleavedBufferAttribute, Matrix4, MeshLambertMaterial, MeshBasicMaterial, MeshPhongMaterial, Color, DoubleSide, Mesh } from "three";
|
8
|
+
import { UV1 } from "../_polyfill/uv1.js";
|
8
9
|
class ColladaExporter {
|
9
10
|
constructor() {
|
10
11
|
__publicField(this, "options");
|
@@ -189,9 +190,9 @@ class ColladaExporter {
|
|
189
190
|
gnode += this.getAttribute(bufferGeometry.attributes.uv, uvName, ["S", "T"], "float");
|
190
191
|
triangleInputs += `<input semantic="TEXCOORD" source="#${uvName}" offset="0" set="0" />`;
|
191
192
|
}
|
192
|
-
if (
|
193
|
+
if (UV1 in bufferGeometry.attributes) {
|
193
194
|
const uvName = `${meshid}-texcoord2`;
|
194
|
-
gnode += this.getAttribute(bufferGeometry.attributes
|
195
|
+
gnode += this.getAttribute(bufferGeometry.attributes[UV1], uvName, ["S", "T"], "float");
|
195
196
|
triangleInputs += `<input semantic="TEXCOORD" source="#${uvName}" offset="0" set="1" />`;
|
196
197
|
}
|
197
198
|
if ("color" in bufferGeometry.attributes) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ColladaExporter.js","sources":["../../src/exporters/ColladaExporter.ts"],"sourcesContent":["import {\n BufferAttribute,\n BufferGeometry,\n Color,\n DoubleSide,\n InterleavedBufferAttribute,\n Material,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshPhongMaterial,\n Object3D,\n Texture,\n} from 'three'\nimport type { TypedArray, TypedArrayConstructors } from '../types/shared'\n\n/**\n * https://github.com/gkjohnson/collada-exporter-js\n *\n * Usage:\n * const exporter = new ColladaExporter();\n *\n * const data = exporter.parse(mesh);\n *\n * Format Definition:\n * https://www.khronos.org/collada/\n */\n\nexport interface ColladaExporterOptions {\n author?: string\n textureDirectory?: string\n version?: string\n}\n\nexport interface ColladaExporterResult {\n data: string\n textures: object[]\n}\n\ntype GeometryInfo = { meshid: string; bufferGeometry: BufferGeometry }\n\ntype MaterialRepresentation = MeshPhongMaterial | MeshBasicMaterial | MeshLambertMaterial\n\nclass ColladaExporter {\n private options: {\n version: string\n author: string | null\n textureDirectory: string\n upAxis: string\n unitName: string | null\n unitMeter: string | null\n }\n\n private geometryInfo: WeakMap<BufferGeometry, GeometryInfo>\n private materialMap: WeakMap<MaterialRepresentation, string>\n private imageMap: WeakMap<Texture, string>\n private textures: {\n directory: string\n name: string\n ext: string\n data: Uint8Array\n original: Texture\n }[]\n\n private libraryImages: string[]\n private libraryGeometries: string[]\n private libraryEffects: string[]\n private libraryMaterials: string[]\n\n private canvas: HTMLCanvasElement | null\n private ctx: CanvasRenderingContext2D | null\n\n private transMat: Matrix4 | null\n\n private getFuncs = ['getX', 'getY', 'getZ', 'getW'] as const\n\n constructor() {\n this.options = {\n version: '1.4.1',\n author: null,\n textureDirectory: '',\n upAxis: 'Y_UP',\n unitName: null,\n unitMeter: null,\n }\n\n this.geometryInfo = new WeakMap()\n this.materialMap = new WeakMap()\n this.imageMap = new WeakMap()\n this.textures = []\n\n this.libraryImages = []\n this.libraryGeometries = []\n this.libraryEffects = []\n this.libraryMaterials = []\n\n this.canvas = null\n this.ctx = null\n\n this.transMat = null\n }\n\n public parse(\n object: Object3D,\n onDone: (res: ColladaExporterResult) => void,\n options: ColladaExporterOptions = {},\n ): ColladaExporterResult | null {\n this.options = { ...this.options, ...options }\n\n if (this.options.upAxis.match(/^[XYZ]_UP$/) === null) {\n console.error('ColladaExporter: Invalid upAxis: valid values are X_UP, Y_UP or Z_UP.')\n return null\n }\n\n if (this.options.unitName !== null && this.options.unitMeter === null) {\n console.error('ColladaExporter: unitMeter needs to be specified if unitName is specified.')\n return null\n }\n\n if (this.options.unitMeter !== null && this.options.unitName === null) {\n console.error('ColladaExporter: unitName needs to be specified if unitMeter is specified.')\n return null\n }\n\n if (this.options.textureDirectory !== '') {\n this.options.textureDirectory = `${this.options.textureDirectory}/`.replace(/\\\\/g, '/').replace(/\\/+/g, '/')\n }\n\n if (this.options.version !== '1.4.1' && this.options.version !== '1.5.0') {\n console.warn(`ColladaExporter : Version ${this.options.version} not supported for export. Only 1.4.1 and 1.5.0.`)\n return null\n }\n\n const libraryVisualScenes = this.processObject(object)\n\n const specLink =\n this.options.version === '1.4.1'\n ? 'http://www.collada.org/2005/11/COLLADASchema'\n : 'https://www.khronos.org/collada/'\n let dae = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>${`<COLLADA xmlns=\"${specLink}\" version=\"${this.options.version}\">`}<asset><contributor><authoring_tool>three.js Collada Exporter</authoring_tool>${\n this.options.author !== null ? `<author>${this.options.author}</author>` : ''\n }</contributor>${`<created>${new Date().toISOString()}</created>`}${`<modified>${new Date().toISOString()}</modified>`}<up_axis>Y_UP</up_axis></asset>`\n\n dae += `<library_images>${this.libraryImages.join('')}</library_images>`\n\n dae += `<library_effects>${this.libraryEffects.join('')}</library_effects>`\n\n dae += `<library_materials>${this.libraryMaterials.join('')}</library_materials>`\n\n dae += `<library_geometries>${this.libraryGeometries.join('')}</library_geometries>`\n\n dae += `<library_visual_scenes><visual_scene id=\"Scene\" name=\"scene\">${libraryVisualScenes}</visual_scene></library_visual_scenes>`\n\n dae += '<scene><instance_visual_scene url=\"#Scene\"/></scene>'\n\n dae += '</COLLADA>'\n\n const res = {\n data: this.format(dae),\n textures: this.textures,\n }\n\n if (typeof onDone === 'function') {\n requestAnimationFrame(() => onDone(res))\n }\n\n return res\n }\n\n // Convert the urdf xml into a well-formatted, indented format\n private format(urdf: string): string {\n const IS_END_TAG = /^<\\//\n const IS_SELF_CLOSING = /(\\?>$)|(\\/>$)/\n const HAS_TEXT = /<[^>]+>[^<]*<\\/[^<]+>/\n\n const pad = (ch: string, num: number): string => (num > 0 ? ch + pad(ch, num - 1) : '')\n\n let tagnum = 0\n\n return (\n urdf\n .match(/(<[^>]+>[^<]+<\\/[^<]+>)|(<[^>]+>)/g)\n ?.map((tag) => {\n if (!HAS_TEXT.test(tag) && !IS_SELF_CLOSING.test(tag) && IS_END_TAG.test(tag)) {\n tagnum--\n }\n\n const res = `${pad(' ', tagnum)}${tag}`\n\n if (!HAS_TEXT.test(tag) && !IS_SELF_CLOSING.test(tag) && !IS_END_TAG.test(tag)) {\n tagnum++\n }\n\n return res\n })\n .join('\\n') ?? ''\n )\n }\n\n // Convert an image into a png format for saving\n private base64ToBuffer(str: string): Uint8Array {\n const b = atob(str)\n const buf = new Uint8Array(b.length)\n\n for (let i = 0, l = buf.length; i < l; i++) {\n buf[i] = b.charCodeAt(i)\n }\n\n return buf\n }\n\n private imageToData(image: CanvasImageSource, ext: string): Uint8Array {\n this.canvas = this.canvas || document.createElement('canvas')\n this.ctx = this.ctx || this.canvas.getContext('2d')\n\n this.canvas.width = image.width instanceof SVGAnimatedLength ? 0 : image.width\n this.canvas.height = image.height instanceof SVGAnimatedLength ? 0 : image.height\n\n this.ctx?.drawImage(image, 0, 0)\n\n // Get the base64 encoded data\n const base64data = this.canvas.toDataURL(`image/${ext}`, 1).replace(/^data:image\\/(png|jpg);base64,/, '')\n\n // Convert to a uint8 array\n return this.base64ToBuffer(base64data)\n }\n\n // gets the attribute array. Generate a new array if the attribute is interleaved\n private attrBufferToArray(attr: InterleavedBufferAttribute | BufferAttribute): number[] | ArrayLike<number> {\n if (attr instanceof InterleavedBufferAttribute && attr.isInterleavedBufferAttribute) {\n // use the typed array constructor to save on memory\n const TypedArrayConstructor: TypedArrayConstructors = attr.array.constructor\n // @ts-ignore\n const arr: number[] = new TypedArrayConstructor(attr.count * attr.itemSize)\n const size = attr.itemSize\n\n for (let i = 0, l = attr.count; i < l; i++) {\n for (let j = 0; j < size; j++) {\n arr[i * size + j] = attr[this.getFuncs[j]](i)\n }\n }\n\n return arr\n } else {\n return attr.array\n }\n }\n\n // Returns an array of the same type starting at the `st` index,\n // and `ct` length\n private subArray(arr: number[] | ArrayLike<number>, st: number, ct: number): TypedArray | number[] {\n if (Array.isArray(arr)) {\n return arr.slice(st, st + ct)\n } else {\n const TypedArrayConstructor: TypedArrayConstructors = arr.constructor\n // @ts-ignore\n return new TypedArrayConstructor(arr.buffer, st * arr.BYTES_PER_ELEMENT, ct)\n }\n }\n\n // Returns the string for a geometry's attribute\n private getAttribute(\n attr: InterleavedBufferAttribute | BufferAttribute,\n name: string,\n params: string[],\n type: string,\n ): string {\n const array = this.attrBufferToArray(attr)\n const res = Array.isArray(array)\n ? `${\n `<source id=\"${name}\">` + `<float_array id=\"${name}-array\" count=\"${array.length}\">` + array.join(' ')\n }</float_array><technique_common>${`<accessor source=\"#${name}-array\" count=\"${Math.floor(\n array.length / attr.itemSize,\n )}\" stride=\"${attr.itemSize}\">`}${params\n .map((n) => `<param name=\"${n}\" type=\"${type}\" />`)\n .join('')}</accessor></technique_common></source>`\n : ''\n\n return res\n }\n\n // Returns the string for a node's transform information\n private getTransform(o: Object3D): string {\n // ensure the object's matrix is up to date\n // before saving the transform\n o.updateMatrix()\n\n this.transMat = this.transMat || new Matrix4()\n this.transMat.copy(o.matrix)\n this.transMat.transpose()\n return `<matrix>${this.transMat.toArray().join(' ')}</matrix>`\n }\n\n // Process the given piece of geometry into the geometry library\n // Returns the mesh id\n private processGeometry(g: BufferGeometry): GeometryInfo {\n let info = this.geometryInfo.get(g)\n\n if (!info) {\n // convert the geometry to bufferGeometry if it isn't already\n const bufferGeometry = g\n\n if (!bufferGeometry.isBufferGeometry) {\n throw new Error('THREE.ColladaExporter: Geometry is not of type THREE.BufferGeometry.')\n }\n\n const meshid = `Mesh${this.libraryGeometries.length + 1}`\n\n const indexCount = bufferGeometry.index\n ? bufferGeometry.index.count * bufferGeometry.index.itemSize\n : bufferGeometry.attributes.position.count\n\n const groups =\n bufferGeometry.groups != null && bufferGeometry.groups.length !== 0\n ? bufferGeometry.groups\n : [{ start: 0, count: indexCount, materialIndex: 0 }]\n\n const gname = g.name ? ` name=\"${g.name}\"` : ''\n let gnode = `<geometry id=\"${meshid}\"${gname}><mesh>`\n\n // define the geometry node and the vertices for the geometry\n const posName = `${meshid}-position`\n const vertName = `${meshid}-vertices`\n gnode += this.getAttribute(bufferGeometry.attributes.position, posName, ['X', 'Y', 'Z'], 'float')\n gnode += `<vertices id=\"${vertName}\"><input semantic=\"POSITION\" source=\"#${posName}\" /></vertices>`\n\n // NOTE: We're not optimizing the attribute arrays here, so they're all the same length and\n // can therefore share the same triangle indices. However, MeshLab seems to have trouble opening\n // models with attributes that share an offset.\n // MeshLab Bug#424: https://sourceforge.net/p/meshlab/bugs/424/\n\n // serialize normals\n let triangleInputs = `<input semantic=\"VERTEX\" source=\"#${vertName}\" offset=\"0\" />`\n if ('normal' in bufferGeometry.attributes) {\n const normName = `${meshid}-normal`\n gnode += this.getAttribute(bufferGeometry.attributes.normal, normName, ['X', 'Y', 'Z'], 'float')\n triangleInputs += `<input semantic=\"NORMAL\" source=\"#${normName}\" offset=\"0\" />`\n }\n\n // serialize uvs\n if ('uv' in bufferGeometry.attributes) {\n const uvName = `${meshid}-texcoord`\n gnode += this.getAttribute(bufferGeometry.attributes.uv, uvName, ['S', 'T'], 'float')\n triangleInputs += `<input semantic=\"TEXCOORD\" source=\"#${uvName}\" offset=\"0\" set=\"0\" />`\n }\n\n // serialize lightmap uvs\n if ('uv2' in bufferGeometry.attributes) {\n const uvName = `${meshid}-texcoord2`\n gnode += this.getAttribute(bufferGeometry.attributes.uv2, uvName, ['S', 'T'], 'float')\n triangleInputs += `<input semantic=\"TEXCOORD\" source=\"#${uvName}\" offset=\"0\" set=\"1\" />`\n }\n\n // serialize colors\n if ('color' in bufferGeometry.attributes) {\n const colName = `${meshid}-color`\n gnode += this.getAttribute(bufferGeometry.attributes.color, colName, ['X', 'Y', 'Z'], 'uint8')\n triangleInputs += `<input semantic=\"COLOR\" source=\"#${colName}\" offset=\"0\" />`\n }\n\n let indexArray: number[] | ArrayLike<number> | null = null\n if (bufferGeometry.index) {\n indexArray = this.attrBufferToArray(bufferGeometry.index)\n } else {\n indexArray = new Array(indexCount)\n for (let i = 0, l = indexArray.length; i < l && Array.isArray(indexArray); i++) indexArray[i] = i\n }\n\n for (let i = 0, l = groups.length; i < l; i++) {\n const group = groups[i]\n const subarr = this.subArray(indexArray, group.start, group.count)\n const polycount = subarr.length / 3\n gnode += `<triangles material=\"MESH_MATERIAL_${group.materialIndex}\" count=\"${polycount}\">`\n gnode += triangleInputs\n\n gnode += `<p>${subarr.join(' ')}</p>`\n gnode += '</triangles>'\n }\n\n gnode += '</mesh></geometry>'\n\n this.libraryGeometries.push(gnode)\n\n info = { meshid, bufferGeometry }\n this.geometryInfo.set(g, info)\n }\n\n return info\n }\n\n // Process the given texture into the image library\n // Returns the image library\n private processTexture(tex: Texture): string {\n let texid = this.imageMap.get(tex)\n if (texid == null) {\n texid = `image-${this.libraryImages.length + 1}`\n\n const ext = 'png'\n const name = tex.name || texid\n let imageNode = `<image id=\"${texid}\" name=\"${name}\">`\n\n if (this.options.version === '1.5.0') {\n imageNode += `<init_from><ref>${this.options.textureDirectory}${name}.${ext}</ref></init_from>`\n } else {\n // version image node 1.4.1\n imageNode += `<init_from>${this.options.textureDirectory}${name}.${ext}</init_from>`\n }\n\n imageNode += '</image>'\n\n this.libraryImages.push(imageNode)\n this.imageMap.set(tex, texid)\n this.textures.push({\n directory: this.options.textureDirectory,\n name,\n ext,\n data: this.imageToData(tex.image, ext),\n original: tex,\n })\n }\n\n return texid\n }\n\n // Process the given material into the material and effect libraries\n // Returns the material id\n private processMaterial(m: MaterialRepresentation): string {\n let matid = this.materialMap.get(m)\n\n if (matid == null) {\n matid = `Mat${this.libraryEffects.length + 1}`\n\n let type = 'phong'\n\n if (m instanceof MeshLambertMaterial) {\n type = 'lambert'\n } else if (m instanceof MeshBasicMaterial) {\n type = 'constant'\n\n if (m.map !== null) {\n // The Collada spec does not support diffuse texture maps with the\n // constant shader type.\n // mrdoob/three.js#15469\n console.warn('ColladaExporter: Texture maps not supported with MeshBasicMaterial.')\n }\n }\n\n if (m instanceof MeshPhongMaterial) {\n const emissive = m.emissive ? m.emissive : new Color(0, 0, 0)\n const diffuse = m.color ? m.color : new Color(0, 0, 0)\n const specular = m.specular ? m.specular : new Color(1, 1, 1)\n const shininess = m.shininess || 0\n const reflectivity = m.reflectivity || 0\n\n // Do not export and alpha map for the reasons mentioned in issue (#13792)\n // in three.js alpha maps are black and white, but collada expects the alpha\n // channel to specify the transparency\n let transparencyNode = ''\n if (m.transparent) {\n transparencyNode += `<transparent>${\n m.map ? '<texture texture=\"diffuse-sampler\"></texture>' : '<float>1</float>'\n }</transparent>`\n\n if (m.opacity < 1) {\n transparencyNode += `<transparency><float>${m.opacity}</float></transparency>`\n }\n }\n\n const techniqueNode = `${`<technique sid=\"common\"><${type}>`}<emission>${\n m.emissiveMap\n ? '<texture texture=\"emissive-sampler\" texcoord=\"TEXCOORD\" />'\n : `<color sid=\"emission\">${emissive.r} ${emissive.g} ${emissive.b} 1</color>`\n }</emission>${\n type !== 'constant'\n ? `<diffuse>${\n m.map\n ? '<texture texture=\"diffuse-sampler\" texcoord=\"TEXCOORD\" />'\n : `<color sid=\"diffuse\">${diffuse.r} ${diffuse.g} ${diffuse.b} 1</color>`\n }</diffuse>`\n : ''\n }${\n type !== 'constant'\n ? `<bump>${m.normalMap ? '<texture texture=\"bump-sampler\" texcoord=\"TEXCOORD\" />' : ''}</bump>`\n : ''\n }${\n type === 'phong'\n ? `${`<specular><color sid=\"specular\">${specular.r} ${specular.g} ${specular.b} 1</color></specular>`}<shininess>${\n m.specularMap\n ? '<texture texture=\"specular-sampler\" texcoord=\"TEXCOORD\" />'\n : `<float sid=\"shininess\">${shininess}</float>`\n }</shininess>`\n : ''\n }${`<reflective><color>${diffuse.r} ${diffuse.g} ${diffuse.b} 1</color></reflective>`}${`<reflectivity><float>${reflectivity}</float></reflectivity>`}${transparencyNode}${`</${type}></technique>`}`\n\n const effectnode = `${`<effect id=\"${matid}-effect\">`}<profile_COMMON>${\n m.map\n ? `<newparam sid=\"diffuse-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.map,\n )}</init_from>`}</surface></newparam><newparam sid=\"diffuse-sampler\"><sampler2D><source>diffuse-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.specularMap\n ? `<newparam sid=\"specular-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.specularMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"specular-sampler\"><sampler2D><source>specular-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.emissiveMap\n ? `<newparam sid=\"emissive-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.emissiveMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"emissive-sampler\"><sampler2D><source>emissive-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.normalMap\n ? `<newparam sid=\"bump-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.normalMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"bump-sampler\"><sampler2D><source>bump-surface</source></sampler2D></newparam>`\n : ''\n }${techniqueNode}${\n m.side === DoubleSide\n ? '<extra><technique profile=\"THREEJS\"><double_sided sid=\"double_sided\" type=\"int\">1</double_sided></technique></extra>'\n : ''\n }</profile_COMMON></effect>`\n\n const materialName = m.name ? ` name=\"${m.name}\"` : ''\n const materialNode = `<material id=\"${matid}\"${materialName}><instance_effect url=\"#${matid}-effect\" /></material>`\n\n this.libraryMaterials.push(materialNode)\n this.libraryEffects.push(effectnode)\n this.materialMap.set(m, matid)\n }\n }\n\n return matid\n }\n\n // Recursively process the object into a scene\n private processObject(o: Object3D): string {\n let node = `<node name=\"${o.name}\">`\n\n node += this.getTransform(o)\n const a: Mesh<BufferGeometry, Material | Material[]> = new Mesh()\n a.geometry\n\n if (o instanceof Mesh && o.isMesh && o.geometry !== null) {\n // function returns the id associated with the mesh and a \"BufferGeometry\" version\n // of the geometry in case it's not a geometry.\n const geomInfo = this.processGeometry(o.geometry)\n const meshid = geomInfo.meshid\n const geometry = geomInfo.bufferGeometry\n\n // ids of the materials to bind to the geometry\n let matids = null\n let matidsArray\n\n // get a list of materials to bind to the sub groups of the geometry.\n // If the amount of subgroups is greater than the materials, than reuse\n // the materials.\n const mat: MaterialRepresentation | MaterialRepresentation[] = o.material || new MeshBasicMaterial()\n const materials = Array.isArray(mat) ? mat : [mat]\n\n if (geometry.groups.length > materials.length) {\n matidsArray = new Array(geometry.groups.length)\n } else {\n matidsArray = new Array(materials.length)\n }\n\n matids = matidsArray.fill(null).map((_, i) => this.processMaterial(materials[i % materials.length]))\n\n node += `${\n `<instance_geometry url=\"#${meshid}\">` +\n (matids != null\n ? `<bind_material><technique_common>${matids\n .map(\n (id, i) =>\n `${`<instance_material symbol=\"MESH_MATERIAL_${i}\" target=\"#${id}\" >`}<bind_vertex_input semantic=\"TEXCOORD\" input_semantic=\"TEXCOORD\" input_set=\"0\" /></instance_material>`,\n )\n .join('')}</technique_common></bind_material>`\n : '')\n }</instance_geometry>`\n }\n\n o.children.forEach((c) => (node += this.processObject(c)))\n\n node += '</node>'\n\n return node\n }\n}\n\nexport { ColladaExporter }\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"ColladaExporter.js","sources":["../../src/exporters/ColladaExporter.ts"],"sourcesContent":["import {\n BufferAttribute,\n BufferGeometry,\n Color,\n DoubleSide,\n InterleavedBufferAttribute,\n Material,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshPhongMaterial,\n Object3D,\n Texture,\n} from 'three'\nimport type { TypedArray, TypedArrayConstructors } from '../types/shared'\nimport { UV1 } from '../_polyfill/uv1'\n\n/**\n * https://github.com/gkjohnson/collada-exporter-js\n *\n * Usage:\n * const exporter = new ColladaExporter();\n *\n * const data = exporter.parse(mesh);\n *\n * Format Definition:\n * https://www.khronos.org/collada/\n */\n\nexport interface ColladaExporterOptions {\n author?: string\n textureDirectory?: string\n version?: string\n}\n\nexport interface ColladaExporterResult {\n data: string\n textures: object[]\n}\n\ntype GeometryInfo = { meshid: string; bufferGeometry: BufferGeometry }\n\ntype MaterialRepresentation = MeshPhongMaterial | MeshBasicMaterial | MeshLambertMaterial\n\nclass ColladaExporter {\n private options: {\n version: string\n author: string | null\n textureDirectory: string\n upAxis: string\n unitName: string | null\n unitMeter: string | null\n }\n\n private geometryInfo: WeakMap<BufferGeometry, GeometryInfo>\n private materialMap: WeakMap<MaterialRepresentation, string>\n private imageMap: WeakMap<Texture, string>\n private textures: {\n directory: string\n name: string\n ext: string\n data: Uint8Array\n original: Texture\n }[]\n\n private libraryImages: string[]\n private libraryGeometries: string[]\n private libraryEffects: string[]\n private libraryMaterials: string[]\n\n private canvas: HTMLCanvasElement | null\n private ctx: CanvasRenderingContext2D | null\n\n private transMat: Matrix4 | null\n\n private getFuncs = ['getX', 'getY', 'getZ', 'getW'] as const\n\n constructor() {\n this.options = {\n version: '1.4.1',\n author: null,\n textureDirectory: '',\n upAxis: 'Y_UP',\n unitName: null,\n unitMeter: null,\n }\n\n this.geometryInfo = new WeakMap()\n this.materialMap = new WeakMap()\n this.imageMap = new WeakMap()\n this.textures = []\n\n this.libraryImages = []\n this.libraryGeometries = []\n this.libraryEffects = []\n this.libraryMaterials = []\n\n this.canvas = null\n this.ctx = null\n\n this.transMat = null\n }\n\n public parse(\n object: Object3D,\n onDone: (res: ColladaExporterResult) => void,\n options: ColladaExporterOptions = {},\n ): ColladaExporterResult | null {\n this.options = { ...this.options, ...options }\n\n if (this.options.upAxis.match(/^[XYZ]_UP$/) === null) {\n console.error('ColladaExporter: Invalid upAxis: valid values are X_UP, Y_UP or Z_UP.')\n return null\n }\n\n if (this.options.unitName !== null && this.options.unitMeter === null) {\n console.error('ColladaExporter: unitMeter needs to be specified if unitName is specified.')\n return null\n }\n\n if (this.options.unitMeter !== null && this.options.unitName === null) {\n console.error('ColladaExporter: unitName needs to be specified if unitMeter is specified.')\n return null\n }\n\n if (this.options.textureDirectory !== '') {\n this.options.textureDirectory = `${this.options.textureDirectory}/`.replace(/\\\\/g, '/').replace(/\\/+/g, '/')\n }\n\n if (this.options.version !== '1.4.1' && this.options.version !== '1.5.0') {\n console.warn(`ColladaExporter : Version ${this.options.version} not supported for export. Only 1.4.1 and 1.5.0.`)\n return null\n }\n\n const libraryVisualScenes = this.processObject(object)\n\n const specLink =\n this.options.version === '1.4.1'\n ? 'http://www.collada.org/2005/11/COLLADASchema'\n : 'https://www.khronos.org/collada/'\n let dae = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>${`<COLLADA xmlns=\"${specLink}\" version=\"${this.options.version}\">`}<asset><contributor><authoring_tool>three.js Collada Exporter</authoring_tool>${\n this.options.author !== null ? `<author>${this.options.author}</author>` : ''\n }</contributor>${`<created>${new Date().toISOString()}</created>`}${`<modified>${new Date().toISOString()}</modified>`}<up_axis>Y_UP</up_axis></asset>`\n\n dae += `<library_images>${this.libraryImages.join('')}</library_images>`\n\n dae += `<library_effects>${this.libraryEffects.join('')}</library_effects>`\n\n dae += `<library_materials>${this.libraryMaterials.join('')}</library_materials>`\n\n dae += `<library_geometries>${this.libraryGeometries.join('')}</library_geometries>`\n\n dae += `<library_visual_scenes><visual_scene id=\"Scene\" name=\"scene\">${libraryVisualScenes}</visual_scene></library_visual_scenes>`\n\n dae += '<scene><instance_visual_scene url=\"#Scene\"/></scene>'\n\n dae += '</COLLADA>'\n\n const res = {\n data: this.format(dae),\n textures: this.textures,\n }\n\n if (typeof onDone === 'function') {\n requestAnimationFrame(() => onDone(res))\n }\n\n return res\n }\n\n // Convert the urdf xml into a well-formatted, indented format\n private format(urdf: string): string {\n const IS_END_TAG = /^<\\//\n const IS_SELF_CLOSING = /(\\?>$)|(\\/>$)/\n const HAS_TEXT = /<[^>]+>[^<]*<\\/[^<]+>/\n\n const pad = (ch: string, num: number): string => (num > 0 ? ch + pad(ch, num - 1) : '')\n\n let tagnum = 0\n\n return (\n urdf\n .match(/(<[^>]+>[^<]+<\\/[^<]+>)|(<[^>]+>)/g)\n ?.map((tag) => {\n if (!HAS_TEXT.test(tag) && !IS_SELF_CLOSING.test(tag) && IS_END_TAG.test(tag)) {\n tagnum--\n }\n\n const res = `${pad(' ', tagnum)}${tag}`\n\n if (!HAS_TEXT.test(tag) && !IS_SELF_CLOSING.test(tag) && !IS_END_TAG.test(tag)) {\n tagnum++\n }\n\n return res\n })\n .join('\\n') ?? ''\n )\n }\n\n // Convert an image into a png format for saving\n private base64ToBuffer(str: string): Uint8Array {\n const b = atob(str)\n const buf = new Uint8Array(b.length)\n\n for (let i = 0, l = buf.length; i < l; i++) {\n buf[i] = b.charCodeAt(i)\n }\n\n return buf\n }\n\n private imageToData(image: CanvasImageSource, ext: string): Uint8Array {\n this.canvas = this.canvas || document.createElement('canvas')\n this.ctx = this.ctx || this.canvas.getContext('2d')\n\n this.canvas.width = image.width instanceof SVGAnimatedLength ? 0 : image.width\n this.canvas.height = image.height instanceof SVGAnimatedLength ? 0 : image.height\n\n this.ctx?.drawImage(image, 0, 0)\n\n // Get the base64 encoded data\n const base64data = this.canvas.toDataURL(`image/${ext}`, 1).replace(/^data:image\\/(png|jpg);base64,/, '')\n\n // Convert to a uint8 array\n return this.base64ToBuffer(base64data)\n }\n\n // gets the attribute array. Generate a new array if the attribute is interleaved\n private attrBufferToArray(attr: InterleavedBufferAttribute | BufferAttribute): number[] | ArrayLike<number> {\n if (attr instanceof InterleavedBufferAttribute && attr.isInterleavedBufferAttribute) {\n // use the typed array constructor to save on memory\n const TypedArrayConstructor: TypedArrayConstructors = attr.array.constructor\n // @ts-ignore\n const arr: number[] = new TypedArrayConstructor(attr.count * attr.itemSize)\n const size = attr.itemSize\n\n for (let i = 0, l = attr.count; i < l; i++) {\n for (let j = 0; j < size; j++) {\n arr[i * size + j] = attr[this.getFuncs[j]](i)\n }\n }\n\n return arr\n } else {\n return attr.array\n }\n }\n\n // Returns an array of the same type starting at the `st` index,\n // and `ct` length\n private subArray(arr: number[] | ArrayLike<number>, st: number, ct: number): TypedArray | number[] {\n if (Array.isArray(arr)) {\n return arr.slice(st, st + ct)\n } else {\n const TypedArrayConstructor: TypedArrayConstructors = arr.constructor\n // @ts-ignore\n return new TypedArrayConstructor(arr.buffer, st * arr.BYTES_PER_ELEMENT, ct)\n }\n }\n\n // Returns the string for a geometry's attribute\n private getAttribute(\n attr: InterleavedBufferAttribute | BufferAttribute,\n name: string,\n params: string[],\n type: string,\n ): string {\n const array = this.attrBufferToArray(attr)\n const res = Array.isArray(array)\n ? `${\n `<source id=\"${name}\">` + `<float_array id=\"${name}-array\" count=\"${array.length}\">` + array.join(' ')\n }</float_array><technique_common>${`<accessor source=\"#${name}-array\" count=\"${Math.floor(\n array.length / attr.itemSize,\n )}\" stride=\"${attr.itemSize}\">`}${params\n .map((n) => `<param name=\"${n}\" type=\"${type}\" />`)\n .join('')}</accessor></technique_common></source>`\n : ''\n\n return res\n }\n\n // Returns the string for a node's transform information\n private getTransform(o: Object3D): string {\n // ensure the object's matrix is up to date\n // before saving the transform\n o.updateMatrix()\n\n this.transMat = this.transMat || new Matrix4()\n this.transMat.copy(o.matrix)\n this.transMat.transpose()\n return `<matrix>${this.transMat.toArray().join(' ')}</matrix>`\n }\n\n // Process the given piece of geometry into the geometry library\n // Returns the mesh id\n private processGeometry(g: BufferGeometry): GeometryInfo {\n let info = this.geometryInfo.get(g)\n\n if (!info) {\n // convert the geometry to bufferGeometry if it isn't already\n const bufferGeometry = g\n\n if (!bufferGeometry.isBufferGeometry) {\n throw new Error('THREE.ColladaExporter: Geometry is not of type THREE.BufferGeometry.')\n }\n\n const meshid = `Mesh${this.libraryGeometries.length + 1}`\n\n const indexCount = bufferGeometry.index\n ? bufferGeometry.index.count * bufferGeometry.index.itemSize\n : bufferGeometry.attributes.position.count\n\n const groups =\n bufferGeometry.groups != null && bufferGeometry.groups.length !== 0\n ? bufferGeometry.groups\n : [{ start: 0, count: indexCount, materialIndex: 0 }]\n\n const gname = g.name ? ` name=\"${g.name}\"` : ''\n let gnode = `<geometry id=\"${meshid}\"${gname}><mesh>`\n\n // define the geometry node and the vertices for the geometry\n const posName = `${meshid}-position`\n const vertName = `${meshid}-vertices`\n gnode += this.getAttribute(bufferGeometry.attributes.position, posName, ['X', 'Y', 'Z'], 'float')\n gnode += `<vertices id=\"${vertName}\"><input semantic=\"POSITION\" source=\"#${posName}\" /></vertices>`\n\n // NOTE: We're not optimizing the attribute arrays here, so they're all the same length and\n // can therefore share the same triangle indices. However, MeshLab seems to have trouble opening\n // models with attributes that share an offset.\n // MeshLab Bug#424: https://sourceforge.net/p/meshlab/bugs/424/\n\n // serialize normals\n let triangleInputs = `<input semantic=\"VERTEX\" source=\"#${vertName}\" offset=\"0\" />`\n if ('normal' in bufferGeometry.attributes) {\n const normName = `${meshid}-normal`\n gnode += this.getAttribute(bufferGeometry.attributes.normal, normName, ['X', 'Y', 'Z'], 'float')\n triangleInputs += `<input semantic=\"NORMAL\" source=\"#${normName}\" offset=\"0\" />`\n }\n\n // serialize uvs\n if ('uv' in bufferGeometry.attributes) {\n const uvName = `${meshid}-texcoord`\n gnode += this.getAttribute(bufferGeometry.attributes.uv, uvName, ['S', 'T'], 'float')\n triangleInputs += `<input semantic=\"TEXCOORD\" source=\"#${uvName}\" offset=\"0\" set=\"0\" />`\n }\n\n // serialize lightmap uvs\n if (UV1 in bufferGeometry.attributes) {\n const uvName = `${meshid}-texcoord2`\n gnode += this.getAttribute(bufferGeometry.attributes[UV1], uvName, ['S', 'T'], 'float')\n triangleInputs += `<input semantic=\"TEXCOORD\" source=\"#${uvName}\" offset=\"0\" set=\"1\" />`\n }\n\n // serialize colors\n if ('color' in bufferGeometry.attributes) {\n const colName = `${meshid}-color`\n gnode += this.getAttribute(bufferGeometry.attributes.color, colName, ['X', 'Y', 'Z'], 'uint8')\n triangleInputs += `<input semantic=\"COLOR\" source=\"#${colName}\" offset=\"0\" />`\n }\n\n let indexArray: number[] | ArrayLike<number> | null = null\n if (bufferGeometry.index) {\n indexArray = this.attrBufferToArray(bufferGeometry.index)\n } else {\n indexArray = new Array(indexCount)\n for (let i = 0, l = indexArray.length; i < l && Array.isArray(indexArray); i++) indexArray[i] = i\n }\n\n for (let i = 0, l = groups.length; i < l; i++) {\n const group = groups[i]\n const subarr = this.subArray(indexArray, group.start, group.count)\n const polycount = subarr.length / 3\n gnode += `<triangles material=\"MESH_MATERIAL_${group.materialIndex}\" count=\"${polycount}\">`\n gnode += triangleInputs\n\n gnode += `<p>${subarr.join(' ')}</p>`\n gnode += '</triangles>'\n }\n\n gnode += '</mesh></geometry>'\n\n this.libraryGeometries.push(gnode)\n\n info = { meshid, bufferGeometry }\n this.geometryInfo.set(g, info)\n }\n\n return info\n }\n\n // Process the given texture into the image library\n // Returns the image library\n private processTexture(tex: Texture): string {\n let texid = this.imageMap.get(tex)\n if (texid == null) {\n texid = `image-${this.libraryImages.length + 1}`\n\n const ext = 'png'\n const name = tex.name || texid\n let imageNode = `<image id=\"${texid}\" name=\"${name}\">`\n\n if (this.options.version === '1.5.0') {\n imageNode += `<init_from><ref>${this.options.textureDirectory}${name}.${ext}</ref></init_from>`\n } else {\n // version image node 1.4.1\n imageNode += `<init_from>${this.options.textureDirectory}${name}.${ext}</init_from>`\n }\n\n imageNode += '</image>'\n\n this.libraryImages.push(imageNode)\n this.imageMap.set(tex, texid)\n this.textures.push({\n directory: this.options.textureDirectory,\n name,\n ext,\n data: this.imageToData(tex.image, ext),\n original: tex,\n })\n }\n\n return texid\n }\n\n // Process the given material into the material and effect libraries\n // Returns the material id\n private processMaterial(m: MaterialRepresentation): string {\n let matid = this.materialMap.get(m)\n\n if (matid == null) {\n matid = `Mat${this.libraryEffects.length + 1}`\n\n let type = 'phong'\n\n if (m instanceof MeshLambertMaterial) {\n type = 'lambert'\n } else if (m instanceof MeshBasicMaterial) {\n type = 'constant'\n\n if (m.map !== null) {\n // The Collada spec does not support diffuse texture maps with the\n // constant shader type.\n // mrdoob/three.js#15469\n console.warn('ColladaExporter: Texture maps not supported with MeshBasicMaterial.')\n }\n }\n\n if (m instanceof MeshPhongMaterial) {\n const emissive = m.emissive ? m.emissive : new Color(0, 0, 0)\n const diffuse = m.color ? m.color : new Color(0, 0, 0)\n const specular = m.specular ? m.specular : new Color(1, 1, 1)\n const shininess = m.shininess || 0\n const reflectivity = m.reflectivity || 0\n\n // Do not export and alpha map for the reasons mentioned in issue (#13792)\n // in three.js alpha maps are black and white, but collada expects the alpha\n // channel to specify the transparency\n let transparencyNode = ''\n if (m.transparent) {\n transparencyNode += `<transparent>${\n m.map ? '<texture texture=\"diffuse-sampler\"></texture>' : '<float>1</float>'\n }</transparent>`\n\n if (m.opacity < 1) {\n transparencyNode += `<transparency><float>${m.opacity}</float></transparency>`\n }\n }\n\n const techniqueNode = `${`<technique sid=\"common\"><${type}>`}<emission>${\n m.emissiveMap\n ? '<texture texture=\"emissive-sampler\" texcoord=\"TEXCOORD\" />'\n : `<color sid=\"emission\">${emissive.r} ${emissive.g} ${emissive.b} 1</color>`\n }</emission>${\n type !== 'constant'\n ? `<diffuse>${\n m.map\n ? '<texture texture=\"diffuse-sampler\" texcoord=\"TEXCOORD\" />'\n : `<color sid=\"diffuse\">${diffuse.r} ${diffuse.g} ${diffuse.b} 1</color>`\n }</diffuse>`\n : ''\n }${\n type !== 'constant'\n ? `<bump>${m.normalMap ? '<texture texture=\"bump-sampler\" texcoord=\"TEXCOORD\" />' : ''}</bump>`\n : ''\n }${\n type === 'phong'\n ? `${`<specular><color sid=\"specular\">${specular.r} ${specular.g} ${specular.b} 1</color></specular>`}<shininess>${\n m.specularMap\n ? '<texture texture=\"specular-sampler\" texcoord=\"TEXCOORD\" />'\n : `<float sid=\"shininess\">${shininess}</float>`\n }</shininess>`\n : ''\n }${`<reflective><color>${diffuse.r} ${diffuse.g} ${diffuse.b} 1</color></reflective>`}${`<reflectivity><float>${reflectivity}</float></reflectivity>`}${transparencyNode}${`</${type}></technique>`}`\n\n const effectnode = `${`<effect id=\"${matid}-effect\">`}<profile_COMMON>${\n m.map\n ? `<newparam sid=\"diffuse-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.map,\n )}</init_from>`}</surface></newparam><newparam sid=\"diffuse-sampler\"><sampler2D><source>diffuse-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.specularMap\n ? `<newparam sid=\"specular-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.specularMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"specular-sampler\"><sampler2D><source>specular-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.emissiveMap\n ? `<newparam sid=\"emissive-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.emissiveMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"emissive-sampler\"><sampler2D><source>emissive-surface</source></sampler2D></newparam>`\n : ''\n }${\n m.normalMap\n ? `<newparam sid=\"bump-surface\"><surface type=\"2D\">${`<init_from>${this.processTexture(\n m.normalMap,\n )}</init_from>`}</surface></newparam><newparam sid=\"bump-sampler\"><sampler2D><source>bump-surface</source></sampler2D></newparam>`\n : ''\n }${techniqueNode}${\n m.side === DoubleSide\n ? '<extra><technique profile=\"THREEJS\"><double_sided sid=\"double_sided\" type=\"int\">1</double_sided></technique></extra>'\n : ''\n }</profile_COMMON></effect>`\n\n const materialName = m.name ? ` name=\"${m.name}\"` : ''\n const materialNode = `<material id=\"${matid}\"${materialName}><instance_effect url=\"#${matid}-effect\" /></material>`\n\n this.libraryMaterials.push(materialNode)\n this.libraryEffects.push(effectnode)\n this.materialMap.set(m, matid)\n }\n }\n\n return matid\n }\n\n // Recursively process the object into a scene\n private processObject(o: Object3D): string {\n let node = `<node name=\"${o.name}\">`\n\n node += this.getTransform(o)\n const a: Mesh<BufferGeometry, Material | Material[]> = new Mesh()\n a.geometry\n\n if (o instanceof Mesh && o.isMesh && o.geometry !== null) {\n // function returns the id associated with the mesh and a \"BufferGeometry\" version\n // of the geometry in case it's not a geometry.\n const geomInfo = this.processGeometry(o.geometry)\n const meshid = geomInfo.meshid\n const geometry = geomInfo.bufferGeometry\n\n // ids of the materials to bind to the geometry\n let matids = null\n let matidsArray\n\n // get a list of materials to bind to the sub groups of the geometry.\n // If the amount of subgroups is greater than the materials, than reuse\n // the materials.\n const mat: MaterialRepresentation | MaterialRepresentation[] = o.material || new MeshBasicMaterial()\n const materials = Array.isArray(mat) ? mat : [mat]\n\n if (geometry.groups.length > materials.length) {\n matidsArray = new Array(geometry.groups.length)\n } else {\n matidsArray = new Array(materials.length)\n }\n\n matids = matidsArray.fill(null).map((_, i) => this.processMaterial(materials[i % materials.length]))\n\n node += `${\n `<instance_geometry url=\"#${meshid}\">` +\n (matids != null\n ? `<bind_material><technique_common>${matids\n .map(\n (id, i) =>\n `${`<instance_material symbol=\"MESH_MATERIAL_${i}\" target=\"#${id}\" >`}<bind_vertex_input semantic=\"TEXCOORD\" input_semantic=\"TEXCOORD\" input_set=\"0\" /></instance_material>`,\n )\n .join('')}</technique_common></bind_material>`\n : '')\n }</instance_geometry>`\n }\n\n o.children.forEach((c) => (node += this.processObject(c)))\n\n node += '</node>'\n\n return node\n }\n}\n\nexport { ColladaExporter }\n"],"names":[],"mappings":"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"}
|
package/lines/LineSegments2.cjs
CHANGED
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const THREE = require("three");
|
4
4
|
const LineSegmentsGeometry = require("./LineSegmentsGeometry.cjs");
|
5
5
|
const LineMaterial = require("./LineMaterial.cjs");
|
6
|
+
const uv1 = require("../_polyfill/uv1.cjs");
|
6
7
|
const _viewport = new THREE.Vector4();
|
7
8
|
const _start = new THREE.Vector3();
|
8
9
|
const _end = new THREE.Vector3();
|
@@ -49,7 +50,7 @@ function raycastWorldUnits(lineSegments, intersects) {
|
|
49
50
|
face: null,
|
50
51
|
faceIndex: i,
|
51
52
|
uv: null,
|
52
|
-
|
53
|
+
[uv1.UV1]: null
|
53
54
|
});
|
54
55
|
}
|
55
56
|
}
|
@@ -127,7 +128,7 @@ function raycastScreenSpace(lineSegments, camera, intersects) {
|
|
127
128
|
face: null,
|
128
129
|
faceIndex: i,
|
129
130
|
uv: null,
|
130
|
-
|
131
|
+
[uv1.UV1]: null
|
131
132
|
});
|
132
133
|
}
|
133
134
|
}
|