From 6cd121bc92b279461dd4116283939ae0067f4aa1 Mon Sep 17 00:00:00 2001 From: m-schuetz Date: Tue, 26 Jan 2021 15:42:00 +0100 Subject: [PATCH] update to Potree 1.8 --- .vscode/launch.json | 13 +- .../page_template/libs/other/OrbitControls.js | 625 - .../page_template/libs/potree/potree.css | 19 +- resources/page_template/libs/potree/potree.js | 106296 +++++++++++---- .../page_template/libs/potree/potree.js.map | 2 +- .../libs/potree/resources/LICENSE | 5 + .../resources/images/vr_controller_help.jpg | Bin 0 -> 89138 bytes .../resources/images/vr_controller_help.png | Bin 0 -> 436845 bytes .../resources/images/vr_controller_help.svg | 7620 ++ .../potree/resources/textures/rectangle.png | Bin 0 -> 2955 bytes .../page_template/libs/potree/sidebar.html | 139 +- .../libs/potree/workers/2.0/DecoderWorker.js | 303 + .../workers/2.0/DecoderWorker_brotli.js | 2485 + .../potree/workers/EptBinaryDecoderWorker.js | 210 +- .../workers/EptZstandardDecoderWorker.js | 22363 ++- .../potree/workers/OctreeDecoderWorker.js | 2222 +- .../libs/three.js/extra/GLTFLoader.js | 3939 + .../libs/three.js/extra/VRButton.js | 182 + .../extra/XRControllerModelFactory.js | 311 + .../libs/three.js/extra/lines.js | 16 +- .../three.js/extra/lines/LineSegments2.js | 4 +- .../extra/lines/LineSegmentsGeometry.js | 12 +- .../libs/three.js/extra/lines/Wireframe.js | 4 +- .../three.js/libs/chevrotain.module.min.js | 3 + .../libs/three.js/libs/dat.gui.module.js | 3575 + .../libs/three.js/libs/deflate.module.min.js | 27 + .../libs/three.js/libs/gunzip.module.min.js | 28 + .../libs/three.js/libs/inflate.module.min.js | 17 + .../libs/three.js/libs/jszip.module.min.js | 15 + .../three.js/libs/meshopt_decoder.module.js | 113 + .../libs/three.js/libs/mmdparser.module.js | 11535 ++ .../libs/motion-controllers.module.js | 397 + .../libs/three.js/libs/opentype.module.min.js | 119 + .../libs/three.js/libs/stats.module.js | 167 + .../libs/three.js/libs/tween.module.min.js | 3 + .../libs/three.js/libs/zstddec.module.js | 115 + .../libs/three.js/lines/Line2.js | 24 + .../libs/three.js/lines/LineGeometry.js | 97 + .../libs/three.js/lines/LineMaterial.js | 424 + .../libs/three.js/lines/LineSegments2.js | 209 + .../three.js/lines/LineSegmentsGeometry.js | 260 + .../libs/three.js/lines/Wireframe.js | 63 + .../libs/three.js/lines/WireframeGeometry2.js | 26 + .../libs/three.js/loaders/3DMLoader.js | 1411 + .../libs/three.js/loaders/3MFLoader.js | 1472 + .../libs/three.js/loaders/AMFLoader.js | 522 + .../libs/three.js/loaders/AssimpLoader.js | 2307 + .../libs/three.js/loaders/BVHLoader.js | 439 + .../three.js/loaders/BasisTextureLoader.js | 547 + .../libs/three.js/loaders/ColladaLoader.js | 4024 + .../libs/three.js/loaders/DDSLoader.js | 281 + .../libs/three.js/loaders/DRACOLoader.js | 640 + .../libs/three.js/loaders/EXRLoader.js | 2418 + .../libs/three.js/loaders/FBXLoader.js | 4205 + .../libs/three.js/loaders/GCodeLoader.js | 265 + .../libs/three.js/loaders/GLTFLoader.js | 3939 + .../three.js/loaders/HDRCubeTextureLoader.js | 146 + .../libs/three.js/loaders/KMZLoader.js | 132 + .../libs/three.js/loaders/KTX2Loader.js | 743 + .../libs/three.js/loaders/KTXLoader.js | 180 + .../libs/three.js/loaders/LDrawLoader.js | 1972 + .../libs/three.js/loaders/LUT3dlLoader.js | 142 + .../libs/three.js/loaders/LUTCubeLoader.js | 151 + .../libs/three.js/loaders/LWOLoader.js | 1079 + .../libs/three.js/loaders/LottieLoader.js | 74 + .../libs/three.js/loaders/MD2Loader.js | 404 + .../libs/three.js/loaders/MDDLoader.js | 104 + .../libs/three.js/loaders/MMDLoader.js | 2021 + .../libs/three.js/loaders/MTLLoader.js | 564 + .../libs/three.js/loaders/NRRDLoader.js | 640 + .../three.js/loaders/NodeMaterialLoader.js | 270 + .../{other => three.js/loaders}/OBJLoader.js | 389 +- .../libs/three.js/loaders/OBJLoader2.js | 389 + .../three.js/loaders/OBJLoader2Parallel.js | 232 + .../libs/three.js/loaders/PCDLoader.js | 402 + .../libs/three.js/loaders/PDBLoader.js | 234 + .../{other => three.js/loaders}/PLYLoader.js | 163 +- .../libs/three.js/loaders/PRWMLoader.js | 316 + .../libs/three.js/loaders/PVRLoader.js | 252 + .../libs/three.js/loaders/RGBELoader.js | 491 + .../libs/three.js/loaders/STLLoader.js | 402 + .../libs/three.js/loaders/SVGLoader.js | 2239 + .../libs/three.js/loaders/TDSLoader.js | 1166 + .../libs/three.js/loaders/TGALoader.js | 550 + .../libs/three.js/loaders/TTFLoader.js | 224 + .../libs/three.js/loaders/TiltLoader.js | 502 + .../libs/three.js/loaders/VOXLoader.js | 260 + .../libs/three.js/loaders/VRMLLoader.js | 3494 + .../libs/three.js/loaders/VRMLoader.js | 86 + .../libs/three.js/loaders/VTKLoader.js | 1185 + .../libs/three.js/loaders/XLoader.js | 1759 + .../libs/three.js/loaders/XYZLoader.js | 100 + .../libs/three.js/loaders/lwo/IFFParser.js | 1218 + .../libs/three.js/loaders/lwo/LWO2Parser.js | 415 + .../libs/three.js/loaders/lwo/LWO3Parser.js | 375 + .../three.js/loaders/obj2/OBJLoader2Parser.js | 1123 + .../loaders/obj2/bridge/MtlObjBridge.js | 46 + .../loaders/obj2/shared/MaterialHandler.js | 276 + .../loaders/obj2/shared/MeshReceiver.js | 313 + .../loaders/obj2/utils/CodeSerializer.js | 264 + .../worker/main/WorkerExecutionSupport.js | 584 + .../worker/parallel/OBJLoader2JsmWorker.js | 12 + .../obj2/worker/parallel/WorkerRunner.js | 165 + .../libs/three.js/webxr/ARButton.js | 191 + .../libs/three.js/webxr/VRButton.js | 169 + .../webxr/XRControllerModelFactory.js | 311 + .../libs/three.js/webxr/XRHandModelFactory.js | 113 + .../three.js/webxr/XRHandOculusMeshModel.js | 110 + .../three.js/webxr/XRHandPrimitiveModel.js | 87 + resources/page_template/viewer_template.html | 2 - 110 files changed, 190241 insertions(+), 25447 deletions(-) delete mode 100644 resources/page_template/libs/other/OrbitControls.js create mode 100644 resources/page_template/libs/potree/resources/images/vr_controller_help.jpg create mode 100644 resources/page_template/libs/potree/resources/images/vr_controller_help.png create mode 100644 resources/page_template/libs/potree/resources/images/vr_controller_help.svg create mode 100644 resources/page_template/libs/potree/resources/textures/rectangle.png create mode 100644 resources/page_template/libs/potree/workers/2.0/DecoderWorker.js create mode 100644 resources/page_template/libs/potree/workers/2.0/DecoderWorker_brotli.js create mode 100644 resources/page_template/libs/three.js/extra/GLTFLoader.js create mode 100644 resources/page_template/libs/three.js/extra/VRButton.js create mode 100644 resources/page_template/libs/three.js/extra/XRControllerModelFactory.js create mode 100644 resources/page_template/libs/three.js/libs/chevrotain.module.min.js create mode 100644 resources/page_template/libs/three.js/libs/dat.gui.module.js create mode 100644 resources/page_template/libs/three.js/libs/deflate.module.min.js create mode 100644 resources/page_template/libs/three.js/libs/gunzip.module.min.js create mode 100644 resources/page_template/libs/three.js/libs/inflate.module.min.js create mode 100644 resources/page_template/libs/three.js/libs/jszip.module.min.js create mode 100644 resources/page_template/libs/three.js/libs/meshopt_decoder.module.js create mode 100644 resources/page_template/libs/three.js/libs/mmdparser.module.js create mode 100644 resources/page_template/libs/three.js/libs/motion-controllers.module.js create mode 100644 resources/page_template/libs/three.js/libs/opentype.module.min.js create mode 100644 resources/page_template/libs/three.js/libs/stats.module.js create mode 100644 resources/page_template/libs/three.js/libs/tween.module.min.js create mode 100644 resources/page_template/libs/three.js/libs/zstddec.module.js create mode 100644 resources/page_template/libs/three.js/lines/Line2.js create mode 100644 resources/page_template/libs/three.js/lines/LineGeometry.js create mode 100644 resources/page_template/libs/three.js/lines/LineMaterial.js create mode 100644 resources/page_template/libs/three.js/lines/LineSegments2.js create mode 100644 resources/page_template/libs/three.js/lines/LineSegmentsGeometry.js create mode 100644 resources/page_template/libs/three.js/lines/Wireframe.js create mode 100644 resources/page_template/libs/three.js/lines/WireframeGeometry2.js create mode 100644 resources/page_template/libs/three.js/loaders/3DMLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/3MFLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/AMFLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/AssimpLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/BVHLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/BasisTextureLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/ColladaLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/DDSLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/DRACOLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/EXRLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/FBXLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/GCodeLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/GLTFLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/HDRCubeTextureLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/KMZLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/KTX2Loader.js create mode 100644 resources/page_template/libs/three.js/loaders/KTXLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/LDrawLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/LUT3dlLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/LUTCubeLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/LWOLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/LottieLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/MD2Loader.js create mode 100644 resources/page_template/libs/three.js/loaders/MDDLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/MMDLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/MTLLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/NRRDLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/NodeMaterialLoader.js rename resources/page_template/libs/{other => three.js/loaders}/OBJLoader.js (61%) create mode 100644 resources/page_template/libs/three.js/loaders/OBJLoader2.js create mode 100644 resources/page_template/libs/three.js/loaders/OBJLoader2Parallel.js create mode 100644 resources/page_template/libs/three.js/loaders/PCDLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/PDBLoader.js rename resources/page_template/libs/{other => three.js/loaders}/PLYLoader.js (75%) create mode 100644 resources/page_template/libs/three.js/loaders/PRWMLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/PVRLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/RGBELoader.js create mode 100644 resources/page_template/libs/three.js/loaders/STLLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/SVGLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/TDSLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/TGALoader.js create mode 100644 resources/page_template/libs/three.js/loaders/TTFLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/TiltLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/VOXLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/VRMLLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/VRMLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/VTKLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/XLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/XYZLoader.js create mode 100644 resources/page_template/libs/three.js/loaders/lwo/IFFParser.js create mode 100644 resources/page_template/libs/three.js/loaders/lwo/LWO2Parser.js create mode 100644 resources/page_template/libs/three.js/loaders/lwo/LWO3Parser.js create mode 100644 resources/page_template/libs/three.js/loaders/obj2/OBJLoader2Parser.js create mode 100644 resources/page_template/libs/three.js/loaders/obj2/bridge/MtlObjBridge.js create mode 100644 resources/page_template/libs/three.js/loaders/obj2/shared/MaterialHandler.js create mode 100644 resources/page_template/libs/three.js/loaders/obj2/shared/MeshReceiver.js create mode 100644 resources/page_template/libs/three.js/loaders/obj2/utils/CodeSerializer.js create mode 100644 resources/page_template/libs/three.js/loaders/obj2/worker/main/WorkerExecutionSupport.js create mode 100644 resources/page_template/libs/three.js/loaders/obj2/worker/parallel/OBJLoader2JsmWorker.js create mode 100644 resources/page_template/libs/three.js/loaders/obj2/worker/parallel/WorkerRunner.js create mode 100644 resources/page_template/libs/three.js/webxr/ARButton.js create mode 100644 resources/page_template/libs/three.js/webxr/VRButton.js create mode 100644 resources/page_template/libs/three.js/webxr/XRControllerModelFactory.js create mode 100644 resources/page_template/libs/three.js/webxr/XRHandModelFactory.js create mode 100644 resources/page_template/libs/three.js/webxr/XRHandOculusMeshModel.js create mode 100644 resources/page_template/libs/three.js/webxr/XRHandPrimitiveModel.js diff --git a/.vscode/launch.json b/.vscode/launch.json index 886125b5..dc7829bb 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -38,7 +38,7 @@ // "D:/temp/crashreport/3dbuildings_walls_azimuth.laz", // "-o", "D:/temp/crashreport2/converted", - "D:/dev/pointclouds/CA13/ot_35120B4122C_1.laz", + // "D:/dev/pointclouds/CA13/ot_35120B4122C_1.laz", // "D:/dev/pointclouds/CA13/ot_35120B4121D_1.laz", // "D:/dev/pointclouds/CA13/ot_35120B4301B_1.laz", // "D:/dev/pointclouds/CA13/ot_35120B4301D_1.laz", @@ -64,7 +64,7 @@ // "D:/dev/pointclouds/tuwien_baugeschichte/candi Banyunibo", - // "D:/dev/pointclouds/sitn/potree2/aerial_lidar2019_2524_1197_laz14_dip.laz", + "D:/dev/pointclouds/sitn/potree2/aerial_lidar2019_2524_1197_laz14_dip.laz", // "D:/dev/pointclouds/sitn/potree2/aerial_lidar2019_2524_1197_las14.las", // "D:/temp/Bargello10Mtest.las", @@ -78,11 +78,8 @@ // "D:/dev/pointclouds/testdata/lion.laz", // "D:/dev/pointclouds/testdata/3dbuildings_walls_azimuth.laz", - "-o", "D:/temp/converted_brotli", - // "-o", "F:/temp/CA13", - // "-o", "F:/temp/affandi", - // "-o", "C:/dev/workspaces/potree/develop/test/converted", - //"-o", "C:/dev/workspaces/potree/develop/test/eclepens", + + "-o", "D:/temp/cpotree/sitn_dip_2.0", // =================== // SYSTEM 2 @@ -104,7 +101,7 @@ // "-m", "poisson", // ["poisson", "poisson_average", "random"] // "--chunkMethod", "SKIP" // [LASZIP, LAS_CUSTOM, SKIP] // "--attributes", "rgb", "Dip (degrees)", "Dip direction (degrees)", "NormalX", "NormalY", "NormalZ", - "--attributes" , "rgb", "intensity", "classification", "mjpmie", + // "--attributes" , "rgb", "intensity", "classification", "mjpmie", "--encoding", "BROTLI", ], "stopAtEntry": false, diff --git a/resources/page_template/libs/other/OrbitControls.js b/resources/page_template/libs/other/OrbitControls.js deleted file mode 100644 index e3caef2a..00000000 --- a/resources/page_template/libs/other/OrbitControls.js +++ /dev/null @@ -1,625 +0,0 @@ -/** - * @author qiao / https://github.com/qiao - * @author mrdoob / http://mrdoob.com - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author erich666 / http://erichaines.com - */ -/*global THREE, console */ - -// This set of controls performs orbiting, dollying (zooming), and panning. It maintains -// the "up" direction as +Y, unlike the TrackballControls. Touch on tablet and phones is -// supported. -// -// Orbit - left mouse / touch: one finger move -// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish -// Pan - right mouse, or arrow keys / touch: three finter swipe -// -// This is a drop-in replacement for (most) TrackballControls used in examples. -// That is, include this js file and wherever you see: -// controls = new THREE.TrackballControls( camera ); -// controls.target.z = 150; -// Simple substitute "OrbitControls" and the control should work as-is. - -THREE.OrbitControls = function ( object, domElement ) { - - this.object = object; - this.domElement = ( domElement !== undefined ) ? domElement : document; - - // API - - // Set to false to disable this control - this.enabled = true; - - // "target" sets the location of focus, where the control orbits around - // and where it pans with respect to. - this.target = new THREE.Vector3(); - - // center is old, deprecated; use "target" instead - this.center = this.target; - - // This option actually enables dollying in and out; left as "zoom" for - // backwards compatibility - this.noZoom = false; - this.zoomSpeed = 1.0; - - // Limits to how far you can dolly in and out - this.minDistance = 0; - this.maxDistance = Infinity; - - // Set to true to disable this control - this.noRotate = false; - this.rotateSpeed = 1.0; - - // Set to true to disable this control - this.noPan = false; - this.keyPanSpeed = 7.0; // pixels moved per arrow key push - - // Set to true to automatically rotate around the target - this.autoRotate = false; - this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 - - // How far you can orbit vertically, upper and lower limits. - // Range is 0 to Math.PI radians. - this.minPolarAngle = 0; // radians - this.maxPolarAngle = Math.PI; // radians - - // Set to true to disable use of the keys - this.noKeys = false; - - // The four arrow keys - this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; - - //////////// - // internals - - var scope = this; - - var EPS = 0.000001; - - var rotateStart = new THREE.Vector2(); - var rotateEnd = new THREE.Vector2(); - var rotateDelta = new THREE.Vector2(); - - var panStart = new THREE.Vector2(); - var panEnd = new THREE.Vector2(); - var panDelta = new THREE.Vector2(); - var panOffset = new THREE.Vector3(); - - var offset = new THREE.Vector3(); - - var dollyStart = new THREE.Vector2(); - var dollyEnd = new THREE.Vector2(); - var dollyDelta = new THREE.Vector2(); - - var phiDelta = 0; - var thetaDelta = 0; - var scale = 1; - var pan = new THREE.Vector3(); - - var lastPosition = new THREE.Vector3(); - - var STATE = { NONE : -1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 }; - - var state = STATE.NONE; - - // for reset - - this.target0 = this.target.clone(); - this.position0 = this.object.position.clone(); - - // events - - var changeEvent = { type: 'change' }; - var startEvent = { type: 'start'}; - var endEvent = { type: 'end'}; - - this.rotateLeft = function ( angle ) { - - if ( angle === undefined ) { - - angle = getAutoRotationAngle(); - - } - - thetaDelta -= angle; - - }; - - this.rotateUp = function ( angle ) { - - if ( angle === undefined ) { - - angle = getAutoRotationAngle(); - - } - - phiDelta -= angle; - - }; - - // pass in distance in world space to move left - this.panLeft = function ( distance ) { - - var te = this.object.matrix.elements; - - // get X column of matrix - panOffset.set( te[ 0 ], te[ 1 ], te[ 2 ] ); - panOffset.multiplyScalar( - distance ); - - pan.add( panOffset ); - - }; - - // pass in distance in world space to move up - this.panUp = function ( distance ) { - - var te = this.object.matrix.elements; - - // get Y column of matrix - panOffset.set( te[ 4 ], te[ 5 ], te[ 6 ] ); - panOffset.multiplyScalar( distance ); - - pan.add( panOffset ); - - }; - - // pass in x,y of change desired in pixel space, - // right and down are positive - this.pan = function ( deltaX, deltaY ) { - - var element = scope.domElement === document ? scope.domElement.body : scope.domElement; - - if ( scope.object.fov !== undefined ) { - - // perspective - var position = scope.object.position; - var offset = position.clone().sub( scope.target ); - var targetDistance = offset.length(); - - // half of the fov is center to top of screen - targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 ); - - // we actually don't use screenWidth, since perspective camera is fixed to screen height - scope.panLeft( 2 * deltaX * targetDistance / element.clientHeight ); - scope.panUp( 2 * deltaY * targetDistance / element.clientHeight ); - - } else if ( scope.object.top !== undefined ) { - - // orthographic - scope.panLeft( deltaX * (scope.object.right - scope.object.left) / element.clientWidth ); - scope.panUp( deltaY * (scope.object.top - scope.object.bottom) / element.clientHeight ); - - } else { - - // camera neither orthographic or perspective - console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' ); - - } - - }; - - this.dollyIn = function ( dollyScale ) { - - if ( dollyScale === undefined ) { - - dollyScale = getZoomScale(); - - } - - scale /= dollyScale; - - }; - - this.dollyOut = function ( dollyScale ) { - - if ( dollyScale === undefined ) { - - dollyScale = getZoomScale(); - - } - - scale *= dollyScale; - - }; - - this.update = function () { - - var position = this.object.position; - - offset.copy( position ).sub( this.target ); - - // angle from z-axis around y-axis - - var theta = Math.atan2( offset.x, offset.z ); - - // angle from y-axis - - var phi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y ); - - if ( this.autoRotate ) { - - this.rotateLeft( getAutoRotationAngle() ); - - } - - theta += thetaDelta; - phi += phiDelta; - - // restrict phi to be between desired limits - phi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, phi ) ); - - // restrict phi to be betwee EPS and PI-EPS - phi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) ); - - var radius = offset.length() * scale; - - // restrict radius to be between desired limits - radius = Math.max( this.minDistance, Math.min( this.maxDistance, radius ) ); - - // move target to panned location - this.target.add( pan ); - - offset.x = radius * Math.sin( phi ) * Math.sin( theta ); - offset.y = radius * Math.cos( phi ); - offset.z = radius * Math.sin( phi ) * Math.cos( theta ); - - position.copy( this.target ).add( offset ); - - this.object.lookAt( this.target ); - - thetaDelta = 0; - phiDelta = 0; - scale = 1; - pan.set( 0, 0, 0 ); - - if ( lastPosition.distanceTo( this.object.position ) > 0 ) { - - this.dispatchEvent( changeEvent ); - - lastPosition.copy( this.object.position ); - - } - - }; - - - this.reset = function () { - - state = STATE.NONE; - - this.target.copy( this.target0 ); - this.object.position.copy( this.position0 ); - - this.update(); - - }; - - function getAutoRotationAngle() { - - return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; - - } - - function getZoomScale() { - - return Math.pow( 0.95, scope.zoomSpeed ); - - } - - function onMouseDown( event ) { - - if ( scope.enabled === false ) return; - event.preventDefault(); - - if ( event.button === 0 ) { - if ( scope.noRotate === true ) return; - - state = STATE.ROTATE; - - rotateStart.set( event.clientX, event.clientY ); - - } else if ( event.button === 1 ) { - if ( scope.noZoom === true ) return; - - state = STATE.DOLLY; - - dollyStart.set( event.clientX, event.clientY ); - - } else if ( event.button === 2 ) { - if ( scope.noPan === true ) return; - - state = STATE.PAN; - - panStart.set( event.clientX, event.clientY ); - - } - - scope.domElement.addEventListener( 'mousemove', onMouseMove, false ); - scope.domElement.addEventListener( 'mouseup', onMouseUp, false ); - scope.dispatchEvent( startEvent ); - - } - - function onMouseMove( event ) { - - if ( scope.enabled === false ) return; - - event.preventDefault(); - - var element = scope.domElement === document ? scope.domElement.body : scope.domElement; - - if ( state === STATE.ROTATE ) { - - if ( scope.noRotate === true ) return; - - rotateEnd.set( event.clientX, event.clientY ); - rotateDelta.subVectors( rotateEnd, rotateStart ); - - // rotating across whole screen goes 360 degrees around - scope.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); - - // rotating up and down along whole screen attempts to go 360, but limited to 180 - scope.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); - - rotateStart.copy( rotateEnd ); - - } else if ( state === STATE.DOLLY ) { - - if ( scope.noZoom === true ) return; - - dollyEnd.set( event.clientX, event.clientY ); - dollyDelta.subVectors( dollyEnd, dollyStart ); - - if ( dollyDelta.y > 0 ) { - - scope.dollyIn(); - - } else { - - scope.dollyOut(); - - } - - dollyStart.copy( dollyEnd ); - - } else if ( state === STATE.PAN ) { - - if ( scope.noPan === true ) return; - - panEnd.set( event.clientX, event.clientY ); - panDelta.subVectors( panEnd, panStart ); - - scope.pan( panDelta.x, panDelta.y ); - - panStart.copy( panEnd ); - - } - - scope.update(); - - } - - function onMouseUp( /* event */ ) { - - if ( scope.enabled === false ) return; - - scope.domElement.removeEventListener( 'mousemove', onMouseMove, false ); - scope.domElement.removeEventListener( 'mouseup', onMouseUp, false ); - scope.dispatchEvent( endEvent ); - state = STATE.NONE; - - } - - function onMouseWheel( event ) { - - if ( scope.enabled === false || scope.noZoom === true ) return; - - event.preventDefault(); - - var delta = 0; - - if ( event.wheelDelta !== undefined ) { // WebKit / Opera / Explorer 9 - - delta = event.wheelDelta; - - } else if ( event.detail !== undefined ) { // Firefox - - delta = - event.detail; - - } - - if ( delta > 0 ) { - - scope.dollyOut(); - - } else { - - scope.dollyIn(); - - } - - scope.update(); - scope.dispatchEvent( startEvent ); - scope.dispatchEvent( endEvent ); - - } - - function onKeyDown( event ) { - - if ( scope.enabled === false || scope.noKeys === true || scope.noPan === true ) return; - - switch ( event.keyCode ) { - - case scope.keys.UP: - scope.pan( 0, scope.keyPanSpeed ); - scope.update(); - break; - - case scope.keys.BOTTOM: - scope.pan( 0, - scope.keyPanSpeed ); - scope.update(); - break; - - case scope.keys.LEFT: - scope.pan( scope.keyPanSpeed, 0 ); - scope.update(); - break; - - case scope.keys.RIGHT: - scope.pan( - scope.keyPanSpeed, 0 ); - scope.update(); - break; - - } - - } - - function touchstart( event ) { - - if ( scope.enabled === false ) return; - - switch ( event.touches.length ) { - - case 1: // one-fingered touch: rotate - - if ( scope.noRotate === true ) return; - - state = STATE.TOUCH_ROTATE; - - rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - break; - - case 2: // two-fingered touch: dolly - - if ( scope.noZoom === true ) return; - - state = STATE.TOUCH_DOLLY; - - var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; - var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; - var distance = Math.sqrt( dx * dx + dy * dy ); - dollyStart.set( 0, distance ); - break; - - case 3: // three-fingered touch: pan - - if ( scope.noPan === true ) return; - - state = STATE.TOUCH_PAN; - - panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - break; - - default: - - state = STATE.NONE; - - } - - scope.dispatchEvent( startEvent ); - - } - - function touchmove( event ) { - - if ( scope.enabled === false ) return; - - event.preventDefault(); - event.stopPropagation(); - - var element = scope.domElement === document ? scope.domElement.body : scope.domElement; - - switch ( event.touches.length ) { - - case 1: // one-fingered touch: rotate - - if ( scope.noRotate === true ) return; - if ( state !== STATE.TOUCH_ROTATE ) return; - - rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - rotateDelta.subVectors( rotateEnd, rotateStart ); - - // rotating across whole screen goes 360 degrees around - scope.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); - // rotating up and down along whole screen attempts to go 360, but limited to 180 - scope.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); - - rotateStart.copy( rotateEnd ); - - scope.update(); - break; - - case 2: // two-fingered touch: dolly - - if ( scope.noZoom === true ) return; - if ( state !== STATE.TOUCH_DOLLY ) return; - - var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; - var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; - var distance = Math.sqrt( dx * dx + dy * dy ); - - dollyEnd.set( 0, distance ); - dollyDelta.subVectors( dollyEnd, dollyStart ); - - if ( dollyDelta.y > 0 ) { - - scope.dollyOut(); - - } else { - - scope.dollyIn(); - - } - - dollyStart.copy( dollyEnd ); - - scope.update(); - break; - - case 3: // three-fingered touch: pan - - if ( scope.noPan === true ) return; - if ( state !== STATE.TOUCH_PAN ) return; - - panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - panDelta.subVectors( panEnd, panStart ); - - scope.pan( panDelta.x, panDelta.y ); - - panStart.copy( panEnd ); - - scope.update(); - break; - - default: - - state = STATE.NONE; - - } - - } - - function touchend( /* event */ ) { - - if ( scope.enabled === false ) return; - - scope.dispatchEvent( endEvent ); - state = STATE.NONE; - - } - - this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false ); - this.domElement.addEventListener( 'mousedown', onMouseDown, false ); - this.domElement.addEventListener( 'mousewheel', onMouseWheel, false ); - this.domElement.addEventListener( 'DOMMouseScroll', onMouseWheel, false ); // firefox - - this.domElement.addEventListener( 'touchstart', touchstart, false ); - this.domElement.addEventListener( 'touchend', touchend, false ); - this.domElement.addEventListener( 'touchmove', touchmove, false ); - - window.addEventListener( 'keydown', onKeyDown, false ); - -}; - -THREE.OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype ); \ No newline at end of file diff --git a/resources/page_template/libs/potree/potree.css b/resources/page_template/libs/potree/potree.css index 90baadf5..8e5b5022 100644 --- a/resources/page_template/libs/potree/potree.css +++ b/resources/page_template/libs/potree/potree.css @@ -131,27 +131,36 @@ color: #8Aa1c4; } +#potree_quick_buttons{ + position: absolute; + left: 4px; + top: 4px; + width: 10px; + height: 10px; + z-index: 10000; + float: left; +} + .potree_menu_toggle{ - position: absolute; float: left; - margin: 8px 8px; + margin: 0; background: none; width: 2.5em; height: 2.5em; z-index: 100; cursor: pointer; + margin: 4px; } #potree_map_toggle{ - position: absolute; float: left; - margin: 8px 8px; + margin: 0; background: none; width: 2.5em; height: 2.5em; z-index: 100; - top: calc(2.5em + 8px); cursor: pointer; + margin: 4px; } #potree_render_area{ diff --git a/resources/page_template/libs/potree/potree.js b/resources/page_template/libs/potree/potree.js index e7409122..709679d4 100644 --- a/resources/page_template/libs/potree/potree.js +++ b/resources/page_template/libs/potree/potree.js @@ -183,24803 +183,77188 @@ // } //}; - class PathAnimation{ - - constructor(path, start, end, speed, callback){ - this.path = path; - this.length = this.path.spline.getLength(); - this.speed = speed; - this.callback = callback; - this.tween = null; - this.startPoint = Math.max(start, 0); - this.endPoint = Math.min(end, this.length); - this.t = 0.0; - } + // threejs.org/license + const REVISION = '124'; + const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 }; + const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }; + const CullFaceNone = 0; + const CullFaceBack = 1; + const CullFaceFront = 2; + const CullFaceFrontBack = 3; + const BasicShadowMap = 0; + const PCFShadowMap = 1; + const PCFSoftShadowMap = 2; + const VSMShadowMap = 3; + const FrontSide = 0; + const BackSide = 1; + const DoubleSide = 2; + const FlatShading = 1; + const SmoothShading = 2; + const NoBlending = 0; + const NormalBlending = 1; + const AdditiveBlending = 2; + const SubtractiveBlending = 3; + const MultiplyBlending = 4; + const CustomBlending = 5; + const AddEquation = 100; + const SubtractEquation = 101; + const ReverseSubtractEquation = 102; + const MinEquation = 103; + const MaxEquation = 104; + const ZeroFactor = 200; + const OneFactor = 201; + const SrcColorFactor = 202; + const OneMinusSrcColorFactor = 203; + const SrcAlphaFactor = 204; + const OneMinusSrcAlphaFactor = 205; + const DstAlphaFactor = 206; + const OneMinusDstAlphaFactor = 207; + const DstColorFactor = 208; + const OneMinusDstColorFactor = 209; + const SrcAlphaSaturateFactor = 210; + const NeverDepth = 0; + const AlwaysDepth = 1; + const LessDepth = 2; + const LessEqualDepth = 3; + const EqualDepth = 4; + const GreaterEqualDepth = 5; + const GreaterDepth = 6; + const NotEqualDepth = 7; + const MultiplyOperation = 0; + const MixOperation = 1; + const AddOperation = 2; + const NoToneMapping = 0; + const LinearToneMapping = 1; + const ReinhardToneMapping = 2; + const CineonToneMapping = 3; + const ACESFilmicToneMapping = 4; + const CustomToneMapping = 5; + + const UVMapping = 300; + const CubeReflectionMapping = 301; + const CubeRefractionMapping = 302; + const EquirectangularReflectionMapping = 303; + const EquirectangularRefractionMapping = 304; + const CubeUVReflectionMapping = 306; + const CubeUVRefractionMapping = 307; + const RepeatWrapping = 1000; + const ClampToEdgeWrapping = 1001; + const MirroredRepeatWrapping = 1002; + const NearestFilter = 1003; + const NearestMipmapNearestFilter = 1004; + const NearestMipMapNearestFilter = 1004; + const NearestMipmapLinearFilter = 1005; + const NearestMipMapLinearFilter = 1005; + const LinearFilter = 1006; + const LinearMipmapNearestFilter = 1007; + const LinearMipMapNearestFilter = 1007; + const LinearMipmapLinearFilter = 1008; + const LinearMipMapLinearFilter = 1008; + const UnsignedByteType = 1009; + const ByteType = 1010; + const ShortType = 1011; + const UnsignedShortType = 1012; + const IntType = 1013; + const UnsignedIntType = 1014; + const FloatType = 1015; + const HalfFloatType = 1016; + const UnsignedShort4444Type = 1017; + const UnsignedShort5551Type = 1018; + const UnsignedShort565Type = 1019; + const UnsignedInt248Type$1 = 1020; + const AlphaFormat = 1021; + const RGBFormat = 1022; + const RGBAFormat = 1023; + const LuminanceFormat = 1024; + const LuminanceAlphaFormat = 1025; + const RGBEFormat = RGBAFormat; + const DepthFormat = 1026; + const DepthStencilFormat = 1027; + const RedFormat = 1028; + const RedIntegerFormat = 1029; + const RGFormat = 1030; + const RGIntegerFormat = 1031; + const RGBIntegerFormat = 1032; + const RGBAIntegerFormat = 1033; + + const RGB_S3TC_DXT1_Format = 33776; + const RGBA_S3TC_DXT1_Format$1 = 33777; + const RGBA_S3TC_DXT3_Format = 33778; + const RGBA_S3TC_DXT5_Format$1 = 33779; + const RGB_PVRTC_4BPPV1_Format = 35840; + const RGB_PVRTC_2BPPV1_Format = 35841; + const RGBA_PVRTC_4BPPV1_Format = 35842; + const RGBA_PVRTC_2BPPV1_Format = 35843; + const RGB_ETC1_Format = 36196; + const RGB_ETC2_Format = 37492; + const RGBA_ETC2_EAC_Format = 37496; + const RGBA_ASTC_4x4_Format = 37808; + const RGBA_ASTC_5x4_Format = 37809; + const RGBA_ASTC_5x5_Format = 37810; + const RGBA_ASTC_6x5_Format = 37811; + const RGBA_ASTC_6x6_Format = 37812; + const RGBA_ASTC_8x5_Format = 37813; + const RGBA_ASTC_8x6_Format = 37814; + const RGBA_ASTC_8x8_Format = 37815; + const RGBA_ASTC_10x5_Format = 37816; + const RGBA_ASTC_10x6_Format = 37817; + const RGBA_ASTC_10x8_Format = 37818; + const RGBA_ASTC_10x10_Format = 37819; + const RGBA_ASTC_12x10_Format = 37820; + const RGBA_ASTC_12x12_Format = 37821; + const RGBA_BPTC_Format = 36492; + const SRGB8_ALPHA8_ASTC_4x4_Format = 37840; + const SRGB8_ALPHA8_ASTC_5x4_Format = 37841; + const SRGB8_ALPHA8_ASTC_5x5_Format = 37842; + const SRGB8_ALPHA8_ASTC_6x5_Format = 37843; + const SRGB8_ALPHA8_ASTC_6x6_Format = 37844; + const SRGB8_ALPHA8_ASTC_8x5_Format = 37845; + const SRGB8_ALPHA8_ASTC_8x6_Format = 37846; + const SRGB8_ALPHA8_ASTC_8x8_Format = 37847; + const SRGB8_ALPHA8_ASTC_10x5_Format = 37848; + const SRGB8_ALPHA8_ASTC_10x6_Format = 37849; + const SRGB8_ALPHA8_ASTC_10x8_Format = 37850; + const SRGB8_ALPHA8_ASTC_10x10_Format = 37851; + const SRGB8_ALPHA8_ASTC_12x10_Format = 37852; + const SRGB8_ALPHA8_ASTC_12x12_Format = 37853; + const LoopOnce = 2200; + const LoopRepeat = 2201; + const LoopPingPong = 2202; + const InterpolateDiscrete = 2300; + const InterpolateLinear = 2301; + const InterpolateSmooth = 2302; + const ZeroCurvatureEnding = 2400; + const ZeroSlopeEnding = 2401; + const WrapAroundEnding = 2402; + const NormalAnimationBlendMode = 2500; + const AdditiveAnimationBlendMode = 2501; + const TrianglesDrawMode = 0; + const TriangleStripDrawMode = 1; + const TriangleFanDrawMode = 2; + const LinearEncoding = 3000; + const sRGBEncoding = 3001; + const GammaEncoding = 3007; + const RGBEEncoding = 3002; + const LogLuvEncoding = 3003; + const RGBM7Encoding = 3004; + const RGBM16Encoding = 3005; + const RGBDEncoding = 3006; + const BasicDepthPacking = 3200; + const RGBADepthPacking = 3201; + const TangentSpaceNormalMap = 0; + const ObjectSpaceNormalMap = 1; + + const ZeroStencilOp = 0; + const KeepStencilOp = 7680; + const ReplaceStencilOp = 7681; + const IncrementStencilOp = 7682; + const DecrementStencilOp = 7683; + const IncrementWrapStencilOp = 34055; + const DecrementWrapStencilOp = 34056; + const InvertStencilOp = 5386; + + const NeverStencilFunc = 512; + const LessStencilFunc = 513; + const EqualStencilFunc = 514; + const LessEqualStencilFunc = 515; + const GreaterStencilFunc = 516; + const NotEqualStencilFunc = 517; + const GreaterEqualStencilFunc = 518; + const AlwaysStencilFunc = 519; + + const StaticDrawUsage = 35044; + const DynamicDrawUsage = 35048; + const StreamDrawUsage = 35040; + const StaticReadUsage = 35045; + const DynamicReadUsage = 35049; + const StreamReadUsage = 35041; + const StaticCopyUsage = 35046; + const DynamicCopyUsage = 35050; + const StreamCopyUsage = 35042; + + const GLSL1 = '100'; + const GLSL3 = '300 es'; - start(resume = false){ - if(this.tween){ - this.tween.stop(); - this.tween = null; - } - - let tStart; - if(resume){ - tStart = this.t; - }else { - tStart = this.startPoint / this.length; - } - let tEnd = this.endPoint / this.length; - let animationDuration = (tEnd - tStart) * this.length * 1000 / this.speed; - - let progress = {t: tStart}; - this.tween = new TWEEN.Tween(progress).to({t: tEnd}, animationDuration); - this.tween.easing(TWEEN.Easing.Linear.None); - this.tween.onUpdate((e) => { - this.t = progress.t; - this.callback(progress.t); - }); - this.tween.onComplete(() => { - if(this.repeat){ - this.start(); - } - }); + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ - setTimeout(() => { - this.tween.start(); - }, 0); - } + function EventDispatcher$1() {} + + Object.assign( EventDispatcher$1.prototype, { + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + const listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; - stop(){ - if(!this.tween){ - return; } - this.tween.stop(); - this.tween = null; - this.t = 0; - } - pause(){ - if(!this.tween){ - return; + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + } - - this.tween.stop(); - TWEEN.remove(this.tween); - this.tween = null; - } - resume(){ - this.start(true); - } + }, - getPoint(t){ - return this.path.spline.getPoint(t); - } + hasEventListener: function ( type, listener ) { - } + if ( this._listeners === undefined ) return false; - class AnimationPath{ - constructor (points = []) { - this.points = points; - this.spline = new THREE.CatmullRomCurve3(points); - //this.spline.reparametrizeByArcLength(1 / this.spline.getLength().total); - } + const listeners = this._listeners; - get (t) { - return this.spline.getPoint(t); - } + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; - getLength () { - return this.spline.getLength(); - } + }, - animate (start, end, speed, callback) { - let animation = new PathAnimation(this, start, end, speed, callback); - animation.start(); + removeEventListener: function ( type, listener ) { - return animation; - } + if ( this._listeners === undefined ) return; - pause () { - if (this.tween) { - this.tween.stop(); - } - } + const listeners = this._listeners; + const listenerArray = listeners[ type ]; - resume () { - if (this.tween) { - this.tween.start(); - } - } + if ( listenerArray !== undefined ) { - getGeometry () { - let geometry = new THREE.Geometry(); + const index = listenerArray.indexOf( listener ); - let samples = 500; - let i = 0; - for (let u = 0; u <= 1; u += 1 / samples) { - let position = this.spline.getPoint(u); - geometry.vertices[i] = new THREE.Vector3(position.x, position.y, position.z); + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } - i++; } - if(this.closed){ - let position = this.spline.getPoint(0); - geometry.vertices[i] = new THREE.Vector3(position.x, position.y, position.z); + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + const listeners = this._listeners; + const listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + // Make a copy, in case listeners are removed while iterating. + const array = listenerArray.slice( 0 ); + + for ( let i = 0, l = array.length; i < l; i ++ ) { + + array[ i ].call( this, event ); + + } + } - return geometry; } - get closed(){ - return this.spline.closed; - } + } ); - set closed(value){ - this.spline.closed = value; - } + const _lut = []; + + for ( let i = 0; i < 256; i ++ ) { + + _lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 ); } - - /* - { - let target = new THREE.Vector3(589854.34, 231411.19, 692.77); - let points = [ - new THREE.Vector3(589815.52, 231738.31, 959.48 ), - new THREE.Vector3(589604.73, 231615.00, 968.10 ), - new THREE.Vector3(589579.11, 231354.41, 1010.06), - new THREE.Vector3(589723.00, 231169.95, 1015.57), - new THREE.Vector3(589960.76, 231116.87, 978.60 ), - new THREE.Vector3(590139.29, 231268.71, 972.33 ) - ]; - - let path = new Potree.AnimationPath(points); - - let geometry = path.getGeometry(); - let material = new THREE.LineBasicMaterial(); - let line = new THREE.Line(geometry, material); - viewer.scene.scene.add(line); - - let [start, end, speed] = [0, path.getLength(), 10]; - path.animate(start, end, speed, t => { - viewer.scene.view.position.copy(path.spline.getPoint(t)); - }); - - } - */ - const XHRFactory = { - config: { - withCredentials: false, - customHeaders: [ - { header: null, value: null } - ] + let _seed = 1234567; + + const MathUtils = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: function () { + + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 + + const d0 = Math.random() * 0xffffffff | 0; + const d1 = Math.random() * 0xffffffff | 0; + const d2 = Math.random() * 0xffffffff | 0; + const d3 = Math.random() * 0xffffffff | 0; + const uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' + + _lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' + + _lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] + + _lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ]; + + // .toUpperCase() here flattens concatenated strings to save heap memory space. + return uuid.toUpperCase(); + }, - createXMLHttpRequest: function () { - let xhr = new XMLHttpRequest(); + clamp: function ( value, min, max ) { - if (this.config.customHeaders && - Array.isArray(this.config.customHeaders) && - this.config.customHeaders.length > 0) { - let baseOpen = xhr.open; - let customHeaders = this.config.customHeaders; - xhr.open = function () { - baseOpen.apply(this, [].slice.call(arguments)); - customHeaders.forEach(function (customHeader) { - if (!!customHeader.header && !!customHeader.value) { - xhr.setRequestHeader(customHeader.header, customHeader.value); - } - }); - }; - } + return Math.max( min, Math.min( max, value ) ); - return xhr; - } - }; + }, - // /** - // * adapted from http://stemkoski.github.io/Three.js/Sprite-Text-Labels.html - // */ + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation - // let vs2D = ` - // // precision mediump float; - // // precision mediump int; + euclideanModulo: function ( n, m ) { - // // attribute vec3 position; - // // attribute vec4 color; - // // attribute vec2 uv; + return ( ( n % m ) + m ) % m; - // // uniform mat4 modelViewMatrix; - // // uniform mat4 projectionMatrix; - // // uniform mat3 uvTransform; + }, - // uniform vec2 uPosition; - // uniform vec2 uScale; + // Linear mapping from range to range - // varying vec2 vUv; + mapLinear: function ( x, a1, a2, b1, b2 ) { + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); - // void main(){ + }, - // vec2 pos = position.xy * uScale; + // https://en.wikipedia.org/wiki/Linear_interpolation - // gl_Position = vec4(pos, 0.0, 1.0); + lerp: function ( x, y, t ) { - // vUv = uv; + return ( 1 - t ) * x + t * y; + }, + // http://en.wikipedia.org/wiki/Smoothstep - // } + smoothstep: function ( x, min, max ) { - // `; + if ( x <= min ) return 0; + if ( x >= max ) return 1; - // let fs2D = ` - // precision mediump float; - // precision mediump int; + x = ( x - min ) / ( max - min ); - // uniform sampler2D map; + return x * x * ( 3 - 2 * x ); - // // varying vec3 vPosition; - // // varying vec4 vColor; - // varying vec2 vUv; + }, + smootherstep: function ( x, min, max ) { - // void main() { + if ( x <= min ) return 0; + if ( x >= max ) return 1; - // gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); + x = ( x - min ) / ( max - min ); - // gl_FragColor = vec4(vUv, 0.0, 1.0); + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); - // vec4 texelColor = texture2D( map, vUv ); - // //texelColor = mapTexelToLinear( texelColor ); + }, - // gl_FragColor = vec4(texelColor.xyz, 1.0); + // Random integer from interval + randInt: function ( low, high ) { - // } + return low + Math.floor( Math.random() * ( high - low + 1 ) ); - // `; + }, - // function getRawMaterial(map){ - // let material = new THREE.ShaderMaterial( { - // uniforms: { - // map: { type: "t", value: map }, - // uPosition: {type: "vec2", value: [0, 0]}, - // uScale: {type: "vec2", value: [1, 1]}, - // }, - // vertexShader: vs2D, - // fragmentShader: fs2D, - // side: THREE.DoubleSide, - // transparent: false, + // Random float from interval - // } ); + randFloat: function ( low, high ) { - // return material; - // } + return low + Math.random() * ( high - low ); + }, - class TextSprite extends THREE.Object3D{ - - constructor(text){ - super(); + // Random float from <-range/2, range/2> interval - let texture = new THREE.Texture(); - texture.minFilter = THREE.LinearFilter; - texture.magFilter = THREE.LinearFilter; - let spriteMaterial = new THREE.SpriteMaterial({ - map: texture, - depthTest: false, - depthWrite: false}); + randFloatSpread: function ( range ) { - this.texture = texture; + return range * ( 0.5 - Math.random() ); - this.material = spriteMaterial; - //this.material = getRawMaterial(texture); - this.sprite = new THREE.Sprite(this.material); - this.add(this.sprite); + }, - this.borderThickness = 4; - this.fontface = 'Arial'; - this.fontsize = 28; - this.borderColor = { r: 0, g: 0, b: 0, a: 1.0 }; - this.backgroundColor = { r: 255, g: 255, b: 255, a: 1.0 }; - this.textColor = {r: 255, g: 255, b: 255, a: 1.0}; - this.text = ''; + // Deterministic pseudo-random float in the interval [ 0, 1 ] - this.setText(text); - } + seededRandom: function ( s ) { - setText(text){ - if (this.text !== text){ - this.text = text; + if ( s !== undefined ) _seed = s % 2147483647; - this.update(); - } - } + // Park-Miller algorithm - setTextColor(color){ - this.textColor = color; + _seed = _seed * 16807 % 2147483647; - this.update(); - } + return ( _seed - 1 ) / 2147483646; - setBorderColor(color){ - this.borderColor = color; + }, - this.update(); - } + degToRad: function ( degrees ) { - setBackgroundColor(color){ - this.backgroundColor = color; + return degrees * MathUtils.DEG2RAD; - this.update(); - } + }, - update(){ - let canvas = document.createElement('canvas'); - let context = canvas.getContext('2d'); - context.font = 'Bold ' + this.fontsize + 'px ' + this.fontface; + radToDeg: function ( radians ) { - // get size data (height depends only on font size) - let metrics = context.measureText(this.text); - let textWidth = metrics.width; - let margin = 5; - let spriteWidth = 2 * margin + textWidth + 2 * this.borderThickness; - let spriteHeight = this.fontsize * 1.4 + 2 * this.borderThickness; + return radians * MathUtils.RAD2DEG; - context.canvas.width = spriteWidth; - context.canvas.height = spriteHeight; - context.font = 'Bold ' + this.fontsize + 'px ' + this.fontface; + }, - // background color - context.fillStyle = 'rgba(' + this.backgroundColor.r + ',' + this.backgroundColor.g + ',' + - this.backgroundColor.b + ',' + this.backgroundColor.a + ')'; - // border color - context.strokeStyle = 'rgba(' + this.borderColor.r + ',' + this.borderColor.g + ',' + - this.borderColor.b + ',' + this.borderColor.a + ')'; + isPowerOfTwo: function ( value ) { - context.lineWidth = this.borderThickness; - this.roundRect(context, this.borderThickness / 2, this.borderThickness / 2, - textWidth + this.borderThickness + 2 * margin, this.fontsize * 1.4 + this.borderThickness, 6); + return ( value & ( value - 1 ) ) === 0 && value !== 0; - // text color - context.strokeStyle = 'rgba(0, 0, 0, 1.0)'; - context.strokeText(this.text, this.borderThickness + margin, this.fontsize + this.borderThickness); + }, - context.fillStyle = 'rgba(' + this.textColor.r + ',' + this.textColor.g + ',' + - this.textColor.b + ',' + this.textColor.a + ')'; - context.fillText(this.text, this.borderThickness + margin, this.fontsize + this.borderThickness); + ceilPowerOfTwo: function ( value ) { - let texture = new THREE.Texture(canvas); - texture.minFilter = THREE.LinearFilter; - texture.magFilter = THREE.LinearFilter; - texture.needsUpdate = true; - //this.material.needsUpdate = true; + return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) ); - // { // screen-space sprite - // let [screenWidth, screenHeight] = [1620, 937]; + }, - // let uniforms = this.sprite.material.uniforms; - // let aspect = spriteHeight / spriteWidth; - // let factor = 0.5; + floorPowerOfTwo: function ( value ) { - // let w = spriteWidth / screenWidth; - // let h = spriteHeight / screenHeight; + return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) ); - // uniforms.uScale.value = [2 * w, 2 * h]; - // //uniforms.uScale.value = [factor * 1, factor * aspect]; - // this.sprite.material.uniforms.map.value = texture; - // } + }, - this.sprite.material.map = texture; - this.texture = texture; + setQuaternionFromProperEuler: function ( q, a, b, c, order ) { - this.sprite.scale.set(spriteWidth * 0.01, spriteHeight * 0.01, 1.0); - } + // Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles - roundRect(ctx, x, y, w, h, r){ - ctx.beginPath(); - ctx.moveTo(x + r, y); - ctx.lineTo(x + w - r, y); - ctx.quadraticCurveTo(x + w, y, x + w, y + r); - ctx.lineTo(x + w, y + h - r); - ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h); - ctx.lineTo(x + r, y + h); - ctx.quadraticCurveTo(x, y + h, x, y + h - r); - ctx.lineTo(x, y + r); - ctx.quadraticCurveTo(x, y, x + r, y); - ctx.closePath(); - ctx.fill(); - ctx.stroke(); - } + // rotations are applied to the axes in the order specified by 'order' + // rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c' + // angles are in radians - } + const cos = Math.cos; + const sin = Math.sin; - class Volume extends THREE.Object3D { - constructor (args = {}) { - super(); + const c2 = cos( b / 2 ); + const s2 = sin( b / 2 ); - if(this.constructor.name === "Volume"){ - console.warn("Can't create object of class Volume directly. Use classes BoxVolume or SphereVolume instead."); - } + const c13 = cos( ( a + c ) / 2 ); + const s13 = sin( ( a + c ) / 2 ); - //console.log(this); - //console.log(this.constructor); - //console.log(this.constructor.name); + const c1_3 = cos( ( a - c ) / 2 ); + const s1_3 = sin( ( a - c ) / 2 ); - this._clip = args.clip || false; - this._visible = true; - this.showVolumeLabel = true; - this._modifiable = args.modifiable || true; + const c3_1 = cos( ( c - a ) / 2 ); + const s3_1 = sin( ( c - a ) / 2 ); - this.label = new TextSprite('0'); - this.label.setBorderColor({r: 0, g: 255, b: 0, a: 0.0}); - this.label.setBackgroundColor({r: 0, g: 255, b: 0, a: 0.0}); - this.label.material.depthTest = false; - this.label.material.depthWrite = false; - this.label.material.transparent = true; - this.label.position.y -= 0.5; - this.add(this.label); + switch ( order ) { - this.label.updateMatrixWorld = () => { - let volumeWorldPos = new THREE.Vector3(); - volumeWorldPos.setFromMatrixPosition(this.matrixWorld); - this.label.position.copy(volumeWorldPos); - this.label.updateMatrix(); - this.label.matrixWorld.copy(this.label.matrix); - this.label.matrixWorldNeedsUpdate = false; + case 'XYX': + q.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 ); + break; - for (let i = 0, l = this.label.children.length; i < l; i++) { - this.label.children[ i ].updateMatrixWorld(true); - } - }; + case 'YZY': + q.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 ); + break; + + case 'ZXZ': + q.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 ); + break; + + case 'XZX': + q.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 ); + break; + + case 'YXY': + q.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 ); + break; + + case 'ZYZ': + q.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 ); + break; + + default: + console.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order ); - { // event listeners - this.addEventListener('select', e => {}); - this.addEventListener('deselect', e => {}); } } - get visible(){ - return this._visible; + }; + + class Vector2 { + + constructor( x = 0, y = 0 ) { + + Object.defineProperty( this, 'isVector2', { value: true } ); + + this.x = x; + this.y = y; + } - set visible(value){ - if(this._visible !== value){ - this._visible = value; + get width() { + + return this.x; - this.dispatchEvent({type: "visibility_changed", object: this}); - } } - getVolume () { - console.warn("override this in subclass"); + set width( value ) { + + this.x = value; + } - update () { - - }; + get height() { - raycast (raycaster, intersects) { + return this.y; } - get clip () { - return this._clip; + set height( value ) { + + this.y = value; + } - set clip (value) { + set( x, y ) { - if(this._clip !== value){ - this._clip = value; + this.x = x; + this.y = y; - this.update(); + return this; - this.dispatchEvent({ - type: "clip_changed", - object: this - }); - } - } - get modifieable () { - return this._modifiable; - } + setScalar( scalar ) { - set modifieable (value) { - this._modifiable = value; + this.x = scalar; + this.y = scalar; + + return this; - this.update(); } - }; + setX( x ) { - class BoxVolume extends Volume{ + this.x = x; - constructor(args = {}){ - super(args); + return this; - this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; - this.name = 'box_' + this.constructor.counter; + } - let boxGeometry = new THREE.BoxGeometry(1, 1, 1); - boxGeometry.computeBoundingBox(); + setY( y ) { - let boxFrameGeometry = new THREE.Geometry(); - { - let Vector3 = THREE.Vector3; + this.y = y; - boxFrameGeometry.vertices.push( + return this; - // bottom - new Vector3(-0.5, -0.5, 0.5), - new Vector3(0.5, -0.5, 0.5), - new Vector3(0.5, -0.5, 0.5), - new Vector3(0.5, -0.5, -0.5), - new Vector3(0.5, -0.5, -0.5), - new Vector3(-0.5, -0.5, -0.5), - new Vector3(-0.5, -0.5, -0.5), - new Vector3(-0.5, -0.5, 0.5), - // top - new Vector3(-0.5, 0.5, 0.5), - new Vector3(0.5, 0.5, 0.5), - new Vector3(0.5, 0.5, 0.5), - new Vector3(0.5, 0.5, -0.5), - new Vector3(0.5, 0.5, -0.5), - new Vector3(-0.5, 0.5, -0.5), - new Vector3(-0.5, 0.5, -0.5), - new Vector3(-0.5, 0.5, 0.5), - // sides - new Vector3(-0.5, -0.5, 0.5), - new Vector3(-0.5, 0.5, 0.5), - new Vector3(0.5, -0.5, 0.5), - new Vector3(0.5, 0.5, 0.5), - new Vector3(0.5, -0.5, -0.5), - new Vector3(0.5, 0.5, -0.5), - new Vector3(-0.5, -0.5, -0.5), - new Vector3(-0.5, 0.5, -0.5), + } - ); + setComponent( index, value ) { - } + switch ( index ) { - this.material = new THREE.MeshBasicMaterial({ - color: 0x00ff00, - transparent: true, - opacity: 0.3, - depthTest: true, - depthWrite: false}); - this.box = new THREE.Mesh(boxGeometry, this.material); - this.box.geometry.computeBoundingBox(); - this.boundingBox = this.box.geometry.boundingBox; - this.add(this.box); + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); - this.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: 0x000000})); - // this.frame.mode = THREE.Lines; - this.add(this.frame); + } + + return this; - this.update(); } - update(){ - this.boundingBox = this.box.geometry.boundingBox; - this.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere()); + getComponent( index ) { - if (this._clip) { - this.box.visible = false; - this.label.visible = false; - } else { - this.box.visible = true; - this.label.visible = this.showVolumeLabel; - } - } + switch ( index ) { - raycast (raycaster, intersects) { - let is = []; - this.box.raycast(raycaster, is); + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); - if (is.length > 0) { - let I = is[0]; - intersects.push({ - distance: I.distance, - object: this, - point: I.point.clone() - }); } + } - getVolume(){ - return Math.abs(this.scale.x * this.scale.y * this.scale.z); + clone() { + + return new this.constructor( this.x, this.y ); + } - }; + copy( v ) { - class SphereVolume extends Volume{ + this.x = v.x; + this.y = v.y; - constructor(args = {}){ - super(args); + return this; - this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; - this.name = 'sphere_' + this.constructor.counter; + } - let sphereGeometry = new THREE.SphereGeometry(1, 32, 32); - sphereGeometry.computeBoundingBox(); + add( v, w ) { - this.material = new THREE.MeshBasicMaterial({ - color: 0x00ff00, - transparent: true, - opacity: 0.3, - depthTest: true, - depthWrite: false}); - this.sphere = new THREE.Mesh(sphereGeometry, this.material); - this.sphere.visible = false; - this.sphere.geometry.computeBoundingBox(); - this.boundingBox = this.sphere.geometry.boundingBox; - this.add(this.sphere); + if ( w !== undefined ) { - this.label.visible = false; + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + } - let frameGeometry = new THREE.Geometry(); - { - let steps = 64; - let uSegments = 8; - let vSegments = 5; - let r = 1; + this.x += v.x; + this.y += v.y; - for(let uSegment = 0; uSegment < uSegments; uSegment++){ + return this; - let alpha = (uSegment / uSegments) * Math.PI * 2; - let dirx = Math.cos(alpha); - let diry = Math.sin(alpha); + } - for(let i = 0; i <= steps; i++){ - let v = (i / steps) * Math.PI * 2; - let vNext = v + 2 * Math.PI / steps; + addScalar( s ) { - let height = Math.sin(v); - let xyAmount = Math.cos(v); + this.x += s; + this.y += s; - let heightNext = Math.sin(vNext); - let xyAmountNext = Math.cos(vNext); + return this; - let vertex = new THREE.Vector3(dirx * xyAmount, diry * xyAmount, height); - frameGeometry.vertices.push(vertex); + } - let vertexNext = new THREE.Vector3(dirx * xyAmountNext, diry * xyAmountNext, heightNext); - frameGeometry.vertices.push(vertexNext); - } - } + addVectors( a, b ) { - // creates rings at poles, just because it's easier to implement - for(let vSegment = 0; vSegment <= vSegments + 1; vSegment++){ + this.x = a.x + b.x; + this.y = a.y + b.y; - //let height = (vSegment / (vSegments + 1)) * 2 - 1; // -1 to 1 - let uh = (vSegment / (vSegments + 1)); // -1 to 1 - uh = (1 - uh) * (-Math.PI / 2) + uh *(Math.PI / 2); - let height = Math.sin(uh); + return this; - console.log(uh, height); + } - for(let i = 0; i <= steps; i++){ - let u = (i / steps) * Math.PI * 2; - let uNext = u + 2 * Math.PI / steps; + addScaledVector( v, s ) { - let dirx = Math.cos(u); - let diry = Math.sin(u); + this.x += v.x * s; + this.y += v.y * s; - let dirxNext = Math.cos(uNext); - let diryNext = Math.sin(uNext); + return this; - let xyAmount = Math.sqrt(1 - height * height); + } - let vertex = new THREE.Vector3(dirx * xyAmount, diry * xyAmount, height); - frameGeometry.vertices.push(vertex); + sub( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); - let vertexNext = new THREE.Vector3(dirxNext * xyAmount, diryNext * xyAmount, height); - frameGeometry.vertices.push(vertexNext); - } - } } - this.frame = new THREE.LineSegments(frameGeometry, new THREE.LineBasicMaterial({color: 0x000000})); - this.add(this.frame); + this.x -= v.x; + this.y -= v.y; - let frameMaterial = new THREE.MeshBasicMaterial({wireframe: true, color: 0x000000}); - this.frame = new THREE.Mesh(sphereGeometry, frameMaterial); - //this.add(this.frame); + return this; - //this.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: 0x000000})); - // this.frame.mode = THREE.Lines; - //this.add(this.frame); + } - this.update(); - } + subScalar( s ) { - update(){ - this.boundingBox = this.sphere.geometry.boundingBox; - this.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere()); + this.x -= s; + this.y -= s; + + return this; - //if (this._clip) { - // this.sphere.visible = false; - // this.label.visible = false; - //} else { - // this.sphere.visible = true; - // this.label.visible = this.showVolumeLabel; - //} } - raycast (raycaster, intersects) { - let is = []; - this.sphere.raycast(raycaster, is); + subVectors( a, b ) { - if (is.length > 0) { - let I = is[0]; - intersects.push({ - distance: I.distance, - object: this, - point: I.point.clone() - }); - } - } - - // see https://en.wikipedia.org/wiki/Ellipsoid#Volume - getVolume(){ - return (4 / 3) * Math.PI * this.scale.x * this.scale.y * this.scale.z; - } + this.x = a.x - b.x; + this.y = a.y - b.y; - }; + return this; - class Profile extends THREE.Object3D{ + } - constructor () { - super(); + multiply( v ) { - this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; + this.x *= v.x; + this.y *= v.y; - this.name = 'Profile_' + this.constructor.counter; - this.points = []; - this.spheres = []; - this.edges = []; - this.boxes = []; - this.width = 1; - this.height = 20; - this._modifiable = true; + return this; - this.sphereGeometry = new THREE.SphereGeometry(0.4, 10, 10); - this.color = new THREE.Color(0xff0000); - this.lineColor = new THREE.Color(0xff0000); } - createSphereMaterial () { - let sphereMaterial = new THREE.MeshLambertMaterial({ - //shading: THREE.SmoothShading, - color: 0xff0000, - depthTest: false, - depthWrite: false} - ); + multiplyScalar( scalar ) { - return sphereMaterial; - }; + this.x *= scalar; + this.y *= scalar; - getSegments () { - let segments = []; + return this; - for (let i = 0; i < this.points.length - 1; i++) { - let start = this.points[i].clone(); - let end = this.points[i + 1].clone(); - segments.push({start: start, end: end}); - } + } + + divide( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; - return segments; } - getSegmentMatrices () { - let segments = this.getSegments(); - let matrices = []; + divideScalar( scalar ) { - for (let segment of segments) { - let {start, end} = segment; + return this.multiplyScalar( 1 / scalar ); - let box = new THREE.Object3D(); + } - let length = start.clone().setZ(0).distanceTo(end.clone().setZ(0)); - box.scale.set(length, 10000, this.width); - box.up.set(0, 0, 1); + applyMatrix3( m ) { - let center = new THREE.Vector3().addVectors(start, end).multiplyScalar(0.5); - let diff = new THREE.Vector3().subVectors(end, start); - let target = new THREE.Vector3(diff.y, -diff.x, 0); + const x = this.x, y = this.y; + const e = m.elements; - box.position.set(0, 0, 0); - box.lookAt(target); - box.position.copy(center); + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ]; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ]; - box.updateMatrixWorld(); - matrices.push(box.matrixWorld); - } + return this; - return matrices; } - addMarker (point) { - this.points.push(point); - - let sphere = new THREE.Mesh(this.sphereGeometry, this.createSphereMaterial()); + min( v ) { - this.add(sphere); - this.spheres.push(sphere); + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); - // edges & boxes - if (this.points.length > 1) { - let lineGeometry = new THREE.Geometry(); - lineGeometry.vertices.push(new THREE.Vector3(), new THREE.Vector3()); - lineGeometry.colors.push(this.lineColor, this.lineColor, this.lineColor); - let lineMaterial = new THREE.LineBasicMaterial({ - vertexColors: THREE.VertexColors, - linewidth: 2, - transparent: true, - opacity: 0.4 - }); - lineMaterial.depthTest = false; - let edge = new THREE.Line(lineGeometry, lineMaterial); - edge.visible = false; + return this; - this.add(edge); - this.edges.push(edge); + } - let boxGeometry = new THREE.BoxGeometry(1, 1, 1); - let boxMaterial = new THREE.MeshBasicMaterial({color: 0xff0000, transparent: true, opacity: 0.2}); - let box = new THREE.Mesh(boxGeometry, boxMaterial); - box.visible = false; + max( v ) { - this.add(box); - this.boxes.push(box); - } + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); - { // event listeners - let drag = (e) => { - let I = Utils.getMousePointCloudIntersection( - e.drag.end, - e.viewer.scene.getActiveCamera(), - e.viewer, - e.viewer.scene.pointclouds); + return this; - if (I) { - let i = this.spheres.indexOf(e.drag.object); - if (i !== -1) { - this.setPosition(i, I.location); - //this.dispatchEvent({ - // 'type': 'marker_moved', - // 'profile': this, - // 'index': i - //}); - } - } - }; + } - let drop = e => { - let i = this.spheres.indexOf(e.drag.object); - if (i !== -1) { - this.dispatchEvent({ - 'type': 'marker_dropped', - 'profile': this, - 'index': i - }); - } - }; + clamp( min, max ) { - let mouseover = (e) => e.object.material.emissive.setHex(0x888888); - let mouseleave = (e) => e.object.material.emissive.setHex(0x000000); + // assumes min < max, componentwise - sphere.addEventListener('drag', drag); - sphere.addEventListener('drop', drop); - sphere.addEventListener('mouseover', mouseover); - sphere.addEventListener('mouseleave', mouseleave); - } + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); - let event = { - type: 'marker_added', - profile: this, - sphere: sphere - }; - this.dispatchEvent(event); + return this; - this.setPosition(this.points.length - 1, point); } - removeMarker (index) { - this.points.splice(index, 1); + clampScalar( minVal, maxVal ) { - this.remove(this.spheres[index]); + this.x = Math.max( minVal, Math.min( maxVal, this.x ) ); + this.y = Math.max( minVal, Math.min( maxVal, this.y ) ); - let edgeIndex = (index === 0) ? 0 : (index - 1); - this.remove(this.edges[edgeIndex]); - this.edges.splice(edgeIndex, 1); - this.remove(this.boxes[edgeIndex]); - this.boxes.splice(edgeIndex, 1); + return this; - this.spheres.splice(index, 1); + } - this.update(); + clampLength( min, max ) { + + const length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); - this.dispatchEvent({ - 'type': 'marker_removed', - 'profile': this - }); } - setPosition (index, position) { - let point = this.points[index]; - point.copy(position); + floor() { - let event = { - type: 'marker_moved', - profile: this, - index: index, - position: point.clone() - }; - this.dispatchEvent(event); + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; - this.update(); } - setWidth (width) { - this.width = width; + ceil() { - let event = { - type: 'width_changed', - profile: this, - width: width - }; - this.dispatchEvent(event); + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); - this.update(); - } + return this; - getWidth () { - return this.width; } - update () { - if (this.points.length === 0) { - return; - } else if (this.points.length === 1) { - let point = this.points[0]; - this.spheres[0].position.copy(point); + round() { - return; - } + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); - let min = this.points[0].clone(); - let max = this.points[0].clone(); - let centroid = new THREE.Vector3(); - let lastIndex = this.points.length - 1; - for (let i = 0; i <= lastIndex; i++) { - let point = this.points[i]; - let sphere = this.spheres[i]; - let leftIndex = (i === 0) ? lastIndex : i - 1; - // let rightIndex = (i === lastIndex) ? 0 : i + 1; - let leftVertex = this.points[leftIndex]; - // let rightVertex = this.points[rightIndex]; - let leftEdge = this.edges[leftIndex]; - let rightEdge = this.edges[i]; - let leftBox = this.boxes[leftIndex]; - // rightBox = this.boxes[i]; + return this; - // let leftEdgeLength = point.distanceTo(leftVertex); - // let rightEdgeLength = point.distanceTo(rightVertex); - // let leftEdgeCenter = new THREE.Vector3().addVectors(leftVertex, point).multiplyScalar(0.5); - // let rightEdgeCenter = new THREE.Vector3().addVectors(point, rightVertex).multiplyScalar(0.5); + } - sphere.position.copy(point); + roundToZero() { - if (this._modifiable) { - sphere.visible = true; - } else { - sphere.visible = false; - } + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); - if (leftEdge) { - leftEdge.geometry.vertices[1].copy(point); - leftEdge.geometry.verticesNeedUpdate = true; - leftEdge.geometry.computeBoundingSphere(); - } + return this; - if (rightEdge) { - rightEdge.geometry.vertices[0].copy(point); - rightEdge.geometry.verticesNeedUpdate = true; - rightEdge.geometry.computeBoundingSphere(); - } + } - if (leftBox) { - let start = leftVertex; - let end = point; - let length = start.clone().setZ(0).distanceTo(end.clone().setZ(0)); - leftBox.scale.set(length, 1000000, this.width); - leftBox.up.set(0, 0, 1); + negate() { - let center = new THREE.Vector3().addVectors(start, end).multiplyScalar(0.5); - let diff = new THREE.Vector3().subVectors(end, start); - let target = new THREE.Vector3(diff.y, -diff.x, 0); + this.x = - this.x; + this.y = - this.y; - leftBox.position.set(0, 0, 0); - leftBox.lookAt(target); - leftBox.position.copy(center); - } + return this; - centroid.add(point); - min.min(point); - max.max(point); - } - centroid.multiplyScalar(1 / this.points.length); + } - for (let i = 0; i < this.boxes.length; i++) { - let box = this.boxes[i]; + dot( v ) { - box.position.z = min.z + (max.z - min.z) / 2; - } - } + return this.x * v.x + this.y * v.y; - raycast (raycaster, intersects) { - for (let i = 0; i < this.points.length; i++) { - let sphere = this.spheres[i]; + } - sphere.raycast(raycaster, intersects); - } + cross( v ) { - // recalculate distances because they are not necessarely correct - // for scaled objects. - // see https://github.com/mrdoob/three.js/issues/5827 - // TODO: remove this once the bug has been fixed - for (let i = 0; i < intersects.length; i++) { - let I = intersects[i]; - I.distance = raycaster.ray.origin.distanceTo(I.point); - } - intersects.sort(function (a, b) { return a.distance - b.distance; }); - }; + return this.x * v.y - this.y * v.x; - get modifiable () { - return this._modifiable; } - set modifiable (value) { - this._modifiable = value; - this.update(); + lengthSq() { + + return this.x * this.x + this.y * this.y; + } - } + length() { - function createHeightLine(){ - let lineGeometry = new THREE.LineGeometry(); + return Math.sqrt( this.x * this.x + this.y * this.y ); - lineGeometry.setPositions([ - 0, 0, 0, - 0, 0, 0, - ]); + } - let lineMaterial = new THREE.LineMaterial({ - color: 0x00ff00, - dashSize: 5, - gapSize: 2, - linewidth: 2, - resolution: new THREE.Vector2(1000, 1000), - }); + manhattanLength() { - lineMaterial.depthTest = false; - const heightEdge = new THREE.Line2(lineGeometry, lineMaterial); - heightEdge.visible = false; + return Math.abs( this.x ) + Math.abs( this.y ); - //this.add(this.heightEdge); - - return heightEdge; - } + } - function createHeightLabel(){ - const heightLabel = new TextSprite(''); + normalize() { - heightLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0}); - heightLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); - heightLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); - heightLabel.fontsize = 16; - heightLabel.material.depthTest = false; - heightLabel.material.opacity = 1; - heightLabel.visible = false; + return this.divideScalar( this.length() || 1 ); - return heightLabel; - } + } - function createAreaLabel(){ - const areaLabel = new TextSprite(''); + angle() { - areaLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0}); - areaLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); - areaLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); - areaLabel.fontsize = 16; - areaLabel.material.depthTest = false; - areaLabel.material.opacity = 1; - areaLabel.visible = false; - - return areaLabel; - } + // computes the angle in radians with respect to the positive x-axis - function createCircleRadiusLabel(){ - const circleRadiusLabel = new TextSprite(""); + const angle = Math.atan2( - this.y, - this.x ) + Math.PI; - circleRadiusLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0}); - circleRadiusLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); - circleRadiusLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); - circleRadiusLabel.fontsize = 16; - circleRadiusLabel.material.depthTest = false; - circleRadiusLabel.material.opacity = 1; - circleRadiusLabel.visible = false; - - return circleRadiusLabel; - } + return angle; - function createCircleRadiusLine(){ - const lineGeometry = new THREE.LineGeometry(); + } - lineGeometry.setPositions([ - 0, 0, 0, - 0, 0, 0, - ]); + distanceTo( v ) { - const lineMaterial = new THREE.LineMaterial({ - color: 0xff0000, - linewidth: 2, - resolution: new THREE.Vector2(1000, 1000), - gapSize: 1, - dashed: true, - }); + return Math.sqrt( this.distanceToSquared( v ) ); - lineMaterial.depthTest = false; + } - const circleRadiusLine = new THREE.Line2(lineGeometry, lineMaterial); - circleRadiusLine.visible = false; + distanceToSquared( v ) { - return circleRadiusLine; - } + const dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; - function createCircleLine(){ - const coordinates = []; + } - let n = 128; - for(let i = 0; i <= n; i++){ - let u0 = 2 * Math.PI * (i / n); - let u1 = 2 * Math.PI * (i + 1) / n; + manhattanDistanceTo( v ) { - let p0 = new THREE.Vector3( - Math.cos(u0), - Math.sin(u0), - 0 - ); + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); - let p1 = new THREE.Vector3( - Math.cos(u1), - Math.sin(u1), - 0 - ); + } + + setLength( length ) { + + return this.normalize().multiplyScalar( length ); - coordinates.push( - ...p0.toArray(), - ...p1.toArray(), - ); } - const geometry = new THREE.LineGeometry(); - geometry.setPositions(coordinates); + lerp( v, alpha ) { - const material = new THREE.LineMaterial({ - color: 0xff0000, - dashSize: 5, - gapSize: 2, - linewidth: 2, - resolution: new THREE.Vector2(1000, 1000), - }); + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; - material.depthTest = false; + return this; - const circleLine = new THREE.Line2(geometry, material); - circleLine.visible = false; - circleLine.computeLineDistances(); + } - return circleLine; - } + lerpVectors( v1, v2, alpha ) { - function createCircleCenter(){ - const sg = new THREE.SphereGeometry(1, 32, 32); - const sm = new THREE.MeshNormalMaterial(); - - const circleCenter = new THREE.Mesh(sg, sm); - circleCenter.visible = false; + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; - return circleCenter; - } + return this; - function createLine(){ - const geometry = new THREE.LineGeometry(); + } - geometry.setPositions([ - 0, 0, 0, - 0, 0, 0, - ]); + equals( v ) { - const material = new THREE.LineMaterial({ - color: 0xff0000, - linewidth: 2, - resolution: new THREE.Vector2(1000, 1000), - gapSize: 1, - dashed: true, - }); + return ( ( v.x === this.x ) && ( v.y === this.y ) ); - material.depthTest = false; + } - const line = new THREE.Line2(geometry, material); + fromArray( array, offset = 0 ) { - return line; - } + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; - function createCircle(){ + return this; - const coordinates = []; + } - let n = 128; - for(let i = 0; i <= n; i++){ - let u0 = 2 * Math.PI * (i / n); - let u1 = 2 * Math.PI * (i + 1) / n; + toArray( array = [], offset = 0 ) { - let p0 = new THREE.Vector3( - Math.cos(u0), - Math.sin(u0), - 0 - ); + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; - let p1 = new THREE.Vector3( - Math.cos(u1), - Math.sin(u1), - 0 - ); + return array; - coordinates.push( - ...p0.toArray(), - ...p1.toArray(), - ); } - const geometry = new THREE.LineGeometry(); - geometry.setPositions(coordinates); + fromBufferAttribute( attribute, index, offset ) { - const material = new THREE.LineMaterial({ - color: 0xff0000, - dashSize: 5, - gapSize: 2, - linewidth: 2, - resolution: new THREE.Vector2(1000, 1000), - }); + if ( offset !== undefined ) { - material.depthTest = false; + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); - const line = new THREE.Line2(geometry, material); - line.computeLineDistances(); + } - return line; + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); - } + return this; - function createAzimuth(){ + } - const azimuth = { - label: null, - center: null, - target: null, - north: null, - centerToNorth: null, - centerToTarget: null, - centerToTargetground: null, - targetgroundToTarget: null, - circle: null, + rotateAround( center, angle ) { - node: null, - }; + const c = Math.cos( angle ), s = Math.sin( angle ); - const sg = new THREE.SphereGeometry(1, 32, 32); - const sm = new THREE.MeshNormalMaterial(); + const x = this.x - center.x; + const y = this.y - center.y; - { - const label = new TextSprite(""); + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; - label.setTextColor({r: 140, g: 250, b: 140, a: 1.0}); - label.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); - label.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); - label.fontsize = 16; - label.material.depthTest = false; - label.material.opacity = 1; + return this; - azimuth.label = label; } - azimuth.center = new THREE.Mesh(sg, sm); - azimuth.target = new THREE.Mesh(sg, sm); - azimuth.north = new THREE.Mesh(sg, sm); - azimuth.centerToNorth = createLine(); - azimuth.centerToTarget = createLine(); - azimuth.centerToTargetground = createLine(); - azimuth.targetgroundToTarget = createLine(); - azimuth.circle = createCircle(); + random() { - azimuth.node = new THREE.Object3D(); - azimuth.node.add( - azimuth.centerToNorth, - azimuth.centerToTarget, - azimuth.centerToTargetground, - azimuth.targetgroundToTarget, - azimuth.circle, - azimuth.label, - azimuth.center, - azimuth.target, - azimuth.north, - ); + this.x = Math.random(); + this.y = Math.random(); + + return this; + + } - return azimuth; } - class Measure extends THREE.Object3D { - constructor () { - super(); + class Matrix3 { - this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; + constructor() { - this.name = 'Measure_' + this.constructor.counter; - this.points = []; - this._showDistances = true; - this._showCoordinates = false; - this._showArea = false; - this._closed = true; - this._showAngles = false; - this._showCircle = false; - this._showHeight = false; - this._showEdges = true; - this._showAzimuth = false; - this.maxMarkers = Number.MAX_SAFE_INTEGER; + Object.defineProperty( this, 'isMatrix3', { value: true } ); - this.sphereGeometry = new THREE.SphereGeometry(0.4, 10, 10); - this.color = new THREE.Color(0xff0000); + this.elements = [ - this.spheres = []; - this.edges = []; - this.sphereLabels = []; - this.edgeLabels = []; - this.angleLabels = []; - this.coordinateLabels = []; + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 - this.heightEdge = createHeightLine(); - this.heightLabel = createHeightLabel(); - this.areaLabel = createAreaLabel(); - this.circleRadiusLabel = createCircleRadiusLabel(); - this.circleRadiusLine = createCircleRadiusLine(); - this.circleLine = createCircleLine(); - this.circleCenter = createCircleCenter(); + ]; - this.azimuth = createAzimuth(); + if ( arguments.length > 0 ) { - this.add(this.heightEdge); - this.add(this.heightLabel); - this.add(this.areaLabel); - this.add(this.circleRadiusLabel); - this.add(this.circleRadiusLine); - this.add(this.circleLine); - this.add(this.circleCenter); + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); - this.add(this.azimuth.node); + } } - createSphereMaterial () { - let sphereMaterial = new THREE.MeshLambertMaterial({ - //shading: THREE.SmoothShading, - color: this.color, - depthTest: false, - depthWrite: false} - ); + set( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { - return sphereMaterial; - }; + const te = this.elements; - addMarker (point) { - if (point instanceof THREE.Vector3) { - point = {position: point}; - }else if(point instanceof Array){ - point = {position: new THREE.Vector3(...point)}; - } - this.points.push(point); + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; - // sphere - let sphere = new THREE.Mesh(this.sphereGeometry, this.createSphereMaterial()); + return this; - this.add(sphere); - this.spheres.push(sphere); + } - { // edges - let lineGeometry = new THREE.LineGeometry(); - lineGeometry.setPositions( [ - 0, 0, 0, - 0, 0, 0, - ]); + identity() { - let lineMaterial = new THREE.LineMaterial({ - color: 0xff0000, - linewidth: 2, - resolution: new THREE.Vector2(1000, 1000), - }); + this.set( - lineMaterial.depthTest = false; + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 - let edge = new THREE.Line2(lineGeometry, lineMaterial); - edge.visible = true; + ); - this.add(edge); - this.edges.push(edge); - } + return this; - { // edge labels - let edgeLabel = new TextSprite(); - edgeLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); - edgeLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); - edgeLabel.material.depthTest = false; - edgeLabel.visible = false; - edgeLabel.fontsize = 16; - this.edgeLabels.push(edgeLabel); - this.add(edgeLabel); - } + } - { // angle labels - let angleLabel = new TextSprite(); - angleLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); - angleLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); - angleLabel.fontsize = 16; - angleLabel.material.depthTest = false; - angleLabel.material.opacity = 1; - angleLabel.visible = false; - this.angleLabels.push(angleLabel); - this.add(angleLabel); - } + clone() { - { // coordinate labels - let coordinateLabel = new TextSprite(); - coordinateLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); - coordinateLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); - coordinateLabel.fontsize = 16; - coordinateLabel.material.depthTest = false; - coordinateLabel.material.opacity = 1; - coordinateLabel.visible = false; - this.coordinateLabels.push(coordinateLabel); - this.add(coordinateLabel); - } + return new this.constructor().fromArray( this.elements ); - { // Event Listeners - let drag = (e) => { - let I = Utils.getMousePointCloudIntersection( - e.drag.end, - e.viewer.scene.getActiveCamera(), - e.viewer, - e.viewer.scene.pointclouds, - {pickClipped: true}); + } - if (I) { - let i = this.spheres.indexOf(e.drag.object); - if (i !== -1) { - let point = this.points[i]; - for (let key of Object.keys(I.point).filter(e => e !== 'position')) { - point[key] = I.point[key]; - } + copy( m ) { - this.setPosition(i, I.location); - } - } - }; + const te = this.elements; + const me = m.elements; - let drop = e => { - let i = this.spheres.indexOf(e.drag.object); - if (i !== -1) { - this.dispatchEvent({ - 'type': 'marker_dropped', - 'measurement': this, - 'index': i - }); - } - }; + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; + te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; + te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; - let mouseover = (e) => e.object.material.emissive.setHex(0x888888); - let mouseleave = (e) => e.object.material.emissive.setHex(0x000000); + return this; - sphere.addEventListener('drag', drag); - sphere.addEventListener('drop', drop); - sphere.addEventListener('mouseover', mouseover); - sphere.addEventListener('mouseleave', mouseleave); - } + } - let event = { - type: 'marker_added', - measurement: this, - sphere: sphere - }; - this.dispatchEvent(event); + extractBasis( xAxis, yAxis, zAxis ) { - this.setMarker(this.points.length - 1, point); - }; + xAxis.setFromMatrix3Column( this, 0 ); + yAxis.setFromMatrix3Column( this, 1 ); + zAxis.setFromMatrix3Column( this, 2 ); - removeMarker (index) { - this.points.splice(index, 1); + return this; - this.remove(this.spheres[index]); + } - let edgeIndex = (index === 0) ? 0 : (index - 1); - this.remove(this.edges[edgeIndex]); - this.edges.splice(edgeIndex, 1); + setFromMatrix4( m ) { - this.remove(this.edgeLabels[edgeIndex]); - this.edgeLabels.splice(edgeIndex, 1); - this.coordinateLabels.splice(index, 1); + const me = m.elements; - this.remove(this.angleLabels[index]); - this.angleLabels.splice(index, 1); + this.set( - this.spheres.splice(index, 1); + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] - this.update(); + ); - this.dispatchEvent({type: 'marker_removed', measurement: this}); - }; + return this; - setMarker (index, point) { - this.points[index] = point; + } - let event = { - type: 'marker_moved', - measure: this, - index: index, - position: point.position.clone() - }; - this.dispatchEvent(event); + multiply( m ) { - this.update(); - } + return this.multiplyMatrices( this, m ); - setPosition (index, position) { - let point = this.points[index]; - point.position.copy(position); + } - let event = { - type: 'marker_moved', - measure: this, - index: index, - position: position.clone() - }; - this.dispatchEvent(event); + premultiply( m ) { - this.update(); - }; + return this.multiplyMatrices( m, this ); - getArea () { - let area = 0; - let j = this.points.length - 1; + } - for (let i = 0; i < this.points.length; i++) { - let p1 = this.points[i].position; - let p2 = this.points[j].position; - area += (p2.x + p1.x) * (p1.y - p2.y); - j = i; - } + multiplyMatrices( a, b ) { - return Math.abs(area / 2); - }; + const ae = a.elements; + const be = b.elements; + const te = this.elements; - getTotalDistance () { - if (this.points.length === 0) { - return 0; - } + const a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + const a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + const a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; - let distance = 0; + const b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + const b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + const b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ]; - for (let i = 1; i < this.points.length; i++) { - let prev = this.points[i - 1].position; - let curr = this.points[i].position; - let d = prev.distanceTo(curr); + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31; + te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32; + te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33; - distance += d; - } + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31; + te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32; + te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33; - if (this.closed && this.points.length > 1) { - let first = this.points[0].position; - let last = this.points[this.points.length - 1].position; - let d = last.distanceTo(first); + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31; + te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32; + te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33; - distance += d; - } + return this; - return distance; } - getAngleBetweenLines (cornerPoint, point1, point2) { - let v1 = new THREE.Vector3().subVectors(point1.position, cornerPoint.position); - let v2 = new THREE.Vector3().subVectors(point2.position, cornerPoint.position); + multiplyScalar( s ) { - // avoid the error printed by threejs if denominator is 0 - const denominator = Math.sqrt( v1.lengthSq() * v2.lengthSq() ); - if(denominator === 0){ - return 0; - }else { - return v1.angleTo(v2); - } - }; + const te = this.elements; - getAngle (index) { - if (this.points.length < 3 || index >= this.points.length) { - return 0; - } + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; - let previous = (index === 0) ? this.points[this.points.length - 1] : this.points[index - 1]; - let point = this.points[index]; - let next = this.points[(index + 1) % (this.points.length)]; + return this; - return this.getAngleBetweenLines(point, previous, next); } - // updateAzimuth(){ - // // if(this.points.length !== 2){ - // // return; - // // } - - // // const azimuth = this.azimuth; + determinant() { - // // const [p0, p1] = this.points; + const te = this.elements; - // // const r = p0.position.distanceTo(p1.position); - - // } + const a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; - update () { - if (this.points.length === 0) { - return; - } else if (this.points.length === 1) { - let point = this.points[0]; - let position = point.position; - this.spheres[0].position.copy(position); + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; - { // coordinate labels - let coordinateLabel = this.coordinateLabels[0]; - - let msg = position.toArray().map(p => Utils.addCommas(p.toFixed(2))).join(" / "); - coordinateLabel.setText(msg); + } - coordinateLabel.visible = this.showCoordinates; - } + invert() { - return; - } + const te = this.elements, - let lastIndex = this.points.length - 1; + n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], + n12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ], + n13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ], - let centroid = new THREE.Vector3(); - for (let i = 0; i <= lastIndex; i++) { - let point = this.points[i]; - centroid.add(point.position); - } - centroid.divideScalar(this.points.length); + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, - for (let i = 0; i <= lastIndex; i++) { - let index = i; - let nextIndex = (i + 1 > lastIndex) ? 0 : i + 1; - let previousIndex = (i === 0) ? lastIndex : i - 1; + det = n11 * t11 + n21 * t12 + n31 * t13; - let point = this.points[index]; - let nextPoint = this.points[nextIndex]; - let previousPoint = this.points[previousIndex]; + if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 ); - let sphere = this.spheres[index]; + const detInv = 1 / det; - // spheres - sphere.position.copy(point.position); - sphere.material.color = this.color; + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; - { // edges - let edge = this.edges[index]; + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; - edge.material.color = this.color; + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; - edge.position.copy(point.position); + return this; - edge.geometry.setPositions([ - 0, 0, 0, - ...nextPoint.position.clone().sub(point.position).toArray(), - ]); + } - edge.geometry.verticesNeedUpdate = true; - edge.geometry.computeBoundingSphere(); - edge.computeLineDistances(); - edge.visible = index < lastIndex || this.closed; - - if(!this.showEdges){ - edge.visible = false; - } - } + transpose() { - { // edge labels - let edgeLabel = this.edgeLabels[i]; + let tmp; + const m = this.elements; - let center = new THREE.Vector3().add(point.position); - center.add(nextPoint.position); - center = center.multiplyScalar(0.5); - let distance = point.position.distanceTo(nextPoint.position); + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; - edgeLabel.position.copy(center); + return this; - let suffix = ""; - if(this.lengthUnit != null && this.lengthUnitDisplay != null){ - distance = distance / this.lengthUnit.unitspermeter * this.lengthUnitDisplay.unitspermeter; //convert to meters then to the display unit - suffix = this.lengthUnitDisplay.code; - } + } - let txtLength = Utils.addCommas(distance.toFixed(2)); - edgeLabel.setText(`${txtLength} ${suffix}`); - edgeLabel.visible = this.showDistances && (index < lastIndex || this.closed) && this.points.length >= 2 && distance > 0; - } + getNormalMatrix( matrix4 ) { - { // angle labels - let angleLabel = this.angleLabels[i]; - let angle = this.getAngleBetweenLines(point, previousPoint, nextPoint); + return this.setFromMatrix4( matrix4 ).copy( this ).invert().transpose(); - let dir = nextPoint.position.clone().sub(previousPoint.position); - dir.multiplyScalar(0.5); - dir = previousPoint.position.clone().add(dir).sub(point.position).normalize(); + } - let dist = Math.min(point.position.distanceTo(previousPoint.position), point.position.distanceTo(nextPoint.position)); - dist = dist / 9; + transposeIntoArray( r ) { - let labelPos = point.position.clone().add(dir.multiplyScalar(dist)); - angleLabel.position.copy(labelPos); + const m = this.elements; - let msg = Utils.addCommas((angle * (180.0 / Math.PI)).toFixed(1)) + '\u00B0'; - angleLabel.setText(msg); + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; - angleLabel.visible = this.showAngles && (index < lastIndex || this.closed) && this.points.length >= 3 && angle > 0; - } - } + return this; - { // update height stuff - let heightEdge = this.heightEdge; - heightEdge.visible = this.showHeight; - this.heightLabel.visible = this.showHeight; + } - if (this.showHeight) { - let sorted = this.points.slice().sort((a, b) => a.position.z - b.position.z); - let lowPoint = sorted[0].position.clone(); - let highPoint = sorted[sorted.length - 1].position.clone(); - let min = lowPoint.z; - let max = highPoint.z; - let height = max - min; + setUvTransform( tx, ty, sx, sy, rotation, cx, cy ) { - let start = new THREE.Vector3(highPoint.x, highPoint.y, min); - let end = new THREE.Vector3(highPoint.x, highPoint.y, max); + const c = Math.cos( rotation ); + const s = Math.sin( rotation ); - heightEdge.position.copy(lowPoint); + this.set( + sx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx, + - sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty, + 0, 0, 1 + ); - heightEdge.geometry.setPositions([ - 0, 0, 0, - ...start.clone().sub(lowPoint).toArray(), - ...start.clone().sub(lowPoint).toArray(), - ...end.clone().sub(lowPoint).toArray(), - ]); + return this; - heightEdge.geometry.verticesNeedUpdate = true; - // heightEdge.geometry.computeLineDistances(); - // heightEdge.geometry.lineDistancesNeedUpdate = true; - heightEdge.geometry.computeBoundingSphere(); - heightEdge.computeLineDistances(); + } - // heightEdge.material.dashSize = height / 40; - // heightEdge.material.gapSize = height / 40; + scale( sx, sy ) { - let heightLabelPosition = start.clone().add(end).multiplyScalar(0.5); - this.heightLabel.position.copy(heightLabelPosition); + const te = this.elements; - let suffix = ""; - if(this.lengthUnit != null && this.lengthUnitDisplay != null){ - height = height / this.lengthUnit.unitspermeter * this.lengthUnitDisplay.unitspermeter; //convert to meters then to the display unit - suffix = this.lengthUnitDisplay.code; - } + te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx; + te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy; - let txtHeight = Utils.addCommas(height.toFixed(2)); - let msg = `${txtHeight} ${suffix}`; - this.heightLabel.setText(msg); - } - } + return this; - { // update circle stuff - const circleRadiusLabel = this.circleRadiusLabel; - const circleRadiusLine = this.circleRadiusLine; - const circleLine = this.circleLine; - const circleCenter = this.circleCenter; + } - const circleOkay = this.points.length === 3; + rotate( theta ) { - circleRadiusLabel.visible = this.showCircle && circleOkay; - circleRadiusLine.visible = this.showCircle && circleOkay; - circleLine.visible = this.showCircle && circleOkay; - circleCenter.visible = this.showCircle && circleOkay; + const c = Math.cos( theta ); + const s = Math.sin( theta ); - if(this.showCircle && circleOkay){ + const te = this.elements; - const A = this.points[0].position; - const B = this.points[1].position; - const C = this.points[2].position; - const AB = B.clone().sub(A); - const AC = C.clone().sub(A); - const N = AC.clone().cross(AB).normalize(); + const a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ]; + const a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ]; - const center = Potree.Utils.computeCircleCenter(A, B, C); - const radius = center.distanceTo(A); + te[ 0 ] = c * a11 + s * a21; + te[ 3 ] = c * a12 + s * a22; + te[ 6 ] = c * a13 + s * a23; + te[ 1 ] = - s * a11 + c * a21; + te[ 4 ] = - s * a12 + c * a22; + te[ 7 ] = - s * a13 + c * a23; - const scale = radius / 20; - circleCenter.position.copy(center); - circleCenter.scale.set(scale, scale, scale); + return this; - //circleRadiusLine.geometry.vertices[0].set(0, 0, 0); - //circleRadiusLine.geometry.vertices[1].copy(B.clone().sub(center)); + } - circleRadiusLine.geometry.setPositions( [ - 0, 0, 0, - ...B.clone().sub(center).toArray() - ] ); + translate( tx, ty ) { - circleRadiusLine.geometry.verticesNeedUpdate = true; - circleRadiusLine.geometry.computeBoundingSphere(); - circleRadiusLine.position.copy(center); - circleRadiusLine.computeLineDistances(); + const te = this.elements; - const target = center.clone().add(N); - circleLine.position.copy(center); - circleLine.scale.set(radius, radius, radius); - circleLine.lookAt(target); - - circleRadiusLabel.visible = true; - circleRadiusLabel.position.copy(center.clone().add(B).multiplyScalar(0.5)); - circleRadiusLabel.setText(`${radius.toFixed(3)}`); + te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ]; + te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ]; - } - } + return this; - { // update area label - this.areaLabel.position.copy(centroid); - this.areaLabel.visible = this.showArea && this.points.length >= 3; - let area = this.getArea(); + } - let suffix = ""; - if(this.lengthUnit != null && this.lengthUnitDisplay != null){ - area = area / Math.pow(this.lengthUnit.unitspermeter, 2) * Math.pow(this.lengthUnitDisplay.unitspermeter, 2); //convert to square meters then to the square display unit - suffix = this.lengthUnitDisplay.code; - } + equals( matrix ) { - let txtArea = Utils.addCommas(area.toFixed(1)); - let msg = `${txtArea} ${suffix}\u00B2`; - this.areaLabel.setText(msg); - } + const te = this.elements; + const me = matrix.elements; - // this.updateAzimuth(); - }; + for ( let i = 0; i < 9; i ++ ) { - raycast (raycaster, intersects) { - for (let i = 0; i < this.points.length; i++) { - let sphere = this.spheres[i]; + if ( te[ i ] !== me[ i ] ) return false; - sphere.raycast(raycaster, intersects); } - // recalculate distances because they are not necessarely correct - // for scaled objects. - // see https://github.com/mrdoob/three.js/issues/5827 - // TODO: remove this once the bug has been fixed - for (let i = 0; i < intersects.length; i++) { - let I = intersects[i]; - I.distance = raycaster.ray.origin.distanceTo(I.point); - } - intersects.sort(function (a, b) { return a.distance - b.distance; }); - }; + return true; - get showCoordinates () { - return this._showCoordinates; } - set showCoordinates (value) { - this._showCoordinates = value; - this.update(); - } + fromArray( array, offset = 0 ) { - get showAngles () { - return this._showAngles; - } + for ( let i = 0; i < 9; i ++ ) { - set showAngles (value) { - this._showAngles = value; - this.update(); - } + this.elements[ i ] = array[ i + offset ]; - get showCircle () { - return this._showCircle; - } + } - set showCircle (value) { - this._showCircle = value; - this.update(); - } + return this; - get showAzimuth(){ - return this._showAzimuth; } - set showAzimuth(value){ - this._showAzimuth = value; - this.update(); - } + toArray( array = [], offset = 0 ) { - get showEdges () { - return this._showEdges; - } + const te = this.elements; - set showEdges (value) { - this._showEdges = value; - this.update(); - } + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; - get showHeight () { - return this._showHeight; - } + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; - set showHeight (value) { - this._showHeight = value; - this.update(); - } + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; - get showArea () { - return this._showArea; - } + return array; - set showArea (value) { - this._showArea = value; - this.update(); } - get closed () { - return this._closed; - } + } - set closed (value) { - this._closed = value; - this.update(); - } + let _canvas; - get showDistances () { - return this._showDistances; - } + const ImageUtils = { - set showDistances (value) { - this._showDistances = value; - this.update(); - } + getDataURL: function ( image ) { - } + if ( /^data:/i.test( image.src ) ) { - class PolygonClipVolume extends THREE.Object3D{ - - constructor(camera){ - super(); + return image.src; - this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; - this.name = "polygon_clip_volume_" + this.constructor.counter; + } - this.camera = camera.clone(); - this.camera.rotation.set(...camera.rotation.toArray()); // [r85] workaround because camera.clone() doesn't work on rotation - this.camera.rotation.order = camera.rotation.order; - this.camera.updateMatrixWorld(); - this.camera.updateProjectionMatrix(); - this.camera.matrixWorldInverse.getInverse(this.camera.matrixWorld); + if ( typeof HTMLCanvasElement == 'undefined' ) { - this.viewMatrix = this.camera.matrixWorldInverse.clone(); - this.projMatrix = this.camera.projectionMatrix.clone(); + return image.src; - // projected markers - this.markers = []; - this.initialized = false; - } + } - addMarker() { + let canvas; - let marker = new THREE.Mesh(); + if ( image instanceof HTMLCanvasElement ) { - let cancel; + canvas = image; - let drag = e => { - let size = e.viewer.renderer.getSize(new THREE.Vector2()); - let projectedPos = new THREE.Vector3( - 2.0 * (e.drag.end.x / size.width) - 1.0, - -2.0 * (e.drag.end.y / size.height) + 1.0, - 0 - ); + } else { - marker.position.copy(projectedPos); - }; - - let drop = e => { - cancel(); - }; - - cancel = e => { - marker.removeEventListener("drag", drag); - marker.removeEventListener("drop", drop); - }; - - marker.addEventListener("drag", drag); - marker.addEventListener("drop", drop); + if ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + _canvas.width = image.width; + _canvas.height = image.height; - this.markers.push(marker); - } + const context = _canvas.getContext( '2d' ); - removeLastMarker() { - if(this.markers.length > 0) { - this.markers.splice(this.markers.length - 1, 1); - } - } - - }; - - class Utils { - static async loadShapefileFeatures (file, callback) { - let features = []; + if ( image instanceof ImageData ) { - let handleFinish = () => { - callback(features); - }; + context.putImageData( image, 0, 0 ); - let source = await shapefile.open(file); + } else { - while(true){ - let result = await source.read(); + context.drawImage( image, 0, 0, image.width, image.height ); - if (result.done) { - handleFinish(); - break; } - if (result.value && result.value.type === 'Feature' && result.value.geometry !== undefined) { - features.push(result.value); - } + canvas = _canvas; + } - } + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); - static toString (value) { - if (value instanceof THREE.Vector3) { - return value.x.toFixed(2) + ', ' + value.y.toFixed(2) + ', ' + value.z.toFixed(2); } else { - return '' + value + ''; + + return canvas.toDataURL( 'image/png' ); + } + } - static normalizeURL (url) { - let u = new URL(url); + }; - return u.protocol + '//' + u.hostname + u.pathname.replace(/\/+/g, '/'); - }; + let textureId = 0; - static pathExists (url) { - let req = XHRFactory.createXMLHttpRequest(); - req.open('GET', url, false); - req.send(null); - if (req.status !== 200) { - return false; - } - return true; - }; + function Texture( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = 1, encoding = LinearEncoding ) { - static debugSphere(parent, position, scale, color){ - let geometry = new THREE.SphereGeometry(1, 8, 8); - let material; + Object.defineProperty( this, 'id', { value: textureId ++ } ); - if(color !== undefined){ - material = new THREE.MeshBasicMaterial({color: color}); - }else { - material = new THREE.MeshNormalMaterial(); - } - let sphere = new THREE.Mesh(geometry, material); - sphere.position.copy(position); - sphere.scale.set(scale, scale, scale); - parent.add(sphere); - } + this.uuid = MathUtils.generateUUID(); - static debugLine(parent, start, end, color){ + this.name = ''; - let material = new THREE.LineBasicMaterial({ color: color }); - let geometry = new THREE.Geometry(); + this.image = image; + this.mipmaps = []; - const p1 = new THREE.Vector3(0, 0, 0); - const p2 = end.clone().sub(start); + this.mapping = mapping; - geometry.vertices.push(p1, p2); + this.wrapS = wrapS; + this.wrapT = wrapT; - let tl = new THREE.Line( geometry, material ); - tl.position.copy(start); + this.magFilter = magFilter; + this.minFilter = minFilter; - parent.add(tl); - } + this.anisotropy = anisotropy; - static debugCircle(parent, center, radius, normal, color){ - let material = new THREE.LineBasicMaterial({ color: color }); + this.format = format; + this.internalFormat = null; + this.type = type; - let geometry = new THREE.Geometry(); + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + this.center = new Vector2( 0, 0 ); + this.rotation = 0; - let n = 32; - for(let i = 0; i <= n; i++){ - let u0 = 2 * Math.PI * (i / n); - let u1 = 2 * Math.PI * (i + 1) / n; + this.matrixAutoUpdate = true; + this.matrix = new Matrix3(); - let p0 = new THREE.Vector3( - Math.cos(u0), - Math.sin(u0), - 0 - ); + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) - let p1 = new THREE.Vector3( - Math.cos(u1), - Math.sin(u1), - 0 - ); + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding; - geometry.vertices.push(p0, p1); - } + this.version = 0; + this.onUpdate = null; - let tl = new THREE.Line( geometry, material ); - tl.position.copy(center); - tl.scale.set(radius, radius, radius); + } - parent.add(tl); - } + Texture.DEFAULT_IMAGE = undefined; + Texture.DEFAULT_MAPPING = UVMapping; - static debugBox(parent, box, transform = new THREE.Matrix4(), color = 0xFFFF00){ - - let vertices = [ - [box.min.x, box.min.y, box.min.z], - [box.min.x, box.min.y, box.max.z], - [box.min.x, box.max.y, box.min.z], - [box.min.x, box.max.y, box.max.z], + Texture.prototype = Object.assign( Object.create( EventDispatcher$1.prototype ), { - [box.max.x, box.min.y, box.min.z], - [box.max.x, box.min.y, box.max.z], - [box.max.x, box.max.y, box.min.z], - [box.max.x, box.max.y, box.max.z], - ].map(v => new THREE.Vector3(...v)); + constructor: Texture, - let edges = [ - [0, 4], [4, 5], [5, 1], [1, 0], - [2, 6], [6, 7], [7, 3], [3, 2], - [0, 2], [4, 6], [5, 7], [1, 3] - ]; + isTexture: true, - let center = box.getCenter(new THREE.Vector3()); + updateMatrix: function () { - let centroids = [ - {position: [box.min.x, center.y, center.z], color: 0xFF0000}, - {position: [box.max.x, center.y, center.z], color: 0x880000}, + this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); - {position: [center.x, box.min.y, center.z], color: 0x00FF00}, - {position: [center.x, box.max.y, center.z], color: 0x008800}, + }, - {position: [center.x, center.y, box.min.z], color: 0x0000FF}, - {position: [center.x, center.y, box.max.z], color: 0x000088}, - ]; + clone: function () { - for(let vertex of vertices){ - let pos = vertex.clone().applyMatrix4(transform); + return new this.constructor().copy( this ); - Utils.debugSphere(parent, pos, 0.1, 0xFF0000); - } + }, - for(let edge of edges){ - let start = vertices[edge[0]].clone().applyMatrix4(transform); - let end = vertices[edge[1]].clone().applyMatrix4(transform); + copy: function ( source ) { - Utils.debugLine(parent, start, end, color); - } + this.name = source.name; - for(let centroid of centroids){ - let pos = new THREE.Vector3(...centroid.position).applyMatrix4(transform); + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); - Utils.debugSphere(parent, pos, 0.1, centroid.color); - } - } + this.mapping = source.mapping; - static debugPlane(parent, plane, size = 1, color = 0x0000FF){ + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; - let planehelper = new THREE.PlaneHelper(plane, size, color); + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; - parent.add(planehelper); + this.anisotropy = source.anisotropy; - } + this.format = source.format; + this.internalFormat = source.internalFormat; + this.type = source.type; - /** - * adapted from mhluska at https://github.com/mrdoob/three.js/issues/1561 - */ - static computeTransformedBoundingBox (box, transform) { - let vertices = [ - new THREE.Vector3(box.min.x, box.min.y, box.min.z).applyMatrix4(transform), - new THREE.Vector3(box.min.x, box.min.y, box.min.z).applyMatrix4(transform), - new THREE.Vector3(box.max.x, box.min.y, box.min.z).applyMatrix4(transform), - new THREE.Vector3(box.min.x, box.max.y, box.min.z).applyMatrix4(transform), - new THREE.Vector3(box.min.x, box.min.y, box.max.z).applyMatrix4(transform), - new THREE.Vector3(box.min.x, box.max.y, box.max.z).applyMatrix4(transform), - new THREE.Vector3(box.max.x, box.max.y, box.min.z).applyMatrix4(transform), - new THREE.Vector3(box.max.x, box.min.y, box.max.z).applyMatrix4(transform), - new THREE.Vector3(box.max.x, box.max.y, box.max.z).applyMatrix4(transform) - ]; + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + this.center.copy( source.center ); + this.rotation = source.rotation; - let boundingBox = new THREE.Box3(); - boundingBox.setFromPoints(vertices); + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy( source.matrix ); - return boundingBox; - }; + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; - /** - * add separators to large numbers - * - * @param nStr - * @returns - */ - static addCommas (nStr) { - nStr += ''; - let x = nStr.split('.'); - let x1 = x[0]; - let x2 = x.length > 1 ? '.' + x[1] : ''; - let rgx = /(\d+)(\d{3})/; - while (rgx.test(x1)) { - x1 = x1.replace(rgx, '$1' + ',' + '$2'); - } - return x1 + x2; - }; + return this; - static removeCommas (str) { - return str.replace(/,/g, ''); - } + }, - /** - * create worker from a string - * - * code from http://stackoverflow.com/questions/10343913/how-to-create-a-web-worker-from-a-string - */ - static createWorker (code) { - let blob = new Blob([code], {type: 'application/javascript'}); - let worker = new Worker(URL.createObjectURL(blob)); + toJSON: function ( meta ) { - return worker; - }; + const isRootObject = ( meta === undefined || typeof meta === 'string' ); - static moveTo(scene, endPosition, endTarget){ + if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) { - let view = scene.view; - let camera = scene.getActiveCamera(); - let animationDuration = 500; - let easing = TWEEN.Easing.Quartic.Out; + return meta.textures[ this.uuid ]; - { // animate camera position - let tween = new TWEEN.Tween(view.position).to(endPosition, animationDuration); - tween.easing(easing); - tween.start(); } - { // animate camera target - let camTargetDistance = camera.position.distanceTo(endTarget); - let target = new THREE.Vector3().addVectors( - camera.position, - camera.getWorldDirection(new THREE.Vector3()).clone().multiplyScalar(camTargetDistance) - ); - let tween = new TWEEN.Tween(target).to(endTarget, animationDuration); - tween.easing(easing); - tween.onUpdate(() => { - view.lookAt(target); - }); - tween.onComplete(() => { - view.lookAt(target); - }); - tween.start(); - } + const output = { - } + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, - static loadSkybox (path) { - let camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 100000); - camera.up.set(0, 0, 1); - let scene = new THREE.Scene(); + uuid: this.uuid, + name: this.name, - let format = '.jpg'; - let urls = [ - path + 'px' + format, path + 'nx' + format, - path + 'py' + format, path + 'ny' + format, - path + 'pz' + format, path + 'nz' + format - ]; + mapping: this.mapping, - let materialArray = []; - { - for (let i = 0; i < 6; i++) { - let material = new THREE.MeshBasicMaterial({ - map: null, - side: THREE.BackSide, - depthTest: false, - depthWrite: false, - color: 0x424556 - }); + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + center: [ this.center.x, this.center.y ], + rotation: this.rotation, - materialArray.push(material); + wrap: [ this.wrapS, this.wrapT ], - let loader = new THREE.TextureLoader(); - loader.load(urls[i], - function loaded (texture) { - material.map = texture; - material.needsUpdate = true; - material.color.setHex(0xffffff); - }, function progress (xhr) { - // console.log( (xhr.loaded / xhr.total * 100) + '% loaded' ); - }, function error (xhr) { - console.log('An error happened', xhr); - } - ); - } - } + format: this.format, + type: this.type, + encoding: this.encoding, - let skyGeometry = new THREE.CubeGeometry(5000, 5000, 5000); - let skybox = new THREE.Mesh(skyGeometry, materialArray); + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, - scene.add(skybox); + flipY: this.flipY, - // z up - scene.rotation.x = Math.PI / 2; + premultiplyAlpha: this.premultiplyAlpha, + unpackAlignment: this.unpackAlignment - return {'camera': camera, 'scene': scene}; - }; + }; - static createGrid (width, length, spacing, color) { - let material = new THREE.LineBasicMaterial({ - color: color || 0x888888 - }); + if ( this.image !== undefined ) { - let geometry = new THREE.Geometry(); - for (let i = 0; i <= length; i++) { - geometry.vertices.push(new THREE.Vector3(-(spacing * width) / 2, i * spacing - (spacing * length) / 2, 0)); - geometry.vertices.push(new THREE.Vector3(+(spacing * width) / 2, i * spacing - (spacing * length) / 2, 0)); - } + // TODO: Move to THREE.Image - for (let i = 0; i <= width; i++) { - geometry.vertices.push(new THREE.Vector3(i * spacing - (spacing * width) / 2, -(spacing * length) / 2, 0)); - geometry.vertices.push(new THREE.Vector3(i * spacing - (spacing * width) / 2, +(spacing * length) / 2, 0)); - } + const image = this.image; - let line = new THREE.LineSegments(geometry, material, THREE.LinePieces); - line.receiveShadow = true; - return line; - } + if ( image.uuid === undefined ) { - static createBackgroundTexture (width, height) { - function gauss (x, y) { - return (1 / (2 * Math.PI)) * Math.exp(-(x * x + y * y) / 2); - }; + image.uuid = MathUtils.generateUUID(); // UGH - // map.magFilter = THREE.NearestFilter; - let size = width * height; - let data = new Uint8Array(3 * size); + } - let chroma = [1, 1.5, 1.7]; - let max = gauss(0, 0); + if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) { - for (let x = 0; x < width; x++) { - for (let y = 0; y < height; y++) { - let u = 2 * (x / width) - 1; - let v = 2 * (y / height) - 1; + let url; - let i = x + width * y; - let d = gauss(2 * u, 2 * v) / max; - let r = (Math.random() + Math.random() + Math.random()) / 3; - r = (d * 0.5 + 0.5) * r * 0.03; - r = r * 0.4; + if ( Array.isArray( image ) ) { - // d = Math.pow(d, 0.6); + // process array of images e.g. CubeTexture - data[3 * i + 0] = 255 * (d / 15 + 0.05 + r) * chroma[0]; - data[3 * i + 1] = 255 * (d / 15 + 0.05 + r) * chroma[1]; - data[3 * i + 2] = 255 * (d / 15 + 0.05 + r) * chroma[2]; - } - } + url = []; - let texture = new THREE.DataTexture(data, width, height, THREE.RGBFormat); - texture.needsUpdate = true; + for ( let i = 0, l = image.length; i < l; i ++ ) { - return texture; - } + // check cube texture with data textures - static getMousePointCloudIntersection (mouse, camera, viewer, pointclouds, params = {}) { - - let renderer = viewer.renderer; - - let nmouse = { - x: (mouse.x / renderer.domElement.clientWidth) * 2 - 1, - y: -(mouse.y / renderer.domElement.clientHeight) * 2 + 1 - }; + if ( image[ i ].isDataTexture ) { - let pickParams = {}; + url.push( serializeImage( image[ i ].image ) ); - if(params.pickClipped){ - pickParams.pickClipped = params.pickClipped; - } + } else { - pickParams.x = mouse.x; - pickParams.y = renderer.domElement.clientHeight - mouse.y; + url.push( serializeImage( image[ i ] ) ); - let raycaster = new THREE.Raycaster(); - raycaster.setFromCamera(nmouse, camera); - let ray = raycaster.ray; + } - let selectedPointcloud = null; - let closestDistance = Infinity; - let closestIntersection = null; - let closestPoint = null; - - for(let pointcloud of pointclouds){ - let point = pointcloud.pick(viewer, camera, ray, pickParams); - - if(!point){ - continue; - } + } - let distance = camera.position.distanceTo(point.position); + } else { + + // process single image + + url = serializeImage( image ); + + } + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: url + }; - if (distance < closestDistance) { - closestDistance = distance; - selectedPointcloud = pointcloud; - closestIntersection = point.position; - closestPoint = point; } + + output.image = image.uuid; + } - if (selectedPointcloud) { - return { - location: closestIntersection, - distance: closestDistance, - pointcloud: selectedPointcloud, - point: closestPoint - }; - } else { - return null; + if ( ! isRootObject ) { + + meta.textures[ this.uuid ] = output; + } - } - static pixelsArrayToImage (pixels, width, height) { - let canvas = document.createElement('canvas'); - canvas.width = width; - canvas.height = height; + return output; - let context = canvas.getContext('2d'); + }, - pixels = new pixels.constructor(pixels); + dispose: function () { - for (let i = 0; i < pixels.length; i++) { - pixels[i * 4 + 3] = 255; - } + this.dispatchEvent( { type: 'dispose' } ); - let imageData = context.createImageData(width, height); - imageData.data.set(pixels); - context.putImageData(imageData, 0, 0); + }, - let img = new Image(); - img.src = canvas.toDataURL(); - // img.style.transform = "scaleY(-1)"; + transformUv: function ( uv ) { - return img; - } + if ( this.mapping !== UVMapping ) return uv; - static pixelsArrayToDataUrl(pixels, width, height) { - let canvas = document.createElement('canvas'); - canvas.width = width; - canvas.height = height; + uv.applyMatrix3( this.matrix ); - let context = canvas.getContext('2d'); + if ( uv.x < 0 || uv.x > 1 ) { - pixels = new pixels.constructor(pixels); + switch ( this.wrapS ) { - for (let i = 0; i < pixels.length; i++) { - pixels[i * 4 + 3] = 255; - } + case RepeatWrapping: - let imageData = context.createImageData(width, height); - imageData.data.set(pixels); - context.putImageData(imageData, 0, 0); + uv.x = uv.x - Math.floor( uv.x ); + break; - let dataURL = canvas.toDataURL(); + case ClampToEdgeWrapping: - return dataURL; - } + uv.x = uv.x < 0 ? 0 : 1; + break; - static pixelsArrayToCanvas(pixels, width, height){ - let canvas = document.createElement('canvas'); - canvas.width = width; - canvas.height = height; + case MirroredRepeatWrapping: - let context = canvas.getContext('2d'); + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { - pixels = new pixels.constructor(pixels); + uv.x = Math.ceil( uv.x ) - uv.x; - //for (let i = 0; i < pixels.length; i++) { - // pixels[i * 4 + 3] = 255; - //} + } else { - // flip vertically - let bytesPerLine = width * 4; - for(let i = 0; i < parseInt(height / 2); i++){ - let j = height - i - 1; + uv.x = uv.x - Math.floor( uv.x ); + + } + + break; + + } - let lineI = pixels.slice(i * bytesPerLine, i * bytesPerLine + bytesPerLine); - let lineJ = pixels.slice(j * bytesPerLine, j * bytesPerLine + bytesPerLine); - pixels.set(lineJ, i * bytesPerLine); - pixels.set(lineI, j * bytesPerLine); } - let imageData = context.createImageData(width, height); - imageData.data.set(pixels); - context.putImageData(imageData, 0, 0); + if ( uv.y < 0 || uv.y > 1 ) { - return canvas; - } + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + + break; + + } - static removeListeners(dispatcher, type){ - if (dispatcher._listeners === undefined) { - return; } - if (dispatcher._listeners[ type ]) { - delete dispatcher._listeners[ type ]; + if ( this.flipY ) { + + uv.y = 1 - uv.y; + } + + return uv; + } - static mouseToRay(mouse, camera, width, height){ + } ); - let normalizedMouse = { - x: (mouse.x / width) * 2 - 1, - y: -(mouse.y / height) * 2 + 1 - }; + Object.defineProperty( Texture.prototype, 'needsUpdate', { - let vector = new THREE.Vector3(normalizedMouse.x, normalizedMouse.y, 0.5); - let origin = camera.position.clone(); - vector.unproject(camera); - let direction = new THREE.Vector3().subVectors(vector, origin).normalize(); + set: function ( value ) { - let ray = new THREE.Ray(origin, direction); + if ( value === true ) this.version ++; - return ray; } - static projectedRadius(radius, camera, distance, screenWidth, screenHeight){ - if(camera instanceof THREE.OrthographicCamera){ - return Utils.projectedRadiusOrtho(radius, camera.projectionMatrix, screenWidth, screenHeight); - }else if(camera instanceof THREE.PerspectiveCamera){ - return Utils.projectedRadiusPerspective(radius, camera.fov * Math.PI / 180, distance, screenHeight); - }else { - throw new Error("invalid parameters"); + } ); + + function serializeImage( image ) { + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) { + + // default images + + return ImageUtils.getDataURL( image ); + + } else { + + if ( image.data ) { + + // images of DataTexture + + return { + data: Array.prototype.slice.call( image.data ), + width: image.width, + height: image.height, + type: image.data.constructor.name + }; + + } else { + + console.warn( 'THREE.Texture: Unable to serialize Texture.' ); + return {}; + } + } - static projectedRadiusPerspective(radius, fov, distance, screenHeight) { - let projFactor = (1 / Math.tan(fov / 2)) / distance; - projFactor = projFactor * screenHeight / 2; + } - return radius * projFactor; - } + class Vector4 { - static projectedRadiusOrtho(radius, proj, screenWidth, screenHeight) { - let p1 = new THREE.Vector4(0); - let p2 = new THREE.Vector4(radius); + constructor( x = 0, y = 0, z = 0, w = 1 ) { + + Object.defineProperty( this, 'isVector4', { value: true } ); + + this.x = x; + this.y = y; + this.z = z; + this.w = w; - p1.applyMatrix4(proj); - p2.applyMatrix4(proj); - p1 = new THREE.Vector3(p1.x, p1.y, p1.z); - p2 = new THREE.Vector3(p2.x, p2.y, p2.z); - p1.x = (p1.x + 1.0) * 0.5 * screenWidth; - p1.y = (p1.y + 1.0) * 0.5 * screenHeight; - p2.x = (p2.x + 1.0) * 0.5 * screenWidth; - p2.y = (p2.y + 1.0) * 0.5 * screenHeight; - return p1.distanceTo(p2); - } - - - static topView(camera, node){ - camera.position.set(0, 1, 0); - camera.rotation.set(-Math.PI / 2, 0, 0); - camera.zoomTo(node, 1); } - static frontView (camera, node) { - camera.position.set(0, 0, 1); - camera.rotation.set(0, 0, 0); - camera.zoomTo(node, 1); + get width() { + + return this.z; + } - static leftView (camera, node) { - camera.position.set(-1, 0, 0); - camera.rotation.set(0, -Math.PI / 2, 0); - camera.zoomTo(node, 1); + set width( value ) { + + this.z = value; + } - static rightView (camera, node) { - camera.position.set(1, 0, 0); - camera.rotation.set(0, Math.PI / 2, 0); - camera.zoomTo(node, 1); + get height() { + + return this.w; + } - - static findClosestGpsTime(target, viewer){ - const start = performance.now(); + set height( value ) { - const nodes = []; - for(const pc of viewer.scene.pointclouds){ - nodes.push(pc.root); + this.w = value; - for(const child of pc.root.children){ - if(child){ - nodes.push(child); - } - } - } + } - let closestNode = null; - let closestIndex = Infinity; - let closestDistance = Infinity; - let closestValue = 0; + set( x, y, z, w ) { - for(const node of nodes){ + this.x = x; + this.y = y; + this.z = z; + this.w = w; - const isOkay = node.geometryNode != null - && node.geometryNode.geometry != null - && node.sceneNode != null; + return this; - if(!isOkay){ - continue; - } + } - let geometry = node.geometryNode.geometry; - let gpsTime = geometry.attributes["gps-time"]; - let range = gpsTime.potree.range; + setScalar( scalar ) { - for(let i = 0; i < gpsTime.array.length; i++){ - let value = gpsTime.array[i]; - value = value * (range[1] - range[0]) + range[0]; - const distance = Math.abs(target - value); + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; - if(distance < closestDistance){ - closestIndex = i; - closestDistance = distance; - closestValue = value; - closestNode = node; - //console.log("found a closer one: " + value); - } - } - } + return this; - const geometry = closestNode.geometryNode.geometry; - const position = new THREE.Vector3( - geometry.attributes.position.array[3 * closestIndex + 0], - geometry.attributes.position.array[3 * closestIndex + 1], - geometry.attributes.position.array[3 * closestIndex + 2], - ); + } - position.applyMatrix4(closestNode.sceneNode.matrixWorld); + setX( x ) { - const end = performance.now(); - const duration = (end - start); - console.log(`duration: ${duration.toFixed(3)}ms`); + this.x = x; + + return this; - return { - node: closestNode, - index: closestIndex, - position: position, - }; } - /** - * - * 0: no intersection - * 1: intersection - * 2: fully inside - */ - static frustumSphereIntersection (frustum, sphere) { - let planes = frustum.planes; - let center = sphere.center; - let negRadius = -sphere.radius; + setY( y ) { - let minDistance = Number.MAX_VALUE; + this.y = y; - for (let i = 0; i < 6; i++) { - let distance = planes[ i ].distanceToPoint(center); + return this; - if (distance < negRadius) { - return 0; - } + } - minDistance = Math.min(minDistance, distance); - } + setZ( z ) { - return (minDistance >= sphere.radius) ? 2 : 1; - } + this.z = z; - // code taken from three.js - // ImageUtils - generateDataTexture() - static generateDataTexture (width, height, color) { - let size = width * height; - let data = new Uint8Array(4 * width * height); + return this; - let r = Math.floor(color.r * 255); - let g = Math.floor(color.g * 255); - let b = Math.floor(color.b * 255); + } - for (let i = 0; i < size; i++) { - data[ i * 3 ] = r; - data[ i * 3 + 1 ] = g; - data[ i * 3 + 2 ] = b; - } + setW( w ) { - let texture = new THREE.DataTexture(data, width, height, THREE.RGBAFormat); - texture.needsUpdate = true; - texture.magFilter = THREE.NearestFilter; + this.w = w; - return texture; - } + return this; - // from http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript - static getParameterByName (name) { - name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]'); - let regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); - let results = regex.exec(document.location.search); - return results === null ? null : decodeURIComponent(results[1].replace(/\+/g, ' ')); } - static setParameter (name, value) { - // value = encodeURIComponent(value); + setComponent( index, value ) { - name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]'); - let regex = new RegExp('([\\?&])(' + name + '=([^&#]*))'); - let results = regex.exec(document.location.search); + switch ( index ) { - let url = window.location.href; - if (results === null) { - if (window.location.search.length === 0) { - url = url + '?'; - } else { - url = url + '&'; - } + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); - url = url + name + '=' + value; - } else { - let newValue = name + '=' + value; - url = url.replace(results[2], newValue); } - window.history.replaceState({}, '', url); + + return this; + } - static createChildAABB(aabb, index){ - let min = aabb.min.clone(); - let max = aabb.max.clone(); - let size = new THREE.Vector3().subVectors(max, min); + getComponent( index ) { - if ((index & 0b0001) > 0) { - min.z += size.z / 2; - } else { - max.z -= size.z / 2; - } + switch ( index ) { - if ((index & 0b0010) > 0) { - min.y += size.y / 2; - } else { - max.y -= size.y / 2; - } + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); - if ((index & 0b0100) > 0) { - min.x += size.x / 2; - } else { - max.x -= size.x / 2; } - return new THREE.Box3(min, max); } - // see https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript - static clipboardCopy(text){ - let textArea = document.createElement("textarea"); + clone() { - textArea.style.position = 'fixed'; - textArea.style.top = 0; - textArea.style.left = 0; + return new this.constructor( this.x, this.y, this.z, this.w ); - textArea.style.width = '2em'; - textArea.style.height = '2em'; + } - textArea.style.padding = 0; + copy( v ) { - textArea.style.border = 'none'; - textArea.style.outline = 'none'; - textArea.style.boxShadow = 'none'; + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; - textArea.style.background = 'transparent'; + return this; - textArea.value = text; + } - document.body.appendChild(textArea); + add( v, w ) { - textArea.select(); + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); - try { - let success = document.execCommand('copy'); - if(success){ - console.log("copied text to clipboard"); - }else { - console.log("copy to clipboard failed"); - } - } catch (err) { - console.log("error while trying to copy to clipboard"); } - document.body.removeChild(textArea); + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; } - static getMeasurementIcon(measurement){ - if (measurement instanceof Measure) { - if (measurement.showDistances && !measurement.showArea && !measurement.showAngles) { - return `${Potree.resourcePath}/icons/distance.svg`; - } else if (measurement.showDistances && measurement.showArea && !measurement.showAngles) { - return `${Potree.resourcePath}/icons/area.svg`; - } else if (measurement.maxMarkers === 1) { - return `${Potree.resourcePath}/icons/point.svg`; - } else if (!measurement.showDistances && !measurement.showArea && measurement.showAngles) { - return `${Potree.resourcePath}/icons/angle.png`; - } else if (measurement.showHeight) { - return `${Potree.resourcePath}/icons/height.svg`; - } else { - return `${Potree.resourcePath}/icons/distance.svg`; - } - } else if (measurement instanceof Profile) { - return `${Potree.resourcePath}/icons/profile.svg`; - } else if (measurement instanceof Volume) { - return `${Potree.resourcePath}/icons/volume.svg`; - } else if (measurement instanceof PolygonClipVolume) { - return `${Potree.resourcePath}/icons/clip-polygon.svg`; - } + addScalar( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + } - static lineToLineIntersection(P0, P1, P2, P3){ + addVectors( a, b ) { - const P = [P0, P1, P2, P3]; + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; - const d = (m, n, o, p) => { - let result = - (P[m].x - P[n].x) * (P[o].x - P[p].x) - + (P[m].y - P[n].y) * (P[o].y - P[p].y) - + (P[m].z - P[n].z) * (P[o].z - P[p].z); + return this; - return result; - }; + } + addScaledVector( v, s ) { - const mua = (d(0, 2, 3, 2) * d(3, 2, 1, 0) - d(0, 2, 1, 0) * d(3, 2, 3, 2)) - /**-----------------------------------------------------------------**/ / - (d(1, 0, 1, 0) * d(3, 2, 3, 2) - d(3, 2, 1, 0) * d(3, 2, 1, 0)); + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + return this; - const mub = (d(0, 2, 3, 2) + mua * d(3, 2, 1, 0)) - /**--------------------------------------**/ / - d(3, 2, 3, 2); + } + sub( v, w ) { - const P01 = P1.clone().sub(P0); - const P23 = P3.clone().sub(P2); - - const Pa = P0.clone().add(P01.multiplyScalar(mua)); - const Pb = P2.clone().add(P23.multiplyScalar(mub)); + if ( w !== undefined ) { - const center = Pa.clone().add(Pb).multiplyScalar(0.5); + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; - return center; } - static computeCircleCenter(A, B, C){ - const AB = B.clone().sub(A); - const AC = C.clone().sub(A); + subScalar( s ) { - const N = AC.clone().cross(AB).normalize(); + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; - const ab_dir = AB.clone().cross(N).normalize(); - const ac_dir = AC.clone().cross(N).normalize(); + return this; - const ab_origin = A.clone().add(B).multiplyScalar(0.5); - const ac_origin = A.clone().add(C).multiplyScalar(0.5); + } - const P0 = ab_origin; - const P1 = ab_origin.clone().add(ab_dir); + subVectors( a, b ) { - const P2 = ac_origin; - const P3 = ac_origin.clone().add(ac_dir); + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; - const center = Utils.lineToLineIntersection(P0, P1, P2, P3); + return this; - return center; + } - // Potree.Utils.debugLine(viewer.scene.scene, P0, P1, 0x00ff00); - // Potree.Utils.debugLine(viewer.scene.scene, P2, P3, 0x0000ff); + multiplyScalar( scalar ) { - // Potree.Utils.debugSphere(viewer.scene.scene, center, 0.03, 0xff00ff); + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; - // const radius = center.distanceTo(A); - // Potree.Utils.debugCircle(viewer.scene.scene, center, radius, new THREE.Vector3(0, 0, 1), 0xff00ff); } - static getNorthVec(p1, distance, projection){ - if(projection){ - // if there is a projection, transform coordinates to WGS84 - // and compute angle to north there + applyMatrix4( m ) { - proj4.defs("pointcloud", projection); - const transform = proj4("pointcloud", "WGS84"); + const x = this.x, y = this.y, z = this.z, w = this.w; + const e = m.elements; - const llP1 = transform.forward(p1.toArray()); - let llP2 = transform.forward([p1.x, p1.y + distance]); - const polarRadius = Math.sqrt((llP2[0] - llP1[0]) ** 2 + (llP2[1] - llP1[1]) ** 2); - llP2 = [llP1[0], llP1[1] + polarRadius]; + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; - const northVec = transform.inverse(llP2); - - return new THREE.Vector3(...northVec, p1.z).sub(p1); - }else { - // if there is no projection, assume [0, 1, 0] as north direction + return this; - const vec = new THREE.Vector3(0, 1, 0).multiplyScalar(distance); - - return vec; - } } - static computeAzimuth(p1, p2, projection){ + divideScalar( scalar ) { - let azimuth = 0; + return this.multiplyScalar( 1 / scalar ); - if(projection){ - // if there is a projection, transform coordinates to WGS84 - // and compute angle to north there + } - let transform; + setAxisAngleFromQuaternion( q ) { - if (projection.includes('EPSG')) { - transform = proj4(projection, "WGS84"); - } else { - proj4.defs("pointcloud", projection); - transform = proj4("pointcloud", "WGS84"); - } + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm - const llP1 = transform.forward(p1.toArray()); - const llP2 = transform.forward(p2.toArray()); - const dir = [ - llP2[0] - llP1[0], - llP2[1] - llP1[1], - ]; - azimuth = Math.atan2(dir[1], dir[0]) - Math.PI / 2; - }else { - // if there is no projection, assume [0, 1, 0] as north direction + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + const s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; - const dir = [p2.x - p1.x, p2.y - p1.y]; - azimuth = Math.atan2(dir[1], dir[0]) - Math.PI / 2; } - // make clockwise - azimuth = -azimuth; + return this; - return azimuth; } - static async loadScript(url){ - - return new Promise( resolve => { + setAxisAngleFromRotationMatrix( m ) { - const element = document.getElementById(url); + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm - if(element){ - resolve(); - }else { - const script = document.createElement("script"); + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) - script.id = url; + let angle, x, y, z; // variables for result + const epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees - script.onload = () => { - resolve(); - }; - script.src = url; + te = m.elements, - document.body.appendChild(script); - } - }); - } + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; - static createSvgGradient(scheme){ + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { - // this is what we are creating: - // - // - // - // - // - // ... - // - // - // - // - // - // + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { - const gradientId = `${Math.random()}_${Date.now()}`; - - const svgn = "http://www.w3.org/2000/svg"; - const svg = document.createElementNS(svgn, "svg"); - svg.setAttributeNS(null, "width", "2em"); - svg.setAttributeNS(null, "height", "3em"); - - { // - const defs = document.createElementNS(svgn, "defs"); - - const linearGradient = document.createElementNS(svgn, "linearGradient"); - linearGradient.setAttributeNS(null, "id", gradientId); - linearGradient.setAttributeNS(null, "gradientTransform", "rotate(90)"); + // this singularity is identity matrix so angle = 0 - for(let i = scheme.length - 1; i >= 0; i--){ - const stopVal = scheme[i]; - const percent = parseInt(100 - stopVal[0] * 100); - const [r, g, b] = stopVal[1].toArray().map(v => parseInt(v * 255)); + this.set( 1, 0, 0, 0 ); - const stop = document.createElementNS(svgn, "stop"); - stop.setAttributeNS(null, "offset", `${percent}%`); - stop.setAttributeNS(null, "stop-color", `rgb(${r}, ${g}, ${b})`); + return this; // zero angle, arbitrary axis - linearGradient.appendChild(stop); } - defs.appendChild(linearGradient); - svg.appendChild(defs); - } + // otherwise this singularity is angle = 180 - const rect = document.createElementNS(svgn, "rect"); - rect.setAttributeNS(null, "width", `100%`); - rect.setAttributeNS(null, "height", `100%`); - rect.setAttributeNS(null, "fill", `url("#${gradientId}")`); - rect.setAttributeNS(null, "stroke", `black`); - rect.setAttributeNS(null, "stroke-width", `0.1em`); + angle = Math.PI; - svg.appendChild(rect); - - return svg; - } + const xx = ( m11 + 1 ) / 2; + const yy = ( m22 + 1 ) / 2; + const zz = ( m33 + 1 ) / 2; + const xy = ( m12 + m21 ) / 4; + const xz = ( m13 + m31 ) / 4; + const yz = ( m23 + m32 ) / 4; - static async waitAny(promises){ - - return new Promise( (resolve) => { + if ( ( xx > yy ) && ( xx > zz ) ) { - promises.map( promise => { - promise.then( () => { - resolve(); - }); - }); + // m11 is the largest diagonal term - }); + if ( xx < epsilon ) { - } + x = 0; + y = 0.707106781; + z = 0.707106781; - } + } else { - Utils.screenPass = new function () { - this.screenScene = new THREE.Scene(); - this.screenQuad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2, 0)); - this.screenQuad.material.depthTest = true; - this.screenQuad.material.depthWrite = true; - this.screenQuad.material.transparent = true; - this.screenScene.add(this.screenQuad); - this.camera = new THREE.Camera(); + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; - this.render = function (renderer, material, target) { - this.screenQuad.material = material; + } - if (typeof target === 'undefined') { - renderer.render(this.screenScene, this.camera); - } else { - renderer.render(this.screenScene, this.camera, target); - } - }; - }(); + } else if ( yy > zz ) { - class Annotation extends EventDispatcher { - constructor (args = {}) { - super(); + // m22 is the largest diagonal term - this.scene = null; - this._title = args.title || 'No Title'; - this._description = args.description || ''; - this.offset = new THREE.Vector3(); - this.uuid = THREE.Math.generateUUID(); + if ( yy < epsilon ) { - if (!args.position) { - this.position = null; - } else if (args.position instanceof THREE.Vector3) { - this.position = args.position; - } else { - this.position = new THREE.Vector3(...args.position); - } + x = 0.707106781; + y = 0; + z = 0.707106781; - this.cameraPosition = (args.cameraPosition instanceof Array) - ? new THREE.Vector3().fromArray(args.cameraPosition) : args.cameraPosition; - this.cameraTarget = (args.cameraTarget instanceof Array) - ? new THREE.Vector3().fromArray(args.cameraTarget) : args.cameraTarget; - this.radius = args.radius; - this.view = args.view || null; - this.keepOpen = false; - this.descriptionVisible = false; - this.showDescription = true; - this.actions = args.actions || []; - this.isHighlighted = false; - this._visible = true; - this.__visible = true; - this._display = true; - this._expand = false; - this.collapseThreshold = [args.collapseThreshold, 100].find(e => e !== undefined); + } else { - this.children = []; - this.parent = null; - this.boundingBox = new THREE.Box3(); + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; - let iconClose = exports.resourcePath + '/icons/close.svg'; + } - this.domElement = $(` -
-
- -
-
- - - - ${this._description} -
-
- `); + } else { - this.elTitlebar = this.domElement.find('.annotation-titlebar'); - this.elTitle = this.elTitlebar.find('.annotation-label'); - this.elTitle.append(this._title); - this.elDescription = this.domElement.find('.annotation-description'); - this.elDescriptionClose = this.elDescription.find('.annotation-description-close'); - // this.elDescriptionContent = this.elDescription.find(".annotation-description-content"); + // m33 is the largest diagonal term so base result on this - this.clickTitle = () => { - if(this.hasView()){ - this.moveHere(this.scene.getActiveCamera()); - } - this.dispatchEvent({type: 'click', target: this}); - }; + if ( zz < epsilon ) { - this.elTitle.click(this.clickTitle); + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } - this.actions = this.actions.map(a => { - if (a instanceof Action) { - return a; - } else { - return new Action(a); } - }); - for (let action of this.actions) { - action.pairWith(this); - } + this.set( x, y, z, angle ); - let actions = this.actions.filter( - a => a.showIn === undefined || a.showIn.includes('scene')); + return this; // return 180 deg rotation - for (let action of actions) { - let elButton = $(``); - this.elTitlebar.append(elButton); - elButton.click(() => action.onclick({annotation: this})); } - this.elDescriptionClose.hover( - e => this.elDescriptionClose.css('opacity', '1'), - e => this.elDescriptionClose.css('opacity', '0.5') - ); - this.elDescriptionClose.click(e => this.setHighlighted(false)); - // this.elDescriptionContent.html(this._description); + // as we have reached here there are no singularities so we can handle normally - this.domElement.mouseenter(e => this.setHighlighted(true)); - this.domElement.mouseleave(e => this.setHighlighted(false)); + let s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize - this.domElement.on('touchstart', e => { - this.setHighlighted(!this.isHighlighted); - }); + if ( Math.abs( s ) < 0.001 ) s = 1; - this.display = false; - //this.display = true; + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; } - installHandles(viewer){ - if(this.handles !== undefined){ - return; - } + min( v ) { - let domElement = $(` -
- - - - - -
- `); - - let svg = domElement.find("svg")[0]; - let elLine = domElement.find("line")[0]; - let elStart = domElement.find("circle")[0]; - let elEnd = domElement.find("circle")[1]; + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); - let setCoordinates = (start, end) => { - elStart.setAttribute("cx", `${start.x}`); - elStart.setAttribute("cy", `${start.y}`); + return this; - elEnd.setAttribute("cx", `${end.x}`); - elEnd.setAttribute("cy", `${end.y}`); + } - elLine.setAttribute("x1", start.x); - elLine.setAttribute("y1", start.y); - elLine.setAttribute("x2", end.x); - elLine.setAttribute("y2", end.y); + max( v ) { - let box = svg.getBBox(); - svg.setAttribute("width", `${box.width}`); - svg.setAttribute("height", `${box.height}`); - svg.setAttribute("viewBox", `${box.x} ${box.y} ${box.width} ${box.height}`); + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); - let ya = start.y - end.y; - let xa = start.x - end.x; + return this; - if(ya > 0){ - start.y = start.y - ya; - } - if(xa > 0){ - start.x = start.x - xa; - } + } - domElement.css("left", `${start.x}px`); - domElement.css("top", `${start.y}px`); + clamp( min, max ) { - }; + // assumes min < max, componentwise - $(viewer.renderArea).append(domElement); + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + return this; - let annotationStartPos = this.position.clone(); - let annotationStartOffset = this.offset.clone(); + } - $(this.domElement).draggable({ - start: (event, ui) => { - annotationStartPos = this.position.clone(); - annotationStartOffset = this.offset.clone(); - $(this.domElement).find(".annotation-titlebar").css("pointer-events", "none"); + clampScalar( minVal, maxVal ) { - console.log($(this.domElement).find(".annotation-titlebar")); - }, - stop: () => { - $(this.domElement).find(".annotation-titlebar").css("pointer-events", ""); - }, - drag: (event, ui ) => { - let renderAreaWidth = viewer.renderer.getSize(new THREE.Vector2()).width; - //let renderAreaHeight = viewer.renderer.getSize().height; + this.x = Math.max( minVal, Math.min( maxVal, this.x ) ); + this.y = Math.max( minVal, Math.min( maxVal, this.y ) ); + this.z = Math.max( minVal, Math.min( maxVal, this.z ) ); + this.w = Math.max( minVal, Math.min( maxVal, this.w ) ); - let diff = { - x: ui.originalPosition.left - ui.position.left, - y: ui.originalPosition.top - ui.position.top - }; + return this; - let nDiff = { - x: -(diff.x / renderAreaWidth) * 2, - y: (diff.y / renderAreaWidth) * 2 - }; + } - let camera = viewer.scene.getActiveCamera(); - let oldScreenPos = new THREE.Vector3() - .addVectors(annotationStartPos, annotationStartOffset) - .project(camera); + clampLength( min, max ) { - let newScreenPos = oldScreenPos.clone(); - newScreenPos.x += nDiff.x; - newScreenPos.y += nDiff.y; + const length = this.length(); - let newPos = newScreenPos.clone(); - newPos.unproject(camera); + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); - let newOffset = new THREE.Vector3().subVectors(newPos, this.position); - this.offset.copy(newOffset); - } - }); + } - let updateCallback = () => { - let position = this.position; - let scene = viewer.scene; + floor() { - const renderAreaSize = viewer.renderer.getSize(new THREE.Vector2()); - let renderAreaWidth = renderAreaSize.width; - let renderAreaHeight = renderAreaSize.height; + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); - let start = this.position.clone(); - let end = new THREE.Vector3().addVectors(this.position, this.offset); + return this; - let toScreen = (position) => { - let camera = scene.getActiveCamera(); - let screenPos = new THREE.Vector3(); + } - let worldView = new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse); - let ndc = new THREE.Vector4(position.x, position.y, position.z, 1.0).applyMatrix4(worldView); - // limit w to small positive value, in case position is behind the camera - ndc.w = Math.max(ndc.w, 0.1); - ndc.divideScalar(ndc.w); + ceil() { - screenPos.copy(ndc); - screenPos.x = renderAreaWidth * (screenPos.x + 1) / 2; - screenPos.y = renderAreaHeight * (1 - (screenPos.y + 1) / 2); + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); - return screenPos; - }; - - start = toScreen(start); - end = toScreen(end); + return this; - setCoordinates(start, end); + } - }; + round() { - viewer.addEventListener("update", updateCallback); + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; - this.handles = { - domElement: domElement, - setCoordinates: setCoordinates, - updateCallback: updateCallback - }; } - removeHandles(viewer){ - if(this.handles === undefined){ - return; - } + roundToZero() { - //$(viewer.renderArea).remove(this.handles.domElement); - this.handles.domElement.remove(); - viewer.removeEventListener("update", this.handles.updateCallback); + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); - delete this.handles; - } + return this; - get visible () { - return this._visible; } - set visible (value) { - if (this._visible === value) { - return; - } + negate() { - this._visible = value; + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; - //this.traverse(node => { - // node.display = value; - //}); + return this; - this.dispatchEvent({ - type: 'visibility_changed', - annotation: this - }); } - get display () { - return this._display; + dot( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + } - set display (display) { - if (this._display === display) { - return; - } + lengthSq() { - this._display = display; + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; - if (display) { - // this.domElement.fadeIn(200); - this.domElement.show(); - } else { - // this.domElement.fadeOut(200); - this.domElement.hide(); - } } - get expand () { - return this._expand; + length() { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + } - set expand (expand) { - if (this._expand === expand) { - return; - } + manhattanLength() { - if (expand) { - this.display = false; - } else { - this.display = true; - this.traverseDescendants(node => { - node.display = false; - }); - } + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); - this._expand = expand; } - get title () { - return this._title; + normalize() { + + return this.divideScalar( this.length() || 1 ); + } - set title (title) { - if (this._title === title) { - return; - } + setLength( length ) { - this._title = title; - this.elTitle.empty(); - this.elTitle.append(this._title); + return this.normalize().multiplyScalar( length ); - this.dispatchEvent({ - type: "annotation_changed", - annotation: this, - }); } - get description () { - return this._description; + lerp( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + } - set description (description) { - if (this._description === description) { - return; - } + lerpVectors( v1, v2, alpha ) { - this._description = description; + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; + this.z = v1.z + ( v2.z - v1.z ) * alpha; + this.w = v1.w + ( v2.w - v1.w ) * alpha; - const elDescriptionContent = this.elDescription.find(".annotation-description-content"); - elDescriptionContent.empty(); - elDescriptionContent.append(this._description); + return this; - this.dispatchEvent({ - type: "annotation_changed", - annotation: this, - }); } - add (annotation) { - if (!this.children.includes(annotation)) { - this.children.push(annotation); - annotation.parent = this; + equals( v ) { - let descendants = []; - annotation.traverse(a => { descendants.push(a); }); + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); - for (let descendant of descendants) { - let c = this; - while (c !== null) { - c.dispatchEvent({ - 'type': 'annotation_added', - 'annotation': descendant - }); - c = c.parent; - } - } - } } - level () { - if (this.parent === null) { - return 0; - } else { - return this.parent.level() + 1; - } - } + fromArray( array, offset = 0 ) { - hasChild(annotation) { - return this.children.includes(annotation); - } + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; - remove (annotation) { - if (this.hasChild(annotation)) { - annotation.removeAllChildren(); - annotation.dispose(); - this.children = this.children.filter(e => e !== annotation); - annotation.parent = null; - } } - removeAllChildren() { - this.children.forEach((child) => { - if (child.children.length > 0) { - child.removeAllChildren(); - } + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; - this.remove(child); - }); } - updateBounds () { - let box = new THREE.Box3(); + fromBufferAttribute( attribute, index, offset ) { - if (this.position) { - box.expandByPoint(this.position); - } + if ( offset !== undefined ) { - for (let child of this.children) { - child.updateBounds(); + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); - box.union(child.boundingBox); } - this.boundingBox.copy(box); - } + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); - traverse (handler) { - let expand = handler(this); + return this; - if (expand === undefined || expand === true) { - for (let child of this.children) { - child.traverse(handler); - } - } } - traverseDescendants (handler) { - for (let child of this.children) { - child.traverse(handler); - } - } + random() { - flatten () { - let annotations = []; + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + this.w = Math.random(); - this.traverse(annotation => { - annotations.push(annotation); - }); + return this; - return annotations; } - descendants () { - let annotations = []; + } - this.traverse(annotation => { - if (annotation !== this) { - annotations.push(annotation); - } - }); + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget( width, height, options ) { - return annotations; - } + this.width = width; + this.height = height; - setHighlighted (highlighted) { - if (highlighted) { - this.domElement.css('opacity', '0.8'); - this.elTitlebar.css('box-shadow', '0 0 5px #fff'); - this.domElement.css('z-index', '1000'); + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; - if (this._description) { - this.descriptionVisible = true; - this.elDescription.fadeIn(200); - this.elDescription.css('position', 'relative'); - } - } else { - this.domElement.css('opacity', '0.5'); - this.elTitlebar.css('box-shadow', ''); - this.domElement.css('z-index', '100'); - this.descriptionVisible = false; - this.elDescription.css('display', 'none'); - } + this.viewport = new Vector4( 0, 0, width, height ); - this.isHighlighted = highlighted; - } + options = options || {}; - hasView () { - let hasPosTargetView = this.cameraTarget instanceof THREE.Vector3; - hasPosTargetView = hasPosTargetView && this.cameraPosition instanceof THREE.Vector3; + this.texture = new Texture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); - let hasRadiusView = this.radius !== undefined; + this.texture.image = {}; + this.texture.image.width = width; + this.texture.image.height = height; - let hasView = hasPosTargetView || hasRadiusView; + this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false; + this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter; - return hasView; - }; + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; - moveHere (camera) { - if (!this.hasView()) { - return; - } + } - let view = this.scene.view; - let animationDuration = 500; - let easing = TWEEN.Easing.Quartic.Out; + WebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher$1.prototype ), { - let endTarget; - if (this.cameraTarget) { - endTarget = this.cameraTarget; - } else if (this.position) { - endTarget = this.position; - } else { - endTarget = this.boundingBox.getCenter(new THREE.Vector3()); - } + constructor: WebGLRenderTarget, - if (this.cameraPosition) { - let endPosition = this.cameraPosition; + isWebGLRenderTarget: true, - Utils.moveTo(this.scene, endPosition, endTarget); - } else if (this.radius) { - let direction = view.direction; - let endPosition = endTarget.clone().add(direction.multiplyScalar(-this.radius)); - let startRadius = view.radius; - let endRadius = this.radius; + setSize: function ( width, height ) { - { // animate camera position - let tween = new TWEEN.Tween(view.position).to(endPosition, animationDuration); - tween.easing(easing); - tween.start(); - } + if ( this.width !== width || this.height !== height ) { - { // animate radius - let t = {x: 0}; + this.width = width; + this.height = height; - let tween = new TWEEN.Tween(t) - .to({x: 1}, animationDuration) - .onUpdate(function () { - view.radius = this.x * endRadius + (1 - this.x) * startRadius; - }); - tween.easing(easing); - tween.start(); - } - } - }; + this.texture.image.width = width; + this.texture.image.height = height; + + this.dispose(); - dispose () { - if (this.domElement.parentElement) { - this.domElement.parentElement.removeChild(this.domElement); } - }; - toString () { - return 'Annotation: ' + this._title; - } - }; + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); - class EnumItem{ - constructor(object){ - for(let key of Object.keys(object)){ - this[key] = object[key]; - } - } + }, - inspect(){ - return `Enum(${this.name}: ${this.value})`; - } - }; + clone: function () { - class Enum{ + return new this.constructor().copy( this ); - constructor(object){ - this.object = object; + }, - for(let key of Object.keys(object)){ - let value = object[key]; + copy: function ( source ) { - if(typeof value === "object"){ - value.name = key; - }else { - value = {name: key, value: value}; - } - - this[key] = new EnumItem(value); - } - } + this.width = source.width; + this.height = source.height; - fromValue(value){ - for(let key of Object.keys(this.object)){ - if(this[key].value === value){ - return this[key]; - } - } + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); - throw new Error(`No enum for value: ${value}`); } - - }; - const CameraMode = { - ORTHOGRAPHIC: 0, - PERSPECTIVE: 1, - VR: 2, - }; + } ); - const ClipTask = { - NONE: 0, - HIGHLIGHT: 1, - SHOW_INSIDE: 2, - SHOW_OUTSIDE: 3 - }; + function WebGLMultisampleRenderTarget( width, height, options ) { - const ClipMethod = { - INSIDE_ANY: 0, - INSIDE_ALL: 1 - }; + WebGLRenderTarget.call( this, width, height, options ); - const ElevationGradientRepeat = { - CLAMP: 0, - REPEAT: 1, - MIRRORED_REPEAT: 2, - }; + this.samples = 4; - const MOUSE = { - LEFT: 0b0001, - RIGHT: 0b0010, - MIDDLE: 0b0100 - }; + } - const PointSizeType = { - FIXED: 0, - ATTENUATED: 1, - ADAPTIVE: 2 - }; + WebGLMultisampleRenderTarget.prototype = Object.assign( Object.create( WebGLRenderTarget.prototype ), { - const PointShape = { - SQUARE: 0, - CIRCLE: 1, - PARABOLOID: 2 - }; + constructor: WebGLMultisampleRenderTarget, - const TreeType = { - OCTREE: 0, - KDTREE: 1 - }; + isWebGLMultisampleRenderTarget: true, - const LengthUnits = { - METER: {code: 'm', unitspermeter: 1.0}, - FEET: {code: 'ft', unitspermeter: 3.28084}, - INCH: {code: '\u2033', unitspermeter: 39.3701} - }; + copy: function ( source ) { - let ftCanvas = document.createElement('canvas'); + WebGLRenderTarget.prototype.copy.call( this, source ); - const Features = (function () { + this.samples = source.samples; + + return this; - let gl = ftCanvas.getContext('webgl') || ftCanvas.getContext('experimental-webgl'); - if (gl === null){ - return null; } - // -- code taken from THREE.WebGLRenderer -- - let _vertexShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT); - let _vertexShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT); - // Unused: let _vertexShaderPrecisionLowpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT); + } ); - let _fragmentShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT); - let _fragmentShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT); - // Unused: let _fragmentShaderPrecisionLowpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT); + class Quaternion { - let highpAvailable = _vertexShaderPrecisionHighpFloat.precision > 0 && _fragmentShaderPrecisionHighpFloat.precision > 0; - let mediumpAvailable = _vertexShaderPrecisionMediumpFloat.precision > 0 && _fragmentShaderPrecisionMediumpFloat.precision > 0; - // ----------------------------------------- + constructor( x = 0, y = 0, z = 0, w = 1 ) { + + Object.defineProperty( this, 'isQuaternion', { value: true } ); + + this._x = x; + this._y = y; + this._z = z; + this._w = w; - let precision; - if (highpAvailable) { - precision = 'highp'; - } else if (mediumpAvailable) { - precision = 'mediump'; - } else { - precision = 'lowp'; } - return { - SHADER_INTERPOLATION: { - isSupported: function () { - let supported = true; + static slerp( qa, qb, qm, t ) { - supported = supported && gl.getExtension('EXT_frag_depth'); - supported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8; + return qm.copy( qa ).slerp( qb, t ); - return supported; - } - }, - SHADER_SPLATS: { - isSupported: function () { - let supported = true; + } - supported = supported && gl.getExtension('EXT_frag_depth'); - supported = supported && gl.getExtension('OES_texture_float'); - supported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8; + static slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + let x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ]; + + const x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + let s = 1 - t; + const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + const sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; - return supported; } - }, - SHADER_EDL: { - isSupported: function () { - let supported = true; + const tDir = t * dir; - //supported = supported && gl.getExtension('EXT_frag_depth'); - supported = supported && gl.getExtension('OES_texture_float'); - supported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8; + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; - //supported = supported || (gl instanceof WebGL2RenderingContext); + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + const f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; - return supported; } - }, - //WEBGL2: { - // isSupported: function(){ - // return gl instanceof WebGL2RenderingContext; - // } - //}, - precision: precision - }; - }()); + } - const KeyCodes = { + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; - LEFT: 37, - UP: 38, - RIGHT: 39, - BOTTOM: 40, - DELETE: 46, + } - A: 'A'.charCodeAt(0), - S: 'S'.charCodeAt(0), - D: 'D'.charCodeAt(0), - W: 'W'.charCodeAt(0), - Q: 'Q'.charCodeAt(0), - E: 'E'.charCodeAt(0), - R: 'R'.charCodeAt(0), - F: 'F'.charCodeAt(0) - - }; + static multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) { - class LRUItem{ + const x0 = src0[ srcOffset0 ]; + const y0 = src0[ srcOffset0 + 1 ]; + const z0 = src0[ srcOffset0 + 2 ]; + const w0 = src0[ srcOffset0 + 3 ]; + + const x1 = src1[ srcOffset1 ]; + const y1 = src1[ srcOffset1 + 1 ]; + const z1 = src1[ srcOffset1 + 2 ]; + const w1 = src1[ srcOffset1 + 3 ]; + + dst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1; + dst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1; + dst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1; + dst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1; + + return dst; - constructor(node){ - this.previous = null; - this.next = null; - this.node = node; } - } + get x() { - /** - * - * @class A doubly-linked-list of the least recently used elements. - */ - class LRU{ + return this._x; - constructor(){ - // the least recently used item - this.first = null; - // the most recently used item - this.last = null; - // a list of all items in the lru list - this.items = {}; - this.elements = 0; - this.numPoints = 0; } - size(){ - return this.elements; + set x( value ) { + + this._x = value; + this._onChangeCallback(); + } - contains(node){ - return this.items[node.id] == null; + get y() { + + return this._y; + } - touch(node){ - if (!node.loaded) { - return; - } + set y( value ) { - let item; - if (this.items[node.id] == null) { - // add to list - item = new LRUItem(node); - item.previous = this.last; - this.last = item; - if (item.previous !== null) { - item.previous.next = item; - } + this._y = value; + this._onChangeCallback(); - this.items[node.id] = item; - this.elements++; + } - if (this.first === null) { - this.first = item; - } - this.numPoints += node.numPoints; - } else { - // update in list - item = this.items[node.id]; - if (item.previous === null) { - // handle touch on first element - if (item.next !== null) { - this.first = item.next; - this.first.previous = null; - item.previous = this.last; - item.next = null; - this.last = item; - item.previous.next = item; - } - } else if (item.next === null) { - // handle touch on last element - } else { - // handle touch on any other element - item.previous.next = item.next; - item.next.previous = item.previous; - item.previous = this.last; - item.next = null; - this.last = item; - item.previous.next = item; - } - } - } + get z() { - remove(node){ - let lruItem = this.items[node.id]; - if (lruItem) { - if (this.elements === 1) { - this.first = null; - this.last = null; - } else { - if (!lruItem.previous) { - this.first = lruItem.next; - this.first.previous = null; - } - if (!lruItem.next) { - this.last = lruItem.previous; - this.last.next = null; - } - if (lruItem.previous && lruItem.next) { - lruItem.previous.next = lruItem.next; - lruItem.next.previous = lruItem.previous; - } - } + return this._z; - delete this.items[node.id]; - this.elements--; - this.numPoints -= node.numPoints; - } } - getLRUItem(){ - if (this.first === null) { - return null; - } - let lru = this.first; + set z( value ) { - return lru.node; - } + this._z = value; + this._onChangeCallback(); - toString(){ - let string = '{ '; - let curr = this.first; - while (curr !== null) { - string += curr.node.id; - if (curr.next !== null) { - string += ', '; - } - curr = curr.next; - } - string += '}'; - string += '(' + this.size() + ')'; - return string; } - freeMemory(){ - if (this.elements <= 1) { - return; - } + get w() { - while (this.numPoints > Potree.pointLoadLimit) { - let element = this.first; - let node = element.node; - this.disposeDescendants(node); - } - } + return this._w; - disposeDescendants(node){ - let stack = []; - stack.push(node); - while (stack.length > 0) { - let current = stack.pop(); + } - // console.log(current); + set w( value ) { - current.dispose(); - this.remove(current); + this._w = value; + this._onChangeCallback(); - for (let key in current.children) { - if (current.children.hasOwnProperty(key)) { - let child = current.children[key]; - if (child.loaded) { - stack.push(current.children[key]); - } - } - } - } } - } + set( x, y, z, w ) { - class PointCloudTreeNode extends EventDispatcher{ + this._x = x; + this._y = y; + this._z = z; + this._w = w; - constructor(){ - super(); - this.needsTransformUpdate = true; - } + this._onChangeCallback(); - getChildren () { - throw new Error('override function'); - } + return this; - getBoundingBox () { - throw new Error('override function'); } - isLoaded () { - throw new Error('override function'); - } + clone() { - isGeometryNode () { - throw new Error('override function'); - } + return new this.constructor( this._x, this._y, this._z, this._w ); - isTreeNode () { - throw new Error('override function'); } - getLevel () { - throw new Error('override function'); - } + copy( quaternion ) { - getBoundingSphere () { - throw new Error('override function'); - } - }; + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; - class PointCloudTree extends THREE.Object3D { - constructor () { - super(); - } + this._onChangeCallback(); + + return this; - initialized () { - return this.root !== null; } - }; - /** - * Some types of possible point attribute data formats - * - * @class - */ - const PointAttributeTypes = { - DATA_TYPE_DOUBLE: {ordinal: 0, name: "double", size: 8}, - DATA_TYPE_FLOAT: {ordinal: 1, name: "float", size: 4}, - DATA_TYPE_INT8: {ordinal: 2, name: "int8", size: 1}, - DATA_TYPE_UINT8: {ordinal: 3, name: "uint8", size: 1}, - DATA_TYPE_INT16: {ordinal: 4, name: "int16", size: 2}, - DATA_TYPE_UINT16: {ordinal: 5, name: "uint16", size: 2}, - DATA_TYPE_INT32: {ordinal: 6, name: "int32", size: 4}, - DATA_TYPE_UINT32: {ordinal: 7, name: "uint32", size: 4}, - DATA_TYPE_INT64: {ordinal: 8, name: "int64", size: 8}, - DATA_TYPE_UINT64: {ordinal: 9, name: "uint64", size: 8} - }; + setFromEuler( euler, update ) { - let i = 0; - for (let obj in PointAttributeTypes) { - PointAttributeTypes[i] = PointAttributeTypes[obj]; - i++; - } + if ( ! ( euler && euler.isEuler ) ) { + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); - class PointAttribute{ - - constructor(name, type, numElements){ - this.name = name; - this.type = type; - this.numElements = numElements; - this.byteSize = this.numElements * this.type.size; - this.description = ""; - this.range = [Infinity, -Infinity]; - } + } - }; + const x = euler._x, y = euler._y, z = euler._z, order = euler._order; - PointAttribute.POSITION_CARTESIAN = new PointAttribute( - "POSITION_CARTESIAN", PointAttributeTypes.DATA_TYPE_FLOAT, 3); + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m - PointAttribute.RGBA_PACKED = new PointAttribute( - "COLOR_PACKED", PointAttributeTypes.DATA_TYPE_INT8, 4); + const cos = Math.cos; + const sin = Math.sin; - PointAttribute.COLOR_PACKED = PointAttribute.RGBA_PACKED; + const c1 = cos( x / 2 ); + const c2 = cos( y / 2 ); + const c3 = cos( z / 2 ); - PointAttribute.RGB_PACKED = new PointAttribute( - "COLOR_PACKED", PointAttributeTypes.DATA_TYPE_INT8, 3); + const s1 = sin( x / 2 ); + const s2 = sin( y / 2 ); + const s3 = sin( z / 2 ); - PointAttribute.NORMAL_FLOATS = new PointAttribute( - "NORMAL_FLOATS", PointAttributeTypes.DATA_TYPE_FLOAT, 3); + switch ( order ) { - PointAttribute.INTENSITY = new PointAttribute( - "INTENSITY", PointAttributeTypes.DATA_TYPE_UINT16, 1); + case 'XYZ': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; - PointAttribute.CLASSIFICATION = new PointAttribute( - "CLASSIFICATION", PointAttributeTypes.DATA_TYPE_UINT8, 1); + case 'YXZ': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; - PointAttribute.NORMAL_SPHEREMAPPED = new PointAttribute( - "NORMAL_SPHEREMAPPED", PointAttributeTypes.DATA_TYPE_UINT8, 2); + case 'ZXY': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; - PointAttribute.NORMAL_OCT16 = new PointAttribute( - "NORMAL_OCT16", PointAttributeTypes.DATA_TYPE_UINT8, 2); + case 'ZYX': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; - PointAttribute.NORMAL = new PointAttribute( - "NORMAL", PointAttributeTypes.DATA_TYPE_FLOAT, 3); - - PointAttribute.RETURN_NUMBER = new PointAttribute( - "RETURN_NUMBER", PointAttributeTypes.DATA_TYPE_UINT8, 1); - - PointAttribute.NUMBER_OF_RETURNS = new PointAttribute( - "NUMBER_OF_RETURNS", PointAttributeTypes.DATA_TYPE_UINT8, 1); - - PointAttribute.SOURCE_ID = new PointAttribute( - "SOURCE_ID", PointAttributeTypes.DATA_TYPE_UINT16, 1); + case 'YZX': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; - PointAttribute.INDICES = new PointAttribute( - "INDICES", PointAttributeTypes.DATA_TYPE_UINT32, 1); + case 'XZY': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; - PointAttribute.SPACING = new PointAttribute( - "SPACING", PointAttributeTypes.DATA_TYPE_FLOAT, 1); + default: + console.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order ); - PointAttribute.GPS_TIME = new PointAttribute( - "GPS_TIME", PointAttributeTypes.DATA_TYPE_DOUBLE, 1); + } - class PointAttributes{ + if ( update !== false ) this._onChangeCallback(); - constructor(pointAttributes){ - this.attributes = []; - this.byteSize = 0; - this.size = 0; - this.vectors = []; + return this; - if (pointAttributes != null) { - for (let i = 0; i < pointAttributes.length; i++) { - let pointAttributeName = pointAttributes[i]; - let pointAttribute = PointAttribute[pointAttributeName]; - this.attributes.push(pointAttribute); - this.byteSize += pointAttribute.byteSize; - this.size++; - } - } } + setFromAxisAngle( axis, angle ) { - add(pointAttribute){ - this.attributes.push(pointAttribute); - this.byteSize += pointAttribute.byteSize; - this.size++; - }; + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + const halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this._onChangeCallback(); + + return this; - addVector(vector){ - this.vectors.push(vector); } - hasColors(){ - for (let name in this.attributes) { - let pointAttribute = this.attributes[name]; - if (pointAttribute.name === PointAttributeNames.COLOR_PACKED) { - return true; - } - } + setFromRotationMatrix( m ) { - return false; - }; + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm - hasNormals(){ - for (let name in this.attributes) { - let pointAttribute = this.attributes[name]; - if ( - pointAttribute === PointAttribute.NORMAL_SPHEREMAPPED || - pointAttribute === PointAttribute.NORMAL_FLOATS || - pointAttribute === PointAttribute.NORMAL || - pointAttribute === PointAttribute.NORMAL_OCT16) { - return true; - } - } + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) - return false; - }; + const te = m.elements, - } + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], - class U { - static toVector3(v, offset) { - return new THREE.Vector3().fromArray(v, offset || 0); - } + trace = m11 + m22 + m33; - static toBox3(b) { - return new THREE.Box3(U.toVector3(b), U.toVector3(b, 3)); - }; + if ( trace > 0 ) { - static findDim(schema, name) { - var dim = schema.find((dim) => dim.name == name); - if (!dim) throw new Error('Failed to find ' + name + ' in schema'); - return dim; - } + const s = 0.5 / Math.sqrt( trace + 1.0 ); - static sphereFrom(b) { - return b.getBoundingSphere(new THREE.Sphere()); - } - }; + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; - class PointCloudEptGeometry { - constructor(url, info) { - let version = info.version; - let schema = info.schema; - let bounds = info.bounds; - let boundsConforming = info.boundsConforming; + } else if ( m11 > m22 && m11 > m33 ) { - let xyz = [ - U.findDim(schema, 'X'), - U.findDim(schema, 'Y'), - U.findDim(schema, 'Z') - ]; - let scale = xyz.map((d) => d.scale || 1); - let offset = xyz.map((d) => d.offset || 0); - this.eptScale = U.toVector3(scale); - this.eptOffset = U.toVector3(offset); + const s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); - this.url = url; - this.info = info; - this.type = 'ept'; + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; - this.schema = schema; - this.span = info.span || info.ticks; - this.boundingBox = U.toBox3(bounds); - this.tightBoundingBox = U.toBox3(boundsConforming); - this.offset = U.toVector3([0, 0, 0]); - this.boundingSphere = U.sphereFrom(this.boundingBox); - this.tightBoundingSphere = U.sphereFrom(this.tightBoundingBox); - this.version = new Potree.Version('1.7'); + } else if ( m22 > m33 ) { - this.projection = null; - this.fallbackProjection = null; + const s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); - if (info.srs && info.srs.horizontal) { - this.projection = info.srs.authority + ':' + info.srs.horizontal; - } + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + const s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; - if (info.srs.wkt) { - if (!this.projection) this.projection = info.srs.wkt; - else this.fallbackProjection = info.srs.wkt; } - { - // TODO [mschuetz]: named projections that proj4 can't handle seem to cause problems. - // remove them for now + this._onChangeCallback(); - try{ - proj4(this.projection); - }catch(e){ - this.projection = null; - } + return this; - + } - } + setFromUnitVectors( vFrom, vTo ) { - - { - const attributes = new PointAttributes(); + // assumes direction vectors vFrom and vTo are normalized - attributes.add(PointAttribute.POSITION_CARTESIAN); - attributes.add(new PointAttribute("rgba", PointAttributeTypes.DATA_TYPE_UINT8, 4)); - attributes.add(new PointAttribute("intensity", PointAttributeTypes.DATA_TYPE_UINT16, 1)); - attributes.add(new PointAttribute("classification", PointAttributeTypes.DATA_TYPE_UINT8, 1)); - attributes.add(new PointAttribute("gps-time", PointAttributeTypes.DATA_TYPE_DOUBLE, 1)); - attributes.add(new PointAttribute("returnNumber", PointAttributeTypes.DATA_TYPE_UINT8, 1)); - attributes.add(new PointAttribute("number of returns", PointAttributeTypes.DATA_TYPE_UINT8, 1)); - attributes.add(new PointAttribute("return number", PointAttributeTypes.DATA_TYPE_UINT8, 1)); - attributes.add(new PointAttribute("source id", PointAttributeTypes.DATA_TYPE_UINT16, 1)); + const EPS = 0.000001; - this.pointAttributes = attributes; - } + let r = vFrom.dot( vTo ) + 1; + if ( r < EPS ) { + r = 0; - this.spacing = - (this.boundingBox.max.x - this.boundingBox.min.x) / this.span; + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { - let hierarchyType = info.hierarchyType || 'json'; + this._x = - vFrom.y; + this._y = vFrom.x; + this._z = 0; + this._w = r; + + } else { + + this._x = 0; + this._y = - vFrom.z; + this._z = vFrom.y; + this._w = r; + + } + + } else { + + // crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3 + + this._x = vFrom.y * vTo.z - vFrom.z * vTo.y; + this._y = vFrom.z * vTo.x - vFrom.x * vTo.z; + this._z = vFrom.x * vTo.y - vFrom.y * vTo.x; + this._w = r; - const dataType = info.dataType; - if (dataType == 'laszip') { - this.loader = new Potree.EptLaszipLoader(); - } - else if (dataType == 'binary') { - this.loader = new Potree.EptBinaryLoader(); - } - else if (dataType == 'zstandard') { - this.loader = new Potree.EptZstandardLoader(); - } - else { - throw new Error('Could not read data type: ' + dataType); } - } - }; - class EptKey { - constructor(ept, b, d, x, y, z) { - this.ept = ept; - this.b = b; - this.d = d; - this.x = x || 0; - this.y = y || 0; - this.z = z || 0; + return this.normalize(); + } - name() { - return this.d + '-' + this.x + '-' + this.y + '-' + this.z; + angleTo( q ) { + + return 2 * Math.acos( Math.abs( MathUtils.clamp( this.dot( q ), - 1, 1 ) ) ); + } - step(a, b, c) { - let min = this.b.min.clone(); - let max = this.b.max.clone(); - let dst = new THREE.Vector3().subVectors(max, min); + rotateTowards( q, step ) { - if (a) min.x += dst.x / 2; - else max.x -= dst.x / 2; + const angle = this.angleTo( q ); - if (b) min.y += dst.y / 2; - else max.y -= dst.y / 2; + if ( angle === 0 ) return this; - if (c) min.z += dst.z / 2; - else max.z -= dst.z / 2; + const t = Math.min( 1, step / angle ); - return new Potree.EptKey( - this.ept, - new THREE.Box3(min, max), - this.d + 1, - this.x * 2 + a, - this.y * 2 + b, - this.z * 2 + c); - } + this.slerp( q, t ); + + return this; - children() { - var result = []; - for (var a = 0; a < 2; ++a) { - for (var b = 0; b < 2; ++b) { - for (var c = 0; c < 2; ++c) { - var add = this.step(a, b, c).name(); - if (!result.includes(add)) result = result.concat(add); - } - } - } - return result; } - } - class PointCloudEptGeometryNode extends PointCloudTreeNode { - constructor(ept, b, d, x, y, z) { - super(); + identity() { - this.ept = ept; - this.key = new Potree.EptKey( - this.ept, - b || this.ept.boundingBox, - d || 0, - x, - y, - z); + return this.set( 0, 0, 0, 1 ); - this.id = PointCloudEptGeometryNode.IDCount++; - this.geometry = null; - this.boundingBox = this.key.b; - this.tightBoundingBox = this.boundingBox; - this.spacing = this.ept.spacing / Math.pow(2, this.key.d); - this.boundingSphere = U.sphereFrom(this.boundingBox); + } - // These are set during hierarchy loading. - this.hasChildren = false; - this.children = { }; - this.numPoints = -1; + invert() { - this.level = this.key.d; - this.loaded = false; - this.loading = false; - this.oneTimeDisposeHandlers = []; + // quaternion is assumed to have unit length + + return this.conjugate(); - let k = this.key; - this.name = this.toPotreeName(k.d, k.x, k.y, k.z); - this.index = parseInt(this.name.charAt(this.name.length - 1)); } - isGeometryNode() { return true; } - getLevel() { return this.level; } - isTreeNode() { return false; } - isLoaded() { return this.loaded; } - getBoundingSphere() { return this.boundingSphere; } - getBoundingBox() { return this.boundingBox; } - url() { return this.ept.url + 'ept-data/' + this.filename(); } - getNumPoints() { return this.numPoints; } + conjugate() { - filename() { return this.key.name(); } + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; - getChildren() { - let children = []; + this._onChangeCallback(); - for (let i = 0; i < 8; i++) { - if (this.children[i]) { - children.push(this.children[i]); - } - } + return this; - return children; } - addChild(child) { - this.children[child.index] = child; - child.parent = this; + dot( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + } - load() { - if (this.loaded || this.loading) return; - if (Potree.numNodesLoading >= Potree.maxNodesLoading) return; + lengthSq() { - this.loading = true; - ++Potree.numNodesLoading; + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; - if (this.numPoints == -1) this.loadHierarchy(); - this.loadPoints(); } - loadPoints(){ - this.ept.loader.load(this); + length() { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + } - async loadHierarchy() { - let nodes = { }; - nodes[this.filename()] = this; - this.hasChildren = false; + normalize() { - let eptHierarchyFile = - `${this.ept.url}ept-hierarchy/${this.filename()}.json`; + let l = this.length(); - let response = await fetch(eptHierarchyFile); - let hier = await response.json(); + if ( l === 0 ) { - // Since we want to traverse top-down, and 10 comes - // lexicographically before 9 (for example), do a deep sort. - var keys = Object.keys(hier).sort((a, b) => { - let [da, xa, ya, za] = a.split('-').map((n) => parseInt(n, 10)); - let [db, xb, yb, zb] = b.split('-').map((n) => parseInt(n, 10)); - if (da < db) return -1; if (da > db) return 1; - if (xa < xb) return -1; if (xa > xb) return 1; - if (ya < yb) return -1; if (ya > yb) return 1; - if (za < zb) return -1; if (za > zb) return 1; - return 0; - }); + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; - keys.forEach((v) => { - let [d, x, y, z] = v.split('-').map((n) => parseInt(n, 10)); - let a = x & 1, b = y & 1, c = z & 1; - let parentName = - (d - 1) + '-' + (x >> 1) + '-' + (y >> 1) + '-' + (z >> 1); + } else { - let parentNode = nodes[parentName]; - if (!parentNode) return; - parentNode.hasChildren = true; + l = 1 / l; - let key = parentNode.key.step(a, b, c); + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; - let node = new Potree.PointCloudEptGeometryNode( - this.ept, - key.b, - key.d, - key.x, - key.y, - key.z); + } - node.level = d; - node.numPoints = hier[v]; + this._onChangeCallback(); + + return this; - parentNode.addChild(node); - nodes[key.name()] = node; - }); } - doneLoading(bufferGeometry, tightBoundingBox, np, mean) { - bufferGeometry.boundingBox = this.boundingBox; - this.geometry = bufferGeometry; - this.tightBoundingBox = tightBoundingBox; - this.numPoints = np; - this.mean = mean; - this.loaded = true; - this.loading = false; - --Potree.numNodesLoading; + multiply( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + } - toPotreeName(d, x, y, z) { - var name = 'r'; + premultiply( q ) { - for (var i = 0; i < d; ++i) { - var shift = d - i - 1; - var mask = 1 << shift; - var step = 0; + return this.multiplyQuaternions( q, this ); - if (x & mask) step += 4; - if (y & mask) step += 2; - if (z & mask) step += 1; + } - name += step; - } + multiplyQuaternions( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this._onChangeCallback(); + + return this; - return name; } - dispose() { - if (this.geometry && this.parent != null) { - this.geometry.dispose(); - this.geometry = null; - this.loaded = false; + slerp( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + const x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + let cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + const sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta; + + if ( sqrSinHalfTheta <= Number.EPSILON ) { + + const s = 1 - t; + this._w = s * w + t * this._w; + this._x = s * x + t * this._x; + this._y = s * y + t * this._y; + this._z = s * z + t * this._z; + + this.normalize(); + this._onChangeCallback(); + + return this; - // this.dispatchEvent( { type: 'dispose' } ); - for (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) { - let handler = this.oneTimeDisposeHandlers[i]; - handler(); - } - this.oneTimeDisposeHandlers = []; } + + const sinHalfTheta = Math.sqrt( sqrSinHalfTheta ); + const halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + const ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this._onChangeCallback(); + + return this; + } - } - PointCloudEptGeometryNode.IDCount = 0; + equals( quaternion ) { - class PointCloudOctreeGeometry{ + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); - constructor(){ - this.url = null; - this.octreeDir = null; - this.spacing = 0; - this.boundingBox = null; - this.root = null; - this.nodes = null; - this.pointAttributes = null; - this.hierarchyStepSize = -1; - this.loader = null; } - - } - class PointCloudOctreeGeometryNode extends PointCloudTreeNode{ + fromArray( array, offset = 0 ) { - constructor(name, pcoGeometry, boundingBox){ - super(); + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this._onChangeCallback(); + + return this; - this.id = PointCloudOctreeGeometryNode.IDCount++; - this.name = name; - this.index = parseInt(name.charAt(name.length - 1)); - this.pcoGeometry = pcoGeometry; - this.geometry = null; - this.boundingBox = boundingBox; - this.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere()); - this.children = {}; - this.numPoints = 0; - this.level = null; - this.loaded = false; - this.oneTimeDisposeHandlers = []; } - isGeometryNode(){ - return true; + toArray( array = [], offset = 0 ) { + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + } - getLevel(){ - return this.level; + fromBufferAttribute( attribute, index ) { + + this._x = attribute.getX( index ); + this._y = attribute.getY( index ); + this._z = attribute.getZ( index ); + this._w = attribute.getW( index ); + + return this; + } - isTreeNode(){ - return false; + _onChange( callback ) { + + this._onChangeCallback = callback; + + return this; + } - isLoaded(){ - return this.loaded; + _onChangeCallback() {} + + } + + class Vector3 { + + constructor( x = 0, y = 0, z = 0 ) { + + Object.defineProperty( this, 'isVector3', { value: true } ); + + this.x = x; + this.y = y; + this.z = z; + } - getBoundingSphere(){ - return this.boundingSphere; + set( x, y, z ) { + + if ( z === undefined ) z = this.z; // sprite.scale.set(x,y) + + this.x = x; + this.y = y; + this.z = z; + + return this; + } - getBoundingBox(){ - return this.boundingBox; + setScalar( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + } - getChildren(){ - let children = []; + setX( x ) { - for (let i = 0; i < 8; i++) { - if (this.children[i]) { - children.push(this.children[i]); - } - } + this.x = x; + + return this; - return children; } - getBoundingBox(){ - return this.boundingBox; + setY( y ) { + + this.y = y; + + return this; + } - getURL(){ - let url = ''; + setZ( z ) { - let version = this.pcoGeometry.loader.version; + this.z = z; - if (version.equalOrHigher('1.5')) { - url = this.pcoGeometry.octreeDir + '/' + this.getHierarchyPath() + '/' + this.name; - } else if (version.equalOrHigher('1.4')) { - url = this.pcoGeometry.octreeDir + '/' + this.name; - } else if (version.upTo('1.3')) { - url = this.pcoGeometry.octreeDir + '/' + this.name; - } + return this; - return url; } - getHierarchyPath(){ - let path = 'r/'; + setComponent( index, value ) { - let hierarchyStepSize = this.pcoGeometry.hierarchyStepSize; - let indices = this.name.substr(1); + switch ( index ) { - let numParts = Math.floor(indices.length / hierarchyStepSize); - for (let i = 0; i < numParts; i++) { - path += indices.substr(i * hierarchyStepSize, hierarchyStepSize) + '/'; - } + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); - path = path.slice(0, -1); + } - return path; - } + return this; - addChild(child) { - this.children[child.index] = child; - child.parent = this; } - load(){ - if (this.loading === true || this.loaded === true || Potree.numNodesLoading >= Potree.maxNodesLoading) { - return; - } + getComponent( index ) { - this.loading = true; + switch ( index ) { - Potree.numNodesLoading++; + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); - if (this.pcoGeometry.loader.version.equalOrHigher('1.5')) { - if ((this.level % this.pcoGeometry.hierarchyStepSize) === 0 && this.hasChildren) { - this.loadHierachyThenPoints(); - } else { - this.loadPoints(); - } - } else { - this.loadPoints(); } - } - loadPoints(){ - this.pcoGeometry.loader.load(this); } - loadHierachyThenPoints(){ - let node = this; + clone() { - // load hierarchy - let callback = function (node, hbuffer) { + return new this.constructor( this.x, this.y, this.z ); - let tStart = performance.now(); + } - let view = new DataView(hbuffer); + copy( v ) { - let stack = []; - let children = view.getUint8(0); - let numPoints = view.getUint32(1, true); - node.numPoints = numPoints; - stack.push({children: children, numPoints: numPoints, name: node.name}); + this.x = v.x; + this.y = v.y; + this.z = v.z; - let decoded = []; + return this; - let offset = 5; - while (stack.length > 0) { - let snode = stack.shift(); - let mask = 1; - for (let i = 0; i < 8; i++) { - if ((snode.children & mask) !== 0) { - let childName = snode.name + i; + } - let childChildren = view.getUint8(offset); - let childNumPoints = view.getUint32(offset + 1, true); + add( v, w ) { - stack.push({children: childChildren, numPoints: childNumPoints, name: childName}); + if ( w !== undefined ) { - decoded.push({children: childChildren, numPoints: childNumPoints, name: childName}); + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); - offset += 5; - } + } - mask = mask * 2; - } + this.x += v.x; + this.y += v.y; + this.z += v.z; - if (offset === hbuffer.byteLength) { - break; - } - } + return this; - // console.log(decoded); + } - let nodes = {}; - nodes[node.name] = node; - let pco = node.pcoGeometry; + addScalar( s ) { - for (let i = 0; i < decoded.length; i++) { - let name = decoded[i].name; - let decodedNumPoints = decoded[i].numPoints; - let index = parseInt(name.charAt(name.length - 1)); - let parentName = name.substring(0, name.length - 1); - let parentNode = nodes[parentName]; - let level = name.length - 1; - let boundingBox = Utils.createChildAABB(parentNode.boundingBox, index); + this.x += s; + this.y += s; + this.z += s; - let currentNode = new PointCloudOctreeGeometryNode(name, pco, boundingBox); - currentNode.level = level; - currentNode.numPoints = decodedNumPoints; - currentNode.hasChildren = decoded[i].children > 0; - currentNode.spacing = pco.spacing / Math.pow(2, level); - parentNode.addChild(currentNode); - nodes[name] = currentNode; - } + return this; - let duration = performance.now() - tStart; - if(duration > 5){ - let msg = `duration: ${duration}ms, numNodes: ${decoded.length}`; - console.log(msg); - } + } - node.loadPoints(); - }; - if ((node.level % node.pcoGeometry.hierarchyStepSize) === 0) { - // let hurl = node.pcoGeometry.octreeDir + "/../hierarchy/" + node.name + ".hrc"; - let hurl = node.pcoGeometry.octreeDir + '/' + node.getHierarchyPath() + '/' + node.name + '.hrc'; + addVectors( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; - let xhr = XHRFactory.createXMLHttpRequest(); - xhr.open('GET', hurl, true); - xhr.responseType = 'arraybuffer'; - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - xhr.onreadystatechange = () => { - if (xhr.readyState === 4) { - if (xhr.status === 200 || xhr.status === 0) { - let hbuffer = xhr.response; - callback(node, hbuffer); - } else { - console.log('Failed to load file! HTTP status: ' + xhr.status + ', file: ' + hurl); - Potree.numNodesLoading--; - } - } - }; - try { - xhr.send(null); - } catch (e) { - console.log('fehler beim laden der punktwolke: ' + e); - } - } } - getNumPoints(){ - return this.numPoints; + addScaledVector( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + } - dispose(){ - if (this.geometry && this.parent != null) { - this.geometry.dispose(); - this.geometry = null; - this.loaded = false; + sub( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); - this.dispatchEvent( { type: 'dispose' } ); - - for (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) { - let handler = this.oneTimeDisposeHandlers[i]; - handler(); - } - this.oneTimeDisposeHandlers = []; } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + } - - } - PointCloudOctreeGeometryNode.IDCount = 0; + subScalar( s ) { - // ------------------------------------------- - // to get a ready to use gradient array from a chroma.js gradient: - // http://gka.github.io/chroma.js/ - // ------------------------------------------- - // - // let stops = []; - // for(let i = 0; i <= 10; i++){ - // let range = chroma.scale(['yellow', 'navy']).mode('lch').domain([10,0])(i)._rgb - // .slice(0, 3) - // .map(v => (v / 255).toFixed(4)) - // .join(", "); - // - // let line = `[${i / 10}, new THREE.Color(${range})],`; - // - // stops.push(line); - // } - // stops.join("\n"); - // - // - // - // ------------------------------------------- - // to get a ready to use gradient array from matplotlib: - // ------------------------------------------- - // import matplotlib.pyplot as plt - // import matplotlib.colors as colors - // - // norm = colors.Normalize(vmin=0,vmax=1) - // cmap = plt.cm.viridis - // - // for i in range(0,11): - // u = i / 10 - // rgb = cmap(norm(u))[0:3] - // rgb = ["{0:.3f}".format(v) for v in rgb] - // rgb = "[" + str(u) + ", new THREE.Color(" + ", ".join(rgb) + ")]," - // print(rgb) + this.x -= s; + this.y -= s; + this.z -= s; - let Gradients = { - // From chroma spectral http://gka.github.io/chroma.js/ - SPECTRAL: [ - [0, new THREE.Color(0.3686, 0.3098, 0.6353)], - [0.1, new THREE.Color(0.1961, 0.5333, 0.7412)], - [0.2, new THREE.Color(0.4000, 0.7608, 0.6471)], - [0.3, new THREE.Color(0.6706, 0.8667, 0.6431)], - [0.4, new THREE.Color(0.9020, 0.9608, 0.5961)], - [0.5, new THREE.Color(1.0000, 1.0000, 0.7490)], - [0.6, new THREE.Color(0.9961, 0.8784, 0.5451)], - [0.7, new THREE.Color(0.9922, 0.6824, 0.3804)], - [0.8, new THREE.Color(0.9569, 0.4275, 0.2627)], - [0.9, new THREE.Color(0.8353, 0.2431, 0.3098)], - [1, new THREE.Color(0.6196, 0.0039, 0.2588)] - ], - PLASMA: [ - [0.0, new THREE.Color(0.241, 0.015, 0.610)], - [0.1, new THREE.Color(0.387, 0.001, 0.654)], - [0.2, new THREE.Color(0.524, 0.025, 0.653)], - [0.3, new THREE.Color(0.651, 0.125, 0.596)], - [0.4, new THREE.Color(0.752, 0.227, 0.513)], - [0.5, new THREE.Color(0.837, 0.329, 0.431)], - [0.6, new THREE.Color(0.907, 0.435, 0.353)], - [0.7, new THREE.Color(0.963, 0.554, 0.272)], - [0.8, new THREE.Color(0.992, 0.681, 0.195)], - [0.9, new THREE.Color(0.987, 0.822, 0.144)], - [1.0, new THREE.Color(0.940, 0.975, 0.131)] - ], - YELLOW_GREEN: [ - [0, new THREE.Color(0.1647, 0.2824, 0.3451)], - [0.1, new THREE.Color(0.1338, 0.3555, 0.4227)], - [0.2, new THREE.Color(0.0610, 0.4319, 0.4864)], - [0.3, new THREE.Color(0.0000, 0.5099, 0.5319)], - [0.4, new THREE.Color(0.0000, 0.5881, 0.5569)], - [0.5, new THREE.Color(0.1370, 0.6650, 0.5614)], - [0.6, new THREE.Color(0.2906, 0.7395, 0.5477)], - [0.7, new THREE.Color(0.4453, 0.8099, 0.5201)], - [0.8, new THREE.Color(0.6102, 0.8748, 0.4850)], - [0.9, new THREE.Color(0.7883, 0.9323, 0.4514)], - [1, new THREE.Color(0.9804, 0.9804, 0.4314)] - ], - VIRIDIS: [ - [0.0, new THREE.Color(0.267, 0.005, 0.329)], - [0.1, new THREE.Color(0.283, 0.141, 0.458)], - [0.2, new THREE.Color(0.254, 0.265, 0.530)], - [0.3, new THREE.Color(0.207, 0.372, 0.553)], - [0.4, new THREE.Color(0.164, 0.471, 0.558)], - [0.5, new THREE.Color(0.128, 0.567, 0.551)], - [0.6, new THREE.Color(0.135, 0.659, 0.518)], - [0.7, new THREE.Color(0.267, 0.749, 0.441)], - [0.8, new THREE.Color(0.478, 0.821, 0.318)], - [0.9, new THREE.Color(0.741, 0.873, 0.150)], - [1.0, new THREE.Color(0.993, 0.906, 0.144)] - ], - INFERNO: [ - [0.0, new THREE.Color(0.077, 0.042, 0.206)], - [0.1, new THREE.Color(0.225, 0.036, 0.388)], - [0.2, new THREE.Color(0.373, 0.074, 0.432)], - [0.3, new THREE.Color(0.522, 0.128, 0.420)], - [0.4, new THREE.Color(0.665, 0.182, 0.370)], - [0.5, new THREE.Color(0.797, 0.255, 0.287)], - [0.6, new THREE.Color(0.902, 0.364, 0.184)], - [0.7, new THREE.Color(0.969, 0.516, 0.063)], - [0.8, new THREE.Color(0.988, 0.683, 0.072)], - [0.9, new THREE.Color(0.961, 0.859, 0.298)], - [1.0, new THREE.Color(0.988, 0.998, 0.645)] - ], - GRAYSCALE: [ - [0, new THREE.Color(0, 0, 0)], - [1, new THREE.Color(1, 1, 1)] - ], - // 16 samples of the TURBU color scheme - // values taken from: https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f - // original file licensed under Apache-2.0 - TURBO: [ - [0.00, new THREE.Color(0.18995, 0.07176, 0.23217)], - [0.07, new THREE.Color(0.25107, 0.25237, 0.63374)], - [0.13, new THREE.Color(0.27628, 0.42118, 0.89123)], - [0.20, new THREE.Color(0.25862, 0.57958, 0.99876)], - [0.27, new THREE.Color(0.15844, 0.73551, 0.92305)], - [0.33, new THREE.Color(0.09267, 0.86554, 0.7623)], - [0.40, new THREE.Color(0.19659, 0.94901, 0.59466)], - [0.47, new THREE.Color(0.42778, 0.99419, 0.38575)], - [0.53, new THREE.Color(0.64362, 0.98999, 0.23356)], - [0.60, new THREE.Color(0.80473, 0.92452, 0.20459)], - [0.67, new THREE.Color(0.93301, 0.81236, 0.22667)], - [0.73, new THREE.Color(0.99314, 0.67408, 0.20348)], - [0.80, new THREE.Color(0.9836, 0.49291, 0.12849)], - [0.87, new THREE.Color(0.92105, 0.31489, 0.05475)], - [0.93, new THREE.Color(0.81608, 0.18462, 0.01809)], - [1.00, new THREE.Color(0.66449, 0.08436, 0.00424)], - ], - RAINBOW: [ - [0, new THREE.Color(0.278, 0, 0.714)], - [1 / 6, new THREE.Color(0, 0, 1)], - [2 / 6, new THREE.Color(0, 1, 1)], - [3 / 6, new THREE.Color(0, 1, 0)], - [4 / 6, new THREE.Color(1, 1, 0)], - [5 / 6, new THREE.Color(1, 0.64, 0)], - [1, new THREE.Color(1, 0, 0)] - ], - CONTOUR: [ - [0.00, new THREE.Color(0, 0, 0)], - [0.03, new THREE.Color(0, 0, 0)], - [0.04, new THREE.Color(1, 1, 1)], - [1.00, new THREE.Color(1, 1, 1)] - ], - }; + return this; - let Shaders = {}; + } - Shaders["pointcloud.vs"] = ` -precision highp float; -precision highp int; + subVectors( a, b ) { -#define max_clip_polygons 8 -#define PI 3.141592653589793 + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; -attribute vec3 position; -attribute vec3 color; -attribute float intensity; -attribute float classification; -attribute float returnNumber; -attribute float numberOfReturns; -attribute float pointSourceID; -attribute vec4 indices; -attribute float spacing; -attribute float gpsTime; -attribute vec3 normal; -attribute float aExtra; + return this; -uniform mat4 modelMatrix; -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; -uniform mat4 viewMatrix; -uniform mat4 uViewInv; + } -uniform float uScreenWidth; -uniform float uScreenHeight; -uniform float fov; -uniform float near; -uniform float far; + multiply( v, w ) { -uniform bool uDebug; + if ( w !== undefined ) { -uniform bool uUseOrthographicCamera; -uniform float uOrthoWidth; -uniform float uOrthoHeight; + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); -#define CLIPTASK_NONE 0 -#define CLIPTASK_HIGHLIGHT 1 -#define CLIPTASK_SHOW_INSIDE 2 -#define CLIPTASK_SHOW_OUTSIDE 3 + } -#define CLIPMETHOD_INSIDE_ANY 0 -#define CLIPMETHOD_INSIDE_ALL 1 + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; -uniform int clipTask; -uniform int clipMethod; -#if defined(num_clipboxes) && num_clipboxes > 0 - uniform mat4 clipBoxes[num_clipboxes]; -#endif + return this; -#if defined(num_clipspheres) && num_clipspheres > 0 - uniform mat4 uClipSpheres[num_clipspheres]; -#endif + } -#if defined(num_clippolygons) && num_clippolygons > 0 - uniform int uClipPolygonVCount[num_clippolygons]; - uniform vec3 uClipPolygonVertices[num_clippolygons * 8]; - uniform mat4 uClipPolygonWVP[num_clippolygons]; -#endif + multiplyScalar( scalar ) { + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; -uniform float size; -uniform float minSize; -uniform float maxSize; + return this; -uniform float uPCIndex; -uniform float uOctreeSpacing; -uniform float uNodeSpacing; -uniform float uOctreeSize; -uniform vec3 uBBSize; -uniform float uLevel; -uniform float uVNStart; -uniform bool uIsLeafNode; + } -uniform vec3 uColor; -uniform float uOpacity; + multiplyVectors( a, b ) { -uniform vec2 elevationRange; -uniform vec2 intensityRange; + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; -uniform vec2 uFilterReturnNumberRange; -uniform vec2 uFilterNumberOfReturnsRange; -uniform vec2 uFilterPointSourceIDClipRange; -uniform vec2 uFilterGPSTimeClipRange; -uniform float uGpsScale; -uniform float uGpsOffset; + return this; -uniform vec2 uNormalizedGpsBufferRange; + } -uniform vec3 uIntensity_gbc; -uniform vec3 uRGB_gbc; -uniform vec3 uExtra_gbc; + applyEuler( euler ) { -uniform float uTransition; -uniform float wRGB; -uniform float wIntensity; -uniform float wElevation; -uniform float wClassification; -uniform float wReturnNumber; -uniform float wSourceID; + if ( ! ( euler && euler.isEuler ) ) { -uniform vec2 uExtraNormalizedRange; -uniform vec2 uExtraRange; -uniform float uExtraScale; -uniform float uExtraOffset; + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); -uniform vec3 uShadowColor; + } -uniform sampler2D visibleNodes; -uniform sampler2D gradient; -uniform sampler2D classificationLUT; + return this.applyQuaternion( _quaternion.setFromEuler( euler ) ); -#if defined(color_type_matcap) -uniform sampler2D matcapTextureUniform; -#endif -uniform bool backfaceCulling; + } -#if defined(num_shadowmaps) && num_shadowmaps > 0 -uniform sampler2D uShadowMap[num_shadowmaps]; -uniform mat4 uShadowWorldView[num_shadowmaps]; -uniform mat4 uShadowProj[num_shadowmaps]; -#endif + applyAxisAngle( axis, angle ) { -varying vec3 vColor; -varying float vLogDepth; -varying vec3 vViewPosition; -varying float vRadius; -varying float vPointSize; + return this.applyQuaternion( _quaternion.setFromAxisAngle( axis, angle ) ); + } -float round(float number){ - return floor(number + 0.5); -} + applyMatrix3( m ) { -// -// ### ######## ### ######## ######## #### ## ## ######## ###### #### ######## ######## ###### -// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## -// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## -// ## ## ## ## ## ## ######## ## ## ## ## ###### ###### ## ## ###### ###### -// ######### ## ## ######### ## ## ## ## ## ## ## ## ## ## ## -// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## -// ## ## ######## ## ## ## ## #### ### ######## ###### #### ######## ######## ###### -// + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; -// --------------------- -// OCTREE -// --------------------- + return this; -#if (defined(adaptive_point_size) || defined(color_type_level_of_detail)) && defined(tree_type_octree) -/** - * number of 1-bits up to inclusive index position - * number is treated as if it were an integer in the range 0-255 - * - */ -int numberOfOnes(int number, int index){ - int numOnes = 0; - int tmp = 128; - for(int i = 7; i >= 0; i--){ - - if(number >= tmp){ - number = number - tmp; + } + + applyNormalMatrix( m ) { + + return this.applyMatrix3( m ).normalize(); - if(i <= index){ - numOnes++; - } } - - tmp = tmp / 2; - } - return numOnes; -} + applyMatrix4( m ) { + const x = this.x, y = this.y, z = this.z; + const e = m.elements; -/** - * checks whether the bit at index is 1 - * number is treated as if it were an integer in the range 0-255 - * - */ -bool isBitSet(int number, int index){ + const w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); - // weird multi else if due to lack of proper array, int and bitwise support in WebGL 1.0 - int powi = 1; - if(index == 0){ - powi = 1; - }else if(index == 1){ - powi = 2; - }else if(index == 2){ - powi = 4; - }else if(index == 3){ - powi = 8; - }else if(index == 4){ - powi = 16; - }else if(index == 5){ - powi = 32; - }else if(index == 6){ - powi = 64; - }else if(index == 7){ - powi = 128; - }else{ - return false; - } + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w; - int ndp = number / powi; + return this; - return mod(float(ndp), 2.0) != 0.0; -} + } + applyQuaternion( q ) { -/** - * find the LOD at the point position - */ -float getLOD(){ - - vec3 offset = vec3(0.0, 0.0, 0.0); - int iOffset = int(uVNStart); - float depth = uLevel; - for(float i = 0.0; i <= 30.0; i++){ - float nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0); - - vec3 index3d = (position-offset) / nodeSizeAtLevel; - index3d = floor(index3d + 0.5); - int index = int(round(4.0 * index3d.x + 2.0 * index3d.y + index3d.z)); - - vec4 value = texture2D(visibleNodes, vec2(float(iOffset) / 2048.0, 0.0)); - int mask = int(round(value.r * 255.0)); + const x = this.x, y = this.y, z = this.z; + const qx = q.x, qy = q.y, qz = q.z, qw = q.w; - if(isBitSet(mask, index)){ - // there are more visible child nodes at this position - int advanceG = int(round(value.g * 255.0)) * 256; - int advanceB = int(round(value.b * 255.0)); - int advanceChild = numberOfOnes(mask, index - 1); - int advance = advanceG + advanceB + advanceChild; + // calculate quat * vector - iOffset = iOffset + advance; - - depth++; - }else{ - // no more visible child nodes at this position - //return value.a * 255.0; + const ix = qw * x + qy * z - qz * y; + const iy = qw * y + qz * x - qx * z; + const iz = qw * z + qx * y - qy * x; + const iw = - qx * x - qy * y - qz * z; - float lodOffset = (255.0 * value.a) / 10.0 - 10.0; + // calculate result * inverse quat - return depth + lodOffset; - } - - offset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d; - } - - return depth; -} + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; -float getSpacing(){ - vec3 offset = vec3(0.0, 0.0, 0.0); - int iOffset = int(uVNStart); - float depth = uLevel; - float spacing = uNodeSpacing; - for(float i = 0.0; i <= 30.0; i++){ - float nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0); - - vec3 index3d = (position-offset) / nodeSizeAtLevel; - index3d = floor(index3d + 0.5); - int index = int(round(4.0 * index3d.x + 2.0 * index3d.y + index3d.z)); - - vec4 value = texture2D(visibleNodes, vec2(float(iOffset) / 2048.0, 0.0)); - int mask = int(round(value.r * 255.0)); - float spacingFactor = value.a; + return this; - if(i > 0.0){ - spacing = spacing / (255.0 * spacingFactor); } - - if(isBitSet(mask, index)){ - // there are more visible child nodes at this position - int advanceG = int(round(value.g * 255.0)) * 256; - int advanceB = int(round(value.b * 255.0)); - int advanceChild = numberOfOnes(mask, index - 1); - int advance = advanceG + advanceB + advanceChild; + project( camera ) { - iOffset = iOffset + advance; + return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix ); - //spacing = spacing / (255.0 * spacingFactor); - //spacing = spacing / 3.0; - - depth++; - }else{ - // no more visible child nodes at this position - return spacing; } - - offset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d; - } - - return spacing; -} -float getPointSizeAttenuation(){ - return pow(2.0, getLOD()); -} + unproject( camera ) { + return this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld ); -#endif + } + transformDirection( m ) { -// --------------------- -// KD-TREE -// --------------------- + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction -#if (defined(adaptive_point_size) || defined(color_type_level_of_detail)) && defined(tree_type_kdtree) + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); -float getLOD(){ - vec3 offset = vec3(0.0, 0.0, 0.0); - float iOffset = 0.0; - float depth = 0.0; - - - vec3 size = uBBSize; - vec3 pos = position; - - for(float i = 0.0; i <= 1000.0; i++){ - - vec4 value = texture2D(visibleNodes, vec2(iOffset / 2048.0, 0.0)); - - int children = int(value.r * 255.0); - float next = value.g * 255.0; - int split = int(value.b * 255.0); - - if(next == 0.0){ - return depth; - } - - vec3 splitv = vec3(0.0, 0.0, 0.0); - if(split == 1){ - splitv.x = 1.0; - }else if(split == 2){ - splitv.y = 1.0; - }else if(split == 4){ - splitv.z = 1.0; - } - - iOffset = iOffset + next; - - float factor = length(pos * splitv / size); - if(factor < 0.5){ - // left - if(children == 0 || children == 2){ - return depth; - } - }else{ - // right - pos = pos - size * splitv * 0.5; - if(children == 0 || children == 1){ - return depth; - } - if(children == 3){ - iOffset = iOffset + 1.0; - } } - size = size * ((1.0 - (splitv + 1.0) / 2.0) + 0.5); - - depth++; - } - - - return depth; -} -float getPointSizeAttenuation(){ - return 0.5 * pow(1.3, getLOD()); -} + divide( v ) { -#endif + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + return this; + } -// -// ### ######## ######## ######## #### ######## ## ## ######## ######## ###### -// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## -// ## ## ## ## ## ## ## ## ## ## ## ## ## ## -// ## ## ## ## ######## ## ######## ## ## ## ###### ###### -// ######### ## ## ## ## ## ## ## ## ## ## ## ## -// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## -// ## ## ## ## ## ## #### ######## ####### ## ######## ###### -// + divideScalar( scalar ) { + return this.multiplyScalar( 1 / scalar ); + } -// formula adapted from: http://www.dfstudios.co.uk/articles/programming/image-programming-algorithms/image-processing-algorithms-part-5-contrast-adjustment/ -float getContrastFactor(float contrast){ - return (1.0158730158730156 * (contrast + 1.0)) / (1.0158730158730156 - contrast); -} + min( v ) { -vec3 getRGB(){ - vec3 rgb = color; - - rgb = pow(rgb, vec3(uRGB_gbc.x)); - rgb = rgb + uRGB_gbc.y; - rgb = (rgb - 0.5) * getContrastFactor(uRGB_gbc.z) + 0.5; - rgb = clamp(rgb, 0.0, 1.0); + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); - return rgb; -} + return this; -float getIntensity(){ - float w = (intensity - intensityRange.x) / (intensityRange.y - intensityRange.x); - w = pow(w, uIntensity_gbc.x); - w = w + uIntensity_gbc.y; - w = (w - 0.5) * getContrastFactor(uIntensity_gbc.z) + 0.5; - w = clamp(w, 0.0, 1.0); + } - return w; -} + max( v ) { -vec3 getGpsTime(){ + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); - float w = (gpsTime + uGpsOffset) * uGpsScale; + return this; + } - vec3 c = texture2D(gradient, vec2(w, 1.0 - w)).rgb; + clamp( min, max ) { + // assumes min < max, componentwise - // vec2 r = uNormalizedGpsBufferRange; - // float w = gpsTime * (r.y - r.x) + r.x; - // w = clamp(w, 0.0, 1.0); - // vec3 c = texture2D(gradient, vec2(w,1.0-w)).rgb; - - return c; -} + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); -vec3 getElevation(){ - vec4 world = modelMatrix * vec4( position, 1.0 ); - float w = (world.z - elevationRange.x) / (elevationRange.y - elevationRange.x); - vec3 cElevation = texture2D(gradient, vec2(w,1.0-w)).rgb; - - return cElevation; -} + return this; -vec4 getClassification(){ - vec2 uv = vec2(classification / 255.0, 0.5); - vec4 classColor = texture2D(classificationLUT, uv); - - return classColor; -} + } -vec3 getReturns(){ + clampScalar( minVal, maxVal ) { - // 0b 00_000_111 - float rn = mod(returnNumber, 8.0); - // 0b 00_111_000 - float nr = mod(returnNumber / 8.0, 8.0); + this.x = Math.max( minVal, Math.min( maxVal, this.x ) ); + this.y = Math.max( minVal, Math.min( maxVal, this.y ) ); + this.z = Math.max( minVal, Math.min( maxVal, this.z ) ); - if(nr <= 1.0){ - return vec3(1.0, 0.0, 0.0); - }else{ - return vec3(0.0, 1.0, 0.0); - } + return this; - // return vec3(nr / 4.0, 0.0, 0.0); + } - // if(nr == 1.0){ - // return vec3(1.0, 1.0, 0.0); - // }else{ - // if(rn == 1.0){ - // return vec3(1.0, 0.0, 0.0); - // }else if(rn == nr){ - // return vec3(0.0, 0.0, 1.0); - // }else{ - // return vec3(0.0, 1.0, 0.0); - // } - // } + clampLength( min, max ) { - // if(numberOfReturns == 1.0){ - // return vec3(1.0, 1.0, 0.0); - // }else{ - // if(returnNumber == 1.0){ - // return vec3(1.0, 0.0, 0.0); - // }else if(returnNumber == numberOfReturns){ - // return vec3(0.0, 0.0, 1.0); - // }else{ - // return vec3(0.0, 1.0, 0.0); - // } - // } -} + const length = this.length(); -vec3 getReturnNumber(){ - if(numberOfReturns == 1.0){ - return vec3(1.0, 1.0, 0.0); - }else{ - if(returnNumber == 1.0){ - return vec3(1.0, 0.0, 0.0); - }else if(returnNumber == numberOfReturns){ - return vec3(0.0, 0.0, 1.0); - }else{ - return vec3(0.0, 1.0, 0.0); - } - } -} + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); -vec3 getNumberOfReturns(){ - float value = numberOfReturns; + } - float w = value / 6.0; + floor() { - vec3 color = texture2D(gradient, vec2(w, 1.0 - w)).rgb; + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); - return color; -} + return this; -vec3 getSourceID(){ - float w = mod(pointSourceID, 10.0) / 10.0; - return texture2D(gradient, vec2(w,1.0 - w)).rgb; -} + } -vec3 getCompositeColor(){ - vec3 c; - float w; + ceil() { - c += wRGB * getRGB(); - w += wRGB; - - c += wIntensity * getIntensity() * vec3(1.0, 1.0, 1.0); - w += wIntensity; - - c += wElevation * getElevation(); - w += wElevation; - - c += wReturnNumber * getReturnNumber(); - w += wReturnNumber; - - c += wSourceID * getSourceID(); - w += wSourceID; - - vec4 cl = wClassification * getClassification(); - c += cl.a * cl.rgb; - w += wClassification * cl.a; + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); - c = c / w; - - if(w == 0.0){ - //c = color; - gl_Position = vec4(100.0, 100.0, 100.0, 0.0); - } - - return c; -} + return this; + } -vec3 getNormal(){ - //vec3 n_hsv = vec3( modelMatrix * vec4( normal, 0.0 )) * 0.5 + 0.5; // (n_world.xyz + vec3(1.,1.,1.)) / 2.; - vec3 n_view = normalize( vec3(modelViewMatrix * vec4( normal, 0.0 )) ); - return n_view; -} -bool applyBackfaceCulling() { - // Black not facing vertices / Backface culling - vec3 e = normalize(vec3(modelViewMatrix * vec4( position, 1. ))); - vec3 n = getNormal(); // normalize( vec3(modelViewMatrix * vec4( normal, 0.0 )) ); + round() { - if((uUseOrthographicCamera && n.z <= 0.) || (!uUseOrthographicCamera && dot( n, e ) >= 0.)) { - return true; - } else { - return false; - } -} + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); -#if defined(color_type_matcap) -// Matcap Material -vec3 getMatcap(){ - vec3 eye = normalize( vec3( modelViewMatrix * vec4( position, 1. ) ) ); - if(uUseOrthographicCamera) { - eye = vec3(0., 0., -1.); - } - vec3 r_en = reflect( eye, getNormal() ); // or r_en = e - 2. * dot( n, e ) * n; - float m = 2. * sqrt(pow( r_en.x, 2. ) + pow( r_en.y, 2. ) + pow( r_en.z + 1., 2. )); - vec2 vN = r_en.xy / m + .5; - return texture2D(matcapTextureUniform, vN).rgb; -} -#endif + return this; -vec3 getExtra(){ + } - float w = (aExtra + uExtraOffset) * uExtraScale; - w = clamp(w, 0.0, 1.0); + roundToZero() { - vec3 color = texture2D(gradient, vec2(w,1.0-w)).rgb; + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); - // vec2 r = uExtraNormalizedRange; + return this; - // float w = aExtra * (r.y - r.x) + r.x; + } - // w = (w - uExtraRange.x) / (uExtraRange.y - uExtraRange.x); + negate() { - // w = clamp(w, 0.0, 1.0); + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; - // vec3 color = texture2D(gradient, vec2(w,1.0-w)).rgb; + return this; - return color; -} + } -vec3 getColor(){ - vec3 color; - - #ifdef color_type_rgba - color = getRGB(); - #elif defined color_type_height || defined color_type_elevation - color = getElevation(); - #elif defined color_type_rgb_height - vec3 cHeight = getElevation(); - color = (1.0 - uTransition) * getRGB() + uTransition * cHeight; - #elif defined color_type_depth - float linearDepth = gl_Position.w; - float expDepth = (gl_Position.z / gl_Position.w) * 0.5 + 0.5; - color = vec3(linearDepth, expDepth, 0.0); - //color = vec3(1.0, 0.5, 0.3); - #elif defined color_type_intensity - float w = getIntensity(); - color = vec3(w, w, w); - #elif defined color_type_gps_time - color = getGpsTime(); - #elif defined color_type_intensity_gradient - float w = getIntensity(); - color = texture2D(gradient, vec2(w,1.0-w)).rgb; - #elif defined color_type_color - color = uColor; - #elif defined color_type_level_of_detail - float depth = getLOD(); - float w = depth / 10.0; - color = texture2D(gradient, vec2(w,1.0-w)).rgb; - #elif defined color_type_indices - color = indices.rgb; - #elif defined color_type_classification - vec4 cl = getClassification(); - color = cl.rgb; - #elif defined color_type_return_number - color = getReturnNumber(); - #elif defined color_type_returns - color = getReturns(); - #elif defined color_type_number_of_returns - color = getNumberOfReturns(); - #elif defined color_type_source_id - color = getSourceID(); - #elif defined color_type_point_source_id - color = getSourceID(); - #elif defined color_type_normal - color = (modelMatrix * vec4(normal, 0.0)).xyz; - #elif defined color_type_phong - color = color; - #elif defined color_type_composite - color = getCompositeColor(); - #elif defined color_type_matcap - color = getMatcap(); - #else - color = getExtra(); - #endif - - if (backfaceCulling && applyBackfaceCulling()) { - color = vec3(0.); - } + dot( v ) { - return color; -} + return this.x * v.x + this.y * v.y + this.z * v.z; -float getPointSize(){ - float pointSize = 1.0; - - float slope = tan(fov / 2.0); - float projFactor = -0.5 * uScreenHeight / (slope * vViewPosition.z); - - float r = uOctreeSpacing * 1.7; - vRadius = r; - #if defined fixed_point_size - pointSize = size; - #elif defined attenuated_point_size - if(uUseOrthographicCamera){ - pointSize = size; - }else{ - pointSize = size * spacing * projFactor; - //pointSize = pointSize * projFactor; } - #elif defined adaptive_point_size - if(uUseOrthographicCamera) { - float worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation(); - pointSize = (worldSpaceSize / uOrthoWidth) * uScreenWidth; - } else { - // float leafSpacing = 0.122069092 * 8.0; - - // bool isLeafNode = getLOD() == 1000.0; - // if(isLeafNode){ - // // pointSize = size * spacing * projFactor; + // TODO lengthSquared? - // float worldSpaceSize = size * leafSpacing; - // pointSize = worldSpaceSize * projFactor; - // }else{ - float worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation(); + lengthSq() { - // minimum world space size - // worldSpaceSize = max(worldSpaceSize, leafSpacing); + return this.x * this.x + this.y * this.y + this.z * this.z; - pointSize = worldSpaceSize * projFactor; - // } } - #endif - pointSize = max(minSize, pointSize); - pointSize = min(maxSize, pointSize); - - vRadius = pointSize / projFactor; + length() { - return pointSize; -} + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); -#if defined(num_clippolygons) && num_clippolygons > 0 -bool pointInClipPolygon(vec3 point, int polyIdx) { + } - mat4 wvp = uClipPolygonWVP[polyIdx]; - //vec4 screenClipPos = uClipPolygonVP[polyIdx] * modelMatrix * vec4(point, 1.0); - //screenClipPos.xy = screenClipPos.xy / screenClipPos.w * 0.5 + 0.5; + manhattanLength() { - vec4 pointNDC = wvp * vec4(point, 1.0); - pointNDC.xy = pointNDC.xy / pointNDC.w; + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); - int j = uClipPolygonVCount[polyIdx] - 1; - bool c = false; - for(int i = 0; i < 8; i++) { - if(i == uClipPolygonVCount[polyIdx]) { - break; } - //vec4 verti = wvp * vec4(uClipPolygonVertices[polyIdx * 8 + i], 1); - //vec4 vertj = wvp * vec4(uClipPolygonVertices[polyIdx * 8 + j], 1); + normalize() { - //verti.xy = verti.xy / verti.w; - //vertj.xy = vertj.xy / vertj.w; + return this.divideScalar( this.length() || 1 ); - //verti.xy = verti.xy / verti.w * 0.5 + 0.5; - //vertj.xy = vertj.xy / vertj.w * 0.5 + 0.5; + } - vec3 verti = uClipPolygonVertices[polyIdx * 8 + i]; - vec3 vertj = uClipPolygonVertices[polyIdx * 8 + j]; + setLength( length ) { + + return this.normalize().multiplyScalar( length ); - if( ((verti.y > pointNDC.y) != (vertj.y > pointNDC.y)) && - (pointNDC.x < (vertj.x-verti.x) * (pointNDC.y-verti.y) / (vertj.y-verti.y) + verti.x) ) { - c = !c; } - j = i; - } - return c; -} -#endif + lerp( v, alpha ) { -void doClipping(){ + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; - { - vec4 cl = getClassification(); - if(cl.a == 0.0){ - gl_Position = vec4(100.0, 100.0, 100.0, 0.0); - - return; } - } - #if defined(clip_return_number_enabled) - { // return number filter - vec2 range = uFilterReturnNumberRange; - if(returnNumber < range.x || returnNumber > range.y){ - gl_Position = vec4(100.0, 100.0, 100.0, 0.0); - - return; + lerpVectors( v1, v2, alpha ) { + + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; + this.z = v1.z + ( v2.z - v1.z ) * alpha; + + return this; + } - } - #endif - #if defined(clip_number_of_returns_enabled) - { // number of return filter - vec2 range = uFilterNumberOfReturnsRange; - if(numberOfReturns < range.x || numberOfReturns > range.y){ - gl_Position = vec4(100.0, 100.0, 100.0, 0.0); - - return; - } - } - #endif + cross( v, w ) { - #if defined(clip_gps_enabled) - { // GPS time filter - float time = (gpsTime + uGpsOffset) * uGpsScale; - vec2 range = uFilterGPSTimeClipRange; + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + return this.crossVectors( this, v ); - if(time < range.x || time > range.y){ - gl_Position = vec4(100.0, 100.0, 100.0, 0.0); - - return; } - } - #endif - #if defined(clip_point_source_id_enabled) - { // point source id filter - vec2 range = uFilterPointSourceIDClipRange; - if(pointSourceID < range.x || pointSourceID > range.y){ - gl_Position = vec4(100.0, 100.0, 100.0, 0.0); - - return; + crossVectors( a, b ) { + + const ax = a.x, ay = a.y, az = a.z; + const bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + } - } - #endif - int clipVolumesCount = 0; - int insideCount = 0; + projectOnVector( v ) { - #if defined(num_clipboxes) && num_clipboxes > 0 - for(int i = 0; i < num_clipboxes; i++){ - vec4 clipPosition = clipBoxes[i] * modelMatrix * vec4( position, 1.0 ); - bool inside = -0.5 <= clipPosition.x && clipPosition.x <= 0.5; - inside = inside && -0.5 <= clipPosition.y && clipPosition.y <= 0.5; - inside = inside && -0.5 <= clipPosition.z && clipPosition.z <= 0.5; + const denominator = v.lengthSq(); - insideCount = insideCount + (inside ? 1 : 0); - clipVolumesCount++; - } - #endif + if ( denominator === 0 ) return this.set( 0, 0, 0 ); - #if defined(num_clippolygons) && num_clippolygons > 0 - for(int i = 0; i < num_clippolygons; i++) { - bool inside = pointInClipPolygon(position, i); + const scalar = v.dot( this ) / denominator; + + return this.copy( v ).multiplyScalar( scalar ); - insideCount = insideCount + (inside ? 1 : 0); - clipVolumesCount++; } - #endif - bool insideAny = insideCount > 0; - bool insideAll = (clipVolumesCount > 0) && (clipVolumesCount == insideCount); + projectOnPlane( planeNormal ) { + + _vector.copy( this ).projectOnVector( planeNormal ); + + return this.sub( _vector ); - if(clipMethod == CLIPMETHOD_INSIDE_ANY){ - if(insideAny && clipTask == CLIPTASK_HIGHLIGHT){ - vColor.r += 0.5; - }else if(!insideAny && clipTask == CLIPTASK_SHOW_INSIDE){ - gl_Position = vec4(100.0, 100.0, 100.0, 1.0); - }else if(insideAny && clipTask == CLIPTASK_SHOW_OUTSIDE){ - gl_Position = vec4(100.0, 100.0, 100.0, 1.0); } - }else if(clipMethod == CLIPMETHOD_INSIDE_ALL){ - if(insideAll && clipTask == CLIPTASK_HIGHLIGHT){ - vColor.r += 0.5; - }else if(!insideAll && clipTask == CLIPTASK_SHOW_INSIDE){ - gl_Position = vec4(100.0, 100.0, 100.0, 1.0); - }else if(insideAll && clipTask == CLIPTASK_SHOW_OUTSIDE){ - gl_Position = vec4(100.0, 100.0, 100.0, 1.0); + + reflect( normal ) { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + return this.sub( _vector.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + } - } -} + angleTo( v ) { + const denominator = Math.sqrt( this.lengthSq() * v.lengthSq() ); -// -// ## ## ### #### ## ## -// ### ### ## ## ## ### ## -// #### #### ## ## ## #### ## -// ## ### ## ## ## ## ## ## ## -// ## ## ######### ## ## #### -// ## ## ## ## ## ## ### -// ## ## ## ## #### ## ## -// + if ( denominator === 0 ) return Math.PI / 2; -void main() { - vec4 mvPosition = modelViewMatrix * vec4(position, 1.0 ); - vViewPosition = mvPosition.xyz; - gl_Position = projectionMatrix * mvPosition; - vLogDepth = log2(-mvPosition.z); + const theta = this.dot( v ) / denominator; - // POINT SIZE - float pointSize = getPointSize(); - gl_PointSize = pointSize; - vPointSize = pointSize; + // clamp, to handle numerical problems - // COLOR - vColor = getColor(); + return Math.acos( MathUtils.clamp( theta, - 1, 1 ) ); - //gl_Position = vec4(0.0, 0.0, 0.0, 1.0); - //gl_Position = vec4(position.xzy / 1000.0, 1.0 ); + } - //gl_PointSize = 5.0; - //vColor = vec3(1.0, 1.0, 1.0); + distanceTo( v ) { - // only for "replacing" approaches - // if(getLOD() != uLevel){ - // gl_Position = vec4(10.0, 10.0, 10.0, 1.0); - // } + return Math.sqrt( this.distanceToSquared( v ) ); + } - #if defined hq_depth_pass - float originalDepth = gl_Position.w; - float adjustedDepth = originalDepth + 2.0 * vRadius; - float adjust = adjustedDepth / originalDepth; + distanceToSquared( v ) { - mvPosition.xyz = mvPosition.xyz * adjust; - gl_Position = projectionMatrix * mvPosition; - #endif + const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + return dx * dx + dy * dy + dz * dz; - // CLIPPING - doClipping(); + } - #if defined(num_clipspheres) && num_clipspheres > 0 - for(int i = 0; i < num_clipspheres; i++){ - vec4 sphereLocal = uClipSpheres[i] * mvPosition; + manhattanDistanceTo( v ) { - float distance = length(sphereLocal.xyz); + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); - if(distance < 1.0){ - float w = distance; - vec3 cGradient = texture2D(gradient, vec2(w, 1.0 - w)).rgb; - - vColor = cGradient; - //vColor = cGradient * 0.7 + vColor * 0.3; - } } - #endif - #if defined(num_shadowmaps) && num_shadowmaps > 0 + setFromSpherical( s ) { - const float sm_near = 0.1; - const float sm_far = 10000.0; + return this.setFromSphericalCoords( s.radius, s.phi, s.theta ); - for(int i = 0; i < num_shadowmaps; i++){ - vec3 viewPos = (uShadowWorldView[i] * vec4(position, 1.0)).xyz; - float distanceToLight = abs(viewPos.z); - - vec4 projPos = uShadowProj[i] * uShadowWorldView[i] * vec4(position, 1); - vec3 nc = projPos.xyz / projPos.w; - - float u = nc.x * 0.5 + 0.5; - float v = nc.y * 0.5 + 0.5; + } - vec2 sampleStep = vec2(1.0 / (2.0*1024.0), 1.0 / (2.0*1024.0)) * 1.5; - vec2 sampleLocations[9]; - sampleLocations[0] = vec2(0.0, 0.0); - sampleLocations[1] = sampleStep; - sampleLocations[2] = -sampleStep; - sampleLocations[3] = vec2(sampleStep.x, -sampleStep.y); - sampleLocations[4] = vec2(-sampleStep.x, sampleStep.y); + setFromSphericalCoords( radius, phi, theta ) { - sampleLocations[5] = vec2(0.0, sampleStep.y); - sampleLocations[6] = vec2(0.0, -sampleStep.y); - sampleLocations[7] = vec2(sampleStep.x, 0.0); - sampleLocations[8] = vec2(-sampleStep.x, 0.0); + const sinPhiRadius = Math.sin( phi ) * radius; - float visibleSamples = 0.0; - float numSamples = 0.0; + this.x = sinPhiRadius * Math.sin( theta ); + this.y = Math.cos( phi ) * radius; + this.z = sinPhiRadius * Math.cos( theta ); - float bias = vRadius * 2.0; + return this; - for(int j = 0; j < 9; j++){ - vec4 depthMapValue = texture2D(uShadowMap[i], vec2(u, v) + sampleLocations[j]); + } - float linearDepthFromSM = depthMapValue.x + bias; - float linearDepthFromViewer = distanceToLight; + setFromCylindrical( c ) { - if(linearDepthFromSM > linearDepthFromViewer){ - visibleSamples += 1.0; - } + return this.setFromCylindricalCoords( c.radius, c.theta, c.y ); - numSamples += 1.0; - } + } - float visibility = visibleSamples / numSamples; + setFromCylindricalCoords( radius, theta, y ) { - if(u < 0.0 || u > 1.0 || v < 0.0 || v > 1.0 || nc.x < -1.0 || nc.x > 1.0 || nc.y < -1.0 || nc.y > 1.0 || nc.z < -1.0 || nc.z > 1.0){ - //vColor = vec3(0.0, 0.0, 0.2); - }else{ - //vColor = vec3(1.0, 1.0, 1.0) * visibility + vec3(1.0, 1.0, 1.0) * vec3(0.5, 0.0, 0.0) * (1.0 - visibility); - vColor = vColor * visibility + vColor * uShadowColor * (1.0 - visibility); - } + this.x = radius * Math.sin( theta ); + this.y = y; + this.z = radius * Math.cos( theta ); + return this; } - #endif -} -`; + setFromMatrixPosition( m ) { - Shaders["pointcloud.fs"] = ` -#if defined paraboloid_point_shape - #extension GL_EXT_frag_depth : enable -#endif + const e = m.elements; -precision highp float; -precision highp int; + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; -uniform mat4 viewMatrix; -uniform mat4 uViewInv; -uniform mat4 uProjInv; -uniform vec3 cameraPosition; + return this; + } -uniform mat4 projectionMatrix; -uniform float uOpacity; + setFromMatrixScale( m ) { -uniform float blendHardness; -uniform float blendDepthSupplement; -uniform float fov; -uniform float uSpacing; -uniform float near; -uniform float far; -uniform float uPCIndex; -uniform float uScreenWidth; -uniform float uScreenHeight; + const sx = this.setFromMatrixColumn( m, 0 ).length(); + const sy = this.setFromMatrixColumn( m, 1 ).length(); + const sz = this.setFromMatrixColumn( m, 2 ).length(); -varying vec3 vColor; -varying float vLogDepth; -varying vec3 vViewPosition; -varying float vRadius; -varying float vPointSize; -varying vec3 vPosition; + this.x = sx; + this.y = sy; + this.z = sz; + return this; -float specularStrength = 1.0; + } -void main() { + setFromMatrixColumn( m, index ) { - vec3 color = vColor; - float depth = gl_FragCoord.z; + return this.fromArray( m.elements, index * 4 ); - #if defined(circle_point_shape) || defined(paraboloid_point_shape) - float u = 2.0 * gl_PointCoord.x - 1.0; - float v = 2.0 * gl_PointCoord.y - 1.0; - #endif - - #if defined(circle_point_shape) - float cc = u*u + v*v; - if(cc > 1.0){ - discard; } - #endif - - #if defined color_type_indices - gl_FragColor = vec4(color, uPCIndex / 255.0); - #else - gl_FragColor = vec4(color, uOpacity); - #endif - #if defined paraboloid_point_shape - float wi = 0.0 - ( u*u + v*v); - vec4 pos = vec4(vViewPosition, 1.0); - pos.z += wi * vRadius; - float linearDepth = -pos.z; - pos = projectionMatrix * pos; - pos = pos / pos.w; - float expDepth = pos.z; - depth = (pos.z + 1.0) / 2.0; - gl_FragDepthEXT = depth; - - #if defined(color_type_depth) - color.r = linearDepth; - color.g = expDepth; - #endif - - #if defined(use_edl) - gl_FragColor.a = log2(linearDepth); - #endif - - #else - #if defined(use_edl) - gl_FragColor.a = vLogDepth; - #endif - #endif + setFromMatrix3Column( m, index ) { - #if defined(weighted_splats) - float distance = 2.0 * length(gl_PointCoord.xy - 0.5); - float weight = max(0.0, 1.0 - distance); - weight = pow(weight, 1.5); + return this.fromArray( m.elements, index * 3 ); - gl_FragColor.a = weight; - gl_FragColor.xyz = gl_FragColor.xyz * weight; - #endif + } - //gl_FragColor = vec4(0.0, 0.7, 0.0, 1.0); - -} + equals( v ) { + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); -`; + } - Shaders["pointcloud_sm.vs"] = ` -precision mediump float; -precision mediump int; + fromArray( array, offset = 0 ) { -attribute vec3 position; -attribute vec3 color; + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; -uniform mat4 modelMatrix; -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; -uniform mat4 viewMatrix; + return this; -uniform float uScreenWidth; -uniform float uScreenHeight; -uniform float near; -uniform float far; + } -uniform float uSpacing; -uniform float uOctreeSize; -uniform float uLevel; -uniform float uVNStart; + toArray( array = [], offset = 0 ) { -uniform sampler2D visibleNodes; + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; -varying float vLinearDepth; -varying vec3 vColor; + return array; -#define PI 3.141592653589793 + } + fromBufferAttribute( attribute, index, offset ) { + if ( offset !== undefined ) { -// --------------------- -// OCTREE -// --------------------- + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; -#if defined(adaptive_point_size) -/** - * number of 1-bits up to inclusive index position - * number is treated as if it were an integer in the range 0-255 - * - */ -float numberOfOnes(float number, float index){ - float tmp = mod(number, pow(2.0, index + 1.0)); - float numOnes = 0.0; - for(float i = 0.0; i < 8.0; i++){ - if(mod(tmp, 2.0) != 0.0){ - numOnes++; } - tmp = floor(tmp / 2.0); - } - return numOnes; -} + random() { -/** - * checks whether the bit at index is 1 - * number is treated as if it were an integer in the range 0-255 - * - */ -bool isBitSet(float number, float index){ - return mod(floor(number / pow(2.0, index)), 2.0) != 0.0; -} + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + return this; -/** - * find the LOD at the point position - */ -float getLOD(){ - - vec3 offset = vec3(0.0, 0.0, 0.0); - float iOffset = uVNStart; - float depth = uLevel; - for(float i = 0.0; i <= 30.0; i++){ - float nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0); - - vec3 index3d = (position-offset) / nodeSizeAtLevel; - index3d = floor(index3d + 0.5); - float index = 4.0 * index3d.x + 2.0 * index3d.y + index3d.z; - - vec4 value = texture2D(visibleNodes, vec2(iOffset / 2048.0, 0.0)); - float mask = value.r * 255.0; - if(isBitSet(mask, index)){ - // there are more visible child nodes at this position - iOffset = iOffset + value.g * 255.0 * 256.0 + value.b * 255.0 + numberOfOnes(mask, index - 1.0); - depth++; - }else{ - // no more visible child nodes at this position - return depth; } - - offset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d; + } - - return depth; -} -#endif + const _vector = /*@__PURE__*/ new Vector3(); + const _quaternion = /*@__PURE__*/ new Quaternion(); -float getPointSize(){ - float pointSize = 1.0; - - float slope = tan(fov / 2.0); - float projFactor = -0.5 * uScreenHeight / (slope * vViewPosition.z); - - float r = uOctreeSpacing * 1.5; - vRadius = r; - #if defined fixed_point_size - pointSize = size; - #elif defined attenuated_point_size - if(uUseOrthographicCamera){ - pointSize = size; - }else{ - pointSize = pointSize * projFactor; - } - #elif defined adaptive_point_size - if(uUseOrthographicCamera) { - float worldSpaceSize = 1.5 * size * r / getPointSizeAttenuation(); - pointSize = (worldSpaceSize / uOrthoWidth) * uScreenWidth; - } else { - float worldSpaceSize = 1.5 * size * r / getPointSizeAttenuation(); - pointSize = worldSpaceSize * projFactor; - } - #endif + class Box3 { - pointSize = max(minSize, pointSize); - pointSize = min(maxSize, pointSize); - - vRadius = pointSize / projFactor; + constructor( min, max ) { - return pointSize; -} + Object.defineProperty( this, 'isBox3', { value: true } ); + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); -void main() { + } - vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); - vLinearDepth = gl_Position.w; + set( min, max ) { - float pointSize = getPointSize(); - gl_PointSize = pointSize; + this.min.copy( min ); + this.max.copy( max ); -} -`; + return this; - Shaders["pointcloud_sm.fs"] = ` -precision mediump float; -precision mediump int; + } -varying vec3 vColor; -varying float vLinearDepth; + setFromArray( array ) { -void main() { + let minX = + Infinity; + let minY = + Infinity; + let minZ = + Infinity; - //gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); - //gl_FragColor = vec4(vColor, 1.0); - //gl_FragColor = vec4(vLinearDepth, pow(vLinearDepth, 2.0), 0.0, 1.0); - gl_FragColor = vec4(vLinearDepth, vLinearDepth / 30.0, vLinearDepth / 30.0, 1.0); - -} + let maxX = - Infinity; + let maxY = - Infinity; + let maxZ = - Infinity; + for ( let i = 0, l = array.length; i < l; i += 3 ) { -`; + const x = array[ i ]; + const y = array[ i + 1 ]; + const z = array[ i + 2 ]; - Shaders["normalize.vs"] = ` -precision mediump float; -precision mediump int; + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; -attribute vec3 position; -attribute vec2 uv; + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; -uniform mat4 projectionMatrix; -uniform mat4 modelViewMatrix; + } -varying vec2 vUv; + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); -void main() { - vUv = uv; - gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); -}`; + return this; - Shaders["normalize.fs"] = ` -#extension GL_EXT_frag_depth : enable + } -precision mediump float; -precision mediump int; + setFromBufferAttribute( attribute ) { -uniform sampler2D uWeightMap; -uniform sampler2D uDepthMap; + let minX = + Infinity; + let minY = + Infinity; + let minZ = + Infinity; -varying vec2 vUv; + let maxX = - Infinity; + let maxY = - Infinity; + let maxZ = - Infinity; -void main() { - float depth = texture2D(uDepthMap, vUv).r; - - if(depth >= 1.0){ - discard; - } + for ( let i = 0, l = attribute.count; i < l; i ++ ) { - gl_FragColor = vec4(depth, 1.0, 0.0, 1.0); + const x = attribute.getX( i ); + const y = attribute.getY( i ); + const z = attribute.getZ( i ); - vec4 color = texture2D(uWeightMap, vUv); - color = color / color.w; - - gl_FragColor = vec4(color.xyz, 1.0); - - gl_FragDepthEXT = depth; + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; -}`; + } - Shaders["normalize_and_edl.fs"] = ` -#extension GL_EXT_frag_depth : enable + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); -// -// adapted from the EDL shader code from Christian Boucheny in cloud compare: -// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL -// + return this; -precision mediump float; -precision mediump int; + } -uniform sampler2D uWeightMap; -uniform sampler2D uEDLMap; -uniform sampler2D uDepthMap; + setFromPoints( points ) { -uniform float screenWidth; -uniform float screenHeight; -uniform vec2 neighbours[NEIGHBOUR_COUNT]; -uniform float edlStrength; -uniform float radius; + this.makeEmpty(); -varying vec2 vUv; + for ( let i = 0, il = points.length; i < il; i ++ ) { -float response(float depth){ - vec2 uvRadius = radius / vec2(screenWidth, screenHeight); - - float sum = 0.0; - - for(int i = 0; i < NEIGHBOUR_COUNT; i++){ - vec2 uvNeighbor = vUv + uvRadius * neighbours[i]; - - float neighbourDepth = texture2D(uEDLMap, uvNeighbor).a; + this.expandByPoint( points[ i ] ); - if(neighbourDepth != 0.0){ - if(depth == 0.0){ - sum += 100.0; - }else{ - sum += max(0.0, depth - neighbourDepth); } - } - } - - return sum / float(NEIGHBOUR_COUNT); -} -void main() { + return this; - float edlDepth = texture2D(uEDLMap, vUv).a; - float res = response(edlDepth); - float shade = exp(-res * 300.0 * edlStrength); + } - float depth = texture2D(uDepthMap, vUv).r; - if(depth >= 1.0 && res == 0.0){ - discard; - } - - vec4 color = texture2D(uWeightMap, vUv); - color = color / color.w; - color = color * shade; + setFromCenterAndSize( center, size ) { - gl_FragColor = vec4(color.xyz, 1.0); + const halfSize = _vector$1.copy( size ).multiplyScalar( 0.5 ); - gl_FragDepthEXT = depth; -}`; + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); - Shaders["edl.vs"] = ` -precision mediump float; -precision mediump int; + return this; -attribute vec3 position; -attribute vec2 uv; + } -uniform mat4 projectionMatrix; -uniform mat4 modelViewMatrix; + setFromObject( object ) { -varying vec2 vUv; + this.makeEmpty(); -void main() { - vUv = uv; - - vec4 mvPosition = modelViewMatrix * vec4(position,1.0); + return this.expandByObject( object ); - gl_Position = projectionMatrix * mvPosition; -}`; + } - Shaders["edl.fs"] = ` -#extension GL_EXT_frag_depth : enable + clone() { -// -// adapted from the EDL shader code from Christian Boucheny in cloud compare: -// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL -// + return new this.constructor().copy( this ); -precision mediump float; -precision mediump int; + } -uniform float screenWidth; -uniform float screenHeight; -uniform vec2 neighbours[NEIGHBOUR_COUNT]; -uniform float edlStrength; -uniform float radius; -uniform float opacity; + copy( box ) { -uniform float uNear; -uniform float uFar; + this.min.copy( box.min ); + this.max.copy( box.max ); -uniform mat4 uProj; + return this; -uniform sampler2D uEDLColor; -uniform sampler2D uEDLDepth; + } -varying vec2 vUv; + makeEmpty() { -float response(float depth){ - vec2 uvRadius = radius / vec2(screenWidth, screenHeight); - - float sum = 0.0; - - for(int i = 0; i < NEIGHBOUR_COUNT; i++){ - vec2 uvNeighbor = vUv + uvRadius * neighbours[i]; - - float neighbourDepth = texture2D(uEDLColor, uvNeighbor).a; - neighbourDepth = (neighbourDepth == 1.0) ? 0.0 : neighbourDepth; + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; - if(neighbourDepth != 0.0){ - if(depth == 0.0){ - sum += 100.0; - }else{ - sum += max(0.0, depth - neighbourDepth); - } } - } - - return sum / float(NEIGHBOUR_COUNT); -} -void main(){ - vec4 cEDL = texture2D(uEDLColor, vUv); - - float depth = cEDL.a; - depth = (depth == 1.0) ? 0.0 : depth; - float res = response(depth); - float shade = exp(-res * 300.0 * edlStrength); + isEmpty() { - gl_FragColor = vec4(cEDL.rgb * shade, opacity); + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes - { // write regular hyperbolic depth values to depth buffer - float dl = pow(2.0, depth); + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); - vec4 dp = uProj * vec4(0.0, 0.0, -dl, 1.0); - float pz = dp.z / dp.w; - float fragDepth = (pz + 1.0) / 2.0; + } - gl_FragDepthEXT = fragDepth; - } + getCenter( target ) { - if(depth == 0.0){ - discard; - } + if ( target === undefined ) { -} -`; + console.warn( 'THREE.Box3: .getCenter() target is now required' ); + target = new Vector3(); - Shaders["blur.vs"] = ` -varying vec2 vUv; + } -void main() { - vUv = uv; + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); - gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); -}`; + } - Shaders["blur.fs"] = ` -uniform mat4 projectionMatrix; + getSize( target ) { -uniform float screenWidth; -uniform float screenHeight; -uniform float near; -uniform float far; + if ( target === undefined ) { -uniform sampler2D map; + console.warn( 'THREE.Box3: .getSize() target is now required' ); + target = new Vector3(); -varying vec2 vUv; + } -void main() { + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min ); - float dx = 1.0 / screenWidth; - float dy = 1.0 / screenHeight; + } - vec3 color = vec3(0.0, 0.0, 0.0); - color += texture2D(map, vUv + vec2(-dx, -dy)).rgb; - color += texture2D(map, vUv + vec2( 0, -dy)).rgb; - color += texture2D(map, vUv + vec2(+dx, -dy)).rgb; - color += texture2D(map, vUv + vec2(-dx, 0)).rgb; - color += texture2D(map, vUv + vec2( 0, 0)).rgb; - color += texture2D(map, vUv + vec2(+dx, 0)).rgb; - color += texture2D(map, vUv + vec2(-dx, dy)).rgb; - color += texture2D(map, vUv + vec2( 0, dy)).rgb; - color += texture2D(map, vUv + vec2(+dx, dy)).rgb; + expandByPoint( point ) { - color = color / 9.0; - - gl_FragColor = vec4(color, 1.0); -}`; + this.min.min( point ); + this.max.max( point ); - const ClassificationScheme = { + return this; - DEFAULT: { - 0: { visible: true, name: 'never classified' , color: [0.5, 0.5, 0.5, 1.0] }, - 1: { visible: true, name: 'unclassified' , color: [0.5, 0.5, 0.5, 1.0] }, - 2: { visible: true, name: 'ground' , color: [0.63, 0.32, 0.18, 1.0] }, - 3: { visible: true, name: 'low vegetation' , color: [0.0, 1.0, 0.0, 1.0] }, - 4: { visible: true, name: 'medium vegetation' , color: [0.0, 0.8, 0.0, 1.0] }, - 5: { visible: true, name: 'high vegetation' , color: [0.0, 0.6, 0.0, 1.0] }, - 6: { visible: true, name: 'building' , color: [1.0, 0.66, 0.0, 1.0] }, - 7: { visible: true, name: 'low point(noise)' , color: [1.0, 0.0, 1.0, 1.0] }, - 8: { visible: true, name: 'key-point' , color: [1.0, 0.0, 0.0, 1.0] }, - 9: { visible: true, name: 'water' , color: [0.0, 0.0, 1.0, 1.0] }, - 12: { visible: true, name: 'overlap' , color: [1.0, 1.0, 0.0, 1.0] }, - DEFAULT: { visible: true, name: 'default' , color: [0.3, 0.6, 0.6, 0.5] }, } - }; - Object.defineProperty(ClassificationScheme, 'RANDOM', { - get: function() { + expandByVector( vector ) { - let scheme = {}; + this.min.sub( vector ); + this.max.add( vector ); - for(let i = 0; i <= 255; i++){ - scheme[i] = new THREE.Vector4(Math.random(), Math.random(), Math.random()); - } + return this; + + } - scheme["DEFAULT"] = new THREE.Vector4(Math.random(), Math.random(), Math.random()); + expandByScalar( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; - return scheme; } - }); - // - // how to calculate the radius of a projected sphere in screen space - // http://stackoverflow.com/questions/21648630/radius-of-projected-sphere-in-screen-space - // http://stackoverflow.com/questions/3717226/radius-of-projected-sphere - // + expandByObject( object ) { + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms - class PointCloudMaterial extends THREE.RawShaderMaterial { - constructor (parameters = {}) { - super(); + object.updateWorldMatrix( false, false ); - this.visibleNodesTexture = Utils.generateDataTexture(2048, 1, new THREE.Color(0xffffff)); - this.visibleNodesTexture.minFilter = THREE.NearestFilter; - this.visibleNodesTexture.magFilter = THREE.NearestFilter; + const geometry = object.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.boundingBox === null ) { + + geometry.computeBoundingBox(); - let getValid = (a, b) => { - if(a !== undefined){ - return a; - }else { - return b; } - }; - let pointSize = getValid(parameters.size, 1.0); - let minSize = getValid(parameters.minSize, 2.0); - let maxSize = getValid(parameters.maxSize, 50.0); - let treeType = getValid(parameters.treeType, TreeType.OCTREE); + _box.copy( geometry.boundingBox ); + _box.applyMatrix4( object.matrixWorld ); - this._pointSizeType = PointSizeType.FIXED; - this._shape = PointShape.SQUARE; - this._useClipBox = false; - this.clipBoxes = []; - this.clipPolygons = []; - this._weighted = false; - this._gradient = Gradients.SPECTRAL; - this.gradientTexture = PointCloudMaterial.generateGradientTexture(this._gradient); - this._matcap = "matcap.jpg"; - this.matcapTexture = Potree.PointCloudMaterial.generateMatcapTexture(this._matcap); - this.lights = false; - this.fog = false; - this._treeType = treeType; - this._useEDL = false; - this.defines = new Map(); + this.union( _box ); - this.ranges = new Map(); + } - this._activeAttributeName = null; + const children = object.children; - this._defaultIntensityRangeChanged = false; - this._defaultElevationRangeChanged = false; + for ( let i = 0, l = children.length; i < l; i ++ ) { - { - const [width, height] = [256, 1]; - let data = new Uint8Array(width * 4); - let texture = new THREE.DataTexture(data, width, height, THREE.RGBAFormat); - texture.magFilter = THREE.NearestFilter; - texture.needsUpdate = true; + this.expandByObject( children[ i ] ); - this.classificationTexture = texture; } - this.attributes = { - position: { type: 'fv', value: [] }, - color: { type: 'fv', value: [] }, - normal: { type: 'fv', value: [] }, - intensity: { type: 'f', value: [] }, - classification: { type: 'f', value: [] }, - returnNumber: { type: 'f', value: [] }, - numberOfReturns: { type: 'f', value: [] }, - pointSourceID: { type: 'f', value: [] }, - indices: { type: 'fv', value: [] } - }; + return this; - this.uniforms = { - level: { type: "f", value: 0.0 }, - vnStart: { type: "f", value: 0.0 }, - spacing: { type: "f", value: 1.0 }, - blendHardness: { type: "f", value: 2.0 }, - blendDepthSupplement: { type: "f", value: 0.0 }, - fov: { type: "f", value: 1.0 }, - screenWidth: { type: "f", value: 1.0 }, - screenHeight: { type: "f", value: 1.0 }, - near: { type: "f", value: 0.1 }, - far: { type: "f", value: 1.0 }, - uColor: { type: "c", value: new THREE.Color( 0xffffff ) }, - uOpacity: { type: "f", value: 1.0 }, - size: { type: "f", value: pointSize }, - minSize: { type: "f", value: minSize }, - maxSize: { type: "f", value: maxSize }, - octreeSize: { type: "f", value: 0 }, - bbSize: { type: "fv", value: [0, 0, 0] }, - elevationRange: { type: "2fv", value: [0, 0] }, + } - clipBoxCount: { type: "f", value: 0 }, - //clipSphereCount: { type: "f", value: 0 }, - clipPolygonCount: { type: "i", value: 0 }, - clipBoxes: { type: "Matrix4fv", value: [] }, - //clipSpheres: { type: "Matrix4fv", value: [] }, - clipPolygons: { type: "3fv", value: [] }, - clipPolygonVCount: { type: "iv", value: [] }, - clipPolygonVP: { type: "Matrix4fv", value: [] }, + containsPoint( point ) { - visibleNodes: { type: "t", value: this.visibleNodesTexture }, - pcIndex: { type: "f", value: 0 }, - gradient: { type: "t", value: this.gradientTexture }, - classificationLUT: { type: "t", value: this.classificationTexture }, - uHQDepthMap: { type: "t", value: null }, - toModel: { type: "Matrix4f", value: [] }, - diffuse: { type: "fv", value: [1, 1, 1] }, - transition: { type: "f", value: 0.5 }, + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ? false : true; - intensityRange: { type: "fv", value: [Infinity, -Infinity] }, + } - intensity_gbc: { type: "fv", value: [1, 0, 0]}, - uRGB_gbc: { type: "fv", value: [1, 0, 0]}, - // intensityGamma: { type: "f", value: 1 }, - // intensityContrast: { type: "f", value: 0 }, - // intensityBrightness:{ type: "f", value: 0 }, - // rgbGamma: { type: "f", value: 1 }, - // rgbContrast: { type: "f", value: 0 }, - // rgbBrightness: { type: "f", value: 0 }, - wRGB: { type: "f", value: 1 }, - wIntensity: { type: "f", value: 0 }, - wElevation: { type: "f", value: 0 }, - wClassification: { type: "f", value: 0 }, - wReturnNumber: { type: "f", value: 0 }, - wSourceID: { type: "f", value: 0 }, - useOrthographicCamera: { type: "b", value: false }, - elevationGradientRepat: { type: "i", value: ElevationGradientRepeat.CLAMP }, - clipTask: { type: "i", value: 1 }, - clipMethod: { type: "i", value: 1 }, - uShadowColor: { type: "3fv", value: [0, 0, 0] }, + containsBox( box ) { - uExtraScale: { type: "f", value: 1}, - uExtraOffset: { type: "f", value: 0}, - uExtraRange: { type: "2fv", value: [0, 1] }, - uExtraGammaBrightContr: { type: "3fv", value: [1, 0, 0] }, + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; - uFilterReturnNumberRange: { type: "fv", value: [0, 7]}, - uFilterNumberOfReturnsRange: { type: "fv", value: [0, 7]}, - uFilterGPSTimeClipRange: { type: "fv", value: [0, 7]}, - uFilterPointSourceIDClipRange: { type: "fv", value: [0, 65535]}, - matcapTextureUniform: { type: "t", value: this.matcapTexture }, - backfaceCulling: { type: "b", value: false }, - }; + } - this.classification = ClassificationScheme.DEFAULT; + getParameter( point, target ) { - this.defaultAttributeValues.normal = [0, 0, 0]; - this.defaultAttributeValues.classification = [0, 0, 0]; - this.defaultAttributeValues.indices = [0, 0, 0, 0]; + // This can potentially have a divide by zero if the box + // has a size dimension of 0. - this.vertexShader = Shaders['pointcloud.vs']; - this.fragmentShader = Shaders['pointcloud.fs']; - - this.vertexColors = THREE.VertexColors; + if ( target === undefined ) { - this.updateShaderSource(); - } + console.warn( 'THREE.Box3: .getParameter() target is now required' ); + target = new Vector3(); - setDefine(key, value){ - if(value !== undefined && value !== null){ - if(this.defines.get(key) !== value){ - this.defines.set(key, value); - this.updateShaderSource(); - } - }else { - this.removeDefine(key); } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + } - removeDefine(key){ - this.defines.delete(key); + intersectsBox( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + } - updateShaderSource () { + intersectsSphere( sphere ) { - let vs = Shaders['pointcloud.vs']; - let fs = Shaders['pointcloud.fs']; - let definesString = this.getDefines(); + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, _vector$1 ); - let vsVersionIndex = vs.indexOf("#version "); - let fsVersionIndex = fs.indexOf("#version "); + // If that point is inside the sphere, the AABB and sphere intersect. + return _vector$1.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); - if(vsVersionIndex >= 0){ - vs = vs.replace(/(#version .*)/, `$1\n${definesString}`); - }else { - vs = `${definesString}\n${vs}`; - } + } - if(fsVersionIndex >= 0){ - fs = fs.replace(/(#version .*)/, `$1\n${definesString}`); - }else { - fs = `${definesString}\n${fs}`; - } + intersectsPlane( plane ) { - this.vertexShader = vs; - this.fragmentShader = fs; + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. - if (this.opacity === 1.0) { - this.blending = THREE.NoBlending; - this.transparent = false; - this.depthTest = true; - this.depthWrite = true; - this.depthFunc = THREE.LessEqualDepth; - } else if (this.opacity < 1.0 && !this.useEDL) { - this.blending = THREE.AdditiveBlending; - this.transparent = true; - this.depthTest = false; - this.depthWrite = true; - this.depthFunc = THREE.AlwaysDepth; - } + let min, max; - if (this.weighted) { - this.blending = THREE.AdditiveBlending; - this.transparent = true; - this.depthTest = true; - this.depthWrite = false; - } + if ( plane.normal.x > 0 ) { - this.needsUpdate = true; - } + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; - getDefines () { - let defines = []; + } else { - if (this.pointSizeType === PointSizeType.FIXED) { - defines.push('#define fixed_point_size'); - } else if (this.pointSizeType === PointSizeType.ATTENUATED) { - defines.push('#define attenuated_point_size'); - } else if (this.pointSizeType === PointSizeType.ADAPTIVE) { - defines.push('#define adaptive_point_size'); - } + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; - if (this.shape === PointShape.SQUARE) { - defines.push('#define square_point_shape'); - } else if (this.shape === PointShape.CIRCLE) { - defines.push('#define circle_point_shape'); - } else if (this.shape === PointShape.PARABOLOID) { - defines.push('#define paraboloid_point_shape'); } - if (this._useEDL) { - defines.push('#define use_edl'); - } + if ( plane.normal.y > 0 ) { - if(this.activeAttributeName){ - let attributeName = this.activeAttributeName.replace(/[^a-zA-Z0-9]/g, '_'); + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; - defines.push(`#define color_type_${attributeName}`); - } - - if(this._treeType === TreeType.OCTREE){ - defines.push('#define tree_type_octree'); - }else if(this._treeType === TreeType.KDTREE){ - defines.push('#define tree_type_kdtree'); - } + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; - if (this.weighted) { - defines.push('#define weighted_splats'); } - for(let [key, value] of this.defines){ - defines.push(value); + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + } - return defines.join("\n"); + return ( min <= - plane.constant && max >= - plane.constant ); + } - setClipBoxes (clipBoxes) { - if (!clipBoxes) { - return; - } + intersectsTriangle( triangle ) { - let doUpdate = (this.clipBoxes.length !== clipBoxes.length) && (clipBoxes.length === 0 || this.clipBoxes.length === 0); + if ( this.isEmpty() ) { - this.uniforms.clipBoxCount.value = this.clipBoxes.length; - this.clipBoxes = clipBoxes; + return false; - if (doUpdate) { - this.updateShaderSource(); } - this.uniforms.clipBoxes.value = new Float32Array(this.clipBoxes.length * 16); + // compute box center and extents + this.getCenter( _center ); + _extents.subVectors( this.max, _center ); - for (let i = 0; i < this.clipBoxes.length; i++) { - let box = clipBoxes[i]; + // translate triangle to aabb origin + _v0.subVectors( triangle.a, _center ); + _v1.subVectors( triangle.b, _center ); + _v2.subVectors( triangle.c, _center ); - this.uniforms.clipBoxes.value.set(box.inverse.elements, 16 * i); - } + // compute edge vectors for triangle + _f0.subVectors( _v1, _v0 ); + _f1.subVectors( _v2, _v1 ); + _f2.subVectors( _v0, _v2 ); - for (let i = 0; i < this.uniforms.clipBoxes.value.length; i++) { - if (Number.isNaN(this.uniforms.clipBoxes.value[i])) { - this.uniforms.clipBoxes.value[i] = Infinity; - } - } - } + // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb + // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation + // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) + let axes = [ + 0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y, + _f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x, + - _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0 + ]; + if ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) { + + return false; - setClipPolygons(clipPolygons, maxPolygonVertices) { - if(!clipPolygons){ - return; } - this.clipPolygons = clipPolygons; + // test 3 face normals from the aabb + axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; + if ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) { - let doUpdate = (this.clipPolygons.length !== clipPolygons.length); + return false; - if(doUpdate){ - this.updateShaderSource(); } - } - - get gradient(){ - return this._gradient; - } - set gradient (value) { - if (this._gradient !== value) { - this._gradient = value; - this.gradientTexture = PointCloudMaterial.generateGradientTexture(this._gradient); - this.uniforms.gradient.value = this.gradientTexture; - } - } + // finally testing the face normal of the triangle + // use already existing triangle edge vectors here + _triangleNormal.crossVectors( _f0, _f1 ); + axes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ]; - get matcap(){ - return this._matcap; - } + return satForAxes( axes, _v0, _v1, _v2, _extents ); - set matcap (value) { - if (this._matcap !== value) { - this._matcap = value; - this.matcapTexture = Potree.PointCloudMaterial.generateMatcapTexture(this._matcap); - this.uniforms.matcapTextureUniform.value = this.matcapTexture; - } - } - get useOrthographicCamera() { - return this.uniforms.useOrthographicCamera.value; } - set useOrthographicCamera(value) { - if(this.uniforms.useOrthographicCamera.value !== value){ - this.uniforms.useOrthographicCamera.value = value; + clampPoint( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .clampPoint() target is now required' ); + target = new Vector3(); + } + + return target.copy( point ).clamp( this.min, this.max ); + } - get backfaceCulling() { - return this.uniforms.backfaceCulling.value; + + distanceToPoint( point ) { + + const clampedPoint = _vector$1.copy( point ).clamp( this.min, this.max ); + + return clampedPoint.sub( point ).length(); + } - set backfaceCulling(value) { - if(this.uniforms.backfaceCulling.value !== value){ - this.uniforms.backfaceCulling.value = value; - this.dispatchEvent({type: 'backface_changed', target: this}); + getBoundingSphere( target ) { + + if ( target === undefined ) { + + console.error( 'THREE.Box3: .getBoundingSphere() target is now required' ); + //target = new Sphere(); // removed to avoid cyclic dependency + } + + this.getCenter( target.center ); + + target.radius = this.getSize( _vector$1 ).length() * 0.5; + + return target; + } - recomputeClassification () { - const classification = this.classification; - const data = this.classificationTexture.image.data; + intersect( box ) { - let width = 256; - const black = [1, 1, 1, 1]; + this.min.max( box.min ); + this.max.min( box.max ); - let valuesChanged = false; + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if ( this.isEmpty() ) this.makeEmpty(); - for (let i = 0; i < width; i++) { + return this; - let color; - let visible = true; + } - if (classification[i]) { - color = classification[i].color; - visible = classification[i].visible; - } else if (classification[i % 32]) { - color = classification[i % 32].color; - visible = classification[i % 32].visible; - } else if(classification.DEFAULT) { - color = classification.DEFAULT.color; - visible = classification.DEFAULT.visible; - }else { - color = black; - } + union( box ) { - const r = parseInt(255 * color[0]); - const g = parseInt(255 * color[1]); - const b = parseInt(255 * color[2]); - const a = visible ? parseInt(255 * color[3]) : 0; + this.min.min( box.min ); + this.max.max( box.max ); + return this; - if(data[4 * i + 0] !== r){ - data[4 * i + 0] = r; - valuesChanged = true; - } + } - if(data[4 * i + 1] !== g){ - data[4 * i + 1] = g; - valuesChanged = true; - } + applyMatrix4( matrix ) { - if(data[4 * i + 2] !== b){ - data[4 * i + 2] = b; - valuesChanged = true; - } + // transform of empty box is an empty box. + if ( this.isEmpty() ) return this; - if(data[4 * i + 3] !== a){ - data[4 * i + 3] = a; - valuesChanged = true; - } - } + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + _points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + _points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + _points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + _points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + _points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + _points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + _points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + _points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 - if(valuesChanged){ - this.classificationTexture.needsUpdate = true; + this.setFromPoints( _points ); - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } - } + return this; - get spacing () { - return this.uniforms.spacing.value; } - set spacing (value) { - if (this.uniforms.spacing.value !== value) { - this.uniforms.spacing.value = value; - } - } + translate( offset ) { - get useClipBox () { - return this._useClipBox; - } + this.min.add( offset ); + this.max.add( offset ); - set useClipBox (value) { - if (this._useClipBox !== value) { - this._useClipBox = value; - this.updateShaderSource(); - } - } + return this; - get clipTask(){ - return this.uniforms.clipTask.value; } - set clipTask(mode){ - this.uniforms.clipTask.value = mode; - } + equals( box ) { - get elevationGradientRepat(){ - return this.uniforms.elevationGradientRepat.value; - } + return box.min.equals( this.min ) && box.max.equals( this.max ); - set elevationGradientRepat(mode){ - this.uniforms.elevationGradientRepat.value = mode; } - get clipMethod(){ - return this.uniforms.clipMethod.value; - } + } - set clipMethod(mode){ - this.uniforms.clipMethod.value = mode; - } + function satForAxes( axes, v0, v1, v2, extents ) { - get weighted(){ - return this._weighted; - } + for ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) { - set weighted (value) { - if (this._weighted !== value) { - this._weighted = value; - this.updateShaderSource(); - } - } + _testAxis.fromArray( axes, i ); + // project the aabb onto the seperating axis + const r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z ); + // project all 3 vertices of the triangle onto the seperating axis + const p0 = v0.dot( _testAxis ); + const p1 = v1.dot( _testAxis ); + const p2 = v2.dot( _testAxis ); + // actual test, basically see if either of the most extreme of the triangle points intersects r + if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) { - get fov () { - return this.uniforms.fov.value; - } + // points of the projected triangle are outside the projected half-length of the aabb + // the axis is seperating and we can exit + return false; - set fov (value) { - if (this.uniforms.fov.value !== value) { - this.uniforms.fov.value = value; - // this.updateShaderSource(); } - } - get screenWidth () { - return this.uniforms.screenWidth.value; } - set screenWidth (value) { - if (this.uniforms.screenWidth.value !== value) { - this.uniforms.screenWidth.value = value; - // this.updateShaderSource(); - } - } + return true; - get screenHeight () { - return this.uniforms.screenHeight.value; - } + } - set screenHeight (value) { - if (this.uniforms.screenHeight.value !== value) { - this.uniforms.screenHeight.value = value; - // this.updateShaderSource(); - } - } + const _points = [ + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3() + ]; - get near () { - return this.uniforms.near.value; - } + const _vector$1 = /*@__PURE__*/ new Vector3(); - set near (value) { - if (this.uniforms.near.value !== value) { - this.uniforms.near.value = value; - } - } + const _box = /*@__PURE__*/ new Box3(); - get far () { - return this.uniforms.far.value; - } + // triangle centered vertices - set far (value) { - if (this.uniforms.far.value !== value) { - this.uniforms.far.value = value; - } - } - - get opacity(){ - return this.uniforms.uOpacity.value; - } + const _v0 = /*@__PURE__*/ new Vector3(); + const _v1 = /*@__PURE__*/ new Vector3(); + const _v2 = /*@__PURE__*/ new Vector3(); - set opacity (value) { - if (this.uniforms && this.uniforms.uOpacity) { - if (this.uniforms.uOpacity.value !== value) { - this.uniforms.uOpacity.value = value; - this.updateShaderSource(); - this.dispatchEvent({ - type: 'opacity_changed', - target: this - }); - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } - } - } + // triangle edge vectors - get activeAttributeName(){ - return this._activeAttributeName; - } + const _f0 = /*@__PURE__*/ new Vector3(); + const _f1 = /*@__PURE__*/ new Vector3(); + const _f2 = /*@__PURE__*/ new Vector3(); - set activeAttributeName(value){ - if (this._activeAttributeName !== value) { - this._activeAttributeName = value; + const _center = /*@__PURE__*/ new Vector3(); + const _extents = /*@__PURE__*/ new Vector3(); + const _triangleNormal = /*@__PURE__*/ new Vector3(); + const _testAxis = /*@__PURE__*/ new Vector3(); - this.updateShaderSource(); - this.dispatchEvent({ - type: 'active_attribute_changed', - target: this - }); + const _box$1 = /*@__PURE__*/ new Box3(); - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } - } + class Sphere { - get pointSizeType () { - return this._pointSizeType; - } + constructor( center, radius ) { - set pointSizeType (value) { - if (this._pointSizeType !== value) { - this._pointSizeType = value; - this.updateShaderSource(); - this.dispatchEvent({ - type: 'point_size_type_changed', - target: this - }); - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } - } + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : - 1; - get useEDL(){ - return this._useEDL; } - set useEDL (value) { - if (this._useEDL !== value) { - this._useEDL = value; - this.updateShaderSource(); - } - } + set( center, radius ) { - get color () { - return this.uniforms.uColor.value; - } + this.center.copy( center ); + this.radius = radius; - set color (value) { - if (!this.uniforms.uColor.value.equals(value)) { - this.uniforms.uColor.value.copy(value); - - this.dispatchEvent({ - type: 'color_changed', - target: this - }); - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } - } + return this; - get shape () { - return this._shape; } - set shape (value) { - if (this._shape !== value) { - this._shape = value; - this.updateShaderSource(); - this.dispatchEvent({type: 'point_shape_changed', target: this}); - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); + setFromPoints( points, optionalCenter ) { + + const center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + _box$1.setFromPoints( points ).getCenter( center ); + } - } - get treeType () { - return this._treeType; - } + let maxRadiusSq = 0; + + for ( let i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); - set treeType (value) { - if (this._treeType !== value) { - this._treeType = value; - this.updateShaderSource(); } - } - get bbSize () { - return this.uniforms.bbSize.value; - } + this.radius = Math.sqrt( maxRadiusSq ); - set bbSize (value) { - this.uniforms.bbSize.value = value; - } + return this; - get size () { - return this.uniforms.size.value; } - set size (value) { - if (this.uniforms.size.value !== value) { - this.uniforms.size.value = value; + clone() { - this.dispatchEvent({ - type: 'point_size_changed', - target: this - }); - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } - } + return new this.constructor().copy( this ); - get minSize(){ - return this.uniforms.minSize.value; } - set minSize(value){ - if (this.uniforms.minSize.value !== value) { - this.uniforms.minSize.value = value; + copy( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; - this.dispatchEvent({ - type: 'point_size_changed', - target: this - }); - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } } - get elevationRange () { - return this.uniforms.elevationRange.value; + isEmpty() { + + return ( this.radius < 0 ); + } - set elevationRange (value) { - let changed = this.uniforms.elevationRange.value[0] !== value[0] - || this.uniforms.elevationRange.value[1] !== value[1]; + makeEmpty() { - if(changed){ - this.uniforms.elevationRange.value = value; + this.center.set( 0, 0, 0 ); + this.radius = - 1; - this._defaultElevationRangeChanged = true; + return this; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } } - get heightMin () { - return this.uniforms.elevationRange.value[0]; - } + containsPoint( point ) { - set heightMin (value) { - this.elevationRange = [value, this.elevationRange[1]]; - } + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); - get heightMax () { - return this.uniforms.elevationRange.value[1]; } - set heightMax (value) { - this.elevationRange = [this.elevationRange[0], value]; - } + distanceToPoint( point ) { - get transition () { - return this.uniforms.transition.value; - } + return ( point.distanceTo( this.center ) - this.radius ); - set transition (value) { - this.uniforms.transition.value = value; } - get intensityRange () { - return this.uniforms.intensityRange.value; - } + intersectsSphere( sphere ) { - set intensityRange (value) { - if (!(value instanceof Array && value.length === 2)) { - return; - } + const radiusSum = this.radius + sphere.radius; - if (value[0] === this.uniforms.intensityRange.value[0] && - value[1] === this.uniforms.intensityRange.value[1]) { - return; - } + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); - this.uniforms.intensityRange.value = value; + } - this._defaultIntensityRangeChanged = true; + intersectsBox( box ) { - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } + return box.intersectsSphere( this ); - get intensityGamma () { - return this.uniforms.intensity_gbc.value[0]; } - set intensityGamma (value) { - if (this.uniforms.intensity_gbc.value[0] !== value) { - this.uniforms.intensity_gbc.value[0] = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } - } + intersectsPlane( plane ) { - get intensityContrast () { - return this.uniforms.intensity_gbc.value[2]; - } + return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius; - set intensityContrast (value) { - if (this.uniforms.intensity_gbc.value[2] !== value) { - this.uniforms.intensity_gbc.value[2] = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } } - get intensityBrightness () { - return this.uniforms.intensity_gbc.value[1]; - } + clampPoint( point, target ) { - set intensityBrightness (value) { - if (this.uniforms.intensity_gbc.value[1] !== value) { - this.uniforms.intensity_gbc.value[1] = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } - } + const deltaLengthSq = this.center.distanceToSquared( point ); - get rgbGamma () { - return this.uniforms.uRGB_gbc.value[0]; - } + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .clampPoint() target is now required' ); + target = new Vector3(); - set rgbGamma (value) { - if (this.uniforms.uRGB_gbc.value[0] !== value) { - this.uniforms.uRGB_gbc.value[0] = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); } - } - get rgbContrast () { - return this.uniforms.uRGB_gbc.value[2]; - } + target.copy( point ); - set rgbContrast (value) { - if (this.uniforms.uRGB_gbc.value[2] !== value) { - this.uniforms.uRGB_gbc.value[2] = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } - } + if ( deltaLengthSq > ( this.radius * this.radius ) ) { - get rgbBrightness () { - return this.uniforms.uRGB_gbc.value[1]; - } + target.sub( this.center ).normalize(); + target.multiplyScalar( this.radius ).add( this.center ); - set rgbBrightness (value) { - if (this.uniforms.uRGB_gbc.value[1] !== value) { - this.uniforms.uRGB_gbc.value[1] = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); } - } - - get extraGamma () { - return this.uniforms.uExtraGammaBrightContr.value[0]; - } + return target; - set extraGamma (value) { - if (this.uniforms.uExtraGammaBrightContr.value[0] !== value) { - this.uniforms.uExtraGammaBrightContr.value[0] = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } } - get extraBrightness () { - return this.uniforms.uExtraGammaBrightContr.value[1]; - } + getBoundingBox( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .getBoundingBox() target is now required' ); + target = new Box3(); - set extraBrightness (value) { - if (this.uniforms.uExtraGammaBrightContr.value[1] !== value) { - this.uniforms.uExtraGammaBrightContr.value[1] = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); } - } - get extraContrast () { - return this.uniforms.uExtraGammaBrightContr.value[2]; - } + if ( this.isEmpty() ) { + + // Empty sphere produces empty bounding box + target.makeEmpty(); + return target; - set extraContrast (value) { - if (this.uniforms.uExtraGammaBrightContr.value[2] !== value) { - this.uniforms.uExtraGammaBrightContr.value[2] = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); } - } - getRange(attributeName){ - return this.ranges.get(attributeName); + target.set( this.center, this.center ); + target.expandByScalar( this.radius ); + + return target; + } - setRange(attributeName, newRange){ + applyMatrix4( matrix ) { - let rangeChanged = false; + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); - let oldRange = this.ranges.get(attributeName); + return this; - if(oldRange != null && newRange != null){ - rangeChanged = oldRange[0] !== newRange[0] || oldRange[1] !== newRange[1]; - }else { - rangeChanged = true; - } + } - this.ranges.set(attributeName, newRange); + translate( offset ) { + + this.center.add( offset ); + + return this; - if(rangeChanged){ - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } } - get extraRange () { - return this.uniforms.uExtraRange.value; + equals( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + } - set extraRange (value) { - if (!(value instanceof Array && value.length === 2)) { - return; - } + } - if (value[0] === this.uniforms.uExtraRange.value[0] && - value[1] === this.uniforms.uExtraRange.value[1]) { - return; - } + const _vector$2 = /*@__PURE__*/ new Vector3(); + const _segCenter = /*@__PURE__*/ new Vector3(); + const _segDir = /*@__PURE__*/ new Vector3(); + const _diff = /*@__PURE__*/ new Vector3(); - this.uniforms.uExtraRange.value = value; + const _edge1 = /*@__PURE__*/ new Vector3(); + const _edge2 = /*@__PURE__*/ new Vector3(); + const _normal = /*@__PURE__*/ new Vector3(); - this._defaultExtraRangeChanged = true; + class Ray { + + constructor( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3( 0, 0, - 1 ); - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); } - get weightRGB () { - return this.uniforms.wRGB.value; + set( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + } - set weightRGB (value) { - if(this.uniforms.wRGB.value !== value){ - this.uniforms.wRGB.value = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } + clone() { + + return new this.constructor().copy( this ); + } - get weightIntensity () { - return this.uniforms.wIntensity.value; + copy( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + } - set weightIntensity (value) { - if(this.uniforms.wIntensity.value !== value){ - this.uniforms.wIntensity.value = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); + at( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .at() target is now required' ); + target = new Vector3(); + } - } - get weightElevation () { - return this.uniforms.wElevation.value; + return target.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + } - set weightElevation (value) { - if(this.uniforms.wElevation.value !== value){ - this.uniforms.wElevation.value = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } + lookAt( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + } - get weightClassification () { - return this.uniforms.wClassification.value; + recast( t ) { + + this.origin.copy( this.at( t, _vector$2 ) ); + + return this; + } - set weightClassification (value) { - if(this.uniforms.wClassification.value !== value){ - this.uniforms.wClassification.value = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); + closestPointToPoint( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .closestPointToPoint() target is now required' ); + target = new Vector3(); + } - } - get weightReturnNumber () { - return this.uniforms.wReturnNumber.value; - } + target.subVectors( point, this.origin ); + + const directionDistance = target.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return target.copy( this.origin ); - set weightReturnNumber (value) { - if(this.uniforms.wReturnNumber.value !== value){ - this.uniforms.wReturnNumber.value = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); } - } - get weightSourceID () { - return this.uniforms.wSourceID.value; + return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + } - set weightSourceID (value) { - if(this.uniforms.wSourceID.value !== value){ - this.uniforms.wSourceID.value = value; - this.dispatchEvent({ - type: 'material_property_changed', - target: this - }); - } + distanceToPoint( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + } - static generateGradientTexture (gradient) { - let size = 64; + distanceSqToPoint( point ) { - // create canvas - let canvas = document.createElement('canvas'); - canvas.width = size; - canvas.height = size; + const directionDistance = _vector$2.subVectors( point, this.origin ).dot( this.direction ); - // get context - let context = canvas.getContext('2d'); + // point behind the ray - // draw gradient - context.rect(0, 0, size, size); - let ctxGradient = context.createLinearGradient(0, 0, size, size); + if ( directionDistance < 0 ) { - for (let i = 0; i < gradient.length; i++) { - let step = gradient[i]; + return this.origin.distanceToSquared( point ); - ctxGradient.addColorStop(step[0], '#' + step[1].getHexString()); } - context.fillStyle = ctxGradient; - context.fill(); - - //let texture = new THREE.Texture(canvas); - let texture = new THREE.CanvasTexture(canvas); - texture.needsUpdate = true; - - texture.minFilter = THREE.LinearFilter; - texture.wrap = THREE.RepeatWrapping; - texture.repeat = 2; - // textureImage = texture.image; + _vector$2.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return _vector$2.distanceToSquared( point ); - return texture; - } - - static generateMatcapTexture (matcap) { - var url = new URL(Potree.resourcePath + "/textures/matcap/" + matcap).href; - let texture = new THREE.TextureLoader().load( url ); - texture.magFilter = texture.minFilter = THREE.LinearFilter; - texture.needsUpdate = true; - // PotreeConverter_1.6_2018_07_29_windows_x64\PotreeConverter.exe autzen_xyzrgbXYZ_ascii.xyz -f xyzrgbXYZ -a RGB NORMAL -o autzen_xyzrgbXYZ_ascii_a -p index --overwrite - // Switch matcap texture on the fly : viewer.scene.pointclouds[0].material.matcap = 'matcap1.jpg'; - // For non power of 2, use LinearFilter and dont generate mipmaps, For power of 2, use NearestFilter and generate mipmaps : matcap2.jpg 1 2 8 11 12 13 - return texture; } - static generateMatcapTexture (matcap) { - var url = new URL(Potree.resourcePath + "/textures/matcap/" + matcap).href; - let texture = new THREE.TextureLoader().load( url ); - texture.magFilter = texture.minFilter = THREE.LinearFilter; - texture.needsUpdate = true; - // PotreeConverter_1.6_2018_07_29_windows_x64\PotreeConverter.exe autzen_xyzrgbXYZ_ascii.xyz -f xyzrgbXYZ -a RGB NORMAL -o autzen_xyzrgbXYZ_ascii_a -p index --overwrite - // Switch matcap texture on the fly : viewer.scene.pointclouds[0].material.matcap = 'matcap1.jpg'; - // For non power of 2, use LinearFilter and dont generate mipmaps, For power of 2, use NearestFilter and generate mipmaps : matcap2.jpg 1 2 8 11 12 13 - return texture; - } + distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { - disableEvents(){ - if(this._hiddenListeners === undefined){ - this._hiddenListeners = this._listeners; - this._listeners = {}; - } - }; + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment - enableEvents(){ - this._listeners = this._hiddenListeners; - this._hiddenListeners = undefined; - }; + _segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + _segDir.copy( v1 ).sub( v0 ).normalize(); + _diff.copy( this.origin ).sub( _segCenter ); - // copyFrom(from){ + const segExtent = v0.distanceTo( v1 ) * 0.5; + const a01 = - this.direction.dot( _segDir ); + const b0 = _diff.dot( this.direction ); + const b1 = - _diff.dot( _segDir ); + const c = _diff.lengthSq(); + const det = Math.abs( 1 - a01 * a01 ); + let s0, s1, sqrDist, extDet; - // var a = 10; + if ( det > 0 ) { - // for(let name of Object.keys(this.uniforms)){ - // this.uniforms[name].value = from.uniforms[name].value; - // } - // } + // The ray and segment are not parallel. - // copy(from){ - // this.copyFrom(from); - // } + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; - } + if ( s0 >= 0 ) { - class PointCloudOctreeNode extends PointCloudTreeNode { - constructor () { - super(); + if ( s1 >= - extDet ) { - //this.children = {}; - this.children = []; - this.sceneNode = null; - this.octree = null; - } + if ( s1 <= extDet ) { - getNumPoints () { - return this.geometryNode.numPoints; - } + // region 0 + // Minimum at interior points of ray and segment. - isLoaded () { - return true; - } + const invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; - isTreeNode () { - return true; - } + } else { - isGeometryNode () { - return false; - } + // region 1 - getLevel () { - return this.geometryNode.level; - } + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; - getBoundingSphere () { - return this.geometryNode.boundingSphere; - } + } - getBoundingBox () { - return this.geometryNode.boundingBox; - } + } else { - getChildren () { - let children = []; + // region 5 - for (let i = 0; i < 8; i++) { - if (this.children[i]) { - children.push(this.children[i]); - } - } + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; - return children; - } + } - getPointsInBox(boxNode){ + } else { - if(!this.sceneNode){ - return null; - } + if ( s1 <= - extDet ) { - let buffer = this.geometryNode.buffer; + // region 4 - let posOffset = buffer.offset("position"); - let stride = buffer.stride; - let view = new DataView(buffer.data); + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; - let worldToBox = new THREE.Matrix4().getInverse(boxNode.matrixWorld); - let objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, this.sceneNode.matrixWorld); + } else if ( s1 <= extDet ) { - let inBox = []; + // region 3 - let pos = new THREE.Vector4(); - for(let i = 0; i < buffer.numElements; i++){ - let x = view.getFloat32(i * stride + posOffset + 0, true); - let y = view.getFloat32(i * stride + posOffset + 4, true); - let z = view.getFloat32(i * stride + posOffset + 8, true); + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; - pos.set(x, y, z, 1); - pos.applyMatrix4(objectToBox); + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; - if(-0.5 < pos.x && pos.x < 0.5){ - if(-0.5 < pos.y && pos.y < 0.5){ - if(-0.5 < pos.z && pos.z < 0.5){ - pos.set(x, y, z, 1).applyMatrix4(this.sceneNode.matrixWorld); - inBox.push(new THREE.Vector3(pos.x, pos.y, pos.z)); - } } - } - } - return inBox; - } + } - get name () { - return this.geometryNode.name; - } - }; + } else { - class PointCloudOctree extends PointCloudTree { - constructor (geometry, material) { - super(); + // Ray and segment are parallel. - this.pointBudget = Infinity; - this.pcoGeometry = geometry; - this.boundingBox = this.pcoGeometry.boundingBox; - this.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere()); - this.material = material || new PointCloudMaterial(); - this.visiblePointsTarget = 2 * 1000 * 1000; - this.minimumNodePixelSize = 150; - this.level = 0; - this.position.copy(geometry.offset); - this.updateMatrix(); + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; - { - let attributeName = "rgba"; - if(this.pcoGeometry.pointAttributes.attributes.length > 1){ - attributeName = this.pcoGeometry.pointAttributes.attributes[1].name; - } - this.material.activeAttributeName = attributeName; } - this.showBoundingBox = false; - this.boundingBoxNodes = []; - this.loadQueue = []; - this.visibleBounds = new THREE.Box3(); - this.visibleNodes = []; - this.visibleGeometry = []; - this.generateDEM = false; - this.profileRequests = []; - this.name = ''; - this._visible = true; - - { - let box = [this.pcoGeometry.tightBoundingBox, this.getBoundingBoxWorld()] - .find(v => v !== undefined); + if ( optionalPointOnRay ) { - this.updateMatrixWorld(true); - box = Utils.computeTransformedBoundingBox(box, this.matrixWorld); + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); - let bMin = box.min.z; - let bMax = box.max.z; - this.material.heightMin = bMin; - this.material.heightMax = bMax; } - // TODO read projection from file instead - this.projection = geometry.projection; - this.fallbackProjection = geometry.fallbackProjection; + if ( optionalPointOnSegment ) { - this.root = this.pcoGeometry.root; - } + optionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter ); - setName (name) { - if (this.name !== name) { - this.name = name; - this.dispatchEvent({type: 'name_changed', name: name, pointcloud: this}); } - } - getName () { - return this.name; + return sqrDist; + } - getAttribute(name){ + intersectSphere( sphere, target ) { - const attribute = this.pcoGeometry.pointAttributes.attributes.find(a => a.name === name); + _vector$2.subVectors( sphere.center, this.origin ); + const tca = _vector$2.dot( this.direction ); + const d2 = _vector$2.dot( _vector$2 ) - tca * tca; + const radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + const thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + const t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + const t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, target ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, target ); - if(attribute){ - return attribute; - }else { - return null; - } } - getAttributes(){ - return this.pcoGeometry.pointAttributes; + intersectsSphere( sphere ) { + + return this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius ); + } - toTreeNode (geometryNode, parent) { - let node = new PointCloudOctreeNode(); + distanceToPlane( plane ) { - // if(geometryNode.name === "r40206"){ - // console.log("creating node for r40206"); - // } - let sceneNode = new THREE.Points(geometryNode.geometry, this.material); - sceneNode.name = geometryNode.name; - sceneNode.position.copy(geometryNode.boundingBox.min); - sceneNode.frustumCulled = false; - sceneNode.onBeforeRender = (_this, scene, camera, geometry, material, group) => { - if (material.program) { - _this.getContext().useProgram(material.program.program); + const denominator = plane.normal.dot( this.direction ); - if (material.program.getUniforms().map.level) { - let level = geometryNode.getLevel(); - material.uniforms.level.value = level; - material.program.getUniforms().map.level.setValue(_this.getContext(), level); - } + if ( denominator === 0 ) { - if (this.visibleNodeTextureOffsets && material.program.getUniforms().map.vnStart) { - let vnStart = this.visibleNodeTextureOffsets.get(node); - material.uniforms.vnStart.value = vnStart; - material.program.getUniforms().map.vnStart.setValue(_this.getContext(), vnStart); - } + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; - if (material.program.getUniforms().map.pcIndex) { - let i = node.pcIndex ? node.pcIndex : this.visibleNodes.indexOf(node); - material.uniforms.pcIndex.value = i; - material.program.getUniforms().map.pcIndex.setValue(_this.getContext(), i); - } } - }; - // { // DEBUG - // let sg = new THREE.SphereGeometry(1, 16, 16); - // let sm = new THREE.MeshNormalMaterial(); - // let s = new THREE.Mesh(sg, sm); - // s.scale.set(5, 5, 5); - // s.position.copy(geometryNode.mean) - // .add(this.position) - // .add(geometryNode.boundingBox.min); - // - // viewer.scene.scene.add(s); - // } + // Null is preferable to undefined since undefined means.... it is undefined - node.geometryNode = geometryNode; - node.sceneNode = sceneNode; - node.pointcloud = this; - node.children = []; - //for (let key in geometryNode.children) { - // node.children[key] = geometryNode.children[key]; - //} - for(let i = 0; i < 8; i++){ - node.children[i] = geometryNode.children[i]; - } + return null; - if (!parent) { - this.root = node; - this.add(sceneNode); - } else { - let childIndex = parseInt(geometryNode.name[geometryNode.name.length - 1]); - parent.sceneNode.add(sceneNode); - parent.children[childIndex] = node; } - let disposeListener = function () { - let childIndex = parseInt(geometryNode.name[geometryNode.name.length - 1]); - parent.sceneNode.remove(node.sceneNode); - parent.children[childIndex] = geometryNode; - }; - geometryNode.oneTimeDisposeHandlers.push(disposeListener); + const t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; - return node; } - updateVisibleBounds () { - let leafNodes = []; - for (let i = 0; i < this.visibleNodes.length; i++) { - let node = this.visibleNodes[i]; - let isLeaf = true; + intersectPlane( plane, target ) { - for (let j = 0; j < node.children.length; j++) { - let child = node.children[j]; - if (child instanceof PointCloudOctreeNode) { - isLeaf = isLeaf && !child.sceneNode.visible; - } else if (child instanceof PointCloudOctreeGeometryNode) { - isLeaf = true; - } - } + const t = this.distanceToPlane( plane ); - if (isLeaf) { - leafNodes.push(node); - } - } + if ( t === null ) { - this.visibleBounds.min = new THREE.Vector3(Infinity, Infinity, Infinity); - this.visibleBounds.max = new THREE.Vector3(-Infinity, -Infinity, -Infinity); - for (let i = 0; i < leafNodes.length; i++) { - let node = leafNodes[i]; + return null; - this.visibleBounds.expandByPoint(node.getBoundingBox().min); - this.visibleBounds.expandByPoint(node.getBoundingBox().max); } - } - updateMaterial (material, visibleNodes, camera, renderer) { - material.fov = camera.fov * (Math.PI / 180); - material.screenWidth = renderer.domElement.clientWidth; - material.screenHeight = renderer.domElement.clientHeight; - material.spacing = this.pcoGeometry.spacing * Math.max(this.scale.x, this.scale.y, this.scale.z); - material.near = camera.near; - material.far = camera.far; - material.uniforms.octreeSize.value = this.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x; + return this.at( t, target ); + } - computeVisibilityTextureData(nodes, camera){ + intersectsPlane( plane ) { - if(Potree.measureTimings) performance.mark("computeVisibilityTextureData-start"); + // check if the ray lies on the plane first - let data = new Uint8Array(nodes.length * 4); - let visibleNodeTextureOffsets = new Map(); + const distToPoint = plane.distanceToPoint( this.origin ); - // copy array - nodes = nodes.slice(); + if ( distToPoint === 0 ) { - // sort by level and index, e.g. r, r0, r3, r4, r01, r07, r30, ... - let sort = function (a, b) { - let na = a.geometryNode.name; - let nb = b.geometryNode.name; - if (na.length !== nb.length) return na.length - nb.length; - if (na < nb) return -1; - if (na > nb) return 1; - return 0; - }; - nodes.sort(sort); + return true; - // code sample taken from three.js src/math/Ray.js - let v1 = new THREE.Vector3(); - let intersectSphereBack = (ray, sphere) => { - v1.subVectors( sphere.center, ray.origin ); - let tca = v1.dot( ray.direction ); - let d2 = v1.dot( v1 ) - tca * tca; - let radius2 = sphere.radius * sphere.radius; + } - if(d2 > radius2){ - return null; - } + const denominator = plane.normal.dot( this.direction ); - let thc = Math.sqrt( radius2 - d2 ); + if ( denominator * distToPoint < 0 ) { - // t1 = second intersect point - exit point on back of sphere - let t1 = tca + thc; + return true; - if(t1 < 0 ){ - return null; - } + } - return t1; - }; + // ray origin is behind the plane (and is pointing behind it) - let lodRanges = new Map(); - let leafNodeLodRanges = new Map(); + return false; - let bBox = new THREE.Box3(); - let bSphere = new THREE.Sphere(); - let worldDir = new THREE.Vector3(); - let cameraRay = new THREE.Ray(camera.position, camera.getWorldDirection(worldDir)); + } - let nodeMap = new Map(); - let offsetsToChild = new Array(nodes.length).fill(Infinity); + intersectBox( box, target ) { - for(let i = 0; i < nodes.length; i++){ - let node = nodes[i]; + let tmin, tmax, tymin, tymax, tzmin, tzmax; - nodeMap.set(node.name, node); - visibleNodeTextureOffsets.set(node, i); + const invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; - if(i > 0){ - let index = parseInt(node.name.slice(-1)); - let parentName = node.name.slice(0, -1); - let parent = nodeMap.get(parentName); - let parentOffset = visibleNodeTextureOffsets.get(parent); + const origin = this.origin; - let parentOffsetToChild = (i - parentOffset); + if ( invdirx >= 0 ) { - offsetsToChild[parentOffset] = Math.min(offsetsToChild[parentOffset], parentOffsetToChild); + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; - data[parentOffset * 4 + 0] = data[parentOffset * 4 + 0] | (1 << index); - data[parentOffset * 4 + 1] = (offsetsToChild[parentOffset] >> 8); - data[parentOffset * 4 + 2] = (offsetsToChild[parentOffset] % 256); - } + } else { - // data[i * 4 + 3] = node.geometryNode.nodeType === 1 ? 1 : 0; - // data[i * 4 + 3] = node.name.length - 1; + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; - let density = node.geometryNode.density; - - if(typeof density === "number"){ - let lodOffset = Math.log2(density) / 2 - 1.5; + } - let offsetUint8 = (lodOffset + 10) * 10; + if ( invdiry >= 0 ) { - data[i * 4 + 3] = offsetUint8; - }else { - data[i * 4 + 3] = 100; - } + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; - } + } else { - var a = 10; + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; - if(Potree.measureTimings){ - performance.mark("computeVisibilityTextureData-end"); - performance.measure("render.computeVisibilityTextureData", "computeVisibilityTextureData-start", "computeVisibilityTextureData-end"); } - return { - data: data, - offsets: visibleNodeTextureOffsets - }; - } + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; - nodeIntersectsProfile (node, profile) { - let bbWorld = node.boundingBox.clone().applyMatrix4(this.matrixWorld); - let bsWorld = bbWorld.getBoundingSphere(new THREE.Sphere()); + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN - let intersects = false; + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; - for (let i = 0; i < profile.points.length - 1; i++) { + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; - let start = new THREE.Vector3(profile.points[i + 0].x, profile.points[i + 0].y, bsWorld.center.z); - let end = new THREE.Vector3(profile.points[i + 1].x, profile.points[i + 1].y, bsWorld.center.z); + if ( invdirz >= 0 ) { - let closest = new THREE.Line3(start, end).closestPointToPoint(bsWorld.center, true, new THREE.Vector3()); - let distance = closest.distanceTo(bsWorld.center); + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; - intersects = intersects || (distance < (bsWorld.radius + profile.width)); - } + } else { - //console.log(`${node.name}: ${intersects}`); + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; - return intersects; - } + } - deepestNodeAt(position){ - - const toObjectSpace = new THREE.Matrix4().getInverse(this.matrixWorld); + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; - const objPos = position.clone().applyMatrix4(toObjectSpace); + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; - let current = this.root; - while(true){ + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; - let containingChild = null; + //return point closest to the ray (positive side) - for(const child of current.children){ + if ( tmax < 0 ) return null; - if(child !== undefined){ - if(child.getBoundingBox().containsPoint(objPos)){ - containingChild = child; - } - } - } + return this.at( tmin >= 0 ? tmin : tmax, target ); - if(containingChild !== null && containingChild instanceof PointCloudOctreeNode){ - current = containingChild; - }else { - break; - } - } + } - const deepest = current; + intersectsBox( box ) { + + return this.intersectBox( box, _vector$2 ) !== null; - return deepest; } - nodesOnRay (nodes, ray) { - let nodesOnRay = []; + intersectTriangle( a, b, c, backfaceCulling, target ) { - let _ray = ray.clone(); - for (let i = 0; i < nodes.length; i++) { - let node = nodes[i]; - // let inverseWorld = new THREE.Matrix4().getInverse(node.matrixWorld); - // let sphere = node.getBoundingSphere().clone().applyMatrix4(node.sceneNode.matrixWorld); - let sphere = node.getBoundingSphere().clone().applyMatrix4(this.matrixWorld); + // Compute the offset origin, edges, and normal. - if (_ray.intersectsSphere(sphere)) { - nodesOnRay.push(node); - } - } + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h - return nodesOnRay; - } + _edge1.subVectors( b, a ); + _edge2.subVectors( c, a ); + _normal.crossVectors( _edge1, _edge2 ); - updateMatrixWorld (force) { - if (this.matrixAutoUpdate === true) this.updateMatrix(); + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + let DdN = this.direction.dot( _normal ); + let sign; - if (this.matrixWorldNeedsUpdate === true || force === true) { - if (!this.parent) { - this.matrixWorld.copy(this.matrix); - } else { - this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix); - } + if ( DdN > 0 ) { - this.matrixWorldNeedsUpdate = false; + if ( backfaceCulling ) return null; + sign = 1; - force = true; - } - } + } else if ( DdN < 0 ) { - hideDescendants (object) { - let stack = []; - for (let i = 0; i < object.children.length; i++) { - let child = object.children[i]; - if (child.visible) { - stack.push(child); - } - } + sign = - 1; + DdN = - DdN; - while (stack.length > 0) { - let object = stack.shift(); + } else { - object.visible = false; + return null; - for (let i = 0; i < object.children.length; i++) { - let child = object.children[i]; - if (child.visible) { - stack.push(child); - } - } } - } - moveToOrigin () { - this.position.set(0, 0, 0); - this.updateMatrixWorld(true); - let box = this.boundingBox; - let transform = this.matrixWorld; - let tBox = Utils.computeTransformedBoundingBox(box, transform); - this.position.set(0, 0, 0).sub(tBox.getCenter(new THREE.Vector3())); - }; + _diff.subVectors( this.origin, a ); + const DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) ); - moveToGroundPlane () { - this.updateMatrixWorld(true); - let box = this.boundingBox; - let transform = this.matrixWorld; - let tBox = Utils.computeTransformedBoundingBox(box, transform); - this.position.y += -tBox.min.y; - }; + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { - getBoundingBoxWorld () { - this.updateMatrixWorld(true); - let box = this.boundingBox; - let transform = this.matrixWorld; - let tBox = Utils.computeTransformedBoundingBox(box, transform); + return null; - return tBox; - }; + } - /** - * returns points inside the profile points - * - * maxDepth: search points up to the given octree depth - * - * - * The return value is an array with all segments of the profile path - * let segment = { - * start: THREE.Vector3, - * end: THREE.Vector3, - * points: {} - * project: function() - * }; - * - * The project() function inside each segment can be used to transform - * that segments point coordinates to line up along the x-axis. - * - * - */ - getPointsInProfile (profile, maxDepth, callback) { - if (callback) { - let request = new Potree.ProfileRequest(this, profile, maxDepth, callback); - this.profileRequests.push(request); + const DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) ); - return request; - } + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { - let points = { - segments: [], - boundingBox: new THREE.Box3(), - projectedBoundingBox: new THREE.Box2() - }; + return null; - // evaluate segments - for (let i = 0; i < profile.points.length - 1; i++) { - let start = profile.points[i]; - let end = profile.points[i + 1]; - let ps = this.getProfile(start, end, profile.width, maxDepth); + } - let segment = { - start: start, - end: end, - points: ps, - project: null - }; + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { - points.segments.push(segment); + return null; - points.boundingBox.expandByPoint(ps.boundingBox.min); - points.boundingBox.expandByPoint(ps.boundingBox.max); } - // add projection functions to the segments - let mileage = new THREE.Vector3(); - for (let i = 0; i < points.segments.length; i++) { - let segment = points.segments[i]; - let start = segment.start; - let end = segment.end; + // Line intersects triangle, check if ray does. + const QdN = - sign * _diff.dot( _normal ); - let project = (function (_start, _end, _mileage, _boundingBox) { - let start = _start; - let end = _end; - let mileage = _mileage; - let boundingBox = _boundingBox; + // t < 0, no intersection + if ( QdN < 0 ) { - let xAxis = new THREE.Vector3(1, 0, 0); - let dir = new THREE.Vector3().subVectors(end, start); - dir.y = 0; - dir.normalize(); - let alpha = Math.acos(xAxis.dot(dir)); - if (dir.z > 0) { - alpha = -alpha; - } + return null; - return function (position) { - let toOrigin = new THREE.Matrix4().makeTranslation(-start.x, -boundingBox.min.y, -start.z); - let alignWithX = new THREE.Matrix4().makeRotationY(-alpha); - let applyMileage = new THREE.Matrix4().makeTranslation(mileage.x, 0, 0); + } - let pos = position.clone(); - pos.applyMatrix4(toOrigin); - pos.applyMatrix4(alignWithX); - pos.applyMatrix4(applyMileage); + // Ray intersects triangle. + return this.at( QdN / DdN, target ); - return pos; - }; - }(start, end, mileage.clone(), points.boundingBox.clone())); + } - segment.project = project; + applyMatrix4( matrix4 ) { - mileage.x += new THREE.Vector3(start.x, 0, start.z).distanceTo(new THREE.Vector3(end.x, 0, end.z)); - mileage.y += end.y - start.y; - } + this.origin.applyMatrix4( matrix4 ); + this.direction.transformDirection( matrix4 ); - points.projectedBoundingBox.min.x = 0; - points.projectedBoundingBox.min.y = points.boundingBox.min.y; - points.projectedBoundingBox.max.x = mileage.x; - points.projectedBoundingBox.max.y = points.boundingBox.max.y; + return this; - return points; } - /** - * returns points inside the given profile bounds. - * - * start: - * end: - * width: - * depth: search points up to the given octree depth - * callback: if specified, points are loaded before searching - * - * - */ - getProfile (start, end, width, depth, callback) { - let request = new Potree.ProfileRequest(start, end, width, depth, callback); - this.profileRequests.push(request); - }; + equals( ray ) { - getVisibleExtent () { - return this.visibleBounds.applyMatrix4(this.matrixWorld); - }; + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); - intersectsPoint(position){ + } - let rootAvailable = this.pcoGeometry.root && this.pcoGeometry.root.geometry; + } - if(!rootAvailable){ - return false; - } + class Matrix4 { - if(typeof this.signedDistanceField === "undefined"){ + constructor() { - const resolution = 32; - const field = new Float32Array(resolution ** 3).fill(Infinity); + Object.defineProperty( this, 'isMatrix4', { value: true } ); - const positions = this.pcoGeometry.root.geometry.attributes.position; - const boundingBox = this.boundingBox; + this.elements = [ - const n = positions.count; + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 - for(let i = 0; i < n; i = i + 3){ - const x = positions.array[3 * i + 0]; - const y = positions.array[3 * i + 1]; - const z = positions.array[3 * i + 2]; + ]; - const ix = parseInt(Math.min(resolution * (x / boundingBox.max.x), resolution - 1)); - const iy = parseInt(Math.min(resolution * (y / boundingBox.max.y), resolution - 1)); - const iz = parseInt(Math.min(resolution * (z / boundingBox.max.z), resolution - 1)); + if ( arguments.length > 0 ) { - const index = ix + iy * resolution + iz * resolution * resolution; + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); - field[index] = 0; - } + } - const sdf = { - resolution: resolution, - field: field, - }; + } - this.signedDistanceField = sdf; - } + set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + const te = this.elements; - { - const sdf = this.signedDistanceField; - const boundingBox = this.boundingBox; + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; - const toObjectSpace = new THREE.Matrix4().getInverse(this.matrixWorld); + return this; - const objPos = position.clone().applyMatrix4(toObjectSpace); + } - const resolution = sdf.resolution; - const ix = parseInt(resolution * (objPos.x / boundingBox.max.x)); - const iy = parseInt(resolution * (objPos.y / boundingBox.max.y)); - const iz = parseInt(resolution * (objPos.z / boundingBox.max.z)); + identity() { - if(ix < 0 || iy < 0 || iz < 0){ - return false; - } - if(ix >= resolution || iy >= resolution || iz >= resolution){ - return false; - } + this.set( - const index = ix + iy * resolution + iz * resolution * resolution; + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 - const value = sdf.field[index]; + ); - if(value === 0){ - return true; - } + return this; - } + } - return false; + clone() { + + return new Matrix4().fromArray( this.elements ); } - /** - * - * - * - * params.pickWindowSize: Look for points inside a pixel window of this size. - * Use odd values: 1, 3, 5, ... - * - * - * TODO: only draw pixels that are actually read with readPixels(). - * - */ - pick(viewer, camera, ray, params = {}){ + copy( m ) { - let renderer = viewer.renderer; - let pRenderer = viewer.pRenderer; + const te = this.elements; + const me = m.elements; - performance.mark("pick-start"); + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; + te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; + te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ]; + te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ]; - let getVal = (a, b) => a !== undefined ? a : b; + return this; - let pickWindowSize = getVal(params.pickWindowSize, 17); - let pickOutsideClipRegion = getVal(params.pickOutsideClipRegion, false); + } - pickWindowSize = 65; + copyPosition( m ) { - let size = renderer.getSize(new THREE.Vector2()); + const te = this.elements, me = m.elements; - let width = Math.ceil(getVal(params.width, size.width)); - let height = Math.ceil(getVal(params.height, size.height)); + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; - let pointSizeType = getVal(params.pointSizeType, this.material.pointSizeType); - let pointSize = getVal(params.pointSize, this.material.size); + return this; - let nodes = this.nodesOnRay(this.visibleNodes, ray); + } - if (nodes.length === 0) { - return null; - } + extractBasis( xAxis, yAxis, zAxis ) { - if (!this.pickState) { - let scene = new THREE.Scene(); + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); - let material = new Potree.PointCloudMaterial(); - material.activeAttributeName = "indices"; + return this; - let renderTarget = new THREE.WebGLRenderTarget( - 1, 1, - { minFilter: THREE.LinearFilter, - magFilter: THREE.NearestFilter, - format: THREE.RGBAFormat } - ); + } - this.pickState = { - renderTarget: renderTarget, - material: material, - scene: scene - }; - }; + makeBasis( xAxis, yAxis, zAxis ) { - let pickState = this.pickState; - let pickMaterial = pickState.material; + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); - { // update pick material - pickMaterial.pointSizeType = pointSizeType; - //pickMaterial.shape = this.material.shape; - pickMaterial.shape = Potree.PointShape.PARABOLOID; + return this; - pickMaterial.uniforms.uFilterReturnNumberRange.value = this.material.uniforms.uFilterReturnNumberRange.value; - pickMaterial.uniforms.uFilterNumberOfReturnsRange.value = this.material.uniforms.uFilterNumberOfReturnsRange.value; - pickMaterial.uniforms.uFilterGPSTimeClipRange.value = this.material.uniforms.uFilterGPSTimeClipRange.value; - pickMaterial.uniforms.uFilterPointSourceIDClipRange.value = this.material.uniforms.uFilterPointSourceIDClipRange.value; + } - pickMaterial.activeAttributeName = "indices"; + extractRotation( m ) { - pickMaterial.size = pointSize; - pickMaterial.uniforms.minSize.value = this.material.uniforms.minSize.value; - pickMaterial.uniforms.maxSize.value = this.material.uniforms.maxSize.value; - pickMaterial.classification = this.material.classification; - pickMaterial.recomputeClassification(); + // this method does not support reflection matrices - if(params.pickClipped){ - pickMaterial.clipBoxes = this.material.clipBoxes; - pickMaterial.uniforms.clipBoxes = this.material.uniforms.clipBoxes; - if(this.material.clipTask === Potree.ClipTask.HIGHLIGHT){ - pickMaterial.clipTask = Potree.ClipTask.NONE; - }else { - pickMaterial.clipTask = this.material.clipTask; - } - pickMaterial.clipMethod = this.material.clipMethod; - }else { - pickMaterial.clipBoxes = []; - } + const te = this.elements; + const me = m.elements; - this.updateMaterial(pickMaterial, nodes, camera, renderer); - } + const scaleX = 1 / _v1$1.setFromMatrixColumn( m, 0 ).length(); + const scaleY = 1 / _v1$1.setFromMatrixColumn( m, 1 ).length(); + const scaleZ = 1 / _v1$1.setFromMatrixColumn( m, 2 ).length(); - pickState.renderTarget.setSize(width, height); + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + te[ 3 ] = 0; - let pixelPos = new THREE.Vector2(params.x, params.y); + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + te[ 7 ] = 0; - let gl = renderer.getContext(); - gl.enable(gl.SCISSOR_TEST); - gl.scissor( - parseInt(pixelPos.x - (pickWindowSize - 1) / 2), - parseInt(pixelPos.y - (pickWindowSize - 1) / 2), - parseInt(pickWindowSize), parseInt(pickWindowSize)); + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + te[ 11 ] = 0; + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; - renderer.state.buffers.depth.setTest(pickMaterial.depthTest); - renderer.state.buffers.depth.setMask(pickMaterial.depthWrite); - renderer.state.setBlending(THREE.NoBlending); + return this; - { // RENDER - renderer.setRenderTarget(pickState.renderTarget); - gl.clearColor(0, 0, 0, 0); - renderer.clear(true, true, true); + } - let tmp = this.material; - this.material = pickMaterial; + makeRotationFromEuler( euler ) { - pRenderer.renderOctree(this, nodes, camera, pickState.renderTarget); + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); - this.material = tmp; } - let clamp = (number, min, max) => Math.min(Math.max(min, number), max); + const te = this.elements; - let x = parseInt(clamp(pixelPos.x - (pickWindowSize - 1) / 2, 0, width)); - let y = parseInt(clamp(pixelPos.y - (pickWindowSize - 1) / 2, 0, height)); - let w = parseInt(Math.min(x + pickWindowSize, width) - x); - let h = parseInt(Math.min(y + pickWindowSize, height) - y); + const x = euler.x, y = euler.y, z = euler.z; + const a = Math.cos( x ), b = Math.sin( x ); + const c = Math.cos( y ), d = Math.sin( y ); + const e = Math.cos( z ), f = Math.sin( z ); - let pixelCount = w * h; - let buffer = new Uint8Array(4 * pixelCount); + if ( euler.order === 'XYZ' ) { - gl.readPixels(x, y, pickWindowSize, pickWindowSize, gl.RGBA, gl.UNSIGNED_BYTE, buffer); + const ae = a * e, af = a * f, be = b * e, bf = b * f; - renderer.setRenderTarget(null); - renderer.state.reset(); - renderer.setScissorTest(false); - gl.disable(gl.SCISSOR_TEST); + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; - let pixels = buffer; - let ibuffer = new Uint32Array(buffer.buffer); + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; - // find closest hit inside pixelWindow boundaries - let min = Number.MAX_VALUE; - let hits = []; - for (let u = 0; u < pickWindowSize; u++) { - for (let v = 0; v < pickWindowSize; v++) { - let offset = (u + v * pickWindowSize); - let distance = Math.pow(u - (pickWindowSize - 1) / 2, 2) + Math.pow(v - (pickWindowSize - 1) / 2, 2); + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; - let pcIndex = pixels[4 * offset + 3]; - pixels[4 * offset + 3] = 0; - let pIndex = ibuffer[offset]; + } else if ( euler.order === 'YXZ' ) { - if(!(pcIndex === 0 && pIndex === 0) && (pcIndex !== undefined) && (pIndex !== undefined)){ - let hit = { - pIndex: pIndex, - pcIndex: pcIndex, - distanceToCenter: distance - }; + const ce = c * e, cf = c * f, de = d * e, df = d * f; - if(params.all){ - hits.push(hit); - }else { - if(hits.length > 0){ - if(distance < hits[0].distanceToCenter){ - hits[0] = hit; - } - }else { - hits.push(hit); - } - } + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; - } - } - } + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; - //DEBUG: show panel with pick image - // { - // let img = Utils.pixelsArrayToImage(buffer, w, h); - // let screenshot = img.src; - - // if(!this.debugDIV){ - // this.debugDIV = $(` - //
`); - // $(document.body).append(this.debugDIV); - // } - - // this.debugDIV.empty(); - // this.debugDIV.append($(``)); - // //$(this.debugWindow.document).append($(``)); - // //this.debugWindow.document.write(''); - // } + } else if ( euler.order === 'ZXY' ) { + const ce = c * e, cf = c * f, de = d * e, df = d * f; - for(let hit of hits){ - let point = {}; + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; - if (!nodes[hit.pcIndex]) { - return null; - } + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; - let node = nodes[hit.pcIndex]; - let pc = node.sceneNode; - let geometry = node.geometryNode.geometry; + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; - for(let attributeName in geometry.attributes){ - let attribute = geometry.attributes[attributeName]; + } else if ( euler.order === 'ZYX' ) { - if (attributeName === 'position') { - let x = attribute.array[3 * hit.pIndex + 0]; - let y = attribute.array[3 * hit.pIndex + 1]; - let z = attribute.array[3 * hit.pIndex + 2]; + const ae = a * e, af = a * f, be = b * e, bf = b * f; - let position = new THREE.Vector3(x, y, z); - position.applyMatrix4(pc.matrixWorld); + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; - point[attributeName] = position; - } else if (attributeName === 'indices') { + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; - } else { + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; - let values = attribute.array.slice(attribute.itemSize * hit.pIndex, attribute.itemSize * (hit.pIndex + 1)) ; + } else if ( euler.order === 'YZX' ) { - if(attribute.potree){ - const {scale, offset} = attribute.potree; - values = values.map(v => v / scale + offset); - } + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; - point[attributeName] = values; + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; - //debugger; - //if (values.itemSize === 1) { - // point[attribute.name] = values.array[hit.pIndex]; - //} else { - // let value = []; - // for (let j = 0; j < values.itemSize; j++) { - // value.push(values.array[values.itemSize * hit.pIndex + j]); - // } - // point[attribute.name] = value; - //} - } + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; - } + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; - hit.point = point; - } + } else if ( euler.order === 'XZY' ) { - performance.mark("pick-end"); - performance.measure("pick", "pick-start", "pick-end"); + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; - if(params.all){ - return hits.map(hit => hit.point); - }else { - if(hits.length === 0){ - return null; - }else { - return hits[0].point; - //let sorted = hits.sort( (a, b) => a.distanceToCenter - b.distanceToCenter); + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; - //return sorted[0].point; - } } - }; + // bottom row + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; - * getFittedBoxGen(boxNode){ - let start = performance.now(); + // last column + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; - let shrinkedLocalBounds = new THREE.Box3(); - let worldToBox = new THREE.Matrix4().getInverse(boxNode.matrixWorld); + return this; - for(let node of this.visibleNodes){ - if(!node.sceneNode){ - continue; - } + } - let buffer = node.geometryNode.buffer; + makeRotationFromQuaternion( q ) { - let posOffset = buffer.offset("position"); - let stride = buffer.stride; - let view = new DataView(buffer.data); + return this.compose( _zero, q, _one ); - let objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, node.sceneNode.matrixWorld); + } - let pos = new THREE.Vector4(); - for(let i = 0; i < buffer.numElements; i++){ - let x = view.getFloat32(i * stride + posOffset + 0, true); - let y = view.getFloat32(i * stride + posOffset + 4, true); - let z = view.getFloat32(i * stride + posOffset + 8, true); + lookAt( eye, target, up ) { - pos.set(x, y, z, 1); - pos.applyMatrix4(objectToBox); + const te = this.elements; - if(-0.5 < pos.x && pos.x < 0.5){ - if(-0.5 < pos.y && pos.y < 0.5){ - if(-0.5 < pos.z && pos.z < 0.5){ - shrinkedLocalBounds.expandByPoint(pos); - } - } - } - } + _z.subVectors( eye, target ); - yield; - } + if ( _z.lengthSq() === 0 ) { - let fittedPosition = shrinkedLocalBounds.getCenter(new THREE.Vector3()).applyMatrix4(boxNode.matrixWorld); + // eye and target are in the same position - let fitted = new THREE.Object3D(); - fitted.position.copy(fittedPosition); - fitted.scale.copy(boxNode.scale); - fitted.rotation.copy(boxNode.rotation); + _z.z = 1; - let ds = new THREE.Vector3().subVectors(shrinkedLocalBounds.max, shrinkedLocalBounds.min); - fitted.scale.multiply(ds); + } - let duration = performance.now() - start; - console.log("duration: ", duration); + _z.normalize(); + _x.crossVectors( up, _z ); - yield fitted; - } + if ( _x.lengthSq() === 0 ) { - getFittedBox(boxNode, maxLevel = Infinity){ + // up and z are parallel - maxLevel = Infinity; + if ( Math.abs( up.z ) === 1 ) { - let start = performance.now(); + _z.x += 0.0001; - let shrinkedLocalBounds = new THREE.Box3(); - let worldToBox = new THREE.Matrix4().getInverse(boxNode.matrixWorld); + } else { + + _z.z += 0.0001; - for(let node of this.visibleNodes){ - if(!node.sceneNode || node.getLevel() > maxLevel){ - continue; } - let buffer = node.geometryNode.buffer; + _z.normalize(); + _x.crossVectors( up, _z ); - let posOffset = buffer.offset("position"); - let stride = buffer.stride; - let view = new DataView(buffer.data); + } - let objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, node.sceneNode.matrixWorld); + _x.normalize(); + _y.crossVectors( _z, _x ); - let pos = new THREE.Vector4(); - for(let i = 0; i < buffer.numElements; i++){ - let x = view.getFloat32(i * stride + posOffset + 0, true); - let y = view.getFloat32(i * stride + posOffset + 4, true); - let z = view.getFloat32(i * stride + posOffset + 8, true); + te[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x; + te[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y; + te[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z; - pos.set(x, y, z, 1); - pos.applyMatrix4(objectToBox); + return this; - if(-0.5 < pos.x && pos.x < 0.5){ - if(-0.5 < pos.y && pos.y < 0.5){ - if(-0.5 < pos.z && pos.z < 0.5){ - shrinkedLocalBounds.expandByPoint(pos); - } - } - } - } - } + } - let fittedPosition = shrinkedLocalBounds.getCenter(new THREE.Vector3()).applyMatrix4(boxNode.matrixWorld); + multiply( m, n ) { - let fitted = new THREE.Object3D(); - fitted.position.copy(fittedPosition); - fitted.scale.copy(boxNode.scale); - fitted.rotation.copy(boxNode.rotation); + if ( n !== undefined ) { - let ds = new THREE.Vector3().subVectors(shrinkedLocalBounds.max, shrinkedLocalBounds.min); - fitted.scale.multiply(ds); + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); - let duration = performance.now() - start; - console.log("duration: ", duration); + } - return fitted; - } + return this.multiplyMatrices( this, m ); - get progress () { - return this.visibleNodes.length / this.visibleGeometry.length; } - find(name){ - let node = null; - for(let char of name){ - if(char === "r"){ - node = this.root; - }else { - node = node.children[char]; - } - } + premultiply( m ) { - return node; - } + return this.multiplyMatrices( m, this ); - get visible(){ - return this._visible; } - set visible(value){ + multiplyMatrices( a, b ) { - if(value !== this._visible){ - this._visible = value; + const ae = a.elements; + const be = b.elements; + const te = this.elements; - this.dispatchEvent({type: 'visibility_changed', pointcloud: this}); - } + const a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + const a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + const a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + const a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; - } + const b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + const b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + const b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + const b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; - } + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; - class Points { - - constructor () { - this.boundingBox = new THREE.Box3(); - this.numPoints = 0; - this.data = {}; } - add (points) { - let currentSize = this.numPoints; - let additionalSize = points.numPoints; - let newSize = currentSize + additionalSize; + multiplyScalar( s ) { - let thisAttributes = Object.keys(this.data); - let otherAttributes = Object.keys(points.data); - let attributes = new Set([...thisAttributes, ...otherAttributes]); + const te = this.elements; - for (let attribute of attributes) { - if (thisAttributes.includes(attribute) && otherAttributes.includes(attribute)) { - // attribute in both, merge - let Type = this.data[attribute].constructor; - let merged = new Type(this.data[attribute].length + points.data[attribute].length); - merged.set(this.data[attribute], 0); - merged.set(points.data[attribute], this.data[attribute].length); - this.data[attribute] = merged; - } else if (thisAttributes.includes(attribute) && !otherAttributes.includes(attribute)) { - // attribute only in this; take over this and expand to new size - let elementsPerPoint = this.data[attribute].length / this.numPoints; - let Type = this.data[attribute].constructor; - let expanded = new Type(elementsPerPoint * newSize); - expanded.set(this.data[attribute], 0); - this.data[attribute] = expanded; - } else if (!thisAttributes.includes(attribute) && otherAttributes.includes(attribute)) { - // attribute only in points to be added; take over new points and expand to new size - let elementsPerPoint = points.data[attribute].length / points.numPoints; - let Type = points.data[attribute].constructor; - let expanded = new Type(elementsPerPoint * newSize); - expanded.set(points.data[attribute], elementsPerPoint * currentSize); - this.data[attribute] = expanded; - } - } + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; - this.numPoints = newSize; + return this; - this.boundingBox.union(points.boundingBox); } - } - /** - * - * code adapted from three.js BoxHelper.js - * https://github.com/mrdoob/three.js/blob/dev/src/helpers/BoxHelper.js - * - * @author mrdoob / http://mrdoob.com/ - * @author Mugen87 / http://github.com/Mugen87 - * @author mschuetz / http://potree.org - */ + determinant() { - class Box3Helper extends THREE.LineSegments { - constructor (box, color) { - if (color === undefined) color = 0xffff00; + const te = this.elements; - let indices = new Uint16Array([ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ]); - let positions = new Float32Array([ - box.min.x, box.min.y, box.min.z, - box.max.x, box.min.y, box.min.z, - box.max.x, box.min.y, box.max.z, - box.min.x, box.min.y, box.max.z, - box.min.x, box.max.y, box.min.z, - box.max.x, box.max.y, box.min.z, - box.max.x, box.max.y, box.max.z, - box.min.x, box.max.y, box.max.z - ]); + const n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + const n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + const n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + const n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; - let geometry = new THREE.BufferGeometry(); - geometry.setIndex(new THREE.BufferAttribute(indices, 1)); - geometry.addAttribute('position', new THREE.BufferAttribute(positions, 3)); + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) - let material = new THREE.LineBasicMaterial({ color: color }); + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) - super(geometry, material); - } - } + ); - function updatePointClouds(pointclouds, camera, renderer){ + } - for (let pointcloud of pointclouds) { - let start = performance.now(); + transpose() { - for (let profileRequest of pointcloud.profileRequests) { - profileRequest.update(); + const te = this.elements; + let tmp; - let duration = performance.now() - start; - if(duration > 5){ - break; - } - } + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; - let duration = performance.now() - start; - } + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; - let result = updateVisibility(pointclouds, camera, renderer); + return this; - for (let pointcloud of pointclouds) { - pointcloud.updateMaterial(pointcloud.material, pointcloud.visibleNodes, camera, renderer); - pointcloud.updateVisibleBounds(); } - exports.lru.freeMemory(); + setPosition( x, y, z ) { - return result; - }; + const te = this.elements; + if ( x.isVector3 ) { + te[ 12 ] = x.x; + te[ 13 ] = x.y; + te[ 14 ] = x.z; - function updateVisibilityStructures(pointclouds, camera, renderer) { - let frustums = []; - let camObjPositions = []; - let priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; }); + } else { - for (let i = 0; i < pointclouds.length; i++) { - let pointcloud = pointclouds[i]; + te[ 12 ] = x; + te[ 13 ] = y; + te[ 14 ] = z; - if (!pointcloud.initialized()) { - continue; } - pointcloud.numVisibleNodes = 0; - pointcloud.numVisiblePoints = 0; - pointcloud.deepestVisibleLevel = 0; - pointcloud.visibleNodes = []; - pointcloud.visibleGeometry = []; + return this; - // frustum in object space - camera.updateMatrixWorld(); - let frustum = new THREE.Frustum(); - let viewI = camera.matrixWorldInverse; - let world = pointcloud.matrixWorld; - - // use close near plane for frustum intersection - let frustumCam = camera.clone(); - frustumCam.near = Math.min(camera.near, 0.1); - frustumCam.updateProjectionMatrix(); - let proj = camera.projectionMatrix; + } - let fm = new THREE.Matrix4().multiply(proj).multiply(viewI).multiply(world); - frustum.setFromMatrix(fm); - frustums.push(frustum); + invert() { - // camera position in object space - let view = camera.matrixWorld; - let worldI = new THREE.Matrix4().getInverse(world); - let camMatrixObject = new THREE.Matrix4().multiply(worldI).multiply(view); - let camObjPos = new THREE.Vector3().setFromMatrixPosition(camMatrixObject); - camObjPositions.push(camObjPos); + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + const te = this.elements, - if (pointcloud.visible && pointcloud.root !== null) { - priorityQueue.push({pointcloud: i, node: pointcloud.root, weight: Number.MAX_VALUE}); - } + n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ], + n12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ], + n13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ], + n14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ], - // hide all previously visible nodes - // if(pointcloud.root instanceof PointCloudOctreeNode){ - // pointcloud.hideDescendants(pointcloud.root.sceneNode); - // } - if (pointcloud.root.isTreeNode()) { - pointcloud.hideDescendants(pointcloud.root.sceneNode); - } - - for (let j = 0; j < pointcloud.boundingBoxNodes.length; j++) { - pointcloud.boundingBoxNodes[j].visible = false; - } - } - - return { - 'frustums': frustums, - 'camObjPositions': camObjPositions, - 'priorityQueue': priorityQueue - }; - }; + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; - function updateVisibility(pointclouds, camera, renderer){ + if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); - let numVisibleNodes = 0; - let numVisiblePoints = 0; + const detInv = 1 / det; - let numVisiblePointsInPointclouds = new Map(pointclouds.map(pc => [pc, 0])); + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; - let visibleNodes = []; - let visibleGeometry = []; - let unloadedGeometry = []; + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; - let lowestSpacing = Infinity; + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; - // calculate object space frustum and cam pos and setup priority queue - let s = updateVisibilityStructures(pointclouds, camera, renderer); - let frustums = s.frustums; - let camObjPositions = s.camObjPositions; - let priorityQueue = s.priorityQueue; + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; - let loadedToGPUThisFrame = 0; - - let domWidth = renderer.domElement.clientWidth; - let domHeight = renderer.domElement.clientHeight; + return this; - // check if pointcloud has been transformed - // some code will only be executed if changes have been detected - if(!Potree._pointcloudTransformVersion){ - Potree._pointcloudTransformVersion = new Map(); } - let pointcloudTransformVersion = Potree._pointcloudTransformVersion; - for(let pointcloud of pointclouds){ - if(!pointcloud.visible){ - continue; - } + scale( v ) { - pointcloud.updateMatrixWorld(); + const te = this.elements; + const x = v.x, y = v.y, z = v.z; - if(!pointcloudTransformVersion.has(pointcloud)){ - pointcloudTransformVersion.set(pointcloud, {number: 0, transform: pointcloud.matrixWorld.clone()}); - }else { - let version = pointcloudTransformVersion.get(pointcloud); + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; - if(!version.transform.equals(pointcloud.matrixWorld)){ - version.number++; - version.transform.copy(pointcloud.matrixWorld); + return this; - pointcloud.dispatchEvent({ - type: "transformation_changed", - target: pointcloud - }); - } - } } - while (priorityQueue.size() > 0) { - let element = priorityQueue.pop(); - let node = element.node; - let parent = element.parent; - let pointcloud = pointclouds[element.pointcloud]; + getMaxScaleOnAxis() { - // { // restrict to certain nodes for debugging - // let allowedNodes = ["r", "r0", "r4"]; - // if(!allowedNodes.includes(node.name)){ - // continue; - // } - // } + const te = this.elements; - let box = node.getBoundingBox(); - let frustum = frustums[element.pointcloud]; - let camObjPos = camObjPositions[element.pointcloud]; + const scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + const scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + const scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; - let insideFrustum = frustum.intersectsBox(box); - let maxLevel = pointcloud.maxLevel || Infinity; - let level = node.getLevel(); - let visible = insideFrustum; - visible = visible && !(numVisiblePoints + node.getNumPoints() > Potree.pointBudget); - visible = visible && !(numVisiblePointsInPointclouds.get(pointcloud) + node.getNumPoints() > pointcloud.pointBudget); - visible = visible && level < maxLevel; - //visible = visible && node.name !== "r613"; + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); - let clipBoxes = pointcloud.material.clipBoxes; - if(true && clipBoxes.length > 0){ + } - //node.debug = false; + makeTranslation( x, y, z ) { - let numIntersecting = 0; - let numIntersectionVolumes = 0; + this.set( - //if(node.name === "r60"){ - // var a = 10; - //} + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 - for(let clipBox of clipBoxes){ + ); - let pcWorldInverse = new THREE.Matrix4().getInverse(pointcloud.matrixWorld); - let toPCObject = pcWorldInverse.multiply(clipBox.box.matrixWorld); + return this; - let px = new THREE.Vector3(+0.5, 0, 0).applyMatrix4(pcWorldInverse); - let nx = new THREE.Vector3(-0.5, 0, 0).applyMatrix4(pcWorldInverse); - let py = new THREE.Vector3(0, +0.5, 0).applyMatrix4(pcWorldInverse); - let ny = new THREE.Vector3(0, -0.5, 0).applyMatrix4(pcWorldInverse); - let pz = new THREE.Vector3(0, 0, +0.5).applyMatrix4(pcWorldInverse); - let nz = new THREE.Vector3(0, 0, -0.5).applyMatrix4(pcWorldInverse); + } - let pxN = new THREE.Vector3().subVectors(nx, px).normalize(); - let nxN = pxN.clone().multiplyScalar(-1); - let pyN = new THREE.Vector3().subVectors(ny, py).normalize(); - let nyN = pyN.clone().multiplyScalar(-1); - let pzN = new THREE.Vector3().subVectors(nz, pz).normalize(); - let nzN = pzN.clone().multiplyScalar(-1); + makeRotationX( theta ) { - let pxPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(pxN, px); - let nxPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(nxN, nx); - let pyPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(pyN, py); - let nyPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(nyN, ny); - let pzPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(pzN, pz); - let nzPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(nzN, nz); + const c = Math.cos( theta ), s = Math.sin( theta ); - //if(window.debugdraw !== undefined && window.debugdraw === true && node.name === "r60"){ + this.set( - // Potree.utils.debugPlane(viewer.scene.scene, pxPlane, 1, 0xFF0000); - // Potree.utils.debugPlane(viewer.scene.scene, nxPlane, 1, 0x990000); - // Potree.utils.debugPlane(viewer.scene.scene, pyPlane, 1, 0x00FF00); - // Potree.utils.debugPlane(viewer.scene.scene, nyPlane, 1, 0x009900); - // Potree.utils.debugPlane(viewer.scene.scene, pzPlane, 1, 0x0000FF); - // Potree.utils.debugPlane(viewer.scene.scene, nzPlane, 1, 0x000099); + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 - // Potree.utils.debugBox(viewer.scene.scene, box, new THREE.Matrix4(), 0x00FF00); - // Potree.utils.debugBox(viewer.scene.scene, box, pointcloud.matrixWorld, 0xFF0000); - // Potree.utils.debugBox(viewer.scene.scene, clipBox.box.boundingBox, clipBox.box.matrixWorld, 0xFF0000); + ); - // window.debugdraw = false; - //} + return this; - let frustum = new THREE.Frustum(pxPlane, nxPlane, pyPlane, nyPlane, pzPlane, nzPlane); - let intersects = frustum.intersectsBox(box); + } - if(intersects){ - numIntersecting++; - } - numIntersectionVolumes++; - } + makeRotationY( theta ) { - let insideAny = numIntersecting > 0; - let insideAll = numIntersecting === numIntersectionVolumes; + const c = Math.cos( theta ), s = Math.sin( theta ); - if(pointcloud.material.clipTask === ClipTask.SHOW_INSIDE){ - if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ANY && insideAny){ - //node.debug = true - }else if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ALL && insideAll){ - //node.debug = true; - }else { - visible = false; - } - } else if(pointcloud.material.clipTask === ClipTask.SHOW_OUTSIDE){ - //if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ANY && !insideAny){ - // //visible = true; - // let a = 10; - //}else if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ALL && !insideAll){ - // //visible = true; - // let a = 20; - //}else{ - // visible = false; - //} - } - + this.set( - } + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 - // visible = ["r", "r0", "r06", "r060"].includes(node.name); - // visible = ["r"].includes(node.name); + ); - if (node.spacing) { - lowestSpacing = Math.min(lowestSpacing, node.spacing); - } else if (node.geometryNode && node.geometryNode.spacing) { - lowestSpacing = Math.min(lowestSpacing, node.geometryNode.spacing); - } + return this; - if (numVisiblePoints + node.getNumPoints() > Potree.pointBudget) { - break; - } + } - if (!visible) { - continue; - } + makeRotationZ( theta ) { - // TODO: not used, same as the declaration? - // numVisibleNodes++; - numVisiblePoints += node.getNumPoints(); - let numVisiblePointsInPointcloud = numVisiblePointsInPointclouds.get(pointcloud); - numVisiblePointsInPointclouds.set(pointcloud, numVisiblePointsInPointcloud + node.getNumPoints()); + const c = Math.cos( theta ), s = Math.sin( theta ); - pointcloud.numVisibleNodes++; - pointcloud.numVisiblePoints += node.getNumPoints(); + this.set( - if (node.isGeometryNode() && (!parent || parent.isTreeNode())) { - if (node.isLoaded() && loadedToGPUThisFrame < 2) { - node = pointcloud.toTreeNode(node, parent); - loadedToGPUThisFrame++; - } else { - unloadedGeometry.push(node); - visibleGeometry.push(node); - } - } + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 - if (node.isTreeNode()) { - exports.lru.touch(node.geometryNode); - node.sceneNode.visible = true; - node.sceneNode.material = pointcloud.material; + ); - visibleNodes.push(node); - pointcloud.visibleNodes.push(node); + return this; - if(node._transformVersion === undefined){ - node._transformVersion = -1; - } - let transformVersion = pointcloudTransformVersion.get(pointcloud); - if(node._transformVersion !== transformVersion.number){ - node.sceneNode.updateMatrix(); - node.sceneNode.matrixWorld.multiplyMatrices(pointcloud.matrixWorld, node.sceneNode.matrix); - node._transformVersion = transformVersion.number; - } + } - if (pointcloud.showBoundingBox && !node.boundingBoxNode && node.getBoundingBox) { - let boxHelper = new Box3Helper(node.getBoundingBox()); - boxHelper.matrixAutoUpdate = false; - pointcloud.boundingBoxNodes.push(boxHelper); - node.boundingBoxNode = boxHelper; - node.boundingBoxNode.matrix.copy(pointcloud.matrixWorld); - } else if (pointcloud.showBoundingBox) { - node.boundingBoxNode.visible = true; - node.boundingBoxNode.matrix.copy(pointcloud.matrixWorld); - } else if (!pointcloud.showBoundingBox && node.boundingBoxNode) { - node.boundingBoxNode.visible = false; - } + makeRotationAxis( axis, angle ) { - // if(node.boundingBoxNode !== undefined && exports.debug.allowedNodes !== undefined){ - // if(!exports.debug.allowedNodes.includes(node.name)){ - // node.boundingBoxNode.visible = false; - // } - // } - } + // Based on http://www.gamedev.net/reference/articles/article1199.asp - // add child nodes to priorityQueue - let children = node.getChildren(); - for (let i = 0; i < children.length; i++) { - let child = children[i]; + const c = Math.cos( angle ); + const s = Math.sin( angle ); + const t = 1 - c; + const x = axis.x, y = axis.y, z = axis.z; + const tx = t * x, ty = t * y; - let weight = 0; - if(camera.isPerspectiveCamera){ - let sphere = child.getBoundingSphere(); - let center = sphere.center; - //let distance = sphere.center.distanceTo(camObjPos); - - let dx = camObjPos.x - center.x; - let dy = camObjPos.y - center.y; - let dz = camObjPos.z - center.z; - - let dd = dx * dx + dy * dy + dz * dz; - let distance = Math.sqrt(dd); - - - let radius = sphere.radius; - - let fov = (camera.fov * Math.PI) / 180; - let slope = Math.tan(fov / 2); - let projFactor = (0.5 * domHeight) / (slope * distance); - let screenPixelRadius = radius * projFactor; - - if(screenPixelRadius < pointcloud.minimumNodePixelSize){ - continue; - } - - weight = screenPixelRadius; + this.set( - if(distance - radius < 0){ - weight = Number.MAX_VALUE; - } - } else { - // TODO ortho visibility - let bb = child.getBoundingBox(); - let distance = child.getBoundingSphere().center.distanceTo(camObjPos); - let diagonal = bb.max.clone().sub(bb.min).length(); - //weight = diagonal / distance; + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 - weight = diagonal; - } + ); - priorityQueue.push({pointcloud: element.pointcloud, node: child, parent: node, weight: weight}); - } - }// end priority queue loop + return this; - { // update DEM - let maxDEMLevel = 4; - let candidates = pointclouds - .filter(p => (p.generateDEM && p.dem instanceof Potree.DEM)); - for (let pointcloud of candidates) { - let updatingNodes = pointcloud.visibleNodes.filter(n => n.getLevel() <= maxDEMLevel); - pointcloud.dem.update(updatingNodes); - } } - for (let i = 0; i < Math.min(Potree.maxNodesLoading, unloadedGeometry.length); i++) { - unloadedGeometry[i].load(); - } + makeScale( x, y, z ) { - return { - visibleNodes: visibleNodes, - numVisiblePoints: numVisiblePoints, - lowestSpacing: lowestSpacing - }; - }; + this.set( - class PointCloudArena4DNode extends PointCloudTreeNode { - constructor () { - super(); + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 - this.left = null; - this.right = null; - this.sceneNode = null; - this.kdtree = null; - } + ); - getNumPoints () { - return this.geometryNode.numPoints; - } + return this; - isLoaded () { - return true; } - isTreeNode () { - return true; - } + makeShear( x, y, z ) { - isGeometryNode () { - return false; - } + this.set( - getLevel () { - return this.geometryNode.level; - } + 1, y, z, 0, + x, 1, z, 0, + x, y, 1, 0, + 0, 0, 0, 1 - getBoundingSphere () { - return this.geometryNode.boundingSphere; - } + ); - getBoundingBox () { - return this.geometryNode.boundingBox; - } + return this; - toTreeNode (child) { - let geometryNode = null; + } - if (this.left === child) { - geometryNode = this.left; - } else if (this.right === child) { - geometryNode = this.right; - } + compose( position, quaternion, scale ) { - if (!geometryNode.loaded) { - return; - } + const te = this.elements; - let node = new PointCloudArena4DNode(); - let sceneNode = THREE.PointCloud(geometryNode.geometry, this.kdtree.material); - sceneNode.visible = false; + const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; + const x2 = x + x, y2 = y + y, z2 = z + z; + const xx = x * x2, xy = x * y2, xz = x * z2; + const yy = y * y2, yz = y * z2, zz = z * z2; + const wx = w * x2, wy = w * y2, wz = w * z2; - node.kdtree = this.kdtree; - node.geometryNode = geometryNode; - node.sceneNode = sceneNode; - node.parent = this; - node.left = this.geometryNode.left; - node.right = this.geometryNode.right; - } + const sx = scale.x, sy = scale.y, sz = scale.z; - getChildren () { - let children = []; + te[ 0 ] = ( 1 - ( yy + zz ) ) * sx; + te[ 1 ] = ( xy + wz ) * sx; + te[ 2 ] = ( xz - wy ) * sx; + te[ 3 ] = 0; - if (this.left) { - children.push(this.left); - } + te[ 4 ] = ( xy - wz ) * sy; + te[ 5 ] = ( 1 - ( xx + zz ) ) * sy; + te[ 6 ] = ( yz + wx ) * sy; + te[ 7 ] = 0; - if (this.right) { - children.push(this.right); - } + te[ 8 ] = ( xz + wy ) * sz; + te[ 9 ] = ( yz - wx ) * sz; + te[ 10 ] = ( 1 - ( xx + yy ) ) * sz; + te[ 11 ] = 0; - return children; - } - }; + te[ 12 ] = position.x; + te[ 13 ] = position.y; + te[ 14 ] = position.z; + te[ 15 ] = 1; - class PointCloudArena4D$1 extends PointCloudTree{ - constructor (geometry) { - super(); + return this; - this.root = null; - if (geometry.root) { - this.root = geometry.root; - } else { - geometry.addEventListener('hierarchy_loaded', () => { - this.root = geometry.root; - }); - } + } - this.visiblePointsTarget = 2 * 1000 * 1000; - this.minimumNodePixelSize = 150; + decompose( position, quaternion, scale ) { - this.position.sub(geometry.offset); - this.updateMatrix(); + const te = this.elements; - this.numVisibleNodes = 0; - this.numVisiblePoints = 0; + let sx = _v1$1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + const sy = _v1$1.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + const sz = _v1$1.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); - this.boundingBoxNodes = []; - this.loadQueue = []; - this.visibleNodes = []; + // if determine is negative, we need to invert one scale + const det = this.determinant(); + if ( det < 0 ) sx = - sx; - this.pcoGeometry = geometry; - this.boundingBox = this.pcoGeometry.boundingBox; - this.boundingSphere = this.pcoGeometry.boundingSphere; - this.material = new PointCloudMaterial({vertexColors: THREE.VertexColors, size: 0.05, treeType: TreeType.KDTREE}); - this.material.sizeType = PointSizeType.ATTENUATED; - this.material.size = 0.05; - this.profileRequests = []; - this.name = ''; - } + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; - getBoundingBoxWorld () { - this.updateMatrixWorld(true); - let box = this.boundingBox; - let transform = this.matrixWorld; - let tBox = Utils.computeTransformedBoundingBox(box, transform); + // scale the rotation part + _m1.copy( this ); - return tBox; - }; + const invSX = 1 / sx; + const invSY = 1 / sy; + const invSZ = 1 / sz; - setName (name) { - if (this.name !== name) { - this.name = name; - this.dispatchEvent({type: 'name_changed', name: name, pointcloud: this}); - } - } + _m1.elements[ 0 ] *= invSX; + _m1.elements[ 1 ] *= invSX; + _m1.elements[ 2 ] *= invSX; - getName () { - return this.name; - } + _m1.elements[ 4 ] *= invSY; + _m1.elements[ 5 ] *= invSY; + _m1.elements[ 6 ] *= invSY; - getLevel () { - return this.level; - } + _m1.elements[ 8 ] *= invSZ; + _m1.elements[ 9 ] *= invSZ; + _m1.elements[ 10 ] *= invSZ; - toTreeNode (geometryNode, parent) { - let node = new PointCloudArena4DNode(); - let sceneNode = new THREE.Points(geometryNode.geometry, this.material); + quaternion.setFromRotationMatrix( _m1 ); - sceneNode.frustumCulled = false; - sceneNode.onBeforeRender = (_this, scene, camera, geometry, material, group) => { - if (material.program) { - _this.getContext().useProgram(material.program.program); + scale.x = sx; + scale.y = sy; + scale.z = sz; - if (material.program.getUniforms().map.level) { - let level = geometryNode.getLevel(); - material.uniforms.level.value = level; - material.program.getUniforms().map.level.setValue(_this.getContext(), level); - } + return this; - if (this.visibleNodeTextureOffsets && material.program.getUniforms().map.vnStart) { - let vnStart = this.visibleNodeTextureOffsets.get(node); - material.uniforms.vnStart.value = vnStart; - material.program.getUniforms().map.vnStart.setValue(_this.getContext(), vnStart); - } + } - if (material.program.getUniforms().map.pcIndex) { - let i = node.pcIndex ? node.pcIndex : this.visibleNodes.indexOf(node); - material.uniforms.pcIndex.value = i; - material.program.getUniforms().map.pcIndex.setValue(_this.getContext(), i); - } - } - }; + makePerspective( left, right, top, bottom, near, far ) { - node.geometryNode = geometryNode; - node.sceneNode = sceneNode; - node.pointcloud = this; - node.left = geometryNode.left; - node.right = geometryNode.right; + if ( far === undefined ) { - if (!parent) { - this.root = node; - this.add(sceneNode); - } else { - parent.sceneNode.add(sceneNode); + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); - if (parent.left === geometryNode) { - parent.left = node; - } else if (parent.right === geometryNode) { - parent.right = node; - } } - let disposeListener = function () { - parent.sceneNode.remove(node.sceneNode); - - if (parent.left === node) { - parent.left = geometryNode; - } else if (parent.right === node) { - parent.right = geometryNode; - } - }; - geometryNode.oneTimeDisposeHandlers.push(disposeListener); + const te = this.elements; + const x = 2 * near / ( right - left ); + const y = 2 * near / ( top - bottom ); - return node; - } + const a = ( right + left ) / ( right - left ); + const b = ( top + bottom ) / ( top - bottom ); + const c = - ( far + near ) / ( far - near ); + const d = - 2 * far * near / ( far - near ); - updateMaterial (material, visibleNodes, camera, renderer) { - material.fov = camera.fov * (Math.PI / 180); - material.screenWidth = renderer.domElement.clientWidth; - material.screenHeight = renderer.domElement.clientHeight; - material.spacing = this.pcoGeometry.spacing; - material.near = camera.near; - material.far = camera.far; + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; - // reduce shader source updates by setting maxLevel slightly higher than actually necessary - if (this.maxLevel > material.levels) { - material.levels = this.maxLevel + 2; - } + return this; - // material.uniforms.octreeSize.value = this.boundingBox.size().x; - let bbSize = this.boundingBox.getSize(new THREE.Vector3()); - material.bbSize = [bbSize.x, bbSize.y, bbSize.z]; } - updateVisibleBounds () { + makeOrthographic( left, right, top, bottom, near, far ) { - } + const te = this.elements; + const w = 1.0 / ( right - left ); + const h = 1.0 / ( top - bottom ); + const p = 1.0 / ( far - near ); - hideDescendants (object) { - let stack = []; - for (let i = 0; i < object.children.length; i++) { - let child = object.children[i]; - if (child.visible) { - stack.push(child); - } - } + const x = ( right + left ) * w; + const y = ( top + bottom ) * h; + const z = ( far + near ) * p; - while (stack.length > 0) { - let child = stack.shift(); + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; - child.visible = false; - if (child.boundingBoxNode) { - child.boundingBoxNode.visible = false; - } + return this; - for (let i = 0; i < child.children.length; i++) { - let childOfChild = child.children[i]; - if (childOfChild.visible) { - stack.push(childOfChild); - } - } - } } - updateMatrixWorld (force) { - // node.matrixWorld.multiplyMatrices( node.parent.matrixWorld, node.matrix ); + equals( matrix ) { - if (this.matrixAutoUpdate === true) this.updateMatrix(); + const te = this.elements; + const me = matrix.elements; - if (this.matrixWorldNeedsUpdate === true || force === true) { - if (this.parent === undefined) { - this.matrixWorld.copy(this.matrix); - } else { - this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix); - } + for ( let i = 0; i < 16; i ++ ) { - this.matrixWorldNeedsUpdate = false; + if ( te[ i ] !== me[ i ] ) return false; - force = true; } + + return true; + } - nodesOnRay (nodes, ray) { - let nodesOnRay = []; + fromArray( array, offset = 0 ) { - let _ray = ray.clone(); - for (let i = 0; i < nodes.length; i++) { - let node = nodes[i]; - let sphere = node.getBoundingSphere().clone().applyMatrix4(node.sceneNode.matrixWorld); - // TODO Unused: let box = node.getBoundingBox().clone().applyMatrix4(node.sceneNode.matrixWorld); + for ( let i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; - if (_ray.intersectsSphere(sphere)) { - nodesOnRay.push(node); - } - // if(_ray.isIntersectionBox(box)){ - // nodesOnRay.push(node); - // } } - return nodesOnRay; + return this; + } - pick(viewer, camera, ray, params = {}){ + toArray( array = [], offset = 0 ) { - let renderer = viewer.renderer; - let pRenderer = viewer.pRenderer; + const te = this.elements; - performance.mark("pick-start"); + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; - let getVal = (a, b) => a !== undefined ? a : b; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; - let pickWindowSize = getVal(params.pickWindowSize, 17); - let pickOutsideClipRegion = getVal(params.pickOutsideClipRegion, false); + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; - let size = renderer.getSize(new THREE.Vector2()); + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; - let width = Math.ceil(getVal(params.width, size.width)); - let height = Math.ceil(getVal(params.height, size.height)); + return array; - let pointSizeType = getVal(params.pointSizeType, this.material.pointSizeType); - let pointSize = getVal(params.pointSize, this.material.size); + } - let nodes = this.nodesOnRay(this.visibleNodes, ray); + } - if (nodes.length === 0) { - return null; - } + const _v1$1 = /*@__PURE__*/ new Vector3(); + const _m1 = /*@__PURE__*/ new Matrix4(); + const _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 ); + const _one = /*@__PURE__*/ new Vector3( 1, 1, 1 ); + const _x = /*@__PURE__*/ new Vector3(); + const _y = /*@__PURE__*/ new Vector3(); + const _z = /*@__PURE__*/ new Vector3(); - if (!this.pickState) { - let scene = new THREE.Scene(); + class Euler { - let material = new PointCloudMaterial(); - material.activeAttributeName = "indices"; + constructor( x = 0, y = 0, z = 0, order = Euler.DefaultOrder ) { - let renderTarget = new THREE.WebGLRenderTarget( - 1, 1, - { minFilter: THREE.LinearFilter, - magFilter: THREE.NearestFilter, - format: THREE.RGBAFormat } - ); + Object.defineProperty( this, 'isEuler', { value: true } ); - this.pickState = { - renderTarget: renderTarget, - material: material, - scene: scene - }; - }; - - let pickState = this.pickState; - let pickMaterial = pickState.material; + this._x = x; + this._y = y; + this._z = z; + this._order = order; - { // update pick material - pickMaterial.pointSizeType = pointSizeType; - pickMaterial.shape = this.material.shape; + } - pickMaterial.size = pointSize; - pickMaterial.uniforms.minSize.value = this.material.uniforms.minSize.value; - pickMaterial.uniforms.maxSize.value = this.material.uniforms.maxSize.value; - pickMaterial.classification = this.material.classification; - if(params.pickClipped){ - pickMaterial.clipBoxes = this.material.clipBoxes; - if(this.material.clipTask === ClipTask.HIGHLIGHT){ - pickMaterial.clipTask = ClipTask.NONE; - }else { - pickMaterial.clipTask = this.material.clipTask; - } - }else { - pickMaterial.clipBoxes = []; - } - - this.updateMaterial(pickMaterial, nodes, camera, renderer); - } + get x() { - pickState.renderTarget.setSize(width, height); + return this._x; - let pixelPos = new THREE.Vector2(params.x, params.y); - - let gl = renderer.getContext(); - gl.enable(gl.SCISSOR_TEST); - gl.scissor( - parseInt(pixelPos.x - (pickWindowSize - 1) / 2), - parseInt(pixelPos.y - (pickWindowSize - 1) / 2), - parseInt(pickWindowSize), parseInt(pickWindowSize)); + } + set x( value ) { - renderer.state.buffers.depth.setTest(pickMaterial.depthTest); - renderer.state.buffers.depth.setMask(pickMaterial.depthWrite); - renderer.state.setBlending(THREE.NoBlending); + this._x = value; + this._onChangeCallback(); - renderer.clearTarget(pickState.renderTarget, true, true, true); + } - { // RENDER - renderer.setRenderTarget(pickState.renderTarget); - gl.clearColor(0, 0, 0, 0); - renderer.clearTarget( pickState.renderTarget, true, true, true ); - - let tmp = this.material; - this.material = pickMaterial; - - pRenderer.renderOctree(this, nodes, camera, pickState.renderTarget); - - this.material = tmp; - } + get y() { - let clamp = (number, min, max) => Math.min(Math.max(min, number), max); + return this._y; - let x = parseInt(clamp(pixelPos.x - (pickWindowSize - 1) / 2, 0, width)); - let y = parseInt(clamp(pixelPos.y - (pickWindowSize - 1) / 2, 0, height)); - let w = parseInt(Math.min(x + pickWindowSize, width) - x); - let h = parseInt(Math.min(y + pickWindowSize, height) - y); + } - let pixelCount = w * h; - let buffer = new Uint8Array(4 * pixelCount); - - gl.readPixels(x, y, pickWindowSize, pickWindowSize, gl.RGBA, gl.UNSIGNED_BYTE, buffer); - - renderer.setRenderTarget(null); - renderer.state.reset(); - renderer.setScissorTest(false); - gl.disable(gl.SCISSOR_TEST); - - let pixels = buffer; - let ibuffer = new Uint32Array(buffer.buffer); + set y( value ) { - // find closest hit inside pixelWindow boundaries - let min = Number.MAX_VALUE; - let hits = []; - for (let u = 0; u < pickWindowSize; u++) { - for (let v = 0; v < pickWindowSize; v++) { - let offset = (u + v * pickWindowSize); - let distance = Math.pow(u - (pickWindowSize - 1) / 2, 2) + Math.pow(v - (pickWindowSize - 1) / 2, 2); + this._y = value; + this._onChangeCallback(); - let pcIndex = pixels[4 * offset + 3]; - pixels[4 * offset + 3] = 0; - let pIndex = ibuffer[offset]; + } - if(!(pcIndex === 0 && pIndex === 0) && (pcIndex !== undefined) && (pIndex !== undefined)){ - let hit = { - pIndex: pIndex, - pcIndex: pcIndex, - distanceToCenter: distance - }; + get z() { - if(params.all){ - hits.push(hit); - }else { - if(hits.length > 0){ - if(distance < hits[0].distanceToCenter){ - hits[0] = hit; - } - }else { - hits.push(hit); - } - } + return this._z; - - } - } - } + } + set z( value ) { + this._z = value; + this._onChangeCallback(); - for(let hit of hits){ - let point = {}; - - if (!nodes[hit.pcIndex]) { - return null; - } - - let node = nodes[hit.pcIndex]; - let pc = node.sceneNode; - let geometry = node.geometryNode.geometry; - - for(let attributeName in geometry.attributes){ - let attribute = geometry.attributes[attributeName]; - - if (attributeName === 'position') { - let x = attribute.array[3 * hit.pIndex + 0]; - let y = attribute.array[3 * hit.pIndex + 1]; - let z = attribute.array[3 * hit.pIndex + 2]; - - let position = new THREE.Vector3(x, y, z); - position.applyMatrix4(pc.matrixWorld); - - point[attributeName] = position; - } else if (attributeName === 'indices') { - - } else { - //if (values.itemSize === 1) { - // point[attribute.name] = values.array[hit.pIndex]; - //} else { - // let value = []; - // for (let j = 0; j < values.itemSize; j++) { - // value.push(values.array[values.itemSize * hit.pIndex + j]); - // } - // point[attribute.name] = value; - //} - } - - } + } - hit.point = point; - } + get order() { - performance.mark("pick-end"); - performance.measure("pick", "pick-start", "pick-end"); + return this._order; - if(params.all){ - return hits.map(hit => hit.point); - }else { - if(hits.length === 0){ - return null; - }else { - return hits[0].point; - } - } } - computeVisibilityTextureData(nodes){ + set order( value ) { - if(exports.measureTimings) performance.mark("computeVisibilityTextureData-start"); + this._order = value; + this._onChangeCallback(); - let data = new Uint8Array(nodes.length * 3); - let visibleNodeTextureOffsets = new Map(); + } - // copy array - nodes = nodes.slice(); + set( x, y, z, order ) { - // sort by level and number - let sort = function (a, b) { - let la = a.geometryNode.level; - let lb = b.geometryNode.level; - let na = a.geometryNode.number; - let nb = b.geometryNode.number; - if (la !== lb) return la - lb; - if (na < nb) return -1; - if (na > nb) return 1; - return 0; - }; - nodes.sort(sort); + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; - let visibleNodeNames = []; - for (let i = 0; i < nodes.length; i++) { - visibleNodeNames.push(nodes[i].geometryNode.number); - } + this._onChangeCallback(); - for (let i = 0; i < nodes.length; i++) { - let node = nodes[i]; + return this; - visibleNodeTextureOffsets.set(node, i); + } - let b1 = 0; // children - let b2 = 0; // offset to first child - let b3 = 0; // split + clone() { - if (node.geometryNode.left && visibleNodeNames.indexOf(node.geometryNode.left.number) > 0) { - b1 += 1; - b2 = visibleNodeNames.indexOf(node.geometryNode.left.number) - i; - } - if (node.geometryNode.right && visibleNodeNames.indexOf(node.geometryNode.right.number) > 0) { - b1 += 2; - b2 = (b2 === 0) ? visibleNodeNames.indexOf(node.geometryNode.right.number) - i : b2; - } + return new this.constructor( this._x, this._y, this._z, this._order ); - if (node.geometryNode.split === 'X') { - b3 = 1; - } else if (node.geometryNode.split === 'Y') { - b3 = 2; - } else if (node.geometryNode.split === 'Z') { - b3 = 4; - } + } - data[i * 3 + 0] = b1; - data[i * 3 + 1] = b2; - data[i * 3 + 2] = b3; - } + copy( euler ) { - if(exports.measureTimings){ - performance.mark("computeVisibilityTextureData-end"); - performance.measure("render.computeVisibilityTextureData", "computeVisibilityTextureData-start", "computeVisibilityTextureData-end"); - } + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; - return { - data: data, - offsets: visibleNodeTextureOffsets - }; - } + this._onChangeCallback(); + + return this; - get progress () { - if (this.pcoGeometry.root) { - return exports.numNodesLoading > 0 ? 0 : 1; - } else { - return 0; - } } - }; - // Copied from three.js: WebGLRenderer.js - function paramThreeToGL(_gl, p) { + setFromRotationMatrix( m, order, update ) { - let extension; + const clamp = MathUtils.clamp; - if (p === THREE.RepeatWrapping) return _gl.REPEAT; - if (p === THREE.ClampToEdgeWrapping) return _gl.CLAMP_TO_EDGE; - if (p === THREE.MirroredRepeatWrapping) return _gl.MIRRORED_REPEAT; + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) - if (p === THREE.NearestFilter) return _gl.NEAREST; - if (p === THREE.NearestMipMapNearestFilter) return _gl.NEAREST_MIPMAP_NEAREST; - if (p === THREE.NearestMipMapLinearFilter) return _gl.NEAREST_MIPMAP_LINEAR; + const te = m.elements; + const m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + const m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + const m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; - if (p === THREE.LinearFilter) return _gl.LINEAR; - if (p === THREE.LinearMipMapNearestFilter) return _gl.LINEAR_MIPMAP_NEAREST; - if (p === THREE.LinearMipMapLinearFilter) return _gl.LINEAR_MIPMAP_LINEAR; + order = order || this._order; - if (p === THREE.UnsignedByteType) return _gl.UNSIGNED_BYTE; - if (p === THREE.UnsignedShort4444Type) return _gl.UNSIGNED_SHORT_4_4_4_4; - if (p === THREE.UnsignedShort5551Type) return _gl.UNSIGNED_SHORT_5_5_5_1; - if (p === THREE.UnsignedShort565Type) return _gl.UNSIGNED_SHORT_5_6_5; + switch ( order ) { - if (p === THREE.ByteType) return _gl.BYTE; - if (p === THREE.ShortType) return _gl.SHORT; - if (p === THREE.UnsignedShortType) return _gl.UNSIGNED_SHORT; - if (p === THREE.IntType) return _gl.INT; - if (p === THREE.UnsignedIntType) return _gl.UNSIGNED_INT; - if (p === THREE.FloatType) return _gl.FLOAT; + case 'XYZ': - if (p === THREE.HalfFloatType) { + this._y = Math.asin( clamp( m13, - 1, 1 ) ); - extension = extensions.get('OES_texture_half_float'); + if ( Math.abs( m13 ) < 0.9999999 ) { - if (extension !== null) return extension.HALF_FLOAT_OES; + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); - } + } else { - if (p === THREE.AlphaFormat) return _gl.ALPHA; - if (p === THREE.RGBFormat) return _gl.RGB; - if (p === THREE.RGBAFormat) return _gl.RGBA; - if (p === THREE.LuminanceFormat) return _gl.LUMINANCE; - if (p === THREE.LuminanceAlphaFormat) return _gl.LUMINANCE_ALPHA; - if (p === THREE.DepthFormat) return _gl.DEPTH_COMPONENT; - if (p === THREE.DepthStencilFormat) return _gl.DEPTH_STENCIL; + this._x = Math.atan2( m32, m22 ); + this._z = 0; - if (p === THREE.AddEquation) return _gl.FUNC_ADD; - if (p === THREE.SubtractEquation) return _gl.FUNC_SUBTRACT; - if (p === THREE.ReverseSubtractEquation) return _gl.FUNC_REVERSE_SUBTRACT; + } - if (p === THREE.ZeroFactor) return _gl.ZERO; - if (p === THREE.OneFactor) return _gl.ONE; - if (p === THREE.SrcColorFactor) return _gl.SRC_COLOR; - if (p === THREE.OneMinusSrcColorFactor) return _gl.ONE_MINUS_SRC_COLOR; - if (p === THREE.SrcAlphaFactor) return _gl.SRC_ALPHA; - if (p === THREE.OneMinusSrcAlphaFactor) return _gl.ONE_MINUS_SRC_ALPHA; - if (p === THREE.DstAlphaFactor) return _gl.DST_ALPHA; - if (p === THREE.OneMinusDstAlphaFactor) return _gl.ONE_MINUS_DST_ALPHA; + break; - if (p === THREE.DstColorFactor) return _gl.DST_COLOR; - if (p === THREE.OneMinusDstColorFactor) return _gl.ONE_MINUS_DST_COLOR; - if (p === THREE.SrcAlphaSaturateFactor) return _gl.SRC_ALPHA_SATURATE; + case 'YXZ': - if (p === THREE.RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || - p === THREE.RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format) { + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); - extension = extensions.get('WEBGL_compressed_texture_s3tc'); + if ( Math.abs( m23 ) < 0.9999999 ) { - if (extension !== null) { + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); - if (p === THREE.RGB_S3TC_DXT1_Format) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; - if (p === THREE.RGBA_S3TC_DXT1_Format) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; - if (p === THREE.RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; - if (p === THREE.RGBA_S3TC_DXT5_Format) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + } else { - } + this._y = Math.atan2( - m31, m11 ); + this._z = 0; - } + } - if (p === THREE.RGB_PVRTC_4BPPV1_Format || p === THREE.RGB_PVRTC_2BPPV1_Format || - p === THREE.RGBA_PVRTC_4BPPV1_Format || p === THREE.RGBA_PVRTC_2BPPV1_Format) { + break; - extension = extensions.get('WEBGL_compressed_texture_pvrtc'); + case 'ZXY': - if (extension !== null) { + this._x = Math.asin( clamp( m32, - 1, 1 ) ); - if (p === THREE.RGB_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; - if (p === THREE.RGB_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; - if (p === THREE.RGBA_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; - if (p === THREE.RGBA_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + if ( Math.abs( m32 ) < 0.9999999 ) { - } + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); - } + } else { - if (p === THREE.RGB_ETC1_Format) { + this._y = 0; + this._z = Math.atan2( m21, m11 ); - extension = extensions.get('WEBGL_compressed_texture_etc1'); + } - if (extension !== null) return extension.COMPRESSED_RGB_ETC1_WEBGL; + break; - } + case 'ZYX': - if (p === THREE.MinEquation || p === THREE.MaxEquation) { + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); - extension = extensions.get('EXT_blend_minmax'); + if ( Math.abs( m31 ) < 0.9999999 ) { - if (extension !== null) { + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); - if (p === THREE.MinEquation) return extension.MIN_EXT; - if (p === THREE.MaxEquation) return extension.MAX_EXT; + } else { - } + this._x = 0; + this._z = Math.atan2( - m12, m22 ); - } + } - if (p === UnsignedInt248Type) { + break; - extension = extensions.get('WEBGL_depth_texture'); + case 'YZX': - if (extension !== null) return extension.UNSIGNED_INT_24_8_WEBGL; + this._z = Math.asin( clamp( m21, - 1, 1 ) ); - } + if ( Math.abs( m21 ) < 0.9999999 ) { - return 0; + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); - }; + } else { - let attributeLocations = { - "position": {name: "position", location: 0}, - "color": {name: "color", location: 1}, - "rgba": {name: "color", location: 1}, - "intensity": {name: "intensity", location: 2}, - "classification": {name: "classification", location: 3}, - "returnNumber": {name: "returnNumber", location: 4}, - "return number": {name: "returnNumber", location: 4}, - "returns": {name: "returnNumber", location: 4}, - "numberOfReturns": {name: "numberOfReturns", location: 5}, - "number of returns": {name: "numberOfReturns", location: 5}, - "pointSourceID": {name: "pointSourceID", location: 6}, - "source id": {name: "pointSourceID", location: 6}, - "point source id": {name: "pointSourceID", location: 6}, - "indices": {name: "indices", location: 7}, - "normal": {name: "normal", location: 8}, - "spacing": {name: "spacing", location: 9}, - "gps-time": {name: "gpsTime", location: 10}, - "aExtra": {name: "aExtra", location: 11}, - }; + this._x = 0; + this._y = Math.atan2( m13, m33 ); - class Shader { + } - constructor(gl, name, vsSource, fsSource) { - this.gl = gl; - this.name = name; - this.vsSource = vsSource; - this.fsSource = fsSource; + break; - this.cache = new Map(); + case 'XZY': - this.vs = null; - this.fs = null; - this.program = null; + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); - this.uniformLocations = {}; - this.attributeLocations = {}; - this.uniformBlockIndices = {}; - this.uniformBlocks = {}; - this.uniforms = {}; + if ( Math.abs( m12 ) < 0.9999999 ) { - this.update(vsSource, fsSource); - } + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); - update(vsSource, fsSource) { - this.vsSource = vsSource; - this.fsSource = fsSource; + } else { - this.linkProgram(); - } + this._x = Math.atan2( - m23, m33 ); + this._y = 0; - compileShader(shader, source){ - let gl = this.gl; + } - gl.shaderSource(shader, source); + break; - gl.compileShader(shader); + default: - let success = gl.getShaderParameter(shader, gl.COMPILE_STATUS); - if (!success) { - let info = gl.getShaderInfoLog(shader); - let numberedSource = source.split("\n").map((a, i) => `${i + 1}`.padEnd(5) + a).join("\n"); - throw `could not compile shader ${this.name}: ${info}, \n${numberedSource}`; - } - } + console.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order ); - linkProgram() { + } - const tStart = performance.now(); + this._order = order; - let gl = this.gl; + if ( update !== false ) this._onChangeCallback(); - this.uniformLocations = {}; - this.attributeLocations = {}; - this.uniforms = {}; + return this; - gl.useProgram(null); + } - let cached = this.cache.get(`${this.vsSource}, ${this.fsSource}`); - if (cached) { - this.program = cached.program; - this.vs = cached.vs; - this.fs = cached.fs; - this.attributeLocations = cached.attributeLocations; - this.uniformLocations = cached.uniformLocations; - this.uniformBlocks = cached.uniformBlocks; - this.uniforms = cached.uniforms; + setFromQuaternion( q, order, update ) { - return; - } else { + _matrix.makeRotationFromQuaternion( q ); - this.vs = gl.createShader(gl.VERTEX_SHADER); - this.fs = gl.createShader(gl.FRAGMENT_SHADER); - this.program = gl.createProgram(); + return this.setFromRotationMatrix( _matrix, order, update ); - for(let name of Object.keys(attributeLocations)){ - let location = attributeLocations[name].location; - let glslName = attributeLocations[name].name; - gl.bindAttribLocation(this.program, location, glslName); - } + } - this.compileShader(this.vs, this.vsSource); - this.compileShader(this.fs, this.fsSource); + setFromVector3( v, order ) { - let program = this.program; + return this.set( v.x, v.y, v.z, order || this._order ); - gl.attachShader(program, this.vs); - gl.attachShader(program, this.fs); + } - gl.linkProgram(program); + reorder( newOrder ) { - gl.detachShader(program, this.vs); - gl.detachShader(program, this.fs); + // WARNING: this discards revolution information -bhouston - let success = gl.getProgramParameter(program, gl.LINK_STATUS); - if (!success) { - let info = gl.getProgramInfoLog(program); - throw `could not link program ${this.name}: ${info}`; - } + _quaternion$1.setFromEuler( this ); - { // attribute locations - let numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); + return this.setFromQuaternion( _quaternion$1, newOrder ); - for (let i = 0; i < numAttributes; i++) { - let attribute = gl.getActiveAttrib(program, i); + } - let location = gl.getAttribLocation(program, attribute.name); + equals( euler ) { - this.attributeLocations[attribute.name] = location; - } - } + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); - { // uniform locations - let numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); + } - for (let i = 0; i < numUniforms; i++) { - let uniform = gl.getActiveUniform(program, i); + fromArray( array ) { - let location = gl.getUniformLocation(program, uniform.name); + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; - this.uniformLocations[uniform.name] = location; - this.uniforms[uniform.name] = { - location: location, - value: null, - }; - } - } + this._onChangeCallback(); - // uniform blocks - if(gl instanceof WebGL2RenderingContext){ - let numBlocks = gl.getProgramParameter(program, gl.ACTIVE_UNIFORM_BLOCKS); + return this; - for (let i = 0; i < numBlocks; i++) { - let blockName = gl.getActiveUniformBlockName(program, i); + } - let blockIndex = gl.getUniformBlockIndex(program, blockName); + toArray( array = [], offset = 0 ) { - this.uniformBlockIndices[blockName] = blockIndex; + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; - gl.uniformBlockBinding(program, blockIndex, blockIndex); - let dataSize = gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_DATA_SIZE); + return array; - let uBuffer = gl.createBuffer(); - gl.bindBuffer(gl.UNIFORM_BUFFER, uBuffer); - gl.bufferData(gl.UNIFORM_BUFFER, dataSize, gl.DYNAMIC_READ); + } - gl.bindBufferBase(gl.UNIFORM_BUFFER, blockIndex, uBuffer); + toVector3( optionalResult ) { - gl.bindBuffer(gl.UNIFORM_BUFFER, null); + if ( optionalResult ) { - this.uniformBlocks[blockName] = { - name: blockName, - index: blockIndex, - dataSize: dataSize, - buffer: uBuffer - }; + return optionalResult.set( this._x, this._y, this._z ); - } - } + } else { - let cached = { - program: this.program, - vs: this.vs, - fs: this.fs, - attributeLocations: this.attributeLocations, - uniformLocations: this.uniformLocations, - uniforms: this.uniforms, - uniformBlocks: this.uniformBlocks, - }; + return new Vector3( this._x, this._y, this._z ); - this.cache.set(`${this.vsSource}, ${this.fsSource}`, cached); } - const tEnd = performance.now(); - const duration = tEnd - tStart; + } - console.log(`shader compile duration: ${duration.toFixed(3)}`); + _onChange( callback ) { + this._onChangeCallback = callback; + + return this; } - setUniformMatrix4(name, value) { - const gl = this.gl; - const location = this.uniformLocations[name]; + _onChangeCallback() {} - if (location == null) { - return; - } + } - let tmp = new Float32Array(value.elements); - gl.uniformMatrix4fv(location, false, tmp); - } + Euler.DefaultOrder = 'XYZ'; + Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; - setUniform1f(name, value) { - const gl = this.gl; - const uniform = this.uniforms[name]; + const _matrix = /*@__PURE__*/ new Matrix4(); + const _quaternion$1 = /*@__PURE__*/ new Quaternion(); - if (uniform === undefined) { - return; - } + class Layers { - if(uniform.value === value){ - return; - } + constructor() { - uniform.value = value; + this.mask = 1 | 0; - gl.uniform1f(uniform.location, value); } - setUniformBoolean(name, value) { - const gl = this.gl; - const uniform = this.uniforms[name]; + set( channel ) { - if (uniform === undefined) { - return; - } + this.mask = 1 << channel | 0; - if(uniform.value === value){ - return; - } + } - uniform.value = value; + enable( channel ) { + + this.mask |= 1 << channel | 0; - gl.uniform1i(uniform.location, value); } - setUniformTexture(name, value) { - const gl = this.gl; - const location = this.uniformLocations[name]; + enableAll() { - if (location == null) { - return; - } + this.mask = 0xffffffff | 0; - gl.uniform1i(location, value); } - setUniform2f(name, value) { - const gl = this.gl; - const location = this.uniformLocations[name]; + toggle( channel ) { - if (location == null) { - return; - } + this.mask ^= 1 << channel | 0; - gl.uniform2f(location, value[0], value[1]); } - setUniform3f(name, value) { - const gl = this.gl; - const location = this.uniformLocations[name]; + disable( channel ) { - if (location == null) { - return; - } + this.mask &= ~ ( 1 << channel | 0 ); - gl.uniform3f(location, value[0], value[1], value[2]); } - setUniform(name, value) { + disableAll() { - if (value.constructor === THREE.Matrix4) { - this.setUniformMatrix4(name, value); - } else if (typeof value === "number") { - this.setUniform1f(name, value); - } else if (typeof value === "boolean") { - this.setUniformBoolean(name, value); - } else if (value instanceof WebGLTexture) { - this.setUniformTexture(name, value); - } else if (value instanceof Array) { + this.mask = 0; - if (value.length === 2) { - this.setUniform2f(name, value); - } else if (value.length === 3) { - this.setUniform3f(name, value); - } + } - } else { - console.error("unhandled uniform type: ", name, value); - } + test( layers ) { + + return ( this.mask & layers.mask ) !== 0; } + } - setUniform1i(name, value) { - let gl = this.gl; - let location = this.uniformLocations[name]; + let _object3DId = 0; - if (location == null) { - return; - } + const _v1$2 = new Vector3(); + const _q1 = new Quaternion(); + const _m1$1 = new Matrix4(); + const _target = new Vector3(); - gl.uniform1i(location, value); - } + const _position = new Vector3(); + const _scale = new Vector3(); + const _quaternion$2 = new Quaternion(); - }; + const _xAxis = new Vector3( 1, 0, 0 ); + const _yAxis = new Vector3( 0, 1, 0 ); + const _zAxis = new Vector3( 0, 0, 1 ); - class WebGLTexture { + const _addedEvent = { type: 'added' }; + const _removedEvent = { type: 'removed' }; - constructor(gl, texture) { - this.gl = gl; + function Object3D() { - this.texture = texture; - this.id = gl.createTexture(); + Object.defineProperty( this, 'id', { value: _object3DId ++ } ); - this.target = gl.TEXTURE_2D; - this.version = -1; + this.uuid = MathUtils.generateUUID(); - this.update(texture); - } + this.name = ''; + this.type = 'Object3D'; - update() { + this.parent = null; + this.children = []; - if (!this.texture.image) { - this.version = this.texture.version; + this.up = Object3D.DefaultUp.clone(); - return; - } + const position = new Vector3(); + const rotation = new Euler(); + const quaternion = new Quaternion(); + const scale = new Vector3( 1, 1, 1 ); - let gl = this.gl; - let texture = this.texture; + function onRotationChange() { - if (this.version === texture.version) { - return; - } + quaternion.setFromEuler( rotation, false ); - this.target = gl.TEXTURE_2D; + } - gl.bindTexture(this.target, this.id); + function onQuaternionChange() { - let level = 0; - let internalFormat = paramThreeToGL(gl, texture.format); - let width = texture.image.width; - let height = texture.image.height; - let border = 0; - let srcFormat = internalFormat; - let srcType = paramThreeToGL(gl, texture.type); - let data; + rotation.setFromQuaternion( quaternion, undefined, false ); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, texture.flipY); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha); - gl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment); + } - if (texture instanceof THREE.DataTexture) { - data = texture.image.data; + rotation._onChange( onRotationChange ); + quaternion._onChange( onQuaternionChange ); - gl.texParameteri(this.target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(this.target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + Object.defineProperties( this, { + position: { + configurable: true, + enumerable: true, + value: position + }, + rotation: { + configurable: true, + enumerable: true, + value: rotation + }, + quaternion: { + configurable: true, + enumerable: true, + value: quaternion + }, + scale: { + configurable: true, + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); - gl.texParameteri(this.target, gl.TEXTURE_MAG_FILTER, paramThreeToGL(gl, texture.magFilter)); - gl.texParameteri(this.target, gl.TEXTURE_MIN_FILTER, paramThreeToGL(gl, texture.minFilter)); + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); - gl.texImage2D(this.target, level, internalFormat, - width, height, border, srcFormat, srcType, - data); - } else if ((texture instanceof THREE.CanvasTexture) || (texture instanceof THREE.Texture)) { - data = texture.image; + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; - gl.texParameteri(this.target, gl.TEXTURE_WRAP_S, paramThreeToGL(gl, texture.wrapS)); - gl.texParameteri(this.target, gl.TEXTURE_WRAP_T, paramThreeToGL(gl, texture.wrapT)); + this.layers = new Layers(); + this.visible = true; - gl.texParameteri(this.target, gl.TEXTURE_MAG_FILTER, paramThreeToGL(gl, texture.magFilter)); - gl.texParameteri(this.target, gl.TEXTURE_MIN_FILTER, paramThreeToGL(gl, texture.minFilter)); + this.castShadow = false; + this.receiveShadow = false; - gl.texImage2D(this.target, level, internalFormat, - internalFormat, srcType, data); + this.frustumCulled = true; + this.renderOrder = 0; - if (texture instanceof THREE.Texture) {gl.generateMipmap(gl.TEXTURE_2D);} - } + this.animations = []; - gl.bindTexture(this.target, null); + this.userData = {}; - this.version = texture.version; - } + } - }; + Object3D.DefaultUp = new Vector3( 0, 1, 0 ); + Object3D.DefaultMatrixAutoUpdate = true; - class WebGLBuffer { + Object3D.prototype = Object.assign( Object.create( EventDispatcher$1.prototype ), { - constructor() { - this.numElements = 0; - this.vao = null; - this.vbos = new Map(); - } + constructor: Object3D, - }; + isObject3D: true, - class Renderer { + onBeforeRender: function () {}, + onAfterRender: function () {}, - constructor(threeRenderer) { - this.threeRenderer = threeRenderer; - this.gl = this.threeRenderer.getContext(); + applyMatrix4: function ( matrix ) { - this.buffers = new Map(); - this.shaders = new Map(); - this.textures = new Map(); + if ( this.matrixAutoUpdate ) this.updateMatrix(); - this.glTypeMapping = new Map(); - this.glTypeMapping.set(Float32Array, this.gl.FLOAT); - this.glTypeMapping.set(Uint8Array, this.gl.UNSIGNED_BYTE); - this.glTypeMapping.set(Uint16Array, this.gl.UNSIGNED_SHORT); + this.matrix.premultiply( matrix ); - this.toggle = 0; - } + this.matrix.decompose( this.position, this.quaternion, this.scale ); - deleteBuffer(geometry) { + }, - let gl = this.gl; - let webglBuffer = this.buffers.get(geometry); - if (webglBuffer != null) { - for (let attributeName in geometry.attributes) { - gl.deleteBuffer(webglBuffer.vbos.get(attributeName).handle); - } - this.buffers.delete(geometry); - } - } + applyQuaternion: function ( q ) { - createBuffer(geometry){ - let gl = this.gl; - let webglBuffer = new WebGLBuffer(); - webglBuffer.vao = gl.createVertexArray(); - webglBuffer.numElements = geometry.attributes.position.count; + this.quaternion.premultiply( q ); - gl.bindVertexArray(webglBuffer.vao); + return this; - for(let attributeName in geometry.attributes){ - let bufferAttribute = geometry.attributes[attributeName]; + }, - let vbo = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, vbo); - gl.bufferData(gl.ARRAY_BUFFER, bufferAttribute.array, gl.STATIC_DRAW); + setRotationFromAxisAngle: function ( axis, angle ) { - let normalized = bufferAttribute.normalized; - let type = this.glTypeMapping.get(bufferAttribute.array.constructor); + // assumes axis is normalized - if(attributeLocations[attributeName] === undefined){ - //attributeLocation = attributeLocations["aExtra"]; - }else { - let attributeLocation = attributeLocations[attributeName].location; + this.quaternion.setFromAxisAngle( axis, angle ); - gl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0); - gl.enableVertexAttribArray(attributeLocation); - } + }, + setRotationFromEuler: function ( euler ) { - webglBuffer.vbos.set(attributeName, { - handle: vbo, - name: attributeName, - count: bufferAttribute.count, - itemSize: bufferAttribute.itemSize, - type: geometry.attributes.position.array.constructor, - version: 0 - }); - } + this.quaternion.setFromEuler( euler, true ); - gl.bindBuffer(gl.ARRAY_BUFFER, null); - gl.bindVertexArray(null); + }, - let disposeHandler = (event) => { - this.deleteBuffer(geometry); - geometry.removeEventListener("dispose", disposeHandler); - }; - geometry.addEventListener("dispose", disposeHandler); + setRotationFromMatrix: function ( m ) { - return webglBuffer; - } + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) - updateBuffer(geometry){ - let gl = this.gl; + this.quaternion.setFromRotationMatrix( m ); - let webglBuffer = this.buffers.get(geometry); + }, - gl.bindVertexArray(webglBuffer.vao); + setRotationFromQuaternion: function ( q ) { - for(let attributeName in geometry.attributes){ - let bufferAttribute = geometry.attributes[attributeName]; + // assumes q is normalized - let normalized = bufferAttribute.normalized; - let type = this.glTypeMapping.get(bufferAttribute.array.constructor); + this.quaternion.copy( q ); - let vbo = null; - if(!webglBuffer.vbos.has(attributeName)){ - vbo = gl.createBuffer(); + }, - webglBuffer.vbos.set(attributeName, { - handle: vbo, - name: attributeName, - count: bufferAttribute.count, - itemSize: bufferAttribute.itemSize, - type: geometry.attributes.position.array.constructor, - version: bufferAttribute.version - }); - }else { - vbo = webglBuffer.vbos.get(attributeName).handle; - webglBuffer.vbos.get(attributeName).version = bufferAttribute.version; - } + rotateOnAxis: function ( axis, angle ) { - gl.bindBuffer(gl.ARRAY_BUFFER, vbo); - gl.bufferData(gl.ARRAY_BUFFER, bufferAttribute.array, gl.STATIC_DRAW); + // rotate object on axis in object space + // axis is assumed to be normalized - if(attributeLocations[attributeName] === undefined){ - //attributeLocation = attributeLocations["aExtra"]; - }else { - let attributeLocation = attributeLocations[attributeName].location; - - gl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0); - gl.enableVertexAttribArray(attributeLocation); - } - } + _q1.setFromAxisAngle( axis, angle ); - gl.bindBuffer(gl.ARRAY_BUFFER, null); - gl.bindVertexArray(null); - } + this.quaternion.multiply( _q1 ); - traverse(scene) { + return this; - let octrees = []; + }, - let stack = [scene]; - while (stack.length > 0) { + rotateOnWorldAxis: function ( axis, angle ) { - let node = stack.pop(); + // rotate object on axis in world space + // axis is assumed to be normalized + // method assumes no rotated parent - if (node instanceof PointCloudTree) { - octrees.push(node); - continue; - } + _q1.setFromAxisAngle( axis, angle ); - let visibleChildren = node.children.filter(c => c.visible); - stack.push(...visibleChildren); + this.quaternion.premultiply( _q1 ); - } + return this; - let result = { - octrees: octrees - }; + }, - return result; - } + rotateX: function ( angle ) { + return this.rotateOnAxis( _xAxis, angle ); + }, - renderNodes(octree, nodes, visibilityTextureData, camera, target, shader, params) { + rotateY: function ( angle ) { - if (exports.measureTimings) performance.mark("renderNodes-start"); + return this.rotateOnAxis( _yAxis, angle ); - let gl = this.gl; + }, - let material = params.material ? params.material : octree.material; - let shadowMaps = params.shadowMaps == null ? [] : params.shadowMaps; - let view = camera.matrixWorldInverse; - let worldView = new THREE.Matrix4(); + rotateZ: function ( angle ) { - let mat4holder = new Float32Array(16); + return this.rotateOnAxis( _zAxis, angle ); - let i = 0; - for (let node of nodes) { + }, - if(exports.debug.allowedNodes !== undefined){ - if(!exports.debug.allowedNodes.includes(node.name)){ - continue; - } - } + translateOnAxis: function ( axis, distance ) { - let world = node.sceneNode.matrixWorld; - worldView.multiplyMatrices(view, world); + // translate object by distance along axis in object space + // axis is assumed to be normalized - if (visibilityTextureData) { - let vnStart = visibilityTextureData.offsets.get(node); - shader.setUniform1f("uVNStart", vnStart); - } + _v1$2.copy( axis ).applyQuaternion( this.quaternion ); + this.position.add( _v1$2.multiplyScalar( distance ) ); - let level = node.getLevel(); + return this; - if(node.debug){ - shader.setUniform("uDebug", true); - }else { - shader.setUniform("uDebug", false); - } + }, - // let isLeaf = false; - // if(node instanceof PointCloudOctreeNode){ - // isLeaf = Object.keys(node.children).length === 0; - // }else if(node instanceof PointCloudArena4DNode){ - // isLeaf = node.geometryNode.isLeaf; - // } - // shader.setUniform("uIsLeafNode", isLeaf); + translateX: function ( distance ) { - // let isLeaf = node.children.filter(n => n != null).length === 0; - // if(!isLeaf){ - // continue; - // } + return this.translateOnAxis( _xAxis, distance ); + }, - // TODO consider passing matrices in an array to avoid uniformMatrix4fv overhead - const lModel = shader.uniformLocations["modelMatrix"]; - if (lModel) { - mat4holder.set(world.elements); - gl.uniformMatrix4fv(lModel, false, mat4holder); - } + translateY: function ( distance ) { - const lModelView = shader.uniformLocations["modelViewMatrix"]; - //mat4holder.set(worldView.elements); - // faster then set in chrome 63 - for(let j = 0; j < 16; j++){ - mat4holder[j] = worldView.elements[j]; - } - gl.uniformMatrix4fv(lModelView, false, mat4holder); + return this.translateOnAxis( _yAxis, distance ); - { // Clip Polygons - if(material.clipPolygons && material.clipPolygons.length > 0){ + }, - let clipPolygonVCount = []; - let worldViewProjMatrices = []; + translateZ: function ( distance ) { - for(let clipPolygon of material.clipPolygons){ + return this.translateOnAxis( _zAxis, distance ); - let view = clipPolygon.viewMatrix; - let proj = clipPolygon.projMatrix; + }, - let worldViewProj = proj.clone().multiply(view).multiply(world); + localToWorld: function ( vector ) { - clipPolygonVCount.push(clipPolygon.markers.length); - worldViewProjMatrices.push(worldViewProj); - } + return vector.applyMatrix4( this.matrixWorld ); - let flattenedMatrices = [].concat(...worldViewProjMatrices.map(m => m.elements)); + }, - let flattenedVertices = new Array(8 * 3 * material.clipPolygons.length); - for(let i = 0; i < material.clipPolygons.length; i++){ - let clipPolygon = material.clipPolygons[i]; - for(let j = 0; j < clipPolygon.markers.length; j++){ - flattenedVertices[i * 24 + (j * 3 + 0)] = clipPolygon.markers[j].position.x; - flattenedVertices[i * 24 + (j * 3 + 1)] = clipPolygon.markers[j].position.y; - flattenedVertices[i * 24 + (j * 3 + 2)] = clipPolygon.markers[j].position.z; - } - } + worldToLocal: function ( vector ) { - const lClipPolygonVCount = shader.uniformLocations["uClipPolygonVCount[0]"]; - gl.uniform1iv(lClipPolygonVCount, clipPolygonVCount); + return vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() ); - const lClipPolygonVP = shader.uniformLocations["uClipPolygonWVP[0]"]; - gl.uniformMatrix4fv(lClipPolygonVP, false, flattenedMatrices); + }, - const lClipPolygons = shader.uniformLocations["uClipPolygonVertices[0]"]; - gl.uniform3fv(lClipPolygons, flattenedVertices); + lookAt: function ( x, y, z ) { - } - } + // This method does not support objects having non-uniformly-scaled parent(s) + if ( x.isVector3 ) { - //shader.setUniformMatrix4("modelMatrix", world); - //shader.setUniformMatrix4("modelViewMatrix", worldView); - shader.setUniform1f("uLevel", level); - shader.setUniform1f("uNodeSpacing", node.geometryNode.estimatedSpacing); + _target.copy( x ); - shader.setUniform1f("uPCIndex", i); - // uBBSize + } else { - if (shadowMaps.length > 0) { + _target.set( x, y, z ); - const lShadowMap = shader.uniformLocations["uShadowMap[0]"]; + } - shader.setUniform3f("uShadowColor", material.uniforms.uShadowColor.value); + const parent = this.parent; - let bindingStart = 5; - let bindingPoints = new Array(shadowMaps.length).fill(bindingStart).map((a, i) => (a + i)); - gl.uniform1iv(lShadowMap, bindingPoints); + this.updateWorldMatrix( true, false ); - for (let i = 0; i < shadowMaps.length; i++) { - let shadowMap = shadowMaps[i]; - let bindingPoint = bindingPoints[i]; - let glTexture = this.threeRenderer.properties.get(shadowMap.target.texture).__webglTexture; + _position.setFromMatrixPosition( this.matrixWorld ); - gl.activeTexture(gl[`TEXTURE${bindingPoint}`]); - gl.bindTexture(gl.TEXTURE_2D, glTexture); - } + if ( this.isCamera || this.isLight ) { - { + _m1$1.lookAt( _position, _target, this.up ); - let worldViewMatrices = shadowMaps - .map(sm => sm.camera.matrixWorldInverse) - .map(view => new THREE.Matrix4().multiplyMatrices(view, world)); + } else { - let flattenedMatrices = [].concat(...worldViewMatrices.map(c => c.elements)); - const lWorldView = shader.uniformLocations["uShadowWorldView[0]"]; - gl.uniformMatrix4fv(lWorldView, false, flattenedMatrices); - } + _m1$1.lookAt( _target, _position, this.up ); - { - let flattenedMatrices = [].concat(...shadowMaps.map(sm => sm.camera.projectionMatrix.elements)); - const lProj = shader.uniformLocations["uShadowProj[0]"]; - gl.uniformMatrix4fv(lProj, false, flattenedMatrices); - } - } + } - const geometry = node.geometryNode.geometry; + this.quaternion.setFromRotationMatrix( _m1$1 ); - if(geometry.attributes["gps-time"]){ - const bufferAttribute = geometry.attributes["gps-time"]; - const attGPS = octree.getAttribute("gps-time"); + if ( parent ) { - let initialRange = attGPS.initialRange; - let initialRangeSize = initialRange[1] - initialRange[0]; + _m1$1.extractRotation( parent.matrixWorld ); + _q1.setFromRotationMatrix( _m1$1 ); + this.quaternion.premultiply( _q1.invert() ); - let globalRange = attGPS.range; - let globalRangeSize = globalRange[1] - globalRange[0]; + } - let scale = initialRangeSize / globalRangeSize; - let offset = -(globalRange[0] - initialRange[0]) / initialRangeSize; + }, - shader.setUniform1f("uGpsScale", scale); - shader.setUniform1f("uGpsOffset", offset); - //shader.setUniform2f("uFilterGPSTimeClipRange", [-Infinity, Infinity]); + add: function ( object ) { - let uFilterGPSTimeClipRange = material.uniforms.uFilterGPSTimeClipRange.value; - // let gpsCliPRangeMin = uFilterGPSTimeClipRange[0] - // let gpsCliPRangeMax = uFilterGPSTimeClipRange[1] - // shader.setUniform2f("uFilterGPSTimeClipRange", [gpsCliPRangeMin, gpsCliPRangeMax]); + if ( arguments.length > 1 ) { - let normalizedClipRange = [ - (uFilterGPSTimeClipRange[0] - globalRange[0]) / globalRangeSize, - (uFilterGPSTimeClipRange[1] - globalRange[0]) / globalRangeSize, - ]; + for ( let i = 0; i < arguments.length; i ++ ) { - shader.setUniform2f("uFilterGPSTimeClipRange", normalizedClipRange); + this.add( arguments[ i ] ); + } + return this; - // // ranges in full gps coordinate system - // const globalRange = attGPS.range; - // const bufferRange = bufferAttribute.potree.range; + } - // // ranges in [0, 1] - // // normalizedGlobalRange = [0, 1] - // // normalizedBufferRange: norm buffer within norm global range e.g. [0.2, 0.8] - // const globalWidth = globalRange[1] - globalRange[0]; - // const normalizedBufferRange = [ - // (bufferRange[0] - globalRange[0]) / globalWidth, - // (bufferRange[1] - globalRange[0]) / globalWidth, - // ]; + if ( object === this ) { - // shader.setUniform2f("uNormalizedGpsBufferRange", normalizedBufferRange); + console.error( 'THREE.Object3D.add: object can\'t be added as a child of itself.', object ); + return this; - // let uFilterGPSTimeClipRange = material.uniforms.uFilterGPSTimeClipRange.value; - // let gpsCliPRangeMin = uFilterGPSTimeClipRange[0] - // let gpsCliPRangeMax = uFilterGPSTimeClipRange[1] - // shader.setUniform2f("uFilterGPSTimeClipRange", [gpsCliPRangeMin, gpsCliPRangeMax]); + } - // shader.setUniform1f("uGpsScale", bufferAttribute.potree.scale); - // shader.setUniform1f("uGpsOffset", bufferAttribute.potree.offset); - } + if ( object && object.isObject3D ) { - { - let uFilterReturnNumberRange = material.uniforms.uFilterReturnNumberRange.value; - let uFilterNumberOfReturnsRange = material.uniforms.uFilterNumberOfReturnsRange.value; - let uFilterPointSourceIDClipRange = material.uniforms.uFilterPointSourceIDClipRange.value; - - - - shader.setUniform2f("uFilterReturnNumberRange", uFilterReturnNumberRange); - shader.setUniform2f("uFilterNumberOfReturnsRange", uFilterNumberOfReturnsRange); - shader.setUniform2f("uFilterPointSourceIDClipRange", uFilterPointSourceIDClipRange); - } + if ( object.parent !== null ) { - let webglBuffer = null; - if(!this.buffers.has(geometry)){ - webglBuffer = this.createBuffer(geometry); - this.buffers.set(geometry, webglBuffer); - }else { - webglBuffer = this.buffers.get(geometry); - for(let attributeName in geometry.attributes){ - let attribute = geometry.attributes[attributeName]; + object.parent.remove( object ); - if(attribute.version > webglBuffer.vbos.get(attributeName).version){ - this.updateBuffer(geometry); - } - } } - gl.bindVertexArray(webglBuffer.vao); + object.parent = this; + this.children.push( object ); - let isExtraAttribute = - attributeLocations[material.activeAttributeName] === undefined - && Object.keys(geometry.attributes).includes(material.activeAttributeName); + object.dispatchEvent( _addedEvent ); - if(isExtraAttribute){ + } else { - const attributeLocation = attributeLocations["aExtra"].location; + console.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object ); - for(const attributeName in geometry.attributes){ - const bufferAttribute = geometry.attributes[attributeName]; - const vbo = webglBuffer.vbos.get(attributeName); - - gl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle); - gl.disableVertexAttribArray(attributeLocation); - } + } - const attName = material.activeAttributeName; - const bufferAttribute = geometry.attributes[attName]; - const vbo = webglBuffer.vbos.get(attName); + return this; - if(bufferAttribute !== undefined && vbo !== undefined){ - let type = this.glTypeMapping.get(bufferAttribute.array.constructor); - let normalized = bufferAttribute.normalized; + }, - gl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle); - gl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0); - gl.enableVertexAttribArray(attributeLocation); - } + remove: function ( object ) { + if ( arguments.length > 1 ) { + for ( let i = 0; i < arguments.length; i ++ ) { + this.remove( arguments[ i ] ); - { - const attExtra = octree.pcoGeometry.pointAttributes.attributes - .find(a => a.name === attName); + } - let range = material.getRange(attName); - if(!range){ - range = attExtra.range; - } + return this; - if(!range){ - range = [0, 1]; - } + } - let initialRange = attExtra.initialRange; - let initialRangeSize = initialRange[1] - initialRange[0]; + const index = this.children.indexOf( object ); - let globalRange = range; - let globalRangeSize = globalRange[1] - globalRange[0]; + if ( index !== - 1 ) { - let scale = initialRangeSize / globalRangeSize; - let offset = -(globalRange[0] - initialRange[0]) / initialRangeSize; + object.parent = null; + this.children.splice( index, 1 ); - shader.setUniform1f("uExtraScale", scale); - shader.setUniform1f("uExtraOffset", offset); - } + object.dispatchEvent( _removedEvent ); - }else { + } - for(const attributeName in geometry.attributes){ - const bufferAttribute = geometry.attributes[attributeName]; - const vbo = webglBuffer.vbos.get(attributeName); + return this; + }, - if(attributeLocations[attributeName] !== undefined){ - const attributeLocation = attributeLocations[attributeName].location; + clear: function () { - let type = this.glTypeMapping.get(bufferAttribute.array.constructor); - let normalized = bufferAttribute.normalized; - - gl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle); - gl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0); - gl.enableVertexAttribArray(attributeLocation); - - } - } - } + for ( let i = 0; i < this.children.length; i ++ ) { - let numPoints = webglBuffer.numElements; - gl.drawArrays(gl.POINTS, 0, numPoints); + const object = this.children[ i ]; - i++; - } + object.parent = null; - gl.bindVertexArray(null); + object.dispatchEvent( _removedEvent ); - if (exports.measureTimings) { - performance.mark("renderNodes-end"); - performance.measure("render.renderNodes", "renderNodes-start", "renderNodes-end"); } - } - renderOctree(octree, nodes, camera, target, params = {}){ + this.children.length = 0; - let gl = this.gl; + return this; - let material = params.material ? params.material : octree.material; - let shadowMaps = params.shadowMaps == null ? [] : params.shadowMaps; - let view = camera.matrixWorldInverse; - let viewInv = camera.matrixWorld; - let proj = camera.projectionMatrix; - let projInv = new THREE.Matrix4().getInverse(proj); - let worldView = new THREE.Matrix4(); - let shader = null; - let visibilityTextureData = null; + }, - let currentTextureBindingPoint = 0; + attach: function ( object ) { - if (material.pointSizeType >= 0) { - if (material.pointSizeType === PointSizeType.ADAPTIVE || - material.activeAttributeName === "level of detail") { + // adds object as a child of this, while maintaining the object's world transform - let vnNodes = (params.vnTextureNodes != null) ? params.vnTextureNodes : nodes; - visibilityTextureData = octree.computeVisibilityTextureData(vnNodes, camera); + this.updateWorldMatrix( true, false ); - const vnt = material.visibleNodesTexture; - const data = vnt.image.data; - data.set(visibilityTextureData.data); - vnt.needsUpdate = true; + _m1$1.copy( this.matrixWorld ).invert(); - } - } + if ( object.parent !== null ) { - { // UPDATE SHADER AND TEXTURES - if (!this.shaders.has(material)) { - let [vs, fs] = [material.vertexShader, material.fragmentShader]; - let shader = new Shader(gl, "pointcloud", vs, fs); + object.parent.updateWorldMatrix( true, false ); - this.shaders.set(material, shader); - } + _m1$1.multiply( object.parent.matrixWorld ); - shader = this.shaders.get(material); + } - //if(material.needsUpdate){ - { - let [vs, fs] = [material.vertexShader, material.fragmentShader]; + object.applyMatrix4( _m1$1 ); - let numSnapshots = material.snapEnabled ? material.numSnapshots : 0; - let numClipBoxes = (material.clipBoxes && material.clipBoxes.length) ? material.clipBoxes.length : 0; - let numClipSpheres = (params.clipSpheres && params.clipSpheres.length) ? params.clipSpheres.length : 0; - let numClipPolygons = (material.clipPolygons && material.clipPolygons.length) ? material.clipPolygons.length : 0; + object.updateWorldMatrix( false, false ); - let defines = [ - `#define num_shadowmaps ${shadowMaps.length}`, - `#define num_snapshots ${numSnapshots}`, - `#define num_clipboxes ${numClipBoxes}`, - `#define num_clipspheres ${numClipSpheres}`, - `#define num_clippolygons ${numClipPolygons}`, - ]; + this.add( object ); + return this; - if(octree.pcoGeometry.root.isLoaded()){ - let attributes = octree.pcoGeometry.root.geometry.attributes; + }, - if(attributes["gps-time"]){ - defines.push("#define clip_gps_enabled"); - } + getObjectById: function ( id ) { - if(attributes["return number"]){ - defines.push("#define clip_return_number_enabled"); - } + return this.getObjectByProperty( 'id', id ); - if(attributes["number of returns"]){ - defines.push("#define clip_number_of_returns_enabled"); - } + }, - if(attributes["source id"] || attributes["point source id"]){ - defines.push("#define clip_point_source_id_enabled"); - } + getObjectByName: function ( name ) { - } + return this.getObjectByProperty( 'name', name ); - let definesString = defines.join("\n"); + }, - let vsVersionIndex = vs.indexOf("#version "); - let fsVersionIndex = fs.indexOf("#version "); + getObjectByProperty: function ( name, value ) { - if(vsVersionIndex >= 0){ - vs = vs.replace(/(#version .*)/, `$1\n${definesString}`); - }else { - vs = `${definesString}\n${vs}`; - } + if ( this[ name ] === value ) return this; - if(fsVersionIndex >= 0){ - fs = fs.replace(/(#version .*)/, `$1\n${definesString}`); - }else { - fs = `${definesString}\n${fs}`; - } + for ( let i = 0, l = this.children.length; i < l; i ++ ) { + const child = this.children[ i ]; + const object = child.getObjectByProperty( name, value ); - shader.update(vs, fs); + if ( object !== undefined ) { + + return object; - material.needsUpdate = false; } - for (let uniformName of Object.keys(material.uniforms)) { - let uniform = material.uniforms[uniformName]; + } - if (uniform.type == "t") { + return undefined; - let texture = uniform.value; + }, - if (!texture) { - continue; - } + getWorldPosition: function ( target ) { - if (!this.textures.has(texture)) { - let webglTexture = new WebGLTexture(gl, texture); + if ( target === undefined ) { - this.textures.set(texture, webglTexture); - } + console.warn( 'THREE.Object3D: .getWorldPosition() target is now required' ); + target = new Vector3(); - let webGLTexture = this.textures.get(texture); - webGLTexture.update(); + } + this.updateWorldMatrix( true, false ); - } - } - } + return target.setFromMatrixPosition( this.matrixWorld ); - gl.useProgram(shader.program); + }, - let transparent = false; - if(params.transparent !== undefined){ - transparent = params.transparent && material.opacity < 1; - }else { - transparent = material.opacity < 1; - } + getWorldQuaternion: function ( target ) { - if (transparent){ - gl.enable(gl.BLEND); - gl.blendFunc(gl.SRC_ALPHA, gl.ONE); - gl.depthMask(false); - gl.disable(gl.DEPTH_TEST); - } else { - gl.disable(gl.BLEND); - gl.depthMask(true); - gl.enable(gl.DEPTH_TEST); - } + if ( target === undefined ) { - if(params.blendFunc !== undefined){ - gl.enable(gl.BLEND); - gl.blendFunc(...params.blendFunc); - } + console.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' ); + target = new Quaternion(); - if(params.depthTest !== undefined){ - if(params.depthTest === true){ - gl.enable(gl.DEPTH_TEST); - }else { - gl.disable(gl.DEPTH_TEST); - } } - if(params.depthWrite !== undefined){ - if(params.depthWrite === true){ - gl.depthMask(true); - }else { - gl.depthMask(false); - } - - } + this.updateWorldMatrix( true, false ); + this.matrixWorld.decompose( _position, target, _scale ); - { // UPDATE UNIFORMS - shader.setUniformMatrix4("projectionMatrix", proj); - shader.setUniformMatrix4("viewMatrix", view); - shader.setUniformMatrix4("uViewInv", viewInv); - shader.setUniformMatrix4("uProjInv", projInv); + return target; - let screenWidth = target ? target.width : material.screenWidth; - let screenHeight = target ? target.height : material.screenHeight; + }, - shader.setUniform1f("uScreenWidth", screenWidth); - shader.setUniform1f("uScreenHeight", screenHeight); - shader.setUniform1f("fov", Math.PI * camera.fov / 180); - shader.setUniform1f("near", camera.near); - shader.setUniform1f("far", camera.far); - - if(camera instanceof THREE.OrthographicCamera){ - shader.setUniform("uUseOrthographicCamera", true); - shader.setUniform("uOrthoWidth", camera.right - camera.left); - shader.setUniform("uOrthoHeight", camera.top - camera.bottom); - }else { - shader.setUniform("uUseOrthographicCamera", false); - } + getWorldScale: function ( target ) { - if(material.clipBoxes.length + material.clipPolygons.length === 0){ - shader.setUniform1i("clipTask", ClipTask.NONE); - }else { - shader.setUniform1i("clipTask", material.clipTask); - } + if ( target === undefined ) { - shader.setUniform1i("clipMethod", material.clipMethod); + console.warn( 'THREE.Object3D: .getWorldScale() target is now required' ); + target = new Vector3(); - if (material.clipBoxes && material.clipBoxes.length > 0) { - //let flattenedMatrices = [].concat(...material.clipBoxes.map(c => c.inverse.elements)); + } - //const lClipBoxes = shader.uniformLocations["clipBoxes[0]"]; - //gl.uniformMatrix4fv(lClipBoxes, false, flattenedMatrices); + this.updateWorldMatrix( true, false ); - const lClipBoxes = shader.uniformLocations["clipBoxes[0]"]; - gl.uniformMatrix4fv(lClipBoxes, false, material.uniforms.clipBoxes.value); - } + this.matrixWorld.decompose( _position, _quaternion$2, target ); - // TODO CLIPSPHERES - if(params.clipSpheres && params.clipSpheres.length > 0){ + return target; - let clipSpheres = params.clipSpheres; + }, - let matrices = []; - for(let clipSphere of clipSpheres){ - //let mScale = new THREE.Matrix4().makeScale(...clipSphere.scale.toArray()); - //let mTranslate = new THREE.Matrix4().makeTranslation(...clipSphere.position.toArray()); + getWorldDirection: function ( target ) { - //let clipToWorld = new THREE.Matrix4().multiplyMatrices(mTranslate, mScale); - let clipToWorld = clipSphere.matrixWorld; - let viewToWorld = camera.matrixWorld; - let worldToClip = new THREE.Matrix4().getInverse(clipToWorld); + if ( target === undefined ) { - let viewToClip = new THREE.Matrix4().multiplyMatrices(worldToClip, viewToWorld); + console.warn( 'THREE.Object3D: .getWorldDirection() target is now required' ); + target = new Vector3(); - matrices.push(viewToClip); - } + } - let flattenedMatrices = [].concat(...matrices.map(matrix => matrix.elements)); + this.updateWorldMatrix( true, false ); - const lClipSpheres = shader.uniformLocations["uClipSpheres[0]"]; - gl.uniformMatrix4fv(lClipSpheres, false, flattenedMatrices); - - //const lClipSpheres = shader.uniformLocations["uClipSpheres[0]"]; - //gl.uniformMatrix4fv(lClipSpheres, false, material.uniforms.clipSpheres.value); - } + const e = this.matrixWorld.elements; + return target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize(); - shader.setUniform1f("size", material.size); - shader.setUniform1f("maxSize", material.uniforms.maxSize.value); - shader.setUniform1f("minSize", material.uniforms.minSize.value); + }, + raycast: function () {}, - // uniform float uPCIndex - shader.setUniform1f("uOctreeSpacing", material.spacing); - shader.setUniform("uOctreeSize", material.uniforms.octreeSize.value); + traverse: function ( callback ) { + callback( this ); - //uniform vec3 uColor; - shader.setUniform3f("uColor", material.color.toArray()); - //uniform float opacity; - shader.setUniform1f("uOpacity", material.opacity); + const children = this.children; - shader.setUniform2f("elevationRange", material.elevationRange); - shader.setUniform2f("intensityRange", material.intensityRange); + for ( let i = 0, l = children.length; i < l; i ++ ) { + children[ i ].traverse( callback ); - shader.setUniform3f("uIntensity_gbc", [ - material.intensityGamma, - material.intensityBrightness, - material.intensityContrast - ]); + } - shader.setUniform3f("uRGB_gbc", [ - material.rgbGamma, - material.rgbBrightness, - material.rgbContrast - ]); + }, - shader.setUniform1f("uTransition", material.transition); - shader.setUniform1f("wRGB", material.weightRGB); - shader.setUniform1f("wIntensity", material.weightIntensity); - shader.setUniform1f("wElevation", material.weightElevation); - shader.setUniform1f("wClassification", material.weightClassification); - shader.setUniform1f("wReturnNumber", material.weightReturnNumber); - shader.setUniform1f("wSourceID", material.weightSourceID); + traverseVisible: function ( callback ) { - shader.setUniform("backfaceCulling", material.uniforms.backfaceCulling.value); + if ( this.visible === false ) return; - let vnWebGLTexture = this.textures.get(material.visibleNodesTexture); - if(vnWebGLTexture){ - shader.setUniform1i("visibleNodesTexture", currentTextureBindingPoint); - gl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint); - gl.bindTexture(vnWebGLTexture.target, vnWebGLTexture.id); - currentTextureBindingPoint++; - } + callback( this ); - let gradientTexture = this.textures.get(material.gradientTexture); - shader.setUniform1i("gradient", currentTextureBindingPoint); - gl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint); - gl.bindTexture(gradientTexture.target, gradientTexture.id); + const children = this.children; - const repeat = material.elevationGradientRepeat; - if(repeat === ElevationGradientRepeat.REPEAT){ - gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.REPEAT); - }else if(repeat === ElevationGradientRepeat.MIRRORED_REPEAT){ - gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT); - gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT); - }else { - gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - currentTextureBindingPoint++; + for ( let i = 0, l = children.length; i < l; i ++ ) { - let classificationTexture = this.textures.get(material.classificationTexture); - shader.setUniform1i("classificationLUT", currentTextureBindingPoint); - gl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint); - gl.bindTexture(classificationTexture.target, classificationTexture.id); - currentTextureBindingPoint++; + children[ i ].traverseVisible( callback ); - let matcapTexture = this.textures.get(material.matcapTexture); - shader.setUniform1i("matcapTextureUniform", currentTextureBindingPoint); - gl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint); - gl.bindTexture(matcapTexture.target, matcapTexture.id); - currentTextureBindingPoint++; + } + }, - if (material.snapEnabled === true) { + traverseAncestors: function ( callback ) { - { - const lSnapshot = shader.uniformLocations["uSnapshot[0]"]; - const lSnapshotDepth = shader.uniformLocations["uSnapshotDepth[0]"]; + const parent = this.parent; - let bindingStart = currentTextureBindingPoint; - let lSnapshotBindingPoints = new Array(5).fill(bindingStart).map((a, i) => (a + i)); - let lSnapshotDepthBindingPoints = new Array(5) - .fill(1 + Math.max(...lSnapshotBindingPoints)) - .map((a, i) => (a + i)); - currentTextureBindingPoint = 1 + Math.max(...lSnapshotDepthBindingPoints); + if ( parent !== null ) { - gl.uniform1iv(lSnapshot, lSnapshotBindingPoints); - gl.uniform1iv(lSnapshotDepth, lSnapshotDepthBindingPoints); + callback( parent ); - for (let i = 0; i < 5; i++) { - let texture = material.uniforms[`uSnapshot`].value[i]; - let textureDepth = material.uniforms[`uSnapshotDepth`].value[i]; + parent.traverseAncestors( callback ); - if (!texture) { - break; - } + } - let snapTexture = this.threeRenderer.properties.get(texture).__webglTexture; - let snapTextureDepth = this.threeRenderer.properties.get(textureDepth).__webglTexture; + }, - let bindingPoint = lSnapshotBindingPoints[i]; - let depthBindingPoint = lSnapshotDepthBindingPoints[i]; + updateMatrix: function () { - gl.activeTexture(gl[`TEXTURE${bindingPoint}`]); - gl.bindTexture(gl.TEXTURE_2D, snapTexture); + this.matrix.compose( this.position, this.quaternion, this.scale ); - gl.activeTexture(gl[`TEXTURE${depthBindingPoint}`]); - gl.bindTexture(gl.TEXTURE_2D, snapTextureDepth); - } - } + this.matrixWorldNeedsUpdate = true; - { - let flattenedMatrices = [].concat(...material.uniforms.uSnapView.value.map(c => c.elements)); - const lSnapView = shader.uniformLocations["uSnapView[0]"]; - gl.uniformMatrix4fv(lSnapView, false, flattenedMatrices); - } - { - let flattenedMatrices = [].concat(...material.uniforms.uSnapProj.value.map(c => c.elements)); - const lSnapProj = shader.uniformLocations["uSnapProj[0]"]; - gl.uniformMatrix4fv(lSnapProj, false, flattenedMatrices); - } - { - let flattenedMatrices = [].concat(...material.uniforms.uSnapProjInv.value.map(c => c.elements)); - const lSnapProjInv = shader.uniformLocations["uSnapProjInv[0]"]; - gl.uniformMatrix4fv(lSnapProjInv, false, flattenedMatrices); - } - { - let flattenedMatrices = [].concat(...material.uniforms.uSnapViewInv.value.map(c => c.elements)); - const lSnapViewInv = shader.uniformLocations["uSnapViewInv[0]"]; - gl.uniformMatrix4fv(lSnapViewInv, false, flattenedMatrices); - } + }, - } - } + updateMatrixWorld: function ( force ) { - this.renderNodes(octree, nodes, visibilityTextureData, camera, target, shader, params); + if ( this.matrixAutoUpdate ) this.updateMatrix(); - gl.activeTexture(gl.TEXTURE2); - gl.bindTexture(gl.TEXTURE_2D, null); - gl.activeTexture(gl.TEXTURE0); - } + if ( this.matrixWorldNeedsUpdate || force ) { - render(scene, camera, target = null, params = {}) { + if ( this.parent === null ) { - const gl = this.gl; + this.matrixWorld.copy( this.matrix ); - // PREPARE - if (target != null) { - this.threeRenderer.setRenderTarget(target); - } + } else { - camera.updateProjectionMatrix(); + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); - const traversalResult = this.traverse(scene); + } + this.matrixWorldNeedsUpdate = false; + + force = true; - // RENDER - for (const octree of traversalResult.octrees) { - let nodes = octree.visibleNodes; - this.renderOctree(octree, nodes, camera, target, params); } + // update children - // CLEANUP - gl.activeTexture(gl.TEXTURE1); - gl.bindTexture(gl.TEXTURE_2D, null); + const children = this.children; - this.threeRenderer.state.reset(); - } + for ( let i = 0, l = children.length; i < l; i ++ ) { + children[ i ].updateMatrixWorld( force ); + } - }; + }, - class ProfileData { - constructor (profile) { - this.profile = profile; + updateWorldMatrix: function ( updateParents, updateChildren ) { - this.segments = []; - this.boundingBox = new THREE.Box3(); + const parent = this.parent; - for (let i = 0; i < profile.points.length - 1; i++) { - let start = profile.points[i]; - let end = profile.points[i + 1]; + if ( updateParents === true && parent !== null ) { - let startGround = new THREE.Vector3(start.x, start.y, 0); - let endGround = new THREE.Vector3(end.x, end.y, 0); + parent.updateWorldMatrix( true, false ); - let center = new THREE.Vector3().addVectors(endGround, startGround).multiplyScalar(0.5); - let length = startGround.distanceTo(endGround); - let side = new THREE.Vector3().subVectors(endGround, startGround).normalize(); - let up = new THREE.Vector3(0, 0, 1); - let forward = new THREE.Vector3().crossVectors(side, up).normalize(); - let N = forward; - let cutPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(N, startGround); - let halfPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(side, center); + } - let segment = { - start: start, - end: end, - cutPlane: cutPlane, - halfPlane: halfPlane, - length: length, - points: new Points() - }; + if ( this.matrixAutoUpdate ) this.updateMatrix(); - this.segments.push(segment); - } - } + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); - size () { - let size = 0; - for (let segment of this.segments) { - size += segment.points.numPoints; } - return size; - } - }; + // update children - class ProfileRequest { - constructor (pointcloud, profile, maxDepth, callback) { - this.pointcloud = pointcloud; - this.profile = profile; - this.maxDepth = maxDepth || Number.MAX_VALUE; - this.callback = callback; - this.temporaryResult = new ProfileData(this.profile); - this.pointsServed = 0; - this.highestLevelServed = 0; + if ( updateChildren === true ) { - this.priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; }); + const children = this.children; - this.initialize(); - } + for ( let i = 0, l = children.length; i < l; i ++ ) { - initialize () { - this.priorityQueue.push({node: this.pointcloud.pcoGeometry.root, weight: Infinity}); - }; + children[ i ].updateWorldMatrix( false, true ); - // traverse the node and add intersecting descendants to queue - traverse (node) { - let stack = []; - for (let i = 0; i < 8; i++) { - let child = node.children[i]; - if (child && this.pointcloud.nodeIntersectsProfile(child, this.profile)) { - stack.push(child); } + } - while (stack.length > 0) { - let node = stack.pop(); - let weight = node.boundingSphere.radius; + }, - this.priorityQueue.push({node: node, weight: weight}); + toJSON: function ( meta ) { - // add children that intersect the cutting plane - if (node.level < this.maxDepth) { - for (let i = 0; i < 8; i++) { - let child = node.children[i]; - if (child && this.pointcloud.nodeIntersectsProfile(child, this.profile)) { - stack.push(child); - } - } - } - } - } + // meta is a string when called from JSON.stringify + const isRootObject = ( meta === undefined || typeof meta === 'string' ); - update(){ - if(!this.updateGeneratorInstance){ - this.updateGeneratorInstance = this.updateGenerator(); - } + const output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {}, + skeletons: {}, + animations: {} + }; + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + }; - let result = this.updateGeneratorInstance.next(); - if(result.done){ - this.updateGeneratorInstance = null; } - } - * updateGenerator(){ - // load nodes in queue - // if hierarchy expands, also load nodes from expanded hierarchy - // once loaded, add data to this.points and remove node from queue - // only evaluate 1-50 nodes per frame to maintain responsiveness + // standard Object3D serialization - let start = performance.now(); + const object = {}; - let maxNodesPerUpdate = 1; - let intersectedNodes = []; + object.uuid = this.uuid; + object.type = this.type; - for (let i = 0; i < Math.min(maxNodesPerUpdate, this.priorityQueue.size()); i++) { - let element = this.priorityQueue.pop(); - let node = element.node; + if ( this.name !== '' ) object.name = this.name; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + if ( this.frustumCulled === false ) object.frustumCulled = false; + if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; - if(node.level > this.maxDepth){ - continue; - } + object.layers = this.layers.mask; + object.matrix = this.matrix.toArray(); - if (node.loaded) { - // add points to result - intersectedNodes.push(node); - exports.lru.touch(node); - this.highestLevelServed = Math.max(node.getLevel(), this.highestLevelServed); + if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false; - var geom = node.pcoGeometry; - var hierarchyStepSize = geom ? geom.hierarchyStepSize : 1; + // object specific properties - var doTraverse = node.getLevel() === 0 || - (node.level % hierarchyStepSize === 0 && node.hasChildren); + if ( this.isInstancedMesh ) { + + object.type = 'InstancedMesh'; + object.count = this.count; + object.instanceMatrix = this.instanceMatrix.toJSON(); - if (doTraverse) { - this.traverse(node); - } - } else { - node.load(); - this.priorityQueue.push(element); - } } - if (intersectedNodes.length > 0) { + // - for(let done of this.getPointsInsideProfile(intersectedNodes, this.temporaryResult)){ - if(!done){ - //console.log("updateGenerator yields"); - yield false; - } - } - if (this.temporaryResult.size() > 100) { - this.pointsServed += this.temporaryResult.size(); - this.callback.onProgress({request: this, points: this.temporaryResult}); - this.temporaryResult = new ProfileData(this.profile); - } - } + function serialize( library, element ) { - if (this.priorityQueue.size() === 0) { - // we're done! inform callback and remove from pending requests + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); - if (this.temporaryResult.size() > 0) { - this.pointsServed += this.temporaryResult.size(); - this.callback.onProgress({request: this, points: this.temporaryResult}); - this.temporaryResult = new ProfileData(this.profile); } - this.callback.onFinish({request: this}); + return element.uuid; - let index = this.pointcloud.profileRequests.indexOf(this); - if (index >= 0) { - this.pointcloud.profileRequests.splice(index, 1); - } } - yield true; - }; - - * getAccepted(numPoints, node, matrix, segment, segmentDir, points, totalMileage){ - let checkpoint = performance.now(); + if ( this.isMesh || this.isLine || this.isPoints ) { - let accepted = new Uint32Array(numPoints); - let mileage = new Float64Array(numPoints); - let acceptedPositions = new Float32Array(numPoints * 3); - let numAccepted = 0; + object.geometry = serialize( meta.geometries, this.geometry ); - let pos = new THREE.Vector3(); - let svp = new THREE.Vector3(); + const parameters = this.geometry.parameters; - let view = new Float32Array(node.geometry.attributes.position.array); + if ( parameters !== undefined && parameters.shapes !== undefined ) { - for (let i = 0; i < numPoints; i++) { + const shapes = parameters.shapes; - pos.set( - view[i * 3 + 0], - view[i * 3 + 1], - view[i * 3 + 2]); + if ( Array.isArray( shapes ) ) { - pos.applyMatrix4(matrix); - let distance = Math.abs(segment.cutPlane.distanceToPoint(pos)); - let centerDistance = Math.abs(segment.halfPlane.distanceToPoint(pos)); + for ( let i = 0, l = shapes.length; i < l; i ++ ) { - if (distance < this.profile.width / 2 && centerDistance < segment.length / 2) { - svp.subVectors(pos, segment.start); - let localMileage = segmentDir.dot(svp); + const shape = shapes[ i ]; - accepted[numAccepted] = i; - mileage[numAccepted] = localMileage + totalMileage; - points.boundingBox.expandByPoint(pos); + serialize( meta.shapes, shape ); - pos.sub(this.pointcloud.position); + } - acceptedPositions[3 * numAccepted + 0] = pos.x; - acceptedPositions[3 * numAccepted + 1] = pos.y; - acceptedPositions[3 * numAccepted + 2] = pos.z; + } else { - numAccepted++; - } + serialize( meta.shapes, shapes ); - if((i % 1000) === 0){ - let duration = performance.now() - checkpoint; - if(duration > 4){ - //console.log(`getAccepted yield after ${duration}ms`); - yield false; - checkpoint = performance.now(); } + } + } - accepted = accepted.subarray(0, numAccepted); - mileage = mileage.subarray(0, numAccepted); - acceptedPositions = acceptedPositions.subarray(0, numAccepted * 3); + if ( this.isSkinnedMesh ) { - //let end = performance.now(); - //let duration = end - start; - //console.log("accepted duration ", duration) + object.bindMode = this.bindMode; + object.bindMatrix = this.bindMatrix.toArray(); - //console.log(`getAccepted finished`); + if ( this.skeleton !== undefined ) { - yield [accepted, mileage, acceptedPositions]; - } + serialize( meta.skeletons, this.skeleton ); - * getPointsInsideProfile(nodes, target){ - let checkpoint = performance.now(); - let totalMileage = 0; + object.skeleton = this.skeleton.uuid; - let pointsProcessed = 0; + } - for (let segment of target.segments) { - for (let node of nodes) { - let numPoints = node.numPoints; - let geometry = node.geometry; + } - if(!numPoints){ - continue; - } + if ( this.material !== undefined ) { - { // skip if current node doesn't intersect current segment - let bbWorld = node.boundingBox.clone().applyMatrix4(this.pointcloud.matrixWorld); - let bsWorld = bbWorld.getBoundingSphere(new THREE.Sphere()); + if ( Array.isArray( this.material ) ) { - let start = new THREE.Vector3(segment.start.x, segment.start.y, bsWorld.center.z); - let end = new THREE.Vector3(segment.end.x, segment.end.y, bsWorld.center.z); + const uuids = []; - let closest = new THREE.Line3(start, end).closestPointToPoint(bsWorld.center, true, new THREE.Vector3()); - let distance = closest.distanceTo(bsWorld.center); + for ( let i = 0, l = this.material.length; i < l; i ++ ) { - let intersects = (distance < (bsWorld.radius + target.profile.width)); + uuids.push( serialize( meta.materials, this.material[ i ] ) ); - if(!intersects){ - continue; - } } - //{// DEBUG - // console.log(node.name); - // let boxHelper = new Potree.Box3Helper(node.getBoundingBox()); - // boxHelper.matrixAutoUpdate = false; - // boxHelper.matrix.copy(viewer.scene.pointclouds[0].matrixWorld); - // viewer.scene.scene.add(boxHelper); - //} + object.material = uuids; - let sv = new THREE.Vector3().subVectors(segment.end, segment.start).setZ(0); - let segmentDir = sv.clone().normalize(); + } else { - let points = new Points(); + object.material = serialize( meta.materials, this.material ); - let nodeMatrix = new THREE.Matrix4().makeTranslation(...node.boundingBox.min.toArray()); + } - let matrix = new THREE.Matrix4().multiplyMatrices( - this.pointcloud.matrixWorld, nodeMatrix); + } - pointsProcessed = pointsProcessed + numPoints; + // - let accepted = null; - let mileage = null; - let acceptedPositions = null; - for(let result of this.getAccepted(numPoints, node, matrix, segment, segmentDir, points,totalMileage)){ - if(!result){ - let duration = performance.now() - checkpoint; - //console.log(`getPointsInsideProfile yield after ${duration}ms`); - yield false; - checkpoint = performance.now(); - }else { - [accepted, mileage, acceptedPositions] = result; - } - } + if ( this.children.length > 0 ) { - let duration = performance.now() - checkpoint; - if(duration > 4){ - //console.log(`getPointsInsideProfile yield after ${duration}ms`); - yield false; - checkpoint = performance.now(); - } + object.children = []; - points.data.position = acceptedPositions; + for ( let i = 0; i < this.children.length; i ++ ) { - let relevantAttributes = Object.keys(geometry.attributes).filter(a => !["position", "indices"].includes(a)); - for(let attributeName of relevantAttributes){ + object.children.push( this.children[ i ].toJSON( meta ).object ); - let attribute = geometry.attributes[attributeName]; - let numElements = attribute.array.length / numPoints; + } - if(numElements !== parseInt(numElements)){ - debugger; - } + } - let Type = attribute.array.constructor; + // - let filteredBuffer = new Type(numElements * accepted.length); + if ( this.animations.length > 0 ) { - let source = attribute.array; - let target = filteredBuffer; + object.animations = []; - for(let i = 0; i < accepted.length; i++){ + for ( let i = 0; i < this.animations.length; i ++ ) { - let index = accepted[i]; + const animation = this.animations[ i ]; - let start = index * numElements; - let end = start + numElements; - let sub = source.subarray(start, end); + object.animations.push( serialize( meta.animations, animation ) ); - target.set(sub, i * numElements); - } + } - points.data[attributeName] = filteredBuffer; - } + } - points.data['mileage'] = mileage; - points.numPoints = accepted.length; + if ( isRootObject ) { + + const geometries = extractFromCache( meta.geometries ); + const materials = extractFromCache( meta.materials ); + const textures = extractFromCache( meta.textures ); + const images = extractFromCache( meta.images ); + const shapes = extractFromCache( meta.shapes ); + const skeletons = extractFromCache( meta.skeletons ); + const animations = extractFromCache( meta.animations ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + if ( shapes.length > 0 ) output.shapes = shapes; + if ( skeletons.length > 0 ) output.skeletons = skeletons; + if ( animations.length > 0 ) output.animations = animations; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + const values = []; + for ( const key in cache ) { + + const data = cache[ key ]; + delete data.metadata; + values.push( data ); - segment.points.add(points); } - totalMileage += segment.length; + return values; + } - for (let segment of target.segments) { - target.boundingBox.union(segment.points.boundingBox); + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive = true ) { + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.rotation.order = source.rotation.order; + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( let i = 0; i < source.children.length; i ++ ) { + + const child = source.children[ i ]; + this.add( child.clone() ); + + } + } - //console.log(`getPointsInsideProfile finished`); - yield true; - }; + return this; + + } + + } ); + + const _vector1 = /*@__PURE__*/ new Vector3(); + const _vector2 = /*@__PURE__*/ new Vector3(); + const _normalMatrix = /*@__PURE__*/ new Matrix3(); + + class Plane { + + constructor( normal, constant ) { + + Object.defineProperty( this, 'isPlane', { value: true } ); + + // normal is assumed to be normalized + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + + } + + set( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + } + + setComponents( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + } + + setFromNormalAndCoplanarPoint( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); + + return this; + + } + + setFromCoplanarPoints( a, b, c ) { + + const normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + } + + normalize() { + + // Note: will lead to a divide by zero if the plane is invalid. + + const inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + } + + negate() { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + } + + distanceToPoint( point ) { + + return this.normal.dot( point ) + this.constant; + + } + + distanceToSphere( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + } + + projectPoint( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .projectPoint() target is now required' ); + target = new Vector3(); - finishLevelThenCancel () { - if (this.cancelRequested) { - return; } - this.maxDepth = this.highestLevelServed; - this.cancelRequested = true; + return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point ); - //console.log(`maxDepth: ${this.maxDepth}`); - }; + } - cancel () { - this.callback.onCancel(); + intersectLine( line, target ) { - this.priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; }); + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .intersectLine() target is now required' ); + target = new Vector3(); - let index = this.pointcloud.profileRequests.indexOf(this); - if (index >= 0) { - this.pointcloud.profileRequests.splice(index, 1); } - }; + + const direction = line.delta( _vector1 ); + + const denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return target.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + const t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return target.copy( direction ).multiplyScalar( t ).add( line.start ); + + } + + intersectsLine( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + const startSign = this.distanceToPoint( line.start ); + const endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + } + + intersectsBox( box ) { + + return box.intersectsPlane( this ); + + } + + intersectsSphere( sphere ) { + + return sphere.intersectsPlane( this ); + + } + + coplanarPoint( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .coplanarPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.constant ); + + } + + applyMatrix4( matrix, optionalNormalMatrix ) { + + const normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix ); + + const referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix ); + + const normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + this.constant = - referencePoint.dot( normal ); + + return this; + + } + + translate( offset ) { + + this.constant -= offset.dot( this.normal ); + + return this; + + } + + equals( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + } - class Version{ + const _v0$1 = /*@__PURE__*/ new Vector3(); + const _v1$3 = /*@__PURE__*/ new Vector3(); + const _v2$1 = /*@__PURE__*/ new Vector3(); + const _v3 = /*@__PURE__*/ new Vector3(); + + const _vab = /*@__PURE__*/ new Vector3(); + const _vac = /*@__PURE__*/ new Vector3(); + const _vbc = /*@__PURE__*/ new Vector3(); + const _vap = /*@__PURE__*/ new Vector3(); + const _vbp = /*@__PURE__*/ new Vector3(); + const _vcp = /*@__PURE__*/ new Vector3(); + + class Triangle { + + constructor( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + + } + + static getNormal( a, b, c, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getNormal() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( c, b ); + _v0$1.subVectors( a, b ); + target.cross( _v0$1 ); + + const targetLengthSq = target.lengthSq(); + if ( targetLengthSq > 0 ) { + + return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) ); - constructor(version){ - this.version = version; - let vmLength = (version.indexOf('.') === -1) ? version.length : version.indexOf('.'); - this.versionMajor = parseInt(version.substr(0, vmLength)); - this.versionMinor = parseInt(version.substr(vmLength + 1)); - if (this.versionMinor.length === 0) { - this.versionMinor = 0; } + + return target.set( 0, 0, 0 ); + } - newerThan(version){ - let v = new Version(version); + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + static getBarycoord( point, a, b, c, target ) { + + _v0$1.subVectors( c, a ); + _v1$3.subVectors( b, a ); + _v2$1.subVectors( point, a ); + + const dot00 = _v0$1.dot( _v0$1 ); + const dot01 = _v0$1.dot( _v1$3 ); + const dot02 = _v0$1.dot( _v2$1 ); + const dot11 = _v1$3.dot( _v1$3 ); + const dot12 = _v1$3.dot( _v2$1 ); + + const denom = ( dot00 * dot11 - dot01 * dot01 ); + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getBarycoord() target is now required' ); + target = new Vector3(); + + } + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return target.set( - 2, - 1, - 1 ); - if (this.versionMajor > v.versionMajor) { - return true; - } else if (this.versionMajor === v.versionMajor && this.versionMinor > v.versionMinor) { - return true; - } else { - return false; } + + const invDenom = 1 / denom; + const u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + const v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return target.set( 1 - u - v, v, u ); + } - equalOrHigher(version){ - let v = new Version(version); + static containsPoint( point, a, b, c ) { + + this.getBarycoord( point, a, b, c, _v3 ); + + return ( _v3.x >= 0 ) && ( _v3.y >= 0 ) && ( ( _v3.x + _v3.y ) <= 1 ); + + } + + static getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) { + + this.getBarycoord( point, p1, p2, p3, _v3 ); + + target.set( 0, 0 ); + target.addScaledVector( uv1, _v3.x ); + target.addScaledVector( uv2, _v3.y ); + target.addScaledVector( uv3, _v3.z ); + + return target; + + } + + static isFrontFacing( a, b, c, direction ) { + + _v0$1.subVectors( c, b ); + _v1$3.subVectors( a, b ); + + // strictly front facing + return ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false; + + } + + set( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + } + + setFromPointsAndIndices( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + } + + getArea() { + + _v0$1.subVectors( this.c, this.b ); + _v1$3.subVectors( this.a, this.b ); + + return _v0$1.cross( _v1$3 ).length() * 0.5; + + } + + getMidpoint( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getMidpoint() target is now required' ); + target = new Vector3(); - if (this.versionMajor > v.versionMajor) { - return true; - } else if (this.versionMajor === v.versionMajor && this.versionMinor >= v.versionMinor) { - return true; - } else { - return false; } + + return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + } - upTo(version){ - return !this.newerThan(version); + getNormal( target ) { + + return Triangle.getNormal( this.a, this.b, this.c, target ); + } - } + getPlane( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getPlane() target is now required' ); + target = new Plane(); + + } + + return target.setFromCoplanarPoints( this.a, this.b, this.c ); - class WorkerPool{ - constructor(){ - this.workers = {}; } - getWorker(url){ - if (!this.workers[url]){ - this.workers[url] = []; + getBarycoord( point, target ) { + + return Triangle.getBarycoord( point, this.a, this.b, this.c, target ); + + } + + getUV( point, uv1, uv2, uv3, target ) { + + return Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target ); + + } + + containsPoint( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + } + + isFrontFacing( direction ) { + + return Triangle.isFrontFacing( this.a, this.b, this.c, direction ); + + } + + intersectsBox( box ) { + + return box.intersectsTriangle( this ); + + } + + closestPointToPoint( p, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' ); + target = new Vector3(); + } - if (this.workers[url].length === 0){ - let worker = new Worker(url); - this.workers[url].push(worker); + const a = this.a, b = this.b, c = this.c; + let v, w; + + // algorithm thanks to Real-Time Collision Detection by Christer Ericson, + // published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc., + // under the accompanying license; see chapter 5.1.5 for detailed explanation. + // basically, we're distinguishing which of the voronoi regions of the triangle + // the point lies in with the minimum amount of redundant computation. + + _vab.subVectors( b, a ); + _vac.subVectors( c, a ); + _vap.subVectors( p, a ); + const d1 = _vab.dot( _vap ); + const d2 = _vac.dot( _vap ); + if ( d1 <= 0 && d2 <= 0 ) { + + // vertex region of A; barycentric coords (1, 0, 0) + return target.copy( a ); + } - let worker = this.workers[url].pop(); + _vbp.subVectors( p, b ); + const d3 = _vab.dot( _vbp ); + const d4 = _vac.dot( _vbp ); + if ( d3 >= 0 && d4 <= d3 ) { + + // vertex region of B; barycentric coords (0, 1, 0) + return target.copy( b ); + + } + + const vc = d1 * d4 - d3 * d2; + if ( vc <= 0 && d1 >= 0 && d3 <= 0 ) { + + v = d1 / ( d1 - d3 ); + // edge region of AB; barycentric coords (1-v, v, 0) + return target.copy( a ).addScaledVector( _vab, v ); + + } + + _vcp.subVectors( p, c ); + const d5 = _vab.dot( _vcp ); + const d6 = _vac.dot( _vcp ); + if ( d6 >= 0 && d5 <= d6 ) { + + // vertex region of C; barycentric coords (0, 0, 1) + return target.copy( c ); + + } + + const vb = d5 * d2 - d1 * d6; + if ( vb <= 0 && d2 >= 0 && d6 <= 0 ) { + + w = d2 / ( d2 - d6 ); + // edge region of AC; barycentric coords (1-w, 0, w) + return target.copy( a ).addScaledVector( _vac, w ); + + } + + const va = d3 * d6 - d5 * d4; + if ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) { + + _vbc.subVectors( c, b ); + w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) ); + // edge region of BC; barycentric coords (0, 1-w, w) + return target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC + + } + + // face region + const denom = 1 / ( va + vb + vc ); + // u = va * denom + v = vb * denom; + w = vc * denom; + + return target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w ); - return worker; } - returnWorker(url, worker){ - this.workers[url].push(worker); + equals( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + } - }; - //Potree.workerPool = new Potree.WorkerPool(); + } + + const _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + + const _hslA = { h: 0, s: 0, l: 0 }; + const _hslB = { h: 0, s: 0, l: 0 }; + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; - function createPointcloudData(pointcloud) { - - let material = pointcloud.material; - - let ranges = []; - - for(let [name, value] of material.ranges){ - ranges.push({ - name: name, - value: value, - }); - } - - if(typeof material.elevationRange[0] === "number"){ - ranges.push({ - name: "elevationRange", - value: material.elevationRange, - }); - } - if(typeof material.intensityRange[0] === "number"){ - ranges.push({ - name: "intensityRange", - value: material.intensityRange, - }); - } - - let pointSizeTypeName = Object.entries(Potree.PointSizeType).find(e => e[1] === material.pointSizeType)[0]; - - let jsonMaterial = { - activeAttributeName: material.activeAttributeName, - ranges: ranges, - size: material.size, - minSize: material.minSize, - pointSizeType: pointSizeTypeName, - matcap: material.matcap, - }; - - const pcdata = { - name: pointcloud.name, - url: pointcloud.pcoGeometry.url, - position: pointcloud.position.toArray(), - rotation: pointcloud.rotation.toArray(), - scale: pointcloud.scale.toArray(), - material: jsonMaterial, - }; - - return pcdata; - } - - function createProfileData(profile){ - const data = { - uuid: profile.uuid, - name: profile.name, - points: profile.points.map(p => p.toArray()), - height: profile.height, - width: profile.width, - }; - - return data; - } - - function createVolumeData(volume){ - const data = { - uuid: volume.uuid, - type: volume.constructor.name, - name: volume.name, - position: volume.position.toArray(), - rotation: volume.rotation.toArray(), - scale: volume.scale.toArray(), - visible: volume.visible, - clip: volume.clip, - }; - - return data; - } - - function createCameraAnimationData(animation){ - - const controlPoints = animation.controlPoints.map( cp => { - const cpdata = { - position: cp.position.toArray(), - target: cp.target.toArray(), - }; - - return cpdata; - }); - - const data = { - uuid: animation.uuid, - name: animation.name, - duration: animation.duration, - t: animation.t, - curveType: animation.curveType, - visible: animation.visible, - controlPoints: controlPoints, - }; - - return data; - } - - function createMeasurementData(measurement){ - - const data = { - uuid: measurement.uuid, - name: measurement.name, - points: measurement.points.map(p => p.position.toArray()), - showDistances: measurement.showDistances, - showCoordinates: measurement.showCoordinates, - showArea: measurement.showArea, - closed: measurement.closed, - showAngles: measurement.showAngles, - showHeight: measurement.showHeight, - showCircle: measurement.showCircle, - showAzimuth: measurement.showAzimuth, - showEdges: measurement.showEdges, - color: measurement.color.toArray(), - }; - - return data; - } - - function createOrientedImagesData(images){ - const data = { - cameraParamsPath: images.cameraParamsPath, - imageParamsPath: images.imageParamsPath, - }; - - return data; - } - - function createGeopackageData(geopackage){ - const data = { - path: geopackage.path, - }; - - return data; - } - - function createAnnotationData(annotation){ - - const data = { - uuid: annotation.uuid, - title: annotation.title.toString(), - description: annotation.description, - position: annotation.position.toArray(), - offset: annotation.offset.toArray(), - children: [], - }; - - if(annotation.cameraPosition){ - data.cameraPosition = annotation.cameraPosition.toArray(); - } - - if(annotation.cameraTarget){ - data.cameraTarget = annotation.cameraTarget.toArray(); - } - - if(typeof annotation.radius !== "undefined"){ - data.radius = annotation.radius; - } - - return data; - } - - function createAnnotationsData(viewer){ - - const map = new Map(); - - viewer.scene.annotations.traverseDescendants(a => { - const aData = createAnnotationData(a); - - map.set(a, aData); - }); - - for(const [annotation, data] of map){ - for(const child of annotation.children){ - const childData = map.get(child); - data.children.push(childData); - } - } - - const annotations = viewer.scene.annotations.children.map(a => map.get(a)); - - return annotations; - } - - function createSettingsData(viewer){ - return { - pointBudget: viewer.getPointBudget(), - fov: viewer.getFOV(), - edlEnabled: viewer.getEDLEnabled(), - edlRadius: viewer.getEDLRadius(), - edlStrength: viewer.getEDLStrength(), - background: viewer.getBackground(), - minNodeSize: viewer.getMinNodeSize(), - showBoundingBoxes: viewer.getShowBoundingBox(), - }; - } - - function createSceneContentData(viewer){ - - const data = []; - - const potreeObjects = []; - - viewer.scene.scene.traverse(node => { - if(node.potree){ - potreeObjects.push(node); - } - }); - - for(const object of potreeObjects){ - - if(object.potree.file){ - const saveObject = { - file: object.potree.file, - }; - - data.push(saveObject); - } - - - } - - - return data; - } - - function createViewData(viewer){ - const view = viewer.scene.view; - - const data = { - position: view.position.toArray(), - target: view.getPivot().toArray(), - }; - - return data; - } - - function createClassificationData(viewer){ - const classifications = viewer.classifications; - - const data = classifications; - - return data; - } - - function saveProject(viewer) { - - const scene = viewer.scene; - - const data = { - type: "Potree", - version: 1.7, - settings: createSettingsData(viewer), - view: createViewData(viewer), - classification: createClassificationData(viewer), - pointclouds: scene.pointclouds.map(createPointcloudData), - measurements: scene.measurements.map(createMeasurementData), - volumes: scene.volumes.map(createVolumeData), - cameraAnimations: scene.cameraAnimations.map(createCameraAnimationData), - profiles: scene.profiles.map(createProfileData), - annotations: createAnnotationsData(viewer), - orientedImages: scene.orientedImages.map(createOrientedImagesData), - geopackages: scene.geopackages.map(createGeopackageData), - // objects: createSceneContentData(viewer), - }; - - return data; } - class ControlPoint{ - - constructor(){ - this.position = new THREE.Vector3(0, 0, 0); - this.target = new THREE.Vector3(0, 0, 0); - this.positionHandle = null; - this.targetHandle = null; - } - - }; - - - - class CameraAnimation extends EventDispatcher{ - - constructor(viewer){ - super(); - - this.viewer = viewer; - - this.selectedElement = null; - - this.controlPoints = []; - - this.uuid = THREE.Math.generateUUID(); - - this.node = new THREE.Object3D(); - this.node.name = "camera animation"; - this.viewer.scene.scene.add(this.node); - - this.frustum = this.createFrustum(); - this.node.add(this.frustum); - - this.name = "Camera Animation"; - this.duration = 5; - this.t = 0; - // "centripetal", "chordal", "catmullrom" - this.curveType = "centripetal"; - this.visible = true; - - this.createUpdateHook(); - this.createPath(); - } - - static defaultFromView(viewer){ - const animation = new CameraAnimation(viewer); - - const camera = viewer.scene.getActiveCamera(); - const target = viewer.scene.view.getPivot(); - - const cpCenter = new THREE.Vector3( - 0.3 * camera.position.x + 0.7 * target.x, - 0.3 * camera.position.y + 0.7 * target.y, - 0.3 * camera.position.z + 0.7 * target.z, - ); - - const targetCenter = new THREE.Vector3( - 0.05 * camera.position.x + 0.95 * target.x, - 0.05 * camera.position.y + 0.95 * target.y, - 0.05 * camera.position.z + 0.95 * target.z, - ); - - const r = camera.position.distanceTo(target) * 0.3; - - //const dir = target.clone().sub(camera.position).normalize(); - const angle = Utils.computeAzimuth(camera.position, target); - - const n = 5; - for(let i = 0; i < n; i++){ - let u = 1.5 * Math.PI * (i / n) + angle; - - const dx = r * Math.cos(u); - const dy = r * Math.sin(u); - - const cpPos = [ - cpCenter.x + dx, - cpCenter.y + dy, - cpCenter.z, - ]; - - const targetPos = [ - targetCenter.x + dx * 0.1, - targetCenter.y + dy * 0.1, - targetCenter.z, - ]; - - const cp = animation.createControlPoint(); - cp.position.set(...cpPos); - cp.target.set(...targetPos); - } - - return animation; - } - - createUpdateHook(){ - const viewer = this.viewer; - - viewer.addEventListener("update", () => { - - const camera = viewer.scene.getActiveCamera(); - const {width, height} = viewer.renderer.getSize(new THREE.Vector2()); - - this.node.visible = this.visible; - - for(const cp of this.controlPoints){ - - { // position - const projected = cp.position.clone().project(camera); - - const visible = this.visible && (projected.z < 1 && projected.z > -1); - - if(visible){ - const x = width * (projected.x * 0.5 + 0.5); - const y = height - height * (projected.y * 0.5 + 0.5); - - cp.positionHandle.svg.style.left = x - cp.positionHandle.svg.clientWidth / 2; - cp.positionHandle.svg.style.top = y - cp.positionHandle.svg.clientHeight / 2; - cp.positionHandle.svg.style.display = ""; - }else { - cp.positionHandle.svg.style.display = "none"; - } - } - - { // target - const projected = cp.target.clone().project(camera); - - const visible = this.visible && (projected.z < 1 && projected.z > -1); - - if(visible){ - const x = width * (projected.x * 0.5 + 0.5); - const y = height - height * (projected.y * 0.5 + 0.5); - - cp.targetHandle.svg.style.left = x - cp.targetHandle.svg.clientWidth / 2; - cp.targetHandle.svg.style.top = y - cp.targetHandle.svg.clientHeight / 2; - cp.targetHandle.svg.style.display = ""; - }else { - cp.targetHandle.svg.style.display = "none"; - } - } - - } - - this.line.material.resolution.set(width, height); - - this.updatePath(); - - { // frustum - const frame = this.at(this.t); - const frustum = this.frustum; - - frustum.position.copy(frame.position); - frustum.lookAt(...frame.target.toArray()); - frustum.scale.set(20, 20, 20); - - frustum.material.resolution.set(width, height); - } - - }); - } - - createControlPoint(index){ - - if(index === undefined){ - index = this.controlPoints.length; - } - - const cp = new ControlPoint(); - - - if(this.controlPoints.length >= 2 && index === 0){ - const cp1 = this.controlPoints[0]; - const cp2 = this.controlPoints[1]; - - const dir = cp1.position.clone().sub(cp2.position).multiplyScalar(0.5); - cp.position.copy(cp1.position).add(dir); - - const tDir = cp1.target.clone().sub(cp2.target).multiplyScalar(0.5); - cp.target.copy(cp1.target).add(tDir); - }else if(this.controlPoints.length >= 2 && index === this.controlPoints.length){ - const cp1 = this.controlPoints[this.controlPoints.length - 2]; - const cp2 = this.controlPoints[this.controlPoints.length - 1]; - - const dir = cp2.position.clone().sub(cp1.position).multiplyScalar(0.5); - cp.position.copy(cp1.position).add(dir); - - const tDir = cp2.target.clone().sub(cp1.target).multiplyScalar(0.5); - cp.target.copy(cp2.target).add(tDir); - }else if(this.controlPoints.length >= 2){ - const cp1 = this.controlPoints[index - 1]; - const cp2 = this.controlPoints[index]; - - cp.position.copy(cp1.position.clone().add(cp2.position).multiplyScalar(0.5)); - cp.target.copy(cp1.target.clone().add(cp2.target).multiplyScalar(0.5)); - } - - // cp.position.copy(viewer.scene.view.position); - // cp.target.copy(viewer.scene.view.getPivot()); - - cp.positionHandle = this.createHandle(cp.position); - cp.targetHandle = this.createHandle(cp.target); - - this.controlPoints.splice(index, 0, cp); - - this.dispatchEvent({ - type: "controlpoint_added", - controlpoint: cp, - }); - - return cp; - } - - removeControlPoint(cp){ - this.controlPoints = this.controlPoints.filter(_cp => _cp !== cp); - - this.dispatchEvent({ - type: "controlpoint_removed", - controlpoint: cp, - }); - - cp.positionHandle.svg.remove(); - cp.targetHandle.svg.remove(); - - // TODO destroy cp - } - - createPath(){ - - { // position - const geometry = new THREE.LineGeometry(); - - let material = new THREE.LineMaterial({ - color: 0x00ff00, - dashSize: 5, - gapSize: 2, - linewidth: 2, - resolution: new THREE.Vector2(1000, 1000), - }); - - const line = new THREE.Line2(geometry, material); - - this.line = line; - this.node.add(line); - } - - { // target - const geometry = new THREE.LineGeometry(); - - let material = new THREE.LineMaterial({ - color: 0x0000ff, - dashSize: 5, - gapSize: 2, - linewidth: 2, - resolution: new THREE.Vector2(1000, 1000), - }); - - const line = new THREE.Line2(geometry, material); - - this.targetLine = line; - this.node.add(line); - } - } - - createFrustum(){ - - const f = 0.3; - - const positions = [ - 0, 0, 0, - -f, -f, +1, - - 0, 0, 0, - f, -f, +1, - - 0, 0, 0, - f, f, +1, - - 0, 0, 0, - -f, f, +1, - - -f, -f, +1, - f, -f, +1, - - f, -f, +1, - f, f, +1, - - f, f, +1, - -f, f, +1, - - -f, f, +1, - -f, -f, +1, - ]; - - const geometry = new THREE.LineGeometry(); - - geometry.setPositions(positions); - geometry.verticesNeedUpdate = true; - geometry.computeBoundingSphere(); - - let material = new THREE.LineMaterial({ - color: 0xff0000, - linewidth: 2, - resolution: new THREE.Vector2(1000, 1000), - }); - - const line = new THREE.Line2(geometry, material); - line.computeLineDistances(); - - return line; - } - - updatePath(){ - - { // positions - const positions = this.controlPoints.map(cp => cp.position); - const first = positions[0]; - - const curve = new THREE.CatmullRomCurve3(positions); - curve.curveType = this.curveType; - - const n = 100; - - const curvePositions = []; - for(let k = 0; k <= n; k++){ - const t = k / n; - - const position = curve.getPoint(t).sub(first); - - curvePositions.push(position.x, position.y, position.z); - } - - this.line.geometry.setPositions(curvePositions); - this.line.geometry.verticesNeedUpdate = true; - this.line.geometry.computeBoundingSphere(); - this.line.position.copy(first); - this.line.computeLineDistances(); - - this.cameraCurve = curve; - } - - { // targets - const positions = this.controlPoints.map(cp => cp.target); - const first = positions[0]; - - const curve = new THREE.CatmullRomCurve3(positions); - curve.curveType = this.curveType; - - const n = 100; - - const curvePositions = []; - for(let k = 0; k <= n; k++){ - const t = k / n; - - const position = curve.getPoint(t).sub(first); - - curvePositions.push(position.x, position.y, position.z); - } - - this.targetLine.geometry.setPositions(curvePositions); - this.targetLine.geometry.verticesNeedUpdate = true; - this.targetLine.geometry.computeBoundingSphere(); - this.targetLine.position.copy(first); - this.targetLine.computeLineDistances(); - - this.targetCurve = curve; - } - } - - at(t){ - - if(t > 1){ - t = 1; - }else if(t < 0){ - t = 0; - } - - const camPos = this.cameraCurve.getPointAt(t); - const target = this.targetCurve.getPointAt(t); - - const frame = { - position: camPos, - target: target, - }; - - return frame; - } - - set(t){ - this.t = t; - } - - createHandle(vector){ - - const svgns = "http://www.w3.org/2000/svg"; - const svg = document.createElementNS(svgns, "svg"); - - svg.setAttribute("width", "2em"); - svg.setAttribute("height", "2em"); - svg.setAttribute("position", "absolute"); - - svg.style.left = "50px"; - svg.style.top = "50px"; - svg.style.position = "absolute"; - svg.style.zIndex = "10000"; - - const circle = document.createElementNS(svgns, 'circle'); - circle.setAttributeNS(null, 'cx', "1em"); - circle.setAttributeNS(null, 'cy', "1em"); - circle.setAttributeNS(null, 'r', "0.5em"); - circle.setAttributeNS(null, 'style', 'fill: red; stroke: black; stroke-width: 0.2em;' ); - svg.appendChild(circle); - - - const element = this.viewer.renderer.domElement.parentElement; - element.appendChild(svg); - - - const startDrag = (evt) => { - this.selectedElement = svg; - - document.addEventListener("mousemove", drag); - }; - - const endDrag = (evt) => { - this.selectedElement = null; - - document.removeEventListener("mousemove", drag); - }; - - const drag = (evt) => { - if (this.selectedElement) { - evt.preventDefault(); - - const rect = viewer.renderer.domElement.getBoundingClientRect(); - - const x = evt.clientX - rect.x; - const y = evt.clientY - rect.y; - - const {width, height} = this.viewer.renderer.getSize(new THREE.Vector2()); - const camera = this.viewer.scene.getActiveCamera(); - //const cp = this.controlPoints.find(cp => cp.handle.svg === svg); - const projected = vector.clone().project(camera); - - projected.x = ((x / width) - 0.5) / 0.5; - projected.y = (-(y - height) / height - 0.5) / 0.5; - - const unprojected = projected.clone().unproject(camera); - vector.set(unprojected.x, unprojected.y, unprojected.z); - - - } - }; - - svg.addEventListener('mousedown', startDrag); - svg.addEventListener('mouseup', endDrag); - - const handle = { - svg: svg, - }; - - return handle; - } - - setVisible(visible){ - this.node.visible = visible; - - const display = visible ? "" : "none"; - - for(const cp of this.controlPoints){ - cp.positionHandle.svg.style.display = display; - cp.targetHandle.svg.style.display = display; - } - - this.visible = visible; - } - - setDuration(duration){ - this.duration = duration; - } - - getDuration(duration){ - return this.duration; - } - - play(){ - - const tStart = performance.now(); - const duration = this.duration; - - const originalyVisible = this.visible; - this.setVisible(false); - - const onUpdate = (delta) => { - - let tNow = performance.now(); - let elapsed = (tNow - tStart) / 1000; - let t = elapsed / duration; - - this.set(t); - - const frame = this.at(t); - - viewer.scene.view.position.copy(frame.position); - viewer.scene.view.lookAt(frame.target); - - - if(t > 1){ - this.setVisible(originalyVisible); - - this.viewer.removeEventListener("update", onUpdate); - } - - }; - - this.viewer.addEventListener("update", onUpdate); - - } - + function SRGBToLinear( c ) { + + return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 ); + } - function loadPointCloud(viewer, data){ - - let loadMaterial = (target) => { - - if(data.material){ - - if(data.material.activeAttributeName != null){ - target.activeAttributeName = data.material.activeAttributeName; - } - - if(data.material.ranges != null){ - for(let range of data.material.ranges){ - - if(range.name === "elevationRange"){ - target.elevationRange = range.value; - }else if(range.name === "intensityRange"){ - target.intensityRange = range.value; - }else { - target.setRange(range.name, range.value); - } - - } - } - - if(data.material.size != null){ - target.size = data.material.size; - } - - if(data.material.minSize != null){ - target.minSize = data.material.minSize; - } - - if(data.material.pointSizeType != null){ - target.pointSizeType = PointSizeType[data.material.pointSizeType]; - } - - if(data.material.matcap != null){ - target.matcap = data.material.matcap; - } - - }else if(data.activeAttributeName != null){ - target.activeAttributeName = data.activeAttributeName; - }else { - // no material data - } - - }; - - const promise = new Promise((resolve) => { - - const names = viewer.scene.pointclouds.map(p => p.name); - const alreadyExists = names.includes(data.name); - - if(alreadyExists){ - resolve(); - return; - } - - Potree.loadPointCloud(data.url, data.name, (e) => { - const {pointcloud} = e; - - pointcloud.position.set(...data.position); - pointcloud.rotation.set(...data.rotation); - pointcloud.scale.set(...data.scale); - - loadMaterial(pointcloud.material); - - viewer.scene.addPointCloud(pointcloud); - - resolve(pointcloud); - }); - }); - - return promise; - } - - function loadMeasurement(viewer, data){ - - const duplicate = viewer.scene.measurements.find(measure => measure.uuid === data.uuid); - if(duplicate){ - return; - } - - const measure = new Measure(); - - measure.uuid = data.uuid; - measure.name = data.name; - measure.showDistances = data.showDistances; - measure.showCoordinates = data.showCoordinates; - measure.showArea = data.showArea; - measure.closed = data.closed; - measure.showAngles = data.showAngles; - measure.showHeight = data.showHeight; - measure.showCircle = data.showCircle; - measure.showAzimuth = data.showAzimuth; - measure.showEdges = data.showEdges; - // color - - for(const point of data.points){ - const pos = new THREE.Vector3(...point); - measure.addMarker(pos); - } - - viewer.scene.addMeasurement(measure); - - } - - function loadVolume(viewer, data){ - - const duplicate = viewer.scene.volumes.find(volume => volume.uuid === data.uuid); - if(duplicate){ - return; - } - - let volume = new Potree[data.type]; - - volume.uuid = data.uuid; - volume.name = data.name; - volume.position.set(...data.position); - volume.rotation.set(...data.rotation); - volume.scale.set(...data.scale); - volume.visible = data.visible; - volume.clip = data.clip; - - viewer.scene.addVolume(volume); - } - - function loadCameraAnimation(viewer, data){ - - const duplicate = viewer.scene.cameraAnimations.find(a => a.uuid === data.uuid); - if(duplicate){ - return; - } - - const animation = new CameraAnimation(viewer); - - animation.uuid = data.uuid; - animation.name = data.name; - animation.duration = data.duration; - animation.t = data.t; - animation.curveType = data.curveType; - animation.visible = data.visible; - animation.controlPoints = []; - - for(const cpdata of data.controlPoints){ - const cp = animation.createControlPoint(); - - cp.position.set(...cpdata.position); - cp.target.set(...cpdata.target); - } - - viewer.scene.addCameraAnimation(animation); - } - - function loadOrientedImages(viewer, images){ - - const {cameraParamsPath, imageParamsPath} = images; - - const duplicate = viewer.scene.orientedImages.find(i => i.imageParamsPath === imageParamsPath); - if(duplicate){ - return; - } - - Potree.OrientedImageLoader.load(cameraParamsPath, imageParamsPath, viewer).then( images => { - viewer.scene.addOrientedImages(images); - }); - - } - - function loadGeopackage(viewer, geopackage){ - - const path = geopackage.path; - - const duplicate = viewer.scene.geopackages.find(i => i.path === path); - if(duplicate){ - return; - } - - const projection = viewer.getProjection(); - - proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"); - proj4.defs("pointcloud", projection); - const transform = proj4("WGS84", "pointcloud"); - const params = { - transform: transform, - }; - - Potree.GeoPackageLoader.loadUrl(path, params).then(data => { - viewer.scene.addGeopackage(data); - }); - - - } - - function loadSettings(viewer, data){ - if(!data){ - return; - } - - viewer.setPointBudget(data.pointBudget); - viewer.setFOV(data.fov); - viewer.setEDLEnabled(data.edlEnabled); - viewer.setEDLRadius(data.edlRadius); - viewer.setEDLStrength(data.edlStrength); - viewer.setBackground(data.background); - viewer.setMinNodeSize(data.minNodeSize); - viewer.setShowBoundingBox(data.showBoundingBoxes); - } - - function loadView(viewer, view){ - viewer.scene.view.position.set(...view.position); - viewer.scene.view.lookAt(...view.target); - } - - function loadAnnotationItem(item){ - - const annotation = new Annotation({ - position: item.position, - title: item.title, - cameraPosition: item.cameraPosition, - cameraTarget: item.cameraTarget, - }); - - - annotation.description = item.description; - annotation.uuid = item.uuid; - - if(item.offset){ - annotation.offset.set(...item.offset); - } - - return annotation; - } - - function loadAnnotations(viewer, data){ - - if(!data){ - return; - } - - const findDuplicate = (item) => { - - let duplicate = null; - - viewer.scene.annotations.traverse( a => { - if(a.uuid === item.uuid){ - duplicate = a; - } - }); - - return duplicate; - }; - - const traverse = (item, parent) => { - - const duplicate = findDuplicate(item); - if(duplicate){ - return; - } - - const annotation = loadAnnotationItem(item); - - for(const childItem of item.children){ - traverse(childItem, annotation); - } - - parent.add(annotation); - - }; - - for(const item of data){ - traverse(item, viewer.scene.annotations); - } - - } - - function loadProfile(viewer, data){ - - const {name, points} = data; - - const duplicate = viewer.scene.profiles.find(profile => profile.uuid === data.uuid); - if(duplicate){ - return; - } - - let profile = new Potree.Profile(); - profile.name = name; - profile.uuid = data.uuid; - - profile.setWidth(data.width); - - for(const point of points){ - profile.addMarker(new THREE.Vector3(...point)); - } - - viewer.scene.addProfile(profile); - } - - function loadClassification(viewer, data){ - if(!data){ - return; - } - - const classifications = data; - - viewer.setClassifications(classifications); - } - - async function loadProject(viewer, data){ - - if(data.type !== "Potree"){ - console.error("not a valid Potree project"); - return; - } - - loadSettings(viewer, data.settings); - - loadView(viewer, data.view); - - const pointcloudPromises = []; - for(const pointcloud of data.pointclouds){ - const promise = loadPointCloud(viewer, pointcloud); - pointcloudPromises.push(promise); - } - - for(const measure of data.measurements){ - loadMeasurement(viewer, measure); - } - - for(const volume of data.volumes){ - loadVolume(viewer, volume); - } - - for(const animation of data.cameraAnimations){ - loadCameraAnimation(viewer, animation); - } - - for(const profile of data.profiles){ - loadProfile(viewer, profile); - } - - if(data.orientedImages){ - for(const images of data.orientedImages){ - loadOrientedImages(viewer, images); - } - } - - loadAnnotations(viewer, data.annotations); - - loadClassification(viewer, data.classification); - - // need to load at least one point cloud that defines the scene projection, - // before we can load stuff in other projections such as geopackages - //await Promise.any(pointcloudPromises); // (not yet supported) - Utils.waitAny(pointcloudPromises).then( () => { - if(data.geopackages){ - for(const geopackage of data.geopackages){ - loadGeopackage(viewer, geopackage); - } - } - }); - - await Promise.all(pointcloudPromises); + function LinearToSRGB( c ) { + + return ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055; + } - // - // Algorithm by Christian Boucheny - // shader code taken and adapted from CloudCompare - // - // see - // https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL - // http://www.kitware.com/source/home/post/9 - // https://tel.archives-ouvertes.fr/tel-00438464/document p. 115+ (french) + class Color { - class EyeDomeLightingMaterial extends THREE.RawShaderMaterial{ + constructor( r, g, b ) { - constructor(parameters = {}){ - super(); + Object.defineProperty( this, 'isColor', { value: true } ); - let uniforms = { - screenWidth: { type: 'f', value: 0 }, - screenHeight: { type: 'f', value: 0 }, - edlStrength: { type: 'f', value: 1.0 }, - uNear: { type: 'f', value: 1.0 }, - uFar: { type: 'f', value: 1.0 }, - radius: { type: 'f', value: 1.0 }, - neighbours: { type: '2fv', value: [] }, - depthMap: { type: 't', value: null }, - uEDLColor: { type: 't', value: null }, - uEDLDepth: { type: 't', value: null }, - opacity: { type: 'f', value: 1.0 }, - uProj: { type: "Matrix4fv", value: [] }, - }; - - this.setValues({ - uniforms: uniforms, - vertexShader: this.getDefines() + Shaders['edl.vs'], - fragmentShader: this.getDefines() + Shaders['edl.fs'], - lights: false - }); + if ( g === undefined && b === undefined ) { - this.neighbourCount = 8; - } + // r is THREE.Color, hex or string + return this.set( r ); - getDefines() { - let defines = ''; + } - defines += '#define NEIGHBOUR_COUNT ' + this.neighbourCount + '\n'; + return this.setRGB( r, g, b ); - return defines; } - updateShaderSource() { + set( value ) { - let vs = this.getDefines() + Shaders['edl.vs']; - let fs = this.getDefines() + Shaders['edl.fs']; + if ( value && value.isColor ) { - this.setValues({ - vertexShader: vs, - fragmentShader: fs - }); + this.copy( value ); - this.uniforms.neighbours.value = this.neighbours; + } else if ( typeof value === 'number' ) { - this.needsUpdate = true; - } + this.setHex( value ); - get neighbourCount(){ - return this._neighbourCount; - } + } else if ( typeof value === 'string' ) { - set neighbourCount(value){ - if (this._neighbourCount !== value) { - this._neighbourCount = value; - this.neighbours = new Float32Array(this._neighbourCount * 2); - for (let c = 0; c < this._neighbourCount; c++) { - this.neighbours[2 * c + 0] = Math.cos(2 * c * Math.PI / this._neighbourCount); - this.neighbours[2 * c + 1] = Math.sin(2 * c * Math.PI / this._neighbourCount); - } + this.setStyle( value ); - this.updateShaderSource(); } + + return this; + } - - } + setScalar( scalar ) { - class NormalizationEDLMaterial extends THREE.RawShaderMaterial{ + this.r = scalar; + this.g = scalar; + this.b = scalar; - constructor(parameters = {}){ - super(); + return this; - let uniforms = { - screenWidth: { type: 'f', value: 0 }, - screenHeight: { type: 'f', value: 0 }, - edlStrength: { type: 'f', value: 1.0 }, - radius: { type: 'f', value: 1.0 }, - neighbours: { type: '2fv', value: [] }, - uEDLMap: { type: 't', value: null }, - uDepthMap: { type: 't', value: null }, - uWeightMap: { type: 't', value: null }, - }; + } - this.setValues({ - uniforms: uniforms, - vertexShader: this.getDefines() + Shaders['normalize.vs'], - fragmentShader: this.getDefines() + Shaders['normalize_and_edl.fs'], - }); + setHex( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; - this.neighbourCount = 8; } - getDefines() { - let defines = ''; + setRGB( r, g, b ) { - defines += '#define NEIGHBOUR_COUNT ' + this.neighbourCount + '\n'; + this.r = r; + this.g = g; + this.b = b; + + return this; - return defines; } - updateShaderSource() { + setHSL( h, s, l ) { - let vs = this.getDefines() + Shaders['normalize.vs']; - let fs = this.getDefines() + Shaders['normalize_and_edl.fs']; + // h,s,l ranges are in 0.0 - 1.0 + h = MathUtils.euclideanModulo( h, 1 ); + s = MathUtils.clamp( s, 0, 1 ); + l = MathUtils.clamp( l, 0, 1 ); - this.setValues({ - vertexShader: vs, - fragmentShader: fs - }); + if ( s === 0 ) { - this.uniforms.neighbours.value = this.neighbours; + this.r = this.g = this.b = l; - this.needsUpdate = true; - } + } else { - get neighbourCount(){ - return this._neighbourCount; - } + const p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + const q = ( 2 * l ) - p; - set neighbourCount(value){ - if (this._neighbourCount !== value) { - this._neighbourCount = value; - this.neighbours = new Float32Array(this._neighbourCount * 2); - for (let c = 0; c < this._neighbourCount; c++) { - this.neighbours[2 * c + 0] = Math.cos(2 * c * Math.PI / this._neighbourCount); - this.neighbours[2 * c + 1] = Math.sin(2 * c * Math.PI / this._neighbourCount); - } + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); - this.updateShaderSource(); } + + return this; + } - - } - class NormalizationMaterial extends THREE.RawShaderMaterial{ + setStyle( style ) { - constructor(parameters = {}){ - super(); + function handleAlpha( string ) { - let uniforms = { - uDepthMap: { type: 't', value: null }, - uWeightMap: { type: 't', value: null }, - }; + if ( string === undefined ) return; - this.setValues({ - uniforms: uniforms, - vertexShader: this.getDefines() + Shaders['normalize.vs'], - fragmentShader: this.getDefines() + Shaders['normalize.fs'], - }); - } + if ( parseFloat( string ) < 1 ) { - getDefines() { - let defines = ''; + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); - return defines; - } + } - updateShaderSource() { + } - let vs = this.getDefines() + Shaders['normalize.vs']; - let fs = this.getDefines() + Shaders['normalize.fs']; - this.setValues({ - vertexShader: vs, - fragmentShader: fs - }); + let m; - this.needsUpdate = true; - } + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { - } + // rgb / hsl - /** - * laslaz code taken and adapted from plas.io js-laslaz - * http://plas.io/ - * https://github.com/verma/plasio - * - * Thanks to Uday Verma and Howard Butler - * - */ + let color; + const name = m[ 1 ]; + const components = m[ 2 ]; - class LasLazLoader { + switch ( name ) { - constructor (version, extension) { - if (typeof (version) === 'string') { - this.version = new Version(version); - } else { - this.version = version; - } + case 'rgb': + case 'rgba': - this.extension = extension; - } + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { - static progressCB () { + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; - } + handleAlpha( color[ 4 ] ); - load (node) { - if (node.loaded) { - return; - } + return this; - let url = node.getURL(); + } - if (this.version.equalOrHigher('1.4')) { - url += `.${this.extension}`; - } + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { - let xhr = XHRFactory.createXMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - xhr.onreadystatechange = () => { - if (xhr.readyState === 4) { - if (xhr.status === 200 || xhr.status === 0) { - let buffer = xhr.response; - this.parse(node, buffer); - } else { - console.log('Failed to load file! HTTP status: ' + xhr.status + ', file: ' + url); - } - } - }; + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; - xhr.send(null); - } + handleAlpha( color[ 4 ] ); - async parse(node, buffer){ - let lf = new LASFile(buffer); - let handler = new LasLazBatcher(node); + return this; - try{ - await lf.open(); - lf.isOpen = true; - }catch(e){ - console.log("failed to open file. :("); + } - return; - } + break; - let header = await lf.getHeader(); + case 'hsl': + case 'hsla': - let skip = 1; - let totalRead = 0; - let totalToRead = (skip <= 1 ? header.pointsCount : header.pointsCount / skip); + if ( color = /^(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { - let hasMoreData = true; + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + const h = parseFloat( color[ 1 ] ) / 360; + const s = parseInt( color[ 2 ], 10 ) / 100; + const l = parseInt( color[ 3 ], 10 ) / 100; - while(hasMoreData){ - let data = await lf.readData(1000 * 1000, 0, skip); + handleAlpha( color[ 4 ] ); - handler.push(new LASDecoder(data.buffer, - header.pointsFormatId, - header.pointsStructSize, - data.count, - header.scale, - header.offset, - header.mins, header.maxs)); + return this.setHSL( h, s, l ); - totalRead += data.count; - LasLazLoader.progressCB(totalRead / totalToRead); + } - hasMoreData = data.hasMoreData; - } + break; - header.totalRead = totalRead; - header.versionAsString = lf.versionAsString; - header.isCompressed = lf.isCompressed; + } - LasLazLoader.progressCB(1); + } else if ( m = /^\#([A-Fa-f\d]+)$/.exec( style ) ) { - try{ - await lf.close(); + // hex color - lf.isOpen = false; - }catch(e){ - console.error("failed to close las/laz file!!!"); - - throw e; - } - } + const hex = m[ 1 ]; + const size = hex.length; - handle (node, url) { + if ( size === 3 ) { - } - }; + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; - class LasLazBatcher{ + return this; - constructor (node) { - this.node = node; - } + } else if ( size === 6 ) { - push (lasBuffer) { - const workerPath = Potree.scriptPath + '/workers/LASDecoderWorker.js'; - const worker = Potree.workerPool.getWorker(workerPath); - const node = this.node; - const pointAttributes = node.pcoGeometry.pointAttributes; + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; - worker.onmessage = (e) => { - let geometry = new THREE.BufferGeometry(); - let numPoints = lasBuffer.pointsCount; + return this; - let positions = new Float32Array(e.data.position); - let colors = new Uint8Array(e.data.color); - let intensities = new Float32Array(e.data.intensity); - let classifications = new Uint8Array(e.data.classification); - let returnNumbers = new Uint8Array(e.data.returnNumber); - let numberOfReturns = new Uint8Array(e.data.numberOfReturns); - let pointSourceIDs = new Uint16Array(e.data.pointSourceID); - let indices = new Uint8Array(e.data.indices); + } - geometry.addAttribute('position', new THREE.BufferAttribute(positions, 3)); - geometry.addAttribute('color', new THREE.BufferAttribute(colors, 4, true)); - geometry.addAttribute('intensity', new THREE.BufferAttribute(intensities, 1)); - geometry.addAttribute('classification', new THREE.BufferAttribute(classifications, 1)); - geometry.addAttribute('return number', new THREE.BufferAttribute(returnNumbers, 1)); - geometry.addAttribute('number of returns', new THREE.BufferAttribute(numberOfReturns, 1)); - geometry.addAttribute('source id', new THREE.BufferAttribute(pointSourceIDs, 1)); - geometry.addAttribute('indices', new THREE.BufferAttribute(indices, 4)); - geometry.attributes.indices.normalized = true; + } - for(const key in e.data.ranges){ - const range = e.data.ranges[key]; + if ( style && style.length > 0 ) { - const attribute = pointAttributes.attributes.find(a => a.name === key); - attribute.range[0] = Math.min(attribute.range[0], range[0]); - attribute.range[1] = Math.max(attribute.range[1], range[1]); - } + return this.setColorName( style ); - let tightBoundingBox = new THREE.Box3( - new THREE.Vector3().fromArray(e.data.tightBoundingBox.min), - new THREE.Vector3().fromArray(e.data.tightBoundingBox.max) - ); + } - geometry.boundingBox = this.node.boundingBox; - this.node.tightBoundingBox = tightBoundingBox; + return this; - this.node.geometry = geometry; - this.node.numPoints = numPoints; - this.node.loaded = true; - this.node.loading = false; - Potree.numNodesLoading--; - this.node.mean = new THREE.Vector3(...e.data.mean); + } - Potree.workerPool.returnWorker(workerPath, worker); - }; + setColorName( style ) { - let message = { - buffer: lasBuffer.arrayb, - numPoints: lasBuffer.pointsCount, - pointSize: lasBuffer.pointSize, - pointFormatID: 2, - scale: lasBuffer.scale, - offset: lasBuffer.offset, - mins: lasBuffer.mins, - maxs: lasBuffer.maxs - }; - worker.postMessage(message, [message.buffer]); - }; - } + // color keywords + const hex = _colorKeywords[ style ]; - class BinaryLoader{ + if ( hex !== undefined ) { + + // red + this.setHex( hex ); - constructor(version, boundingBox, scale){ - if (typeof (version) === 'string') { - this.version = new Version(version); } else { - this.version = version; + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + } - this.boundingBox = boundingBox; - this.scale = scale; + return this; + } - load(node){ - if (node.loaded) { - return; - } + clone() { - let url = node.getURL(); + return new this.constructor( this.r, this.g, this.b ); - if (this.version.equalOrHigher('1.4')) { - url += '.bin'; - } + } - let xhr = XHRFactory.createXMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - xhr.onreadystatechange = () => { - if (xhr.readyState === 4) { - if((xhr.status === 200 || xhr.status === 0) && xhr.response !== null){ - let buffer = xhr.response; - this.parse(node, buffer); - } else { - //console.error(`Failed to load file! HTTP status: ${xhr.status}, file: ${url}`); - throw new Error(`Failed to load file! HTTP status: ${xhr.status}, file: ${url}`); - } - } - }; - - try { - xhr.send(null); - } catch (e) { - console.log('fehler beim laden der punktwolke: ' + e); - } - }; + copy( color ) { - parse(node, buffer){ - let pointAttributes = node.pcoGeometry.pointAttributes; - let numPoints = buffer.byteLength / node.pcoGeometry.pointAttributes.byteSize; + this.r = color.r; + this.g = color.g; + this.b = color.b; - if (this.version.upTo('1.5')) { - node.numPoints = numPoints; - } + return this; - let workerPath = Potree.scriptPath + '/workers/BinaryDecoderWorker.js'; - let worker = Potree.workerPool.getWorker(workerPath); + } - worker.onmessage = function (e) { + copyGammaToLinear( color, gammaFactor = 2.0 ) { - let data = e.data; - let buffers = data.attributeBuffers; - let tightBoundingBox = new THREE.Box3( - new THREE.Vector3().fromArray(data.tightBoundingBox.min), - new THREE.Vector3().fromArray(data.tightBoundingBox.max) - ); + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); - Potree.workerPool.returnWorker(workerPath, worker); + return this; - let geometry = new THREE.BufferGeometry(); + } - for(let property in buffers){ - let buffer = buffers[property].buffer; - let batchAttribute = buffers[property].attribute; + copyLinearToGamma( color, gammaFactor = 2.0 ) { - if (property === "POSITION_CARTESIAN") { - geometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(buffer), 3)); - } else if (property === "rgba") { - geometry.addAttribute("rgba", new THREE.BufferAttribute(new Uint8Array(buffer), 4, true)); - } else if (property === "NORMAL_SPHEREMAPPED") { - geometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3)); - } else if (property === "NORMAL_OCT16") { - geometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3)); - } else if (property === "NORMAL") { - geometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3)); - } else if (property === "INDICES") { - let bufferAttribute = new THREE.BufferAttribute(new Uint8Array(buffer), 4); - bufferAttribute.normalized = true; - geometry.addAttribute('indices', bufferAttribute); - } else if (property === "SPACING") { - let bufferAttribute = new THREE.BufferAttribute(new Float32Array(buffer), 1); - geometry.addAttribute('spacing', bufferAttribute); - } else { - const bufferAttribute = new THREE.BufferAttribute(new Float32Array(buffer), 1); + const safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; - bufferAttribute.potree = { - offset: buffers[property].offset, - scale: buffers[property].scale, - preciseBuffer: buffers[property].preciseBuffer, - range: batchAttribute.range, - }; + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); - geometry.addAttribute(property, bufferAttribute); + return this; - const attribute = pointAttributes.attributes.find(a => a.name === batchAttribute.name); - attribute.range[0] = Math.min(attribute.range[0], batchAttribute.range[0]); - attribute.range[1] = Math.max(attribute.range[1], batchAttribute.range[1]); + } - if(node.getLevel() === 0){ - attribute.initialRange = batchAttribute.range; - } + convertGammaToLinear( gammaFactor ) { - } - } + this.copyGammaToLinear( this, gammaFactor ); - tightBoundingBox.max.sub(tightBoundingBox.min); - tightBoundingBox.min.set(0, 0, 0); + return this; - let numPoints = e.data.buffer.byteLength / pointAttributes.byteSize; - - node.numPoints = numPoints; - node.geometry = geometry; - node.mean = new THREE.Vector3(...data.mean); - node.tightBoundingBox = tightBoundingBox; - node.loaded = true; - node.loading = false; - node.estimatedSpacing = data.estimatedSpacing; - Potree.numNodesLoading--; - }; + } - let message = { - buffer: buffer, - pointAttributes: pointAttributes, - version: this.version.version, - min: [ node.boundingBox.min.x, node.boundingBox.min.y, node.boundingBox.min.z ], - offset: [node.pcoGeometry.offset.x, node.pcoGeometry.offset.y, node.pcoGeometry.offset.z], - scale: this.scale, - spacing: node.spacing, - hasChildren: node.hasChildren, - name: node.name - }; - worker.postMessage(message, [message.buffer]); - }; + convertLinearToGamma( gammaFactor ) { - - } + this.copyLinearToGamma( this, gammaFactor ); - function parseAttributes(cloudjs){ + return this; - let version = new Version(cloudjs.version); + } - const replacements = { - "COLOR_PACKED": "rgba", - "RGBA": "rgba", - "INTENSITY": "intensity", - "CLASSIFICATION": "classification", - }; + copySRGBToLinear( color ) { - const replaceOldNames = (old) => { - if(replacements[old]){ - return replacements[old]; - }else { - return old; - } - }; + this.r = SRGBToLinear( color.r ); + this.g = SRGBToLinear( color.g ); + this.b = SRGBToLinear( color.b ); - const pointAttributes = []; - if(version.upTo('1.7')){ - - for(let attributeName of cloudjs.pointAttributes){ - const oldAttribute = PointAttribute[attributeName]; + return this; - const attribute = { - name: oldAttribute.name, - size: oldAttribute.byteSize, - elements: oldAttribute.numElements, - elementSize: oldAttribute.byteSize / oldAttribute.numElements, - type: oldAttribute.type.name, - description: "", - }; + } - pointAttributes.push(attribute); - } + copyLinearToSRGB( color ) { + + this.r = LinearToSRGB( color.r ); + this.g = LinearToSRGB( color.g ); + this.b = LinearToSRGB( color.b ); + + return this; - }else { - pointAttributes.push(...cloudjs.pointAttributes); } + convertSRGBToLinear() { - { - const attributes = new PointAttributes(); + this.copySRGBToLinear( this ); - const typeConversion = { - int8: PointAttributeTypes.DATA_TYPE_INT8, - int16: PointAttributeTypes.DATA_TYPE_INT16, - int32: PointAttributeTypes.DATA_TYPE_INT32, - int64: PointAttributeTypes.DATA_TYPE_INT64, - uint8: PointAttributeTypes.DATA_TYPE_UINT8, - uint16: PointAttributeTypes.DATA_TYPE_UINT16, - uint32: PointAttributeTypes.DATA_TYPE_UINT32, - uint64: PointAttributeTypes.DATA_TYPE_UINT64, - double: PointAttributeTypes.DATA_TYPE_DOUBLE, - float: PointAttributeTypes.DATA_TYPE_FLOAT, - }; + return this; - for(const jsAttribute of pointAttributes){ - const name = replaceOldNames(jsAttribute.name); - const type = typeConversion[jsAttribute.type]; - const numElements = jsAttribute.elements; - const description = jsAttribute.description; + } - const attribute = new PointAttribute(name, type, numElements); + convertLinearToSRGB() { - attributes.add(attribute); - } + this.copyLinearToSRGB( this ); - { - // check if it has normals - let hasNormals = - pointAttributes.find(a => a.name === "NormalX") !== undefined && - pointAttributes.find(a => a.name === "NormalY") !== undefined && - pointAttributes.find(a => a.name === "NormalZ") !== undefined; + return this; - if(hasNormals){ - let vector = { - name: "NORMAL", - attributes: ["NormalX", "NormalY", "NormalZ"], - }; - attributes.addVector(vector); - } - } + } + + getHex() { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; - return attributes; } - } + getHexString() { - function lasLazAttributes(fMno){ - const attributes = new PointAttributes(); + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); - attributes.add(PointAttribute.POSITION_CARTESIAN); - attributes.add(new PointAttribute("rgba", PointAttributeTypes.DATA_TYPE_UINT8, 4)); - attributes.add(new PointAttribute("intensity", PointAttributeTypes.DATA_TYPE_UINT16, 1)); - attributes.add(new PointAttribute("classification", PointAttributeTypes.DATA_TYPE_UINT8, 1)); - attributes.add(new PointAttribute("gps-time", PointAttributeTypes.DATA_TYPE_DOUBLE, 1)); - attributes.add(new PointAttribute("number of returns", PointAttributeTypes.DATA_TYPE_UINT8, 1)); - attributes.add(new PointAttribute("return number", PointAttributeTypes.DATA_TYPE_UINT8, 1)); - attributes.add(new PointAttribute("source id", PointAttributeTypes.DATA_TYPE_UINT16, 1)); - //attributes.add(new PointAttribute("pointSourceID", PointAttributeTypes.DATA_TYPE_INT8, 4)); + } + getHSL( target ) { - return attributes; - } + // h,s,l ranges are in 0.0 - 1.0 - class POCLoader { + if ( target === undefined ) { - static load(url, callback){ - try { - let pco = new PointCloudOctreeGeometry(); - pco.url = url; - let xhr = XHRFactory.createXMLHttpRequest(); - xhr.open('GET', url, true); + console.warn( 'THREE.Color: .getHSL() target is now required' ); + target = { h: 0, s: 0, l: 0 }; - xhr.onreadystatechange = function () { - if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 0)) { - let fMno = JSON.parse(xhr.responseText); + } - let version = new Version(fMno.version); + const r = this.r, g = this.g, b = this.b; - // assume octreeDir is absolute if it starts with http - if (fMno.octreeDir.indexOf('http') === 0) { - pco.octreeDir = fMno.octreeDir; - } else { - pco.octreeDir = url + '/../' + fMno.octreeDir; - } + const max = Math.max( r, g, b ); + const min = Math.min( r, g, b ); - pco.spacing = fMno.spacing; - pco.hierarchyStepSize = fMno.hierarchyStepSize; + let hue, saturation; + const lightness = ( min + max ) / 2.0; - pco.pointAttributes = fMno.pointAttributes; + if ( min === max ) { - let min = new THREE.Vector3(fMno.boundingBox.lx, fMno.boundingBox.ly, fMno.boundingBox.lz); - let max = new THREE.Vector3(fMno.boundingBox.ux, fMno.boundingBox.uy, fMno.boundingBox.uz); - let boundingBox = new THREE.Box3(min, max); - let tightBoundingBox = boundingBox.clone(); + hue = 0; + saturation = 0; - if (fMno.tightBoundingBox) { - tightBoundingBox.min.copy(new THREE.Vector3(fMno.tightBoundingBox.lx, fMno.tightBoundingBox.ly, fMno.tightBoundingBox.lz)); - tightBoundingBox.max.copy(new THREE.Vector3(fMno.tightBoundingBox.ux, fMno.tightBoundingBox.uy, fMno.tightBoundingBox.uz)); - } + } else { - let offset = min.clone(); + const delta = max - min; - boundingBox.min.sub(offset); - boundingBox.max.sub(offset); + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); - tightBoundingBox.min.sub(offset); - tightBoundingBox.max.sub(offset); + switch ( max ) { - pco.projection = fMno.projection; - pco.boundingBox = boundingBox; - pco.tightBoundingBox = tightBoundingBox; - pco.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere()); - pco.tightBoundingSphere = tightBoundingBox.getBoundingSphere(new THREE.Sphere()); - pco.offset = offset; - if (fMno.pointAttributes === 'LAS') { - pco.loader = new LasLazLoader(fMno.version, "las"); - pco.pointAttributes = lasLazAttributes(fMno); - } else if (fMno.pointAttributes === 'LAZ') { - pco.loader = new LasLazLoader(fMno.version, "laz"); - pco.pointAttributes = lasLazAttributes(fMno); - } else { - pco.loader = new BinaryLoader(fMno.version, boundingBox, fMno.scale); - pco.pointAttributes = parseAttributes(fMno); - } + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; - let nodes = {}; + } - { // load root - let name = 'r'; + hue /= 6; - let root = new PointCloudOctreeGeometryNode(name, pco, boundingBox); - root.level = 0; - root.hasChildren = true; - root.spacing = pco.spacing; - if (version.upTo('1.5')) { - root.numPoints = fMno.hierarchy[0][1]; - } else { - root.numPoints = 0; - } - pco.root = root; - pco.root.load(); - nodes[name] = root; - } + } - // load remaining hierarchy - if (version.upTo('1.4')) { - for (let i = 1; i < fMno.hierarchy.length; i++) { - let name = fMno.hierarchy[i][0]; - let numPoints = fMno.hierarchy[i][1]; - let index = parseInt(name.charAt(name.length - 1)); - let parentName = name.substring(0, name.length - 1); - let parentNode = nodes[parentName]; - let level = name.length - 1; - //let boundingBox = POCLoader.createChildAABB(parentNode.boundingBox, index); - let boundingBox = Utils.createChildAABB(parentNode.boundingBox, index); + target.h = hue; + target.s = saturation; + target.l = lightness; - let node = new PointCloudOctreeGeometryNode(name, pco, boundingBox); - node.level = level; - node.numPoints = numPoints; - node.spacing = pco.spacing / Math.pow(2, level); - parentNode.addChild(node); - nodes[name] = node; - } - } + return target; - pco.nodes = nodes; + } - callback(pco); - } - }; + getStyle() { - xhr.send(null); - } catch (e) { - console.log("loading failed: '" + url + "'"); - console.log(e); + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; - callback(); - } } - loadPointAttributes(mno){ - let fpa = mno.pointAttributes; - let pa = new PointAttributes(); + offsetHSL( h, s, l ) { - for (let i = 0; i < fpa.length; i++) { - let pointAttribute = PointAttribute[fpa[i]]; - pa.add(pointAttribute); - } + this.getHSL( _hslA ); - return pa; - } + _hslA.h += h; _hslA.s += s; _hslA.l += l; - createChildAABB(aabb, index){ - let min = aabb.min.clone(); - let max = aabb.max.clone(); - let size = new THREE.Vector3().subVectors(max, min); + this.setHSL( _hslA.h, _hslA.s, _hslA.l ); - if ((index & 0b0001) > 0) { - min.z += size.z / 2; - } else { - max.z -= size.z / 2; - } + return this; - if ((index & 0b0010) > 0) { - min.y += size.y / 2; - } else { - max.y -= size.y / 2; - } + } - if ((index & 0b0100) > 0) { - min.x += size.x / 2; - } else { - max.x -= size.x / 2; - } + add( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; - return new THREE.Box3(min, max); } - } - class OctreeGeometry{ - - constructor(){ - this.url = null; - this.spacing = 0; - this.boundingBox = null; - this.root = null; - this.pointAttributes = null; - this.loader = null; - } - - }; - - class OctreeGeometryNode{ - - constructor(name, octreeGeometry, boundingBox){ - this.id = OctreeGeometryNode.IDCount++; - this.name = name; - this.index = parseInt(name.charAt(name.length - 1)); - this.octreeGeometry = octreeGeometry; - this.boundingBox = boundingBox; - this.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere()); - this.children = {}; - this.numPoints = 0; - this.level = null; - this.oneTimeDisposeHandlers = []; - } - - isGeometryNode(){ - return true; - } - - getLevel(){ - return this.level; - } - - isTreeNode(){ - return false; - } - - isLoaded(){ - return this.loaded; - } - - getBoundingSphere(){ - return this.boundingSphere; - } - - getBoundingBox(){ - return this.boundingBox; - } - - getChildren(){ - let children = []; - - for (let i = 0; i < 8; i++) { - if (this.children[i]) { - children.push(this.children[i]); - } - } - - return children; - } - - getBoundingBox(){ - return this.boundingBox; - } - - load(){ - - if (Potree.numNodesLoading >= Potree.maxNodesLoading) { - return; - } - - this.octreeGeometry.loader.load(this); - } - - getNumPoints(){ - return this.numPoints; - } - - dispose(){ - if (this.geometry && this.parent != null) { - this.geometry.dispose(); - this.geometry = null; - this.loaded = false; - - // this.dispatchEvent( { type: 'dispose' } ); - for (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) { - let handler = this.oneTimeDisposeHandlers[i]; - handler(); - } - this.oneTimeDisposeHandlers = []; - } - } - - }; - - OctreeGeometryNode.IDCount = 0; + addColors( color1, color2 ) { - class NodeLoader{ + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; - constructor(url){ - this.url = url; - } + return this; - async load(node){ + } - if(node.loaded || node.loading){ - return; - } + addScalar( s ) { - node.loading = true; - Potree.numNodesLoading++; + this.r += s; + this.g += s; + this.b += s; - if(node.nodeType === 2){ - await this.loadHierarchy(node); - } + return this; - let {byteOffset, byteSize} = node; + } - try{ + sub( color ) { - let urlOctree = `${this.url}/../octree.bin`; + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); - let first = byteOffset; - let last = byteOffset + byteSize - 1n; + return this; - let response = await fetch(urlOctree, { - headers: { - 'content-type': 'multipart/byteranges', - 'Range': `bytes=${first}-${last}`, - }, - }); + } - let buffer = await response.arrayBuffer(); + multiply( color ) { - let workerPath = Potree.scriptPath + '/workers/OctreeDecoderWorker.js'; - let worker = Potree.workerPool.getWorker(workerPath); + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; - worker.onmessage = function (e) { + return this; - let data = e.data; - let buffers = data.attributeBuffers; + } - Potree.workerPool.returnWorker(workerPath, worker); + multiplyScalar( s ) { - let geometry = new THREE.BufferGeometry(); - - for(let property in buffers){ + this.r *= s; + this.g *= s; + this.b *= s; - let buffer = buffers[property].buffer; + return this; - if(property === "position"){ - geometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(buffer), 3)); - }else if(property === "rgba"){ - geometry.addAttribute('rgba', new THREE.BufferAttribute(new Uint8Array(buffer), 4, true)); - }else if(property === "NORMAL"){ - //geometry.addAttribute('rgba', new THREE.BufferAttribute(new Uint8Array(buffer), 4, true)); - geometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3)); - }else if (property === "INDICES") { - let bufferAttribute = new THREE.BufferAttribute(new Uint8Array(buffer), 4); - bufferAttribute.normalized = true; - geometry.addAttribute('indices', bufferAttribute); - }else { - const bufferAttribute = new THREE.BufferAttribute(new Float32Array(buffer), 1); + } - let batchAttribute = buffers[property].attribute; - bufferAttribute.potree = { - offset: buffers[property].offset, - scale: buffers[property].scale, - preciseBuffer: buffers[property].preciseBuffer, - range: batchAttribute.range, - }; + lerp( color, alpha ) { - geometry.addAttribute(property, bufferAttribute); - } + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; - } - // indices ?? + return this; - node.density = data.density; - node.geometry = geometry; - node.loaded = true; - node.loading = false; - Potree.numNodesLoading--; - }; + } - let pointAttributes = node.octreeGeometry.pointAttributes; - let scale = node.octreeGeometry.scale; + lerpHSL( color, alpha ) { - let box = node.boundingBox; - let min = node.octreeGeometry.offset.clone().add(box.min); - let size = box.max.clone().sub(box.min); - let max = min.clone().add(size); + this.getHSL( _hslA ); + color.getHSL( _hslB ); - let offset = node.octreeGeometry.loader.offset; + const h = MathUtils.lerp( _hslA.h, _hslB.h, alpha ); + const s = MathUtils.lerp( _hslA.s, _hslB.s, alpha ); + const l = MathUtils.lerp( _hslA.l, _hslB.l, alpha ); - let message = { - name: node.name, - buffer: buffer, - pointAttributes: pointAttributes, - scale: scale, - min: min, - max: max, - size: size, - offset: offset, - }; + this.setHSL( h, s, l ); - worker.postMessage(message, [message.buffer]); - }catch(e){ - node.loaded = false; - node.loading = false; - Potree.numNodesLoading--; + return this; - console.log(`failed to load ${node.name}`); - console.log(e); - console.log(`trying again!`); - } } - parseHierarchy(node, buffer){ + equals( c ) { - let view = new DataView(buffer); - let tStart = performance.now(); + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); - let bytesPerNode = 22; - let numNodes = buffer.byteLength / bytesPerNode; + } - let octree = node.octreeGeometry; - // let nodes = [node]; - let nodes = new Array(numNodes); - nodes[0] = node; - let nodePos = 1; + fromArray( array, offset = 0 ) { - for(let i = 0; i < numNodes; i++){ - let current = nodes[i]; + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; - let type = view.getUint8(i * bytesPerNode + 0); - let childMask = view.getUint8(i * bytesPerNode + 1); - let numPoints = view.getUint32(i * bytesPerNode + 2, true); - let byteOffset = view.getBigInt64(i * bytesPerNode + 6, true); - let byteSize = view.getBigInt64(i * bytesPerNode + 14, true); + return this; + } - if(current.nodeType === 2){ - // replace proxy with real node - current.byteOffset = byteOffset; - current.byteSize = byteSize; - current.numPoints = numPoints; - }else if(type === 2){ - // load proxy - current.hierarchyByteOffset = byteOffset; - current.hierarchyByteSize = byteSize; - current.numPoints = numPoints; - }else { - // load real node - current.byteOffset = byteOffset; - current.byteSize = byteSize; - current.numPoints = numPoints; - } - - current.nodeType = type; + toArray( array = [], offset = 0 ) { - if(current.nodeType === 2){ - continue; - } + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; - for(let childIndex = 0; childIndex < 8; childIndex++){ - let childExists = ((1 << childIndex) & childMask) !== 0; + return array; - if(!childExists){ - continue; - } + } - let childName = current.name + childIndex; + fromBufferAttribute( attribute, index ) { - let childAABB = createChildAABB(current.boundingBox, childIndex); - let child = new OctreeGeometryNode(childName, octree, childAABB); - child.name = childName; - child.spacing = current.spacing / 2; - child.level = current.level + 1; + this.r = attribute.getX( index ); + this.g = attribute.getY( index ); + this.b = attribute.getZ( index ); - current.children[childIndex] = child; - child.parent = current; + if ( attribute.normalized === true ) { - // nodes.push(child); - nodes[nodePos] = child; - nodePos++; - } + // assuming Uint8Array + + this.r /= 255; + this.g /= 255; + this.b /= 255; - // if((i % 500) === 0){ - // yield; - // } } - let duration = (performance.now() - tStart); + return this; - if(duration > 20){ - let msg = `duration: ${duration}ms, numNodes: ${numNodes}`; - console.log(msg); - } } - async loadHierarchy(node){ + toJSON() { - let {hierarchyByteOffset, hierarchyByteSize} = node; - let hierarchyPath = `${this.url}/../hierarchy.bin`; - - let first = hierarchyByteOffset; - let last = first + hierarchyByteSize - 1n; + return this.getHex(); - let response = await fetch(hierarchyPath, { - headers: { - 'content-type': 'multipart/byteranges', - 'Range': `bytes=${first}-${last}`, - }, - }); + } + } + Color.NAMES = _colorKeywords; + Color.prototype.r = 1; + Color.prototype.g = 1; + Color.prototype.b = 1; - let buffer = await response.arrayBuffer(); + class Face3 { - this.parseHierarchy(node, buffer); + constructor( a, b, c, normal, color, materialIndex = 0 ) { - // let promise = new Promise((resolve) => { - // let generator = this.parseHierarchy(node, buffer); + this.a = a; + this.b = b; + this.c = c; - // let repeatUntilDone = () => { - // let result = generator.next(); + this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; - // if(result.done){ - // resolve(); - // }else{ - // requestAnimationFrame(repeatUntilDone); - // } - // }; - - // repeatUntilDone(); - // }); + this.color = ( color && color.isColor ) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; - // await promise; + this.materialIndex = materialIndex; - + } + clone() { + return new this.constructor().copy( this ); } - } + copy( source ) { - let tmpVec3 = new THREE.Vector3(); - function createChildAABB(aabb, index){ - let min = aabb.min.clone(); - let max = aabb.max.clone(); - let size = tmpVec3.subVectors(max, min); + this.a = source.a; + this.b = source.b; + this.c = source.c; - if ((index & 0b0001) > 0) { - min.z += size.z / 2; - } else { - max.z -= size.z / 2; - } + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( let i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( let i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; - if ((index & 0b0010) > 0) { - min.y += size.y / 2; - } else { - max.y -= size.y / 2; - } - - if ((index & 0b0100) > 0) { - min.x += size.x / 2; - } else { - max.x -= size.x / 2; } - return new THREE.Box3(min, max); } - let typenameTypeattributeMap = { - "double": PointAttributeTypes.DATA_TYPE_DOUBLE, - "float": PointAttributeTypes.DATA_TYPE_FLOAT, - "int8": PointAttributeTypes.DATA_TYPE_INT8, - "uint8": PointAttributeTypes.DATA_TYPE_UINT8, - "int16": PointAttributeTypes.DATA_TYPE_INT16, - "uint16": PointAttributeTypes.DATA_TYPE_UINT16, - "int32": PointAttributeTypes.DATA_TYPE_INT32, - "uint32": PointAttributeTypes.DATA_TYPE_UINT32, - "int64": PointAttributeTypes.DATA_TYPE_INT64, - "uint64": PointAttributeTypes.DATA_TYPE_UINT64, - }; + let materialId = 0; - class OctreeLoader_1_8{ + function Material() { - static parseAttributes(jsonAttributes){ + Object.defineProperty( this, 'id', { value: materialId ++ } ); - let attributes = new PointAttributes(); + this.uuid = MathUtils.generateUUID(); - let replacements = { - "rgb": "rgba", - }; + this.name = ''; + this.type = 'Material'; - for(let jsonAttribute of jsonAttributes){ - let {name, description, size, numElements, elementSize, min, max} = jsonAttribute; + this.fog = true; - let type = typenameTypeattributeMap[jsonAttribute.type]; + this.blending = NormalBlending; + this.side = FrontSide; + this.flatShading = false; + this.vertexColors = false; - let potreeAttributeName = replacements[name] ? replacements[name] : name; + this.opacity = 1; + this.transparent = false; - let attribute = new PointAttribute(potreeAttributeName, type, numElements); + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; - if(numElements === 1){ - attribute.range = [min[0], max[0]]; - }else { - attribute.range = [min, max]; - } - - attribute.initialRange = attribute.range; + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; - attributes.add(attribute); - } + this.stencilWriteMask = 0xff; + this.stencilFunc = AlwaysStencilFunc; + this.stencilRef = 0; + this.stencilFuncMask = 0xff; + this.stencilFail = KeepStencilOp; + this.stencilZFail = KeepStencilOp; + this.stencilZPass = KeepStencilOp; + this.stencilWrite = false; - { - // check if it has normals - let hasNormals = - attributes.attributes.find(a => a.name === "NormalX") !== undefined && - attributes.attributes.find(a => a.name === "NormalY") !== undefined && - attributes.attributes.find(a => a.name === "NormalZ") !== undefined; + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; - if(hasNormals){ - let vector = { - name: "NORMAL", - attributes: ["NormalX", "NormalY", "NormalZ"], - }; - attributes.addVector(vector); - } - } + this.shadowSide = null; - return attributes; - } + this.colorWrite = true; - static async load(url){ + this.precision = null; // override the renderer's default precision for this material - let response = await fetch(url); - let metadata = await response.json(); + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; - let attributes = OctreeLoader_1_8.parseAttributes(metadata.attributes); + this.dithering = false; - let loader = new NodeLoader(url); - loader.metadata = metadata; - loader.attributes = attributes; - loader.scale = metadata.scale; - loader.offset = metadata.offset; + this.alphaTest = 0; + this.premultipliedAlpha = false; - let octree = new OctreeGeometry(); - octree.url = url; - octree.spacing = metadata.spacing; - octree.scale = metadata.scale; + this.visible = true; - // let aPosition = metadata.attributes.find(a => a.name === "position"); - // octree + this.toneMapped = true; - let min = new THREE.Vector3(...metadata.boundingBox.min); - let max = new THREE.Vector3(...metadata.boundingBox.max); - let boundingBox = new THREE.Box3(min, max); + this.userData = {}; - let offset = min.clone(); - boundingBox.min.sub(offset); - boundingBox.max.sub(offset); + this.version = 0; - octree.projection = metadata.projection; - octree.boundingBox = boundingBox; - octree.tightBoundingBox = boundingBox.clone(); - octree.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere()); - octree.tightBoundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere()); - octree.offset = offset; - octree.pointAttributes = OctreeLoader_1_8.parseAttributes(metadata.attributes); - octree.loader = loader; + } - let root = new OctreeGeometryNode("r", octree, boundingBox); - root.level = 0; - root.nodeType = 2; - root.hierarchyByteOffset = 0n; - root.hierarchyByteSize = BigInt(metadata.hierarchy.firstChunkSize); - root.hasChildren = false; - root.spacing = octree.spacing; - root.byteOffset = 0; + Material.prototype = Object.assign( Object.create( EventDispatcher$1.prototype ), { - octree.root = root; + constructor: Material, - //await OctreeLoader_1_8.loadHierarchy(url, root); - await loader.load(root); + isMaterial: true, - let result = { - geometry: octree, - }; + onBeforeCompile: function ( /* shaderobject, renderer */ ) {}, - return result; + customProgramCacheKey: function () { - } + return this.onBeforeCompile.toString(); - }; + }, - /** - * @author Connor Manning - */ + setValues: function ( values ) { - class EptLoader { - static async load(file, callback) { + if ( values === undefined ) return; - let response = await fetch(file); - let json = await response.json(); + for ( const key in values ) { - let url = file.substr(0, file.lastIndexOf('ept.json')); - let geometry = new Potree.PointCloudEptGeometry(url, json); - let root = new Potree.PointCloudEptGeometryNode(geometry); + const newValue = values[ key ]; - geometry.root = root; - geometry.root.load(); + if ( newValue === undefined ) { - callback(geometry); - } - }; + console.warn( 'THREE.Material: \'' + key + '\' parameter is undefined.' ); + continue; - class EptBinaryLoader { - extension() { - return '.bin'; - } + } - workerPath() { - return Potree.scriptPath + '/workers/EptBinaryDecoderWorker.js'; - } + // for backward compatability if shading is set in the constructor + if ( key === 'shading' ) { - load(node) { - if (node.loaded) return; + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( newValue === FlatShading ) ? true : false; + continue; - let url = node.url() + this.extension(); + } + + const currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( 'THREE.' + this.type + ': \'' + key + '\' is not a property of this material.' ); + continue; - let xhr = XHRFactory.createXMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - xhr.onreadystatechange = () => { - if (xhr.readyState === 4) { - if (xhr.status === 200) { - let buffer = xhr.response; - this.parse(node, buffer); - } else { - console.log('Failed ' + url + ': ' + xhr.status); - } } - }; - try { - xhr.send(null); - } - catch (e) { - console.log('Failed request: ' + e); - } - } + if ( currentValue && currentValue.isColor ) { - parse(node, buffer) { - let workerPath = this.workerPath(); - let worker = Potree.workerPool.getWorker(workerPath); + currentValue.set( newValue ); - worker.onmessage = function(e) { - let g = new THREE.BufferGeometry(); - let numPoints = e.data.numPoints; + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { - let position = new Float32Array(e.data.position); - g.addAttribute('position', new THREE.BufferAttribute(position, 3)); + currentValue.copy( newValue ); - let indices = new Uint8Array(e.data.indices); - g.addAttribute('indices', new THREE.BufferAttribute(indices, 4)); + } else { + + this[ key ] = newValue; - if (e.data.color) { - let color = new Uint8Array(e.data.color); - g.addAttribute('color', new THREE.BufferAttribute(color, 4, true)); - } - if (e.data.intensity) { - let intensity = new Float32Array(e.data.intensity); - g.addAttribute('intensity', - new THREE.BufferAttribute(intensity, 1)); - } - if (e.data.classification) { - let classification = new Uint8Array(e.data.classification); - g.addAttribute('classification', - new THREE.BufferAttribute(classification, 1)); - } - if (e.data.returnNumber) { - let returnNumber = new Uint8Array(e.data.returnNumber); - g.addAttribute('return number', - new THREE.BufferAttribute(returnNumber, 1)); - } - if (e.data.numberOfReturns) { - let numberOfReturns = new Uint8Array(e.data.numberOfReturns); - g.addAttribute('number of returns', - new THREE.BufferAttribute(numberOfReturns, 1)); - } - if (e.data.pointSourceId) { - let pointSourceId = new Uint16Array(e.data.pointSourceId); - g.addAttribute('source id', - new THREE.BufferAttribute(pointSourceId, 1)); } - g.attributes.indices.normalized = true; + } - let tightBoundingBox = new THREE.Box3( - new THREE.Vector3().fromArray(e.data.tightBoundingBox.min), - new THREE.Vector3().fromArray(e.data.tightBoundingBox.max) - ); + }, - node.doneLoading( - g, - tightBoundingBox, - numPoints, - new THREE.Vector3(...e.data.mean)); + toJSON: function ( meta ) { - Potree.workerPool.returnWorker(workerPath, worker); - }; + const isRoot = ( meta === undefined || typeof meta === 'string' ); - let toArray = (v) => [v.x, v.y, v.z]; - let message = { - buffer: buffer, - schema: node.ept.schema, - scale: node.ept.eptScale, - offset: node.ept.eptOffset, - mins: toArray(node.key.b.min) + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + const data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } }; - worker.postMessage(message, [message.buffer]); - } - }; + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; - /** - * laslaz code taken and adapted from plas.io js-laslaz - * http://plas.io/ - * https://github.com/verma/plasio - * - * Thanks to Uday Verma and Howard Butler - * - */ + if ( this.name !== '' ) data.name = this.name; - class EptLaszipLoader { - load(node) { - if (node.loaded) return; + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); - let url = node.url() + '.laz'; + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; - let xhr = XHRFactory.createXMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - xhr.onreadystatechange = () => { - if (xhr.readyState === 4) { - if (xhr.status === 200) { - let buffer = xhr.response; - this.parse(node, buffer); - } else { - console.log('Failed ' + url + ': ' + xhr.status); - } - } - }; + if ( this.sheen && this.sheen.isColor ) data.sheen = this.sheen.getHex(); + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity; - xhr.send(null); - } + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat; + if ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness; - async parse(node, buffer){ - let lf = new LASFile(buffer); - let handler = new EptLazBatcher(node); + if ( this.clearcoatMap && this.clearcoatMap.isTexture ) { - try{ - await lf.open(); + data.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid; - lf.isOpen = true; + } - const header = await lf.getHeader(); + if ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) { - { - let i = 0; + data.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid; - let toArray = (v) => [v.x, v.y, v.z]; - let mins = toArray(node.key.b.min); - let maxs = toArray(node.key.b.max); + } - let hasMoreData = true; + if ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) { - while(hasMoreData){ - const data = await lf.readData(1000000, 0, 1); + data.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid; + data.clearcoatNormalScale = this.clearcoatNormalScale.toArray(); - let d = new LASDecoder( - data.buffer, - header.pointsFormatId, - header.pointsStructSize, - data.count, - header.scale, - header.offset, - mins, - maxs); + } - d.extraBytes = header.extraBytes; - d.pointsFormatId = header.pointsFormatId; - handler.push(d); + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; - i += data.count; + if ( this.aoMap && this.aoMap.isTexture ) { - hasMoreData = data.hasMoreData; - } + data.aoMap = this.aoMap.toJSON( meta ).uuid; + data.aoMapIntensity = this.aoMapIntensity; - header.totalRead = i; - header.versionAsString = lf.versionAsString; - header.isCompressed = lf.isCompressed; + } - await lf.close(); + if ( this.bumpMap && this.bumpMap.isTexture ) { - lf.isOpen = false; - } + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; - }catch(err){ - console.error('Error reading LAZ:', err); - - if (lf.isOpen) { - await lf.close(); + } + + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalMapType = this.normalMapType; + data.normalScale = this.normalScale.toArray(); - lf.isOpen = false; - } - - throw err; } - } - }; - class EptLazBatcher { - constructor(node) { this.node = node; } + if ( this.displacementMap && this.displacementMap.isTexture ) { - push(las) { - let workerPath = Potree.scriptPath + - '/workers/EptLaszipDecoderWorker.js'; - let worker = Potree.workerPool.getWorker(workerPath); + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; - worker.onmessage = (e) => { - let g = new THREE.BufferGeometry(); - let numPoints = las.pointsCount; + } - let positions = new Float32Array(e.data.position); - let colors = new Uint8Array(e.data.color); + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; - let intensities = new Float32Array(e.data.intensity); - let classifications = new Uint8Array(e.data.classification); - let returnNumbers = new Uint8Array(e.data.returnNumber); - let numberOfReturns = new Uint8Array(e.data.numberOfReturns); - let pointSourceIDs = new Uint16Array(e.data.pointSourceID); - let indices = new Uint8Array(e.data.indices); - let gpsTime = new Float32Array(e.data.gpsTime); + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; - g.addAttribute('position', - new THREE.BufferAttribute(positions, 3)); - g.addAttribute('rgba', - new THREE.BufferAttribute(colors, 4, true)); - g.addAttribute('intensity', - new THREE.BufferAttribute(intensities, 1)); - g.addAttribute('classification', - new THREE.BufferAttribute(classifications, 1)); - g.addAttribute('return number', - new THREE.BufferAttribute(returnNumbers, 1)); - g.addAttribute('number of returns', - new THREE.BufferAttribute(numberOfReturns, 1)); - g.addAttribute('source id', - new THREE.BufferAttribute(pointSourceIDs, 1)); - g.addAttribute('indices', - new THREE.BufferAttribute(indices, 4)); - g.addAttribute('gpsTime', - new THREE.BufferAttribute(gpsTime, 1)); - this.node.gpsTime = e.data.gpsMeta; + if ( this.envMap && this.envMap.isTexture ) { - g.attributes.indices.normalized = true; + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + data.refractionRatio = this.refractionRatio; - let tightBoundingBox = new THREE.Box3( - new THREE.Vector3().fromArray(e.data.tightBoundingBox.min), - new THREE.Vector3().fromArray(e.data.tightBoundingBox.max) - ); + if ( this.combine !== undefined ) data.combine = this.combine; + if ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity; - this.node.doneLoading( - g, - tightBoundingBox, - numPoints, - new THREE.Vector3(...e.data.mean)); + } - Potree.workerPool.returnWorker(workerPath, worker); - }; + if ( this.gradientMap && this.gradientMap.isTexture ) { - let message = { - buffer: las.arrayb, - numPoints: las.pointsCount, - pointSize: las.pointSize, - pointFormatID: las.pointsFormatId, - scale: las.scale, - offset: las.offset, - mins: las.mins, - maxs: las.maxs - }; + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; - worker.postMessage(message, [message.buffer]); - }; - }; + } - class EptZstandardLoader extends EptBinaryLoader { - extension() { - return '.zst'; - } + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; - workerPath() { - return Potree.scriptPath + '/workers/EptZstandardDecoderWorker.js'; - } - }; + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.flatShading === true ) data.flatShading = this.flatShading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors ) data.vertexColors = true; - class ShapefileLoader{ + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; - constructor(){ - this.transform = null; - } + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; - async load(path){ + data.stencilWrite = this.stencilWrite; + data.stencilWriteMask = this.stencilWriteMask; + data.stencilFunc = this.stencilFunc; + data.stencilRef = this.stencilRef; + data.stencilFuncMask = this.stencilFuncMask; + data.stencilFail = this.stencilFail; + data.stencilZFail = this.stencilZFail; + data.stencilZPass = this.stencilZPass; - const matLine = new THREE.LineMaterial( { - color: 0xff0000, - linewidth: 3, // in pixels - resolution: new THREE.Vector2(1000, 1000), - dashed: false - } ); + // rotation (SpriteMaterial) + if ( this.rotation && this.rotation !== 0 ) data.rotation = this.rotation; - const features = await this.loadShapefileFeatures(path); - const node = new THREE.Object3D(); - - for(const feature of features){ - const fnode = this.featureToSceneNode(feature, matLine); - node.add(fnode); - } + if ( this.polygonOffset === true ) data.polygonOffset = true; + if ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor; + if ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits; - let setResolution = (x, y) => { - matLine.resolution.set(x, y); - }; + if ( this.linewidth && this.linewidth !== 1 ) data.linewidth = this.linewidth; + if ( this.dashSize !== undefined ) data.dashSize = this.dashSize; + if ( this.gapSize !== undefined ) data.gapSize = this.gapSize; + if ( this.scale !== undefined ) data.scale = this.scale; - const result = { - features: features, - node: node, - setResolution: setResolution, - }; + if ( this.dithering === true ) data.dithering = true; - return result; - } + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; - featureToSceneNode(feature, matLine){ - let geometry = feature.geometry; - - let color = new THREE.Color(1, 1, 1); + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; - let transform = this.transform; - if(transform === null){ - transform = {forward: (v) => v}; - } - - if(feature.geometry.type === "Point"){ - let sg = new THREE.SphereGeometry(1, 18, 18); - let sm = new THREE.MeshNormalMaterial(); - let s = new THREE.Mesh(sg, sm); - - let [long, lat] = geometry.coordinates; - let pos = transform.forward([long, lat]); - - s.position.set(...pos, 20); - - s.scale.set(10, 10, 10); - - return s; - }else if(geometry.type === "LineString"){ - let coordinates = []; - - let min = new THREE.Vector3(Infinity, Infinity, Infinity); - for(let i = 0; i < geometry.coordinates.length; i++){ - let [long, lat] = geometry.coordinates[i]; - let pos = transform.forward([long, lat]); - - min.x = Math.min(min.x, pos[0]); - min.y = Math.min(min.y, pos[1]); - min.z = Math.min(min.z, 20); - - coordinates.push(...pos, 20); - if(i > 0 && i < geometry.coordinates.length - 1){ - coordinates.push(...pos, 20); - } - } - - for(let i = 0; i < coordinates.length; i += 3){ - coordinates[i+0] -= min.x; - coordinates[i+1] -= min.y; - coordinates[i+2] -= min.z; - } - - const lineGeometry = new THREE.LineGeometry(); - lineGeometry.setPositions( coordinates ); + if ( this.morphTargets === true ) data.morphTargets = true; + if ( this.morphNormals === true ) data.morphNormals = true; + if ( this.skinning === true ) data.skinning = true; - const line = new THREE.Line2( lineGeometry, matLine ); - line.computeLineDistances(); - line.scale.set( 1, 1, 1 ); - line.position.copy(min); - - return line; - }else if(geometry.type === "Polygon"){ - for(let pc of geometry.coordinates){ - let coordinates = []; - - let min = new THREE.Vector3(Infinity, Infinity, Infinity); - for(let i = 0; i < pc.length; i++){ - let [long, lat] = pc[i]; - let pos = transform.forward([long, lat]); - - min.x = Math.min(min.x, pos[0]); - min.y = Math.min(min.y, pos[1]); - min.z = Math.min(min.z, 20); - - coordinates.push(...pos, 20); - if(i > 0 && i < pc.length - 1){ - coordinates.push(...pos, 20); - } - } - - for(let i = 0; i < coordinates.length; i += 3){ - coordinates[i+0] -= min.x; - coordinates[i+1] -= min.y; - coordinates[i+2] -= min.z; - } + if ( this.visible === false ) data.visible = false; - const lineGeometry = new THREE.LineGeometry(); - lineGeometry.setPositions( coordinates ); + if ( this.toneMapped === false ) data.toneMapped = false; - const line = new THREE.Line2( lineGeometry, matLine ); - line.computeLineDistances(); - line.scale.set( 1, 1, 1 ); - line.position.copy(min); - - return line; - } - }else { - console.log("unhandled feature: ", feature); - } - } + if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData; - async loadShapefileFeatures(file){ - let features = []; + // TODO: Copied from Object3D.toJSON - let source = await shapefile.open(file); + function extractFromCache( cache ) { - while(true){ - let result = await source.read(); + const values = []; - if (result.done) { - break; - } + for ( const key in cache ) { + + const data = cache[ key ]; + delete data.metadata; + values.push( data ); - if (result.value && result.value.type === 'Feature' && result.value.geometry !== undefined) { - features.push(result.value); } + + return values; + } - return features; - } + if ( isRoot ) { - }; + const textures = extractFromCache( meta.textures ); + const images = extractFromCache( meta.images ); - const defaultColors = { - "landuse": [0.5, 0.5, 0.5], - "natural": [0.0, 1.0, 0.0], - "places": [1.0, 0.0, 1.0], - "points": [0.0, 1.0, 1.0], - "roads": [1.0, 1.0, 0.0], - "waterways": [0.0, 0.0, 1.0], - "default": [0.9, 0.6, 0.1], - }; + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; - function getColor(feature){ - let color = defaultColors[feature]; + } - if(!color){ - color = defaultColors["default"]; - } + return data; - return color; - } + }, - class Geopackage$1{ - constructor(){ - this.path = null; - this.node = null; - } - }; + clone: function () { - class GeoPackageLoader{ + return new this.constructor().copy( this ); - constructor(){ + }, - } + copy: function ( source ) { - static async loadUrl(url, params){ + this.name = source.name; - await Promise.all([ - Utils.loadScript(`${Potree.scriptPath}/lazylibs/geopackage/geopackage.js`), - Utils.loadScript(`${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.js`), - ]); - - const result = await fetch(url); - const buffer = await result.arrayBuffer(); + this.fog = source.fog; - params = params || {}; + this.blending = source.blending; + this.side = source.side; + this.flatShading = source.flatShading; + this.vertexColors = source.vertexColors; - params.source = url; + this.opacity = source.opacity; + this.transparent = source.transparent; - return GeoPackageLoader.loadBuffer(buffer, params); - } + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; - static async loadBuffer(buffer, params){ + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; - await Promise.all([ - Utils.loadScript(`${Potree.scriptPath}/lazylibs/geopackage/geopackage.js`), - Utils.loadScript(`${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.js`), - ]); + this.stencilWriteMask = source.stencilWriteMask; + this.stencilFunc = source.stencilFunc; + this.stencilRef = source.stencilRef; + this.stencilFuncMask = source.stencilFuncMask; + this.stencilFail = source.stencilFail; + this.stencilZFail = source.stencilZFail; + this.stencilZPass = source.stencilZPass; + this.stencilWrite = source.stencilWrite; - params = params || {}; + const srcPlanes = source.clippingPlanes; + let dstPlanes = null; - const resolver = async (resolve) => { - - let transform = params.transform; - if(!transform){ - transform = {forward: (arg) => arg}; - } + if ( srcPlanes !== null ) { - const wasmPath = `${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.wasm`; - const SQL = await initSqlJs({ locateFile: filename => wasmPath}); + const n = srcPlanes.length; + dstPlanes = new Array( n ); - const u8 = new Uint8Array(buffer); + for ( let i = 0; i !== n; ++ i ) { - const data = await geopackage.open(u8); - window.data = data; + dstPlanes[ i ] = srcPlanes[ i ].clone(); - const geopackageNode = new THREE.Object3D(); - geopackageNode.name = params.source; - geopackageNode.potree = { - source: params.source, - }; + } - const geo = new Geopackage$1(); - geo.path = params.source; - geo.node = geopackageNode; + } - const tables = data.getTables(); + this.clippingPlanes = dstPlanes; + this.clipIntersection = source.clipIntersection; + this.clipShadows = source.clipShadows; - for(const table of tables.features){ - const dao = data.getFeatureDao(table); + this.shadowSide = source.shadowSide; - let boundingBox = dao.getBoundingBox(); - boundingBox = boundingBox.projectBoundingBox(dao.projection, 'EPSG:4326'); - const geoJson = data.queryForGeoJSONFeaturesInTable(table, boundingBox); + this.colorWrite = source.colorWrite; - const matLine = new THREE.LineMaterial( { - color: new THREE.Color().setRGB(...getColor(table)), - linewidth: 2, - resolution: new THREE.Vector2(1000, 1000), - dashed: false - } ); + this.precision = source.precision; - const node = new THREE.Object3D(); - node.name = table; - geo.node.add(node); + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; - for(const [index, feature] of Object.entries(geoJson)){ - //const featureNode = GeoPackageLoader.featureToSceneNode(feature, matLine, transform); - const featureNode = GeoPackageLoader.featureToSceneNode(feature, matLine, dao.projection, transform); - node.add(featureNode); - } - } + this.dithering = source.dithering; - resolve(geo); - }; + this.alphaTest = source.alphaTest; + this.premultipliedAlpha = source.premultipliedAlpha; - return new Promise(resolver); - } + this.visible = source.visible; - static featureToSceneNode(feature, matLine, geopackageProjection, transform){ - let geometry = feature.geometry; - - let color = new THREE.Color(1, 1, 1); - - if(feature.geometry.type === "Point"){ - let sg = new THREE.SphereGeometry(1, 18, 18); - let sm = new THREE.MeshNormalMaterial(); - let s = new THREE.Mesh(sg, sm); - - let [long, lat] = geometry.coordinates; - let pos = transform.forward(geopackageProjection.forward([long, lat])); - - s.position.set(...pos, 20); - - s.scale.set(10, 10, 10); - - return s; - }else if(geometry.type === "LineString"){ - let coordinates = []; - - let min = new THREE.Vector3(Infinity, Infinity, Infinity); - for(let i = 0; i < geometry.coordinates.length; i++){ - let [long, lat] = geometry.coordinates[i]; - let pos = transform.forward(geopackageProjection.forward([long, lat])); - - min.x = Math.min(min.x, pos[0]); - min.y = Math.min(min.y, pos[1]); - min.z = Math.min(min.z, 20); - - coordinates.push(...pos, 20); - if(i > 0 && i < geometry.coordinates.length - 1){ - coordinates.push(...pos, 20); - } - } - - for(let i = 0; i < coordinates.length; i += 3){ - coordinates[i+0] -= min.x; - coordinates[i+1] -= min.y; - coordinates[i+2] -= min.z; - } - - const lineGeometry = new THREE.LineGeometry(); - lineGeometry.setPositions( coordinates ); + this.toneMapped = source.toneMapped; - const line = new THREE.Line2( lineGeometry, matLine ); - line.computeLineDistances(); - line.scale.set( 1, 1, 1 ); - line.position.copy(min); - - return line; - }else if(geometry.type === "Polygon"){ - for(let pc of geometry.coordinates){ - let coordinates = []; - - let min = new THREE.Vector3(Infinity, Infinity, Infinity); - for(let i = 0; i < pc.length; i++){ - let [long, lat] = pc[i]; - - let pos = transform.forward(geopackageProjection.forward([long, lat])); - - min.x = Math.min(min.x, pos[0]); - min.y = Math.min(min.y, pos[1]); - min.z = Math.min(min.z, 20); - - coordinates.push(...pos, 20); - if(i > 0 && i < pc.length - 1){ - coordinates.push(...pos, 20); - } - } - - for(let i = 0; i < coordinates.length; i += 3){ - coordinates[i+0] -= min.x; - coordinates[i+1] -= min.y; - coordinates[i+2] -= min.z; - } + this.userData = JSON.parse( JSON.stringify( source.userData ) ); - const lineGeometry = new THREE.LineGeometry(); - lineGeometry.setPositions( coordinates ); + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); - const line = new THREE.Line2( lineGeometry, matLine ); - line.computeLineDistances(); - line.scale.set( 1, 1, 1 ); - line.position.copy(min); - - return line; - } - }else { - console.log("unhandled feature: ", feature); - } } - }; + } ); - class ClipVolume extends THREE.Object3D{ - - constructor(args){ - super(); - - this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; - this.name = "clip_volume_" + this.constructor.counter; + Object.defineProperty( Material.prototype, 'needsUpdate', { - let alpha = args.alpha || 0; - let beta = args.beta || 0; - let gamma = args.gamma || 0; + set: function ( value ) { - this.rotation.x = alpha; - this.rotation.y = beta; - this.rotation.z = gamma; + if ( value === true ) this.version ++; - this.clipOffset = 0.001; - this.clipRotOffset = 1; - - let boxGeometry = new THREE.BoxGeometry(1, 1, 1); - boxGeometry.computeBoundingBox(); - - let boxFrameGeometry = new THREE.Geometry(); - { - // bottom - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5)); - // top - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5)); - // sides - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5)); + } - boxFrameGeometry.colors.push(new THREE.Vector3(1, 1, 1)); - } + } ); - let planeFrameGeometry = new THREE.Geometry(); - { - // middle line - planeFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.0)); - planeFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.0)); - planeFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.0)); - planeFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.0)); - planeFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.0)); - planeFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.0)); - planeFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.0)); - planeFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.0)); - } - - this.dimension = new THREE.Vector3(1, 1, 1); - this.material = new THREE.MeshBasicMaterial( { - color: 0x00ff00, - transparent: true, - opacity: 0.3, - depthTest: true, - depthWrite: false} ); - this.box = new THREE.Mesh(boxGeometry, this.material); - this.box.geometry.computeBoundingBox(); - this.boundingBox = this.box.geometry.boundingBox; - this.add(this.box); - - this.frame = new THREE.LineSegments( boxFrameGeometry, new THREE.LineBasicMaterial({color: 0x000000})); - this.add(this.frame); - this.planeFrame = new THREE.LineSegments( planeFrameGeometry, new THREE.LineBasicMaterial({color: 0xff0000})); - this.add(this.planeFrame); + /** + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: + * } + */ - // set default thickness - this.setScaleZ(0.1); + function MeshBasicMaterial( parameters ) { - // create local coordinate system - let createArrow = (name, direction, color) => { - let material = new THREE.MeshBasicMaterial({ - color: color, - depthTest: false, - depthWrite: false}); - - let shaftGeometry = new THREE.Geometry(); - shaftGeometry.vertices.push(new THREE.Vector3(0, 0, 0)); - shaftGeometry.vertices.push(new THREE.Vector3(0, 1, 0)); - - let shaftMaterial = new THREE.LineBasicMaterial({ - color: color, - depthTest: false, - depthWrite: false, - transparent: true - }); - let shaft = new THREE.Line(shaftGeometry, shaftMaterial); - shaft.name = name + "_shaft"; - - let headGeometry = new THREE.CylinderGeometry(0, 0.04, 0.1, 10, 1, false); - let headMaterial = material; - let head = new THREE.Mesh(headGeometry, headMaterial); - head.name = name + "_head"; - head.position.y = 1; - - let arrow = new THREE.Object3D(); - arrow.name = name; - arrow.add(shaft); - arrow.add(head); + Material.call( this ); - return arrow; - }; - - this.arrowX = createArrow("arrow_x", new THREE.Vector3(1, 0, 0), 0xFF0000); - this.arrowY = createArrow("arrow_y", new THREE.Vector3(0, 1, 0), 0x00FF00); - this.arrowZ = createArrow("arrow_z", new THREE.Vector3(0, 0, 1), 0x0000FF); - - this.arrowX.rotation.z = -Math.PI / 2; - this.arrowZ.rotation.x = Math.PI / 2; + this.type = 'MeshBasicMaterial'; - this.arrowX.visible = false; - this.arrowY.visible = false; - this.arrowZ.visible = false; + this.color = new Color( 0xffffff ); // emissive - this.add(this.arrowX); - this.add(this.arrowY); - this.add(this.arrowZ); - - { // event listeners - this.addEventListener("ui_select", e => { - this.arrowX.visible = true; - this.arrowY.visible = true; - this.arrowZ.visible = true; - }); - this.addEventListener("ui_deselect", e => { - this.arrowX.visible = false; - this.arrowY.visible = false; - this.arrowZ.visible = false; - }); - this.addEventListener("select", e => { - let scene_header = $("#" + this.name + " .scene_header"); - if(!scene_header.next().is(":visible")) { - scene_header.click(); - } - }); - this.addEventListener("deselect", e => { - let scene_header = $("#" + this.name + " .scene_header"); - if(scene_header.next().is(":visible")) { - scene_header.click(); - } - }); - } - - this.update(); - }; + this.map = null; - setClipOffset(offset) { - this.clipOffset = offset; - } + this.lightMap = null; + this.lightMapIntensity = 1.0; - setClipRotOffset(offset) { - this.clipRotOffset = offset; - } + this.aoMap = null; + this.aoMapIntensity = 1.0; - setScaleX(x) { - this.box.scale.x = x; - this.frame.scale.x = x; - this.planeFrame.scale.x = x; - } + this.specularMap = null; - setScaleY(y) { - this.box.scale.y = y; - this.frame.scale.y = y; - this.planeFrame.scale.y = y; - } + this.alphaMap = null; - setScaleZ(z) { - this.box.scale.z = z; - this.frame.scale.z = z; - this.planeFrame.scale.z = z; - } + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; - offset(args) { - let cs = args.cs || null; - let axis = args.axis || null; - let dir = args.dir || null; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; - if(!cs || !axis || !dir) return; + this.skinning = false; + this.morphTargets = false; - if(axis === "x") { - if(cs === "local") { - this.position.add(this.localX.clone().multiplyScalar(dir * this.clipOffset)); - } else if(cs === "global") { - this.position.x = this.position.x + dir * this.clipOffset; - } - }else if(axis === "y") { - if(cs === "local") { - this.position.add(this.localY.clone().multiplyScalar(dir * this.clipOffset)); - } else if(cs === "global") { - this.position.y = this.position.y + dir * this.clipOffset; - } - }else if(axis === "z") { - if(cs === "local") { - this.position.add(this.localZ.clone().multiplyScalar(dir * this.clipOffset)); - } else if(cs === "global") { - this.position.z = this.position.z + dir * this.clipOffset; - } - } + this.setValues( parameters ); - this.dispatchEvent({"type": "clip_volume_changed", "viewer": viewer, "volume": this}); - } + } - rotate(args) { - let cs = args.cs || null; - let axis = args.axis || null; - let dir = args.dir || null; + MeshBasicMaterial.prototype = Object.create( Material.prototype ); + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; - if(!cs || !axis || !dir) return; + MeshBasicMaterial.prototype.isMeshBasicMaterial = true; - if(cs === "local") { - if(axis === "x") { - this.rotateOnAxis(new THREE.Vector3(1, 0, 0), dir * this.clipRotOffset * Math.PI / 180); - } else if(axis === "y") { - this.rotateOnAxis(new THREE.Vector3(0, 1, 0), dir * this.clipRotOffset * Math.PI / 180); - } else if(axis === "z") { - this.rotateOnAxis(new THREE.Vector3(0, 0, 1), dir * this.clipRotOffset * Math.PI / 180); - } - } else if(cs === "global") { - let rotaxis = new THREE.Vector4(1, 0, 0, 0); - if(axis === "y") { - rotaxis = new THREE.Vector4(0, 1, 0, 0); - } else if(axis === "z") { - rotaxis = new THREE.Vector4(0, 0, 1, 0); - } - this.updateMatrixWorld(); - let invM = new THREE.Matrix4().getInverse(this.matrixWorld); - rotaxis = rotaxis.applyMatrix4(invM).normalize(); - rotaxis = new THREE.Vector3(rotaxis.x, rotaxis.y, rotaxis.z); - this.rotateOnAxis(rotaxis, dir * this.clipRotOffset * Math.PI / 180); - } + MeshBasicMaterial.prototype.copy = function ( source ) { - this.updateLocalSystem(); + Material.prototype.copy.call( this, source ); - this.dispatchEvent({"type": "clip_volume_changed", "viewer": viewer, "volume": this}); - } + this.color.copy( source.color ); - update(){ - this.boundingBox = this.box.geometry.boundingBox; - this.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere()); - - this.box.visible = false; + this.map = source.map; - this.updateLocalSystem(); - }; + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; - updateLocalSystem() { - // extract local coordinate axes - let rotQuat = this.getWorldQuaternion(); - this.localX = new THREE.Vector3(1, 0, 0).applyQuaternion(rotQuat).normalize(); - this.localY = new THREE.Vector3(0, 1, 0).applyQuaternion(rotQuat).normalize(); - this.localZ = new THREE.Vector3(0, 0, 1).applyQuaternion(rotQuat).normalize(); - } - - raycast(raycaster, intersects){ - - let is = []; - this.box.raycast(raycaster, is); - - if(is.length > 0){ - let I = is[0]; - intersects.push({ - distance: I.distance, - object: this, - point: I.point.clone() - }); - } - }; - }; + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; - class ClippingTool extends EventDispatcher{ + this.specularMap = source.specularMap; - constructor(viewer){ - super(); + this.alphaMap = source.alphaMap; - this.viewer = viewer; + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; - this.maxPolygonVertices = 8; - - this.addEventListener("start_inserting_clipping_volume", e => { - this.viewer.dispatchEvent({ - type: "cancel_insertions" - }); - }); + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; - this.sceneMarker = new THREE.Scene(); - this.sceneVolume = new THREE.Scene(); - this.sceneVolume.name = "scene_clip_volume"; - this.viewer.inputHandler.registerInteractiveScene(this.sceneVolume); + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; - this.onRemove = e => { - this.sceneVolume.remove(e.volume); - }; - - this.onAdd = e => { - this.sceneVolume.add(e.volume); - }; - - this.viewer.inputHandler.addEventListener("delete", e => { - let volumes = e.selection.filter(e => (e instanceof ClipVolume)); - volumes.forEach(e => this.viewer.scene.removeClipVolume(e)); - let polyVolumes = e.selection.filter(e => (e instanceof PolygonClipVolume)); - polyVolumes.forEach(e => this.viewer.scene.removePolygonClipVolume(e)); - }); - } + return this; + + }; + + const _vector$3 = new Vector3(); + const _vector2$1 = new Vector2(); + + function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); - setScene(scene){ - if(this.scene === scene){ - return; - } - - if(this.scene){ - this.scene.removeEventListeners("clip_volume_added", this.onAdd); - this.scene.removeEventListeners("clip_volume_removed", this.onRemove); - this.scene.removeEventListeners("polygon_clip_volume_added", this.onAdd); - this.scene.removeEventListeners("polygon_clip_volume_removed", this.onRemove); - } - - this.scene = scene; - - this.scene.addEventListener("clip_volume_added", this.onAdd); - this.scene.addEventListener("clip_volume_removed", this.onRemove); - this.scene.addEventListener("polygon_clip_volume_added", this.onAdd); - this.scene.addEventListener("polygon_clip_volume_removed", this.onRemove); } - startInsertion(args = {}) { - let type = args.type || null; + this.name = ''; - if(!type) return null; + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; - let domElement = this.viewer.renderer.domElement; - let canvasSize = this.viewer.renderer.getSize(new THREE.Vector2()); + this.usage = StaticDrawUsage; + this.updateRange = { offset: 0, count: - 1 }; - let svg = $(` - + this.version = 0; - - - - - + } - + Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', { - - `); - $(domElement.parentElement).append(svg); + set: function ( value ) { - let polyClipVol = new PolygonClipVolume(this.viewer.scene.getActiveCamera().clone()); + if ( value === true ) this.version ++; - this.dispatchEvent({"type": "start_inserting_clipping_volume"}); + } - this.viewer.scene.addPolygonClipVolume(polyClipVol); - this.sceneMarker.add(polyClipVol); + } ); - let cancel = { - callback: null - }; + Object.assign( BufferAttribute.prototype, { - let insertionCallback = (e) => { - if(e.button === THREE.MOUSE.LEFT){ - - polyClipVol.addMarker(); + isBufferAttribute: true, - // SVC Screen Line - svg.find("polyline").each((index, target) => { - let newPoint = svg[0].createSVGPoint(); - newPoint.x = e.offsetX; - newPoint.y = e.offsetY; - let polyline = target.points.appendItem(newPoint); - }); - - - if(polyClipVol.markers.length > this.maxPolygonVertices){ - cancel.callback(); - } - - this.viewer.inputHandler.startDragging( - polyClipVol.markers[polyClipVol.markers.length - 1]); - }else if(e.button === THREE.MOUSE.RIGHT){ - cancel.callback(e); - } - }; - - cancel.callback = e => { + onUploadCallback: function () {}, - //let first = svg.find("polyline")[0].points[0]; - //svg.find("polyline").each((index, target) => { - // let newPoint = svg[0].createSVGPoint(); - // newPoint.x = first.x; - // newPoint.y = first.y; - // let polyline = target.points.appendItem(newPoint); - //}); - svg.remove(); + setUsage: function ( value ) { - if(polyClipVol.markers.length > 3) { - polyClipVol.removeLastMarker(); - polyClipVol.initialized = true; - } else { - this.viewer.scene.removePolygonClipVolume(polyClipVol); - } + this.usage = value; - this.viewer.renderer.domElement.removeEventListener("mouseup", insertionCallback, true); - this.viewer.removeEventListener("cancel_insertions", cancel.callback); - this.viewer.inputHandler.enabled = true; - }; - - this.viewer.addEventListener("cancel_insertions", cancel.callback); - this.viewer.renderer.domElement.addEventListener("mouseup", insertionCallback , true); - this.viewer.inputHandler.enabled = false; - - polyClipVol.addMarker(); - this.viewer.inputHandler.startDragging( - polyClipVol.markers[polyClipVol.markers.length - 1]); + return this; - return polyClipVol; - } + }, - update() { + copy: function ( source ) { - } - }; + this.name = source.name; + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; - var GeoTIFF = (function (exports) { - 'use strict'; + this.usage = source.usage; - const Endianness = new Enum({ - LITTLE: "II", - BIG: "MM", - }); + return this; - const Type = new Enum({ - BYTE: {value: 1, bytes: 1}, - ASCII: {value: 2, bytes: 1}, - SHORT: {value: 3, bytes: 2}, - LONG: {value: 4, bytes: 4}, - RATIONAL: {value: 5, bytes: 8}, - SBYTE: {value: 6, bytes: 1}, - UNDEFINED: {value: 7, bytes: 1}, - SSHORT: {value: 8, bytes: 2}, - SLONG: {value: 9, bytes: 4}, - SRATIONAL: {value: 10, bytes: 8}, - FLOAT: {value: 11, bytes: 4}, - DOUBLE: {value: 12, bytes: 8}, - }); + }, - const Tag = new Enum({ - IMAGE_WIDTH: 256, - IMAGE_HEIGHT: 257, - BITS_PER_SAMPLE: 258, - COMPRESSION: 259, - PHOTOMETRIC_INTERPRETATION: 262, - STRIP_OFFSETS: 273, - ORIENTATION: 274, - SAMPLES_PER_PIXEL: 277, - ROWS_PER_STRIP: 278, - STRIP_BYTE_COUNTS: 279, - X_RESOLUTION: 282, - Y_RESOLUTION: 283, - PLANAR_CONFIGURATION: 284, - RESOLUTION_UNIT: 296, - SOFTWARE: 305, - COLOR_MAP: 320, - SAMPLE_FORMAT: 339, - MODEL_PIXEL_SCALE: 33550, // [GeoTIFF] TYPE: double N: 3 - MODEL_TIEPOINT: 33922, // [GeoTIFF] TYPE: double N: 6 * NUM_TIEPOINTS - GEO_KEY_DIRECTORY: 34735, // [GeoTIFF] TYPE: short N: >= 4 - GEO_DOUBLE_PARAMS: 34736, // [GeoTIFF] TYPE: short N: variable - GEO_ASCII_PARAMS: 34737, // [GeoTIFF] TYPE: ascii N: variable - }); + copyAt: function ( index1, attribute, index2 ) { - const typeMapping = new Map([ - [Type.BYTE, Uint8Array], - [Type.ASCII, Uint8Array], - [Type.SHORT, Uint16Array], - [Type.LONG, Uint32Array], - [Type.RATIONAL, Uint32Array], - [Type.SBYTE, Int8Array], - [Type.UNDEFINED, Uint8Array], - [Type.SSHORT, Int16Array], - [Type.SLONG, Int32Array], - [Type.SRATIONAL, Int32Array], - [Type.FLOAT, Float32Array], - [Type.DOUBLE, Float64Array], - ]); + index1 *= this.itemSize; + index2 *= attribute.itemSize; - class IFDEntry{ + for ( let i = 0, l = this.itemSize; i < l; i ++ ) { - constructor(tag, type, count, offset, value){ - this.tag = tag; - this.type = type; - this.count = count; - this.offset = offset; - this.value = value; - } + this.array[ index1 + i ] = attribute.array[ index2 + i ]; - } + } - class Image{ + return this; - constructor(){ - this.width = 0; - this.height = 0; - this.buffer = null; - this.metadata = []; - } + }, - } + copyArray: function ( array ) { - class Reader{ + this.array.set( array ); - constructor(){ + return this; - } + }, - static read(data){ + copyColorsArray: function ( colors ) { - let endiannessTag = String.fromCharCode(...Array.from(data.slice(0, 2))); - let endianness = Endianness.fromValue(endiannessTag); + const array = this.array; + let offset = 0; - let tiffCheckTag = data.readUInt8(2); + for ( let i = 0, l = colors.length; i < l; i ++ ) { - if(tiffCheckTag !== 42){ - throw new Error("not a valid tiff file"); - } + let color = colors[ i ]; - let offsetToFirstIFD = data.readUInt32LE(4); + if ( color === undefined ) { - console.log("offsetToFirstIFD", offsetToFirstIFD); + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); - let ifds = []; - let IFDsRead = false; - let currentIFDOffset = offsetToFirstIFD; - let i = 0; - while(IFDsRead || i < 100){ + } - console.log("currentIFDOffset", currentIFDOffset); - let numEntries = data.readUInt16LE(currentIFDOffset); - let nextIFDOffset = data.readUInt32LE(currentIFDOffset + 2 + numEntries * 12); + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; - console.log("next offset: ", currentIFDOffset + 2 + numEntries * 12); + } - let entryBuffer = data.slice(currentIFDOffset + 2, currentIFDOffset + 2 + 12 * numEntries); + return this; - for(let i = 0; i < numEntries; i++){ - let tag = Tag.fromValue(entryBuffer.readUInt16LE(i * 12)); - let type = Type.fromValue(entryBuffer.readUInt16LE(i * 12 + 2)); - let count = entryBuffer.readUInt32LE(i * 12 + 4); - let offsetOrValue = entryBuffer.readUInt32LE(i * 12 + 8); - let valueBytes = type.bytes * count; + }, - let value; - if(valueBytes <= 4){ - value = offsetOrValue; - }else { - let valueBuffer = new Uint8Array(valueBytes); - valueBuffer.set(data.slice(offsetOrValue, offsetOrValue + valueBytes)); - - let ArrayType = typeMapping.get(type); + copyVector2sArray: function ( vectors ) { - value = new ArrayType(valueBuffer.buffer); + const array = this.array; + let offset = 0; - if(type === Type.ASCII){ - value = String.fromCharCode(...value); - } - } + for ( let i = 0, l = vectors.length; i < l; i ++ ) { - let ifd = new IFDEntry(tag, type, count, offsetOrValue, value); + let vector = vectors[ i ]; - ifds.push(ifd); - } + if ( vector === undefined ) { - console.log("nextIFDOffset", nextIFDOffset); + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); - if(nextIFDOffset === 0){ - break; } - currentIFDOffset = nextIFDOffset; - i++; + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + } - let ifdForTag = (tag) => { - for(let entry of ifds){ - if(entry.tag === tag){ - return entry; - } - } + return this; - return null; - }; + }, - let width = ifdForTag(Tag.IMAGE_WIDTH, ifds).value; - let height = ifdForTag(Tag.IMAGE_HEIGHT, ifds).value; - let compression = ifdForTag(Tag.COMPRESSION, ifds).value; - let rowsPerStrip = ifdForTag(Tag.ROWS_PER_STRIP, ifds).value; - let ifdStripOffsets = ifdForTag(Tag.STRIP_OFFSETS, ifds); - let ifdStripByteCounts = ifdForTag(Tag.STRIP_BYTE_COUNTS, ifds); + copyVector3sArray: function ( vectors ) { - let numStrips = Math.ceil(height / rowsPerStrip); + const array = this.array; + let offset = 0; - let stripByteCounts = []; - for(let i = 0; i < ifdStripByteCounts.count; i++){ - let type = ifdStripByteCounts.type; - let offset = ifdStripByteCounts.offset + i * type.bytes; + for ( let i = 0, l = vectors.length; i < l; i ++ ) { - let value; - if(type === Type.SHORT){ - value = data.readUInt16LE(offset); - }else if(type === Type.LONG){ - value = data.readUInt32LE(offset); - } + let vector = vectors[ i ]; - stripByteCounts.push(value); - } + if ( vector === undefined ) { - let stripOffsets = []; - for(let i = 0; i < ifdStripOffsets.count; i++){ - let type = ifdStripOffsets.type; - let offset = ifdStripOffsets.offset + i * type.bytes; + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); - let value; - if(type === Type.SHORT){ - value = data.readUInt16LE(offset); - }else if(type === Type.LONG){ - value = data.readUInt32LE(offset); } - stripOffsets.push(value); + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + } - let imageBuffer = new Uint8Array(width * height * 3); - - let linesProcessed = 0; - for(let i = 0; i < numStrips; i++){ - let stripOffset = stripOffsets[i]; - let stripBytes = stripByteCounts[i]; - let stripData = data.slice(stripOffset, stripOffset + stripBytes); - let lineBytes = width * 3; - for(let y = 0; y < rowsPerStrip; y++){ - let line = stripData.slice(y * lineBytes, y * lineBytes + lineBytes); - imageBuffer.set(line, linesProcessed * lineBytes); - - if(line.length === lineBytes){ - linesProcessed++; - }else { - break; - } + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + const array = this.array; + let offset = 0; + + for ( let i = 0, l = vectors.length; i < l; i ++ ) { + + let vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + } - console.log(`width: ${width}`); - console.log(`height: ${height}`); - console.log(`numStrips: ${numStrips}`); - console.log("stripByteCounts", stripByteCounts.join(", ")); - console.log("stripOffsets", stripOffsets.join(", ")); + return this; - let image = new Image(); - image.width = width; - image.height = height; - image.buffer = imageBuffer; - image.metadata = ifds; + }, - return image; - } + applyMatrix3: function ( m ) { - } + if ( this.itemSize === 2 ) { + for ( let i = 0, l = this.count; i < l; i ++ ) { - class Exporter{ + _vector2$1.fromBufferAttribute( this, i ); + _vector2$1.applyMatrix3( m ); - constructor(){ + this.setXY( i, _vector2$1.x, _vector2$1.y ); - } + } - static toTiffBuffer(image, params = {}){ + } else if ( this.itemSize === 3 ) { - let offsetToFirstIFD = 8; - - let headerBuffer = new Uint8Array([0x49, 0x49, 42, 0, offsetToFirstIFD, 0, 0, 0]); + for ( let i = 0, l = this.count; i < l; i ++ ) { - let [width, height] = [image.width, image.height]; + _vector$3.fromBufferAttribute( this, i ); + _vector$3.applyMatrix3( m ); - let ifds = [ - new IFDEntry(Tag.IMAGE_WIDTH, Type.SHORT, 1, null, width), - new IFDEntry(Tag.IMAGE_HEIGHT, Type.SHORT, 1, null, height), - new IFDEntry(Tag.BITS_PER_SAMPLE, Type.SHORT, 4, null, new Uint16Array([8, 8, 8, 8])), - new IFDEntry(Tag.COMPRESSION, Type.SHORT, 1, null, 1), - new IFDEntry(Tag.PHOTOMETRIC_INTERPRETATION, Type.SHORT, 1, null, 2), - new IFDEntry(Tag.ORIENTATION, Type.SHORT, 1, null, 1), - new IFDEntry(Tag.SAMPLES_PER_PIXEL, Type.SHORT, 1, null, 4), - new IFDEntry(Tag.ROWS_PER_STRIP, Type.LONG, 1, null, height), - new IFDEntry(Tag.STRIP_BYTE_COUNTS, Type.LONG, 1, null, width * height * 3), - new IFDEntry(Tag.PLANAR_CONFIGURATION, Type.SHORT, 1, null, 1), - new IFDEntry(Tag.RESOLUTION_UNIT, Type.SHORT, 1, null, 1), - new IFDEntry(Tag.SOFTWARE, Type.ASCII, 6, null, "......"), - new IFDEntry(Tag.STRIP_OFFSETS, Type.LONG, 1, null, null), - new IFDEntry(Tag.X_RESOLUTION, Type.RATIONAL, 1, null, new Uint32Array([1, 1])), - new IFDEntry(Tag.Y_RESOLUTION, Type.RATIONAL, 1, null, new Uint32Array([1, 1])), - ]; + this.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z ); + + } - if(params.ifdEntries){ - ifds.push(...params.ifdEntries); } - let valueOffset = offsetToFirstIFD + 2 + ifds.length * 12 + 4; + return this; - // create 12 byte buffer for each ifd and variable length buffers for ifd values - let ifdEntryBuffers = new Map(); - let ifdValueBuffers = new Map(); - for(let ifd of ifds){ - let entryBuffer = new ArrayBuffer(12); - let entryView = new DataView(entryBuffer); + }, - let valueBytes = ifd.type.bytes * ifd.count; + applyMatrix4: function ( m ) { - entryView.setUint16(0, ifd.tag.value, true); - entryView.setUint16(2, ifd.type.value, true); - entryView.setUint32(4, ifd.count, true); + for ( let i = 0, l = this.count; i < l; i ++ ) { - if(ifd.count === 1 && ifd.type.bytes <= 4){ - entryView.setUint32(8, ifd.value, true); - }else { - entryView.setUint32(8, valueOffset, true); + _vector$3.x = this.getX( i ); + _vector$3.y = this.getY( i ); + _vector$3.z = this.getZ( i ); - let valueBuffer = new Uint8Array(ifd.count * ifd.type.bytes); - if(ifd.type === Type.ASCII){ - valueBuffer.set(new Uint8Array(ifd.value.split("").map(c => c.charCodeAt(0)))); - }else { - valueBuffer.set(new Uint8Array(ifd.value.buffer)); - } - ifdValueBuffers.set(ifd.tag, valueBuffer); + _vector$3.applyMatrix4( m ); - valueOffset = valueOffset + valueBuffer.byteLength; - } + this.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z ); - ifdEntryBuffers.set(ifd.tag, entryBuffer); } - let imageBufferOffset = valueOffset; + return this; - new DataView(ifdEntryBuffers.get(Tag.STRIP_OFFSETS)).setUint32(8, imageBufferOffset, true); + }, - let concatBuffers = (buffers) => { + applyNormalMatrix: function ( m ) { - let totalLength = buffers.reduce( (sum, buffer) => (sum + buffer.byteLength), 0); - let merged = new Uint8Array(totalLength); + for ( let i = 0, l = this.count; i < l; i ++ ) { - let offset = 0; - for(let buffer of buffers){ - merged.set(new Uint8Array(buffer), offset); - offset += buffer.byteLength; - } + _vector$3.x = this.getX( i ); + _vector$3.y = this.getY( i ); + _vector$3.z = this.getZ( i ); - return merged; - }; - - let ifdBuffer = concatBuffers([ - new Uint16Array([ifds.length]), - ...ifdEntryBuffers.values(), - new Uint32Array([0])]); - let ifdValueBuffer = concatBuffers([...ifdValueBuffers.values()]); + _vector$3.applyNormalMatrix( m ); - let tiffBuffer = concatBuffers([ - headerBuffer, - ifdBuffer, - ifdValueBuffer, - image.buffer - ]); + this.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z ); - return {width: width, height: height, buffer: tiffBuffer}; - } + } - } + return this; - exports.Tag = Tag; - exports.Type = Type; - exports.IFDEntry = IFDEntry; - exports.Image = Image; - exports.Reader = Reader; - exports.Exporter = Exporter; + }, - return exports; + transformDirection: function ( m ) { - }({})); + for ( let i = 0, l = this.count; i < l; i ++ ) { - function updateAzimuth(viewer, measure){ + _vector$3.x = this.getX( i ); + _vector$3.y = this.getY( i ); + _vector$3.z = this.getZ( i ); - const azimuth = measure.azimuth; + _vector$3.transformDirection( m ); - const isOkay = measure.points.length === 2; + this.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z ); - azimuth.node.visible = isOkay && measure.showAzimuth; + } - if(!azimuth.node.visible){ - return; - } + return this; - const camera = viewer.scene.getActiveCamera(); - const renderAreaSize = viewer.renderer.getSize(new THREE.Vector2()); - const width = renderAreaSize.width; - const height = renderAreaSize.height; - - const [p0, p1] = measure.points; - const r = p0.position.distanceTo(p1.position); - const northVec = Utils.getNorthVec(p0.position, r, viewer.getProjection()); - const northPos = p0.position.clone().add(northVec); + }, - azimuth.center.position.copy(p0.position); - azimuth.center.scale.set(2, 2, 2); - - azimuth.center.visible = false; - // azimuth.target.visible = false; + set: function ( value, offset = 0 ) { + this.array.set( value, offset ); - { // north - azimuth.north.position.copy(northPos); - azimuth.north.scale.set(2, 2, 2); + return this; - let distance = azimuth.north.position.distanceTo(camera.position); - let pr = Utils.projectedRadius(1, camera, distance, width, height); + }, - let scale = (5 / pr); - azimuth.north.scale.set(scale, scale, scale); - } + getX: function ( index ) { - { // target - azimuth.target.position.copy(p1.position); - azimuth.target.position.z = azimuth.north.position.z; + return this.array[ index * this.itemSize ]; - let distance = azimuth.target.position.distanceTo(camera.position); - let pr = Utils.projectedRadius(1, camera, distance, width, height); + }, - let scale = (5 / pr); - azimuth.target.scale.set(scale, scale, scale); - } + setX: function ( index, x ) { + this.array[ index * this.itemSize ] = x; - azimuth.circle.position.copy(p0.position); - azimuth.circle.scale.set(r, r, r); - azimuth.circle.material.resolution.set(width, height); + return this; - // to target - azimuth.centerToTarget.geometry.setPositions([ - 0, 0, 0, - ...p1.position.clone().sub(p0.position).toArray(), - ]); - azimuth.centerToTarget.position.copy(p0.position); - azimuth.centerToTarget.geometry.verticesNeedUpdate = true; - azimuth.centerToTarget.geometry.computeBoundingSphere(); - azimuth.centerToTarget.computeLineDistances(); - azimuth.centerToTarget.material.resolution.set(width, height); + }, - // to target ground - azimuth.centerToTargetground.geometry.setPositions([ - 0, 0, 0, - p1.position.x - p0.position.x, - p1.position.y - p0.position.y, - 0, - ]); - azimuth.centerToTargetground.position.copy(p0.position); - azimuth.centerToTargetground.geometry.verticesNeedUpdate = true; - azimuth.centerToTargetground.geometry.computeBoundingSphere(); - azimuth.centerToTargetground.computeLineDistances(); - azimuth.centerToTargetground.material.resolution.set(width, height); + getY: function ( index ) { - // to north - azimuth.centerToNorth.geometry.setPositions([ - 0, 0, 0, - northPos.x - p0.position.x, - northPos.y - p0.position.y, - 0, - ]); - azimuth.centerToNorth.position.copy(p0.position); - azimuth.centerToNorth.geometry.verticesNeedUpdate = true; - azimuth.centerToNorth.geometry.computeBoundingSphere(); - azimuth.centerToNorth.computeLineDistances(); - azimuth.centerToNorth.material.resolution.set(width, height); + return this.array[ index * this.itemSize + 1 ]; - // label - const radians = Utils.computeAzimuth(p0.position, p1.position, viewer.getProjection()); - let degrees = THREE.Math.radToDeg(radians); - if(degrees < 0){ - degrees = 360 + degrees; - } - const txtDegrees = `${degrees.toFixed(2)}°`; - const labelDir = northPos.clone().add(p1.position).multiplyScalar(0.5).sub(p0.position); - if(labelDir.length() > 0){ - labelDir.z = 0; - labelDir.normalize(); - const labelVec = labelDir.clone().multiplyScalar(r); - const labelPos = p0.position.clone().add(labelVec); - azimuth.label.position.copy(labelPos); - } - azimuth.label.setText(txtDegrees); - let distance = azimuth.label.position.distanceTo(camera.position); - let pr = Utils.projectedRadius(1, camera, distance, width, height); - let scale = (70 / pr); - azimuth.label.scale.set(scale, scale, scale); - } + }, - class MeasuringTool extends EventDispatcher{ - constructor (viewer) { - super(); + setY: function ( index, y ) { - this.viewer = viewer; - this.renderer = viewer.renderer; + this.array[ index * this.itemSize + 1 ] = y; - this.addEventListener('start_inserting_measurement', e => { - this.viewer.dispatchEvent({ - type: 'cancel_insertions' - }); - }); + return this; - this.showLabels = true; - this.scene = new THREE.Scene(); - this.scene.name = 'scene_measurement'; - this.light = new THREE.PointLight(0xffffff, 1.0); - this.scene.add(this.light); + }, - this.viewer.inputHandler.registerInteractiveScene(this.scene); + getZ: function ( index ) { - this.onRemove = (e) => { this.scene.remove(e.measurement);}; - this.onAdd = e => {this.scene.add(e.measurement);}; + return this.array[ index * this.itemSize + 2 ]; - for(let measurement of viewer.scene.measurements){ - this.onAdd({measurement: measurement}); - } + }, - viewer.addEventListener("update", this.update.bind(this)); - viewer.addEventListener("render.pass.perspective_overlay", this.render.bind(this)); - viewer.addEventListener("scene_changed", this.onSceneChange.bind(this)); + setZ: function ( index, z ) { - viewer.scene.addEventListener('measurement_added', this.onAdd); - viewer.scene.addEventListener('measurement_removed', this.onRemove); - } + this.array[ index * this.itemSize + 2 ] = z; - onSceneChange(e){ - if(e.oldScene){ - e.oldScene.removeEventListener('measurement_added', this.onAdd); - e.oldScene.removeEventListener('measurement_removed', this.onRemove); - } + return this; - e.scene.addEventListener('measurement_added', this.onAdd); - e.scene.addEventListener('measurement_removed', this.onRemove); - } + }, - startInsertion (args = {}) { - let domElement = this.viewer.renderer.domElement; + getW: function ( index ) { - let measure = new Measure(); + return this.array[ index * this.itemSize + 3 ]; - this.dispatchEvent({ - type: 'start_inserting_measurement', - measure: measure - }); + }, - const pick = (defaul, alternative) => { - if(defaul != null){ - return defaul; - }else { - return alternative; - } - }; + setW: function ( index, w ) { - measure.showDistances = (args.showDistances === null) ? true : args.showDistances; + this.array[ index * this.itemSize + 3 ] = w; - measure.showArea = pick(args.showArea, false); - measure.showAngles = pick(args.showAngles, false); - measure.showCoordinates = pick(args.showCoordinates, false); - measure.showHeight = pick(args.showHeight, false); - measure.showCircle = pick(args.showCircle, false); - measure.showAzimuth = pick(args.showAzimuth, false); - measure.showEdges = pick(args.showEdges, true); - measure.closed = pick(args.closed, false); - measure.maxMarkers = pick(args.maxMarkers, Infinity); + return this; - measure.name = args.name || 'Measurement'; + }, - this.scene.add(measure); + setXY: function ( index, x, y ) { - let cancel = { - removeLastMarker: measure.maxMarkers > 3, - callback: null - }; + index *= this.itemSize; - let insertionCallback = (e) => { - if (e.button === THREE.MOUSE.LEFT) { - measure.addMarker(measure.points[measure.points.length - 1].position.clone()); + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; - if (measure.points.length >= measure.maxMarkers) { - cancel.callback(); - } + return this; - this.viewer.inputHandler.startDragging( - measure.spheres[measure.spheres.length - 1]); - } else if (e.button === THREE.MOUSE.RIGHT) { - cancel.callback(); - } - }; + }, - cancel.callback = e => { - if (cancel.removeLastMarker) { - measure.removeMarker(measure.points.length - 1); - } - domElement.removeEventListener('mouseup', insertionCallback, true); - this.viewer.removeEventListener('cancel_insertions', cancel.callback); - }; + setXYZ: function ( index, x, y, z ) { - if (measure.maxMarkers > 1) { - this.viewer.addEventListener('cancel_insertions', cancel.callback); - domElement.addEventListener('mouseup', insertionCallback, true); - } + index *= this.itemSize; - measure.addMarker(new THREE.Vector3(0, 0, 0)); - this.viewer.inputHandler.startDragging( - measure.spheres[measure.spheres.length - 1]); + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; - this.viewer.scene.addMeasurement(measure); + return this; - return measure; - } - - update(){ - let camera = this.viewer.scene.getActiveCamera(); - let domElement = this.renderer.domElement; - let measurements = this.viewer.scene.measurements; + }, - const renderAreaSize = this.renderer.getSize(new THREE.Vector2()); - let clientWidth = renderAreaSize.width; - let clientHeight = renderAreaSize.height; + setXYZW: function ( index, x, y, z, w ) { - this.light.position.copy(camera.position); + index *= this.itemSize; - // make size independant of distance - for (let measure of measurements) { - measure.lengthUnit = this.viewer.lengthUnit; - measure.lengthUnitDisplay = this.viewer.lengthUnitDisplay; - measure.update(); + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; - updateAzimuth(viewer, measure); + return this; - // spheres - for(let sphere of measure.spheres){ - let distance = camera.position.distanceTo(sphere.getWorldPosition(new THREE.Vector3())); - let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); - let scale = (15 / pr); - sphere.scale.set(scale, scale, scale); - } + }, - // labels - let labels = measure.edgeLabels.concat(measure.angleLabels); - for(let label of labels){ - let distance = camera.position.distanceTo(label.getWorldPosition(new THREE.Vector3())); - let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); - let scale = (70 / pr); + onUpload: function ( callback ) { - if(Potree.debug.scale){ - scale = (Potree.debug.scale / pr); - } + this.onUploadCallback = callback; - label.scale.set(scale, scale, scale); - } + return this; - // coordinate labels - for (let j = 0; j < measure.coordinateLabels.length; j++) { - let label = measure.coordinateLabels[j]; - let sphere = measure.spheres[j]; + }, - let distance = camera.position.distanceTo(sphere.getWorldPosition(new THREE.Vector3())); + clone: function () { - let screenPos = sphere.getWorldPosition(new THREE.Vector3()).clone().project(camera); - screenPos.x = Math.round((screenPos.x + 1) * clientWidth / 2); - screenPos.y = Math.round((-screenPos.y + 1) * clientHeight / 2); - screenPos.z = 0; - screenPos.y -= 30; + return new this.constructor( this.array, this.itemSize ).copy( this ); - let labelPos = new THREE.Vector3( - (screenPos.x / clientWidth) * 2 - 1, - -(screenPos.y / clientHeight) * 2 + 1, - 0.5 ); - labelPos.unproject(camera); - if(this.viewer.scene.cameraMode == CameraMode.PERSPECTIVE) { - let direction = labelPos.sub(camera.position).normalize(); - labelPos = new THREE.Vector3().addVectors( - camera.position, direction.multiplyScalar(distance)); + }, - } - label.position.copy(labelPos); - let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); - let scale = (70 / pr); - label.scale.set(scale, scale, scale); - } + toJSON: function () { - // height label - if (measure.showHeight) { - let label = measure.heightLabel; + return { + itemSize: this.itemSize, + type: this.array.constructor.name, + array: Array.prototype.slice.call( this.array ), + normalized: this.normalized + }; - { - let distance = label.position.distanceTo(camera.position); - let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); - let scale = (70 / pr); - label.scale.set(scale, scale, scale); - } + } - { // height edge - let edge = measure.heightEdge; + } ); - let sorted = measure.points.slice().sort((a, b) => a.position.z - b.position.z); - let lowPoint = sorted[0].position.clone(); - let highPoint = sorted[sorted.length - 1].position.clone(); - let min = lowPoint.z; - let max = highPoint.z; + // - let start = new THREE.Vector3(highPoint.x, highPoint.y, min); - let end = new THREE.Vector3(highPoint.x, highPoint.y, max); + function Int8BufferAttribute( array, itemSize, normalized ) { - let lowScreen = lowPoint.clone().project(camera); - let startScreen = start.clone().project(camera); - let endScreen = end.clone().project(camera); + BufferAttribute.call( this, new Int8Array( array ), itemSize, normalized ); - let toPixelCoordinates = v => { - let r = v.clone().addScalar(1).divideScalar(2); - r.x = r.x * clientWidth; - r.y = r.y * clientHeight; - r.z = 0; + } - return r; - }; + Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int8BufferAttribute.prototype.constructor = Int8BufferAttribute; - let lowEL = toPixelCoordinates(lowScreen); - let startEL = toPixelCoordinates(startScreen); - let endEL = toPixelCoordinates(endScreen); - let lToS = lowEL.distanceTo(startEL); - let sToE = startEL.distanceTo(endEL); + function Uint8BufferAttribute( array, itemSize, normalized ) { - edge.geometry.lineDistances = [0, lToS, lToS, lToS + sToE]; - edge.geometry.lineDistancesNeedUpdate = true; + BufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized ); - edge.material.dashSize = 10; - edge.material.gapSize = 10; - } - } + } - { // area label - let label = measure.areaLabel; - let distance = label.position.distanceTo(camera.position); - let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); + Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute; - let scale = (70 / pr); - label.scale.set(scale, scale, scale); - } - { // radius label - let label = measure.circleRadiusLabel; - let distance = label.position.distanceTo(camera.position); - let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); + function Uint8ClampedBufferAttribute( array, itemSize, normalized ) { - let scale = (70 / pr); - label.scale.set(scale, scale, scale); - } + BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized ); - { // edges - const materials = [ - measure.circleRadiusLine.material, - ...measure.edges.map( (e) => e.material), - measure.heightEdge.material, - measure.circleLine.material, - ]; + } - for(const material of materials){ - material.resolution.set(clientWidth, clientHeight); - } - } + Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute; - if(!this.showLabels){ - const labels = [ - ...measure.sphereLabels, - ...measure.edgeLabels, - ...measure.angleLabels, - ...measure.coordinateLabels, - measure.heightLabel, - measure.areaLabel, - measure.circleRadiusLabel, - ]; + function Int16BufferAttribute( array, itemSize, normalized ) { - for(const label of labels){ - label.visible = false; - } - } - } - } + BufferAttribute.call( this, new Int16Array( array ), itemSize, normalized ); - render(){ - this.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera()); - } - }; + } - class Message{ + Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int16BufferAttribute.prototype.constructor = Int16BufferAttribute; - constructor(content){ - this.content = content; - let closeIcon = `${exports.resourcePath}/icons/close.svg`; + function Uint16BufferAttribute( array, itemSize, normalized ) { - this.element = $(` -
- - -
`); + BufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized ); - this.elClose = this.element.find("img[name=close]"); + } - this.elContainer = this.element.find("span[name=content_container]"); + Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute; - if(typeof content === "string"){ - this.elContainer.append($(`${content}`)); - }else { - this.elContainer.append(content); - } - } + function Int32BufferAttribute( array, itemSize, normalized ) { - setMessage(content){ - this.elContainer.empty(); - if(typeof content === "string"){ - this.elContainer.append($(`${content}`)); - }else { - this.elContainer.append(content); - } - } + BufferAttribute.call( this, new Int32Array( array ), itemSize, normalized ); } - class PointCloudSM{ + Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int32BufferAttribute.prototype.constructor = Int32BufferAttribute; - constructor(potreeRenderer){ - this.potreeRenderer = potreeRenderer; - this.threeRenderer = this.potreeRenderer.threeRenderer; + function Uint32BufferAttribute( array, itemSize, normalized ) { - this.target = new THREE.WebGLRenderTarget(2 * 1024, 2 * 1024, { - minFilter: THREE.LinearFilter, - magFilter: THREE.LinearFilter, - format: THREE.RGBAFormat, - type: THREE.FloatType - }); - this.target.depthTexture = new THREE.DepthTexture(); - this.target.depthTexture.type = THREE.UnsignedIntType; + BufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized ); - //this.threeRenderer.setClearColor(0x000000, 1); - this.threeRenderer.setClearColor(0xff0000, 1); + } - //HACK? removed while moving to three.js 109 - //this.threeRenderer.clearTarget(this.target, true, true, true); - { - const oldTarget = this.threeRenderer.getRenderTarget(); + Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute; - this.threeRenderer.setRenderTarget(this.target); - this.threeRenderer.clear(true, true, true); + function Float16BufferAttribute( array, itemSize, normalized ) { - this.threeRenderer.setRenderTarget(oldTarget); - } - } + BufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized ); - setLight(light){ - this.light = light; + } - let fov = (180 * light.angle) / Math.PI; - let aspect = light.shadow.mapSize.width / light.shadow.mapSize.height; - let near = 0.1; - let far = light.distance === 0 ? 10000 : light.distance; - this.camera = new THREE.PerspectiveCamera(fov, aspect, near, far); - this.camera.up.set(0, 0, 1); - this.camera.position.copy(light.position); + Float16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float16BufferAttribute.prototype.constructor = Float16BufferAttribute; + Float16BufferAttribute.prototype.isFloat16BufferAttribute = true; - let target = new THREE.Vector3().subVectors(light.position, light.getWorldDirection(new THREE.Vector3())); - this.camera.lookAt(target); + function Float32BufferAttribute( array, itemSize, normalized ) { - this.camera.updateProjectionMatrix(); - this.camera.updateMatrix(); - this.camera.updateMatrixWorld(); - this.camera.matrixWorldInverse.getInverse(this.camera.matrixWorld); - } + BufferAttribute.call( this, new Float32Array( array ), itemSize, normalized ); - setSize(width, height){ - if(this.target.width !== width || this.target.height !== height){ - this.target.dispose(); - } - this.target.setSize(width, height); - } + } - render(scene, camera){ + Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float32BufferAttribute.prototype.constructor = Float32BufferAttribute; - this.threeRenderer.setClearColor(0x000000, 1); - - const oldTarget = this.threeRenderer.getRenderTarget(); - this.threeRenderer.setRenderTarget(this.target); - this.threeRenderer.clear(true, true, true); + function Float64BufferAttribute( array, itemSize, normalized ) { - this.potreeRenderer.render(scene, this.camera, this.target, {}); + BufferAttribute.call( this, new Float64Array( array ), itemSize, normalized ); + + } + + Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; + + class DirectGeometry { + + constructor() { + + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; - this.threeRenderer.setRenderTarget(oldTarget); } + computeGroups( geometry ) { - } + const groups = []; - class ProfileTool extends EventDispatcher { - constructor (viewer) { - super(); + let group, i; + let materialIndex = undefined; - this.viewer = viewer; - this.renderer = viewer.renderer; + const faces = geometry.faces; - this.addEventListener('start_inserting_profile', e => { - this.viewer.dispatchEvent({ - type: 'cancel_insertions' - }); - }); + for ( i = 0; i < faces.length; i ++ ) { - this.scene = new THREE.Scene(); - this.scene.name = 'scene_profile'; - this.light = new THREE.PointLight(0xffffff, 1.0); - this.scene.add(this.light); + const face = faces[ i ]; - this.viewer.inputHandler.registerInteractiveScene(this.scene); + // materials - this.onRemove = e => this.scene.remove(e.profile); - this.onAdd = e => this.scene.add(e.profile); + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } - for(let profile of viewer.scene.profiles){ - this.onAdd({profile: profile}); } - viewer.addEventListener("update", this.update.bind(this)); - viewer.addEventListener("render.pass.perspective_overlay", this.render.bind(this)); - viewer.addEventListener("scene_changed", this.onSceneChange.bind(this)); + if ( group !== undefined ) { - viewer.scene.addEventListener('profile_added', this.onAdd); - viewer.scene.addEventListener('profile_removed', this.onRemove); - } + group.count = ( i * 3 ) - group.start; + groups.push( group ); - onSceneChange(e){ - if(e.oldScene){ - e.oldScene.removeEventListeners('profile_added', this.onAdd); - e.oldScene.removeEventListeners('profile_removed', this.onRemove); } - e.scene.addEventListener('profile_added', this.onAdd); - e.scene.addEventListener('profile_removed', this.onRemove); + this.groups = groups; + } - startInsertion (args = {}) { - let domElement = this.viewer.renderer.domElement; + fromGeometry( geometry ) { - let profile = new Profile(); - profile.name = args.name || 'Profile'; + const faces = geometry.faces; + const vertices = geometry.vertices; + const faceVertexUvs = geometry.faceVertexUvs; - this.dispatchEvent({ - type: 'start_inserting_profile', - profile: profile - }); + const hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + const hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; - this.scene.add(profile); + // morphs - let cancel = { - callback: null - }; + const morphTargets = geometry.morphTargets; + const morphTargetsLength = morphTargets.length; - let insertionCallback = (e) => { - if(e.button === THREE.MOUSE.LEFT){ - if(profile.points.length <= 1){ - let camera = this.viewer.scene.getActiveCamera(); - let distance = camera.position.distanceTo(profile.points[0]); - let clientSize = this.viewer.renderer.getSize(new THREE.Vector2()); - let pr = Utils.projectedRadius(1, camera, distance, clientSize.width, clientSize.height); - let width = (10 / pr); + let morphTargetsPosition; - profile.setWidth(width); - } + if ( morphTargetsLength > 0 ) { - profile.addMarker(profile.points[profile.points.length - 1].clone()); + morphTargetsPosition = []; + + for ( let i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = { + name: morphTargets[ i ].name, + data: [] + }; - this.viewer.inputHandler.startDragging( - profile.spheres[profile.spheres.length - 1]); - } else if (e.button === THREE.MOUSE.RIGHT) { - cancel.callback(); } - }; - cancel.callback = e => { - profile.removeMarker(profile.points.length - 1); - domElement.removeEventListener('mouseup', insertionCallback, true); - this.viewer.removeEventListener('cancel_insertions', cancel.callback); - }; + this.morphTargets.position = morphTargetsPosition; - this.viewer.addEventListener('cancel_insertions', cancel.callback); - domElement.addEventListener('mouseup', insertionCallback, true); + } - profile.addMarker(new THREE.Vector3(0, 0, 0)); - this.viewer.inputHandler.startDragging( - profile.spheres[profile.spheres.length - 1]); + const morphNormals = geometry.morphNormals; + const morphNormalsLength = morphNormals.length; - this.viewer.scene.addProfile(profile); + let morphTargetsNormal; - return profile; - } - - update(){ - let camera = this.viewer.scene.getActiveCamera(); - let profiles = this.viewer.scene.profiles; - let renderAreaSize = this.viewer.renderer.getSize(new THREE.Vector2()); - let clientWidth = renderAreaSize.width; - let clientHeight = renderAreaSize.height; + if ( morphNormalsLength > 0 ) { - this.light.position.copy(camera.position); + morphTargetsNormal = []; + + for ( let i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = { + name: morphNormals[ i ].name, + data: [] + }; - // make size independant of distance - for(let profile of profiles){ - for(let sphere of profile.spheres){ - let distance = camera.position.distanceTo(sphere.getWorldPosition(new THREE.Vector3())); - let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); - let scale = (15 / pr); - sphere.scale.set(scale, scale, scale); } + + this.morphTargets.normal = morphTargetsNormal; + } - } - render(){ - this.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera()); - } + // skins - } + const skinIndices = geometry.skinIndices; + const skinWeights = geometry.skinWeights; - class ScreenBoxSelectTool extends EventDispatcher{ + const hasSkinIndices = skinIndices.length === vertices.length; + const hasSkinWeights = skinWeights.length === vertices.length; - constructor(viewer){ - super(); + // - this.viewer = viewer; - this.scene = new THREE.Scene(); + if ( vertices.length > 0 && faces.length === 0 ) { - viewer.addEventListener("update", this.update.bind(this)); - viewer.addEventListener("render.pass.perspective_overlay", this.render.bind(this)); - viewer.addEventListener("scene_changed", this.onSceneChange.bind(this)); - } + console.error( 'THREE.DirectGeometry: Faceless geometries are not supported.' ); - onSceneChange(scene){ - console.log("scene changed"); - } + } - startInsertion(){ - let domElement = this.viewer.renderer.domElement; + for ( let i = 0; i < faces.length; i ++ ) { - let volume = new BoxVolume(); - volume.position.set(12345, 12345, 12345); - volume.showVolumeLabel = false; - volume.visible = false; - volume.update(); - this.viewer.scene.addVolume(volume); + const face = faces[ i ]; - this.importance = 10; + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); - let selectionBox = $(`
`); - $(domElement.parentElement).append(selectionBox); - selectionBox.css("right", "10px"); - selectionBox.css("bottom", "10px"); + const vertexNormals = face.vertexNormals; - let drag = e =>{ + if ( vertexNormals.length === 3 ) { - volume.visible = true; + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); - let mStart = e.drag.start; - let mEnd = e.drag.end; + } else { - let box2D = new THREE.Box2(); - box2D.expandByPoint(mStart); - box2D.expandByPoint(mEnd); + const normal = face.normal; - selectionBox.css("left", `${box2D.min.x}px`); - selectionBox.css("top", `${box2D.min.y}px`); - selectionBox.css("width", `${box2D.max.x - box2D.min.x}px`); - selectionBox.css("height", `${box2D.max.y - box2D.min.y}px`); + this.normals.push( normal, normal, normal ); - let camera = e.viewer.scene.getActiveCamera(); - let size = e.viewer.renderer.getSize(new THREE.Vector2()); - let frustumSize = new THREE.Vector2( - camera.right - camera.left, - camera.top - camera.bottom); + } - let screenCentroid = new THREE.Vector2().addVectors(e.drag.end, e.drag.start).multiplyScalar(0.5); - let ray = Utils.mouseToRay(screenCentroid, camera, size.width, size.height); + const vertexColors = face.vertexColors; - let diff = new THREE.Vector2().subVectors(e.drag.end, e.drag.start); - diff.divide(size).multiply(frustumSize); - - volume.position.copy(ray.origin); - volume.up.copy(camera.up); - volume.rotation.copy(camera.rotation); - volume.scale.set(diff.x, diff.y, 1000 * 100); + if ( vertexColors.length === 3 ) { - e.consume(); - }; + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); - let drop = e => { - this.importance = 0; + } else { - $(selectionBox).remove(); + const color = face.color; - this.viewer.inputHandler.deselectAll(); - this.viewer.inputHandler.toggleSelection(volume); + this.colors.push( color, color, color ); - let camera = e.viewer.scene.getActiveCamera(); - let size = e.viewer.renderer.getSize(new THREE.Vector2()); - let screenCentroid = new THREE.Vector2().addVectors(e.drag.end, e.drag.start).multiplyScalar(0.5); - let ray = Utils.mouseToRay(screenCentroid, camera, size.width, size.height); + } - let line = new THREE.Line3(ray.origin, new THREE.Vector3().addVectors(ray.origin, ray.direction)); + if ( hasFaceVertexUv === true ) { - this.removeEventListener("drag", drag); - this.removeEventListener("drop", drop); + const vertexUvs = faceVertexUvs[ 0 ][ i ]; - let allPointsNear = []; - let allPointsFar = []; + if ( vertexUvs !== undefined ) { - // TODO support more than one point cloud - for(let pointcloud of this.viewer.scene.pointclouds){ + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); - if(!pointcloud.visible){ - continue; } - let volCam = camera.clone(); - volCam.left = -volume.scale.x / 2; - volCam.right = +volume.scale.x / 2; - volCam.top = +volume.scale.y / 2; - volCam.bottom = -volume.scale.y / 2; - volCam.near = -volume.scale.z / 2; - volCam.far = +volume.scale.z / 2; - volCam.rotation.copy(volume.rotation); - volCam.position.copy(volume.position); + } - volCam.updateMatrix(); - volCam.updateMatrixWorld(); - volCam.updateProjectionMatrix(); - volCam.matrixWorldInverse.getInverse(volCam.matrixWorld); + if ( hasFaceVertexUv2 === true ) { - let ray = new THREE.Ray(volCam.getWorldPosition(new THREE.Vector3()), volCam.getWorldDirection(new THREE.Vector3())); - let rayInverse = new THREE.Ray( - ray.origin.clone().add(ray.direction.clone().multiplyScalar(volume.scale.z)), - ray.direction.clone().multiplyScalar(-1)); + const vertexUvs = faceVertexUvs[ 1 ][ i ]; - let pickerSettings = { - width: 8, - height: 8, - pickWindowSize: 8, - all: true, - pickClipped: true, - pointSizeType: PointSizeType.FIXED, - pointSize: 1}; - let pointsNear = pointcloud.pick(viewer, volCam, ray, pickerSettings); + if ( vertexUvs !== undefined ) { - volCam.rotateX(Math.PI); - volCam.updateMatrix(); - volCam.updateMatrixWorld(); - volCam.updateProjectionMatrix(); - volCam.matrixWorldInverse.getInverse(volCam.matrixWorld); - let pointsFar = pointcloud.pick(viewer, volCam, rayInverse, pickerSettings); + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } - allPointsNear.push(...pointsNear); - allPointsFar.push(...pointsFar); } - if(allPointsNear.length > 0 && allPointsFar.length > 0){ - let viewLine = new THREE.Line3(ray.origin, new THREE.Vector3().addVectors(ray.origin, ray.direction)); + // morphs - let closestOnLine = allPointsNear.map(p => viewLine.closestPointToPoint(p.position, false, new THREE.Vector3())); - let closest = closestOnLine.sort( (a, b) => ray.origin.distanceTo(a) - ray.origin.distanceTo(b))[0]; + for ( let j = 0; j < morphTargetsLength; j ++ ) { - let farthestOnLine = allPointsFar.map(p => viewLine.closestPointToPoint(p.position, false, new THREE.Vector3())); - let farthest = farthestOnLine.sort( (a, b) => ray.origin.distanceTo(b) - ray.origin.distanceTo(a))[0]; + const morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].data.push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); - let distance = closest.distanceTo(farthest); - let centroid = new THREE.Vector3().addVectors(closest, farthest).multiplyScalar(0.5); - volume.scale.z = distance * 1.1; - volume.position.copy(centroid); } - volume.clip = true; - }; + for ( let j = 0; j < morphNormalsLength; j ++ ) { - this.addEventListener("drag", drag); - this.addEventListener("drop", drop); + const morphNormal = morphNormals[ j ].vertexNormals[ i ]; - viewer.inputHandler.addInputListener(this); + morphTargetsNormal[ j ].data.push( morphNormal.a, morphNormal.b, morphNormal.c ); - return volume; - } + } - update(e){ - //console.log(e.delta) - } + // skins - render(){ - this.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera()); - } + if ( hasSkinIndices ) { - } + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); - class SpotLightHelper extends THREE.Object3D{ + } - constructor(light, color){ - super(); + if ( hasSkinWeights ) { - this.light = light; - this.color = color; + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); - //this.up.set(0, 0, 1); - this.updateMatrix(); - this.updateMatrixWorld(); + } - { // SPHERE - let sg = new THREE.SphereGeometry(1, 32, 32); - let sm = new THREE.MeshNormalMaterial(); - this.sphere = new THREE.Mesh(sg, sm); - this.sphere.scale.set(0.5, 0.5, 0.5); - this.add(this.sphere); } - { // LINES - + this.computeGroups( geometry ); - let positions = new Float32Array([ - +0, +0, +0, +0, +0, -1, + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; - +0, +0, +0, -1, -1, -1, - +0, +0, +0, +1, -1, -1, - +0, +0, +0, +1, +1, -1, - +0, +0, +0, -1, +1, -1, + if ( geometry.boundingSphere !== null ) { - -1, -1, -1, +1, -1, -1, - +1, -1, -1, +1, +1, -1, - +1, +1, -1, -1, +1, -1, - -1, +1, -1, -1, -1, -1, - ]); + this.boundingSphere = geometry.boundingSphere.clone(); - let geometry = new THREE.BufferGeometry(); - geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + } - let material = new THREE.LineBasicMaterial(); + if ( geometry.boundingBox !== null ) { - this.frustum = new THREE.LineSegments(geometry, material); - this.add(this.frustum); + this.boundingBox = geometry.boundingBox.clone(); } - this.update(); + return this; + } - update(){ + } - this.light.updateMatrix(); - this.light.updateMatrixWorld(); + function arrayMax( array ) { - let position = this.light.position; - //let target = new THREE.Vector3().addVectors( - // light.position, - // new THREE.Vector3().subVectors(light.position, this.light.getWorldDirection(new THREE.Vector3()))); - let target = new THREE.Vector3().addVectors( - light.position, this.light.getWorldDirection(new THREE.Vector3()).multiplyScalar(-1)); - - let quat = new THREE.Quaternion().setFromRotationMatrix( - new THREE.Matrix4().lookAt( position, target, new THREE.Vector3( 0, 0, 1 ) ) - ); + if ( array.length === 0 ) return - Infinity; - this.setRotationFromQuaternion(quat); - this.position.copy(position); + let max = array[ 0 ]; + for ( let i = 1, l = array.length; i < l; ++ i ) { - let coneLength = (this.light.distance > 0) ? this.light.distance : 1000; - let coneWidth = coneLength * Math.tan( this.light.angle * 0.5 ); + if ( array[ i ] > max ) max = array[ i ]; - this.frustum.scale.set(coneWidth, coneWidth, coneLength); - + } + return max; - //{ - // let fov = (180 * light.angle) / Math.PI; - // let aspect = light.shadow.mapSize.width / light.shadow.mapSize.height; - // let near = 0.1; - // let far = light.distance === 0 ? 10000 : light.distance; - // this.camera = new THREE.PerspectiveCamera(fov, aspect, near, far); - // this.camera.up.set(0, 0, 1); - // this.camera.position.copy(light.position); + } - // let target = new THREE.Vector3().addVectors(light.position, light.getWorldDirection(new THREE.Vector3())); - // this.camera.lookAt(target); + const TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + // Workaround for IE11 pre KB2929437. See #11440 + Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array + }; - // this.camera.updateProjectionMatrix(); - // this.camera.updateMatrix(); - // this.camera.updateMatrixWorld(); - // this.camera.matrixWorldInverse.getInverse(this.camera.matrixWorld); - //} + function getTypedArray( type, buffer ) { - } + return new TYPED_ARRAYS[ type ]( buffer ); } - class TransformationTool { - constructor(viewer) { - this.viewer = viewer; + let _bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id - this.scene = new THREE.Scene(); + const _m1$2 = new Matrix4(); + const _obj = new Object3D(); + const _offset = new Vector3(); + const _box$2 = new Box3(); + const _boxMorphTargets = new Box3(); + const _vector$4 = new Vector3(); - this.selection = []; - this.pivot = new THREE.Vector3(); - this.dragging = false; - this.showPickVolumes = false; + function BufferGeometry() { - this.viewer.inputHandler.registerInteractiveScene(this.scene); - this.viewer.inputHandler.addEventListener('selection_changed', (e) => { - for(let selected of this.selection){ - this.viewer.inputHandler.blacklist.delete(selected); - } + Object.defineProperty( this, 'id', { value: _bufferGeometryId += 2 } ); - this.selection = e.selection; + this.uuid = MathUtils.generateUUID(); - for(let selected of this.selection){ - this.viewer.inputHandler.blacklist.add(selected); - } + this.name = ''; + this.type = 'BufferGeometry'; - }); + this.index = null; + this.attributes = {}; - let red = 0xE73100; - let green = 0x44A24A; - let blue = 0x2669E7; - - this.activeHandle = null; - this.scaleHandles = { - "scale.x+": {name: "scale.x+", node: new THREE.Object3D(), color: red, alignment: [+1, +0, +0]}, - "scale.x-": {name: "scale.x-", node: new THREE.Object3D(), color: red, alignment: [-1, +0, +0]}, - "scale.y+": {name: "scale.y+", node: new THREE.Object3D(), color: green, alignment: [+0, +1, +0]}, - "scale.y-": {name: "scale.y-", node: new THREE.Object3D(), color: green, alignment: [+0, -1, +0]}, - "scale.z+": {name: "scale.z+", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, +1]}, - "scale.z-": {name: "scale.z-", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, -1]}, - }; - this.focusHandles = { - "focus.x+": {name: "focus.x+", node: new THREE.Object3D(), color: red, alignment: [+1, +0, +0]}, - "focus.x-": {name: "focus.x-", node: new THREE.Object3D(), color: red, alignment: [-1, +0, +0]}, - "focus.y+": {name: "focus.y+", node: new THREE.Object3D(), color: green, alignment: [+0, +1, +0]}, - "focus.y-": {name: "focus.y-", node: new THREE.Object3D(), color: green, alignment: [+0, -1, +0]}, - "focus.z+": {name: "focus.z+", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, +1]}, - "focus.z-": {name: "focus.z-", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, -1]}, - }; - this.translationHandles = { - "translation.x": {name: "translation.x", node: new THREE.Object3D(), color: red, alignment: [1, 0, 0]}, - "translation.y": {name: "translation.y", node: new THREE.Object3D(), color: green, alignment: [0, 1, 0]}, - "translation.z": {name: "translation.z", node: new THREE.Object3D(), color: blue, alignment: [0, 0, 1]}, - }; - this.rotationHandles = { - "rotation.x": {name: "rotation.x", node: new THREE.Object3D(), color: red, alignment: [1, 0, 0]}, - "rotation.y": {name: "rotation.y", node: new THREE.Object3D(), color: green, alignment: [0, 1, 0]}, - "rotation.z": {name: "rotation.z", node: new THREE.Object3D(), color: blue, alignment: [0, 0, 1]}, - }; - this.handles = Object.assign({}, this.scaleHandles, this.focusHandles, this.translationHandles, this.rotationHandles); - this.pickVolumes = []; + this.morphAttributes = {}; + this.morphTargetsRelative = false; - this.initializeScaleHandles(); - this.initializeFocusHandles(); - this.initializeTranslationHandles(); - this.initializeRotationHandles(); + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; - let boxFrameGeometry = new THREE.Geometry(); - { - // bottom - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5)); - // top - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5)); - // sides - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5)); - boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5)); - } - this.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: 0xffff00})); - this.scene.add(this.frame); + this.drawRange = { start: 0, count: Infinity }; - - } + this.userData = {}; - initializeScaleHandles(){ - let sgSphere = new THREE.SphereGeometry(1, 32, 32); - let sgLowPolySphere = new THREE.SphereGeometry(1, 16, 16); + } - for(let handleName of Object.keys(this.scaleHandles)){ - let handle = this.scaleHandles[handleName]; - let node = handle.node; - this.scene.add(node); - node.position.set(...handle.alignment).multiplyScalar(0.5); + BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher$1.prototype ), { - let material = new THREE.MeshBasicMaterial({ - color: handle.color, - opacity: 0.4, - transparent: true - }); + constructor: BufferGeometry, - let outlineMaterial = new THREE.MeshBasicMaterial({ - color: 0x000000, - side: THREE.BackSide, - opacity: 0.4, - transparent: true}); + isBufferGeometry: true, - let pickMaterial = new THREE.MeshNormalMaterial({ - opacity: 0.2, - transparent: true, - visible: this.showPickVolumes}); + getIndex: function () { - let sphere = new THREE.Mesh(sgSphere, material); - sphere.scale.set(1.3, 1.3, 1.3); - sphere.name = `${handleName}.handle`; - node.add(sphere); - - let outline = new THREE.Mesh(sgSphere, outlineMaterial); - outline.scale.set(1.4, 1.4, 1.4); - outline.name = `${handleName}.outline`; - sphere.add(outline); + return this.index; - let pickSphere = new THREE.Mesh(sgLowPolySphere, pickMaterial); - pickSphere.name = `${handleName}.pick_volume`; - pickSphere.scale.set(3, 3, 3); - sphere.add(pickSphere); - pickSphere.handle = handleName; - this.pickVolumes.push(pickSphere); + }, - node.setOpacity = (target) => { - let opacity = {x: material.opacity}; - let t = new TWEEN.Tween(opacity).to({x: target}, 100); - t.onUpdate(() => { - sphere.visible = opacity.x > 0; - pickSphere.visible = opacity.x > 0; - material.opacity = opacity.x; - outlineMaterial.opacity = opacity.x; - pickSphere.material.opacity = opacity.x * 0.5; - }); - t.start(); - }; + setIndex: function ( index ) { - pickSphere.addEventListener("drag", (e) => this.dragScaleHandle(e)); - pickSphere.addEventListener("drop", (e) => this.dropScaleHandle(e)); + if ( Array.isArray( index ) ) { - pickSphere.addEventListener("mouseover", e => { - //node.setOpacity(1); - }); + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); - pickSphere.addEventListener("click", e => { - e.consume(); - }); + } else { + + this.index = index; - pickSphere.addEventListener("mouseleave", e => { - //node.setOpacity(0.4); - }); } - } - initializeFocusHandles(){ - //let sgBox = new THREE.BoxGeometry(1, 1, 1); - let sgPlane = new THREE.PlaneGeometry(4, 4, 1, 1); - let sgLowPolySphere = new THREE.SphereGeometry(1, 16, 16); + return this; - let texture = new THREE.TextureLoader().load(`${exports.resourcePath}/icons/eye_2.png`); + }, - for(let handleName of Object.keys(this.focusHandles)){ - let handle = this.focusHandles[handleName]; - let node = handle.node; - this.scene.add(node); - let align = handle.alignment; + getAttribute: function ( name ) { - //node.lookAt(new THREE.Vector3().addVectors(node.position, new THREE.Vector3(...align))); - node.lookAt(new THREE.Vector3(...align)); + return this.attributes[ name ]; - let off = 0.8; - if(align[0] === 1){ - node.position.set(1, off, -off).multiplyScalar(0.5); - node.rotation.z = Math.PI / 2; - }else if(align[0] === -1){ - node.position.set(-1, -off, -off).multiplyScalar(0.5); - node.rotation.z = Math.PI / 2; - }else if(align[1] === 1){ - node.position.set(-off, 1, -off).multiplyScalar(0.5); - node.rotation.set(Math.PI / 2, Math.PI, 0.0); - }else if(align[1] === -1){ - node.position.set(off, -1, -off).multiplyScalar(0.5); - node.rotation.set(Math.PI / 2, 0.0, 0.0); - }else if(align[2] === 1){ - node.position.set(off, off, 1).multiplyScalar(0.5); - }else if(align[2] === -1){ - node.position.set(-off, off, -1).multiplyScalar(0.5); - } + }, - let material = new THREE.MeshBasicMaterial({ - color: handle.color, - opacity: 0, - transparent: true, - map: texture - }); + setAttribute: function ( name, attribute ) { - //let outlineMaterial = new THREE.MeshBasicMaterial({ - // color: 0x000000, - // side: THREE.BackSide, - // opacity: 0, - // transparent: true}); + this.attributes[ name ] = attribute; - let pickMaterial = new THREE.MeshNormalMaterial({ - //opacity: 0, - transparent: true, - visible: this.showPickVolumes}); + return this; - let box = new THREE.Mesh(sgPlane, material); - box.name = `${handleName}.handle`; - box.scale.set(1.5, 1.5, 1.5); - box.position.set(0, 0, 0); - box.visible = false; - node.add(box); - //handle.focusNode = box; - - //let outline = new THREE.Mesh(sgPlane, outlineMaterial); - //outline.scale.set(1.4, 1.4, 1.4); - //outline.name = `${handleName}.outline`; - //box.add(outline); + }, - let pickSphere = new THREE.Mesh(sgLowPolySphere, pickMaterial); - pickSphere.name = `${handleName}.pick_volume`; - pickSphere.scale.set(3, 3, 3); - box.add(pickSphere); - pickSphere.handle = handleName; - this.pickVolumes.push(pickSphere); + deleteAttribute: function ( name ) { - node.setOpacity = (target) => { - let opacity = {x: material.opacity}; - let t = new TWEEN.Tween(opacity).to({x: target}, 100); - t.onUpdate(() => { - pickSphere.visible = opacity.x > 0; - box.visible = opacity.x > 0; - material.opacity = opacity.x; - //outlineMaterial.opacity = opacity.x; - pickSphere.material.opacity = opacity.x * 0.5; - }); - t.start(); - }; + delete this.attributes[ name ]; - pickSphere.addEventListener("drag", e => {}); + return this; - pickSphere.addEventListener("mouseup", e => { - e.consume(); - }); + }, - pickSphere.addEventListener("mousedown", e => { - e.consume(); - }); + hasAttribute: function ( name ) { - pickSphere.addEventListener("click", e => { - e.consume(); + return this.attributes[ name ] !== undefined; - let selected = this.selection[0]; - let maxScale = Math.max(...selected.scale.toArray()); - let minScale = Math.min(...selected.scale.toArray()); - let handleLength = Math.abs(selected.scale.dot(new THREE.Vector3(...handle.alignment))); - let alignment = new THREE.Vector3(...handle.alignment).multiplyScalar(2 * maxScale / handleLength); - alignment.applyMatrix4(selected.matrixWorld); - let newCamPos = alignment; - let newCamTarget = selected.getWorldPosition(new THREE.Vector3()); + }, - Utils.moveTo(this.viewer.scene, newCamPos, newCamTarget); - }); + addGroup: function ( start, count, materialIndex = 0 ) { - pickSphere.addEventListener("mouseover", e => { - //box.setOpacity(1); - }); + this.groups.push( { - pickSphere.addEventListener("mouseleave", e => { - //box.setOpacity(0.4); - }); - } - } + start: start, + count: count, + materialIndex: materialIndex - initializeTranslationHandles(){ - let boxGeometry = new THREE.BoxGeometry(1, 1, 1); + } ); - for(let handleName of Object.keys(this.translationHandles)){ - let handle = this.handles[handleName]; - let node = handle.node; - this.scene.add(node); + }, - let material = new THREE.MeshBasicMaterial({ - color: handle.color, - opacity: 0.4, - transparent: true}); + clearGroups: function () { - let outlineMaterial = new THREE.MeshBasicMaterial({ - color: 0x000000, - side: THREE.BackSide, - opacity: 0.4, - transparent: true}); + this.groups = []; - let pickMaterial = new THREE.MeshNormalMaterial({ - opacity: 0.2, - transparent: true, - visible: this.showPickVolumes - }); + }, - let box = new THREE.Mesh(boxGeometry, material); - box.name = `${handleName}.handle`; - box.scale.set(0.2, 0.2, 40); - box.lookAt(new THREE.Vector3(...handle.alignment)); - box.renderOrder = 10; - node.add(box); - handle.translateNode = box; + setDrawRange: function ( start, count ) { - let outline = new THREE.Mesh(boxGeometry, outlineMaterial); - outline.name = `${handleName}.outline`; - outline.scale.set(3, 3, 1.03); - outline.renderOrder = 0; - box.add(outline); + this.drawRange.start = start; + this.drawRange.count = count; - let pickVolume = new THREE.Mesh(boxGeometry, pickMaterial); - pickVolume.name = `${handleName}.pick_volume`; - pickVolume.scale.set(12, 12, 1.1); - pickVolume.handle = handleName; - box.add(pickVolume); - this.pickVolumes.push(pickVolume); + }, - node.setOpacity = (target) => { - let opacity = {x: material.opacity}; - let t = new TWEEN.Tween(opacity).to({x: target}, 100); - t.onUpdate(() => { - box.visible = opacity.x > 0; - pickVolume.visible = opacity.x > 0; - material.opacity = opacity.x; - outlineMaterial.opacity = opacity.x; - pickMaterial.opacity = opacity.x * 0.5; - }); - t.start(); - }; + applyMatrix4: function ( matrix ) { + + const position = this.attributes.position; + + if ( position !== undefined ) { + + position.applyMatrix4( matrix ); + + position.needsUpdate = true; - pickVolume.addEventListener("drag", (e) => {this.dragTranslationHandle(e);}); - pickVolume.addEventListener("drop", (e) => {this.dropTranslationHandle(e);}); } - } - initializeRotationHandles(){ - let adjust = 0.5; - let torusGeometry = new THREE.TorusGeometry(1, adjust * 0.015, 8, 64, Math.PI / 2); - let outlineGeometry = new THREE.TorusGeometry(1, adjust * 0.04, 8, 64, Math.PI / 2); - let pickGeometry = new THREE.TorusGeometry(1, adjust * 0.1, 6, 4, Math.PI / 2); + const normal = this.attributes.normal; - for(let handleName of Object.keys(this.rotationHandles)){ - let handle = this.handles[handleName]; - let node = handle.node; - this.scene.add(node); + if ( normal !== undefined ) { - let material = new THREE.MeshBasicMaterial({ - color: handle.color, - opacity: 0.4, - transparent: true}); + const normalMatrix = new Matrix3().getNormalMatrix( matrix ); - let outlineMaterial = new THREE.MeshBasicMaterial({ - color: 0x000000, - side: THREE.BackSide, - opacity: 0.4, - transparent: true}); + normal.applyNormalMatrix( normalMatrix ); - let pickMaterial = new THREE.MeshNormalMaterial({ - opacity: 0.2, - transparent: true, - visible: this.showPickVolumes - }); + normal.needsUpdate = true; - let box = new THREE.Mesh(torusGeometry, material); - box.name = `${handleName}.handle`; - box.scale.set(20, 20, 20); - box.lookAt(new THREE.Vector3(...handle.alignment)); - node.add(box); - handle.translateNode = box; + } - let outline = new THREE.Mesh(outlineGeometry, outlineMaterial); - outline.name = `${handleName}.outline`; - outline.scale.set(1, 1, 1); - outline.renderOrder = 0; - box.add(outline); + const tangent = this.attributes.tangent; - let pickVolume = new THREE.Mesh(pickGeometry, pickMaterial); - pickVolume.name = `${handleName}.pick_volume`; - pickVolume.scale.set(1, 1, 1); - pickVolume.handle = handleName; - box.add(pickVolume); - this.pickVolumes.push(pickVolume); + if ( tangent !== undefined ) { - node.setOpacity = (target) => { - let opacity = {x: material.opacity}; - let t = new TWEEN.Tween(opacity).to({x: target}, 100); - t.onUpdate(() => { - box.visible = opacity.x > 0; - pickVolume.visible = opacity.x > 0; - material.opacity = opacity.x; - outlineMaterial.opacity = opacity.x; - pickMaterial.opacity = opacity.x * 0.5; - }); - t.start(); - }; + tangent.transformDirection( matrix ); + tangent.needsUpdate = true; - //pickVolume.addEventListener("mouseover", (e) => { - // //let a = this.viewer.scene.getActiveCamera().getWorldDirection(new THREE.Vector3()).dot(pickVolume.getWorldDirection(new THREE.Vector3())); - // console.log(pickVolume.getWorldDirection(new THREE.Vector3())); - //}); - - pickVolume.addEventListener("drag", (e) => {this.dragRotationHandle(e);}); - pickVolume.addEventListener("drop", (e) => {this.dropRotationHandle(e);}); } - } - dragRotationHandle(e){ - let drag = e.drag; - let handle = this.activeHandle; - let camera = this.viewer.scene.getActiveCamera(); + if ( this.boundingBox !== null ) { - if(!handle){ - return - }; + this.computeBoundingBox(); - let localNormal = new THREE.Vector3(...handle.alignment); - let n = new THREE.Vector3(); - n.copy(new THREE.Vector4(...localNormal.toArray(), 0).applyMatrix4(handle.node.matrixWorld)); - n.normalize(); + } - if (!drag.intersectionStart){ + if ( this.boundingSphere !== null ) { - //this.viewer.scene.scene.remove(this.debug); - //this.debug = new THREE.Object3D(); - //this.viewer.scene.scene.add(this.debug); - //Utils.debugSphere(this.debug, drag.location, 3, 0xaaaaaa); - //let debugEnd = drag.location.clone().add(n.clone().multiplyScalar(20)); - //Utils.debugLine(this.debug, drag.location, debugEnd, 0xff0000); + this.computeBoundingSphere(); - drag.intersectionStart = drag.location; - drag.objectStart = drag.object.getWorldPosition(new THREE.Vector3()); - drag.handle = handle; + } - let plane = new THREE.Plane().setFromNormalAndCoplanarPoint(n, drag.intersectionStart); + return this; - drag.dragPlane = plane; - drag.pivot = drag.intersectionStart; - }else { - handle = drag.handle; - } + }, - this.dragging = true; + rotateX: function ( angle ) { - let mouse = drag.end; - let domElement = this.viewer.renderer.domElement; - let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); - - let I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3()); + // rotate geometry around world x-axis - if (I) { - let center = this.scene.getWorldPosition(new THREE.Vector3()); - let from = drag.pivot; - let to = I; + _m1$2.makeRotationX( angle ); - let v1 = from.clone().sub(center).normalize(); - let v2 = to.clone().sub(center).normalize(); + this.applyMatrix4( _m1$2 ); - let angle = Math.acos(v1.dot(v2)); - let sign = Math.sign(v1.cross(v2).dot(n)); - angle = angle * sign; - if (Number.isNaN(angle)) { - return; - } + return this; - let normal = new THREE.Vector3(...handle.alignment); - for (let selection of this.selection) { - selection.rotateOnAxis(normal, angle); - selection.dispatchEvent({ - type: "orientation_changed", - object: selection - }); - } + }, - drag.pivot = I; - } - } + rotateY: function ( angle ) { - dropRotationHandle(e){ - this.dragging = false; - this.setActiveHandle(null); - } + // rotate geometry around world y-axis - dragTranslationHandle(e){ - let drag = e.drag; - let handle = this.activeHandle; - let camera = this.viewer.scene.getActiveCamera(); - - if(!drag.intersectionStart && handle){ - drag.intersectionStart = drag.location; - drag.objectStart = drag.object.getWorldPosition(new THREE.Vector3()); + _m1$2.makeRotationY( angle ); - let start = drag.intersectionStart; - let dir = new THREE.Vector4(...handle.alignment, 0).applyMatrix4(this.scene.matrixWorld); - let end = new THREE.Vector3().addVectors(start, dir); - let line = new THREE.Line3(start.clone(), end.clone()); - drag.line = line; + this.applyMatrix4( _m1$2 ); - let camOnLine = line.closestPointToPoint(camera.position, false, new THREE.Vector3()); - let normal = new THREE.Vector3().subVectors(camera.position, camOnLine); - let plane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, drag.intersectionStart); - drag.dragPlane = plane; - drag.pivot = drag.intersectionStart; - }else { - handle = drag.handle; - } + return this; - this.dragging = true; + }, - { - let mouse = drag.end; - let domElement = this.viewer.renderer.domElement; - let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); - let I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3()); + rotateZ: function ( angle ) { - if (I) { - let iOnLine = drag.line.closestPointToPoint(I, false, new THREE.Vector3()); + // rotate geometry around world z-axis - let diff = new THREE.Vector3().subVectors(iOnLine, drag.pivot); + _m1$2.makeRotationZ( angle ); - for (let selection of this.selection) { - selection.position.add(diff); - selection.dispatchEvent({ - type: "position_changed", - object: selection - }); - } + this.applyMatrix4( _m1$2 ); - drag.pivot = drag.pivot.add(diff); - } - } - } + return this; - dropTranslationHandle(e){ - this.dragging = false; - this.setActiveHandle(null); - } + }, - dropScaleHandle(e){ - this.dragging = false; - this.setActiveHandle(null); - } + translate: function ( x, y, z ) { - dragScaleHandle(e){ - let drag = e.drag; - let handle = this.activeHandle; - let camera = this.viewer.scene.getActiveCamera(); + // translate geometry - if(!drag.intersectionStart){ - drag.intersectionStart = drag.location; - drag.objectStart = drag.object.getWorldPosition(new THREE.Vector3()); - drag.handle = handle; + _m1$2.makeTranslation( x, y, z ); - let start = drag.intersectionStart; - let dir = new THREE.Vector4(...handle.alignment, 0).applyMatrix4(this.scene.matrixWorld); - let end = new THREE.Vector3().addVectors(start, dir); - let line = new THREE.Line3(start.clone(), end.clone()); - drag.line = line; + this.applyMatrix4( _m1$2 ); - let camOnLine = line.closestPointToPoint(camera.position, false, new THREE.Vector3()); - let normal = new THREE.Vector3().subVectors(camera.position, camOnLine); - let plane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, drag.intersectionStart); - drag.dragPlane = plane; - drag.pivot = drag.intersectionStart; + return this; - //Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05); - }else { - handle = drag.handle; - } + }, - this.dragging = true; + scale: function ( x, y, z ) { - { - let mouse = drag.end; - let domElement = this.viewer.renderer.domElement; - let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); - let I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3()); + // scale geometry - if (I) { - let iOnLine = drag.line.closestPointToPoint(I, false, new THREE.Vector3()); - let direction = handle.alignment.reduce( (a, v) => a + v, 0); + _m1$2.makeScale( x, y, z ); - let toObjectSpace = new THREE.Matrix4().getInverse( this.selection[0].matrixWorld); - let iOnLineOS = iOnLine.clone().applyMatrix4(toObjectSpace); - let pivotOS = drag.pivot.clone().applyMatrix4(toObjectSpace); - let diffOS = new THREE.Vector3().subVectors(iOnLineOS, pivotOS); - let dragDirectionOS = diffOS.clone().normalize(); - if(iOnLine.distanceTo(drag.pivot) === 0){ - dragDirectionOS.set(0, 0, 0); - } - let dragDirection = dragDirectionOS.dot(new THREE.Vector3(...handle.alignment)); + this.applyMatrix4( _m1$2 ); - let diff = new THREE.Vector3().subVectors(iOnLine, drag.pivot); - let diffScale = new THREE.Vector3(...handle.alignment).multiplyScalar(diff.length() * direction * dragDirection); - let diffPosition = diff.clone().multiplyScalar(0.5); + return this; - for (let selection of this.selection) { - selection.scale.add(diffScale); - selection.scale.x = Math.max(0.1, selection.scale.x); - selection.scale.y = Math.max(0.1, selection.scale.y); - selection.scale.z = Math.max(0.1, selection.scale.z); - selection.position.add(diffPosition); - selection.dispatchEvent({ - type: "position_changed", - object: selection - }); - selection.dispatchEvent({ - type: "scale_changed", - object: selection - }); - } + }, - drag.pivot.copy(iOnLine); - //Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05); - } - } - } + lookAt: function ( vector ) { - setActiveHandle(handle){ - if(this.dragging){ - return; - } + _obj.lookAt( vector ); - if(this.activeHandle === handle){ - return; - } + _obj.updateMatrix(); - this.activeHandle = handle; + this.applyMatrix4( _obj.matrix ); - if(handle === null){ - for(let handleName of Object.keys(this.handles)){ - let handle = this.handles[handleName]; - handle.node.setOpacity(0); - } - } + return this; - for(let handleName of Object.keys(this.focusHandles)){ - let handle = this.focusHandles[handleName]; + }, - if(this.activeHandle === handle){ - handle.node.setOpacity(1.0); - }else { - handle.node.setOpacity(0.4); - } - } + center: function () { - for(let handleName of Object.keys(this.translationHandles)){ - let handle = this.translationHandles[handleName]; + this.computeBoundingBox(); + + this.boundingBox.getCenter( _offset ).negate(); + + this.translate( _offset.x, _offset.y, _offset.z ); + + return this; + + }, + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + const geometry = object.geometry; + + if ( object.isPoints || object.isLine ) { + + const positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 ); + const colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 ); + + this.setAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.setAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + const lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 ); + + this.setAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); - if(this.activeHandle === handle){ - handle.node.setOpacity(1.0); - }else { - handle.node.setOpacity(0.4); } - } - for(let handleName of Object.keys(this.rotationHandles)){ - let handle = this.rotationHandles[handleName]; + if ( geometry.boundingSphere !== null ) { - //if(this.activeHandle === handle){ - // handle.node.setOpacity(1.0); - //}else{ - // handle.node.setOpacity(0.4) - //} + this.boundingSphere = geometry.boundingSphere.clone(); - handle.node.setOpacity(0.4); - } + } - for(let handleName of Object.keys(this.scaleHandles)){ - let handle = this.scaleHandles[handleName]; + if ( geometry.boundingBox !== null ) { - if(this.activeHandle === handle){ - handle.node.setOpacity(1.0); + this.boundingBox = geometry.boundingBox.clone(); - let relatedFocusHandle = this.focusHandles[handle.name.replace("scale", "focus")]; - let relatedFocusNode = relatedFocusHandle.node; - relatedFocusNode.setOpacity(0.4); + } - for(let translationHandleName of Object.keys(this.translationHandles)){ - let translationHandle = this.translationHandles[translationHandleName]; - translationHandle.node.setOpacity(0.4); - } + } else if ( object.isMesh ) { - //let relatedTranslationHandle = this.translationHandles[ - // handle.name.replace("scale", "translation").replace(/[+-]/g, "")]; - //let relatedTranslationNode = relatedTranslationHandle.node; - //relatedTranslationNode.setOpacity(0.4); + if ( geometry && geometry.isGeometry ) { + this.fromGeometry( geometry ); - }else { - handle.node.setOpacity(0.4); } + } - + return this; + }, + setFromPoints: function ( points ) { + + const position = []; + + for ( let i = 0, l = points.length; i < l; i ++ ) { + + const point = points[ i ]; + position.push( point.x, point.y, point.z || 0 ); - if(handle){ - handle.node.setOpacity(1.0); } - - } + this.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) ); - update () { + return this; - if(this.selection.length === 1){ + }, - this.scene.visible = true; + updateFromObject: function ( object ) { - this.scene.updateMatrix(); - this.scene.updateMatrixWorld(); + let geometry = object.geometry; - let selected = this.selection[0]; - let world = selected.matrixWorld; - let camera = this.viewer.scene.getActiveCamera(); - let domElement = this.viewer.renderer.domElement; - let mouse = this.viewer.inputHandler.mouse; + if ( object.isMesh ) { - let center = selected.boundingBox.getCenter(new THREE.Vector3()).clone().applyMatrix4(selected.matrixWorld); + let direct = geometry.__directGeometry; - this.scene.scale.copy(selected.boundingBox.getSize(new THREE.Vector3()).multiply(selected.scale)); - this.scene.position.copy(center); - this.scene.rotation.copy(selected.rotation); + if ( geometry.elementsNeedUpdate === true ) { - this.scene.updateMatrixWorld(); + direct = undefined; + geometry.elementsNeedUpdate = false; - { - // adjust scale of components - for(let handleName of Object.keys(this.handles)){ - let handle = this.handles[handleName]; - let node = handle.node; + } - let handlePos = node.getWorldPosition(new THREE.Vector3()); - let distance = handlePos.distanceTo(camera.position); - let pr = Utils.projectedRadius(1, camera, distance, domElement.clientWidth, domElement.clientHeight); + if ( direct === undefined ) { - let ws = node.parent.getWorldScale(new THREE.Vector3()); + return this.fromGeometry( geometry ); - let s = (7 / pr); - let scale = new THREE.Vector3(s, s, s).divide(ws); + } - let rot = new THREE.Matrix4().makeRotationFromEuler(node.rotation); - let rotInv = new THREE.Matrix4().getInverse(rot); + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; - scale.applyMatrix4(rotInv); - scale.x = Math.abs(scale.x); - scale.y = Math.abs(scale.y); - scale.z = Math.abs(scale.z); + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; - node.scale.copy(scale); - } + geometry = direct; - // adjust rotation handles - if(!this.dragging){ - let tWorld = this.scene.matrixWorld; - let tObject = new THREE.Matrix4().getInverse(tWorld); - let camObjectPos = camera.getWorldPosition(new THREE.Vector3()).applyMatrix4(tObject); + } - let x = this.rotationHandles["rotation.x"].node.rotation; - let y = this.rotationHandles["rotation.y"].node.rotation; - let z = this.rotationHandles["rotation.z"].node.rotation; + if ( geometry.verticesNeedUpdate === true ) { - x.order = "ZYX"; - y.order = "ZYX"; + const attribute = this.attributes.position; - let above = camObjectPos.z > 0; - let below = !above; - let PI_HALF = Math.PI / 2; + if ( attribute !== undefined ) { - if(above){ - if(camObjectPos.x > 0 && camObjectPos.y > 0){ - x.x = 1 * PI_HALF; - y.y = 3 * PI_HALF; - z.z = 0 * PI_HALF; - }else if(camObjectPos.x < 0 && camObjectPos.y > 0){ - x.x = 1 * PI_HALF; - y.y = 2 * PI_HALF; - z.z = 1 * PI_HALF; - }else if(camObjectPos.x < 0 && camObjectPos.y < 0){ - x.x = 2 * PI_HALF; - y.y = 2 * PI_HALF; - z.z = 2 * PI_HALF; - }else if(camObjectPos.x > 0 && camObjectPos.y < 0){ - x.x = 2 * PI_HALF; - y.y = 3 * PI_HALF; - z.z = 3 * PI_HALF; - } - }else if(below){ - if(camObjectPos.x > 0 && camObjectPos.y > 0){ - x.x = 0 * PI_HALF; - y.y = 0 * PI_HALF; - z.z = 0 * PI_HALF; - }else if(camObjectPos.x < 0 && camObjectPos.y > 0){ - x.x = 0 * PI_HALF; - y.y = 1 * PI_HALF; - z.z = 1 * PI_HALF; - }else if(camObjectPos.x < 0 && camObjectPos.y < 0){ - x.x = 3 * PI_HALF; - y.y = 1 * PI_HALF; - z.z = 2 * PI_HALF; - }else if(camObjectPos.x > 0 && camObjectPos.y < 0){ - x.x = 3 * PI_HALF; - y.y = 0 * PI_HALF; - z.z = 3 * PI_HALF; - } - } - } + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; - { - let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); - let raycaster = new THREE.Raycaster(ray.origin, ray.direction); - let intersects = raycaster.intersectObjects(this.pickVolumes.filter(v => v.visible), true); + } - if(intersects.length > 0){ - let I = intersects[0]; - let handleName = I.object.handle; - this.setActiveHandle(this.handles[handleName]); - }else { - this.setActiveHandle(null); - } - } + geometry.verticesNeedUpdate = false; - // - for(let handleName of Object.keys(this.scaleHandles)){ - let handle = this.handles[handleName]; - let node = handle.node; - let alignment = handle.alignment; + } - + if ( geometry.normalsNeedUpdate === true ) { + + const attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; - } } + geometry.normalsNeedUpdate = false; - { - let axisScale = (alignment) => { - let transformed = new THREE.Vector3(...alignment).applyMatrix4(selected.matrixWorld); - let distance = transformed.distanceTo(selected.getWorldPosition(new THREE.Vector3())); + } - return distance; - }; + if ( geometry.colorsNeedUpdate === true ) { - let scale = new THREE.Vector3( - axisScale([1, 0, 0]), - axisScale([0, 1, 0]), - axisScale([0, 0, 1]), - ); + const attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; } - }else { - this.scene.visible = false; + geometry.colorsNeedUpdate = false; + } - - } - }; + if ( geometry.uvsNeedUpdate ) { - class VolumeTool extends EventDispatcher{ - constructor (viewer) { - super(); + const attribute = this.attributes.uv; - this.viewer = viewer; - this.renderer = viewer.renderer; + if ( attribute !== undefined ) { - this.addEventListener('start_inserting_volume', e => { - this.viewer.dispatchEvent({ - type: 'cancel_insertions' - }); - }); + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; - this.scene = new THREE.Scene(); - this.scene.name = 'scene_volume'; + } - this.viewer.inputHandler.registerInteractiveScene(this.scene); + geometry.uvsNeedUpdate = false; - this.onRemove = e => { - this.scene.remove(e.volume); - }; + } - this.onAdd = e => { - this.scene.add(e.volume); - }; + if ( geometry.lineDistancesNeedUpdate ) { - for(let volume of viewer.scene.volumes){ - this.onAdd({volume: volume}); - } + const attribute = this.attributes.lineDistance; - this.viewer.inputHandler.addEventListener('delete', e => { - let volumes = e.selection.filter(e => (e instanceof Volume)); - volumes.forEach(e => this.viewer.scene.removeVolume(e)); - }); + if ( attribute !== undefined ) { - viewer.addEventListener("update", this.update.bind(this)); - viewer.addEventListener("render.pass.scene", e => this.render(e)); - viewer.addEventListener("scene_changed", this.onSceneChange.bind(this)); + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; - viewer.scene.addEventListener('volume_added', this.onAdd); - viewer.scene.addEventListener('volume_removed', this.onRemove); - } + } + + geometry.lineDistancesNeedUpdate = false; - onSceneChange(e){ - if(e.oldScene){ - e.oldScene.removeEventListeners('volume_added', this.onAdd); - e.oldScene.removeEventListeners('volume_removed', this.onRemove); } - e.scene.addEventListener('volume_added', this.onAdd); - e.scene.addEventListener('volume_removed', this.onRemove); - } + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; - startInsertion (args = {}) { - let volume; - if(args.type){ - volume = new args.type(); - }else { - volume = new BoxVolume(); } - - volume.clip = args.clip || false; - volume.name = args.name || 'Volume'; - this.dispatchEvent({ - type: 'start_inserting_volume', - volume: volume - }); + return this; - this.viewer.scene.addVolume(volume); - this.scene.add(volume); + }, - let cancel = { - callback: null - }; + fromGeometry: function ( geometry ) { - let drag = e => { - let camera = this.viewer.scene.getActiveCamera(); - - let I = Utils.getMousePointCloudIntersection( - e.drag.end, - this.viewer.scene.getActiveCamera(), - this.viewer, - this.viewer.scene.pointclouds, - {pickClipped: false}); + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); - if (I) { - volume.position.copy(I.location); + return this.fromDirectGeometry( geometry.__directGeometry ); - let wp = volume.getWorldPosition(new THREE.Vector3()).applyMatrix4(camera.matrixWorldInverse); - // let pp = new THREE.Vector4(wp.x, wp.y, wp.z).applyMatrix4(camera.projectionMatrix); - let w = Math.abs((wp.z / 5)); - volume.scale.set(w, w, w); - } - }; + }, - let drop = e => { - volume.removeEventListener('drag', drag); - volume.removeEventListener('drop', drop); + fromDirectGeometry: function ( geometry ) { - cancel.callback(); - }; + const positions = new Float32Array( geometry.vertices.length * 3 ); + this.setAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); - cancel.callback = e => { - volume.removeEventListener('drag', drag); - volume.removeEventListener('drop', drop); - this.viewer.removeEventListener('cancel_insertions', cancel.callback); - }; + if ( geometry.normals.length > 0 ) { - volume.addEventListener('drag', drag); - volume.addEventListener('drop', drop); - this.viewer.addEventListener('cancel_insertions', cancel.callback); + const normals = new Float32Array( geometry.normals.length * 3 ); + this.setAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); - this.viewer.inputHandler.startDragging(volume); + } - return volume; - } + if ( geometry.colors.length > 0 ) { - update(){ - if (!this.viewer.scene) { - return; - } - - let camera = this.viewer.scene.getActiveCamera(); - let renderAreaSize = this.viewer.renderer.getSize(new THREE.Vector2()); - let clientWidth = renderAreaSize.width; - let clientHeight = renderAreaSize.height; + const colors = new Float32Array( geometry.colors.length * 3 ); + this.setAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); - let volumes = this.viewer.scene.volumes; - for (let volume of volumes) { - let label = volume.label; - - { + } - let distance = label.position.distanceTo(camera.position); - let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); + if ( geometry.uvs.length > 0 ) { - let scale = (70 / pr); - label.scale.set(scale, scale, scale); - } + const uvs = new Float32Array( geometry.uvs.length * 2 ); + this.setAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); - let calculatedVolume = volume.getVolume(); - calculatedVolume = calculatedVolume / Math.pow(this.viewer.lengthUnit.unitspermeter, 3) * Math.pow(this.viewer.lengthUnitDisplay.unitspermeter, 3); //convert to cubic meters then to the cubic display unit - let text = Utils.addCommas(calculatedVolume.toFixed(3)) + ' ' + this.viewer.lengthUnitDisplay.code + '\u00B3'; - label.setText(text); } - } - render(params){ - const renderer = this.viewer.renderer; + if ( geometry.uvs2.length > 0 ) { - const oldTarget = renderer.getRenderTarget(); - - if(params.renderTarget){ - renderer.setRenderTarget(params.renderTarget); - } - renderer.render(this.scene, this.viewer.scene.getActiveCamera()); - renderer.setRenderTarget(oldTarget); - } + const uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.setAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); - } + } - class Compass{ - - constructor(viewer){ - this.viewer = viewer; - - this.visible = false; - this.dom = this.createElement(); - - viewer.addEventListener("update", () => { - const direction = viewer.scene.view.direction.clone(); - direction.z = 0; - direction.normalize(); - - const camera = viewer.scene.getActiveCamera(); - - const p1 = camera.getWorldPosition(new THREE.Vector3()); - const p2 = p1.clone().add(direction); - - const projection = viewer.getProjection(); - const azimuth = Utils.computeAzimuth(p1, p2, projection); - - this.dom.css("transform", `rotateZ(${-azimuth}rad)`); - }); - - this.dom.click( () => { - viewer.setTopView(); - }); - - const renderArea = $(viewer.renderArea); - renderArea.append(this.dom); - - this.setVisible(this.visible); - } - - setVisible(visible){ - this.visible = visible; - - const value = visible ? "" : "none"; - this.dom.css("display", value); - } - - isVisible(){ - return this.visible; - } - - createElement(){ - const style = `style="position: absolute; top: 10px; right: 10px; z-index: 10000; width: 64px;"`; - const img = $(``); - - return img; - } - - }; + // groups - class PotreeRenderer { + this.groups = geometry.groups; - constructor (viewer) { - this.viewer = viewer; - this.renderer = viewer.renderer; - } + // morphs - clearTargets(){ + for ( const name in geometry.morphTargets ) { - } + const array = []; + const morphTargets = geometry.morphTargets[ name ]; - clear(){ - let {viewer, renderer} = this; + for ( let i = 0, l = morphTargets.length; i < l; i ++ ) { - // render skybox - if(viewer.background === "skybox"){ - renderer.setClearColor(0x000000, 0); - renderer.clear(true, true, false); - }else if(viewer.background === "gradient"){ - renderer.setClearColor(0x000000, 0); - renderer.clear(true, true, false); - }else if(viewer.background === "black"){ - renderer.setClearColor(0x000000, 1); - renderer.clear(true, true, false); - }else if(viewer.background === "white"){ - renderer.setClearColor(0xFFFFFF, 1); - renderer.clear(true, true, false); - }else { - renderer.setClearColor(0x000000, 0); - renderer.clear(true, true, false); - } - } - - render(params){ - let {viewer, renderer} = this; + const morphTarget = morphTargets[ i ]; - const camera = params.camera ? params.camera : viewer.scene.getActiveCamera(); + const attribute = new Float32BufferAttribute( morphTarget.data.length * 3, 3 ); + attribute.name = morphTarget.name; - viewer.dispatchEvent({type: "render.pass.begin",viewer: viewer}); + array.push( attribute.copyVector3sArray( morphTarget.data ) ); - const renderAreaSize = renderer.getSize(new THREE.Vector2()); - const width = params.viewport ? params.viewport[2] : renderAreaSize.x; - const height = params.viewport ? params.viewport[3] : renderAreaSize.y; + } + this.morphAttributes[ name ] = array; - // render skybox - if(viewer.background === "skybox"){ - viewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation); - viewer.skybox.camera.fov = viewer.scene.cameraP.fov; - viewer.skybox.camera.aspect = viewer.scene.cameraP.aspect; - viewer.skybox.camera.updateProjectionMatrix(); - renderer.render(viewer.skybox.scene, viewer.skybox.camera); - }else if(viewer.background === "gradient"){ - renderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG); - } - - for(let pointcloud of this.viewer.scene.pointclouds){ - const {material} = pointcloud; - material.useEDL = false; - //material.updateShaderSource(); } - - viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null, { - clipSpheres: viewer.scene.volumes.filter(v => (v instanceof Potree.SphereVolume)), - }); - - // render scene - renderer.render(viewer.scene.scene, camera); - - viewer.dispatchEvent({type: "render.pass.scene",viewer: viewer}); - - viewer.clippingTool.update(); - renderer.render(viewer.clippingTool.sceneMarker, viewer.scene.cameraScreenSpace); //viewer.scene.cameraScreenSpace); - renderer.render(viewer.clippingTool.sceneVolume, camera); - renderer.render(viewer.controls.sceneControls, camera); - - renderer.clearDepth(); - - viewer.transformationTool.update(); - - viewer.dispatchEvent({type: "render.pass.perspective_overlay",viewer: viewer}); + // skinning - renderer.render(viewer.controls.sceneControls, camera); - renderer.render(viewer.clippingTool.sceneVolume, camera); - renderer.render(viewer.transformationTool.scene, camera); - - renderer.setViewport(width - viewer.navigationCube.width, - height - viewer.navigationCube.width, - viewer.navigationCube.width, viewer.navigationCube.width); - renderer.render(viewer.navigationCube, viewer.navigationCube.camera); - renderer.setViewport(0, 0, width, height); - - // renderer.render(viewer.transformationTool.scene, camera); + if ( geometry.skinIndices.length > 0 ) { - // renderer.setViewport(renderer.domElement.clientWidth - viewer.navigationCube.width, - // renderer.domElement.clientHeight - viewer.navigationCube.width, - // viewer.navigationCube.width, viewer.navigationCube.width); - // renderer.render(viewer.navigationCube, viewer.navigationCube.camera); - // renderer.setViewport(0, 0, renderer.domElement.clientWidth, renderer.domElement.clientHeight); + const skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 ); + this.setAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); - viewer.dispatchEvent({type: "render.pass.end",viewer: viewer}); - } + } - } + if ( geometry.skinWeights.length > 0 ) { - class EDLRenderer{ - constructor(viewer){ - this.viewer = viewer; + const skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 ); + this.setAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); - this.edlMaterial = null; + } - this.rtRegular; - this.rtEDL; + // - this.gl = viewer.renderer.getContext(); + if ( geometry.boundingSphere !== null ) { - this.shadowMap = new PointCloudSM(this.viewer.pRenderer); - } + this.boundingSphere = geometry.boundingSphere.clone(); - initEDL(){ - if (this.edlMaterial != null) { - return; } - this.edlMaterial = new EyeDomeLightingMaterial(); - this.edlMaterial.depthTest = true; - this.edlMaterial.depthWrite = true; - this.edlMaterial.transparent = true; - - this.rtEDL = new THREE.WebGLRenderTarget(1024, 1024, { - minFilter: THREE.NearestFilter, - magFilter: THREE.NearestFilter, - format: THREE.RGBAFormat, - type: THREE.FloatType, - depthTexture: new THREE.DepthTexture(undefined, undefined, THREE.UnsignedIntType) - }); + if ( geometry.boundingBox !== null ) { - this.rtRegular = new THREE.WebGLRenderTarget(1024, 1024, { - minFilter: THREE.NearestFilter, - magFilter: THREE.NearestFilter, - format: THREE.RGBAFormat, - depthTexture: new THREE.DepthTexture(undefined, undefined, THREE.UnsignedIntType) - }); - }; + this.boundingBox = geometry.boundingBox.clone(); - resize(width, height){ - if(this.screenshot){ - width = this.screenshot.target.width; - height = this.screenshot.target.height; } - this.rtEDL.setSize(width , height); - this.rtRegular.setSize(width , height); - } + return this; - makeScreenshot(camera, size, callback){ + }, - if(camera === undefined || camera === null){ - camera = this.viewer.scene.getActiveCamera(); - } + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); - if(size === undefined || size === null){ - size = this.viewer.renderer.getSize(new THREE.Vector2()); } - let {width, height} = size; + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; - //let maxTextureSize = viewer.renderer.capabilities.maxTextureSize; - //if(width * 4 < - width = 2 * width; - height = 2 * height; + if ( position && position.isGLBufferAttribute ) { - let target = new THREE.WebGLRenderTarget(width, height, { - format: THREE.RGBAFormat, - }); + console.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "false".', this ); - this.screenshot = { - target: target - }; + this.boundingBox.set( + new Vector3( - Infinity, - Infinity, - Infinity ), + new Vector3( + Infinity, + Infinity, + Infinity ) + ); - // HACK? removed because of error, was this important? - //this.viewer.renderer.clearTarget(target, true, true, true); + return; - this.render(); + } - let pixelCount = width * height; - let buffer = new Uint8Array(4 * pixelCount); + if ( position !== undefined ) { - this.viewer.renderer.readRenderTargetPixels(target, 0, 0, width, height, buffer); + this.boundingBox.setFromBufferAttribute( position ); - // flip vertically - let bytesPerLine = width * 4; - for(let i = 0; i < parseInt(height / 2); i++){ - let j = height - i - 1; + // process morph attributes if present - let lineI = buffer.slice(i * bytesPerLine, i * bytesPerLine + bytesPerLine); - let lineJ = buffer.slice(j * bytesPerLine, j * bytesPerLine + bytesPerLine); - buffer.set(lineJ, i * bytesPerLine); - buffer.set(lineI, j * bytesPerLine); - } + if ( morphAttributesPosition ) { - this.screenshot.target.dispose(); - delete this.screenshot; + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { - return { - width: width, - height: height, - buffer: buffer - }; - } + const morphAttribute = morphAttributesPosition[ i ]; + _box$2.setFromBufferAttribute( morphAttribute ); - clearTargets(){ - const viewer = this.viewer; - const {renderer} = viewer; + if ( this.morphTargetsRelative ) { - const oldTarget = renderer.getRenderTarget(); + _vector$4.addVectors( this.boundingBox.min, _box$2.min ); + this.boundingBox.expandByPoint( _vector$4 ); - renderer.setRenderTarget( this.rtEDL ); - renderer.clear( true, true, true ); + _vector$4.addVectors( this.boundingBox.max, _box$2.max ); + this.boundingBox.expandByPoint( _vector$4 ); - renderer.setRenderTarget( this.rtRegular ); - renderer.clear( true, true, false ); + } else { - renderer.setRenderTarget(oldTarget); - } + this.boundingBox.expandByPoint( _box$2.min ); + this.boundingBox.expandByPoint( _box$2.max ); - clear(){ - this.initEDL(); - const viewer = this.viewer; + } - const {renderer, background} = viewer; + } + + } - if(background === "skybox"){ - renderer.setClearColor(0x000000, 0); - } else if (background === 'gradient') { - renderer.setClearColor(0x000000, 0); - } else if (background === 'black') { - renderer.setClearColor(0x000000, 1); - } else if (background === 'white') { - renderer.setClearColor(0xFFFFFF, 1); } else { - renderer.setClearColor(0x000000, 0); - } - - renderer.clear(); - this.clearTargets(); - } + this.boundingBox.makeEmpty(); - renderShadowMap(visiblePointClouds, camera, lights){ + } - const {viewer} = this; + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { - const doShadows = lights.length > 0 && !(lights[0].disableShadowUpdates); - if(doShadows){ - let light = lights[0]; + console.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); - this.shadowMap.setLight(light); + } - let originalAttributes = new Map(); - for(let pointcloud of viewer.scene.pointclouds){ - // TODO IMPORTANT !!! check - originalAttributes.set(pointcloud, pointcloud.material.activeAttributeName); - pointcloud.material.disableEvents(); - pointcloud.material.activeAttributeName = "depth"; - //pointcloud.material.pointColorType = PointColorType.DEPTH; - } + }, - this.shadowMap.render(viewer.scene.scenePointCloud, camera); + computeBoundingSphere: function () { - for(let pointcloud of visiblePointClouds){ - let originalAttribute = originalAttributes.get(pointcloud); - // TODO IMPORTANT !!! check - pointcloud.material.activeAttributeName = originalAttribute; - pointcloud.material.enableEvents(); - } + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); - viewer.shadowTestCam.updateMatrixWorld(); - viewer.shadowTestCam.matrixWorldInverse.getInverse(viewer.shadowTestCam.matrixWorld); - viewer.shadowTestCam.updateProjectionMatrix(); } - } + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; - render(params){ - this.initEDL(); + if ( position && position.isGLBufferAttribute ) { - const viewer = this.viewer; - const camera = params.camera ? params.camera : viewer.scene.getActiveCamera(); - const {width, height} = this.viewer.renderer.getSize(new THREE.Vector2()); + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set "mesh.frustumCulled" to "false".', this ); - viewer.dispatchEvent({type: "render.pass.begin",viewer: viewer}); - - this.resize(width, height); + this.boundingSphere.set( new Vector3(), Infinity ); - const visiblePointClouds = viewer.scene.pointclouds.filter(pc => pc.visible); + return; - if(this.screenshot){ - let oldBudget = Potree.pointBudget; - Potree.pointBudget = Math.max(10 * 1000 * 1000, 2 * oldBudget); - let result = Potree.updatePointClouds( - viewer.scene.pointclouds, - camera, - viewer.renderer); - Potree.pointBudget = oldBudget; } - let lights = []; - viewer.scene.scene.traverse(node => { - if(node instanceof THREE.SpotLight){ - lights.push(node); - } - }); + if ( position ) { - if(viewer.background === "skybox"){ - viewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation); - viewer.skybox.camera.fov = viewer.scene.cameraP.fov; - viewer.skybox.camera.aspect = viewer.scene.cameraP.aspect; - viewer.skybox.camera.updateProjectionMatrix(); - viewer.renderer.render(viewer.skybox.scene, viewer.skybox.camera); - } else if (viewer.background === 'gradient') { - viewer.renderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG); - } + // first, find the center of the bounding sphere - //TODO adapt to multiple lights - this.renderShadowMap(visiblePointClouds, camera, lights); + const center = this.boundingSphere.center; - { // COLOR & DEPTH PASS - for (let pointcloud of visiblePointClouds) { - let octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x; + _box$2.setFromBufferAttribute( position ); - let material = pointcloud.material; - material.weighted = false; - material.useLogarithmicDepthBuffer = false; - material.useEDL = true; + // process morph attributes if present - material.screenWidth = width; - material.screenHeight = height; - material.uniforms.visibleNodes.value = pointcloud.material.visibleNodesTexture; - material.uniforms.octreeSize.value = octreeSize; - material.spacing = pointcloud.pcoGeometry.spacing * Math.max(pointcloud.scale.x, pointcloud.scale.y, pointcloud.scale.z); - } - - // TODO adapt to multiple lights - viewer.renderer.setRenderTarget(this.rtEDL); - - if(lights.length > 0){ - viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtEDL, { - clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)), - shadowMaps: [this.shadowMap], - transparent: false, - }); - }else { - viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtEDL, { - clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)), - transparent: false, - }); - } + if ( morphAttributesPosition ) { - - } + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { - viewer.dispatchEvent({type: "render.pass.scene", viewer: viewer, renderTarget: this.rtRegular}); - viewer.renderer.setRenderTarget(null); - viewer.renderer.render(viewer.scene.scene, camera); + const morphAttribute = morphAttributesPosition[ i ]; + _boxMorphTargets.setFromBufferAttribute( morphAttribute ); - { // EDL PASS + if ( this.morphTargetsRelative ) { - const uniforms = this.edlMaterial.uniforms; + _vector$4.addVectors( _box$2.min, _boxMorphTargets.min ); + _box$2.expandByPoint( _vector$4 ); - uniforms.screenWidth.value = width; - uniforms.screenHeight.value = height; + _vector$4.addVectors( _box$2.max, _boxMorphTargets.max ); + _box$2.expandByPoint( _vector$4 ); - let proj = camera.projectionMatrix; - let projArray = new Float32Array(16); - projArray.set(proj.elements); + } else { - uniforms.uNear.value = camera.near; - uniforms.uFar.value = camera.far; - uniforms.uEDLColor.value = this.rtEDL.texture; - uniforms.uEDLDepth.value = this.rtEDL.depthTexture; - uniforms.uProj.value = projArray; + _box$2.expandByPoint( _boxMorphTargets.min ); + _box$2.expandByPoint( _boxMorphTargets.max ); - uniforms.edlStrength.value = viewer.edlStrength; - uniforms.radius.value = viewer.edlRadius; - uniforms.opacity.value = viewer.edlOpacity; // HACK - - Utils.screenPass.render(viewer.renderer, this.edlMaterial); + } + + } - if(this.screenshot){ - Utils.screenPass.render(viewer.renderer, this.edlMaterial, this.screenshot.target); } - } + _box$2.getCenter( center ); - viewer.dispatchEvent({type: "render.pass.scene", viewer: viewer}); + // second, try to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case - viewer.renderer.clearDepth(); + let maxRadiusSq = 0; - viewer.transformationTool.update(); + for ( let i = 0, il = position.count; i < il; i ++ ) { - viewer.dispatchEvent({type: "render.pass.perspective_overlay",viewer: viewer}); + _vector$4.fromBufferAttribute( position, i ); - viewer.renderer.render(viewer.controls.sceneControls, camera); - viewer.renderer.render(viewer.clippingTool.sceneVolume, camera); - viewer.renderer.render(viewer.transformationTool.scene, camera); - - viewer.dispatchEvent({type: "render.pass.end",viewer: viewer}); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$4 ) ); - } - } + } - class HQSplatRenderer{ - - constructor(viewer){ - this.viewer = viewer; + // process morph attributes if present - this.depthMaterials = new Map(); - this.attributeMaterials = new Map(); - this.normalizationMaterial = null; + if ( morphAttributesPosition ) { - this.rtDepth = null; - this.rtAttribute = null; - this.gl = viewer.renderer.getContext(); + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { - this.initialized = false; - } + const morphAttribute = morphAttributesPosition[ i ]; + const morphTargetsRelative = this.morphTargetsRelative; - init(){ - if (this.initialized) { - return; - } + for ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) { - this.normalizationMaterial = new NormalizationMaterial(); - this.normalizationMaterial.depthTest = true; - this.normalizationMaterial.depthWrite = true; - this.normalizationMaterial.transparent = true; + _vector$4.fromBufferAttribute( morphAttribute, j ); - this.normalizationEDLMaterial = new NormalizationEDLMaterial(); - this.normalizationEDLMaterial.depthTest = true; - this.normalizationEDLMaterial.depthWrite = true; - this.normalizationEDLMaterial.transparent = true; + if ( morphTargetsRelative ) { - this.rtDepth = new THREE.WebGLRenderTarget(1024, 1024, { - minFilter: THREE.NearestFilter, - magFilter: THREE.NearestFilter, - format: THREE.RGBAFormat, - type: THREE.FloatType, - depthTexture: new THREE.DepthTexture(undefined, undefined, THREE.UnsignedIntType) - }); + _offset.fromBufferAttribute( position, j ); + _vector$4.add( _offset ); - this.rtAttribute = new THREE.WebGLRenderTarget(1024, 1024, { - minFilter: THREE.NearestFilter, - magFilter: THREE.NearestFilter, - format: THREE.RGBAFormat, - type: THREE.FloatType, - depthTexture: this.rtDepth.depthTexture, - }); + } - this.initialized = true; - }; + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$4 ) ); - resize(width, height){ - this.rtDepth.setSize(width, height); - this.rtAttribute.setSize(width, height); - } + } - clearTargets(){ - const viewer = this.viewer; - const {renderer} = viewer; + } - const oldTarget = renderer.getRenderTarget(); + } - renderer.setClearColor(0x000000, 0); + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); - renderer.setRenderTarget( this.rtDepth ); - renderer.clear( true, true, true ); + if ( isNaN( this.boundingSphere.radius ) ) { - renderer.setRenderTarget( this.rtAttribute ); - renderer.clear( true, true, true ); + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); - renderer.setRenderTarget(oldTarget); - } + } + } - clear(){ - this.init(); + }, - const {renderer, background} = this.viewer; + computeFaceNormals: function () { - if(background === "skybox"){ - renderer.setClearColor(0x000000, 0); - } else if (background === 'gradient') { - renderer.setClearColor(0x000000, 0); - } else if (background === 'black') { - renderer.setClearColor(0x000000, 1); - } else if (background === 'white') { - renderer.setClearColor(0xFFFFFF, 1); - } else { - renderer.setClearColor(0x000000, 0); - } + // backwards compatibility - renderer.clear(); + }, - this.clearTargets(); - } + computeVertexNormals: function () { - render (params) { - this.init(); + const index = this.index; + const positionAttribute = this.getAttribute( 'position' ); - const viewer = this.viewer; - const camera = params.camera ? params.camera : viewer.scene.getActiveCamera(); - const {width, height} = this.viewer.renderer.getSize(new THREE.Vector2()); + if ( positionAttribute !== undefined ) { - viewer.dispatchEvent({type: "render.pass.begin",viewer: viewer}); + let normalAttribute = this.getAttribute( 'normal' ); - this.resize(width, height); + if ( normalAttribute === undefined ) { - const visiblePointClouds = viewer.scene.pointclouds.filter(pc => pc.visible); - const originalMaterials = new Map(); + normalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 ); + this.setAttribute( 'normal', normalAttribute ); - for(let pointcloud of visiblePointClouds){ - originalMaterials.set(pointcloud, pointcloud.material); + } else { - if(!this.attributeMaterials.has(pointcloud)){ - let attributeMaterial = new PointCloudMaterial(); - this.attributeMaterials.set(pointcloud, attributeMaterial); - } + // reset existing normals to zero - if(!this.depthMaterials.has(pointcloud)){ - let depthMaterial = new PointCloudMaterial(); + for ( let i = 0, il = normalAttribute.count; i < il; i ++ ) { - depthMaterial.setDefine("depth_pass", "#define hq_depth_pass"); - depthMaterial.setDefine("use_edl", "#define use_edl"); + normalAttribute.setXYZ( i, 0, 0, 0 ); + + } - this.depthMaterials.set(pointcloud, depthMaterial); } - } - { // DEPTH PASS - for (let pointcloud of visiblePointClouds) { - let octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x; + const pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + const nA = new Vector3(), nB = new Vector3(), nC = new Vector3(); + const cb = new Vector3(), ab = new Vector3(); - let material = originalMaterials.get(pointcloud); - let depthMaterial = this.depthMaterials.get(pointcloud); + // indexed elements - depthMaterial.size = material.size; - depthMaterial.minSize = material.minSize; - depthMaterial.maxSize = material.maxSize; + if ( index ) { - depthMaterial.pointSizeType = material.pointSizeType; - depthMaterial.visibleNodesTexture = material.visibleNodesTexture; - depthMaterial.weighted = false; - depthMaterial.screenWidth = width; - depthMaterial.shape = PointShape.CIRCLE; - depthMaterial.screenHeight = height; - depthMaterial.uniforms.visibleNodes.value = material.visibleNodesTexture; - depthMaterial.uniforms.octreeSize.value = octreeSize; - depthMaterial.spacing = pointcloud.pcoGeometry.spacing * Math.max(...pointcloud.scale.toArray()); - depthMaterial.classification = material.classification; - depthMaterial.uniforms.classificationLUT.value.image.data = material.uniforms.classificationLUT.value.image.data; - depthMaterial.classificationTexture.needsUpdate = true; + for ( let i = 0, il = index.count; i < il; i += 3 ) { - depthMaterial.uniforms.uFilterReturnNumberRange.value = material.uniforms.uFilterReturnNumberRange.value; - depthMaterial.uniforms.uFilterNumberOfReturnsRange.value = material.uniforms.uFilterNumberOfReturnsRange.value; - depthMaterial.uniforms.uFilterGPSTimeClipRange.value = material.uniforms.uFilterGPSTimeClipRange.value; - depthMaterial.uniforms.uFilterPointSourceIDClipRange.value = material.uniforms.uFilterPointSourceIDClipRange.value; + const vA = index.getX( i + 0 ); + const vB = index.getX( i + 1 ); + const vC = index.getX( i + 2 ); - depthMaterial.clipTask = material.clipTask; - depthMaterial.clipMethod = material.clipMethod; - depthMaterial.setClipBoxes(material.clipBoxes); - depthMaterial.setClipPolygons(material.clipPolygons); + pA.fromBufferAttribute( positionAttribute, vA ); + pB.fromBufferAttribute( positionAttribute, vB ); + pC.fromBufferAttribute( positionAttribute, vC ); - pointcloud.material = depthMaterial; - } - - viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtDepth, { - clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)), - }); - } + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); - { // ATTRIBUTE PASS - for (let pointcloud of visiblePointClouds) { - let octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x; + nA.fromBufferAttribute( normalAttribute, vA ); + nB.fromBufferAttribute( normalAttribute, vB ); + nC.fromBufferAttribute( normalAttribute, vC ); - let material = originalMaterials.get(pointcloud); - let attributeMaterial = this.attributeMaterials.get(pointcloud); + nA.add( cb ); + nB.add( cb ); + nC.add( cb ); - attributeMaterial.size = material.size; - attributeMaterial.minSize = material.minSize; - attributeMaterial.maxSize = material.maxSize; + normalAttribute.setXYZ( vA, nA.x, nA.y, nA.z ); + normalAttribute.setXYZ( vB, nB.x, nB.y, nB.z ); + normalAttribute.setXYZ( vC, nC.x, nC.y, nC.z ); - attributeMaterial.pointSizeType = material.pointSizeType; - attributeMaterial.activeAttributeName = material.activeAttributeName; - attributeMaterial.visibleNodesTexture = material.visibleNodesTexture; - attributeMaterial.weighted = true; - attributeMaterial.screenWidth = width; - attributeMaterial.screenHeight = height; - attributeMaterial.shape = PointShape.CIRCLE; - attributeMaterial.uniforms.visibleNodes.value = material.visibleNodesTexture; - attributeMaterial.uniforms.octreeSize.value = octreeSize; - attributeMaterial.spacing = pointcloud.pcoGeometry.spacing * Math.max(...pointcloud.scale.toArray()); - attributeMaterial.classification = material.classification; - attributeMaterial.uniforms.classificationLUT.value.image.data = material.uniforms.classificationLUT.value.image.data; - attributeMaterial.classificationTexture.needsUpdate = true; + } - attributeMaterial.uniforms.uFilterReturnNumberRange.value = material.uniforms.uFilterReturnNumberRange.value; - attributeMaterial.uniforms.uFilterNumberOfReturnsRange.value = material.uniforms.uFilterNumberOfReturnsRange.value; - attributeMaterial.uniforms.uFilterGPSTimeClipRange.value = material.uniforms.uFilterGPSTimeClipRange.value; - attributeMaterial.uniforms.uFilterPointSourceIDClipRange.value = material.uniforms.uFilterPointSourceIDClipRange.value; + } else { - attributeMaterial.elevationGradientRepeat = material.elevationGradientRepeat; - attributeMaterial.elevationRange = material.elevationRange; - attributeMaterial.gradient = material.gradient; - attributeMaterial.matcap = material.matcap; + // non-indexed elements (unconnected triangle soup) - attributeMaterial.intensityRange = material.intensityRange; - attributeMaterial.intensityGamma = material.intensityGamma; - attributeMaterial.intensityContrast = material.intensityContrast; - attributeMaterial.intensityBrightness = material.intensityBrightness; + for ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) { - attributeMaterial.rgbGamma = material.rgbGamma; - attributeMaterial.rgbContrast = material.rgbContrast; - attributeMaterial.rgbBrightness = material.rgbBrightness; + pA.fromBufferAttribute( positionAttribute, i + 0 ); + pB.fromBufferAttribute( positionAttribute, i + 1 ); + pC.fromBufferAttribute( positionAttribute, i + 2 ); - attributeMaterial.weightRGB = material.weightRGB; - attributeMaterial.weightIntensity = material.weightIntensity; - attributeMaterial.weightElevation = material.weightElevation; - attributeMaterial.weightRGB = material.weightRGB; - attributeMaterial.weightClassification = material.weightClassification; - attributeMaterial.weightReturnNumber = material.weightReturnNumber; - attributeMaterial.weightSourceID = material.weightSourceID; + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); - attributeMaterial.color = material.color; + normalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z ); + normalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z ); + normalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z ); - attributeMaterial.clipTask = material.clipTask; - attributeMaterial.clipMethod = material.clipMethod; - attributeMaterial.setClipBoxes(material.clipBoxes); - attributeMaterial.setClipPolygons(material.clipPolygons); + } - pointcloud.material = attributeMaterial; } - - let gl = this.gl; - viewer.renderer.setRenderTarget(null); - viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtAttribute, { - clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)), - //material: this.attributeMaterial, - blendFunc: [gl.SRC_ALPHA, gl.ONE], - //depthTest: false, - depthWrite: false - }); + this.normalizeNormals(); + + normalAttribute.needsUpdate = true; + } - for(let [pointcloud, material] of originalMaterials){ - pointcloud.material = material; + }, + + merge: function ( geometry, offset ) { + + if ( ! ( geometry && geometry.isBufferGeometry ) ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + } - viewer.renderer.setRenderTarget(null); - if(viewer.background === "skybox"){ - viewer.renderer.setClearColor(0x000000, 0); - viewer.renderer.clear(); - viewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation); - viewer.skybox.camera.fov = viewer.scene.cameraP.fov; - viewer.skybox.camera.aspect = viewer.scene.cameraP.aspect; - viewer.skybox.camera.updateProjectionMatrix(); - viewer.renderer.render(viewer.skybox.scene, viewer.skybox.camera); - } else if (viewer.background === 'gradient') { - viewer.renderer.setClearColor(0x000000, 0); - viewer.renderer.clear(); - viewer.renderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG); - } else if (viewer.background === 'black') { - viewer.renderer.setClearColor(0x000000, 1); - viewer.renderer.clear(); - } else if (viewer.background === 'white') { - viewer.renderer.setClearColor(0xFFFFFF, 1); - viewer.renderer.clear(); - } else { - viewer.renderer.setClearColor(0x000000, 0); - viewer.renderer.clear(); + if ( offset === undefined ) { + + offset = 0; + + console.warn( + 'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. ' + + 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.' + ); + } - { // NORMALIZATION PASS - let normalizationMaterial = this.useEDL ? this.normalizationEDLMaterial : this.normalizationMaterial; + const attributes = this.attributes; + + for ( const key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + const attribute1 = attributes[ key ]; + const attributeArray1 = attribute1.array; + + const attribute2 = geometry.attributes[ key ]; + const attributeArray2 = attribute2.array; + + const attributeOffset = attribute2.itemSize * offset; + const length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset ); + + for ( let i = 0, j = attributeOffset; i < length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; - if(this.useEDL){ - normalizationMaterial.uniforms.edlStrength.value = viewer.edlStrength; - normalizationMaterial.uniforms.radius.value = viewer.edlRadius; - normalizationMaterial.uniforms.screenWidth.value = width; - normalizationMaterial.uniforms.screenHeight.value = height; - normalizationMaterial.uniforms.uEDLMap.value = this.rtDepth.texture; } - normalizationMaterial.uniforms.uWeightMap.value = this.rtAttribute.texture; - normalizationMaterial.uniforms.uDepthMap.value = this.rtAttribute.depthTexture; - - Utils.screenPass.render(viewer.renderer, normalizationMaterial); } - viewer.renderer.render(viewer.scene.scene, camera); + return this; - viewer.dispatchEvent({type: "render.pass.scene", viewer: viewer}); + }, - viewer.renderer.clearDepth(); + normalizeNormals: function () { - viewer.transformationTool.update(); + const normals = this.attributes.normal; - viewer.dispatchEvent({type: "render.pass.perspective_overlay",viewer: viewer}); + for ( let i = 0, il = normals.count; i < il; i ++ ) { - viewer.renderer.render(viewer.controls.sceneControls, camera); - viewer.renderer.render(viewer.clippingTool.sceneVolume, camera); - viewer.renderer.render(viewer.transformationTool.scene, camera); + _vector$4.fromBufferAttribute( normals, i ); - viewer.renderer.setViewport(width - viewer.navigationCube.width, - height - viewer.navigationCube.width, - viewer.navigationCube.width, viewer.navigationCube.width); - viewer.renderer.render(viewer.navigationCube, viewer.navigationCube.camera); - viewer.renderer.setViewport(0, 0, width, height); - - viewer.dispatchEvent({type: "render.pass.end",viewer: viewer}); + _vector$4.normalize(); - } + normals.setXYZ( i, _vector$4.x, _vector$4.y, _vector$4.z ); - } + } - class View{ - constructor () { - this.position = new THREE.Vector3(0, 0, 0); + }, - this.yaw = Math.PI / 4; - this._pitch = -Math.PI / 4; - this.radius = 1; + toNonIndexed: function () { - this.maxPitch = Math.PI / 2; - this.minPitch = -Math.PI / 2; - } + function convertBufferAttribute( attribute, indices ) { - clone () { - let c = new View(); - c.yaw = this.yaw; - c._pitch = this.pitch; - c.radius = this.radius; - c.maxPitch = this.maxPitch; - c.minPitch = this.minPitch; + const array = attribute.array; + const itemSize = attribute.itemSize; + const normalized = attribute.normalized; - return c; - } + const array2 = new array.constructor( indices.length * itemSize ); - get pitch () { - return this._pitch; - } + let index = 0, index2 = 0; - set pitch (angle) { - this._pitch = Math.max(Math.min(angle, this.maxPitch), this.minPitch); - } + for ( let i = 0, l = indices.length; i < l; i ++ ) { - get direction () { - let dir = new THREE.Vector3(0, 1, 0); + index = indices[ i ] * itemSize; - dir.applyAxisAngle(new THREE.Vector3(1, 0, 0), this.pitch); - dir.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw); + for ( let j = 0; j < itemSize; j ++ ) { - return dir; - } + array2[ index2 ++ ] = array[ index ++ ]; - set direction (dir) { + } - //if(dir.x === dir.y){ - if(dir.x === 0 && dir.y === 0){ - this.pitch = Math.PI / 2 * Math.sign(dir.z); - }else { - let yaw = Math.atan2(dir.y, dir.x) - Math.PI / 2; - let pitch = Math.atan2(dir.z, Math.sqrt(dir.x * dir.x + dir.y * dir.y)); + } + + return new BufferAttribute( array2, itemSize, normalized ); - this.yaw = yaw; - this.pitch = pitch; } - - } - lookAt(t){ - let V; - if(arguments.length === 1){ - V = new THREE.Vector3().subVectors(t, this.position); - }else if(arguments.length === 3){ - V = new THREE.Vector3().subVectors(new THREE.Vector3(...arguments), this.position); + // + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + } - let radius = V.length(); - let dir = V.normalize(); + const geometry2 = new BufferGeometry(); - this.radius = radius; - this.direction = dir; - } + const indices = this.index.array; + const attributes = this.attributes; - getPivot () { - return new THREE.Vector3().addVectors(this.position, this.direction.multiplyScalar(this.radius)); - } + // attributes - getSide () { - let side = new THREE.Vector3(1, 0, 0); - side.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw); + for ( const name in attributes ) { - return side; - } + const attribute = attributes[ name ]; - pan (x, y) { - let dir = new THREE.Vector3(0, 1, 0); - dir.applyAxisAngle(new THREE.Vector3(1, 0, 0), this.pitch); - dir.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw); + const newAttribute = convertBufferAttribute( attribute, indices ); - // let side = new THREE.Vector3(1, 0, 0); - // side.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw); + geometry2.setAttribute( name, newAttribute ); - let side = this.getSide(); + } - let up = side.clone().cross(dir); + // morph attributes - let pan = side.multiplyScalar(x).add(up.multiplyScalar(y)); + const morphAttributes = this.morphAttributes; - this.position = this.position.add(pan); - // this.target = this.target.add(pan); - } + for ( const name in morphAttributes ) { - translate (x, y, z) { - let dir = new THREE.Vector3(0, 1, 0); - dir.applyAxisAngle(new THREE.Vector3(1, 0, 0), this.pitch); - dir.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw); + const morphArray = []; + const morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes - let side = new THREE.Vector3(1, 0, 0); - side.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw); + for ( let i = 0, il = morphAttribute.length; i < il; i ++ ) { - let up = side.clone().cross(dir); + const attribute = morphAttribute[ i ]; - let t = side.multiplyScalar(x) - .add(dir.multiplyScalar(y)) - .add(up.multiplyScalar(z)); + const newAttribute = convertBufferAttribute( attribute, indices ); - this.position = this.position.add(t); - } + morphArray.push( newAttribute ); - translateWorld (x, y, z) { - this.position.x += x; - this.position.y += y; - this.position.z += z; - } + } - setView(position, target, duration = 0, callback = null){ + geometry2.morphAttributes[ name ] = morphArray; - let endPosition = null; - if(position instanceof Array){ - endPosition = new THREE.Vector3(...position); - }else if(position instanceof THREE.Vector3){ - endPosition = position.clone(); } - let endTarget = null; - if(target instanceof Array){ - endTarget = new THREE.Vector3(...target); - }else if(target instanceof THREE.Vector3){ - endTarget = target.clone(); + geometry2.morphTargetsRelative = this.morphTargetsRelative; + + // groups + + const groups = this.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + geometry2.addGroup( group.start, group.count, group.materialIndex ); + } - - const startPosition = this.position.clone(); - const startTarget = this.getPivot(); - //const endPosition = position.clone(); - //const endTarget = target.clone(); + return geometry2; - let easing = TWEEN.Easing.Quartic.Out; + }, - if(duration === 0){ - this.position.copy(endPosition); - this.lookAt(endTarget); - }else { - let value = {x: 0}; - let tween = new TWEEN.Tween(value).to({x: 1}, duration); - tween.easing(easing); - //this.tweens.push(tween); + toJSON: function () { - tween.onUpdate(() => { - let t = value.x; + const data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; - //console.log(t); + // standard BufferGeometry serialization - const pos = new THREE.Vector3( - (1 - t) * startPosition.x + t * endPosition.x, - (1 - t) * startPosition.y + t * endPosition.y, - (1 - t) * startPosition.z + t * endPosition.z, - ); + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData; - const target = new THREE.Vector3( - (1 - t) * startTarget.x + t * endTarget.x, - (1 - t) * startTarget.y + t * endTarget.y, - (1 - t) * startTarget.z + t * endTarget.z, - ); + if ( this.parameters !== undefined ) { - this.position.copy(pos); - this.lookAt(target); + const parameters = this.parameters; - }); + for ( const key in parameters ) { - tween.start(); + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; - tween.onComplete(() => { - if(callback){ - callback(); - } - }); } - } + data.data = { attributes: {} }; - }; + const index = this.index; - class Scene extends EventDispatcher{ + if ( index !== null ) { - constructor(){ - super(); + data.data.index = { + type: index.array.constructor.name, + array: Array.prototype.slice.call( index.array ) + }; - this.annotations = new Annotation(); - - this.scene = new THREE.Scene(); - this.sceneBG = new THREE.Scene(); - this.scenePointCloud = new THREE.Scene(); - - this.cameraP = new THREE.PerspectiveCamera(this.fov, 1, 0.1, 1000*1000); - this.cameraO = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.1, 1000*1000); - this.cameraVR = new THREE.PerspectiveCamera(); - this.cameraBG = new THREE.Camera(); - this.cameraScreenSpace = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.1, 10); - this.cameraMode = CameraMode.PERSPECTIVE; - this.overrideCamera = null; - this.pointclouds = []; + } - this.measurements = []; - this.profiles = []; - this.volumes = []; - this.polygonClipVolumes = []; - this.cameraAnimations = []; - this.orientedImages = []; - this.images360 = []; - this.geopackages = []; - - this.fpControls = null; - this.orbitControls = null; - this.earthControls = null; - this.geoControls = null; - this.deviceControls = null; - this.inputHandler = null; + const attributes = this.attributes; - this.view = new View(); + for ( const key in attributes ) { - this.directionalLight = null; + const attribute = attributes[ key ]; - this.initialize(); - } + const attributeData = attribute.toJSON( data.data ); - estimateHeightAt (position) { - let height = null; - let fromSpacing = Infinity; + if ( attribute.name !== '' ) attributeData.name = attribute.name; - for (let pointcloud of this.pointclouds) { - if (pointcloud.root.geometryNode === undefined) { - continue; - } + data.data.attributes[ key ] = attributeData; - let pHeight = null; - let pFromSpacing = Infinity; + } - let lpos = position.clone().sub(pointcloud.position); - lpos.z = 0; - let ray = new THREE.Ray(lpos, new THREE.Vector3(0, 0, 1)); + const morphAttributes = {}; + let hasMorphAttributes = false; - let stack = [pointcloud.root]; - while (stack.length > 0) { - let node = stack.pop(); - let box = node.getBoundingBox(); + for ( const key in this.morphAttributes ) { - let inside = ray.intersectBox(box); + const attributeArray = this.morphAttributes[ key ]; - if (!inside) { - continue; - } + const array = []; - let h = node.geometryNode.mean.z + - pointcloud.position.z + - node.geometryNode.boundingBox.min.z; + for ( let i = 0, il = attributeArray.length; i < il; i ++ ) { - if (node.geometryNode.spacing <= pFromSpacing) { - pHeight = h; - pFromSpacing = node.geometryNode.spacing; - } + const attribute = attributeArray[ i ]; + + const attributeData = attribute.toJSON( data.data ); + + if ( attribute.name !== '' ) attributeData.name = attribute.name; + + array.push( attributeData ); - for (let index of Object.keys(node.children)) { - let child = node.children[index]; - if (child.geometryNode) { - stack.push(node.children[index]); - } - } } - if (height === null || pFromSpacing < fromSpacing) { - height = pHeight; - fromSpacing = pFromSpacing; + if ( array.length > 0 ) { + + morphAttributes[ key ] = array; + + hasMorphAttributes = true; + } - } - return height; - } - - getBoundingBox(pointclouds = this.pointclouds){ - let box = new THREE.Box3(); + } - this.scenePointCloud.updateMatrixWorld(true); - this.referenceFrame.updateMatrixWorld(true); + if ( hasMorphAttributes ) { - for (let pointcloud of pointclouds) { - pointcloud.updateMatrixWorld(true); + data.data.morphAttributes = morphAttributes; + data.data.morphTargetsRelative = this.morphTargetsRelative; - let pointcloudBox = pointcloud.pcoGeometry.tightBoundingBox ? pointcloud.pcoGeometry.tightBoundingBox : pointcloud.boundingBox; - let boxWorld = Utils.computeTransformedBoundingBox(pointcloudBox, pointcloud.matrixWorld); - box.union(boxWorld); } - return box; - } + const groups = this.groups; - addPointCloud (pointcloud) { - this.pointclouds.push(pointcloud); - this.scenePointCloud.add(pointcloud); + if ( groups.length > 0 ) { - this.dispatchEvent({ - type: 'pointcloud_added', - pointcloud: pointcloud - }); - } + data.data.groups = JSON.parse( JSON.stringify( groups ) ); - addVolume (volume) { - this.volumes.push(volume); - this.dispatchEvent({ - 'type': 'volume_added', - 'scene': this, - 'volume': volume - }); - } + } - addOrientedImages(images){ - this.orientedImages.push(images); - this.scene.add(images.node); + const boundingSphere = this.boundingSphere; - this.dispatchEvent({ - 'type': 'oriented_images_added', - 'scene': this, - 'images': images - }); - }; + if ( boundingSphere !== null ) { - removeOrientedImages(images){ - let index = this.orientedImages.indexOf(images); - if (index > -1) { - this.orientedImages.splice(index, 1); + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; - this.dispatchEvent({ - 'type': 'oriented_images_removed', - 'scene': this, - 'images': images - }); } - }; - add360Images(images){ - this.images360.push(images); - this.scene.add(images.node); + return data; - this.dispatchEvent({ - 'type': '360_images_added', - 'scene': this, - 'images': images - }); - } + }, - remove360Images(images){ - let index = this.images360.indexOf(images); - if (index > -1) { - this.images360.splice(index, 1); + clone: function () { - this.dispatchEvent({ - 'type': '360_images_removed', - 'scene': this, - 'images': images - }); - } - } + /* + // Handle primitives - addGeopackage(geopackage){ - this.geopackages.push(geopackage); - this.scene.add(geopackage.node); + const parameters = this.parameters; - this.dispatchEvent({ - 'type': 'geopackage_added', - 'scene': this, - 'geopackage': geopackage - }); - }; + if ( parameters !== undefined ) { - removeGeopackage(geopackage){ - let index = this.geopackages.indexOf(geopackage); - if (index > -1) { - this.geopackages.splice(index, 1); + const values = []; - this.dispatchEvent({ - 'type': 'geopackage_removed', - 'scene': this, - 'geopackage': geopackage - }); - } - }; + for ( const key in parameters ) { - removeVolume (volume) { - let index = this.volumes.indexOf(volume); - if (index > -1) { - this.volumes.splice(index, 1); + values.push( parameters[ key ] ); - this.dispatchEvent({ - 'type': 'volume_removed', - 'scene': this, - 'volume': volume - }); - } - }; + } - addCameraAnimation(animation) { - this.cameraAnimations.push(animation); - this.dispatchEvent({ - 'type': 'camera_animation_added', - 'scene': this, - 'animation': animation - }); - }; + const geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; - removeCameraAnimation(animation){ - let index = this.cameraAnimations.indexOf(volume); - if (index > -1) { - this.cameraAnimations.splice(index, 1); + } - this.dispatchEvent({ - 'type': 'camera_animation_removed', - 'scene': this, - 'animation': animation - }); - } - }; + return new this.constructor().copy( this ); + */ - addPolygonClipVolume(volume){ - this.polygonClipVolumes.push(volume); - this.dispatchEvent({ - "type": "polygon_clip_volume_added", - "scene": this, - "volume": volume - }); - }; - - removePolygonClipVolume(volume){ - let index = this.polygonClipVolumes.indexOf(volume); - if (index > -1) { - this.polygonClipVolumes.splice(index, 1); - this.dispatchEvent({ - "type": "polygon_clip_volume_removed", - "scene": this, - "volume": volume - }); - } - }; - - addMeasurement(measurement){ - measurement.lengthUnit = this.lengthUnit; - measurement.lengthUnitDisplay = this.lengthUnitDisplay; - this.measurements.push(measurement); - this.dispatchEvent({ - 'type': 'measurement_added', - 'scene': this, - 'measurement': measurement - }); - }; + return new BufferGeometry().copy( this ); - removeMeasurement (measurement) { - let index = this.measurements.indexOf(measurement); - if (index > -1) { - this.measurements.splice(index, 1); - this.dispatchEvent({ - 'type': 'measurement_removed', - 'scene': this, - 'measurement': measurement - }); - } - } + }, - addProfile (profile) { - this.profiles.push(profile); - this.dispatchEvent({ - 'type': 'profile_added', - 'scene': this, - 'profile': profile - }); - } + copy: function ( source ) { - removeProfile (profile) { - let index = this.profiles.indexOf(profile); - if (index > -1) { - this.profiles.splice(index, 1); - this.dispatchEvent({ - 'type': 'profile_removed', - 'scene': this, - 'profile': profile - }); - } - } + // reset - removeAllMeasurements () { - while (this.measurements.length > 0) { - this.removeMeasurement(this.measurements[0]); - } + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; - while (this.profiles.length > 0) { - this.removeProfile(this.profiles[0]); - } + // used for storing cloned, shared data - while (this.volumes.length > 0) { - this.removeVolume(this.volumes[0]); - } - } + const data = {}; + + // name + + this.name = source.name; + + // index + + const index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone( data ) ); - removeAllClipVolumes(){ - let clipVolumes = this.volumes.filter(volume => volume.clip === true); - for(let clipVolume of clipVolumes){ - this.removeVolume(clipVolume); } - while(this.polygonClipVolumes.length > 0){ - this.removePolygonClipVolume(this.polygonClipVolumes[0]); + // attributes + + const attributes = source.attributes; + + for ( const name in attributes ) { + + const attribute = attributes[ name ]; + this.setAttribute( name, attribute.clone( data ) ); + } - } - getActiveCamera() { + // morph attributes + + const morphAttributes = source.morphAttributes; + + for ( const name in morphAttributes ) { + + const array = []; + const morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( let i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone( data ) ); + + } + + this.morphAttributes[ name ] = array; - if(this.overrideCamera){ - return this.overrideCamera; } - if(this.cameraMode === CameraMode.PERSPECTIVE){ - return this.cameraP; - }else if(this.cameraMode === CameraMode.ORTHOGRAPHIC){ - return this.cameraO; - }else if(this.cameraMode === CameraMode.VR){ - return this.cameraVR; + this.morphTargetsRelative = source.morphTargetsRelative; + + // groups + + const groups = source.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + } - return null; - } - - initialize(){ - - this.referenceFrame = new THREE.Object3D(); - this.referenceFrame.matrixAutoUpdate = false; - this.scenePointCloud.add(this.referenceFrame); + // bounding box - this.cameraP.up.set(0, 0, 1); - this.cameraP.position.set(1000, 1000, 1000); - this.cameraO.up.set(0, 0, 1); - this.cameraO.position.set(1000, 1000, 1000); - //this.camera.rotation.y = -Math.PI / 4; - //this.camera.rotation.x = -Math.PI / 6; - this.cameraScreenSpace.lookAt(new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, -1), new THREE.Vector3(0, 1, 0)); - - this.directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 ); - this.directionalLight.position.set( 10, 10, 10 ); - this.directionalLight.lookAt( new THREE.Vector3(0, 0, 0)); - this.scenePointCloud.add( this.directionalLight ); - - let light = new THREE.AmbientLight( 0x555555 ); // soft white light - this.scenePointCloud.add( light ); + const boundingBox = source.boundingBox; - { // background - let texture = Utils.createBackgroundTexture(512, 512); + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); - texture.minFilter = texture.magFilter = THREE.NearestFilter; - texture.minFilter = texture.magFilter = THREE.LinearFilter; - let bg = new THREE.Mesh( - new THREE.PlaneBufferGeometry(2, 2, 0), - new THREE.MeshBasicMaterial({ - map: texture - }) - ); - bg.material.depthTest = false; - bg.material.depthWrite = false; - this.sceneBG.add(bg); } - // { // lights - // { - // let light = new THREE.DirectionalLight(0xffffff); - // light.position.set(10, 10, 1); - // light.target.position.set(0, 0, 0); - // this.scene.add(light); - // } + // bounding sphere - // { - // let light = new THREE.DirectionalLight(0xffffff); - // light.position.set(-10, 10, 1); - // light.target.position.set(0, 0, 0); - // this.scene.add(light); - // } + const boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); - // { - // let light = new THREE.DirectionalLight(0xffffff); - // light.position.set(0, -10, 20); - // light.target.position.set(0, 0, 0); - // this.scene.add(light); - // } - // } - } - - addAnnotation(position, args = {}){ - if(position instanceof Array){ - args.position = new THREE.Vector3().fromArray(position); - } else if (position instanceof THREE.Vector3) { - args.position = position; } - let annotation = new Annotation(args); - this.annotations.add(annotation); - return annotation; - } + // draw range - getAnnotations () { - return this.annotations; - }; + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + // user data + + this.userData = source.userData; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); - removeAnnotation(annotationToRemove) { - this.annotations.remove(annotationToRemove); } - }; - // http://epsg.io/ - proj4.defs([ - ['UTM10N', '+proj=utm +zone=10 +ellps=GRS80 +datum=NAD83 +units=m +no_defs'], - ['EPSG:6339', '+proj=utm +zone=10 +ellps=GRS80 +units=m +no_defs'], - ['EPSG:6340', '+proj=utm +zone=11 +ellps=GRS80 +units=m +no_defs'], - ['EPSG:6341', '+proj=utm +zone=12 +ellps=GRS80 +units=m +no_defs'], - ['EPSG:6342', '+proj=utm +zone=13 +ellps=GRS80 +units=m +no_defs'], - ['EPSG:6343', '+proj=utm +zone=14 +ellps=GRS80 +units=m +no_defs'], - ['EPSG:6344', '+proj=utm +zone=15 +ellps=GRS80 +units=m +no_defs'], - ['EPSG:6345', '+proj=utm +zone=16 +ellps=GRS80 +units=m +no_defs'], - ['EPSG:6346', '+proj=utm +zone=17 +ellps=GRS80 +units=m +no_defs'], - ['EPSG:6347', '+proj=utm +zone=18 +ellps=GRS80 +units=m +no_defs'], - ['EPSG:6348', '+proj=utm +zone=19 +ellps=GRS80 +units=m +no_defs'], - ['EPSG:26910', '+proj=utm +zone=10 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], - ['EPSG:26911', '+proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], - ['EPSG:26912', '+proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], - ['EPSG:26913', '+proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], - ['EPSG:26914', '+proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], - ['EPSG:26915', '+proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], - ['EPSG:26916', '+proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], - ['EPSG:26917', '+proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], - ['EPSG:26918', '+proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], - ['EPSG:26919', '+proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], - ]); + } ); - class MapView{ + const _inverseMatrix = new Matrix4(); + const _ray = new Ray(); + const _sphere = new Sphere(); - constructor (viewer) { - this.viewer = viewer; + const _vA = new Vector3(); + const _vB = new Vector3(); + const _vC = new Vector3(); - this.webMapService = 'WMTS'; - this.mapProjectionName = 'EPSG:3857'; - this.mapProjection = proj4.defs(this.mapProjectionName); - this.sceneProjection = null; + const _tempA = new Vector3(); + const _tempB = new Vector3(); + const _tempC = new Vector3(); - this.extentsLayer = null; - this.cameraLayer = null; - this.toolLayer = null; - this.sourcesLayer = null; - this.sourcesLabelLayer = null; - this.images360Layer = null; - this.enabled = false; + const _morphA = new Vector3(); + const _morphB = new Vector3(); + const _morphC = new Vector3(); - this.createAnnotationStyle = (text) => { - return [ - new ol.style.Style({ - image: new ol.style.Circle({ - radius: 10, - stroke: new ol.style.Stroke({ - color: [255, 255, 255, 0.5], - width: 2 - }), - fill: new ol.style.Fill({ - color: [0, 0, 0, 0.5] - }) - }) - }) - ]; - }; + const _uvA = new Vector2(); + const _uvB = new Vector2(); + const _uvC = new Vector2(); - this.createLabelStyle = (text) => { - let style = new ol.style.Style({ - image: new ol.style.Circle({ - radius: 6, - stroke: new ol.style.Stroke({ - color: 'white', - width: 2 - }), - fill: new ol.style.Fill({ - color: 'green' - }) - }), - text: new ol.style.Text({ - font: '12px helvetica,sans-serif', - text: text, - fill: new ol.style.Fill({ - color: '#000' - }), - stroke: new ol.style.Stroke({ - color: '#fff', - width: 2 - }) - }) - }); + const _intersectionPoint = new Vector3(); + const _intersectionPointWorld = new Vector3(); - return style; - }; - } + function Mesh( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) { - showSources (show) { - this.sourcesLayer.setVisible(show); - this.sourcesLabelLayer.setVisible(show); - } + Object3D.call( this ); - init () { + this.type = 'Mesh'; - if(typeof ol === "undefined"){ - return; - } + this.geometry = geometry; + this.material = material; - this.elMap = $('#potree_map'); - this.elMap.draggable({ handle: $('#potree_map_header') }); - this.elMap.resizable(); + this.updateMorphTargets(); - this.elTooltip = $(`
`); - this.elMap.append(this.elTooltip); + } - let extentsLayer = this.getExtentsLayer(); - let cameraLayer = this.getCameraLayer(); - this.getToolLayer(); - let sourcesLayer = this.getSourcesLayer(); - this.images360Layer = this.getImages360Layer(); - this.getSourcesLabelLayer(); - this.getAnnotationsLayer(); + Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { - let mousePositionControl = new ol.control.MousePosition({ - coordinateFormat: ol.coordinate.createStringXY(5), - projection: 'EPSG:4326', - undefinedHTML: ' ' - }); + constructor: Mesh, - let _this = this; - let DownloadSelectionControl = function (optOptions) { - let options = optOptions || {}; + isMesh: true, - // TOGGLE TILES - let btToggleTiles = document.createElement('button'); - btToggleTiles.innerHTML = 'T'; - btToggleTiles.addEventListener('click', () => { - let visible = sourcesLayer.getVisible(); - _this.showSources(!visible); - }, false); - btToggleTiles.style.float = 'left'; - btToggleTiles.title = 'show / hide tiles'; + copy: function ( source ) { - // DOWNLOAD SELECTED TILES - let link = document.createElement('a'); - link.href = '#'; - link.download = 'list.txt'; - link.style.float = 'left'; + Object3D.prototype.copy.call( this, source ); - let button = document.createElement('button'); - button.innerHTML = 'D'; - link.appendChild(button); + if ( source.morphTargetInfluences !== undefined ) { - let handleDownload = (e) => { - let features = selectedFeatures.getArray(); + this.morphTargetInfluences = source.morphTargetInfluences.slice(); - let url = [document.location.protocol, '//', document.location.host, document.location.pathname].join(''); + } - if (features.length === 0) { - alert('No tiles were selected. Select area with ctrl + left mouse button!'); - e.preventDefault(); - e.stopImmediatePropagation(); - return false; - } else if (features.length === 1) { - let feature = features[0]; + if ( source.morphTargetDictionary !== undefined ) { - if (feature.source) { - let cloudjsurl = feature.pointcloud.pcoGeometry.url; - let sourceurl = new URL(url + '/../' + cloudjsurl + '/../source/' + feature.source.name); - link.href = sourceurl.href; - link.download = feature.source.name; - } - } else { - let content = ''; - for (let i = 0; i < features.length; i++) { - let feature = features[i]; + this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary ); - if (feature.source) { - let cloudjsurl = feature.pointcloud.pcoGeometry.url; - let sourceurl = new URL(url + '/../' + cloudjsurl + '/../source/' + feature.source.name); - content += sourceurl.href + '\n'; - } - } + } - let uri = 'data:application/octet-stream;base64,' + btoa(content); - link.href = uri; - link.download = 'list_of_files.txt'; - } - }; + this.material = source.material; + this.geometry = source.geometry; - button.addEventListener('click', handleDownload, false); + return this; - // assemble container - let element = document.createElement('div'); - element.className = 'ol-unselectable ol-control'; - element.appendChild(link); - element.appendChild(btToggleTiles); - element.style.bottom = '0.5em'; - element.style.left = '0.5em'; - element.title = 'Download file or list of selected tiles. Select tile with left mouse button or area using ctrl + left mouse.'; + }, - ol.control.Control.call(this, { - element: element, - target: options.target - }); - }; - ol.inherits(DownloadSelectionControl, ol.control.Control); + updateMorphTargets: function () { - this.map = new ol.Map({ - controls: ol.control.defaults({ - attributionOptions: ({ - collapsible: false - }) - }).extend([ - // this.controls.zoomToExtent, - new DownloadSelectionControl(), - mousePositionControl - ]), - layers: [ - new ol.layer.Tile({source: new ol.source.OSM()}), - this.toolLayer, - this.annotationsLayer, - this.sourcesLayer, - this.sourcesLabelLayer, - this.images360Layer, - extentsLayer, - cameraLayer - ], - target: 'potree_map_content', - view: new ol.View({ - center: this.olCenter, - zoom: 9 - }) - }); + const geometry = this.geometry; - // DRAGBOX / SELECTION - this.dragBoxLayer = new ol.layer.Vector({ - source: new ol.source.Vector({}), - style: new ol.style.Style({ - stroke: new ol.style.Stroke({ - color: 'rgba(0, 0, 255, 1)', - width: 2 - }) - }) - }); - this.map.addLayer(this.dragBoxLayer); + if ( geometry.isBufferGeometry ) { - let select = new ol.interaction.Select(); - this.map.addInteraction(select); + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); - let selectedFeatures = select.getFeatures(); + if ( keys.length > 0 ) { - let dragBox = new ol.interaction.DragBox({ - condition: ol.events.condition.platformModifierKeyOnly - }); + const morphAttribute = morphAttributes[ keys[ 0 ] ]; - this.map.addInteraction(dragBox); + if ( morphAttribute !== undefined ) { - // this.map.on('pointermove', evt => { - // let pixel = evt.pixel; - // let feature = this.map.forEachFeatureAtPixel(pixel, function (feature) { - // return feature; - // }); + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; - // // console.log(feature); - // // this.elTooltip.css("display", feature ? '' : 'none'); - // this.elTooltip.css('display', 'none'); - // if (feature && feature.onHover) { - // feature.onHover(evt); - // // overlay.setPosition(evt.coordinate); - // // tooltip.innerHTML = feature.get('name'); - // } - // }); + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { - this.map.on('click', evt => { - let pixel = evt.pixel; - let feature = this.map.forEachFeatureAtPixel(pixel, function (feature) { - return feature; - }); + const name = morphAttribute[ m ].name || String( m ); - if (feature && feature.onClick) { - feature.onClick(evt); - } - }); + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; - dragBox.on('boxend', (e) => { - // features that intersect the box are added to the collection of - // selected features, and their names are displayed in the "info" - // div - let extent = dragBox.getGeometry().getExtent(); - this.getSourcesLayer().getSource().forEachFeatureIntersectingExtent(extent, (feature) => { - selectedFeatures.push(feature); - }); - }); + } - // clear selection when drawing a new box and when clicking on the map - dragBox.on('boxstart', (e) => { - selectedFeatures.clear(); - }); - this.map.on('click', () => { - selectedFeatures.clear(); - }); + } - this.viewer.addEventListener('scene_changed', e => { - this.setScene(e.scene); - }); + } - this.onPointcloudAdded = e => { - this.load(e.pointcloud); - }; + } else { - this.on360ImagesAdded = e => { - this.addImages360(e.images); - }; + const morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + console.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); - this.onAnnotationAdded = e => { - if (!this.sceneProjection) { - return; } - let annotation = e.annotation; - let position = annotation.position; - let mapPos = this.toMap.forward([position.x, position.y]); - let feature = new ol.Feature({ - geometry: new ol.geom.Point(mapPos), - name: annotation.title - }); - feature.setStyle(this.createAnnotationStyle(annotation.title)); + } - feature.onHover = evt => { - let coordinates = feature.getGeometry().getCoordinates(); - let p = this.map.getPixelFromCoordinate(coordinates); + }, - this.elTooltip.html(annotation.title); - this.elTooltip.css('display', ''); - this.elTooltip.css('left', `${p[0]}px`); - this.elTooltip.css('top', `${p[1]}px`); - }; + raycast: function ( raycaster, intersects ) { - feature.onClick = evt => { - annotation.clickTitle(); - }; + const geometry = this.geometry; + const material = this.material; + const matrixWorld = this.matrixWorld; - this.getAnnotationsLayer().getSource().addFeature(feature); - }; + if ( material === undefined ) return; - this.setScene(this.viewer.scene); - } + // Checking boundingSphere distance to ray - setScene (scene) { - if (this.scene === scene) { - return; - }; + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); - if (this.scene) { - this.scene.removeEventListener('pointcloud_added', this.onPointcloudAdded); - this.scene.removeEventListener('360_images_added', this.on360ImagesAdded); - this.scene.annotations.removeEventListener('annotation_added', this.onAnnotationAdded); - } + _sphere.copy( geometry.boundingSphere ); + _sphere.applyMatrix4( matrixWorld ); - this.scene = scene; + if ( raycaster.ray.intersectsSphere( _sphere ) === false ) return; - this.scene.addEventListener('pointcloud_added', this.onPointcloudAdded); - this.scene.addEventListener('360_images_added', this.on360ImagesAdded); - this.scene.annotations.addEventListener('annotation_added', this.onAnnotationAdded); + // - for (let pointcloud of this.viewer.scene.pointclouds) { - this.load(pointcloud); - } + _inverseMatrix.copy( matrixWorld ).invert(); + _ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix ); - this.viewer.scene.annotations.traverseDescendants(annotation => { - this.onAnnotationAdded({annotation: annotation}); - }); + // Check boundingBox before continuing - for(let images of this.viewer.scene.images360){ - this.on360ImagesAdded({images: images}); - } - } + if ( geometry.boundingBox !== null ) { + + if ( _ray.intersectsBox( geometry.boundingBox ) === false ) return; - getExtentsLayer () { - if (this.extentsLayer) { - return this.extentsLayer; } - this.gExtent = new ol.geom.LineString([[0, 0], [0, 0]]); + let intersection; - let feature = new ol.Feature(this.gExtent); - let featureVector = new ol.source.Vector({ - features: [feature] - }); + if ( geometry.isBufferGeometry ) { - this.extentsLayer = new ol.layer.Vector({ - source: featureVector, - style: new ol.style.Style({ - fill: new ol.style.Fill({ - color: 'rgba(255, 255, 255, 0.2)' - }), - stroke: new ol.style.Stroke({ - color: '#0000ff', - width: 2 - }), - image: new ol.style.Circle({ - radius: 3, - fill: new ol.style.Fill({ - color: '#0000ff' - }) - }) - }) - }); + const index = geometry.index; + const position = geometry.attributes.position; + const morphPosition = geometry.morphAttributes.position; + const morphTargetsRelative = geometry.morphTargetsRelative; + const uv = geometry.attributes.uv; + const uv2 = geometry.attributes.uv2; + const groups = geometry.groups; + const drawRange = geometry.drawRange; - return this.extentsLayer; - } + if ( index !== null ) { - getAnnotationsLayer () { - if (this.annotationsLayer) { - return this.annotationsLayer; - } + // indexed buffer geometry - this.annotationsLayer = new ol.layer.Vector({ - source: new ol.source.Vector({ - }), - style: new ol.style.Style({ - fill: new ol.style.Fill({ - color: 'rgba(255, 0, 0, 1)' - }), - stroke: new ol.style.Stroke({ - color: 'rgba(255, 0, 0, 1)', - width: 2 - }) - }) - }); + if ( Array.isArray( material ) ) { - return this.annotationsLayer; - } + for ( let i = 0, il = groups.length; i < il; i ++ ) { - getCameraLayer () { - if (this.cameraLayer) { - return this.cameraLayer; - } + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; - // CAMERA LAYER - this.gCamera = new ol.geom.LineString([[0, 0], [0, 0], [0, 0], [0, 0]]); - let feature = new ol.Feature(this.gCamera); - let featureVector = new ol.source.Vector({ - features: [feature] - }); + const start = Math.max( group.start, drawRange.start ); + const end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ); - this.cameraLayer = new ol.layer.Vector({ - source: featureVector, - style: new ol.style.Style({ - stroke: new ol.style.Stroke({ - color: '#0000ff', - width: 2 - }) - }) - }); + for ( let j = start, jl = end; j < jl; j += 3 ) { - return this.cameraLayer; - } + const a = index.getX( j ); + const b = index.getX( j + 1 ); + const c = index.getX( j + 2 ); - getToolLayer () { - if (this.toolLayer) { - return this.toolLayer; - } + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ); - this.toolLayer = new ol.layer.Vector({ - source: new ol.source.Vector({ - }), - style: new ol.style.Style({ - fill: new ol.style.Fill({ - color: 'rgba(255, 0, 0, 1)' - }), - stroke: new ol.style.Stroke({ - color: 'rgba(255, 0, 0, 1)', - width: 2 - }) - }) - }); + if ( intersection ) { - return this.toolLayer; - } + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics + intersection.face.materialIndex = group.materialIndex; + intersects.push( intersection ); - getImages360Layer(){ - if(this.images360Layer){ - return this.images360Layer; - } + } - let style = new ol.style.Style({ - image: new ol.style.Circle({ - radius: 4, - stroke: new ol.style.Stroke({ - color: [255, 0, 0, 1], - width: 2 - }), - fill: new ol.style.Fill({ - color: [255, 100, 100, 1] - }) - }) - }); - - let layer = new ol.layer.Vector({ - source: new ol.source.Vector({}), - style: style, - }); + } - this.images360Layer = layer; + } - return this.images360Layer; - } + } else { - getSourcesLayer () { - if (this.sourcesLayer) { - return this.sourcesLayer; - } + const start = Math.max( 0, drawRange.start ); + const end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); - this.sourcesLayer = new ol.layer.Vector({ - source: new ol.source.Vector({}), - style: new ol.style.Style({ - fill: new ol.style.Fill({ - color: 'rgba(0, 0, 150, 0.1)' - }), - stroke: new ol.style.Stroke({ - color: 'rgba(0, 0, 150, 1)', - width: 1 - }) - }) - }); + for ( let i = start, il = end; i < il; i += 3 ) { - return this.sourcesLayer; - } + const a = index.getX( i ); + const b = index.getX( i + 1 ); + const c = index.getX( i + 2 ); - getSourcesLabelLayer () { - if (this.sourcesLabelLayer) { - return this.sourcesLabelLayer; - } + intersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ); - this.sourcesLabelLayer = new ol.layer.Vector({ - source: new ol.source.Vector({ - }), - style: new ol.style.Style({ - fill: new ol.style.Fill({ - color: 'rgba(255, 0, 0, 0.1)' - }), - stroke: new ol.style.Stroke({ - color: 'rgba(255, 0, 0, 1)', - width: 2 - }) - }), - minResolution: 0.01, - maxResolution: 20 - }); + if ( intersection ) { - return this.sourcesLabelLayer; - } + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); - setSceneProjection (sceneProjection) { - this.sceneProjection = sceneProjection; - this.toMap = proj4(this.sceneProjection, this.mapProjection); - this.toScene = proj4(this.mapProjection, this.sceneProjection); - }; + } - getMapExtent () { - let bb = this.viewer.getBoundingBox(); + } - let bottomLeft = this.toMap.forward([bb.min.x, bb.min.y]); - let bottomRight = this.toMap.forward([bb.max.x, bb.min.y]); - let topRight = this.toMap.forward([bb.max.x, bb.max.y]); - let topLeft = this.toMap.forward([bb.min.x, bb.max.y]); + } - let extent = { - bottomLeft: bottomLeft, - bottomRight: bottomRight, - topRight: topRight, - topLeft: topLeft - }; + } else if ( position !== undefined ) { - return extent; - }; + // non-indexed buffer geometry - getMapCenter () { - let mapExtent = this.getMapExtent(); + if ( Array.isArray( material ) ) { - let mapCenter = [ - (mapExtent.bottomLeft[0] + mapExtent.topRight[0]) / 2, - (mapExtent.bottomLeft[1] + mapExtent.topRight[1]) / 2 - ]; + for ( let i = 0, il = groups.length; i < il; i ++ ) { - return mapCenter; - }; + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; - updateToolDrawings () { - this.toolLayer.getSource().clear(); + const start = Math.max( group.start, drawRange.start ); + const end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ); - let profiles = this.viewer.profileTool.profiles; - for (let i = 0; i < profiles.length; i++) { - let profile = profiles[i]; - let coordinates = []; + for ( let j = start, jl = end; j < jl; j += 3 ) { - for (let j = 0; j < profile.points.length; j++) { - let point = profile.points[j]; - let pointMap = this.toMap.forward([point.x, point.y]); - coordinates.push(pointMap); - } + const a = j; + const b = j + 1; + const c = j + 2; - let line = new ol.geom.LineString(coordinates); - let feature = new ol.Feature(line); - this.toolLayer.getSource().addFeature(feature); - } + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ); - let measurements = this.viewer.measuringTool.measurements; - for (let i = 0; i < measurements.length; i++) { - let measurement = measurements[i]; - let coordinates = []; + if ( intersection ) { - for (let j = 0; j < measurement.points.length; j++) { - let point = measurement.points[j].position; - let pointMap = this.toMap.forward([point.x, point.y]); - coordinates.push(pointMap); - } + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics + intersection.face.materialIndex = group.materialIndex; + intersects.push( intersection ); - if (measurement.closed && measurement.points.length > 0) { - coordinates.push(coordinates[0]); - } + } - let line = new ol.geom.LineString(coordinates); - let feature = new ol.Feature(line); - this.toolLayer.getSource().addFeature(feature); - } - } + } - addImages360(images){ - let transform = this.toMap.forward; - let layer = this.getImages360Layer(); + } - for(let image of images.images){ + } else { - let p = transform([image.position[0], image.position[1]]); + const start = Math.max( 0, drawRange.start ); + const end = Math.min( position.count, ( drawRange.start + drawRange.count ) ); - let feature = new ol.Feature({ - 'geometry': new ol.geom.Point(p), - }); + for ( let i = start, il = end; i < il; i += 3 ) { - feature.onClick = () => { - images.focus(image); - }; + const a = i; + const b = i + 1; + const c = i + 2; - layer.getSource().addFeature(feature); - } - } + intersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ); - async load (pointcloud) { - if (!pointcloud) { - return; - } + if ( intersection ) { - if (!pointcloud.projection) { - return; - } + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); - if (!this.sceneProjection) { - try { - this.setSceneProjection(pointcloud.projection); - }catch (e) { - console.log('Failed projection:', e); + } - if (pointcloud.fallbackProjection) { - try { - console.log('Trying fallback projection...'); - this.setSceneProjection(pointcloud.fallbackProjection); - console.log('Set projection from fallback'); - }catch (e) { - console.log('Failed fallback projection:', e); - return; } - }else { - return; - }; + + } + } - } - let mapExtent = this.getMapExtent(); - let mapCenter = this.getMapCenter(); + } else if ( geometry.isGeometry ) { - let view = this.map.getView(); - view.setCenter(mapCenter); + const isMultiMaterial = Array.isArray( material ); - this.gExtent.setCoordinates([ - mapExtent.bottomLeft, - mapExtent.bottomRight, - mapExtent.topRight, - mapExtent.topLeft, - mapExtent.bottomLeft - ]); + const vertices = geometry.vertices; + const faces = geometry.faces; + let uvs; - view.fit(this.gExtent, [300, 300], { - constrainResolution: false - }); + const faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; - if (pointcloud.pcoGeometry.type == 'ept'){ - return; - } + for ( let f = 0, fl = faces.length; f < fl; f ++ ) { - let url = `${pointcloud.pcoGeometry.url}/../sources.json`; - //let response = await fetch(url); + const face = faces[ f ]; + const faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; - fetch(url).then(async (response) => { - let data = await response.json(); - - let sources = data.sources; + if ( faceMaterial === undefined ) continue; - for (let i = 0; i < sources.length; i++) { - let source = sources[i]; - let name = source.name; - let bounds = source.bounds; + const fvA = vertices[ face.a ]; + const fvB = vertices[ face.b ]; + const fvC = vertices[ face.c ]; - let mapBounds = { - min: this.toMap.forward([bounds.min[0], bounds.min[1]]), - max: this.toMap.forward([bounds.max[0], bounds.max[1]]) - }; - let mapCenter = [ - (mapBounds.min[0] + mapBounds.max[0]) / 2, - (mapBounds.min[1] + mapBounds.max[1]) / 2 - ]; + intersection = checkIntersection( this, faceMaterial, raycaster, _ray, fvA, fvB, fvC, _intersectionPoint ); - let p1 = this.toMap.forward([bounds.min[0], bounds.min[1]]); - let p2 = this.toMap.forward([bounds.max[0], bounds.min[1]]); - let p3 = this.toMap.forward([bounds.max[0], bounds.max[1]]); - let p4 = this.toMap.forward([bounds.min[0], bounds.max[1]]); + if ( intersection ) { - // let feature = new ol.Feature({ - // 'geometry': new ol.geom.LineString([p1, p2, p3, p4, p1]) - // }); - let feature = new ol.Feature({ - 'geometry': new ol.geom.Polygon([[p1, p2, p3, p4, p1]]) - }); - feature.source = source; - feature.pointcloud = pointcloud; - this.getSourcesLayer().getSource().addFeature(feature); + if ( uvs && uvs[ f ] ) { - feature = new ol.Feature({ - geometry: new ol.geom.Point(mapCenter), - name: name - }); - feature.setStyle(this.createLabelStyle(name)); - this.sourcesLabelLayer.getSource().addFeature(feature); - } - }).catch(() => { - - }); + const uvs_f = uvs[ f ]; + _uvA.copy( uvs_f[ 0 ] ); + _uvB.copy( uvs_f[ 1 ] ); + _uvC.copy( uvs_f[ 2 ] ); - } + intersection.uv = Triangle.getUV( _intersectionPoint, fvA, fvB, fvC, _uvA, _uvB, _uvC, new Vector2() ); - toggle () { - if (this.elMap.is(':visible')) { - this.elMap.css('display', 'none'); - this.enabled = false; - } else { - this.elMap.css('display', 'block'); - this.enabled = true; - } - } + } - update (delta) { - if (!this.sceneProjection) { - return; - } + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); - let pm = $('#potree_map'); + } - if (!this.enabled) { - return; - } + } - // resize - let mapSize = this.map.getSize(); - let resized = (pm.width() !== mapSize[0] || pm.height() !== mapSize[1]); - if (resized) { - this.map.updateSize(); } - // - let camera = this.viewer.scene.getActiveCamera(); + } - let scale = this.map.getView().getResolution(); - let campos = camera.position; - let camdir = camera.getWorldDirection(new THREE.Vector3()); - let sceneLookAt = camdir.clone().multiplyScalar(30 * scale).add(campos); - let geoPos = camera.position; - let geoLookAt = sceneLookAt; - let mapPos = new THREE.Vector2().fromArray(this.toMap.forward([geoPos.x, geoPos.y])); - let mapLookAt = new THREE.Vector2().fromArray(this.toMap.forward([geoLookAt.x, geoLookAt.y])); - let mapDir = new THREE.Vector2().subVectors(mapLookAt, mapPos).normalize(); + } ); - mapLookAt = mapPos.clone().add(mapDir.clone().multiplyScalar(30 * scale)); - let mapLength = mapPos.distanceTo(mapLookAt); - let mapSide = new THREE.Vector2(-mapDir.y, mapDir.x); + function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) { - let p1 = mapPos.toArray(); - let p2 = mapLookAt.clone().sub(mapSide.clone().multiplyScalar(0.3 * mapLength)).toArray(); - let p3 = mapLookAt.clone().add(mapSide.clone().multiplyScalar(0.3 * mapLength)).toArray(); + let intersect; - this.gCamera.setCoordinates([p1, p2, p3, p1]); - } + if ( material.side === BackSide ) { - get sourcesVisible () { - return this.getSourcesLayer().getVisible(); - } + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); - set sourcesVisible (value) { - this.getSourcesLayer().setVisible(value); } + if ( intersect === null ) return null; + + _intersectionPointWorld.copy( point ); + _intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + const distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: _intersectionPointWorld.clone(), + object: object + }; + } - class CSVExporter { - static toString (points) { - let string = ''; + function checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) { - let attributes = Object.keys(points.data) - .filter(a => a !== 'normal') - .sort((a, b) => { - if (a === 'position') return -1; - if (b === 'position') return 1; - if (a === 'rgba') return -1; - if (b === 'rgba') return 1; - }); + _vA.fromBufferAttribute( position, a ); + _vB.fromBufferAttribute( position, b ); + _vC.fromBufferAttribute( position, c ); - let headerValues = []; - for (let attribute of attributes) { - let itemSize = points.data[attribute].length / points.numPoints; + const morphInfluences = object.morphTargetInfluences; + + if ( material.morphTargets && morphPosition && morphInfluences ) { + + _morphA.set( 0, 0, 0 ); + _morphB.set( 0, 0, 0 ); + _morphC.set( 0, 0, 0 ); + + for ( let i = 0, il = morphPosition.length; i < il; i ++ ) { + + const influence = morphInfluences[ i ]; + const morphAttribute = morphPosition[ i ]; + + if ( influence === 0 ) continue; + + _tempA.fromBufferAttribute( morphAttribute, a ); + _tempB.fromBufferAttribute( morphAttribute, b ); + _tempC.fromBufferAttribute( morphAttribute, c ); + + if ( morphTargetsRelative ) { + + _morphA.addScaledVector( _tempA, influence ); + _morphB.addScaledVector( _tempB, influence ); + _morphC.addScaledVector( _tempC, influence ); - if (attribute === 'position') { - headerValues = headerValues.concat(['x', 'y', 'z']); - } else if (attribute === 'rgba') { - headerValues = headerValues.concat(['r', 'g', 'b', 'a']); - } else if (itemSize > 1) { - for (let i = 0; i < itemSize; i++) { - headerValues.push(`${attribute}_${i}`); - } } else { - headerValues.push(attribute); - } - } - string = headerValues.join(', ') + '\n'; - for (let i = 0; i < points.numPoints; i++) { - let values = []; + _morphA.addScaledVector( _tempA.sub( _vA ), influence ); + _morphB.addScaledVector( _tempB.sub( _vB ), influence ); + _morphC.addScaledVector( _tempC.sub( _vC ), influence ); - for (let attribute of attributes) { - let itemSize = points.data[attribute].length / points.numPoints; - let value = points.data[attribute] - .subarray(itemSize * i, itemSize * i + itemSize) - .join(', '); - values.push(value); } - string += values.join(', ') + '\n'; } - return string; + _vA.add( _morphA ); + _vB.add( _morphB ); + _vC.add( _morphC ); + } - }; - class LASExporter { - static toLAS (points) { - // TODO Unused: let string = ''; + if ( object.isSkinnedMesh ) { + + object.boneTransform( a, _vA ); + object.boneTransform( b, _vB ); + object.boneTransform( c, _vC ); + + } + + const intersection = checkIntersection( object, material, raycaster, ray, _vA, _vB, _vC, _intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + _uvA.fromBufferAttribute( uv, a ); + _uvB.fromBufferAttribute( uv, b ); + _uvC.fromBufferAttribute( uv, c ); + + intersection.uv = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ); - let boundingBox = points.boundingBox; - let offset = boundingBox.min.clone(); - let diagonal = boundingBox.min.distanceTo(boundingBox.max); - let scale = new THREE.Vector3(0.001, 0.001, 0.001); - if (diagonal > 1000 * 1000) { - scale = new THREE.Vector3(0.01, 0.01, 0.01); - } else { - scale = new THREE.Vector3(0.001, 0.001, 0.001); } - let setString = function (string, offset, buffer) { - let view = new Uint8Array(buffer); + if ( uv2 ) { - for (let i = 0; i < string.length; i++) { - let charCode = string.charCodeAt(i); - view[offset + i] = charCode; - } - }; + _uvA.fromBufferAttribute( uv2, a ); + _uvB.fromBufferAttribute( uv2, b ); + _uvC.fromBufferAttribute( uv2, c ); - let buffer = new ArrayBuffer(227 + 28 * points.numPoints); - let view = new DataView(buffer); - let u8View = new Uint8Array(buffer); - // let u16View = new Uint16Array(buffer); + intersection.uv2 = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ); - setString('LASF', 0, buffer); - u8View[24] = 1; - u8View[25] = 2; + } - // system identifier o:26 l:32 + const face = new Face3( a, b, c ); + Triangle.getNormal( _vA, _vB, _vC, face.normal ); - // generating software o:58 l:32 - setString('Potree 1.7', 58, buffer); + intersection.face = face; - // file creation day of year o:90 l:2 - // file creation year o:92 l:2 + } - // header size o:94 l:2 - view.setUint16(94, 227, true); + return intersection; - // offset to point data o:96 l:4 - view.setUint32(96, 227, true); + } - // number of letiable length records o:100 l:4 + class BoxBufferGeometry extends BufferGeometry { - // point data record format 104 1 - u8View[104] = 2; + constructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) { - // point data record length 105 2 - view.setUint16(105, 28, true); + super(); - // number of point records 107 4 - view.setUint32(107, points.numPoints, true); + this.type = 'BoxBufferGeometry'; - // number of points by return 111 20 + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; - // x scale factor 131 8 - view.setFloat64(131, scale.x, true); + const scope = this; - // y scale factor 139 8 - view.setFloat64(139, scale.y, true); + // segments - // z scale factor 147 8 - view.setFloat64(147, scale.z, true); + widthSegments = Math.floor( widthSegments ); + heightSegments = Math.floor( heightSegments ); + depthSegments = Math.floor( depthSegments ); - // x offset 155 8 - view.setFloat64(155, offset.x, true); + // buffers - // y offset 163 8 - view.setFloat64(163, offset.y, true); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; - // z offset 171 8 - view.setFloat64(171, offset.z, true); + // helper variables - // max x 179 8 - view.setFloat64(179, boundingBox.max.x, true); + let numberOfVertices = 0; + let groupStart = 0; - // min x 187 8 - view.setFloat64(187, boundingBox.min.x, true); + // build each side of the box geometry - // max y 195 8 - view.setFloat64(195, boundingBox.max.y, true); + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz - // min y 203 8 - view.setFloat64(203, boundingBox.min.y, true); + // build geometry - // max z 211 8 - view.setFloat64(211, boundingBox.max.z, true); + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); - // min z 219 8 - view.setFloat64(219, boundingBox.min.z, true); + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { - let boffset = 227; - for (let i = 0; i < points.numPoints; i++) { + const segmentWidth = width / gridX; + const segmentHeight = height / gridY; - let px = points.data.position[3 * i + 0]; - let py = points.data.position[3 * i + 1]; - let pz = points.data.position[3 * i + 2]; + const widthHalf = width / 2; + const heightHalf = height / 2; + const depthHalf = depth / 2; - let ux = parseInt((px - offset.x) / scale.x); - let uy = parseInt((py - offset.y) / scale.y); - let uz = parseInt((pz - offset.z) / scale.z); + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; - view.setUint32(boffset + 0, ux, true); - view.setUint32(boffset + 4, uy, true); - view.setUint32(boffset + 8, uz, true); + let vertexCounter = 0; + let groupCount = 0; - if (points.data.intensity) { - view.setUint16(boffset + 12, (points.data.intensity[i]), true); - } + const vector = new Vector3(); - let rt = 0; - if (points.data.returnNumber) { - rt += points.data.returnNumber[i]; - } - if (points.data.numberOfReturns) { - rt += (points.data.numberOfReturns[i] << 3); - } - view.setUint8(boffset + 14, rt); + // generate vertices, normals and uvs - if (points.data.classification) { - view.setUint8(boffset + 15, points.data.classification[i]); - } - // scan angle rank - // user data - // point source id - if (points.data.pointSourceID) { - view.setUint16(boffset + 18, points.data.pointSourceID[i]); - } + for ( let iy = 0; iy < gridY1; iy ++ ) { - if (points.data.rgba) { - let rgba = points.data.rgba; - view.setUint16(boffset + 20, (rgba[4 * i + 0] * 255), true); - view.setUint16(boffset + 22, (rgba[4 * i + 1] * 255), true); - view.setUint16(boffset + 24, (rgba[4 * i + 2] * 255), true); - } + const y = iy * segmentHeight - heightHalf; - boffset += 28; - } + for ( let ix = 0; ix < gridX1; ix ++ ) { - return buffer; - } - - } + const x = ix * segmentWidth - widthHalf; - function copyMaterial(source, target){ + // set values to correct vector component - for(let name of Object.keys(target.uniforms)){ - target.uniforms[name].value = source.uniforms[name].value; - } + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; - target.gradientTexture = source.gradientTexture; - target.visibleNodesTexture = source.visibleNodesTexture; - target.classificationTexture = source.classificationTexture; - target.matcapTexture = source.matcapTexture; + // now apply vector to vertex buffer - target.activeAttributeName = source.activeAttributeName; - target.ranges = source.ranges; + vertices.push( vector.x, vector.y, vector.z ); - //target.updateShaderSource(); - } + // set values to correct vector component + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; - class Batch{ + // now apply vector to normal buffer - constructor(geometry, material){ - this.geometry = geometry; - this.material = material; + normals.push( vector.x, vector.y, vector.z ); - this.sceneNode = new THREE.Points(geometry, material); + // uvs - this.geometryNode = { - estimatedSpacing: 1.0, - geometry: geometry, - }; - } + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); - getLevel(){ - return 0; - } + // counters - } + vertexCounter += 1; - class ProfileFakeOctree extends PointCloudTree{ + } - constructor(octree){ - super(); + } - this.trueOctree = octree; - this.pcoGeometry = octree.pcoGeometry; - this.points = []; - this.visibleNodes = []; - - //this.material = this.trueOctree.material; - this.material = new PointCloudMaterial(); - //this.material.copy(this.trueOctree.material); - copyMaterial(this.trueOctree.material, this.material); - this.material.pointSizeType = PointSizeType.FIXED; + // indices - this.batchSize = 100 * 1000; - this.currentBatch = null; - } + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment - getAttribute(name){ - return this.trueOctree.getAttribute(name); - } + for ( let iy = 0; iy < gridY; iy ++ ) { - dispose(){ - for(let node of this.visibleNodes){ - node.geometry.dispose(); - } + for ( let ix = 0; ix < gridX; ix ++ ) { - this.visibleNodes = []; - this.currentBatch = null; - this.points = []; - } + const a = numberOfVertices + ix + gridX1 * iy; + const b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + const c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + const d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; - addPoints(data){ - // since each call to addPoints can deliver very very few points, - // we're going to batch them into larger buffers for efficiency. + // faces - if(this.currentBatch === null){ - this.currentBatch = this.createNewBatch(data); - } + indices.push( a, b, d ); + indices.push( b, c, d ); - this.points.push(data); + // increase counter + groupCount += 6; - let updateRange = { - start: this.currentBatch.geometry.drawRange.count, - count: 0 - }; - let projectedBox = new THREE.Box3(); + } - let truePos = new THREE.Vector3(); + } - for(let i = 0; i < data.numPoints; i++){ + // add a group to the geometry. this will ensure multi material support - if(updateRange.start + updateRange.count >= this.batchSize){ - // current batch full, start new batch + scope.addGroup( groupStart, groupCount, materialIndex ); - for(let key of Object.keys(this.currentBatch.geometry.attributes)){ - let attribute = this.currentBatch.geometry.attributes[key]; - attribute.updateRange.offset = updateRange.start; - attribute.updateRange.count = updateRange.count; - attribute.needsUpdate = true; - } + // calculate new start value for groups - this.currentBatch.geometry.computeBoundingBox(); - this.currentBatch.geometry.computeBoundingSphere(); + groupStart += groupCount; - this.currentBatch = this.createNewBatch(); - updateRange = { - start: 0, - count: 0 - }; - } + // update total number of vertices - truePos.set( - data.data.position[3 * i + 0] + this.trueOctree.position.x, - data.data.position[3 * i + 1] + this.trueOctree.position.y, - data.data.position[3 * i + 2] + this.trueOctree.position.z, - ); + numberOfVertices += vertexCounter; - let x = data.data.mileage[i]; - let y = 0; - let z = truePos.z; + } - projectedBox.expandByPoint(new THREE.Vector3(x, y, z)); + } - let index = updateRange.start + updateRange.count; - let geometry = this.currentBatch.geometry; + } - for(let attributeName of Object.keys(data.data)){ - let source = data.data[attributeName]; - let target = geometry.attributes[attributeName]; - let numElements = target.itemSize; - - for(let item = 0; item < numElements; item++){ - target.array[numElements * index + item] = source[numElements * i + item]; - } - } + /** + * Uniform Utilities + */ - { - let position = geometry.attributes.position; + function cloneUniforms( src ) { - position.array[3 * index + 0] = x; - position.array[3 * index + 1] = y; - position.array[3 * index + 2] = z; - } + const dst = {}; - updateRange.count++; - this.currentBatch.geometry.drawRange.count++; - } + for ( const u in src ) { - for(let key of Object.keys(this.currentBatch.geometry.attributes)){ - let attribute = this.currentBatch.geometry.attributes[key]; - attribute.updateRange.offset = updateRange.start; - attribute.updateRange.count = updateRange.count; - attribute.needsUpdate = true; - } + dst[ u ] = {}; - data.projectedBox = projectedBox; + for ( const p in src[ u ] ) { - this.projectedBox = this.points.reduce( (a, i) => a.union(i.projectedBox), new THREE.Box3()); - } + const property = src[ u ][ p ]; - createNewBatch(data){ - let geometry = new THREE.BufferGeometry(); + if ( property && ( property.isColor || + property.isMatrix3 || property.isMatrix4 || + property.isVector2 || property.isVector3 || property.isVector4 || + property.isTexture ) ) { - // create new batches with batch_size elements of the same type as the attribute - for(let attributeName of Object.keys(data.data)){ - let buffer = data.data[attributeName]; - let numElements = buffer.length / data.numPoints; // 3 for pos, 4 for col, 1 for scalars - let constructor = buffer.constructor; - let normalized = false; - - if(this.trueOctree.root.sceneNode){ - if(this.trueOctree.root.sceneNode.geometry.attributes[attributeName]){ - normalized = this.trueOctree.root.sceneNode.geometry.attributes[attributeName].normalized; - } - } - + dst[ u ][ p ] = property.clone(); - let batchBuffer = new constructor(numElements * this.batchSize); + } else if ( Array.isArray( property ) ) { - let bufferAttribute = new THREE.BufferAttribute(batchBuffer, numElements, normalized); - bufferAttribute.potree = { - range: [0, 1], - }; + dst[ u ][ p ] = property.slice(); - geometry.addAttribute(attributeName, bufferAttribute); - } + } else { - geometry.drawRange.start = 0; - geometry.drawRange.count = 0; + dst[ u ][ p ] = property; - let batch = new Batch(geometry, this.material); + } - this.visibleNodes.push(batch); + } - return batch; } - - computeVisibilityTextureData(){ - let data = new Uint8Array(this.visibleNodes.length * 4); - let offsets = new Map(); - for(let i = 0; i < this.visibleNodes.length; i++){ - let node = this.visibleNodes[i]; + return dst; - offsets[node] = i; - } + } + function mergeUniforms( uniforms ) { + + const merged = {}; + + for ( let u = 0; u < uniforms.length; u ++ ) { + + const tmp = cloneUniforms( uniforms[ u ] ); + + for ( const p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } - return { - data: data, - offsets: offsets, - }; } + return merged; + } - class ProfileWindow extends EventDispatcher { - constructor (viewer) { - super(); + // Legacy - this.viewer = viewer; - this.elRoot = $('#profile_window'); - this.renderArea = this.elRoot.find('#profileCanvasContainer'); - this.svg = d3.select('svg#profileSVG'); - this.mouseIsDown = false; + const UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms }; - this.projectedBox = new THREE.Box3(); - this.pointclouds = new Map(); - this.numPoints = 0; - this.lastAddPointsTimestamp = undefined; + var default_vertex = "void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"; - this.mouse = new THREE.Vector2(0, 0); - this.scale = new THREE.Vector3(1, 1, 1); + var default_fragment = "void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}"; - this.autoFitEnabled = true; // completely disable/enable - this.autoFit = false; // internal + /** + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ - let cwIcon = `${exports.resourcePath}/icons/arrow_cw.svg`; - $('#potree_profile_rotate_cw').attr('src', cwIcon); + function ShaderMaterial( parameters ) { - let ccwIcon = `${exports.resourcePath}/icons/arrow_ccw.svg`; - $('#potree_profile_rotate_ccw').attr('src', ccwIcon); - - let forwardIcon = `${exports.resourcePath}/icons/arrow_up.svg`; - $('#potree_profile_move_forward').attr('src', forwardIcon); + Material.call( this ); - let backwardIcon = `${exports.resourcePath}/icons/arrow_down.svg`; - $('#potree_profile_move_backward').attr('src', backwardIcon); + this.type = 'ShaderMaterial'; - let csvIcon = `${exports.resourcePath}/icons/file_csv_2d.svg`; - $('#potree_download_csv_icon').attr('src', csvIcon); + this.defines = {}; + this.uniforms = {}; - let lasIcon = `${exports.resourcePath}/icons/file_las_3d.svg`; - $('#potree_download_las_icon').attr('src', lasIcon); + this.vertexShader = default_vertex; + this.fragmentShader = default_fragment; - let closeIcon = `${exports.resourcePath}/icons/close.svg`; - $('#closeProfileContainer').attr("src", closeIcon); + this.linewidth = 1; - this.initTHREE(); - this.initSVG(); - this.initListeners(); + this.wireframe = false; + this.wireframeLinewidth = 1; - this.pRenderer = new Renderer(this.renderer); + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes - this.elRoot.i18n(); - } + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals - initListeners () { - $(window).resize(() => { - if (this.enabled) { - this.render(); - } - }); + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; - this.renderArea.mousedown(e => { - this.mouseIsDown = true; - }); + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; - this.renderArea.mouseup(e => { - this.mouseIsDown = false; - }); + this.index0AttributeName = undefined; + this.uniformsNeedUpdate = false; - let viewerPickSphereSizeHandler = () => { - let camera = this.viewer.scene.getActiveCamera(); - let domElement = this.viewer.renderer.domElement; - let distance = this.viewerPickSphere.position.distanceTo(camera.position); - let pr = Utils.projectedRadius(1, camera, distance, domElement.clientWidth, domElement.clientHeight); - let scale = (10 / pr); - this.viewerPickSphere.scale.set(scale, scale, scale); - }; + this.glslVersion = null; - this.renderArea.mousemove(e => { - if (this.pointclouds.size === 0) { - return; - } + if ( parameters !== undefined ) { - let rect = this.renderArea[0].getBoundingClientRect(); - let x = e.clientX - rect.left; - let y = e.clientY - rect.top; + if ( parameters.attributes !== undefined ) { - let newMouse = new THREE.Vector2(x, y); + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); - if (this.mouseIsDown) { - // DRAG - this.autoFit = false; - this.lastDrag = new Date().getTime(); + } - let cPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)]; - let ncPos = [this.scaleX.invert(newMouse.x), this.scaleY.invert(newMouse.y)]; + this.setValues( parameters ); - this.camera.position.x -= ncPos[0] - cPos[0]; - this.camera.position.z -= ncPos[1] - cPos[1]; + } - this.render(); - } else if (this.pointclouds.size > 0) { - // FIND HOVERED POINT - let radius = Math.abs(this.scaleX.invert(0) - this.scaleX.invert(40)); - let mileage = this.scaleX.invert(newMouse.x); - let elevation = this.scaleY.invert(newMouse.y); + } - let closest = this.selectPoint(mileage, elevation, radius); + ShaderMaterial.prototype = Object.create( Material.prototype ); + ShaderMaterial.prototype.constructor = ShaderMaterial; - if (closest) { - let point = closest.point; + ShaderMaterial.prototype.isShaderMaterial = true; - let position = new Float64Array([ - point.position[0] + closest.pointcloud.position.x, - point.position[1] + closest.pointcloud.position.y, - point.position[2] + closest.pointcloud.position.z - ]); + ShaderMaterial.prototype.copy = function ( source ) { - this.elRoot.find('#profileSelectionProperties').fadeIn(200); - this.pickSphere.visible = true; - this.pickSphere.scale.set(0.5 * radius, 0.5 * radius, 0.5 * radius); - this.pickSphere.position.set(point.mileage, 0, position[2]); + Material.prototype.copy.call( this, source ); - this.viewerPickSphere.position.set(...position); - - if(!this.viewer.scene.scene.children.includes(this.viewerPickSphere)){ - this.viewer.scene.scene.add(this.viewerPickSphere); - if(!this.viewer.hasEventListener("update", viewerPickSphereSizeHandler)){ - this.viewer.addEventListener("update", viewerPickSphereSizeHandler); - } - } - + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; - let info = this.elRoot.find('#profileSelectionProperties'); - let html = ''; + this.uniforms = cloneUniforms( source.uniforms ); - for (let attributeName of Object.keys(point)) { + this.defines = Object.assign( {}, source.defines ); - let value = point[attributeName]; - let attribute = closest.pointcloud.getAttribute(attributeName); + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; - let transform = value => value; - if(attribute && attribute.type.size > 4){ - let range = attribute.initialRange; - let scale = 1 / (range[1] - range[0]); - let offset = range[0]; - transform = value => value / scale + offset; - } + this.lights = source.lights; + this.clipping = source.clipping; - + this.skinning = source.skinning; - + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; - if (attributeName === 'position') { - let values = [...position].map(v => Utils.addCommas(v.toFixed(3))); - html += ` - - - - - - - - - - - - `; - } else if (attributeName === 'rgba') { - html += ` - - - - `; - } else if (attributeName === 'normal') { - continue; - } else if (attributeName === 'mileage') { - html += ` - - - - `; - } else { - html += ` - - - - `; - } - } - html += '
x${values[0]}
y${values[1]}
z${values[2]}
${attributeName}${value.join(', ')}
${attributeName}${value.toFixed(3)}
${attributeName}${transform(value)}
'; - info.html(html); + this.extensions = Object.assign( {}, source.extensions ); - this.selectedPoint = point; - } else { - // this.pickSphere.visible = false; - // this.selectedPoint = null; + this.glslVersion = source.glslVersion; - this.viewer.scene.scene.add(this.viewerPickSphere); + return this; - let index = this.viewer.scene.scene.children.indexOf(this.viewerPickSphere); - if(index >= 0){ - this.viewer.scene.scene.children.splice(index, 1); - } - this.viewer.removeEventListener("update", viewerPickSphereSizeHandler); - + }; - } - this.render(); - } + ShaderMaterial.prototype.toJSON = function ( meta ) { - this.mouse.copy(newMouse); - }); + const data = Material.prototype.toJSON.call( this, meta ); - let onWheel = e => { - this.autoFit = false; + data.glslVersion = this.glslVersion; + data.uniforms = {}; - let delta = 0; - if (e.wheelDelta !== undefined) { // WebKit / Opera / Explorer 9 - delta = e.wheelDelta; - } else if (e.detail !== undefined) { // Firefox - delta = -e.detail; - } + for ( const name in this.uniforms ) { - let ndelta = Math.sign(delta); + const uniform = this.uniforms[ name ]; + const value = uniform.value; - let cPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)]; + if ( value && value.isTexture ) { - if (ndelta > 0) { - // + 10% - this.scale.multiplyScalar(1.1); - } else { - // - 10% - this.scale.multiplyScalar(100 / 110); - } + data.uniforms[ name ] = { + type: 't', + value: value.toJSON( meta ).uuid + }; - this.updateScales(); - let ncPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)]; + } else if ( value && value.isColor ) { - this.camera.position.x -= ncPos[0] - cPos[0]; - this.camera.position.z -= ncPos[1] - cPos[1]; + data.uniforms[ name ] = { + type: 'c', + value: value.getHex() + }; - this.render(); - this.updateScales(); - }; - $(this.renderArea)[0].addEventListener('mousewheel', onWheel, false); - $(this.renderArea)[0].addEventListener('DOMMouseScroll', onWheel, false); // Firefox + } else if ( value && value.isVector2 ) { - $('#closeProfileContainer').click(() => { - this.hide(); - }); + data.uniforms[ name ] = { + type: 'v2', + value: value.toArray() + }; - let getProfilePoints = () => { - let points = new Points(); - - for(let [pointcloud, entry] of this.pointclouds){ - for(let pointSet of entry.points){ + } else if ( value && value.isVector3 ) { - let originPos = pointSet.data.position; - let trueElevationPosition = new Float32Array(originPos); - for(let i = 0; i < pointSet.numPoints; i++){ - trueElevationPosition[3 * i + 2] += pointcloud.position.z; - } + data.uniforms[ name ] = { + type: 'v3', + value: value.toArray() + }; - pointSet.data.position = trueElevationPosition; - points.add(pointSet); - pointSet.data.position = originPos; - } - } + } else if ( value && value.isVector4 ) { - return points; - }; + data.uniforms[ name ] = { + type: 'v4', + value: value.toArray() + }; - $('#potree_download_csv_icon').click(() => { - - let points = getProfilePoints(); + } else if ( value && value.isMatrix3 ) { - let string = CSVExporter.toString(points); + data.uniforms[ name ] = { + type: 'm3', + value: value.toArray() + }; - let blob = new Blob([string], {type: "text/string"}); - $('#potree_download_profile_ortho_link').attr('href', URL.createObjectURL(blob)); - }); + } else if ( value && value.isMatrix4 ) { - $('#potree_download_las_icon').click(() => { + data.uniforms[ name ] = { + type: 'm4', + value: value.toArray() + }; - let points = getProfilePoints(); + } else { - let buffer = LASExporter.toLAS(points); + data.uniforms[ name ] = { + value: value + }; + + // note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far + + } - let blob = new Blob([buffer], {type: "application/octet-binary"}); - $('#potree_download_profile_link').attr('href', URL.createObjectURL(blob)); - }); } - selectPoint (mileage, elevation, radius) { - let closest = { - distance: Infinity, - pointcloud: null, - points: null, - index: null - }; + if ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines; - let pointBox = new THREE.Box2( - new THREE.Vector2(mileage - radius, elevation - radius), - new THREE.Vector2(mileage + radius, elevation + radius)); + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; - let numTested = 0; - let numSkipped = 0; - let numTestedPoints = 0; - let numSkippedPoints = 0; + const extensions = {}; - for (let [pointcloud, entry] of this.pointclouds) { - for(let points of entry.points){ + for ( const key in this.extensions ) { - let collisionBox = new THREE.Box2( - new THREE.Vector2(points.projectedBox.min.x, points.projectedBox.min.z), - new THREE.Vector2(points.projectedBox.max.x, points.projectedBox.max.z) - ); + if ( this.extensions[ key ] === true ) extensions[ key ] = true; - let intersects = collisionBox.intersectsBox(pointBox); + } - if(!intersects){ - numSkipped++; - numSkippedPoints += points.numPoints; - continue; - } + if ( Object.keys( extensions ).length > 0 ) data.extensions = extensions; - numTested++; - numTestedPoints += points.numPoints; + return data; - for (let i = 0; i < points.numPoints; i++) { + }; - let m = points.data.mileage[i] - mileage; - let e = points.data.position[3 * i + 2] - elevation + pointcloud.position.z; - let r = Math.sqrt(m * m + e * e); + function Camera() { - const withinDistance = r < radius && r < closest.distance; - let unfilteredClass = true; + Object3D.call( this ); - if(points.data.classification){ - const classification = pointcloud.material.classification; + this.type = 'Camera'; - const pointClassID = points.data.classification[i]; - const pointClassValue = classification[pointClassID]; + this.matrixWorldInverse = new Matrix4(); - if(pointClassValue && (!pointClassValue.visible || pointClassValue.color.w === 0)){ - unfilteredClass = false; - } - } + this.projectionMatrix = new Matrix4(); + this.projectionMatrixInverse = new Matrix4(); - if (withinDistance && unfilteredClass) { - closest = { - distance: r, - pointcloud: pointcloud, - points: points, - index: i - }; - } - } - } - } + } + Camera.prototype = Object.assign( Object.create( Object3D.prototype ), { - //console.log(`nodes: ${numTested}, ${numSkipped} || points: ${numTestedPoints}, ${numSkippedPoints}`); + constructor: Camera, - if (closest.distance < Infinity) { - let points = closest.points; + isCamera: true, - let point = {}; + copy: function ( source, recursive ) { - let attributes = Object.keys(points.data); - for (let attribute of attributes) { - let attributeData = points.data[attribute]; - let itemSize = attributeData.length / points.numPoints; - let value = attributeData.subarray(itemSize * closest.index, itemSize * closest.index + itemSize); + Object3D.prototype.copy.call( this, source, recursive ); - if (value.length === 1) { - point[attribute] = value[0]; - } else { - point[attribute] = value; - } - } + this.matrixWorldInverse.copy( source.matrixWorldInverse ); - closest.point = point; + this.projectionMatrix.copy( source.projectionMatrix ); + this.projectionMatrixInverse.copy( source.projectionMatrixInverse ); - return closest; - } else { - return null; - } - } - - initTHREE () { - this.renderer = new THREE.WebGLRenderer({alpha: true, premultipliedAlpha: false}); - this.renderer.setClearColor(0x000000, 0); - this.renderer.setSize(10, 10); - this.renderer.autoClear = false; - this.renderArea.append($(this.renderer.domElement)); - this.renderer.domElement.tabIndex = '2222'; - $(this.renderer.domElement).css('width', '100%'); - $(this.renderer.domElement).css('height', '100%'); + return this; + }, - { - let gl = this.renderer.getContext(); + getWorldDirection: function ( target ) { - let extVAO = gl.getExtension('OES_vertex_array_object'); + if ( target === undefined ) { - if(!extVAO){ - throw new Error("OES_vertex_array_object extension not supported"); - } + console.warn( 'THREE.Camera: .getWorldDirection() target is now required' ); + target = new Vector3(); - gl.createVertexArray = extVAO.createVertexArrayOES.bind(extVAO); - gl.bindVertexArray = extVAO.bindVertexArrayOES.bind(extVAO); } - this.camera = new THREE.OrthographicCamera(-1000, 1000, 1000, -1000, -1000, 1000); - this.camera.up.set(0, 0, 1); - this.camera.rotation.order = "ZXY"; - this.camera.rotation.x = Math.PI / 2.0; - + this.updateWorldMatrix( true, false ); - this.scene = new THREE.Scene(); - this.profileScene = new THREE.Scene(); + const e = this.matrixWorld.elements; - let sg = new THREE.SphereGeometry(1, 16, 16); - let sm = new THREE.MeshNormalMaterial(); - this.pickSphere = new THREE.Mesh(sg, sm); - this.scene.add(this.pickSphere); + return target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize(); - { - const sg = new THREE.SphereGeometry(2); - const sm = new THREE.MeshNormalMaterial(); - const s = new THREE.Mesh(sg, sm); + }, - s.position.set(589530.450, 231398.860, 769.735); + updateMatrixWorld: function ( force ) { - this.scene.add(s); - } + Object3D.prototype.updateMatrixWorld.call( this, force ); - this.viewerPickSphere = new THREE.Mesh(sg, sm); - } + this.matrixWorldInverse.copy( this.matrixWorld ).invert(); - initSVG () { - let width = this.renderArea[0].clientWidth; - let height = this.renderArea[0].clientHeight; - let marginLeft = this.renderArea[0].offsetLeft; + }, - this.svg.selectAll('*').remove(); + updateWorldMatrix: function ( updateParents, updateChildren ) { - this.scaleX = d3.scale.linear() - .domain([this.camera.left + this.camera.position.x, this.camera.right + this.camera.position.x]) - .range([0, width]); - this.scaleY = d3.scale.linear() - .domain([this.camera.bottom + this.camera.position.z, this.camera.top + this.camera.position.z]) - .range([height, 0]); + Object3D.prototype.updateWorldMatrix.call( this, updateParents, updateChildren ); - this.xAxis = d3.svg.axis() - .scale(this.scaleX) - .orient('bottom') - .innerTickSize(-height) - .outerTickSize(1) - .tickPadding(10) - .ticks(width / 50); + this.matrixWorldInverse.copy( this.matrixWorld ).invert(); - this.yAxis = d3.svg.axis() - .scale(this.scaleY) - .orient('left') - .innerTickSize(-width) - .outerTickSize(1) - .tickPadding(10) - .ticks(height / 20); + }, - this.elXAxis = this.svg.append('g') - .attr('class', 'x axis') - .attr('transform', `translate(${marginLeft}, ${height})`) - .call(this.xAxis); + clone: function () { + + return new this.constructor().copy( this ); - this.elYAxis = this.svg.append('g') - .attr('class', 'y axis') - .attr('transform', `translate(${marginLeft}, 0)`) - .call(this.yAxis); } - addPoints (pointcloud, points) { + } ); - if(points.numPoints === 0){ - return; - } + function PerspectiveCamera( fov = 50, aspect = 1, near = 0.1, far = 2000 ) { - let entry = this.pointclouds.get(pointcloud); - if(!entry){ - entry = new ProfileFakeOctree(pointcloud); - this.pointclouds.set(pointcloud, entry); - this.profileScene.add(entry); + Camera.call( this ); - let materialChanged = () => { - this.render(); - }; + this.type = 'PerspectiveCamera'; - materialChanged(); + this.fov = fov; + this.zoom = 1; - pointcloud.material.addEventListener('material_property_changed', materialChanged); - this.addEventListener("on_reset_once", () => { - pointcloud.material.removeEventListener('material_property_changed', materialChanged); - }); - } + this.near = near; + this.far = far; + this.focus = 10; - entry.addPoints(points); - this.projectedBox.union(entry.projectedBox); + this.aspect = aspect; + this.view = null; - if (this.autoFit && this.autoFitEnabled) { - let width = this.renderArea[0].clientWidth; - let height = this.renderArea[0].clientHeight; + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) - let size = this.projectedBox.getSize(new THREE.Vector3()); + this.updateProjectionMatrix(); - let sx = width / size.x; - let sy = height / size.z; - let scale = Math.min(sx, sy); + } - let center = this.projectedBox.getCenter(new THREE.Vector3()); - this.scale.set(scale, scale, 1); - this.camera.position.copy(center); + PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { - //console.log("camera: ", this.camera.position.toArray().join(", ")); - } + constructor: PerspectiveCamera, - //console.log(entry); + isPerspectiveCamera: true, - this.render(); + copy: function ( source, recursive ) { - let numPoints = 0; - for (let [key, value] of this.pointclouds.entries()) { - numPoints += value.points.reduce( (a, i) => a + i.numPoints, 0); - } - $(`#profile_num_points`).html(Utils.addCommas(numPoints)); + Camera.prototype.copy.call( this, source, recursive ); - } + this.fov = source.fov; + this.zoom = source.zoom; - reset () { - this.lastReset = new Date().getTime(); + this.near = source.near; + this.far = source.far; + this.focus = source.focus; - this.dispatchEvent({type: "on_reset_once"}); - this.removeEventListeners("on_reset_once"); + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); - this.autoFit = true; - this.projectedBox = new THREE.Box3(); + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; - for(let [key, entry] of this.pointclouds){ - entry.dispose(); - } + return this; - this.pointclouds.clear(); - this.mouseIsDown = false; - this.mouse.set(0, 0); + }, - if(this.autoFitEnabled){ - this.scale.set(1, 1, 1); - } - this.pickSphere.visible = false; + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { - this.elRoot.find('#profileSelectionProperties').hide(); + // see http://www.bobatkins.com/photography/technical/field_of_view.html + const vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; - this.render(); - } + this.fov = MathUtils.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); - show () { - this.elRoot.fadeIn(); - this.enabled = true; - } + }, - hide () { - this.elRoot.fadeOut(); - this.enabled = false; - } + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { - updateScales () { + const vExtentSlope = Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ); - let width = this.renderArea[0].clientWidth; - let height = this.renderArea[0].clientHeight; + return 0.5 * this.getFilmHeight() / vExtentSlope; - let left = (-width / 2) / this.scale.x; - let right = (+width / 2) / this.scale.x; - let top = (+height / 2) / this.scale.y; - let bottom = (-height / 2) / this.scale.y; + }, - this.camera.left = left; - this.camera.right = right; - this.camera.top = top; - this.camera.bottom = bottom; - this.camera.updateProjectionMatrix(); + getEffectiveFOV: function () { - this.scaleX.domain([this.camera.left + this.camera.position.x, this.camera.right + this.camera.position.x]) - .range([0, width]); - this.scaleY.domain([this.camera.bottom + this.camera.position.z, this.camera.top + this.camera.position.z]) - .range([height, 0]); + return MathUtils.RAD2DEG * 2 * Math.atan( + Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom ); - let marginLeft = this.renderArea[0].offsetLeft; + }, - this.xAxis.scale(this.scaleX) - .orient('bottom') - .innerTickSize(-height) - .outerTickSize(1) - .tickPadding(10) - .ticks(width / 50); - this.yAxis.scale(this.scaleY) - .orient('left') - .innerTickSize(-width) - .outerTickSize(1) - .tickPadding(10) - .ticks(height / 20); + getFilmWidth: function () { + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); - this.elXAxis - .attr('transform', `translate(${marginLeft}, ${height})`) - .call(this.xAxis); - this.elYAxis - .attr('transform', `translate(${marginLeft}, 0)`) - .call(this.yAxis); - } + }, - requestScaleUpdate(){ + getFilmHeight: function () { - let threshold = 100; - let allowUpdate = ((this.lastReset === undefined) || (this.lastScaleUpdate === undefined)) - || ((new Date().getTime() - this.lastReset) > threshold && (new Date().getTime() - this.lastScaleUpdate) > threshold); + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); - if(allowUpdate){ + }, - this.updateScales(); + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * const w = 1920; + * const h = 1080; + * const fullWidth = w * 3; + * const fullHeight = h * 2; + * + * --A-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { - this.lastScaleUpdate = new Date().getTime(); + this.aspect = fullWidth / fullHeight; - + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; - this.scaleUpdatePending = false; - }else if(!this.scaleUpdatePending) { - setTimeout(this.requestScaleUpdate.bind(this), 100); - this.scaleUpdatePending = true; } - - } - render () { - let width = this.renderArea[0].clientWidth; - let height = this.renderArea[0].clientHeight; + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; - let {renderer, pRenderer, camera, profileScene, scene} = this; - let {scaleX, pickSphere} = this; + this.updateProjectionMatrix(); - renderer.setSize(width, height); + }, - renderer.setClearColor(0x000000, 0); - renderer.clear(true, true, false); + clearViewOffset: function () { - for(let pointcloud of this.pointclouds.keys()){ - let source = pointcloud.material; - let target = this.pointclouds.get(pointcloud).material; - - copyMaterial(source, target); - target.size = 2; - } - - pRenderer.render(profileScene, camera, null); + if ( this.view !== null ) { - let radius = Math.abs(scaleX.invert(0) - scaleX.invert(5)); + this.view.enabled = false; - if (radius === 0) { - pickSphere.visible = false; - } else { - pickSphere.scale.set(radius, radius, radius); - pickSphere.visible = true; } - - renderer.render(scene, camera); - this.requestScaleUpdate(); - } - }; + this.updateProjectionMatrix(); - class ProfileWindowController { - constructor (viewer) { - this.viewer = viewer; - this.profileWindow = viewer.profileWindow; - this.profile = null; - this.numPoints = 0; - this.threshold = 60 * 1000; - this.rotateAmount = 10; + }, - this.scheduledRecomputeTime = null; + updateProjectionMatrix: function () { - this.enabled = true; + const near = this.near; + let top = near * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom; + let height = 2 * top; + let width = this.aspect * height; + let left = - 0.5 * width; + const view = this.view; - this.requests = []; + if ( this.view !== null && this.view.enabled ) { - this._recompute = () => { this.recompute(); }; + const fullWidth = view.fullWidth, + fullHeight = view.fullHeight; - this.viewer.addEventListener("scene_changed", e => { - e.oldScene.removeEventListener("pointcloud_added", this._recompute); - e.scene.addEventListener("pointcloud_added", this._recompute); - }); - this.viewer.scene.addEventListener("pointcloud_added", this._recompute); + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; - $("#potree_profile_rotate_amount").val(parseInt(this.rotateAmount)); - $("#potree_profile_rotate_amount").on("input", (e) => { - const str = $("#potree_profile_rotate_amount").val(); + } - if(!isNaN(str)){ - const value = parseFloat(str); - this.rotateAmount = value; - $("#potree_profile_rotate_amount").css("background-color", ""); - }else { - $("#potree_profile_rotate_amount").css("background-color", "#ff9999"); - } + const skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); - }); + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); - const rotate = (radians) => { - const profile = this.profile; - const points = profile.points; - const start = points[0]; - const end = points[points.length - 1]; - const center = start.clone().add(end).multiplyScalar(0.5); + this.projectionMatrixInverse.copy( this.projectionMatrix ).invert(); - const mMoveOrigin = new THREE.Matrix4().makeTranslation(-center.x, -center.y, -center.z); - const mRotate = new THREE.Matrix4().makeRotationZ(radians); - const mMoveBack = new THREE.Matrix4().makeTranslation(center.x, center.y, center.z); - //const transform = mMoveOrigin.multiply(mRotate).multiply(mMoveBack); - const transform = mMoveBack.multiply(mRotate).multiply(mMoveOrigin); + }, - const rotatedPoints = points.map( point => point.clone().applyMatrix4(transform) ); + toJSON: function ( meta ) { - this.profileWindow.autoFitEnabled = false; + const data = Object3D.prototype.toJSON.call( this, meta ); - for(let i = 0; i < points.length; i++){ - profile.setPosition(i, rotatedPoints[i]); - } - }; + data.object.fov = this.fov; + data.object.zoom = this.zoom; - $("#potree_profile_rotate_cw").click( () => { - const radians = THREE.Math.degToRad(this.rotateAmount); - rotate(-radians); - }); + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; - $("#potree_profile_rotate_ccw").click( () => { - const radians = THREE.Math.degToRad(this.rotateAmount); - rotate(radians); - }); + data.object.aspect = this.aspect; - $("#potree_profile_move_forward").click( () => { - const profile = this.profile; - const points = profile.points; - const start = points[0]; - const end = points[points.length - 1]; + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); - const dir = end.clone().sub(start).normalize(); - const up = new THREE.Vector3(0, 0, 1); - const forward = up.cross(dir); - const move = forward.clone().multiplyScalar(profile.width / 2); + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; - this.profileWindow.autoFitEnabled = false; + return data; - for(let i = 0; i < points.length; i++){ - profile.setPosition(i, points[i].clone().add(move)); - } - }); + } - $("#potree_profile_move_backward").click( () => { - const profile = this.profile; - const points = profile.points; - const start = points[0]; - const end = points[points.length - 1]; + } ); - const dir = end.clone().sub(start).normalize(); - const up = new THREE.Vector3(0, 0, 1); - const forward = up.cross(dir); - const move = forward.clone().multiplyScalar(-profile.width / 2); + const fov = 90, aspect = 1; - this.profileWindow.autoFitEnabled = false; + function CubeCamera( near, far, renderTarget ) { - for(let i = 0; i < points.length; i++){ - profile.setPosition(i, points[i].clone().add(move)); - } - }); - } + Object3D.call( this ); - setProfile (profile) { - if (this.profile !== null && this.profile !== profile) { - this.profile.removeEventListener('marker_moved', this._recompute); - this.profile.removeEventListener('marker_added', this._recompute); - this.profile.removeEventListener('marker_removed', this._recompute); - this.profile.removeEventListener('width_changed', this._recompute); - } + this.type = 'CubeCamera'; - this.profile = profile; + if ( renderTarget.isWebGLCubeRenderTarget !== true ) { - { - this.profile.addEventListener('marker_moved', this._recompute); - this.profile.addEventListener('marker_added', this._recompute); - this.profile.addEventListener('marker_removed', this._recompute); - this.profile.addEventListener('width_changed', this._recompute); - } + console.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' ); + return; - this.recompute(); } - reset () { - this.profileWindow.reset(); + this.renderTarget = renderTarget; - this.numPoints = 0; + const cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.layers = this.layers; + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); - if (this.profile) { - for (let request of this.requests) { - request.cancel(); - } - } - } + const cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.layers = this.layers; + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); - progressHandler (pointcloud, progress) { - for (let segment of progress.segments) { - this.profileWindow.addPoints(pointcloud, segment.points); - this.numPoints += segment.points.numPoints; - } - } + const cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.layers = this.layers; + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); - cancel () { - for (let request of this.requests) { - request.cancel(); - // request.finishLevelThenCancel(); - } + const cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.layers = this.layers; + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); - this.requests = []; - }; + const cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.layers = this.layers; + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); - finishLevelThenCancel(){ - for (let request of this.requests) { - request.finishLevelThenCancel(); - } + const cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.layers = this.layers; + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); - this.requests = []; - } + this.update = function ( renderer, scene ) { - recompute () { - if (!this.profile) { - return; - } + if ( this.parent === null ) this.updateMatrixWorld(); - if (this.scheduledRecomputeTime !== null && this.scheduledRecomputeTime > new Date().getTime()) { - return; - } else { - this.scheduledRecomputeTime = new Date().getTime() + 100; - } - this.scheduledRecomputeTime = null; + const currentXrEnabled = renderer.xr.enabled; + const currentRenderTarget = renderer.getRenderTarget(); - this.reset(); + renderer.xr.enabled = false; - for (let pointcloud of this.viewer.scene.pointclouds.filter(p => p.visible)) { - let request = pointcloud.getPointsInProfile(this.profile, null, { - 'onProgress': (event) => { - if (!this.enabled) { - return; - } + const generateMipmaps = renderTarget.texture.generateMipmaps; - this.progressHandler(pointcloud, event.points); + renderTarget.texture.generateMipmaps = false; - if (this.numPoints > this.threshold) { - this.finishLevelThenCancel(); - } - }, - 'onFinish': (event) => { - if (!this.enabled) { + renderer.setRenderTarget( renderTarget, 0 ); + renderer.render( scene, cameraPX ); - } - }, - 'onCancel': () => { - if (!this.enabled) { + renderer.setRenderTarget( renderTarget, 1 ); + renderer.render( scene, cameraNX ); - } - } - }); + renderer.setRenderTarget( renderTarget, 2 ); + renderer.render( scene, cameraPY ); - this.requests.push(request); - } - } - }; + renderer.setRenderTarget( renderTarget, 3 ); + renderer.render( scene, cameraNY ); - /** - * - * @author sigeom sa / http://sigeom.ch - * @author Ioda-Net Sàrl / https://www.ioda-net.ch/ - * @author Markus Schütz / http://potree.org - * - */ + renderer.setRenderTarget( renderTarget, 4 ); + renderer.render( scene, cameraPZ ); - class GeoJSONExporter{ + renderTarget.texture.generateMipmaps = generateMipmaps; - static measurementToFeatures (measurement) { - let coords = measurement.points.map(e => e.position.toArray()); + renderer.setRenderTarget( renderTarget, 5 ); + renderer.render( scene, cameraNZ ); - let features = []; + renderer.setRenderTarget( currentRenderTarget ); - if (coords.length === 1) { - let feature = { - type: 'Feature', - geometry: { - type: 'Point', - coordinates: coords[0] - }, - properties: { - name: measurement.name - } - }; - features.push(feature); - } else if (coords.length > 1 && !measurement.closed) { - let object = { - 'type': 'Feature', - 'geometry': { - 'type': 'LineString', - 'coordinates': coords - }, - 'properties': { - name: measurement.name - } - }; + renderer.xr.enabled = currentXrEnabled; - features.push(object); - } else if (coords.length > 1 && measurement.closed) { - let object = { - 'type': 'Feature', - 'geometry': { - 'type': 'Polygon', - 'coordinates': [[...coords, coords[0]]] - }, - 'properties': { - name: measurement.name - } - }; - features.push(object); - } + }; - if (measurement.showDistances) { - measurement.edgeLabels.forEach((label) => { - let labelPoint = { - type: 'Feature', - geometry: { - type: 'Point', - coordinates: label.position.toArray() - }, - properties: { - distance: label.text - } - }; - features.push(labelPoint); - }); - } + } - if (measurement.showArea) { - let point = measurement.areaLabel.position; - let labelArea = { - type: 'Feature', - geometry: { - type: 'Point', - coordinates: point.toArray() - }, - properties: { - area: measurement.areaLabel.text - } - }; - features.push(labelArea); - } + CubeCamera.prototype = Object.create( Object3D.prototype ); + CubeCamera.prototype.constructor = CubeCamera; - return features; - } + function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { - static toString (measurements) { - if (!(measurements instanceof Array)) { - measurements = [measurements]; - } + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + format = format !== undefined ? format : RGBFormat; - measurements = measurements.filter(m => m instanceof Measure); + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); - let features = []; - for (let measure of measurements) { - let f = GeoJSONExporter.measurementToFeatures(measure); + this.flipY = false; - features = features.concat(f); - } + // Why CubeTexture._needsFlipEnvMap is necessary: + // + // By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js) + // in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words, + // in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly. - let geojson = { - 'type': 'FeatureCollection', - 'features': features - }; + // three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped + // and the flag _needsFlipEnvMap controls this conversion. The flip is not required (and thus _needsFlipEnvMap is set to false) + // when using WebGLCubeRenderTarget.texture as a cube texture. - return JSON.stringify(geojson, null, '\t'); - } + this._needsFlipEnvMap = true; } - /** - * - * @author sigeom sa / http://sigeom.ch - * @author Ioda-Net Sàrl / https://www.ioda-net.ch/ - * @author Markus Schuetz / http://potree.org - * - */ + CubeTexture.prototype = Object.create( Texture.prototype ); + CubeTexture.prototype.constructor = CubeTexture; - class DXFExporter { + CubeTexture.prototype.isCubeTexture = true; - static measurementPointSection (measurement) { - let position = measurement.points[0].position; + Object.defineProperty( CubeTexture.prototype, 'images', { - if (!position) { - return ''; - } + get: function () { - let dxfSection = `0 -CIRCLE -8 -layer_point -10 -${position.x} -20 -${position.y} -30 -${position.z} -40 -1.0 -`; + return this.image; + + }, + + set: function ( value ) { + + this.image = value; - return dxfSection; } - static measurementPolylineSection (measurement) { - // bit code for polygons/polylines: - // https://www.autodesk.com/techpubs/autocad/acad2000/dxf/polyline_dxf_06.htm - let geomCode = 8; - if (measurement.closed) { - geomCode += 1; - } + } ); - let dxfSection = `0 -POLYLINE -8 -layer_polyline -62 -1 -66 -1 -10 -0.0 -20 -0.0 -30 -0.0 -70 -${geomCode} -`; + function WebGLCubeRenderTarget( size, options, dummy ) { - let xMax = 0.0; - let yMax = 0.0; - let zMax = 0.0; - for (let point of measurement.points) { - point = point.position; - xMax = Math.max(xMax, point.x); - yMax = Math.max(yMax, point.y); - zMax = Math.max(zMax, point.z); + if ( Number.isInteger( options ) ) { - dxfSection += `0 -VERTEX -8 -0 -10 -${point.x} -20 -${point.y} -30 -${point.z} -70 -32 -`; - } - dxfSection += `0 -SEQEND -`; + console.warn( 'THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )' ); + + options = dummy; - return dxfSection; } - static measurementSection (measurement) { - // if(measurement.points.length <= 1){ - // return ""; - // } + WebGLRenderTarget.call( this, size, size, options ); - if (measurement.points.length === 0) { - return ''; - } else if (measurement.points.length === 1) { - return DXFExporter.measurementPointSection(measurement); - } else if (measurement.points.length >= 2) { - return DXFExporter.measurementPolylineSection(measurement); - } - } + options = options || {}; + + this.texture = new CubeTexture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.texture._needsFlipEnvMap = false; + + } + + WebGLCubeRenderTarget.prototype = Object.create( WebGLRenderTarget.prototype ); + WebGLCubeRenderTarget.prototype.constructor = WebGLCubeRenderTarget; + + WebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true; + + WebGLCubeRenderTarget.prototype.fromEquirectangularTexture = function ( renderer, texture ) { + + this.texture.type = texture.type; + this.texture.format = RGBAFormat; // see #18859 + this.texture.encoding = texture.encoding; + + this.texture.generateMipmaps = texture.generateMipmaps; + this.texture.minFilter = texture.minFilter; + this.texture.magFilter = texture.magFilter; + + const shader = { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: /* glsl */` + + varying vec3 vWorldDirection; + + vec3 transformDirection( in vec3 dir, in mat4 matrix ) { + + return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); - static toString(measurements){ - if (!(measurements instanceof Array)) { - measurements = [measurements]; } - measurements = measurements.filter(m => m instanceof Measure); - let points = measurements.filter(m => (m instanceof Measure)) - .map(m => m.points) - .reduce((a, v) => a.concat(v)) - .map(p => p.position); + void main() { + + vWorldDirection = transformDirection( position, modelMatrix ); + + #include + #include - let min = new THREE.Vector3(Infinity, Infinity, Infinity); - let max = new THREE.Vector3(-Infinity, -Infinity, -Infinity); - for (let point of points) { - min.min(point); - max.max(point); } + `, - let dxfHeader = `999 -DXF created from potree -0 -SECTION -2 -HEADER -9 -$ACADVER -1 -AC1006 -9 -$INSBASE -10 -0.0 -20 -0.0 -30 -0.0 -9 -$EXTMIN -10 -${min.x} -20 -${min.y} -30 -${min.z} -9 -$EXTMAX -10 -${max.x} -20 -${max.y} -30 -${max.z} -0 -ENDSEC -`; + fragmentShader: /* glsl */` - let dxfBody = `0 -SECTION -2 -ENTITIES -`; + uniform sampler2D tEquirect; + + varying vec3 vWorldDirection; + + #include + + void main() { + + vec3 direction = normalize( vWorldDirection ); + + vec2 sampleUV = equirectUv( direction ); + + gl_FragColor = texture2D( tEquirect, sampleUV ); - for (let measurement of measurements) { - dxfBody += DXFExporter.measurementSection(measurement); } + ` + }; - dxfBody += `0 -ENDSEC -`; + const geometry = new BoxBufferGeometry( 5, 5, 5 ); - let dxf = dxfHeader + dxfBody + '0\nEOF'; + const material = new ShaderMaterial( { - return dxf; - } + name: 'CubemapFromEquirect', - } + uniforms: cloneUniforms( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader, + side: BackSide, + blending: NoBlending - class MeasurePanel{ + } ); - constructor(viewer, measurement, propertiesPanel){ - this.viewer = viewer; - this.measurement = measurement; - this.propertiesPanel = propertiesPanel; + material.uniforms.tEquirect.value = texture; - this._update = () => { this.update(); }; - } + const mesh = new Mesh( geometry, material ); - createCoordinatesTable(points){ - let table = $(` - - - - - - - -
xyz
- `); + const currentMinFilter = texture.minFilter; - let copyIconPath = Potree.resourcePath + '/icons/copy.svg'; + // Avoid blurred poles + if ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter; - for (let point of points) { - let x = Utils.addCommas(point.x.toFixed(3)); - let y = Utils.addCommas(point.y.toFixed(3)); - let z = Utils.addCommas(point.z.toFixed(3)); + const camera = new CubeCamera( 1, 10, this ); + camera.update( renderer, mesh ); - let row = $(` - - ${x} - ${y} - ${z} - - - - - `); + texture.minFilter = currentMinFilter; - this.elCopy = row.find("img[name=copy]"); - this.elCopy.click( () => { - let msg = point.toArray().map(c => c.toFixed(3)).join(", "); - Utils.clipboardCopy(msg); + mesh.geometry.dispose(); + mesh.material.dispose(); - this.viewer.postMessage( - `Copied value to clipboard:
'${msg}'`, - {duration: 3000}); - }); + return this; - table.append(row); - } + }; - return table; - }; + WebGLCubeRenderTarget.prototype.clear = function ( renderer, color, depth, stencil ) { - createAttributesTable(){ - let elTable = $('
'); + const currentRenderTarget = renderer.getRenderTarget(); - let point = this.measurement.points[0]; - - for(let attributeName of Object.keys(point)){ - if(attributeName === "position"){ - - }else if(attributeName === "rgba"){ - let color = point.rgba; - let text = color.join(', '); + for ( let i = 0; i < 6; i ++ ) { - elTable.append($(` - - rgb - ${text} - - `)); - }else { - let value = point[attributeName]; - let text = value.join(', '); + renderer.setRenderTarget( this, i ); - elTable.append($(` - - ${attributeName} - ${text} - - `)); - } - } + renderer.clear( color, depth, stencil ); - return elTable; } - update(){ + renderer.setRenderTarget( currentRenderTarget ); - } }; - class DistancePanel extends MeasurePanel{ - constructor(viewer, measurement, propertiesPanel){ - super(viewer, measurement, propertiesPanel); + function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { - let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; - this.elContent = $(` -
- -
-
+ Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); - -
- - - - - -
-
- `); + this.image = { data: data || null, width: width || 1, height: height || 1 }; - this.elRemove = this.elContent.find("img[name=remove]"); - this.elRemove.click( () => { - this.viewer.scene.removeMeasurement(measurement); - }); - - this.elMakeProfile = this.elContent.find("input[name=make_profile]"); - this.elMakeProfile.click( () => { - //measurement.points; - const profile = new Profile(); + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; - profile.name = measurement.name; - profile.width = measurement.getTotalDistance() / 50; + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; - for(const point of measurement.points){ - profile.addMarker(point.position.clone()); - } + this.needsUpdate = true; - this.viewer.scene.addProfile(profile); + } - }); + DataTexture.prototype = Object.create( Texture.prototype ); + DataTexture.prototype.constructor = DataTexture; - this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + DataTexture.prototype.isDataTexture = true; + + const _sphere$1 = /*@__PURE__*/ new Sphere(); + const _vector$5 = /*@__PURE__*/ new Vector3(); + + class Frustum { + + constructor( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; - this.update(); } - update(){ - let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); - elCoordiantesContainer.empty(); - elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + set( p0, p1, p2, p3, p4, p5 ) { - let positions = this.measurement.points.map(p => p.position); - let distances = []; - for (let i = 0; i < positions.length - 1; i++) { - let d = positions[i].distanceTo(positions[i + 1]); - distances.push(d.toFixed(3)); - } + const planes = this.planes; - let totalDistance = this.measurement.getTotalDistance().toFixed(3); - let elDistanceTable = this.elContent.find(`#distances_table`); - elDistanceTable.empty(); + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); - for (let i = 0; i < distances.length; i++) { - let label = (i === 0) ? 'Distances: ' : ''; - let distance = distances[i]; - let elDistance = $(` - - ${label} - ${distance} - `); - elDistanceTable.append(elDistance); - } + return this; - let elTotal = $(` - - Total: ${totalDistance} - `); - elDistanceTable.append(elTotal); } - }; - class PointPanel extends MeasurePanel{ - constructor(viewer, measurement, propertiesPanel){ - super(viewer, measurement, propertiesPanel); + clone() { - let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; - this.elContent = $(` -
- -
- + return new this.constructor().copy( this ); - -
- - - -
-
- `); + } - this.elRemove = this.elContent.find("img[name=remove]"); - this.elRemove.click( () => { - this.viewer.scene.removeMeasurement(measurement); - }); + copy( frustum ) { - this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + const planes = this.planes; + + for ( let i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; - this.update(); } - update(){ - let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); - elCoordiantesContainer.empty(); - elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + setFromProjectionMatrix( m ) { + + const planes = this.planes; + const me = m.elements; + const me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + const me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + const me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + const me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; - let elAttributesContainer = this.elContent.find('.attributes_table_container'); - elAttributesContainer.empty(); - elAttributesContainer.append(this.createAttributesTable()); } - }; - class AreaPanel extends MeasurePanel{ - constructor(viewer, measurement, propertiesPanel){ - super(viewer, measurement, propertiesPanel); + intersectsObject( object ) { - let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; - this.elContent = $(` -
- -
- Area: - + const geometry = object.geometry; - -
- - - -
-
- `); + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); - this.elRemove = this.elContent.find("img[name=remove]"); - this.elRemove.click( () => { - this.viewer.scene.removeMeasurement(measurement); - }); + _sphere$1.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld ); - this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + return this.intersectsSphere( _sphere$1 ); - this.update(); } - update(){ - let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); - elCoordiantesContainer.empty(); - elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + intersectsSprite( sprite ) { + + _sphere$1.center.set( 0, 0, 0 ); + _sphere$1.radius = 0.7071067811865476; + _sphere$1.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( _sphere$1 ); - let elArea = this.elContent.find(`#measurement_area`); - elArea.html(this.measurement.getArea().toFixed(3)); } - }; - class AnglePanel extends MeasurePanel{ - constructor(viewer, measurement, propertiesPanel){ - super(viewer, measurement, propertiesPanel); + intersectsSphere( sphere ) { - let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; - this.elContent = $(` -
- -
- - - - - - - - - - - -
\u03b1\u03b2\u03b3
+ const planes = this.planes; + const center = sphere.center; + const negRadius = - sphere.radius; - -
- - - -
-
- `); + for ( let i = 0; i < 6; i ++ ) { - this.elRemove = this.elContent.find("img[name=remove]"); - this.elRemove.click( () => { - this.viewer.scene.removeMeasurement(measurement); - }); + const distance = planes[ i ].distanceToPoint( center ); - this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + if ( distance < negRadius ) { - this.update(); - } + return false; - update(){ - let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); - elCoordiantesContainer.empty(); - elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + } - let angles = []; - for(let i = 0; i < this.measurement.points.length; i++){ - angles.push(this.measurement.getAngle(i) * (180.0 / Math.PI)); } - angles = angles.map(a => a.toFixed(1) + '\u00B0'); - let elAlpha = this.elContent.find(`#angle_cell_alpha`); - let elBetta = this.elContent.find(`#angle_cell_betta`); - let elGamma = this.elContent.find(`#angle_cell_gamma`); + return true; - elAlpha.html(angles[0]); - elBetta.html(angles[1]); - elGamma.html(angles[2]); } - }; - class CirclePanel extends MeasurePanel{ - constructor(viewer, measurement, propertiesPanel){ - super(viewer, measurement, propertiesPanel); + intersectsBox( box ) { - let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; - this.elContent = $(` -
- -
-
+ const planes = this.planes; - -
- - - -
-
- `); + for ( let i = 0; i < 6; i ++ ) { - this.elRemove = this.elContent.find("img[name=remove]"); - this.elRemove.click( () => { - this.viewer.scene.removeMeasurement(measurement); - }); + const plane = planes[ i ]; - this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + // corner at max distance + + _vector$5.x = plane.normal.x > 0 ? box.max.x : box.min.x; + _vector$5.y = plane.normal.y > 0 ? box.max.y : box.min.y; + _vector$5.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + if ( plane.distanceToPoint( _vector$5 ) < 0 ) { + + return false; + + } + + } + + return true; - this.update(); } - update(){ - let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); - elCoordiantesContainer.empty(); - elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + containsPoint( point ) { - const elInfos = this.elContent.find(`#infos_table`); + const planes = this.planes; + + for ( let i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } - if(this.measurement.points.length !== 3){ - elInfos.empty(); - - return; } - const A = this.measurement.points[0].position; - const B = this.measurement.points[1].position; - const C = this.measurement.points[2].position; + return true; - const center = Potree.Utils.computeCircleCenter(A, B, C); - const radius = center.distanceTo(A); - const circumference = 2 * Math.PI * radius; - - const format = (number) => { - return Potree.Utils.addCommas(number.toFixed(3)); - }; + } - - const txtCenter = `${format(center.x)} ${format(center.y)} ${format(center.z)}`; - const txtRadius = format(radius); - const txtCircumference = format(circumference); + } + + function WebGLAnimation() { + + let context = null; + let isAnimating = false; + let animationLoop = null; + let requestId = null; + + function onAnimationFrame( time, frame ) { + + animationLoop( time, frame ); + + requestId = context.requestAnimationFrame( onAnimationFrame ); - const thStyle = `style="text-align: left"`; - const tdStyle = `style="width: 100%; padding: 5px;"`; - - elInfos.html(` - - Center: - - - - - ${txtCenter} - - - - Radius: - ${txtRadius} - - - Circumference: - ${txtCircumference} - - `); } - }; - class HeightPanel extends MeasurePanel{ - constructor(viewer, measurement, propertiesPanel){ - super(viewer, measurement, propertiesPanel); + return { - let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; - this.elContent = $(` -
- -
- Height:
+ start: function () { - -
- - - -
-
- `); + if ( isAnimating === true ) return; + if ( animationLoop === null ) return; - this.elRemove = this.elContent.find("img[name=remove]"); - this.elRemove.click( () => { - this.viewer.scene.removeMeasurement(measurement); - }); + requestId = context.requestAnimationFrame( onAnimationFrame ); - this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + isAnimating = true; - this.update(); - } + }, - update(){ - let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); - elCoordiantesContainer.empty(); - elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + stop: function () { - { - let points = this.measurement.points; + context.cancelAnimationFrame( requestId ); - let sorted = points.slice().sort((a, b) => a.position.z - b.position.z); - let lowPoint = sorted[0].position.clone(); - let highPoint = sorted[sorted.length - 1].position.clone(); - let min = lowPoint.z; - let max = highPoint.z; - let height = max - min; - height = height.toFixed(3); + isAnimating = false; + + }, + + setAnimationLoop: function ( callback ) { + + animationLoop = callback; + + }, + + setContext: function ( value ) { + + context = value; - this.elHeightLabel = this.elContent.find(`#height_label`); - this.elHeightLabel.html(`Height: ${height}`); } - } - }; - class VolumePanel extends MeasurePanel{ - constructor(viewer, measurement, propertiesPanel){ - super(viewer, measurement, propertiesPanel); + }; - let copyIconPath = Potree.resourcePath + '/icons/copy.svg'; - let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; + } - let lblLengthText = new Map([ - [BoxVolume, "length"], - [SphereVolume, "rx"], - ]).get(measurement.constructor); + function WebGLAttributes( gl, capabilities ) { - let lblWidthText = new Map([ - [BoxVolume, "width"], - [SphereVolume, "ry"], - ]).get(measurement.constructor); + const isWebGL2 = capabilities.isWebGL2; - let lblHeightText = new Map([ - [BoxVolume, "height"], - [SphereVolume, "rz"], - ]).get(measurement.constructor); + const buffers = new WeakMap(); - this.elContent = $(` -
- + function createBuffer( attribute, bufferType ) { - - - - - - - - - - - - - -
\u03b1\u03b2\u03b3
- -
+ const array = attribute.array; + const usage = attribute.usage; - - - - - - - - - - - - - -
${lblLengthText}${lblWidthText}${lblHeightText}
- -
+ const buffer = gl.createBuffer(); -
- Volume: - + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); - + attribute.onUploadCallback(); -
  • - -
  • + let type = 5126; -
  • - -
    -
  • + if ( array instanceof Float32Array ) { + type = 5126; - -
  • - - -
  • -
    - - - -
    -
    - `); + } else if ( array instanceof Float64Array ) { - { // download - this.elDownloadButton = this.elContent.find("input[name=download_volume]"); + console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' ); + + } else if ( array instanceof Uint16Array ) { + + if ( attribute.isFloat16BufferAttribute ) { + + if ( isWebGL2 ) { + + type = 5131; + + } else { + + console.warn( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' ); + + } - if(this.propertiesPanel.viewer.server){ - this.elDownloadButton.click(() => this.download()); } else { - this.elDownloadButton.hide(); + + type = 5123; + } - } - this.elCopyRotation = this.elContent.find("img[name=copyRotation]"); - this.elCopyRotation.click( () => { - let rotation = this.measurement.rotation.toArray().slice(0, 3); - let msg = rotation.map(c => c.toFixed(3)).join(", "); - Utils.clipboardCopy(msg); + } else if ( array instanceof Int16Array ) { - this.viewer.postMessage( - `Copied value to clipboard:
    '${msg}'`, - {duration: 3000}); - }); + type = 5122; - this.elCopyScale = this.elContent.find("img[name=copyScale]"); - this.elCopyScale.click( () => { - let scale = this.measurement.scale.toArray(); - let msg = scale.map(c => c.toFixed(3)).join(", "); - Utils.clipboardCopy(msg); + } else if ( array instanceof Uint32Array ) { - this.viewer.postMessage( - `Copied value to clipboard:
    '${msg}'`, - {duration: 3000}); - }); + type = 5125; - this.elRemove = this.elContent.find("img[name=remove]"); - this.elRemove.click( () => { - this.viewer.scene.removeVolume(measurement); - }); + } else if ( array instanceof Int32Array ) { - this.elContent.find("#volume_reset_orientation").click(() => { - measurement.rotation.set(0, 0, 0); - }); + type = 5124; - this.elContent.find("#volume_make_uniform").click(() => { - let mean = (measurement.scale.x + measurement.scale.y + measurement.scale.z) / 3; - measurement.scale.set(mean, mean, mean); - }); + } else if ( array instanceof Int8Array ) { - this.elCheckClip = this.elContent.find('#volume_clip'); - this.elCheckClip.click(event => { - this.measurement.clip = event.target.checked; - }); + type = 5120; - this.elCheckShow = this.elContent.find('#volume_show'); - this.elCheckShow.click(event => { - this.measurement.visible = event.target.checked; - }); + } else if ( array instanceof Uint8Array ) { - this.propertiesPanel.addVolatileListener(measurement, "position_changed", this._update); - this.propertiesPanel.addVolatileListener(measurement, "orientation_changed", this._update); - this.propertiesPanel.addVolatileListener(measurement, "scale_changed", this._update); - this.propertiesPanel.addVolatileListener(measurement, "clip_changed", this._update); + type = 5121; + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + }; - this.update(); } - async download(){ + function updateBuffer( buffer, attribute, bufferType ) { - let clipBox = this.measurement; + const array = attribute.array; + const updateRange = attribute.updateRange; - let regions = []; - //for(let clipBox of boxes){ - { - let toClip = clipBox.matrixWorld; + gl.bindBuffer( bufferType, buffer ); - let px = new THREE.Vector3(+0.5, 0, 0).applyMatrix4(toClip); - let nx = new THREE.Vector3(-0.5, 0, 0).applyMatrix4(toClip); - let py = new THREE.Vector3(0, +0.5, 0).applyMatrix4(toClip); - let ny = new THREE.Vector3(0, -0.5, 0).applyMatrix4(toClip); - let pz = new THREE.Vector3(0, 0, +0.5).applyMatrix4(toClip); - let nz = new THREE.Vector3(0, 0, -0.5).applyMatrix4(toClip); + if ( updateRange.count === - 1 ) { - let pxN = new THREE.Vector3().subVectors(nx, px).normalize(); - let nxN = pxN.clone().multiplyScalar(-1); - let pyN = new THREE.Vector3().subVectors(ny, py).normalize(); - let nyN = pyN.clone().multiplyScalar(-1); - let pzN = new THREE.Vector3().subVectors(nz, pz).normalize(); - let nzN = pzN.clone().multiplyScalar(-1); + // Not using update ranges - let planes = [ - new THREE.Plane().setFromNormalAndCoplanarPoint(pxN, px), - new THREE.Plane().setFromNormalAndCoplanarPoint(nxN, nx), - new THREE.Plane().setFromNormalAndCoplanarPoint(pyN, py), - new THREE.Plane().setFromNormalAndCoplanarPoint(nyN, ny), - new THREE.Plane().setFromNormalAndCoplanarPoint(pzN, pz), - new THREE.Plane().setFromNormalAndCoplanarPoint(nzN, nz), - ]; + gl.bufferSubData( bufferType, 0, array ); + + } else { + + if ( isWebGL2 ) { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array, updateRange.offset, updateRange.count ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); - let planeQueryParts = []; - for(let plane of planes){ - let part = [plane.normal.toArray(), plane.constant].join(","); - part = `[${part}]`; - planeQueryParts.push(part); } - let region = "[" + planeQueryParts.join(",") + "]"; - regions.push(region); + + updateRange.count = - 1; // reset range + } - let regionsArg = regions.join(","); + } - let pointcloudArgs = []; - for(let pointcloud of this.viewer.scene.pointclouds){ - if(!pointcloud.visible){ - continue; - } + // - let offset = pointcloud.pcoGeometry.offset.clone(); - let negateOffset = new THREE.Matrix4().makeTranslation(...offset.multiplyScalar(-1).toArray()); - let matrixWorld = pointcloud.matrixWorld; + function get( attribute ) { - let transform = new THREE.Matrix4().multiplyMatrices(matrixWorld, negateOffset); + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; - let path = `${window.location.pathname}/../${pointcloud.pcoGeometry.url}`; + return buffers.get( attribute ); - let arg = { - path: path, - transform: transform.elements, - }; - let argString = JSON.stringify(arg); + } + + function remove( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + const data = buffers.get( attribute ); + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + buffers.delete( attribute ); - pointcloudArgs.push(argString); } - let pointcloudsArg = pointcloudArgs.join(","); - let elMessage = this.elContent.find("div[name=download_message]"); + } - let error = (message) => { - elMessage.html(`
    ERROR: ${message}
    `); - }; + function update( attribute, bufferType ) { - let info = (message) => { - elMessage.html(`${message}`); - }; + if ( attribute.isGLBufferAttribute ) { - let handle = null; - { // START FILTER - let url = `${viewer.server}/create_regions_filter?pointclouds=[${pointcloudsArg}]®ions=[${regionsArg}]`; - - //console.log(url); + const cached = buffers.get( attribute ); - info("estimating results ..."); + if ( ! cached || cached.version < attribute.version ) { - let response = await fetch(url); - let jsResponse = await response.json(); - //console.log(jsResponse); + buffers.set( attribute, { + buffer: attribute.buffer, + type: attribute.type, + bytesPerElement: attribute.elementSize, + version: attribute.version + } ); - if(!jsResponse.handle){ - error(jsResponse.message); - return; - }else { - handle = jsResponse.handle; } + + return; + } - { // WAIT, CHECK PROGRESS, HANDLE FINISH - let url = `${viewer.server}/check_regions_filter?handle=${handle}`; + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; - let sleep = (function(duration){ - return new Promise( (res, rej) => { - setTimeout(() => { - res(); - }, duration); - }); - }); + const data = buffers.get( attribute ); - let handleFiltering = (jsResponse) => { - let {progress, estimate} = jsResponse; + if ( data === undefined ) { - let progressFract = progress["processed points"] / estimate.points; - let progressPercents = parseInt(progressFract * 100); + buffers.set( attribute, createBuffer( attribute, bufferType ) ); - info(`progress: ${progressPercents}%`); - }; + } else if ( data.version < attribute.version ) { - let handleFinish = (jsResponse) => { - let message = "downloads ready:
    "; - message += "
      "; + updateBuffer( data.buffer, attribute, bufferType ); - for(let i = 0; i < jsResponse.pointclouds.length; i++){ - let url = `${viewer.server}/download_regions_filter_result?handle=${handle}&index=${i}`; + data.version = attribute.version; - message += `
    • result_${i}.las
    • \n`; - } + } - let reportURL = `${viewer.server}/download_regions_filter_report?handle=${handle}`; - message += `
    • report.json
    • \n`; - message += "
    "; + } - info(message); - }; + return { - let handleUnexpected = (jsResponse) => { - let message = `Unexpected Response.
    status: ${jsResponse.status}
    message: ${jsResponse.message}`; - info(message); - }; + get: get, + remove: remove, + update: update - let handleError = (jsResponse) => { - let message = `ERROR: ${jsResponse.message}`; - error(message); + }; - throw new Error(message); - }; + } - let start = Date.now(); + class PlaneBufferGeometry extends BufferGeometry { - while(true){ - let response = await fetch(url); - let jsResponse = await response.json(); + constructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) { - if(jsResponse.status === "ERROR"){ - handleError(jsResponse); - }else if(jsResponse.status === "FILTERING"){ - handleFiltering(jsResponse); - }else if(jsResponse.status === "FINISHED"){ - handleFinish(jsResponse); + super(); + this.type = 'PlaneBufferGeometry'; - break; - }else { - handleUnexpected(jsResponse); - } + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; - let durationS = (Date.now() - start) / 1000; - let sleepAmountMS = durationS < 10 ? 100 : 1000; + const width_half = width / 2; + const height_half = height / 2; - await sleep(sleepAmountMS); - } - } + const gridX = Math.floor( widthSegments ); + const gridY = Math.floor( heightSegments ); - } + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; - update(){ - let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); - elCoordiantesContainer.empty(); - elCoordiantesContainer.append(this.createCoordinatesTable([this.measurement.position])); + const segment_width = width / gridX; + const segment_height = height / gridY; - { - let angles = this.measurement.rotation.toVector3(); - angles = angles.toArray(); - //angles = [angles.z, angles.x, angles.y]; - angles = angles.map(v => 180 * v / Math.PI); - angles = angles.map(a => a.toFixed(1) + '\u00B0'); + // - let elAlpha = this.elContent.find(`#angle_cell_alpha`); - let elBetta = this.elContent.find(`#angle_cell_betta`); - let elGamma = this.elContent.find(`#angle_cell_gamma`); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; - elAlpha.html(angles[0]); - elBetta.html(angles[1]); - elGamma.html(angles[2]); - } + for ( let iy = 0; iy < gridY1; iy ++ ) { - { - let dimensions = this.measurement.scale.toArray(); - dimensions = dimensions.map(v => Utils.addCommas(v.toFixed(2))); + const y = iy * segment_height - height_half; - let elLength = this.elContent.find(`#cell_length`); - let elWidth = this.elContent.find(`#cell_width`); - let elHeight = this.elContent.find(`#cell_height`); + for ( let ix = 0; ix < gridX1; ix ++ ) { + + const x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } - elLength.html(dimensions[0]); - elWidth.html(dimensions[1]); - elHeight.html(dimensions[2]); } - { - let elVolume = this.elContent.find(`#measurement_volume`); - let volume = this.measurement.getVolume(); - elVolume.html(Utils.addCommas(volume.toFixed(2))); + for ( let iy = 0; iy < gridY; iy ++ ) { + + for ( let ix = 0; ix < gridX; ix ++ ) { + + const a = ix + gridX1 * iy; + const b = ix + gridX1 * ( iy + 1 ); + const c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + const d = ( ix + 1 ) + gridX1 * iy; + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + } - this.elCheckClip.prop("checked", this.measurement.clip); - this.elCheckShow.prop("checked", this.measurement.visible); + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); } - }; - class ProfilePanel extends MeasurePanel{ - constructor(viewer, measurement, propertiesPanel){ - super(viewer, measurement, propertiesPanel); + } - let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; - this.elContent = $(` -
    - -
    - - Width: - - -
    + var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif"; -
  • - -
    -
  • + var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif"; -
    + var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif"; - + var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif"; - -
    - - - -
    -
    - `); + var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; - this.elRemove = this.elContent.find("img[name=remove]"); - this.elRemove.click( () => { - this.viewer.scene.removeProfile(measurement); - }); + var begin_vertex = "vec3 transformed = vec3( position );"; - { // download - this.elDownloadButton = this.elContent.find(`input[name=download_profile]`); + var beginnormal_vertex = "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif"; - if(this.propertiesPanel.viewer.server){ - this.elDownloadButton.click(() => this.download()); - } else { - this.elDownloadButton.hide(); - } - } + var bsdfs = "vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif"; - { // width spinner - let elWidthSlider = this.elContent.find(`#sldProfileWidth`); + var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif"; - elWidthSlider.spinner({ - min: 0, max: 10 * 1000 * 1000, step: 0.01, - numberFormat: 'n', - start: () => {}, - spin: (event, ui) => { - let value = elWidthSlider.spinner('value'); - measurement.setWidth(value); - }, - change: (event, ui) => { - let value = elWidthSlider.spinner('value'); - measurement.setWidth(value); - }, - stop: (event, ui) => { - let value = elWidthSlider.spinner('value'); - measurement.setWidth(value); - }, - incremental: (count) => { - let value = elWidthSlider.spinner('value'); - let step = elWidthSlider.spinner('option', 'step'); + var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif"; - let delta = value * 0.05; - let increments = Math.max(1, parseInt(delta / step)); + var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif"; - return increments; - } - }); - elWidthSlider.spinner('value', measurement.getWidth()); - elWidthSlider.spinner('widget').css('width', '100%'); + var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif"; - let widthListener = (event) => { - let value = elWidthSlider.spinner('value'); - if (value !== measurement.getWidth()) { - elWidthSlider.spinner('value', measurement.getWidth()); - } - }; - this.propertiesPanel.addVolatileListener(measurement, "width_changed", widthListener); - } + var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif"; - let elShow2DProfile = this.elContent.find(`#show_2d_profile`); - elShow2DProfile.click(() => { - this.propertiesPanel.viewer.profileWindow.show(); - this.propertiesPanel.viewer.profileWindowController.setProfile(measurement); - }); + var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; - this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); - this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; - this.update(); - } + var color_pars_vertex = "#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif"; - update(){ - let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); - elCoordiantesContainer.empty(); - elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points)); - } + var color_vertex = "#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor.xyz *= color.xyz;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif"; - async download(){ + var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}"; - let profile = this.measurement; + var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif"; - let regions = []; - { - let segments = profile.getSegments(); - let width = profile.width; - - for(let segment of segments){ - let start = segment.start.clone().multiply(new THREE.Vector3(1, 1, 0)); - let end = segment.end.clone().multiply(new THREE.Vector3(1, 1, 0)); - let center = new THREE.Vector3().addVectors(start, end).multiplyScalar(0.5); - - let startEndDir = new THREE.Vector3().subVectors(end, start).normalize(); - let endStartDir = new THREE.Vector3().subVectors(start, end).normalize(); - let upDir = new THREE.Vector3(0, 0, 1); - let rightDir = new THREE.Vector3().crossVectors(startEndDir, upDir); - let leftDir = new THREE.Vector3().crossVectors(endStartDir, upDir); - - console.log(leftDir); - - let right = rightDir.clone().multiplyScalar(width * 0.5).add(center); - let left = leftDir.clone().multiplyScalar(width * 0.5).add(center); - - let planes = [ - new THREE.Plane().setFromNormalAndCoplanarPoint(startEndDir, start), - new THREE.Plane().setFromNormalAndCoplanarPoint(endStartDir, end), - new THREE.Plane().setFromNormalAndCoplanarPoint(leftDir, right), - new THREE.Plane().setFromNormalAndCoplanarPoint(rightDir, left), - ]; - - let planeQueryParts = []; - for(let plane of planes){ - let part = [plane.normal.toArray(), plane.constant].join(","); - part = `[${part}]`; - planeQueryParts.push(part); - } - let region = "[" + planeQueryParts.join(",") + "]"; - regions.push(region); - } - } + var defaultnormal_vertex = "vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif"; - let regionsArg = regions.join(","); + var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif"; - let pointcloudArgs = []; - for(let pointcloud of this.viewer.scene.pointclouds){ - if(!pointcloud.visible){ - continue; - } + var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif"; - let offset = pointcloud.pcoGeometry.offset.clone(); - let negateOffset = new THREE.Matrix4().makeTranslation(...offset.multiplyScalar(-1).toArray()); - let matrixWorld = pointcloud.matrixWorld; + var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif"; - let transform = new THREE.Matrix4().multiplyMatrices(matrixWorld, negateOffset); + var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif"; - let path = `${window.location.pathname}/../${pointcloud.pcoGeometry.url}`; + var encodings_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );"; - let arg = { - path: path, - transform: transform.elements, - }; - let argString = JSON.stringify(arg); + var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}"; - pointcloudArgs.push(argString); - } - let pointcloudsArg = pointcloudArgs.join(","); + var envmap_fragment = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif"; - let elMessage = this.elContent.find("div[name=download_message]"); + var envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif"; - let error = (message) => { - elMessage.html(`
    ERROR: ${message}
    `); - }; + var envmap_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif"; - let info = (message) => { - elMessage.html(`${message}`); - }; + var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif"; - let handle = null; - { // START FILTER - let url = `${viewer.server}/create_regions_filter?pointclouds=[${pointcloudsArg}]®ions=[${regionsArg}]`; - - //console.log(url); + var envmap_vertex = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif"; - info("estimating results ..."); + var fog_vertex = "#ifdef USE_FOG\n\tfogDepth = - mvPosition.z;\n#endif"; - let response = await fetch(url); - let jsResponse = await response.json(); - //console.log(jsResponse); + var fog_pars_vertex = "#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif"; - if(!jsResponse.handle){ - error(jsResponse.message); - return; - }else { - handle = jsResponse.handle; - } - } + var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif"; - { // WAIT, CHECK PROGRESS, HANDLE FINISH - let url = `${viewer.server}/check_regions_filter?handle=${handle}`; + var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif"; - let sleep = (function(duration){ - return new Promise( (res, rej) => { - setTimeout(() => { - res(); - }, duration); - }); - }); + var gradientmap_pars_fragment = "#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}"; - let handleFiltering = (jsResponse) => { - let {progress, estimate} = jsResponse; + var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif"; - let progressFract = progress["processed points"] / estimate.points; - let progressPercents = parseInt(progressFract * 100); + var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; - info(`progress: ${progressPercents}%`); - }; + var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif"; - let handleFinish = (jsResponse) => { - let message = "downloads ready:
    "; - message += "
      "; + var lights_pars_begin = "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif"; - for(let i = 0; i < jsResponse.pointclouds.length; i++){ - let url = `${viewer.server}/download_regions_filter_result?handle=${handle}&index=${i}`; + var envmap_physical_pars_fragment = "#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif"; - message += `
    • result_${i}.las
    • \n`; - } + var lights_toon_fragment = "ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;"; - let reportURL = `${viewer.server}/download_regions_filter_report?handle=${handle}`; - message += `
    • report.json
    • \n`; - message += "
    "; + var lights_toon_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)"; - info(message); - }; + var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;"; - let handleUnexpected = (jsResponse) => { - let message = `Unexpected Response.
    status: ${jsResponse.status}
    message: ${jsResponse.message}`; - info(message); - }; + var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)"; - let handleError = (jsResponse) => { - let message = `ERROR: ${jsResponse.message}`; - error(message); + var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif"; - throw new Error(message); - }; + var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat specularRoughness;\n\tvec3 specularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}"; - let start = Date.now(); + var lights_fragment_begin = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif"; - while(true){ - let response = await fetch(url); - let jsResponse = await response.json(); + var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif"; - if(jsResponse.status === "ERROR"){ - handleError(jsResponse); - }else if(jsResponse.status === "FILTERING"){ - handleFiltering(jsResponse); - }else if(jsResponse.status === "FINISHED"){ - handleFinish(jsResponse); + var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif"; - break; - }else { - handleUnexpected(jsResponse); - } + var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; - let durationS = (Date.now() - start) / 1000; - let sleepAmountMS = durationS < 10 ? 100 : 1000; + var logdepthbuf_pars_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif"; - await sleep(sleepAmountMS); - } - } + var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif"; - } - }; + var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif"; - class CameraPanel{ - constructor(viewer, propertiesPanel){ - this.viewer = viewer; - this.propertiesPanel = propertiesPanel; + var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif"; - this._update = () => { this.update(); }; + var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif"; - let copyIconPath = Potree.resourcePath + '/icons/copy.svg'; - this.elContent = $(` -
    - - - - - - - - - - - - - - - - - - - - - -
    position
    - -
    target
    - -
    -
    - `); + var map_particle_fragment = "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif"; - this.elCopyPosition = this.elContent.find("img[name=copyPosition]"); - this.elCopyPosition.click( () => { - let pos = this.viewer.scene.getActiveCamera().position.toArray(); - let msg = pos.map(c => c.toFixed(3)).join(", "); - Utils.clipboardCopy(msg); + var map_particle_pars_fragment = "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif"; - this.viewer.postMessage( - `Copied value to clipboard:
    '${msg}'`, - {duration: 3000}); - }); + var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif"; - this.elCopyTarget = this.elContent.find("img[name=copyTarget]"); - this.elCopyTarget.click( () => { - let pos = this.viewer.scene.view.getPivot().toArray(); - let msg = pos.map(c => c.toFixed(3)).join(", "); - Utils.clipboardCopy(msg); + var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; - this.viewer.postMessage( - `Copied value to clipboard:
    '${msg}'`, - {duration: 3000}); - }); + var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif"; - this.propertiesPanel.addVolatileListener(viewer, "camera_changed", this._update); + var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif"; - this.update(); - } + var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif"; - update(){ - //console.log("updating camera panel"); + var normal_fragment_begin = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;"; - let camera = this.viewer.scene.getActiveCamera(); - let view = this.viewer.scene.view; + var normal_fragment_maps = "#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif"; - let pos = camera.position.toArray().map(c => Utils.addCommas(c.toFixed(3))); - this.elContent.find("#camera_position_x").html(pos[0]); - this.elContent.find("#camera_position_y").html(pos[1]); - this.elContent.find("#camera_position_z").html(pos[2]); + var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tmat3 tsn = mat3( S, T, N );\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif"; - let target = view.getPivot().toArray().map(c => Utils.addCommas(c.toFixed(3))); - this.elContent.find("#camera_target_x").html(target[0]); - this.elContent.find("#camera_target_y").html(target[1]); - this.elContent.find("#camera_target_z").html(target[2]); - } - }; + var clearcoat_normal_fragment_begin = "#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif"; - class AnnotationPanel{ - constructor(viewer, propertiesPanel, annotation){ - this.viewer = viewer; - this.propertiesPanel = propertiesPanel; - this.annotation = annotation; + var clearcoat_normal_fragment_maps = "#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\n\t#endif\n#endif"; - this._update = () => { this.update(); }; + var clearcoat_pars_fragment = "#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif"; - let copyIconPath = `${Potree.resourcePath}/icons/copy.svg`; - this.elContent = $(` -
    - - - - - - - - - - - + var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}"; -
    position
    - -
    + var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif"; -
    + var project_vertex = "vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;"; -
    Title
    -
    - Annotation Title -
    + var dithering_fragment = "#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif"; -
    Description
    -
    - A longer description of this annotation. - Can be multiple lines long. TODO: the user should be able - to modify title and description. -
    + var dithering_pars_fragment = "#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif"; -
    + var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif"; -
    - `); + var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; - this.elCopyPosition = this.elContent.find("img[name=copyPosition]"); - this.elCopyPosition.click( () => { - let pos = this.annotation.position.toArray(); - let msg = pos.map(c => c.toFixed(3)).join(", "); - Utils.clipboardCopy(msg); + var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif"; - this.viewer.postMessage( - `Copied value to clipboard:
    '${msg}'`, - {duration: 3000}); - }); + var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif"; - this.elTitle = this.elContent.find("#annotation_title").html(annotation.title); - this.elDescription = this.elContent.find("#annotation_description").html(annotation.description); + var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif"; - this.elTitle[0].addEventListener("input", () => { - const title = this.elTitle.html(); - annotation.title = title; + var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}"; - }, false); + var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; - this.elDescription[0].addEventListener("input", () => { - const description = this.elDescription.html(); - annotation.description = description; - }, false); + var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif"; - this.update(); - } + var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif"; - update(){ - const {annotation, elContent, elTitle, elDescription} = this; + var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif"; - let pos = annotation.position.toArray().map(c => Utils.addCommas(c.toFixed(3))); - elContent.find("#annotation_position_x").html(pos[0]); - elContent.find("#annotation_position_y").html(pos[1]); - elContent.find("#annotation_position_z").html(pos[2]); + var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; - elTitle.html(annotation.title); - elDescription.html(annotation.description); + var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + var tonemapping_fragment = "#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif"; - } - }; + var tonemapping_pars_fragment = "#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }"; - class CameraAnimationPanel{ - constructor(viewer, propertiesPanel, animation){ - this.viewer = viewer; - this.propertiesPanel = propertiesPanel; - this.animation = animation; + var transmissionmap_fragment = "#ifdef USE_TRANSMISSIONMAP\n\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\n#endif"; - this.elContent = $(` -
    - + var transmissionmap_pars_fragment = "#ifdef USE_TRANSMISSIONMAP\n\tuniform sampler2D transmissionMap;\n#endif"; - + var uv_pars_fragment = "#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif"; - - Duration: - - + var uv_pars_vertex = "#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif"; - Time:
    + var uv_vertex = "#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif"; - -
    -
    - `); + var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; - const elPlay = this.elContent.find("input[name=play]"); - elPlay.click( () => { - animation.play(); - }); + var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif"; - const elSlider = this.elContent.find('#sldTime'); - elSlider.slider({ - value: 0, - min: 0, - max: 1, - step: 0.001, - slide: (event, ui) => { - animation.set(ui.value); - } - }); + var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif"; - let elDuration = this.elContent.find(`input[name=spnDuration]`); - elDuration.spinner({ - min: 0, max: 300, step: 0.01, - numberFormat: 'n', - start: () => {}, - spin: (event, ui) => { - let value = elDuration.spinner('value'); - animation.setDuration(value); - }, - change: (event, ui) => { - let value = elDuration.spinner('value'); - animation.setDuration(value); - }, - stop: (event, ui) => { - let value = elDuration.spinner('value'); - animation.setDuration(value); - }, - incremental: (count) => { - let value = elDuration.spinner('value'); - let step = elDuration.spinner('option', 'step'); + var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif"; - let delta = value * 0.05; - let increments = Math.max(1, parseInt(delta / step)); + var background_frag = "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}"; - return increments; - } - }); - elDuration.spinner('value', animation.getDuration()); - elDuration.spinner('widget').css('width', '100%'); + var background_vert = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}"; - const elKeyframes = this.elContent.find("#animation_keyframes"); + var cube_frag = "#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}"; - const updateKeyframes = () => { - elKeyframes.empty(); + var cube_vert = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}"; - //let index = 0; + var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}"; - // - // - // + var depth_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}"; - const addNewKeyframeItem = (index) => { - let elNewKeyframe = $(` -
    - - - -
    - `); + var distanceRGBA_frag = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}"; - const elAdd = elNewKeyframe.find("input[name=add]"); - elAdd.click( () => { - animation.createControlPoint(index); - }); + var distanceRGBA_vert = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}"; - elKeyframes.append(elNewKeyframe); - }; + var equirect_frag = "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}"; - const addKeyframeItem = (index) => { - let elKeyframe = $(` -
    - - - - - - - - keyframe - - - - -
    - `); + var equirect_vert = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}"; - const elAssign = elKeyframe.find("img[name=assign]"); - const elMove = elKeyframe.find("img[name=move]"); - const elDelete = elKeyframe.find("img[name=delete]"); + var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}"; - elAssign.click( () => { - const cp = animation.controlPoints[index]; + var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; - cp.position.copy(viewer.scene.view.position); - cp.target.copy(viewer.scene.view.getPivot()); - }); + var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; - elMove.click( () => { - const cp = animation.controlPoints[index]; + var meshbasic_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; - viewer.scene.view.position.copy(cp.position); - viewer.scene.view.lookAt(cp.target); - }); + var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; - elDelete.click( () => { - const cp = animation.controlPoints[index]; - animation.removeControlPoint(cp); - }); + var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; - elKeyframes.append(elKeyframe); - }; + var meshmatcap_frag = "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; - let index = 0; + var meshmatcap_vert = "#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}"; - addNewKeyframeItem(index); + var meshtoon_frag = "#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; - for(const cp of animation.controlPoints){ - - addKeyframeItem(index); - index++; - addNewKeyframeItem(index); + var meshtoon_vert = "#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}"; - } - }; + var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; - updateKeyframes(); + var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; - animation.addEventListener("controlpoint_added", updateKeyframes); - animation.addEventListener("controlpoint_removed", updateKeyframes); + var meshphysical_frag = "#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSMISSION\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSMISSION\n\tuniform float transmission;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#ifdef TRANSMISSION\n\t\tfloat totalTransmission = transmission;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSMISSION\n\t\tdiffuseColor.a *= mix( saturate( 1. - totalTransmission + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) ), 1.0, metalness );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + var meshphysical_vert = "#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}"; + var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}"; + var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}"; - // this._update = () => { this.update(); }; + var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}"; - // this.update(); - } + var points_vert = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}"; - update(){ - - } - }; + var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}"; - class PropertiesPanel{ + var shadow_vert = "#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; - constructor(container, viewer){ - this.container = container; - this.viewer = viewer; - this.object = null; - this.cleanupTasks = []; - this.scene = null; - } + var sprite_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}"; - setScene(scene){ - this.scene = scene; - } + var sprite_vert = "uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"; - set(object){ - if(this.object === object){ - return; - } + const ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_common_pars_fragment: envmap_common_pars_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_physical_pars_fragment: envmap_physical_pars_fragment, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars_begin: lights_pars_begin, + lights_toon_fragment: lights_toon_fragment, + lights_toon_pars_fragment: lights_toon_pars_fragment, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_fragment_begin: lights_fragment_begin, + lights_fragment_maps: lights_fragment_maps, + lights_fragment_end: lights_fragment_end, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_fragment_begin: normal_fragment_begin, + normal_fragment_maps: normal_fragment_maps, + normalmap_pars_fragment: normalmap_pars_fragment, + clearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin, + clearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps, + clearcoat_pars_fragment: clearcoat_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + transmissionmap_fragment: transmissionmap_fragment, + transmissionmap_pars_fragment: transmissionmap_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + background_frag: background_frag, + background_vert: background_vert, + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshmatcap_frag: meshmatcap_frag, + meshmatcap_vert: meshmatcap_vert, + meshtoon_frag: meshtoon_frag, + meshtoon_vert: meshtoon_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert, + sprite_frag: sprite_frag, + sprite_vert: sprite_vert + }; - this.object = object; - - for(let task of this.cleanupTasks){ - task(); - } - this.cleanupTasks = []; - this.container.empty(); + /** + * Uniforms library for shared webgl shaders + */ - if(object instanceof PointCloudTree){ - this.setPointCloud(object); - }else if(object instanceof Measure || object instanceof Profile || object instanceof Volume){ - this.setMeasurement(object); - }else if(object instanceof THREE.Camera){ - this.setCamera(object); - }else if(object instanceof Annotation){ - this.setAnnotation(object); - }else if(object instanceof CameraAnimation){ - this.setCameraAnimation(object); - } - - } + const UniformsLib = { - // - // Used for events that should be removed when the property object changes. - // This is for listening to materials, scene, point clouds, etc. - // not required for DOM listeners, since they are automatically cleared by removing the DOM subtree. - // - addVolatileListener(target, type, callback){ - target.addEventListener(type, callback); - this.cleanupTasks.push(() => { - target.removeEventListener(type, callback); - }); - } + common: { - setPointCloud(pointcloud){ + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, - let material = pointcloud.material; + map: { value: null }, + uvTransform: { value: new Matrix3() }, + uv2Transform: { value: new Matrix3() }, - let panel = $(` -
    -
      + alphaMap: { value: null }, -
    • -
      -
    • -
    • -
      -
    • + }, - -
    • - - -
    • + specularmap: { - -
    • -
      - -
    • + specularMap: { value: null }, -
    • - -
    • - - -
    • :
    • + }, -
      - Attribute -
      + envmap: { -
    • - -
    • + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 }, + maxMipLevel: { value: 0 } -
      -
      - Attribute Weights -
      + }, -
    • RGB:
    • -
    • Intensity:
    • -
    • Elevation:
    • -
    • Classification:
    • -
    • Return Number:
    • -
    • Source ID:
    • -
      + aomap: { -
      -
      - RGB -
      + aoMap: { value: null }, + aoMapIntensity: { value: 1 } -
    • Gamma:
    • -
    • Brightness:
    • -
    • Contrast:
    • -
      + }, -
      -
      - Extra Attribute -
      + lightmap: { -
    • :
    • + lightMap: { value: null }, + lightMapIntensity: { value: 1 } -
    • Gamma:
    • -
    • Brightness:
    • -
    • Contrast:
    • -
      - -
      -
      - MATCAP -
      + }, -
    • -
      -
    • -
      + emissivemap: { -
      -
      - Color -
      + emissiveMap: { value: null } - -
      + }, + bumpmap: { -
      -
      - Elevation -
      + bumpMap: { value: null }, + bumpScale: { value: 1 } -
    • :
    • + }, -
    • - - - - - -
    • + normalmap: { -
    • - Gradient Scheme: -
      -
      -
    • -
      + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } -
      -
      - Transition -
      + }, -
    • transition:
    • -
      + displacementmap: { -
      -
      - Intensity -
      + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } -
    • Range:
    • -
    • Gamma:
    • -
    • Brightness:
    • -
    • Contrast:
    • -
      + }, -
      -
      - GPS Time -
      + roughnessmap: { -
      - -
      -
      - Indices -
      -
      + roughnessMap: { value: null } + }, -
    -
    - `); + metalnessmap: { - panel.i18n(); - this.container.append(panel); + metalnessMap: { value: null } - { // POINT SIZE - let sldPointSize = panel.find(`#sldPointSize`); - let lblPointSize = panel.find(`#lblPointSize`); + }, - sldPointSize.slider({ - value: material.size, - min: 0, - max: 3, - step: 0.01, - slide: function (event, ui) { material.size = ui.value; } - }); + gradientmap: { - let update = (e) => { - lblPointSize.html(material.size.toFixed(2)); - sldPointSize.slider({value: material.size}); - }; - this.addVolatileListener(material, "point_size_changed", update); - - update(); - } + gradientMap: { value: null } - { // MINIMUM POINT SIZE - let sldMinPointSize = panel.find(`#sldMinPointSize`); - let lblMinPointSize = panel.find(`#lblMinPointSize`); + }, - sldMinPointSize.slider({ - value: material.size, - min: 0, - max: 3, - step: 0.01, - slide: function (event, ui) { material.minSize = ui.value; } - }); + fog: { - let update = (e) => { - lblMinPointSize.html(material.minSize.toFixed(2)); - sldMinPointSize.slider({value: material.minSize}); - }; - this.addVolatileListener(material, "point_size_changed", update); - - update(); - } + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } - { // POINT SIZING - let strSizeType = Object.keys(PointSizeType)[material.pointSizeType]; + }, - let opt = panel.find(`#optPointSizing`); - opt.selectmenu(); - opt.val(strSizeType).selectmenu('refresh'); + lights: { + + ambientLightColor: { value: [] }, + + lightProbe: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {} + } }, + + directionalLightShadows: { value: [], properties: { + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {} + } }, + + spotLightShadows: { value: [], properties: { + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {} + } }, + + pointLightShadows: { value: [], properties: { + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } }, + + ltc_1: { value: null }, + ltc_2: { value: null } - opt.selectmenu({ - change: (event, ui) => { - material.pointSizeType = PointSizeType[ui.item.value]; - } - }); - } + }, - { // SHAPE - let opt = panel.find(`#optShape`); + points: { - opt.selectmenu({ - change: (event, ui) => { - let value = ui.item.value; + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + alphaMap: { value: null }, + uvTransform: { value: new Matrix3() } - material.shape = PointShape[value]; - } - }); + }, - let update = () => { - let typename = Object.keys(PointShape)[material.shape]; + sprite: { - opt.selectmenu().val(typename).selectmenu('refresh'); - }; - this.addVolatileListener(material, "point_shape_changed", update); + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + center: { value: new Vector2( 0.5, 0.5 ) }, + rotation: { value: 0.0 }, + map: { value: null }, + alphaMap: { value: null }, + uvTransform: { value: new Matrix3() } - update(); - } + } - { // BACKFACE CULLING - - let opt = panel.find(`#set_backface_culling`); - opt.click(() => { - material.backfaceCulling = opt.prop("checked"); - }); - let update = () => { - let value = material.backfaceCulling; - opt.prop("checked", value); - }; - this.addVolatileListener(material, "backface_changed", update); - update(); + }; - let blockBackface = $('#materials_backface_container'); - blockBackface.css('display', 'none'); + const ShaderLib = { - const pointAttributes = pointcloud.pcoGeometry.pointAttributes; - const hasNormals = pointAttributes.hasNormals ? pointAttributes.hasNormals() : false; - if(hasNormals) { - blockBackface.css('display', 'block'); + basic: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } } - /* - opt.checkboxradio({ - clicked: (event, ui) => { - // let value = ui.item.value; - let value = ui.item.checked; - console.log(value); - material.backfaceCulling = value; // $('#set_freeze').prop("checked"); - } - }); - */ - } + ] ), - { // OPACITY - let sldOpacity = panel.find(`#sldOpacity`); - let lblOpacity = panel.find(`#lblOpacity`); + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag - sldOpacity.slider({ - value: material.opacity, - min: 0, - max: 1, - step: 0.001, - slide: function (event, ui) { - material.opacity = ui.value; - } - }); + }, - let update = (e) => { - lblOpacity.html(material.opacity.toFixed(2)); - sldOpacity.slider({value: material.opacity}); - }; - this.addVolatileListener(material, "opacity_changed", update); + phong: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), - update(); - } + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag - { + }, - const attributes = pointcloud.pcoGeometry.pointAttributes.attributes; + standard: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 1.0 }, + metalness: { value: 0.0 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), - let options = []; + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag - options.push(...attributes.map(a => a.name)); + }, - const intensityIndex = options.indexOf("intensity"); - if(intensityIndex >= 0){ - options.splice(intensityIndex + 1, 0, "intensity gradient"); + toon: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } } + ] ), - options.push( - "elevation", - "color", - 'matcap', - 'indices', - 'level of detail', - 'composite' - ); + vertexShader: ShaderChunk.meshtoon_vert, + fragmentShader: ShaderChunk.meshtoon_frag - const blacklist = [ - "POSITION_CARTESIAN", - "position", - ]; + }, - options = options.filter(o => !blacklist.includes(o)); + matcap: { - let attributeSelection = panel.find('#optMaterial'); - for(let option of options){ - let elOption = $(``); - attributeSelection.append(elOption); + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + { + matcap: { value: null } } + ] ), - let updateMaterialPanel = (event, ui) => { - let selectedValue = attributeSelection.selectmenu().val(); - material.activeAttributeName = selectedValue; + vertexShader: ShaderChunk.meshmatcap_vert, + fragmentShader: ShaderChunk.meshmatcap_frag - let attribute = pointcloud.getAttribute(selectedValue); + }, - if(selectedValue === "intensity gradient"){ - attribute = pointcloud.getAttribute("intensity"); - } + points: { - const isIntensity = attribute ? ["intensity", "intensity gradient"].includes(attribute.name) : false; + uniforms: mergeUniforms( [ + UniformsLib.points, + UniformsLib.fog + ] ), - if(isIntensity){ - if(pointcloud.material.intensityRange[0] === Infinity){ - pointcloud.material.intensityRange = attribute.range; - } + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag - const [min, max] = attribute.range; + }, - panel.find('#sldIntensityRange').slider({ - range: true, - min: min, max: max, step: 0.01, - values: [min, max], - slide: (event, ui) => { - let min = ui.values[0]; - let max = ui.values[1]; - material.intensityRange = [min, max]; - } - }); - } else if(attribute){ - const [min, max] = attribute.range; + dashed: { - let selectedRange = material.getRange(attribute.name); + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), - if(!selectedRange){ - selectedRange = [...attribute.range]; - } + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag - let minMaxAreNumbers = typeof min === "number" && typeof max === "number"; + }, - if(minMaxAreNumbers){ - panel.find('#sldExtraRange').slider({ - range: true, - min: min, - max: max, - step: 0.01, - values: selectedRange, - slide: (event, ui) => { - let [a, b] = ui.values; + depth: { - material.setRange(attribute.name, [a, b]); - } - }); - } + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), - } + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag - let blockWeights = $('#materials\\.composite_weight_container'); - let blockElevation = $('#materials\\.elevation_container'); - let blockRGB = $('#materials\\.rgb_container'); - let blockExtra = $('#materials\\.extra_container'); - let blockColor = $('#materials\\.color_container'); - let blockIntensity = $('#materials\\.intensity_container'); - let blockIndex = $('#materials\\.index_container'); - let blockTransition = $('#materials\\.transition_container'); - let blockGps = $('#materials\\.gpstime_container'); - let blockMatcap = $('#materials\\.matcap_container'); + }, - blockIndex.css('display', 'none'); - blockIntensity.css('display', 'none'); - blockElevation.css('display', 'none'); - blockRGB.css('display', 'none'); - blockExtra.css('display', 'none'); - blockColor.css('display', 'none'); - blockWeights.css('display', 'none'); - blockTransition.css('display', 'none'); - blockMatcap.css('display', 'none'); - blockGps.css('display', 'none'); + normal: { - if (selectedValue === 'composite') { - blockWeights.css('display', 'block'); - blockElevation.css('display', 'block'); - blockRGB.css('display', 'block'); - blockIntensity.css('display', 'block'); - } else if (selectedValue === 'elevation') { - blockElevation.css('display', 'block'); - } else if (selectedValue === 'RGB and Elevation') { - blockRGB.css('display', 'block'); - blockElevation.css('display', 'block'); - } else if (selectedValue === 'rgba') { - blockRGB.css('display', 'block'); - } else if (selectedValue === 'color') { - blockColor.css('display', 'block'); - } else if (selectedValue === 'intensity') { - blockIntensity.css('display', 'block'); - } else if (selectedValue === 'intensity gradient') { - blockIntensity.css('display', 'block'); - } else if (selectedValue === "indices" ){ - blockIndex.css('display', 'block'); - } else if (selectedValue === "matcap" ){ - blockMatcap.css('display', 'block'); - } else if (selectedValue === "classification" ){ - // add classification color selctor? - } else if (selectedValue === "gps-time" ){ - blockGps.css('display', 'block'); - } else if(selectedValue === "number of returns"){ - - } else if(selectedValue === "return number"){ - - } else if(["source id", "point source id"].includes(selectedValue)){ - - } else { - blockExtra.css('display', 'block'); - } - }; + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), - attributeSelection.selectmenu({change: updateMaterialPanel}); + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag - let update = () => { - attributeSelection.val(material.activeAttributeName).selectmenu('refresh'); - }; - this.addVolatileListener(material, "point_color_type_changed", update); - this.addVolatileListener(material, "active_attribute_changed", update); + }, - update(); - updateMaterialPanel(); - } + sprite: { - { - const schemes = Object.keys(Potree.Gradients).map(name => ({name: name, values: Gradients[name]})); + uniforms: mergeUniforms( [ + UniformsLib.sprite, + UniformsLib.fog + ] ), - let elSchemeContainer = panel.find("#elevation_gradient_scheme_selection"); + vertexShader: ShaderChunk.sprite_vert, + fragmentShader: ShaderChunk.sprite_frag - for(let scheme of schemes){ - let elScheme = $(` - - - `); + }, - const svg = Potree.Utils.createSvgGradient(scheme.values); - svg.setAttributeNS(null, "class", `button-icon`); + background: { - elScheme.append($(svg)); + uniforms: { + uvTransform: { value: new Matrix3() }, + t2D: { value: null }, + }, - elScheme.click( () => { - material.gradient = Gradients[scheme.name]; - }); + vertexShader: ShaderChunk.background_vert, + fragmentShader: ShaderChunk.background_frag - elSchemeContainer.append(elScheme); + }, + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: mergeUniforms( [ + UniformsLib.envmap, + { + opacity: { value: 1.0 } } - } + ] ), - { - let matcaps = [ - {name: "Normals", icon: `${Potree.resourcePath}/icons/matcap/check_normal+y.jpg`}, - {name: "Basic 1", icon: `${Potree.resourcePath}/icons/matcap/basic_1.jpg`}, - {name: "Basic 2", icon: `${Potree.resourcePath}/icons/matcap/basic_2.jpg`}, - {name: "Basic Dark", icon: `${Potree.resourcePath}/icons/matcap/basic_dark.jpg`}, - {name: "Basic Side", icon: `${Potree.resourcePath}/icons/matcap/basic_side.jpg`}, - {name: "Ceramic Dark", icon: `${Potree.resourcePath}/icons/matcap/ceramic_dark.jpg`}, - {name: "Ceramic Lightbulb", icon: `${Potree.resourcePath}/icons/matcap/ceramic_lightbulb.jpg`}, - {name: "Clay Brown", icon: `${Potree.resourcePath}/icons/matcap/clay_brown.jpg`}, - {name: "Clay Muddy", icon: `${Potree.resourcePath}/icons/matcap/clay_muddy.jpg`}, - {name: "Clay Studio", icon: `${Potree.resourcePath}/icons/matcap/clay_studio.jpg`}, - {name: "Resin", icon: `${Potree.resourcePath}/icons/matcap/resin.jpg`}, - {name: "Skin", icon: `${Potree.resourcePath}/icons/matcap/skin.jpg`}, - {name: "Jade", icon: `${Potree.resourcePath}/icons/matcap/jade.jpg`}, - {name: "Metal_ Anisotropic", icon: `${Potree.resourcePath}/icons/matcap/metal_anisotropic.jpg`}, - {name: "Metal Carpaint", icon: `${Potree.resourcePath}/icons/matcap/metal_carpaint.jpg`}, - {name: "Metal Lead", icon: `${Potree.resourcePath}/icons/matcap/metal_lead.jpg`}, - {name: "Metal Shiny", icon: `${Potree.resourcePath}/icons/matcap/metal_shiny.jpg`}, - {name: "Pearl", icon: `${Potree.resourcePath}/icons/matcap/pearl.jpg`}, - {name: "Toon", icon: `${Potree.resourcePath}/icons/matcap/toon.jpg`}, - {name: "Check Rim Light", icon: `${Potree.resourcePath}/icons/matcap/check_rim_light.jpg`}, - {name: "Check Rim Dark", icon: `${Potree.resourcePath}/icons/matcap/check_rim_dark.jpg`}, - {name: "Contours 1", icon: `${Potree.resourcePath}/icons/matcap/contours_1.jpg`}, - {name: "Contours 2", icon: `${Potree.resourcePath}/icons/matcap/contours_2.jpg`}, - {name: "Contours 3", icon: `${Potree.resourcePath}/icons/matcap/contours_3.jpg`}, - {name: "Reflection Check Horizontal", icon: `${Potree.resourcePath}/icons/matcap/reflection_check_horizontal.jpg`}, - {name: "Reflection Check Vertical", icon: `${Potree.resourcePath}/icons/matcap/reflection_check_vertical.jpg`}, - ]; + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag - let elMatcapContainer = panel.find("#matcap_scheme_selection"); + }, - for(let matcap of matcaps){ - let elMatcap = $(` - - `); + equirect: { - elMatcap.click( () => { - material.matcap = matcap.icon.substring(matcap.icon.lastIndexOf('/')); - }); + uniforms: { + tEquirect: { value: null }, + }, - elMatcapContainer.append(elMatcap); - } - } + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag - { - panel.find('#sldRGBGamma').slider({ - value: material.rgbGamma, - min: 0, max: 4, step: 0.01, - slide: (event, ui) => {material.rgbGamma = ui.value;} - }); + }, - panel.find('#sldRGBContrast').slider({ - value: material.rgbContrast, - min: -1, max: 1, step: 0.01, - slide: (event, ui) => {material.rgbContrast = ui.value;} - }); + distanceRGBA: { - panel.find('#sldRGBBrightness').slider({ - value: material.rgbBrightness, - min: -1, max: 1, step: 0.01, - slide: (event, ui) => {material.rgbBrightness = ui.value;} - }); + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1000 } + } + ] ), - panel.find('#sldExtraGamma').slider({ - value: material.extraGamma, - min: 0, max: 4, step: 0.01, - slide: (event, ui) => {material.extraGamma = ui.value;} - }); + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag - panel.find('#sldExtraBrightness').slider({ - value: material.extraBrightness, - min: -1, max: 1, step: 0.01, - slide: (event, ui) => {material.extraBrightness = ui.value;} - }); + }, - panel.find('#sldExtraContrast').slider({ - value: material.extraContrast, - min: -1, max: 1, step: 0.01, - slide: (event, ui) => {material.extraContrast = ui.value;} - }); + shadow: { - panel.find('#sldHeightRange').slider({ - range: true, - min: 0, max: 1000, step: 0.01, - values: [0, 1000], - slide: (event, ui) => { - material.heightMin = ui.values[0]; - material.heightMax = ui.values[1]; - } - }); + uniforms: mergeUniforms( [ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: new Color( 0x00000 ) }, + opacity: { value: 1.0 } + }, + ] ), - panel.find('#sldIntensityGamma').slider({ - value: material.intensityGamma, - min: 0, max: 4, step: 0.01, - slide: (event, ui) => {material.intensityGamma = ui.value;} - }); + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag - panel.find('#sldIntensityContrast').slider({ - value: material.intensityContrast, - min: -1, max: 1, step: 0.01, - slide: (event, ui) => {material.intensityContrast = ui.value;} - }); + } - panel.find('#sldIntensityBrightness').slider({ - value: material.intensityBrightness, - min: -1, max: 1, step: 0.01, - slide: (event, ui) => {material.intensityBrightness = ui.value;} - }); + }; - panel.find('#sldWeightRGB').slider({ - value: material.weightRGB, - min: 0, max: 1, step: 0.01, - slide: (event, ui) => {material.weightRGB = ui.value;} - }); + ShaderLib.physical = { - panel.find('#sldWeightIntensity').slider({ - value: material.weightIntensity, - min: 0, max: 1, step: 0.01, - slide: (event, ui) => {material.weightIntensity = ui.value;} - }); + uniforms: mergeUniforms( [ + ShaderLib.standard.uniforms, + { + clearcoat: { value: 0 }, + clearcoatMap: { value: null }, + clearcoatRoughness: { value: 0 }, + clearcoatRoughnessMap: { value: null }, + clearcoatNormalScale: { value: new Vector2( 1, 1 ) }, + clearcoatNormalMap: { value: null }, + sheen: { value: new Color( 0x000000 ) }, + transmission: { value: 0 }, + transmissionMap: { value: null }, + } + ] ), - panel.find('#sldWeightElevation').slider({ - value: material.weightElevation, - min: 0, max: 1, step: 0.01, - slide: (event, ui) => {material.weightElevation = ui.value;} - }); + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag - panel.find('#sldWeightClassification').slider({ - value: material.weightClassification, - min: 0, max: 1, step: 0.01, - slide: (event, ui) => {material.weightClassification = ui.value;} - }); + }; - panel.find('#sldWeightReturnNumber').slider({ - value: material.weightReturnNumber, - min: 0, max: 1, step: 0.01, - slide: (event, ui) => {material.weightReturnNumber = ui.value;} - }); + function WebGLBackground( renderer, cubemaps, state, objects, premultipliedAlpha ) { - panel.find('#sldWeightSourceID').slider({ - value: material.weightSourceID, - min: 0, max: 1, step: 0.01, - slide: (event, ui) => {material.weightSourceID = ui.value;} - }); + const clearColor = new Color( 0x000000 ); + let clearAlpha = 0; - panel.find(`#materials\\.color\\.picker`).spectrum({ - flat: true, - showInput: true, - preferredFormat: 'rgb', - cancelText: '', - chooseText: 'Apply', - color: `#${material.color.getHexString()}`, - move: color => { - let cRGB = color.toRgb(); - let tc = new THREE.Color().setRGB(cRGB.r / 255, cRGB.g / 255, cRGB.b / 255); - material.color = tc; - }, - change: color => { - let cRGB = color.toRgb(); - let tc = new THREE.Color().setRGB(cRGB.r / 255, cRGB.g / 255, cRGB.b / 255); - material.color = tc; - } - }); + let planeMesh; + let boxMesh; - this.addVolatileListener(material, "color_changed", () => { - panel.find(`#materials\\.color\\.picker`) - .spectrum('set', `#${material.color.getHexString()}`); - }); + let currentBackground = null; + let currentBackgroundVersion = 0; + let currentTonemapping = null; - let updateHeightRange = function () { - + function render( renderList, scene, camera, forceClear ) { - let aPosition = pointcloud.getAttribute("position"); + let background = scene.isScene === true ? scene.background : null; - let bMin, bMax; + if ( background && background.isTexture ) { - if(aPosition){ - // for new format 2.0 and loader that contain precomputed min/max of attributes - let min = aPosition.range[0][2]; - let max = aPosition.range[1][2]; - let width = max - min; + background = cubemaps.get( background ); - bMin = min - 0.2 * width; - bMax = max + 0.2 * width; - }else { - // for format up until exlusive 2.0 - let box = [pointcloud.pcoGeometry.tightBoundingBox, pointcloud.getBoundingBoxWorld()] - .find(v => v !== undefined); + } - pointcloud.updateMatrixWorld(true); - box = Utils.computeTransformedBoundingBox(box, pointcloud.matrixWorld); + // Ignore background in AR + // TODO: Reconsider this. - let bWidth = box.max.z - box.min.z; - bMin = box.min.z - 0.2 * bWidth; - bMax = box.max.z + 0.2 * bWidth; - } + const xr = renderer.xr; + const session = xr.getSession && xr.getSession(); - let range = material.elevationRange; + if ( session && session.environmentBlendMode === 'additive' ) { - panel.find('#lblHeightRange').html(`${range[0].toFixed(2)} to ${range[1].toFixed(2)}`); - panel.find('#sldHeightRange').slider({min: bMin, max: bMax, values: range}); - }; + background = null; - let updateExtraRange = function () { + } - let attributeName = material.activeAttributeName; - let attribute = pointcloud.getAttribute(attributeName); + if ( background === null ) { - if(attribute == null){ - return; - } - - let range = material.getRange(attributeName); + setClear( clearColor, clearAlpha ); - if(range == null){ - range = attribute.range; - } + } else if ( background && background.isColor ) { - // currently only supporting scalar ranges. - // rgba, normals, positions, etc have vector ranges, however - let isValidRange = (typeof range[0] === "number") && (typeof range[1] === "number"); - if(!isValidRange){ - return; - } + setClear( background, 1 ); + forceClear = true; - if(range){ - let msg = `${range[0].toFixed(2)} to ${range[1].toFixed(2)}`; - panel.find('#lblExtraRange').html(msg); - }else { - panel.find("could not deduce range"); - } - }; + } - let updateIntensityRange = function () { - let range = material.intensityRange; + if ( renderer.autoClear || forceClear ) { - panel.find('#lblIntensityRange').html(`${parseInt(range[0])} to ${parseInt(range[1])}`); - }; + renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); - { - updateHeightRange(); - panel.find(`#sldHeightRange`).slider('option', 'min'); - panel.find(`#sldHeightRange`).slider('option', 'max'); - } + } - { - let elGradientRepeat = panel.find("#gradient_repeat_option"); - elGradientRepeat.selectgroup({title: "Gradient"}); + if ( background && ( background.isCubeTexture || background.isWebGLCubeRenderTarget || background.mapping === CubeUVReflectionMapping ) ) { - elGradientRepeat.find("input").click( (e) => { - this.viewer.setElevationGradientRepeat(ElevationGradientRepeat[e.target.value]); - }); + if ( boxMesh === undefined ) { - let current = Object.keys(ElevationGradientRepeat) - .filter(key => ElevationGradientRepeat[key] === this.viewer.elevationGradientRepeat); - elGradientRepeat.find(`input[value=${current}]`).trigger("click"); - } + boxMesh = new Mesh( + new BoxBufferGeometry( 1, 1, 1 ), + new ShaderMaterial( { + name: 'BackgroundCubeMaterial', + uniforms: cloneUniforms( ShaderLib.cube.uniforms ), + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); - let onIntensityChange = () => { - let gamma = material.intensityGamma; - let contrast = material.intensityContrast; - let brightness = material.intensityBrightness; + boxMesh.geometry.deleteAttribute( 'normal' ); + boxMesh.geometry.deleteAttribute( 'uv' ); - updateIntensityRange(); + boxMesh.onBeforeRender = function ( renderer, scene, camera ) { - panel.find('#lblIntensityGamma').html(gamma.toFixed(2)); - panel.find('#lblIntensityContrast').html(contrast.toFixed(2)); - panel.find('#lblIntensityBrightness').html(brightness.toFixed(2)); + this.matrixWorld.copyPosition( camera.matrixWorld ); - panel.find('#sldIntensityGamma').slider({value: gamma}); - panel.find('#sldIntensityContrast').slider({value: contrast}); - panel.find('#sldIntensityBrightness').slider({value: brightness}); - }; + }; - let onRGBChange = () => { - let gamma = material.rgbGamma; - let contrast = material.rgbContrast; - let brightness = material.rgbBrightness; + // enable code injection for non-built-in material + Object.defineProperty( boxMesh.material, 'envMap', { - panel.find('#lblRGBGamma').html(gamma.toFixed(2)); - panel.find('#lblRGBContrast').html(contrast.toFixed(2)); - panel.find('#lblRGBBrightness').html(brightness.toFixed(2)); + get: function () { - panel.find('#sldRGBGamma').slider({value: gamma}); - panel.find('#sldRGBContrast').slider({value: contrast}); - panel.find('#sldRGBBrightness').slider({value: brightness}); - }; + return this.uniforms.envMap.value; - this.addVolatileListener(material, "material_property_changed", updateExtraRange); - this.addVolatileListener(material, "material_property_changed", updateHeightRange); - this.addVolatileListener(material, "material_property_changed", onIntensityChange); - this.addVolatileListener(material, "material_property_changed", onRGBChange); + } - updateExtraRange(); - updateHeightRange(); - onIntensityChange(); - onRGBChange(); - } + } ); - } + objects.update( boxMesh ); - + } - setMeasurement(object){ + if ( background.isWebGLCubeRenderTarget ) { - let TYPE = { - DISTANCE: {panel: DistancePanel}, - AREA: {panel: AreaPanel}, - POINT: {panel: PointPanel}, - ANGLE: {panel: AnglePanel}, - HEIGHT: {panel: HeightPanel}, - PROFILE: {panel: ProfilePanel}, - VOLUME: {panel: VolumePanel}, - CIRCLE: {panel: CirclePanel}, - OTHER: {panel: PointPanel}, - }; + // TODO Deprecate + + background = background.texture; - let getType = (measurement) => { - if (measurement instanceof Measure) { - if (measurement.showDistances && !measurement.showArea && !measurement.showAngles) { - return TYPE.DISTANCE; - } else if (measurement.showDistances && measurement.showArea && !measurement.showAngles) { - return TYPE.AREA; - } else if (measurement.maxMarkers === 1) { - return TYPE.POINT; - } else if (!measurement.showDistances && !measurement.showArea && measurement.showAngles) { - return TYPE.ANGLE; - } else if (measurement.showHeight) { - return TYPE.HEIGHT; - } else if (measurement.showCircle) { - return TYPE.CIRCLE; - } else { - return TYPE.OTHER; - } - } else if (measurement instanceof Profile) { - return TYPE.PROFILE; - } else if (measurement instanceof Volume) { - return TYPE.VOLUME; } - }; - //this.container.html("measurement"); + boxMesh.material.uniforms.envMap.value = background; + boxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background._needsFlipEnvMap ) ? - 1 : 1; - let type = getType(object); - let Panel = type.panel; + if ( currentBackground !== background || + currentBackgroundVersion !== background.version || + currentTonemapping !== renderer.toneMapping ) { - let panel = new Panel(this.viewer, object, this); - this.container.append(panel.elContent); - } + boxMesh.material.needsUpdate = true; - setCamera(camera){ - let panel = new CameraPanel(this.viewer, this); - this.container.append(panel.elContent); - } + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; - setAnnotation(annotation){ - let panel = new AnnotationPanel(this.viewer, this, annotation); - this.container.append(panel.elContent); - } + } - setCameraAnimation(animation){ - let panel = new CameraAnimationPanel(this.viewer, this, animation); - this.container.append(panel.elContent); - } + // push to the pre-sorted opaque render list + renderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null ); + + } else if ( background && background.isTexture ) { + + if ( planeMesh === undefined ) { + + planeMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new ShaderMaterial( { + name: 'BackgroundMaterial', + uniforms: cloneUniforms( ShaderLib.background.uniforms ), + vertexShader: ShaderLib.background.vertexShader, + fragmentShader: ShaderLib.background.fragmentShader, + side: FrontSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); - } + planeMesh.geometry.deleteAttribute( 'normal' ); - function addCommas(nStr){ - nStr += ''; - let x = nStr.split('.'); - let x1 = x[0]; - let x2 = x.length > 1 ? '.' + x[1] : ''; - let rgx = /(\d+)(\d{3})/; - while (rgx.test(x1)) { - x1 = x1.replace(rgx, '$1' + ',' + '$2'); - } - return x1 + x2; - }; - - function format(value){ - return addCommas(value.toFixed(3)); - }; - - class HierarchicalSlider{ - - constructor(params = {}){ - - this.element = document.createElement("div"); - - this.labels = []; - this.sliders = []; - this.range = params.range != null ? params.range : [0, 1]; - this.slide = params.slide != null ? params.slide : null; - this.step = params.step != null ? params.step : 0.0001; - - let levels = params.levels != null ? params.levels : 1; - - for(let level = 0; level < levels; level++){ - this.addLevel(); - } - - } - - setRange(range){ - this.range = [...range]; - - { // root slider - let slider = this.sliders[0]; - - $(slider).slider({ - min: range[0], - max: range[1], - }); - } - - for(let i = 1; i < this.sliders.length; i++){ - let parentSlider = this.sliders[i - 1]; - let slider = this.sliders[i]; - - let parentValues = $(parentSlider).slider("option", "values"); - let childRange = [...parentValues]; - - $(slider).slider({ - min: childRange[0], - max: childRange[1], - }); - } - - this.updateLabels(); - } - - setValues(values){ - for(let slider of this.sliders){ - $(slider).slider({ - values: [...values], - }); - } - - this.updateLabels(); - } - - addLevel(){ - const elLevel = document.createElement("li"); - const elRange = document.createTextNode("Range: "); - const label = document.createElement("span"); - const slider = document.createElement("div"); - - let level = this.sliders.length; - let [min, max] = [0, 0]; - - if(this.sliders.length === 0){ - [min, max] = this.range; - }else { - let parentSlider = this.sliders[this.sliders.length - 1]; - [min, max] = $(parentSlider).slider("option", "values"); - } - - $(slider).slider({ - range: true, - min: min, - max: max, - step: this.step, - values: [min, max], - slide: (event, ui) => { - - // set all descendants to same range - let levels = this.sliders.length; - for(let i = level + 1; i < levels; i++){ - let descendant = this.sliders[i]; - - $(descendant).slider({ - range: true, - min: ui.values[0], - max: ui.values[1], - values: [...ui.values], - }); - } - - if(this.slide){ - let values = [...ui.values]; - - this.slide({ - target: this, - range: this.range, - values: values, - }); - } - - this.updateLabels(); - }, - }); - - elLevel.append(elRange, label, slider); - - this.sliders.push(slider); - this.labels.push(label); - this.element.append(elLevel); - - this.updateLabels(); - } - - removeLevel(){ - - } - - updateSliders(){ - - } - - updateLabels(){ - - let levels = this.sliders.length; - - for(let i = 0; i < levels; i++){ - - let slider = this.sliders[i]; - let label = this.labels[i]; - - let [min, max] = $(slider).slider("option", "values"); - let strMin = format(min); - let strMax = format(max); - let strLabel = `${strMin} to ${strMax}`; - - label.innerHTML = strLabel; - } - - } - - - } + // enable code injection for non-built-in material + Object.defineProperty( planeMesh.material, 'map', { - class OrientedImageControls extends EventDispatcher{ - - constructor(viewer){ - super(); - - this.viewer = viewer; - this.renderer = viewer.renderer; + get: function () { - this.originalCam = viewer.scene.getActiveCamera(); - this.shearCam = viewer.scene.getActiveCamera().clone(); - this.shearCam.rotation.set(this.originalCam.rotation.toArray()); - this.shearCam.updateProjectionMatrix(); - this.shearCam.updateProjectionMatrix = () => { - return this.shearCam.projectionMatrix; - }; + return this.uniforms.t2D.value; - this.image = null; + } - this.fadeFactor = 20; - this.fovDelta = 0; + } ); - this.fovMin = 0.1; - this.fovMax = 120; + objects.update( planeMesh ); - this.shear = [0, 0]; + } - // const style = ``; - this.elUp = $(``); - this.elRight = $(``); - this.elDown = $(``); - this.elLeft = $(``); - this.elExit = $(``); + planeMesh.material.uniforms.t2D.value = background; - this.elExit.click( () => { - this.release(); - }); + if ( background.matrixAutoUpdate === true ) { - this.elUp.click(() => { - const fovY = viewer.getFOV(); - const top = Math.tan(THREE.Math.degToRad(fovY / 2)); - this.shear[1] += 0.1 * top; - }); + background.updateMatrix(); - this.elRight.click(() => { - const fovY = viewer.getFOV(); - const top = Math.tan(THREE.Math.degToRad(fovY / 2)); - this.shear[0] += 0.1 * top; - }); + } - this.elDown.click(() => { - const fovY = viewer.getFOV(); - const top = Math.tan(THREE.Math.degToRad(fovY / 2)); - this.shear[1] -= 0.1 * top; - }); + planeMesh.material.uniforms.uvTransform.value.copy( background.matrix ); - this.elLeft.click(() => { - const fovY = viewer.getFOV(); - const top = Math.tan(THREE.Math.degToRad(fovY / 2)); - this.shear[0] -= 0.1 * top; - }); + if ( currentBackground !== background || + currentBackgroundVersion !== background.version || + currentTonemapping !== renderer.toneMapping ) { - this.scene = null; - this.sceneControls = new THREE.Scene(); + planeMesh.material.needsUpdate = true; - let scroll = (e) => { - this.fovDelta += -e.delta * 1.0; - }; + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; - this.addEventListener('mousewheel', scroll); - //this.addEventListener("mousemove", onMove); - } + } - hasSomethingCaptured(){ - return this.image !== null; - } - capture(image){ - if(this.hasSomethingCaptured()){ - return; + // push to the pre-sorted opaque render list + renderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null ); + } - this.image = image; + } - this.originalFOV = this.viewer.getFOV(); - this.originalControls = this.viewer.getControls(); + function setClear( color, alpha ) { - this.viewer.setControls(this); - this.viewer.scene.overrideCamera = this.shearCam; + state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha ); - const elCanvas = this.viewer.renderer.domElement; - const elRoot = $(elCanvas.parentElement); + } - this.shear = [0, 0]; + return { + getClearColor: function () { - elRoot.append(this.elUp); - elRoot.append(this.elRight); - elRoot.append(this.elDown); - elRoot.append(this.elLeft); - elRoot.append(this.elExit); - } + return clearColor; - release(){ - this.image = null; + }, + setClearColor: function ( color, alpha = 1 ) { - this.viewer.scene.overrideCamera = null; + clearColor.set( color ); + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); - this.elUp.detach(); - this.elRight.detach(); - this.elDown.detach(); - this.elLeft.detach(); - this.elExit.detach(); + }, + getClearAlpha: function () { - this.viewer.setFOV(this.originalFOV); - this.viewer.setControls(this.originalControls); - } + return clearAlpha; - setScene (scene) { - this.scene = scene; - } + }, + setClearAlpha: function ( alpha ) { - update (delta) { - // const view = this.scene.view; + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); - // let prevTotal = this.shearCam.projectionMatrix.elements.reduce( (a, i) => a + i, 0); + }, + render: render - //const progression = Math.min(1, this.fadeFactor * delta); - //const attenuation = Math.max(0, 1 - this.fadeFactor * delta); - const progression = 1; - const attenuation = 0; + }; - const oldFov = this.viewer.getFOV(); - let fovProgression = progression * this.fovDelta; - let newFov = oldFov * ((1 + fovProgression / 10)); + } - newFov = Math.max(this.fovMin, newFov); - newFov = Math.min(this.fovMax, newFov); + function WebGLBindingStates( gl, extensions, attributes, capabilities ) { - let diff = newFov / oldFov; + const maxVertexAttributes = gl.getParameter( 34921 ); - const mouse = this.viewer.inputHandler.mouse; - const canvasSize = this.viewer.renderer.getSize(new THREE.Vector2()); - const uv = [ - (mouse.x / canvasSize.x), - ((canvasSize.y - mouse.y) / canvasSize.y) - ]; + const extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' ); + const vaoAvailable = capabilities.isWebGL2 || extension !== null; - const fovY = newFov; - const aspect = canvasSize.x / canvasSize.y; - const top = Math.tan(THREE.Math.degToRad(fovY / 2)); - const height = 2 * top; - const width = aspect * height; + const bindingStates = {}; - const shearRangeX = [ - this.shear[0] - 0.5 * width, - this.shear[0] + 0.5 * width, - ]; + const defaultState = createBindingState( null ); + let currentState = defaultState; - const shearRangeY = [ - this.shear[1] - 0.5 * height, - this.shear[1] + 0.5 * height, - ]; + function setup( object, material, program, geometry, index ) { - const shx = (1 - uv[0]) * shearRangeX[0] + uv[0] * shearRangeX[1]; - const shy = (1 - uv[1]) * shearRangeY[0] + uv[1] * shearRangeY[1]; + let updateBuffers = false; - const shu = (1 - diff); + if ( vaoAvailable ) { - const newShear = [ - (1 - shu) * this.shear[0] + shu * shx, - (1 - shu) * this.shear[1] + shu * shy, - ]; - - this.shear = newShear; - this.viewer.setFOV(newFov); - - const {originalCam, shearCam} = this; + const state = getBindingState( geometry, program, material ); - originalCam.fov = newFov; - originalCam.updateMatrixWorld(); - originalCam.updateProjectionMatrix(); - shearCam.copy(originalCam); - shearCam.rotation.set(...originalCam.rotation.toArray()); + if ( currentState !== state ) { - shearCam.updateMatrixWorld(); - shearCam.projectionMatrix.copy(originalCam.projectionMatrix); + currentState = state; + bindVertexArrayObject( currentState.object ); - const [sx, sy] = this.shear; - const mShear = new THREE.Matrix4().set( - 1, 0, sx, 0, - 0, 1, sy, 0, - 0, 0, 1, 0, - 0, 0, 0, 1, - ); + } - const proj = shearCam.projectionMatrix; - proj.multiply(mShear); - shearCam.projectionMatrixInverse.getInverse( proj ); + updateBuffers = needsUpdate( geometry, index ); - let total = shearCam.projectionMatrix.elements.reduce( (a, i) => a + i, 0); + if ( updateBuffers ) saveCache( geometry, index ); - this.fovDelta *= attenuation; - } - }; + } else { - // https://support.pix4d.com/hc/en-us/articles/205675256-How-are-yaw-pitch-roll-defined - // https://support.pix4d.com/hc/en-us/articles/202558969-How-are-omega-phi-kappa-defined - - function createMaterial(){ - - let vertexShader = ` - uniform float uNear; - varying vec2 vUV; - varying vec4 vDebug; - - void main(){ - vDebug = vec4(0.0, 1.0, 0.0, 1.0); - vec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0); - // make sure that this mesh is at least in front of the near plane - modelViewPosition.xyz += normalize(modelViewPosition.xyz) * uNear; - gl_Position = projectionMatrix * modelViewPosition; - vUV = uv; - } - `; - - let fragmentShader = ` - uniform sampler2D tColor; - uniform float uOpacity; - varying vec2 vUV; - varying vec4 vDebug; - void main(){ - vec4 color = texture2D(tColor, vUV); - gl_FragColor = color; - gl_FragColor.a = uOpacity; - } - `; - const material = new THREE.ShaderMaterial( { - uniforms: { - // time: { value: 1.0 }, - // resolution: { value: new THREE.Vector2() } - tColor: {value: new THREE.Texture() }, - uNear: {value: 0.0}, - uOpacity: {value: 1.0}, - }, - vertexShader: vertexShader, - fragmentShader: fragmentShader, - side: THREE.DoubleSide, - } ); - - material.side = THREE.DoubleSide; - - return material; - } - - const planeGeometry = new THREE.PlaneGeometry(1, 1); - const lineGeometry = new THREE.Geometry(); - - lineGeometry.vertices.push( - new THREE.Vector3(-0.5, -0.5, 0), - new THREE.Vector3( 0.5, -0.5, 0), - new THREE.Vector3( 0.5, 0.5, 0), - new THREE.Vector3(-0.5, 0.5, 0), - new THREE.Vector3(-0.5, -0.5, 0), - ); - - class OrientedImage{ - - constructor(id){ - - this.id = id; - this.fov = 1.0; - this.position = new THREE.Vector3(); - this.rotation = new THREE.Vector3(); - this.width = 0; - this.height = 0; - this.fov = 1.0; - - const material = createMaterial(); - const lineMaterial = new THREE.LineBasicMaterial( { color: 0x00ff00 } ); - this.mesh = new THREE.Mesh(planeGeometry, material); - this.line = new THREE.Line(lineGeometry, lineMaterial); - this.texture = null; - - this.mesh.orientedImage = this; - } - - set(position, rotation, dimension, fov){ - - let radians = rotation.map(THREE.Math.degToRad); - - this.position.set(...position); - this.mesh.position.set(...position); - - this.rotation.set(...radians); - this.mesh.rotation.set(...radians); - - [this.width, this.height] = dimension; - this.mesh.scale.set(this.width / this.height, 1, 1); - - this.fov = fov; - - this.updateTransform(); - } - - updateTransform(){ - let {mesh, line, fov} = this; - - mesh.updateMatrixWorld(); - const dir = mesh.getWorldDirection(); - const alpha = THREE.Math.degToRad(fov / 2); - const d = -0.5 / Math.tan(alpha); - const move = dir.clone().multiplyScalar(d); - mesh.position.add(move); - - line.position.copy(mesh.position); - line.scale.copy(mesh.scale); - line.rotation.copy(mesh.rotation); - } - - }; - - class OrientedImages extends EventDispatcher{ - - constructor(){ - super(); - - this.node = null; - this.cameraParams = null; - this.imageParams = null; - this.images = null; - this._visible = true; - } - - set visible(visible){ - if(this._visible === visible){ - return; - } - - for(const image of this.images){ - image.mesh.visible = visible; - image.line.visible = visible; - } - - this._visible = visible; - this.dispatchEvent({ - type: "visibility_changed", - images: this, - }); - } - - get visible(){ - return this._visible; - } - - - }; - - class OrientedImageLoader{ - - static async loadCameraParams(path){ - const res = await fetch(path); - const text = await res.text(); - - const parser = new DOMParser(); - const doc = parser.parseFromString(text, "application/xml"); - - const width = parseInt(doc.getElementsByTagName("width")[0].textContent); - const height = parseInt(doc.getElementsByTagName("height")[0].textContent); - const f = parseFloat(doc.getElementsByTagName("f")[0].textContent); - - let a = (height / 2) / f; - let fov = 2 * THREE.Math.radToDeg(Math.atan(a)); - - const params = { - path: path, - width: width, - height: height, - f: f, - fov: fov, - }; - - return params; - } - - static async loadImageParams(path){ - - const response = await fetch(path); - if(!response.ok){ - console.error(`failed to load ${path}`); - return; - } - - const content = await response.text(); - const lines = content.split(/\r?\n/); - const imageParams = []; - - for(let i = 1; i < lines.length; i++){ - const line = lines[i]; - - if(line.startsWith("#")){ - continue; - } - - const tokens = line.split(/\s+/); - - if(tokens.length < 6){ - continue; - } - - const params = { - id: tokens[0], - x: Number.parseFloat(tokens[1]), - y: Number.parseFloat(tokens[2]), - z: Number.parseFloat(tokens[3]), - omega: Number.parseFloat(tokens[4]), - phi: Number.parseFloat(tokens[5]), - kappa: Number.parseFloat(tokens[6]), - }; - - // const whitelist = ["47518.jpg"]; - // if(whitelist.includes(params.id)){ - // imageParams.push(params); - // } - imageParams.push(params); - } - - // debug - //return [imageParams[50]]; - - return imageParams; - } - - static async load(cameraParamsPath, imageParamsPath, viewer){ - - const tStart = performance.now(); - - const [cameraParams, imageParams] = await Promise.all([ - OrientedImageLoader.loadCameraParams(cameraParamsPath), - OrientedImageLoader.loadImageParams(imageParamsPath), - ]); - - const orientedImageControls = new OrientedImageControls(viewer); - const raycaster = new THREE.Raycaster(); - - const tEnd = performance.now(); - console.log(tEnd - tStart); - - // const sp = new THREE.PlaneGeometry(1, 1); - // const lg = new THREE.Geometry(); - - // lg.vertices.push( - // new THREE.Vector3(-0.5, -0.5, 0), - // new THREE.Vector3( 0.5, -0.5, 0), - // new THREE.Vector3( 0.5, 0.5, 0), - // new THREE.Vector3(-0.5, 0.5, 0), - // new THREE.Vector3(-0.5, -0.5, 0), - // ); - - const {width, height} = cameraParams; - const orientedImages = []; - const sceneNode = new THREE.Object3D(); - sceneNode.name = "oriented_images"; - - for(const params of imageParams){ - - // const material = createMaterial(); - // const lm = new THREE.LineBasicMaterial( { color: 0x00ff00 } ); - // const mesh = new THREE.Mesh(sp, material); - - const {x, y, z, omega, phi, kappa} = params; - // const [rx, ry, rz] = [omega, phi, kappa] - // .map(THREE.Math.degToRad); - - // mesh.position.set(x, y, z); - // mesh.scale.set(width / height, 1, 1); - // mesh.rotation.set(rx, ry, rz); - // { - // mesh.updateMatrixWorld(); - // const dir = mesh.getWorldDirection(); - // const alpha = THREE.Math.degToRad(cameraParams.fov / 2); - // const d = -0.5 / Math.tan(alpha); - // const move = dir.clone().multiplyScalar(d); - // mesh.position.add(move); - // } - // sceneNode.add(mesh); - - // const line = new THREE.Line(lg, lm); - // line.position.copy(mesh.position); - // line.scale.copy(mesh.scale); - // line.rotation.copy(mesh.rotation); - // sceneNode.add(line); - - let orientedImage = new OrientedImage(params.id); - // orientedImage.setPosition(x, y, z); - // orientedImage.setRotation(omega, phi, kappa); - // orientedImage.setDimension(width, height); - let position = [x, y, z]; - let rotation = [omega, phi, kappa]; - let dimension = [width, height]; - orientedImage.set(position, rotation, dimension, cameraParams.fov); - - sceneNode.add(orientedImage.mesh); - sceneNode.add(orientedImage.line); - - orientedImages.push(orientedImage); - } - - let hoveredElement = null; - let clipVolume = null; - - const onMouseMove = (evt) => { - const tStart = performance.now(); - if(hoveredElement){ - hoveredElement.line.material.color.setRGB(0, 1, 0); - } - evt.preventDefault(); - - //var array = getMousePosition( container, evt.clientX, evt.clientY ); - const rect = viewer.renderer.domElement.getBoundingClientRect(); - const [x, y] = [evt.clientX, evt.clientY]; - const array = [ - ( x - rect.left ) / rect.width, - ( y - rect.top ) / rect.height - ]; - const onClickPosition = new THREE.Vector2(...array); - //const intersects = getIntersects(onClickPosition, scene.children); - const camera = viewer.scene.getActiveCamera(); - const mouse = new THREE.Vector3( - + ( onClickPosition.x * 2 ) - 1, - - ( onClickPosition.y * 2 ) + 1 ); - const objects = orientedImages.map(i => i.mesh); - raycaster.setFromCamera( mouse, camera ); - const intersects = raycaster.intersectObjects( objects ); - let selectionChanged = false; - - if ( intersects.length > 0){ - //console.log(intersects); - const intersection = intersects[0]; - const orientedImage = intersection.object.orientedImage; - orientedImage.line.material.color.setRGB(1, 0, 0); - selectionChanged = hoveredElement !== orientedImage; - hoveredElement = orientedImage; - }else { - hoveredElement = null; - } - - let shouldRemoveClipVolume = clipVolume !== null && hoveredElement === null; - let shouldAddClipVolume = clipVolume === null && hoveredElement !== null; - - if(clipVolume !== null && (hoveredElement === null || selectionChanged)){ - // remove existing - viewer.scene.removePolygonClipVolume(clipVolume); - clipVolume = null; - } - - if(shouldAddClipVolume || selectionChanged){ - const img = hoveredElement; - const fov = cameraParams.fov; - const aspect = cameraParams.width / cameraParams.height; - const near = 1.0; - const far = 1000 * 1000; - const camera = new THREE.PerspectiveCamera(fov, aspect, near, far); - camera.rotation.order = viewer.scene.getActiveCamera().rotation.order; - camera.rotation.copy(img.mesh.rotation); - { - const mesh = img.mesh; - const dir = mesh.getWorldDirection(); - const pos = mesh.position; - const alpha = THREE.Math.degToRad(fov / 2); - const d = 0.5 / Math.tan(alpha); - const newCamPos = pos.clone().add(dir.clone().multiplyScalar(d)); - const newCamDir = pos.clone().sub(newCamPos); - const newCamTarget = new THREE.Vector3().addVectors( - newCamPos, - newCamDir.clone().multiplyScalar(viewer.getMoveSpeed())); - camera.position.copy(newCamPos); - } - let volume = new Potree.PolygonClipVolume(camera); - let m0 = new THREE.Mesh(); - let m1 = new THREE.Mesh(); - let m2 = new THREE.Mesh(); - let m3 = new THREE.Mesh(); - m0.position.set(-1, -1, 0); - m1.position.set( 1, -1, 0); - m2.position.set( 1, 1, 0); - m3.position.set(-1, 1, 0); - volume.markers.push(m0, m1, m2, m3); - volume.initialized = true; - - viewer.scene.addPolygonClipVolume(volume); - clipVolume = volume; - } - const tEnd = performance.now(); - //console.log(tEnd - tStart); - }; - - const moveToImage = (image) => { - console.log("move to image " + image.id); - - const mesh = image.mesh; - const newCamPos = image.position.clone(); - const newCamTarget = mesh.position.clone(); - - viewer.scene.view.setView(newCamPos, newCamTarget, 500, () => { - orientedImageControls.capture(image); - }); - - if(image.texture === null){ - - const target = image; - - const tmpImagePath = `${Potree.resourcePath}/images/loading.jpg`; - new THREE.TextureLoader().load(tmpImagePath, - (texture) => { - if(target.texture === null){ - target.texture = texture; - target.mesh.material.uniforms.tColor.value = texture; - mesh.material.needsUpdate = true; - } - } - ); - - const imagePath = `${imageParamsPath}/../${target.id}`; - new THREE.TextureLoader().load(imagePath, - (texture) => { - target.texture = texture; - target.mesh.material.uniforms.tColor.value = texture; - mesh.material.needsUpdate = true; - } - ); - - - } - }; - - const onMouseClick = (evt) => { - - if(orientedImageControls.hasSomethingCaptured()){ - return; - } - - if(hoveredElement){ - moveToImage(hoveredElement); - } - }; - viewer.renderer.domElement.addEventListener( 'mousemove', onMouseMove, false ); - viewer.renderer.domElement.addEventListener( 'mousedown', onMouseClick, false ); - - viewer.addEventListener("update", () => { - - for(const image of orientedImages){ - const world = image.mesh.matrixWorld; - const {width, height} = image; - const aspect = width / height; - - const camera = viewer.scene.getActiveCamera(); - - const imgPos = image.mesh.getWorldPosition(new THREE.Vector3()); - const camPos = camera.position; - const d = camPos.distanceTo(imgPos); - - const minSize = 1; // in degrees of fov - const a = THREE.Math.degToRad(minSize); - let r = d * Math.tan(a); - r = Math.max(r, 1); - - - image.mesh.scale.set(r * aspect, r, 1); - image.line.scale.set(r * aspect, r, 1); - - image.mesh.material.uniforms.uNear.value = camera.near; - - } - - }); - - const images = new OrientedImages(); - images.node = sceneNode; - images.cameraParamsPath = cameraParamsPath; - images.imageParamsPath = imageParamsPath; - images.cameraParams = cameraParams; - images.imageParams = imageParams; - images.images = orientedImages; - - Potree.debug.moveToImage = moveToImage; - - return images; - } - } + const wireframe = ( material.wireframe === true ); - let sg = new THREE.SphereGeometry(1, 8, 8); - let sgHigh = new THREE.SphereGeometry(1, 128, 128); - - let sm = new THREE.MeshBasicMaterial({side: THREE.BackSide}); - let smHovered = new THREE.MeshBasicMaterial({side: THREE.BackSide, color: 0xff0000}); - - let raycaster = new THREE.Raycaster(); - let currentlyHovered = null; - - let previousView = { - controls: null, - position: null, - target: null, - }; - - class Image360{ - - constructor(file, time, longitude, latitude, altitude, course, pitch, roll){ - this.file = file; - this.time = time; - this.longitude = longitude; - this.latitude = latitude; - this.altitude = altitude; - this.course = course; - this.pitch = pitch; - this.roll = roll; - this.mesh = null; - } - }; - - class Images360 extends EventDispatcher{ - - constructor(viewer){ - super(); - - this.viewer = viewer; - - this.selectingEnabled = true; - - this.images = []; - this.node = new THREE.Object3D(); - - this.sphere = new THREE.Mesh(sgHigh, sm); - this.sphere.visible = false; - this.sphere.scale.set(1000, 1000, 1000); - this.node.add(this.sphere); - this._visible = true; - // this.node.add(label); - - this.focusedImage = null; - - let elUnfocus = document.createElement("input"); - elUnfocus.type = "button"; - elUnfocus.value = "unfocus"; - elUnfocus.style.position = "absolute"; - elUnfocus.style.right = "10px"; - elUnfocus.style.bottom = "10px"; - elUnfocus.style.zIndex = "10000"; - elUnfocus.style.fontSize = "2em"; - elUnfocus.addEventListener("click", () => this.unfocus()); - this.elUnfocus = elUnfocus; - - this.domRoot = viewer.renderer.domElement.parentElement; - this.domRoot.appendChild(elUnfocus); - this.elUnfocus.style.display = "none"; - - viewer.addEventListener("update", () => { + if ( currentState.geometry !== geometry.id || + currentState.program !== program.id || + currentState.wireframe !== wireframe ) { + + currentState.geometry = geometry.id; + currentState.program = program.id; + currentState.wireframe = wireframe; + + updateBuffers = true; + + } + + } + + if ( object.isInstancedMesh === true ) { + + updateBuffers = true; + + } + + if ( index !== null ) { + + attributes.update( index, 34963 ); + + } + + if ( updateBuffers ) { + + setupVertexAttributes( object, material, program, geometry ); + + if ( index !== null ) { + + gl.bindBuffer( 34963, attributes.get( index ).buffer ); + + } + + } + + } + + function createVertexArrayObject() { + + if ( capabilities.isWebGL2 ) return gl.createVertexArray(); + + return extension.createVertexArrayOES(); + + } + + function bindVertexArrayObject( vao ) { + + if ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao ); + + return extension.bindVertexArrayOES( vao ); + + } + + function deleteVertexArrayObject( vao ) { + + if ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao ); + + return extension.deleteVertexArrayOES( vao ); + + } + + function getBindingState( geometry, program, material ) { + + const wireframe = ( material.wireframe === true ); + + let programMap = bindingStates[ geometry.id ]; + + if ( programMap === undefined ) { + + programMap = {}; + bindingStates[ geometry.id ] = programMap; + + } + + let stateMap = programMap[ program.id ]; + + if ( stateMap === undefined ) { + + stateMap = {}; + programMap[ program.id ] = stateMap; + + } + + let state = stateMap[ wireframe ]; + + if ( state === undefined ) { + + state = createBindingState( createVertexArrayObject() ); + stateMap[ wireframe ] = state; + + } + + return state; + + } + + function createBindingState( vao ) { + + const newAttributes = []; + const enabledAttributes = []; + const attributeDivisors = []; + + for ( let i = 0; i < maxVertexAttributes; i ++ ) { + + newAttributes[ i ] = 0; + enabledAttributes[ i ] = 0; + attributeDivisors[ i ] = 0; + + } + + return { + + // for backward compatibility on non-VAO support browser + geometry: null, + program: null, + wireframe: false, + + newAttributes: newAttributes, + enabledAttributes: enabledAttributes, + attributeDivisors: attributeDivisors, + object: vao, + attributes: {}, + index: null + + }; + + } + + function needsUpdate( geometry, index ) { + + const cachedAttributes = currentState.attributes; + const geometryAttributes = geometry.attributes; + + let attributesNum = 0; + + for ( const key in geometryAttributes ) { + + const cachedAttribute = cachedAttributes[ key ]; + const geometryAttribute = geometryAttributes[ key ]; + + if ( cachedAttribute === undefined ) return true; + + if ( cachedAttribute.attribute !== geometryAttribute ) return true; + + if ( cachedAttribute.data !== geometryAttribute.data ) return true; + + attributesNum ++; + + } + + if ( currentState.attributesNum !== attributesNum ) return true; + + if ( currentState.index !== index ) return true; + + return false; + + } + + function saveCache( geometry, index ) { + + const cache = {}; + const attributes = geometry.attributes; + let attributesNum = 0; + + for ( const key in attributes ) { + + const attribute = attributes[ key ]; + + const data = {}; + data.attribute = attribute; + + if ( attribute.data ) { + + data.data = attribute.data; + + } + + cache[ key ] = data; + + attributesNum ++; + + } + + currentState.attributes = cache; + currentState.attributesNum = attributesNum; + + currentState.index = index; + + } + + function initAttributes() { + + const newAttributes = currentState.newAttributes; + + for ( let i = 0, il = newAttributes.length; i < il; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + enableAttributeAndDivisor( attribute, 0 ); + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + const attributeDivisors = currentState.attributeDivisors; + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + const extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' ); + + extension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + + for ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function vertexAttribPointer( index, size, type, normalized, stride, offset ) { + + if ( capabilities.isWebGL2 === true && ( type === 5124 || type === 5125 ) ) { + + gl.vertexAttribIPointer( index, size, type, stride, offset ); + + } else { + + gl.vertexAttribPointer( index, size, type, normalized, stride, offset ); + + } + + } + + function setupVertexAttributes( object, material, program, geometry ) { + + if ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return; + + } + + initAttributes(); + + const geometryAttributes = geometry.attributes; + + const programAttributes = program.getAttributes(); + + const materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( const name in programAttributes ) { + + const programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + const geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + const normalized = geometryAttribute.normalized; + const size = geometryAttribute.itemSize; + + const attribute = attributes.get( geometryAttribute ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + const buffer = attribute.buffer; + const type = attribute.type; + const bytesPerElement = attribute.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + const data = geometryAttribute.data; + const stride = data.stride; + const offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + enableAttributeAndDivisor( programAttribute, data.meshPerAttribute ); + + if ( geometry._maxInstanceCount === undefined ) { + + geometry._maxInstanceCount = data.meshPerAttribute * data.count; + + } + + } else { + + enableAttribute( programAttribute ); + + } + + gl.bindBuffer( 34962, buffer ); + vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute ); + + if ( geometry._maxInstanceCount === undefined ) { + + geometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + enableAttribute( programAttribute ); + + } + + gl.bindBuffer( 34962, buffer ); + vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 ); + + } + + } else if ( name === 'instanceMatrix' ) { + + const attribute = attributes.get( object.instanceMatrix ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + const buffer = attribute.buffer; + const type = attribute.type; + + enableAttributeAndDivisor( programAttribute + 0, 1 ); + enableAttributeAndDivisor( programAttribute + 1, 1 ); + enableAttributeAndDivisor( programAttribute + 2, 1 ); + enableAttributeAndDivisor( programAttribute + 3, 1 ); + + gl.bindBuffer( 34962, buffer ); + + gl.vertexAttribPointer( programAttribute + 0, 4, type, false, 64, 0 ); + gl.vertexAttribPointer( programAttribute + 1, 4, type, false, 64, 16 ); + gl.vertexAttribPointer( programAttribute + 2, 4, type, false, 64, 32 ); + gl.vertexAttribPointer( programAttribute + 3, 4, type, false, 64, 48 ); + + } else if ( name === 'instanceColor' ) { + + const attribute = attributes.get( object.instanceColor ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + const buffer = attribute.buffer; + const type = attribute.type; + + enableAttributeAndDivisor( programAttribute, 1 ); + + gl.bindBuffer( 34962, buffer ); + + gl.vertexAttribPointer( programAttribute, 3, type, false, 12, 0 ); + + } else if ( materialDefaultAttributeValues !== undefined ) { + + const value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + disableUnusedAttributes(); + + } + + function dispose() { + + reset(); + + for ( const geometryId in bindingStates ) { + + const programMap = bindingStates[ geometryId ]; + + for ( const programId in programMap ) { + + const stateMap = programMap[ programId ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ programId ]; + + } + + delete bindingStates[ geometryId ]; + + } + + } + + function releaseStatesOfGeometry( geometry ) { + + if ( bindingStates[ geometry.id ] === undefined ) return; + + const programMap = bindingStates[ geometry.id ]; + + for ( const programId in programMap ) { + + const stateMap = programMap[ programId ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ programId ]; + + } + + delete bindingStates[ geometry.id ]; + + } + + function releaseStatesOfProgram( program ) { + + for ( const geometryId in bindingStates ) { + + const programMap = bindingStates[ geometryId ]; + + if ( programMap[ program.id ] === undefined ) continue; + + const stateMap = programMap[ program.id ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ program.id ]; + + } + + } + + function reset() { + + resetDefaultState(); + + if ( currentState === defaultState ) return; + + currentState = defaultState; + bindVertexArrayObject( currentState.object ); + + } + + // for backward-compatilibity + + function resetDefaultState() { + + defaultState.geometry = null; + defaultState.program = null; + defaultState.wireframe = false; + + } + + return { + + setup: setup, + reset: reset, + resetDefaultState: resetDefaultState, + dispose: dispose, + releaseStatesOfGeometry: releaseStatesOfGeometry, + releaseStatesOfProgram: releaseStatesOfProgram, + + initAttributes: initAttributes, + enableAttribute: enableAttribute, + disableUnusedAttributes: disableUnusedAttributes + + }; + + } + + function WebGLBufferRenderer( gl, extensions, info, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + let mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + info.update( count, mode, 1 ); + + } + + function renderInstances( start, count, primcount ) { + + if ( primcount === 0 ) return; + + let extension, methodName; + + if ( isWebGL2 ) { + + extension = gl; + methodName = 'drawArraysInstanced'; + + } else { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + methodName = 'drawArraysInstancedANGLE'; + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ methodName ]( mode, start, count, primcount ); + + info.update( count, mode, primcount ); + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + + } + + function WebGLCapabilities( gl, extensions, parameters ) { + + let maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + const extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( 35633, 36338 ).precision > 0 && + gl.getShaderPrecisionFormat( 35632, 36338 ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( 35633, 36337 ).precision > 0 && + gl.getShaderPrecisionFormat( 35632, 36337 ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + /* eslint-disable no-undef */ + const isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) || + ( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext ); + /* eslint-enable no-undef */ + + let precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + const maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + + const maxTextures = gl.getParameter( 34930 ); + const maxVertexTextures = gl.getParameter( 35660 ); + const maxTextureSize = gl.getParameter( 3379 ); + const maxCubemapSize = gl.getParameter( 34076 ); + + const maxAttributes = gl.getParameter( 34921 ); + const maxVertexUniforms = gl.getParameter( 36347 ); + const maxVaryings = gl.getParameter( 36348 ); + const maxFragmentUniforms = gl.getParameter( 36349 ); + + const vertexTextures = maxVertexTextures > 0; + const floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' ); + const floatVertexTextures = vertexTextures && floatFragmentTextures; + + const maxSamples = isWebGL2 ? gl.getParameter( 36183 ) : 0; + + return { + + isWebGL2: isWebGL2, + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures, + + maxSamples: maxSamples + + }; + + } + + function WebGLClipping( properties ) { + + const scope = this; + + let globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false; + + const plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function ( planes, enableLocalClipping, camera ) { + + const enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function () { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function () { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function ( material, camera, useCache ) { + + const planes = material.clippingPlanes, + clipIntersection = material.clipIntersection, + clipShadows = material.clipShadows; + + const materialProperties = properties.get( material ); + + if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) { + + // there's no local clipping + + if ( renderingShadows ) { + + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + + } + + } else { + + const nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4; + + let dstArray = materialProperties.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, useCache ); + + for ( let i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + materialProperties.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + const nPlanes = planes !== null ? planes.length : 0; + let dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + const flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + scope.numIntersection = 0; + + return dstArray; + + } + + } + + function WebGLCubeMaps( renderer ) { + + let cubemaps = new WeakMap(); + + function mapTextureMapping( texture, mapping ) { + + if ( mapping === EquirectangularReflectionMapping ) { + + texture.mapping = CubeReflectionMapping; + + } else if ( mapping === EquirectangularRefractionMapping ) { + + texture.mapping = CubeRefractionMapping; + + } + + return texture; + + } + + function get( texture ) { + + if ( texture && texture.isTexture ) { + + const mapping = texture.mapping; + + if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) { + + if ( cubemaps.has( texture ) ) { + + const cubemap = cubemaps.get( texture ).texture; + return mapTextureMapping( cubemap, texture.mapping ); + + } else { + + const image = texture.image; + + if ( image && image.height > 0 ) { + + const currentRenderList = renderer.getRenderList(); + const currentRenderTarget = renderer.getRenderTarget(); + + const renderTarget = new WebGLCubeRenderTarget( image.height / 2 ); + renderTarget.fromEquirectangularTexture( renderer, texture ); + cubemaps.set( texture, renderTarget ); + + renderer.setRenderTarget( currentRenderTarget ); + renderer.setRenderList( currentRenderList ); + + texture.addEventListener( 'dispose', onTextureDispose ); + + return mapTextureMapping( renderTarget.texture, texture.mapping ); + + } else { + + // image not yet ready. try the conversion next frame + + return null; + + } + + } + + } + + } + + return texture; + + } + + function onTextureDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + const cubemap = cubemaps.get( texture ); + + if ( cubemap !== undefined ) { + + cubemaps.delete( texture ); + cubemap.dispose(); + + } + + } + + function dispose() { + + cubemaps = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + + } + + function WebGLExtensions( gl ) { + + const extensions = {}; + + return { + + has: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ] !== null; + + } + + let extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + extensions[ name ] = extension; + + return extension !== null; + + }, + + get: function ( name ) { + + if ( ! this.has( name ) ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + return extensions[ name ]; + + } + + }; + + } + + function WebGLGeometries( gl, attributes, info, bindingStates ) { + + const geometries = new WeakMap(); + const wireframeAttributes = new WeakMap(); + + function onGeometryDispose( event ) { + + const geometry = event.target; + const buffergeometry = geometries.get( geometry ); + + if ( buffergeometry.index !== null ) { + + attributes.remove( buffergeometry.index ); + + } + + for ( const name in buffergeometry.attributes ) { + + attributes.remove( buffergeometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + geometries.delete( geometry ); + + const attribute = wireframeAttributes.get( buffergeometry ); + + if ( attribute ) { + + attributes.remove( attribute ); + wireframeAttributes.delete( buffergeometry ); + + } + + bindingStates.releaseStatesOfGeometry( buffergeometry ); + + if ( geometry.isInstancedBufferGeometry === true ) { + + delete geometry._maxInstanceCount; + + } + + // + + info.memory.geometries --; + + } + + function get( object, geometry ) { + + let buffergeometry = geometries.get( geometry ); + + if ( buffergeometry ) return buffergeometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries.set( geometry, buffergeometry ); + + info.memory.geometries ++; + + return buffergeometry; + + } + + function update( geometry ) { + + const geometryAttributes = geometry.attributes; + + // Updating index buffer in VAO now. See WebGLBindingStates. + + for ( const name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], 34962 ); + + } + + // morph targets + + const morphAttributes = geometry.morphAttributes; + + for ( const name in morphAttributes ) { + + const array = morphAttributes[ name ]; + + for ( let i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], 34962 ); + + } + + } + + } + + function updateWireframeAttribute( geometry ) { + + const indices = []; + + const geometryIndex = geometry.index; + const geometryPosition = geometry.attributes.position; + let version = 0; + + if ( geometryIndex !== null ) { + + const array = geometryIndex.array; + version = geometryIndex.version; + + for ( let i = 0, l = array.length; i < l; i += 3 ) { + + const a = array[ i + 0 ]; + const b = array[ i + 1 ]; + const c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + const array = geometryPosition.array; + version = geometryPosition.version; + + for ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + const a = i + 0; + const b = i + 1; + const c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + const attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + attribute.version = version; + + // Updating index buffer in VAO now. See WebGLBindingStates + + // + + const previousAttribute = wireframeAttributes.get( geometry ); + + if ( previousAttribute ) attributes.remove( previousAttribute ); + + // + + wireframeAttributes.set( geometry, attribute ); + + } + + function getWireframeAttribute( geometry ) { + + const currentAttribute = wireframeAttributes.get( geometry ); + + if ( currentAttribute ) { + + const geometryIndex = geometry.index; + + if ( geometryIndex !== null ) { + + // if the attribute is obsolete, create a new one + + if ( currentAttribute.version < geometryIndex.version ) { + + updateWireframeAttribute( geometry ); + + } + + } + + } else { + + updateWireframeAttribute( geometry ); + + } + + return wireframeAttributes.get( geometry ); + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + + } + + function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + let mode; + + function setMode( value ) { + + mode = value; + + } + + let type, bytesPerElement; + + function setIndex( value ) { + + type = value.type; + bytesPerElement = value.bytesPerElement; + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * bytesPerElement ); + + info.update( count, mode, 1 ); + + } + + function renderInstances( start, count, primcount ) { + + if ( primcount === 0 ) return; + + let extension, methodName; + + if ( isWebGL2 ) { + + extension = gl; + methodName = 'drawElementsInstanced'; + + } else { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + methodName = 'drawElementsInstancedANGLE'; + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ methodName ]( mode, count, type, start * bytesPerElement, primcount ); + + info.update( count, mode, primcount ); + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + + } + + function WebGLInfo( gl ) { + + const memory = { + geometries: 0, + textures: 0 + }; + + const render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + + function update( count, mode, instanceCount ) { + + render.calls ++; + + switch ( mode ) { + + case 4: + render.triangles += instanceCount * ( count / 3 ); + break; + + case 1: + render.lines += instanceCount * ( count / 2 ); + break; + + case 3: + render.lines += instanceCount * ( count - 1 ); + break; + + case 2: + render.lines += instanceCount * count; + break; + + case 0: + render.points += instanceCount * count; + break; + + default: + console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode ); + break; + + } + + } + + function reset() { + + render.frame ++; + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; + + } + + return { + memory: memory, + render: render, + programs: null, + autoReset: true, + reset: reset, + update: update + }; + + } + + function numericalSort( a, b ) { + + return a[ 0 ] - b[ 0 ]; + + } + + function absNumericalSort( a, b ) { + + return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] ); + + } + + function WebGLMorphtargets( gl ) { + + const influencesList = {}; + const morphInfluences = new Float32Array( 8 ); + + const workInfluences = []; + + for ( let i = 0; i < 8; i ++ ) { + + workInfluences[ i ] = [ i, 0 ]; + + } + + function update( object, geometry, material, program ) { + + const objectInfluences = object.morphTargetInfluences; + + // When object doesn't have morph target influences defined, we treat it as a 0-length array + // This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences + + const length = objectInfluences === undefined ? 0 : objectInfluences.length; + + let influences = influencesList[ geometry.id ]; + + if ( influences === undefined ) { + + // initialise list + + influences = []; + + for ( let i = 0; i < length; i ++ ) { + + influences[ i ] = [ i, 0 ]; + + } + + influencesList[ geometry.id ] = influences; + + } + + // Collect influences + + for ( let i = 0; i < length; i ++ ) { + + const influence = influences[ i ]; + + influence[ 0 ] = i; + influence[ 1 ] = objectInfluences[ i ]; + + } + + influences.sort( absNumericalSort ); + + for ( let i = 0; i < 8; i ++ ) { + + if ( i < length && influences[ i ][ 1 ] ) { + + workInfluences[ i ][ 0 ] = influences[ i ][ 0 ]; + workInfluences[ i ][ 1 ] = influences[ i ][ 1 ]; + + } else { + + workInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER; + workInfluences[ i ][ 1 ] = 0; + + } + + } + + workInfluences.sort( numericalSort ); + + const morphTargets = material.morphTargets && geometry.morphAttributes.position; + const morphNormals = material.morphNormals && geometry.morphAttributes.normal; + + let morphInfluencesSum = 0; + + for ( let i = 0; i < 8; i ++ ) { + + const influence = workInfluences[ i ]; + const index = influence[ 0 ]; + const value = influence[ 1 ]; + + if ( index !== Number.MAX_SAFE_INTEGER && value ) { + + if ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) { + + geometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] ); + + } + + if ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) { + + geometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] ); + + } + + morphInfluences[ i ] = value; + morphInfluencesSum += value; + + } else { + + if ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) { + + geometry.deleteAttribute( 'morphTarget' + i ); + + } + + if ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) { + + geometry.deleteAttribute( 'morphNormal' + i ); + + } + + morphInfluences[ i ] = 0; + + } + + } + + // GLSL shader uses formula baseinfluence * base + sum(target * influence) + // This allows us to switch between absolute morphs and relative morphs without changing shader code + // When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence) + const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; + + program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence ); + program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences ); + + } + + return { + + update: update + + }; + + } + + function WebGLObjects( gl, geometries, attributes, info ) { + + let updateMap = new WeakMap(); + + function update( object ) { + + const frame = info.render.frame; + + const geometry = object.geometry; + const buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateMap.get( buffergeometry ) !== frame ) { + + if ( geometry.isGeometry ) { + + buffergeometry.updateFromObject( object ); + + } + + geometries.update( buffergeometry ); + + updateMap.set( buffergeometry, frame ); + + } + + if ( object.isInstancedMesh ) { + + if ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) { + + object.addEventListener( 'dispose', onInstancedMeshDispose ); + + } + + attributes.update( object.instanceMatrix, 34962 ); + + if ( object.instanceColor !== null ) { + + attributes.update( object.instanceColor, 34962 ); + + } + + } + + return buffergeometry; + + } + + function dispose() { + + updateMap = new WeakMap(); + + } + + function onInstancedMeshDispose( event ) { + + const instancedMesh = event.target; + + instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose ); + + attributes.remove( instancedMesh.instanceMatrix ); + + if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor ); + + } + + return { + + update: update, + dispose: dispose + + }; + + } + + function DataTexture2DArray( data = null, width = 1, height = 1, depth = 1 ) { + + Texture.call( this, null ); + + this.image = { data, width, height, depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.wrapR = ClampToEdgeWrapping; + + this.generateMipmaps = false; + this.flipY = false; + + this.needsUpdate = true; + + } + + DataTexture2DArray.prototype = Object.create( Texture.prototype ); + DataTexture2DArray.prototype.constructor = DataTexture2DArray; + DataTexture2DArray.prototype.isDataTexture2DArray = true; + + function DataTexture3D( data = null, width = 1, height = 1, depth = 1 ) { + + // We're going to add .setXXX() methods for setting properties later. + // Users can still set in DataTexture3D directly. + // + // const texture = new THREE.DataTexture3D( data, width, height, depth ); + // texture.anisotropy = 16; + // + // See #14839 + + Texture.call( this, null ); + + this.image = { data, width, height, depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.wrapR = ClampToEdgeWrapping; + + this.generateMipmaps = false; + this.flipY = false; + + this.needsUpdate = true; + + + } + + DataTexture3D.prototype = Object.create( Texture.prototype ); + DataTexture3D.prototype.constructor = DataTexture3D; + DataTexture3D.prototype.isDataTexture3D = true; + + /** + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [textures] ) + * + * uploads a uniform value(s) + * the 'textures' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (textures factorizations): + * + * .upload( gl, seq, values, textures ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (textures factorizations): + * + * .setValue( gl, name, value, textures ) + * + * sets uniform with name 'name' to 'value' + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + const emptyTexture = new Texture(); + const emptyTexture2dArray = new DataTexture2DArray(); + const emptyTexture3d = new DataTexture3D(); + const emptyCubeTexture = new CubeTexture(); + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + const arrayCacheF32 = []; + const arrayCacheI32 = []; + + // Float32Array caches used for uploading Matrix uniforms + + const mat4array = new Float32Array( 16 ); + const mat3array = new Float32Array( 9 ); + const mat2array = new Float32Array( 4 ); + + // Flattening for arrays of vectors and matrices + + function flatten( array, nBlocks, blockSize ) { + + const firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + const n = nBlocks * blockSize; + let r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( let i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + + } + + function arraysEqual( a, b ) { + + if ( a.length !== b.length ) return false; + + for ( let i = 0, l = a.length; i < l; i ++ ) { + + if ( a[ i ] !== b[ i ] ) return false; + + } + + return true; + + } + + function copyArray( a, b ) { + + for ( let i = 0, l = b.length; i < l; i ++ ) { + + a[ i ] = b[ i ]; + + } + + } + + // Texture unit allocation + + function allocTexUnits( textures, n ) { + + let r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( let i = 0; i !== n; ++ i ) { + + r[ i ] = textures.allocateTextureUnit(); + + } + + return r; + + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValueV1f( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1f( this.addr, v ); + + cache[ 0 ] = v; + + } + + // Single float vector (from flat array or THREE.VectorN) + + function setValueV2f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2f( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2fv( this.addr, v ); + + copyArray( cache, v ); + + } + + } + + function setValueV3f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3f( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else if ( v.r !== undefined ) { + + if ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) { + + gl.uniform3f( this.addr, v.r, v.g, v.b ); + + cache[ 0 ] = v.r; + cache[ 1 ] = v.g; + cache[ 2 ] = v.b; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3fv( this.addr, v ); + + copyArray( cache, v ); + + } + + } + + function setValueV4f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4fv( this.addr, v ); + + copyArray( cache, v ); + + } + + } + + // Single matrix (from flat array or MatrixN) + + function setValueM2( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix2fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat2array.set( elements ); + + gl.uniformMatrix2fv( this.addr, false, mat2array ); + + copyArray( cache, elements ); + + } + + } + + function setValueM3( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix3fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat3array.set( elements ); + + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + copyArray( cache, elements ); + + } + + } + + function setValueM4( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix4fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat4array.set( elements ); + + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + copyArray( cache, elements ); + + } + + } + + // Single texture (2D / Cube) + + function setValueT1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.safeSetTexture2D( v || emptyTexture, unit ); + + } + + function setValueT2DArray1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.setTexture2DArray( v || emptyTexture2dArray, unit ); + + } + + function setValueT3D1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.setTexture3D( v || emptyTexture3d, unit ); + + } + + function setValueT6( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.safeSetTextureCube( v || emptyCubeTexture, unit ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValueV1i( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1i( this.addr, v ); + + cache[ 0 ] = v; + + } + + function setValueV2i( gl, v ) { + + const cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2iv( this.addr, v ); + + copyArray( cache, v ); + + } + + function setValueV3i( gl, v ) { + + const cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3iv( this.addr, v ); + + copyArray( cache, v ); + + } + + function setValueV4i( gl, v ) { + + const cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4iv( this.addr, v ); + + copyArray( cache, v ); + + } + + // uint + + function setValueV1ui( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1ui( this.addr, v ); + + cache[ 0 ] = v; + + } + + // Helper to pick the right setter for the singular case + + function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValueV1f; // FLOAT + case 0x8b50: return setValueV2f; // _VEC2 + case 0x8b51: return setValueV3f; // _VEC3 + case 0x8b52: return setValueV4f; // _VEC4 + + case 0x8b5a: return setValueM2; // _MAT2 + case 0x8b5b: return setValueM3; // _MAT3 + case 0x8b5c: return setValueM4; // _MAT4 + + case 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValueV2i; // _VEC2 + case 0x8b54: case 0x8b58: return setValueV3i; // _VEC3 + case 0x8b55: case 0x8b59: return setValueV4i; // _VEC4 + + case 0x1405: return setValueV1ui; // UINT + + case 0x8b5e: // SAMPLER_2D + case 0x8d66: // SAMPLER_EXTERNAL_OES + case 0x8dca: // INT_SAMPLER_2D + case 0x8dd2: // UNSIGNED_INT_SAMPLER_2D + case 0x8b62: // SAMPLER_2D_SHADOW + return setValueT1; + + case 0x8b5f: // SAMPLER_3D + case 0x8dcb: // INT_SAMPLER_3D + case 0x8dd3: // UNSIGNED_INT_SAMPLER_3D + return setValueT3D1; + + case 0x8b60: // SAMPLER_CUBE + case 0x8dcc: // INT_SAMPLER_CUBE + case 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE + case 0x8dc5: // SAMPLER_CUBE_SHADOW + return setValueT6; + + case 0x8dc1: // SAMPLER_2D_ARRAY + case 0x8dcf: // INT_SAMPLER_2D_ARRAY + case 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY + case 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW + return setValueT2DArray1; + + } + + } + + // Array of scalars + function setValueV1fArray( gl, v ) { + + gl.uniform1fv( this.addr, v ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + function setValueV1iArray( gl, v ) { + + gl.uniform1iv( this.addr, v ); + + } + + function setValueV2iArray( gl, v ) { + + gl.uniform2iv( this.addr, v ); + + } + + function setValueV3iArray( gl, v ) { + + gl.uniform3iv( this.addr, v ); + + } + + function setValueV4iArray( gl, v ) { + + gl.uniform4iv( this.addr, v ); + + } + + + // Array of vectors (flat or from THREE classes) + + function setValueV2fArray( gl, v ) { + + const data = flatten( v, this.size, 2 ); + + gl.uniform2fv( this.addr, data ); + + } + + function setValueV3fArray( gl, v ) { + + const data = flatten( v, this.size, 3 ); + + gl.uniform3fv( this.addr, data ); + + } + + function setValueV4fArray( gl, v ) { + + const data = flatten( v, this.size, 4 ); + + gl.uniform4fv( this.addr, data ); + + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2Array( gl, v ) { + + const data = flatten( v, this.size, 4 ); + + gl.uniformMatrix2fv( this.addr, false, data ); + + } + + function setValueM3Array( gl, v ) { + + const data = flatten( v, this.size, 9 ); + + gl.uniformMatrix3fv( this.addr, false, data ); + + } + + function setValueM4Array( gl, v ) { + + const data = flatten( v, this.size, 16 ); + + gl.uniformMatrix4fv( this.addr, false, data ); + + } + + // Array of textures (2D / Cube) + + function setValueT1Array( gl, v, textures ) { + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + gl.uniform1iv( this.addr, units ); + + for ( let i = 0; i !== n; ++ i ) { + + textures.safeSetTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + + } + + function setValueT6Array( gl, v, textures ) { + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + gl.uniform1iv( this.addr, units ); + + for ( let i = 0; i !== n; ++ i ) { + + textures.safeSetTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValueV1fArray; // FLOAT + case 0x8b50: return setValueV2fArray; // _VEC2 + case 0x8b51: return setValueV3fArray; // _VEC3 + case 0x8b52: return setValueV4fArray; // _VEC4 + + case 0x8b5a: return setValueM2Array; // _MAT2 + case 0x8b5b: return setValueM3Array; // _MAT3 + case 0x8b5c: return setValueM4Array; // _MAT4 + + case 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL + case 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2 + case 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3 + case 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4 + + case 0x8b5e: // SAMPLER_2D + case 0x8d66: // SAMPLER_EXTERNAL_OES + case 0x8dca: // INT_SAMPLER_2D + case 0x8dd2: // UNSIGNED_INT_SAMPLER_2D + case 0x8b62: // SAMPLER_2D_SHADOW + return setValueT1Array; + + case 0x8b60: // SAMPLER_CUBE + case 0x8dcc: // INT_SAMPLER_CUBE + case 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE + case 0x8dc5: // SAMPLER_CUBE_SHADOW + return setValueT6Array; + + } + + } + + // --- Uniform Classes --- + + function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + PureArrayUniform.prototype.updateCache = function ( data ) { + + const cache = this.cache; + + if ( data instanceof Float32Array && cache.length !== data.length ) { + + this.cache = new Float32Array( data.length ); + + } + + copyArray( cache, data ); + + }; + + function StructuredUniform( id ) { + + this.id = id; + + this.seq = []; + this.map = {}; + + } + + StructuredUniform.prototype.setValue = function ( gl, value, textures ) { + + const seq = this.seq; + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ]; + u.setValue( gl, value[ u.id ], textures ); + + } + + }; + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + const RePathPart = /(\w+)(\])?(\[|\.)?/g; + + // extracts + // - the identifier (member name or array index) + // - followed by an optional right bracket (found when array index) + // - followed by an optional left bracket or dot (type of subscript) + // + // Note: These portions can be read in a non-overlapping fashion and + // allow straightforward parsing of the hierarchy that WebGL encodes + // in the uniform names. + + function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + + } + + function parseUniform( activeInfo, addr, container ) { + + const path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + while ( true ) { + + const match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex; + + let id = match[ 1 ]; + const idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) { + + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + const map = container.map; + let next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + + } + + // Root Container + + function WebGLUniforms( gl, program ) { + + this.seq = []; + this.map = {}; + + const n = gl.getProgramParameter( program, 35718 ); + + for ( let i = 0; i < n; ++ i ) { + + const info = gl.getActiveUniform( program, i ), + addr = gl.getUniformLocation( program, info.name ); + + parseUniform( info, addr, this ); + + } + + } + + WebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) { + + const u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, textures ); + + }; + + WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { + + const v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + }; + + + // Static interface + + WebGLUniforms.upload = function ( gl, seq, values, textures ) { + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, textures ); + + } + + } + + }; + + WebGLUniforms.seqWithValue = function ( seq, values ) { + + const r = []; + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + }; + + function WebGLShader( gl, type, string ) { + + const shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + return shader; + + } + + let programIdCount = 0; + + function addLineNumbers( string ) { + + const lines = string.split( '\n' ); + + for ( let i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear', '( value )' ]; + case sRGBEncoding: + return [ 'sRGB', '( value )' ]; + case RGBEEncoding: + return [ 'RGBE', '( value )' ]; + case RGBM7Encoding: + return [ 'RGBM', '( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM', '( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD', '( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ]; + case LogLuvEncoding: + return [ 'LogLuv', '( value )' ]; + default: + console.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding ); + return [ 'Linear', '( value )' ]; + + } + + } + + function getShaderErrors( gl, shader, type ) { + + const status = gl.getShaderParameter( shader, 35713 ); + const log = gl.getShaderInfoLog( shader ).trim(); + + if ( status && log === '' ) return ''; + + // --enable-privileged-webgl-extension + // console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + const source = gl.getShaderSource( shader ); + + return 'THREE.WebGLShader: gl.getShaderInfoLog() ' + type + '\n' + log + addLineNumbers( source ); + + } + + function getTexelDecodingFunction( functionName, encoding ) { + + const components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }'; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + const components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }'; + + } + + function getToneMappingFunction( functionName, toneMapping ) { + + let toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = 'Linear'; + break; + + case ReinhardToneMapping: + toneMappingName = 'Reinhard'; + break; + + case CineonToneMapping: + toneMappingName = 'OptimizedCineon'; + break; + + case ACESFilmicToneMapping: + toneMappingName = 'ACESFilmic'; + break; + + case CustomToneMapping: + toneMappingName = 'Custom'; + break; + + default: + console.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping ); + toneMappingName = 'Linear'; + + } + + return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }'; + + } + + function generateExtensions( parameters ) { + + const chunks = [ + ( parameters.extensionDerivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '', + ( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + + } + + function generateDefines( defines ) { + + const chunks = []; + + for ( const name in defines ) { + + const value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchAttributeLocations( gl, program ) { + + const attributes = {}; + + const n = gl.getProgramParameter( program, 35721 ); + + for ( let i = 0; i < n; i ++ ) { + + const info = gl.getActiveAttrib( program, i ); + const name = info.name; + + // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ) + .replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows ) + .replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows ) + .replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows ); + + } + + function replaceClippingPlaneNums( string, parameters ) { + + return string + .replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes ) + .replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) ); + + } + + // Resolve Includes + + const includePattern = /^[ \t]*#include +<([\w\d./]+)>/gm; + + function resolveIncludes( string ) { + + return string.replace( includePattern, includeReplacer ); + + } + + function includeReplacer( match, include ) { + + const string = ShaderChunk[ include ]; + + if ( string === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return resolveIncludes( string ); + + } + + // Unroll Loops + + const deprecatedUnrollLoopPattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + const unrollLoopPattern = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; + + function unrollLoops( string ) { + + return string + .replace( unrollLoopPattern, loopReplacer ) + .replace( deprecatedUnrollLoopPattern, deprecatedLoopReplacer ); + + } + + function deprecatedLoopReplacer( match, start, end, snippet ) { + + console.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' ); + return loopReplacer( match, start, end, snippet ); + + } + + function loopReplacer( match, start, end, snippet ) { + + let string = ''; + + for ( let i = parseInt( start ); i < parseInt( end ); i ++ ) { + + string += snippet + .replace( /\[\s*i\s*\]/g, '[ ' + i + ' ]' ) + .replace( /UNROLLED_LOOP_INDEX/g, i ); + + } + + return string; + + } + + // + + function generatePrecision( parameters ) { + + let precisionstring = 'precision ' + parameters.precision + ' float;\nprecision ' + parameters.precision + ' int;'; + + if ( parameters.precision === 'highp' ) { + + precisionstring += '\n#define HIGH_PRECISION'; + + } else if ( parameters.precision === 'mediump' ) { + + precisionstring += '\n#define MEDIUM_PRECISION'; + + } else if ( parameters.precision === 'lowp' ) { + + precisionstring += '\n#define LOW_PRECISION'; + + } + + return precisionstring; + + } + + function generateShadowMapTypeDefine( parameters ) { + + let shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } else if ( parameters.shadowMapType === VSMShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM'; + + } + + return shadowMapTypeDefine; + + } + + function generateEnvMapTypeDefine( parameters ) { + + let envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + + if ( parameters.envMap ) { + + switch ( parameters.envMapMode ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + } + + } + + return envMapTypeDefine; + + } + + function generateEnvMapModeDefine( parameters ) { + + let envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + + if ( parameters.envMap ) { + + switch ( parameters.envMapMode ) { + + case CubeRefractionMapping: + case CubeUVRefractionMapping: + + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + } + + return envMapModeDefine; + + } + + function generateEnvMapBlendingDefine( parameters ) { + + let envMapBlendingDefine = 'ENVMAP_BLENDING_NONE'; + + if ( parameters.envMap ) { + + switch ( parameters.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + return envMapBlendingDefine; + + } + + function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) { + + const gl = renderer.getContext(); + + const defines = parameters.defines; + + let vertexShader = parameters.vertexShader; + let fragmentShader = parameters.fragmentShader; + + const shadowMapTypeDefine = generateShadowMapTypeDefine( parameters ); + const envMapTypeDefine = generateEnvMapTypeDefine( parameters ); + const envMapModeDefine = generateEnvMapModeDefine( parameters ); + const envMapBlendingDefine = generateEnvMapBlendingDefine( parameters ); + + + const gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + const customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters ); + + const customDefines = generateDefines( defines ); + + const program = gl.createProgram(); + + let prefixVertex, prefixFragment; + let versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\n' : ''; + + if ( parameters.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixVertex.length > 0 ) { + + prefixVertex += '\n'; + + } + + prefixFragment = [ + + customExtensions, + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixFragment.length > 0 ) { + + prefixFragment += '\n'; + + } + + } else { + + prefixVertex = [ + + generatePrecision( parameters ), + + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines, + + parameters.instancing ? '#define USE_INSTANCING' : '', + parameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '', + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + ( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '', + + parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '', + parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', + parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '', + + parameters.vertexTangents ? '#define USE_TANGENT' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + parameters.vertexUvs ? '#define USE_UV' : '', + parameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + ( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + 'uniform bool isOrthographic;', + + '#ifdef USE_INSTANCING', + + ' attribute mat4 instanceMatrix;', + + '#endif', + + '#ifdef USE_INSTANCING_COLOR', + + ' attribute vec3 instanceColor;', + + '#endif', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_TANGENT', + + ' attribute vec4 tangent;', + + '#endif', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + generatePrecision( parameters ), + + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest + ( parameters.alphaTest % 1 ? '' : '.0' ) : '', // add '.0' if integer + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.matcap ? '#define USE_MATCAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + ( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '', + parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '', + parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', + parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + + parameters.sheen ? '#define USE_SHEEN' : '', + parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '', + + parameters.vertexTangents ? '#define USE_TANGENT' : '', + parameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '', + parameters.vertexUvs ? '#define USE_UV' : '', + parameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', + + parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + ( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + ( ( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + 'uniform bool isOrthographic;', + + ( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + + ShaderChunk[ 'encodings_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below + parameters.map ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.matcap ? getTexelDecodingFunction( 'matcapTexelToLinear', parameters.matcapEncoding ) : '', + parameters.envMap ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMap ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.lightMap ? getTexelDecodingFunction( 'lightMapTexelToLinear', parameters.lightMapEncoding ) : '', + getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ), + + parameters.depthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = resolveIncludes( vertexShader ); + vertexShader = replaceLightNums( vertexShader, parameters ); + vertexShader = replaceClippingPlaneNums( vertexShader, parameters ); + + fragmentShader = resolveIncludes( fragmentShader ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters ); + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + if ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) { + + // GLSL 3.0 conversion for built-in materials and ShaderMaterial + + versionString = '#version 300 es\n'; + + prefixVertex = [ + '#define attribute in', + '#define varying out', + '#define texture2D texture' + ].join( '\n' ) + '\n' + prefixVertex; + + prefixFragment = [ + '#define varying in', + ( parameters.glslVersion === GLSL3 ) ? '' : 'out highp vec4 pc_fragColor;', + ( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor', + '#define gl_FragDepthEXT gl_FragDepth', + '#define texture2D texture', + '#define textureCube texture', + '#define texture2DProj textureProj', + '#define texture2DLodEXT textureLod', + '#define texture2DProjLodEXT textureProjLod', + '#define textureCubeLodEXT textureLod', + '#define texture2DGradEXT textureGrad', + '#define texture2DProjGradEXT textureProjGrad', + '#define textureCubeGradEXT textureGrad' + ].join( '\n' ) + '\n' + prefixFragment; + + } + + const vertexGlsl = versionString + prefixVertex + vertexShader; + const fragmentGlsl = versionString + prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + const glVertexShader = WebGLShader( gl, 35633, vertexGlsl ); + const glFragmentShader = WebGLShader( gl, 35632, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( parameters.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, parameters.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + // check for link errors + if ( renderer.debug.checkShaderErrors ) { + + const programLog = gl.getProgramInfoLog( program ).trim(); + const vertexLog = gl.getShaderInfoLog( glVertexShader ).trim(); + const fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim(); + + let runnable = true; + let haveDiagnostics = true; + + if ( gl.getProgramParameter( program, 35714 ) === false ) { + + runnable = false; + + const vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' ); + const fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' ); + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), '35715', gl.getProgramParameter( program, 35715 ), 'gl.getProgramInfoLog', programLog, vertexErrors, fragmentErrors ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + } + + // Clean up + + // Crashes in iOS9 and iOS10. #18402 + // gl.detachShader( program, glVertexShader ); + // gl.detachShader( program, glFragmentShader ); + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + let cachedUniforms; + + this.getUniforms = function () { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = new WebGLUniforms( gl, program ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + let cachedAttributes; + + this.getAttributes = function () { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function () { + + bindingStates.releaseStatesOfProgram( this ); + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // + + this.name = parameters.shaderName; + this.id = programIdCount ++; + this.cacheKey = cacheKey; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + } + + function WebGLPrograms( renderer, cubemaps, extensions, capabilities, bindingStates, clipping ) { + + const programs = []; + + const isWebGL2 = capabilities.isWebGL2; + const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer; + const floatVertexTextures = capabilities.floatVertexTextures; + const maxVertexUniforms = capabilities.maxVertexUniforms; + const vertexTextures = capabilities.vertexTextures; + + let precision = capabilities.precision; + + const shaderIDs = { + MeshDepthMaterial: 'depth', + MeshDistanceMaterial: 'distanceRGBA', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'toon', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + MeshMatcapMaterial: 'matcap', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points', + ShadowMaterial: 'shadow', + SpriteMaterial: 'sprite' + }; + + const parameterNames = [ + 'precision', 'isWebGL2', 'supportsVertexTextures', 'outputEncoding', 'instancing', 'instancingColor', + 'map', 'mapEncoding', 'matcap', 'matcapEncoding', 'envMap', 'envMapMode', 'envMapEncoding', 'envMapCubeUV', + 'lightMap', 'lightMapEncoding', 'aoMap', 'emissiveMap', 'emissiveMapEncoding', 'bumpMap', 'normalMap', 'objectSpaceNormalMap', 'tangentSpaceNormalMap', 'clearcoatMap', 'clearcoatRoughnessMap', 'clearcoatNormalMap', 'displacementMap', 'specularMap', + 'roughnessMap', 'metalnessMap', 'gradientMap', + 'alphaMap', 'combine', 'vertexColors', 'vertexTangents', 'vertexUvs', 'uvsVertexOnly', 'fog', 'useFog', 'fogExp2', + 'flatShading', 'sizeAttenuation', 'logarithmicDepthBuffer', 'skinning', + 'maxBones', 'useVertexTexture', 'morphTargets', 'morphNormals', + 'maxMorphTargets', 'maxMorphNormals', 'premultipliedAlpha', + 'numDirLights', 'numPointLights', 'numSpotLights', 'numHemiLights', 'numRectAreaLights', + 'numDirLightShadows', 'numPointLightShadows', 'numSpotLightShadows', + 'shadowMapEnabled', 'shadowMapType', 'toneMapping', 'physicallyCorrectLights', + 'alphaTest', 'doubleSided', 'flipSided', 'numClippingPlanes', 'numClipIntersection', 'depthPacking', 'dithering', + 'sheen', 'transmissionMap' + ]; + + function getMaxBones( object ) { + + const skeleton = object.skeleton; + const bones = skeleton.bones; + + if ( floatVertexTextures ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + const nVertexUniforms = maxVertexUniforms; + const nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + const maxBones = Math.min( nVertexMatrices, bones.length ); + + if ( maxBones < bones.length ) { + + console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); + return 0; + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map ) { + + let encoding; + + if ( map && map.isTexture ) { + + encoding = map.encoding; + + } else if ( map && map.isWebGLRenderTarget ) { + + console.warn( 'THREE.WebGLPrograms.getTextureEncodingFromMap: don\'t use render targets as textures. Use their .texture property instead.' ); + encoding = map.texture.encoding; + + } else { + + encoding = LinearEncoding; + + } + + return encoding; + + } + + function getParameters( material, lights, shadows, scene, object ) { + + const fog = scene.fog; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + + const envMap = cubemaps.get( material.envMap || environment ); + + const shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + const maxBones = object.isSkinnedMesh ? getMaxBones( object ) : 0; + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + let vertexShader, fragmentShader; + + if ( shaderID ) { + + const shader = ShaderLib[ shaderID ]; + + vertexShader = shader.vertexShader; + fragmentShader = shader.fragmentShader; + + } else { + + vertexShader = material.vertexShader; + fragmentShader = material.fragmentShader; + + } + + const currentRenderTarget = renderer.getRenderTarget(); + + const parameters = { + + isWebGL2: isWebGL2, + + shaderID: shaderID, + shaderName: material.type, + + vertexShader: vertexShader, + fragmentShader: fragmentShader, + defines: material.defines, + + isRawShaderMaterial: material.isRawShaderMaterial === true, + glslVersion: material.glslVersion, + + precision: precision, + + instancing: object.isInstancedMesh === true, + instancingColor: object.isInstancedMesh === true && object.instanceColor !== null, + + supportsVertexTextures: vertexTextures, + outputEncoding: ( currentRenderTarget !== null ) ? getTextureEncodingFromMap( currentRenderTarget.texture ) : renderer.outputEncoding, + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map ), + matcap: !! material.matcap, + matcapEncoding: getTextureEncodingFromMap( material.matcap ), + envMap: !! envMap, + envMapMode: envMap && envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( envMap ), + envMapCubeUV: ( !! envMap ) && ( ( envMap.mapping === CubeUVReflectionMapping ) || ( envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + lightMapEncoding: getTextureEncodingFromMap( material.lightMap ), + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap, + tangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap, + clearcoatMap: !! material.clearcoatMap, + clearcoatRoughnessMap: !! material.clearcoatRoughnessMap, + clearcoatNormalMap: !! material.clearcoatNormalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + gradientMap: !! material.gradientMap, + + sheen: !! material.sheen, + + transmissionMap: !! material.transmissionMap, + + combine: material.combine, + + vertexTangents: ( material.normalMap && material.vertexTangents ), + vertexColors: material.vertexColors, + vertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap, + uvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || !! material.transmissionMap ) && !! material.displacementMap, + + fog: !! fog, + useFog: material.fog, + fogExp2: ( fog && fog.isFogExp2 ), + + flatShading: material.flatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + skinning: material.skinning && maxBones > 0, + maxBones: maxBones, + useVertexTexture: floatVertexTextures, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numDirLightShadows: lights.directionalShadowMap.length, + numPointLightShadows: lights.pointShadowMap.length, + numSpotLightShadows: lights.spotShadowMap.length, + + numClippingPlanes: clipping.numPlanes, + numClipIntersection: clipping.numIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false, + + index0AttributeName: material.index0AttributeName, + + extensionDerivatives: material.extensions && material.extensions.derivatives, + extensionFragDepth: material.extensions && material.extensions.fragDepth, + extensionDrawBuffers: material.extensions && material.extensions.drawBuffers, + extensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD, + + rendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ), + rendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ), + rendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ), + + customProgramCacheKey: material.customProgramCacheKey() + + }; + + return parameters; + + } + + function getProgramCacheKey( parameters ) { + + const array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( parameters.fragmentShader ); + array.push( parameters.vertexShader ); + + } + + if ( parameters.defines !== undefined ) { + + for ( const name in parameters.defines ) { + + array.push( name ); + array.push( parameters.defines[ name ] ); + + } + + } + + if ( parameters.isRawShaderMaterial === false ) { + + for ( let i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + array.push( renderer.outputEncoding ); + array.push( renderer.gammaFactor ); + + } + + array.push( parameters.customProgramCacheKey ); + + return array.join(); + + } + + function getUniforms( material ) { + + const shaderID = shaderIDs[ material.type ]; + let uniforms; + + if ( shaderID ) { + + const shader = ShaderLib[ shaderID ]; + uniforms = UniformsUtils.clone( shader.uniforms ); + + } else { + + uniforms = material.uniforms; + + } + + return uniforms; + + } + + function acquireProgram( parameters, cacheKey ) { + + let program; + + // Check if code has been already compiled + for ( let p = 0, pl = programs.length; p < pl; p ++ ) { + + const preexistingProgram = programs[ p ]; + + if ( preexistingProgram.cacheKey === cacheKey ) { + + program = preexistingProgram; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, cacheKey, parameters, bindingStates ); + programs.push( program ); + + } + + return program; + + } + + function releaseProgram( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + const i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + } + + return { + getParameters: getParameters, + getProgramCacheKey: getProgramCacheKey, + getUniforms: getUniforms, + acquireProgram: acquireProgram, + releaseProgram: releaseProgram, + // Exposed for resource monitoring & error feedback via renderer.info: + programs: programs + }; + + } + + function WebGLProperties() { + + let properties = new WeakMap(); + + function get( object ) { + + let map = properties.get( object ); + + if ( map === undefined ) { + + map = {}; + properties.set( object, map ); + + } + + return map; + + } + + function remove( object ) { + + properties.delete( object ); + + } + + function update( object, key, value ) { + + properties.get( object )[ key ] = value; + + } + + function dispose() { + + properties = new WeakMap(); + + } + + return { + get: get, + remove: remove, + update: update, + dispose: dispose + }; + + } + + function painterSortStable( a, b ) { + + if ( a.groupOrder !== b.groupOrder ) { + + return a.groupOrder - b.groupOrder; + + } else if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.program !== b.program ) { + + return a.program.id - b.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable( a, b ) { + + if ( a.groupOrder !== b.groupOrder ) { + + return a.groupOrder - b.groupOrder; + + } else if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + + function WebGLRenderList( properties ) { + + const renderItems = []; + let renderItemsIndex = 0; + + const opaque = []; + const transparent = []; + + const defaultProgram = { id: - 1 }; + + function init() { + + renderItemsIndex = 0; + + opaque.length = 0; + transparent.length = 0; + + } + + function getNextRenderItem( object, geometry, material, groupOrder, z, group ) { + + let renderItem = renderItems[ renderItemsIndex ]; + const materialProperties = properties.get( material ); + + if ( renderItem === undefined ) { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: materialProperties.program || defaultProgram, + groupOrder: groupOrder, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + renderItems[ renderItemsIndex ] = renderItem; + + } else { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.program = materialProperties.program || defaultProgram; + renderItem.groupOrder = groupOrder; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } + + renderItemsIndex ++; + + return renderItem; + + } + + function push( object, geometry, material, groupOrder, z, group ) { + + const renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group ); + + ( material.transparent === true ? transparent : opaque ).push( renderItem ); + + } + + function unshift( object, geometry, material, groupOrder, z, group ) { + + const renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group ); + + ( material.transparent === true ? transparent : opaque ).unshift( renderItem ); + + } + + function sort( customOpaqueSort, customTransparentSort ) { + + if ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable ); + if ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable ); + + } + + function finish() { + + // Clear references from inactive renderItems in the list + + for ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) { + + const renderItem = renderItems[ i ]; + + if ( renderItem.id === null ) break; + + renderItem.id = null; + renderItem.object = null; + renderItem.geometry = null; + renderItem.material = null; + renderItem.program = null; + renderItem.group = null; + + } + + } + + return { + + opaque: opaque, + transparent: transparent, + + init: init, + push: push, + unshift: unshift, + finish: finish, + + sort: sort + }; + + } + + function WebGLRenderLists( properties ) { + + let lists = new WeakMap(); + + function get( scene, camera ) { + + const cameras = lists.get( scene ); + let list; + + if ( cameras === undefined ) { + + list = new WebGLRenderList( properties ); + lists.set( scene, new WeakMap() ); + lists.get( scene ).set( camera, list ); + + } else { + + list = cameras.get( camera ); + if ( list === undefined ) { + + list = new WebGLRenderList( properties ); + cameras.set( camera, list ); + + } + + } + + return list; + + } + + function dispose() { + + lists = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + + } + + function UniformsCache() { + + const lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + let uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0 + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0 + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + function ShadowUniformsCache() { + + const lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + let uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1000 + }; + break; + + // TODO (abelnation): set RectAreaLight shadow uniforms + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + + + let nextVersion = 0; + + function shadowCastingLightsFirst( lightA, lightB ) { + + return ( lightB.castShadow ? 1 : 0 ) - ( lightA.castShadow ? 1 : 0 ); + + } + + function WebGLLights( extensions, capabilities ) { + + const cache = new UniformsCache(); + + const shadowCache = ShadowUniformsCache(); + + const state = { + + version: 0, + + hash: { + directionalLength: - 1, + pointLength: - 1, + spotLength: - 1, + rectAreaLength: - 1, + hemiLength: - 1, + + numDirectionalShadows: - 1, + numPointShadows: - 1, + numSpotShadows: - 1 + }, + + ambient: [ 0, 0, 0 ], + probe: [], + directional: [], + directionalShadow: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadow: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + rectAreaLTC1: null, + rectAreaLTC2: null, + point: [], + pointShadow: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [] + + }; + + for ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() ); + + const vector3 = new Vector3(); + const matrix4 = new Matrix4(); + const matrix42 = new Matrix4(); + + function setup( lights ) { + + let r = 0, g = 0, b = 0; + + for ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 ); + + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + + let numDirectionalShadows = 0; + let numPointShadows = 0; + let numSpotShadows = 0; + + lights.sort( shadowCastingLightsFirst ); + + for ( let i = 0, l = lights.length; i < l; i ++ ) { + + const light = lights[ i ]; + + const color = light.color; + const intensity = light.intensity; + const distance = light.distance; + + const shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isLightProbe ) { + + for ( let j = 0; j < 9; j ++ ) { + + state.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity ); + + } + + } else if ( light.isDirectionalLight ) { + + const uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + + if ( light.castShadow ) { + + const shadow = light.shadow; + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + + state.directionalShadow[ directionalLength ] = shadowUniforms; + state.directionalShadowMap[ directionalLength ] = shadowMap; + state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + + numDirectionalShadows ++; + + } + + state.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + const uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = light.decay; + + if ( light.castShadow ) { + + const shadow = light.shadow; + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + + state.spotShadow[ spotLength ] = shadowUniforms; + state.spotShadowMap[ spotLength ] = shadowMap; + state.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + + numSpotShadows ++; + + } + + state.spot[ spotLength ] = uniforms; + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + const uniforms = cache.get( light ); + + // (a) intensity is the total visible light emitted + //uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) ); + + // (b) intensity is the brightness of the light + uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + state.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + const uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = light.decay; + + if ( light.castShadow ) { + + const shadow = light.shadow; + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + shadowUniforms.shadowCameraNear = shadow.camera.near; + shadowUniforms.shadowCameraFar = shadow.camera.far; + + state.pointShadow[ pointLength ] = shadowUniforms; + state.pointShadowMap[ pointLength ] = shadowMap; + state.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + + numPointShadows ++; + + } + + state.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + const uniforms = cache.get( light ); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + state.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + if ( rectAreaLength > 0 ) { + + if ( capabilities.isWebGL2 ) { + + // WebGL 2 + + state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1; + state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2; + + } else { + + // WebGL 1 + + if ( extensions.has( 'OES_texture_float_linear' ) === true ) { + + state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1; + state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2; + + } else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) { + + state.rectAreaLTC1 = UniformsLib.LTC_HALF_1; + state.rectAreaLTC2 = UniformsLib.LTC_HALF_2; + + } else { + + console.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' ); + + } + + } + + } + + state.ambient[ 0 ] = r; + state.ambient[ 1 ] = g; + state.ambient[ 2 ] = b; + + const hash = state.hash; + + if ( hash.directionalLength !== directionalLength || + hash.pointLength !== pointLength || + hash.spotLength !== spotLength || + hash.rectAreaLength !== rectAreaLength || + hash.hemiLength !== hemiLength || + hash.numDirectionalShadows !== numDirectionalShadows || + hash.numPointShadows !== numPointShadows || + hash.numSpotShadows !== numSpotShadows ) { + + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + + state.directionalShadow.length = numDirectionalShadows; + state.directionalShadowMap.length = numDirectionalShadows; + state.pointShadow.length = numPointShadows; + state.pointShadowMap.length = numPointShadows; + state.spotShadow.length = numSpotShadows; + state.spotShadowMap.length = numSpotShadows; + state.directionalShadowMatrix.length = numDirectionalShadows; + state.pointShadowMatrix.length = numPointShadows; + state.spotShadowMatrix.length = numSpotShadows; + + hash.directionalLength = directionalLength; + hash.pointLength = pointLength; + hash.spotLength = spotLength; + hash.rectAreaLength = rectAreaLength; + hash.hemiLength = hemiLength; + + hash.numDirectionalShadows = numDirectionalShadows; + hash.numPointShadows = numPointShadows; + hash.numSpotShadows = numSpotShadows; + + state.version = nextVersion ++; + + } + + } + + function setupView( lights, camera ) { + + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + + const viewMatrix = camera.matrixWorldInverse; + + for ( let i = 0, l = lights.length; i < l; i ++ ) { + + const light = lights[ i ]; + + if ( light.isDirectionalLight ) { + + const uniforms = state.directional[ directionalLength ]; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + const uniforms = state.spot[ spotLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + const uniforms = state.rectArea[ rectAreaLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + matrix42.identity(); + matrix4.copy( light.matrixWorld ); + matrix4.premultiply( viewMatrix ); + matrix42.extractRotation( matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( matrix42 ); + uniforms.halfHeight.applyMatrix4( matrix42 ); + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + const uniforms = state.point[ pointLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + const uniforms = state.hemi[ hemiLength ]; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + hemiLength ++; + + } + + } + + } + + return { + setup: setup, + setupView: setupView, + state: state + }; + + } + + function WebGLRenderState( extensions, capabilities ) { + + const lights = new WebGLLights( extensions, capabilities ); + + const lightsArray = []; + const shadowsArray = []; + + function init() { + + lightsArray.length = 0; + shadowsArray.length = 0; + + } + + function pushLight( light ) { + + lightsArray.push( light ); + + } + + function pushShadow( shadowLight ) { + + shadowsArray.push( shadowLight ); + + } + + function setupLights() { + + lights.setup( lightsArray ); + + } + + function setupLightsView( camera ) { + + lights.setupView( lightsArray, camera ); + + } + + const state = { + lightsArray: lightsArray, + shadowsArray: shadowsArray, + + lights: lights + }; + + return { + init: init, + state: state, + setupLights: setupLights, + setupLightsView: setupLightsView, + + pushLight: pushLight, + pushShadow: pushShadow + }; + + } + + function WebGLRenderStates( extensions, capabilities ) { + + let renderStates = new WeakMap(); + + function get( scene, renderCallDepth = 0 ) { + + let renderState; + + if ( renderStates.has( scene ) === false ) { + + renderState = new WebGLRenderState( extensions, capabilities ); + renderStates.set( scene, [] ); + renderStates.get( scene ).push( renderState ); + + } else { + + if ( renderCallDepth >= renderStates.get( scene ).length ) { + + renderState = new WebGLRenderState( extensions, capabilities ); + renderStates.get( scene ).push( renderState ); + + } else { + + renderState = renderStates.get( scene )[ renderCallDepth ]; + + } + + } + + return renderState; + + } + + function dispose() { + + renderStates = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * parameters = { + * + * opacity: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + + function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + + this.setValues( parameters ); + + } + + MeshDepthMaterial.prototype = Object.create( Material.prototype ); + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + + MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * parameters = { + * + * referencePosition: , + * nearDistance: , + * farDistance: , + * + * skinning: , + * morphTargets: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: + * + * } + */ + + function MeshDistanceMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDistanceMaterial'; + + this.referencePosition = new Vector3(); + this.nearDistance = 1; + this.farDistance = 1000; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.fog = false; + + this.setValues( parameters ); + + } + + MeshDistanceMaterial.prototype = Object.create( Material.prototype ); + MeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial; + + MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true; + + MeshDistanceMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.referencePosition.copy( source.referencePosition ); + this.nearDistance = source.nearDistance; + this.farDistance = source.farDistance; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + return this; + + }; + + var vsm_frag = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\tfor ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean * HALF_SAMPLE_RATE;\n\tsquared_mean = squared_mean * HALF_SAMPLE_RATE;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"; + + var vsm_vert = "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}"; + + function WebGLShadowMap( _renderer, _objects, maxTextureSize ) { + + let _frustum = new Frustum(); + + const _shadowMapSize = new Vector2(), + _viewportSize = new Vector2(), + + _viewport = new Vector4(), + + _depthMaterials = [], + _distanceMaterials = [], + + _materialCache = {}; + + const shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide }; + + const shadowMaterialVertical = new ShaderMaterial( { + + defines: { + SAMPLE_RATE: 2.0 / 8.0, + HALF_SAMPLE_RATE: 1.0 / 8.0 + }, + + uniforms: { + shadow_pass: { value: null }, + resolution: { value: new Vector2() }, + radius: { value: 4.0 } + }, + + vertexShader: vsm_vert, + + fragmentShader: vsm_frag + + } ); + + const shadowMaterialHorizontal = shadowMaterialVertical.clone(); + shadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1; + + const fullScreenTri = new BufferGeometry(); + fullScreenTri.setAttribute( + 'position', + new BufferAttribute( + new Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ), + 3 + ) + ); + + const fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical ); + + const scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.render = function ( lights, scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( lights.length === 0 ) return; + + const currentRenderTarget = _renderer.getRenderTarget(); + const activeCubeFace = _renderer.getActiveCubeFace(); + const activeMipmapLevel = _renderer.getActiveMipmapLevel(); + + const _state = _renderer.state; + + // Set GL state for depth map. + _state.setBlending( NoBlending ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // render depth map + + for ( let i = 0, il = lights.length; i < il; i ++ ) { + + const light = lights[ i ]; + const shadow = light.shadow; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + if ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue; + + _shadowMapSize.copy( shadow.mapSize ); + + const shadowFrameExtents = shadow.getFrameExtents(); + + _shadowMapSize.multiply( shadowFrameExtents ); + + _viewportSize.copy( shadow.mapSize ); + + if ( _shadowMapSize.x > maxTextureSize || _shadowMapSize.y > maxTextureSize ) { + + if ( _shadowMapSize.x > maxTextureSize ) { + + _viewportSize.x = Math.floor( maxTextureSize / shadowFrameExtents.x ); + _shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x; + shadow.mapSize.x = _viewportSize.x; + + } + + if ( _shadowMapSize.y > maxTextureSize ) { + + _viewportSize.y = Math.floor( maxTextureSize / shadowFrameExtents.y ); + _shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y; + shadow.mapSize.y = _viewportSize.y; + + } + + } + + if ( shadow.map === null && ! shadow.isPointLightShadow && this.type === VSMShadowMap ) { + + const pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + '.shadowMap'; + + shadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + + shadow.camera.updateProjectionMatrix(); + + } + + if ( shadow.map === null ) { + + const pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + '.shadowMap'; + + shadow.camera.updateProjectionMatrix(); + + } + + _renderer.setRenderTarget( shadow.map ); + _renderer.clear(); + + const viewportCount = shadow.getViewportCount(); + + for ( let vp = 0; vp < viewportCount; vp ++ ) { + + const viewport = shadow.getViewport( vp ); + + _viewport.set( + _viewportSize.x * viewport.x, + _viewportSize.y * viewport.y, + _viewportSize.x * viewport.z, + _viewportSize.y * viewport.w + ); + + _state.viewport( _viewport ); + + shadow.updateMatrices( light, vp ); + + _frustum = shadow.getFrustum(); + + renderObject( scene, camera, shadow.camera, light, this.type ); + + } + + // do blur pass for VSM + + if ( ! shadow.isPointLightShadow && this.type === VSMShadowMap ) { + + VSMPass( shadow, camera ); + + } + + shadow.needsUpdate = false; + + } + + scope.needsUpdate = false; + + _renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel ); + + }; + + function VSMPass( shadow, camera ) { + + const geometry = _objects.update( fullScreenMesh ); + + // vertical pass + + shadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture; + shadowMaterialVertical.uniforms.resolution.value = shadow.mapSize; + shadowMaterialVertical.uniforms.radius.value = shadow.radius; + _renderer.setRenderTarget( shadow.mapPass ); + _renderer.clear(); + _renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null ); + + // horizontal pass + + shadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture; + shadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize; + shadowMaterialHorizontal.uniforms.radius.value = shadow.radius; + _renderer.setRenderTarget( shadow.map ); + _renderer.clear(); + _renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null ); + + } + + function getDepthMaterialVariant( useMorphing, useSkinning, useInstancing ) { + + const index = useMorphing << 0 | useSkinning << 1 | useInstancing << 2; + + let material = _depthMaterials[ index ]; + + if ( material === undefined ) { + + material = new MeshDepthMaterial( { + + depthPacking: RGBADepthPacking, + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _depthMaterials[ index ] = material; + + } + + return material; + + } + + function getDistanceMaterialVariant( useMorphing, useSkinning, useInstancing ) { + + const index = useMorphing << 0 | useSkinning << 1 | useInstancing << 2; + + let material = _distanceMaterials[ index ]; + + if ( material === undefined ) { + + material = new MeshDistanceMaterial( { + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _distanceMaterials[ index ] = material; + + } + + return material; + + } + + function getDepthMaterial( object, geometry, material, light, shadowCameraNear, shadowCameraFar, type ) { + + let result = null; + + let getMaterialVariant = getDepthMaterialVariant; + let customMaterial = object.customDepthMaterial; + + if ( light.isPointLight === true ) { + + getMaterialVariant = getDistanceMaterialVariant; + customMaterial = object.customDistanceMaterial; + + } + + if ( customMaterial === undefined ) { + + let useMorphing = false; + + if ( material.morphTargets === true ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } + + let useSkinning = false; + + if ( object.isSkinnedMesh === true ) { + + if ( material.skinning === true ) { + + useSkinning = true; + + } else { + + console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object ); + + } + + } + + const useInstancing = object.isInstancedMesh === true; + + result = getMaterialVariant( useMorphing, useSkinning, useInstancing ); + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + const keyA = result.uuid, keyB = material.uuid; + + let materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + let cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + if ( type === VSMShadowMap ) { + + result.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side; + + } else { + + result.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ]; + + } + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) { + + result.referencePosition.setFromMatrixPosition( light.matrixWorld ); + result.nearDistance = shadowCameraNear; + result.farDistance = shadowCameraFar; + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, light, type ) { + + if ( object.visible === false ) return; + + const visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + const geometry = _objects.update( object ); + const material = object.material; + + if ( Array.isArray( material ) ) { + + const groups = geometry.groups; + + for ( let k = 0, kl = groups.length; k < kl; k ++ ) { + + const group = groups[ k ]; + const groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + const depthMaterial = getDepthMaterial( object, geometry, groupMaterial, light, shadowCamera.near, shadowCamera.far, type ); + + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible ) { + + const depthMaterial = getDepthMaterial( object, geometry, material, light, shadowCamera.near, shadowCamera.far, type ); + + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, light, type ); + + } + + } + + } + + function WebGLState( gl, extensions, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + function ColorBuffer() { + + let locked = false; + + const color = new Vector4(); + let currentColorMask = null; + const currentColorClear = new Vector4( 0, 0, 0, 0 ); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a, premultipliedAlpha ) { + + if ( premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state + + } + + }; + + } + + function DepthBuffer() { + + let locked = false; + + let currentDepthMask = null; + let currentDepthFunc = null; + let currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( 2929 ); + + } else { + + disable( 2929 ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( 512 ); + break; + + case AlwaysDepth: + + gl.depthFunc( 519 ); + break; + + case LessDepth: + + gl.depthFunc( 513 ); + break; + + case LessEqualDepth: + + gl.depthFunc( 515 ); + break; + + case EqualDepth: + + gl.depthFunc( 514 ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( 518 ); + break; + + case GreaterDepth: + + gl.depthFunc( 516 ); + break; + + case NotEqualDepth: + + gl.depthFunc( 517 ); + break; + + default: + + gl.depthFunc( 515 ); + + } + + } else { + + gl.depthFunc( 515 ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + let locked = false; + + let currentStencilMask = null; + let currentStencilFunc = null; + let currentStencilRef = null; + let currentStencilFuncMask = null; + let currentStencilFail = null; + let currentStencilZFail = null; + let currentStencilZPass = null; + let currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( ! locked ) { + + if ( stencilTest ) { + + enable( 2960 ); + + } else { + + disable( 2960 ); + + } + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + const colorBuffer = new ColorBuffer(); + const depthBuffer = new DepthBuffer(); + const stencilBuffer = new StencilBuffer(); + + let enabledCapabilities = {}; + + let currentProgram = null; + + let currentBlendingEnabled = null; + let currentBlending = null; + let currentBlendEquation = null; + let currentBlendSrc = null; + let currentBlendDst = null; + let currentBlendEquationAlpha = null; + let currentBlendSrcAlpha = null; + let currentBlendDstAlpha = null; + let currentPremultipledAlpha = false; + + let currentFlipSided = null; + let currentCullFace = null; + + let currentLineWidth = null; + + let currentPolygonOffsetFactor = null; + let currentPolygonOffsetUnits = null; + + const maxTextures = gl.getParameter( 35661 ); + + let lineWidthAvailable = false; + let version = 0; + const glVersion = gl.getParameter( 7938 ); + + if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) { + + version = parseFloat( /^WebGL (\d)/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 1.0 ); + + } else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) { + + version = parseFloat( /^OpenGL ES (\d)/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 2.0 ); + + } + + let currentTextureSlot = null; + let currentBoundTextures = {}; + + const currentScissor = new Vector4(); + const currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + const data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + const texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, 10241, 9728 ); + gl.texParameteri( type, 10240, 9728 ); + + for ( let i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, 6408, 1, 1, 0, 6408, 5121, data ); + + } + + return texture; + + } + + const emptyTextures = {}; + emptyTextures[ 3553 ] = createTexture( 3553, 3553, 1 ); + emptyTextures[ 34067 ] = createTexture( 34067, 34069, 6 ); + + // init + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( 2929 ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( 2884 ); + + setBlending( NoBlending ); + + // + + function enable( id ) { + + if ( enabledCapabilities[ id ] !== true ) { + + gl.enable( id ); + enabledCapabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( enabledCapabilities[ id ] !== false ) { + + gl.disable( id ); + enabledCapabilities[ id ] = false; + + } + + } + + function useProgram( program ) { + + if ( currentProgram !== program ) { + + gl.useProgram( program ); + + currentProgram = program; + + return true; + + } + + return false; + + } + + const equationToGL = { + [ AddEquation ]: 32774, + [ SubtractEquation ]: 32778, + [ ReverseSubtractEquation ]: 32779 + }; + + if ( isWebGL2 ) { + + equationToGL[ MinEquation ] = 32775; + equationToGL[ MaxEquation ] = 32776; + + } else { + + const extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + equationToGL[ MinEquation ] = extension.MIN_EXT; + equationToGL[ MaxEquation ] = extension.MAX_EXT; + + } + + } + + const factorToGL = { + [ ZeroFactor ]: 0, + [ OneFactor ]: 1, + [ SrcColorFactor ]: 768, + [ SrcAlphaFactor ]: 770, + [ SrcAlphaSaturateFactor ]: 776, + [ DstColorFactor ]: 774, + [ DstAlphaFactor ]: 772, + [ OneMinusSrcColorFactor ]: 769, + [ OneMinusSrcAlphaFactor ]: 771, + [ OneMinusDstColorFactor ]: 775, + [ OneMinusDstAlphaFactor ]: 773 + }; + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending === NoBlending ) { + + if ( currentBlendingEnabled ) { + + disable( 3042 ); + currentBlendingEnabled = false; + + } + + return; + + } + + if ( ! currentBlendingEnabled ) { + + enable( 3042 ); + currentBlendingEnabled = true; + + } + + if ( blending !== CustomBlending ) { + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) { + + gl.blendEquation( 32774 ); + + currentBlendEquation = AddEquation; + currentBlendEquationAlpha = AddEquation; + + } + + if ( premultipliedAlpha ) { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( 1, 771, 1, 771 ); + break; + + case AdditiveBlending: + gl.blendFunc( 1, 1 ); + break; + + case SubtractiveBlending: + gl.blendFuncSeparate( 0, 0, 769, 771 ); + break; + + case MultiplyBlending: + gl.blendFuncSeparate( 0, 768, 0, 770 ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } else { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( 770, 771, 1, 771 ); + break; + + case AdditiveBlending: + gl.blendFunc( 770, 1 ); + break; + + case SubtractiveBlending: + gl.blendFunc( 0, 769 ); + break; + + case MultiplyBlending: + gl.blendFunc( 0, 768 ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } + + currentBlendSrc = null; + currentBlendDst = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + return; + + } + + // custom blending + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + currentBlending = blending; + currentPremultipledAlpha = null; + + } + + function setMaterial( material, frontFaceCW ) { + + material.side === DoubleSide + ? disable( 2884 ) + : enable( 2884 ); + + let flipSided = ( material.side === BackSide ); + if ( frontFaceCW ) flipSided = ! flipSided; + + setFlipSided( flipSided ); + + ( material.blending === NormalBlending && material.transparent === false ) + ? setBlending( NoBlending ) + : setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + const stencilWrite = material.stencilWrite; + stencilBuffer.setTest( stencilWrite ); + if ( stencilWrite ) { + + stencilBuffer.setMask( material.stencilWriteMask ); + stencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask ); + stencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass ); + + } + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( 2304 ); + + } else { + + gl.frontFace( 2305 ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( 2884 ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( 1029 ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( 1028 ); + + } else { + + gl.cullFace( 1032 ); + + } + + } + + } else { + + disable( 2884 ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( 32823 ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( 32823 ); + + } + + } + + function setScissorTest( scissorTest ) { + + if ( scissorTest ) { + + enable( 3089 ); + + } else { + + disable( 3089 ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = 33984 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + let boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function unbindTexture() { + + const boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture !== undefined && boundTexture.type !== undefined ) { + + gl.bindTexture( boundTexture.type, null ); + + boundTexture.type = undefined; + boundTexture.texture = undefined; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage3D() { + + try { + + gl.texImage3D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + enabledCapabilities = {}; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentProgram = null; + + currentBlendingEnabled = null; + currentBlending = null; + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + currentPremultipledAlpha = false; + + currentFlipSided = null; + currentCullFace = null; + + currentLineWidth = null; + + currentPolygonOffsetFactor = null; + currentPolygonOffsetUnits = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + enable: enable, + disable: disable, + + useProgram: useProgram, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + unbindTexture: unbindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + texImage3D: texImage3D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + + } + + function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) { + + const isWebGL2 = capabilities.isWebGL2; + const maxTextures = capabilities.maxTextures; + const maxCubemapSize = capabilities.maxCubemapSize; + const maxTextureSize = capabilities.maxTextureSize; + const maxSamples = capabilities.maxSamples; + + const _videoTextures = new WeakMap(); + let _canvas; + + // cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas, + // also OffscreenCanvas.getContext("webgl"), but not OffscreenCanvas.getContext("2d")! + // Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d). + + let useOffscreenCanvas = false; + + try { + + useOffscreenCanvas = typeof OffscreenCanvas !== 'undefined' + && ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null; + + } catch ( err ) { + + // Ignore any errors + + } + + function createCanvas( width, height ) { + + // Use OffscreenCanvas when available. Specially needed in web workers + + return useOffscreenCanvas ? + new OffscreenCanvas( width, height ) : + document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + + } + + function resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) { + + let scale = 1; + + // handle case if texture exceeds max size + + if ( image.width > maxSize || image.height > maxSize ) { + + scale = maxSize / Math.max( image.width, image.height ); + + } + + // only perform resize if necessary + + if ( scale < 1 || needsPowerOfTwo === true ) { + + // only perform resize for certain image types + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) { + + const floor = needsPowerOfTwo ? MathUtils.floorPowerOfTwo : Math.floor; + + const width = floor( scale * image.width ); + const height = floor( scale * image.height ); + + if ( _canvas === undefined ) _canvas = createCanvas( width, height ); + + // cube textures can't reuse the same canvas + + const canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas; + + canvas.width = width; + canvas.height = height; + + const context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, width, height ); + + console.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' ); + + return canvas; + + } else { + + if ( 'data' in image ) { + + console.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' ); + + } + + return image; + + } + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return MathUtils.isPowerOfTwo( image.width ) && MathUtils.isPowerOfTwo( image.height ); + + } + + function textureNeedsPowerOfTwo( texture ) { + + if ( isWebGL2 ) return false; + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + function textureNeedsGenerateMipmaps( texture, supportsMips ) { + + return texture.generateMipmaps && supportsMips && + texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + } + + function generateMipmap( target, texture, width, height ) { + + _gl.generateMipmap( target ); + + const textureProperties = properties.get( texture ); + + // Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11 + textureProperties.__maxMipLevel = Math.log( Math.max( width, height ) ) * Math.LOG2E; + + } + + function getInternalFormat( internalFormatName, glFormat, glType ) { + + if ( isWebGL2 === false ) return glFormat; + + if ( internalFormatName !== null ) { + + if ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ]; + + console.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \'' + internalFormatName + '\'' ); + + } + + let internalFormat = glFormat; + + if ( glFormat === 6403 ) { + + if ( glType === 5126 ) internalFormat = 33326; + if ( glType === 5131 ) internalFormat = 33325; + if ( glType === 5121 ) internalFormat = 33321; + + } + + if ( glFormat === 6407 ) { + + if ( glType === 5126 ) internalFormat = 34837; + if ( glType === 5131 ) internalFormat = 34843; + if ( glType === 5121 ) internalFormat = 32849; + + } + + if ( glFormat === 6408 ) { + + if ( glType === 5126 ) internalFormat = 34836; + if ( glType === 5131 ) internalFormat = 34842; + if ( glType === 5121 ) internalFormat = 32856; + + } + + if ( internalFormat === 33325 || internalFormat === 33326 || + internalFormat === 34842 || internalFormat === 34836 ) { + + extensions.get( 'EXT_color_buffer_float' ); + + } + + return internalFormat; + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) { + + return 9728; + + } + + return 9729; + + } + + // + + function onTextureDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + if ( texture.isVideoTexture ) { + + _videoTextures.delete( texture ); + + } + + info.memory.textures --; + + } + + function onRenderTargetDispose( event ) { + + const renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + info.memory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + const textureProperties = properties.get( texture ); + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + properties.remove( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + const renderTargetProperties = properties.get( renderTarget ); + const textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLCubeRenderTarget ) { + + for ( let i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer ); + if ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer ); + if ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer ); + + } + + properties.remove( renderTarget.texture ); + properties.remove( renderTarget ); + + } + + // + + let textureUnits = 0; + + function resetTextureUnits() { + + textureUnits = 0; + + } + + function allocateTextureUnit() { + + const textureUnit = textureUnits; + + if ( textureUnit >= maxTextures ) { + + console.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures ); + + } + + textureUnits += 1; + + return textureUnit; + + } + + // + + function setTexture2D( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.isVideoTexture ) updateVideoTexture( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + const image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 3553, textureProperties.__webglTexture ); + + } + + function setTexture2DArray( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 35866, textureProperties.__webglTexture ); + + } + + function setTexture3D( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 32879, textureProperties.__webglTexture ); + + } + + function setTextureCube( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadCubeTexture( textureProperties, texture, slot ); + return; + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 34067, textureProperties.__webglTexture ); + + } + + const wrappingToGL = { + [ RepeatWrapping ]: 10497, + [ ClampToEdgeWrapping ]: 33071, + [ MirroredRepeatWrapping ]: 33648 + }; + + const filterToGL = { + [ NearestFilter ]: 9728, + [ NearestMipmapNearestFilter ]: 9984, + [ NearestMipmapLinearFilter ]: 9986, + + [ LinearFilter ]: 9729, + [ LinearMipmapNearestFilter ]: 9985, + [ LinearMipmapLinearFilter ]: 9987 + }; + + function setTextureParameters( textureType, texture, supportsMips ) { + + if ( supportsMips ) { + + _gl.texParameteri( textureType, 10242, wrappingToGL[ texture.wrapS ] ); + _gl.texParameteri( textureType, 10243, wrappingToGL[ texture.wrapT ] ); + + if ( textureType === 32879 || textureType === 35866 ) { + + _gl.texParameteri( textureType, 32882, wrappingToGL[ texture.wrapR ] ); + + } + + _gl.texParameteri( textureType, 10240, filterToGL[ texture.magFilter ] ); + _gl.texParameteri( textureType, 10241, filterToGL[ texture.minFilter ] ); + + } else { + + _gl.texParameteri( textureType, 10242, 33071 ); + _gl.texParameteri( textureType, 10243, 33071 ); + + if ( textureType === 32879 || textureType === 35866 ) { + + _gl.texParameteri( textureType, 32882, 33071 ); + + } + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' ); + + } + + _gl.texParameteri( textureType, 10240, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, 10241, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' ); + + } + + } + + const extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && ( isWebGL2 || extensions.get( 'OES_texture_half_float_linear' ) ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function initTexture( textureProperties, texture ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + let textureType = 3553; + + if ( texture.isDataTexture2DArray ) textureType = 35866; + if ( texture.isDataTexture3D ) textureType = 32879; + + initTexture( textureProperties, texture ); + + state.activeTexture( 33984 + slot ); + state.bindTexture( textureType, textureProperties.__webglTexture ); + + _gl.pixelStorei( 37440, texture.flipY ); + _gl.pixelStorei( 37441, texture.premultiplyAlpha ); + _gl.pixelStorei( 3317, texture.unpackAlignment ); + + const needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false; + const image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize ); + + const supportsMips = isPowerOfTwo( image ) || isWebGL2, + glFormat = utils.convert( texture.format ); + + let glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType ); + + setTextureParameters( textureType, texture, supportsMips ); + + let mipmap; + const mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + glInternalFormat = 6402; + + if ( isWebGL2 ) { + + if ( texture.type === FloatType ) { + + glInternalFormat = 36012; + + } else if ( texture.type === UnsignedIntType ) { + + glInternalFormat = 33190; + + } else if ( texture.type === UnsignedInt248Type$1 ) { + + glInternalFormat = 35056; + + } else { + + glInternalFormat = 33189; // WebGL2 requires sized internalformat for glTexImage2D + + } + + } else { + + if ( texture.type === FloatType ) { + + console.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' ); + + } + + } + + // validation checks for WebGL 1 + + if ( texture.format === DepthFormat && glInternalFormat === 6402 ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = utils.convert( texture.type ); + + } + + } + + if ( texture.format === DepthStencilFormat && glInternalFormat === 6402 ) { + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + glInternalFormat = 34041; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type$1 ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type$1; + glType = utils.convert( texture.type ); + + } + + } + + // + + state.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && supportsMips ) { + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } + + } else if ( texture.isCompressedTexture ) { + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( glFormat !== null ) { + + state.compressedTexImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + state.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else if ( texture.isDataTexture2DArray ) { + + state.texImage3D( 35866, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } else if ( texture.isDataTexture3D ) { + + state.texImage3D( 32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && supportsMips ) { + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( 3553, i, glInternalFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( 3553, 0, glInternalFormat, glFormat, glType, image ); + textureProperties.__maxMipLevel = 0; + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + generateMipmap( textureType, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + function uploadCubeTexture( textureProperties, texture, slot ) { + + if ( texture.image.length !== 6 ) return; + + initTexture( textureProperties, texture ); + + state.activeTexture( 33984 + slot ); + state.bindTexture( 34067, textureProperties.__webglTexture ); + + _gl.pixelStorei( 37440, texture.flipY ); + + const isCompressed = ( texture && ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture ) ); + const isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + const cubeImage = []; + + for ( let i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + const image = cubeImage[ 0 ], + supportsMips = isPowerOfTwo( image ) || isWebGL2, + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType ); + + setTextureParameters( 34067, texture, supportsMips ); + + let mipmaps; + + if ( isCompressed ) { + + for ( let i = 0; i < 6; i ++ ) { + + mipmaps = cubeImage[ i ].mipmaps; + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( glFormat !== null ) { + + state.compressedTexImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' ); + + } + + } else { + + state.texImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + mipmaps = texture.mipmaps; + + for ( let i = 0; i < 6; i ++ ) { + + if ( isDataTexture ) { + + state.texImage2D( 34069 + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + const mipmapImage = mipmap.image[ i ].image; + + state.texImage2D( 34069 + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data ); + + } + + } else { + + state.texImage2D( 34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] ); + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + + state.texImage2D( 34069 + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] ); + + } + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length; + + } + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + // We assume images for cube map have the same size. + generateMipmap( 34067, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + const glFormat = utils.convert( renderTarget.texture.format ); + const glType = utils.convert( renderTarget.texture.type ); + const glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType ); + state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( 36160, framebuffer ); + _gl.framebufferTexture2D( 36160, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( 36160, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) { + + _gl.bindRenderbuffer( 36161, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + let glInternalFormat = 33189; + + if ( isMultisample ) { + + const depthTexture = renderTarget.depthTexture; + + if ( depthTexture && depthTexture.isDepthTexture ) { + + if ( depthTexture.type === FloatType ) { + + glInternalFormat = 36012; + + } else if ( depthTexture.type === UnsignedIntType ) { + + glInternalFormat = 33190; + + } + + } + + const samples = getRenderTargetSamples( renderTarget ); + + _gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } else { + + _gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height ); + + } + + _gl.framebufferRenderbuffer( 36160, 36096, 36161, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + if ( isMultisample ) { + + const samples = getRenderTargetSamples( renderTarget ); + + _gl.renderbufferStorageMultisample( 36161, samples, 35056, renderTarget.width, renderTarget.height ); + + } else { + + _gl.renderbufferStorage( 36161, 34041, renderTarget.width, renderTarget.height ); + + } + + + _gl.framebufferRenderbuffer( 36160, 33306, 36161, renderbuffer ); + + } else { + + const glFormat = utils.convert( renderTarget.texture.format ); + const glType = utils.convert( renderTarget.texture.type ); + const glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType ); + + if ( isMultisample ) { + + const samples = getRenderTargetSamples( renderTarget ); + + _gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } else { + + _gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height ); + + } + + } + + _gl.bindRenderbuffer( 36161, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + const isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget ); + if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' ); + + _gl.bindFramebuffer( 36160, framebuffer ); + + if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' ); + + } + + // upload an empty depth texture with framebuffer size + if ( ! properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + const webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( 36160, 36096, 3553, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( 36160, 33306, 3553, webglDepthTexture, 0 ); + + } else { + + throw new Error( 'Unknown depthTexture format' ); + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + const renderTargetProperties = properties.get( renderTarget ); + + const isCube = ( renderTarget.isWebGLCubeRenderTarget === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' ); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( let i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false ); + + } + + } else { + + _gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false ); + + } + + } + + _gl.bindFramebuffer( 36160, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + const renderTargetProperties = properties.get( renderTarget ); + const textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + const isCube = ( renderTarget.isWebGLCubeRenderTarget === true ); + const isMultisample = ( renderTarget.isWebGLMultisampleRenderTarget === true ); + const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2; + + // Handles WebGL2 RGBFormat fallback - #18858 + + if ( isWebGL2 && renderTarget.texture.format === RGBFormat && ( renderTarget.texture.type === FloatType || renderTarget.texture.type === HalfFloatType ) ) { + + renderTarget.texture.format = RGBAFormat; + + console.warn( 'THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.' ); + + } + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( let i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + if ( isMultisample ) { + + if ( isWebGL2 ) { + + renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer(); + renderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer(); + + _gl.bindRenderbuffer( 36161, renderTargetProperties.__webglColorRenderbuffer ); + + const glFormat = utils.convert( renderTarget.texture.format ); + const glType = utils.convert( renderTarget.texture.type ); + const glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType ); + const samples = getRenderTargetSamples( renderTarget ); + _gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + _gl.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer ); + _gl.framebufferRenderbuffer( 36160, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer ); + _gl.bindRenderbuffer( 36161, null ); + + if ( renderTarget.depthBuffer ) { + + renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true ); + + } + + _gl.bindFramebuffer( 36160, null ); + + + } else { + + console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' ); + + } + + } + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( 34067, textureProperties.__webglTexture ); + setTextureParameters( 34067, renderTarget.texture, supportsMips ); + + for ( let i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, 36064, 34069 + i ); + + } + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, supportsMips ) ) { + + generateMipmap( 34067, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( 34067, null ); + + } else { + + state.bindTexture( 3553, textureProperties.__webglTexture ); + setTextureParameters( 3553, renderTarget.texture, supportsMips ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, 36064, 3553 ); + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, supportsMips ) ) { + + generateMipmap( 3553, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( 3553, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + const texture = renderTarget.texture; + const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2; + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + const target = renderTarget.isWebGLCubeRenderTarget ? 34067 : 3553; + const webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + generateMipmap( target, texture, renderTarget.width, renderTarget.height ); + state.bindTexture( target, null ); + + } + + } + + function updateMultisampleRenderTarget( renderTarget ) { + + if ( renderTarget.isWebGLMultisampleRenderTarget ) { + + if ( isWebGL2 ) { + + const renderTargetProperties = properties.get( renderTarget ); + + _gl.bindFramebuffer( 36008, renderTargetProperties.__webglMultisampledFramebuffer ); + _gl.bindFramebuffer( 36009, renderTargetProperties.__webglFramebuffer ); + + const width = renderTarget.width; + const height = renderTarget.height; + let mask = 16384; + + if ( renderTarget.depthBuffer ) mask |= 256; + if ( renderTarget.stencilBuffer ) mask |= 1024; + + _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, 9728 ); + + _gl.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer ); // see #18905 + + } else { + + console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' ); + + } + + } + + } + + function getRenderTargetSamples( renderTarget ) { + + return ( isWebGL2 && renderTarget.isWebGLMultisampleRenderTarget ) ? + Math.min( maxSamples, renderTarget.samples ) : 0; + + } + + function updateVideoTexture( texture ) { + + const frame = info.render.frame; + + // Check the last frame we updated the VideoTexture + + if ( _videoTextures.get( texture ) !== frame ) { + + _videoTextures.set( texture, frame ); + texture.update(); + + } + + } + + // backwards compatibility + + let warnedTexture2D = false; + let warnedTextureCube = false; + + function safeSetTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( warnedTexture2D === false ) { + + console.warn( 'THREE.WebGLTextures.safeSetTexture2D: don\'t use render targets as textures. Use their .texture property instead.' ); + warnedTexture2D = true; + + } + + texture = texture.texture; + + } + + setTexture2D( texture, slot ); + + } + + function safeSetTextureCube( texture, slot ) { + + if ( texture && texture.isWebGLCubeRenderTarget ) { + + if ( warnedTextureCube === false ) { + + console.warn( 'THREE.WebGLTextures.safeSetTextureCube: don\'t use cube render targets as textures. Use their .texture property instead.' ); + warnedTextureCube = true; + + } + + texture = texture.texture; + + } + + + setTextureCube( texture, slot ); + + } + + // + + this.allocateTextureUnit = allocateTextureUnit; + this.resetTextureUnits = resetTextureUnits; + + this.setTexture2D = setTexture2D; + this.setTexture2DArray = setTexture2DArray; + this.setTexture3D = setTexture3D; + this.setTextureCube = setTextureCube; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + this.updateMultisampleRenderTarget = updateMultisampleRenderTarget; + + this.safeSetTexture2D = safeSetTexture2D; + this.safeSetTextureCube = safeSetTextureCube; + + } + + function WebGLUtils( gl, extensions, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + function convert( p ) { + + let extension; + + if ( p === UnsignedByteType ) return 5121; + if ( p === UnsignedShort4444Type ) return 32819; + if ( p === UnsignedShort5551Type ) return 32820; + if ( p === UnsignedShort565Type ) return 33635; + + if ( p === ByteType ) return 5120; + if ( p === ShortType ) return 5122; + if ( p === UnsignedShortType ) return 5123; + if ( p === IntType ) return 5124; + if ( p === UnsignedIntType ) return 5125; + if ( p === FloatType ) return 5126; + + if ( p === HalfFloatType ) { + + if ( isWebGL2 ) return 5131; + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) { + + return extension.HALF_FLOAT_OES; + + } else { + + return null; + + } + + } + + if ( p === AlphaFormat ) return 6406; + if ( p === RGBFormat ) return 6407; + if ( p === RGBAFormat ) return 6408; + if ( p === LuminanceFormat ) return 6409; + if ( p === LuminanceAlphaFormat ) return 6410; + if ( p === DepthFormat ) return 6402; + if ( p === DepthStencilFormat ) return 34041; + if ( p === RedFormat ) return 6403; + + // WebGL2 formats. + + if ( p === RedIntegerFormat ) return 36244; + if ( p === RGFormat ) return 33319; + if ( p === RGIntegerFormat ) return 33320; + if ( p === RGBIntegerFormat ) return 36248; + if ( p === RGBAIntegerFormat ) return 36249; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format$1 || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format$1 ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format$1 ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format$1 ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } else { + + return null; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } else { + + return null; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) { + + return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } else { + + return null; + + } + + } + + if ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc' ); + + if ( extension !== null ) { + + if ( p === RGB_ETC2_Format ) return extension.COMPRESSED_RGB8_ETC2; + if ( p === RGBA_ETC2_EAC_Format ) return extension.COMPRESSED_RGBA8_ETC2_EAC; + + } + + } + + if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || + p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || + p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || + p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || + p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format || + p === SRGB8_ALPHA8_ASTC_4x4_Format || p === SRGB8_ALPHA8_ASTC_5x4_Format || p === SRGB8_ALPHA8_ASTC_5x5_Format || + p === SRGB8_ALPHA8_ASTC_6x5_Format || p === SRGB8_ALPHA8_ASTC_6x6_Format || p === SRGB8_ALPHA8_ASTC_8x5_Format || + p === SRGB8_ALPHA8_ASTC_8x6_Format || p === SRGB8_ALPHA8_ASTC_8x8_Format || p === SRGB8_ALPHA8_ASTC_10x5_Format || + p === SRGB8_ALPHA8_ASTC_10x6_Format || p === SRGB8_ALPHA8_ASTC_10x8_Format || p === SRGB8_ALPHA8_ASTC_10x10_Format || + p === SRGB8_ALPHA8_ASTC_12x10_Format || p === SRGB8_ALPHA8_ASTC_12x12_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_astc' ); + + if ( extension !== null ) { + + // TODO Complete? + + return p; + + } else { + + return null; + + } + + } + + if ( p === RGBA_BPTC_Format ) { + + extension = extensions.get( 'EXT_texture_compression_bptc' ); + + if ( extension !== null ) { + + // TODO Complete? + + return p; + + } else { + + return null; + + } + + } + + if ( p === UnsignedInt248Type$1 ) { + + if ( isWebGL2 ) return 34042; + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) { + + return extension.UNSIGNED_INT_24_8_WEBGL; + + } else { + + return null; + + } + + } + + } + + return { convert: convert }; + + } + + function ArrayCamera( array = [] ) { + + PerspectiveCamera.call( this ); + + this.cameras = array; + + } + + ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), { + + constructor: ArrayCamera, + + isArrayCamera: true + + } ); + + function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + + } + + Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group, + + isGroup: true + + } ); + + function WebXRController() { + + this._targetRay = null; + this._grip = null; + this._hand = null; + + } + + Object.assign( WebXRController.prototype, { + + constructor: WebXRController, + + getHandSpace: function () { + + if ( this._hand === null ) { + + this._hand = new Group(); + this._hand.matrixAutoUpdate = false; + this._hand.visible = false; + + this._hand.joints = []; + this._hand.inputState = { pinching: false }; + + if ( window.XRHand ) { + + for ( let i = 0; i <= window.XRHand.LITTLE_PHALANX_TIP; i ++ ) { + + // The transform of this joint will be updated with the joint pose on each frame + const joint = new Group(); + joint.matrixAutoUpdate = false; + joint.visible = false; + this._hand.joints.push( joint ); + // ?? + this._hand.add( joint ); + + } + + } + + } + + return this._hand; + + }, + + getTargetRaySpace: function () { + + if ( this._targetRay === null ) { + + this._targetRay = new Group(); + this._targetRay.matrixAutoUpdate = false; + this._targetRay.visible = false; + + } + + return this._targetRay; + + }, + + getGripSpace: function () { + + if ( this._grip === null ) { + + this._grip = new Group(); + this._grip.matrixAutoUpdate = false; + this._grip.visible = false; + + } + + return this._grip; + + }, + + dispatchEvent: function ( event ) { + + if ( this._targetRay !== null ) { + + this._targetRay.dispatchEvent( event ); + + } + + if ( this._grip !== null ) { + + this._grip.dispatchEvent( event ); + + } + + if ( this._hand !== null ) { + + this._hand.dispatchEvent( event ); + + } + + return this; + + }, + + disconnect: function ( inputSource ) { + + this.dispatchEvent( { type: 'disconnected', data: inputSource } ); + + if ( this._targetRay !== null ) { + + this._targetRay.visible = false; + + } + + if ( this._grip !== null ) { + + this._grip.visible = false; + + } + + if ( this._hand !== null ) { + + this._hand.visible = false; + + } + + return this; + + }, + + update: function ( inputSource, frame, referenceSpace ) { + + let inputPose = null; + let gripPose = null; + let handPose = null; + + const targetRay = this._targetRay; + const grip = this._grip; + const hand = this._hand; + + if ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) { + + if ( hand && inputSource.hand ) { + + handPose = true; + + for ( let i = 0; i <= window.XRHand.LITTLE_PHALANX_TIP; i ++ ) { + + if ( inputSource.hand[ i ] ) { + + // Update the joints groups with the XRJoint poses + const jointPose = frame.getJointPose( inputSource.hand[ i ], referenceSpace ); + const joint = hand.joints[ i ]; + + if ( jointPose !== null ) { + + joint.matrix.fromArray( jointPose.transform.matrix ); + joint.matrix.decompose( joint.position, joint.rotation, joint.scale ); + joint.jointRadius = jointPose.radius; + + } + + joint.visible = jointPose !== null; + + // Custom events + + // Check pinch + const indexTip = hand.joints[ window.XRHand.INDEX_PHALANX_TIP ]; + const thumbTip = hand.joints[ window.XRHand.THUMB_PHALANX_TIP ]; + const distance = indexTip.position.distanceTo( thumbTip.position ); + + const distanceToPinch = 0.02; + const threshold = 0.005; + + if ( hand.inputState.pinching && distance > distanceToPinch + threshold ) { + + hand.inputState.pinching = false; + this.dispatchEvent( { + type: 'pinchend', + handedness: inputSource.handedness, + target: this + } ); + + } else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) { + + hand.inputState.pinching = true; + this.dispatchEvent( { + type: 'pinchstart', + handedness: inputSource.handedness, + target: this + } ); + + } + + } + + } + + } else { + + if ( targetRay !== null ) { + + inputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace ); + + if ( inputPose !== null ) { + + targetRay.matrix.fromArray( inputPose.transform.matrix ); + targetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale ); + + } + + } + + if ( grip !== null && inputSource.gripSpace ) { + + gripPose = frame.getPose( inputSource.gripSpace, referenceSpace ); + + if ( gripPose !== null ) { + + grip.matrix.fromArray( gripPose.transform.matrix ); + grip.matrix.decompose( grip.position, grip.rotation, grip.scale ); + + } + + } + + } + + } + + if ( targetRay !== null ) { + + targetRay.visible = ( inputPose !== null ); + + } + + if ( grip !== null ) { + + grip.visible = ( gripPose !== null ); + + } + + if ( hand !== null ) { + + hand.visible = ( handPose !== null ); + + } + + return this; + + } + + } ); + + function WebXRManager( renderer, gl ) { + + const scope = this; + + let session = null; + + let framebufferScaleFactor = 1.0; + + let referenceSpace = null; + let referenceSpaceType = 'local-floor'; + + let pose = null; + + const controllers = []; + const inputSourcesMap = new Map(); + + // + + const cameraL = new PerspectiveCamera(); + cameraL.layers.enable( 1 ); + cameraL.viewport = new Vector4(); + + const cameraR = new PerspectiveCamera(); + cameraR.layers.enable( 2 ); + cameraR.viewport = new Vector4(); + + const cameras = [ cameraL, cameraR ]; + + const cameraVR = new ArrayCamera(); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + let _currentDepthNear = null; + let _currentDepthFar = null; + + // + + this.enabled = false; + + this.isPresenting = false; + + this.getController = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getTargetRaySpace(); + + }; + + this.getControllerGrip = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getGripSpace(); + + }; + + this.getHand = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getHandSpace(); + + }; + + // + + function onSessionEvent( event ) { + + const controller = inputSourcesMap.get( event.inputSource ); + + if ( controller ) { + + controller.dispatchEvent( { type: event.type, data: event.inputSource } ); + + } + + } + + function onSessionEnd() { + + inputSourcesMap.forEach( function ( controller, inputSource ) { + + controller.disconnect( inputSource ); + + } ); + + inputSourcesMap.clear(); + + // + + renderer.setFramebuffer( null ); + renderer.setRenderTarget( renderer.getRenderTarget() ); // Hack #15830 + animation.stop(); + + scope.isPresenting = false; + + scope.dispatchEvent( { type: 'sessionend' } ); + + } + + function onRequestReferenceSpace( value ) { + + referenceSpace = value; + + animation.setContext( session ); + animation.start(); + + scope.isPresenting = true; + + scope.dispatchEvent( { type: 'sessionstart' } ); + + } + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + if ( scope.isPresenting === true ) { + + console.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' ); + + } + + }; + + this.setReferenceSpaceType = function ( value ) { + + referenceSpaceType = value; + + if ( scope.isPresenting === true ) { + + console.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' ); + + } + + }; + + this.getReferenceSpace = function () { + + return referenceSpace; + + }; + + this.getSession = function () { + + return session; + + }; + + this.setSession = function ( value ) { + + session = value; + + if ( session !== null ) { + + session.addEventListener( 'select', onSessionEvent ); + session.addEventListener( 'selectstart', onSessionEvent ); + session.addEventListener( 'selectend', onSessionEvent ); + session.addEventListener( 'squeeze', onSessionEvent ); + session.addEventListener( 'squeezestart', onSessionEvent ); + session.addEventListener( 'squeezeend', onSessionEvent ); + session.addEventListener( 'end', onSessionEnd ); + + const attributes = gl.getContextAttributes(); + + if ( attributes.xrCompatible !== true ) { + + gl.makeXRCompatible(); + + } + + const layerInit = { + antialias: attributes.antialias, + alpha: attributes.alpha, + depth: attributes.depth, + stencil: attributes.stencil, + framebufferScaleFactor: framebufferScaleFactor + }; + + // eslint-disable-next-line no-undef + const baseLayer = new XRWebGLLayer( session, gl, layerInit ); + + session.updateRenderState( { baseLayer: baseLayer } ); + + session.requestReferenceSpace( referenceSpaceType ).then( onRequestReferenceSpace ); + + // + + session.addEventListener( 'inputsourceschange', updateInputSources ); + + } + + }; + + function updateInputSources( event ) { + + const inputSources = session.inputSources; + + // Assign inputSources to available controllers + + for ( let i = 0; i < controllers.length; i ++ ) { + + inputSourcesMap.set( inputSources[ i ], controllers[ i ] ); + + } + + // Notify disconnected + + for ( let i = 0; i < event.removed.length; i ++ ) { + + const inputSource = event.removed[ i ]; + const controller = inputSourcesMap.get( inputSource ); + + if ( controller ) { + + controller.dispatchEvent( { type: 'disconnected', data: inputSource } ); + inputSourcesMap.delete( inputSource ); + + } + + } + + // Notify connected + + for ( let i = 0; i < event.added.length; i ++ ) { + + const inputSource = event.added[ i ]; + const controller = inputSourcesMap.get( inputSource ); + + if ( controller ) { + + controller.dispatchEvent( { type: 'connected', data: inputSource } ); + + } + + } + + } + + // + + const cameraLPos = new Vector3(); + const cameraRPos = new Vector3(); + + /** + * Assumes 2 cameras that are parallel and share an X-axis, and that + * the cameras' projection and world matrices have already been set. + * And that near and far planes are identical for both cameras. + * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765 + */ + function setProjectionFromUnion( camera, cameraL, cameraR ) { + + cameraLPos.setFromMatrixPosition( cameraL.matrixWorld ); + cameraRPos.setFromMatrixPosition( cameraR.matrixWorld ); + + const ipd = cameraLPos.distanceTo( cameraRPos ); + + const projL = cameraL.projectionMatrix.elements; + const projR = cameraR.projectionMatrix.elements; + + // VR systems will have identical far and near planes, and + // most likely identical top and bottom frustum extents. + // Use the left camera for these values. + const near = projL[ 14 ] / ( projL[ 10 ] - 1 ); + const far = projL[ 14 ] / ( projL[ 10 ] + 1 ); + const topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ]; + const bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ]; + + const leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ]; + const rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ]; + const left = near * leftFov; + const right = near * rightFov; + + // Calculate the new camera's position offset from the + // left camera. xOffset should be roughly half `ipd`. + const zOffset = ipd / ( - leftFov + rightFov ); + const xOffset = zOffset * - leftFov; + + // TODO: Better way to apply this offset? + cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale ); + camera.translateX( xOffset ); + camera.translateZ( zOffset ); + camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale ); + camera.matrixWorldInverse.copy( camera.matrixWorld ).invert(); + + // Find the union of the frustum values of the cameras and scale + // the values so that the near plane's position does not change in world space, + // although must now be relative to the new union camera. + const near2 = near + zOffset; + const far2 = far + zOffset; + const left2 = left - xOffset; + const right2 = right + ( ipd - xOffset ); + const top2 = topFov * far / far2 * near2; + const bottom2 = bottomFov * far / far2 * near2; + + camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 ); + + } + + function updateCamera( camera, parent ) { + + if ( parent === null ) { + + camera.matrixWorld.copy( camera.matrix ); + + } else { + + camera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix ); + + } + + camera.matrixWorldInverse.copy( camera.matrixWorld ).invert(); + + } + + this.getCamera = function ( camera ) { + + cameraVR.near = cameraR.near = cameraL.near = camera.near; + cameraVR.far = cameraR.far = cameraL.far = camera.far; + + if ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) { + + // Note that the new renderState won't apply until the next frame. See #18320 + + session.updateRenderState( { + depthNear: cameraVR.near, + depthFar: cameraVR.far + } ); + + _currentDepthNear = cameraVR.near; + _currentDepthFar = cameraVR.far; + + } + + const parent = camera.parent; + const cameras = cameraVR.cameras; + + updateCamera( cameraVR, parent ); + + for ( let i = 0; i < cameras.length; i ++ ) { + + updateCamera( cameras[ i ], parent ); + + } + + // update camera and its children + + camera.matrixWorld.copy( cameraVR.matrixWorld ); + + const children = camera.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( true ); + + } + + // update projection matrix for proper view frustum culling + + if ( cameras.length === 2 ) { + + setProjectionFromUnion( cameraVR, cameraL, cameraR ); + + } else { + + // assume single camera setup (AR) + + cameraVR.projectionMatrix.copy( cameraL.projectionMatrix ); + + } + + return cameraVR; + + }; + + // Animation Loop + + let onAnimationFrameCallback = null; + + function onAnimationFrame( time, frame ) { + + pose = frame.getViewerPose( referenceSpace ); + + if ( pose !== null ) { + + const views = pose.views; + const baseLayer = session.renderState.baseLayer; + + renderer.setFramebuffer( baseLayer.framebuffer ); + + let cameraVRNeedsUpdate = false; + + // check if it's necessary to rebuild cameraVR's camera list + + if ( views.length !== cameraVR.cameras.length ) { + + cameraVR.cameras.length = 0; + cameraVRNeedsUpdate = true; + + } + + for ( let i = 0; i < views.length; i ++ ) { + + const view = views[ i ]; + const viewport = baseLayer.getViewport( view ); + + const camera = cameras[ i ]; + camera.matrix.fromArray( view.transform.matrix ); + camera.projectionMatrix.fromArray( view.projectionMatrix ); + camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height ); + + if ( i === 0 ) { + + cameraVR.matrix.copy( camera.matrix ); + + } + + if ( cameraVRNeedsUpdate === true ) { + + cameraVR.cameras.push( camera ); + + } + + } + + } + + // + + const inputSources = session.inputSources; + + for ( let i = 0; i < controllers.length; i ++ ) { + + const controller = controllers[ i ]; + const inputSource = inputSources[ i ]; + + controller.update( inputSource, frame, referenceSpace ); + + } + + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame ); + + } + + const animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + + }; + + this.dispose = function () {}; + + } + + Object.assign( WebXRManager.prototype, EventDispatcher$1.prototype ); + + function WebGLMaterials( properties ) { + + function refreshFogUniforms( uniforms, fog ) { + + uniforms.fogColor.value.copy( fog.color ); + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshMaterialUniforms( uniforms, material, pixelRatio, height ) { + + if ( material.isMeshBasicMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsLambert( uniforms, material ); + + } else if ( material.isMeshToonMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsToon( uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsPhong( uniforms, material ); + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( uniforms, material ); + + } else { + + refreshUniformsStandard( uniforms, material ); + + } + + } else if ( material.isMeshMatcapMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsMatcap( uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsDepth( uniforms, material ); + + } else if ( material.isMeshDistanceMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsDistance( uniforms, material ); + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsNormal( uniforms, material ); + + } else if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( uniforms, material ); + + if ( material.isLineDashedMaterial ) { + + refreshUniformsDash( uniforms, material ); + + } + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( uniforms, material, pixelRatio, height ); + + } else if ( material.isSpriteMaterial ) { + + refreshUniformsSprites( uniforms, material ); + + } else if ( material.isShadowMaterial ) { + + uniforms.color.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + + } else if ( material.isShaderMaterial ) { + + material.uniformsNeedUpdate = false; // #15581 + + } + + } + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + if ( material.color ) { + + uniforms.diffuse.value.copy( material.color ); + + } + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + if ( material.specularMap ) { + + uniforms.specularMap.value = material.specularMap; + + } + + const envMap = properties.get( material ).envMap; + + if ( envMap ) { + + uniforms.envMap.value = envMap; + + uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap._needsFlipEnvMap ) ? - 1 : 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + const maxMipLevel = properties.get( envMap ).__maxMipLevel; + + if ( maxMipLevel !== undefined ) { + + uniforms.maxMipLevel.value = maxMipLevel; + + } + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. displacementMap map + // 4. normal map + // 5. bump map + // 6. roughnessMap map + // 7. metalnessMap map + // 8. alphaMap map + // 9. emissiveMap map + // 10. clearcoat map + // 11. clearcoat normal map + // 12. clearcoat roughnessMap map + + let uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } else if ( material.clearcoatMap ) { + + uvScaleMap = material.clearcoatMap; + + } else if ( material.clearcoatNormalMap ) { + + uvScaleMap = material.clearcoatNormalMap; + + } else if ( material.clearcoatRoughnessMap ) { + + uvScaleMap = material.clearcoatRoughnessMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + // uv repeat and offset setting priorities for uv2 + // 1. ao map + // 2. light map + + let uv2ScaleMap; + + if ( material.aoMap ) { + + uv2ScaleMap = material.aoMap; + + } else if ( material.lightMap ) { + + uv2ScaleMap = material.lightMap; + + } + + if ( uv2ScaleMap !== undefined ) { + + // backwards compatibility + if ( uv2ScaleMap.isWebGLRenderTarget ) { + + uv2ScaleMap = uv2ScaleMap.texture; + + } + + if ( uv2ScaleMap.matrixAutoUpdate === true ) { + + uv2ScaleMap.updateMatrix(); + + } + + uniforms.uv2Transform.value.copy( uv2ScaleMap.matrix ); + + } + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material, pixelRatio, height ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * pixelRatio; + uniforms.scale.value = height * 0.5; + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. alpha map + + let uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } + + if ( uvScaleMap !== undefined ) { + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + } + + function refreshUniformsSprites( uniforms, material ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + uniforms.rotation.value = material.rotation; + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. alpha map + + let uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } + + if ( uvScaleMap !== undefined ) { + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value.copy( material.specular ); + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + const envMap = properties.get( material ).envMap; + + if ( envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + refreshUniformsStandard( uniforms, material ); + + uniforms.reflectivity.value = material.reflectivity; // also part of uniforms common + + uniforms.clearcoat.value = material.clearcoat; + uniforms.clearcoatRoughness.value = material.clearcoatRoughness; + if ( material.sheen ) uniforms.sheen.value.copy( material.sheen ); + + if ( material.clearcoatMap ) { + + uniforms.clearcoatMap.value = material.clearcoatMap; + + } + + if ( material.clearcoatRoughnessMap ) { + + uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap; + + } + + if ( material.clearcoatNormalMap ) { + + uniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale ); + uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap; + + if ( material.side === BackSide ) { + + uniforms.clearcoatNormalScale.value.negate(); + + } + + } + + uniforms.transmission.value = material.transmission; + + if ( material.transmissionMap ) { + + uniforms.transmissionMap.value = material.transmissionMap; + + } + + } + + function refreshUniformsMatcap( uniforms, material ) { + + if ( material.matcap ) { + + uniforms.matcap.value = material.matcap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDepth( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDistance( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + uniforms.referencePosition.value.copy( material.referencePosition ); + uniforms.nearDistance.value = material.nearDistance; + uniforms.farDistance.value = material.farDistance; + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + return { + refreshFogUniforms: refreshFogUniforms, + refreshMaterialUniforms: refreshMaterialUniforms + }; + + } + + function createCanvasElement() { + + const canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.style.display = 'block'; + return canvas; + + } + + function WebGLRenderer( parameters ) { + + parameters = parameters || {}; + + const _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default', + _failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false; + + let currentRenderList = null; + let currentRenderState = null; + + // render() can be called from within a callback triggered by another render. + // We track this so that the nested render call gets its state isolated from the parent render call. + + const renderStateStack = []; + + // public properties + + this.domElement = _canvas; + + // Debug configuration container + this.debug = { + + /** + * Enables error checking and reporting when shader programs are being compiled + * @type {boolean} + */ + checkShaderErrors: true + }; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.outputEncoding = LinearEncoding; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = NoToneMapping; + this.toneMappingExposure = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + const _this = this; + + let _isContextLost = false; + + // internal state cache + + let _framebuffer = null; + + let _currentActiveCubeFace = 0; + let _currentActiveMipmapLevel = 0; + let _currentRenderTarget = null; + let _currentFramebuffer = null; + let _currentMaterialId = - 1; + + let _currentCamera = null; + + const _currentViewport = new Vector4(); + const _currentScissor = new Vector4(); + let _currentScissorTest = null; + + // + + let _width = _canvas.width; + let _height = _canvas.height; + + let _pixelRatio = 1; + let _opaqueSort = null; + let _transparentSort = null; + + const _viewport = new Vector4( 0, 0, _width, _height ); + const _scissor = new Vector4( 0, 0, _width, _height ); + let _scissorTest = false; + + // frustum + + const _frustum = new Frustum(); + + // clipping + + let _clippingEnabled = false; + let _localClippingEnabled = false; + + // camera matrices cache + + const _projScreenMatrix = new Matrix4(); + + const _vector3 = new Vector3(); + + const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true }; + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + // initialize + + let _gl = _context; + + function getContext( contextNames, contextAttributes ) { + + for ( let i = 0; i < contextNames.length; i ++ ) { + + const contextName = contextNames[ i ]; + const context = _canvas.getContext( contextName, contextAttributes ); + if ( context !== null ) return context; + + } + + return null; + + } + + try { + + const contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer, + powerPreference: _powerPreference, + failIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat + }; + + // event listeners must be registered before WebGL context is created, see #12753 + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.addEventListener( 'webglcontextrestored', onContextRestore, false ); + + if ( _gl === null ) { + + const contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ]; + + if ( _this.isWebGL1Renderer === true ) { + + contextNames.shift(); + + } + + _gl = getContext( contextNames, contextAttributes ); + + if ( _gl === null ) { + + if ( getContext( contextNames ) ) { + + throw new Error( 'Error creating WebGL context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL context.' ); + + } + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error.message ); + throw error; + + } + + let extensions, capabilities, state, info; + let properties, textures, cubemaps, attributes, geometries, objects; + let programCache, materials, renderLists, renderStates, clipping; + + let background, morphtargets, bufferRenderer, indexedBufferRenderer; + + let utils, bindingStates; + + function initGLContext() { + + extensions = new WebGLExtensions( _gl ); + + capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + if ( capabilities.isWebGL2 === false ) { + + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'OES_element_index_uint' ); + extensions.get( 'OES_vertex_array_object' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + } + + extensions.get( 'OES_texture_float_linear' ); + + utils = new WebGLUtils( _gl, extensions, capabilities ); + + state = new WebGLState( _gl, extensions, capabilities ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() ); + + info = new WebGLInfo( _gl ); + properties = new WebGLProperties(); + textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); + cubemaps = new WebGLCubeMaps( _this ); + attributes = new WebGLAttributes( _gl, capabilities ); + bindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities ); + geometries = new WebGLGeometries( _gl, attributes, info, bindingStates ); + objects = new WebGLObjects( _gl, geometries, attributes, info ); + morphtargets = new WebGLMorphtargets( _gl ); + clipping = new WebGLClipping( properties ); + programCache = new WebGLPrograms( _this, cubemaps, extensions, capabilities, bindingStates, clipping ); + materials = new WebGLMaterials( properties ); + renderLists = new WebGLRenderLists( properties ); + renderStates = new WebGLRenderStates( extensions, capabilities ); + background = new WebGLBackground( _this, cubemaps, state, objects, _premultipliedAlpha ); + + bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities ); + indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities ); + + info.programs = programCache.programs; + + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.state = state; + _this.info = info; + + } + + initGLContext(); + + // xr + + const xr = new WebXRManager( _this, _gl ); + + this.xr = xr; + + // shadow map + + const shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize ); + + this.shadowMap = shadowMap; + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + const extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.forceContextRestore = function () { + + const extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.restoreContext(); + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _width, _height, false ); + + }; + + this.getSize = function ( target ) { + + if ( target === undefined ) { + + console.warn( 'WebGLRenderer: .getsize() now requires a Vector2 as an argument' ); + + target = new Vector2(); + + } + + return target.set( _width, _height ); + + }; + + this.setSize = function ( width, height, updateStyle ) { + + if ( xr.isPresenting ) { + + console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' ); + return; + + } + + _width = width; + _height = height; + + _canvas.width = Math.floor( width * _pixelRatio ); + _canvas.height = Math.floor( height * _pixelRatio ); + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.getDrawingBufferSize = function ( target ) { + + if ( target === undefined ) { + + console.warn( 'WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument' ); + + target = new Vector2(); + + } + + return target.set( _width * _pixelRatio, _height * _pixelRatio ).floor(); + + }; + + this.setDrawingBufferSize = function ( width, height, pixelRatio ) { + + _width = width; + _height = height; + + _pixelRatio = pixelRatio; + + _canvas.width = Math.floor( width * pixelRatio ); + _canvas.height = Math.floor( height * pixelRatio ); + + this.setViewport( 0, 0, width, height ); + + }; + + this.getCurrentViewport = function ( target ) { + + if ( target === undefined ) { + + console.warn( 'WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument' ); + + target = new Vector4(); + + } + + return target.copy( _currentViewport ); + + }; + + this.getViewport = function ( target ) { + + return target.copy( _viewport ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + if ( x.isVector4 ) { + + _viewport.set( x.x, x.y, x.z, x.w ); + + } else { + + _viewport.set( x, y, width, height ); + + } + + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() ); + + }; + + this.getScissor = function ( target ) { + + return target.copy( _scissor ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + if ( x.isVector4 ) { + + _scissor.set( x.x, x.y, x.z, x.w ); + + } else { + + _scissor.set( x, y, width, height ); + + } + + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() ); + + }; + + this.getScissorTest = function () { + + return _scissorTest; + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + this.setOpaqueSort = function ( method ) { + + _opaqueSort = method; + + }; + + this.setTransparentSort = function ( method ) { + + _transparentSort = method; + + }; + + // Clearing + + this.getClearColor = function ( target ) { + + if ( target === undefined ) { + + console.warn( 'WebGLRenderer: .getClearColor() now requires a Color as an argument' ); + + target = new Color(); + + } + + return target.copy( background.getClearColor() ); + + }; + + this.setClearColor = function () { + + background.setClearColor.apply( background, arguments ); + + }; + + this.getClearAlpha = function () { + + return background.getClearAlpha(); + + }; + + this.setClearAlpha = function () { + + background.setClearAlpha.apply( background, arguments ); + + }; + + this.clear = function ( color, depth, stencil ) { + + let bits = 0; + + if ( color === undefined || color ) bits |= 16384; + if ( depth === undefined || depth ) bits |= 256; + if ( stencil === undefined || stencil ) bits |= 1024; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + // + + this.dispose = function () { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false ); + + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + cubemaps.dispose(); + objects.dispose(); + bindingStates.dispose(); + + xr.dispose(); + + animation.stop(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + console.log( 'THREE.WebGLRenderer: Context Lost.' ); + + _isContextLost = true; + + } + + function onContextRestore( /* event */ ) { + + console.log( 'THREE.WebGLRenderer: Context Restored.' ); + + _isContextLost = false; + + initGLContext(); + + } + + function onMaterialDispose( event ) { + + const material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + const programInfo = properties.get( material ).program; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + function renderObjectImmediate( object, program ) { + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program ); + + } ); + + } + + this.renderBufferImmediate = function ( object, program ) { + + bindingStates.initAttributes(); + + const buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + const programAttributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( 34962, buffers.position ); + _gl.bufferData( 34962, object.positionArray, 35048 ); + + bindingStates.enableAttribute( programAttributes.position ); + _gl.vertexAttribPointer( programAttributes.position, 3, 5126, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( 34962, buffers.normal ); + _gl.bufferData( 34962, object.normalArray, 35048 ); + + bindingStates.enableAttribute( programAttributes.normal ); + _gl.vertexAttribPointer( programAttributes.normal, 3, 5126, false, 0, 0 ); + + } + + if ( object.hasUvs ) { + + _gl.bindBuffer( 34962, buffers.uv ); + _gl.bufferData( 34962, object.uvArray, 35048 ); + + bindingStates.enableAttribute( programAttributes.uv ); + _gl.vertexAttribPointer( programAttributes.uv, 2, 5126, false, 0, 0 ); + + } + + if ( object.hasColors ) { + + _gl.bindBuffer( 34962, buffers.color ); + _gl.bufferData( 34962, object.colorArray, 35048 ); + + bindingStates.enableAttribute( programAttributes.color ); + _gl.vertexAttribPointer( programAttributes.color, 3, 5126, false, 0, 0 ); + + } + + bindingStates.disableUnusedAttributes(); + + _gl.drawArrays( 4, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) { + + if ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null) + + const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 ); + + const program = setProgram( camera, scene, material, object ); + + state.setMaterial( material, frontFaceCW ); + + // + + let index = geometry.index; + const position = geometry.attributes.position; + + // + + if ( index === null ) { + + if ( position === undefined || position.count === 0 ) return; + + } else if ( index.count === 0 ) { + + return; + + } + + // + + let rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + if ( material.morphTargets || material.morphNormals ) { + + morphtargets.update( object, geometry, material, program ); + + } + + bindingStates.setup( object, material, program, geometry, index ); + + let attribute; + let renderer = bufferRenderer; + + if ( index !== null ) { + + attribute = attributes.get( index ); + + renderer = indexedBufferRenderer; + renderer.setIndex( attribute ); + + } + + // + + const dataCount = ( index !== null ) ? index.count : position.count; + + const rangeStart = geometry.drawRange.start * rangeFactor; + const rangeCount = geometry.drawRange.count * rangeFactor; + + const groupStart = group !== null ? group.start * rangeFactor : 0; + const groupCount = group !== null ? group.count * rangeFactor : Infinity; + + const drawStart = Math.max( rangeStart, groupStart ); + const drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + const drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( 1 ); + + } else { + + renderer.setMode( 4 ); + + } + + } else if ( object.isLine ) { + + let lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( 1 ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( 2 ); + + } else { + + renderer.setMode( 3 ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( 0 ); + + } else if ( object.isSprite ) { + + renderer.setMode( 4 ); + + } + + if ( object.isInstancedMesh ) { + + renderer.renderInstances( drawStart, drawCount, object.count ); + + } else if ( geometry.isInstancedBufferGeometry ) { + + const instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount ); + + renderer.renderInstances( drawStart, drawCount, instanceCount ); + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + // Compile + + this.compile = function ( scene, camera ) { + + currentRenderState = renderStates.get( scene ); + currentRenderState.init(); + + scene.traverseVisible( function ( object ) { + + if ( object.isLight && object.layers.test( camera.layers ) ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + currentRenderState.setupLights(); + + const compiled = new WeakMap(); + + scene.traverse( function ( object ) { + + const material = object.material; + + if ( material ) { + + if ( Array.isArray( material ) ) { + + for ( let i = 0; i < material.length; i ++ ) { + + const material2 = material[ i ]; + + if ( compiled.has( material2 ) === false ) { + + initMaterial( material2, scene, object ); + compiled.set( material2 ); + + } + + } + + } else if ( compiled.has( material ) === false ) { + + initMaterial( material, scene, object ); + compiled.set( material ); + + } + + } + + } ); + + }; + + // Animation Loop + + let onAnimationFrameCallback = null; + + function onAnimationFrame( time ) { + + if ( xr.isPresenting ) return; + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + const animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + if ( typeof window !== 'undefined' ) animation.setContext( window ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + xr.setAnimationLoop( callback ); + + ( callback === null ) ? animation.stop() : animation.start(); + + }; + + // Rendering + + this.render = function ( scene, camera ) { + + let renderTarget, forceClear; + + if ( arguments[ 2 ] !== undefined ) { + + console.warn( 'THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.' ); + renderTarget = arguments[ 2 ]; + + } + + if ( arguments[ 3 ] !== undefined ) { + + console.warn( 'THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.' ); + forceClear = arguments[ 3 ]; + + } + + if ( camera !== undefined && camera.isCamera !== true ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + if ( _isContextLost === true ) return; + + // reset caching for this frame + + bindingStates.resetDefaultState(); + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + if ( xr.enabled === true && xr.isPresenting === true ) { + + camera = xr.getCamera( camera ); + + } + + // + if ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, renderTarget || _currentRenderTarget ); + + currentRenderState = renderStates.get( scene, renderStateStack.length ); + currentRenderState.init(); + + renderStateStack.push( currentRenderState ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromProjectionMatrix( _projScreenMatrix ); + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + currentRenderList = renderLists.get( scene, camera ); + currentRenderList.init(); + + projectObject( scene, camera, 0, _this.sortObjects ); + + currentRenderList.finish(); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort( _opaqueSort, _transparentSort ); + + } + + // + + if ( _clippingEnabled === true ) clipping.beginShadows(); + + const shadowsArray = currentRenderState.state.shadowsArray; + + shadowMap.render( shadowsArray, scene, camera ); + + currentRenderState.setupLights(); + currentRenderState.setupLightsView( camera ); + + if ( _clippingEnabled === true ) clipping.endShadows(); + + // + + if ( this.info.autoReset === true ) this.info.reset(); + + if ( renderTarget !== undefined ) { + + this.setRenderTarget( renderTarget ); + + } + + // + + background.render( currentRenderList, scene, camera, forceClear ); + + // render scene + + const opaqueObjects = currentRenderList.opaque; + const transparentObjects = currentRenderList.transparent; + + if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera ); + if ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera ); + + // + + if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera ); + + // + + if ( _currentRenderTarget !== null ) { + + // Generate mipmap if we're using any kind of mipmap filtering + + textures.updateRenderTargetMipmap( _currentRenderTarget ); + + // resolve multisample renderbuffers to a single-sample texture if necessary + + textures.updateMultisampleRenderTarget( _currentRenderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + state.setPolygonOffset( false ); + + // _gl.finish(); + + renderStateStack.pop(); + if ( renderStateStack.length > 0 ) { + + currentRenderState = renderStateStack[ renderStateStack.length - 1 ]; + + } else { + + currentRenderState = null; + + } + + currentRenderList = null; + + }; + + function projectObject( object, camera, groupOrder, sortObjects ) { + + if ( object.visible === false ) return; + + const visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isGroup ) { + + groupOrder = object.renderOrder; + + } else if ( object.isLOD ) { + + if ( object.autoUpdate === true ) object.update( camera ); + + } else if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + const geometry = objects.update( object ); + const material = object.material; + + if ( material.visible ) { + + currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null ); + + } + + } + + } else if ( object.isImmediateRenderObject ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + currentRenderList.push( object, null, object.material, groupOrder, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + // update skeleton only once in a frame + + if ( object.skeleton.frame !== info.render.frame ) { + + object.skeleton.update(); + object.skeleton.frame = info.render.frame; + + } + + } + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + const geometry = objects.update( object ); + const material = object.material; + + if ( Array.isArray( material ) ) { + + const groups = geometry.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null ); + + } + + } + + } + + } + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, groupOrder, sortObjects ); + + } + + } + + function renderObjects( renderList, scene, camera ) { + + const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; + + for ( let i = 0, l = renderList.length; i < l; i ++ ) { + + const renderItem = renderList[ i ]; + + const object = renderItem.object; + const geometry = renderItem.geometry; + const material = overrideMaterial === null ? renderItem.material : overrideMaterial; + const group = renderItem.group; + + if ( camera.isArrayCamera ) { + + const cameras = camera.cameras; + + for ( let j = 0, jl = cameras.length; j < jl; j ++ ) { + + const camera2 = cameras[ j ]; + + if ( object.layers.test( camera2.layers ) ) { + + state.viewport( _currentViewport.copy( camera2.viewport ) ); + + currentRenderState.setupLightsView( camera2 ); + + renderObject( object, scene, camera2, geometry, material, group ); + + } + + } + + } else { + + renderObject( object, scene, camera, geometry, material, group ); + + } + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object.isImmediateRenderObject ) { + + const program = setProgram( camera, scene, material, object ); + + state.setMaterial( material ); + + bindingStates.reset(); + + renderObjectImmediate( object, program ); + + } else { + + _this.renderBufferDirect( camera, scene, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + + } + + function initMaterial( material, scene, object ) { + + if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ... + + const materialProperties = properties.get( material ); + + const lights = currentRenderState.state.lights; + const shadowsArray = currentRenderState.state.shadowsArray; + + const lightsStateVersion = lights.state.version; + + const parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object ); + const programCacheKey = programCache.getProgramCacheKey( parameters ); + + let program = materialProperties.program; + let programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.cacheKey !== programCacheKey ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( materialProperties.lightsStateVersion !== lightsStateVersion ) { + + programChange = false; + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list, envMap still needs the update here to avoid a frame-late effect + + const environment = material.isMeshStandardMaterial ? scene.environment : null; + materialProperties.envMap = cubemaps.get( material.envMap || environment ); + + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + parameters.uniforms = programCache.getUniforms( material ); + + material.onBeforeCompile( parameters, _this ); + + program = programCache.acquireProgram( parameters, programCacheKey ); + + materialProperties.program = program; + materialProperties.uniforms = parameters.uniforms; + materialProperties.outputEncoding = parameters.outputEncoding; + + } + + const uniforms = materialProperties.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = clipping.numPlanes; + materialProperties.numIntersection = clipping.numIntersection; + uniforms.clippingPlanes = clipping.uniform; + + } + + materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null; + materialProperties.fog = scene.fog; + materialProperties.envMap = cubemaps.get( material.envMap || materialProperties.environment ); + + // store the light setup it was created for + + materialProperties.needsLights = materialNeedsLights( material ); + materialProperties.lightsStateVersion = lightsStateVersion; + + if ( materialProperties.needsLights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.lightProbe.value = lights.state.probe; + uniforms.directionalLights.value = lights.state.directional; + uniforms.directionalLightShadows.value = lights.state.directionalShadow; + uniforms.spotLights.value = lights.state.spot; + uniforms.spotLightShadows.value = lights.state.spotShadow; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.ltc_1.value = lights.state.rectAreaLTC1; + uniforms.ltc_2.value = lights.state.rectAreaLTC2; + uniforms.pointLights.value = lights.state.point; + uniforms.pointLightShadows.value = lights.state.pointShadow; + uniforms.hemisphereLights.value = lights.state.hemi; + + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + const progUniforms = materialProperties.program.getUniforms(); + const uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setProgram( camera, scene, material, object ) { + + if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ... + + textures.resetTextureUnits(); + + const fog = scene.fog; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + const encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : _currentRenderTarget.texture.encoding; + const envMap = cubemaps.get( material.envMap || environment ); + + const materialProperties = properties.get( material ); + const lights = currentRenderState.state.lights; + + if ( _clippingEnabled === true ) { + + if ( _localClippingEnabled === true || camera !== _currentCamera ) { + + const useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + clipping.setState( material, camera, useCache ); + + } + + } + + if ( material.version === materialProperties.__version ) { + + if ( material.fog && materialProperties.fog !== fog ) { + + initMaterial( material, scene, object ); + + } else if ( materialProperties.environment !== environment ) { + + initMaterial( material, scene, object ); + + } else if ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) { + + initMaterial( material, scene, object ); + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== clipping.numPlanes || + materialProperties.numIntersection !== clipping.numIntersection ) ) { + + initMaterial( material, scene, object ); + + } else if ( materialProperties.outputEncoding !== encoding ) { + + initMaterial( material, scene, object ); + + } else if ( materialProperties.envMap !== envMap ) { + + initMaterial( material, scene, object ); + + } + + } else { + + initMaterial( material, scene, object ); + materialProperties.__version = material.version; + + } + + let refreshProgram = false; + let refreshMaterial = false; + let refreshLights = false; + + const program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.uniforms; + + if ( state.useProgram( program.program ) ) { + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || _currentCamera !== camera ) { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + if ( _currentCamera !== camera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshToonMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + const uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshToonMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial ) { + + p_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true ); + + } + + if ( material.isMeshPhongMaterial || + material.isMeshToonMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.isShadowMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // otherwise textures used for skinning can take over texture units reserved for other material textures + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + const skeleton = object.skeleton; + + if ( skeleton ) { + + const bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === null ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + let size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix + size = MathUtils.ceilPowerOfTwo( size ); + size = Math.max( size, 4 ); + + const boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( skeleton.boneMatrices ); // copy current values + + const boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + + skeleton.boneMatrices = boneMatrices; + skeleton.boneTexture = boneTexture; + skeleton.boneTextureSize = size; + + } + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures ); + p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) { + + materialProperties.receiveShadow = object.receiveShadow; + p_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow ); + + } + + if ( refreshMaterial ) { + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + + if ( materialProperties.needsLights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + materials.refreshFogUniforms( m_uniforms, fog ); + + } + + materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height ); + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures ); + + } + + if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) { + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures ); + material.uniformsNeedUpdate = false; + + } + + if ( material.isSpriteMaterial ) { + + p_uniforms.setValue( _gl, 'center', object.center ); + + } + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + uniforms.lightProbe.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.directionalLightShadows.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.pointLightShadows.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.spotLightShadows.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + function materialNeedsLights( material ) { + + return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial || + material.isMeshStandardMaterial || material.isShadowMaterial || + ( material.isShaderMaterial && material.lights === true ); + + } + + // + this.setFramebuffer = function ( value ) { + + if ( _framebuffer !== value && _currentRenderTarget === null ) _gl.bindFramebuffer( 36160, value ); + + _framebuffer = value; + + }; + + this.getActiveCubeFace = function () { + + return _currentActiveCubeFace; + + }; + + this.getActiveMipmapLevel = function () { + + return _currentActiveMipmapLevel; + + }; + + this.getRenderList = function () { + + return currentRenderList; + + }; + + this.setRenderList = function ( renderList ) { + + currentRenderList = renderList; + + }; + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) { + + _currentRenderTarget = renderTarget; + _currentActiveCubeFace = activeCubeFace; + _currentActiveMipmapLevel = activeMipmapLevel; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + let framebuffer = _framebuffer; + let isCube = false; + + if ( renderTarget ) { + + const __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLCubeRenderTarget ) { + + framebuffer = __webglFramebuffer[ activeCubeFace ]; + isCube = true; + + } else if ( renderTarget.isWebGLMultisampleRenderTarget ) { + + framebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer; + + } else { + + framebuffer = __webglFramebuffer; + + } + + _currentViewport.copy( renderTarget.viewport ); + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + } else { + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor(); + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor(); + _currentScissorTest = _scissorTest; + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( 36160, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.viewport( _currentViewport ); + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + if ( isCube ) { + + const textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( 36160, 36064, 34069 + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + let framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) { + + framebuffer = framebuffer[ activeCubeFaceIndex ]; + + } + + if ( framebuffer ) { + + let restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( 36160, framebuffer ); + + restore = true; + + } + + try { + + const texture = renderTarget.texture; + const textureFormat = texture.format; + const textureType = texture.type; + + if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( 35739 ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( 35738 ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && ( capabilities.isWebGL2 ? extensions.get( 'EXT_color_buffer_float' ) : extensions.get( 'EXT_color_buffer_half_float' ) ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( 36160 ) === 36053 ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( 36160, _currentFramebuffer ); + + } + + } + + } + + }; + + this.copyFramebufferToTexture = function ( position, texture, level = 0 ) { + + const levelScale = Math.pow( 2, - level ); + const width = Math.floor( texture.image.width * levelScale ); + const height = Math.floor( texture.image.height * levelScale ); + const glFormat = utils.convert( texture.format ); + + textures.setTexture2D( texture, 0 ); + + _gl.copyTexImage2D( 3553, level, glFormat, position.x, position.y, width, height, 0 ); + + state.unbindTexture(); + + }; + + this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) { + + const width = srcTexture.image.width; + const height = srcTexture.image.height; + const glFormat = utils.convert( dstTexture.format ); + const glType = utils.convert( dstTexture.type ); + + textures.setTexture2D( dstTexture, 0 ); + + // As another texture upload may have changed pixelStorei + // parameters, make sure they are correct for the dstTexture + _gl.pixelStorei( 37440, dstTexture.flipY ); + _gl.pixelStorei( 37441, dstTexture.premultiplyAlpha ); + _gl.pixelStorei( 3317, dstTexture.unpackAlignment ); + + if ( srcTexture.isDataTexture ) { + + _gl.texSubImage2D( 3553, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data ); + + } else { + + if ( srcTexture.isCompressedTexture ) { + + _gl.compressedTexSubImage2D( 3553, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data ); + + } else { + + _gl.texSubImage2D( 3553, level, position.x, position.y, glFormat, glType, srcTexture.image ); + + } + + } + + // Generate mipmaps only when copying level 0 + if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( 3553 ); + + state.unbindTexture(); + + }; + + this.initTexture = function ( texture ) { + + textures.setTexture2D( texture, 0 ); + + state.unbindTexture(); + + }; + + this.resetState = function () { + + state.reset(); + bindingStates.reset(); + + }; + + if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); // eslint-disable-line no-undef + + } + + } + + function WebGL1Renderer( parameters ) { + + WebGLRenderer.call( this, parameters ); + + } + + WebGL1Renderer.prototype = Object.assign( Object.create( WebGLRenderer.prototype ), { + + constructor: WebGL1Renderer, + + isWebGL1Renderer: true + + } ); + + class FogExp2 { + + constructor( color, density ) { + + Object.defineProperty( this, 'isFogExp2', { value: true } ); + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + + } + + clone() { + + return new FogExp2( this.color, this.density ); + + } + + toJSON( /* meta */ ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + } + + } + + class Fog { + + constructor( color, near, far ) { + + Object.defineProperty( this, 'isFog', { value: true } ); + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + + } + + clone() { + + return new Fog( this.color, this.near, this.far ); + + } + + toJSON( /* meta */ ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + } + + } + + class Scene extends Object3D { + + constructor() { + + super(); + + Object.defineProperty( this, 'isScene', { value: true } ); + + this.type = 'Scene'; + + this.background = null; + this.environment = null; + this.fog = null; + + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); // eslint-disable-line no-undef + + } + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.environment !== null ) this.environment = source.environment.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.environment !== null ) data.object.environment = this.environment.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + } + + } + + function InterleavedBuffer( array, stride ) { + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.usage = StaticDrawUsage; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + this.uuid = MathUtils.generateUUID(); + + } + + Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( InterleavedBuffer.prototype, { + + isInterleavedBuffer: true, + + onUploadCallback: function () {}, + + setUsage: function ( value ) { + + this.usage = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.usage = source.usage; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( let i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset = 0 ) { + + this.array.set( value, offset ); + + return this; + + }, + + clone: function ( data ) { + + if ( data.arrayBuffers === undefined ) { + + data.arrayBuffers = {}; + + } + + if ( this.array.buffer._uuid === undefined ) { + + this.array.buffer._uuid = MathUtils.generateUUID(); + + } + + if ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) { + + data.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer; + + } + + const array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] ); + + const ib = new InterleavedBuffer( array, this.stride ); + ib.setUsage( this.usage ); + + return ib; + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + }, + + toJSON: function ( data ) { + + if ( data.arrayBuffers === undefined ) { + + data.arrayBuffers = {}; + + } + + // generate UUID for array buffer if necessary + + if ( this.array.buffer._uuid === undefined ) { + + this.array.buffer._uuid = MathUtils.generateUUID(); + + } + + if ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) { + + data.arrayBuffers[ this.array.buffer._uuid ] = Array.prototype.slice.call( new Uint32Array( this.array.buffer ) ); + + } + + // + + return { + uuid: this.uuid, + buffer: this.array.buffer._uuid, + type: this.array.constructor.name, + stride: this.stride + }; + + } + + } ); + + const _vector$6 = new Vector3(); + + function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.name = ''; + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + Object.defineProperties( InterleavedBufferAttribute.prototype, { + + count: { + + get: function () { + + return this.data.count; + + } + + }, + + array: { + + get: function () { + + return this.data.array; + + } + + }, + + needsUpdate: { + + set: function ( value ) { + + this.data.needsUpdate = value; + + } + + } + + } ); + + Object.assign( InterleavedBufferAttribute.prototype, { + + isInterleavedBufferAttribute: true, + + applyMatrix4: function ( m ) { + + for ( let i = 0, l = this.data.count; i < l; i ++ ) { + + _vector$6.x = this.getX( i ); + _vector$6.y = this.getY( i ); + _vector$6.z = this.getZ( i ); + + _vector$6.applyMatrix4( m ); + + this.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z ); + + } + + return this; + + }, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + }, + + clone: function ( data ) { + + if ( data === undefined ) { + + console.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.' ); + + const array = []; + + for ( let i = 0; i < this.count; i ++ ) { + + const index = i * this.data.stride + this.offset; + + for ( let j = 0; j < this.itemSize; j ++ ) { + + array.push( this.data.array[ index + j ] ); + + } + + } + + return new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized ); + + } else { + + if ( data.interleavedBuffers === undefined ) { + + data.interleavedBuffers = {}; + + } + + if ( data.interleavedBuffers[ this.data.uuid ] === undefined ) { + + data.interleavedBuffers[ this.data.uuid ] = this.data.clone( data ); + + } + + return new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized ); + + } + + }, + + toJSON: function ( data ) { + + if ( data === undefined ) { + + console.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.' ); + + const array = []; + + for ( let i = 0; i < this.count; i ++ ) { + + const index = i * this.data.stride + this.offset; + + for ( let j = 0; j < this.itemSize; j ++ ) { + + array.push( this.data.array[ index + j ] ); + + } + + } + + // deinterleave data and save it as an ordinary buffer attribute for now + + return { + itemSize: this.itemSize, + type: this.array.constructor.name, + array: array, + normalized: this.normalized + }; + + } else { + + // save as true interlaved attribtue + + if ( data.interleavedBuffers === undefined ) { + + data.interleavedBuffers = {}; + + } + + if ( data.interleavedBuffers[ this.data.uuid ] === undefined ) { + + data.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data ); + + } + + return { + isInterleavedBufferAttribute: true, + itemSize: this.itemSize, + data: this.data.uuid, + offset: this.offset, + normalized: this.normalized + }; + + } + + } + + } ); + + /** + * parameters = { + * color: , + * map: new THREE.Texture( ), + * alphaMap: new THREE.Texture( ), + * rotation: , + * sizeAttenuation: + * } + */ + + function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.alphaMap = null; + + this.rotation = 0; + + this.sizeAttenuation = true; + + this.transparent = true; + + this.setValues( parameters ); + + } + + SpriteMaterial.prototype = Object.create( Material.prototype ); + SpriteMaterial.prototype.constructor = SpriteMaterial; + SpriteMaterial.prototype.isSpriteMaterial = true; + + SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.rotation = source.rotation; + + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + }; + + let _geometry; + + const _intersectPoint = new Vector3(); + const _worldScale = new Vector3(); + const _mvPosition = new Vector3(); + + const _alignedPosition = new Vector2(); + const _rotatedPosition = new Vector2(); + const _viewWorldMatrix = new Matrix4(); + + const _vA$1 = new Vector3(); + const _vB$1 = new Vector3(); + const _vC$1 = new Vector3(); + + const _uvA$1 = new Vector2(); + const _uvB$1 = new Vector2(); + const _uvC$1 = new Vector2(); + + function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + if ( _geometry === undefined ) { + + _geometry = new BufferGeometry(); + + const float32Array = new Float32Array( [ + - 0.5, - 0.5, 0, 0, 0, + 0.5, - 0.5, 0, 1, 0, + 0.5, 0.5, 0, 1, 1, + - 0.5, 0.5, 0, 0, 1 + ] ); + + const interleavedBuffer = new InterleavedBuffer( float32Array, 5 ); + + _geometry.setIndex( [ 0, 1, 2, 0, 2, 3 ] ); + _geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) ); + _geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) ); + + } + + this.geometry = _geometry; + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + this.center = new Vector2( 0.5, 0.5 ); + + } + + Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: function ( raycaster, intersects ) { + + if ( raycaster.camera === null ) { + + console.error( 'THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.' ); + + } + + _worldScale.setFromMatrixScale( this.matrixWorld ); + + _viewWorldMatrix.copy( raycaster.camera.matrixWorld ); + this.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld ); + + _mvPosition.setFromMatrixPosition( this.modelViewMatrix ); + + if ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) { + + _worldScale.multiplyScalar( - _mvPosition.z ); + + } + + const rotation = this.material.rotation; + let sin, cos; + + if ( rotation !== 0 ) { + + cos = Math.cos( rotation ); + sin = Math.sin( rotation ); + + } + + const center = this.center; + + transformVertex( _vA$1.set( - 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + transformVertex( _vB$1.set( 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + transformVertex( _vC$1.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + + _uvA$1.set( 0, 0 ); + _uvB$1.set( 1, 0 ); + _uvC$1.set( 1, 1 ); + + // check first triangle + let intersect = raycaster.ray.intersectTriangle( _vA$1, _vB$1, _vC$1, false, _intersectPoint ); + + if ( intersect === null ) { + + // check second triangle + transformVertex( _vB$1.set( - 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + _uvB$1.set( 0, 1 ); + + intersect = raycaster.ray.intersectTriangle( _vA$1, _vC$1, _vB$1, false, _intersectPoint ); + if ( intersect === null ) { + + return; + + } + + } + + const distance = raycaster.ray.origin.distanceTo( _intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: _intersectPoint.clone(), + uv: Triangle.getUV( _intersectPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() ), + face: null, + object: this + + } ); + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + if ( source.center !== undefined ) this.center.copy( source.center ); + + this.material = source.material; + + return this; + + } + + } ); + + function transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) { + + // compute position in camera space + _alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale ); + + // to check if rotation is not zero + if ( sin !== undefined ) { + + _rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y ); + _rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y ); + + } else { + + _rotatedPosition.copy( _alignedPosition ); + + } + + + vertexPosition.copy( mvPosition ); + vertexPosition.x += _rotatedPosition.x; + vertexPosition.y += _rotatedPosition.y; + + // transform to world space + vertexPosition.applyMatrix4( _viewWorldMatrix ); + + } + + const _v1$4 = new Vector3(); + const _v2$2 = new Vector3(); + + function LOD() { + + Object3D.call( this ); + + this._currentLevel = 0; + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + + this.autoUpdate = true; + + } + + LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + isLOD: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + const levels = source.levels; + + for ( let i = 0, l = levels.length; i < l; i ++ ) { + + const level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + this.autoUpdate = source.autoUpdate; + + return this; + + }, + + addLevel: function ( object, distance = 0 ) { + + distance = Math.abs( distance ); + + const levels = this.levels; + + let l; + + for ( l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + return this; + + }, + + getCurrentLevel: function () { + + return this._currentLevel; + + }, + + getObjectForDistance: function ( distance ) { + + const levels = this.levels; + + if ( levels.length > 0 ) { + + let i, l; + + for ( i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + } + + return null; + + }, + + raycast: function ( raycaster, intersects ) { + + const levels = this.levels; + + if ( levels.length > 0 ) { + + _v1$4.setFromMatrixPosition( this.matrixWorld ); + + const distance = raycaster.ray.origin.distanceTo( _v1$4 ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + } + + }, + + update: function ( camera ) { + + const levels = this.levels; + + if ( levels.length > 1 ) { + + _v1$4.setFromMatrixPosition( camera.matrixWorld ); + _v2$2.setFromMatrixPosition( this.matrixWorld ); + + const distance = _v1$4.distanceTo( _v2$2 ) / camera.zoom; + + levels[ 0 ].object.visible = true; + + let i, l; + + for ( i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + this._currentLevel = i - 1; + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }, + + toJSON: function ( meta ) { + + const data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.autoUpdate === false ) data.object.autoUpdate = false; + + data.object.levels = []; + + const levels = this.levels; + + for ( let i = 0, l = levels.length; i < l; i ++ ) { + + const level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + + } ); + + const _basePosition = new Vector3(); + + const _skinIndex = new Vector4(); + const _skinWeight = new Vector4(); + + const _vector$7 = new Vector3(); + const _matrix$1 = new Matrix4(); + + function SkinnedMesh( geometry, material ) { + + if ( geometry && geometry.isGeometry ) { + + console.error( 'THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); + + } + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = 'attached'; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + } + + SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + copy: function ( source ) { + + Mesh.prototype.copy.call( this, source ); + + this.bindMode = source.bindMode; + this.bindMatrix.copy( source.bindMatrix ); + this.bindMatrixInverse.copy( source.bindMatrixInverse ); + + this.skeleton = source.skeleton; + + return this; + + }, + + bind: function ( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.copy( bindMatrix ).invert(); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + const vector = new Vector4(); + + const skinWeight = this.geometry.attributes.skinWeight; + + for ( let i = 0, l = skinWeight.count; i < l; i ++ ) { + + vector.x = skinWeight.getX( i ); + vector.y = skinWeight.getY( i ); + vector.z = skinWeight.getZ( i ); + vector.w = skinWeight.getW( i ); + + const scale = 1.0 / vector.manhattanLength(); + + if ( scale !== Infinity ) { + + vector.multiplyScalar( scale ); + + } else { + + vector.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w ); + + } + + }, + + updateMatrixWorld: function ( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, force ); + + if ( this.bindMode === 'attached' ) { + + this.bindMatrixInverse.copy( this.matrixWorld ).invert(); + + } else if ( this.bindMode === 'detached' ) { + + this.bindMatrixInverse.copy( this.bindMatrix ).invert(); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + boneTransform: function ( index, target ) { + + const skeleton = this.skeleton; + const geometry = this.geometry; + + _skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index ); + _skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index ); + + _basePosition.fromBufferAttribute( geometry.attributes.position, index ).applyMatrix4( this.bindMatrix ); + + target.set( 0, 0, 0 ); + + for ( let i = 0; i < 4; i ++ ) { + + const weight = _skinWeight.getComponent( i ); + + if ( weight !== 0 ) { + + const boneIndex = _skinIndex.getComponent( i ); + + _matrix$1.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] ); + + target.addScaledVector( _vector$7.copy( _basePosition ).applyMatrix4( _matrix$1 ), weight ); + + } + + } + + return target.applyMatrix4( this.bindMatrixInverse ); + + } + + } ); + + function Bone() { + + Object3D.call( this ); + + this.type = 'Bone'; + + } + + Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true + + } ); + + const _offsetMatrix = new Matrix4(); + const _identityMatrix = new Matrix4(); + + function Skeleton( bones = [], boneInverses = [] ) { + + this.uuid = MathUtils.generateUUID(); + + this.bones = bones.slice( 0 ); + this.boneInverses = boneInverses; + this.boneMatrices = null; + + this.boneTexture = null; + this.boneTextureSize = 0; + + this.frame = - 1; + + this.init(); + + } + + Object.assign( Skeleton.prototype, { + + init: function () { + + const bones = this.bones; + const boneInverses = this.boneInverses; + + this.boneMatrices = new Float32Array( bones.length * 16 ); + + // calculate inverse bone matrices if necessary + + if ( boneInverses.length === 0 ) { + + this.calculateInverses(); + + } else { + + // handle special case + + if ( bones.length !== boneInverses.length ) { + + console.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' ); + + this.boneInverses = []; + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + }, + + calculateInverses: function () { + + this.boneInverses.length = 0; + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.copy( this.bones[ i ].matrixWorld ).invert(); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + // recover the bind-time world matrices + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.copy( this.boneInverses[ i ] ).invert(); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.copy( bone.parent.matrixWorld ).invert(); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: function () { + + const bones = this.bones; + const boneInverses = this.boneInverses; + const boneMatrices = this.boneMatrices; + const boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( let i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + const matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix; + + _offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + _offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== null ) { + + boneTexture.needsUpdate = true; + + } + + }, + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses ); + + }, + + getBoneByName: function ( name ) { + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone.name === name ) { + + return bone; + + } + + } + + return undefined; + + }, + + dispose: function ( ) { + + if ( this.boneTexture !== null ) { + + this.boneTexture.dispose(); + + this.boneTexture = null; + + } + + }, + + fromJSON: function ( json, bones ) { + + this.uuid = json.uuid; + + for ( let i = 0, l = json.bones.length; i < l; i ++ ) { + + const uuid = json.bones[ i ]; + let bone = bones[ uuid ]; + + if ( bone === undefined ) { + + console.warn( 'THREE.Skeleton: No bone found with UUID:', uuid ); + bone = new Bone(); + + } + + this.bones.push( bone ); + this.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) ); + + } + + this.init(); + + return this; + + }, + + toJSON: function () { + + const data = { + metadata: { + version: 4.5, + type: 'Skeleton', + generator: 'Skeleton.toJSON' + }, + bones: [], + boneInverses: [] + }; + + data.uuid = this.uuid; + + const bones = this.bones; + const boneInverses = this.boneInverses; + + for ( let i = 0, l = bones.length; i < l; i ++ ) { + + const bone = bones[ i ]; + data.bones.push( bone.uuid ); + + const boneInverse = boneInverses[ i ]; + data.boneInverses.push( boneInverse.toArray() ); + + } + + return data; + + } + + } ); + + const _instanceLocalMatrix = new Matrix4(); + const _instanceWorldMatrix = new Matrix4(); + + const _instanceIntersects = []; + + const _mesh = new Mesh(); + + function InstancedMesh( geometry, material, count ) { + + Mesh.call( this, geometry, material ); + + this.instanceMatrix = new BufferAttribute( new Float32Array( count * 16 ), 16 ); + this.instanceColor = null; + + this.count = count; + + this.frustumCulled = false; + + } + + InstancedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: InstancedMesh, + + isInstancedMesh: true, + + copy: function ( source ) { + + Mesh.prototype.copy.call( this, source ); + + this.instanceMatrix.copy( source.instanceMatrix ); + this.count = source.count; + + return this; + + }, + + getColorAt: function ( index, color ) { + + color.fromArray( this.instanceColor.array, index * 3 ); + + }, + + getMatrixAt: function ( index, matrix ) { + + matrix.fromArray( this.instanceMatrix.array, index * 16 ); + + }, + + raycast: function ( raycaster, intersects ) { + + const matrixWorld = this.matrixWorld; + const raycastTimes = this.count; + + _mesh.geometry = this.geometry; + _mesh.material = this.material; + + if ( _mesh.material === undefined ) return; + + for ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) { + + // calculate the world matrix for each instance + + this.getMatrixAt( instanceId, _instanceLocalMatrix ); + + _instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix ); + + // the mesh represents this single instance + + _mesh.matrixWorld = _instanceWorldMatrix; + + _mesh.raycast( raycaster, _instanceIntersects ); + + // process the result of raycast + + for ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) { + + const intersect = _instanceIntersects[ i ]; + intersect.instanceId = instanceId; + intersect.object = this; + intersects.push( intersect ); + + } + + _instanceIntersects.length = 0; + + } + + }, + + setColorAt: function ( index, color ) { + + if ( this.instanceColor === null ) { + + this.instanceColor = new BufferAttribute( new Float32Array( this.count * 3 ), 3 ); + + } + + color.toArray( this.instanceColor.array, index * 3 ); + + }, + + setMatrixAt: function ( index, matrix ) { + + matrix.toArray( this.instanceMatrix.array, index * 16 ); + + }, + + updateMorphTargets: function () { + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.morphTargets = false; + + this.setValues( parameters ); + + } + + LineBasicMaterial.prototype = Object.create( Material.prototype ); + LineBasicMaterial.prototype.constructor = LineBasicMaterial; + + LineBasicMaterial.prototype.isLineBasicMaterial = true; + + LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + this.morphTargets = source.morphTargets; + + return this; + + }; + + const _start = new Vector3(); + const _end = new Vector3(); + const _inverseMatrix$1 = new Matrix4(); + const _ray$1 = new Ray(); + const _sphere$2 = new Sphere(); + + function Line( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) { + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry; + this.material = material; + + this.updateMorphTargets(); + + } + + Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.material = source.material; + this.geometry = source.geometry; + + return this; + + }, + + computeLineDistances: function () { + + const geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + const positionAttribute = geometry.attributes.position; + const lineDistances = [ 0 ]; + + for ( let i = 1, l = positionAttribute.count; i < l; i ++ ) { + + _start.fromBufferAttribute( positionAttribute, i - 1 ); + _end.fromBufferAttribute( positionAttribute, i ); + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += _start.distanceTo( _end ); + + } + + geometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + const vertices = geometry.vertices; + const lineDistances = geometry.lineDistances; + + lineDistances[ 0 ] = 0; + + for ( let i = 1, l = vertices.length; i < l; i ++ ) { + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] ); + + } + + } + + return this; + + }, + + raycast: function ( raycaster, intersects ) { + + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Line.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere$2.copy( geometry.boundingSphere ); + _sphere$2.applyMatrix4( matrixWorld ); + _sphere$2.radius += threshold; + + if ( raycaster.ray.intersectsSphere( _sphere$2 ) === false ) return; + + // + + _inverseMatrix$1.copy( matrixWorld ).invert(); + _ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 ); + + const localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + const localThresholdSq = localThreshold * localThreshold; + + const vStart = new Vector3(); + const vEnd = new Vector3(); + const interSegment = new Vector3(); + const interRay = new Vector3(); + const step = this.isLineSegments ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + + if ( index !== null ) { + + const indices = index.array; + + for ( let i = 0, l = indices.length - 1; i < l; i += step ) { + + const a = indices[ i ]; + const b = indices[ i + 1 ]; + + vStart.fromBufferAttribute( positionAttribute, a ); + vEnd.fromBufferAttribute( positionAttribute, b ); + + const distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localThresholdSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + const distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( let i = 0, l = positionAttribute.count - 1; i < l; i += step ) { + + vStart.fromBufferAttribute( positionAttribute, i ); + vEnd.fromBufferAttribute( positionAttribute, i + 1 ); + + const distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localThresholdSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + const distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + const vertices = geometry.vertices; + const nbVertices = vertices.length; + + for ( let i = 0; i < nbVertices - 1; i += step ) { + + const distSq = _ray$1.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > localThresholdSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + const distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }, + + updateMorphTargets: function () { + + const geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + const morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + const name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + const morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + console.error( 'THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' ); + + } + + } + + } + + } ); + + const _start$1 = new Vector3(); + const _end$1 = new Vector3(); + + function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + + } + + LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true, + + computeLineDistances: function () { + + const geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + const positionAttribute = geometry.attributes.position; + const lineDistances = []; + + for ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) { + + _start$1.fromBufferAttribute( positionAttribute, i ); + _end$1.fromBufferAttribute( positionAttribute, i + 1 ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + _start$1.distanceTo( _end$1 ); + + } + + geometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + const vertices = geometry.vertices; + const lineDistances = geometry.lineDistances; + + for ( let i = 0, l = vertices.length; i < l; i += 2 ) { + + _start$1.copy( vertices[ i ] ); + _end$1.copy( vertices[ i + 1 ] ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + _start$1.distanceTo( _end$1 ); + + } + + } + + return this; + + } + + } ); + + function LineLoop( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineLoop'; + + } + + LineLoop.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineLoop, + + isLineLoop: true, + + } ); + + /** + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * alphaMap: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: + * + * morphTargets: + * } + */ + + function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.alphaMap = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.morphTargets = false; + + this.setValues( parameters ); + + } + + PointsMaterial.prototype = Object.create( Material.prototype ); + PointsMaterial.prototype.constructor = PointsMaterial; + + PointsMaterial.prototype.isPointsMaterial = true; + + PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + this.morphTargets = source.morphTargets; + + return this; + + }; + + const _inverseMatrix$2 = new Matrix4(); + const _ray$2 = new Ray(); + const _sphere$3 = new Sphere(); + const _position$1 = new Vector3(); + + function Points( geometry = new BufferGeometry(), material = new PointsMaterial() ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry; + this.material = material; + + this.updateMorphTargets(); + + } + + Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.material = source.material; + this.geometry = source.geometry; + + return this; + + }, + + raycast: function ( raycaster, intersects ) { + + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere$3.copy( geometry.boundingSphere ); + _sphere$3.applyMatrix4( matrixWorld ); + _sphere$3.radius += threshold; + + if ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return; + + // + + _inverseMatrix$2.copy( matrixWorld ).invert(); + _ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 ); + + const localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + const localThresholdSq = localThreshold * localThreshold; + + if ( geometry.isBufferGeometry ) { + + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + + if ( index !== null ) { + + const indices = index.array; + + for ( let i = 0, il = indices.length; i < il; i ++ ) { + + const a = indices[ i ]; + + _position$1.fromBufferAttribute( positionAttribute, a ); + + testPoint( _position$1, a, localThresholdSq, matrixWorld, raycaster, intersects, this ); + + } + + } else { + + for ( let i = 0, l = positionAttribute.count; i < l; i ++ ) { + + _position$1.fromBufferAttribute( positionAttribute, i ); + + testPoint( _position$1, i, localThresholdSq, matrixWorld, raycaster, intersects, this ); + + } + + } + + } else { + + const vertices = geometry.vertices; + + for ( let i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i, localThresholdSq, matrixWorld, raycaster, intersects, this ); + + } + + } + + }, + + updateMorphTargets: function () { + + const geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + const morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + const name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + const morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + console.error( 'THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' ); + + } + + } + + } + + } ); + + function testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) { + + const rayPointDistanceSq = _ray$2.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + const intersectPoint = new Vector3(); + + _ray$2.closestPointToPoint( point, intersectPoint ); + intersectPoint.applyMatrix4( matrixWorld ); + + const distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint, + index: index, + face: null, + object: object + + } ); + + } + + } + + function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.format = format !== undefined ? format : RGBFormat; + + this.minFilter = minFilter !== undefined ? minFilter : LinearFilter; + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + + this.generateMipmaps = false; + + const scope = this; + + function updateVideo() { + + scope.needsUpdate = true; + video.requestVideoFrameCallback( updateVideo ); + + } + + if ( 'requestVideoFrameCallback' in video ) { + + video.requestVideoFrameCallback( updateVideo ); + + } + + } + + VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), { + + constructor: VideoTexture, + + clone: function () { + + return new this.constructor( this.image ).copy( this ); + + }, + + isVideoTexture: true, + + update: function () { + + const video = this.image; + const hasVideoFrameCallback = 'requestVideoFrameCallback' in video; + + if ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) { + + this.needsUpdate = true; + + } + + } + + } ); + + function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + + CompressedTexture.prototype = Object.create( Texture.prototype ); + CompressedTexture.prototype.constructor = CompressedTexture; + + CompressedTexture.prototype.isCompressedTexture = true; + + function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + + CanvasTexture.prototype = Object.create( Texture.prototype ); + CanvasTexture.prototype.constructor = CanvasTexture; + CanvasTexture.prototype.isCanvasTexture = true; + + function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ); + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type$1; + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + DepthTexture.prototype = Object.create( Texture.prototype ); + DepthTexture.prototype.constructor = DepthTexture; + DepthTexture.prototype.isDepthTexture = true; + + let _geometryId = 0; // Geometry uses even numbers as Id + const _m1$3 = new Matrix4(); + const _obj$1 = new Object3D(); + const _offset$1 = new Vector3(); + + function Geometry() { + + Object.defineProperty( this, 'id', { value: _geometryId += 2 } ); + + this.uuid = MathUtils.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Geometry.prototype = Object.assign( Object.create( EventDispatcher$1.prototype ), { + + constructor: Geometry, + + isGeometry: true, + + applyMatrix4: function ( matrix ) { + + const normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( let i = 0, il = this.vertices.length; i < il; i ++ ) { + + const vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( let i = 0, il = this.faces.length; i < il; i ++ ) { + + const face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( let j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function ( angle ) { + + // rotate geometry around world x-axis + + _m1$3.makeRotationX( angle ); + + this.applyMatrix4( _m1$3 ); + + return this; + + }, + + rotateY: function ( angle ) { + + // rotate geometry around world y-axis + + _m1$3.makeRotationY( angle ); + + this.applyMatrix4( _m1$3 ); + + return this; + + }, + + rotateZ: function ( angle ) { + + // rotate geometry around world z-axis + + _m1$3.makeRotationZ( angle ); + + this.applyMatrix4( _m1$3 ); + + return this; + + }, + + translate: function ( x, y, z ) { + + // translate geometry + + _m1$3.makeTranslation( x, y, z ); + + this.applyMatrix4( _m1$3 ); + + return this; + + }, + + scale: function ( x, y, z ) { + + // scale geometry + + _m1$3.makeScale( x, y, z ); + + this.applyMatrix4( _m1$3 ); + + return this; + + }, + + lookAt: function ( vector ) { + + _obj$1.lookAt( vector ); + + _obj$1.updateMatrix(); + + this.applyMatrix4( _obj$1.matrix ); + + return this; + + }, + + fromBufferGeometry: function ( geometry ) { + + const scope = this; + + const index = geometry.index !== null ? geometry.index : undefined; + const attributes = geometry.attributes; + + if ( attributes.position === undefined ) { + + console.error( 'THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion.' ); + return this; + + } + + const position = attributes.position; + const normal = attributes.normal; + const color = attributes.color; + const uv = attributes.uv; + const uv2 = attributes.uv2; + + if ( uv2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + for ( let i = 0; i < position.count; i ++ ) { + + scope.vertices.push( new Vector3().fromBufferAttribute( position, i ) ); + + if ( color !== undefined ) { + + scope.colors.push( new Color().fromBufferAttribute( color, i ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + const vertexColors = ( color === undefined ) ? [] : [ + scope.colors[ a ].clone(), + scope.colors[ b ].clone(), + scope.colors[ c ].clone() + ]; + + const vertexNormals = ( normal === undefined ) ? [] : [ + new Vector3().fromBufferAttribute( normal, a ), + new Vector3().fromBufferAttribute( normal, b ), + new Vector3().fromBufferAttribute( normal, c ) + ]; + + const face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uv !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ + new Vector2().fromBufferAttribute( uv, a ), + new Vector2().fromBufferAttribute( uv, b ), + new Vector2().fromBufferAttribute( uv, c ) + ] ); + + } + + if ( uv2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ + new Vector2().fromBufferAttribute( uv2, a ), + new Vector2().fromBufferAttribute( uv2, b ), + new Vector2().fromBufferAttribute( uv2, c ) + ] ); + + } + + } + + const groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( let i = 0; i < groups.length; i ++ ) { + + const group = groups[ i ]; + + const start = group.start; + const count = group.count; + + for ( let j = start, jl = start + count; j < jl; j += 3 ) { + + if ( index !== undefined ) { + + addFace( index.getX( j ), index.getX( j + 1 ), index.getX( j + 2 ), group.materialIndex ); + + } else { + + addFace( j, j + 1, j + 2, group.materialIndex ); + + } + + } + + } + + } else { + + if ( index !== undefined ) { + + for ( let i = 0; i < index.count; i += 3 ) { + + addFace( index.getX( i ), index.getX( i + 1 ), index.getX( i + 2 ) ); + + } + + } else { + + for ( let i = 0; i < position.count; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( _offset$1 ).negate(); + + this.translate( _offset$1.x, _offset$1.y, _offset$1.z ); + + return this; + + }, + + normalize: function () { + + this.computeBoundingSphere(); + + const center = this.boundingSphere.center; + const radius = this.boundingSphere.radius; + + const s = radius === 0 ? 1 : 1.0 / radius; + + const matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix4( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + const cb = new Vector3(), ab = new Vector3(); + + for ( let f = 0, fl = this.faces.length; f < fl; f ++ ) { + + const face = this.faces[ f ]; + + const vA = this.vertices[ face.a ]; + const vB = this.vertices[ face.b ]; + const vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted = true ) { + + const vertices = new Array( this.vertices.length ); + + for ( let v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + const cb = new Vector3(), ab = new Vector3(); + + for ( let f = 0, fl = this.faces.length; f < fl; f ++ ) { + + const face = this.faces[ f ]; + + const vA = this.vertices[ face.a ]; + const vB = this.vertices[ face.b ]; + const vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( let f = 0, fl = this.faces.length; f < fl; f ++ ) { + + const face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( let v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( let f = 0, fl = this.faces.length; f < fl; f ++ ) { + + const face = this.faces[ f ]; + + const vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + this.computeFaceNormals(); + + for ( let f = 0, fl = this.faces.length; f < fl; f ++ ) { + + const face = this.faces[ f ]; + + const vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( let f = 0, fl = this.faces.length; f < fl; f ++ ) { + + const face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( let i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + const tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( let i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + const dstNormalsFace = this.morphNormals[ i ].faceNormals; + const dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + for ( let f = 0, fl = this.faces.length; f < fl; f ++ ) { + + const faceNormal = new Vector3(); + const vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + const morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + for ( let f = 0, fl = this.faces.length; f < fl; f ++ ) { + + const face = this.faces[ f ]; + + const faceNormal = morphNormals.faceNormals[ f ]; + const vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( let f = 0, fl = this.faces.length; f < fl; f ++ ) { + + const face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset = 0 ) { + + if ( ! ( geometry && geometry.isGeometry ) ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + let normalMatrix; + const vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + colors1 = this.colors, + colors2 = geometry.colors; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( let i = 0, il = vertices2.length; i < il; i ++ ) { + + const vertex = vertices2[ i ]; + + const vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( let i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( let i = 0, il = faces2.length; i < il; i ++ ) { + + const face = faces2[ i ]; + let normal, color; + const faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + const faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( let j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( let j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( let i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) { + + const faceVertexUvs2 = geometry.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) this.faceVertexUvs[ i ] = []; + + for ( let j = 0, jl = faceVertexUvs2.length; j < jl; j ++ ) { + + const uvs2 = faceVertexUvs2[ j ], uvsCopy = []; + + for ( let k = 0, kl = uvs2.length; k < kl; k ++ ) { + + uvsCopy.push( uvs2[ k ].clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( ! ( mesh && mesh.isMesh ) ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + if ( mesh.matrixAutoUpdate ) mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function ( precisionPoints = 4 ) { + + const verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + const unique = [], changes = []; + + const precision = Math.pow( 10, precisionPoints ); + + for ( let i = 0, il = this.vertices.length; i < il; i ++ ) { + + const v = this.vertices[ i ]; + const key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + const faceIndicesToRemove = []; + + for ( let i = 0, il = this.faces.length; i < il; i ++ ) { + + const face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + const indices = [ face.a, face.b, face.c ]; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( let n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( let i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + const idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( let j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + const diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + setFromPoints: function ( points ) { + + this.vertices = []; + + for ( let i = 0, l = points.length; i < l; i ++ ) { + + const point = points[ i ]; + this.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return this; + + }, + + sortFacesByMaterialIndex: function () { + + const faces = this.faces; + const length = faces.length; + + // tag faces + + for ( let i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + const uvs1 = this.faceVertexUvs[ 0 ]; + const uvs2 = this.faceVertexUvs[ 1 ]; + + let newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( let i = 0; i < length; i ++ ) { + + const id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + const data = { + metadata: { + version: 4.5, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + const parameters = this.parameters; + + for ( const key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + const vertices = []; + + for ( let i = 0; i < this.vertices.length; i ++ ) { + + const vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + const faces = []; + const normals = []; + const normalsHash = {}; + const colors = []; + const colorsHash = {}; + const uvs = []; + const uvsHash = {}; + + for ( let i = 0; i < this.faces.length; i ++ ) { + + const face = this.faces[ i ]; + + const hasMaterial = true; + const hasFaceUv = false; // deprecated + const hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + const hasFaceNormal = face.normal.length() > 0; + const hasFaceVertexNormal = face.vertexNormals.length > 0; + const hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + const hasFaceVertexColor = face.vertexColors.length > 0; + + let faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + const faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + const vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + const vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + const hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + const hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + const hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + const parameters = this.parameters; + + if ( parameters !== undefined ) { + + const values = []; + + for ( const key in parameters ) { + + values.push( parameters[ key ] ); + + } + + const geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + // reset + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + this.morphTargets = []; + this.morphNormals = []; + this.skinWeights = []; + this.skinIndices = []; + this.lineDistances = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // vertices + + const vertices = source.vertices; + + for ( let i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + // colors + + const colors = source.colors; + + for ( let i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + // faces + + const faces = source.faces; + + for ( let i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + // face vertex uvs + + for ( let i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + const faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( let j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + const uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( let k = 0, kl = uvs.length; k < kl; k ++ ) { + + const uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + // morph targets + + const morphTargets = source.morphTargets; + + for ( let i = 0, il = morphTargets.length; i < il; i ++ ) { + + const morphTarget = {}; + morphTarget.name = morphTargets[ i ].name; + + // vertices + + if ( morphTargets[ i ].vertices !== undefined ) { + + morphTarget.vertices = []; + + for ( let j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { + + morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); + + } + + } + + // normals + + if ( morphTargets[ i ].normals !== undefined ) { + + morphTarget.normals = []; + + for ( let j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { + + morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); + + } + + } + + this.morphTargets.push( morphTarget ); + + } + + // morph normals + + const morphNormals = source.morphNormals; + + for ( let i = 0, il = morphNormals.length; i < il; i ++ ) { + + const morphNormal = {}; + + // vertex normals + + if ( morphNormals[ i ].vertexNormals !== undefined ) { + + morphNormal.vertexNormals = []; + + for ( let j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { + + const srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; + const destVertexNormal = {}; + + destVertexNormal.a = srcVertexNormal.a.clone(); + destVertexNormal.b = srcVertexNormal.b.clone(); + destVertexNormal.c = srcVertexNormal.c.clone(); + + morphNormal.vertexNormals.push( destVertexNormal ); + + } + + } + + // face normals + + if ( morphNormals[ i ].faceNormals !== undefined ) { + + morphNormal.faceNormals = []; + + for ( let j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { + + morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); + + } + + } + + this.morphNormals.push( morphNormal ); + + } + + // skin weights + + const skinWeights = source.skinWeights; + + for ( let i = 0, il = skinWeights.length; i < il; i ++ ) { + + this.skinWeights.push( skinWeights[ i ].clone() ); + + } + + // skin indices + + const skinIndices = source.skinIndices; + + for ( let i = 0, il = skinIndices.length; i < il; i ++ ) { + + this.skinIndices.push( skinIndices[ i ].clone() ); + + } + + // line distances + + const lineDistances = source.lineDistances; + + for ( let i = 0, il = lineDistances.length; i < il; i ++ ) { + + this.lineDistances.push( lineDistances[ i ] ); + + } + + // bounding box + + const boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + const boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate; + this.verticesNeedUpdate = source.verticesNeedUpdate; + this.uvsNeedUpdate = source.uvsNeedUpdate; + this.normalsNeedUpdate = source.normalsNeedUpdate; + this.colorsNeedUpdate = source.colorsNeedUpdate; + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; + this.groupsNeedUpdate = source.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + class BoxGeometry extends Geometry { + + constructor( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + super(); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + + } + + } + + class CircleBufferGeometry extends BufferGeometry { + + constructor( radius = 1, segments = 8, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super(); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + segments = Math.max( 3, segments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + const vertex = new Vector3(); + const uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + const segment = thetaStart + s / segments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uvs + + uv.x = ( vertices[ i ] / radius + 1 ) / 2; + uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // indices + + for ( let i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + } + + class CircleGeometry extends Geometry { + + constructor( radius, segments, thetaStart, thetaLength ) { + + super(); + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + } + + class CylinderBufferGeometry extends BufferGeometry { + + constructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super(); + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + const scope = this; + + radialSegments = Math.floor( radialSegments ); + heightSegments = Math.floor( heightSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + let index = 0; + const indexArray = []; + const halfHeight = height / 2; + let groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + const normal = new Vector3(); + const vertex = new Vector3(); + + let groupCount = 0; + + // this will be used to calculate the normal + const slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( let y = 0; y <= heightSegments; y ++ ) { + + const indexRow = []; + + const v = y / heightSegments; + + // calculate the radius of the current row + + const radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( let x = 0; x <= radialSegments; x ++ ) { + + const u = x / radialSegments; + + const theta = u * thetaLength + thetaStart; + + const sinTheta = Math.sin( theta ); + const cosTheta = Math.cos( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + // save index of vertex in respective row + + indexRow.push( index ++ ); + + } + + // now save vertices of the row in our index array + + indexArray.push( indexRow ); + + } + + // generate indices + + for ( let x = 0; x < radialSegments; x ++ ) { + + for ( let y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + + const a = indexArray[ y ][ x ]; + const b = indexArray[ y + 1 ][ x ]; + const c = indexArray[ y + 1 ][ x + 1 ]; + const d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + function generateCap( top ) { + + // save the index of the first center vertex + const centerIndexStart = index; + + const uv = new Vector2(); + const vertex = new Vector3(); + + let groupCount = 0; + + const radius = ( top === true ) ? radiusTop : radiusBottom; + const sign = ( top === true ) ? 1 : - 1; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( let x = 1; x <= radialSegments; x ++ ) { + + // vertex + + vertices.push( 0, halfHeight * sign, 0 ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uvs.push( 0.5, 0.5 ); + + // increase index + + index ++; + + } + + // save the index of the last center vertex + const centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( let x = 0; x <= radialSegments; x ++ ) { + + const u = x / radialSegments; + const theta = u * thetaLength + thetaStart; + + const cosTheta = Math.cos( theta ); + const sinTheta = Math.sin( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.push( uv.x, uv.y ); + + // increase index + + index ++; + + } + + // generate indices + + for ( let x = 0; x < radialSegments; x ++ ) { + + const c = centerIndexStart + x; + const i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + + indices.push( i, i + 1, c ); + + } else { + + // face bottom + + indices.push( i + 1, i, c ); + + } + + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + } + + } + + class CylinderGeometry extends Geometry { + + constructor( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + super(); + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + } + + class ConeGeometry extends CylinderGeometry { + + constructor( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + super( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + } + + class ConeBufferGeometry extends CylinderBufferGeometry { + + constructor( radius = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + } + + class PolyhedronBufferGeometry extends BufferGeometry { + + constructor( vertices, indices, radius = 1, detail = 0 ) { + + super(); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + // default buffer data + + const vertexBuffer = []; + const uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + applyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + + if ( detail === 0 ) { + + this.computeVertexNormals(); // flat normals + + } else { + + this.normalizeNormals(); // smooth normals + + } + + // helper functions + + function subdivide( detail ) { + + const a = new Vector3(); + const b = new Vector3(); + const c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( let i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + const cols = detail + 1; + + // we use this multidimensional array as a data structure for creating the subdivision + + const v = []; + + // construct all of the vertices for this subdivision + + for ( let i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + const aj = a.clone().lerp( c, i / cols ); + const bj = b.clone().lerp( c, i / cols ); + + const rows = cols - i; + + for ( let j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( let i = 0; i < cols; i ++ ) { + + for ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + const k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function applyRadius( radius ) { + + const vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( let i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + const vertex = new Vector3(); + + for ( let i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + const u = azimuth( vertex ) / 2 / Math.PI + 0.5; + const v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( let i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + const x0 = uvBuffer[ i + 0 ]; + const x1 = uvBuffer[ i + 2 ]; + const x2 = uvBuffer[ i + 4 ]; + + const max = Math.max( x0, x1, x2 ); + const min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + const stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + const a = new Vector3(); + const b = new Vector3(); + const c = new Vector3(); + + const centroid = new Vector3(); + + const uvA = new Vector2(); + const uvB = new Vector2(); + const uvC = new Vector2(); + + for ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + const azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + } + + } + + class DodecahedronBufferGeometry extends PolyhedronBufferGeometry { + + constructor( radius = 1, detail = 0 ) { + + const t = ( 1 + Math.sqrt( 5 ) ) / 2; + const r = 1 / t; + + const vertices = [ + + // (±1, ±1, ±1) + - 1, - 1, - 1, - 1, - 1, 1, + - 1, 1, - 1, - 1, 1, 1, + 1, - 1, - 1, 1, - 1, 1, + 1, 1, - 1, 1, 1, 1, + + // (0, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + const indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + } + + class DodecahedronGeometry extends Geometry { + + constructor( radius, detail ) { + + super(); + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + } + + const _v0$2 = new Vector3(); + const _v1$5 = new Vector3(); + const _normal$1 = new Vector3(); + const _triangle = new Triangle(); + + class EdgesGeometry extends BufferGeometry { + + constructor( geometry, thresholdAngle ) { + + super(); + + this.type = 'EdgesGeometry'; + + this.parameters = { + thresholdAngle: thresholdAngle + }; + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + if ( geometry.isGeometry ) { + + geometry = new BufferGeometry().fromGeometry( geometry ); + + } + + const precisionPoints = 4; + const precision = Math.pow( 10, precisionPoints ); + const thresholdDot = Math.cos( MathUtils.DEG2RAD * thresholdAngle ); + + const indexAttr = geometry.getIndex(); + const positionAttr = geometry.getAttribute( 'position' ); + const indexCount = indexAttr ? indexAttr.count : positionAttr.count; + + const indexArr = [ 0, 0, 0 ]; + const vertKeys = [ 'a', 'b', 'c' ]; + const hashes = new Array( 3 ); + + const edgeData = {}; + const vertices = []; + for ( let i = 0; i < indexCount; i += 3 ) { + + if ( indexAttr ) { + + indexArr[ 0 ] = indexAttr.getX( i ); + indexArr[ 1 ] = indexAttr.getX( i + 1 ); + indexArr[ 2 ] = indexAttr.getX( i + 2 ); + + } else { + + indexArr[ 0 ] = i; + indexArr[ 1 ] = i + 1; + indexArr[ 2 ] = i + 2; + + } + + const { a, b, c } = _triangle; + a.fromBufferAttribute( positionAttr, indexArr[ 0 ] ); + b.fromBufferAttribute( positionAttr, indexArr[ 1 ] ); + c.fromBufferAttribute( positionAttr, indexArr[ 2 ] ); + _triangle.getNormal( _normal$1 ); + + // create hashes for the edge from the vertices + hashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`; + hashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`; + hashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`; + + // skip degenerate triangles + if ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) { + + continue; + + } + + // iterate over every edge + for ( let j = 0; j < 3; j ++ ) { + + // get the first and next vertex making up the edge + const jNext = ( j + 1 ) % 3; + const vecHash0 = hashes[ j ]; + const vecHash1 = hashes[ jNext ]; + const v0 = _triangle[ vertKeys[ j ] ]; + const v1 = _triangle[ vertKeys[ jNext ] ]; + + const hash = `${ vecHash0 }_${ vecHash1 }`; + const reverseHash = `${ vecHash1 }_${ vecHash0 }`; + + if ( reverseHash in edgeData && edgeData[ reverseHash ] ) { + + // if we found a sibling edge add it into the vertex array if + // it meets the angle threshold and delete the edge from the map. + if ( _normal$1.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) { + + vertices.push( v0.x, v0.y, v0.z ); + vertices.push( v1.x, v1.y, v1.z ); + + } + + edgeData[ reverseHash ] = null; + + } else if ( ! ( hash in edgeData ) ) { + + // if we've already got an edge here then skip adding a new one + edgeData[ hash ] = { + + index0: indexArr[ j ], + index1: indexArr[ jNext ], + normal: _normal$1.clone(), + + }; + + } + + } + + } + + // iterate over all remaining, unmatched edges and add them to the vertex array + for ( const key in edgeData ) { + + if ( edgeData[ key ] ) { + + const { index0, index1 } = edgeData[ key ]; + _v0$2.fromBufferAttribute( positionAttr, index0 ); + _v1$5.fromBufferAttribute( positionAttr, index1 ); + + vertices.push( _v0$2.x, _v0$2.y, _v0$2.z ); + vertices.push( _v1$5.x, _v1$5.y, _v1$5.z ); + + } + + } + + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + } + + /** + * Port from https://github.com/mapbox/earcut (v2.2.2) + */ + + const Earcut = { + + triangulate: function ( data, holeIndices, dim ) { + + dim = dim || 2; + + const hasHoles = holeIndices && holeIndices.length; + const outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length; + let outerNode = linkedList( data, 0, outerLen, dim, true ); + const triangles = []; + + if ( ! outerNode || outerNode.next === outerNode.prev ) return triangles; + + let minX, minY, maxX, maxY, x, y, invSize; + + if ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim ); + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + if ( data.length > 80 * dim ) { + + minX = maxX = data[ 0 ]; + minY = maxY = data[ 1 ]; + + for ( let i = dim; i < outerLen; i += dim ) { + + x = data[ i ]; + y = data[ i + 1 ]; + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + + } + + // minX, minY and invSize are later used to transform coords into integers for z-order calculation + invSize = Math.max( maxX - minX, maxY - minY ); + invSize = invSize !== 0 ? 1 / invSize : 0; + + } + + earcutLinked( outerNode, triangles, dim, minX, minY, invSize ); + + return triangles; + + } + + }; + + // create a circular doubly linked list from polygon points in the specified winding order + function linkedList( data, start, end, dim, clockwise ) { + + let i, last; + + if ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) { + + for ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } else { + + for ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } + + if ( last && equals( last, last.next ) ) { + + removeNode( last ); + last = last.next; + + } + + return last; + + } + + // eliminate colinear or duplicate points + function filterPoints( start, end ) { + + if ( ! start ) return start; + if ( ! end ) end = start; + + let p = start, + again; + do { + + again = false; + + if ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) { + + removeNode( p ); + p = end = p.prev; + if ( p === p.next ) break; + again = true; + + } else { + + p = p.next; + + } + + } while ( again || p !== end ); + + return end; + + } + + // main ear slicing loop which triangulates a polygon (given as a linked list) + function earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) { + + if ( ! ear ) return; + + // interlink polygon nodes in z-order + if ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize ); + + let stop = ear, + prev, next; + + // iterate through ears, slicing them one by one + while ( ear.prev !== ear.next ) { + + prev = ear.prev; + next = ear.next; + + if ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) { + + // cut off the triangle + triangles.push( prev.i / dim ); + triangles.push( ear.i / dim ); + triangles.push( next.i / dim ); + + removeNode( ear ); + + // skipping the next vertex leads to less sliver triangles + ear = next.next; + stop = next.next; + + continue; + + } + + ear = next; + + // if we looped through the whole remaining polygon and can't find any more ears + if ( ear === stop ) { + + // try filtering points and slicing again + if ( ! pass ) { + + earcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 ); + + // if this didn't work, try curing all small self-intersections locally + + } else if ( pass === 1 ) { + + ear = cureLocalIntersections( filterPoints( ear ), triangles, dim ); + earcutLinked( ear, triangles, dim, minX, minY, invSize, 2 ); + + // as a last resort, try splitting the remaining polygon into two + + } else if ( pass === 2 ) { + + splitEarcut( ear, triangles, dim, minX, minY, invSize ); + + } + + break; + + } + + } + + } + + // check whether a polygon node forms a valid ear with adjacent nodes + function isEar( ear ) { + + const a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + let p = ear.next.next; + + while ( p !== ear.prev ) { + + if ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + p = p.next; + + } + + return true; + + } + + function isEarHashed( ear, minX, minY, invSize ) { + + const a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // triangle bbox; min & max are calculated like this for speed + const minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ), + minTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ), + maxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ), + maxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y ); + + // z-order range for the current triangle bbox; + const minZ = zOrder( minTX, minTY, minX, minY, invSize ), + maxZ = zOrder( maxTX, maxTY, minX, minY, invSize ); + + let p = ear.prevZ, + n = ear.nextZ; + + // look for points inside the triangle in both directions + while ( p && p.z >= minZ && n && n.z <= maxZ ) { + + if ( p !== ear.prev && p !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + p = p.prevZ; + + if ( n !== ear.prev && n !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) && + area( n.prev, n, n.next ) >= 0 ) return false; + n = n.nextZ; + + } + + // look for remaining points in decreasing z-order + while ( p && p.z >= minZ ) { + + if ( p !== ear.prev && p !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + p = p.prevZ; + + } + + // look for remaining points in increasing z-order + while ( n && n.z <= maxZ ) { + + if ( n !== ear.prev && n !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) && + area( n.prev, n, n.next ) >= 0 ) return false; + n = n.nextZ; + + } + + return true; + + } + + // go through all polygon nodes and cure small local self-intersections + function cureLocalIntersections( start, triangles, dim ) { + + let p = start; + do { + + const a = p.prev, + b = p.next.next; + + if ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) { + + triangles.push( a.i / dim ); + triangles.push( p.i / dim ); + triangles.push( b.i / dim ); + + // remove two nodes involved + removeNode( p ); + removeNode( p.next ); + + p = start = b; + + } + + p = p.next; + + } while ( p !== start ); + + return filterPoints( p ); + + } + + // try splitting polygon into two and triangulate them independently + function splitEarcut( start, triangles, dim, minX, minY, invSize ) { + + // look for a valid diagonal that divides the polygon into two + let a = start; + do { + + let b = a.next.next; + while ( b !== a.prev ) { + + if ( a.i !== b.i && isValidDiagonal( a, b ) ) { + + // split the polygon in two by the diagonal + let c = splitPolygon( a, b ); + + // filter colinear points around the cuts + a = filterPoints( a, a.next ); + c = filterPoints( c, c.next ); + + // run earcut on each half + earcutLinked( a, triangles, dim, minX, minY, invSize ); + earcutLinked( c, triangles, dim, minX, minY, invSize ); + return; + + } + + b = b.next; + + } + + a = a.next; + + } while ( a !== start ); + + } + + // link every hole into the outer loop, producing a single-ring polygon without holes + function eliminateHoles( data, holeIndices, outerNode, dim ) { + + const queue = []; + let i, len, start, end, list; + + for ( i = 0, len = holeIndices.length; i < len; i ++ ) { + + start = holeIndices[ i ] * dim; + end = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length; + list = linkedList( data, start, end, dim, false ); + if ( list === list.next ) list.steiner = true; + queue.push( getLeftmost( list ) ); + + } + + queue.sort( compareX ); + + // process holes from left to right + for ( i = 0; i < queue.length; i ++ ) { + + eliminateHole( queue[ i ], outerNode ); + outerNode = filterPoints( outerNode, outerNode.next ); + + } + + return outerNode; + + } + + function compareX( a, b ) { + + return a.x - b.x; + + } + + // find a bridge between vertices that connects hole with an outer ring and and link it + function eliminateHole( hole, outerNode ) { + + outerNode = findHoleBridge( hole, outerNode ); + if ( outerNode ) { + + const b = splitPolygon( outerNode, hole ); + + // filter collinear points around the cuts + filterPoints( outerNode, outerNode.next ); + filterPoints( b, b.next ); + + } + + } + + // David Eberly's algorithm for finding a bridge between hole and outer polygon + function findHoleBridge( hole, outerNode ) { + + let p = outerNode; + const hx = hole.x; + const hy = hole.y; + let qx = - Infinity, m; + + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + do { + + if ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) { + + const x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y ); + if ( x <= hx && x > qx ) { + + qx = x; + if ( x === hx ) { + + if ( hy === p.y ) return p; + if ( hy === p.next.y ) return p.next; + + } + + m = p.x < p.next.x ? p : p.next; + + } + + } + + p = p.next; + + } while ( p !== outerNode ); + + if ( ! m ) return null; + + if ( hx === qx ) return m; // hole touches outer segment; pick leftmost endpoint + + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point + + const stop = m, + mx = m.x, + my = m.y; + let tanMin = Infinity, tan; + + p = m; + + do { + + if ( hx >= p.x && p.x >= mx && hx !== p.x && + pointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) { + + tan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential + + if ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) { + + m = p; + tanMin = tan; + + } + + } + + p = p.next; + + } while ( p !== stop ); + + return m; + + } + + // whether sector in vertex m contains sector in vertex p in the same coordinates + function sectorContainsSector( m, p ) { + + return area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0; + + } + + // interlink polygon nodes in z-order + function indexCurve( start, minX, minY, invSize ) { + + let p = start; + do { + + if ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize ); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + + } while ( p !== start ); + + p.prevZ.nextZ = null; + p.prevZ = null; + + sortLinked( p ); + + } + + // Simon Tatham's linked list merge sort algorithm + // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html + function sortLinked( list ) { + + let i, p, q, e, tail, numMerges, pSize, qSize, + inSize = 1; + + do { + + p = list; + list = null; + tail = null; + numMerges = 0; + + while ( p ) { + + numMerges ++; + q = p; + pSize = 0; + for ( i = 0; i < inSize; i ++ ) { + + pSize ++; + q = q.nextZ; + if ( ! q ) break; + + } + + qSize = inSize; + + while ( pSize > 0 || ( qSize > 0 && q ) ) { + + if ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) { + + e = p; + p = p.nextZ; + pSize --; + + } else { + + e = q; + q = q.nextZ; + qSize --; + + } + + if ( tail ) tail.nextZ = e; + else list = e; + + e.prevZ = tail; + tail = e; + + } + + p = q; + + } + + tail.nextZ = null; + inSize *= 2; + + } while ( numMerges > 1 ); + + return list; + + } + + // z-order of a point given coords and inverse of the longer side of data bbox + function zOrder( x, y, minX, minY, invSize ) { + + // coords are transformed into non-negative 15-bit integer range + x = 32767 * ( x - minX ) * invSize; + y = 32767 * ( y - minY ) * invSize; + + x = ( x | ( x << 8 ) ) & 0x00FF00FF; + x = ( x | ( x << 4 ) ) & 0x0F0F0F0F; + x = ( x | ( x << 2 ) ) & 0x33333333; + x = ( x | ( x << 1 ) ) & 0x55555555; + + y = ( y | ( y << 8 ) ) & 0x00FF00FF; + y = ( y | ( y << 4 ) ) & 0x0F0F0F0F; + y = ( y | ( y << 2 ) ) & 0x33333333; + y = ( y | ( y << 1 ) ) & 0x55555555; + + return x | ( y << 1 ); + + } + + // find the leftmost node of a polygon ring + function getLeftmost( start ) { + + let p = start, + leftmost = start; + do { + + if ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p; + p = p.next; + + } while ( p !== start ); + + return leftmost; + + } + + // check if a point lies within a convex triangle + function pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) { + + return ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 && + ( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 && + ( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0; + + } + + // check if a diagonal between two polygon nodes is valid (lies in polygon interior) + function isValidDiagonal( a, b ) { + + return a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // dones't intersect other edges + ( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible + ( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors + equals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case + + } + + // signed area of a triangle + function area( p, q, r ) { + + return ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y ); + + } + + // check if two points are equal + function equals( p1, p2 ) { + + return p1.x === p2.x && p1.y === p2.y; + + } + + // check if two segments intersect + function intersects( p1, q1, p2, q2 ) { + + const o1 = sign( area( p1, q1, p2 ) ); + const o2 = sign( area( p1, q1, q2 ) ); + const o3 = sign( area( p2, q2, p1 ) ); + const o4 = sign( area( p2, q2, q1 ) ); + + if ( o1 !== o2 && o3 !== o4 ) return true; // general case + + if ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1 + if ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1 + if ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2 + if ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2 + + return false; + + } + + // for collinear points p, q, r, check if point q lies on segment pr + function onSegment( p, q, r ) { + + return q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y ); + + } + + function sign( num ) { + + return num > 0 ? 1 : num < 0 ? - 1 : 0; + + } + + // check if a polygon diagonal intersects any polygon segments + function intersectsPolygon( a, b ) { + + let p = a; + do { + + if ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && + intersects( p, p.next, a, b ) ) return true; + p = p.next; + + } while ( p !== a ); + + return false; + + } + + // check if a polygon diagonal is locally inside the polygon + function locallyInside( a, b ) { + + return area( a.prev, a, a.next ) < 0 ? + area( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 : + area( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0; + + } + + // check if the middle point of a polygon diagonal is inside the polygon + function middleInside( a, b ) { + + let p = a, + inside = false; + const px = ( a.x + b.x ) / 2, + py = ( a.y + b.y ) / 2; + do { + + if ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y && + ( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) ) + inside = ! inside; + p = p.next; + + } while ( p !== a ); + + return inside; + + } + + // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; + // if one belongs to the outer ring and another to a hole, it merges it into a single ring + function splitPolygon( a, b ) { + + const a2 = new Node( a.i, a.x, a.y ), + b2 = new Node( b.i, b.x, b.y ), + an = a.next, + bp = b.prev; + + a.next = b; + b.prev = a; + + a2.next = an; + an.prev = a2; + + b2.next = a2; + a2.prev = b2; + + bp.next = b2; + b2.prev = bp; + + return b2; + + } + + // create a node and optionally link it with previous one (in a circular doubly linked list) + function insertNode( i, x, y, last ) { + + const p = new Node( i, x, y ); + + if ( ! last ) { + + p.prev = p; + p.next = p; + + } else { + + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + + } + + return p; + + } + + function removeNode( p ) { + + p.next.prev = p.prev; + p.prev.next = p.next; + + if ( p.prevZ ) p.prevZ.nextZ = p.nextZ; + if ( p.nextZ ) p.nextZ.prevZ = p.prevZ; + + } + + function Node( i, x, y ) { + + // vertex index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertex nodes in a polygon ring + this.prev = null; + this.next = null; + + // z-order curve value + this.z = null; + + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; + + // indicates whether this is a steiner point + this.steiner = false; + + } + + function signedArea( data, start, end, dim ) { + + let sum = 0; + for ( let i = start, j = end - dim; i < end; i += dim ) { + + sum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] ); + j = i; + + } + + return sum; + + } + + const ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + const n = contour.length; + let a = 0.0; + + for ( let p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + }, + + triangulateShape: function ( contour, holes ) { + + const vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] + const holeIndices = []; // array of hole indices + const faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ] + + removeDupEndPts( contour ); + addContour( vertices, contour ); + + // + + let holeIndex = contour.length; + + holes.forEach( removeDupEndPts ); + + for ( let i = 0; i < holes.length; i ++ ) { + + holeIndices.push( holeIndex ); + holeIndex += holes[ i ].length; + addContour( vertices, holes[ i ] ); + + } + + // + + const triangles = Earcut.triangulate( vertices, holeIndices ); + + // + + for ( let i = 0; i < triangles.length; i += 3 ) { + + faces.push( triangles.slice( i, i + 3 ) ); + + } + + return faces; + + } + + }; + + function removeDupEndPts( points ) { + + const l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + + } + + function addContour( vertices, contour ) { + + for ( let i = 0; i < contour.length; i ++ ) { + + vertices.push( contour[ i ].x ); + vertices.push( contour[ i ].y ); + + } + + } + + /** + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * depth: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline (including bevelOffset) is bevel + * bevelOffset: , // how far from shape outline does bevel start + * bevelSegments: , // number of bevel layers + * + * extrudePath: // curve to extrude shape along + * + * UVGenerator: // object that provides UV generator functions + * + * } + */ + + class ExtrudeBufferGeometry extends BufferGeometry { + + constructor( shapes, options ) { + + super(); + + this.type = 'ExtrudeBufferGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + const scope = this; + + const verticesArray = []; + const uvArray = []; + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + addShape( shape ); + + } + + // build geometry + + this.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) ); + + this.computeVertexNormals(); + + // functions + + function addShape( shape ) { + + const placeholder = []; + + // options + + const curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + const steps = options.steps !== undefined ? options.steps : 1; + let depth = options.depth !== undefined ? options.depth : 100; + + let bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; + let bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; + let bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; + let bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0; + let bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + const extrudePath = options.extrudePath; + + const uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator; + + // deprecated options + + if ( options.amount !== undefined ) { + + console.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' ); + depth = options.amount; + + } + + // + + let extrudePts, extrudeByPath = false; + let splineTube, binormal, normal, position2; + + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + bevelOffset = 0; + + } + + // Variables initialization + + const shapePoints = shape.extractPoints( curveSegments ); + + let vertices = shapePoints.shape; + const holes = shapePoints.holes; + + const reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + } + + + const faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + const contour = vertices; // vertices has all points but contour has only points of circumference + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + const vlen = vertices.length, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + let v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + const v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + const v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + const v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + const collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + const v_prev_len = Math.sqrt( v_prev_lensq ); + const v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + const ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + const ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + const ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + const ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + const sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + const v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + let direction_eq = false; // assumes: opposite + + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + const contourMovements = []; + + for ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + const holesMovements = []; + let oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( let b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + const t = b / bevelSegments; + const z = bevelThickness * Math.cos( t * Math.PI / 2 ); + const bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset; + + // contract shape + + for ( let i = 0, il = contour.length; i < il; i ++ ) { + + const vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( let i = 0, il = ahole.length; i < il; i ++ ) { + + const vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + const bs = bevelSize + bevelOffset; + + // Back facing vertices + + for ( let i = 0; i < vlen; i ++ ) { + + const vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + for ( let s = 1; s <= steps; s ++ ) { + + for ( let i = 0; i < vlen; i ++ ) { + + const vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( let b = bevelSegments - 1; b >= 0; b -- ) { + + const t = b / bevelSegments; + const z = bevelThickness * Math.cos( t * Math.PI / 2 ); + const bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset; + + // contract shape + + for ( let i = 0, il = contour.length; i < il; i ++ ) { + + const vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, depth + z ); + + } + + // expand holes + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( let i = 0, il = ahole.length; i < il; i ++ ) { + + const vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + const start = verticesArray.length / 3; + + if ( bevelEnabled ) { + + let layer = 0; // steps + 1 + let offset = vlen * layer; + + // Bottom faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length / 3 - start, 0 ); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + const start = verticesArray.length / 3; + let layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length / 3 - start, 1 ); + + + } + + function sidewalls( contour, layeroffset ) { + + let i = contour.length; + + while ( -- i >= 0 ) { + + const j = i; + let k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + for ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) { + + const slen1 = vlen * s; + const slen2 = vlen * ( s + 1 ); + + const a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + const nextIndex = verticesArray.length / 3; + const uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + const nextIndex = verticesArray.length / 3; + const uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + } + + } + + toJSON() { + + const data = BufferGeometry.prototype.toJSON.call( this ); + + const shapes = this.parameters.shapes; + const options = this.parameters.options; + + return toJSON( shapes, options, data ); + + } + + } + + const WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + const a_x = vertices[ indexA * 3 ]; + const a_y = vertices[ indexA * 3 + 1 ]; + const b_x = vertices[ indexB * 3 ]; + const b_y = vertices[ indexB * 3 + 1 ]; + const c_x = vertices[ indexC * 3 ]; + const c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + const a_x = vertices[ indexA * 3 ]; + const a_y = vertices[ indexA * 3 + 1 ]; + const a_z = vertices[ indexA * 3 + 2 ]; + const b_x = vertices[ indexB * 3 ]; + const b_y = vertices[ indexB * 3 + 1 ]; + const b_z = vertices[ indexB * 3 + 2 ]; + const c_x = vertices[ indexC * 3 ]; + const c_y = vertices[ indexC * 3 + 1 ]; + const c_z = vertices[ indexC * 3 + 2 ]; + const d_x = vertices[ indexD * 3 ]; + const d_y = vertices[ indexD * 3 + 1 ]; + const d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < 0.01 ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } + + }; + + function toJSON( shapes, options, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + if ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON(); + + return data; + + } + + /** + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * depth: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline (including bevelOffset) is bevel + * bevelOffset: , // how far from shape outline does bevel start + * bevelSegments: , // number of bevel layers + * + * extrudePath: // curve to extrude shape along + * + * UVGenerator: // object that provides UV generator functions + * + * } + */ + + class ExtrudeGeometry extends Geometry { + + constructor( shapes, options ) { + + super(); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) ); + this.mergeVertices(); + + } + + toJSON() { + + const data = super.toJSON(); + + const shapes = this.parameters.shapes; + const options = this.parameters.options; + + return toJSON$1( shapes, options, data ); + + } + + } + + function toJSON$1( shapes, options, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + if ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON(); + + return data; + + } + + class IcosahedronBufferGeometry extends PolyhedronBufferGeometry { + + constructor( radius = 1, detail = 0 ) { + + const t = ( 1 + Math.sqrt( 5 ) ) / 2; + + const vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + const indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + } + + class IcosahedronGeometry extends Geometry { + + constructor( radius, detail ) { + + super(); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + } + + class LatheBufferGeometry extends BufferGeometry { + + constructor( points, segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) { + + super(); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ); + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = MathUtils.clamp( phiLength, 0, Math.PI * 2 ); + + // buffers + + const indices = []; + const vertices = []; + const uvs = []; + + // helper variables + + const inverseSegments = 1.0 / segments; + const vertex = new Vector3(); + const uv = new Vector2(); + + // generate vertices and uvs + + for ( let i = 0; i <= segments; i ++ ) { + + const phi = phiStart + i * inverseSegments * phiLength; + + const sin = Math.sin( phi ); + const cos = Math.cos( phi ); + + for ( let j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( let i = 0; i < segments; i ++ ) { + + for ( let j = 0; j < ( points.length - 1 ); j ++ ) { + + const base = j + i * points.length; + + const a = base; + const b = base + points.length; + const c = base + points.length + 1; + const d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + const normals = this.attributes.normal.array; + const n1 = new Vector3(); + const n2 = new Vector3(); + const n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + const base = segments * points.length * 3; + + for ( let i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + + } + + } + + class LatheGeometry extends Geometry { + + constructor( points, segments, phiStart, phiLength ) { + + super(); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + + } + + } + + class OctahedronBufferGeometry extends PolyhedronBufferGeometry { + + constructor( radius = 1, detail = 0 ) { + + const vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, + 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + const indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, + 0, 5, 2, 1, 2, 5, 1, 5, 3, + 1, 3, 4, 1, 4, 2 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + } + + class OctahedronGeometry extends Geometry { + + constructor( radius, detail ) { + + super(); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + } + + /** + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout https://prideout.net/blog/old/blog/index.html@p=44.html + */ + + function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + const EPS = 0.00001; + + const normal = new Vector3(); + + const p0 = new Vector3(), p1 = new Vector3(); + const pu = new Vector3(), pv = new Vector3(); + + if ( func.length < 3 ) { + + console.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' ); + + } + + // generate vertices, normals and uvs + + const sliceCount = slices + 1; + + for ( let i = 0; i <= stacks; i ++ ) { + + const v = i / stacks; + + for ( let j = 0; j <= slices; j ++ ) { + + const u = j / slices; + + // vertex + + func( u, v, p0 ); + vertices.push( p0.x, p0.y, p0.z ); + + // normal + + // approximate tangent vectors via finite differences + + if ( u - EPS >= 0 ) { + + func( u - EPS, v, p1 ); + pu.subVectors( p0, p1 ); + + } else { + + func( u + EPS, v, p1 ); + pu.subVectors( p1, p0 ); + + } + + if ( v - EPS >= 0 ) { + + func( u, v - EPS, p1 ); + pv.subVectors( p0, p1 ); + + } else { + + func( u, v + EPS, p1 ); + pv.subVectors( p1, p0 ); + + } + + // cross product of tangent vectors returns surface normal + + normal.crossVectors( pu, pv ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, v ); + + } + + } + + // generate indices + + for ( let i = 0; i < stacks; i ++ ) { + + for ( let j = 0; j < slices; j ++ ) { + + const a = i * sliceCount + j; + const b = i * sliceCount + j + 1; + const c = ( i + 1 ) * sliceCount + j + 1; + const d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + /** + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout https://prideout.net/blog/old/blog/index.html@p=44.html + */ + + function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + + } + + ParametricGeometry.prototype = Object.create( Geometry.prototype ); + ParametricGeometry.prototype.constructor = ParametricGeometry; + + class PlaneGeometry extends Geometry { + + constructor( width, height, widthSegments, heightSegments ) { + + super(); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + this.mergeVertices(); + + } + + } + + class PolyhedronGeometry extends Geometry { + + constructor( vertices, indices, radius, detail ) { + + super(); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + + } + + } + + class RingBufferGeometry extends BufferGeometry { + + constructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 8, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super(); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + thetaSegments = Math.max( 3, thetaSegments ); + phiSegments = Math.max( 1, phiSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // some helper variables + + let radius = innerRadius; + const radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + const vertex = new Vector3(); + const uv = new Vector2(); + + // generate vertices, normals and uvs + + for ( let j = 0; j <= phiSegments; j ++ ) { + + for ( let i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + const segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( let j = 0; j < phiSegments; j ++ ) { + + const thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( let i = 0; i < thetaSegments; i ++ ) { + + const segment = i + thetaSegmentLevel; + + const a = segment; + const b = segment + thetaSegments + 1; + const c = segment + thetaSegments + 2; + const d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + } + + class RingGeometry extends Geometry { + + constructor( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + super(); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + } + + class ShapeBufferGeometry extends BufferGeometry { + + constructor( shapes, curveSegments = 12 ) { + + super(); + this.type = 'ShapeBufferGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + let groupStart = 0; + let groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( let i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + const indexOffset = vertices.length / 3; + const points = shape.extractPoints( curveSegments ); + + let shapeVertices = points.shape; + const shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + } + + for ( let i = 0, l = shapeHoles.length; i < l; i ++ ) { + + const shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + const faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( let i = 0, l = shapeHoles.length; i < l; i ++ ) { + + const shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( let i = 0, l = shapeVertices.length; i < l; i ++ ) { + + const vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( let i = 0, l = faces.length; i < l; i ++ ) { + + const face = faces[ i ]; + + const a = face[ 0 ] + indexOffset; + const b = face[ 1 ] + indexOffset; + const c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + toJSON() { + + const data = BufferGeometry.prototype.toJSON.call( this ); + + const shapes = this.parameters.shapes; + + return toJSON$2( shapes, data ); + + } + + } + + function toJSON$2( shapes, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + return data; + + } + + class ShapeGeometry extends Geometry { + + constructor( shapes, curveSegments ) { + + super(); + this.type = 'ShapeGeometry'; + + if ( typeof curveSegments === 'object' ) { + + console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); + + curveSegments = curveSegments.curveSegments; + + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) ); + this.mergeVertices(); + + } + + toJSON() { + + const data = Geometry.prototype.toJSON.call( this ); + + const shapes = this.parameters.shapes; + + return toJSON$3( shapes, data ); + + } + + } + + function toJSON$3( shapes, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + return data; + + } + + class SphereBufferGeometry extends BufferGeometry { + + constructor( radius = 1, widthSegments = 8, heightSegments = 6, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) { + + super(); + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) ); + + const thetaEnd = Math.min( thetaStart + thetaLength, Math.PI ); + + let index = 0; + const grid = []; + + const vertex = new Vector3(); + const normal = new Vector3(); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // generate vertices, normals and uvs + + for ( let iy = 0; iy <= heightSegments; iy ++ ) { + + const verticesRow = []; + + const v = iy / heightSegments; + + // special case for the poles + + let uOffset = 0; + + if ( iy == 0 && thetaStart == 0 ) { + + uOffset = 0.5 / widthSegments; + + } else if ( iy == heightSegments && thetaEnd == Math.PI ) { + + uOffset = - 0.5 / widthSegments; + + } + + for ( let ix = 0; ix <= widthSegments; ix ++ ) { + + const u = ix / widthSegments; + + // vertex + + vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); + vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.copy( vertex ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u + uOffset, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( let iy = 0; iy < heightSegments; iy ++ ) { + + for ( let ix = 0; ix < widthSegments; ix ++ ) { + + const a = grid[ iy ][ ix + 1 ]; + const b = grid[ iy ][ ix ]; + const c = grid[ iy + 1 ][ ix ]; + const d = grid[ iy + 1 ][ ix + 1 ]; + + if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); + if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + } + + class SphereGeometry extends Geometry { + + constructor( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + super(); + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + } + + class TetrahedronBufferGeometry extends PolyhedronBufferGeometry { + + constructor( radius = 1, detail = 0 ) { + + const vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + const indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + } + + class TetrahedronGeometry extends Geometry { + + constructor( radius, detail ) { + + super(); + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + } + + /** + * Text = 3D Text + * + * parameters = { + * font: , // font + * + * size: , // size of the text + * height: , // thickness to extrude text + * curveSegments: , // number of points on the curves + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into text bevel goes + * bevelSize: , // how far from text outline (including bevelOffset) is bevel + * bevelOffset: // how far from text outline does bevel start + * } + */ + + class TextBufferGeometry extends ExtrudeBufferGeometry { + + constructor( text, parameters = {} ) { + + const font = parameters.font; + + if ( ! ( font && font.isFont ) ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new BufferGeometry(); + + } + + const shapes = font.generateShapes( text, parameters.size ); + + // translate parameters to ExtrudeGeometry API + + parameters.depth = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + super( shapes, parameters ); + + this.type = 'TextBufferGeometry'; + + } + + } + + /** + * Text = 3D Text + * + * parameters = { + * font: , // font + * + * size: , // size of the text + * height: , // thickness to extrude text + * curveSegments: , // number of points on the curves + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into text bevel goes + * bevelSize: , // how far from text outline (including bevelOffset) is bevel + * bevelOffset: // how far from text outline does bevel start + * } + */ + + class TextGeometry extends Geometry { + + constructor( text, parameters ) { + + super(); + this.type = 'TextGeometry'; + + this.parameters = { + text: text, + parameters: parameters + }; + + this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) ); + this.mergeVertices(); + + } + + } + + class TorusBufferGeometry extends BufferGeometry { + + constructor( radius = 1, tube = 0.4, radialSegments = 8, tubularSegments = 6, arc = Math.PI * 2 ) { + + super(); + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radialSegments = Math.floor( radialSegments ); + tubularSegments = Math.floor( tubularSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + const center = new Vector3(); + const vertex = new Vector3(); + const normal = new Vector3(); + + // generate vertices, normals and uvs + + for ( let j = 0; j <= radialSegments; j ++ ) { + + for ( let i = 0; i <= tubularSegments; i ++ ) { + + const u = i / tubularSegments * arc; + const v = j / radialSegments * Math.PI * 2; + + // vertex + + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + normal.subVectors( vertex, center ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( let j = 1; j <= radialSegments; j ++ ) { + + for ( let i = 1; i <= tubularSegments; i ++ ) { + + // indices + + const a = ( tubularSegments + 1 ) * j + i - 1; + const b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + const c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + const d = ( tubularSegments + 1 ) * j + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + } + + class TorusGeometry extends Geometry { + + constructor( radius, tube, radialSegments, tubularSegments, arc ) { + + super(); + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + this.mergeVertices(); + + } + + } + + class TorusKnotBufferGeometry extends BufferGeometry { + + constructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) { + + super(); + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + tubularSegments = Math.floor( tubularSegments ); + radialSegments = Math.floor( radialSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + const vertex = new Vector3(); + const normal = new Vector3(); + + const P1 = new Vector3(); + const P2 = new Vector3(); + + const B = new Vector3(); + const T = new Vector3(); + const N = new Vector3(); + + // generate vertices, normals and uvs + + for ( let i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + const u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( let j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + const v = j / radialSegments * Math.PI * 2; + const cx = - tube * Math.cos( v ); + const cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + + normal.subVectors( vertex, P1 ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( let j = 1; j <= tubularSegments; j ++ ) { + + for ( let i = 1; i <= radialSegments; i ++ ) { + + // indices + + const a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + const b = ( radialSegments + 1 ) * j + ( i - 1 ); + const c = ( radialSegments + 1 ) * j + i; + const d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + const cu = Math.cos( u ); + const su = Math.sin( u ); + const quOverP = q / p * u; + const cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + + } + + } + + class TorusKnotGeometry extends Geometry { + + constructor( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + super(); + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + + } + + } + + class TubeBufferGeometry extends BufferGeometry { + + constructor( path, tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) { + + super(); + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + const frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + const vertex = new Vector3(); + const normal = new Vector3(); + const uv = new Vector2(); + let P = new Vector3(); + + // buffer + + const vertices = []; + const normals = []; + const uvs = []; + const indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( let i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + P = path.getPointAt( i / tubularSegments, P ); + + // retrieve corresponding normal and binormal + + const N = frames.normals[ i ]; + const B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( let j = 0; j <= radialSegments; j ++ ) { + + const v = j / radialSegments * Math.PI * 2; + + const sin = Math.sin( v ); + const cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( let j = 1; j <= tubularSegments; j ++ ) { + + for ( let i = 1; i <= radialSegments; i ++ ) { + + const a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + const b = ( radialSegments + 1 ) * j + ( i - 1 ); + const c = ( radialSegments + 1 ) * j + i; + const d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( let i = 0; i <= tubularSegments; i ++ ) { + + for ( let j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + toJSON() { + + const data = BufferGeometry.prototype.toJSON.call( this ); + + data.path = this.parameters.path.toJSON(); + + return data; + + } + + } + + class TubeGeometry extends Geometry { + + constructor( path, tubularSegments, radius, radialSegments, closed, taper ) { + + super(); + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + const bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + + } + + } + + class WireframeGeometry extends BufferGeometry { + + constructor( geometry ) { + + super(); + this.type = 'WireframeGeometry'; + + // buffer + + const vertices = []; + + // helper variables + + const edge = [ 0, 0 ], edges = {}; + const keys = [ 'a', 'b', 'c' ]; + + // different logic for Geometry and BufferGeometry + + if ( geometry && geometry.isGeometry ) { + + // create a data structure that contains all edges without duplicates + + const faces = geometry.faces; + + for ( let i = 0, l = faces.length; i < l; i ++ ) { + + const face = faces[ i ]; + + for ( let j = 0; j < 3; j ++ ) { + + const edge1 = face[ keys[ j ] ]; + const edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + const key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + // generate vertices + + for ( const key in edges ) { + + const e = edges[ key ]; + + let vertex = geometry.vertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = geometry.vertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else if ( geometry && geometry.isBufferGeometry ) { + + const vertex = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + const position = geometry.attributes.position; + const indices = geometry.index; + let groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all eges without duplicates + + for ( let o = 0, ol = groups.length; o < ol; ++ o ) { + + const group = groups[ o ]; + + const start = group.start; + const count = group.count; + + for ( let i = start, l = ( start + count ); i < l; i += 3 ) { + + for ( let j = 0; j < 3; j ++ ) { + + const edge1 = indices.getX( i + j ); + const edge2 = indices.getX( i + ( j + 1 ) % 3 ); + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + const key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + } + + // generate vertices + + for ( const key in edges ) { + + const e = edges[ key ]; + + vertex.fromBufferAttribute( position, e.index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex.fromBufferAttribute( position, e.index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else { + + // non-indexed BufferGeometry + + const position = geometry.attributes.position; + + for ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( let j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + const index1 = 3 * i + j; + vertex.fromBufferAttribute( position, index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + const index2 = 3 * i + ( ( j + 1 ) % 3 ); + vertex.fromBufferAttribute( position, index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + } + + } + + // build geometry + + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + } + + var Geometries = /*#__PURE__*/Object.freeze({ + __proto__: null, + BoxGeometry: BoxGeometry, + BoxBufferGeometry: BoxBufferGeometry, + CircleGeometry: CircleGeometry, + CircleBufferGeometry: CircleBufferGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + EdgesGeometry: EdgesGeometry, + ExtrudeGeometry: ExtrudeGeometry, + ExtrudeBufferGeometry: ExtrudeBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + PlaneGeometry: PlaneGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + ShapeGeometry: ShapeGeometry, + ShapeBufferGeometry: ShapeBufferGeometry, + SphereGeometry: SphereGeometry, + SphereBufferGeometry: SphereBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + TextGeometry: TextGeometry, + TextBufferGeometry: TextBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + WireframeGeometry: WireframeGeometry + }); + + /** + * parameters = { + * color: + * } + */ + + function ShadowMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShadowMaterial'; + + this.color = new Color( 0x000000 ); + this.transparent = true; + + this.setValues( parameters ); + + } + + ShadowMaterial.prototype = Object.create( Material.prototype ); + ShadowMaterial.prototype.constructor = ShadowMaterial; + + ShadowMaterial.prototype.isShadowMaterial = true; + + ShadowMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + return this; + + }; + + function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + + } + + RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); + RawShaderMaterial.prototype.constructor = RawShaderMaterial; + + RawShaderMaterial.prototype.isRawShaderMaterial = true; + + /** + * parameters = { + * color: , + * roughness: , + * metalness: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * roughnessMap: new THREE.Texture( ), + * + * metalnessMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: + * + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 1.0; + this.metalness = 0.0; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.vertexTangents = false; + + this.setValues( parameters ); + + } + + MeshStandardMaterial.prototype = Object.create( Material.prototype ); + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + + MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.vertexTangents = source.vertexTangents; + + return this; + + }; + + /** + * parameters = { + * clearcoat: , + * clearcoatMap: new THREE.Texture( ), + * clearcoatRoughness: , + * clearcoatRoughnessMap: new THREE.Texture( ), + * clearcoatNormalScale: , + * clearcoatNormalMap: new THREE.Texture( ), + * + * reflectivity: , + * ior: , + * + * sheen: , + * + * transmission: , + * transmissionMap: new THREE.Texture( ) + * } + */ + + function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { + + 'STANDARD': '', + 'PHYSICAL': '' + + }; + + this.type = 'MeshPhysicalMaterial'; + + this.clearcoat = 0.0; + this.clearcoatMap = null; + this.clearcoatRoughness = 0.0; + this.clearcoatRoughnessMap = null; + this.clearcoatNormalScale = new Vector2( 1, 1 ); + this.clearcoatNormalMap = null; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + Object.defineProperty( this, 'ior', { + get: function () { + + return ( 1 + 0.4 * this.reflectivity ) / ( 1 - 0.4 * this.reflectivity ); + + }, + set: function ( ior ) { + + this.reflectivity = MathUtils.clamp( 2.5 * ( ior - 1 ) / ( ior + 1 ), 0, 1 ); + + } + } ); + + this.sheen = null; // null will disable sheen bsdf + + this.transmission = 0.0; + this.transmissionMap = null; + + this.setValues( parameters ); + + } + + MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + + MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { + + 'STANDARD': '', + 'PHYSICAL': '' + + }; + + this.clearcoat = source.clearcoat; + this.clearcoatMap = source.clearcoatMap; + this.clearcoatRoughness = source.clearcoatRoughness; + this.clearcoatRoughnessMap = source.clearcoatRoughnessMap; + this.clearcoatNormalMap = source.clearcoatNormalMap; + this.clearcoatNormalScale.copy( source.clearcoatNormalScale ); + + this.reflectivity = source.reflectivity; + + if ( source.sheen ) { + + this.sheen = ( this.sheen || new Color() ).copy( source.sheen ); + + } else { + + this.sheen = null; + + } + + this.transmission = source.transmission; + this.transmissionMap = source.transmissionMap; + + return this; + + }; + + /** + * parameters = { + * color: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.MultiplyOperation, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshPhongMaterial.prototype = Object.create( Material.prototype ); + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + + MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * parameters = { + * color: , + * + * map: new THREE.Texture( ), + * gradientMap: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * alphaMap: new THREE.Texture( ), + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshToonMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + this.gradientMap = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.alphaMap = null; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshToonMaterial.prototype = Object.create( Material.prototype ); + MeshToonMaterial.prototype.constructor = MeshToonMaterial; + + MeshToonMaterial.prototype.isMeshToonMaterial = true; + + MeshToonMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + this.gradientMap = source.gradientMap; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.alphaMap = source.alphaMap; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * parameters = { + * opacity: , + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshNormalMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshNormalMaterial.prototype = Object.create( Material.prototype ); + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + + MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * parameters = { + * color: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshLambertMaterial.prototype = Object.create( Material.prototype ); + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + + MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * parameters = { + * color: , + * opacity: , + * + * matcap: new THREE.Texture( ), + * + * map: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * alphaMap: new THREE.Texture( ), + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshMatcapMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'MATCAP': '' }; + + this.type = 'MeshMatcapMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.matcap = null; + + this.map = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.alphaMap = null; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshMatcapMaterial.prototype = Object.create( Material.prototype ); + MeshMatcapMaterial.prototype.constructor = MeshMatcapMaterial; + + MeshMatcapMaterial.prototype.isMeshMatcapMaterial = true; + + MeshMatcapMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'MATCAP': '' }; + + this.color.copy( source.color ); + + this.matcap = source.matcap; + + this.map = source.map; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.alphaMap = source.alphaMap; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: + * } + */ + + function LineDashedMaterial( parameters ) { + + LineBasicMaterial.call( this ); + + this.type = 'LineDashedMaterial'; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.setValues( parameters ); + + } + + LineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype ); + LineDashedMaterial.prototype.constructor = LineDashedMaterial; + + LineDashedMaterial.prototype.isLineDashedMaterial = true; + + LineDashedMaterial.prototype.copy = function ( source ) { + + LineBasicMaterial.prototype.copy.call( this, source ); + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + }; + + var Materials = /*#__PURE__*/Object.freeze({ + __proto__: null, + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshToonMaterial: MeshToonMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshDistanceMaterial: MeshDistanceMaterial, + MeshBasicMaterial: MeshBasicMaterial, + MeshMatcapMaterial: MeshMatcapMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }); + + const AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function ( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function ( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function ( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function ( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + const n = times.length; + const result = new Array( n ); + for ( let i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function ( values, stride, order ) { + + const nValues = values.length; + const result = new values.constructor( nValues ); + + for ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + const srcOffset = order[ i ] * stride; + + for ( let j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { + + let i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + let value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + }, + + subclip: function ( sourceClip, name, startFrame, endFrame, fps = 30 ) { + + const clip = sourceClip.clone(); + + clip.name = name; + + const tracks = []; + + for ( let i = 0; i < clip.tracks.length; ++ i ) { + + const track = clip.tracks[ i ]; + const valueSize = track.getValueSize(); + + const times = []; + const values = []; + + for ( let j = 0; j < track.times.length; ++ j ) { + + const frame = track.times[ j ] * fps; + + if ( frame < startFrame || frame >= endFrame ) continue; + + times.push( track.times[ j ] ); + + for ( let k = 0; k < valueSize; ++ k ) { + + values.push( track.values[ j * valueSize + k ] ); + + } + + } + + if ( times.length === 0 ) continue; + + track.times = AnimationUtils.convertArray( times, track.times.constructor ); + track.values = AnimationUtils.convertArray( values, track.values.constructor ); + + tracks.push( track ); + + } + + clip.tracks = tracks; + + // find minimum .times value across all tracks in the trimmed clip + + let minStartTime = Infinity; + + for ( let i = 0; i < clip.tracks.length; ++ i ) { + + if ( minStartTime > clip.tracks[ i ].times[ 0 ] ) { + + minStartTime = clip.tracks[ i ].times[ 0 ]; + + } + + } + + // shift all tracks such that clip begins at t=0 + + for ( let i = 0; i < clip.tracks.length; ++ i ) { + + clip.tracks[ i ].shift( - 1 * minStartTime ); + + } + + clip.resetDuration(); + + return clip; + + }, + + makeClipAdditive: function ( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) { + + if ( fps <= 0 ) fps = 30; + + const numTracks = referenceClip.tracks.length; + const referenceTime = referenceFrame / fps; + + // Make each track's values relative to the values at the reference frame + for ( let i = 0; i < numTracks; ++ i ) { + + const referenceTrack = referenceClip.tracks[ i ]; + const referenceTrackType = referenceTrack.ValueTypeName; + + // Skip this track if it's non-numeric + if ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue; + + // Find the track in the target clip whose name and type matches the reference track + const targetTrack = targetClip.tracks.find( function ( track ) { + + return track.name === referenceTrack.name + && track.ValueTypeName === referenceTrackType; + + } ); + + if ( targetTrack === undefined ) continue; + + let referenceOffset = 0; + const referenceValueSize = referenceTrack.getValueSize(); + + if ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) { + + referenceOffset = referenceValueSize / 3; + + } + + let targetOffset = 0; + const targetValueSize = targetTrack.getValueSize(); + + if ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) { + + targetOffset = targetValueSize / 3; + + } + + const lastIndex = referenceTrack.times.length - 1; + let referenceValue; + + // Find the value to subtract out of the track + if ( referenceTime <= referenceTrack.times[ 0 ] ) { + + // Reference frame is earlier than the first keyframe, so just use the first keyframe + const startIndex = referenceOffset; + const endIndex = referenceValueSize - referenceOffset; + referenceValue = AnimationUtils.arraySlice( referenceTrack.values, startIndex, endIndex ); + + } else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) { + + // Reference frame is after the last keyframe, so just use the last keyframe + const startIndex = lastIndex * referenceValueSize + referenceOffset; + const endIndex = startIndex + referenceValueSize - referenceOffset; + referenceValue = AnimationUtils.arraySlice( referenceTrack.values, startIndex, endIndex ); + + } else { + + // Interpolate to the reference value + const interpolant = referenceTrack.createInterpolant(); + const startIndex = referenceOffset; + const endIndex = referenceValueSize - referenceOffset; + interpolant.evaluate( referenceTime ); + referenceValue = AnimationUtils.arraySlice( interpolant.resultBuffer, startIndex, endIndex ); + + } + + // Conjugate the quaternion + if ( referenceTrackType === 'quaternion' ) { + + const referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate(); + referenceQuat.toArray( referenceValue ); + + } + + // Subtract the reference value from all of the track values + + const numTimes = targetTrack.times.length; + for ( let j = 0; j < numTimes; ++ j ) { + + const valueStart = j * targetValueSize + targetOffset; + + if ( referenceTrackType === 'quaternion' ) { + + // Multiply the conjugate for quaternion track types + Quaternion.multiplyQuaternionsFlat( + targetTrack.values, + valueStart, + referenceValue, + 0, + targetTrack.values, + valueStart + ); + + } else { + + const valueEnd = targetValueSize - targetOffset * 2; + + // Subtract each value for all other numeric track types + for ( let k = 0; k < valueEnd; ++ k ) { + + targetTrack.values[ valueStart + k ] -= referenceValue[ k ]; + + } + + } + + } + + } + + targetClip.blendMode = AdditiveAnimationBlendMode; + + return targetClip; + + } + + }; + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + */ + + function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + } + + Object.assign( Interpolant.prototype, { + + evaluate: function ( t ) { + + const pp = this.parameterPositions; + let i1 = this._cachedIndex, + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + let right; + + linear_scan: { + + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( let giveUpAt = i1 + 2; ; ) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + const t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( let giveUpAt = i1 - 2; ; ) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + const mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function () { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function ( index ) { + + // copies a sample value to the result buffer + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function ( /* i1, t0, t, t1 */ ) { + + throw new Error( 'call to abstract method' ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function ( /* i1, t0, t1 */ ) { + + // empty + + } + + } ); + + // DECLARE ALIAS AFTER assign prototype + Object.assign( Interpolant.prototype, { + + //( 0, t, t0 ), returns this.resultBuffer + beforeStart_: Interpolant.prototype.copySampleValue_, + + //( N-1, tN-1, t ), returns this.resultBuffer + afterEnd_: Interpolant.prototype.copySampleValue_, + + } ); + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + */ + + function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = - 0; + this._offsetPrev = - 0; + this._weightNext = - 0; + this._offsetNext = - 0; + + } + + CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function ( i1, t0, t1 ) { + + const pp = this.parameterPositions; + let iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + const halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function ( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + const sP = - wP * ppp + 2 * wP * pp - wP * p; + const s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1; + const s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + const sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + + } ); + + function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + + } ); + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + */ + + function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function ( i1 /*, t0, t, t1 */ ) { + + return this.copySampleValue_( i1 - 1 ); + + } + + } ); + + function KeyframeTrack( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' ); + if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name ); + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + } + + // Static methods + + Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + toJSON: function ( track ) { + + const trackType = track.constructor; + + let json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + const interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + } + + } ); + + Object.assign( KeyframeTrack.prototype, { + + constructor: KeyframeTrack, + + TimeBufferType: Float32Array, + + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function ( result ) { + + return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new LinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function ( result ) { + + return new CubicInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function ( interpolation ) { + + let factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + const message = 'unsupported interpolation for ' + + this.ValueTypeName + ' keyframe track named ' + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( 'THREE.KeyframeTrack:', message ); + return this; + + } + + this.createInterpolant = factoryMethod; + + return this; + + }, + + getInterpolation: function () { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function () { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function ( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + const times = this.times; + + for ( let i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function ( timeScale ) { + + if ( timeScale !== 1.0 ) { + + const times = this.times; + + for ( let i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function ( startTime, endTime ) { + + const times = this.times, + nKeys = times.length; + + let from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) { + + ++ from; + + } + + while ( to !== - 1 && times[ to ] > endTime ) { + + -- to; + + } + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) { + + to = Math.max( to, 1 ); + from = to - 1; + + } + + const stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + + let valid = true; + + const valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this ); + valid = false; + + } + + const times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( 'THREE.KeyframeTrack: Track is empty.', this ); + valid = false; + + } + + let prevTime = null; + + for ( let i = 0; i !== nKeys; i ++ ) { + + const currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( let i = 0, n = values.length; i !== n; ++ i ) { + + const value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + + // times or values may be shared with other tracks, so overwriting is unsafe + const times = AnimationUtils.arraySlice( this.times ), + values = AnimationUtils.arraySlice( this.values ), + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + lastIndex = times.length - 1; + + let writeIndex = 1; + + for ( let i = 1; i < lastIndex; ++ i ) { + + let keep = false; + + const time = times[ i ]; + const timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + const offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( let j = 0; j !== stride; ++ j ) { + + const value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else { + + keep = true; + + } + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + const readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( let j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } else { + + this.times = times; + this.values = values; + + } + + return this; + + }, + + clone: function () { + + const times = AnimationUtils.arraySlice( this.times, 0 ); + const values = AnimationUtils.arraySlice( this.values, 0 ); + + const TypedKeyframeTrack = this.constructor; + const track = new TypedKeyframeTrack( this.name, times, values ); + + // Interpolant argument to constructor is not saved, so copy the factory method directly. + track.createInterpolant = this.createInterpolant; + + return track; + + } + + } ); + + /** + * A Track of Boolean keyframe values. + */ + + function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrack.call( this, name, times, values ); + + } + + BooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + + } ); + + /** + * A Track of keyframe values that represent color. + */ + + function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + ColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + + } ); + + /** + * A Track of numeric keyframe values. + */ + + function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + NumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * Spherical linear unit quaternion interpolant. + */ + + function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + let offset = i1 * stride; + + for ( let end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + + } ); + + /** + * A Track of quaternion keyframe values. + */ + + function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + QuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + + } ); + + /** + * A Track that interpolates Strings + */ + + function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + StringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + + } ); + + /** + * A Track of vectored keyframe values. + */ + + function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + VectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + function AnimationClip( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) { + + this.name = name; + this.tracks = tracks; + this.duration = duration; + this.blendMode = blendMode; + + this.uuid = MathUtils.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + } + + function getTrackTypeForValueTypeName( typeName ) { + + switch ( typeName.toLowerCase() ) { + + case 'scalar': + case 'double': + case 'float': + case 'number': + case 'integer': + + return NumberKeyframeTrack; + + case 'vector': + case 'vector2': + case 'vector3': + case 'vector4': + + return VectorKeyframeTrack; + + case 'color': + + return ColorKeyframeTrack; + + case 'quaternion': + + return QuaternionKeyframeTrack; + + case 'bool': + case 'boolean': + + return BooleanKeyframeTrack; + + case 'string': + + return StringKeyframeTrack; + + } + + throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName ); + + } + + function parseKeyframeTrack( json ) { + + if ( json.type === undefined ) { + + throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); + + } + + const trackType = getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + const times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we assume a constructor compatible with the base + return new trackType( json.name, json.times, json.values, json.interpolation ); + + } + + } + + Object.assign( AnimationClip, { + + parse: function ( json ) { + + const tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + const clip = new AnimationClip( json.name, json.duration, tracks, json.blendMode ); + clip.uuid = json.uuid; + + return clip; + + }, + + toJSON: function ( clip ) { + + const tracks = [], + clipTracks = clip.tracks; + + const json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks, + 'uuid': clip.uuid, + 'blendMode': clip.blendMode + + }; + + for ( let i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) { + + const numMorphTargets = morphTargetSequence.length; + const tracks = []; + + for ( let i = 0; i < numMorphTargets; i ++ ) { + + let times = []; + let values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + const order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new AnimationClip( name, - 1, tracks ); + + }, + + findByName: function ( objectOrClipArray, name ) { + + let clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + const o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( let i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) { + + const animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + const pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( let i = 0, il = morphTargets.length; i < il; i ++ ) { + + const morphTarget = morphTargets[ i ]; + const parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + const name = parts[ 1 ]; + + let animationMorphTargets = animationToMorphTargets[ name ]; + + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + const clips = []; + + for ( const name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function ( animation, bones ) { + + if ( ! animation ) { + + console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); + return null; + + } + + const addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + const times = []; + const values = []; + + AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + const tracks = []; + + const clipName = animation.name || 'default'; + const fps = animation.fps || 30; + const blendMode = animation.blendMode; + + // automatic length determination in AnimationClip. + let duration = animation.length || - 1; + + const hierarchyTracks = animation.hierarchy || []; + + for ( let h = 0; h < hierarchyTracks.length; h ++ ) { + + const animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + const morphTargetNames = {}; + + let k; + + for ( k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( const morphTargetName in morphTargetNames ) { + + const times = []; + const values = []; + + for ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + const animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + // ...assume skeletal animation + + const boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + const clip = new AnimationClip( clipName, duration, tracks, blendMode ); + + return clip; + + } + + } ); + + Object.assign( AnimationClip.prototype, { + + resetDuration: function () { + + const tracks = this.tracks; + let duration = 0; + + for ( let i = 0, n = tracks.length; i !== n; ++ i ) { + + const track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + return this; + + }, + + trim: function () { + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + validate: function () { + + let valid = true; + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + valid = valid && this.tracks[ i ].validate(); + + } + + return valid; + + }, + + optimize: function () { + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + }, + + clone: function () { + + const tracks = []; + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + tracks.push( this.tracks[ i ].clone() ); + + } + + return new AnimationClip( this.name, this.duration, tracks, this.blendMode ); + + }, + + toJSON: function () { + + return AnimationClip.toJSON( this ); + + } + + } ); + + const Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + + }; + + function LoadingManager( onLoad, onProgress, onError ) { + + const scope = this; + + let isLoading = false; + let itemsLoaded = 0; + let itemsTotal = 0; + let urlModifier = undefined; + const handlers = []; + + // Refer to #5689 for the reason why we don't set .onStart + // in the constructor + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + this.resolveURL = function ( url ) { + + if ( urlModifier ) { + + return urlModifier( url ); + + } + + return url; + + }; + + this.setURLModifier = function ( transform ) { + + urlModifier = transform; + + return this; + + }; + + this.addHandler = function ( regex, loader ) { + + handlers.push( regex, loader ); + + return this; + + }; + + this.removeHandler = function ( regex ) { + + const index = handlers.indexOf( regex ); + + if ( index !== - 1 ) { + + handlers.splice( index, 2 ); + + } + + return this; + + }; + + this.getHandler = function ( file ) { + + for ( let i = 0, l = handlers.length; i < l; i += 2 ) { + + const regex = handlers[ i ]; + const loader = handlers[ i + 1 ]; + + if ( regex.global ) regex.lastIndex = 0; // see #17920 + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + }; + + } + + const DefaultLoadingManager = new LoadingManager(); + + function Loader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.crossOrigin = 'anonymous'; + this.withCredentials = false; + this.path = ''; + this.resourcePath = ''; + this.requestHeader = {}; + + } + + Object.assign( Loader.prototype, { + + load: function ( /* url, onLoad, onProgress, onError */ ) {}, + + loadAsync: function ( url, onProgress ) { + + const scope = this; + + return new Promise( function ( resolve, reject ) { + + scope.load( url, resolve, onProgress, reject ); + + } ); + + }, + + parse: function ( /* data */ ) {}, + + setCrossOrigin: function ( crossOrigin ) { + + this.crossOrigin = crossOrigin; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setPath: function ( path ) { + + this.path = path; + return this; + + }, + + setResourcePath: function ( resourcePath ) { + + this.resourcePath = resourcePath; + return this; + + }, + + setRequestHeader: function ( requestHeader ) { + + this.requestHeader = requestHeader; + return this; + + } + + } ); + + const loading = {}; + + function FileLoader( manager ) { + + Loader.call( this, manager ); + + } + + FileLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: FileLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const scope = this; + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check if request is duplicate + + if ( loading[ url ] !== undefined ) { + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + return; + + } + + // Check for data: URI + const dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + const dataUriRegexResult = url.match( dataUriRegex ); + let request; + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + const mimeType = dataUriRegexResult[ 1 ]; + const isBase64 = !! dataUriRegexResult[ 2 ]; + + let data = dataUriRegexResult[ 3 ]; + data = decodeURIComponent( data ); + + if ( isBase64 ) data = atob( data ); + + try { + + let response; + const responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + const view = new Uint8Array( data.length ); + + for ( let i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ view.buffer ], { type: mimeType } ); + + } else { + + response = view.buffer; + + } + + break; + + case 'document': + + const parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + setTimeout( function () { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } catch ( error ) { + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + setTimeout( function () { + + if ( onError ) onError( error ); + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + }, 0 ); + + } + + } else { + + // Initialise array for duplicate requests + + loading[ url ] = []; + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + request = new XMLHttpRequest(); + + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + const response = this.response; + + const callbacks = loading[ url ]; + + delete loading[ url ]; + + if ( this.status === 200 || this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + if ( this.status === 0 ) console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + // Add to cache only on HTTP success, so that we do not cache + // error response bodies as proper responses to requests. + Cache.add( url, response ); + + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( response ); + + } + + scope.manager.itemEnd( url ); + + } else { + + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } + + }, false ); + + request.addEventListener( 'progress', function ( event ) { + + const callbacks = loading[ url ]; + + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onProgress ) callback.onProgress( event ); + + } + + }, false ); + + request.addEventListener( 'error', function ( event ) { + + const callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + }, false ); + + request.addEventListener( 'abort', function ( event ) { + + const callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); + + for ( const header in this.requestHeader ) { + + request.setRequestHeader( header, this.requestHeader[ header ] ); + + } + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setMimeType: function ( value ) { + + this.mimeType = value; + return this; + + } + + } ); + + function AnimationLoader( manager ) { + + Loader.call( this, manager ); + + } + + AnimationLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: AnimationLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.setRequestHeader( scope.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + const animations = []; + + for ( let i = 0; i < json.length; i ++ ) { + + const clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + } + + } ); + + /** + * Abstract Base class to block based textures loader (dds, pvr, ...) + * + * Sub classes have to implement the parse() method which will be used in load(). + */ + + function CompressedTextureLoader( manager ) { + + Loader.call( this, manager ); + + } + + CompressedTextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: CompressedTextureLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + const scope = this; + + const images = []; + + const texture = new CompressedTexture(); + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + + let loaded = 0; + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + const texDatas = scope.parse( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter; + + texture.image = images; + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + for ( let i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + const texDatas = scope.parse( buffer, true ); + + if ( texDatas.isCubemap ) { + + const faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( let f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps: [] }; + + for ( let i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + texture.image = images; + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + } + + } ); + + function ImageLoader( manager ) { + + Loader.call( this, manager ); + + } + + ImageLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: ImageLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const scope = this; + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + const image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + + function onImageLoad() { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + } + + function onImageError( event ) { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } + + image.addEventListener( 'load', onImageLoad, false ); + image.addEventListener( 'error', onImageError, false ); + + if ( url.substr( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + } + + } ); + + function CubeTextureLoader( manager ) { + + Loader.call( this, manager ); + + } + + CubeTextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: CubeTextureLoader, + + load: function ( urls, onLoad, onProgress, onError ) { + + const texture = new CubeTexture(); + + const loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + let loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( let i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + } + + } ); + + /** + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + * + * Sub classes have to implement the parse() method which will be used in load(). + */ + + function DataTextureLoader( manager ) { + + Loader.call( this, manager ); + + } + + DataTextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: DataTextureLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + const scope = this; + + const texture = new DataTexture(); + + const loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setPath( this.path ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( buffer ) { + + const texData = scope.parse( buffer ); + + if ( ! texData ) return; + + if ( texData.image !== undefined ) { + + texture.image = texData.image; + + } else if ( texData.data !== undefined ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter; + texture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter; + + texture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1; + + if ( texData.format !== undefined ) { + + texture.format = texData.format; + + } + + if ( texData.type !== undefined ) { + + texture.type = texData.type; + + } + + if ( texData.mipmaps !== undefined ) { + + texture.mipmaps = texData.mipmaps; + texture.minFilter = LinearMipmapLinearFilter; // presumably... + + } + + if ( texData.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + + } ); + + function TextureLoader( manager ) { + + Loader.call( this, manager ); + + } + + TextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: TextureLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + const texture = new Texture(); + + const loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + loader.load( url, function ( image ) { + + texture.image = image; + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + const isJPEG = url.search( /\.jpe?g($|\?)/i ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + } + + } ); + + /** + * Extensible curve object. + * + * Some common of curve methods: + * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget ) + * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget ) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + + function Curve() { + + this.type = 'Curve'; + + this.arcLengthDivisions = 200; + + } + + Object.assign( Curve.prototype, { + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( /* t, optionalTarget */ ) { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u, optionalTarget ) { + + const t = this.getUtoTmapping( u ); + return this.getPoint( t, optionalTarget ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions = 5 ) { + + const points = []; + + for ( let d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions = 5 ) { + + const points = []; + + for ( let d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + const lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( divisions === undefined ) divisions = this.arcLengthDivisions; + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + const cache = []; + let current, last = this.getPoint( 0 ); + let sum = 0; + + cache.push( 0 ); + + for ( let p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + }, + + updateArcLengths: function () { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + const arcLengths = this.getLengths(); + + let i = 0; + const il = arcLengths.length; + + let targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + // binary search for the index with largest value smaller than target u distance + + let low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + if ( arcLengths[ i ] === targetArcLength ) { + + return i / ( il - 1 ); + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + const lengthBefore = arcLengths[ i ]; + const lengthAfter = arcLengths[ i + 1 ]; + + const segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + const segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + const t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function ( t, optionalTarget ) { + + const delta = 0.0001; + let t1 = t - delta; + let t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + const pt1 = this.getPoint( t1 ); + const pt2 = this.getPoint( t2 ); + + const tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() ); + + tangent.copy( pt2 ).sub( pt1 ).normalize(); + + return tangent; + + }, + + getTangentAt: function ( u, optionalTarget ) { + + const t = this.getUtoTmapping( u ); + return this.getTangent( t, optionalTarget ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + const normal = new Vector3(); + + const tangents = []; + const normals = []; + const binormals = []; + + const vec = new Vector3(); + const mat = new Matrix4(); + + // compute the tangent vectors for each segment on the curve + + for ( let i = 0; i <= segments; i ++ ) { + + const u = i / segments; + + tangents[ i ] = this.getTangentAt( u, new Vector3() ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + let min = Number.MAX_VALUE; + const tx = Math.abs( tangents[ 0 ].x ); + const ty = Math.abs( tangents[ 0 ].y ); + const tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( let i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + const theta = Math.acos( MathUtils.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + let theta = Math.acos( MathUtils.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( let i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.arcLengthDivisions = source.arcLengthDivisions; + + return this; + + }, + + toJSON: function () { + + const data = { + metadata: { + version: 4.5, + type: 'Curve', + generator: 'Curve.toJSON' + } + }; + + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + + return data; + + }, + + fromJSON: function ( json ) { + + this.arcLengthDivisions = json.arcLengthDivisions; + + return this; + + } + + } ); + + function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + Curve.call( this ); + + this.type = 'EllipseCurve'; + + this.aX = aX || 0; + this.aY = aY || 0; + + this.xRadius = xRadius || 1; + this.yRadius = yRadius || 1; + + this.aStartAngle = aStartAngle || 0; + this.aEndAngle = aEndAngle || 2 * Math.PI; + + this.aClockwise = aClockwise || false; + + this.aRotation = aRotation || 0; + + } + + EllipseCurve.prototype = Object.create( Curve.prototype ); + EllipseCurve.prototype.constructor = EllipseCurve; + + EllipseCurve.prototype.isEllipseCurve = true; + + EllipseCurve.prototype.getPoint = function ( t, optionalTarget ) { + + const point = optionalTarget || new Vector2(); + + const twoPi = Math.PI * 2; + let deltaAngle = this.aEndAngle - this.aStartAngle; + const samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + const angle = this.aStartAngle + t * deltaAngle; + let x = this.aX + this.xRadius * Math.cos( angle ); + let y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + const cos = Math.cos( this.aRotation ); + const sin = Math.sin( this.aRotation ); + + const tx = x - this.aX; + const ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return point.set( x, y ); + + }; + + EllipseCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.aX = source.aX; + this.aY = source.aY; + + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + + this.aClockwise = source.aClockwise; + + this.aRotation = source.aRotation; + + return this; + + }; + + + EllipseCurve.prototype.toJSON = function () { + + const data = Curve.prototype.toJSON.call( this ); + + data.aX = this.aX; + data.aY = this.aY; + + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + + data.aClockwise = this.aClockwise; + + data.aRotation = this.aRotation; + + return data; + + }; + + EllipseCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.aX = json.aX; + this.aY = json.aY; + + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + + this.aClockwise = json.aClockwise; + + this.aRotation = json.aRotation; + + return this; + + }; + + function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + this.type = 'ArcCurve'; + + } + + ArcCurve.prototype = Object.create( EllipseCurve.prototype ); + ArcCurve.prototype.constructor = ArcCurve; + + ArcCurve.prototype.isArcCurve = true; + + /** + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + + let c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + let t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + let t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + const t2 = t * t; + const t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + + } + + // + + const tmp = new Vector3(); + const px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly(); + + function CatmullRomCurve3( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) { + + Curve.call( this ); + + this.type = 'CatmullRomCurve3'; + + this.points = points; + this.closed = closed; + this.curveType = curveType; + this.tension = tension; + + } + + CatmullRomCurve3.prototype = Object.create( Curve.prototype ); + CatmullRomCurve3.prototype.constructor = CatmullRomCurve3; + + CatmullRomCurve3.prototype.isCatmullRomCurve3 = true; + + CatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const points = this.points; + const l = points.length; + + const p = ( l - ( this.closed ? 0 : 1 ) ) * t; + let intPoint = Math.floor( p ); + let weight = p - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + let p0, p3; // 4 points (p1 & p2 defined below) + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + const p1 = points[ intPoint % l ]; + const p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + const pow = this.curveType === 'chordal' ? 0.5 : 0.25; + let dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + let dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + let dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.curveType === 'catmullrom' ) { + + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension ); + + } + + point.set( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return point; + + }; + + CatmullRomCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( let i = 0, l = source.points.length; i < l; i ++ ) { + + const point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + + return this; + + }; + + CatmullRomCurve3.prototype.toJSON = function () { + + const data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( let i = 0, l = this.points.length; i < l; i ++ ) { + + const point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + + return data; + + }; + + CatmullRomCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( let i = 0, l = json.points.length; i < l; i ++ ) { + + const point = json.points[ i ]; + this.points.push( new Vector3().fromArray( point ) ); + + } + + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + + return this; + + }; + + /** + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + + function CatmullRom( t, p0, p1, p2, p3 ) { + + const v0 = ( p2 - p0 ) * 0.5; + const v1 = ( p3 - p1 ) * 0.5; + const t2 = t * t; + const t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + // + + function QuadraticBezierP0( t, p ) { + + const k = 1 - t; + return k * k * p; + + } + + function QuadraticBezierP1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + + } + + function QuadraticBezierP2( t, p ) { + + return t * t * p; + + } + + function QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + + } + + // + + function CubicBezierP0( t, p ) { + + const k = 1 - t; + return k * k * k * p; + + } + + function CubicBezierP1( t, p ) { + + const k = 1 - t; + return 3 * k * k * t * p; + + } + + function CubicBezierP2( t, p ) { + + return 3 * ( 1 - t ) * t * t * p; + + } + + function CubicBezierP3( t, p ) { + + return t * t * t * p; + + } + + function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + + } + + function CubicBezierCurve( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve.prototype = Object.create( Curve.prototype ); + CubicBezierCurve.prototype.constructor = CubicBezierCurve; + + CubicBezierCurve.prototype.isCubicBezierCurve = true; + + CubicBezierCurve.prototype.getPoint = function ( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + return point; + + }; + + CubicBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + }; + + CubicBezierCurve.prototype.toJSON = function () { + + const data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + }; + + CubicBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + }; + + function CubicBezierCurve3( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve3'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve3.prototype = Object.create( Curve.prototype ); + CubicBezierCurve3.prototype.constructor = CubicBezierCurve3; + + CubicBezierCurve3.prototype.isCubicBezierCurve3 = true; + + CubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + return point; + + }; + + CubicBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + }; + + CubicBezierCurve3.prototype.toJSON = function () { + + const data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + }; + + CubicBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + }; + + function LineCurve( v1 = new Vector2(), v2 = new Vector2() ) { + + Curve.call( this ); + + this.type = 'LineCurve'; + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve.prototype = Object.create( Curve.prototype ); + LineCurve.prototype.constructor = LineCurve; + + LineCurve.prototype.isLineCurve = true; + + LineCurve.prototype.getPoint = function ( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + }; + + LineCurve.prototype.getTangent = function ( t, optionalTarget ) { + + const tangent = optionalTarget || new Vector2(); + + tangent.copy( this.v2 ).sub( this.v1 ).normalize(); + + return tangent; + + }; + + LineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + LineCurve.prototype.toJSON = function () { + + const data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + LineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function LineCurve3( v1 = new Vector3(), v2 = new Vector3() ) { + + Curve.call( this ); + + this.type = 'LineCurve3'; + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve3.prototype = Object.create( Curve.prototype ); + LineCurve3.prototype.constructor = LineCurve3; + + LineCurve3.prototype.isLineCurve3 = true; + + LineCurve3.prototype.getPoint = function ( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve3.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + }; + + LineCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + LineCurve3.prototype.toJSON = function () { + + const data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + LineCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function QuadraticBezierCurve( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + + QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true; + + QuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + return point; + + }; + + QuadraticBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + QuadraticBezierCurve.prototype.toJSON = function () { + + const data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + QuadraticBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function QuadraticBezierCurve3( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve3'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve3.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3; + + QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true; + + QuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + return point; + + }; + + QuadraticBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + QuadraticBezierCurve3.prototype.toJSON = function () { + + const data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + QuadraticBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function SplineCurve( points = [] ) { + + Curve.call( this ); + + this.type = 'SplineCurve'; + + this.points = points; + + } + + SplineCurve.prototype = Object.create( Curve.prototype ); + SplineCurve.prototype.constructor = SplineCurve; + + SplineCurve.prototype.isSplineCurve = true; + + SplineCurve.prototype.getPoint = function ( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const points = this.points; + const p = ( points.length - 1 ) * t; + + const intPoint = Math.floor( p ); + const weight = p - intPoint; + + const p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + const p1 = points[ intPoint ]; + const p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + const p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + point.set( + CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ), + CatmullRom( weight, p0.y, p1.y, p2.y, p3.y ) + ); + + return point; + + }; + + SplineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( let i = 0, l = source.points.length; i < l; i ++ ) { + + const point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + return this; + + }; + + SplineCurve.prototype.toJSON = function () { + + const data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( let i = 0, l = this.points.length; i < l; i ++ ) { + + const point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + return data; + + }; + + SplineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( let i = 0, l = json.points.length; i < l; i ++ ) { + + const point = json.points[ i ]; + this.points.push( new Vector2().fromArray( point ) ); + + } + + return this; + + }; + + var Curves = /*#__PURE__*/Object.freeze({ + __proto__: null, + ArcCurve: ArcCurve, + CatmullRomCurve3: CatmullRomCurve3, + CubicBezierCurve: CubicBezierCurve, + CubicBezierCurve3: CubicBezierCurve3, + EllipseCurve: EllipseCurve, + LineCurve: LineCurve, + LineCurve3: LineCurve3, + QuadraticBezierCurve: QuadraticBezierCurve, + QuadraticBezierCurve3: QuadraticBezierCurve3, + SplineCurve: SplineCurve + }); + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + + Curve.call( this ); + + this.type = 'CurvePath'; + + this.curves = []; + this.autoClose = false; // Automatically closes the path + + } + + CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + const startPoint = this.curves[ 0 ].getPoint( 0 ); + const endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + const d = t * this.getLength(); + const curveLengths = this.getCurveLengths(); + let i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + const diff = curveLengths[ i ] - d; + const curve = this.curves[ i ]; + + const segmentLength = curve.getLength(); + const u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + copy: function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.curves = []; + + for ( let i = 0, l = source.curves.length; i < l; i ++ ) { + + const curve = source.curves[ i ]; + + this.curves.push( curve.clone() ); + + } + + this.autoClose = source.autoClose; + + return this; + + }, + + toJSON: function () { + + const data = Curve.prototype.toJSON.call( this ); + + data.autoClose = this.autoClose; + data.curves = []; + + for ( let i = 0, l = this.curves.length; i < l; i ++ ) { + + const curve = this.curves[ i ]; + data.curves.push( curve.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.autoClose = json.autoClose; + this.curves = []; + + for ( let i = 0, l = json.curves.length; i < l; i ++ ) { + + const curve = json.curves[ i ]; + this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) ); + + } + + return this; + + } + + } ); + + function Path( points ) { + + CurvePath.call( this ); + + this.type = 'Path'; + + this.currentPoint = new Vector2(); + + if ( points ) { + + this.setFromPoints( points ); + + } + + } + + Path.prototype = Object.assign( Object.create( CurvePath.prototype ), { + + constructor: Path, + + setFromPoints: function ( points ) { + + this.moveTo( points[ 0 ].x, points[ 0 ].y ); + + for ( let i = 1, l = points.length; i < l; i ++ ) { + + this.lineTo( points[ i ].x, points[ i ].y ); + + } + + return this; + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + return this; + + }, + + lineTo: function ( x, y ) { + + const curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + return this; + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + const curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + return this; + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + const curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + return this; + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + const npts = [ this.currentPoint.clone() ].concat( pts ); + + const curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + return this; + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + return this; + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + return this; + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + return this; + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + const curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + const firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + const lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + return this; + + }, + + copy: function ( source ) { + + CurvePath.prototype.copy.call( this, source ); + + this.currentPoint.copy( source.currentPoint ); + + return this; + + }, + + toJSON: function () { + + const data = CurvePath.prototype.toJSON.call( this ); + + data.currentPoint = this.currentPoint.toArray(); + + return data; + + }, + + fromJSON: function ( json ) { + + CurvePath.prototype.fromJSON.call( this, json ); + + this.currentPoint.fromArray( json.currentPoint ); + + return this; + + } + + } ); + + function Shape( points ) { + + Path.call( this, points ); + + this.uuid = MathUtils.generateUUID(); + + this.type = 'Shape'; + + this.holes = []; + + } + + Shape.prototype = Object.assign( Object.create( Path.prototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + const holesPts = []; + + for ( let i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // get points of shape and holes (keypoints based on segments parameter) + + extractPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + copy: function ( source ) { + + Path.prototype.copy.call( this, source ); + + this.holes = []; + + for ( let i = 0, l = source.holes.length; i < l; i ++ ) { + + const hole = source.holes[ i ]; + + this.holes.push( hole.clone() ); + + } + + return this; + + }, + + toJSON: function () { + + const data = Path.prototype.toJSON.call( this ); + + data.uuid = this.uuid; + data.holes = []; + + for ( let i = 0, l = this.holes.length; i < l; i ++ ) { + + const hole = this.holes[ i ]; + data.holes.push( hole.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Path.prototype.fromJSON.call( this, json ); + + this.uuid = json.uuid; + this.holes = []; + + for ( let i = 0, l = json.holes.length; i < l; i ++ ) { + + const hole = json.holes[ i ]; + this.holes.push( new Path().fromJSON( hole ) ); + + } + + return this; + + } + + } ); + + function Light( color, intensity = 1 ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity; + + } + + Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + const data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + + } ); + + function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + + } ); + + function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.normalBias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.mapPass = null; + this.matrix = new Matrix4(); + + this.autoUpdate = true; + this.needsUpdate = false; + + this._frustum = new Frustum(); + this._frameExtents = new Vector2( 1, 1 ); + + this._viewportCount = 1; + + this._viewports = [ + + new Vector4( 0, 0, 1, 1 ) + + ]; + + } + + Object.assign( LightShadow.prototype, { + + _projScreenMatrix: new Matrix4(), + + _lightPositionWorld: new Vector3(), + + _lookTarget: new Vector3(), + + getViewportCount: function () { + + return this._viewportCount; + + }, + + getFrustum: function () { + + return this._frustum; + + }, + + updateMatrices: function ( light ) { + + const shadowCamera = this.camera, + shadowMatrix = this.matrix, + projScreenMatrix = this._projScreenMatrix, + lookTarget = this._lookTarget, + lightPositionWorld = this._lightPositionWorld; + + lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( lightPositionWorld ); + + lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( lookTarget ); + shadowCamera.updateMatrixWorld(); + + projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + this._frustum.setFromProjectionMatrix( projScreenMatrix ); + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + }, + + getViewport: function ( viewportIndex ) { + + return this._viewports[ viewportIndex ]; + + }, + + getFrameExtents: function () { + + return this._frameExtents; + + }, + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + const object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.normalBias !== 0 ) object.normalBias = this.normalBias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + + } ); + + function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + this.focus = 1; + + } + + SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + updateMatrices: function ( light ) { + + const camera = this.camera; + + const fov = MathUtils.RAD2DEG * 2 * light.angle * this.focus; + const aspect = this.mapSize.width / this.mapSize.height; + const far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + LightShadow.prototype.updateMatrices.call( this, light ); + + } + + } ); + + function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / Math.PI; + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + function PointLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + this._frameExtents = new Vector2( 4, 2 ); + + this._viewportCount = 6; + + this._viewports = [ + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + new Vector4( 2, 1, 1, 1 ), + // negative X + new Vector4( 0, 1, 1, 1 ), + // positive Z + new Vector4( 3, 1, 1, 1 ), + // negative Z + new Vector4( 1, 1, 1, 1 ), + // positive Y + new Vector4( 3, 0, 1, 1 ), + // negative Y + new Vector4( 1, 0, 1, 1 ) + ]; + + this._cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + this._cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + } + + PointLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: PointLightShadow, + + isPointLightShadow: true, + + updateMatrices: function ( light, viewportIndex = 0 ) { + + const camera = this.camera, + shadowMatrix = this.matrix, + lightPositionWorld = this._lightPositionWorld, + lookTarget = this._lookTarget, + projScreenMatrix = this._projScreenMatrix; + + lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + camera.position.copy( lightPositionWorld ); + + lookTarget.copy( camera.position ); + lookTarget.add( this._cubeDirections[ viewportIndex ] ); + camera.up.copy( this._cubeUps[ viewportIndex ] ); + camera.lookAt( lookTarget ); + camera.updateMatrixWorld(); + + shadowMatrix.makeTranslation( - lightPositionWorld.x, - lightPositionWorld.y, - lightPositionWorld.z ); + + projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + this._frustum.setFromProjectionMatrix( projScreenMatrix ); + + } + + } ); + + function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / ( 4 * Math.PI ); + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new PointLightShadow(); + + } + + PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + function OrthographicCamera( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = near; + this.far = far; + + this.updateProjectionMatrix(); + + } + + OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + const dx = ( this.right - this.left ) / ( 2 * this.zoom ); + const dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + const cx = ( this.right + this.left ) / 2; + const cy = ( this.top + this.bottom ) / 2; + + let left = cx - dx; + let right = cx + dx; + let top = cy + dy; + let bottom = cy - dy; + + if ( this.view !== null && this.view.enabled ) { + + const scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom; + const scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom; + + left += scaleW * this.view.offsetX; + right = left + scaleW * this.view.width; + top -= scaleH * this.view.offsetY; + bottom = top - scaleH * this.view.height; + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + this.projectionMatrixInverse.copy( this.projectionMatrix ).invert(); + + }, + + toJSON: function ( meta ) { + + const data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + + } ); + + function DirectionalLightShadow() { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + + DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow, + + isDirectionalLightShadow: true, + + updateMatrices: function ( light ) { + + LightShadow.prototype.updateMatrices.call( this, light ); + + } + + } ); + + function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + } + + AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true + + } ); + + function RectAreaLight( color, intensity, width, height ) { + + Light.call( this, color, intensity ); + + this.type = 'RectAreaLight'; + + this.width = ( width !== undefined ) ? width : 10; + this.height = ( height !== undefined ) ? height : 10; + + } + + RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.width = source.width; + this.height = source.height; + + return this; + + }, + + toJSON: function ( meta ) { + + const data = Light.prototype.toJSON.call( this, meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + + } ); + + /** + * Primary reference: + * https://graphics.stanford.edu/papers/envmap/envmap.pdf + * + * Secondary reference: + * https://www.ppsloan.org/publications/StupidSH36.pdf + */ + + // 3-band SH defined by 9 coefficients + + class SphericalHarmonics3 { + + constructor() { + + Object.defineProperty( this, 'isSphericalHarmonics3', { value: true } ); + + this.coefficients = []; + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients.push( new Vector3() ); + + } + + } + + set( coefficients ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].copy( coefficients[ i ] ); + + } + + return this; + + } + + zero() { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].set( 0, 0, 0 ); + + } + + return this; + + } + + // get the radiance in the direction of the normal + // target is a Vector3 + getAt( normal, target ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + const coeff = this.coefficients; + + // band 0 + target.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 ); + + // band 1 + target.addScaledVector( coeff[ 1 ], 0.488603 * y ); + target.addScaledVector( coeff[ 2 ], 0.488603 * z ); + target.addScaledVector( coeff[ 3 ], 0.488603 * x ); + + // band 2 + target.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) ); + target.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) ); + target.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) ); + target.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) ); + target.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) ); + + return target; + + } + + // get the irradiance (radiance convolved with cosine lobe) in the direction of the normal + // target is a Vector3 + // https://graphics.stanford.edu/papers/envmap/envmap.pdf + getIrradianceAt( normal, target ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + const coeff = this.coefficients; + + // band 0 + target.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095 + + // band 1 + target.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603 + target.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z ); + target.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x ); + + // band 2 + target.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548 + target.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z ); + target.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3 + target.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z ); + target.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274 + + return target; + + } + + add( sh ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].add( sh.coefficients[ i ] ); + + } + + return this; + + } + + addScaledSH( sh, s ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s ); + + } + + return this; + + } + + scale( s ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].multiplyScalar( s ); + + } + + return this; + + } + + lerp( sh, alpha ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].lerp( sh.coefficients[ i ], alpha ); + + } + + return this; + + } + + equals( sh ) { + + for ( let i = 0; i < 9; i ++ ) { + + if ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) { + + return false; + + } + + } + + return true; + + } + + copy( sh ) { + + return this.set( sh.coefficients ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + fromArray( array, offset = 0 ) { + + const coefficients = this.coefficients; + + for ( let i = 0; i < 9; i ++ ) { + + coefficients[ i ].fromArray( array, offset + ( i * 3 ) ); + + } + + return this; + + } + + toArray( array = [], offset = 0 ) { + + const coefficients = this.coefficients; + + for ( let i = 0; i < 9; i ++ ) { + + coefficients[ i ].toArray( array, offset + ( i * 3 ) ); + + } + + return array; + + } + + // evaluate the basis functions + // shBasis is an Array[ 9 ] + static getBasisAt( normal, shBasis ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + // band 0 + shBasis[ 0 ] = 0.282095; + + // band 1 + shBasis[ 1 ] = 0.488603 * y; + shBasis[ 2 ] = 0.488603 * z; + shBasis[ 3 ] = 0.488603 * x; + + // band 2 + shBasis[ 4 ] = 1.092548 * x * y; + shBasis[ 5 ] = 1.092548 * y * z; + shBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 ); + shBasis[ 7 ] = 1.092548 * x * z; + shBasis[ 8 ] = 0.546274 * ( x * x - y * y ); + + } + + } + + function LightProbe( sh, intensity ) { + + Light.call( this, undefined, intensity ); + + this.type = 'LightProbe'; + + this.sh = ( sh !== undefined ) ? sh : new SphericalHarmonics3(); + + } + + LightProbe.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: LightProbe, + + isLightProbe: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.sh.copy( source.sh ); + + return this; + + }, + + fromJSON: function ( json ) { + + this.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON(); + this.sh.fromArray( json.sh ); + + return this; + + }, + + toJSON: function ( meta ) { + + const data = Light.prototype.toJSON.call( this, meta ); + + data.object.sh = this.sh.toArray(); + + return data; + + } + + } ); + + function MaterialLoader( manager ) { + + Loader.call( this, manager ); + + this.textures = {}; + + } + + MaterialLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: MaterialLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.setRequestHeader( scope.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + const textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + const material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.sheen !== undefined ) material.sheen = new Color().setHex( json.sheen ); + if ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat; + if ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.flatShading !== undefined ) material.flatShading = json.flatShading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.combine !== undefined ) material.combine = json.combine; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + + if ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite; + if ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask; + if ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc; + if ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef; + if ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask; + if ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail; + if ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail; + if ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass; + + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + + if ( json.rotation !== undefined ) material.rotation = json.rotation; + + if ( json.linewidth !== 1 ) material.linewidth = json.linewidth; + if ( json.dashSize !== undefined ) material.dashSize = json.dashSize; + if ( json.gapSize !== undefined ) material.gapSize = json.gapSize; + if ( json.scale !== undefined ) material.scale = json.scale; + + if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset; + if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor; + if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits; + + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + if ( json.morphNormals !== undefined ) material.morphNormals = json.morphNormals; + if ( json.dithering !== undefined ) material.dithering = json.dithering; + + if ( json.vertexTangents !== undefined ) material.vertexTangents = json.vertexTangents; + + if ( json.visible !== undefined ) material.visible = json.visible; + + if ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped; + + if ( json.userData !== undefined ) material.userData = json.userData; + + if ( json.vertexColors !== undefined ) { + + if ( typeof json.vertexColors === 'number' ) { + + material.vertexColors = ( json.vertexColors > 0 ) ? true : false; + + } else { + + material.vertexColors = json.vertexColors; + + } + + } + + // Shader Material + + if ( json.uniforms !== undefined ) { + + for ( const name in json.uniforms ) { + + const uniform = json.uniforms[ name ]; + + material.uniforms[ name ] = {}; + + switch ( uniform.type ) { + + case 't': + material.uniforms[ name ].value = getTexture( uniform.value ); + break; + + case 'c': + material.uniforms[ name ].value = new Color().setHex( uniform.value ); + break; + + case 'v2': + material.uniforms[ name ].value = new Vector2().fromArray( uniform.value ); + break; + + case 'v3': + material.uniforms[ name ].value = new Vector3().fromArray( uniform.value ); + break; + + case 'v4': + material.uniforms[ name ].value = new Vector4().fromArray( uniform.value ); + break; + + case 'm3': + material.uniforms[ name ].value = new Matrix3().fromArray( uniform.value ); + break; + + case 'm4': + material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value ); + break; + + default: + material.uniforms[ name ].value = uniform.value; + + } + + } + + } + + if ( json.defines !== undefined ) material.defines = json.defines; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + + if ( json.extensions !== undefined ) { + + for ( const key in json.extensions ) { + + material.extensions[ key ] = json.extensions[ key ]; + + } + + } + + // Deprecated + + if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + if ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap ); + + if ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap ); + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType; + if ( json.normalScale !== undefined ) { + + let normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + if ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity; + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + if ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + if ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap ); + if ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap ); + if ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap ); + if ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale ); + + if ( json.transmission !== undefined ) material.transmission = json.transmission; + if ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap ); + + return material; + + }, + + setTextures: function ( value ) { + + this.textures = value; + return this; + + } + + } ); + + const LoaderUtils = { + + decodeText: function ( array ) { + + if ( typeof TextDecoder !== 'undefined' ) { + + return new TextDecoder().decode( array ); + + } + + // Avoid the String.fromCharCode.apply(null, array) shortcut, which + // throws a "maximum call stack size exceeded" error for large arrays. + + let s = ''; + + for ( let i = 0, il = array.length; i < il; i ++ ) { + + // Implicitly assumes little-endian. + s += String.fromCharCode( array[ i ] ); + + } + + try { + + // merges multi-byte utf-8 characters. + + return decodeURIComponent( escape( s ) ); + + } catch ( e ) { // see #16358 + + return s; + + } + + }, + + extractUrlBase: function ( url ) { + + const index = url.lastIndexOf( '/' ); + + if ( index === - 1 ) return './'; + + return url.substr( 0, index + 1 ); + + } + + }; + + function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.instanceCount = Infinity; + + } + + InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), { + + constructor: InstancedBufferGeometry, + + isInstancedBufferGeometry: true, + + copy: function ( source ) { + + BufferGeometry.prototype.copy.call( this, source ); + + this.instanceCount = source.instanceCount; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + const data = BufferGeometry.prototype.toJSON.call( this ); + + data.instanceCount = this.instanceCount; + + data.isInstancedBufferGeometry = true; + + return data; + + } + + } ); + + function InstancedBufferAttribute( array, itemSize, normalized, meshPerAttribute ) { + + if ( typeof ( normalized ) === 'number' ) { + + meshPerAttribute = normalized; + + normalized = false; + + console.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' ); + + } + + BufferAttribute.call( this, array, itemSize, normalized ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), { + + constructor: InstancedBufferAttribute, + + isInstancedBufferAttribute: true, + + copy: function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + }, + + toJSON: function () { + + const data = BufferAttribute.prototype.toJSON.call( this ); + + data.meshPerAttribute = this.meshPerAttribute; + + data.isInstancedBufferAttribute = true; + + return data; + + } + + } ); + + function BufferGeometryLoader( manager ) { + + Loader.call( this, manager ); + + } + + BufferGeometryLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: BufferGeometryLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.setRequestHeader( scope.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + const interleavedBufferMap = {}; + const arrayBufferMap = {}; + + function getInterleavedBuffer( json, uuid ) { + + if ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ]; + + const interleavedBuffers = json.interleavedBuffers; + const interleavedBuffer = interleavedBuffers[ uuid ]; + + const buffer = getArrayBuffer( json, interleavedBuffer.buffer ); + + const array = getTypedArray( interleavedBuffer.type, buffer ); + const ib = new InterleavedBuffer( array, interleavedBuffer.stride ); + ib.uuid = interleavedBuffer.uuid; + + interleavedBufferMap[ uuid ] = ib; + + return ib; + + } + + function getArrayBuffer( json, uuid ) { + + if ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ]; + + const arrayBuffers = json.arrayBuffers; + const arrayBuffer = arrayBuffers[ uuid ]; + + const ab = new Uint32Array( arrayBuffer ).buffer; + + arrayBufferMap[ uuid ] = ab; + + return ab; + + } + + const geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry(); + + const index = json.data.index; + + if ( index !== undefined ) { + + const typedArray = getTypedArray( index.type, index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + const attributes = json.data.attributes; + + for ( const key in attributes ) { + + const attribute = attributes[ key ]; + let bufferAttribute; + + if ( attribute.isInterleavedBufferAttribute ) { + + const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data ); + bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized ); + + } else { + + const typedArray = getTypedArray( attribute.type, attribute.array ); + const bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute; + bufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized ); + + } + + if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name; + geometry.setAttribute( key, bufferAttribute ); + + } + + const morphAttributes = json.data.morphAttributes; + + if ( morphAttributes ) { + + for ( const key in morphAttributes ) { + + const attributeArray = morphAttributes[ key ]; + + const array = []; + + for ( let i = 0, il = attributeArray.length; i < il; i ++ ) { + + const attribute = attributeArray[ i ]; + let bufferAttribute; + + if ( attribute.isInterleavedBufferAttribute ) { + + const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data ); + bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized ); + + } else { + + const typedArray = getTypedArray( attribute.type, attribute.array ); + bufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ); + + } + + if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name; + array.push( bufferAttribute ); + + } + + geometry.morphAttributes[ key ] = array; + + } + + } + + const morphTargetsRelative = json.data.morphTargetsRelative; + + if ( morphTargetsRelative ) { + + geometry.morphTargetsRelative = true; + + } + + const groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( let i = 0, n = groups.length; i !== n; ++ i ) { + + const group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + const boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + const center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + if ( json.name ) geometry.name = json.name; + if ( json.userData ) geometry.userData = json.userData; + + return geometry; + + } + + } ); + + class ObjectLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path; + this.resourcePath = this.resourcePath || path; + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + let json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + const metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + } + + parse( json, onLoad ) { + + const animations = this.parseAnimations( json.animations ); + const shapes = this.parseShapes( json.shapes ); + const geometries = this.parseGeometries( json.geometries, shapes ); + + const images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + const textures = this.parseTextures( json.textures, images ); + const materials = this.parseMaterials( json.materials, textures ); + + const object = this.parseObject( json.object, geometries, materials, animations ); + const skeletons = this.parseSkeletons( json.skeletons, object ); + + this.bindSkeletons( object, skeletons ); + + // + + if ( onLoad !== undefined ) { + + let hasImages = false; + + for ( const uuid in images ) { + + if ( images[ uuid ] instanceof HTMLImageElement ) { + + hasImages = true; + break; + + } + + } + + if ( hasImages === false ) onLoad( object ); + + } + + return object; + + } + + parseShapes( json ) { + + const shapes = {}; + + if ( json !== undefined ) { + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const shape = new Shape().fromJSON( json[ i ] ); + + shapes[ shape.uuid ] = shape; + + } + + } + + return shapes; + + } + + parseSkeletons( json, object ) { + + const skeletons = {}; + const bones = {}; + + // generate bone lookup table + + object.traverse( function ( child ) { + + if ( child.isBone ) bones[ child.uuid ] = child; + + } ); + + // create skeletons + + if ( json !== undefined ) { + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const skeleton = new Skeleton().fromJSON( json[ i ], bones ); + + skeletons[ skeleton.uuid ] = skeleton; + + } + + } + + return skeletons; + + } + + parseGeometries( json, shapes ) { + + const geometries = {}; + let geometryShapes; + + if ( json !== undefined ) { + + const bufferGeometryLoader = new BufferGeometryLoader(); + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + let geometry; + const data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'DodecahedronBufferGeometry': + case 'IcosahedronGeometry': + case 'IcosahedronBufferGeometry': + case 'OctahedronGeometry': + case 'OctahedronBufferGeometry': + case 'TetrahedronGeometry': + case 'TetrahedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'TubeGeometry': + case 'TubeBufferGeometry': + + // This only works for built-in curves (e.g. CatmullRomCurve3). + // User defined curves or instances of CurvePath will not be deserialized. + geometry = new Geometries[ data.type ]( + new Curves[ data.path.type ]().fromJSON( data.path ), + data.tubularSegments, + data.radius, + data.radialSegments, + data.closed + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'PolyhedronGeometry': + case 'PolyhedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.vertices, + data.indices, + data.radius, + data.details + ); + + break; + + case 'ShapeGeometry': + case 'ShapeBufferGeometry': + + geometryShapes = []; + + for ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + const shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.curveSegments + ); + + break; + + + case 'ExtrudeGeometry': + case 'ExtrudeBufferGeometry': + + geometryShapes = []; + + for ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + const shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + const extrudePath = data.options.extrudePath; + + if ( extrudePath !== undefined ) { + + data.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.options + ); + + break; + + case 'BufferGeometry': + case 'InstancedBufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + console.error( 'THREE.ObjectLoader: Loading "Geometry" is not supported anymore.' ); + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + if ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + } + + parseMaterials( json, textures ) { + + const cache = {}; // MultiMaterial + const materials = {}; + + if ( json !== undefined ) { + + const loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + const array = []; + + for ( let j = 0; j < data.materials.length; j ++ ) { + + const material = data.materials[ j ]; + + if ( cache[ material.uuid ] === undefined ) { + + cache[ material.uuid ] = loader.parse( material ); + + } + + array.push( cache[ material.uuid ] ); + + } + + materials[ data.uuid ] = array; + + } else { + + if ( cache[ data.uuid ] === undefined ) { + + cache[ data.uuid ] = loader.parse( data ); + + } + + materials[ data.uuid ] = cache[ data.uuid ]; + + } + + } + + } + + return materials; + + } + + parseAnimations( json ) { + + const animations = {}; + + if ( json !== undefined ) { + + for ( let i = 0; i < json.length; i ++ ) { + + const data = json[ i ]; + + const clip = AnimationClip.parse( data ); + + animations[ clip.uuid ] = clip; + + } + + } + + return animations; + + } + + parseImages( json, onLoad ) { + + const scope = this; + const images = {}; + + let loader; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } ); + + } + + function deserializeImage( image ) { + + if ( typeof image === 'string' ) { + + const url = image; + + const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url; + + return loadImage( path ); + + } else { + + if ( image.data ) { + + return { + data: getTypedArray( image.type, image.data ), + width: image.width, + height: image.height + }; + + } else { + + return null; + + } + + } + + } + + if ( json !== undefined && json.length > 0 ) { + + const manager = new LoadingManager( onLoad ); + + loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( let i = 0, il = json.length; i < il; i ++ ) { + + const image = json[ i ]; + const url = image.url; + + if ( Array.isArray( url ) ) { + + // load array of images e.g CubeTexture + + images[ image.uuid ] = []; + + for ( let j = 0, jl = url.length; j < jl; j ++ ) { + + const currentUrl = url[ j ]; + + const deserializedImage = deserializeImage( currentUrl ); + + if ( deserializedImage !== null ) { + + if ( deserializedImage instanceof HTMLImageElement ) { + + images[ image.uuid ].push( deserializedImage ); + + } else { + + // special case: handle array of data textures for cube textures + + images[ image.uuid ].push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) ); + + } + + } + + } + + } else { + + // load single image + + const deserializedImage = deserializeImage( image.url ); + + if ( deserializedImage !== null ) { + + images[ image.uuid ] = deserializedImage; + + } + + } + + } + + } + + return images; + + } + + parseTextures( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof value === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + const textures = {}; + + if ( json !== undefined ) { + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + let texture; + const image = images[ data.image ]; + + if ( Array.isArray( image ) ) { + + texture = new CubeTexture( image ); + + if ( image.length === 6 ) texture.needsUpdate = true; + + } else { + + if ( image && image.data ) { + + texture = new DataTexture( image.data, image.width, image.height ); + + } else { + + texture = new Texture( image ); + + } + + if ( image ) texture.needsUpdate = true; // textures can have undefined image data + + } + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.center !== undefined ) texture.center.fromArray( data.center ); + if ( data.rotation !== undefined ) texture.rotation = data.rotation; + + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.format !== undefined ) texture.format = data.format; + if ( data.type !== undefined ) texture.type = data.type; + if ( data.encoding !== undefined ) texture.encoding = data.encoding; + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + if ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha; + if ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + } + + parseObject( data, geometries, materials, animations ) { + + let object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + const array = []; + + for ( let i = 0, l = name.length; i < l; i ++ ) { + + const uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + let geometry, material; + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'LightProbe': + + object = new LightProbe().fromJSON( data ); + + break; + + case 'SkinnedMesh': + + geometry = getGeometry( data.geometry ); + material = getMaterial( data.material ); + + object = new SkinnedMesh( geometry, material ); + + if ( data.bindMode !== undefined ) object.bindMode = data.bindMode; + if ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix ); + if ( data.skeleton !== undefined ) object.skeleton = data.skeleton; + + break; + + case 'Mesh': + + geometry = getGeometry( data.geometry ); + material = getMaterial( data.material ); + + object = new Mesh( geometry, material ); + + break; + + case 'InstancedMesh': + + geometry = getGeometry( data.geometry ); + material = getMaterial( data.material ); + const count = data.count; + const instanceMatrix = data.instanceMatrix; + + object = new InstancedMesh( geometry, material, count ); + object.instanceMatrix = new BufferAttribute( new Float32Array( instanceMatrix.array ), 16 ); + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + case 'Bone': + + object = new Bone(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + + if ( data.matrix !== undefined ) { + + object.matrix.fromArray( data.matrix ); + + if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate; + if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled; + if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder; + if ( data.userData !== undefined ) object.userData = data.userData; + if ( data.layers !== undefined ) object.layers.mask = data.layers; + + if ( data.children !== undefined ) { + + const children = data.children; + + for ( let i = 0; i < children.length; i ++ ) { + + object.add( this.parseObject( children[ i ], geometries, materials, animations ) ); + + } + + } + + if ( data.animations !== undefined ) { + + const objectAnimations = data.animations; + + for ( let i = 0; i < objectAnimations.length; i ++ ) { + + const uuid = objectAnimations[ i ]; + + object.animations.push( animations[ uuid ] ); + + } + + } + + if ( data.type === 'LOD' ) { + + if ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate; + + const levels = data.levels; + + for ( let l = 0; l < levels.length; l ++ ) { + + const level = levels[ l ]; + const child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + } + + bindSkeletons( object, skeletons ) { + + if ( Object.keys( skeletons ).length === 0 ) return; + + object.traverse( function ( child ) { + + if ( child.isSkinnedMesh === true && child.skeleton !== undefined ) { + + const skeleton = skeletons[ child.skeleton ]; + + if ( skeleton === undefined ) { + + console.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton ); + + } else { + + child.bind( skeleton, child.bindMatrix ); + + } + + } + + } ); + + } + + /* DEPRECATED */ + + setTexturePath( value ) { + + console.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' ); + return this.setResourcePath( value ); + + } + + } + + const TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + }; + + const TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + }; + + const TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipmapNearestFilter: NearestMipmapNearestFilter, + NearestMipmapLinearFilter: NearestMipmapLinearFilter, + LinearFilter: LinearFilter, + LinearMipmapNearestFilter: LinearMipmapNearestFilter, + LinearMipmapLinearFilter: LinearMipmapLinearFilter + }; + + function ImageBitmapLoader( manager ) { + + if ( typeof createImageBitmap === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' ); + + } + + if ( typeof fetch === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' ); + + } + + Loader.call( this, manager ); + + this.options = { premultiplyAlpha: 'none' }; + + } + + ImageBitmapLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: ImageBitmapLoader, + + isImageBitmapLoader: true, + + setOptions: function setOptions( options ) { + + this.options = options; + + return this; + + }, + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const scope = this; + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + const fetchOptions = {}; + fetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include'; + + fetch( url, fetchOptions ).then( function ( res ) { + + return res.blob(); + + } ).then( function ( blob ) { + + return createImageBitmap( blob, scope.options ); + + } ).then( function ( imageBitmap ) { + + Cache.add( url, imageBitmap ); + + if ( onLoad ) onLoad( imageBitmap ); + + scope.manager.itemEnd( url ); + + } ).catch( function ( e ) { + + if ( onError ) onError( e ); + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } ); + + scope.manager.itemStart( url ); + + } + + } ); + + function ShapePath() { + + this.type = 'ShapePath'; + + this.color = new Color(); + + this.subPaths = []; + this.currentPath = null; + + } + + Object.assign( ShapePath.prototype, { + + moveTo: function ( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + return this; + + }, + + lineTo: function ( x, y ) { + + this.currentPath.lineTo( x, y ); + + return this; + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + return this; + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + return this; + + }, + + splineThru: function ( pts ) { + + this.currentPath.splineThru( pts ); + + return this; + + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + const shapes = []; + + for ( let i = 0, l = inSubpaths.length; i < l; i ++ ) { + + const tmpPath = inSubpaths[ i ]; + + const tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + const polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + let inside = false; + for ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + let edgeLowPt = inPolygon[ p ]; + let edgeHighPt = inPolygon[ q ]; + + let edgeDx = edgeHighPt.x - edgeLowPt.x; + let edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + const perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + const isClockWise = ShapeUtils.isClockWise; + + const subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + let solid, tmpPath, tmpShape; + const shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + let holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + const betterShapeHoles = []; + const newShapes = []; + let newShapeHoles = []; + let mainIdx = 0; + let tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( let i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + let ambiguous = false; + const toChange = []; + + for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + const sho = newShapeHoles[ sIdx ]; + + for ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + const ho = sho[ hIdx ]; + let hole_unassigned = true; + + for ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + let tmpHoles; + + for ( let i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + + } ); + + function Font( data ) { + + this.type = 'Font'; + + this.data = data; + + } + + Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size = 100 ) { + + const shapes = []; + const paths = createPaths( text, size, this.data ); + + for ( let p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + + } ); + + function createPaths( text, size, data ) { + + const chars = Array.from ? Array.from( text ) : String( text ).split( '' ); // workaround for IE11, see #13988 + const scale = size / data.resolution; + const line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; + + const paths = []; + + let offsetX = 0, offsetY = 0; + + for ( let i = 0; i < chars.length; i ++ ) { + + const char = chars[ i ]; + + if ( char === '\n' ) { + + offsetX = 0; + offsetY -= line_height; + + } else { + + const ret = createPath( char, scale, offsetX, offsetY, data ); + offsetX += ret.offsetX; + paths.push( ret.path ); + + } + + } + + return paths; + + } + + function createPath( char, scale, offsetX, offsetY, data ) { + + const glyph = data.glyphs[ char ] || data.glyphs[ '?' ]; + + if ( ! glyph ) { + + console.error( 'THREE.Font: character "' + char + '" does not exists in font family ' + data.familyName + '.' ); + + return; + + } + + const path = new ShapePath(); + + let x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2; + + if ( glyph.o ) { + + const outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( let i = 0, l = outline.length; i < l; ) { + + const action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + break; + + case 'b': // bezierCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + cpx2 = outline[ i ++ ] * scale + offsetX; + cpy2 = outline[ i ++ ] * scale + offsetY; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + break; + + } + + } + + } + + return { offsetX: glyph.ha * scale, path: path }; + + } + + function FontLoader( manager ) { + + Loader.call( this, manager ); + + } + + FontLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: FontLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( text ) { + + let json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + const font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + } + + } ); + + let _context; + + const AudioContext = { + + getContext: function () { + + if ( _context === undefined ) { + + _context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return _context; + + }, + + setContext: function ( value ) { + + _context = value; + + } + + }; + + function AudioLoader( manager ) { + + Loader.call( this, manager ); + + } + + AudioLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: AudioLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( scope.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setPath( scope.path ); + loader.setRequestHeader( scope.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( buffer ) { + + try { + + // Create a copy of the buffer. The `decodeAudioData` method + // detaches the buffer when complete, preventing reuse. + const bufferCopy = buffer.slice( 0 ); + + const context = AudioContext.getContext(); + context.decodeAudioData( bufferCopy, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + } + + } ); + + function HemisphereLightProbe( skyColor, groundColor, intensity ) { + + LightProbe.call( this, undefined, intensity ); + + const color1 = new Color().set( skyColor ); + const color2 = new Color().set( groundColor ); + + const sky = new Vector3( color1.r, color1.g, color1.b ); + const ground = new Vector3( color2.r, color2.g, color2.b ); + + // without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI ); + const c0 = Math.sqrt( Math.PI ); + const c1 = c0 * Math.sqrt( 0.75 ); + + this.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 ); + this.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 ); + + } + + HemisphereLightProbe.prototype = Object.assign( Object.create( LightProbe.prototype ), { + + constructor: HemisphereLightProbe, + + isHemisphereLightProbe: true, + + copy: function ( source ) { // modifying colors not currently supported + + LightProbe.prototype.copy.call( this, source ); + + return this; + + }, + + toJSON: function ( meta ) { + + const data = LightProbe.prototype.toJSON.call( this, meta ); + + // data.sh = this.sh.toArray(); // todo + + return data; + + } + + } ); + + function AmbientLightProbe( color, intensity ) { + + LightProbe.call( this, undefined, intensity ); + + const color1 = new Color().set( color ); + + // without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI ); + this.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) ); + + } + + AmbientLightProbe.prototype = Object.assign( Object.create( LightProbe.prototype ), { + + constructor: AmbientLightProbe, + + isAmbientLightProbe: true, + + copy: function ( source ) { // modifying color not currently supported + + LightProbe.prototype.copy.call( this, source ); + + return this; + + }, + + toJSON: function ( meta ) { + + const data = LightProbe.prototype.toJSON.call( this, meta ); + + // data.sh = this.sh.toArray(); // todo + + return data; + + } + + } ); + + const _eyeRight = new Matrix4(); + const _eyeLeft = new Matrix4(); + + function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + this._cache = { + focus: null, + fov: null, + aspect: null, + near: null, + far: null, + zoom: null, + eyeSep: null + }; + + } + + Object.assign( StereoCamera.prototype, { + + update: function ( camera ) { + + const cache = this._cache; + + const needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov || + cache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near || + cache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + cache.focus = camera.focus; + cache.fov = camera.fov; + cache.aspect = camera.aspect * this.aspect; + cache.near = camera.near; + cache.far = camera.far; + cache.zoom = camera.zoom; + cache.eyeSep = this.eyeSep; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + const projectionMatrix = camera.projectionMatrix.clone(); + const eyeSepHalf = cache.eyeSep / 2; + const eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus; + const ymax = ( cache.near * Math.tan( MathUtils.DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom; + let xmin, xmax; + + // translate xOffset + + _eyeLeft.elements[ 12 ] = - eyeSepHalf; + _eyeRight.elements[ 12 ] = eyeSepHalf; + + // for left eye + + xmin = - ymax * cache.aspect + eyeSepOnProjection; + xmax = ymax * cache.aspect + eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( projectionMatrix ); + + // for right eye + + xmin = - ymax * cache.aspect - eyeSepOnProjection; + xmax = ymax * cache.aspect - eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight ); + + } + + } ); + + class Clock { + + constructor( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + start() { + + this.startTime = now(); + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + } + + stop() { + + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + + } + + getElapsedTime() { + + this.getDelta(); + return this.elapsedTime; + + } + + getDelta() { + + let diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + const newTime = now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + + } + + function now() { + + return ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + + } + + const _position$2 = /*@__PURE__*/ new Vector3(); + const _quaternion$3 = /*@__PURE__*/ new Quaternion(); + const _scale$1 = /*@__PURE__*/ new Vector3(); + const _orientation = /*@__PURE__*/ new Vector3(); + + class AudioListener extends Object3D { + + constructor() { + + super(); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + this.timeDelta = 0; + + // private + + this._clock = new Clock(); + + } + + getInput() { + + return this.gain; + + } + + removeFilter() { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + return this; + + } + + getFilter() { + + return this.filter; + + } + + setFilter( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + return this; + + } + + getMasterVolume() { + + return this.gain.gain.value; + + } + + setMasterVolume( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + const listener = this.context.listener; + const up = this.up; + + this.timeDelta = this._clock.getDelta(); + + this.matrixWorld.decompose( _position$2, _quaternion$3, _scale$1 ); + + _orientation.set( 0, 0, - 1 ).applyQuaternion( _quaternion$3 ); + + if ( listener.positionX ) { + + // code path for Chrome (see #14393) + + const endTime = this.context.currentTime + this.timeDelta; + + listener.positionX.linearRampToValueAtTime( _position$2.x, endTime ); + listener.positionY.linearRampToValueAtTime( _position$2.y, endTime ); + listener.positionZ.linearRampToValueAtTime( _position$2.z, endTime ); + listener.forwardX.linearRampToValueAtTime( _orientation.x, endTime ); + listener.forwardY.linearRampToValueAtTime( _orientation.y, endTime ); + listener.forwardZ.linearRampToValueAtTime( _orientation.z, endTime ); + listener.upX.linearRampToValueAtTime( up.x, endTime ); + listener.upY.linearRampToValueAtTime( up.y, endTime ); + listener.upZ.linearRampToValueAtTime( up.z, endTime ); + + } else { + + listener.setPosition( _position$2.x, _position$2.y, _position$2.z ); + listener.setOrientation( _orientation.x, _orientation.y, _orientation.z, up.x, up.y, up.z ); + + } + + } + + } + + class Audio extends Object3D { + + constructor( listener ) { + + super(); + + this.type = 'Audio'; + + this.listener = listener; + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.detune = 0; + this.loop = false; + this.loopStart = 0; + this.loopEnd = 0; + this.offset = 0; + this.duration = undefined; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.source = null; + this.sourceType = 'empty'; + + this._startedAt = 0; + this._progress = 0; + this._connected = false; + + this.filters = []; + + } + + getOutput() { + + return this.gain; + + } + + setNodeSource( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + } + + setMediaElementSource( mediaElement ) { + + this.hasPlaybackControl = false; + this.sourceType = 'mediaNode'; + this.source = this.context.createMediaElementSource( mediaElement ); + this.connect(); + + return this; + + } + + setMediaStreamSource( mediaStream ) { + + this.hasPlaybackControl = false; + this.sourceType = 'mediaStreamNode'; + this.source = this.context.createMediaStreamSource( mediaStream ); + this.connect(); + + return this; + + } + + setBuffer( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + } + + play( delay = 0 ) { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this._startedAt = this.context.currentTime + delay; + + const source = this.context.createBufferSource(); + source.buffer = this.buffer; + source.loop = this.loop; + source.loopStart = this.loopStart; + source.loopEnd = this.loopEnd; + source.onended = this.onEnded.bind( this ); + source.start( this._startedAt, this._progress + this.offset, this.duration ); + + this.isPlaying = true; + + this.source = source; + + this.setDetune( this.detune ); + this.setPlaybackRate( this.playbackRate ); + + return this.connect(); + + } + + pause() { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + if ( this.isPlaying === true ) { + + // update current progress + + this._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate; + + if ( this.loop === true ) { + + // ensure _progress does not exceed duration with looped audios + + this._progress = this._progress % ( this.duration || this.buffer.duration ); + + } + + this.source.stop(); + this.source.onended = null; + + this.isPlaying = false; + + } + + return this; + + } + + stop() { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this._progress = 0; + + this.source.stop(); + this.source.onended = null; + this.isPlaying = false; + + return this; + + } + + connect() { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( let i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + this._connected = true; + + return this; + + } + + disconnect() { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( let i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + this._connected = false; + + return this; + + } + + getFilters() { + + return this.filters; + + } + + setFilters( value ) { + + if ( ! value ) value = []; + + if ( this._connected === true ) { + + this.disconnect(); + this.filters = value.slice(); + this.connect(); + + } else { + + this.filters = value.slice(); + + } + + return this; + + } + + setDetune( value ) { + + this.detune = value; + + if ( this.source.detune === undefined ) return; // only set detune when available + + if ( this.isPlaying === true ) { + + this.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 ); + + } + + return this; + + } + + getDetune() { + + return this.detune; + + } + + getFilter() { + + return this.getFilters()[ 0 ]; + + } + + setFilter( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + } + + setPlaybackRate( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 ); + + } + + return this; + + } + + getPlaybackRate() { + + return this.playbackRate; + + } + + onEnded() { + + this.isPlaying = false; + + } + + getLoop() { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + } + + setLoop( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + } + + setLoopStart( value ) { + + this.loopStart = value; + + return this; + + } + + setLoopEnd( value ) { + + this.loopEnd = value; + + return this; + + } + + getVolume() { + + return this.gain.gain.value; + + } + + setVolume( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + + } + + const _position$3 = /*@__PURE__*/ new Vector3(); + const _quaternion$4 = /*@__PURE__*/ new Quaternion(); + const _scale$2 = /*@__PURE__*/ new Vector3(); + const _orientation$1 = /*@__PURE__*/ new Vector3(); + + class PositionalAudio extends Audio { + + constructor( listener ) { + + super( listener ); + + this.panner = this.context.createPanner(); + this.panner.panningModel = 'HRTF'; + this.panner.connect( this.gain ); + + } + + getOutput() { + + return this.panner; + + } + + getRefDistance() { + + return this.panner.refDistance; + + } + + setRefDistance( value ) { + + this.panner.refDistance = value; + + return this; + + } + + getRolloffFactor() { + + return this.panner.rolloffFactor; + + } + + setRolloffFactor( value ) { + + this.panner.rolloffFactor = value; + + return this; + + } + + getDistanceModel() { + + return this.panner.distanceModel; + + } + + setDistanceModel( value ) { + + this.panner.distanceModel = value; + + return this; + + } + + getMaxDistance() { + + return this.panner.maxDistance; + + } + + setMaxDistance( value ) { + + this.panner.maxDistance = value; + + return this; + + } + + setDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) { + + this.panner.coneInnerAngle = coneInnerAngle; + this.panner.coneOuterAngle = coneOuterAngle; + this.panner.coneOuterGain = coneOuterGain; + + return this; + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + if ( this.hasPlaybackControl === true && this.isPlaying === false ) return; + + this.matrixWorld.decompose( _position$3, _quaternion$4, _scale$2 ); + + _orientation$1.set( 0, 0, 1 ).applyQuaternion( _quaternion$4 ); + + const panner = this.panner; + + if ( panner.positionX ) { + + // code path for Chrome and Firefox (see #14393) + + const endTime = this.context.currentTime + this.listener.timeDelta; + + panner.positionX.linearRampToValueAtTime( _position$3.x, endTime ); + panner.positionY.linearRampToValueAtTime( _position$3.y, endTime ); + panner.positionZ.linearRampToValueAtTime( _position$3.z, endTime ); + panner.orientationX.linearRampToValueAtTime( _orientation$1.x, endTime ); + panner.orientationY.linearRampToValueAtTime( _orientation$1.y, endTime ); + panner.orientationZ.linearRampToValueAtTime( _orientation$1.z, endTime ); + + } else { + + panner.setPosition( _position$3.x, _position$3.y, _position$3.z ); + panner.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z ); + + } + + } + + } + + class AudioAnalyser { + + constructor( audio, fftSize = 2048 ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + + getFrequencyData() { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + } + + getAverageFrequency() { + + let value = 0; + const data = this.getFrequencyData(); + + for ( let i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + + } + + function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + let mixFunction, + mixFunctionAdditive, + setIdentity; + + // buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + // + // 'add' is used for additive cumulative results + // + // 'work' is optional and is only present for quaternion types. It is used + // to store intermediate quaternion multiplication results + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + mixFunctionAdditive = this._slerpAdditive; + setIdentity = this._setAdditiveIdentityQuaternion; + + this.buffer = new Float64Array( valueSize * 6 ); + this._workIndex = 5; + break; + + case 'string': + case 'bool': + mixFunction = this._select; + + // Use the regular mix function and for additive on these types, + // additive is not relevant for non-numeric types + mixFunctionAdditive = this._select; + + setIdentity = this._setAdditiveIdentityOther; + + this.buffer = new Array( valueSize * 5 ); + break; + + default: + mixFunction = this._lerp; + mixFunctionAdditive = this._lerpAdditive; + setIdentity = this._setAdditiveIdentityNumeric; + + this.buffer = new Float64Array( valueSize * 5 ); + + } + + this._mixBufferRegion = mixFunction; + this._mixBufferRegionAdditive = mixFunctionAdditive; + this._setIdentity = setIdentity; + this._origIndex = 3; + this._addIndex = 4; + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + Object.assign( PropertyMixer.prototype, { + + // accumulate data in the 'incoming' region into 'accu' + accumulate: function ( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + const buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride; + + let currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( let i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + const mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // accumulate data in the 'incoming' region into 'add' + accumulateAdditive: function ( weight ) { + + const buffer = this.buffer, + stride = this.valueSize, + offset = stride * this._addIndex; + + if ( this.cumulativeWeightAdditive === 0 ) { + + // add = identity + + this._setIdentity(); + + } + + // add := add + incoming * weight + + this._mixBufferRegionAdditive( buffer, offset, 0, weight, stride ); + this.cumulativeWeightAdditive += weight; + + }, + + // apply the state of 'accu' to the binding when accus differ + apply: function ( accuIndex ) { + + const stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + weightAdditive = this.cumulativeWeightAdditive, + + binding = this.binding; + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + const originalValueOffset = stride * this._origIndex; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + if ( weightAdditive > 0 ) { + + // accuN := accuN + additive accuN + + this._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride ); + + } + + for ( let i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function () { + + const binding = this.binding; + + const buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * this._origIndex; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( let i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + // Add to identity for additive + this._setIdentity(); + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function () { + + const originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + _setAdditiveIdentityNumeric: function () { + + const startIndex = this._addIndex * this.valueSize; + const endIndex = startIndex + this.valueSize; + + for ( let i = startIndex; i < endIndex; i ++ ) { + + this.buffer[ i ] = 0; + + } + + }, + + _setAdditiveIdentityQuaternion: function () { + + this._setAdditiveIdentityNumeric(); + this.buffer[ this._addIndex * this.valueSize + 3 ] = 1; + + }, + + _setAdditiveIdentityOther: function () { + + const startIndex = this._origIndex * this.valueSize; + const targetIndex = this._addIndex * this.valueSize; + + for ( let i = 0; i < this.valueSize; i ++ ) { + + this.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ]; + + } + + }, + + + // mix functions + + _select: function ( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( let i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function ( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _slerpAdditive: function ( buffer, dstOffset, srcOffset, t, stride ) { + + const workOffset = this._workIndex * stride; + + // Store result in intermediate buffer offset + Quaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset ); + + // Slerp to the intermediate result + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t ); + + }, + + _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) { + + const s = 1 - t; + + for ( let i = 0; i !== stride; ++ i ) { + + const j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + }, + + _lerpAdditive: function ( buffer, dstOffset, srcOffset, t, stride ) { + + for ( let i = 0; i !== stride; ++ i ) { + + const j = dstOffset + i; + + buffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t; + + } + + } + + } ); + + // Characters [].:/ are reserved for track binding syntax. + const _RESERVED_CHARS_RE = '\\[\\]\\.:\\/'; + const _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' ); + + // Attempts to allow node names from any language. ES5's `\w` regexp matches + // only latin characters, and the unicode \p{L} is not yet supported. So + // instead, we exclude reserved characters and match everything else. + const _wordChar = '[^' + _RESERVED_CHARS_RE + ']'; + const _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\.', '' ) + ']'; + + // Parent directories, delimited by '/' or ':'. Currently unused, but must + // be matched to parse the rest of the track name. + const _directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', _wordChar ); + + // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. + const _nodeRe = /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot ); + + // Object on target node, and accessor. May not contain reserved + // characters. Accessor may contain any character except closing bracket. + const _objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', _wordChar ); + + // Property and accessor. May not contain reserved characters. Accessor may + // contain any non-bracket characters. + const _propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', _wordChar ); + + const _trackRe = new RegExp( '' + + '^' + + _directoryRe + + _nodeRe + + _objectRe + + _propertyRe + + '$' + ); + + const _supportedObjectNames = [ 'material', 'materials', 'bones' ]; + + function Composite( targetGroup, path, optionalParsedPath ) { + + const parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + } + + Object.assign( Composite.prototype, { + + getValue: function ( array, offset ) { + + this.bind(); // bind all binding + + const firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function ( array, offset ) { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function () { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function () { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + + } ); + + + function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + } + + Object.assign( PropertyBinding, { + + Composite: Composite, + + create: function ( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }, + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + sanitizeNodeName: function ( name ) { + + return name.replace( /\s/g, '_' ).replace( _reservedRe, '' ); + + }, + + parseTrackName: function ( trackName ) { + + const matches = _trackRe.exec( trackName ); + + if ( ! matches ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + const results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + const lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== - 1 ) { + + const objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against an allowlist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + }, + + findNode: function ( root, nodeName ) { + + if ( ! nodeName || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + const bone = root.skeleton.getBoneByName( nodeName ); + + if ( bone !== undefined ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + const searchNodeSubtree = function ( children ) { + + for ( let i = 0; i < children.length; i ++ ) { + + const childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + const result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + const subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + + } ); + + Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function () {}, + _setValue_unavailable: function () {}, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + const source = this.resolvedProperty; + + for ( let i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ], + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function () { + + let targetObject = this.node; + const parsedPath = this.parsedPath; + + const objectName = parsedPath.objectName; + const propertyName = parsedPath.propertyName; + let propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' ); + return; + + } + + if ( objectName ) { + + let objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( let i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + const nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + const nodeName = parsedPath.nodeName; + + console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + + '.' + propertyName + ' but it wasn\'t found.', targetObject ); + return; + + } + + // determine versioning scheme + let versioning = this.Versioning.None; + + this.targetObject = targetObject; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + + } + + // determine how the property gets bound + let bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === 'morphTargetInfluences' ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); + return; + + } + + if ( targetObject.geometry.isBufferGeometry ) { + + if ( ! targetObject.geometry.morphAttributes ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); + return; + + } + + if ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) { + + propertyIndex = targetObject.morphTargetDictionary[ propertyIndex ]; + + } + + + } else { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.', this ); + return; + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function () { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + } ); + + // DECLARE ALIAS AFTER assign prototype + Object.assign( PropertyBinding.prototype, { + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + + } ); + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + */ + + function AnimationObjectGroup() { + + this.uuid = MathUtils.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + const indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + const scope = this; + + this.stats = { + + objects: { + get total() { + + return scope._objects.length; + + }, + get inUse() { + + return this.total - scope.nCachedObjects_; + + } + }, + get bindingsPerObject() { + + return scope._bindings.length; + + } + + }; + + } + + Object.assign( AnimationObjectGroup.prototype, { + + isAnimationObjectGroup: true, + + add: function () { + + const objects = this._objects, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length; + + let knownObject = undefined, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_; + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + const object = arguments[ i ], + uuid = object.uuid; + let index = indicesByUUID[ uuid ]; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + const firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ]; + + let binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function () { + + const objects = this._objects, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + let nCachedObjects = this.nCachedObjects_; + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + const object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + const lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function () { + + const objects = this._objects, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + let nCachedObjects = this.nCachedObjects_, + nObjects = objects.length; + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + const object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + const firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + const lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + if ( lastIndex > 0 ) { + + indicesByUUID[ lastObject.uuid ] = index; + + } + + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function ( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + const indicesByPath = this._bindingsIndicesByPath; + let index = indicesByPath[ path ]; + const bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + const paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + const object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function ( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + const indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + const paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + + } ); + + class AnimationAction { + + constructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot; + this.blendMode = blendMode; + + const tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + const interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( let i = 0; i !== nTracks; ++ i ) { + + const interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = - 1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // true -> zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false;// keep feeding the last frame? + + this.zeroSlopeAtStart = true;// for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true;// clips for start, loop and end + + } + + // State & Scheduling + + play() { + + this._mixer._activateAction( this ); + + return this; + + } + + stop() { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + } + + reset() { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = - 1;// forget previous loops + this._startTime = null;// forget scheduling + + return this.stopFading().stopWarping(); + + } + + isRunning() { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + } + + // return true when play has been called + isScheduled() { + + return this._mixer._isActiveAction( this ); + + } + + startAt( time ) { + + this._startTime = time; + + return this; + + } + + setLoop( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + } + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + } + + // return the weight considering fading and .enabled + getEffectiveWeight() { + + return this._effectiveWeight; + + } + + fadeIn( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + } + + fadeOut( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + } + + crossFadeFrom( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if ( warp ) { + + const fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + } + + crossFadeTo( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + } + + stopFading() { + + const weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + } + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + + return this.stopWarping(); + + } + + // return the time scale considering warping and .paused + getEffectiveTimeScale() { + + return this._effectiveTimeScale; + + } + + setDuration( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + } + + syncWith( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + } + + halt( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + } + + warp( startTimeScale, endTimeScale, duration ) { + + const mixer = this._mixer, + now = mixer.time, + timeScale = this.timeScale; + + let interpolant = this._timeScaleInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + const times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + } + + stopWarping() { + + const timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + } + + // Object Accessors + + getMixer() { + + return this._mixer; + + } + + getClip() { + + return this._clip; + + } + + getRoot() { + + return this._localRoot || this._mixer._root; + + } + + // Interna + + _update( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + const startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + const timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + const clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + const weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + const interpolants = this._interpolants; + const propertyMixers = this._propertyBindings; + + switch ( this.blendMode ) { + + case AdditiveAnimationBlendMode: + + for ( let j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulateAdditive( weight ); + + } + + break; + + case NormalAnimationBlendMode: + default: + + for ( let j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + } + + } + + _updateWeight( time ) { + + let weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + const interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + const interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + } + + _updateTimeScale( time ) { + + let timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + const interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + const interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + } + + _updateTime( deltaTime ) { + + const duration = this._clip.duration; + const loop = this.loop; + + let time = this.time + deltaTime; + let loopCount = this._loopCount; + + const pingPong = ( loop === LoopPingPong ); + + if ( deltaTime === 0 ) { + + if ( loopCount === - 1 ) return time; + + return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time; + + } + + if ( loop === LoopOnce ) { + + if ( loopCount === - 1 ) { + + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else { + + this.time = time; + + break handle_stop; + + } + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? - 1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + if ( loopCount === - 1 ) { + + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + + // wrap around + + const loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + const pending = this.repetitions - loopCount; + + if ( pending <= 0 ) { + + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : - 1 + } ); + + } else { + + // keep running + + if ( pending === 1 ) { + + // entering the last round + + const atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } else { + + this.time = time; + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + + // invert time for the "pong round" + + return duration - time; + + } + + } + + return time; + + } + + _setEndings( atStart, atEnd, pingPong ) { + + const settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + } + + _scheduleFading( duration, weightNow, weightThen ) { + + const mixer = this._mixer, now = mixer.time; + let interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + const times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + values[ 0 ] = weightNow; + times[ 1 ] = now + duration; + values[ 1 ] = weightThen; + + return this; + + } + + } + + function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + + } + + AnimationMixer.prototype = Object.assign( Object.create( EventDispatcher$1.prototype ), { + + constructor: AnimationMixer, + + _bindAction: function ( action, prototypeAction ) { + + const root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName; + + let bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( let i = 0; i !== nTracks; ++ i ) { + + const track = tracks[ i ], + trackName = track.name; + + let binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + const path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function ( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + const rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + const bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function ( action ) { + + if ( this._isActiveAction( action ) ) { + + const bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function () { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + const scope = this; + + this.stats = { + + actions: { + get total() { + + return scope._actions.length; + + }, + get inUse() { + + return scope._nActiveActions; + + } + }, + bindings: { + get total() { + + return scope._bindings.length; + + }, + get inUse() { + + return scope._nActiveBindings; + + } + }, + controlInterpolants: { + get total() { + + return scope._controlInterpolants.length; + + }, + get inUse() { + + return scope._nActiveControlInterpolants; + + } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function ( action ) { + + const index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function ( action, clipUuid, rootUuid ) { + + const actions = this._actions, + actionsByClip = this._actionsByClip; + + let actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + const knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function ( action ) { + + const actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + const clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + const actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function ( action ) { + + const bindings = action._propertyBindings; + + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + const actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + const actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function ( binding, rootUuid, trackName ) { + + const bindingsByRoot = this._bindingsByRootAndName, + bindings = this._bindings; + + let bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function ( binding ) { + + const bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + if ( Object.keys( bindingByName ).length === 0 ) { + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function ( binding ) { + + const bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function ( binding ) { + + const bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + + const interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++; + + let interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function ( interpolant ) { + + const interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ), + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function ( clip, optionalRoot, blendMode ) { + + const root = optionalRoot || this._root, + rootUuid = root.uuid; + + let clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip; + + const clipUuid = clipObject !== null ? clipObject.uuid : clip; + + const actionsForClip = this._actionsByClip[ clipUuid ]; + let prototypeAction = null; + + if ( blendMode === undefined ) { + + if ( clipObject !== null ) { + + blendMode = clipObject.blendMode; + + } else { + + blendMode = NormalAnimationBlendMode; + + } + + } + + if ( actionsForClip !== undefined ) { + + const existingAction = actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined && existingAction.blendMode === blendMode ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + const newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function ( clip, optionalRoot ) { + + const root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + + const actions = this._actions, + nActions = this._nActiveActions; + + for ( let i = nActions - 1; i >= 0; -- i ) { + + actions[ i ].stop(); + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function ( deltaTime ) { + + deltaTime *= this.timeScale; + + const actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( let i = 0; i !== nActions; ++ i ) { + + const action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + const bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( let i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // Allows you to seek to a specific time in an animation. + setTime: function ( timeInSeconds ) { + + this.time = 0; // Zero out time attribute for AnimationMixer object; + for ( let i = 0; i < this._actions.length; i ++ ) { + + this._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects. + + } + + return this.update( timeInSeconds ); // Update used to set exact time. Returns "this" AnimationMixer object. + + }, + + // return this mixer's root target object + getRoot: function () { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function ( clip ) { + + const actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + const actionsToRemove = actionsForClip.knownActions; + + for ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + const action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + const cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function ( root ) { + + const rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( const clipUuid in actionsByClip ) { + + const actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + const bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( const trackName in bindingByName ) { + + const binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function ( clip, optionalRoot ) { + + const action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + } ); + + class Uniform { + + constructor( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + clone() { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + + } + + } + + function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), { + + constructor: InstancedInterleavedBuffer, + + isInstancedInterleavedBuffer: true, + + copy: function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + }, + + clone: function ( data ) { + + const ib = InterleavedBuffer.prototype.clone.call( this, data ); + + ib.meshPerAttribute = this.meshPerAttribute; + + return ib; + + }, + + toJSON: function ( data ) { + + const json = InterleavedBuffer.prototype.toJSON.call( this, data ); + + json.isInstancedInterleavedBuffer = true; + json.meshPerAttribute = this.meshPerAttribute; + + return json; + + } + + } ); + + function GLBufferAttribute( buffer, type, itemSize, elementSize, count ) { + + this.buffer = buffer; + this.type = type; + this.itemSize = itemSize; + this.elementSize = elementSize; + this.count = count; + + this.version = 0; + + } + + Object.defineProperty( GLBufferAttribute.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( GLBufferAttribute.prototype, { + + isGLBufferAttribute: true, + + setBuffer: function ( buffer ) { + + this.buffer = buffer; + + return this; + + }, + + setType: function ( type, elementSize ) { + + this.type = type; + this.elementSize = elementSize; + + return this; + + }, + + setItemSize: function ( itemSize ) { + + this.itemSize = itemSize; + + return this; + + }, + + setCount: function ( count ) { + + this.count = count; + + return this; + + }, + + } ); + + function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + this.camera = null; + this.layers = new Layers(); + + this.params = { + Mesh: {}, + Line: { threshold: 1 }, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + + } + } + } ); + + } + + function ascSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.layers.test( raycaster.layers ) ) { + + object.raycast( raycaster, intersects ); + + } + + if ( recursive === true ) { + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + Object.assign( Raycaster.prototype, { + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( camera && camera.isPerspectiveCamera ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + this.camera = camera; + + } else if ( camera && camera.isOrthographicCamera ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + this.camera = camera; + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type ); + + } + + }, + + intersectObject: function ( object, recursive, optionalTarget ) { + + const intersects = optionalTarget || []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive, optionalTarget ) { + + const intersects = optionalTarget || []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( let i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + + } ); + + /** + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up. + * The azimuthal angle (theta) is measured from the positive z-axis. + */ + + class Spherical { + + constructor( radius = 1, phi = 0, theta = 0 ) { + + this.radius = radius; + this.phi = phi; // polar angle + this.theta = theta; // azimuthal angle + + return this; + + } + + set( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + } + + // restrict phi to be betwee EPS and PI-EPS + makeSafe() { + + const EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + } + + setFromVector3( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + } + + setFromCartesianCoords( x, y, z ) { + + this.radius = Math.sqrt( x * x + y * y + z * z ); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( x, z ); + this.phi = Math.acos( MathUtils.clamp( y / this.radius, - 1, 1 ) ); + + } + + return this; + + } + + } + + /** + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + */ + + class Cylindrical { + + constructor( radius, theta, y ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane + this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane + + return this; + + } + + set( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + } + + setFromVector3( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + } + + setFromCartesianCoords( x, y, z ) { + + this.radius = Math.sqrt( x * x + z * z ); + this.theta = Math.atan2( x, z ); + this.y = y; + + return this; + + } + + } + + const _vector$8 = /*@__PURE__*/ new Vector2(); + + class Box2 { + + constructor( min, max ) { + + Object.defineProperty( this, 'isBox2', { value: true } ); + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + + } + + set( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + } + + setFromPoints( points ) { + + this.makeEmpty(); + + for ( let i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + } + + setFromCenterAndSize( center, size ) { + + const halfSize = _vector$8.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + } + + makeEmpty() { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + } + + isEmpty() { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + } + + getCenter( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getCenter() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + } + + getSize( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getSize() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min ); + + } + + expandByPoint( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + } + + expandByVector( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + } + + expandByScalar( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + } + + containsPoint( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + } + + containsBox( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + } + + getParameter( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getParameter() target is now required' ); + target = new Vector2(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + } + + intersectsBox( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + } + + clampPoint( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .clampPoint() target is now required' ); + target = new Vector2(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + } + + distanceToPoint( point ) { + + const clampedPoint = _vector$8.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + } + + intersect( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + } + + union( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + } + + translate( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + } + + equals( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } + + const _startP = /*@__PURE__*/ new Vector3(); + const _startEnd = /*@__PURE__*/ new Vector3(); + + class Line3 { + + constructor( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + + } + + set( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + } + + getCenter( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + } + + delta( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .delta() target is now required' ); + target = new Vector3(); + + } + + return target.subVectors( this.end, this.start ); + + } + + distanceSq() { + + return this.start.distanceToSquared( this.end ); + + } + + distance() { + + return this.start.distanceTo( this.end ); + + } + + at( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .at() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + } + + closestPointToPointParameter( point, clampToLine ) { + + _startP.subVectors( point, this.start ); + _startEnd.subVectors( this.end, this.start ); + + const startEnd2 = _startEnd.dot( _startEnd ); + const startEnd_startP = _startEnd.dot( _startP ); + + let t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = MathUtils.clamp( t, 0, 1 ); + + } + + return t; + + } + + closestPointToPoint( point, clampToLine, target ) { + + const t = this.closestPointToPointParameter( point, clampToLine ); + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + } + + applyMatrix4( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + } + + equals( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + } + + function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( /* renderCallback */ ) {}; + + this.hasPositions = false; + this.hasNormals = false; + this.hasColors = false; + this.hasUvs = false; + + this.positionArray = null; + this.normalArray = null; + this.colorArray = null; + this.uvArray = null; + + this.count = 0; + + } + + ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + + ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + const _vector$9 = /*@__PURE__*/ new Vector3(); + + class SpotLightHelper extends Object3D { + + constructor( light, color ) { + + super(); + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + const geometry = new BufferGeometry(); + + const positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + const p1 = ( i / l ) * Math.PI * 2; + const p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + const material = new LineBasicMaterial( { fog: false, toneMapped: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + dispose() { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + } + + update() { + + this.light.updateMatrixWorld(); + + const coneLength = this.light.distance ? this.light.distance : 1000; + const coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + _vector$9.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( _vector$9 ); + + if ( this.color !== undefined ) { + + this.cone.material.color.set( this.color ); + + } else { + + this.cone.material.color.copy( this.light.color ); + + } + + } + + } + + const _vector$a = /*@__PURE__*/ new Vector3(); + const _boneMatrix = /*@__PURE__*/ new Matrix4(); + const _matrixWorldInv = /*@__PURE__*/ new Matrix4(); + + + class SkeletonHelper extends LineSegments { + + constructor( object ) { + + const bones = getBoneList( object ); + + const geometry = new BufferGeometry(); + + const vertices = []; + const colors = []; + + const color1 = new Color( 0, 0, 1 ); + const color2 = new Color( 0, 1, 0 ); + + for ( let i = 0; i < bones.length; i ++ ) { + + const bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + vertices.push( 0, 0, 0 ); + vertices.push( 0, 0, 0 ); + colors.push( color1.r, color1.g, color1.b ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } ); + + super( geometry, material ); + + this.type = 'SkeletonHelper'; + this.isSkeletonHelper = true; + + this.root = object; + this.bones = bones; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + } + + updateMatrixWorld( force ) { + + const bones = this.bones; + + const geometry = this.geometry; + const position = geometry.getAttribute( 'position' ); + + _matrixWorldInv.copy( this.root.matrixWorld ).invert(); + + for ( let i = 0, j = 0; i < bones.length; i ++ ) { + + const bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld ); + _vector$a.setFromMatrixPosition( _boneMatrix ); + position.setXYZ( j, _vector$a.x, _vector$a.y, _vector$a.z ); + + _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld ); + _vector$a.setFromMatrixPosition( _boneMatrix ); + position.setXYZ( j + 1, _vector$a.x, _vector$a.y, _vector$a.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + super.updateMatrixWorld( force ); + + } + + } + + + function getBoneList( object ) { + + const boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( let i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, getBoneList( object.children[ i ] ) ); + + } + + return boneList; + + } + + class PointLightHelper extends Mesh { + + constructor( light, sphereSize, color ) { + + const geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + const material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } ); + + super( geometry, material ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.color = color; + + this.type = 'PointLightHelper'; + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + + /* + // TODO: delete this comment? + const distanceGeometry = new THREE.IcosahedronBufferGeometry( 1, 2 ); + const distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + const d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + + update() { + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + this.material.color.copy( this.light.color ); + + } + + /* + const d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + } + + } + + const _vector$b = /*@__PURE__*/ new Vector3(); + const _color1 = /*@__PURE__*/ new Color(); + const _color2 = /*@__PURE__*/ new Color(); + + class HemisphereLightHelper extends Object3D { + + constructor( light, size, color ) { + + super(); + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + const geometry = new OctahedronBufferGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + this.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } ); + if ( this.color === undefined ) this.material.vertexColors = true; + + const position = geometry.getAttribute( 'position' ); + const colors = new Float32Array( position.count * 3 ); + + geometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, this.material ) ); + + this.update(); + + } + + dispose() { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + } + + update() { + + const mesh = this.children[ 0 ]; + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + const colors = mesh.geometry.getAttribute( 'color' ); + + _color1.copy( this.light.color ); + _color2.copy( this.light.groundColor ); + + for ( let i = 0, l = colors.count; i < l; i ++ ) { + + const color = ( i < ( l / 2 ) ) ? _color1 : _color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + colors.needsUpdate = true; + + } + + mesh.lookAt( _vector$b.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + } + + } + + class GridHelper extends LineSegments { + + constructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) { + + color1 = new Color( color1 ); + color2 = new Color( color2 ); + + const center = divisions / 2; + const step = size / divisions; + const halfSize = size / 2; + + const vertices = [], colors = []; + + for ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { + + vertices.push( - halfSize, 0, k, halfSize, 0, k ); + vertices.push( k, 0, - halfSize, k, 0, halfSize ); + + const color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); + + super( geometry, material ); + + this.type = 'GridHelper'; + + } + + } + + class PolarGridHelper extends LineSegments { + + constructor( radius = 10, radials = 16, circles = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) { + + color1 = new Color( color1 ); + color2 = new Color( color2 ); + + const vertices = []; + const colors = []; + + // create the radials + + for ( let i = 0; i <= radials; i ++ ) { + + const v = ( i / radials ) * ( Math.PI * 2 ); + + const x = Math.sin( v ) * radius; + const z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + const color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( let i = 0; i <= circles; i ++ ) { + + const color = ( i & 1 ) ? color1 : color2; + + const r = radius - ( radius / circles * i ); + + for ( let j = 0; j < divisions; j ++ ) { + + // first vertex + + let v = ( j / divisions ) * ( Math.PI * 2 ); + + let x = Math.sin( v ) * r; + let z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + // second vertex + + v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + } + + } + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); + + super( geometry, material ); + + this.type = 'PolarGridHelper'; + + } + + } + + const _v1$6 = /*@__PURE__*/ new Vector3(); + const _v2$3 = /*@__PURE__*/ new Vector3(); + const _v3$1 = /*@__PURE__*/ new Vector3(); + + class DirectionalLightHelper extends Object3D { + + constructor( light, size, color ) { + + super(); + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + if ( size === undefined ) size = 1; + + let geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + const material = new LineBasicMaterial( { fog: false, toneMapped: false } ); + + this.lightPlane = new Line( geometry, material ); + this.add( this.lightPlane ); + + geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.targetLine = new Line( geometry, material ); + this.add( this.targetLine ); + + this.update(); + + } + + dispose() { + + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + + } + + update() { + + _v1$6.setFromMatrixPosition( this.light.matrixWorld ); + _v2$3.setFromMatrixPosition( this.light.target.matrixWorld ); + _v3$1.subVectors( _v2$3, _v1$6 ); + + this.lightPlane.lookAt( _v2$3 ); + + if ( this.color !== undefined ) { + + this.lightPlane.material.color.set( this.color ); + this.targetLine.material.color.set( this.color ); + + } else { + + this.lightPlane.material.color.copy( this.light.color ); + this.targetLine.material.color.copy( this.light.color ); + + } + + this.targetLine.lookAt( _v2$3 ); + this.targetLine.scale.z = _v3$1.length(); + + } + + } + + const _vector$c = /*@__PURE__*/ new Vector3(); + const _camera = /*@__PURE__*/ new Camera(); + + /** + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + class CameraHelper extends LineSegments { + + constructor( camera ) { + + const geometry = new BufferGeometry(); + const material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } ); + + const vertices = []; + const colors = []; + + const pointMap = {}; + + // colors + + const colorFrustum = new Color( 0xffaa00 ); + const colorCone = new Color( 0xff0000 ); + const colorUp = new Color( 0x00aaff ); + const colorTarget = new Color( 0xffffff ); + const colorCross = new Color( 0x333333 ); + + // near + + addLine( 'n1', 'n2', colorFrustum ); + addLine( 'n2', 'n4', colorFrustum ); + addLine( 'n4', 'n3', colorFrustum ); + addLine( 'n3', 'n1', colorFrustum ); + + // far + + addLine( 'f1', 'f2', colorFrustum ); + addLine( 'f2', 'f4', colorFrustum ); + addLine( 'f4', 'f3', colorFrustum ); + addLine( 'f3', 'f1', colorFrustum ); + + // sides + + addLine( 'n1', 'f1', colorFrustum ); + addLine( 'n2', 'f2', colorFrustum ); + addLine( 'n3', 'f3', colorFrustum ); + addLine( 'n4', 'f4', colorFrustum ); + + // cone + + addLine( 'p', 'n1', colorCone ); + addLine( 'p', 'n2', colorCone ); + addLine( 'p', 'n3', colorCone ); + addLine( 'p', 'n4', colorCone ); + + // up + + addLine( 'u1', 'u2', colorUp ); + addLine( 'u2', 'u3', colorUp ); + addLine( 'u3', 'u1', colorUp ); + + // target + + addLine( 'c', 't', colorTarget ); + addLine( 'p', 'c', colorCross ); + + // cross + + addLine( 'cn1', 'cn2', colorCross ); + addLine( 'cn3', 'cn4', colorCross ); + + addLine( 'cf1', 'cf2', colorCross ); + addLine( 'cf3', 'cf4', colorCross ); + + function addLine( a, b, color ) { + + addPoint( a, color ); + addPoint( b, color ); + + } + + function addPoint( id, color ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + super( geometry, material ); + + this.type = 'CameraHelper'; + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + update() { + + const geometry = this.geometry; + const pointMap = this.pointMap; + + const w = 1, h = 1; + + // we need just camera projection matrix inverse + // world matrix must be identity + + _camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse ); + + // center / target + + setPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 ); + setPoint( 't', pointMap, geometry, _camera, 0, 0, 1 ); + + // near + + setPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 ); + setPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 ); + setPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 ); + setPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 ); + + // far + + setPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 ); + setPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 ); + setPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 ); + setPoint( 'f4', pointMap, geometry, _camera, w, h, 1 ); + + // up + + setPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 ); + setPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 ); + setPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 ); + + // cross + + setPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 ); + setPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 ); + setPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 ); + setPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 ); + + setPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 ); + setPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 ); + setPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 ); + setPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + } + + } + + + function setPoint( point, pointMap, geometry, camera, x, y, z ) { + + _vector$c.set( x, y, z ).unproject( camera ); + + const points = pointMap[ point ]; + + if ( points !== undefined ) { + + const position = geometry.getAttribute( 'position' ); + + for ( let i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], _vector$c.x, _vector$c.y, _vector$c.z ); + + } + + } + + } + + const _box$3 = /*@__PURE__*/ new Box3(); + + class BoxHelper extends LineSegments { + + constructor( object, color = 0xffff00 ) { + + const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + const positions = new Float32Array( 8 * 3 ); + + const geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + + this.object = object; + this.type = 'BoxHelper'; + + this.matrixAutoUpdate = false; + + this.update(); + + } + + update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + _box$3.setFromObject( this.object ); + + } + + if ( _box$3.isEmpty() ) return; + + const min = _box$3.min; + const max = _box$3.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + const position = this.geometry.attributes.position; + const array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + + } + + setFromObject( object ) { + + this.object = object; + this.update(); + + return this; + + } + + copy( source ) { + + LineSegments.prototype.copy.call( this, source ); + + this.object = source.object; + + return this; + + } + + } + + class Box3Helper extends LineSegments { + + constructor( box, color = 0xffff00 ) { + + const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + + const positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ]; + + const geometry = new BufferGeometry(); + + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + + geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + + this.box = box; + + this.type = 'Box3Helper'; + + this.geometry.computeBoundingSphere(); + + } + + updateMatrixWorld( force ) { + + const box = this.box; + + if ( box.isEmpty() ) return; + + box.getCenter( this.position ); + + box.getSize( this.scale ); + + this.scale.multiplyScalar( 0.5 ); + + super.updateMatrixWorld( force ); + + } + + } + + class PlaneHelper extends Line { + + constructor( plane, size = 1, hex = 0xffff00 ) { + + const color = hex; + + const positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ]; + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + geometry.computeBoundingSphere(); + + super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + + this.type = 'PlaneHelper'; + + this.plane = plane; + + this.size = size; + + const positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ]; + + const geometry2 = new BufferGeometry(); + geometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) ); + geometry2.computeBoundingSphere(); + + this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) ); + + } + + updateMatrixWorld( force ) { + + let scale = - this.plane.constant; + + if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter + + this.scale.set( 0.5 * this.size, 0.5 * this.size, scale ); + + this.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here + + this.lookAt( this.plane.normal ); + + super.updateMatrixWorld( force ); + + } + + } + + const _axis = /*@__PURE__*/ new Vector3(); + let _lineGeometry, _coneGeometry; + + class ArrowHelper extends Object3D { + + constructor( dir, origin, length, color, headLength, headWidth ) { + + super(); + // dir is assumed to be normalized + + this.type = 'ArrowHelper'; + + if ( dir === undefined ) dir = new Vector3( 0, 0, 1 ); + if ( origin === undefined ) origin = new Vector3( 0, 0, 0 ); + if ( length === undefined ) length = 1; + if ( color === undefined ) color = 0xffff00; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( _lineGeometry === undefined ) { + + _lineGeometry = new BufferGeometry(); + _lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + _coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + _coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + _axis.set( dir.z, 0, - dir.x ).normalize(); + + const radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( _axis, radians ); + + } + + } + + setLength( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458 + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + } + + setColor( color ) { + + this.line.material.color.set( color ); + this.cone.material.color.set( color ); + + } + + copy( source ) { + + super.copy( source, false ); + + this.line.copy( source.line ); + this.cone.copy( source.cone ); + + return this; + + } + + } + + class AxesHelper extends LineSegments { + + constructor( size = 1 ) { + + const vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + const colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); + + super( geometry, material ); + + this.type = 'AxesHelper'; + + } + + } + + const _floatView = new Float32Array( 1 ); + const _int32View = new Int32Array( _floatView.buffer ); + + const DataUtils = { + + // Converts float32 to float16 (stored as uint16 value). + + toHalfFloat: function ( val ) { + + // Source: http://gamedev.stackexchange.com/questions/17326/conversion-of-a-number-from-single-precision-floating-point-representation-to-a/17410#17410 + + /* This method is faster than the OpenEXR implementation (very often + * used, eg. in Ogre), with the additional benefit of rounding, inspired + * by James Tursa?s half-precision code. */ + + _floatView[ 0 ] = val; + const x = _int32View[ 0 ]; + + let bits = ( x >> 16 ) & 0x8000; /* Get the sign */ + let m = ( x >> 12 ) & 0x07ff; /* Keep one extra bit for rounding */ + const e = ( x >> 23 ) & 0xff; /* Using int is faster here */ + + /* If zero, or denormal, or exponent underflows too much for a denormal + * half, return signed zero. */ + if ( e < 103 ) return bits; + + /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */ + if ( e > 142 ) { + + bits |= 0x7c00; + /* If exponent was 0xff and one mantissa bit was set, it means NaN, + * not Inf, so make sure we set one mantissa bit too. */ + bits |= ( ( e == 255 ) ? 0 : 1 ) && ( x & 0x007fffff ); + return bits; + + } + + /* If exponent underflows but not too much, return a denormal */ + if ( e < 113 ) { + + m |= 0x0800; + /* Extra rounding may overflow and set mantissa to 0 and exponent + * to 1, which is OK. */ + bits |= ( m >> ( 114 - e ) ) + ( ( m >> ( 113 - e ) ) & 1 ); + return bits; + + } + + bits |= ( ( e - 112 ) << 10 ) | ( m >> 1 ); + /* Extra rounding. An overflow will set mantissa to 0 and increment + * the exponent, which is OK. */ + bits += m & 1; + return bits; + + } + + }; + + const LOD_MIN = 4; + const LOD_MAX = 8; + const SIZE_MAX = Math.pow( 2, LOD_MAX ); + + // The standard deviations (radians) associated with the extra mips. These are + // chosen to approximate a Trowbridge-Reitz distribution function times the + // geometric shadowing function. These sigma values squared must match the + // variance #defines in cube_uv_reflection_fragment.glsl.js. + const EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ]; + + const TOTAL_LODS = LOD_MAX - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length; + + // The maximum length of the blur for loop. Smaller sigmas will use fewer + // samples and exit early, but not recompile the shader. + const MAX_SAMPLES = 20; + + const ENCODINGS = { + [ LinearEncoding ]: 0, + [ sRGBEncoding ]: 1, + [ RGBEEncoding ]: 2, + [ RGBM7Encoding ]: 3, + [ RGBM16Encoding ]: 4, + [ RGBDEncoding ]: 5, + [ GammaEncoding ]: 6 + }; + + const _flatCamera = /*@__PURE__*/ new OrthographicCamera(); + const { _lodPlanes, _sizeLods, _sigmas } = /*@__PURE__*/ _createPlanes(); + const _clearColor = /*@__PURE__*/ new Color(); + let _oldTarget = null; + + // Golden Ratio + const PHI = ( 1 + Math.sqrt( 5 ) ) / 2; + const INV_PHI = 1 / PHI; + + // Vertices of a dodecahedron (except the opposites, which represent the + // same axis), used as axis directions evenly spread on a sphere. + const _axisDirections = [ + /*@__PURE__*/ new Vector3( 1, 1, 1 ), + /*@__PURE__*/ new Vector3( - 1, 1, 1 ), + /*@__PURE__*/ new Vector3( 1, 1, - 1 ), + /*@__PURE__*/ new Vector3( - 1, 1, - 1 ), + /*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ), + /*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ), + /*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ), + /*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ), + /*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ), + /*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ]; + + /** + * This class generates a Prefiltered, Mipmapped Radiance Environment Map + * (PMREM) from a cubeMap environment texture. This allows different levels of + * blur to be quickly accessed based on material roughness. It is packed into a + * special CubeUV format that allows us to perform custom interpolation so that + * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap + * chain, it only goes down to the LOD_MIN level (above), and then creates extra + * even more filtered 'mips' at the same LOD_MIN resolution, associated with + * higher roughness levels. In this way we maintain resolution to smoothly + * interpolate diffuse lighting while limiting sampling computation. + */ + + class PMREMGenerator { + + constructor( renderer ) { + + this._renderer = renderer; + this._pingPongRenderTarget = null; + + this._blurMaterial = _getBlurShader( MAX_SAMPLES ); + this._equirectShader = null; + this._cubemapShader = null; + + this._compileMaterial( this._blurMaterial ); + + } + + /** + * Generates a PMREM from a supplied Scene, which can be faster than using an + * image if networking bandwidth is low. Optional sigma specifies a blur radius + * in radians to be applied to the scene before PMREM generation. Optional near + * and far planes ensure the scene is rendered in its entirety (the cubeCamera + * is placed at the origin). + */ + fromScene( scene, sigma = 0, near = 0.1, far = 100 ) { + + _oldTarget = this._renderer.getRenderTarget(); + const cubeUVRenderTarget = this._allocateTargets(); + + this._sceneToCubeUV( scene, near, far, cubeUVRenderTarget ); + if ( sigma > 0 ) { + + this._blur( cubeUVRenderTarget, 0, 0, sigma ); + + } + + this._applyPMREM( cubeUVRenderTarget ); + this._cleanup( cubeUVRenderTarget ); + + return cubeUVRenderTarget; + + } + + /** + * Generates a PMREM from an equirectangular texture, which can be either LDR + * (RGBFormat) or HDR (RGBEFormat). The ideal input image size is 1k (1024 x 512), + * as this matches best with the 256 x 256 cubemap output. + */ + fromEquirectangular( equirectangular ) { + + return this._fromTexture( equirectangular ); + + } + + /** + * Generates a PMREM from an cubemap texture, which can be either LDR + * (RGBFormat) or HDR (RGBEFormat). The ideal input cube size is 256 x 256, + * as this matches best with the 256 x 256 cubemap output. + */ + fromCubemap( cubemap ) { + + return this._fromTexture( cubemap ); + + } + + /** + * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileCubemapShader() { + + if ( this._cubemapShader === null ) { + + this._cubemapShader = _getCubemapShader(); + this._compileMaterial( this._cubemapShader ); + + } + + } + + /** + * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileEquirectangularShader() { + + if ( this._equirectShader === null ) { + + this._equirectShader = _getEquirectShader(); + this._compileMaterial( this._equirectShader ); + + } + + } + + /** + * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class, + * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on + * one of them will cause any others to also become unusable. + */ + dispose() { + + this._blurMaterial.dispose(); + + if ( this._cubemapShader !== null ) this._cubemapShader.dispose(); + if ( this._equirectShader !== null ) this._equirectShader.dispose(); + + for ( let i = 0; i < _lodPlanes.length; i ++ ) { + + _lodPlanes[ i ].dispose(); + + } + + } + + // private interface + + _cleanup( outputTarget ) { + + this._pingPongRenderTarget.dispose(); + this._renderer.setRenderTarget( _oldTarget ); + outputTarget.scissorTest = false; + _setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height ); + + } + + _fromTexture( texture ) { + + _oldTarget = this._renderer.getRenderTarget(); + const cubeUVRenderTarget = this._allocateTargets( texture ); + this._textureToCubeUV( texture, cubeUVRenderTarget ); + this._applyPMREM( cubeUVRenderTarget ); + this._cleanup( cubeUVRenderTarget ); + + return cubeUVRenderTarget; + + } + + _allocateTargets( texture ) { // warning: null texture is valid + + const params = { + magFilter: NearestFilter, + minFilter: NearestFilter, + generateMipmaps: false, + type: UnsignedByteType, + format: RGBEFormat, + encoding: _isLDR( texture ) ? texture.encoding : RGBEEncoding, + depthBuffer: false + }; + + const cubeUVRenderTarget = _createRenderTarget( params ); + cubeUVRenderTarget.depthBuffer = texture ? false : true; + this._pingPongRenderTarget = _createRenderTarget( params ); + return cubeUVRenderTarget; + + } + + _compileMaterial( material ) { + + const tmpMesh = new Mesh( _lodPlanes[ 0 ], material ); + this._renderer.compile( tmpMesh, _flatCamera ); + + } + + _sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) { + + const fov = 90; + const aspect = 1; + const cubeCamera = new PerspectiveCamera( fov, aspect, near, far ); + const upSign = [ 1, - 1, 1, 1, 1, 1 ]; + const forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ]; + const renderer = this._renderer; + + const outputEncoding = renderer.outputEncoding; + const toneMapping = renderer.toneMapping; + renderer.getClearColor( _clearColor ); + const clearAlpha = renderer.getClearAlpha(); + + renderer.toneMapping = NoToneMapping; + renderer.outputEncoding = LinearEncoding; + + let background = scene.background; + if ( background && background.isColor ) { + + background.convertSRGBToLinear(); + // Convert linear to RGBE + const maxComponent = Math.max( background.r, background.g, background.b ); + const fExp = Math.min( Math.max( Math.ceil( Math.log2( maxComponent ) ), - 128.0 ), 127.0 ); + background = background.multiplyScalar( Math.pow( 2.0, - fExp ) ); + const alpha = ( fExp + 128.0 ) / 255.0; + renderer.setClearColor( background, alpha ); + scene.background = null; + + } + + for ( let i = 0; i < 6; i ++ ) { + + const col = i % 3; + if ( col == 0 ) { + + cubeCamera.up.set( 0, upSign[ i ], 0 ); + cubeCamera.lookAt( forwardSign[ i ], 0, 0 ); + + } else if ( col == 1 ) { + + cubeCamera.up.set( 0, 0, upSign[ i ] ); + cubeCamera.lookAt( 0, forwardSign[ i ], 0 ); + + } else { + + cubeCamera.up.set( 0, upSign[ i ], 0 ); + cubeCamera.lookAt( 0, 0, forwardSign[ i ] ); + + } + + _setViewport( cubeUVRenderTarget, + col * SIZE_MAX, i > 2 ? SIZE_MAX : 0, SIZE_MAX, SIZE_MAX ); + renderer.setRenderTarget( cubeUVRenderTarget ); + renderer.render( scene, cubeCamera ); + + } + + renderer.toneMapping = toneMapping; + renderer.outputEncoding = outputEncoding; + renderer.setClearColor( _clearColor, clearAlpha ); + + } + + _textureToCubeUV( texture, cubeUVRenderTarget ) { + + const renderer = this._renderer; + + if ( texture.isCubeTexture ) { + + if ( this._cubemapShader == null ) { + + this._cubemapShader = _getCubemapShader(); + + } + + } else { + + if ( this._equirectShader == null ) { + + this._equirectShader = _getEquirectShader(); + + } + + } + + const material = texture.isCubeTexture ? this._cubemapShader : this._equirectShader; + const mesh = new Mesh( _lodPlanes[ 0 ], material ); + + const uniforms = material.uniforms; + + uniforms[ 'envMap' ].value = texture; + + if ( ! texture.isCubeTexture ) { + + uniforms[ 'texelSize' ].value.set( 1.0 / texture.image.width, 1.0 / texture.image.height ); + + } + + uniforms[ 'inputEncoding' ].value = ENCODINGS[ texture.encoding ]; + uniforms[ 'outputEncoding' ].value = ENCODINGS[ cubeUVRenderTarget.texture.encoding ]; + + _setViewport( cubeUVRenderTarget, 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX ); + + renderer.setRenderTarget( cubeUVRenderTarget ); + renderer.render( mesh, _flatCamera ); + + } + + _applyPMREM( cubeUVRenderTarget ) { + + const renderer = this._renderer; + const autoClear = renderer.autoClear; + renderer.autoClear = false; + + for ( let i = 1; i < TOTAL_LODS; i ++ ) { + + const sigma = Math.sqrt( _sigmas[ i ] * _sigmas[ i ] - _sigmas[ i - 1 ] * _sigmas[ i - 1 ] ); + + const poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ]; + + this._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis ); + + } + + renderer.autoClear = autoClear; + + } + + /** + * This is a two-pass Gaussian blur for a cubemap. Normally this is done + * vertically and horizontally, but this breaks down on a cube. Here we apply + * the blur latitudinally (around the poles), and then longitudinally (towards + * the poles) to approximate the orthogonally-separable blur. It is least + * accurate at the poles, but still does a decent job. + */ + _blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) { + + const pingPongRenderTarget = this._pingPongRenderTarget; + + this._halfBlur( + cubeUVRenderTarget, + pingPongRenderTarget, + lodIn, + lodOut, + sigma, + 'latitudinal', + poleAxis ); + + this._halfBlur( + pingPongRenderTarget, + cubeUVRenderTarget, + lodOut, + lodOut, + sigma, + 'longitudinal', + poleAxis ); + + } + + _halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) { + + const renderer = this._renderer; + const blurMaterial = this._blurMaterial; + + if ( direction !== 'latitudinal' && direction !== 'longitudinal' ) { + + console.error( + 'blur direction must be either latitudinal or longitudinal!' ); + + } + + // Number of standard deviations at which to cut off the discrete approximation. + const STANDARD_DEVIATIONS = 3; + + const blurMesh = new Mesh( _lodPlanes[ lodOut ], blurMaterial ); + const blurUniforms = blurMaterial.uniforms; + + const pixels = _sizeLods[ lodIn ] - 1; + const radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 ); + const sigmaPixels = sigmaRadians / radiansPerPixel; + const samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES; + + if ( samples > MAX_SAMPLES ) { + + console.warn( `sigmaRadians, ${ + sigmaRadians}, is too large and will clip, as it requested ${ + samples} samples when the maximum is set to ${MAX_SAMPLES}` ); + + } + + const weights = []; + let sum = 0; + + for ( let i = 0; i < MAX_SAMPLES; ++ i ) { + + const x = i / sigmaPixels; + const weight = Math.exp( - x * x / 2 ); + weights.push( weight ); + + if ( i == 0 ) { + + sum += weight; + + } else if ( i < samples ) { + + sum += 2 * weight; + + } + + } + + for ( let i = 0; i < weights.length; i ++ ) { + + weights[ i ] = weights[ i ] / sum; + + } + + blurUniforms[ 'envMap' ].value = targetIn.texture; + blurUniforms[ 'samples' ].value = samples; + blurUniforms[ 'weights' ].value = weights; + blurUniforms[ 'latitudinal' ].value = direction === 'latitudinal'; + + if ( poleAxis ) { + + blurUniforms[ 'poleAxis' ].value = poleAxis; + + } + + blurUniforms[ 'dTheta' ].value = radiansPerPixel; + blurUniforms[ 'mipInt' ].value = LOD_MAX - lodIn; + blurUniforms[ 'inputEncoding' ].value = ENCODINGS[ targetIn.texture.encoding ]; + blurUniforms[ 'outputEncoding' ].value = ENCODINGS[ targetIn.texture.encoding ]; + + const outputSize = _sizeLods[ lodOut ]; + const x = 3 * Math.max( 0, SIZE_MAX - 2 * outputSize ); + const y = ( lodOut === 0 ? 0 : 2 * SIZE_MAX ) + 2 * outputSize * ( lodOut > LOD_MAX - LOD_MIN ? lodOut - LOD_MAX + LOD_MIN : 0 ); + + _setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize ); + renderer.setRenderTarget( targetOut ); + renderer.render( blurMesh, _flatCamera ); + + } + + } + + function _isLDR( texture ) { + + if ( texture === undefined || texture.type !== UnsignedByteType ) return false; + + return texture.encoding === LinearEncoding || texture.encoding === sRGBEncoding || texture.encoding === GammaEncoding; + + } + + function _createPlanes() { + + const _lodPlanes = []; + const _sizeLods = []; + const _sigmas = []; + + let lod = LOD_MAX; + + for ( let i = 0; i < TOTAL_LODS; i ++ ) { + + const sizeLod = Math.pow( 2, lod ); + _sizeLods.push( sizeLod ); + let sigma = 1.0 / sizeLod; + + if ( i > LOD_MAX - LOD_MIN ) { + + sigma = EXTRA_LOD_SIGMA[ i - LOD_MAX + LOD_MIN - 1 ]; + + } else if ( i == 0 ) { + + sigma = 0; + + } + + _sigmas.push( sigma ); + + const texelSize = 1.0 / ( sizeLod - 1 ); + const min = - texelSize / 2; + const max = 1 + texelSize / 2; + const uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ]; + + const cubeFaces = 6; + const vertices = 6; + const positionSize = 3; + const uvSize = 2; + const faceIndexSize = 1; + + const position = new Float32Array( positionSize * vertices * cubeFaces ); + const uv = new Float32Array( uvSize * vertices * cubeFaces ); + const faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces ); + + for ( let face = 0; face < cubeFaces; face ++ ) { + + const x = ( face % 3 ) * 2 / 3 - 1; + const y = face > 2 ? 0 : - 1; + const coordinates = [ + x, y, 0, + x + 2 / 3, y, 0, + x + 2 / 3, y + 1, 0, + x, y, 0, + x + 2 / 3, y + 1, 0, + x, y + 1, 0 + ]; + position.set( coordinates, positionSize * vertices * face ); + uv.set( uv1, uvSize * vertices * face ); + const fill = [ face, face, face, face, face, face ]; + faceIndex.set( fill, faceIndexSize * vertices * face ); + + } + + const planes = new BufferGeometry(); + planes.setAttribute( 'position', new BufferAttribute( position, positionSize ) ); + planes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) ); + planes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) ); + _lodPlanes.push( planes ); + + if ( lod > LOD_MIN ) { + + lod --; + + } + + } + + return { _lodPlanes, _sizeLods, _sigmas }; + + } + + function _createRenderTarget( params ) { + + const cubeUVRenderTarget = new WebGLRenderTarget( 3 * SIZE_MAX, 3 * SIZE_MAX, params ); + cubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping; + cubeUVRenderTarget.texture.name = 'PMREM.cubeUv'; + cubeUVRenderTarget.scissorTest = true; + return cubeUVRenderTarget; + + } + + function _setViewport( target, x, y, width, height ) { + + target.viewport.set( x, y, width, height ); + target.scissor.set( x, y, width, height ); + + } + + function _getBlurShader( maxSamples ) { + + const weights = new Float32Array( maxSamples ); + const poleAxis = new Vector3( 0, 1, 0 ); + const shaderMaterial = new RawShaderMaterial( { + + name: 'SphericalGaussianBlur', + + defines: { 'n': maxSamples }, + + uniforms: { + 'envMap': { value: null }, + 'samples': { value: 1 }, + 'weights': { value: weights }, + 'latitudinal': { value: false }, + 'dTheta': { value: 0 }, + 'mipInt': { value: 0 }, + 'poleAxis': { value: poleAxis }, + 'inputEncoding': { value: ENCODINGS[ LinearEncoding ] }, + 'outputEncoding': { value: ENCODINGS[ LinearEncoding ] } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + uniform int samples; + uniform float weights[ n ]; + uniform bool latitudinal; + uniform float dTheta; + uniform float mipInt; + uniform vec3 poleAxis; + + ${ _getEncodings() } + + #define ENVMAP_TYPE_CUBE_UV + #include + + vec3 getSample( float theta, vec3 axis ) { + + float cosTheta = cos( theta ); + // Rodrigues' axis-angle rotation + vec3 sampleDirection = vOutputDirection * cosTheta + + cross( axis, vOutputDirection ) * sin( theta ) + + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); + + return bilinearCubeUV( envMap, sampleDirection, mipInt ); + + } + + void main() { + + vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); + + if ( all( equal( axis, vec3( 0.0 ) ) ) ) { + + axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); + + } + + axis = normalize( axis ); + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); + + for ( int i = 1; i < n; i++ ) { + + if ( i >= samples ) { + + break; + + } + + float theta = dTheta * float( i ); + gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); + gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); + + } + + gl_FragColor = linearToOutputTexel( gl_FragColor ); + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + + return shaderMaterial; + + } + + function _getEquirectShader() { + + const texelSize = new Vector2( 1, 1 ); + const shaderMaterial = new RawShaderMaterial( { + + name: 'EquirectangularToCubeUV', + + uniforms: { + 'envMap': { value: null }, + 'texelSize': { value: texelSize }, + 'inputEncoding': { value: ENCODINGS[ LinearEncoding ] }, + 'outputEncoding': { value: ENCODINGS[ LinearEncoding ] } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + uniform vec2 texelSize; + + ${ _getEncodings() } + + #include + + void main() { + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + + vec3 outputDirection = normalize( vOutputDirection ); + vec2 uv = equirectUv( outputDirection ); + + vec2 f = fract( uv / texelSize - 0.5 ); + uv -= f * texelSize; + vec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb; + uv.x += texelSize.x; + vec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb; + uv.y += texelSize.y; + vec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb; + uv.x -= texelSize.x; + vec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb; + + vec3 tm = mix( tl, tr, f.x ); + vec3 bm = mix( bl, br, f.x ); + gl_FragColor.rgb = mix( tm, bm, f.y ); + + gl_FragColor = linearToOutputTexel( gl_FragColor ); + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + + return shaderMaterial; + + } + + function _getCubemapShader() { + + const shaderMaterial = new RawShaderMaterial( { + + name: 'CubemapToCubeUV', + + uniforms: { + 'envMap': { value: null }, + 'inputEncoding': { value: ENCODINGS[ LinearEncoding ] }, + 'outputEncoding': { value: ENCODINGS[ LinearEncoding ] } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform samplerCube envMap; + + ${ _getEncodings() } + + void main() { + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + gl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb; + gl_FragColor = linearToOutputTexel( gl_FragColor ); + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + + return shaderMaterial; + + } + + function _getCommonVertexShader() { + + return /* glsl */` + + precision mediump float; + precision mediump int; + + attribute vec3 position; + attribute vec2 uv; + attribute float faceIndex; + + varying vec3 vOutputDirection; + + // RH coordinate system; PMREM face-indexing convention + vec3 getDirection( vec2 uv, float face ) { + + uv = 2.0 * uv - 1.0; + + vec3 direction = vec3( uv, 1.0 ); + + if ( face == 0.0 ) { + + direction = direction.zyx; // ( 1, v, u ) pos x + + } else if ( face == 1.0 ) { + + direction = direction.xzy; + direction.xz *= -1.0; // ( -u, 1, -v ) pos y + + } else if ( face == 2.0 ) { + + direction.x *= -1.0; // ( -u, v, 1 ) pos z + + } else if ( face == 3.0 ) { + + direction = direction.zyx; + direction.xz *= -1.0; // ( -1, v, -u ) neg x + + } else if ( face == 4.0 ) { + + direction = direction.xzy; + direction.xy *= -1.0; // ( -u, -1, v ) neg y + + } else if ( face == 5.0 ) { + + direction.z *= -1.0; // ( u, v, -1 ) neg z + + } + + return direction; + + } + + void main() { + + vOutputDirection = getDirection( uv, faceIndex ); + gl_Position = vec4( position, 1.0 ); + + } + `; + + } + + function _getEncodings() { + + return /* glsl */` + + uniform int inputEncoding; + uniform int outputEncoding; + + #include + + vec4 inputTexelToLinear( vec4 value ) { + + if ( inputEncoding == 0 ) { + + return value; + + } else if ( inputEncoding == 1 ) { + + return sRGBToLinear( value ); + + } else if ( inputEncoding == 2 ) { + + return RGBEToLinear( value ); + + } else if ( inputEncoding == 3 ) { + + return RGBMToLinear( value, 7.0 ); + + } else if ( inputEncoding == 4 ) { + + return RGBMToLinear( value, 16.0 ); + + } else if ( inputEncoding == 5 ) { + + return RGBDToLinear( value, 256.0 ); + + } else { + + return GammaToLinear( value, 2.2 ); + + } + + } + + vec4 linearToOutputTexel( vec4 value ) { + + if ( outputEncoding == 0 ) { + + return value; + + } else if ( outputEncoding == 1 ) { + + return LinearTosRGB( value ); + + } else if ( outputEncoding == 2 ) { + + return LinearToRGBE( value ); + + } else if ( outputEncoding == 3 ) { + + return LinearToRGBM( value, 7.0 ); + + } else if ( outputEncoding == 4 ) { + + return LinearToRGBM( value, 16.0 ); + + } else if ( outputEncoding == 5 ) { + + return LinearToRGBD( value, 256.0 ); + + } else { + + return LinearToGamma( value, 2.2 ); + + } + + } + + vec4 envMapTexelToLinear( vec4 color ) { + + return inputTexelToLinear( color ); + + } + `; + + } + + function Face4( a, b, c, d, normal, color, materialIndex ) { + + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new Face3( a, b, c, normal, color, materialIndex ); + + } + + const LineStrip = 0; + const LinePieces = 1; + const NoColors = 0; + const FaceColors = 1; + const VertexColors = 2; + + function MeshFaceMaterial( materials ) { + + console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ); + return materials; + + } + + function MultiMaterial( materials = [] ) { + + console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ); + materials.isMultiMaterial = true; + materials.materials = materials; + materials.clone = function () { + + return materials.slice(); + + }; + + return materials; + + } + + function PointCloud( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function Particle( material ) { + + console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' ); + return new Sprite( material ); + + } + + function ParticleSystem( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function PointCloudMaterial( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleBasicMaterial( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleSystemMaterial( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function Vertex( x, y, z ) { + + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + + } + + // + + function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.' ); + return new BufferAttribute( array, itemSize ).setUsage( DynamicDrawUsage ); + + } + + function Int8Attribute( array, itemSize ) { + + console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ); + return new Int8BufferAttribute( array, itemSize ); + + } + + function Uint8Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ); + return new Uint8BufferAttribute( array, itemSize ); + + } + + function Uint8ClampedAttribute( array, itemSize ) { + + console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ); + return new Uint8ClampedBufferAttribute( array, itemSize ); + + } + + function Int16Attribute( array, itemSize ) { + + console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ); + return new Int16BufferAttribute( array, itemSize ); + + } + + function Uint16Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ); + return new Uint16BufferAttribute( array, itemSize ); + + } + + function Int32Attribute( array, itemSize ) { + + console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ); + return new Int32BufferAttribute( array, itemSize ); + + } + + function Uint32Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ); + return new Uint32BufferAttribute( array, itemSize ); + + } + + function Float32Attribute( array, itemSize ) { + + console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ); + return new Float32BufferAttribute( array, itemSize ); + + } + + function Float64Attribute( array, itemSize ) { + + console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ); + return new Float64BufferAttribute( array, itemSize ); + + } + + // + + Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + + }; + + // + + Object.assign( CurvePath.prototype, { + + createPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from path points (for Line or Points objects) + + const pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createSpacedPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from equidistant sampling along the path + + const pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + console.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + const geometry = new Geometry(); + + for ( let i = 0, l = points.length; i < l; i ++ ) { + + const point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + + } ); + + // + + Object.assign( Path.prototype, { + + fromPoints: function ( points ) { + + console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' ); + return this.setFromPoints( points ); + + } + + } ); + + // + + function ClosedSplineCurve3( points ) { + + console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + this.closed = true; + + } + + ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function SplineCurve3( points ) { + + console.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + SplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function Spline( points ) { + + console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + Spline.prototype = Object.create( CatmullRomCurve3.prototype ); + + Object.assign( Spline.prototype, { + + initFromArray: function ( /* a */ ) { + + console.error( 'THREE.Spline: .initFromArray() has been removed.' ); + + }, + getControlPointsArray: function ( /* optionalTarget */ ) { + + console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); + + }, + reparametrizeByArcLength: function ( /* samplingCoef */ ) { + + console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); + + } + + } ); + + // + + function AxisHelper( size ) { + + console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' ); + return new AxesHelper( size ); + + } + + function BoundingBoxHelper( object, color ) { + + console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ); + return new BoxHelper( object, color ); + + } + + function EdgesHelper( object, hex ) { + + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + + }; + + SkeletonHelper.prototype.update = function () { + + console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' ); + + }; + + function WireframeHelper( object, hex ) { + + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + // + + Object.assign( Loader.prototype, { + + extractUrlBase: function ( url ) { + + console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' ); + return LoaderUtils.extractUrlBase( url ); + + } + + } ); + + Loader.Handlers = { + + add: function ( /* regex, loader */ ) { + + console.error( 'THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.' ); + + }, + + get: function ( /* file */ ) { + + console.error( 'THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.' ); + + } + + }; + + function XHRLoader( manager ) { + + console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' ); + return new FileLoader( manager ); + + } + + function BinaryTextureLoader( manager ) { + + console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ); + return new DataTextureLoader( manager ); + + } + + // + + Object.assign( Box2.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Object.assign( Box3.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Object.assign( Sphere.prototype, { + + empty: function () { + + console.warn( 'THREE.Sphere: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + + } ); + + Frustum.prototype.setFromMatrix = function ( m ) { + + console.warn( 'THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().' ); + return this.setFromProjectionMatrix( m ); + + }; + + Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }; + + Object.assign( MathUtils, { + + random16: function () { + + console.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }, + + nearestPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' ); + return MathUtils.floorPowerOfTwo( value ); + + }, + + nextPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' ); + return MathUtils.ceilPowerOfTwo( value ); + + } + + } ); + + Object.assign( Matrix3.prototype, { + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( 'THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' ); + return this.toArray( array, offset ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' ); + + }, + applyToBufferAttribute: function ( attribute ) { + + console.warn( 'THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.' ); + return attribute.applyMatrix3( this ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + + }, + getInverse: function ( matrix ) { + + console.warn( 'THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' ); + return this.copy( matrix ).invert(); + + } + + } ); + + Object.assign( Matrix4.prototype, { + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + flattenToArrayOffset: function ( array, offset ) { + + console.warn( 'THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' ); + return this.toArray( array, offset ); + + }, + getPosition: function () { + + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return new Vector3().setFromMatrixColumn( this, 3 ); + + }, + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + + }, + multiplyToArray: function () { + + console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' ); + + }, + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + + }, + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + translate: function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + rotateX: function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + rotateY: function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + rotateZ: function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + rotateByAxis: function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + applyToBufferAttribute: function ( attribute ) { + + console.warn( 'THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.' ); + return attribute.applyMatrix4( this ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + + }, + makeFrustum: function ( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + + }, + getInverse: function ( matrix ) { + + console.warn( 'THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' ); + return this.copy( matrix ).invert(); + + } + + } ); + + Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + + }; + + Object.assign( Quaternion.prototype, { + + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }, + inverse: function ( ) { + + console.warn( 'THREE.Quaternion: .inverse() has been renamed to invert().' ); + return this.invert(); + + } + + } ); + + Object.assign( Ray.prototype, { + + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionPlane: function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + } + + } ); + + Object.assign( Triangle.prototype, { + + area: function () { + + console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' ); + return this.getArea(); + + }, + barycoordFromPoint: function ( point, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return this.getBarycoord( point, target ); + + }, + midpoint: function ( target ) { + + console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' ); + return this.getMidpoint( target ); + + }, + normal: function ( target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return this.getNormal( target ); + + }, + plane: function ( target ) { + + console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' ); + return this.getPlane( target ); + + } + + } ); + + Object.assign( Triangle, { + + barycoordFromPoint: function ( point, a, b, c, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return Triangle.getBarycoord( point, a, b, c, target ); + + }, + normal: function ( a, b, c, target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return Triangle.getNormal( a, b, c, target ); + + } + + } ); + + Object.assign( Shape.prototype, { + + extractAllPoints: function ( divisions ) { + + console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' ); + return this.extractPoints( divisions ); + + }, + extrude: function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + + }, + makeGeometry: function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + + } + + } ); + + Object.assign( Vector2.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + Object.assign( Vector3.prototype, { + + setEulerFromRotationMatrix: function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + setEulerFromQuaternion: function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + + }, + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + + }, + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + + }, + applyProjection: function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + + }, + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + Object.assign( Vector4.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + // + + Object.assign( Geometry.prototype, { + + computeTangents: function () { + + console.error( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }, + computeLineDistances: function () { + + console.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' ); + + }, + applyMatrix: function ( matrix ) { + + console.warn( 'THREE.Geometry: .applyMatrix() has been renamed to .applyMatrix4().' ); + return this.applyMatrix4( matrix ); + + } + + } ); + + Object.assign( Object3D.prototype, { + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + renderDepth: function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + }, + getWorldRotation: function () { + + console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' ); + + }, + applyMatrix: function ( matrix ) { + + console.warn( 'THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().' ); + return this.applyMatrix4( matrix ); + + } + + } ); + + Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + + } ); + + Object.assign( Mesh.prototype, { + + setDrawMode: function () { + + console.error( 'THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' ); + + }, + + } ); + + Object.defineProperties( Mesh.prototype, { + + drawMode: { + get: function () { + + console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.' ); + return TrianglesDrawMode; + + }, + set: function () { + + console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' ); + + } + } + + } ); + + Object.defineProperties( LOD.prototype, { + + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + + } ); + + Object.defineProperty( Skeleton.prototype, 'useVertexTexture', { + + get: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + } + + } ); + + SkinnedMesh.prototype.initBones = function () { + + console.error( 'THREE.SkinnedMesh: initBones() has been removed.' ); + + }; + + Object.defineProperty( Curve.prototype, '__arcLengthDivisions', { + + get: function () { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + return this.arcLengthDivisions; + + }, + set: function ( value ) { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + this.arcLengthDivisions = value; + + } + + } ); + + // + + PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( 'THREE.PerspectiveCamera.setLens is deprecated. ' + + 'Use .setFocalLength and .filmGauge for a photographic setup.' ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + + }; + + // + + Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } + } ); + + // + + Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + }, + dynamic: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' ); + return this.usage === DynamicDrawUsage; + + }, + set: function ( /* value */ ) { + + console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' ); + this.setUsage( DynamicDrawUsage ); + + } + } + + } ); + + Object.assign( BufferAttribute.prototype, { + setDynamic: function ( value ) { + + console.warn( 'THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.' ); + this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage ); + return this; + + }, + copyIndicesArray: function ( /* indices */ ) { + + console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' ); + + }, + setArray: function ( /* array */ ) { + + console.error( 'THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' ); + + } + } ); + + Object.assign( BufferGeometry.prototype, { + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + addAttribute: function ( name, attribute ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().' ); + + if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + return this.setAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return this; + + } + + return this.setAttribute( name, attribute ); + + }, + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + computeOffsets: function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + + }, + removeAttribute: function ( name ) { + + console.warn( 'THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().' ); + + return this.deleteAttribute( name ); + + }, + applyMatrix: function ( matrix ) { + + console.warn( 'THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().' ); + return this.applyMatrix4( matrix ); + + } + + } ); + + Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + + } ); + + Object.defineProperties( InstancedBufferGeometry.prototype, { + + maxInstancedCount: { + get: function () { + + console.warn( 'THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.' ); + return this.instanceCount; + + }, + set: function ( value ) { + + console.warn( 'THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.' ); + this.instanceCount = value; + + } + } + + } ); + + Object.defineProperties( Raycaster.prototype, { + + linePrecision: { + get: function () { + + console.warn( 'THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.' ); + return this.params.Line.threshold; + + }, + set: function ( value ) { + + console.warn( 'THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.' ); + this.params.Line.threshold = value; + + } + } + + } ); + + Object.defineProperties( InterleavedBuffer.prototype, { + + dynamic: { + get: function () { + + console.warn( 'THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.' ); + return this.usage === DynamicDrawUsage; + + }, + set: function ( value ) { + + console.warn( 'THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.' ); + this.setUsage( value ); + + } + } + + } ); + + Object.assign( InterleavedBuffer.prototype, { + setDynamic: function ( value ) { + + console.warn( 'THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.' ); + this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage ); + return this; + + }, + setArray: function ( /* array */ ) { + + console.error( 'THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' ); + + } + } ); + + // + + Object.assign( ExtrudeBufferGeometry.prototype, { + + getArrays: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' ); + + }, + + addShapeList: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' ); + + }, + + addShape: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' ); + + } + + } ); + + // + + Object.assign( Scene.prototype, { + + dispose: function () { + + console.error( 'THREE.Scene: .dispose() has been removed.' ); + + } + + } ); + + // + + Object.defineProperties( Uniform.prototype, { + + dynamic: { + set: function () { + + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + + } + }, + onUpdate: { + value: function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + + } + } + + } ); + + // + + Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + } + }, + + overdraw: { + get: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + } + }, + + wrapRGB: { + get: function () { + + console.warn( 'THREE.Material: .wrapRGB has been removed.' ); + return new Color(); + + } + }, + + shading: { + get: function () { + + console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + + }, + set: function ( value ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( value === FlatShading ); + + } + }, + + stencilMask: { + get: function () { + + console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' ); + return this.stencilFuncMask; + + }, + set: function ( value ) { + + console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' ); + this.stencilFuncMask = value; + + } + } + + } ); + + Object.defineProperties( MeshPhongMaterial.prototype, { + + metal: { + get: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + + } + } + + } ); + + Object.defineProperties( MeshPhysicalMaterial.prototype, { + + transparency: { + get: function () { + + console.warn( 'THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission.' ); + return this.transmission; + + }, + set: function ( value ) { + + console.warn( 'THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission.' ); + this.transmission = value; + + } + } + + } ); + + Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + + } ); + + // + + Object.assign( WebGLRenderer.prototype, { + + clearTarget: function ( renderTarget, color, depth, stencil ) { + + console.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' ); + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }, + animate: function ( callback ) { + + console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' ); + this.setAnimationLoop( callback ); + + }, + getCurrentRenderTarget: function () { + + console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); + return this.getRenderTarget(); + + }, + getMaxAnisotropy: function () { + + console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' ); + return this.capabilities.getMaxAnisotropy(); + + }, + getPrecision: function () { + + console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' ); + return this.capabilities.precision; + + }, + resetGLState: function () { + + console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' ); + return this.state.reset(); + + }, + supportsFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + + }, + supportsHalfFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + + }, + supportsStandardDerivatives: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + + }, + supportsCompressedTextureS3TC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }, + supportsCompressedTexturePVRTC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }, + supportsBlendMinMax: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + + }, + supportsVertexTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + + }, + supportsInstancedArrays: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + + }, + enableScissorTest: function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + + }, + initMaterial: function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }, + addPrePlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }, + addPostPlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }, + updateShadowMap: function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + }, + setFaceCulling: function () { + + console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' ); + + }, + allocTextureUnit: function () { + + console.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' ); + + }, + setTexture: function () { + + console.warn( 'THREE.WebGLRenderer: .setTexture() has been removed.' ); + + }, + setTexture2D: function () { + + console.warn( 'THREE.WebGLRenderer: .setTexture2D() has been removed.' ); + + }, + setTextureCube: function () { + + console.warn( 'THREE.WebGLRenderer: .setTextureCube() has been removed.' ); + + }, + getActiveMipMapLevel: function () { + + console.warn( 'THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().' ); + return this.getActiveMipmapLevel(); + + } + + } ); + + Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* value */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + + } + }, + context: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.' ); + return this.getContext(); + + } + }, + vr: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .vr has been renamed to .xr' ); + return this.xr; + + } + }, + gammaInput: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' ); + + } + }, + gammaOutput: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' ); + return false; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' ); + this.outputEncoding = ( value === true ) ? sRGBEncoding : LinearEncoding; + + } + }, + toneMappingWhitePoint: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' ); + return 1.0; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' ); + + } + }, + + } ); + + Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* cullFace */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderReverseSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderSingleSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + + } + } + + } ); + + function WebGLRenderTargetCube( width, height, options ) { + + console.warn( 'THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).' ); + return new WebGLCubeRenderTarget( width, options ); + + } + + // + + Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + + } ); + + // + + Object.defineProperties( Audio.prototype, { + + load: { + value: function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + const scope = this; + const audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + + } + }, + startTime: { + set: function () { + + console.warn( 'THREE.Audio: .startTime is now .play( delay ).' ); + + } + } + + } ); + + AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + + }; + + // + + CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) { + + console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' ); + return this.update( renderer, scene ); + + }; + + CubeCamera.prototype.clear = function ( renderer, color, depth, stencil ) { + + console.warn( 'THREE.CubeCamera: .clear() is now .renderTarget.clear().' ); + return this.renderTarget.clear( renderer, color, depth, stencil ); + + }; + + // + + const GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + let matrix; + + if ( geometry2.isMesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + + }; + + ImageUtils.crossOrigin = undefined; + + ImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + const loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + const texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }; + + ImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + const loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + const texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }; + + ImageUtils.loadCompressedTexture = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + + }; + + ImageUtils.loadCompressedTextureCube = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + + }; + + // + + function CanvasRenderer() { + + console.error( 'THREE.CanvasRenderer has been removed' ); + + } + + // + + function JSONLoader() { + + console.error( 'THREE.JSONLoader has been removed.' ); + + } + + // + + const SceneUtils = { + + createMultiMaterialObject: function ( /* geometry, materials */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); + + }, + + detach: function ( /* child, parent, scene */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); + + }, + + attach: function ( /* child, scene, parent */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); + + } + + }; + + // + + function LensFlare() { + + console.error( 'THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js' ); + + } + + if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + /* eslint-disable no-undef */ + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: { + revision: REVISION, + } } ) ); + /* eslint-enable no-undef */ + + } + + class PathAnimation{ + + constructor(path, start, end, speed, callback){ + this.path = path; + this.length = this.path.spline.getLength(); + this.speed = speed; + this.callback = callback; + this.tween = null; + this.startPoint = Math.max(start, 0); + this.endPoint = Math.min(end, this.length); + this.t = 0.0; + } + + start(resume = false){ + if(this.tween){ + this.tween.stop(); + this.tween = null; + } + + let tStart; + if(resume){ + tStart = this.t; + }else { + tStart = this.startPoint / this.length; + } + let tEnd = this.endPoint / this.length; + let animationDuration = (tEnd - tStart) * this.length * 1000 / this.speed; + + let progress = {t: tStart}; + this.tween = new TWEEN.Tween(progress).to({t: tEnd}, animationDuration); + this.tween.easing(TWEEN.Easing.Linear.None); + this.tween.onUpdate((e) => { + this.t = progress.t; + this.callback(progress.t); + }); + this.tween.onComplete(() => { + if(this.repeat){ + this.start(); + } + }); + + setTimeout(() => { + this.tween.start(); + }, 0); + } + + stop(){ + if(!this.tween){ + return; + } + this.tween.stop(); + this.tween = null; + this.t = 0; + } + + pause(){ + if(!this.tween){ + return; + } + + this.tween.stop(); + TWEEN.remove(this.tween); + this.tween = null; + } + + resume(){ + this.start(true); + } + + getPoint(t){ + return this.path.spline.getPoint(t); + } + + } + + class AnimationPath{ + constructor (points = []) { + this.points = points; + this.spline = new CatmullRomCurve3(points); + //this.spline.reparametrizeByArcLength(1 / this.spline.getLength().total); + } + + get (t) { + return this.spline.getPoint(t); + } + + getLength () { + return this.spline.getLength(); + } + + animate (start, end, speed, callback) { + let animation = new PathAnimation(this, start, end, speed, callback); + animation.start(); + + return animation; + } + + pause () { + if (this.tween) { + this.tween.stop(); + } + } + + resume () { + if (this.tween) { + this.tween.start(); + } + } + + getGeometry () { + let geometry = new Geometry(); + + let samples = 500; + let i = 0; + for (let u = 0; u <= 1; u += 1 / samples) { + let position = this.spline.getPoint(u); + geometry.vertices[i] = new Vector3(position.x, position.y, position.z); + + i++; + } + + if(this.closed){ + let position = this.spline.getPoint(0); + geometry.vertices[i] = new Vector3(position.x, position.y, position.z); + } + + return geometry; + } + + get closed(){ + return this.spline.closed; + } + + set closed(value){ + this.spline.closed = value; + } + + } + + const XHRFactory = { + config: { + withCredentials: false, + customHeaders: [ + { header: null, value: null } + ] + }, + + createXMLHttpRequest: function () { + let xhr = new XMLHttpRequest(); + + if (this.config.customHeaders && + Array.isArray(this.config.customHeaders) && + this.config.customHeaders.length > 0) { + let baseOpen = xhr.open; + let customHeaders = this.config.customHeaders; + xhr.open = function () { + baseOpen.apply(this, [].slice.call(arguments)); + customHeaders.forEach(function (customHeader) { + if (!!customHeader.header && !!customHeader.value) { + xhr.setRequestHeader(customHeader.header, customHeader.value); + } + }); + }; + } + + return xhr; + } + }; + + class TextSprite extends Object3D{ + + constructor(text){ + super(); + + let texture = new Texture(); + texture.minFilter = LinearFilter; + texture.magFilter = LinearFilter; + let spriteMaterial = new SpriteMaterial({ + map: texture, + depthTest: false, + depthWrite: false}); + + this.texture = texture; + + this.material = spriteMaterial; + //this.material = getRawMaterial(texture); + this.sprite = new Sprite(this.material); + this.add(this.sprite); + + this.borderThickness = 4; + this.fontface = 'Arial'; + this.fontsize = 28; + this.borderColor = { r: 0, g: 0, b: 0, a: 1.0 }; + this.backgroundColor = { r: 255, g: 255, b: 255, a: 1.0 }; + this.textColor = {r: 255, g: 255, b: 255, a: 1.0}; + this.text = ''; + + this.setText(text); + } + + setText(text){ + if (this.text !== text){ + this.text = text; + + this.update(); + } + } + + setTextColor(color){ + this.textColor = color; + + this.update(); + } + + setBorderColor(color){ + this.borderColor = color; + + this.update(); + } + + setBackgroundColor(color){ + this.backgroundColor = color; + + this.update(); + } + + update(){ + let canvas = document.createElement('canvas'); + let context = canvas.getContext('2d'); + context.font = 'Bold ' + this.fontsize + 'px ' + this.fontface; + + // get size data (height depends only on font size) + let metrics = context.measureText(this.text); + let textWidth = metrics.width; + let margin = 5; + let spriteWidth = 2 * margin + textWidth + 2 * this.borderThickness; + let spriteHeight = this.fontsize * 1.4 + 2 * this.borderThickness; + + context.canvas.width = spriteWidth; + context.canvas.height = spriteHeight; + context.font = 'Bold ' + this.fontsize + 'px ' + this.fontface; + + // background color + context.fillStyle = 'rgba(' + this.backgroundColor.r + ',' + this.backgroundColor.g + ',' + + this.backgroundColor.b + ',' + this.backgroundColor.a + ')'; + // border color + context.strokeStyle = 'rgba(' + this.borderColor.r + ',' + this.borderColor.g + ',' + + this.borderColor.b + ',' + this.borderColor.a + ')'; + + context.lineWidth = this.borderThickness; + this.roundRect(context, this.borderThickness / 2, this.borderThickness / 2, + textWidth + this.borderThickness + 2 * margin, this.fontsize * 1.4 + this.borderThickness, 6); + + // text color + context.strokeStyle = 'rgba(0, 0, 0, 1.0)'; + context.strokeText(this.text, this.borderThickness + margin, this.fontsize + this.borderThickness); + + context.fillStyle = 'rgba(' + this.textColor.r + ',' + this.textColor.g + ',' + + this.textColor.b + ',' + this.textColor.a + ')'; + context.fillText(this.text, this.borderThickness + margin, this.fontsize + this.borderThickness); + + let texture = new Texture(canvas); + texture.minFilter = LinearFilter; + texture.magFilter = LinearFilter; + texture.needsUpdate = true; + //this.material.needsUpdate = true; + + // { // screen-space sprite + // let [screenWidth, screenHeight] = [1620, 937]; + + // let uniforms = this.sprite.material.uniforms; + // let aspect = spriteHeight / spriteWidth; + // let factor = 0.5; + + // let w = spriteWidth / screenWidth; + // let h = spriteHeight / screenHeight; + + // uniforms.uScale.value = [2 * w, 2 * h]; + // //uniforms.uScale.value = [factor * 1, factor * aspect]; + // this.sprite.material.uniforms.map.value = texture; + // } + + this.sprite.material.map = texture; + this.texture = texture; + + this.sprite.scale.set(spriteWidth * 0.01, spriteHeight * 0.01, 1.0); + } + + roundRect(ctx, x, y, w, h, r){ + ctx.beginPath(); + ctx.moveTo(x + r, y); + ctx.lineTo(x + w - r, y); + ctx.quadraticCurveTo(x + w, y, x + w, y + r); + ctx.lineTo(x + w, y + h - r); + ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h); + ctx.lineTo(x + r, y + h); + ctx.quadraticCurveTo(x, y + h, x, y + h - r); + ctx.lineTo(x, y + r); + ctx.quadraticCurveTo(x, y, x + r, y); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + + } + + class Volume extends Object3D { + constructor (args = {}) { + super(); + + if(this.constructor.name === "Volume"){ + console.warn("Can't create object of class Volume directly. Use classes BoxVolume or SphereVolume instead."); + } + + //console.log(this); + //console.log(this.constructor); + //console.log(this.constructor.name); + + this._clip = args.clip || false; + this._visible = true; + this.showVolumeLabel = true; + this._modifiable = args.modifiable || true; + + this.label = new TextSprite('0'); + this.label.setBorderColor({r: 0, g: 255, b: 0, a: 0.0}); + this.label.setBackgroundColor({r: 0, g: 255, b: 0, a: 0.0}); + this.label.material.depthTest = false; + this.label.material.depthWrite = false; + this.label.material.transparent = true; + this.label.position.y -= 0.5; + this.add(this.label); + + this.label.updateMatrixWorld = () => { + let volumeWorldPos = new Vector3(); + volumeWorldPos.setFromMatrixPosition(this.matrixWorld); + this.label.position.copy(volumeWorldPos); + this.label.updateMatrix(); + this.label.matrixWorld.copy(this.label.matrix); + this.label.matrixWorldNeedsUpdate = false; + + for (let i = 0, l = this.label.children.length; i < l; i++) { + this.label.children[ i ].updateMatrixWorld(true); + } + }; + + { // event listeners + this.addEventListener('select', e => {}); + this.addEventListener('deselect', e => {}); + } + + } + + get visible(){ + return this._visible; + } + + set visible(value){ + if(this._visible !== value){ + this._visible = value; + + this.dispatchEvent({type: "visibility_changed", object: this}); + } + } + + getVolume () { + console.warn("override this in subclass"); + } + + update () { + + }; + + raycast (raycaster, intersects) { + + } + + get clip () { + return this._clip; + } + + set clip (value) { + + if(this._clip !== value){ + this._clip = value; + + this.update(); + + this.dispatchEvent({ + type: "clip_changed", + object: this + }); + } + + } + + get modifieable () { + return this._modifiable; + } + + set modifieable (value) { + this._modifiable = value; + + this.update(); + } + }; + + + class BoxVolume extends Volume{ + + constructor(args = {}){ + super(args); + + this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; + this.name = 'box_' + this.constructor.counter; + + let boxGeometry = new BoxGeometry(1, 1, 1); + boxGeometry.computeBoundingBox(); + + let boxFrameGeometry = new Geometry(); + { + let Vector3$1 = Vector3; + + boxFrameGeometry.vertices.push( + + // bottom + new Vector3$1(-0.5, -0.5, 0.5), + new Vector3$1(0.5, -0.5, 0.5), + new Vector3$1(0.5, -0.5, 0.5), + new Vector3$1(0.5, -0.5, -0.5), + new Vector3$1(0.5, -0.5, -0.5), + new Vector3$1(-0.5, -0.5, -0.5), + new Vector3$1(-0.5, -0.5, -0.5), + new Vector3$1(-0.5, -0.5, 0.5), + // top + new Vector3$1(-0.5, 0.5, 0.5), + new Vector3$1(0.5, 0.5, 0.5), + new Vector3$1(0.5, 0.5, 0.5), + new Vector3$1(0.5, 0.5, -0.5), + new Vector3$1(0.5, 0.5, -0.5), + new Vector3$1(-0.5, 0.5, -0.5), + new Vector3$1(-0.5, 0.5, -0.5), + new Vector3$1(-0.5, 0.5, 0.5), + // sides + new Vector3$1(-0.5, -0.5, 0.5), + new Vector3$1(-0.5, 0.5, 0.5), + new Vector3$1(0.5, -0.5, 0.5), + new Vector3$1(0.5, 0.5, 0.5), + new Vector3$1(0.5, -0.5, -0.5), + new Vector3$1(0.5, 0.5, -0.5), + new Vector3$1(-0.5, -0.5, -0.5), + new Vector3$1(-0.5, 0.5, -0.5), + + ); + + } + + this.material = new MeshBasicMaterial({ + color: 0x00ff00, + transparent: true, + opacity: 0.3, + depthTest: true, + depthWrite: false}); + this.box = new Mesh(boxGeometry, this.material); + this.box.geometry.computeBoundingBox(); + this.boundingBox = this.box.geometry.boundingBox; + this.add(this.box); + + this.frame = new LineSegments(boxFrameGeometry, new LineBasicMaterial({color: 0x000000})); + // this.frame.mode = THREE.Lines; + this.add(this.frame); + + this.update(); + } + + update(){ + this.boundingBox = this.box.geometry.boundingBox; + this.boundingSphere = this.boundingBox.getBoundingSphere(new Sphere()); + + if (this._clip) { + this.box.visible = false; + this.label.visible = false; + } else { + this.box.visible = true; + this.label.visible = this.showVolumeLabel; + } + } + + raycast (raycaster, intersects) { + let is = []; + this.box.raycast(raycaster, is); + + if (is.length > 0) { + let I = is[0]; + intersects.push({ + distance: I.distance, + object: this, + point: I.point.clone() + }); + } + } + + getVolume(){ + return Math.abs(this.scale.x * this.scale.y * this.scale.z); + } + + }; + + class SphereVolume extends Volume{ + + constructor(args = {}){ + super(args); + + this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; + this.name = 'sphere_' + this.constructor.counter; + + let sphereGeometry = new SphereGeometry(1, 32, 32); + sphereGeometry.computeBoundingBox(); + + this.material = new MeshBasicMaterial({ + color: 0x00ff00, + transparent: true, + opacity: 0.3, + depthTest: true, + depthWrite: false}); + this.sphere = new Mesh(sphereGeometry, this.material); + this.sphere.visible = false; + this.sphere.geometry.computeBoundingBox(); + this.boundingBox = this.sphere.geometry.boundingBox; + this.add(this.sphere); + + this.label.visible = false; + + + let frameGeometry = new Geometry(); + { + let steps = 64; + let uSegments = 8; + let vSegments = 5; + let r = 1; + + for(let uSegment = 0; uSegment < uSegments; uSegment++){ + + let alpha = (uSegment / uSegments) * Math.PI * 2; + let dirx = Math.cos(alpha); + let diry = Math.sin(alpha); + + for(let i = 0; i <= steps; i++){ + let v = (i / steps) * Math.PI * 2; + let vNext = v + 2 * Math.PI / steps; + + let height = Math.sin(v); + let xyAmount = Math.cos(v); + + let heightNext = Math.sin(vNext); + let xyAmountNext = Math.cos(vNext); + + let vertex = new Vector3(dirx * xyAmount, diry * xyAmount, height); + frameGeometry.vertices.push(vertex); + + let vertexNext = new Vector3(dirx * xyAmountNext, diry * xyAmountNext, heightNext); + frameGeometry.vertices.push(vertexNext); + } + } + + // creates rings at poles, just because it's easier to implement + for(let vSegment = 0; vSegment <= vSegments + 1; vSegment++){ + + //let height = (vSegment / (vSegments + 1)) * 2 - 1; // -1 to 1 + let uh = (vSegment / (vSegments + 1)); // -1 to 1 + uh = (1 - uh) * (-Math.PI / 2) + uh *(Math.PI / 2); + let height = Math.sin(uh); + + console.log(uh, height); + + for(let i = 0; i <= steps; i++){ + let u = (i / steps) * Math.PI * 2; + let uNext = u + 2 * Math.PI / steps; + + let dirx = Math.cos(u); + let diry = Math.sin(u); + + let dirxNext = Math.cos(uNext); + let diryNext = Math.sin(uNext); + + let xyAmount = Math.sqrt(1 - height * height); + + let vertex = new Vector3(dirx * xyAmount, diry * xyAmount, height); + frameGeometry.vertices.push(vertex); + + let vertexNext = new Vector3(dirxNext * xyAmount, diryNext * xyAmount, height); + frameGeometry.vertices.push(vertexNext); + } + } + } + + this.frame = new LineSegments(frameGeometry, new LineBasicMaterial({color: 0x000000})); + this.add(this.frame); + + let frameMaterial = new MeshBasicMaterial({wireframe: true, color: 0x000000}); + this.frame = new Mesh(sphereGeometry, frameMaterial); + //this.add(this.frame); + + //this.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: 0x000000})); + // this.frame.mode = THREE.Lines; + //this.add(this.frame); + + this.update(); + } + + update(){ + this.boundingBox = this.sphere.geometry.boundingBox; + this.boundingSphere = this.boundingBox.getBoundingSphere(new Sphere()); + + //if (this._clip) { + // this.sphere.visible = false; + // this.label.visible = false; + //} else { + // this.sphere.visible = true; + // this.label.visible = this.showVolumeLabel; + //} + } + + raycast (raycaster, intersects) { + let is = []; + this.sphere.raycast(raycaster, is); + + if (is.length > 0) { + let I = is[0]; + intersects.push({ + distance: I.distance, + object: this, + point: I.point.clone() + }); + } + } + + // see https://en.wikipedia.org/wiki/Ellipsoid#Volume + getVolume(){ + return (4 / 3) * Math.PI * this.scale.x * this.scale.y * this.scale.z; + } + + }; + + class Profile extends Object3D{ + + constructor () { + super(); + + this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; + + this.name = 'Profile_' + this.constructor.counter; + this.points = []; + this.spheres = []; + this.edges = []; + this.boxes = []; + this.width = 1; + this.height = 20; + this._modifiable = true; + + this.sphereGeometry = new SphereGeometry(0.4, 10, 10); + this.color = new Color(0xff0000); + this.lineColor = new Color(0xff0000); + } + + createSphereMaterial () { + let sphereMaterial = new MeshLambertMaterial({ + //shading: THREE.SmoothShading, + color: 0xff0000, + depthTest: false, + depthWrite: false} + ); + + return sphereMaterial; + }; + + getSegments () { + let segments = []; + + for (let i = 0; i < this.points.length - 1; i++) { + let start = this.points[i].clone(); + let end = this.points[i + 1].clone(); + segments.push({start: start, end: end}); + } + + return segments; + } + + getSegmentMatrices () { + let segments = this.getSegments(); + let matrices = []; + + for (let segment of segments) { + let {start, end} = segment; + + let box = new Object3D(); + + let length = start.clone().setZ(0).distanceTo(end.clone().setZ(0)); + box.scale.set(length, 10000, this.width); + box.up.set(0, 0, 1); + + let center = new Vector3().addVectors(start, end).multiplyScalar(0.5); + let diff = new Vector3().subVectors(end, start); + let target = new Vector3(diff.y, -diff.x, 0); + + box.position.set(0, 0, 0); + box.lookAt(target); + box.position.copy(center); + + box.updateMatrixWorld(); + matrices.push(box.matrixWorld); + } + + return matrices; + } + + addMarker (point) { + this.points.push(point); + + let sphere = new Mesh(this.sphereGeometry, this.createSphereMaterial()); + + this.add(sphere); + this.spheres.push(sphere); + + // edges & boxes + if (this.points.length > 1) { + let lineGeometry = new Geometry(); + lineGeometry.vertices.push(new Vector3(), new Vector3()); + lineGeometry.colors.push(this.lineColor, this.lineColor, this.lineColor); + let lineMaterial = new LineBasicMaterial({ + vertexColors: VertexColors, + linewidth: 2, + transparent: true, + opacity: 0.4 + }); + lineMaterial.depthTest = false; + let edge = new Line(lineGeometry, lineMaterial); + edge.visible = false; + + this.add(edge); + this.edges.push(edge); + + let boxGeometry = new BoxGeometry(1, 1, 1); + let boxMaterial = new MeshBasicMaterial({color: 0xff0000, transparent: true, opacity: 0.2}); + let box = new Mesh(boxGeometry, boxMaterial); + box.visible = false; + + this.add(box); + this.boxes.push(box); + } + + { // event listeners + let drag = (e) => { + let I = Utils.getMousePointCloudIntersection( + e.drag.end, + e.viewer.scene.getActiveCamera(), + e.viewer, + e.viewer.scene.pointclouds); + + if (I) { + let i = this.spheres.indexOf(e.drag.object); + if (i !== -1) { + this.setPosition(i, I.location); + //this.dispatchEvent({ + // 'type': 'marker_moved', + // 'profile': this, + // 'index': i + //}); + } + } + }; + + let drop = e => { + let i = this.spheres.indexOf(e.drag.object); + if (i !== -1) { + this.dispatchEvent({ + 'type': 'marker_dropped', + 'profile': this, + 'index': i + }); + } + }; + + let mouseover = (e) => e.object.material.emissive.setHex(0x888888); + let mouseleave = (e) => e.object.material.emissive.setHex(0x000000); + + sphere.addEventListener('drag', drag); + sphere.addEventListener('drop', drop); + sphere.addEventListener('mouseover', mouseover); + sphere.addEventListener('mouseleave', mouseleave); + } + + let event = { + type: 'marker_added', + profile: this, + sphere: sphere + }; + this.dispatchEvent(event); + + this.setPosition(this.points.length - 1, point); + } + + removeMarker (index) { + this.points.splice(index, 1); + + this.remove(this.spheres[index]); + + let edgeIndex = (index === 0) ? 0 : (index - 1); + this.remove(this.edges[edgeIndex]); + this.edges.splice(edgeIndex, 1); + this.remove(this.boxes[edgeIndex]); + this.boxes.splice(edgeIndex, 1); + + this.spheres.splice(index, 1); + + this.update(); + + this.dispatchEvent({ + 'type': 'marker_removed', + 'profile': this + }); + } + + setPosition (index, position) { + let point = this.points[index]; + point.copy(position); + + let event = { + type: 'marker_moved', + profile: this, + index: index, + position: point.clone() + }; + this.dispatchEvent(event); + + this.update(); + } + + setWidth (width) { + this.width = width; + + let event = { + type: 'width_changed', + profile: this, + width: width + }; + this.dispatchEvent(event); + + this.update(); + } + + getWidth () { + return this.width; + } + + update () { + if (this.points.length === 0) { + return; + } else if (this.points.length === 1) { + let point = this.points[0]; + this.spheres[0].position.copy(point); + + return; + } + + let min = this.points[0].clone(); + let max = this.points[0].clone(); + let centroid = new Vector3(); + let lastIndex = this.points.length - 1; + for (let i = 0; i <= lastIndex; i++) { + let point = this.points[i]; + let sphere = this.spheres[i]; + let leftIndex = (i === 0) ? lastIndex : i - 1; + // let rightIndex = (i === lastIndex) ? 0 : i + 1; + let leftVertex = this.points[leftIndex]; + // let rightVertex = this.points[rightIndex]; + let leftEdge = this.edges[leftIndex]; + let rightEdge = this.edges[i]; + let leftBox = this.boxes[leftIndex]; + // rightBox = this.boxes[i]; + + // let leftEdgeLength = point.distanceTo(leftVertex); + // let rightEdgeLength = point.distanceTo(rightVertex); + // let leftEdgeCenter = new THREE.Vector3().addVectors(leftVertex, point).multiplyScalar(0.5); + // let rightEdgeCenter = new THREE.Vector3().addVectors(point, rightVertex).multiplyScalar(0.5); + + sphere.position.copy(point); + + if (this._modifiable) { + sphere.visible = true; + } else { + sphere.visible = false; + } + + if (leftEdge) { + leftEdge.geometry.vertices[1].copy(point); + leftEdge.geometry.verticesNeedUpdate = true; + leftEdge.geometry.computeBoundingSphere(); + } + + if (rightEdge) { + rightEdge.geometry.vertices[0].copy(point); + rightEdge.geometry.verticesNeedUpdate = true; + rightEdge.geometry.computeBoundingSphere(); + } + + if (leftBox) { + let start = leftVertex; + let end = point; + let length = start.clone().setZ(0).distanceTo(end.clone().setZ(0)); + leftBox.scale.set(length, 1000000, this.width); + leftBox.up.set(0, 0, 1); + + let center = new Vector3().addVectors(start, end).multiplyScalar(0.5); + let diff = new Vector3().subVectors(end, start); + let target = new Vector3(diff.y, -diff.x, 0); + + leftBox.position.set(0, 0, 0); + leftBox.lookAt(target); + leftBox.position.copy(center); + } + + centroid.add(point); + min.min(point); + max.max(point); + } + centroid.multiplyScalar(1 / this.points.length); + + for (let i = 0; i < this.boxes.length; i++) { + let box = this.boxes[i]; + + box.position.z = min.z + (max.z - min.z) / 2; + } + } + + raycast (raycaster, intersects) { + for (let i = 0; i < this.points.length; i++) { + let sphere = this.spheres[i]; + + sphere.raycast(raycaster, intersects); + } + + // recalculate distances because they are not necessarely correct + // for scaled objects. + // see https://github.com/mrdoob/three.js/issues/5827 + // TODO: remove this once the bug has been fixed + for (let i = 0; i < intersects.length; i++) { + let I = intersects[i]; + I.distance = raycaster.ray.origin.distanceTo(I.point); + } + intersects.sort(function (a, b) { return a.distance - b.distance; }); + }; + + get modifiable () { + return this._modifiable; + } + + set modifiable (value) { + this._modifiable = value; + this.update(); + } + + } + + var LineSegmentsGeometry = function () { + + InstancedBufferGeometry.call( this ); + + this.type = 'LineSegmentsGeometry'; + + var positions = [ - 1, 2, 0, 1, 2, 0, - 1, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 0, - 1, - 1, 0, 1, - 1, 0 ]; + var uvs = [ - 1, 2, 1, 2, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 2, 1, - 2 ]; + var index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ]; + + this.setIndex( index ); + this.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + }; + + LineSegmentsGeometry.prototype = Object.assign( Object.create( InstancedBufferGeometry.prototype ), { + + constructor: LineSegmentsGeometry, + + isLineSegmentsGeometry: true, + + applyMatrix4: function ( matrix ) { + + var start = this.attributes.instanceStart; + var end = this.attributes.instanceEnd; + + if ( start !== undefined ) { + + start.applyMatrix4( matrix ); + + end.applyMatrix4( matrix ); + + start.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + setPositions: function ( array ) { + + var lineSegments; + + if ( array instanceof Float32Array ) { + + lineSegments = array; + + } else if ( Array.isArray( array ) ) { + + lineSegments = new Float32Array( array ); + + } + + var instanceBuffer = new InstancedInterleavedBuffer( lineSegments, 6, 1 ); // xyz, xyz + + this.setAttribute( 'instanceStart', new InterleavedBufferAttribute( instanceBuffer, 3, 0 ) ); // xyz + this.setAttribute( 'instanceEnd', new InterleavedBufferAttribute( instanceBuffer, 3, 3 ) ); // xyz + + // + + this.computeBoundingBox(); + this.computeBoundingSphere(); + + return this; + + }, + + setColors: function ( array ) { + + var colors; + + if ( array instanceof Float32Array ) { + + colors = array; + + } else if ( Array.isArray( array ) ) { + + colors = new Float32Array( array ); + + } + + var instanceColorBuffer = new InstancedInterleavedBuffer( colors, 6, 1 ); // rgb, rgb + + this.setAttribute( 'instanceColorStart', new InterleavedBufferAttribute( instanceColorBuffer, 3, 0 ) ); // rgb + this.setAttribute( 'instanceColorEnd', new InterleavedBufferAttribute( instanceColorBuffer, 3, 3 ) ); // rgb + + return this; + + }, + + fromWireframeGeometry: function ( geometry ) { + + this.setPositions( geometry.attributes.position.array ); + + return this; + + }, + + fromEdgesGeometry: function ( geometry ) { + + this.setPositions( geometry.attributes.position.array ); + + return this; + + }, + + fromMesh: function ( mesh ) { + + this.fromWireframeGeometry( new WireframeGeometry( mesh.geometry ) ); + + // set colors, maybe + + return this; + + }, + + fromLineSegments: function ( lineSegments ) { + + var geometry = lineSegments.geometry; + + if ( geometry.isGeometry ) { + + this.setPositions( geometry.vertices ); + + } else if ( geometry.isBufferGeometry ) { + + this.setPositions( geometry.attributes.position.array ); // assumes non-indexed + + } + + // set colors, maybe + + return this; + + }, + + computeBoundingBox: function () { + + var box = new Box3(); + + return function computeBoundingBox() { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var start = this.attributes.instanceStart; + var end = this.attributes.instanceEnd; + + if ( start !== undefined && end !== undefined ) { + + this.boundingBox.setFromBufferAttribute( start ); + + box.setFromBufferAttribute( end ); + + this.boundingBox.union( box ); + + } + + }; + + }(), + + computeBoundingSphere: function () { + + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + if ( this.boundingBox === null ) { + + this.computeBoundingBox(); + + } + + var start = this.attributes.instanceStart; + var end = this.attributes.instanceEnd; + + if ( start !== undefined && end !== undefined ) { + + var center = this.boundingSphere.center; + + this.boundingBox.getCenter( center ); + + var maxRadiusSq = 0; + + for ( var i = 0, il = start.count; i < il; i ++ ) { + + vector.fromBufferAttribute( start, i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + vector.fromBufferAttribute( end, i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + toJSON: function () { + + // todo + + }, + + applyMatrix: function ( matrix ) { + + console.warn( 'THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().' ); + + return this.applyMatrix4( matrix ); + + } + + } ); + + /** + * parameters = { + * color: , + * linewidth: , + * dashed: , + * dashScale: , + * dashSize: , + * dashOffset: , + * gapSize: , + * resolution: , // to be set by renderer + * } + */ + + UniformsLib.line = { + + linewidth: { value: 1 }, + resolution: { value: new Vector2( 1, 1 ) }, + dashScale: { value: 1 }, + dashSize: { value: 1 }, + dashOffset: { value: 0 }, + gapSize: { value: 1 }, // todo FIX - maybe change to totalSize + opacity: { value: 1 } + + }; + + ShaderLib[ 'line' ] = { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.fog, + UniformsLib.line + ] ), + + vertexShader: + ` + #include + #include + #include + #include + #include + + uniform float linewidth; + uniform vec2 resolution; + + attribute vec3 instanceStart; + attribute vec3 instanceEnd; + + attribute vec3 instanceColorStart; + attribute vec3 instanceColorEnd; + + varying vec2 vUv; + + #ifdef USE_DASH + + uniform float dashScale; + attribute float instanceDistanceStart; + attribute float instanceDistanceEnd; + varying float vLineDistance; + + #endif + + void trimSegment( const in vec4 start, inout vec4 end ) { + + // trim end segment so it terminates between the camera plane and the near plane + + // conservative estimate of the near plane + float a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column + float b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column + float nearEstimate = - 0.5 * b / a; + + float alpha = ( nearEstimate - start.z ) / ( end.z - start.z ); + + end.xyz = mix( start.xyz, end.xyz, alpha ); + + } + + void main() { + + #ifdef USE_COLOR + + vColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd; + + #endif + + #ifdef USE_DASH + + vLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd; + + #endif + + float aspect = resolution.x / resolution.y; + + vUv = uv; + + // camera space + vec4 start = modelViewMatrix * vec4( instanceStart, 1.0 ); + vec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 ); + + // special case for perspective projection, and segments that terminate either in, or behind, the camera plane + // clearly the gpu firmware has a way of addressing this issue when projecting into ndc space + // but we need to perform ndc-space calculations in the shader, so we must address this issue directly + // perhaps there is a more elegant solution -- WestLangley + + bool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column + + if ( perspective ) { + + if ( start.z < 0.0 && end.z >= 0.0 ) { + + trimSegment( start, end ); + + } else if ( end.z < 0.0 && start.z >= 0.0 ) { + + trimSegment( end, start ); + + } + + } + + // clip space + vec4 clipStart = projectionMatrix * start; + vec4 clipEnd = projectionMatrix * end; + + // ndc space + vec2 ndcStart = clipStart.xy / clipStart.w; + vec2 ndcEnd = clipEnd.xy / clipEnd.w; + + // direction + vec2 dir = ndcEnd - ndcStart; + + // account for clip-space aspect ratio + dir.x *= aspect; + dir = normalize( dir ); + + // perpendicular to dir + vec2 offset = vec2( dir.y, - dir.x ); + + // undo aspect ratio adjustment + dir.x /= aspect; + offset.x /= aspect; + + // sign flip + if ( position.x < 0.0 ) offset *= - 1.0; + + // endcaps + if ( position.y < 0.0 ) { + + offset += - dir; + + } else if ( position.y > 1.0 ) { + + offset += dir; + + } + + // adjust for linewidth + offset *= linewidth; + + // adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ... + offset /= resolution.y; + + // select end + vec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd; + + // back to clip space + offset *= clip.w; + + clip.xy += offset; + + gl_Position = clip; + + vec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation + + #include + #include + #include + + } + `, + + fragmentShader: + ` + uniform vec3 diffuse; + uniform float opacity; + + #ifdef USE_DASH + + uniform float dashSize; + uniform float dashOffset; + uniform float gapSize; + + #endif + + varying float vLineDistance; + + #include + #include + #include + #include + #include + + varying vec2 vUv; + + void main() { + + #include + + #ifdef USE_DASH + + if ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps + + if ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX + + #endif + + if ( abs( vUv.y ) > 1.0 ) { + + float a = vUv.x; + float b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0; + float len2 = a * a + b * b; + + if ( len2 > 1.0 ) discard; + + } + + vec4 diffuseColor = vec4( diffuse, opacity ); + + #include + #include + + gl_FragColor = vec4( diffuseColor.rgb, diffuseColor.a ); + + #include + #include + #include + #include + + } + ` + }; + + var LineMaterial = function ( parameters ) { + + ShaderMaterial.call( this, { + + type: 'LineMaterial', + + uniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ), + + vertexShader: ShaderLib[ 'line' ].vertexShader, + fragmentShader: ShaderLib[ 'line' ].fragmentShader, + + clipping: true // required for clipping support + + } ); + + this.dashed = false; + + Object.defineProperties( this, { + + color: { + + enumerable: true, + + get: function () { + + return this.uniforms.diffuse.value; + + }, + + set: function ( value ) { + + this.uniforms.diffuse.value = value; + + } + + }, + + linewidth: { + + enumerable: true, + + get: function () { + + return this.uniforms.linewidth.value; + + }, + + set: function ( value ) { + + this.uniforms.linewidth.value = value; + + } + + }, + + dashScale: { + + enumerable: true, + + get: function () { + + return this.uniforms.dashScale.value; + + }, + + set: function ( value ) { + + this.uniforms.dashScale.value = value; + + } + + }, + + dashSize: { + + enumerable: true, + + get: function () { + + return this.uniforms.dashSize.value; + + }, + + set: function ( value ) { + + this.uniforms.dashSize.value = value; + + } + + }, + + dashOffset: { + + enumerable: true, + + get: function () { + + return this.uniforms.dashOffset.value; + + }, + + set: function ( value ) { + + this.uniforms.dashOffset.value = value; + + } + + }, + + gapSize: { + + enumerable: true, + + get: function () { + + return this.uniforms.gapSize.value; + + }, + + set: function ( value ) { + + this.uniforms.gapSize.value = value; + + } + + }, + + opacity: { + + enumerable: true, + + get: function () { + + return this.uniforms.opacity.value; + + }, + + set: function ( value ) { + + this.uniforms.opacity.value = value; + + } + + }, + + resolution: { + + enumerable: true, + + get: function () { + + return this.uniforms.resolution.value; + + }, + + set: function ( value ) { + + this.uniforms.resolution.value.copy( value ); + + } + + } + + } ); + + this.setValues( parameters ); + + }; + + LineMaterial.prototype = Object.create( ShaderMaterial.prototype ); + LineMaterial.prototype.constructor = LineMaterial; + + LineMaterial.prototype.isLineMaterial = true; + + var LineSegments2 = function ( geometry, material ) { + + if ( geometry === undefined ) geometry = new LineSegmentsGeometry(); + if ( material === undefined ) material = new LineMaterial( { color: Math.random() * 0xffffff } ); + + Mesh.call( this, geometry, material ); + + this.type = 'LineSegments2'; + + }; + + LineSegments2.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: LineSegments2, + + isLineSegments2: true, + + computeLineDistances: ( function () { // for backwards-compatability, but could be a method of LineSegmentsGeometry... + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + var instanceStart = geometry.attributes.instanceStart; + var instanceEnd = geometry.attributes.instanceEnd; + var lineDistances = new Float32Array( 2 * instanceStart.data.count ); + + for ( var i = 0, j = 0, l = instanceStart.data.count; i < l; i ++, j += 2 ) { + + start.fromBufferAttribute( instanceStart, i ); + end.fromBufferAttribute( instanceEnd, i ); + + lineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ]; + lineDistances[ j + 1 ] = lineDistances[ j ] + start.distanceTo( end ); + + } + + var instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1 + + geometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0 + geometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1 + + return this; + + }; + + }() ), + + raycast: ( function () { + + var start = new Vector4(); + var end = new Vector4(); + + var ssOrigin = new Vector4(); + var ssOrigin3 = new Vector3(); + var mvMatrix = new Matrix4(); + var line = new Line3(); + var closestPoint = new Vector3(); + + return function raycast( raycaster, intersects ) { + + if ( raycaster.camera === null ) { + + console.error( 'LineSegments2: "Raycaster.camera" needs to be set in order to raycast against LineSegments2.' ); + + } + + var threshold = ( raycaster.params.Line2 !== undefined ) ? raycaster.params.Line2.threshold || 0 : 0; + + var ray = raycaster.ray; + var camera = raycaster.camera; + var projectionMatrix = camera.projectionMatrix; + + var geometry = this.geometry; + var material = this.material; + var resolution = material.resolution; + var lineWidth = material.linewidth + threshold; + + var instanceStart = geometry.attributes.instanceStart; + var instanceEnd = geometry.attributes.instanceEnd; + + // pick a point 1 unit out along the ray to avoid the ray origin + // sitting at the camera origin which will cause "w" to be 0 when + // applying the projection matrix. + ray.at( 1, ssOrigin ); + + // ndc space [ - 1.0, 1.0 ] + ssOrigin.w = 1; + ssOrigin.applyMatrix4( camera.matrixWorldInverse ); + ssOrigin.applyMatrix4( projectionMatrix ); + ssOrigin.multiplyScalar( 1 / ssOrigin.w ); + + // screen space + ssOrigin.x *= resolution.x / 2; + ssOrigin.y *= resolution.y / 2; + ssOrigin.z = 0; + + ssOrigin3.copy( ssOrigin ); + + var matrixWorld = this.matrixWorld; + mvMatrix.multiplyMatrices( camera.matrixWorldInverse, matrixWorld ); + + for ( var i = 0, l = instanceStart.count; i < l; i ++ ) { + + start.fromBufferAttribute( instanceStart, i ); + end.fromBufferAttribute( instanceEnd, i ); + + start.w = 1; + end.w = 1; + + // camera space + start.applyMatrix4( mvMatrix ); + end.applyMatrix4( mvMatrix ); + + // clip space + start.applyMatrix4( projectionMatrix ); + end.applyMatrix4( projectionMatrix ); + + // ndc space [ - 1.0, 1.0 ] + start.multiplyScalar( 1 / start.w ); + end.multiplyScalar( 1 / end.w ); + + // skip the segment if it's outside the camera near and far planes + var isBehindCameraNear = start.z < - 1 && end.z < - 1; + var isPastCameraFar = start.z > 1 && end.z > 1; + if ( isBehindCameraNear || isPastCameraFar ) { + + continue; + + } + + // screen space + start.x *= resolution.x / 2; + start.y *= resolution.y / 2; + + end.x *= resolution.x / 2; + end.y *= resolution.y / 2; + + // create 2d segment + line.start.copy( start ); + line.start.z = 0; + + line.end.copy( end ); + line.end.z = 0; + + // get closest point on ray to segment + var param = line.closestPointToPointParameter( ssOrigin3, true ); + line.at( param, closestPoint ); + + // check if the intersection point is within clip space + var zPos = MathUtils.lerp( start.z, end.z, param ); + var isInClipSpace = zPos >= - 1 && zPos <= 1; + + var isInside = ssOrigin3.distanceTo( closestPoint ) < lineWidth * 0.5; + + if ( isInClipSpace && isInside ) { + + line.start.fromBufferAttribute( instanceStart, i ); + line.end.fromBufferAttribute( instanceEnd, i ); + + line.start.applyMatrix4( matrixWorld ); + line.end.applyMatrix4( matrixWorld ); + + var pointOnLine = new Vector3(); + var point = new Vector3(); + + ray.distanceSqToSegment( line.start, line.end, point, pointOnLine ); + + intersects.push( { + + point: point, + pointOnLine: pointOnLine, + distance: ray.origin.distanceTo( point ), + + object: this, + face: null, + faceIndex: i, + uv: null, + uv2: null, + + } ); + + } + + } + + }; + + }() ) + + } ); + + var LineGeometry = function () { + + LineSegmentsGeometry.call( this ); + + this.type = 'LineGeometry'; + + }; + + LineGeometry.prototype = Object.assign( Object.create( LineSegmentsGeometry.prototype ), { + + constructor: LineGeometry, + + isLineGeometry: true, + + setPositions: function ( array ) { + + // converts [ x1, y1, z1, x2, y2, z2, ... ] to pairs format + + var length = array.length - 3; + var points = new Float32Array( 2 * length ); + + for ( var i = 0; i < length; i += 3 ) { + + points[ 2 * i ] = array[ i ]; + points[ 2 * i + 1 ] = array[ i + 1 ]; + points[ 2 * i + 2 ] = array[ i + 2 ]; + + points[ 2 * i + 3 ] = array[ i + 3 ]; + points[ 2 * i + 4 ] = array[ i + 4 ]; + points[ 2 * i + 5 ] = array[ i + 5 ]; + + } + + LineSegmentsGeometry.prototype.setPositions.call( this, points ); + + return this; + + }, + + setColors: function ( array ) { + + // converts [ r1, g1, b1, r2, g2, b2, ... ] to pairs format + + var length = array.length - 3; + var colors = new Float32Array( 2 * length ); + + for ( var i = 0; i < length; i += 3 ) { + + colors[ 2 * i ] = array[ i ]; + colors[ 2 * i + 1 ] = array[ i + 1 ]; + colors[ 2 * i + 2 ] = array[ i + 2 ]; + + colors[ 2 * i + 3 ] = array[ i + 3 ]; + colors[ 2 * i + 4 ] = array[ i + 4 ]; + colors[ 2 * i + 5 ] = array[ i + 5 ]; + + } + + LineSegmentsGeometry.prototype.setColors.call( this, colors ); + + return this; + + }, + + fromLine: function ( line ) { + + var geometry = line.geometry; + + if ( geometry.isGeometry ) { + + this.setPositions( geometry.vertices ); + + } else if ( geometry.isBufferGeometry ) { + + this.setPositions( geometry.attributes.position.array ); // assumes non-indexed + + } + + // set colors, maybe + + return this; + + }, + + copy: function ( /* source */ ) { + + // todo + + return this; + + } + + } ); + + var Line2 = function ( geometry, material ) { + + if ( geometry === undefined ) geometry = new LineGeometry(); + if ( material === undefined ) material = new LineMaterial( { color: Math.random() * 0xffffff } ); + + LineSegments2.call( this, geometry, material ); + + this.type = 'Line2'; + + }; + + Line2.prototype = Object.assign( Object.create( LineSegments2.prototype ), { + + constructor: Line2, + + isLine2: true + + } ); + + function createHeightLine(){ + let lineGeometry = new LineGeometry(); + + lineGeometry.setPositions([ + 0, 0, 0, + 0, 0, 0, + ]); + + let lineMaterial = new LineMaterial({ + color: 0x00ff00, + dashSize: 5, + gapSize: 2, + linewidth: 2, + resolution: new Vector2(1000, 1000), + }); + + lineMaterial.depthTest = false; + const heightEdge = new Line2(lineGeometry, lineMaterial); + heightEdge.visible = false; + + //this.add(this.heightEdge); + + return heightEdge; + } + + function createHeightLabel(){ + const heightLabel = new TextSprite(''); + + heightLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0}); + heightLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); + heightLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); + heightLabel.fontsize = 16; + heightLabel.material.depthTest = false; + heightLabel.material.opacity = 1; + heightLabel.visible = false; + + return heightLabel; + } + + function createAreaLabel(){ + const areaLabel = new TextSprite(''); + + areaLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0}); + areaLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); + areaLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); + areaLabel.fontsize = 16; + areaLabel.material.depthTest = false; + areaLabel.material.opacity = 1; + areaLabel.visible = false; + + return areaLabel; + } + + function createCircleRadiusLabel(){ + const circleRadiusLabel = new TextSprite(""); + + circleRadiusLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0}); + circleRadiusLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); + circleRadiusLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); + circleRadiusLabel.fontsize = 16; + circleRadiusLabel.material.depthTest = false; + circleRadiusLabel.material.opacity = 1; + circleRadiusLabel.visible = false; + + return circleRadiusLabel; + } + + function createCircleRadiusLine(){ + const lineGeometry = new LineGeometry(); + + lineGeometry.setPositions([ + 0, 0, 0, + 0, 0, 0, + ]); + + const lineMaterial = new LineMaterial({ + color: 0xff0000, + linewidth: 2, + resolution: new Vector2(1000, 1000), + gapSize: 1, + dashed: true, + }); + + lineMaterial.depthTest = false; + + const circleRadiusLine = new Line2(lineGeometry, lineMaterial); + circleRadiusLine.visible = false; + + return circleRadiusLine; + } + + function createCircleLine(){ + const coordinates = []; + + let n = 128; + for(let i = 0; i <= n; i++){ + let u0 = 2 * Math.PI * (i / n); + let u1 = 2 * Math.PI * (i + 1) / n; + + let p0 = new Vector3( + Math.cos(u0), + Math.sin(u0), + 0 + ); + + let p1 = new Vector3( + Math.cos(u1), + Math.sin(u1), + 0 + ); + + coordinates.push( + ...p0.toArray(), + ...p1.toArray(), + ); + } + + const geometry = new LineGeometry(); + geometry.setPositions(coordinates); + + const material = new LineMaterial({ + color: 0xff0000, + dashSize: 5, + gapSize: 2, + linewidth: 2, + resolution: new Vector2(1000, 1000), + }); + + material.depthTest = false; + + const circleLine = new Line2(geometry, material); + circleLine.visible = false; + circleLine.computeLineDistances(); + + return circleLine; + } + + function createCircleCenter(){ + const sg = new SphereGeometry(1, 32, 32); + const sm = new MeshNormalMaterial(); + + const circleCenter = new Mesh(sg, sm); + circleCenter.visible = false; + + return circleCenter; + } + + function createLine(){ + const geometry = new LineGeometry(); + + geometry.setPositions([ + 0, 0, 0, + 0, 0, 0, + ]); + + const material = new LineMaterial({ + color: 0xff0000, + linewidth: 2, + resolution: new Vector2(1000, 1000), + gapSize: 1, + dashed: true, + }); + + material.depthTest = false; + + const line = new Line2(geometry, material); + + return line; + } + + function createCircle(){ + + const coordinates = []; + + let n = 128; + for(let i = 0; i <= n; i++){ + let u0 = 2 * Math.PI * (i / n); + let u1 = 2 * Math.PI * (i + 1) / n; + + let p0 = new Vector3( + Math.cos(u0), + Math.sin(u0), + 0 + ); + + let p1 = new Vector3( + Math.cos(u1), + Math.sin(u1), + 0 + ); + + coordinates.push( + ...p0.toArray(), + ...p1.toArray(), + ); + } + + const geometry = new LineGeometry(); + geometry.setPositions(coordinates); + + const material = new LineMaterial({ + color: 0xff0000, + dashSize: 5, + gapSize: 2, + linewidth: 2, + resolution: new Vector2(1000, 1000), + }); + + material.depthTest = false; + + const line = new Line2(geometry, material); + line.computeLineDistances(); + + return line; + + } + + function createAzimuth(){ + + const azimuth = { + label: null, + center: null, + target: null, + north: null, + centerToNorth: null, + centerToTarget: null, + centerToTargetground: null, + targetgroundToTarget: null, + circle: null, + + node: null, + }; + + const sg = new SphereGeometry(1, 32, 32); + const sm = new MeshNormalMaterial(); + + { + const label = new TextSprite(""); + + label.setTextColor({r: 140, g: 250, b: 140, a: 1.0}); + label.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); + label.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); + label.fontsize = 16; + label.material.depthTest = false; + label.material.opacity = 1; + + azimuth.label = label; + } + + azimuth.center = new Mesh(sg, sm); + azimuth.target = new Mesh(sg, sm); + azimuth.north = new Mesh(sg, sm); + azimuth.centerToNorth = createLine(); + azimuth.centerToTarget = createLine(); + azimuth.centerToTargetground = createLine(); + azimuth.targetgroundToTarget = createLine(); + azimuth.circle = createCircle(); + + azimuth.node = new Object3D(); + azimuth.node.add( + azimuth.centerToNorth, + azimuth.centerToTarget, + azimuth.centerToTargetground, + azimuth.targetgroundToTarget, + azimuth.circle, + azimuth.label, + azimuth.center, + azimuth.target, + azimuth.north, + ); + + return azimuth; + } + + class Measure extends Object3D { + constructor () { + super(); + + this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; + + this.name = 'Measure_' + this.constructor.counter; + this.points = []; + this._showDistances = true; + this._showCoordinates = false; + this._showArea = false; + this._closed = true; + this._showAngles = false; + this._showCircle = false; + this._showHeight = false; + this._showEdges = true; + this._showAzimuth = false; + this.maxMarkers = Number.MAX_SAFE_INTEGER; + + this.sphereGeometry = new SphereGeometry(0.4, 10, 10); + this.color = new Color(0xff0000); + + this.spheres = []; + this.edges = []; + this.sphereLabels = []; + this.edgeLabels = []; + this.angleLabels = []; + this.coordinateLabels = []; + + this.heightEdge = createHeightLine(); + this.heightLabel = createHeightLabel(); + this.areaLabel = createAreaLabel(); + this.circleRadiusLabel = createCircleRadiusLabel(); + this.circleRadiusLine = createCircleRadiusLine(); + this.circleLine = createCircleLine(); + this.circleCenter = createCircleCenter(); + + this.azimuth = createAzimuth(); + + this.add(this.heightEdge); + this.add(this.heightLabel); + this.add(this.areaLabel); + this.add(this.circleRadiusLabel); + this.add(this.circleRadiusLine); + this.add(this.circleLine); + this.add(this.circleCenter); + + this.add(this.azimuth.node); + + } + + createSphereMaterial () { + let sphereMaterial = new MeshLambertMaterial({ + //shading: THREE.SmoothShading, + color: this.color, + depthTest: false, + depthWrite: false} + ); + + return sphereMaterial; + }; + + addMarker (point) { + if (point.x != null) { + point = {position: point}; + }else if(point instanceof Array){ + point = {position: new Vector3(...point)}; + } + this.points.push(point); + + // sphere + let sphere = new Mesh(this.sphereGeometry, this.createSphereMaterial()); + + this.add(sphere); + this.spheres.push(sphere); + + { // edges + let lineGeometry = new LineGeometry(); + lineGeometry.setPositions( [ + 0, 0, 0, + 0, 0, 0, + ]); + + let lineMaterial = new LineMaterial({ + color: 0xff0000, + linewidth: 2, + resolution: new Vector2(1000, 1000), + }); + + lineMaterial.depthTest = false; + + let edge = new Line2(lineGeometry, lineMaterial); + edge.visible = true; + + this.add(edge); + this.edges.push(edge); + } + + { // edge labels + let edgeLabel = new TextSprite(); + edgeLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); + edgeLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); + edgeLabel.material.depthTest = false; + edgeLabel.visible = false; + edgeLabel.fontsize = 16; + this.edgeLabels.push(edgeLabel); + this.add(edgeLabel); + } + + { // angle labels + let angleLabel = new TextSprite(); + angleLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); + angleLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); + angleLabel.fontsize = 16; + angleLabel.material.depthTest = false; + angleLabel.material.opacity = 1; + angleLabel.visible = false; + this.angleLabels.push(angleLabel); + this.add(angleLabel); + } + + { // coordinate labels + let coordinateLabel = new TextSprite(); + coordinateLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0}); + coordinateLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0}); + coordinateLabel.fontsize = 16; + coordinateLabel.material.depthTest = false; + coordinateLabel.material.opacity = 1; + coordinateLabel.visible = false; + this.coordinateLabels.push(coordinateLabel); + this.add(coordinateLabel); + } + + { // Event Listeners + let drag = (e) => { + let I = Utils.getMousePointCloudIntersection( + e.drag.end, + e.viewer.scene.getActiveCamera(), + e.viewer, + e.viewer.scene.pointclouds, + {pickClipped: true}); + + if (I) { + let i = this.spheres.indexOf(e.drag.object); + if (i !== -1) { + let point = this.points[i]; + + // loop through current keys and cleanup ones that will be orphaned + for (let key of Object.keys(point)) { + if (!I.point[key]) { + delete point[key]; + } + } + + for (let key of Object.keys(I.point).filter(e => e !== 'position')) { + point[key] = I.point[key]; + } + + this.setPosition(i, I.location); + } + } + }; + + let drop = e => { + let i = this.spheres.indexOf(e.drag.object); + if (i !== -1) { + this.dispatchEvent({ + 'type': 'marker_dropped', + 'measurement': this, + 'index': i + }); + } + }; + + let mouseover = (e) => e.object.material.emissive.setHex(0x888888); + let mouseleave = (e) => e.object.material.emissive.setHex(0x000000); + + sphere.addEventListener('drag', drag); + sphere.addEventListener('drop', drop); + sphere.addEventListener('mouseover', mouseover); + sphere.addEventListener('mouseleave', mouseleave); + } + + let event = { + type: 'marker_added', + measurement: this, + sphere: sphere + }; + this.dispatchEvent(event); + + this.setMarker(this.points.length - 1, point); + }; + + removeMarker (index) { + this.points.splice(index, 1); + + this.remove(this.spheres[index]); + + let edgeIndex = (index === 0) ? 0 : (index - 1); + this.remove(this.edges[edgeIndex]); + this.edges.splice(edgeIndex, 1); + + this.remove(this.edgeLabels[edgeIndex]); + this.edgeLabels.splice(edgeIndex, 1); + this.coordinateLabels.splice(index, 1); + + this.remove(this.angleLabels[index]); + this.angleLabels.splice(index, 1); + + this.spheres.splice(index, 1); + + this.update(); + + this.dispatchEvent({type: 'marker_removed', measurement: this}); + }; + + setMarker (index, point) { + this.points[index] = point; + + let event = { + type: 'marker_moved', + measure: this, + index: index, + position: point.position.clone() + }; + this.dispatchEvent(event); + + this.update(); + } + + setPosition (index, position) { + let point = this.points[index]; + point.position.copy(position); + + let event = { + type: 'marker_moved', + measure: this, + index: index, + position: position.clone() + }; + this.dispatchEvent(event); + + this.update(); + }; + + getArea () { + let area = 0; + let j = this.points.length - 1; + + for (let i = 0; i < this.points.length; i++) { + let p1 = this.points[i].position; + let p2 = this.points[j].position; + area += (p2.x + p1.x) * (p1.y - p2.y); + j = i; + } + + return Math.abs(area / 2); + }; + + getTotalDistance () { + if (this.points.length === 0) { + return 0; + } + + let distance = 0; + + for (let i = 1; i < this.points.length; i++) { + let prev = this.points[i - 1].position; + let curr = this.points[i].position; + let d = prev.distanceTo(curr); + + distance += d; + } + + if (this.closed && this.points.length > 1) { + let first = this.points[0].position; + let last = this.points[this.points.length - 1].position; + let d = last.distanceTo(first); + + distance += d; + } + + return distance; + } + + getAngleBetweenLines (cornerPoint, point1, point2) { + let v1 = new Vector3().subVectors(point1.position, cornerPoint.position); + let v2 = new Vector3().subVectors(point2.position, cornerPoint.position); + + // avoid the error printed by threejs if denominator is 0 + const denominator = Math.sqrt( v1.lengthSq() * v2.lengthSq() ); + if(denominator === 0){ + return 0; + }else { + return v1.angleTo(v2); + } + }; + + getAngle (index) { + if (this.points.length < 3 || index >= this.points.length) { + return 0; + } + + let previous = (index === 0) ? this.points[this.points.length - 1] : this.points[index - 1]; + let point = this.points[index]; + let next = this.points[(index + 1) % (this.points.length)]; + + return this.getAngleBetweenLines(point, previous, next); + } + + // updateAzimuth(){ + // // if(this.points.length !== 2){ + // // return; + // // } + + // // const azimuth = this.azimuth; + + // // const [p0, p1] = this.points; + + // // const r = p0.position.distanceTo(p1.position); + + // } + + update () { + if (this.points.length === 0) { + return; + } else if (this.points.length === 1) { + let point = this.points[0]; + let position = point.position; + this.spheres[0].position.copy(position); + + { // coordinate labels + let coordinateLabel = this.coordinateLabels[0]; + + let msg = position.toArray().map(p => Utils.addCommas(p.toFixed(2))).join(" / "); + coordinateLabel.setText(msg); + + coordinateLabel.visible = this.showCoordinates; + } + + return; + } + + let lastIndex = this.points.length - 1; + + let centroid = new Vector3(); + for (let i = 0; i <= lastIndex; i++) { + let point = this.points[i]; + centroid.add(point.position); + } + centroid.divideScalar(this.points.length); + + for (let i = 0; i <= lastIndex; i++) { + let index = i; + let nextIndex = (i + 1 > lastIndex) ? 0 : i + 1; + let previousIndex = (i === 0) ? lastIndex : i - 1; + + let point = this.points[index]; + let nextPoint = this.points[nextIndex]; + let previousPoint = this.points[previousIndex]; + + let sphere = this.spheres[index]; + + // spheres + sphere.position.copy(point.position); + sphere.material.color = this.color; + + { // edges + let edge = this.edges[index]; + + edge.material.color = this.color; + + edge.position.copy(point.position); + + edge.geometry.setPositions([ + 0, 0, 0, + ...nextPoint.position.clone().sub(point.position).toArray(), + ]); + + edge.geometry.verticesNeedUpdate = true; + edge.geometry.computeBoundingSphere(); + edge.computeLineDistances(); + edge.visible = index < lastIndex || this.closed; + + if(!this.showEdges){ + edge.visible = false; + } + } + + { // edge labels + let edgeLabel = this.edgeLabels[i]; + + let center = new Vector3().add(point.position); + center.add(nextPoint.position); + center = center.multiplyScalar(0.5); + let distance = point.position.distanceTo(nextPoint.position); + + edgeLabel.position.copy(center); + + let suffix = ""; + if(this.lengthUnit != null && this.lengthUnitDisplay != null){ + distance = distance / this.lengthUnit.unitspermeter * this.lengthUnitDisplay.unitspermeter; //convert to meters then to the display unit + suffix = this.lengthUnitDisplay.code; + } + + let txtLength = Utils.addCommas(distance.toFixed(2)); + edgeLabel.setText(`${txtLength} ${suffix}`); + edgeLabel.visible = this.showDistances && (index < lastIndex || this.closed) && this.points.length >= 2 && distance > 0; + } + + { // angle labels + let angleLabel = this.angleLabels[i]; + let angle = this.getAngleBetweenLines(point, previousPoint, nextPoint); + + let dir = nextPoint.position.clone().sub(previousPoint.position); + dir.multiplyScalar(0.5); + dir = previousPoint.position.clone().add(dir).sub(point.position).normalize(); + + let dist = Math.min(point.position.distanceTo(previousPoint.position), point.position.distanceTo(nextPoint.position)); + dist = dist / 9; + + let labelPos = point.position.clone().add(dir.multiplyScalar(dist)); + angleLabel.position.copy(labelPos); + + let msg = Utils.addCommas((angle * (180.0 / Math.PI)).toFixed(1)) + '\u00B0'; + angleLabel.setText(msg); + + angleLabel.visible = this.showAngles && (index < lastIndex || this.closed) && this.points.length >= 3 && angle > 0; + } + } + + { // update height stuff + let heightEdge = this.heightEdge; + heightEdge.visible = this.showHeight; + this.heightLabel.visible = this.showHeight; + + if (this.showHeight) { + let sorted = this.points.slice().sort((a, b) => a.position.z - b.position.z); + let lowPoint = sorted[0].position.clone(); + let highPoint = sorted[sorted.length - 1].position.clone(); + let min = lowPoint.z; + let max = highPoint.z; + let height = max - min; + + let start = new Vector3(highPoint.x, highPoint.y, min); + let end = new Vector3(highPoint.x, highPoint.y, max); + + heightEdge.position.copy(lowPoint); + + heightEdge.geometry.setPositions([ + 0, 0, 0, + ...start.clone().sub(lowPoint).toArray(), + ...start.clone().sub(lowPoint).toArray(), + ...end.clone().sub(lowPoint).toArray(), + ]); + + heightEdge.geometry.verticesNeedUpdate = true; + // heightEdge.geometry.computeLineDistances(); + // heightEdge.geometry.lineDistancesNeedUpdate = true; + heightEdge.geometry.computeBoundingSphere(); + heightEdge.computeLineDistances(); + + // heightEdge.material.dashSize = height / 40; + // heightEdge.material.gapSize = height / 40; + + let heightLabelPosition = start.clone().add(end).multiplyScalar(0.5); + this.heightLabel.position.copy(heightLabelPosition); + + let suffix = ""; + if(this.lengthUnit != null && this.lengthUnitDisplay != null){ + height = height / this.lengthUnit.unitspermeter * this.lengthUnitDisplay.unitspermeter; //convert to meters then to the display unit + suffix = this.lengthUnitDisplay.code; + } + + let txtHeight = Utils.addCommas(height.toFixed(2)); + let msg = `${txtHeight} ${suffix}`; + this.heightLabel.setText(msg); + } + } + + { // update circle stuff + const circleRadiusLabel = this.circleRadiusLabel; + const circleRadiusLine = this.circleRadiusLine; + const circleLine = this.circleLine; + const circleCenter = this.circleCenter; + + const circleOkay = this.points.length === 3; + + circleRadiusLabel.visible = this.showCircle && circleOkay; + circleRadiusLine.visible = this.showCircle && circleOkay; + circleLine.visible = this.showCircle && circleOkay; + circleCenter.visible = this.showCircle && circleOkay; + + if(this.showCircle && circleOkay){ + + const A = this.points[0].position; + const B = this.points[1].position; + const C = this.points[2].position; + const AB = B.clone().sub(A); + const AC = C.clone().sub(A); + const N = AC.clone().cross(AB).normalize(); + + const center = Potree.Utils.computeCircleCenter(A, B, C); + const radius = center.distanceTo(A); + + + const scale = radius / 20; + circleCenter.position.copy(center); + circleCenter.scale.set(scale, scale, scale); + + //circleRadiusLine.geometry.vertices[0].set(0, 0, 0); + //circleRadiusLine.geometry.vertices[1].copy(B.clone().sub(center)); + + circleRadiusLine.geometry.setPositions( [ + 0, 0, 0, + ...B.clone().sub(center).toArray() + ] ); + + circleRadiusLine.geometry.verticesNeedUpdate = true; + circleRadiusLine.geometry.computeBoundingSphere(); + circleRadiusLine.position.copy(center); + circleRadiusLine.computeLineDistances(); + + const target = center.clone().add(N); + circleLine.position.copy(center); + circleLine.scale.set(radius, radius, radius); + circleLine.lookAt(target); + + circleRadiusLabel.visible = true; + circleRadiusLabel.position.copy(center.clone().add(B).multiplyScalar(0.5)); + circleRadiusLabel.setText(`${radius.toFixed(3)}`); + + } + } + + { // update area label + this.areaLabel.position.copy(centroid); + this.areaLabel.visible = this.showArea && this.points.length >= 3; + let area = this.getArea(); + + let suffix = ""; + if(this.lengthUnit != null && this.lengthUnitDisplay != null){ + area = area / Math.pow(this.lengthUnit.unitspermeter, 2) * Math.pow(this.lengthUnitDisplay.unitspermeter, 2); //convert to square meters then to the square display unit + suffix = this.lengthUnitDisplay.code; + } + + let txtArea = Utils.addCommas(area.toFixed(1)); + let msg = `${txtArea} ${suffix}\u00B2`; + this.areaLabel.setText(msg); + } + + // this.updateAzimuth(); + }; + + raycast (raycaster, intersects) { + for (let i = 0; i < this.points.length; i++) { + let sphere = this.spheres[i]; + + sphere.raycast(raycaster, intersects); + } + + // recalculate distances because they are not necessarely correct + // for scaled objects. + // see https://github.com/mrdoob/three.js/issues/5827 + // TODO: remove this once the bug has been fixed + for (let i = 0; i < intersects.length; i++) { + let I = intersects[i]; + I.distance = raycaster.ray.origin.distanceTo(I.point); + } + intersects.sort(function (a, b) { return a.distance - b.distance; }); + }; + + get showCoordinates () { + return this._showCoordinates; + } + + set showCoordinates (value) { + this._showCoordinates = value; + this.update(); + } + + get showAngles () { + return this._showAngles; + } + + set showAngles (value) { + this._showAngles = value; + this.update(); + } + + get showCircle () { + return this._showCircle; + } + + set showCircle (value) { + this._showCircle = value; + this.update(); + } + + get showAzimuth(){ + return this._showAzimuth; + } + + set showAzimuth(value){ + this._showAzimuth = value; + this.update(); + } + + get showEdges () { + return this._showEdges; + } + + set showEdges (value) { + this._showEdges = value; + this.update(); + } + + get showHeight () { + return this._showHeight; + } + + set showHeight (value) { + this._showHeight = value; + this.update(); + } + + get showArea () { + return this._showArea; + } + + set showArea (value) { + this._showArea = value; + this.update(); + } + + get closed () { + return this._closed; + } + + set closed (value) { + this._closed = value; + this.update(); + } + + get showDistances () { + return this._showDistances; + } + + set showDistances (value) { + this._showDistances = value; + this.update(); + } + + } + + class PolygonClipVolume extends Object3D{ + + constructor(camera){ + super(); + + this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; + this.name = "polygon_clip_volume_" + this.constructor.counter; + + this.camera = camera.clone(); + this.camera.rotation.set(...camera.rotation.toArray()); // [r85] workaround because camera.clone() doesn't work on rotation + this.camera.rotation.order = camera.rotation.order; + this.camera.updateMatrixWorld(); + this.camera.updateProjectionMatrix(); + this.camera.matrixWorldInverse.copy(this.camera.matrixWorld).invert(); + + this.viewMatrix = this.camera.matrixWorldInverse.clone(); + this.projMatrix = this.camera.projectionMatrix.clone(); + + // projected markers + this.markers = []; + this.initialized = false; + } + + addMarker() { + + let marker = new Mesh(); + + let cancel; + + let drag = e => { + let size = e.viewer.renderer.getSize(new Vector2()); + let projectedPos = new Vector3( + 2.0 * (e.drag.end.x / size.width) - 1.0, + -2.0 * (e.drag.end.y / size.height) + 1.0, + 0 + ); + + marker.position.copy(projectedPos); + }; + + let drop = e => { + cancel(); + }; + + cancel = e => { + marker.removeEventListener("drag", drag); + marker.removeEventListener("drop", drop); + }; + + marker.addEventListener("drag", drag); + marker.addEventListener("drop", drop); + + + this.markers.push(marker); + } + + removeLastMarker() { + if(this.markers.length > 0) { + this.markers.splice(this.markers.length - 1, 1); + } + } + + }; + + class Utils { + static async loadShapefileFeatures (file, callback) { + let features = []; + + let handleFinish = () => { + callback(features); + }; + + let source = await shapefile.open(file); + + while(true){ + let result = await source.read(); + + if (result.done) { + handleFinish(); + break; + } + + if (result.value && result.value.type === 'Feature' && result.value.geometry !== undefined) { + features.push(result.value); + } + } + + } + + static toString (value) { + if (value.x != null) { + return value.x.toFixed(2) + ', ' + value.y.toFixed(2) + ', ' + value.z.toFixed(2); + } else { + return '' + value + ''; + } + } + + static normalizeURL (url) { + let u = new URL(url); + + return u.protocol + '//' + u.hostname + u.pathname.replace(/\/+/g, '/'); + }; + + static pathExists (url) { + let req = XHRFactory.createXMLHttpRequest(); + req.open('GET', url, false); + req.send(null); + if (req.status !== 200) { + return false; + } + return true; + }; + + static debugSphere(parent, position, scale, color){ + let geometry = new SphereGeometry(1, 8, 8); + let material; + + if(color !== undefined){ + material = new MeshBasicMaterial({color: color}); + }else { + material = new MeshNormalMaterial(); + } + let sphere = new Mesh(geometry, material); + sphere.position.copy(position); + sphere.scale.set(scale, scale, scale); + parent.add(sphere); + + return sphere; + } + + static debugLine(parent, start, end, color){ + + let material = new LineBasicMaterial({ color: color }); + let geometry = new Geometry(); + + const p1 = new Vector3(0, 0, 0); + const p2 = end.clone().sub(start); + + geometry.vertices.push(p1, p2); + + let tl = new Line( geometry, material ); + tl.position.copy(start); + + parent.add(tl); + + let line = { + node: tl, + set: (start, end) => { + geometry.vertices[0].copy(start); + geometry.vertices[1].copy(end); + geometry.verticesNeedUpdate = true; + }, + }; + + return line; + } + + static debugCircle(parent, center, radius, normal, color){ + let material = new LineBasicMaterial({ color: color }); + + let geometry = new Geometry(); + + let n = 32; + for(let i = 0; i <= n; i++){ + let u0 = 2 * Math.PI * (i / n); + let u1 = 2 * Math.PI * (i + 1) / n; + + let p0 = new Vector3( + Math.cos(u0), + Math.sin(u0), + 0 + ); + + let p1 = new Vector3( + Math.cos(u1), + Math.sin(u1), + 0 + ); + + geometry.vertices.push(p0, p1); + } + + let tl = new Line( geometry, material ); + tl.position.copy(center); + tl.scale.set(radius, radius, radius); + + parent.add(tl); + } + + static debugBox(parent, box, transform = new Matrix4(), color = 0xFFFF00){ + + let vertices = [ + [box.min.x, box.min.y, box.min.z], + [box.min.x, box.min.y, box.max.z], + [box.min.x, box.max.y, box.min.z], + [box.min.x, box.max.y, box.max.z], + + [box.max.x, box.min.y, box.min.z], + [box.max.x, box.min.y, box.max.z], + [box.max.x, box.max.y, box.min.z], + [box.max.x, box.max.y, box.max.z], + ].map(v => new Vector3(...v)); + + let edges = [ + [0, 4], [4, 5], [5, 1], [1, 0], + [2, 6], [6, 7], [7, 3], [3, 2], + [0, 2], [4, 6], [5, 7], [1, 3] + ]; + + let center = box.getCenter(new Vector3()); + + let centroids = [ + {position: [box.min.x, center.y, center.z], color: 0xFF0000}, + {position: [box.max.x, center.y, center.z], color: 0x880000}, + + {position: [center.x, box.min.y, center.z], color: 0x00FF00}, + {position: [center.x, box.max.y, center.z], color: 0x008800}, + + {position: [center.x, center.y, box.min.z], color: 0x0000FF}, + {position: [center.x, center.y, box.max.z], color: 0x000088}, + ]; + + for(let vertex of vertices){ + let pos = vertex.clone().applyMatrix4(transform); + + Utils.debugSphere(parent, pos, 0.1, 0xFF0000); + } + + for(let edge of edges){ + let start = vertices[edge[0]].clone().applyMatrix4(transform); + let end = vertices[edge[1]].clone().applyMatrix4(transform); + + Utils.debugLine(parent, start, end, color); + } + + for(let centroid of centroids){ + let pos = new Vector3(...centroid.position).applyMatrix4(transform); + + Utils.debugSphere(parent, pos, 0.1, centroid.color); + } + } + + static debugPlane(parent, plane, size = 1, color = 0x0000FF){ + + let planehelper = new PlaneHelper(plane, size, color); + + parent.add(planehelper); + + } + + /** + * adapted from mhluska at https://github.com/mrdoob/three.js/issues/1561 + */ + static computeTransformedBoundingBox (box, transform) { + let vertices = [ + new Vector3(box.min.x, box.min.y, box.min.z).applyMatrix4(transform), + new Vector3(box.min.x, box.min.y, box.min.z).applyMatrix4(transform), + new Vector3(box.max.x, box.min.y, box.min.z).applyMatrix4(transform), + new Vector3(box.min.x, box.max.y, box.min.z).applyMatrix4(transform), + new Vector3(box.min.x, box.min.y, box.max.z).applyMatrix4(transform), + new Vector3(box.min.x, box.max.y, box.max.z).applyMatrix4(transform), + new Vector3(box.max.x, box.max.y, box.min.z).applyMatrix4(transform), + new Vector3(box.max.x, box.min.y, box.max.z).applyMatrix4(transform), + new Vector3(box.max.x, box.max.y, box.max.z).applyMatrix4(transform) + ]; + + let boundingBox = new Box3(); + boundingBox.setFromPoints(vertices); + + return boundingBox; + }; + + /** + * add separators to large numbers + * + * @param nStr + * @returns + */ + static addCommas (nStr) { + nStr += ''; + let x = nStr.split('.'); + let x1 = x[0]; + let x2 = x.length > 1 ? '.' + x[1] : ''; + let rgx = /(\d+)(\d{3})/; + while (rgx.test(x1)) { + x1 = x1.replace(rgx, '$1' + ',' + '$2'); + } + return x1 + x2; + }; + + static removeCommas (str) { + return str.replace(/,/g, ''); + } + + /** + * create worker from a string + * + * code from http://stackoverflow.com/questions/10343913/how-to-create-a-web-worker-from-a-string + */ + static createWorker (code) { + let blob = new Blob([code], {type: 'application/javascript'}); + let worker = new Worker(URL.createObjectURL(blob)); + + return worker; + }; + + static moveTo(scene, endPosition, endTarget){ + + let view = scene.view; + let camera = scene.getActiveCamera(); + let animationDuration = 500; + let easing = TWEEN.Easing.Quartic.Out; + + { // animate camera position + let tween = new TWEEN.Tween(view.position).to(endPosition, animationDuration); + tween.easing(easing); + tween.start(); + } + + { // animate camera target + let camTargetDistance = camera.position.distanceTo(endTarget); + let target = new Vector3().addVectors( + camera.position, + camera.getWorldDirection(new Vector3()).clone().multiplyScalar(camTargetDistance) + ); + let tween = new TWEEN.Tween(target).to(endTarget, animationDuration); + tween.easing(easing); + tween.onUpdate(() => { + view.lookAt(target); + }); + tween.onComplete(() => { + view.lookAt(target); + }); + tween.start(); + } + + } + + static loadSkybox (path) { + let parent = new Object3D("skybox_root"); + + let camera = new PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 100000); + camera.up.set(0, 0, 1); + let scene = new Scene(); + + let format = '.jpg'; + let urls = [ + path + 'px' + format, path + 'nx' + format, + path + 'py' + format, path + 'ny' + format, + path + 'pz' + format, path + 'nz' + format + ]; + + let materialArray = []; + { + for (let i = 0; i < 6; i++) { + let material = new MeshBasicMaterial({ + map: null, + side: BackSide, + depthTest: false, + depthWrite: false, + color: 0x424556 + }); + + materialArray.push(material); + + let loader = new TextureLoader(); + loader.load(urls[i], + function loaded (texture) { + material.map = texture; + material.needsUpdate = true; + material.color.setHex(0xffffff); + }, function progress (xhr) { + // console.log( (xhr.loaded / xhr.total * 100) + '% loaded' ); + }, function error (xhr) { + console.log('An error happened', xhr); + } + ); + } + } + + let skyGeometry = new BoxGeometry(700, 700, 700); + let skybox = new Mesh(skyGeometry, materialArray); + + scene.add(skybox); + + scene.traverse(n => n.frustumCulled = false); + + // z up + scene.rotation.x = Math.PI / 2; + + parent.children.push(camera); + camera.parent = parent; + + return {camera, scene, parent}; + }; + + static createGrid (width, length, spacing, color) { + let material = new LineBasicMaterial({ + color: color || 0x888888 + }); + + let geometry = new Geometry(); + for (let i = 0; i <= length; i++) { + geometry.vertices.push(new Vector3(-(spacing * width) / 2, i * spacing - (spacing * length) / 2, 0)); + geometry.vertices.push(new Vector3(+(spacing * width) / 2, i * spacing - (spacing * length) / 2, 0)); + } + + for (let i = 0; i <= width; i++) { + geometry.vertices.push(new Vector3(i * spacing - (spacing * width) / 2, -(spacing * length) / 2, 0)); + geometry.vertices.push(new Vector3(i * spacing - (spacing * width) / 2, +(spacing * length) / 2, 0)); + } + + let line = new LineSegments(geometry, material, LinePieces); + line.receiveShadow = true; + return line; + } + + static createBackgroundTexture (width, height) { + function gauss (x, y) { + return (1 / (2 * Math.PI)) * Math.exp(-(x * x + y * y) / 2); + }; + + // map.magFilter = THREE.NearestFilter; + let size = width * height; + let data = new Uint8Array(3 * size); + + let chroma = [1, 1.5, 1.7]; + let max = gauss(0, 0); + + for (let x = 0; x < width; x++) { + for (let y = 0; y < height; y++) { + let u = 2 * (x / width) - 1; + let v = 2 * (y / height) - 1; + + let i = x + width * y; + let d = gauss(2 * u, 2 * v) / max; + let r = (Math.random() + Math.random() + Math.random()) / 3; + r = (d * 0.5 + 0.5) * r * 0.03; + r = r * 0.4; + + // d = Math.pow(d, 0.6); + + data[3 * i + 0] = 255 * (d / 15 + 0.05 + r) * chroma[0]; + data[3 * i + 1] = 255 * (d / 15 + 0.05 + r) * chroma[1]; + data[3 * i + 2] = 255 * (d / 15 + 0.05 + r) * chroma[2]; + } + } + + let texture = new DataTexture(data, width, height, RGBFormat); + texture.needsUpdate = true; + + return texture; + } + + static getMousePointCloudIntersection (mouse, camera, viewer, pointclouds, params = {}) { + + let renderer = viewer.renderer; + + let nmouse = { + x: (mouse.x / renderer.domElement.clientWidth) * 2 - 1, + y: -(mouse.y / renderer.domElement.clientHeight) * 2 + 1 + }; + + let pickParams = {}; + + if(params.pickClipped){ + pickParams.pickClipped = params.pickClipped; + } + + pickParams.x = mouse.x; + pickParams.y = renderer.domElement.clientHeight - mouse.y; + + let raycaster = new Raycaster(); + raycaster.setFromCamera(nmouse, camera); + let ray = raycaster.ray; + + let selectedPointcloud = null; + let closestDistance = Infinity; + let closestIntersection = null; + let closestPoint = null; + + for(let pointcloud of pointclouds){ + let point = pointcloud.pick(viewer, camera, ray, pickParams); + + if(!point){ + continue; + } + + let distance = camera.position.distanceTo(point.position); + + if (distance < closestDistance) { + closestDistance = distance; + selectedPointcloud = pointcloud; + closestIntersection = point.position; + closestPoint = point; + } + } + + if (selectedPointcloud) { + return { + location: closestIntersection, + distance: closestDistance, + pointcloud: selectedPointcloud, + point: closestPoint + }; + } else { + return null; + } + } + + static pixelsArrayToImage (pixels, width, height) { + let canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + + let context = canvas.getContext('2d'); + + pixels = new pixels.constructor(pixels); + + for (let i = 0; i < pixels.length; i++) { + pixels[i * 4 + 3] = 255; + } + + let imageData = context.createImageData(width, height); + imageData.data.set(pixels); + context.putImageData(imageData, 0, 0); + + let img = new Image(); + img.src = canvas.toDataURL(); + // img.style.transform = "scaleY(-1)"; + + return img; + } + + static pixelsArrayToDataUrl(pixels, width, height) { + let canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + + let context = canvas.getContext('2d'); + + pixels = new pixels.constructor(pixels); + + for (let i = 0; i < pixels.length; i++) { + pixels[i * 4 + 3] = 255; + } + + let imageData = context.createImageData(width, height); + imageData.data.set(pixels); + context.putImageData(imageData, 0, 0); + + let dataURL = canvas.toDataURL(); + + return dataURL; + } + + static pixelsArrayToCanvas(pixels, width, height){ + let canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + + let context = canvas.getContext('2d'); + + pixels = new pixels.constructor(pixels); + + //for (let i = 0; i < pixels.length; i++) { + // pixels[i * 4 + 3] = 255; + //} + + // flip vertically + let bytesPerLine = width * 4; + for(let i = 0; i < parseInt(height / 2); i++){ + let j = height - i - 1; + + let lineI = pixels.slice(i * bytesPerLine, i * bytesPerLine + bytesPerLine); + let lineJ = pixels.slice(j * bytesPerLine, j * bytesPerLine + bytesPerLine); + pixels.set(lineJ, i * bytesPerLine); + pixels.set(lineI, j * bytesPerLine); + } + + let imageData = context.createImageData(width, height); + imageData.data.set(pixels); + context.putImageData(imageData, 0, 0); + + return canvas; + } + + static removeListeners(dispatcher, type){ + if (dispatcher._listeners === undefined) { + return; + } + + if (dispatcher._listeners[ type ]) { + delete dispatcher._listeners[ type ]; + } + } + + static mouseToRay(mouse, camera, width, height){ + + let normalizedMouse = { + x: (mouse.x / width) * 2 - 1, + y: -(mouse.y / height) * 2 + 1 + }; + + let vector = new Vector3(normalizedMouse.x, normalizedMouse.y, 0.5); + let origin = camera.position.clone(); + vector.unproject(camera); + let direction = new Vector3().subVectors(vector, origin).normalize(); + + let ray = new Ray(origin, direction); + + return ray; + } + + static projectedRadius(radius, camera, distance, screenWidth, screenHeight){ + if(camera instanceof OrthographicCamera){ + return Utils.projectedRadiusOrtho(radius, camera.projectionMatrix, screenWidth, screenHeight); + }else if(camera instanceof PerspectiveCamera){ + return Utils.projectedRadiusPerspective(radius, camera.fov * Math.PI / 180, distance, screenHeight); + }else { + throw new Error("invalid parameters"); + } + } + + static projectedRadiusPerspective(radius, fov, distance, screenHeight) { + let projFactor = (1 / Math.tan(fov / 2)) / distance; + projFactor = projFactor * screenHeight / 2; + + return radius * projFactor; + } + + static projectedRadiusOrtho(radius, proj, screenWidth, screenHeight) { + let p1 = new Vector4(0); + let p2 = new Vector4(radius); + + p1.applyMatrix4(proj); + p2.applyMatrix4(proj); + p1 = new Vector3(p1.x, p1.y, p1.z); + p2 = new Vector3(p2.x, p2.y, p2.z); + p1.x = (p1.x + 1.0) * 0.5 * screenWidth; + p1.y = (p1.y + 1.0) * 0.5 * screenHeight; + p2.x = (p2.x + 1.0) * 0.5 * screenWidth; + p2.y = (p2.y + 1.0) * 0.5 * screenHeight; + return p1.distanceTo(p2); + } + + + static topView(camera, node){ + camera.position.set(0, 1, 0); + camera.rotation.set(-Math.PI / 2, 0, 0); + camera.zoomTo(node, 1); + } + + static frontView (camera, node) { + camera.position.set(0, 0, 1); + camera.rotation.set(0, 0, 0); + camera.zoomTo(node, 1); + } + + static leftView (camera, node) { + camera.position.set(-1, 0, 0); + camera.rotation.set(0, -Math.PI / 2, 0); + camera.zoomTo(node, 1); + } + + static rightView (camera, node) { + camera.position.set(1, 0, 0); + camera.rotation.set(0, Math.PI / 2, 0); + camera.zoomTo(node, 1); + } + + + static findClosestGpsTime(target, viewer){ + const start = performance.now(); + + const nodes = []; + for(const pc of viewer.scene.pointclouds){ + nodes.push(pc.root); + + for(const child of pc.root.children){ + if(child){ + nodes.push(child); + } + } + } + + let closestNode = null; + let closestIndex = Infinity; + let closestDistance = Infinity; + let closestValue = 0; + + for(const node of nodes){ + + const isOkay = node.geometryNode != null + && node.geometryNode.geometry != null + && node.sceneNode != null; + + if(!isOkay){ + continue; + } + + let geometry = node.geometryNode.geometry; + let gpsTime = geometry.attributes["gps-time"]; + let range = gpsTime.potree.range; + + for(let i = 0; i < gpsTime.array.length; i++){ + let value = gpsTime.array[i]; + value = value * (range[1] - range[0]) + range[0]; + const distance = Math.abs(target - value); + + if(distance < closestDistance){ + closestIndex = i; + closestDistance = distance; + closestValue = value; + closestNode = node; + //console.log("found a closer one: " + value); + } + } + } + + const geometry = closestNode.geometryNode.geometry; + const position = new Vector3( + geometry.attributes.position.array[3 * closestIndex + 0], + geometry.attributes.position.array[3 * closestIndex + 1], + geometry.attributes.position.array[3 * closestIndex + 2], + ); + + position.applyMatrix4(closestNode.sceneNode.matrixWorld); + + const end = performance.now(); + const duration = (end - start); + console.log(`duration: ${duration.toFixed(3)}ms`); + + return { + node: closestNode, + index: closestIndex, + position: position, + }; + } + + /** + * + * 0: no intersection + * 1: intersection + * 2: fully inside + */ + static frustumSphereIntersection (frustum, sphere) { + let planes = frustum.planes; + let center = sphere.center; + let negRadius = -sphere.radius; + + let minDistance = Number.MAX_VALUE; + + for (let i = 0; i < 6; i++) { + let distance = planes[ i ].distanceToPoint(center); + + if (distance < negRadius) { + return 0; + } + + minDistance = Math.min(minDistance, distance); + } + + return (minDistance >= sphere.radius) ? 2 : 1; + } + + // code taken from three.js + // ImageUtils - generateDataTexture() + static generateDataTexture (width, height, color) { + let size = width * height; + let data = new Uint8Array(4 * width * height); + + let r = Math.floor(color.r * 255); + let g = Math.floor(color.g * 255); + let b = Math.floor(color.b * 255); + + for (let i = 0; i < size; i++) { + data[ i * 3 ] = r; + data[ i * 3 + 1 ] = g; + data[ i * 3 + 2 ] = b; + } + + let texture = new DataTexture(data, width, height, RGBAFormat); + texture.needsUpdate = true; + texture.magFilter = NearestFilter; + + return texture; + } + + // from http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript + static getParameterByName (name) { + name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]'); + let regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); + let results = regex.exec(document.location.search); + return results === null ? null : decodeURIComponent(results[1].replace(/\+/g, ' ')); + } + + static setParameter (name, value) { + // value = encodeURIComponent(value); + + name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]'); + let regex = new RegExp('([\\?&])(' + name + '=([^&#]*))'); + let results = regex.exec(document.location.search); + + let url = window.location.href; + if (results === null) { + if (window.location.search.length === 0) { + url = url + '?'; + } else { + url = url + '&'; + } + + url = url + name + '=' + value; + } else { + let newValue = name + '=' + value; + url = url.replace(results[2], newValue); + } + window.history.replaceState({}, '', url); + } + + static createChildAABB(aabb, index){ + let min = aabb.min.clone(); + let max = aabb.max.clone(); + let size = new Vector3().subVectors(max, min); + + if ((index & 0b0001) > 0) { + min.z += size.z / 2; + } else { + max.z -= size.z / 2; + } + + if ((index & 0b0010) > 0) { + min.y += size.y / 2; + } else { + max.y -= size.y / 2; + } + + if ((index & 0b0100) > 0) { + min.x += size.x / 2; + } else { + max.x -= size.x / 2; + } + + return new Box3(min, max); + } + + // see https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript + static clipboardCopy(text){ + let textArea = document.createElement("textarea"); + + textArea.style.position = 'fixed'; + textArea.style.top = 0; + textArea.style.left = 0; + + textArea.style.width = '2em'; + textArea.style.height = '2em'; + + textArea.style.padding = 0; + + textArea.style.border = 'none'; + textArea.style.outline = 'none'; + textArea.style.boxShadow = 'none'; + + textArea.style.background = 'transparent'; + + textArea.value = text; + + document.body.appendChild(textArea); + + textArea.select(); + + try { + let success = document.execCommand('copy'); + if(success){ + console.log("copied text to clipboard"); + }else { + console.log("copy to clipboard failed"); + } + } catch (err) { + console.log("error while trying to copy to clipboard"); + } + + document.body.removeChild(textArea); + + } + + static getMeasurementIcon(measurement){ + if (measurement instanceof Measure) { + if (measurement.showDistances && !measurement.showArea && !measurement.showAngles) { + return `${Potree.resourcePath}/icons/distance.svg`; + } else if (measurement.showDistances && measurement.showArea && !measurement.showAngles) { + return `${Potree.resourcePath}/icons/area.svg`; + } else if (measurement.maxMarkers === 1) { + return `${Potree.resourcePath}/icons/point.svg`; + } else if (!measurement.showDistances && !measurement.showArea && measurement.showAngles) { + return `${Potree.resourcePath}/icons/angle.png`; + } else if (measurement.showHeight) { + return `${Potree.resourcePath}/icons/height.svg`; + } else { + return `${Potree.resourcePath}/icons/distance.svg`; + } + } else if (measurement instanceof Profile) { + return `${Potree.resourcePath}/icons/profile.svg`; + } else if (measurement instanceof Volume) { + return `${Potree.resourcePath}/icons/volume.svg`; + } else if (measurement instanceof PolygonClipVolume) { + return `${Potree.resourcePath}/icons/clip-polygon.svg`; + } + } + + static lineToLineIntersection(P0, P1, P2, P3){ + + const P = [P0, P1, P2, P3]; + + const d = (m, n, o, p) => { + let result = + (P[m].x - P[n].x) * (P[o].x - P[p].x) + + (P[m].y - P[n].y) * (P[o].y - P[p].y) + + (P[m].z - P[n].z) * (P[o].z - P[p].z); + + return result; + }; + + + const mua = (d(0, 2, 3, 2) * d(3, 2, 1, 0) - d(0, 2, 1, 0) * d(3, 2, 3, 2)) + /**-----------------------------------------------------------------**/ / + (d(1, 0, 1, 0) * d(3, 2, 3, 2) - d(3, 2, 1, 0) * d(3, 2, 1, 0)); + + + const mub = (d(0, 2, 3, 2) + mua * d(3, 2, 1, 0)) + /**--------------------------------------**/ / + d(3, 2, 3, 2); + + + const P01 = P1.clone().sub(P0); + const P23 = P3.clone().sub(P2); + + const Pa = P0.clone().add(P01.multiplyScalar(mua)); + const Pb = P2.clone().add(P23.multiplyScalar(mub)); + + const center = Pa.clone().add(Pb).multiplyScalar(0.5); + + return center; + } + + static computeCircleCenter(A, B, C){ + const AB = B.clone().sub(A); + const AC = C.clone().sub(A); + + const N = AC.clone().cross(AB).normalize(); + + const ab_dir = AB.clone().cross(N).normalize(); + const ac_dir = AC.clone().cross(N).normalize(); + + const ab_origin = A.clone().add(B).multiplyScalar(0.5); + const ac_origin = A.clone().add(C).multiplyScalar(0.5); + + const P0 = ab_origin; + const P1 = ab_origin.clone().add(ab_dir); + + const P2 = ac_origin; + const P3 = ac_origin.clone().add(ac_dir); + + const center = Utils.lineToLineIntersection(P0, P1, P2, P3); + + return center; + + // Potree.Utils.debugLine(viewer.scene.scene, P0, P1, 0x00ff00); + // Potree.Utils.debugLine(viewer.scene.scene, P2, P3, 0x0000ff); + + // Potree.Utils.debugSphere(viewer.scene.scene, center, 0.03, 0xff00ff); + + // const radius = center.distanceTo(A); + // Potree.Utils.debugCircle(viewer.scene.scene, center, radius, new THREE.Vector3(0, 0, 1), 0xff00ff); + } + + static getNorthVec(p1, distance, projection){ + if(projection){ + // if there is a projection, transform coordinates to WGS84 + // and compute angle to north there + + proj4.defs("pointcloud", projection); + const transform = proj4("pointcloud", "WGS84"); + + const llP1 = transform.forward(p1.toArray()); + let llP2 = transform.forward([p1.x, p1.y + distance]); + const polarRadius = Math.sqrt((llP2[0] - llP1[0]) ** 2 + (llP2[1] - llP1[1]) ** 2); + llP2 = [llP1[0], llP1[1] + polarRadius]; + + const northVec = transform.inverse(llP2); + + return new Vector3(...northVec, p1.z).sub(p1); + }else { + // if there is no projection, assume [0, 1, 0] as north direction + + const vec = new Vector3(0, 1, 0).multiplyScalar(distance); + + return vec; + } + } + + static computeAzimuth(p1, p2, projection){ + + let azimuth = 0; + + if(projection){ + // if there is a projection, transform coordinates to WGS84 + // and compute angle to north there + + let transform; + + if (projection.includes('EPSG')) { + transform = proj4(projection, "WGS84"); + } else { + proj4.defs("pointcloud", projection); + transform = proj4("pointcloud", "WGS84"); + } + + const llP1 = transform.forward(p1.toArray()); + const llP2 = transform.forward(p2.toArray()); + const dir = [ + llP2[0] - llP1[0], + llP2[1] - llP1[1], + ]; + azimuth = Math.atan2(dir[1], dir[0]) - Math.PI / 2; + }else { + // if there is no projection, assume [0, 1, 0] as north direction + + const dir = [p2.x - p1.x, p2.y - p1.y]; + azimuth = Math.atan2(dir[1], dir[0]) - Math.PI / 2; + } + + // make clockwise + azimuth = -azimuth; + + return azimuth; + } + + static async loadScript(url){ + + return new Promise( resolve => { + + const element = document.getElementById(url); + + if(element){ + resolve(); + }else { + const script = document.createElement("script"); + + script.id = url; + + script.onload = () => { + resolve(); + }; + script.src = url; + + document.body.appendChild(script); + } + }); + } + + static createSvgGradient(scheme){ + + // this is what we are creating: + // + // + // + // + // + // ... + // + // + // + // + // + // + + + const gradientId = `${Math.random()}_${Date.now()}`; + + const svgn = "http://www.w3.org/2000/svg"; + const svg = document.createElementNS(svgn, "svg"); + svg.setAttributeNS(null, "width", "2em"); + svg.setAttributeNS(null, "height", "3em"); + + { // + const defs = document.createElementNS(svgn, "defs"); + + const linearGradient = document.createElementNS(svgn, "linearGradient"); + linearGradient.setAttributeNS(null, "id", gradientId); + linearGradient.setAttributeNS(null, "gradientTransform", "rotate(90)"); + + for(let i = scheme.length - 1; i >= 0; i--){ + const stopVal = scheme[i]; + const percent = parseInt(100 - stopVal[0] * 100); + const [r, g, b] = stopVal[1].toArray().map(v => parseInt(v * 255)); + + const stop = document.createElementNS(svgn, "stop"); + stop.setAttributeNS(null, "offset", `${percent}%`); + stop.setAttributeNS(null, "stop-color", `rgb(${r}, ${g}, ${b})`); + + linearGradient.appendChild(stop); + } + + defs.appendChild(linearGradient); + svg.appendChild(defs); + } + + const rect = document.createElementNS(svgn, "rect"); + rect.setAttributeNS(null, "width", `100%`); + rect.setAttributeNS(null, "height", `100%`); + rect.setAttributeNS(null, "fill", `url("#${gradientId}")`); + rect.setAttributeNS(null, "stroke", `black`); + rect.setAttributeNS(null, "stroke-width", `0.1em`); + + svg.appendChild(rect); + + return svg; + } + + static async waitAny(promises){ + + return new Promise( (resolve) => { + + promises.map( promise => { + promise.then( () => { + resolve(); + }); + }); + + }); + + } + + } + + Utils.screenPass = new function () { + this.screenScene = new Scene(); + this.screenQuad = new Mesh(new PlaneBufferGeometry(2, 2, 1)); + this.screenQuad.material.depthTest = true; + this.screenQuad.material.depthWrite = true; + this.screenQuad.material.transparent = true; + this.screenScene.add(this.screenQuad); + this.camera = new Camera(); + + this.render = function (renderer, material, target) { + this.screenQuad.material = material; + + if (typeof target === 'undefined') { + renderer.render(this.screenScene, this.camera); + } else { + renderer.render(this.screenScene, this.camera, target); + } + }; + }(); + + class Annotation extends EventDispatcher { + constructor (args = {}) { + super(); + + this.scene = null; + this._title = args.title || 'No Title'; + this._description = args.description || ''; + this.offset = new Vector3(); + this.uuid = MathUtils.generateUUID(); + + if (!args.position) { + this.position = null; + } else if (args.position.x != null) { + this.position = args.position; + } else { + this.position = new Vector3(...args.position); + } + + this.cameraPosition = (args.cameraPosition instanceof Array) + ? new Vector3().fromArray(args.cameraPosition) : args.cameraPosition; + this.cameraTarget = (args.cameraTarget instanceof Array) + ? new Vector3().fromArray(args.cameraTarget) : args.cameraTarget; + this.radius = args.radius; + this.view = args.view || null; + this.keepOpen = false; + this.descriptionVisible = false; + this.showDescription = true; + this.actions = args.actions || []; + this.isHighlighted = false; + this._visible = true; + this.__visible = true; + this._display = true; + this._expand = false; + this.collapseThreshold = [args.collapseThreshold, 100].find(e => e !== undefined); + + this.children = []; + this.parent = null; + this.boundingBox = new Box3(); + + let iconClose = exports.resourcePath + '/icons/close.svg'; + + this.domElement = $(` +
    +
    + +
    +
    + + + + ${this._description} +
    +
    + `); + + this.elTitlebar = this.domElement.find('.annotation-titlebar'); + this.elTitle = this.elTitlebar.find('.annotation-label'); + this.elTitle.append(this._title); + this.elDescription = this.domElement.find('.annotation-description'); + this.elDescriptionClose = this.elDescription.find('.annotation-description-close'); + // this.elDescriptionContent = this.elDescription.find(".annotation-description-content"); + + this.clickTitle = () => { + if(this.hasView()){ + this.moveHere(this.scene.getActiveCamera()); + } + this.dispatchEvent({type: 'click', target: this}); + }; + + this.elTitle.click(this.clickTitle); + + this.actions = this.actions.map(a => { + if (a instanceof Action) { + return a; + } else { + return new Action(a); + } + }); + + for (let action of this.actions) { + action.pairWith(this); + } + + let actions = this.actions.filter( + a => a.showIn === undefined || a.showIn.includes('scene')); + + for (let action of actions) { + let elButton = $(``); + this.elTitlebar.append(elButton); + elButton.click(() => action.onclick({annotation: this})); + } + + this.elDescriptionClose.hover( + e => this.elDescriptionClose.css('opacity', '1'), + e => this.elDescriptionClose.css('opacity', '0.5') + ); + this.elDescriptionClose.click(e => this.setHighlighted(false)); + // this.elDescriptionContent.html(this._description); + + this.domElement.mouseenter(e => this.setHighlighted(true)); + this.domElement.mouseleave(e => this.setHighlighted(false)); + + this.domElement.on('touchstart', e => { + this.setHighlighted(!this.isHighlighted); + }); + + this.display = false; + //this.display = true; + + } + + installHandles(viewer){ + if(this.handles !== undefined){ + return; + } + + let domElement = $(` +
    + + + + + +
    + `); + + let svg = domElement.find("svg")[0]; + let elLine = domElement.find("line")[0]; + let elStart = domElement.find("circle")[0]; + let elEnd = domElement.find("circle")[1]; + + let setCoordinates = (start, end) => { + elStart.setAttribute("cx", `${start.x}`); + elStart.setAttribute("cy", `${start.y}`); + + elEnd.setAttribute("cx", `${end.x}`); + elEnd.setAttribute("cy", `${end.y}`); + + elLine.setAttribute("x1", start.x); + elLine.setAttribute("y1", start.y); + elLine.setAttribute("x2", end.x); + elLine.setAttribute("y2", end.y); + + let box = svg.getBBox(); + svg.setAttribute("width", `${box.width}`); + svg.setAttribute("height", `${box.height}`); + svg.setAttribute("viewBox", `${box.x} ${box.y} ${box.width} ${box.height}`); + + let ya = start.y - end.y; + let xa = start.x - end.x; + + if(ya > 0){ + start.y = start.y - ya; + } + if(xa > 0){ + start.x = start.x - xa; + } + + domElement.css("left", `${start.x}px`); + domElement.css("top", `${start.y}px`); + + }; + + $(viewer.renderArea).append(domElement); + + + let annotationStartPos = this.position.clone(); + let annotationStartOffset = this.offset.clone(); + + $(this.domElement).draggable({ + start: (event, ui) => { + annotationStartPos = this.position.clone(); + annotationStartOffset = this.offset.clone(); + $(this.domElement).find(".annotation-titlebar").css("pointer-events", "none"); + + console.log($(this.domElement).find(".annotation-titlebar")); + }, + stop: () => { + $(this.domElement).find(".annotation-titlebar").css("pointer-events", ""); + }, + drag: (event, ui ) => { + let renderAreaWidth = viewer.renderer.getSize(new Vector2()).width; + //let renderAreaHeight = viewer.renderer.getSize().height; + + let diff = { + x: ui.originalPosition.left - ui.position.left, + y: ui.originalPosition.top - ui.position.top + }; + + let nDiff = { + x: -(diff.x / renderAreaWidth) * 2, + y: (diff.y / renderAreaWidth) * 2 + }; + + let camera = viewer.scene.getActiveCamera(); + let oldScreenPos = new Vector3() + .addVectors(annotationStartPos, annotationStartOffset) + .project(camera); + + let newScreenPos = oldScreenPos.clone(); + newScreenPos.x += nDiff.x; + newScreenPos.y += nDiff.y; + + let newPos = newScreenPos.clone(); + newPos.unproject(camera); + + let newOffset = new Vector3().subVectors(newPos, this.position); + this.offset.copy(newOffset); + } + }); + + let updateCallback = () => { + let position = this.position; + let scene = viewer.scene; + + const renderAreaSize = viewer.renderer.getSize(new Vector2()); + let renderAreaWidth = renderAreaSize.width; + let renderAreaHeight = renderAreaSize.height; + + let start = this.position.clone(); + let end = new Vector3().addVectors(this.position, this.offset); + + let toScreen = (position) => { + let camera = scene.getActiveCamera(); + let screenPos = new Vector3(); + + let worldView = new Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse); + let ndc = new Vector4(position.x, position.y, position.z, 1.0).applyMatrix4(worldView); + // limit w to small positive value, in case position is behind the camera + ndc.w = Math.max(ndc.w, 0.1); + ndc.divideScalar(ndc.w); + + screenPos.copy(ndc); + screenPos.x = renderAreaWidth * (screenPos.x + 1) / 2; + screenPos.y = renderAreaHeight * (1 - (screenPos.y + 1) / 2); + + return screenPos; + }; + + start = toScreen(start); + end = toScreen(end); + + setCoordinates(start, end); + + }; + + viewer.addEventListener("update", updateCallback); + + this.handles = { + domElement: domElement, + setCoordinates: setCoordinates, + updateCallback: updateCallback + }; + } + + removeHandles(viewer){ + if(this.handles === undefined){ + return; + } + + //$(viewer.renderArea).remove(this.handles.domElement); + this.handles.domElement.remove(); + viewer.removeEventListener("update", this.handles.updateCallback); + + delete this.handles; + } + + get visible () { + return this._visible; + } + + set visible (value) { + if (this._visible === value) { + return; + } + + this._visible = value; + + //this.traverse(node => { + // node.display = value; + //}); + + this.dispatchEvent({ + type: 'visibility_changed', + annotation: this + }); + } + + get display () { + return this._display; + } + + set display (display) { + if (this._display === display) { + return; + } + + this._display = display; + + if (display) { + // this.domElement.fadeIn(200); + this.domElement.show(); + } else { + // this.domElement.fadeOut(200); + this.domElement.hide(); + } + } + + get expand () { + return this._expand; + } + + set expand (expand) { + if (this._expand === expand) { + return; + } + + if (expand) { + this.display = false; + } else { + this.display = true; + this.traverseDescendants(node => { + node.display = false; + }); + } + + this._expand = expand; + } + + get title () { + return this._title; + } + + set title (title) { + if (this._title === title) { + return; + } + + this._title = title; + this.elTitle.empty(); + this.elTitle.append(this._title); + + this.dispatchEvent({ + type: "annotation_changed", + annotation: this, + }); + } + + get description () { + return this._description; + } + + set description (description) { + if (this._description === description) { + return; + } + + this._description = description; + + const elDescriptionContent = this.elDescription.find(".annotation-description-content"); + elDescriptionContent.empty(); + elDescriptionContent.append(this._description); + + this.dispatchEvent({ + type: "annotation_changed", + annotation: this, + }); + } + + add (annotation) { + if (!this.children.includes(annotation)) { + this.children.push(annotation); + annotation.parent = this; + + let descendants = []; + annotation.traverse(a => { descendants.push(a); }); + + for (let descendant of descendants) { + let c = this; + while (c !== null) { + c.dispatchEvent({ + 'type': 'annotation_added', + 'annotation': descendant + }); + c = c.parent; + } + } + } + } + + level () { + if (this.parent === null) { + return 0; + } else { + return this.parent.level() + 1; + } + } + + hasChild(annotation) { + return this.children.includes(annotation); + } + + remove (annotation) { + if (this.hasChild(annotation)) { + annotation.removeAllChildren(); + annotation.dispose(); + this.children = this.children.filter(e => e !== annotation); + annotation.parent = null; + } + } + + removeAllChildren() { + this.children.forEach((child) => { + if (child.children.length > 0) { + child.removeAllChildren(); + } + + this.remove(child); + }); + } + + updateBounds () { + let box = new Box3(); + + if (this.position) { + box.expandByPoint(this.position); + } + + for (let child of this.children) { + child.updateBounds(); + + box.union(child.boundingBox); + } + + this.boundingBox.copy(box); + } + + traverse (handler) { + let expand = handler(this); + + if (expand === undefined || expand === true) { + for (let child of this.children) { + child.traverse(handler); + } + } + } + + traverseDescendants (handler) { + for (let child of this.children) { + child.traverse(handler); + } + } + + flatten () { + let annotations = []; + + this.traverse(annotation => { + annotations.push(annotation); + }); + + return annotations; + } + + descendants () { + let annotations = []; + + this.traverse(annotation => { + if (annotation !== this) { + annotations.push(annotation); + } + }); + + return annotations; + } + + setHighlighted (highlighted) { + if (highlighted) { + this.domElement.css('opacity', '0.8'); + this.elTitlebar.css('box-shadow', '0 0 5px #fff'); + this.domElement.css('z-index', '1000'); + + if (this._description) { + this.descriptionVisible = true; + this.elDescription.fadeIn(200); + this.elDescription.css('position', 'relative'); + } + } else { + this.domElement.css('opacity', '0.5'); + this.elTitlebar.css('box-shadow', ''); + this.domElement.css('z-index', '100'); + this.descriptionVisible = false; + this.elDescription.css('display', 'none'); + } + + this.isHighlighted = highlighted; + } + + hasView () { + let hasPosTargetView = this.cameraTarget.x != null; + hasPosTargetView = hasPosTargetView && this.cameraPosition.x != null; + + let hasRadiusView = this.radius !== undefined; + + let hasView = hasPosTargetView || hasRadiusView; + + return hasView; + }; + + moveHere (camera) { + if (!this.hasView()) { + return; + } + + let view = this.scene.view; + let animationDuration = 500; + let easing = TWEEN.Easing.Quartic.Out; + + let endTarget; + if (this.cameraTarget) { + endTarget = this.cameraTarget; + } else if (this.position) { + endTarget = this.position; + } else { + endTarget = this.boundingBox.getCenter(new Vector3()); + } + + if (this.cameraPosition) { + let endPosition = this.cameraPosition; + + Utils.moveTo(this.scene, endPosition, endTarget); + } else if (this.radius) { + let direction = view.direction; + let endPosition = endTarget.clone().add(direction.multiplyScalar(-this.radius)); + let startRadius = view.radius; + let endRadius = this.radius; + + { // animate camera position + let tween = new TWEEN.Tween(view.position).to(endPosition, animationDuration); + tween.easing(easing); + tween.start(); + } + + { // animate radius + let t = {x: 0}; + + let tween = new TWEEN.Tween(t) + .to({x: 1}, animationDuration) + .onUpdate(function () { + view.radius = this.x * endRadius + (1 - this.x) * startRadius; + }); + tween.easing(easing); + tween.start(); + } + } + }; + + dispose () { + if (this.domElement.parentElement) { + this.domElement.parentElement.removeChild(this.domElement); + } + }; + + toString () { + return 'Annotation: ' + this._title; + } + }; + + class EnumItem{ + constructor(object){ + for(let key of Object.keys(object)){ + this[key] = object[key]; + } + } + + inspect(){ + return `Enum(${this.name}: ${this.value})`; + } + }; + + class Enum{ + + constructor(object){ + this.object = object; + + for(let key of Object.keys(object)){ + let value = object[key]; + + if(typeof value === "object"){ + value.name = key; + }else { + value = {name: key, value: value}; + } + + this[key] = new EnumItem(value); + } + } + + fromValue(value){ + for(let key of Object.keys(this.object)){ + if(this[key].value === value){ + return this[key]; + } + } + + throw new Error(`No enum for value: ${value}`); + } + + }; + + const CameraMode = { + ORTHOGRAPHIC: 0, + PERSPECTIVE: 1, + VR: 2, + }; + + const ClipTask = { + NONE: 0, + HIGHLIGHT: 1, + SHOW_INSIDE: 2, + SHOW_OUTSIDE: 3 + }; + + const ClipMethod = { + INSIDE_ANY: 0, + INSIDE_ALL: 1 + }; + + const ElevationGradientRepeat = { + CLAMP: 0, + REPEAT: 1, + MIRRORED_REPEAT: 2, + }; + + const MOUSE$1 = { + LEFT: 0b0001, + RIGHT: 0b0010, + MIDDLE: 0b0100 + }; + + const PointSizeType = { + FIXED: 0, + ATTENUATED: 1, + ADAPTIVE: 2 + }; + + const PointShape = { + SQUARE: 0, + CIRCLE: 1, + PARABOLOID: 2 + }; + + const TreeType = { + OCTREE: 0, + KDTREE: 1 + }; + + const LengthUnits = { + METER: {code: 'm', unitspermeter: 1.0}, + FEET: {code: 'ft', unitspermeter: 3.28084}, + INCH: {code: '\u2033', unitspermeter: 39.3701} + }; + + let ftCanvas = document.createElement('canvas'); + + const Features = (function () { + + let gl = ftCanvas.getContext('webgl') || ftCanvas.getContext('experimental-webgl'); + if (gl === null){ + return null; + } + + // -- code taken from THREE.WebGLRenderer -- + let _vertexShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT); + let _vertexShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT); + // Unused: let _vertexShaderPrecisionLowpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT); + + let _fragmentShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT); + let _fragmentShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT); + // Unused: let _fragmentShaderPrecisionLowpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT); + + let highpAvailable = _vertexShaderPrecisionHighpFloat.precision > 0 && _fragmentShaderPrecisionHighpFloat.precision > 0; + let mediumpAvailable = _vertexShaderPrecisionMediumpFloat.precision > 0 && _fragmentShaderPrecisionMediumpFloat.precision > 0; + // ----------------------------------------- + + let precision; + if (highpAvailable) { + precision = 'highp'; + } else if (mediumpAvailable) { + precision = 'mediump'; + } else { + precision = 'lowp'; + } + + return { + SHADER_INTERPOLATION: { + isSupported: function () { + let supported = true; + + supported = supported && gl.getExtension('EXT_frag_depth'); + supported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8; + + return supported; + } + }, + SHADER_SPLATS: { + isSupported: function () { + let supported = true; + + supported = supported && gl.getExtension('EXT_frag_depth'); + supported = supported && gl.getExtension('OES_texture_float'); + supported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8; + + return supported; + } + + }, + SHADER_EDL: { + isSupported: function () { + let supported = true; + + supported = supported && gl.getExtension('EXT_frag_depth'); + supported = supported && gl.getExtension('OES_texture_float'); + supported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8; + + //supported = supported || (gl instanceof WebGL2RenderingContext); + + return supported; + } + + }, + //WEBGL2: { + // isSupported: function(){ + // return gl instanceof WebGL2RenderingContext; + // } + //}, + precision: precision + }; + }()); + + const KeyCodes = { + + LEFT: 37, + UP: 38, + RIGHT: 39, + BOTTOM: 40, + DELETE: 46, + + A: 'A'.charCodeAt(0), + S: 'S'.charCodeAt(0), + D: 'D'.charCodeAt(0), + W: 'W'.charCodeAt(0), + Q: 'Q'.charCodeAt(0), + E: 'E'.charCodeAt(0), + R: 'R'.charCodeAt(0), + F: 'F'.charCodeAt(0) + + }; + + class LRUItem{ + + constructor(node){ + this.previous = null; + this.next = null; + this.node = node; + } + + } + + /** + * + * @class A doubly-linked-list of the least recently used elements. + */ + class LRU{ + + constructor(){ + // the least recently used item + this.first = null; + // the most recently used item + this.last = null; + // a list of all items in the lru list + this.items = {}; + this.elements = 0; + this.numPoints = 0; + } + + size(){ + return this.elements; + } + + contains(node){ + return this.items[node.id] == null; + } + + touch(node){ + if (!node.loaded) { + return; + } + + let item; + if (this.items[node.id] == null) { + // add to list + item = new LRUItem(node); + item.previous = this.last; + this.last = item; + if (item.previous !== null) { + item.previous.next = item; + } + + this.items[node.id] = item; + this.elements++; + + if (this.first === null) { + this.first = item; + } + this.numPoints += node.numPoints; + } else { + // update in list + item = this.items[node.id]; + if (item.previous === null) { + // handle touch on first element + if (item.next !== null) { + this.first = item.next; + this.first.previous = null; + item.previous = this.last; + item.next = null; + this.last = item; + item.previous.next = item; + } + } else if (item.next === null) { + // handle touch on last element + } else { + // handle touch on any other element + item.previous.next = item.next; + item.next.previous = item.previous; + item.previous = this.last; + item.next = null; + this.last = item; + item.previous.next = item; + } + } + } + + remove(node){ + let lruItem = this.items[node.id]; + if (lruItem) { + if (this.elements === 1) { + this.first = null; + this.last = null; + } else { + if (!lruItem.previous) { + this.first = lruItem.next; + this.first.previous = null; + } + if (!lruItem.next) { + this.last = lruItem.previous; + this.last.next = null; + } + if (lruItem.previous && lruItem.next) { + lruItem.previous.next = lruItem.next; + lruItem.next.previous = lruItem.previous; + } + } + + delete this.items[node.id]; + this.elements--; + this.numPoints -= node.numPoints; + } + } + + getLRUItem(){ + if (this.first === null) { + return null; + } + let lru = this.first; + + return lru.node; + } + + toString(){ + let string = '{ '; + let curr = this.first; + while (curr !== null) { + string += curr.node.id; + if (curr.next !== null) { + string += ', '; + } + curr = curr.next; + } + string += '}'; + string += '(' + this.size() + ')'; + return string; + } + + freeMemory(){ + if (this.elements <= 1) { + return; + } + + while (this.numPoints > Potree.pointLoadLimit) { + let element = this.first; + let node = element.node; + this.disposeDescendants(node); + } + } + + disposeDescendants(node){ + let stack = []; + stack.push(node); + while (stack.length > 0) { + let current = stack.pop(); + + // console.log(current); + + current.dispose(); + this.remove(current); + + for (let key in current.children) { + if (current.children.hasOwnProperty(key)) { + let child = current.children[key]; + if (child.loaded) { + stack.push(current.children[key]); + } + } + } + } + } + + } + + class PointCloudTreeNode extends EventDispatcher{ + + constructor(){ + super(); + this.needsTransformUpdate = true; + } + + getChildren () { + throw new Error('override function'); + } + + getBoundingBox () { + throw new Error('override function'); + } + + isLoaded () { + throw new Error('override function'); + } + + isGeometryNode () { + throw new Error('override function'); + } + + isTreeNode () { + throw new Error('override function'); + } + + getLevel () { + throw new Error('override function'); + } + + getBoundingSphere () { + throw new Error('override function'); + } + }; + + class PointCloudTree extends Object3D { + constructor () { + super(); + } + + initialized () { + return this.root !== null; + } + }; + + /** + * Some types of possible point attribute data formats + * + * @class + */ + const PointAttributeTypes = { + DATA_TYPE_DOUBLE: {ordinal: 0, name: "double", size: 8}, + DATA_TYPE_FLOAT: {ordinal: 1, name: "float", size: 4}, + DATA_TYPE_INT8: {ordinal: 2, name: "int8", size: 1}, + DATA_TYPE_UINT8: {ordinal: 3, name: "uint8", size: 1}, + DATA_TYPE_INT16: {ordinal: 4, name: "int16", size: 2}, + DATA_TYPE_UINT16: {ordinal: 5, name: "uint16", size: 2}, + DATA_TYPE_INT32: {ordinal: 6, name: "int32", size: 4}, + DATA_TYPE_UINT32: {ordinal: 7, name: "uint32", size: 4}, + DATA_TYPE_INT64: {ordinal: 8, name: "int64", size: 8}, + DATA_TYPE_UINT64: {ordinal: 9, name: "uint64", size: 8} + }; + + let i = 0; + for (let obj in PointAttributeTypes) { + PointAttributeTypes[i] = PointAttributeTypes[obj]; + i++; + } + + + class PointAttribute{ + + constructor(name, type, numElements){ + this.name = name; + this.type = type; + this.numElements = numElements; + this.byteSize = this.numElements * this.type.size; + this.description = ""; + this.range = [Infinity, -Infinity]; + } + + }; + + PointAttribute.POSITION_CARTESIAN = new PointAttribute( + "POSITION_CARTESIAN", PointAttributeTypes.DATA_TYPE_FLOAT, 3); + + PointAttribute.RGBA_PACKED = new PointAttribute( + "COLOR_PACKED", PointAttributeTypes.DATA_TYPE_INT8, 4); + + PointAttribute.COLOR_PACKED = PointAttribute.RGBA_PACKED; + + PointAttribute.RGB_PACKED = new PointAttribute( + "COLOR_PACKED", PointAttributeTypes.DATA_TYPE_INT8, 3); + + PointAttribute.NORMAL_FLOATS = new PointAttribute( + "NORMAL_FLOATS", PointAttributeTypes.DATA_TYPE_FLOAT, 3); + + PointAttribute.INTENSITY = new PointAttribute( + "INTENSITY", PointAttributeTypes.DATA_TYPE_UINT16, 1); + + PointAttribute.CLASSIFICATION = new PointAttribute( + "CLASSIFICATION", PointAttributeTypes.DATA_TYPE_UINT8, 1); + + PointAttribute.NORMAL_SPHEREMAPPED = new PointAttribute( + "NORMAL_SPHEREMAPPED", PointAttributeTypes.DATA_TYPE_UINT8, 2); + + PointAttribute.NORMAL_OCT16 = new PointAttribute( + "NORMAL_OCT16", PointAttributeTypes.DATA_TYPE_UINT8, 2); + + PointAttribute.NORMAL = new PointAttribute( + "NORMAL", PointAttributeTypes.DATA_TYPE_FLOAT, 3); + + PointAttribute.RETURN_NUMBER = new PointAttribute( + "RETURN_NUMBER", PointAttributeTypes.DATA_TYPE_UINT8, 1); + + PointAttribute.NUMBER_OF_RETURNS = new PointAttribute( + "NUMBER_OF_RETURNS", PointAttributeTypes.DATA_TYPE_UINT8, 1); + + PointAttribute.SOURCE_ID = new PointAttribute( + "SOURCE_ID", PointAttributeTypes.DATA_TYPE_UINT16, 1); + + PointAttribute.INDICES = new PointAttribute( + "INDICES", PointAttributeTypes.DATA_TYPE_UINT32, 1); + + PointAttribute.SPACING = new PointAttribute( + "SPACING", PointAttributeTypes.DATA_TYPE_FLOAT, 1); + + PointAttribute.GPS_TIME = new PointAttribute( + "GPS_TIME", PointAttributeTypes.DATA_TYPE_DOUBLE, 1); + + class PointAttributes{ + + constructor(pointAttributes){ + this.attributes = []; + this.byteSize = 0; + this.size = 0; + this.vectors = []; + + if (pointAttributes != null) { + for (let i = 0; i < pointAttributes.length; i++) { + let pointAttributeName = pointAttributes[i]; + let pointAttribute = PointAttribute[pointAttributeName]; + this.attributes.push(pointAttribute); + this.byteSize += pointAttribute.byteSize; + this.size++; + } + } + } + + + add(pointAttribute){ + this.attributes.push(pointAttribute); + this.byteSize += pointAttribute.byteSize; + this.size++; + }; + + addVector(vector){ + this.vectors.push(vector); + } + + hasColors(){ + for (let name in this.attributes) { + let pointAttribute = this.attributes[name]; + if (pointAttribute.name === PointAttributeNames.COLOR_PACKED) { + return true; + } + } + + return false; + }; + + hasNormals(){ + for (let name in this.attributes) { + let pointAttribute = this.attributes[name]; + if ( + pointAttribute === PointAttribute.NORMAL_SPHEREMAPPED || + pointAttribute === PointAttribute.NORMAL_FLOATS || + pointAttribute === PointAttribute.NORMAL || + pointAttribute === PointAttribute.NORMAL_OCT16) { + return true; + } + } + + return false; + }; + + } + + class U { + static toVector3(v, offset) { + return new Vector3().fromArray(v, offset || 0); + } + + static toBox3(b) { + return new Box3(U.toVector3(b), U.toVector3(b, 3)); + }; + + static findDim(schema, name) { + var dim = schema.find((dim) => dim.name == name); + if (!dim) throw new Error('Failed to find ' + name + ' in schema'); + return dim; + } + + static sphereFrom(b) { + return b.getBoundingSphere(new Sphere()); + } + }; + + class PointCloudEptGeometry { + constructor(url, info) { + let version = info.version; + let schema = info.schema; + let bounds = info.bounds; + let boundsConforming = info.boundsConforming; + + let xyz = [ + U.findDim(schema, 'X'), + U.findDim(schema, 'Y'), + U.findDim(schema, 'Z') + ]; + let scale = xyz.map((d) => d.scale || 1); + let offset = xyz.map((d) => d.offset || 0); + this.eptScale = U.toVector3(scale); + this.eptOffset = U.toVector3(offset); + + this.url = url; + this.info = info; + this.type = 'ept'; + + this.schema = schema; + this.span = info.span || info.ticks; + this.boundingBox = U.toBox3(bounds); + this.tightBoundingBox = U.toBox3(boundsConforming); + this.offset = U.toVector3([0, 0, 0]); + this.boundingSphere = U.sphereFrom(this.boundingBox); + this.tightBoundingSphere = U.sphereFrom(this.tightBoundingBox); + this.version = new Potree.Version('1.7'); + + this.projection = null; + this.fallbackProjection = null; + + if (info.srs && info.srs.horizontal) { + this.projection = info.srs.authority + ':' + info.srs.horizontal; + } + + if (info.srs.wkt) { + if (!this.projection) this.projection = info.srs.wkt; + else this.fallbackProjection = info.srs.wkt; + } + + { + // TODO [mschuetz]: named projections that proj4 can't handle seem to cause problems. + // remove them for now + + try{ + proj4(this.projection); + }catch(e){ + this.projection = null; + } + + + + } + + + { + const attributes = new PointAttributes(); + + attributes.add(PointAttribute.POSITION_CARTESIAN); + attributes.add(new PointAttribute("rgba", PointAttributeTypes.DATA_TYPE_UINT8, 4)); + attributes.add(new PointAttribute("intensity", PointAttributeTypes.DATA_TYPE_UINT16, 1)); + attributes.add(new PointAttribute("classification", PointAttributeTypes.DATA_TYPE_UINT8, 1)); + attributes.add(new PointAttribute("gps-time", PointAttributeTypes.DATA_TYPE_DOUBLE, 1)); + attributes.add(new PointAttribute("returnNumber", PointAttributeTypes.DATA_TYPE_UINT8, 1)); + attributes.add(new PointAttribute("number of returns", PointAttributeTypes.DATA_TYPE_UINT8, 1)); + attributes.add(new PointAttribute("return number", PointAttributeTypes.DATA_TYPE_UINT8, 1)); + attributes.add(new PointAttribute("source id", PointAttributeTypes.DATA_TYPE_UINT16, 1)); + + this.pointAttributes = attributes; + } + + + + this.spacing = + (this.boundingBox.max.x - this.boundingBox.min.x) / this.span; + + let hierarchyType = info.hierarchyType || 'json'; + + const dataType = info.dataType; + if (dataType == 'laszip') { + this.loader = new Potree.EptLaszipLoader(); + } + else if (dataType == 'binary') { + this.loader = new Potree.EptBinaryLoader(); + } + else if (dataType == 'zstandard') { + this.loader = new Potree.EptZstandardLoader(); + } + else { + throw new Error('Could not read data type: ' + dataType); + } + } + }; + + class EptKey { + constructor(ept, b, d, x, y, z) { + this.ept = ept; + this.b = b; + this.d = d; + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + } + + name() { + return this.d + '-' + this.x + '-' + this.y + '-' + this.z; + } + + step(a, b, c) { + let min = this.b.min.clone(); + let max = this.b.max.clone(); + let dst = new Vector3().subVectors(max, min); + + if (a) min.x += dst.x / 2; + else max.x -= dst.x / 2; + + if (b) min.y += dst.y / 2; + else max.y -= dst.y / 2; + + if (c) min.z += dst.z / 2; + else max.z -= dst.z / 2; + + return new Potree.EptKey( + this.ept, + new Box3(min, max), + this.d + 1, + this.x * 2 + a, + this.y * 2 + b, + this.z * 2 + c); + } + + children() { + var result = []; + for (var a = 0; a < 2; ++a) { + for (var b = 0; b < 2; ++b) { + for (var c = 0; c < 2; ++c) { + var add = this.step(a, b, c).name(); + if (!result.includes(add)) result = result.concat(add); + } + } + } + return result; + } + } + + class PointCloudEptGeometryNode extends PointCloudTreeNode { + constructor(ept, b, d, x, y, z) { + super(); + + this.ept = ept; + this.key = new Potree.EptKey( + this.ept, + b || this.ept.boundingBox, + d || 0, + x, + y, + z); + + this.id = PointCloudEptGeometryNode.IDCount++; + this.geometry = null; + this.boundingBox = this.key.b; + this.tightBoundingBox = this.boundingBox; + this.spacing = this.ept.spacing / Math.pow(2, this.key.d); + this.boundingSphere = U.sphereFrom(this.boundingBox); + + // These are set during hierarchy loading. + this.hasChildren = false; + this.children = { }; + this.numPoints = -1; + + this.level = this.key.d; + this.loaded = false; + this.loading = false; + this.oneTimeDisposeHandlers = []; + + let k = this.key; + this.name = this.toPotreeName(k.d, k.x, k.y, k.z); + this.index = parseInt(this.name.charAt(this.name.length - 1)); + } + + isGeometryNode() { return true; } + getLevel() { return this.level; } + isTreeNode() { return false; } + isLoaded() { return this.loaded; } + getBoundingSphere() { return this.boundingSphere; } + getBoundingBox() { return this.boundingBox; } + url() { return this.ept.url + 'ept-data/' + this.filename(); } + getNumPoints() { return this.numPoints; } + + filename() { return this.key.name(); } + + getChildren() { + let children = []; + + for (let i = 0; i < 8; i++) { + if (this.children[i]) { + children.push(this.children[i]); + } + } + + return children; + } + + addChild(child) { + this.children[child.index] = child; + child.parent = this; + } + + load() { + if (this.loaded || this.loading) return; + if (Potree.numNodesLoading >= Potree.maxNodesLoading) return; + + this.loading = true; + ++Potree.numNodesLoading; + + if (this.numPoints == -1) this.loadHierarchy(); + this.loadPoints(); + } + + loadPoints(){ + this.ept.loader.load(this); + } + + async loadHierarchy() { + let nodes = { }; + nodes[this.filename()] = this; + this.hasChildren = false; + + let eptHierarchyFile = + `${this.ept.url}ept-hierarchy/${this.filename()}.json`; + + let response = await fetch(eptHierarchyFile); + let hier = await response.json(); + + // Since we want to traverse top-down, and 10 comes + // lexicographically before 9 (for example), do a deep sort. + var keys = Object.keys(hier).sort((a, b) => { + let [da, xa, ya, za] = a.split('-').map((n) => parseInt(n, 10)); + let [db, xb, yb, zb] = b.split('-').map((n) => parseInt(n, 10)); + if (da < db) return -1; if (da > db) return 1; + if (xa < xb) return -1; if (xa > xb) return 1; + if (ya < yb) return -1; if (ya > yb) return 1; + if (za < zb) return -1; if (za > zb) return 1; + return 0; + }); + + keys.forEach((v) => { + let [d, x, y, z] = v.split('-').map((n) => parseInt(n, 10)); + let a = x & 1, b = y & 1, c = z & 1; + let parentName = + (d - 1) + '-' + (x >> 1) + '-' + (y >> 1) + '-' + (z >> 1); + + let parentNode = nodes[parentName]; + if (!parentNode) return; + parentNode.hasChildren = true; + + let key = parentNode.key.step(a, b, c); + + let node = new Potree.PointCloudEptGeometryNode( + this.ept, + key.b, + key.d, + key.x, + key.y, + key.z); + + node.level = d; + node.numPoints = hier[v]; + + parentNode.addChild(node); + nodes[key.name()] = node; + }); + } + + doneLoading(bufferGeometry, tightBoundingBox, np, mean) { + bufferGeometry.boundingBox = this.boundingBox; + this.geometry = bufferGeometry; + this.tightBoundingBox = tightBoundingBox; + this.numPoints = np; + this.mean = mean; + this.loaded = true; + this.loading = false; + --Potree.numNodesLoading; + } + + toPotreeName(d, x, y, z) { + var name = 'r'; + + for (var i = 0; i < d; ++i) { + var shift = d - i - 1; + var mask = 1 << shift; + var step = 0; + + if (x & mask) step += 4; + if (y & mask) step += 2; + if (z & mask) step += 1; + + name += step; + } + + return name; + } + + dispose() { + if (this.geometry && this.parent != null) { + this.geometry.dispose(); + this.geometry = null; + this.loaded = false; + + // this.dispatchEvent( { type: 'dispose' } ); + for (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) { + let handler = this.oneTimeDisposeHandlers[i]; + handler(); + } + this.oneTimeDisposeHandlers = []; + } + } + } + + PointCloudEptGeometryNode.IDCount = 0; + + class PointCloudOctreeGeometry{ + + constructor(){ + this.url = null; + this.octreeDir = null; + this.spacing = 0; + this.boundingBox = null; + this.root = null; + this.nodes = null; + this.pointAttributes = null; + this.hierarchyStepSize = -1; + this.loader = null; + } + + } + + class PointCloudOctreeGeometryNode extends PointCloudTreeNode{ + + constructor(name, pcoGeometry, boundingBox){ + super(); + + this.id = PointCloudOctreeGeometryNode.IDCount++; + this.name = name; + this.index = parseInt(name.charAt(name.length - 1)); + this.pcoGeometry = pcoGeometry; + this.geometry = null; + this.boundingBox = boundingBox; + this.boundingSphere = boundingBox.getBoundingSphere(new Sphere()); + this.children = {}; + this.numPoints = 0; + this.level = null; + this.loaded = false; + this.oneTimeDisposeHandlers = []; + } + + isGeometryNode(){ + return true; + } + + getLevel(){ + return this.level; + } + + isTreeNode(){ + return false; + } + + isLoaded(){ + return this.loaded; + } + + getBoundingSphere(){ + return this.boundingSphere; + } + + getBoundingBox(){ + return this.boundingBox; + } + + getChildren(){ + let children = []; + + for (let i = 0; i < 8; i++) { + if (this.children[i]) { + children.push(this.children[i]); + } + } + + return children; + } + + getBoundingBox(){ + return this.boundingBox; + } + + getURL(){ + let url = ''; + + let version = this.pcoGeometry.loader.version; + + if (version.equalOrHigher('1.5')) { + url = this.pcoGeometry.octreeDir + '/' + this.getHierarchyPath() + '/' + this.name; + } else if (version.equalOrHigher('1.4')) { + url = this.pcoGeometry.octreeDir + '/' + this.name; + } else if (version.upTo('1.3')) { + url = this.pcoGeometry.octreeDir + '/' + this.name; + } + + return url; + } + + getHierarchyPath(){ + let path = 'r/'; + + let hierarchyStepSize = this.pcoGeometry.hierarchyStepSize; + let indices = this.name.substr(1); + + let numParts = Math.floor(indices.length / hierarchyStepSize); + for (let i = 0; i < numParts; i++) { + path += indices.substr(i * hierarchyStepSize, hierarchyStepSize) + '/'; + } + + path = path.slice(0, -1); + + return path; + } + + addChild(child) { + this.children[child.index] = child; + child.parent = this; + } + + load(){ + if (this.loading === true || this.loaded === true || Potree.numNodesLoading >= Potree.maxNodesLoading) { + return; + } + + this.loading = true; + + Potree.numNodesLoading++; + + if (this.pcoGeometry.loader.version.equalOrHigher('1.5')) { + if ((this.level % this.pcoGeometry.hierarchyStepSize) === 0 && this.hasChildren) { + this.loadHierachyThenPoints(); + } else { + this.loadPoints(); + } + } else { + this.loadPoints(); + } + } + + loadPoints(){ + this.pcoGeometry.loader.load(this); + } + + loadHierachyThenPoints(){ + let node = this; + + // load hierarchy + let callback = function (node, hbuffer) { + + let tStart = performance.now(); + + let view = new DataView(hbuffer); + + let stack = []; + let children = view.getUint8(0); + let numPoints = view.getUint32(1, true); + node.numPoints = numPoints; + stack.push({children: children, numPoints: numPoints, name: node.name}); + + let decoded = []; + + let offset = 5; + while (stack.length > 0) { + let snode = stack.shift(); + let mask = 1; + for (let i = 0; i < 8; i++) { + if ((snode.children & mask) !== 0) { + let childName = snode.name + i; + + let childChildren = view.getUint8(offset); + let childNumPoints = view.getUint32(offset + 1, true); + + stack.push({children: childChildren, numPoints: childNumPoints, name: childName}); + + decoded.push({children: childChildren, numPoints: childNumPoints, name: childName}); + + offset += 5; + } + + mask = mask * 2; + } + + if (offset === hbuffer.byteLength) { + break; + } + } + + // console.log(decoded); + + let nodes = {}; + nodes[node.name] = node; + let pco = node.pcoGeometry; + + for (let i = 0; i < decoded.length; i++) { + let name = decoded[i].name; + let decodedNumPoints = decoded[i].numPoints; + let index = parseInt(name.charAt(name.length - 1)); + let parentName = name.substring(0, name.length - 1); + let parentNode = nodes[parentName]; + let level = name.length - 1; + let boundingBox = Utils.createChildAABB(parentNode.boundingBox, index); + + let currentNode = new PointCloudOctreeGeometryNode(name, pco, boundingBox); + currentNode.level = level; + currentNode.numPoints = decodedNumPoints; + currentNode.hasChildren = decoded[i].children > 0; + currentNode.spacing = pco.spacing / Math.pow(2, level); + parentNode.addChild(currentNode); + nodes[name] = currentNode; + } + + let duration = performance.now() - tStart; + if(duration > 5){ + let msg = `duration: ${duration}ms, numNodes: ${decoded.length}`; + console.log(msg); + } + + node.loadPoints(); + }; + if ((node.level % node.pcoGeometry.hierarchyStepSize) === 0) { + // let hurl = node.pcoGeometry.octreeDir + "/../hierarchy/" + node.name + ".hrc"; + let hurl = node.pcoGeometry.octreeDir + '/' + node.getHierarchyPath() + '/' + node.name + '.hrc'; + + let xhr = XHRFactory.createXMLHttpRequest(); + xhr.open('GET', hurl, true); + xhr.responseType = 'arraybuffer'; + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + xhr.onreadystatechange = () => { + if (xhr.readyState === 4) { + if (xhr.status === 200 || xhr.status === 0) { + let hbuffer = xhr.response; + callback(node, hbuffer); + } else { + console.log('Failed to load file! HTTP status: ' + xhr.status + ', file: ' + hurl); + Potree.numNodesLoading--; + } + } + }; + try { + xhr.send(null); + } catch (e) { + console.log('fehler beim laden der punktwolke: ' + e); + } + } + } + + getNumPoints(){ + return this.numPoints; + } + + dispose(){ + if (this.geometry && this.parent != null) { + this.geometry.dispose(); + this.geometry = null; + this.loaded = false; + + this.dispatchEvent( { type: 'dispose' } ); + + for (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) { + let handler = this.oneTimeDisposeHandlers[i]; + handler(); + } + this.oneTimeDisposeHandlers = []; + } + } + + } + + PointCloudOctreeGeometryNode.IDCount = 0; + + // ------------------------------------------- + // to get a ready to use gradient array from a chroma.js gradient: + // http://gka.github.io/chroma.js/ + // ------------------------------------------- + // + // let stops = []; + // for(let i = 0; i <= 10; i++){ + // let range = chroma.scale(['yellow', 'navy']).mode('lch').domain([10,0])(i)._rgb + // .slice(0, 3) + // .map(v => (v / 255).toFixed(4)) + // .join(", "); + // + // let line = `[${i / 10}, new THREE.Color(${range})],`; + // + // stops.push(line); + // } + // stops.join("\n"); + // + // + // + // ------------------------------------------- + // to get a ready to use gradient array from matplotlib: + // ------------------------------------------- + // import matplotlib.pyplot as plt + // import matplotlib.colors as colors + // + // norm = colors.Normalize(vmin=0,vmax=1) + // cmap = plt.cm.viridis + // + // for i in range(0,11): + // u = i / 10 + // rgb = cmap(norm(u))[0:3] + // rgb = ["{0:.3f}".format(v) for v in rgb] + // rgb = "[" + str(u) + ", new THREE.Color(" + ", ".join(rgb) + ")]," + // print(rgb) + + let Gradients = { + // From chroma spectral http://gka.github.io/chroma.js/ + SPECTRAL: [ + [0, new Color(0.3686, 0.3098, 0.6353)], + [0.1, new Color(0.1961, 0.5333, 0.7412)], + [0.2, new Color(0.4000, 0.7608, 0.6471)], + [0.3, new Color(0.6706, 0.8667, 0.6431)], + [0.4, new Color(0.9020, 0.9608, 0.5961)], + [0.5, new Color(1.0000, 1.0000, 0.7490)], + [0.6, new Color(0.9961, 0.8784, 0.5451)], + [0.7, new Color(0.9922, 0.6824, 0.3804)], + [0.8, new Color(0.9569, 0.4275, 0.2627)], + [0.9, new Color(0.8353, 0.2431, 0.3098)], + [1, new Color(0.6196, 0.0039, 0.2588)] + ], + PLASMA: [ + [0.0, new Color(0.241, 0.015, 0.610)], + [0.1, new Color(0.387, 0.001, 0.654)], + [0.2, new Color(0.524, 0.025, 0.653)], + [0.3, new Color(0.651, 0.125, 0.596)], + [0.4, new Color(0.752, 0.227, 0.513)], + [0.5, new Color(0.837, 0.329, 0.431)], + [0.6, new Color(0.907, 0.435, 0.353)], + [0.7, new Color(0.963, 0.554, 0.272)], + [0.8, new Color(0.992, 0.681, 0.195)], + [0.9, new Color(0.987, 0.822, 0.144)], + [1.0, new Color(0.940, 0.975, 0.131)] + ], + YELLOW_GREEN: [ + [0, new Color(0.1647, 0.2824, 0.3451)], + [0.1, new Color(0.1338, 0.3555, 0.4227)], + [0.2, new Color(0.0610, 0.4319, 0.4864)], + [0.3, new Color(0.0000, 0.5099, 0.5319)], + [0.4, new Color(0.0000, 0.5881, 0.5569)], + [0.5, new Color(0.1370, 0.6650, 0.5614)], + [0.6, new Color(0.2906, 0.7395, 0.5477)], + [0.7, new Color(0.4453, 0.8099, 0.5201)], + [0.8, new Color(0.6102, 0.8748, 0.4850)], + [0.9, new Color(0.7883, 0.9323, 0.4514)], + [1, new Color(0.9804, 0.9804, 0.4314)] + ], + VIRIDIS: [ + [0.0, new Color(0.267, 0.005, 0.329)], + [0.1, new Color(0.283, 0.141, 0.458)], + [0.2, new Color(0.254, 0.265, 0.530)], + [0.3, new Color(0.207, 0.372, 0.553)], + [0.4, new Color(0.164, 0.471, 0.558)], + [0.5, new Color(0.128, 0.567, 0.551)], + [0.6, new Color(0.135, 0.659, 0.518)], + [0.7, new Color(0.267, 0.749, 0.441)], + [0.8, new Color(0.478, 0.821, 0.318)], + [0.9, new Color(0.741, 0.873, 0.150)], + [1.0, new Color(0.993, 0.906, 0.144)] + ], + INFERNO: [ + [0.0, new Color(0.077, 0.042, 0.206)], + [0.1, new Color(0.225, 0.036, 0.388)], + [0.2, new Color(0.373, 0.074, 0.432)], + [0.3, new Color(0.522, 0.128, 0.420)], + [0.4, new Color(0.665, 0.182, 0.370)], + [0.5, new Color(0.797, 0.255, 0.287)], + [0.6, new Color(0.902, 0.364, 0.184)], + [0.7, new Color(0.969, 0.516, 0.063)], + [0.8, new Color(0.988, 0.683, 0.072)], + [0.9, new Color(0.961, 0.859, 0.298)], + [1.0, new Color(0.988, 0.998, 0.645)] + ], + GRAYSCALE: [ + [0, new Color(0, 0, 0)], + [1, new Color(1, 1, 1)] + ], + // 16 samples of the TURBU color scheme + // values taken from: https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f + // original file licensed under Apache-2.0 + TURBO: [ + [0.00, new Color(0.18995, 0.07176, 0.23217)], + [0.07, new Color(0.25107, 0.25237, 0.63374)], + [0.13, new Color(0.27628, 0.42118, 0.89123)], + [0.20, new Color(0.25862, 0.57958, 0.99876)], + [0.27, new Color(0.15844, 0.73551, 0.92305)], + [0.33, new Color(0.09267, 0.86554, 0.7623)], + [0.40, new Color(0.19659, 0.94901, 0.59466)], + [0.47, new Color(0.42778, 0.99419, 0.38575)], + [0.53, new Color(0.64362, 0.98999, 0.23356)], + [0.60, new Color(0.80473, 0.92452, 0.20459)], + [0.67, new Color(0.93301, 0.81236, 0.22667)], + [0.73, new Color(0.99314, 0.67408, 0.20348)], + [0.80, new Color(0.9836, 0.49291, 0.12849)], + [0.87, new Color(0.92105, 0.31489, 0.05475)], + [0.93, new Color(0.81608, 0.18462, 0.01809)], + [1.00, new Color(0.66449, 0.08436, 0.00424)], + ], + RAINBOW: [ + [0, new Color(0.278, 0, 0.714)], + [1 / 6, new Color(0, 0, 1)], + [2 / 6, new Color(0, 1, 1)], + [3 / 6, new Color(0, 1, 0)], + [4 / 6, new Color(1, 1, 0)], + [5 / 6, new Color(1, 0.64, 0)], + [1, new Color(1, 0, 0)] + ], + CONTOUR: [ + [0.00, new Color(0, 0, 0)], + [0.03, new Color(0, 0, 0)], + [0.04, new Color(1, 1, 1)], + [1.00, new Color(1, 1, 1)] + ], + }; + + let Shaders = {}; + + Shaders["pointcloud.vs"] = ` +precision highp float; +precision highp int; + +#define max_clip_polygons 8 +#define PI 3.141592653589793 + +attribute vec3 position; +attribute vec3 color; +attribute float intensity; +attribute float classification; +attribute float returnNumber; +attribute float numberOfReturns; +attribute float pointSourceID; +attribute vec4 indices; +attribute float spacing; +attribute float gpsTime; +attribute vec3 normal; +attribute float aExtra; + +uniform mat4 modelMatrix; +uniform mat4 modelViewMatrix; +uniform mat4 projectionMatrix; +uniform mat4 viewMatrix; +uniform mat4 uViewInv; + +uniform float uScreenWidth; +uniform float uScreenHeight; +uniform float fov; +uniform float near; +uniform float far; + +uniform bool uDebug; + +uniform bool uUseOrthographicCamera; +uniform float uOrthoWidth; +uniform float uOrthoHeight; + +#define CLIPTASK_NONE 0 +#define CLIPTASK_HIGHLIGHT 1 +#define CLIPTASK_SHOW_INSIDE 2 +#define CLIPTASK_SHOW_OUTSIDE 3 + +#define CLIPMETHOD_INSIDE_ANY 0 +#define CLIPMETHOD_INSIDE_ALL 1 + +uniform int clipTask; +uniform int clipMethod; +#if defined(num_clipboxes) && num_clipboxes > 0 + uniform mat4 clipBoxes[num_clipboxes]; +#endif + +#if defined(num_clipspheres) && num_clipspheres > 0 + uniform mat4 uClipSpheres[num_clipspheres]; +#endif + +#if defined(num_clippolygons) && num_clippolygons > 0 + uniform int uClipPolygonVCount[num_clippolygons]; + uniform vec3 uClipPolygonVertices[num_clippolygons * 8]; + uniform mat4 uClipPolygonWVP[num_clippolygons]; +#endif + + +uniform float size; +uniform float minSize; +uniform float maxSize; + +uniform float uPCIndex; +uniform float uOctreeSpacing; +uniform float uNodeSpacing; +uniform float uOctreeSize; +uniform vec3 uBBSize; +uniform float uLevel; +uniform float uVNStart; +uniform bool uIsLeafNode; + +uniform vec3 uColor; +uniform float uOpacity; + +uniform vec2 elevationRange; +uniform vec2 intensityRange; + +uniform vec2 uFilterReturnNumberRange; +uniform vec2 uFilterNumberOfReturnsRange; +uniform vec2 uFilterPointSourceIDClipRange; +uniform vec2 uFilterGPSTimeClipRange; +uniform float uGpsScale; +uniform float uGpsOffset; + +uniform vec2 uNormalizedGpsBufferRange; + +uniform vec3 uIntensity_gbc; +uniform vec3 uRGB_gbc; +uniform vec3 uExtra_gbc; + +uniform float uTransition; +uniform float wRGB; +uniform float wIntensity; +uniform float wElevation; +uniform float wClassification; +uniform float wReturnNumber; +uniform float wSourceID; + +uniform vec2 uExtraNormalizedRange; +uniform vec2 uExtraRange; +uniform float uExtraScale; +uniform float uExtraOffset; + +uniform vec3 uShadowColor; + +uniform sampler2D visibleNodes; +uniform sampler2D gradient; +uniform sampler2D classificationLUT; + +#if defined(color_type_matcap) +uniform sampler2D matcapTextureUniform; +#endif +uniform bool backfaceCulling; + +#if defined(num_shadowmaps) && num_shadowmaps > 0 +uniform sampler2D uShadowMap[num_shadowmaps]; +uniform mat4 uShadowWorldView[num_shadowmaps]; +uniform mat4 uShadowProj[num_shadowmaps]; +#endif + +varying vec3 vColor; +varying float vLogDepth; +varying vec3 vViewPosition; +varying float vRadius; +varying float vPointSize; + + +float round(float number){ + return floor(number + 0.5); +} + +// +// ### ######## ### ######## ######## #### ## ## ######## ###### #### ######## ######## ###### +// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## +// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## +// ## ## ## ## ## ## ######## ## ## ## ## ###### ###### ## ## ###### ###### +// ######### ## ## ######### ## ## ## ## ## ## ## ## ## ## ## +// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## +// ## ## ######## ## ## ## ## #### ### ######## ###### #### ######## ######## ###### +// + + +// --------------------- +// OCTREE +// --------------------- + +#if (defined(adaptive_point_size) || defined(color_type_level_of_detail)) && defined(tree_type_octree) +/** + * number of 1-bits up to inclusive index position + * number is treated as if it were an integer in the range 0-255 + * + */ +int numberOfOnes(int number, int index){ + int numOnes = 0; + int tmp = 128; + for(int i = 7; i >= 0; i--){ + + if(number >= tmp){ + number = number - tmp; + + if(i <= index){ + numOnes++; + } + } + + tmp = tmp / 2; + } + + return numOnes; +} + + +/** + * checks whether the bit at index is 1 + * number is treated as if it were an integer in the range 0-255 + * + */ +bool isBitSet(int number, int index){ + + // weird multi else if due to lack of proper array, int and bitwise support in WebGL 1.0 + int powi = 1; + if(index == 0){ + powi = 1; + }else if(index == 1){ + powi = 2; + }else if(index == 2){ + powi = 4; + }else if(index == 3){ + powi = 8; + }else if(index == 4){ + powi = 16; + }else if(index == 5){ + powi = 32; + }else if(index == 6){ + powi = 64; + }else if(index == 7){ + powi = 128; + }else{ + return false; + } + + int ndp = number / powi; + + return mod(float(ndp), 2.0) != 0.0; +} + + +/** + * find the LOD at the point position + */ +float getLOD(){ + + vec3 offset = vec3(0.0, 0.0, 0.0); + int iOffset = int(uVNStart); + float depth = uLevel; + for(float i = 0.0; i <= 30.0; i++){ + float nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0); + + vec3 index3d = (position-offset) / nodeSizeAtLevel; + index3d = floor(index3d + 0.5); + int index = int(round(4.0 * index3d.x + 2.0 * index3d.y + index3d.z)); + + vec4 value = texture2D(visibleNodes, vec2(float(iOffset) / 2048.0, 0.0)); + int mask = int(round(value.r * 255.0)); + + if(isBitSet(mask, index)){ + // there are more visible child nodes at this position + int advanceG = int(round(value.g * 255.0)) * 256; + int advanceB = int(round(value.b * 255.0)); + int advanceChild = numberOfOnes(mask, index - 1); + int advance = advanceG + advanceB + advanceChild; + + iOffset = iOffset + advance; + + depth++; + }else{ + // no more visible child nodes at this position + //return value.a * 255.0; + + float lodOffset = (255.0 * value.a) / 10.0 - 10.0; + + return depth + lodOffset; + } + + offset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d; + } + + return depth; +} + +float getSpacing(){ + vec3 offset = vec3(0.0, 0.0, 0.0); + int iOffset = int(uVNStart); + float depth = uLevel; + float spacing = uNodeSpacing; + for(float i = 0.0; i <= 30.0; i++){ + float nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0); + + vec3 index3d = (position-offset) / nodeSizeAtLevel; + index3d = floor(index3d + 0.5); + int index = int(round(4.0 * index3d.x + 2.0 * index3d.y + index3d.z)); + + vec4 value = texture2D(visibleNodes, vec2(float(iOffset) / 2048.0, 0.0)); + int mask = int(round(value.r * 255.0)); + float spacingFactor = value.a; + + if(i > 0.0){ + spacing = spacing / (255.0 * spacingFactor); + } + + + if(isBitSet(mask, index)){ + // there are more visible child nodes at this position + int advanceG = int(round(value.g * 255.0)) * 256; + int advanceB = int(round(value.b * 255.0)); + int advanceChild = numberOfOnes(mask, index - 1); + int advance = advanceG + advanceB + advanceChild; + + iOffset = iOffset + advance; + + //spacing = spacing / (255.0 * spacingFactor); + //spacing = spacing / 3.0; + + depth++; + }else{ + // no more visible child nodes at this position + return spacing; + } + + offset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d; + } + + return spacing; +} + +float getPointSizeAttenuation(){ + return pow(2.0, getLOD()); +} + + +#endif + + +// --------------------- +// KD-TREE +// --------------------- + +#if (defined(adaptive_point_size) || defined(color_type_level_of_detail)) && defined(tree_type_kdtree) + +float getLOD(){ + vec3 offset = vec3(0.0, 0.0, 0.0); + float iOffset = 0.0; + float depth = 0.0; + + + vec3 size = uBBSize; + vec3 pos = position; + + for(float i = 0.0; i <= 1000.0; i++){ + + vec4 value = texture2D(visibleNodes, vec2(iOffset / 2048.0, 0.0)); + + int children = int(value.r * 255.0); + float next = value.g * 255.0; + int split = int(value.b * 255.0); + + if(next == 0.0){ + return depth; + } + + vec3 splitv = vec3(0.0, 0.0, 0.0); + if(split == 1){ + splitv.x = 1.0; + }else if(split == 2){ + splitv.y = 1.0; + }else if(split == 4){ + splitv.z = 1.0; + } + + iOffset = iOffset + next; + + float factor = length(pos * splitv / size); + if(factor < 0.5){ + // left + if(children == 0 || children == 2){ + return depth; + } + }else{ + // right + pos = pos - size * splitv * 0.5; + if(children == 0 || children == 1){ + return depth; + } + if(children == 3){ + iOffset = iOffset + 1.0; + } + } + size = size * ((1.0 - (splitv + 1.0) / 2.0) + 0.5); + + depth++; + } + + + return depth; +} + +float getPointSizeAttenuation(){ + return 0.5 * pow(1.3, getLOD()); +} + +#endif + + + +// +// ### ######## ######## ######## #### ######## ## ## ######## ######## ###### +// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## +// ## ## ## ## ## ## ## ## ## ## ## ## ## ## +// ## ## ## ## ######## ## ######## ## ## ## ###### ###### +// ######### ## ## ## ## ## ## ## ## ## ## ## ## +// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## +// ## ## ## ## ## ## #### ######## ####### ## ######## ###### +// + + + +// formula adapted from: http://www.dfstudios.co.uk/articles/programming/image-programming-algorithms/image-processing-algorithms-part-5-contrast-adjustment/ +float getContrastFactor(float contrast){ + return (1.0158730158730156 * (contrast + 1.0)) / (1.0158730158730156 - contrast); +} + +vec3 getRGB(){ + vec3 rgb = color; + + rgb = pow(rgb, vec3(uRGB_gbc.x)); + rgb = rgb + uRGB_gbc.y; + rgb = (rgb - 0.5) * getContrastFactor(uRGB_gbc.z) + 0.5; + rgb = clamp(rgb, 0.0, 1.0); + + return rgb; +} + +float getIntensity(){ + float w = (intensity - intensityRange.x) / (intensityRange.y - intensityRange.x); + w = pow(w, uIntensity_gbc.x); + w = w + uIntensity_gbc.y; + w = (w - 0.5) * getContrastFactor(uIntensity_gbc.z) + 0.5; + w = clamp(w, 0.0, 1.0); + + return w; +} + +vec3 getGpsTime(){ + + float w = (gpsTime + uGpsOffset) * uGpsScale; + + + vec3 c = texture2D(gradient, vec2(w, 1.0 - w)).rgb; + + + // vec2 r = uNormalizedGpsBufferRange; + // float w = gpsTime * (r.y - r.x) + r.x; + // w = clamp(w, 0.0, 1.0); + // vec3 c = texture2D(gradient, vec2(w,1.0-w)).rgb; + + return c; +} + +vec3 getElevation(){ + vec4 world = modelMatrix * vec4( position, 1.0 ); + float w = (world.z - elevationRange.x) / (elevationRange.y - elevationRange.x); + vec3 cElevation = texture2D(gradient, vec2(w,1.0-w)).rgb; + + return cElevation; +} + +vec4 getClassification(){ + vec2 uv = vec2(classification / 255.0, 0.5); + vec4 classColor = texture2D(classificationLUT, uv); + + return classColor; +} + +vec3 getReturns(){ + + // 0b 00_000_111 + float rn = mod(returnNumber, 8.0); + // 0b 00_111_000 + float nr = mod(returnNumber / 8.0, 8.0); + + if(nr <= 1.0){ + return vec3(1.0, 0.0, 0.0); + }else{ + return vec3(0.0, 1.0, 0.0); + } + + // return vec3(nr / 4.0, 0.0, 0.0); + + // if(nr == 1.0){ + // return vec3(1.0, 1.0, 0.0); + // }else{ + // if(rn == 1.0){ + // return vec3(1.0, 0.0, 0.0); + // }else if(rn == nr){ + // return vec3(0.0, 0.0, 1.0); + // }else{ + // return vec3(0.0, 1.0, 0.0); + // } + // } + + // if(numberOfReturns == 1.0){ + // return vec3(1.0, 1.0, 0.0); + // }else{ + // if(returnNumber == 1.0){ + // return vec3(1.0, 0.0, 0.0); + // }else if(returnNumber == numberOfReturns){ + // return vec3(0.0, 0.0, 1.0); + // }else{ + // return vec3(0.0, 1.0, 0.0); + // } + // } +} + +vec3 getReturnNumber(){ + if(numberOfReturns == 1.0){ + return vec3(1.0, 1.0, 0.0); + }else{ + if(returnNumber == 1.0){ + return vec3(1.0, 0.0, 0.0); + }else if(returnNumber == numberOfReturns){ + return vec3(0.0, 0.0, 1.0); + }else{ + return vec3(0.0, 1.0, 0.0); + } + } +} + +vec3 getNumberOfReturns(){ + float value = numberOfReturns; + + float w = value / 6.0; + + vec3 color = texture2D(gradient, vec2(w, 1.0 - w)).rgb; + + return color; +} + +vec3 getSourceID(){ + float w = mod(pointSourceID, 10.0) / 10.0; + return texture2D(gradient, vec2(w,1.0 - w)).rgb; +} + +vec3 getCompositeColor(){ + vec3 c; + float w; + + c += wRGB * getRGB(); + w += wRGB; + + c += wIntensity * getIntensity() * vec3(1.0, 1.0, 1.0); + w += wIntensity; + + c += wElevation * getElevation(); + w += wElevation; + + c += wReturnNumber * getReturnNumber(); + w += wReturnNumber; + + c += wSourceID * getSourceID(); + w += wSourceID; + + vec4 cl = wClassification * getClassification(); + c += cl.a * cl.rgb; + w += wClassification * cl.a; + + c = c / w; + + if(w == 0.0){ + //c = color; + gl_Position = vec4(100.0, 100.0, 100.0, 0.0); + } + + return c; +} + + +vec3 getNormal(){ + //vec3 n_hsv = vec3( modelMatrix * vec4( normal, 0.0 )) * 0.5 + 0.5; // (n_world.xyz + vec3(1.,1.,1.)) / 2.; + vec3 n_view = normalize( vec3(modelViewMatrix * vec4( normal, 0.0 )) ); + return n_view; +} +bool applyBackfaceCulling() { + // Black not facing vertices / Backface culling + vec3 e = normalize(vec3(modelViewMatrix * vec4( position, 1. ))); + vec3 n = getNormal(); // normalize( vec3(modelViewMatrix * vec4( normal, 0.0 )) ); + + if((uUseOrthographicCamera && n.z <= 0.) || (!uUseOrthographicCamera && dot( n, e ) >= 0.)) { + return true; + } else { + return false; + } +} + +#if defined(color_type_matcap) +// Matcap Material +vec3 getMatcap(){ + vec3 eye = normalize( vec3( modelViewMatrix * vec4( position, 1. ) ) ); + if(uUseOrthographicCamera) { + eye = vec3(0., 0., -1.); + } + vec3 r_en = reflect( eye, getNormal() ); // or r_en = e - 2. * dot( n, e ) * n; + float m = 2. * sqrt(pow( r_en.x, 2. ) + pow( r_en.y, 2. ) + pow( r_en.z + 1., 2. )); + vec2 vN = r_en.xy / m + .5; + return texture2D(matcapTextureUniform, vN).rgb; +} +#endif + +vec3 getExtra(){ + + float w = (aExtra + uExtraOffset) * uExtraScale; + w = clamp(w, 0.0, 1.0); + + vec3 color = texture2D(gradient, vec2(w,1.0-w)).rgb; + + // vec2 r = uExtraNormalizedRange; + + // float w = aExtra * (r.y - r.x) + r.x; + + // w = (w - uExtraRange.x) / (uExtraRange.y - uExtraRange.x); + + // w = clamp(w, 0.0, 1.0); + + // vec3 color = texture2D(gradient, vec2(w,1.0-w)).rgb; + + return color; +} + +vec3 getColor(){ + vec3 color; + + #ifdef color_type_rgba + color = getRGB(); + #elif defined color_type_height || defined color_type_elevation + color = getElevation(); + #elif defined color_type_rgb_height + vec3 cHeight = getElevation(); + color = (1.0 - uTransition) * getRGB() + uTransition * cHeight; + #elif defined color_type_depth + float linearDepth = gl_Position.w; + float expDepth = (gl_Position.z / gl_Position.w) * 0.5 + 0.5; + color = vec3(linearDepth, expDepth, 0.0); + //color = vec3(1.0, 0.5, 0.3); + #elif defined color_type_intensity + float w = getIntensity(); + color = vec3(w, w, w); + #elif defined color_type_gps_time + color = getGpsTime(); + #elif defined color_type_intensity_gradient + float w = getIntensity(); + color = texture2D(gradient, vec2(w,1.0-w)).rgb; + #elif defined color_type_color + color = uColor; + #elif defined color_type_level_of_detail + float depth = getLOD(); + float w = depth / 10.0; + color = texture2D(gradient, vec2(w,1.0-w)).rgb; + #elif defined color_type_indices + color = indices.rgb; + #elif defined color_type_classification + vec4 cl = getClassification(); + color = cl.rgb; + #elif defined color_type_return_number + color = getReturnNumber(); + #elif defined color_type_returns + color = getReturns(); + #elif defined color_type_number_of_returns + color = getNumberOfReturns(); + #elif defined color_type_source_id + color = getSourceID(); + #elif defined color_type_point_source_id + color = getSourceID(); + #elif defined color_type_normal + color = (modelMatrix * vec4(normal, 0.0)).xyz; + #elif defined color_type_phong + color = color; + #elif defined color_type_composite + color = getCompositeColor(); + #elif defined color_type_matcap + color = getMatcap(); + #else + color = getExtra(); + #endif + + if (backfaceCulling && applyBackfaceCulling()) { + color = vec3(0.); + } + + return color; +} + +float getPointSize(){ + float pointSize = 1.0; + + float slope = tan(fov / 2.0); + float projFactor = -0.5 * uScreenHeight / (slope * vViewPosition.z); + + float scale = length( + modelViewMatrix * vec4(0, 0, 0, 1) - + modelViewMatrix * vec4(uOctreeSpacing, 0, 0, 1) + ) / uOctreeSpacing; + projFactor = projFactor * scale; + + float r = uOctreeSpacing * 1.7; + vRadius = r; + #if defined fixed_point_size + pointSize = size; + #elif defined attenuated_point_size + if(uUseOrthographicCamera){ + pointSize = size; + }else{ + pointSize = size * spacing * projFactor; + //pointSize = pointSize * projFactor; + } + #elif defined adaptive_point_size + if(uUseOrthographicCamera) { + float worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation(); + pointSize = (worldSpaceSize / uOrthoWidth) * uScreenWidth; + } else { + float worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation(); + pointSize = worldSpaceSize * projFactor; + } + #endif + + pointSize = max(minSize, pointSize); + pointSize = min(maxSize, pointSize); + + vRadius = pointSize / projFactor; + + return pointSize; +} + +#if defined(num_clippolygons) && num_clippolygons > 0 +bool pointInClipPolygon(vec3 point, int polyIdx) { + + mat4 wvp = uClipPolygonWVP[polyIdx]; + //vec4 screenClipPos = uClipPolygonVP[polyIdx] * modelMatrix * vec4(point, 1.0); + //screenClipPos.xy = screenClipPos.xy / screenClipPos.w * 0.5 + 0.5; + + vec4 pointNDC = wvp * vec4(point, 1.0); + pointNDC.xy = pointNDC.xy / pointNDC.w; + + int j = uClipPolygonVCount[polyIdx] - 1; + bool c = false; + for(int i = 0; i < 8; i++) { + if(i == uClipPolygonVCount[polyIdx]) { + break; + } + + //vec4 verti = wvp * vec4(uClipPolygonVertices[polyIdx * 8 + i], 1); + //vec4 vertj = wvp * vec4(uClipPolygonVertices[polyIdx * 8 + j], 1); + + //verti.xy = verti.xy / verti.w; + //vertj.xy = vertj.xy / vertj.w; + + //verti.xy = verti.xy / verti.w * 0.5 + 0.5; + //vertj.xy = vertj.xy / vertj.w * 0.5 + 0.5; + + vec3 verti = uClipPolygonVertices[polyIdx * 8 + i]; + vec3 vertj = uClipPolygonVertices[polyIdx * 8 + j]; + + if( ((verti.y > pointNDC.y) != (vertj.y > pointNDC.y)) && + (pointNDC.x < (vertj.x-verti.x) * (pointNDC.y-verti.y) / (vertj.y-verti.y) + verti.x) ) { + c = !c; + } + j = i; + } + + return c; +} +#endif + +void doClipping(){ + + { + vec4 cl = getClassification(); + if(cl.a == 0.0){ + gl_Position = vec4(100.0, 100.0, 100.0, 0.0); + + return; + } + } + + #if defined(clip_return_number_enabled) + { // return number filter + vec2 range = uFilterReturnNumberRange; + if(returnNumber < range.x || returnNumber > range.y){ + gl_Position = vec4(100.0, 100.0, 100.0, 0.0); + + return; + } + } + #endif + + #if defined(clip_number_of_returns_enabled) + { // number of return filter + vec2 range = uFilterNumberOfReturnsRange; + if(numberOfReturns < range.x || numberOfReturns > range.y){ + gl_Position = vec4(100.0, 100.0, 100.0, 0.0); + + return; + } + } + #endif + + #if defined(clip_gps_enabled) + { // GPS time filter + float time = (gpsTime + uGpsOffset) * uGpsScale; + vec2 range = uFilterGPSTimeClipRange; + + if(time < range.x || time > range.y){ + gl_Position = vec4(100.0, 100.0, 100.0, 0.0); + + return; + } + } + #endif + + #if defined(clip_point_source_id_enabled) + { // point source id filter + vec2 range = uFilterPointSourceIDClipRange; + if(pointSourceID < range.x || pointSourceID > range.y){ + gl_Position = vec4(100.0, 100.0, 100.0, 0.0); + + return; + } + } + #endif + + int clipVolumesCount = 0; + int insideCount = 0; + + #if defined(num_clipboxes) && num_clipboxes > 0 + for(int i = 0; i < num_clipboxes; i++){ + vec4 clipPosition = clipBoxes[i] * modelMatrix * vec4( position, 1.0 ); + bool inside = -0.5 <= clipPosition.x && clipPosition.x <= 0.5; + inside = inside && -0.5 <= clipPosition.y && clipPosition.y <= 0.5; + inside = inside && -0.5 <= clipPosition.z && clipPosition.z <= 0.5; + + insideCount = insideCount + (inside ? 1 : 0); + clipVolumesCount++; + } + #endif + + #if defined(num_clippolygons) && num_clippolygons > 0 + for(int i = 0; i < num_clippolygons; i++) { + bool inside = pointInClipPolygon(position, i); + + insideCount = insideCount + (inside ? 1 : 0); + clipVolumesCount++; + } + #endif + + bool insideAny = insideCount > 0; + bool insideAll = (clipVolumesCount > 0) && (clipVolumesCount == insideCount); + + if(clipMethod == CLIPMETHOD_INSIDE_ANY){ + if(insideAny && clipTask == CLIPTASK_HIGHLIGHT){ + vColor.r += 0.5; + }else if(!insideAny && clipTask == CLIPTASK_SHOW_INSIDE){ + gl_Position = vec4(100.0, 100.0, 100.0, 1.0); + }else if(insideAny && clipTask == CLIPTASK_SHOW_OUTSIDE){ + gl_Position = vec4(100.0, 100.0, 100.0, 1.0); + } + }else if(clipMethod == CLIPMETHOD_INSIDE_ALL){ + if(insideAll && clipTask == CLIPTASK_HIGHLIGHT){ + vColor.r += 0.5; + }else if(!insideAll && clipTask == CLIPTASK_SHOW_INSIDE){ + gl_Position = vec4(100.0, 100.0, 100.0, 1.0); + }else if(insideAll && clipTask == CLIPTASK_SHOW_OUTSIDE){ + gl_Position = vec4(100.0, 100.0, 100.0, 1.0); + } + } +} + + + +// +// ## ## ### #### ## ## +// ### ### ## ## ## ### ## +// #### #### ## ## ## #### ## +// ## ### ## ## ## ## ## ## ## +// ## ## ######### ## ## #### +// ## ## ## ## ## ## ### +// ## ## ## ## #### ## ## +// + +void main() { + vec4 mvPosition = modelViewMatrix * vec4(position, 1.0 ); + vViewPosition = mvPosition.xyz; + gl_Position = projectionMatrix * mvPosition; + vLogDepth = log2(-mvPosition.z); + + //gl_Position = vec4(0.0, 0.0, 0.0, 1.0); + //gl_PointSize = 5.0; + + // POINT SIZE + float pointSize = getPointSize(); + //float pointSize = 2.0; + gl_PointSize = pointSize; + vPointSize = pointSize; + + // COLOR + vColor = getColor(); + // vColor = vec3(1.0, 0.0, 0.0); + + //gl_Position = vec4(0.0, 0.0, 0.0, 1.0); + //gl_Position = vec4(position.xzy / 1000.0, 1.0 ); + + //gl_PointSize = 5.0; + //vColor = vec3(1.0, 1.0, 1.0); + + // only for "replacing" approaches + // if(getLOD() != uLevel){ + // gl_Position = vec4(10.0, 10.0, 10.0, 1.0); + // } + + + #if defined hq_depth_pass + float originalDepth = gl_Position.w; + float adjustedDepth = originalDepth + 2.0 * vRadius; + float adjust = adjustedDepth / originalDepth; + + mvPosition.xyz = mvPosition.xyz * adjust; + gl_Position = projectionMatrix * mvPosition; + #endif + + + // CLIPPING + doClipping(); + + #if defined(num_clipspheres) && num_clipspheres > 0 + for(int i = 0; i < num_clipspheres; i++){ + vec4 sphereLocal = uClipSpheres[i] * mvPosition; + + float distance = length(sphereLocal.xyz); + + if(distance < 1.0){ + float w = distance; + vec3 cGradient = texture2D(gradient, vec2(w, 1.0 - w)).rgb; + + vColor = cGradient; + //vColor = cGradient * 0.7 + vColor * 0.3; + } + } + #endif + + #if defined(num_shadowmaps) && num_shadowmaps > 0 + + const float sm_near = 0.1; + const float sm_far = 10000.0; + + for(int i = 0; i < num_shadowmaps; i++){ + vec3 viewPos = (uShadowWorldView[i] * vec4(position, 1.0)).xyz; + float distanceToLight = abs(viewPos.z); + + vec4 projPos = uShadowProj[i] * uShadowWorldView[i] * vec4(position, 1); + vec3 nc = projPos.xyz / projPos.w; + + float u = nc.x * 0.5 + 0.5; + float v = nc.y * 0.5 + 0.5; + + vec2 sampleStep = vec2(1.0 / (2.0*1024.0), 1.0 / (2.0*1024.0)) * 1.5; + vec2 sampleLocations[9]; + sampleLocations[0] = vec2(0.0, 0.0); + sampleLocations[1] = sampleStep; + sampleLocations[2] = -sampleStep; + sampleLocations[3] = vec2(sampleStep.x, -sampleStep.y); + sampleLocations[4] = vec2(-sampleStep.x, sampleStep.y); + + sampleLocations[5] = vec2(0.0, sampleStep.y); + sampleLocations[6] = vec2(0.0, -sampleStep.y); + sampleLocations[7] = vec2(sampleStep.x, 0.0); + sampleLocations[8] = vec2(-sampleStep.x, 0.0); + + float visibleSamples = 0.0; + float numSamples = 0.0; + + float bias = vRadius * 2.0; + + for(int j = 0; j < 9; j++){ + vec4 depthMapValue = texture2D(uShadowMap[i], vec2(u, v) + sampleLocations[j]); + + float linearDepthFromSM = depthMapValue.x + bias; + float linearDepthFromViewer = distanceToLight; + + if(linearDepthFromSM > linearDepthFromViewer){ + visibleSamples += 1.0; + } + + numSamples += 1.0; + } + + float visibility = visibleSamples / numSamples; + + if(u < 0.0 || u > 1.0 || v < 0.0 || v > 1.0 || nc.x < -1.0 || nc.x > 1.0 || nc.y < -1.0 || nc.y > 1.0 || nc.z < -1.0 || nc.z > 1.0){ + //vColor = vec3(0.0, 0.0, 0.2); + }else{ + //vColor = vec3(1.0, 1.0, 1.0) * visibility + vec3(1.0, 1.0, 1.0) * vec3(0.5, 0.0, 0.0) * (1.0 - visibility); + vColor = vColor * visibility + vColor * uShadowColor * (1.0 - visibility); + } + + + } + + #endif +} +`; + + Shaders["pointcloud.fs"] = ` +#if defined paraboloid_point_shape + #extension GL_EXT_frag_depth : enable +#endif + +precision highp float; +precision highp int; + +uniform mat4 viewMatrix; +uniform mat4 uViewInv; +uniform mat4 uProjInv; +uniform vec3 cameraPosition; + + +uniform mat4 projectionMatrix; +uniform float uOpacity; + +uniform float blendHardness; +uniform float blendDepthSupplement; +uniform float fov; +uniform float uSpacing; +uniform float near; +uniform float far; +uniform float uPCIndex; +uniform float uScreenWidth; +uniform float uScreenHeight; + +varying vec3 vColor; +varying float vLogDepth; +varying vec3 vViewPosition; +varying float vRadius; +varying float vPointSize; +varying vec3 vPosition; + + +float specularStrength = 1.0; + +void main() { + + // gl_FragColor = vec4(vColor, 1.0); + + vec3 color = vColor; + float depth = gl_FragCoord.z; + + #if defined(circle_point_shape) || defined(paraboloid_point_shape) + float u = 2.0 * gl_PointCoord.x - 1.0; + float v = 2.0 * gl_PointCoord.y - 1.0; + #endif + + #if defined(circle_point_shape) + float cc = u*u + v*v; + if(cc > 1.0){ + discard; + } + #endif + + #if defined color_type_indices + gl_FragColor = vec4(color, uPCIndex / 255.0); + #else + gl_FragColor = vec4(color, uOpacity); + #endif + + #if defined paraboloid_point_shape + float wi = 0.0 - ( u*u + v*v); + vec4 pos = vec4(vViewPosition, 1.0); + pos.z += wi * vRadius; + float linearDepth = -pos.z; + pos = projectionMatrix * pos; + pos = pos / pos.w; + float expDepth = pos.z; + depth = (pos.z + 1.0) / 2.0; + gl_FragDepthEXT = depth; + + #if defined(color_type_depth) + color.r = linearDepth; + color.g = expDepth; + #endif + + #if defined(use_edl) + gl_FragColor.a = log2(linearDepth); + #endif + + #else + #if defined(use_edl) + gl_FragColor.a = vLogDepth; + #endif + #endif + + #if defined(weighted_splats) + float distance = 2.0 * length(gl_PointCoord.xy - 0.5); + float weight = max(0.0, 1.0 - distance); + weight = pow(weight, 1.5); + + gl_FragColor.a = weight; + gl_FragColor.xyz = gl_FragColor.xyz * weight; + #endif + + //gl_FragColor = vec4(0.0, 0.7, 0.0, 1.0); + +} + + +`; + + Shaders["pointcloud_sm.vs"] = ` +precision mediump float; +precision mediump int; + +attribute vec3 position; +attribute vec3 color; + +uniform mat4 modelMatrix; +uniform mat4 modelViewMatrix; +uniform mat4 projectionMatrix; +uniform mat4 viewMatrix; + +uniform float uScreenWidth; +uniform float uScreenHeight; +uniform float near; +uniform float far; + +uniform float uSpacing; +uniform float uOctreeSize; +uniform float uLevel; +uniform float uVNStart; + +uniform sampler2D visibleNodes; + +varying float vLinearDepth; +varying vec3 vColor; + +#define PI 3.141592653589793 + + + +// --------------------- +// OCTREE +// --------------------- + +#if defined(adaptive_point_size) +/** + * number of 1-bits up to inclusive index position + * number is treated as if it were an integer in the range 0-255 + * + */ +float numberOfOnes(float number, float index){ + float tmp = mod(number, pow(2.0, index + 1.0)); + float numOnes = 0.0; + for(float i = 0.0; i < 8.0; i++){ + if(mod(tmp, 2.0) != 0.0){ + numOnes++; + } + tmp = floor(tmp / 2.0); + } + return numOnes; +} + + +/** + * checks whether the bit at index is 1 + * number is treated as if it were an integer in the range 0-255 + * + */ +bool isBitSet(float number, float index){ + return mod(floor(number / pow(2.0, index)), 2.0) != 0.0; +} + + +/** + * find the LOD at the point position + */ +float getLOD(){ + + vec3 offset = vec3(0.0, 0.0, 0.0); + float iOffset = uVNStart; + float depth = uLevel; + for(float i = 0.0; i <= 30.0; i++){ + float nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0); + + vec3 index3d = (position-offset) / nodeSizeAtLevel; + index3d = floor(index3d + 0.5); + float index = 4.0 * index3d.x + 2.0 * index3d.y + index3d.z; + + vec4 value = texture2D(visibleNodes, vec2(iOffset / 2048.0, 0.0)); + float mask = value.r * 255.0; + if(isBitSet(mask, index)){ + // there are more visible child nodes at this position + iOffset = iOffset + value.g * 255.0 * 256.0 + value.b * 255.0 + numberOfOnes(mask, index - 1.0); + depth++; + }else{ + // no more visible child nodes at this position + return depth; + } + + offset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d; + } + + return depth; +} + +#endif + +float getPointSize(){ + float pointSize = 1.0; + + float slope = tan(fov / 2.0); + float projFactor = -0.5 * uScreenHeight / (slope * vViewPosition.z); + + float r = uOctreeSpacing * 1.5; + vRadius = r; + #if defined fixed_point_size + pointSize = size; + #elif defined attenuated_point_size + if(uUseOrthographicCamera){ + pointSize = size; + }else{ + pointSize = pointSize * projFactor; + } + #elif defined adaptive_point_size + if(uUseOrthographicCamera) { + float worldSpaceSize = 1.5 * size * r / getPointSizeAttenuation(); + pointSize = (worldSpaceSize / uOrthoWidth) * uScreenWidth; + } else { + float worldSpaceSize = 1.5 * size * r / getPointSizeAttenuation(); + pointSize = worldSpaceSize * projFactor; + } + #endif + + pointSize = max(minSize, pointSize); + pointSize = min(maxSize, pointSize); + + vRadius = pointSize / projFactor; + + return pointSize; +} + + +void main() { + + vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); + vLinearDepth = gl_Position.w; + + float pointSize = getPointSize(); + gl_PointSize = pointSize; + +} +`; + + Shaders["pointcloud_sm.fs"] = ` +precision mediump float; +precision mediump int; + +varying vec3 vColor; +varying float vLinearDepth; + +void main() { + + //gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + //gl_FragColor = vec4(vColor, 1.0); + //gl_FragColor = vec4(vLinearDepth, pow(vLinearDepth, 2.0), 0.0, 1.0); + gl_FragColor = vec4(vLinearDepth, vLinearDepth / 30.0, vLinearDepth / 30.0, 1.0); + +} + + +`; + + Shaders["normalize.vs"] = ` +precision mediump float; +precision mediump int; + +attribute vec3 position; +attribute vec2 uv; + +uniform mat4 projectionMatrix; +uniform mat4 modelViewMatrix; + +varying vec2 vUv; + +void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); +}`; + + Shaders["normalize.fs"] = ` +#extension GL_EXT_frag_depth : enable + +precision mediump float; +precision mediump int; + +uniform sampler2D uWeightMap; +uniform sampler2D uDepthMap; + +varying vec2 vUv; + +void main() { + float depth = texture2D(uDepthMap, vUv).r; + + if(depth >= 1.0){ + discard; + } + + gl_FragColor = vec4(depth, 1.0, 0.0, 1.0); + + vec4 color = texture2D(uWeightMap, vUv); + color = color / color.w; + + gl_FragColor = vec4(color.xyz, 1.0); + + gl_FragDepthEXT = depth; + + +}`; + + Shaders["normalize_and_edl.fs"] = ` +#extension GL_EXT_frag_depth : enable + +// +// adapted from the EDL shader code from Christian Boucheny in cloud compare: +// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL +// + +precision mediump float; +precision mediump int; + +uniform sampler2D uWeightMap; +uniform sampler2D uEDLMap; +uniform sampler2D uDepthMap; + +uniform float screenWidth; +uniform float screenHeight; +uniform vec2 neighbours[NEIGHBOUR_COUNT]; +uniform float edlStrength; +uniform float radius; + +varying vec2 vUv; + +float response(float depth){ + vec2 uvRadius = radius / vec2(screenWidth, screenHeight); + + float sum = 0.0; + + for(int i = 0; i < NEIGHBOUR_COUNT; i++){ + vec2 uvNeighbor = vUv + uvRadius * neighbours[i]; + + float neighbourDepth = texture2D(uEDLMap, uvNeighbor).a; + + if(neighbourDepth != 0.0){ + if(depth == 0.0){ + sum += 100.0; + }else{ + sum += max(0.0, depth - neighbourDepth); + } + } + } + + return sum / float(NEIGHBOUR_COUNT); +} + +void main() { + + float edlDepth = texture2D(uEDLMap, vUv).a; + float res = response(edlDepth); + float shade = exp(-res * 300.0 * edlStrength); + + float depth = texture2D(uDepthMap, vUv).r; + if(depth >= 1.0 && res == 0.0){ + discard; + } + + vec4 color = texture2D(uWeightMap, vUv); + color = color / color.w; + color = color * shade; + + gl_FragColor = vec4(color.xyz, 1.0); + + gl_FragDepthEXT = depth; +}`; + + Shaders["edl.vs"] = ` +precision mediump float; +precision mediump int; + +attribute vec3 position; +attribute vec2 uv; + +uniform mat4 projectionMatrix; +uniform mat4 modelViewMatrix; + +varying vec2 vUv; + +void main() { + vUv = uv; + + vec4 mvPosition = modelViewMatrix * vec4(position,1.0); + + gl_Position = projectionMatrix * mvPosition; +}`; + + Shaders["edl.fs"] = ` +#extension GL_EXT_frag_depth : enable + +// +// adapted from the EDL shader code from Christian Boucheny in cloud compare: +// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL +// + +precision mediump float; +precision mediump int; + +uniform float screenWidth; +uniform float screenHeight; +uniform vec2 neighbours[NEIGHBOUR_COUNT]; +uniform float edlStrength; +uniform float radius; +uniform float opacity; + +uniform float uNear; +uniform float uFar; + +uniform mat4 uProj; + +uniform sampler2D uEDLColor; +uniform sampler2D uEDLDepth; + +varying vec2 vUv; + +float response(float depth){ + vec2 uvRadius = radius / vec2(screenWidth, screenHeight); + + float sum = 0.0; + + for(int i = 0; i < NEIGHBOUR_COUNT; i++){ + vec2 uvNeighbor = vUv + uvRadius * neighbours[i]; + + float neighbourDepth = texture2D(uEDLColor, uvNeighbor).a; + neighbourDepth = (neighbourDepth == 1.0) ? 0.0 : neighbourDepth; + + if(neighbourDepth != 0.0){ + if(depth == 0.0){ + sum += 100.0; + }else{ + sum += max(0.0, depth - neighbourDepth); + } + } + } + + return sum / float(NEIGHBOUR_COUNT); +} + +void main(){ + vec4 cEDL = texture2D(uEDLColor, vUv); + + float depth = cEDL.a; + depth = (depth == 1.0) ? 0.0 : depth; + float res = response(depth); + float shade = exp(-res * 300.0 * edlStrength); + + gl_FragColor = vec4(cEDL.rgb * shade, opacity); + + { // write regular hyperbolic depth values to depth buffer + float dl = pow(2.0, depth); + + vec4 dp = uProj * vec4(0.0, 0.0, -dl, 1.0); + float pz = dp.z / dp.w; + float fragDepth = (pz + 1.0) / 2.0; + + gl_FragDepthEXT = fragDepth; + } + + if(depth == 0.0){ + discard; + } + +} +`; + + Shaders["blur.vs"] = ` +varying vec2 vUv; + +void main() { + vUv = uv; + + gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); +}`; + + Shaders["blur.fs"] = ` +uniform mat4 projectionMatrix; + +uniform float screenWidth; +uniform float screenHeight; +uniform float near; +uniform float far; + +uniform sampler2D map; + +varying vec2 vUv; + +void main() { + + float dx = 1.0 / screenWidth; + float dy = 1.0 / screenHeight; + + vec3 color = vec3(0.0, 0.0, 0.0); + color += texture2D(map, vUv + vec2(-dx, -dy)).rgb; + color += texture2D(map, vUv + vec2( 0, -dy)).rgb; + color += texture2D(map, vUv + vec2(+dx, -dy)).rgb; + color += texture2D(map, vUv + vec2(-dx, 0)).rgb; + color += texture2D(map, vUv + vec2( 0, 0)).rgb; + color += texture2D(map, vUv + vec2(+dx, 0)).rgb; + color += texture2D(map, vUv + vec2(-dx, dy)).rgb; + color += texture2D(map, vUv + vec2( 0, dy)).rgb; + color += texture2D(map, vUv + vec2(+dx, dy)).rgb; + + color = color / 9.0; + + gl_FragColor = vec4(color, 1.0); +}`; + + const ClassificationScheme = { + + DEFAULT: { + 0: { visible: true, name: 'never classified' , color: [0.5, 0.5, 0.5, 1.0] }, + 1: { visible: true, name: 'unclassified' , color: [0.5, 0.5, 0.5, 1.0] }, + 2: { visible: true, name: 'ground' , color: [0.63, 0.32, 0.18, 1.0] }, + 3: { visible: true, name: 'low vegetation' , color: [0.0, 1.0, 0.0, 1.0] }, + 4: { visible: true, name: 'medium vegetation' , color: [0.0, 0.8, 0.0, 1.0] }, + 5: { visible: true, name: 'high vegetation' , color: [0.0, 0.6, 0.0, 1.0] }, + 6: { visible: true, name: 'building' , color: [1.0, 0.66, 0.0, 1.0] }, + 7: { visible: true, name: 'low point(noise)' , color: [1.0, 0.0, 1.0, 1.0] }, + 8: { visible: true, name: 'key-point' , color: [1.0, 0.0, 0.0, 1.0] }, + 9: { visible: true, name: 'water' , color: [0.0, 0.0, 1.0, 1.0] }, + 12: { visible: true, name: 'overlap' , color: [1.0, 1.0, 0.0, 1.0] }, + DEFAULT: { visible: true, name: 'default' , color: [0.3, 0.6, 0.6, 0.5] }, + } + }; + + Object.defineProperty(ClassificationScheme, 'RANDOM', { + get: function() { + + let scheme = {}; + + for(let i = 0; i <= 255; i++){ + scheme[i] = new Vector4(Math.random(), Math.random(), Math.random()); + } + + scheme["DEFAULT"] = new Vector4(Math.random(), Math.random(), Math.random()); + + return scheme; + } + }); + + // + // how to calculate the radius of a projected sphere in screen space + // http://stackoverflow.com/questions/21648630/radius-of-projected-sphere-in-screen-space + // http://stackoverflow.com/questions/3717226/radius-of-projected-sphere + // + + + class PointCloudMaterial$1 extends RawShaderMaterial { + constructor (parameters = {}) { + super(); + + this.visibleNodesTexture = Utils.generateDataTexture(2048, 1, new Color(0xffffff)); + this.visibleNodesTexture.minFilter = NearestFilter; + this.visibleNodesTexture.magFilter = NearestFilter; + + let getValid = (a, b) => { + if(a !== undefined){ + return a; + }else { + return b; + } + }; + + let pointSize = getValid(parameters.size, 1.0); + let minSize = getValid(parameters.minSize, 2.0); + let maxSize = getValid(parameters.maxSize, 50.0); + let treeType = getValid(parameters.treeType, TreeType.OCTREE); + + this._pointSizeType = PointSizeType.FIXED; + this._shape = PointShape.SQUARE; + this._useClipBox = false; + this.clipBoxes = []; + this.clipPolygons = []; + this._weighted = false; + this._gradient = Gradients.SPECTRAL; + this.gradientTexture = PointCloudMaterial$1.generateGradientTexture(this._gradient); + this._matcap = "matcap.jpg"; + this.matcapTexture = Potree.PointCloudMaterial.generateMatcapTexture(this._matcap); + this.lights = false; + this.fog = false; + this._treeType = treeType; + this._useEDL = false; + this.defines = new Map(); + + this.ranges = new Map(); + + this._activeAttributeName = null; + + this._defaultIntensityRangeChanged = false; + this._defaultElevationRangeChanged = false; + + { + const [width, height] = [256, 1]; + let data = new Uint8Array(width * 4); + let texture = new DataTexture(data, width, height, RGBAFormat); + texture.magFilter = NearestFilter; + texture.needsUpdate = true; + + this.classificationTexture = texture; + } + + this.attributes = { + position: { type: 'fv', value: [] }, + color: { type: 'fv', value: [] }, + normal: { type: 'fv', value: [] }, + intensity: { type: 'f', value: [] }, + classification: { type: 'f', value: [] }, + returnNumber: { type: 'f', value: [] }, + numberOfReturns: { type: 'f', value: [] }, + pointSourceID: { type: 'f', value: [] }, + indices: { type: 'fv', value: [] } + }; + + this.uniforms = { + level: { type: "f", value: 0.0 }, + vnStart: { type: "f", value: 0.0 }, + spacing: { type: "f", value: 1.0 }, + blendHardness: { type: "f", value: 2.0 }, + blendDepthSupplement: { type: "f", value: 0.0 }, + fov: { type: "f", value: 1.0 }, + screenWidth: { type: "f", value: 1.0 }, + screenHeight: { type: "f", value: 1.0 }, + near: { type: "f", value: 0.1 }, + far: { type: "f", value: 1.0 }, + uColor: { type: "c", value: new Color( 0xffffff ) }, + uOpacity: { type: "f", value: 1.0 }, + size: { type: "f", value: pointSize }, + minSize: { type: "f", value: minSize }, + maxSize: { type: "f", value: maxSize }, + octreeSize: { type: "f", value: 0 }, + bbSize: { type: "fv", value: [0, 0, 0] }, + elevationRange: { type: "2fv", value: [0, 0] }, + + clipBoxCount: { type: "f", value: 0 }, + //clipSphereCount: { type: "f", value: 0 }, + clipPolygonCount: { type: "i", value: 0 }, + clipBoxes: { type: "Matrix4fv", value: [] }, + //clipSpheres: { type: "Matrix4fv", value: [] }, + clipPolygons: { type: "3fv", value: [] }, + clipPolygonVCount: { type: "iv", value: [] }, + clipPolygonVP: { type: "Matrix4fv", value: [] }, + + visibleNodes: { type: "t", value: this.visibleNodesTexture }, + pcIndex: { type: "f", value: 0 }, + gradient: { type: "t", value: this.gradientTexture }, + classificationLUT: { type: "t", value: this.classificationTexture }, + uHQDepthMap: { type: "t", value: null }, + toModel: { type: "Matrix4f", value: [] }, + diffuse: { type: "fv", value: [1, 1, 1] }, + transition: { type: "f", value: 0.5 }, + + intensityRange: { type: "fv", value: [Infinity, -Infinity] }, + + intensity_gbc: { type: "fv", value: [1, 0, 0]}, + uRGB_gbc: { type: "fv", value: [1, 0, 0]}, + // intensityGamma: { type: "f", value: 1 }, + // intensityContrast: { type: "f", value: 0 }, + // intensityBrightness:{ type: "f", value: 0 }, + // rgbGamma: { type: "f", value: 1 }, + // rgbContrast: { type: "f", value: 0 }, + // rgbBrightness: { type: "f", value: 0 }, + wRGB: { type: "f", value: 1 }, + wIntensity: { type: "f", value: 0 }, + wElevation: { type: "f", value: 0 }, + wClassification: { type: "f", value: 0 }, + wReturnNumber: { type: "f", value: 0 }, + wSourceID: { type: "f", value: 0 }, + useOrthographicCamera: { type: "b", value: false }, + elevationGradientRepat: { type: "i", value: ElevationGradientRepeat.CLAMP }, + clipTask: { type: "i", value: 1 }, + clipMethod: { type: "i", value: 1 }, + uShadowColor: { type: "3fv", value: [0, 0, 0] }, + + uExtraScale: { type: "f", value: 1}, + uExtraOffset: { type: "f", value: 0}, + uExtraRange: { type: "2fv", value: [0, 1] }, + uExtraGammaBrightContr: { type: "3fv", value: [1, 0, 0] }, + + uFilterReturnNumberRange: { type: "fv", value: [0, 7]}, + uFilterNumberOfReturnsRange: { type: "fv", value: [0, 7]}, + uFilterGPSTimeClipRange: { type: "fv", value: [0, 7]}, + uFilterPointSourceIDClipRange: { type: "fv", value: [0, 65535]}, + matcapTextureUniform: { type: "t", value: this.matcapTexture }, + backfaceCulling: { type: "b", value: false }, + }; + + this.classification = ClassificationScheme.DEFAULT; + + this.defaultAttributeValues.normal = [0, 0, 0]; + this.defaultAttributeValues.classification = [0, 0, 0]; + this.defaultAttributeValues.indices = [0, 0, 0, 0]; + + this.vertexShader = Shaders['pointcloud.vs']; + this.fragmentShader = Shaders['pointcloud.fs']; + + this.vertexColors = VertexColors; + + this.updateShaderSource(); + } + + setDefine(key, value){ + if(value !== undefined && value !== null){ + if(this.defines.get(key) !== value){ + this.defines.set(key, value); + this.updateShaderSource(); + } + }else { + this.removeDefine(key); + } + } + + removeDefine(key){ + this.defines.delete(key); + } + + updateShaderSource () { + + let vs = Shaders['pointcloud.vs']; + let fs = Shaders['pointcloud.fs']; + let definesString = this.getDefines(); + + let vsVersionIndex = vs.indexOf("#version "); + let fsVersionIndex = fs.indexOf("#version "); + + if(vsVersionIndex >= 0){ + vs = vs.replace(/(#version .*)/, `$1\n${definesString}`); + }else { + vs = `${definesString}\n${vs}`; + } + + if(fsVersionIndex >= 0){ + fs = fs.replace(/(#version .*)/, `$1\n${definesString}`); + }else { + fs = `${definesString}\n${fs}`; + } + + this.vertexShader = vs; + this.fragmentShader = fs; + + if (this.opacity === 1.0) { + this.blending = NoBlending; + this.transparent = false; + this.depthTest = true; + this.depthWrite = true; + this.depthFunc = LessEqualDepth; + } else if (this.opacity < 1.0 && !this.useEDL) { + this.blending = AdditiveBlending; + this.transparent = true; + this.depthTest = false; + this.depthWrite = true; + this.depthFunc = AlwaysDepth; + } + + if (this.weighted) { + this.blending = AdditiveBlending; + this.transparent = true; + this.depthTest = true; + this.depthWrite = false; + } + + this.needsUpdate = true; + } + + getDefines () { + let defines = []; + + if (this.pointSizeType === PointSizeType.FIXED) { + defines.push('#define fixed_point_size'); + } else if (this.pointSizeType === PointSizeType.ATTENUATED) { + defines.push('#define attenuated_point_size'); + } else if (this.pointSizeType === PointSizeType.ADAPTIVE) { + defines.push('#define adaptive_point_size'); + } + + if (this.shape === PointShape.SQUARE) { + defines.push('#define square_point_shape'); + } else if (this.shape === PointShape.CIRCLE) { + defines.push('#define circle_point_shape'); + } else if (this.shape === PointShape.PARABOLOID) { + defines.push('#define paraboloid_point_shape'); + } + + if (this._useEDL) { + defines.push('#define use_edl'); + } + + if(this.activeAttributeName){ + let attributeName = this.activeAttributeName.replace(/[^a-zA-Z0-9]/g, '_'); + + defines.push(`#define color_type_${attributeName}`); + } + + if(this._treeType === TreeType.OCTREE){ + defines.push('#define tree_type_octree'); + }else if(this._treeType === TreeType.KDTREE){ + defines.push('#define tree_type_kdtree'); + } + + if (this.weighted) { + defines.push('#define weighted_splats'); + } + + for(let [key, value] of this.defines){ + defines.push(value); + } + + return defines.join("\n"); + } + + setClipBoxes (clipBoxes) { + if (!clipBoxes) { + return; + } + + let doUpdate = (this.clipBoxes.length !== clipBoxes.length) && (clipBoxes.length === 0 || this.clipBoxes.length === 0); + + this.uniforms.clipBoxCount.value = this.clipBoxes.length; + this.clipBoxes = clipBoxes; + + if (doUpdate) { + this.updateShaderSource(); + } + + this.uniforms.clipBoxes.value = new Float32Array(this.clipBoxes.length * 16); + + for (let i = 0; i < this.clipBoxes.length; i++) { + let box = clipBoxes[i]; + + this.uniforms.clipBoxes.value.set(box.inverse.elements, 16 * i); + } + + for (let i = 0; i < this.uniforms.clipBoxes.value.length; i++) { + if (Number.isNaN(this.uniforms.clipBoxes.value[i])) { + this.uniforms.clipBoxes.value[i] = Infinity; + } + } + } + + setClipPolygons(clipPolygons, maxPolygonVertices) { + if(!clipPolygons){ + return; + } + + this.clipPolygons = clipPolygons; + + let doUpdate = (this.clipPolygons.length !== clipPolygons.length); + + if(doUpdate){ + this.updateShaderSource(); + } + } + + get gradient(){ + return this._gradient; + } + + set gradient (value) { + if (this._gradient !== value) { + this._gradient = value; + this.gradientTexture = PointCloudMaterial$1.generateGradientTexture(this._gradient); + this.uniforms.gradient.value = this.gradientTexture; + } + } + + get matcap(){ + return this._matcap; + } + + set matcap (value) { + if (this._matcap !== value) { + this._matcap = value; + this.matcapTexture = Potree.PointCloudMaterial.generateMatcapTexture(this._matcap); + this.uniforms.matcapTextureUniform.value = this.matcapTexture; + } + } + get useOrthographicCamera() { + return this.uniforms.useOrthographicCamera.value; + } + + set useOrthographicCamera(value) { + if(this.uniforms.useOrthographicCamera.value !== value){ + this.uniforms.useOrthographicCamera.value = value; + } + } + get backfaceCulling() { + return this.uniforms.backfaceCulling.value; + } + + set backfaceCulling(value) { + if(this.uniforms.backfaceCulling.value !== value){ + this.uniforms.backfaceCulling.value = value; + this.dispatchEvent({type: 'backface_changed', target: this}); + } + } + + recomputeClassification () { + const classification = this.classification; + const data = this.classificationTexture.image.data; + + let width = 256; + const black = [1, 1, 1, 1]; + + let valuesChanged = false; + + for (let i = 0; i < width; i++) { + + let color; + let visible = true; + + if (classification[i]) { + color = classification[i].color; + visible = classification[i].visible; + } else if (classification[i % 32]) { + color = classification[i % 32].color; + visible = classification[i % 32].visible; + } else if(classification.DEFAULT) { + color = classification.DEFAULT.color; + visible = classification.DEFAULT.visible; + }else { + color = black; + } + + const r = parseInt(255 * color[0]); + const g = parseInt(255 * color[1]); + const b = parseInt(255 * color[2]); + const a = visible ? parseInt(255 * color[3]) : 0; + + + if(data[4 * i + 0] !== r){ + data[4 * i + 0] = r; + valuesChanged = true; + } + + if(data[4 * i + 1] !== g){ + data[4 * i + 1] = g; + valuesChanged = true; + } + + if(data[4 * i + 2] !== b){ + data[4 * i + 2] = b; + valuesChanged = true; + } + + if(data[4 * i + 3] !== a){ + data[4 * i + 3] = a; + valuesChanged = true; + } + } + + if(valuesChanged){ + this.classificationTexture.needsUpdate = true; + + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get spacing () { + return this.uniforms.spacing.value; + } + + set spacing (value) { + if (this.uniforms.spacing.value !== value) { + this.uniforms.spacing.value = value; + } + } + + get useClipBox () { + return this._useClipBox; + } + + set useClipBox (value) { + if (this._useClipBox !== value) { + this._useClipBox = value; + this.updateShaderSource(); + } + } + + get clipTask(){ + return this.uniforms.clipTask.value; + } + + set clipTask(mode){ + this.uniforms.clipTask.value = mode; + } + + get elevationGradientRepat(){ + return this.uniforms.elevationGradientRepat.value; + } + + set elevationGradientRepat(mode){ + this.uniforms.elevationGradientRepat.value = mode; + } + + get clipMethod(){ + return this.uniforms.clipMethod.value; + } + + set clipMethod(mode){ + this.uniforms.clipMethod.value = mode; + } + + get weighted(){ + return this._weighted; + } + + set weighted (value) { + if (this._weighted !== value) { + this._weighted = value; + this.updateShaderSource(); + } + } + + get fov () { + return this.uniforms.fov.value; + } + + set fov (value) { + if (this.uniforms.fov.value !== value) { + this.uniforms.fov.value = value; + // this.updateShaderSource(); + } + } + + get screenWidth () { + return this.uniforms.screenWidth.value; + } + + set screenWidth (value) { + if (this.uniforms.screenWidth.value !== value) { + this.uniforms.screenWidth.value = value; + // this.updateShaderSource(); + } + } + + get screenHeight () { + return this.uniforms.screenHeight.value; + } + + set screenHeight (value) { + if (this.uniforms.screenHeight.value !== value) { + this.uniforms.screenHeight.value = value; + // this.updateShaderSource(); + } + } + + get near () { + return this.uniforms.near.value; + } + + set near (value) { + if (this.uniforms.near.value !== value) { + this.uniforms.near.value = value; + } + } + + get far () { + return this.uniforms.far.value; + } + + set far (value) { + if (this.uniforms.far.value !== value) { + this.uniforms.far.value = value; + } + } + + get opacity(){ + return this.uniforms.uOpacity.value; + } + + set opacity (value) { + if (this.uniforms && this.uniforms.uOpacity) { + if (this.uniforms.uOpacity.value !== value) { + this.uniforms.uOpacity.value = value; + this.updateShaderSource(); + this.dispatchEvent({ + type: 'opacity_changed', + target: this + }); + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + } + + get activeAttributeName(){ + return this._activeAttributeName; + } + + set activeAttributeName(value){ + if (this._activeAttributeName !== value) { + this._activeAttributeName = value; + + this.updateShaderSource(); + this.dispatchEvent({ + type: 'active_attribute_changed', + target: this + }); + + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get pointSizeType () { + return this._pointSizeType; + } + + set pointSizeType (value) { + if (this._pointSizeType !== value) { + this._pointSizeType = value; + this.updateShaderSource(); + this.dispatchEvent({ + type: 'point_size_type_changed', + target: this + }); + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get useEDL(){ + return this._useEDL; + } + + set useEDL (value) { + if (this._useEDL !== value) { + this._useEDL = value; + this.updateShaderSource(); + } + } + + get color () { + return this.uniforms.uColor.value; + } + + set color (value) { + if (!this.uniforms.uColor.value.equals(value)) { + this.uniforms.uColor.value.copy(value); + + this.dispatchEvent({ + type: 'color_changed', + target: this + }); + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get shape () { + return this._shape; + } + + set shape (value) { + if (this._shape !== value) { + this._shape = value; + this.updateShaderSource(); + this.dispatchEvent({type: 'point_shape_changed', target: this}); + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get treeType () { + return this._treeType; + } + + set treeType (value) { + if (this._treeType !== value) { + this._treeType = value; + this.updateShaderSource(); + } + } + + get bbSize () { + return this.uniforms.bbSize.value; + } + + set bbSize (value) { + this.uniforms.bbSize.value = value; + } + + get size () { + return this.uniforms.size.value; + } + + set size (value) { + if (this.uniforms.size.value !== value) { + this.uniforms.size.value = value; + + this.dispatchEvent({ + type: 'point_size_changed', + target: this + }); + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get minSize(){ + return this.uniforms.minSize.value; + } + + set minSize(value){ + if (this.uniforms.minSize.value !== value) { + this.uniforms.minSize.value = value; + + this.dispatchEvent({ + type: 'point_size_changed', + target: this + }); + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get elevationRange () { + return this.uniforms.elevationRange.value; + } + + set elevationRange (value) { + let changed = this.uniforms.elevationRange.value[0] !== value[0] + || this.uniforms.elevationRange.value[1] !== value[1]; + + if(changed){ + this.uniforms.elevationRange.value = value; + + this._defaultElevationRangeChanged = true; + + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get heightMin () { + return this.uniforms.elevationRange.value[0]; + } + + set heightMin (value) { + this.elevationRange = [value, this.elevationRange[1]]; + } + + get heightMax () { + return this.uniforms.elevationRange.value[1]; + } + + set heightMax (value) { + this.elevationRange = [this.elevationRange[0], value]; + } + + get transition () { + return this.uniforms.transition.value; + } + + set transition (value) { + this.uniforms.transition.value = value; + } + + get intensityRange () { + return this.uniforms.intensityRange.value; + } + + set intensityRange (value) { + if (!(value instanceof Array && value.length === 2)) { + return; + } + + if (value[0] === this.uniforms.intensityRange.value[0] && + value[1] === this.uniforms.intensityRange.value[1]) { + return; + } + + this.uniforms.intensityRange.value = value; + + this._defaultIntensityRangeChanged = true; + + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + + get intensityGamma () { + return this.uniforms.intensity_gbc.value[0]; + } + + set intensityGamma (value) { + if (this.uniforms.intensity_gbc.value[0] !== value) { + this.uniforms.intensity_gbc.value[0] = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get intensityContrast () { + return this.uniforms.intensity_gbc.value[2]; + } + + set intensityContrast (value) { + if (this.uniforms.intensity_gbc.value[2] !== value) { + this.uniforms.intensity_gbc.value[2] = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get intensityBrightness () { + return this.uniforms.intensity_gbc.value[1]; + } + + set intensityBrightness (value) { + if (this.uniforms.intensity_gbc.value[1] !== value) { + this.uniforms.intensity_gbc.value[1] = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get rgbGamma () { + return this.uniforms.uRGB_gbc.value[0]; + } + + set rgbGamma (value) { + if (this.uniforms.uRGB_gbc.value[0] !== value) { + this.uniforms.uRGB_gbc.value[0] = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get rgbContrast () { + return this.uniforms.uRGB_gbc.value[2]; + } + + set rgbContrast (value) { + if (this.uniforms.uRGB_gbc.value[2] !== value) { + this.uniforms.uRGB_gbc.value[2] = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get rgbBrightness () { + return this.uniforms.uRGB_gbc.value[1]; + } + + set rgbBrightness (value) { + if (this.uniforms.uRGB_gbc.value[1] !== value) { + this.uniforms.uRGB_gbc.value[1] = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + + get extraGamma () { + return this.uniforms.uExtraGammaBrightContr.value[0]; + } + + set extraGamma (value) { + if (this.uniforms.uExtraGammaBrightContr.value[0] !== value) { + this.uniforms.uExtraGammaBrightContr.value[0] = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get extraBrightness () { + return this.uniforms.uExtraGammaBrightContr.value[1]; + } + + set extraBrightness (value) { + if (this.uniforms.uExtraGammaBrightContr.value[1] !== value) { + this.uniforms.uExtraGammaBrightContr.value[1] = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get extraContrast () { + return this.uniforms.uExtraGammaBrightContr.value[2]; + } + + set extraContrast (value) { + if (this.uniforms.uExtraGammaBrightContr.value[2] !== value) { + this.uniforms.uExtraGammaBrightContr.value[2] = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + getRange(attributeName){ + return this.ranges.get(attributeName); + } + + setRange(attributeName, newRange){ + + let rangeChanged = false; + + let oldRange = this.ranges.get(attributeName); + + if(oldRange != null && newRange != null){ + rangeChanged = oldRange[0] !== newRange[0] || oldRange[1] !== newRange[1]; + }else { + rangeChanged = true; + } + + this.ranges.set(attributeName, newRange); + + if(rangeChanged){ + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get extraRange () { + return this.uniforms.uExtraRange.value; + } + + set extraRange (value) { + if (!(value instanceof Array && value.length === 2)) { + return; + } + + if (value[0] === this.uniforms.uExtraRange.value[0] && + value[1] === this.uniforms.uExtraRange.value[1]) { + return; + } + + this.uniforms.uExtraRange.value = value; + + this._defaultExtraRangeChanged = true; + + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + + get weightRGB () { + return this.uniforms.wRGB.value; + } + + set weightRGB (value) { + if(this.uniforms.wRGB.value !== value){ + this.uniforms.wRGB.value = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get weightIntensity () { + return this.uniforms.wIntensity.value; + } + + set weightIntensity (value) { + if(this.uniforms.wIntensity.value !== value){ + this.uniforms.wIntensity.value = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get weightElevation () { + return this.uniforms.wElevation.value; + } + + set weightElevation (value) { + if(this.uniforms.wElevation.value !== value){ + this.uniforms.wElevation.value = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get weightClassification () { + return this.uniforms.wClassification.value; + } + + set weightClassification (value) { + if(this.uniforms.wClassification.value !== value){ + this.uniforms.wClassification.value = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get weightReturnNumber () { + return this.uniforms.wReturnNumber.value; + } + + set weightReturnNumber (value) { + if(this.uniforms.wReturnNumber.value !== value){ + this.uniforms.wReturnNumber.value = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + get weightSourceID () { + return this.uniforms.wSourceID.value; + } + + set weightSourceID (value) { + if(this.uniforms.wSourceID.value !== value){ + this.uniforms.wSourceID.value = value; + this.dispatchEvent({ + type: 'material_property_changed', + target: this + }); + } + } + + static generateGradientTexture (gradient) { + let size = 64; + + // create canvas + let canvas = document.createElement('canvas'); + canvas.width = size; + canvas.height = size; + + // get context + let context = canvas.getContext('2d'); + + // draw gradient + context.rect(0, 0, size, size); + let ctxGradient = context.createLinearGradient(0, 0, size, size); + + for (let i = 0; i < gradient.length; i++) { + let step = gradient[i]; + + ctxGradient.addColorStop(step[0], '#' + step[1].getHexString()); + } + + context.fillStyle = ctxGradient; + context.fill(); + + //let texture = new THREE.Texture(canvas); + let texture = new CanvasTexture(canvas); + texture.needsUpdate = true; + + texture.minFilter = LinearFilter; + texture.wrap = RepeatWrapping; + texture.repeat = 2; + // textureImage = texture.image; + + return texture; + } + + static generateMatcapTexture (matcap) { + var url = new URL(Potree.resourcePath + "/textures/matcap/" + matcap).href; + let texture = new TextureLoader().load( url ); + texture.magFilter = texture.minFilter = LinearFilter; + texture.needsUpdate = true; + // PotreeConverter_1.6_2018_07_29_windows_x64\PotreeConverter.exe autzen_xyzrgbXYZ_ascii.xyz -f xyzrgbXYZ -a RGB NORMAL -o autzen_xyzrgbXYZ_ascii_a -p index --overwrite + // Switch matcap texture on the fly : viewer.scene.pointclouds[0].material.matcap = 'matcap1.jpg'; + // For non power of 2, use LinearFilter and dont generate mipmaps, For power of 2, use NearestFilter and generate mipmaps : matcap2.jpg 1 2 8 11 12 13 + return texture; + } + + static generateMatcapTexture (matcap) { + var url = new URL(Potree.resourcePath + "/textures/matcap/" + matcap).href; + let texture = new TextureLoader().load( url ); + texture.magFilter = texture.minFilter = LinearFilter; + texture.needsUpdate = true; + // PotreeConverter_1.6_2018_07_29_windows_x64\PotreeConverter.exe autzen_xyzrgbXYZ_ascii.xyz -f xyzrgbXYZ -a RGB NORMAL -o autzen_xyzrgbXYZ_ascii_a -p index --overwrite + // Switch matcap texture on the fly : viewer.scene.pointclouds[0].material.matcap = 'matcap1.jpg'; + // For non power of 2, use LinearFilter and dont generate mipmaps, For power of 2, use NearestFilter and generate mipmaps : matcap2.jpg 1 2 8 11 12 13 + return texture; + } + + disableEvents(){ + if(this._hiddenListeners === undefined){ + this._hiddenListeners = this._listeners; + this._listeners = {}; + } + }; + + enableEvents(){ + this._listeners = this._hiddenListeners; + this._hiddenListeners = undefined; + }; + + // copyFrom(from){ + + // var a = 10; + + // for(let name of Object.keys(this.uniforms)){ + // this.uniforms[name].value = from.uniforms[name].value; + // } + // } + + // copy(from){ + // this.copyFrom(from); + // } + + } + + class PointCloudOctreeNode extends PointCloudTreeNode { + constructor () { + super(); + + //this.children = {}; + this.children = []; + this.sceneNode = null; + this.octree = null; + } + + getNumPoints () { + return this.geometryNode.numPoints; + } + + isLoaded () { + return true; + } + + isTreeNode () { + return true; + } + + isGeometryNode () { + return false; + } + + getLevel () { + return this.geometryNode.level; + } + + getBoundingSphere () { + return this.geometryNode.boundingSphere; + } + + getBoundingBox () { + return this.geometryNode.boundingBox; + } + + getChildren () { + let children = []; + + for (let i = 0; i < 8; i++) { + if (this.children[i]) { + children.push(this.children[i]); + } + } + + return children; + } + + getPointsInBox(boxNode){ + + if(!this.sceneNode){ + return null; + } + + let buffer = this.geometryNode.buffer; + + let posOffset = buffer.offset("position"); + let stride = buffer.stride; + let view = new DataView(buffer.data); + + let worldToBox = boxNode.matrixWorld.clone().invert(); + let objectToBox = new Matrix4().multiplyMatrices(worldToBox, this.sceneNode.matrixWorld); + + let inBox = []; + + let pos = new Vector4(); + for(let i = 0; i < buffer.numElements; i++){ + let x = view.getFloat32(i * stride + posOffset + 0, true); + let y = view.getFloat32(i * stride + posOffset + 4, true); + let z = view.getFloat32(i * stride + posOffset + 8, true); + + pos.set(x, y, z, 1); + pos.applyMatrix4(objectToBox); + + if(-0.5 < pos.x && pos.x < 0.5){ + if(-0.5 < pos.y && pos.y < 0.5){ + if(-0.5 < pos.z && pos.z < 0.5){ + pos.set(x, y, z, 1).applyMatrix4(this.sceneNode.matrixWorld); + inBox.push(new Vector3(pos.x, pos.y, pos.z)); + } + } + } + } + + return inBox; + } + + get name () { + return this.geometryNode.name; + } + }; + + class PointCloudOctree extends PointCloudTree { + constructor (geometry, material) { + super(); + + this.pointBudget = Infinity; + this.pcoGeometry = geometry; + this.boundingBox = this.pcoGeometry.boundingBox; + this.boundingSphere = this.boundingBox.getBoundingSphere(new Sphere()); + this.material = material || new PointCloudMaterial$1(); + this.visiblePointsTarget = 2 * 1000 * 1000; + this.minimumNodePixelSize = 150; + this.level = 0; + this.position.copy(geometry.offset); + this.updateMatrix(); + + { + + let priorityQueue = ["rgba", "rgb", "intensity", "classification"]; + let selected = "rgba"; + + for(let attributeName of priorityQueue){ + let attribute = this.pcoGeometry.pointAttributes.attributes.find(a => a.name === attributeName); + + if(!attribute){ + continue; + } + + let min = attribute.range[0].constructor.name === "Array" ? attribute.range[0] : [attribute.range[0]]; + let max = attribute.range[1].constructor.name === "Array" ? attribute.range[1] : [attribute.range[1]]; + + let range_min = new Vector3(...min); + let range_max = new Vector3(...max); + let range = range_min.distanceTo(range_max); + + if(range === 0){ + continue; + } + + selected = attributeName; + break; + } + + this.material.activeAttributeName = selected; + } + + this.showBoundingBox = false; + this.boundingBoxNodes = []; + this.loadQueue = []; + this.visibleBounds = new Box3(); + this.visibleNodes = []; + this.visibleGeometry = []; + this.generateDEM = false; + this.profileRequests = []; + this.name = ''; + this._visible = true; + + { + let box = [this.pcoGeometry.tightBoundingBox, this.getBoundingBoxWorld()] + .find(v => v !== undefined); + + this.updateMatrixWorld(true); + box = Utils.computeTransformedBoundingBox(box, this.matrixWorld); + + let bMin = box.min.z; + let bMax = box.max.z; + this.material.heightMin = bMin; + this.material.heightMax = bMax; + } + + // TODO read projection from file instead + this.projection = geometry.projection; + this.fallbackProjection = geometry.fallbackProjection; + + this.root = this.pcoGeometry.root; + } + + setName (name) { + if (this.name !== name) { + this.name = name; + this.dispatchEvent({type: 'name_changed', name: name, pointcloud: this}); + } + } + + getName () { + return this.name; + } + + getAttribute(name){ + + const attribute = this.pcoGeometry.pointAttributes.attributes.find(a => a.name === name); + + if(attribute){ + return attribute; + }else { + return null; + } + } + + getAttributes(){ + return this.pcoGeometry.pointAttributes; + } + + toTreeNode (geometryNode, parent) { + let node = new PointCloudOctreeNode(); + + // if(geometryNode.name === "r40206"){ + // console.log("creating node for r40206"); + // } + let sceneNode = new Points(geometryNode.geometry, this.material); + sceneNode.name = geometryNode.name; + sceneNode.position.copy(geometryNode.boundingBox.min); + sceneNode.frustumCulled = false; + sceneNode.onBeforeRender = (_this, scene, camera, geometry, material, group) => { + if (material.program) { + _this.getContext().useProgram(material.program.program); + + if (material.program.getUniforms().map.level) { + let level = geometryNode.getLevel(); + material.uniforms.level.value = level; + material.program.getUniforms().map.level.setValue(_this.getContext(), level); + } + + if (this.visibleNodeTextureOffsets && material.program.getUniforms().map.vnStart) { + let vnStart = this.visibleNodeTextureOffsets.get(node); + material.uniforms.vnStart.value = vnStart; + material.program.getUniforms().map.vnStart.setValue(_this.getContext(), vnStart); + } + + if (material.program.getUniforms().map.pcIndex) { + let i = node.pcIndex ? node.pcIndex : this.visibleNodes.indexOf(node); + material.uniforms.pcIndex.value = i; + material.program.getUniforms().map.pcIndex.setValue(_this.getContext(), i); + } + } + }; + + // { // DEBUG + // let sg = new THREE.SphereGeometry(1, 16, 16); + // let sm = new THREE.MeshNormalMaterial(); + // let s = new THREE.Mesh(sg, sm); + // s.scale.set(5, 5, 5); + // s.position.copy(geometryNode.mean) + // .add(this.position) + // .add(geometryNode.boundingBox.min); + // + // viewer.scene.scene.add(s); + // } + + node.geometryNode = geometryNode; + node.sceneNode = sceneNode; + node.pointcloud = this; + node.children = []; + //for (let key in geometryNode.children) { + // node.children[key] = geometryNode.children[key]; + //} + for(let i = 0; i < 8; i++){ + node.children[i] = geometryNode.children[i]; + } + + if (!parent) { + this.root = node; + this.add(sceneNode); + } else { + let childIndex = parseInt(geometryNode.name[geometryNode.name.length - 1]); + parent.sceneNode.add(sceneNode); + parent.children[childIndex] = node; + } + + let disposeListener = function () { + let childIndex = parseInt(geometryNode.name[geometryNode.name.length - 1]); + parent.sceneNode.remove(node.sceneNode); + parent.children[childIndex] = geometryNode; + }; + geometryNode.oneTimeDisposeHandlers.push(disposeListener); + + return node; + } + + updateVisibleBounds () { + let leafNodes = []; + for (let i = 0; i < this.visibleNodes.length; i++) { + let node = this.visibleNodes[i]; + let isLeaf = true; + + for (let j = 0; j < node.children.length; j++) { + let child = node.children[j]; + if (child instanceof PointCloudOctreeNode) { + isLeaf = isLeaf && !child.sceneNode.visible; + } else if (child instanceof PointCloudOctreeGeometryNode) { + isLeaf = true; + } + } + + if (isLeaf) { + leafNodes.push(node); + } + } + + this.visibleBounds.min = new Vector3(Infinity, Infinity, Infinity); + this.visibleBounds.max = new Vector3(-Infinity, -Infinity, -Infinity); + for (let i = 0; i < leafNodes.length; i++) { + let node = leafNodes[i]; + + this.visibleBounds.expandByPoint(node.getBoundingBox().min); + this.visibleBounds.expandByPoint(node.getBoundingBox().max); + } + } + + updateMaterial (material, visibleNodes, camera, renderer) { + material.fov = camera.fov * (Math.PI / 180); + material.screenWidth = renderer.domElement.clientWidth; + material.screenHeight = renderer.domElement.clientHeight; + material.spacing = this.pcoGeometry.spacing; // * Math.max(this.scale.x, this.scale.y, this.scale.z); + material.near = camera.near; + material.far = camera.far; + material.uniforms.octreeSize.value = this.pcoGeometry.boundingBox.getSize(new Vector3()).x; + } + + computeVisibilityTextureData(nodes, camera){ + + if(Potree.measureTimings) performance.mark("computeVisibilityTextureData-start"); + + let data = new Uint8Array(nodes.length * 4); + let visibleNodeTextureOffsets = new Map(); + + // copy array + nodes = nodes.slice(); + + // sort by level and index, e.g. r, r0, r3, r4, r01, r07, r30, ... + let sort = function (a, b) { + let na = a.geometryNode.name; + let nb = b.geometryNode.name; + if (na.length !== nb.length) return na.length - nb.length; + if (na < nb) return -1; + if (na > nb) return 1; + return 0; + }; + nodes.sort(sort); + + let worldDir = new Vector3(); + + let nodeMap = new Map(); + let offsetsToChild = new Array(nodes.length).fill(Infinity); + + for(let i = 0; i < nodes.length; i++){ + let node = nodes[i]; + + nodeMap.set(node.name, node); + visibleNodeTextureOffsets.set(node, i); + + if(i > 0){ + let index = parseInt(node.name.slice(-1)); + let parentName = node.name.slice(0, -1); + let parent = nodeMap.get(parentName); + let parentOffset = visibleNodeTextureOffsets.get(parent); + + let parentOffsetToChild = (i - parentOffset); + + offsetsToChild[parentOffset] = Math.min(offsetsToChild[parentOffset], parentOffsetToChild); + + data[parentOffset * 4 + 0] = data[parentOffset * 4 + 0] | (1 << index); + data[parentOffset * 4 + 1] = (offsetsToChild[parentOffset] >> 8); + data[parentOffset * 4 + 2] = (offsetsToChild[parentOffset] % 256); + } + + let density = node.geometryNode.density; + + if(typeof density === "number"){ + let lodOffset = Math.log2(density) / 2 - 1.5; + + let offsetUint8 = (lodOffset + 10) * 10; + + data[i * 4 + 3] = offsetUint8; + }else { + data[i * 4 + 3] = 100; + } + + } + + if(Potree.measureTimings){ + performance.mark("computeVisibilityTextureData-end"); + performance.measure("render.computeVisibilityTextureData", "computeVisibilityTextureData-start", "computeVisibilityTextureData-end"); + } + + return { + data: data, + offsets: visibleNodeTextureOffsets + }; + } + + nodeIntersectsProfile (node, profile) { + let bbWorld = node.boundingBox.clone().applyMatrix4(this.matrixWorld); + let bsWorld = bbWorld.getBoundingSphere(new Sphere()); + + let intersects = false; + + for (let i = 0; i < profile.points.length - 1; i++) { + + let start = new Vector3(profile.points[i + 0].x, profile.points[i + 0].y, bsWorld.center.z); + let end = new Vector3(profile.points[i + 1].x, profile.points[i + 1].y, bsWorld.center.z); + + let closest = new Line3(start, end).closestPointToPoint(bsWorld.center, true, new Vector3()); + let distance = closest.distanceTo(bsWorld.center); + + intersects = intersects || (distance < (bsWorld.radius + profile.width)); + } + + //console.log(`${node.name}: ${intersects}`); + + return intersects; + } + + deepestNodeAt(position){ + + const toObjectSpace = this.matrixWorld.clone().invert(); + + const objPos = position.clone().applyMatrix4(toObjectSpace); + + let current = this.root; + while(true){ + + let containingChild = null; + + for(const child of current.children){ + + if(child !== undefined){ + if(child.getBoundingBox().containsPoint(objPos)){ + containingChild = child; + } + } + } + + if(containingChild !== null && containingChild instanceof PointCloudOctreeNode){ + current = containingChild; + }else { + break; + } + } + + const deepest = current; + + return deepest; + } + + nodesOnRay (nodes, ray) { + let nodesOnRay = []; + + let _ray = ray.clone(); + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i]; + let sphere = node.getBoundingSphere().clone().applyMatrix4(this.matrixWorld); + + if (_ray.intersectsSphere(sphere)) { + nodesOnRay.push(node); + } + } + + return nodesOnRay; + } + + updateMatrixWorld (force) { + if (this.matrixAutoUpdate === true) this.updateMatrix(); + + if (this.matrixWorldNeedsUpdate === true || force === true) { + if (!this.parent) { + this.matrixWorld.copy(this.matrix); + } else { + this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix); + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + } + } + + hideDescendants (object) { + let stack = []; + for (let i = 0; i < object.children.length; i++) { + let child = object.children[i]; + if (child.visible) { + stack.push(child); + } + } + + while (stack.length > 0) { + let object = stack.shift(); + + object.visible = false; + + for (let i = 0; i < object.children.length; i++) { + let child = object.children[i]; + if (child.visible) { + stack.push(child); + } + } + } + } + + moveToOrigin () { + this.position.set(0, 0, 0); + this.updateMatrixWorld(true); + let box = this.boundingBox; + let transform = this.matrixWorld; + let tBox = Utils.computeTransformedBoundingBox(box, transform); + this.position.set(0, 0, 0).sub(tBox.getCenter(new Vector3())); + }; + + moveToGroundPlane () { + this.updateMatrixWorld(true); + let box = this.boundingBox; + let transform = this.matrixWorld; + let tBox = Utils.computeTransformedBoundingBox(box, transform); + this.position.y += -tBox.min.y; + }; + + getBoundingBoxWorld () { + this.updateMatrixWorld(true); + let box = this.boundingBox; + let transform = this.matrixWorld; + let tBox = Utils.computeTransformedBoundingBox(box, transform); + + return tBox; + }; + + /** + * returns points inside the profile points + * + * maxDepth: search points up to the given octree depth + * + * + * The return value is an array with all segments of the profile path + * let segment = { + * start: THREE.Vector3, + * end: THREE.Vector3, + * points: {} + * project: function() + * }; + * + * The project() function inside each segment can be used to transform + * that segments point coordinates to line up along the x-axis. + * + * + */ + getPointsInProfile (profile, maxDepth, callback) { + if (callback) { + let request = new Potree.ProfileRequest(this, profile, maxDepth, callback); + this.profileRequests.push(request); + + return request; + } + + let points = { + segments: [], + boundingBox: new Box3(), + projectedBoundingBox: new Box2() + }; + + // evaluate segments + for (let i = 0; i < profile.points.length - 1; i++) { + let start = profile.points[i]; + let end = profile.points[i + 1]; + let ps = this.getProfile(start, end, profile.width, maxDepth); + + let segment = { + start: start, + end: end, + points: ps, + project: null + }; + + points.segments.push(segment); + + points.boundingBox.expandByPoint(ps.boundingBox.min); + points.boundingBox.expandByPoint(ps.boundingBox.max); + } + + // add projection functions to the segments + let mileage = new Vector3(); + for (let i = 0; i < points.segments.length; i++) { + let segment = points.segments[i]; + let start = segment.start; + let end = segment.end; + + let project = (function (_start, _end, _mileage, _boundingBox) { + let start = _start; + let end = _end; + let mileage = _mileage; + let boundingBox = _boundingBox; + + let xAxis = new Vector3(1, 0, 0); + let dir = new Vector3().subVectors(end, start); + dir.y = 0; + dir.normalize(); + let alpha = Math.acos(xAxis.dot(dir)); + if (dir.z > 0) { + alpha = -alpha; + } + + return function (position) { + let toOrigin = new Matrix4().makeTranslation(-start.x, -boundingBox.min.y, -start.z); + let alignWithX = new Matrix4().makeRotationY(-alpha); + let applyMileage = new Matrix4().makeTranslation(mileage.x, 0, 0); + + let pos = position.clone(); + pos.applyMatrix4(toOrigin); + pos.applyMatrix4(alignWithX); + pos.applyMatrix4(applyMileage); + + return pos; + }; + }(start, end, mileage.clone(), points.boundingBox.clone())); + + segment.project = project; + + mileage.x += new Vector3(start.x, 0, start.z).distanceTo(new Vector3(end.x, 0, end.z)); + mileage.y += end.y - start.y; + } + + points.projectedBoundingBox.min.x = 0; + points.projectedBoundingBox.min.y = points.boundingBox.min.y; + points.projectedBoundingBox.max.x = mileage.x; + points.projectedBoundingBox.max.y = points.boundingBox.max.y; + + return points; + } + + /** + * returns points inside the given profile bounds. + * + * start: + * end: + * width: + * depth: search points up to the given octree depth + * callback: if specified, points are loaded before searching + * + * + */ + getProfile (start, end, width, depth, callback) { + let request = new Potree.ProfileRequest(start, end, width, depth, callback); + this.profileRequests.push(request); + }; + + getVisibleExtent () { + return this.visibleBounds.applyMatrix4(this.matrixWorld); + }; + + intersectsPoint(position){ + + let rootAvailable = this.pcoGeometry.root && this.pcoGeometry.root.geometry; + + if(!rootAvailable){ + return false; + } + + if(typeof this.signedDistanceField === "undefined"){ + + const resolution = 32; + const field = new Float32Array(resolution ** 3).fill(Infinity); + + const positions = this.pcoGeometry.root.geometry.attributes.position; + const boundingBox = this.boundingBox; + + const n = positions.count; + + for(let i = 0; i < n; i = i + 3){ + const x = positions.array[3 * i + 0]; + const y = positions.array[3 * i + 1]; + const z = positions.array[3 * i + 2]; + + const ix = parseInt(Math.min(resolution * (x / boundingBox.max.x), resolution - 1)); + const iy = parseInt(Math.min(resolution * (y / boundingBox.max.y), resolution - 1)); + const iz = parseInt(Math.min(resolution * (z / boundingBox.max.z), resolution - 1)); + + const index = ix + iy * resolution + iz * resolution * resolution; + + field[index] = 0; + } + + const sdf = { + resolution: resolution, + field: field, + }; + + this.signedDistanceField = sdf; + } + + + { + const sdf = this.signedDistanceField; + const boundingBox = this.boundingBox; + + const toObjectSpace = this.matrixWorld.clone().invert(); + + const objPos = position.clone().applyMatrix4(toObjectSpace); + + const resolution = sdf.resolution; + const ix = parseInt(resolution * (objPos.x / boundingBox.max.x)); + const iy = parseInt(resolution * (objPos.y / boundingBox.max.y)); + const iz = parseInt(resolution * (objPos.z / boundingBox.max.z)); + + if(ix < 0 || iy < 0 || iz < 0){ + return false; + } + if(ix >= resolution || iy >= resolution || iz >= resolution){ + return false; + } + + const index = ix + iy * resolution + iz * resolution * resolution; + + const value = sdf.field[index]; + + if(value === 0){ + return true; + } + + } + + return false; + + } + + /** + * + * + * + * params.pickWindowSize: Look for points inside a pixel window of this size. + * Use odd values: 1, 3, 5, ... + * + * + * TODO: only draw pixels that are actually read with readPixels(). + * + */ + pick(viewer, camera, ray, params = {}){ + + let renderer = viewer.renderer; + let pRenderer = viewer.pRenderer; + + performance.mark("pick-start"); + + let getVal = (a, b) => a !== undefined ? a : b; + + let pickWindowSize = getVal(params.pickWindowSize, 65); + let pickOutsideClipRegion = getVal(params.pickOutsideClipRegion, false); + + let size = renderer.getSize(new Vector2()); + + let width = Math.ceil(getVal(params.width, size.width)); + let height = Math.ceil(getVal(params.height, size.height)); + + let pointSizeType = getVal(params.pointSizeType, this.material.pointSizeType); + let pointSize = getVal(params.pointSize, this.material.size); + + let nodes = this.nodesOnRay(this.visibleNodes, ray); + + if (nodes.length === 0) { + return null; + } + + if (!this.pickState) { + let scene = new Scene(); + + let material = new Potree.PointCloudMaterial(); + material.activeAttributeName = "indices"; + + let renderTarget = new WebGLRenderTarget( + 1, 1, + { minFilter: LinearFilter, + magFilter: NearestFilter, + format: RGBAFormat } + ); + + this.pickState = { + renderTarget: renderTarget, + material: material, + scene: scene + }; + }; + + let pickState = this.pickState; + let pickMaterial = pickState.material; + + { // update pick material + pickMaterial.pointSizeType = pointSizeType; + //pickMaterial.shape = this.material.shape; + pickMaterial.shape = Potree.PointShape.PARABOLOID; + + pickMaterial.uniforms.uFilterReturnNumberRange.value = this.material.uniforms.uFilterReturnNumberRange.value; + pickMaterial.uniforms.uFilterNumberOfReturnsRange.value = this.material.uniforms.uFilterNumberOfReturnsRange.value; + pickMaterial.uniforms.uFilterGPSTimeClipRange.value = this.material.uniforms.uFilterGPSTimeClipRange.value; + pickMaterial.uniforms.uFilterPointSourceIDClipRange.value = this.material.uniforms.uFilterPointSourceIDClipRange.value; + + pickMaterial.activeAttributeName = "indices"; + + pickMaterial.size = pointSize; + pickMaterial.uniforms.minSize.value = this.material.uniforms.minSize.value; + pickMaterial.uniforms.maxSize.value = this.material.uniforms.maxSize.value; + pickMaterial.classification = this.material.classification; + pickMaterial.recomputeClassification(); + + if(params.pickClipped){ + pickMaterial.clipBoxes = this.material.clipBoxes; + pickMaterial.uniforms.clipBoxes = this.material.uniforms.clipBoxes; + if(this.material.clipTask === Potree.ClipTask.HIGHLIGHT){ + pickMaterial.clipTask = Potree.ClipTask.NONE; + }else { + pickMaterial.clipTask = this.material.clipTask; + } + pickMaterial.clipMethod = this.material.clipMethod; + }else { + pickMaterial.clipBoxes = []; + } + + this.updateMaterial(pickMaterial, nodes, camera, renderer); + } + + pickState.renderTarget.setSize(width, height); + + let pixelPos = new Vector2(params.x, params.y); + + let gl = renderer.getContext(); + gl.enable(gl.SCISSOR_TEST); + gl.scissor( + parseInt(pixelPos.x - (pickWindowSize - 1) / 2), + parseInt(pixelPos.y - (pickWindowSize - 1) / 2), + parseInt(pickWindowSize), parseInt(pickWindowSize)); + + + renderer.state.buffers.depth.setTest(pickMaterial.depthTest); + renderer.state.buffers.depth.setMask(pickMaterial.depthWrite); + renderer.state.setBlending(NoBlending); + + { // RENDER + renderer.setRenderTarget(pickState.renderTarget); + gl.clearColor(0, 0, 0, 0); + renderer.clear(true, true, true); + + let tmp = this.material; + this.material = pickMaterial; + + pRenderer.renderOctree(this, nodes, camera, pickState.renderTarget); + + this.material = tmp; + } + + let clamp = (number, min, max) => Math.min(Math.max(min, number), max); + + let x = parseInt(clamp(pixelPos.x - (pickWindowSize - 1) / 2, 0, width)); + let y = parseInt(clamp(pixelPos.y - (pickWindowSize - 1) / 2, 0, height)); + let w = parseInt(Math.min(x + pickWindowSize, width) - x); + let h = parseInt(Math.min(y + pickWindowSize, height) - y); + + let pixelCount = w * h; + let buffer = new Uint8Array(4 * pixelCount); + + gl.readPixels(x, y, pickWindowSize, pickWindowSize, gl.RGBA, gl.UNSIGNED_BYTE, buffer); + + renderer.setRenderTarget(null); + renderer.state.reset(); + renderer.setScissorTest(false); + gl.disable(gl.SCISSOR_TEST); + + let pixels = buffer; + let ibuffer = new Uint32Array(buffer.buffer); + + // find closest hit inside pixelWindow boundaries + let min = Number.MAX_VALUE; + let hits = []; + for (let u = 0; u < pickWindowSize; u++) { + for (let v = 0; v < pickWindowSize; v++) { + let offset = (u + v * pickWindowSize); + let distance = Math.pow(u - (pickWindowSize - 1) / 2, 2) + Math.pow(v - (pickWindowSize - 1) / 2, 2); + + let pcIndex = pixels[4 * offset + 3]; + pixels[4 * offset + 3] = 0; + let pIndex = ibuffer[offset]; + + if(!(pcIndex === 0 && pIndex === 0) && (pcIndex !== undefined) && (pIndex !== undefined)){ + let hit = { + pIndex: pIndex, + pcIndex: pcIndex, + distanceToCenter: distance + }; + + if(params.all){ + hits.push(hit); + }else { + if(hits.length > 0){ + if(distance < hits[0].distanceToCenter){ + hits[0] = hit; + } + }else { + hits.push(hit); + } + } + + + } + } + } + + + // { // DEBUG: show panel with pick image + // let img = Utils.pixelsArrayToImage(buffer, w, h); + // let screenshot = img.src; + + // if(!this.debugDIV){ + // this.debugDIV = $(` + //
    `); + // $(document.body).append(this.debugDIV); + // } + + // this.debugDIV.empty(); + // this.debugDIV.append($(``)); + // //$(this.debugWindow.document).append($(``)); + // //this.debugWindow.document.write(''); + // } + + + for(let hit of hits){ + let point = {}; + + if (!nodes[hit.pcIndex]) { + return null; + } + + let node = nodes[hit.pcIndex]; + let pc = node.sceneNode; + let geometry = node.geometryNode.geometry; + + for(let attributeName in geometry.attributes){ + let attribute = geometry.attributes[attributeName]; + + if (attributeName === 'position') { + let x = attribute.array[3 * hit.pIndex + 0]; + let y = attribute.array[3 * hit.pIndex + 1]; + let z = attribute.array[3 * hit.pIndex + 2]; + + let position = new Vector3(x, y, z); + position.applyMatrix4(pc.matrixWorld); + + point[attributeName] = position; + } else if (attributeName === 'indices') { + + } else { + + let values = attribute.array.slice(attribute.itemSize * hit.pIndex, attribute.itemSize * (hit.pIndex + 1)) ; + + if(attribute.potree){ + const {scale, offset} = attribute.potree; + values = values.map(v => v / scale + offset); + } + + point[attributeName] = values; + + //debugger; + //if (values.itemSize === 1) { + // point[attribute.name] = values.array[hit.pIndex]; + //} else { + // let value = []; + // for (let j = 0; j < values.itemSize; j++) { + // value.push(values.array[values.itemSize * hit.pIndex + j]); + // } + // point[attribute.name] = value; + //} + } + + } + + hit.point = point; + } + + performance.mark("pick-end"); + performance.measure("pick", "pick-start", "pick-end"); + + if(params.all){ + return hits.map(hit => hit.point); + }else { + if(hits.length === 0){ + return null; + }else { + return hits[0].point; + //let sorted = hits.sort( (a, b) => a.distanceToCenter - b.distanceToCenter); + + //return sorted[0].point; + } + } + + }; + + * getFittedBoxGen(boxNode){ + let start = performance.now(); + + let shrinkedLocalBounds = new Box3(); + let worldToBox = boxNode.matrixWorld.clone().invert(); + + for(let node of this.visibleNodes){ + if(!node.sceneNode){ + continue; + } + + let buffer = node.geometryNode.buffer; + + let posOffset = buffer.offset("position"); + let stride = buffer.stride; + let view = new DataView(buffer.data); + + let objectToBox = new Matrix4().multiplyMatrices(worldToBox, node.sceneNode.matrixWorld); + + let pos = new Vector4(); + for(let i = 0; i < buffer.numElements; i++){ + let x = view.getFloat32(i * stride + posOffset + 0, true); + let y = view.getFloat32(i * stride + posOffset + 4, true); + let z = view.getFloat32(i * stride + posOffset + 8, true); + + pos.set(x, y, z, 1); + pos.applyMatrix4(objectToBox); + + if(-0.5 < pos.x && pos.x < 0.5){ + if(-0.5 < pos.y && pos.y < 0.5){ + if(-0.5 < pos.z && pos.z < 0.5){ + shrinkedLocalBounds.expandByPoint(pos); + } + } + } + } + + yield; + } + + let fittedPosition = shrinkedLocalBounds.getCenter(new Vector3()).applyMatrix4(boxNode.matrixWorld); + + let fitted = new Object3D(); + fitted.position.copy(fittedPosition); + fitted.scale.copy(boxNode.scale); + fitted.rotation.copy(boxNode.rotation); + + let ds = new Vector3().subVectors(shrinkedLocalBounds.max, shrinkedLocalBounds.min); + fitted.scale.multiply(ds); + + let duration = performance.now() - start; + console.log("duration: ", duration); + + yield fitted; + } + + getFittedBox(boxNode, maxLevel = Infinity){ + + maxLevel = Infinity; + + let start = performance.now(); + + let shrinkedLocalBounds = new Box3(); + let worldToBox = boxNode.matrixWorld.clone().invert(); + + for(let node of this.visibleNodes){ + if(!node.sceneNode || node.getLevel() > maxLevel){ + continue; + } + + let buffer = node.geometryNode.buffer; + + let posOffset = buffer.offset("position"); + let stride = buffer.stride; + let view = new DataView(buffer.data); + + let objectToBox = new Matrix4().multiplyMatrices(worldToBox, node.sceneNode.matrixWorld); + + let pos = new Vector4(); + for(let i = 0; i < buffer.numElements; i++){ + let x = view.getFloat32(i * stride + posOffset + 0, true); + let y = view.getFloat32(i * stride + posOffset + 4, true); + let z = view.getFloat32(i * stride + posOffset + 8, true); + + pos.set(x, y, z, 1); + pos.applyMatrix4(objectToBox); + + if(-0.5 < pos.x && pos.x < 0.5){ + if(-0.5 < pos.y && pos.y < 0.5){ + if(-0.5 < pos.z && pos.z < 0.5){ + shrinkedLocalBounds.expandByPoint(pos); + } + } + } + } + } + + let fittedPosition = shrinkedLocalBounds.getCenter(new Vector3()).applyMatrix4(boxNode.matrixWorld); + + let fitted = new Object3D(); + fitted.position.copy(fittedPosition); + fitted.scale.copy(boxNode.scale); + fitted.rotation.copy(boxNode.rotation); + + let ds = new Vector3().subVectors(shrinkedLocalBounds.max, shrinkedLocalBounds.min); + fitted.scale.multiply(ds); + + let duration = performance.now() - start; + console.log("duration: ", duration); + + return fitted; + } + + get progress () { + return this.visibleNodes.length / this.visibleGeometry.length; + } + + find(name){ + let node = null; + for(let char of name){ + if(char === "r"){ + node = this.root; + }else { + node = node.children[char]; + } + } + + return node; + } + + get visible(){ + return this._visible; + } + + set visible(value){ + + if(value !== this._visible){ + this._visible = value; + + this.dispatchEvent({type: 'visibility_changed', pointcloud: this}); + } + + } + + } + + class Points$1 { + + constructor () { + this.boundingBox = new Box3(); + this.numPoints = 0; + this.data = {}; + } + + add (points) { + let currentSize = this.numPoints; + let additionalSize = points.numPoints; + let newSize = currentSize + additionalSize; + + let thisAttributes = Object.keys(this.data); + let otherAttributes = Object.keys(points.data); + let attributes = new Set([...thisAttributes, ...otherAttributes]); + + for (let attribute of attributes) { + if (thisAttributes.includes(attribute) && otherAttributes.includes(attribute)) { + // attribute in both, merge + let Type = this.data[attribute].constructor; + let merged = new Type(this.data[attribute].length + points.data[attribute].length); + merged.set(this.data[attribute], 0); + merged.set(points.data[attribute], this.data[attribute].length); + this.data[attribute] = merged; + } else if (thisAttributes.includes(attribute) && !otherAttributes.includes(attribute)) { + // attribute only in this; take over this and expand to new size + let elementsPerPoint = this.data[attribute].length / this.numPoints; + let Type = this.data[attribute].constructor; + let expanded = new Type(elementsPerPoint * newSize); + expanded.set(this.data[attribute], 0); + this.data[attribute] = expanded; + } else if (!thisAttributes.includes(attribute) && otherAttributes.includes(attribute)) { + // attribute only in points to be added; take over new points and expand to new size + let elementsPerPoint = points.data[attribute].length / points.numPoints; + let Type = points.data[attribute].constructor; + let expanded = new Type(elementsPerPoint * newSize); + expanded.set(points.data[attribute], elementsPerPoint * currentSize); + this.data[attribute] = expanded; + } + } + + this.numPoints = newSize; + + this.boundingBox.union(points.boundingBox); + } + } + + /** + * + * code adapted from three.js BoxHelper.js + * https://github.com/mrdoob/three.js/blob/dev/src/helpers/BoxHelper.js + * + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author mschuetz / http://potree.org + */ + + class Box3Helper$1 extends LineSegments { + constructor (box, color) { + if (color === undefined) color = 0xffff00; + + let indices = new Uint16Array([ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ]); + let positions = new Float32Array([ + box.min.x, box.min.y, box.min.z, + box.max.x, box.min.y, box.min.z, + box.max.x, box.min.y, box.max.z, + box.min.x, box.min.y, box.max.z, + box.min.x, box.max.y, box.min.z, + box.max.x, box.max.y, box.min.z, + box.max.x, box.max.y, box.max.z, + box.min.x, box.max.y, box.max.z + ]); + + let geometry = new BufferGeometry(); + geometry.setIndex(new BufferAttribute(indices, 1)); + geometry.setAttribute('position', new BufferAttribute(positions, 3)); + + let material = new LineBasicMaterial({ color: color }); + + super(geometry, material); + } + } + + function updatePointClouds(pointclouds, camera, renderer){ + + for (let pointcloud of pointclouds) { + let start = performance.now(); + + for (let profileRequest of pointcloud.profileRequests) { + profileRequest.update(); + + let duration = performance.now() - start; + if(duration > 5){ + break; + } + } + + let duration = performance.now() - start; + } + + let result = updateVisibility(pointclouds, camera, renderer); + + for (let pointcloud of pointclouds) { + pointcloud.updateMaterial(pointcloud.material, pointcloud.visibleNodes, camera, renderer); + pointcloud.updateVisibleBounds(); + } + + exports.lru.freeMemory(); + + return result; + }; + + + + function updateVisibilityStructures(pointclouds, camera, renderer) { + let frustums = []; + let camObjPositions = []; + let priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; }); + + for (let i = 0; i < pointclouds.length; i++) { + let pointcloud = pointclouds[i]; + + if (!pointcloud.initialized()) { + continue; + } + + pointcloud.numVisibleNodes = 0; + pointcloud.numVisiblePoints = 0; + pointcloud.deepestVisibleLevel = 0; + pointcloud.visibleNodes = []; + pointcloud.visibleGeometry = []; + + // frustum in object space + camera.updateMatrixWorld(); + let frustum = new Frustum(); + let viewI = camera.matrixWorldInverse; + let world = pointcloud.matrixWorld; + + // use close near plane for frustum intersection + let frustumCam = camera.clone(); + frustumCam.near = Math.min(camera.near, 0.1); + frustumCam.updateProjectionMatrix(); + let proj = camera.projectionMatrix; + + let fm = new Matrix4().multiply(proj).multiply(viewI).multiply(world); + frustum.setFromProjectionMatrix(fm); + frustums.push(frustum); + + // camera position in object space + let view = camera.matrixWorld; + let worldI = world.clone().invert(); + let camMatrixObject = new Matrix4().multiply(worldI).multiply(view); + let camObjPos = new Vector3().setFromMatrixPosition(camMatrixObject); + camObjPositions.push(camObjPos); + + if (pointcloud.visible && pointcloud.root !== null) { + priorityQueue.push({pointcloud: i, node: pointcloud.root, weight: Number.MAX_VALUE}); + } + + // hide all previously visible nodes + // if(pointcloud.root instanceof PointCloudOctreeNode){ + // pointcloud.hideDescendants(pointcloud.root.sceneNode); + // } + if (pointcloud.root.isTreeNode()) { + pointcloud.hideDescendants(pointcloud.root.sceneNode); + } + + for (let j = 0; j < pointcloud.boundingBoxNodes.length; j++) { + pointcloud.boundingBoxNodes[j].visible = false; + } + } + + return { + 'frustums': frustums, + 'camObjPositions': camObjPositions, + 'priorityQueue': priorityQueue + }; + }; + + + function updateVisibility(pointclouds, camera, renderer){ + + let numVisibleNodes = 0; + let numVisiblePoints = 0; + + let numVisiblePointsInPointclouds = new Map(pointclouds.map(pc => [pc, 0])); + + let visibleNodes = []; + let visibleGeometry = []; + let unloadedGeometry = []; + + let lowestSpacing = Infinity; + + // calculate object space frustum and cam pos and setup priority queue + let s = updateVisibilityStructures(pointclouds, camera, renderer); + let frustums = s.frustums; + let camObjPositions = s.camObjPositions; + let priorityQueue = s.priorityQueue; + + let loadedToGPUThisFrame = 0; + + let domWidth = renderer.domElement.clientWidth; + let domHeight = renderer.domElement.clientHeight; + + // check if pointcloud has been transformed + // some code will only be executed if changes have been detected + if(!Potree._pointcloudTransformVersion){ + Potree._pointcloudTransformVersion = new Map(); + } + let pointcloudTransformVersion = Potree._pointcloudTransformVersion; + for(let pointcloud of pointclouds){ + + if(!pointcloud.visible){ + continue; + } + + pointcloud.updateMatrixWorld(); + + if(!pointcloudTransformVersion.has(pointcloud)){ + pointcloudTransformVersion.set(pointcloud, {number: 0, transform: pointcloud.matrixWorld.clone()}); + }else { + let version = pointcloudTransformVersion.get(pointcloud); + + if(!version.transform.equals(pointcloud.matrixWorld)){ + version.number++; + version.transform.copy(pointcloud.matrixWorld); + + pointcloud.dispatchEvent({ + type: "transformation_changed", + target: pointcloud + }); + } + } + } + + while (priorityQueue.size() > 0) { + let element = priorityQueue.pop(); + let node = element.node; + let parent = element.parent; + let pointcloud = pointclouds[element.pointcloud]; + + // { // restrict to certain nodes for debugging + // let allowedNodes = ["r", "r0", "r4"]; + // if(!allowedNodes.includes(node.name)){ + // continue; + // } + // } + + let box = node.getBoundingBox(); + let frustum = frustums[element.pointcloud]; + let camObjPos = camObjPositions[element.pointcloud]; + + let insideFrustum = frustum.intersectsBox(box); + let maxLevel = pointcloud.maxLevel || Infinity; + let level = node.getLevel(); + let visible = insideFrustum; + visible = visible && !(numVisiblePoints + node.getNumPoints() > Potree.pointBudget); + visible = visible && !(numVisiblePointsInPointclouds.get(pointcloud) + node.getNumPoints() > pointcloud.pointBudget); + visible = visible && level < maxLevel; + visible = visible || node.getLevel() <= 2; + + let clipBoxes = pointcloud.material.clipBoxes; + if(true && clipBoxes.length > 0){ + + //node.debug = false; + + let numIntersecting = 0; + let numIntersectionVolumes = 0; + + //if(node.name === "r60"){ + // var a = 10; + //} + + for(let clipBox of clipBoxes){ + + let pcWorldInverse = pointcloud.matrixWorld.clone().invert(); + let toPCObject = pcWorldInverse.multiply(clipBox.box.matrixWorld); + + let px = new Vector3(+0.5, 0, 0).applyMatrix4(pcWorldInverse); + let nx = new Vector3(-0.5, 0, 0).applyMatrix4(pcWorldInverse); + let py = new Vector3(0, +0.5, 0).applyMatrix4(pcWorldInverse); + let ny = new Vector3(0, -0.5, 0).applyMatrix4(pcWorldInverse); + let pz = new Vector3(0, 0, +0.5).applyMatrix4(pcWorldInverse); + let nz = new Vector3(0, 0, -0.5).applyMatrix4(pcWorldInverse); + + let pxN = new Vector3().subVectors(nx, px).normalize(); + let nxN = pxN.clone().multiplyScalar(-1); + let pyN = new Vector3().subVectors(ny, py).normalize(); + let nyN = pyN.clone().multiplyScalar(-1); + let pzN = new Vector3().subVectors(nz, pz).normalize(); + let nzN = pzN.clone().multiplyScalar(-1); + + let pxPlane = new Plane().setFromNormalAndCoplanarPoint(pxN, px); + let nxPlane = new Plane().setFromNormalAndCoplanarPoint(nxN, nx); + let pyPlane = new Plane().setFromNormalAndCoplanarPoint(pyN, py); + let nyPlane = new Plane().setFromNormalAndCoplanarPoint(nyN, ny); + let pzPlane = new Plane().setFromNormalAndCoplanarPoint(pzN, pz); + let nzPlane = new Plane().setFromNormalAndCoplanarPoint(nzN, nz); + + //if(window.debugdraw !== undefined && window.debugdraw === true && node.name === "r60"){ + + // Potree.utils.debugPlane(viewer.scene.scene, pxPlane, 1, 0xFF0000); + // Potree.utils.debugPlane(viewer.scene.scene, nxPlane, 1, 0x990000); + // Potree.utils.debugPlane(viewer.scene.scene, pyPlane, 1, 0x00FF00); + // Potree.utils.debugPlane(viewer.scene.scene, nyPlane, 1, 0x009900); + // Potree.utils.debugPlane(viewer.scene.scene, pzPlane, 1, 0x0000FF); + // Potree.utils.debugPlane(viewer.scene.scene, nzPlane, 1, 0x000099); + + // Potree.utils.debugBox(viewer.scene.scene, box, new THREE.Matrix4(), 0x00FF00); + // Potree.utils.debugBox(viewer.scene.scene, box, pointcloud.matrixWorld, 0xFF0000); + // Potree.utils.debugBox(viewer.scene.scene, clipBox.box.boundingBox, clipBox.box.matrixWorld, 0xFF0000); + + // window.debugdraw = false; + //} + + let frustum = new Frustum(pxPlane, nxPlane, pyPlane, nyPlane, pzPlane, nzPlane); + let intersects = frustum.intersectsBox(box); + + if(intersects){ + numIntersecting++; + } + numIntersectionVolumes++; + } + + let insideAny = numIntersecting > 0; + let insideAll = numIntersecting === numIntersectionVolumes; + + if(pointcloud.material.clipTask === ClipTask.SHOW_INSIDE){ + if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ANY && insideAny){ + //node.debug = true + }else if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ALL && insideAll){ + //node.debug = true; + }else { + visible = false; + } + } else if(pointcloud.material.clipTask === ClipTask.SHOW_OUTSIDE){ + //if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ANY && !insideAny){ + // //visible = true; + // let a = 10; + //}else if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ALL && !insideAll){ + // //visible = true; + // let a = 20; + //}else{ + // visible = false; + //} + } + + + } + + // visible = ["r", "r0", "r06", "r060"].includes(node.name); + // visible = ["r"].includes(node.name); + + if (node.spacing) { + lowestSpacing = Math.min(lowestSpacing, node.spacing); + } else if (node.geometryNode && node.geometryNode.spacing) { + lowestSpacing = Math.min(lowestSpacing, node.geometryNode.spacing); + } + + if (numVisiblePoints + node.getNumPoints() > Potree.pointBudget) { + break; + } + + if (!visible) { + continue; + } + + // TODO: not used, same as the declaration? + // numVisibleNodes++; + numVisiblePoints += node.getNumPoints(); + let numVisiblePointsInPointcloud = numVisiblePointsInPointclouds.get(pointcloud); + numVisiblePointsInPointclouds.set(pointcloud, numVisiblePointsInPointcloud + node.getNumPoints()); + + pointcloud.numVisibleNodes++; + pointcloud.numVisiblePoints += node.getNumPoints(); + + if (node.isGeometryNode() && (!parent || parent.isTreeNode())) { + if (node.isLoaded() && loadedToGPUThisFrame < 2) { + node = pointcloud.toTreeNode(node, parent); + loadedToGPUThisFrame++; + } else { + unloadedGeometry.push(node); + visibleGeometry.push(node); + } + } + + if (node.isTreeNode()) { + exports.lru.touch(node.geometryNode); + node.sceneNode.visible = true; + node.sceneNode.material = pointcloud.material; + + visibleNodes.push(node); + pointcloud.visibleNodes.push(node); + + if(node._transformVersion === undefined){ + node._transformVersion = -1; + } + let transformVersion = pointcloudTransformVersion.get(pointcloud); + if(node._transformVersion !== transformVersion.number){ + node.sceneNode.updateMatrix(); + node.sceneNode.matrixWorld.multiplyMatrices(pointcloud.matrixWorld, node.sceneNode.matrix); + node._transformVersion = transformVersion.number; + } + + if (pointcloud.showBoundingBox && !node.boundingBoxNode && node.getBoundingBox) { + let boxHelper = new Box3Helper$1(node.getBoundingBox()); + boxHelper.matrixAutoUpdate = false; + pointcloud.boundingBoxNodes.push(boxHelper); + node.boundingBoxNode = boxHelper; + node.boundingBoxNode.matrix.copy(pointcloud.matrixWorld); + } else if (pointcloud.showBoundingBox) { + node.boundingBoxNode.visible = true; + node.boundingBoxNode.matrix.copy(pointcloud.matrixWorld); + } else if (!pointcloud.showBoundingBox && node.boundingBoxNode) { + node.boundingBoxNode.visible = false; + } + + // if(node.boundingBoxNode !== undefined && exports.debug.allowedNodes !== undefined){ + // if(!exports.debug.allowedNodes.includes(node.name)){ + // node.boundingBoxNode.visible = false; + // } + // } + } + + // add child nodes to priorityQueue + let children = node.getChildren(); + for (let i = 0; i < children.length; i++) { + let child = children[i]; + + let weight = 0; + if(camera.isPerspectiveCamera){ + let sphere = child.getBoundingSphere(); + let center = sphere.center; + //let distance = sphere.center.distanceTo(camObjPos); + + let dx = camObjPos.x - center.x; + let dy = camObjPos.y - center.y; + let dz = camObjPos.z - center.z; + + let dd = dx * dx + dy * dy + dz * dz; + let distance = Math.sqrt(dd); + + + let radius = sphere.radius; + + let fov = (camera.fov * Math.PI) / 180; + let slope = Math.tan(fov / 2); + let projFactor = (0.5 * domHeight) / (slope * distance); + let screenPixelRadius = radius * projFactor; + + if(screenPixelRadius < pointcloud.minimumNodePixelSize){ + continue; + } + + weight = screenPixelRadius; + + if(distance - radius < 0){ + weight = Number.MAX_VALUE; + } + } else { + // TODO ortho visibility + let bb = child.getBoundingBox(); + let distance = child.getBoundingSphere().center.distanceTo(camObjPos); + let diagonal = bb.max.clone().sub(bb.min).length(); + //weight = diagonal / distance; + + weight = diagonal; + } + + priorityQueue.push({pointcloud: element.pointcloud, node: child, parent: node, weight: weight}); + } + }// end priority queue loop + + { // update DEM + let maxDEMLevel = 4; + let candidates = pointclouds + .filter(p => (p.generateDEM && p.dem instanceof Potree.DEM)); + for (let pointcloud of candidates) { + let updatingNodes = pointcloud.visibleNodes.filter(n => n.getLevel() <= maxDEMLevel); + pointcloud.dem.update(updatingNodes); + } + } + + for (let i = 0; i < Math.min(Potree.maxNodesLoading, unloadedGeometry.length); i++) { + unloadedGeometry[i].load(); + } + + return { + visibleNodes: visibleNodes, + numVisiblePoints: numVisiblePoints, + lowestSpacing: lowestSpacing + }; + }; + + class PointCloudArena4DNode extends PointCloudTreeNode { + constructor () { + super(); + + this.left = null; + this.right = null; + this.sceneNode = null; + this.kdtree = null; + } + + getNumPoints () { + return this.geometryNode.numPoints; + } + + isLoaded () { + return true; + } + + isTreeNode () { + return true; + } + + isGeometryNode () { + return false; + } + + getLevel () { + return this.geometryNode.level; + } + + getBoundingSphere () { + return this.geometryNode.boundingSphere; + } + + getBoundingBox () { + return this.geometryNode.boundingBox; + } + + toTreeNode (child) { + let geometryNode = null; + + if (this.left === child) { + geometryNode = this.left; + } else if (this.right === child) { + geometryNode = this.right; + } + + if (!geometryNode.loaded) { + return; + } + + let node = new PointCloudArena4DNode(); + let sceneNode = PointCloud(geometryNode.geometry, this.kdtree.material); + sceneNode.visible = false; + + node.kdtree = this.kdtree; + node.geometryNode = geometryNode; + node.sceneNode = sceneNode; + node.parent = this; + node.left = this.geometryNode.left; + node.right = this.geometryNode.right; + } + + getChildren () { + let children = []; + + if (this.left) { + children.push(this.left); + } + + if (this.right) { + children.push(this.right); + } + + return children; + } + }; + + class PointCloudArena4D$1 extends PointCloudTree{ + constructor (geometry) { + super(); + + this.root = null; + if (geometry.root) { + this.root = geometry.root; + } else { + geometry.addEventListener('hierarchy_loaded', () => { + this.root = geometry.root; + }); + } + + this.visiblePointsTarget = 2 * 1000 * 1000; + this.minimumNodePixelSize = 150; + + this.position.sub(geometry.offset); + this.updateMatrix(); + + this.numVisibleNodes = 0; + this.numVisiblePoints = 0; + + this.boundingBoxNodes = []; + this.loadQueue = []; + this.visibleNodes = []; + + this.pcoGeometry = geometry; + this.boundingBox = this.pcoGeometry.boundingBox; + this.boundingSphere = this.pcoGeometry.boundingSphere; + this.material = new PointCloudMaterial$1({vertexColors: VertexColors, size: 0.05, treeType: TreeType.KDTREE}); + this.material.sizeType = PointSizeType.ATTENUATED; + this.material.size = 0.05; + this.profileRequests = []; + this.name = ''; + } + + getBoundingBoxWorld () { + this.updateMatrixWorld(true); + let box = this.boundingBox; + let transform = this.matrixWorld; + let tBox = Utils.computeTransformedBoundingBox(box, transform); + + return tBox; + }; + + setName (name) { + if (this.name !== name) { + this.name = name; + this.dispatchEvent({type: 'name_changed', name: name, pointcloud: this}); + } + } + + getName () { + return this.name; + } + + getLevel () { + return this.level; + } + + toTreeNode (geometryNode, parent) { + let node = new PointCloudArena4DNode(); + let sceneNode = new Points(geometryNode.geometry, this.material); + + sceneNode.frustumCulled = false; + sceneNode.onBeforeRender = (_this, scene, camera, geometry, material, group) => { + if (material.program) { + _this.getContext().useProgram(material.program.program); + + if (material.program.getUniforms().map.level) { + let level = geometryNode.getLevel(); + material.uniforms.level.value = level; + material.program.getUniforms().map.level.setValue(_this.getContext(), level); + } + + if (this.visibleNodeTextureOffsets && material.program.getUniforms().map.vnStart) { + let vnStart = this.visibleNodeTextureOffsets.get(node); + material.uniforms.vnStart.value = vnStart; + material.program.getUniforms().map.vnStart.setValue(_this.getContext(), vnStart); + } + + if (material.program.getUniforms().map.pcIndex) { + let i = node.pcIndex ? node.pcIndex : this.visibleNodes.indexOf(node); + material.uniforms.pcIndex.value = i; + material.program.getUniforms().map.pcIndex.setValue(_this.getContext(), i); + } + } + }; + + node.geometryNode = geometryNode; + node.sceneNode = sceneNode; + node.pointcloud = this; + node.left = geometryNode.left; + node.right = geometryNode.right; + + if (!parent) { + this.root = node; + this.add(sceneNode); + } else { + parent.sceneNode.add(sceneNode); + + if (parent.left === geometryNode) { + parent.left = node; + } else if (parent.right === geometryNode) { + parent.right = node; + } + } + + let disposeListener = function () { + parent.sceneNode.remove(node.sceneNode); + + if (parent.left === node) { + parent.left = geometryNode; + } else if (parent.right === node) { + parent.right = geometryNode; + } + }; + geometryNode.oneTimeDisposeHandlers.push(disposeListener); + + return node; + } + + updateMaterial (material, visibleNodes, camera, renderer) { + material.fov = camera.fov * (Math.PI / 180); + material.screenWidth = renderer.domElement.clientWidth; + material.screenHeight = renderer.domElement.clientHeight; + material.spacing = this.pcoGeometry.spacing; + material.near = camera.near; + material.far = camera.far; + + // reduce shader source updates by setting maxLevel slightly higher than actually necessary + if (this.maxLevel > material.levels) { + material.levels = this.maxLevel + 2; + } + + // material.uniforms.octreeSize.value = this.boundingBox.size().x; + let bbSize = this.boundingBox.getSize(new Vector3()); + material.bbSize = [bbSize.x, bbSize.y, bbSize.z]; + } + + updateVisibleBounds () { + + } + + hideDescendants (object) { + let stack = []; + for (let i = 0; i < object.children.length; i++) { + let child = object.children[i]; + if (child.visible) { + stack.push(child); + } + } + + while (stack.length > 0) { + let child = stack.shift(); + + child.visible = false; + if (child.boundingBoxNode) { + child.boundingBoxNode.visible = false; + } + + for (let i = 0; i < child.children.length; i++) { + let childOfChild = child.children[i]; + if (childOfChild.visible) { + stack.push(childOfChild); + } + } + } + } + + updateMatrixWorld (force) { + // node.matrixWorld.multiplyMatrices( node.parent.matrixWorld, node.matrix ); + + if (this.matrixAutoUpdate === true) this.updateMatrix(); + + if (this.matrixWorldNeedsUpdate === true || force === true) { + if (this.parent === undefined) { + this.matrixWorld.copy(this.matrix); + } else { + this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix); + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + } + } + + nodesOnRay (nodes, ray) { + let nodesOnRay = []; + + let _ray = ray.clone(); + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i]; + let sphere = node.getBoundingSphere().clone().applyMatrix4(node.sceneNode.matrixWorld); + // TODO Unused: let box = node.getBoundingBox().clone().applyMatrix4(node.sceneNode.matrixWorld); + + if (_ray.intersectsSphere(sphere)) { + nodesOnRay.push(node); + } + // if(_ray.isIntersectionBox(box)){ + // nodesOnRay.push(node); + // } + } + + return nodesOnRay; + } + + pick(viewer, camera, ray, params = {}){ + + let renderer = viewer.renderer; + let pRenderer = viewer.pRenderer; + + performance.mark("pick-start"); + + let getVal = (a, b) => a !== undefined ? a : b; + + let pickWindowSize = getVal(params.pickWindowSize, 17); + let pickOutsideClipRegion = getVal(params.pickOutsideClipRegion, false); + + let size = renderer.getSize(new Vector2()); + + let width = Math.ceil(getVal(params.width, size.width)); + let height = Math.ceil(getVal(params.height, size.height)); + + let pointSizeType = getVal(params.pointSizeType, this.material.pointSizeType); + let pointSize = getVal(params.pointSize, this.material.size); + + let nodes = this.nodesOnRay(this.visibleNodes, ray); + + if (nodes.length === 0) { + return null; + } + + if (!this.pickState) { + let scene = new Scene(); + + let material = new PointCloudMaterial$1(); + material.activeAttributeName = "indices"; + + let renderTarget = new WebGLRenderTarget( + 1, 1, + { minFilter: LinearFilter, + magFilter: NearestFilter, + format: RGBAFormat } + ); + + this.pickState = { + renderTarget: renderTarget, + material: material, + scene: scene + }; + }; + + let pickState = this.pickState; + let pickMaterial = pickState.material; + + { // update pick material + pickMaterial.pointSizeType = pointSizeType; + pickMaterial.shape = this.material.shape; + + pickMaterial.size = pointSize; + pickMaterial.uniforms.minSize.value = this.material.uniforms.minSize.value; + pickMaterial.uniforms.maxSize.value = this.material.uniforms.maxSize.value; + pickMaterial.classification = this.material.classification; + if(params.pickClipped){ + pickMaterial.clipBoxes = this.material.clipBoxes; + if(this.material.clipTask === ClipTask.HIGHLIGHT){ + pickMaterial.clipTask = ClipTask.NONE; + }else { + pickMaterial.clipTask = this.material.clipTask; + } + }else { + pickMaterial.clipBoxes = []; + } + + this.updateMaterial(pickMaterial, nodes, camera, renderer); + } + + pickState.renderTarget.setSize(width, height); + + let pixelPos = new Vector2(params.x, params.y); + + let gl = renderer.getContext(); + gl.enable(gl.SCISSOR_TEST); + gl.scissor( + parseInt(pixelPos.x - (pickWindowSize - 1) / 2), + parseInt(pixelPos.y - (pickWindowSize - 1) / 2), + parseInt(pickWindowSize), parseInt(pickWindowSize)); + + + renderer.state.buffers.depth.setTest(pickMaterial.depthTest); + renderer.state.buffers.depth.setMask(pickMaterial.depthWrite); + renderer.state.setBlending(NoBlending); + + renderer.clearTarget(pickState.renderTarget, true, true, true); + + { // RENDER + renderer.setRenderTarget(pickState.renderTarget); + gl.clearColor(0, 0, 0, 0); + renderer.clearTarget( pickState.renderTarget, true, true, true ); + + let tmp = this.material; + this.material = pickMaterial; + + pRenderer.renderOctree(this, nodes, camera, pickState.renderTarget); + + this.material = tmp; + } + + let clamp = (number, min, max) => Math.min(Math.max(min, number), max); + + let x = parseInt(clamp(pixelPos.x - (pickWindowSize - 1) / 2, 0, width)); + let y = parseInt(clamp(pixelPos.y - (pickWindowSize - 1) / 2, 0, height)); + let w = parseInt(Math.min(x + pickWindowSize, width) - x); + let h = parseInt(Math.min(y + pickWindowSize, height) - y); + + let pixelCount = w * h; + let buffer = new Uint8Array(4 * pixelCount); + + gl.readPixels(x, y, pickWindowSize, pickWindowSize, gl.RGBA, gl.UNSIGNED_BYTE, buffer); + + renderer.setRenderTarget(null); + renderer.state.reset(); + renderer.setScissorTest(false); + gl.disable(gl.SCISSOR_TEST); + + let pixels = buffer; + let ibuffer = new Uint32Array(buffer.buffer); + + // find closest hit inside pixelWindow boundaries + let min = Number.MAX_VALUE; + let hits = []; + for (let u = 0; u < pickWindowSize; u++) { + for (let v = 0; v < pickWindowSize; v++) { + let offset = (u + v * pickWindowSize); + let distance = Math.pow(u - (pickWindowSize - 1) / 2, 2) + Math.pow(v - (pickWindowSize - 1) / 2, 2); + + let pcIndex = pixels[4 * offset + 3]; + pixels[4 * offset + 3] = 0; + let pIndex = ibuffer[offset]; + + if(!(pcIndex === 0 && pIndex === 0) && (pcIndex !== undefined) && (pIndex !== undefined)){ + let hit = { + pIndex: pIndex, + pcIndex: pcIndex, + distanceToCenter: distance + }; + + if(params.all){ + hits.push(hit); + }else { + if(hits.length > 0){ + if(distance < hits[0].distanceToCenter){ + hits[0] = hit; + } + }else { + hits.push(hit); + } + } + + + } + } + } + + + + for(let hit of hits){ + let point = {}; + + if (!nodes[hit.pcIndex]) { + return null; + } + + let node = nodes[hit.pcIndex]; + let pc = node.sceneNode; + let geometry = node.geometryNode.geometry; + + for(let attributeName in geometry.attributes){ + let attribute = geometry.attributes[attributeName]; + + if (attributeName === 'position') { + let x = attribute.array[3 * hit.pIndex + 0]; + let y = attribute.array[3 * hit.pIndex + 1]; + let z = attribute.array[3 * hit.pIndex + 2]; + + let position = new Vector3(x, y, z); + position.applyMatrix4(pc.matrixWorld); + + point[attributeName] = position; + } else if (attributeName === 'indices') { + + } else { + //if (values.itemSize === 1) { + // point[attribute.name] = values.array[hit.pIndex]; + //} else { + // let value = []; + // for (let j = 0; j < values.itemSize; j++) { + // value.push(values.array[values.itemSize * hit.pIndex + j]); + // } + // point[attribute.name] = value; + //} + } + + } + + hit.point = point; + } + + performance.mark("pick-end"); + performance.measure("pick", "pick-start", "pick-end"); + + if(params.all){ + return hits.map(hit => hit.point); + }else { + if(hits.length === 0){ + return null; + }else { + return hits[0].point; + } + } + } + + computeVisibilityTextureData(nodes){ + + if(exports.measureTimings) performance.mark("computeVisibilityTextureData-start"); + + let data = new Uint8Array(nodes.length * 3); + let visibleNodeTextureOffsets = new Map(); + + // copy array + nodes = nodes.slice(); + + // sort by level and number + let sort = function (a, b) { + let la = a.geometryNode.level; + let lb = b.geometryNode.level; + let na = a.geometryNode.number; + let nb = b.geometryNode.number; + if (la !== lb) return la - lb; + if (na < nb) return -1; + if (na > nb) return 1; + return 0; + }; + nodes.sort(sort); + + let visibleNodeNames = []; + for (let i = 0; i < nodes.length; i++) { + visibleNodeNames.push(nodes[i].geometryNode.number); + } + + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i]; + + visibleNodeTextureOffsets.set(node, i); + + let b1 = 0; // children + let b2 = 0; // offset to first child + let b3 = 0; // split + + if (node.geometryNode.left && visibleNodeNames.indexOf(node.geometryNode.left.number) > 0) { + b1 += 1; + b2 = visibleNodeNames.indexOf(node.geometryNode.left.number) - i; + } + if (node.geometryNode.right && visibleNodeNames.indexOf(node.geometryNode.right.number) > 0) { + b1 += 2; + b2 = (b2 === 0) ? visibleNodeNames.indexOf(node.geometryNode.right.number) - i : b2; + } + + if (node.geometryNode.split === 'X') { + b3 = 1; + } else if (node.geometryNode.split === 'Y') { + b3 = 2; + } else if (node.geometryNode.split === 'Z') { + b3 = 4; + } + + data[i * 3 + 0] = b1; + data[i * 3 + 1] = b2; + data[i * 3 + 2] = b3; + } + + if(exports.measureTimings){ + performance.mark("computeVisibilityTextureData-end"); + performance.measure("render.computeVisibilityTextureData", "computeVisibilityTextureData-start", "computeVisibilityTextureData-end"); + } + + return { + data: data, + offsets: visibleNodeTextureOffsets + }; + } + + get progress () { + if (this.pcoGeometry.root) { + return exports.numNodesLoading > 0 ? 0 : 1; + } else { + return 0; + } + } + }; + + // Copied from three.js: WebGLRenderer.js + function paramThreeToGL(_gl, p) { + + let extension; + + if (p === RepeatWrapping) return _gl.REPEAT; + if (p === ClampToEdgeWrapping) return _gl.CLAMP_TO_EDGE; + if (p === MirroredRepeatWrapping) return _gl.MIRRORED_REPEAT; + + if (p === NearestFilter) return _gl.NEAREST; + if (p === NearestMipMapNearestFilter) return _gl.NEAREST_MIPMAP_NEAREST; + if (p === NearestMipMapLinearFilter) return _gl.NEAREST_MIPMAP_LINEAR; + + if (p === LinearFilter) return _gl.LINEAR; + if (p === LinearMipMapNearestFilter) return _gl.LINEAR_MIPMAP_NEAREST; + if (p === LinearMipMapLinearFilter) return _gl.LINEAR_MIPMAP_LINEAR; + + if (p === UnsignedByteType) return _gl.UNSIGNED_BYTE; + if (p === UnsignedShort4444Type) return _gl.UNSIGNED_SHORT_4_4_4_4; + if (p === UnsignedShort5551Type) return _gl.UNSIGNED_SHORT_5_5_5_1; + if (p === UnsignedShort565Type) return _gl.UNSIGNED_SHORT_5_6_5; + + if (p === ByteType) return _gl.BYTE; + if (p === ShortType) return _gl.SHORT; + if (p === UnsignedShortType) return _gl.UNSIGNED_SHORT; + if (p === IntType) return _gl.INT; + if (p === UnsignedIntType) return _gl.UNSIGNED_INT; + if (p === FloatType) return _gl.FLOAT; + + if (p === HalfFloatType) { + + extension = extensions.get('OES_texture_half_float'); + + if (extension !== null) return extension.HALF_FLOAT_OES; + + } + + if (p === AlphaFormat) return _gl.ALPHA; + if (p === RGBFormat) return _gl.RGB; + if (p === RGBAFormat) return _gl.RGBA; + if (p === LuminanceFormat) return _gl.LUMINANCE; + if (p === LuminanceAlphaFormat) return _gl.LUMINANCE_ALPHA; + if (p === DepthFormat) return _gl.DEPTH_COMPONENT; + if (p === DepthStencilFormat) return _gl.DEPTH_STENCIL; + + if (p === AddEquation) return _gl.FUNC_ADD; + if (p === SubtractEquation) return _gl.FUNC_SUBTRACT; + if (p === ReverseSubtractEquation) return _gl.FUNC_REVERSE_SUBTRACT; + + if (p === ZeroFactor) return _gl.ZERO; + if (p === OneFactor) return _gl.ONE; + if (p === SrcColorFactor) return _gl.SRC_COLOR; + if (p === OneMinusSrcColorFactor) return _gl.ONE_MINUS_SRC_COLOR; + if (p === SrcAlphaFactor) return _gl.SRC_ALPHA; + if (p === OneMinusSrcAlphaFactor) return _gl.ONE_MINUS_SRC_ALPHA; + if (p === DstAlphaFactor) return _gl.DST_ALPHA; + if (p === OneMinusDstAlphaFactor) return _gl.ONE_MINUS_DST_ALPHA; + + if (p === DstColorFactor) return _gl.DST_COLOR; + if (p === OneMinusDstColorFactor) return _gl.ONE_MINUS_DST_COLOR; + if (p === SrcAlphaSaturateFactor) return _gl.SRC_ALPHA_SATURATE; + + if (p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format) { + + extension = extensions.get('WEBGL_compressed_texture_s3tc'); + + if (extension !== null) { + + if (p === RGB_S3TC_DXT1_Format) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if (p === RGBA_S3TC_DXT1_Format$1) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if (p === RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if (p === RGBA_S3TC_DXT5_Format$1) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if (p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format) { + + extension = extensions.get('WEBGL_compressed_texture_pvrtc'); + + if (extension !== null) { + + if (p === RGB_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if (p === RGB_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if (p === RGBA_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if (p === RGBA_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if (p === RGB_ETC1_Format) { + + extension = extensions.get('WEBGL_compressed_texture_etc1'); + + if (extension !== null) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if (p === MinEquation || p === MaxEquation) { + + extension = extensions.get('EXT_blend_minmax'); + + if (extension !== null) { + + if (p === MinEquation) return extension.MIN_EXT; + if (p === MaxEquation) return extension.MAX_EXT; + + } + + } + + if (p === UnsignedInt248Type) { + + extension = extensions.get('WEBGL_depth_texture'); + + if (extension !== null) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + }; + + let attributeLocations = { + "position": {name: "position", location: 0}, + "color": {name: "color", location: 1}, + "rgba": {name: "color", location: 1}, + "intensity": {name: "intensity", location: 2}, + "classification": {name: "classification", location: 3}, + "returnNumber": {name: "returnNumber", location: 4}, + "return number": {name: "returnNumber", location: 4}, + "returns": {name: "returnNumber", location: 4}, + "numberOfReturns": {name: "numberOfReturns", location: 5}, + "number of returns": {name: "numberOfReturns", location: 5}, + "pointSourceID": {name: "pointSourceID", location: 6}, + "source id": {name: "pointSourceID", location: 6}, + "point source id": {name: "pointSourceID", location: 6}, + "indices": {name: "indices", location: 7}, + "normal": {name: "normal", location: 8}, + "spacing": {name: "spacing", location: 9}, + "gps-time": {name: "gpsTime", location: 10}, + "aExtra": {name: "aExtra", location: 11}, + }; + + class Shader { + + constructor(gl, name, vsSource, fsSource) { + this.gl = gl; + this.name = name; + this.vsSource = vsSource; + this.fsSource = fsSource; + + this.cache = new Map(); + + this.vs = null; + this.fs = null; + this.program = null; + + this.uniformLocations = {}; + this.attributeLocations = {}; + this.uniformBlockIndices = {}; + this.uniformBlocks = {}; + this.uniforms = {}; + + this.update(vsSource, fsSource); + } + + update(vsSource, fsSource) { + this.vsSource = vsSource; + this.fsSource = fsSource; + + this.linkProgram(); + } + + compileShader(shader, source){ + let gl = this.gl; + + gl.shaderSource(shader, source); + + gl.compileShader(shader); + + let success = gl.getShaderParameter(shader, gl.COMPILE_STATUS); + if (!success) { + let info = gl.getShaderInfoLog(shader); + let numberedSource = source.split("\n").map((a, i) => `${i + 1}`.padEnd(5) + a).join("\n"); + throw `could not compile shader ${this.name}: ${info}, \n${numberedSource}`; + } + } + + linkProgram() { + + const tStart = performance.now(); + + let gl = this.gl; + + this.uniformLocations = {}; + this.attributeLocations = {}; + this.uniforms = {}; + + gl.useProgram(null); + + let cached = this.cache.get(`${this.vsSource}, ${this.fsSource}`); + if (cached) { + this.program = cached.program; + this.vs = cached.vs; + this.fs = cached.fs; + this.attributeLocations = cached.attributeLocations; + this.uniformLocations = cached.uniformLocations; + this.uniformBlocks = cached.uniformBlocks; + this.uniforms = cached.uniforms; + + return; + } else { + + this.vs = gl.createShader(gl.VERTEX_SHADER); + this.fs = gl.createShader(gl.FRAGMENT_SHADER); + this.program = gl.createProgram(); + + for(let name of Object.keys(attributeLocations)){ + let location = attributeLocations[name].location; + let glslName = attributeLocations[name].name; + gl.bindAttribLocation(this.program, location, glslName); + } + + this.compileShader(this.vs, this.vsSource); + this.compileShader(this.fs, this.fsSource); + + let program = this.program; + + gl.attachShader(program, this.vs); + gl.attachShader(program, this.fs); + + gl.linkProgram(program); + + gl.detachShader(program, this.vs); + gl.detachShader(program, this.fs); + + let success = gl.getProgramParameter(program, gl.LINK_STATUS); + if (!success) { + let info = gl.getProgramInfoLog(program); + throw `could not link program ${this.name}: ${info}`; + } + + { // attribute locations + let numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); + + for (let i = 0; i < numAttributes; i++) { + let attribute = gl.getActiveAttrib(program, i); + + let location = gl.getAttribLocation(program, attribute.name); + + this.attributeLocations[attribute.name] = location; + } + } + + { // uniform locations + let numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); + + for (let i = 0; i < numUniforms; i++) { + let uniform = gl.getActiveUniform(program, i); + + let location = gl.getUniformLocation(program, uniform.name); + + this.uniformLocations[uniform.name] = location; + this.uniforms[uniform.name] = { + location: location, + value: null, + }; + } + } + + // uniform blocks + if(gl instanceof WebGL2RenderingContext){ + let numBlocks = gl.getProgramParameter(program, gl.ACTIVE_UNIFORM_BLOCKS); + + for (let i = 0; i < numBlocks; i++) { + let blockName = gl.getActiveUniformBlockName(program, i); + + let blockIndex = gl.getUniformBlockIndex(program, blockName); + + this.uniformBlockIndices[blockName] = blockIndex; + + gl.uniformBlockBinding(program, blockIndex, blockIndex); + let dataSize = gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_DATA_SIZE); + + let uBuffer = gl.createBuffer(); + gl.bindBuffer(gl.UNIFORM_BUFFER, uBuffer); + gl.bufferData(gl.UNIFORM_BUFFER, dataSize, gl.DYNAMIC_READ); + + gl.bindBufferBase(gl.UNIFORM_BUFFER, blockIndex, uBuffer); + + gl.bindBuffer(gl.UNIFORM_BUFFER, null); + + this.uniformBlocks[blockName] = { + name: blockName, + index: blockIndex, + dataSize: dataSize, + buffer: uBuffer + }; + + } + } + + let cached = { + program: this.program, + vs: this.vs, + fs: this.fs, + attributeLocations: this.attributeLocations, + uniformLocations: this.uniformLocations, + uniforms: this.uniforms, + uniformBlocks: this.uniformBlocks, + }; + + this.cache.set(`${this.vsSource}, ${this.fsSource}`, cached); + } + + const tEnd = performance.now(); + const duration = tEnd - tStart; + + console.log(`shader compile duration: ${duration.toFixed(3)}`); + + + } + + setUniformMatrix4(name, value) { + const gl = this.gl; + const location = this.uniformLocations[name]; + + if (location == null) { + return; + } + + let tmp = new Float32Array(value.elements); + gl.uniformMatrix4fv(location, false, tmp); + } + + setUniform1f(name, value) { + const gl = this.gl; + const uniform = this.uniforms[name]; + + if (uniform === undefined) { + return; + } + + if(uniform.value === value){ + return; + } + + uniform.value = value; + + gl.uniform1f(uniform.location, value); + } + + setUniformBoolean(name, value) { + const gl = this.gl; + const uniform = this.uniforms[name]; + + if (uniform === undefined) { + return; + } + + if(uniform.value === value){ + return; + } + + uniform.value = value; + + gl.uniform1i(uniform.location, value); + } + + setUniformTexture(name, value) { + const gl = this.gl; + const location = this.uniformLocations[name]; + + if (location == null) { + return; + } + + gl.uniform1i(location, value); + } + + setUniform2f(name, value) { + const gl = this.gl; + const location = this.uniformLocations[name]; + + if (location == null) { + return; + } + + gl.uniform2f(location, value[0], value[1]); + } + + setUniform3f(name, value) { + const gl = this.gl; + const location = this.uniformLocations[name]; + + if (location == null) { + return; + } + + gl.uniform3f(location, value[0], value[1], value[2]); + } + + setUniform(name, value) { + + if (value.constructor === Matrix4) { + this.setUniformMatrix4(name, value); + } else if (typeof value === "number") { + this.setUniform1f(name, value); + } else if (typeof value === "boolean") { + this.setUniformBoolean(name, value); + } else if (value instanceof WebGLTexture) { + this.setUniformTexture(name, value); + } else if (value instanceof Array) { + + if (value.length === 2) { + this.setUniform2f(name, value); + } else if (value.length === 3) { + this.setUniform3f(name, value); + } + + } else { + console.error("unhandled uniform type: ", name, value); + } + + } + + + setUniform1i(name, value) { + let gl = this.gl; + let location = this.uniformLocations[name]; + + if (location == null) { + return; + } + + gl.uniform1i(location, value); + } + + }; + + class WebGLTexture { + + constructor(gl, texture) { + this.gl = gl; + + this.texture = texture; + this.id = gl.createTexture(); + + this.target = gl.TEXTURE_2D; + this.version = -1; + + this.update(texture); + } + + update() { + + if (!this.texture.image) { + this.version = this.texture.version; + + return; + } + + let gl = this.gl; + let texture = this.texture; + + if (this.version === texture.version) { + return; + } + + this.target = gl.TEXTURE_2D; + + gl.bindTexture(this.target, this.id); + + let level = 0; + let internalFormat = paramThreeToGL(gl, texture.format); + let width = texture.image.width; + let height = texture.image.height; + let border = 0; + let srcFormat = internalFormat; + let srcType = paramThreeToGL(gl, texture.type); + let data; + + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, texture.flipY); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha); + gl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment); + + if (texture instanceof DataTexture) { + data = texture.image.data; + + gl.texParameteri(this.target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(this.target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + gl.texParameteri(this.target, gl.TEXTURE_MAG_FILTER, paramThreeToGL(gl, texture.magFilter)); + gl.texParameteri(this.target, gl.TEXTURE_MIN_FILTER, paramThreeToGL(gl, texture.minFilter)); + + gl.texImage2D(this.target, level, internalFormat, + width, height, border, srcFormat, srcType, + data); + } else if ((texture instanceof CanvasTexture) || (texture instanceof Texture)) { + data = texture.image; + + gl.texParameteri(this.target, gl.TEXTURE_WRAP_S, paramThreeToGL(gl, texture.wrapS)); + gl.texParameteri(this.target, gl.TEXTURE_WRAP_T, paramThreeToGL(gl, texture.wrapT)); + + gl.texParameteri(this.target, gl.TEXTURE_MAG_FILTER, paramThreeToGL(gl, texture.magFilter)); + gl.texParameteri(this.target, gl.TEXTURE_MIN_FILTER, paramThreeToGL(gl, texture.minFilter)); + + gl.texImage2D(this.target, level, internalFormat, + internalFormat, srcType, data); + + if (texture instanceof Texture) {gl.generateMipmap(gl.TEXTURE_2D);} + } + + gl.bindTexture(this.target, null); + + this.version = texture.version; + } + + }; + + class WebGLBuffer { + + constructor() { + this.numElements = 0; + this.vao = null; + this.vbos = new Map(); + } + + }; + + class Renderer { + + constructor(threeRenderer) { + this.threeRenderer = threeRenderer; + this.gl = this.threeRenderer.getContext(); + + this.buffers = new Map(); + this.shaders = new Map(); + this.textures = new Map(); + + this.glTypeMapping = new Map(); + this.glTypeMapping.set(Float32Array, this.gl.FLOAT); + this.glTypeMapping.set(Uint8Array, this.gl.UNSIGNED_BYTE); + this.glTypeMapping.set(Uint16Array, this.gl.UNSIGNED_SHORT); + + this.toggle = 0; + } + + deleteBuffer(geometry) { + + let gl = this.gl; + let webglBuffer = this.buffers.get(geometry); + if (webglBuffer != null) { + for (let attributeName in geometry.attributes) { + gl.deleteBuffer(webglBuffer.vbos.get(attributeName).handle); + } + this.buffers.delete(geometry); + } + } + + createBuffer(geometry){ + let gl = this.gl; + let webglBuffer = new WebGLBuffer(); + webglBuffer.vao = gl.createVertexArray(); + webglBuffer.numElements = geometry.attributes.position.count; + + gl.bindVertexArray(webglBuffer.vao); + + for(let attributeName in geometry.attributes){ + let bufferAttribute = geometry.attributes[attributeName]; + + let vbo = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vbo); + gl.bufferData(gl.ARRAY_BUFFER, bufferAttribute.array, gl.STATIC_DRAW); + + let normalized = bufferAttribute.normalized; + let type = this.glTypeMapping.get(bufferAttribute.array.constructor); + + if(attributeLocations[attributeName] === undefined){ + //attributeLocation = attributeLocations["aExtra"]; + }else { + let attributeLocation = attributeLocations[attributeName].location; + + gl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0); + gl.enableVertexAttribArray(attributeLocation); + } + + + webglBuffer.vbos.set(attributeName, { + handle: vbo, + name: attributeName, + count: bufferAttribute.count, + itemSize: bufferAttribute.itemSize, + type: geometry.attributes.position.array.constructor, + version: 0 + }); + } + + gl.bindBuffer(gl.ARRAY_BUFFER, null); + gl.bindVertexArray(null); + + let disposeHandler = (event) => { + this.deleteBuffer(geometry); + geometry.removeEventListener("dispose", disposeHandler); + }; + geometry.addEventListener("dispose", disposeHandler); + + return webglBuffer; + } + + updateBuffer(geometry){ + let gl = this.gl; + + let webglBuffer = this.buffers.get(geometry); + + gl.bindVertexArray(webglBuffer.vao); + + for(let attributeName in geometry.attributes){ + let bufferAttribute = geometry.attributes[attributeName]; + + let normalized = bufferAttribute.normalized; + let type = this.glTypeMapping.get(bufferAttribute.array.constructor); + + let vbo = null; + if(!webglBuffer.vbos.has(attributeName)){ + vbo = gl.createBuffer(); + + webglBuffer.vbos.set(attributeName, { + handle: vbo, + name: attributeName, + count: bufferAttribute.count, + itemSize: bufferAttribute.itemSize, + type: geometry.attributes.position.array.constructor, + version: bufferAttribute.version + }); + }else { + vbo = webglBuffer.vbos.get(attributeName).handle; + webglBuffer.vbos.get(attributeName).version = bufferAttribute.version; + } + + gl.bindBuffer(gl.ARRAY_BUFFER, vbo); + gl.bufferData(gl.ARRAY_BUFFER, bufferAttribute.array, gl.STATIC_DRAW); + + if(attributeLocations[attributeName] === undefined){ + //attributeLocation = attributeLocations["aExtra"]; + }else { + let attributeLocation = attributeLocations[attributeName].location; + + gl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0); + gl.enableVertexAttribArray(attributeLocation); + } + } + + gl.bindBuffer(gl.ARRAY_BUFFER, null); + gl.bindVertexArray(null); + } + + traverse(scene) { + + let octrees = []; + + let stack = [scene]; + while (stack.length > 0) { + + let node = stack.pop(); + + if (node instanceof PointCloudTree) { + octrees.push(node); + continue; + } + + let visibleChildren = node.children.filter(c => c.visible); + stack.push(...visibleChildren); + + } + + let result = { + octrees: octrees + }; + + return result; + } + + + + renderNodes(octree, nodes, visibilityTextureData, camera, target, shader, params) { + + if (exports.measureTimings) performance.mark("renderNodes-start"); + + let gl = this.gl; + + let material = params.material ? params.material : octree.material; + let shadowMaps = params.shadowMaps == null ? [] : params.shadowMaps; + let view = camera.matrixWorldInverse; + + if(params.viewOverride){ + view = params.viewOverride; + } + + let worldView = new Matrix4(); + + let mat4holder = new Float32Array(16); + + let i = 0; + for (let node of nodes) { + + if(exports.debug.allowedNodes !== undefined){ + if(!exports.debug.allowedNodes.includes(node.name)){ + continue; + } + } + + let world = node.sceneNode.matrixWorld; + worldView.multiplyMatrices(view, world); + + if (visibilityTextureData) { + let vnStart = visibilityTextureData.offsets.get(node); + shader.setUniform1f("uVNStart", vnStart); + } + + + let level = node.getLevel(); + + if(node.debug){ + shader.setUniform("uDebug", true); + }else { + shader.setUniform("uDebug", false); + } + + // let isLeaf = false; + // if(node instanceof PointCloudOctreeNode){ + // isLeaf = Object.keys(node.children).length === 0; + // }else if(node instanceof PointCloudArena4DNode){ + // isLeaf = node.geometryNode.isLeaf; + // } + // shader.setUniform("uIsLeafNode", isLeaf); + + // let isLeaf = node.children.filter(n => n != null).length === 0; + // if(!isLeaf){ + // continue; + // } + + + // TODO consider passing matrices in an array to avoid uniformMatrix4fv overhead + const lModel = shader.uniformLocations["modelMatrix"]; + if (lModel) { + mat4holder.set(world.elements); + gl.uniformMatrix4fv(lModel, false, mat4holder); + } + + const lModelView = shader.uniformLocations["modelViewMatrix"]; + //mat4holder.set(worldView.elements); + // faster then set in chrome 63 + for(let j = 0; j < 16; j++){ + mat4holder[j] = worldView.elements[j]; + } + gl.uniformMatrix4fv(lModelView, false, mat4holder); + + { // Clip Polygons + if(material.clipPolygons && material.clipPolygons.length > 0){ + + let clipPolygonVCount = []; + let worldViewProjMatrices = []; + + for(let clipPolygon of material.clipPolygons){ + + let view = clipPolygon.viewMatrix; + let proj = clipPolygon.projMatrix; + + let worldViewProj = proj.clone().multiply(view).multiply(world); + + clipPolygonVCount.push(clipPolygon.markers.length); + worldViewProjMatrices.push(worldViewProj); + } + + let flattenedMatrices = [].concat(...worldViewProjMatrices.map(m => m.elements)); + + let flattenedVertices = new Array(8 * 3 * material.clipPolygons.length); + for(let i = 0; i < material.clipPolygons.length; i++){ + let clipPolygon = material.clipPolygons[i]; + for(let j = 0; j < clipPolygon.markers.length; j++){ + flattenedVertices[i * 24 + (j * 3 + 0)] = clipPolygon.markers[j].position.x; + flattenedVertices[i * 24 + (j * 3 + 1)] = clipPolygon.markers[j].position.y; + flattenedVertices[i * 24 + (j * 3 + 2)] = clipPolygon.markers[j].position.z; + } + } + + const lClipPolygonVCount = shader.uniformLocations["uClipPolygonVCount[0]"]; + gl.uniform1iv(lClipPolygonVCount, clipPolygonVCount); + + const lClipPolygonVP = shader.uniformLocations["uClipPolygonWVP[0]"]; + gl.uniformMatrix4fv(lClipPolygonVP, false, flattenedMatrices); + + const lClipPolygons = shader.uniformLocations["uClipPolygonVertices[0]"]; + gl.uniform3fv(lClipPolygons, flattenedVertices); + + } + } + + + //shader.setUniformMatrix4("modelMatrix", world); + //shader.setUniformMatrix4("modelViewMatrix", worldView); + shader.setUniform1f("uLevel", level); + shader.setUniform1f("uNodeSpacing", node.geometryNode.estimatedSpacing); + + shader.setUniform1f("uPCIndex", i); + // uBBSize + + if (shadowMaps.length > 0) { + + const lShadowMap = shader.uniformLocations["uShadowMap[0]"]; + + shader.setUniform3f("uShadowColor", material.uniforms.uShadowColor.value); + + let bindingStart = 5; + let bindingPoints = new Array(shadowMaps.length).fill(bindingStart).map((a, i) => (a + i)); + gl.uniform1iv(lShadowMap, bindingPoints); + + for (let i = 0; i < shadowMaps.length; i++) { + let shadowMap = shadowMaps[i]; + let bindingPoint = bindingPoints[i]; + let glTexture = this.threeRenderer.properties.get(shadowMap.target.texture).__webglTexture; + + gl.activeTexture(gl[`TEXTURE${bindingPoint}`]); + gl.bindTexture(gl.TEXTURE_2D, glTexture); + } + + { + + let worldViewMatrices = shadowMaps + .map(sm => sm.camera.matrixWorldInverse) + .map(view => new Matrix4().multiplyMatrices(view, world)); + + let flattenedMatrices = [].concat(...worldViewMatrices.map(c => c.elements)); + const lWorldView = shader.uniformLocations["uShadowWorldView[0]"]; + gl.uniformMatrix4fv(lWorldView, false, flattenedMatrices); + } + + { + let flattenedMatrices = [].concat(...shadowMaps.map(sm => sm.camera.projectionMatrix.elements)); + const lProj = shader.uniformLocations["uShadowProj[0]"]; + gl.uniformMatrix4fv(lProj, false, flattenedMatrices); + } + } + + const geometry = node.geometryNode.geometry; + + if(geometry.attributes["gps-time"]){ + const bufferAttribute = geometry.attributes["gps-time"]; + const attGPS = octree.getAttribute("gps-time"); + + let initialRange = attGPS.initialRange; + let initialRangeSize = initialRange[1] - initialRange[0]; + + let globalRange = attGPS.range; + let globalRangeSize = globalRange[1] - globalRange[0]; + + let scale = initialRangeSize / globalRangeSize; + let offset = -(globalRange[0] - initialRange[0]) / initialRangeSize; + + scale = Number.isNaN(scale) ? 1 : scale; + offset = Number.isNaN(offset) ? 0 : offset; + + shader.setUniform1f("uGpsScale", scale); + shader.setUniform1f("uGpsOffset", offset); + //shader.setUniform2f("uFilterGPSTimeClipRange", [-Infinity, Infinity]); + + let uFilterGPSTimeClipRange = material.uniforms.uFilterGPSTimeClipRange.value; + // let gpsCliPRangeMin = uFilterGPSTimeClipRange[0] + // let gpsCliPRangeMax = uFilterGPSTimeClipRange[1] + // shader.setUniform2f("uFilterGPSTimeClipRange", [gpsCliPRangeMin, gpsCliPRangeMax]); + + let normalizedClipRange = [ + (uFilterGPSTimeClipRange[0] - globalRange[0]) / globalRangeSize, + (uFilterGPSTimeClipRange[1] - globalRange[0]) / globalRangeSize, + ]; + + shader.setUniform2f("uFilterGPSTimeClipRange", normalizedClipRange); + + + + // // ranges in full gps coordinate system + // const globalRange = attGPS.range; + // const bufferRange = bufferAttribute.potree.range; + + // // ranges in [0, 1] + // // normalizedGlobalRange = [0, 1] + // // normalizedBufferRange: norm buffer within norm global range e.g. [0.2, 0.8] + // const globalWidth = globalRange[1] - globalRange[0]; + // const normalizedBufferRange = [ + // (bufferRange[0] - globalRange[0]) / globalWidth, + // (bufferRange[1] - globalRange[0]) / globalWidth, + // ]; + + // shader.setUniform2f("uNormalizedGpsBufferRange", normalizedBufferRange); + + // let uFilterGPSTimeClipRange = material.uniforms.uFilterGPSTimeClipRange.value; + // let gpsCliPRangeMin = uFilterGPSTimeClipRange[0] + // let gpsCliPRangeMax = uFilterGPSTimeClipRange[1] + // shader.setUniform2f("uFilterGPSTimeClipRange", [gpsCliPRangeMin, gpsCliPRangeMax]); + + // shader.setUniform1f("uGpsScale", bufferAttribute.potree.scale); + // shader.setUniform1f("uGpsOffset", bufferAttribute.potree.offset); + } + + { + let uFilterReturnNumberRange = material.uniforms.uFilterReturnNumberRange.value; + let uFilterNumberOfReturnsRange = material.uniforms.uFilterNumberOfReturnsRange.value; + let uFilterPointSourceIDClipRange = material.uniforms.uFilterPointSourceIDClipRange.value; + + + + shader.setUniform2f("uFilterReturnNumberRange", uFilterReturnNumberRange); + shader.setUniform2f("uFilterNumberOfReturnsRange", uFilterNumberOfReturnsRange); + shader.setUniform2f("uFilterPointSourceIDClipRange", uFilterPointSourceIDClipRange); + } + + let webglBuffer = null; + if(!this.buffers.has(geometry)){ + webglBuffer = this.createBuffer(geometry); + this.buffers.set(geometry, webglBuffer); + }else { + webglBuffer = this.buffers.get(geometry); + for(let attributeName in geometry.attributes){ + let attribute = geometry.attributes[attributeName]; + + if(attribute.version > webglBuffer.vbos.get(attributeName).version){ + this.updateBuffer(geometry); + } + } + } + + gl.bindVertexArray(webglBuffer.vao); + + let isExtraAttribute = + attributeLocations[material.activeAttributeName] === undefined + && Object.keys(geometry.attributes).includes(material.activeAttributeName); + + if(isExtraAttribute){ + + const attributeLocation = attributeLocations["aExtra"].location; + + for(const attributeName in geometry.attributes){ + const bufferAttribute = geometry.attributes[attributeName]; + const vbo = webglBuffer.vbos.get(attributeName); + + gl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle); + gl.disableVertexAttribArray(attributeLocation); + } + + const attName = material.activeAttributeName; + const bufferAttribute = geometry.attributes[attName]; + const vbo = webglBuffer.vbos.get(attName); + + if(bufferAttribute !== undefined && vbo !== undefined){ + let type = this.glTypeMapping.get(bufferAttribute.array.constructor); + let normalized = bufferAttribute.normalized; + + gl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle); + gl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0); + gl.enableVertexAttribArray(attributeLocation); + } + + + + + { + const attExtra = octree.pcoGeometry.pointAttributes.attributes + .find(a => a.name === attName); + + let range = material.getRange(attName); + if(!range){ + range = attExtra.range; + } + + if(!range){ + range = [0, 1]; + } + + let initialRange = attExtra.initialRange; + let initialRangeSize = initialRange[1] - initialRange[0]; + + let globalRange = range; + let globalRangeSize = globalRange[1] - globalRange[0]; + + let scale = initialRangeSize / globalRangeSize; + let offset = -(globalRange[0] - initialRange[0]) / initialRangeSize; + + scale = Number.isNaN(scale) ? 1 : scale; + offset = Number.isNaN(offset) ? 0 : offset; + + shader.setUniform1f("uExtraScale", scale); + shader.setUniform1f("uExtraOffset", offset); + } + + }else { + + for(const attributeName in geometry.attributes){ + const bufferAttribute = geometry.attributes[attributeName]; + const vbo = webglBuffer.vbos.get(attributeName); + + + if(attributeLocations[attributeName] !== undefined){ + const attributeLocation = attributeLocations[attributeName].location; + + let type = this.glTypeMapping.get(bufferAttribute.array.constructor); + let normalized = bufferAttribute.normalized; + + gl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle); + gl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0); + gl.enableVertexAttribArray(attributeLocation); + + } + } + } + + let numPoints = webglBuffer.numElements; + gl.drawArrays(gl.POINTS, 0, numPoints); + + i++; + } + + gl.bindVertexArray(null); + + if (exports.measureTimings) { + performance.mark("renderNodes-end"); + performance.measure("render.renderNodes", "renderNodes-start", "renderNodes-end"); + } + } + + renderOctree(octree, nodes, camera, target, params = {}){ + + let gl = this.gl; + + let material = params.material ? params.material : octree.material; + let shadowMaps = params.shadowMaps == null ? [] : params.shadowMaps; + let view = camera.matrixWorldInverse; + let viewInv = camera.matrixWorld; + + if(params.viewOverride){ + view = params.viewOverride; + viewInv = view.clone().invert(); + } + + let proj = camera.projectionMatrix; + let projInv = proj.clone().invert(); + //let worldView = new THREE.Matrix4(); + + let shader = null; + let visibilityTextureData = null; + + let currentTextureBindingPoint = 0; + + if (material.pointSizeType >= 0) { + if (material.pointSizeType === PointSizeType.ADAPTIVE || + material.activeAttributeName === "level of detail") { + + let vnNodes = (params.vnTextureNodes != null) ? params.vnTextureNodes : nodes; + visibilityTextureData = octree.computeVisibilityTextureData(vnNodes, camera); + + const vnt = material.visibleNodesTexture; + const data = vnt.image.data; + data.set(visibilityTextureData.data); + vnt.needsUpdate = true; + + } + } + + { // UPDATE SHADER AND TEXTURES + if (!this.shaders.has(material)) { + let [vs, fs] = [material.vertexShader, material.fragmentShader]; + let shader = new Shader(gl, "pointcloud", vs, fs); + + this.shaders.set(material, shader); + } + + shader = this.shaders.get(material); + + //if(material.needsUpdate){ + { + let [vs, fs] = [material.vertexShader, material.fragmentShader]; + + let numSnapshots = material.snapEnabled ? material.numSnapshots : 0; + let numClipBoxes = (material.clipBoxes && material.clipBoxes.length) ? material.clipBoxes.length : 0; + let numClipSpheres = (params.clipSpheres && params.clipSpheres.length) ? params.clipSpheres.length : 0; + let numClipPolygons = (material.clipPolygons && material.clipPolygons.length) ? material.clipPolygons.length : 0; + + let defines = [ + `#define num_shadowmaps ${shadowMaps.length}`, + `#define num_snapshots ${numSnapshots}`, + `#define num_clipboxes ${numClipBoxes}`, + `#define num_clipspheres ${numClipSpheres}`, + `#define num_clippolygons ${numClipPolygons}`, + ]; + + + if(octree.pcoGeometry.root.isLoaded()){ + let attributes = octree.pcoGeometry.root.geometry.attributes; + + if(attributes["gps-time"]){ + defines.push("#define clip_gps_enabled"); + } + + if(attributes["return number"]){ + defines.push("#define clip_return_number_enabled"); + } + + if(attributes["number of returns"]){ + defines.push("#define clip_number_of_returns_enabled"); + } + + if(attributes["source id"] || attributes["point source id"]){ + defines.push("#define clip_point_source_id_enabled"); + } + + } + + let definesString = defines.join("\n"); + + let vsVersionIndex = vs.indexOf("#version "); + let fsVersionIndex = fs.indexOf("#version "); + + if(vsVersionIndex >= 0){ + vs = vs.replace(/(#version .*)/, `$1\n${definesString}`); + }else { + vs = `${definesString}\n${vs}`; + } + + if(fsVersionIndex >= 0){ + fs = fs.replace(/(#version .*)/, `$1\n${definesString}`); + }else { + fs = `${definesString}\n${fs}`; + } + + + shader.update(vs, fs); + + material.needsUpdate = false; + } + + for (let uniformName of Object.keys(material.uniforms)) { + let uniform = material.uniforms[uniformName]; + + if (uniform.type == "t") { + + let texture = uniform.value; + + if (!texture) { + continue; + } + + if (!this.textures.has(texture)) { + let webglTexture = new WebGLTexture(gl, texture); + + this.textures.set(texture, webglTexture); + } + + let webGLTexture = this.textures.get(texture); + webGLTexture.update(); + + + } + } + } + + gl.useProgram(shader.program); + + let transparent = false; + if(params.transparent !== undefined){ + transparent = params.transparent && material.opacity < 1; + }else { + transparent = material.opacity < 1; + } + + if (transparent){ + gl.enable(gl.BLEND); + gl.blendFunc(gl.SRC_ALPHA, gl.ONE); + gl.depthMask(false); + gl.disable(gl.DEPTH_TEST); + } else { + gl.disable(gl.BLEND); + gl.depthMask(true); + gl.enable(gl.DEPTH_TEST); + } + + if(params.blendFunc !== undefined){ + gl.enable(gl.BLEND); + gl.blendFunc(...params.blendFunc); + } + + if(params.depthTest !== undefined){ + if(params.depthTest === true){ + gl.enable(gl.DEPTH_TEST); + }else { + gl.disable(gl.DEPTH_TEST); + } + } + + if(params.depthWrite !== undefined){ + if(params.depthWrite === true){ + gl.depthMask(true); + }else { + gl.depthMask(false); + } + + } + + + { // UPDATE UNIFORMS + shader.setUniformMatrix4("projectionMatrix", proj); + shader.setUniformMatrix4("viewMatrix", view); + shader.setUniformMatrix4("uViewInv", viewInv); + shader.setUniformMatrix4("uProjInv", projInv); + + let screenWidth = target ? target.width : material.screenWidth; + let screenHeight = target ? target.height : material.screenHeight; + + shader.setUniform1f("uScreenWidth", screenWidth); + shader.setUniform1f("uScreenHeight", screenHeight); + shader.setUniform1f("fov", Math.PI * camera.fov / 180); + shader.setUniform1f("near", camera.near); + shader.setUniform1f("far", camera.far); + + if(camera instanceof OrthographicCamera){ + shader.setUniform("uUseOrthographicCamera", true); + shader.setUniform("uOrthoWidth", camera.right - camera.left); + shader.setUniform("uOrthoHeight", camera.top - camera.bottom); + }else { + shader.setUniform("uUseOrthographicCamera", false); + } + + if(material.clipBoxes.length + material.clipPolygons.length === 0){ + shader.setUniform1i("clipTask", ClipTask.NONE); + }else { + shader.setUniform1i("clipTask", material.clipTask); + } + + shader.setUniform1i("clipMethod", material.clipMethod); + + if (material.clipBoxes && material.clipBoxes.length > 0) { + //let flattenedMatrices = [].concat(...material.clipBoxes.map(c => c.inverse.elements)); + + //const lClipBoxes = shader.uniformLocations["clipBoxes[0]"]; + //gl.uniformMatrix4fv(lClipBoxes, false, flattenedMatrices); + + const lClipBoxes = shader.uniformLocations["clipBoxes[0]"]; + gl.uniformMatrix4fv(lClipBoxes, false, material.uniforms.clipBoxes.value); + } + + // TODO CLIPSPHERES + if(params.clipSpheres && params.clipSpheres.length > 0){ + + let clipSpheres = params.clipSpheres; + + let matrices = []; + for(let clipSphere of clipSpheres){ + //let mScale = new THREE.Matrix4().makeScale(...clipSphere.scale.toArray()); + //let mTranslate = new THREE.Matrix4().makeTranslation(...clipSphere.position.toArray()); + + //let clipToWorld = new THREE.Matrix4().multiplyMatrices(mTranslate, mScale); + let clipToWorld = clipSphere.matrixWorld; + let viewToWorld = camera.matrixWorld; + let worldToClip = clipToWorld.clone().invert(); + + let viewToClip = new Matrix4().multiplyMatrices(worldToClip, viewToWorld); + + matrices.push(viewToClip); + } + + let flattenedMatrices = [].concat(...matrices.map(matrix => matrix.elements)); + + const lClipSpheres = shader.uniformLocations["uClipSpheres[0]"]; + gl.uniformMatrix4fv(lClipSpheres, false, flattenedMatrices); + + //const lClipSpheres = shader.uniformLocations["uClipSpheres[0]"]; + //gl.uniformMatrix4fv(lClipSpheres, false, material.uniforms.clipSpheres.value); + } + + + shader.setUniform1f("size", material.size); + shader.setUniform1f("maxSize", material.uniforms.maxSize.value); + shader.setUniform1f("minSize", material.uniforms.minSize.value); + + + // uniform float uPCIndex + shader.setUniform1f("uOctreeSpacing", material.spacing); + shader.setUniform("uOctreeSize", material.uniforms.octreeSize.value); + + + //uniform vec3 uColor; + shader.setUniform3f("uColor", material.color.toArray()); + //uniform float opacity; + shader.setUniform1f("uOpacity", material.opacity); + + shader.setUniform2f("elevationRange", material.elevationRange); + shader.setUniform2f("intensityRange", material.intensityRange); + + + shader.setUniform3f("uIntensity_gbc", [ + material.intensityGamma, + material.intensityBrightness, + material.intensityContrast + ]); + + shader.setUniform3f("uRGB_gbc", [ + material.rgbGamma, + material.rgbBrightness, + material.rgbContrast + ]); + + shader.setUniform1f("uTransition", material.transition); + shader.setUniform1f("wRGB", material.weightRGB); + shader.setUniform1f("wIntensity", material.weightIntensity); + shader.setUniform1f("wElevation", material.weightElevation); + shader.setUniform1f("wClassification", material.weightClassification); + shader.setUniform1f("wReturnNumber", material.weightReturnNumber); + shader.setUniform1f("wSourceID", material.weightSourceID); + + shader.setUniform("backfaceCulling", material.uniforms.backfaceCulling.value); + + let vnWebGLTexture = this.textures.get(material.visibleNodesTexture); + if(vnWebGLTexture){ + shader.setUniform1i("visibleNodesTexture", currentTextureBindingPoint); + gl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint); + gl.bindTexture(vnWebGLTexture.target, vnWebGLTexture.id); + currentTextureBindingPoint++; + } + + let gradientTexture = this.textures.get(material.gradientTexture); + shader.setUniform1i("gradient", currentTextureBindingPoint); + gl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint); + gl.bindTexture(gradientTexture.target, gradientTexture.id); + + const repeat = material.elevationGradientRepeat; + if(repeat === ElevationGradientRepeat.REPEAT){ + gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.REPEAT); + }else if(repeat === ElevationGradientRepeat.MIRRORED_REPEAT){ + gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT); + gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT); + }else { + gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + } + currentTextureBindingPoint++; + + let classificationTexture = this.textures.get(material.classificationTexture); + shader.setUniform1i("classificationLUT", currentTextureBindingPoint); + gl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint); + gl.bindTexture(classificationTexture.target, classificationTexture.id); + currentTextureBindingPoint++; + + let matcapTexture = this.textures.get(material.matcapTexture); + shader.setUniform1i("matcapTextureUniform", currentTextureBindingPoint); + gl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint); + gl.bindTexture(matcapTexture.target, matcapTexture.id); + currentTextureBindingPoint++; + + + if (material.snapEnabled === true) { + + { + const lSnapshot = shader.uniformLocations["uSnapshot[0]"]; + const lSnapshotDepth = shader.uniformLocations["uSnapshotDepth[0]"]; + + let bindingStart = currentTextureBindingPoint; + let lSnapshotBindingPoints = new Array(5).fill(bindingStart).map((a, i) => (a + i)); + let lSnapshotDepthBindingPoints = new Array(5) + .fill(1 + Math.max(...lSnapshotBindingPoints)) + .map((a, i) => (a + i)); + currentTextureBindingPoint = 1 + Math.max(...lSnapshotDepthBindingPoints); + + gl.uniform1iv(lSnapshot, lSnapshotBindingPoints); + gl.uniform1iv(lSnapshotDepth, lSnapshotDepthBindingPoints); + + for (let i = 0; i < 5; i++) { + let texture = material.uniforms[`uSnapshot`].value[i]; + let textureDepth = material.uniforms[`uSnapshotDepth`].value[i]; + + if (!texture) { + break; + } + + let snapTexture = this.threeRenderer.properties.get(texture).__webglTexture; + let snapTextureDepth = this.threeRenderer.properties.get(textureDepth).__webglTexture; + + let bindingPoint = lSnapshotBindingPoints[i]; + let depthBindingPoint = lSnapshotDepthBindingPoints[i]; + + gl.activeTexture(gl[`TEXTURE${bindingPoint}`]); + gl.bindTexture(gl.TEXTURE_2D, snapTexture); + + gl.activeTexture(gl[`TEXTURE${depthBindingPoint}`]); + gl.bindTexture(gl.TEXTURE_2D, snapTextureDepth); + } + } + + { + let flattenedMatrices = [].concat(...material.uniforms.uSnapView.value.map(c => c.elements)); + const lSnapView = shader.uniformLocations["uSnapView[0]"]; + gl.uniformMatrix4fv(lSnapView, false, flattenedMatrices); + } + { + let flattenedMatrices = [].concat(...material.uniforms.uSnapProj.value.map(c => c.elements)); + const lSnapProj = shader.uniformLocations["uSnapProj[0]"]; + gl.uniformMatrix4fv(lSnapProj, false, flattenedMatrices); + } + { + let flattenedMatrices = [].concat(...material.uniforms.uSnapProjInv.value.map(c => c.elements)); + const lSnapProjInv = shader.uniformLocations["uSnapProjInv[0]"]; + gl.uniformMatrix4fv(lSnapProjInv, false, flattenedMatrices); + } + { + let flattenedMatrices = [].concat(...material.uniforms.uSnapViewInv.value.map(c => c.elements)); + const lSnapViewInv = shader.uniformLocations["uSnapViewInv[0]"]; + gl.uniformMatrix4fv(lSnapViewInv, false, flattenedMatrices); + } + + } + } + + this.renderNodes(octree, nodes, visibilityTextureData, camera, target, shader, params); + + gl.activeTexture(gl.TEXTURE2); + gl.bindTexture(gl.TEXTURE_2D, null); + gl.activeTexture(gl.TEXTURE0); + } + + render(scene, camera, target = null, params = {}) { + + const gl = this.gl; + + // PREPARE + if (target != null) { + this.threeRenderer.setRenderTarget(target); + } + + //camera.updateProjectionMatrix(); + // camera.matrixWorldInverse.invert(camera.matrixWorld); + + const traversalResult = this.traverse(scene); + + + // RENDER + for (const octree of traversalResult.octrees) { + let nodes = octree.visibleNodes; + this.renderOctree(octree, nodes, camera, target, params); + } + + + // CLEANUP + gl.activeTexture(gl.TEXTURE1); + gl.bindTexture(gl.TEXTURE_2D, null); + gl.bindBuffer(gl.ARRAY_BUFFER, null); + gl.bindVertexArray(null); + + this.threeRenderer.resetState(); + } + + + + }; + + class ProfileData { + constructor (profile) { + this.profile = profile; + + this.segments = []; + this.boundingBox = new Box3(); + + for (let i = 0; i < profile.points.length - 1; i++) { + let start = profile.points[i]; + let end = profile.points[i + 1]; + + let startGround = new Vector3(start.x, start.y, 0); + let endGround = new Vector3(end.x, end.y, 0); + + let center = new Vector3().addVectors(endGround, startGround).multiplyScalar(0.5); + let length = startGround.distanceTo(endGround); + let side = new Vector3().subVectors(endGround, startGround).normalize(); + let up = new Vector3(0, 0, 1); + let forward = new Vector3().crossVectors(side, up).normalize(); + let N = forward; + let cutPlane = new Plane().setFromNormalAndCoplanarPoint(N, startGround); + let halfPlane = new Plane().setFromNormalAndCoplanarPoint(side, center); + + let segment = { + start: start, + end: end, + cutPlane: cutPlane, + halfPlane: halfPlane, + length: length, + points: new Points$1() + }; + + this.segments.push(segment); + } + } + + size () { + let size = 0; + for (let segment of this.segments) { + size += segment.points.numPoints; + } + + return size; + } + }; + + class ProfileRequest { + constructor (pointcloud, profile, maxDepth, callback) { + this.pointcloud = pointcloud; + this.profile = profile; + this.maxDepth = maxDepth || Number.MAX_VALUE; + this.callback = callback; + this.temporaryResult = new ProfileData(this.profile); + this.pointsServed = 0; + this.highestLevelServed = 0; + + this.priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; }); + + this.initialize(); + } + + initialize () { + this.priorityQueue.push({node: this.pointcloud.pcoGeometry.root, weight: Infinity}); + }; + + // traverse the node and add intersecting descendants to queue + traverse (node) { + let stack = []; + for (let i = 0; i < 8; i++) { + let child = node.children[i]; + if (child && this.pointcloud.nodeIntersectsProfile(child, this.profile)) { + stack.push(child); + } + } + + while (stack.length > 0) { + let node = stack.pop(); + let weight = node.boundingSphere.radius; + + this.priorityQueue.push({node: node, weight: weight}); + + // add children that intersect the cutting plane + if (node.level < this.maxDepth) { + for (let i = 0; i < 8; i++) { + let child = node.children[i]; + if (child && this.pointcloud.nodeIntersectsProfile(child, this.profile)) { + stack.push(child); + } + } + } + } + } + + update(){ + if(!this.updateGeneratorInstance){ + this.updateGeneratorInstance = this.updateGenerator(); + } + + let result = this.updateGeneratorInstance.next(); + if(result.done){ + this.updateGeneratorInstance = null; + } + } + + * updateGenerator(){ + // load nodes in queue + // if hierarchy expands, also load nodes from expanded hierarchy + // once loaded, add data to this.points and remove node from queue + // only evaluate 1-50 nodes per frame to maintain responsiveness + + let start = performance.now(); + + let maxNodesPerUpdate = 1; + let intersectedNodes = []; + + for (let i = 0; i < Math.min(maxNodesPerUpdate, this.priorityQueue.size()); i++) { + let element = this.priorityQueue.pop(); + let node = element.node; + + if(node.level > this.maxDepth){ + continue; + } + + if (node.loaded) { + // add points to result + intersectedNodes.push(node); + exports.lru.touch(node); + this.highestLevelServed = Math.max(node.getLevel(), this.highestLevelServed); + + var geom = node.pcoGeometry; + var hierarchyStepSize = geom ? geom.hierarchyStepSize : 1; + + var doTraverse = node.getLevel() === 0 || + (node.level % hierarchyStepSize === 0 && node.hasChildren); + + if (doTraverse) { + this.traverse(node); + } + } else { + node.load(); + this.priorityQueue.push(element); + } + } + + if (intersectedNodes.length > 0) { + + for(let done of this.getPointsInsideProfile(intersectedNodes, this.temporaryResult)){ + if(!done){ + //console.log("updateGenerator yields"); + yield false; + } + } + if (this.temporaryResult.size() > 100) { + this.pointsServed += this.temporaryResult.size(); + this.callback.onProgress({request: this, points: this.temporaryResult}); + this.temporaryResult = new ProfileData(this.profile); + } + } + + if (this.priorityQueue.size() === 0) { + // we're done! inform callback and remove from pending requests + + if (this.temporaryResult.size() > 0) { + this.pointsServed += this.temporaryResult.size(); + this.callback.onProgress({request: this, points: this.temporaryResult}); + this.temporaryResult = new ProfileData(this.profile); + } + + this.callback.onFinish({request: this}); + + let index = this.pointcloud.profileRequests.indexOf(this); + if (index >= 0) { + this.pointcloud.profileRequests.splice(index, 1); + } + } + + yield true; + }; + + * getAccepted(numPoints, node, matrix, segment, segmentDir, points, totalMileage){ + let checkpoint = performance.now(); + + let accepted = new Uint32Array(numPoints); + let mileage = new Float64Array(numPoints); + let acceptedPositions = new Float32Array(numPoints * 3); + let numAccepted = 0; + + let pos = new Vector3(); + let svp = new Vector3(); + + let view = new Float32Array(node.geometry.attributes.position.array); + + for (let i = 0; i < numPoints; i++) { + + pos.set( + view[i * 3 + 0], + view[i * 3 + 1], + view[i * 3 + 2]); + + pos.applyMatrix4(matrix); + let distance = Math.abs(segment.cutPlane.distanceToPoint(pos)); + let centerDistance = Math.abs(segment.halfPlane.distanceToPoint(pos)); + + if (distance < this.profile.width / 2 && centerDistance < segment.length / 2) { + svp.subVectors(pos, segment.start); + let localMileage = segmentDir.dot(svp); + + accepted[numAccepted] = i; + mileage[numAccepted] = localMileage + totalMileage; + points.boundingBox.expandByPoint(pos); + + pos.sub(this.pointcloud.position); + + acceptedPositions[3 * numAccepted + 0] = pos.x; + acceptedPositions[3 * numAccepted + 1] = pos.y; + acceptedPositions[3 * numAccepted + 2] = pos.z; + + numAccepted++; + } + + if((i % 1000) === 0){ + let duration = performance.now() - checkpoint; + if(duration > 4){ + //console.log(`getAccepted yield after ${duration}ms`); + yield false; + checkpoint = performance.now(); + } + } + } + + accepted = accepted.subarray(0, numAccepted); + mileage = mileage.subarray(0, numAccepted); + acceptedPositions = acceptedPositions.subarray(0, numAccepted * 3); + + //let end = performance.now(); + //let duration = end - start; + //console.log("accepted duration ", duration) + + //console.log(`getAccepted finished`); + + yield [accepted, mileage, acceptedPositions]; + } + + * getPointsInsideProfile(nodes, target){ + let checkpoint = performance.now(); + let totalMileage = 0; + + let pointsProcessed = 0; + + for (let segment of target.segments) { + for (let node of nodes) { + let numPoints = node.numPoints; + let geometry = node.geometry; + + if(!numPoints){ + continue; + } + + { // skip if current node doesn't intersect current segment + let bbWorld = node.boundingBox.clone().applyMatrix4(this.pointcloud.matrixWorld); + let bsWorld = bbWorld.getBoundingSphere(new Sphere()); + + let start = new Vector3(segment.start.x, segment.start.y, bsWorld.center.z); + let end = new Vector3(segment.end.x, segment.end.y, bsWorld.center.z); + + let closest = new Line3(start, end).closestPointToPoint(bsWorld.center, true, new Vector3()); + let distance = closest.distanceTo(bsWorld.center); + + let intersects = (distance < (bsWorld.radius + target.profile.width)); + + if(!intersects){ + continue; + } + } + + //{// DEBUG + // console.log(node.name); + // let boxHelper = new Potree.Box3Helper(node.getBoundingBox()); + // boxHelper.matrixAutoUpdate = false; + // boxHelper.matrix.copy(viewer.scene.pointclouds[0].matrixWorld); + // viewer.scene.scene.add(boxHelper); + //} + + let sv = new Vector3().subVectors(segment.end, segment.start).setZ(0); + let segmentDir = sv.clone().normalize(); + + let points = new Points$1(); + + let nodeMatrix = new Matrix4().makeTranslation(...node.boundingBox.min.toArray()); + + let matrix = new Matrix4().multiplyMatrices( + this.pointcloud.matrixWorld, nodeMatrix); + + pointsProcessed = pointsProcessed + numPoints; + + let accepted = null; + let mileage = null; + let acceptedPositions = null; + for(let result of this.getAccepted(numPoints, node, matrix, segment, segmentDir, points,totalMileage)){ + if(!result){ + let duration = performance.now() - checkpoint; + //console.log(`getPointsInsideProfile yield after ${duration}ms`); + yield false; + checkpoint = performance.now(); + }else { + [accepted, mileage, acceptedPositions] = result; + } + } + + let duration = performance.now() - checkpoint; + if(duration > 4){ + //console.log(`getPointsInsideProfile yield after ${duration}ms`); + yield false; + checkpoint = performance.now(); + } + + points.data.position = acceptedPositions; + + let relevantAttributes = Object.keys(geometry.attributes).filter(a => !["position", "indices"].includes(a)); + for(let attributeName of relevantAttributes){ + + let attribute = geometry.attributes[attributeName]; + let numElements = attribute.array.length / numPoints; + + if(numElements !== parseInt(numElements)){ + debugger; + } + + let Type = attribute.array.constructor; + + let filteredBuffer = new Type(numElements * accepted.length); + + let source = attribute.array; + let target = filteredBuffer; + + for(let i = 0; i < accepted.length; i++){ + + let index = accepted[i]; + + let start = index * numElements; + let end = start + numElements; + let sub = source.subarray(start, end); + + target.set(sub, i * numElements); + } + + points.data[attributeName] = filteredBuffer; + } + + points.data['mileage'] = mileage; + points.numPoints = accepted.length; + + segment.points.add(points); + } + + totalMileage += segment.length; + } + + for (let segment of target.segments) { + target.boundingBox.union(segment.points.boundingBox); + } + + //console.log(`getPointsInsideProfile finished`); + yield true; + }; + + finishLevelThenCancel () { + if (this.cancelRequested) { + return; + } + + this.maxDepth = this.highestLevelServed; + this.cancelRequested = true; + + //console.log(`maxDepth: ${this.maxDepth}`); + }; + + cancel () { + this.callback.onCancel(); + + this.priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; }); + + let index = this.pointcloud.profileRequests.indexOf(this); + if (index >= 0) { + this.pointcloud.profileRequests.splice(index, 1); + } + }; + } + + class Version{ + + constructor(version){ + this.version = version; + let vmLength = (version.indexOf('.') === -1) ? version.length : version.indexOf('.'); + this.versionMajor = parseInt(version.substr(0, vmLength)); + this.versionMinor = parseInt(version.substr(vmLength + 1)); + if (this.versionMinor.length === 0) { + this.versionMinor = 0; + } + } + + newerThan(version){ + let v = new Version(version); + + if (this.versionMajor > v.versionMajor) { + return true; + } else if (this.versionMajor === v.versionMajor && this.versionMinor > v.versionMinor) { + return true; + } else { + return false; + } + } + + equalOrHigher(version){ + let v = new Version(version); + + if (this.versionMajor > v.versionMajor) { + return true; + } else if (this.versionMajor === v.versionMajor && this.versionMinor >= v.versionMinor) { + return true; + } else { + return false; + } + } + + upTo(version){ + return !this.newerThan(version); + } + + } + + class WorkerPool{ + constructor(){ + this.workers = {}; + } + + getWorker(url){ + if (!this.workers[url]){ + this.workers[url] = []; + } + + if (this.workers[url].length === 0){ + let worker = new Worker(url); + this.workers[url].push(worker); + } + + let worker = this.workers[url].pop(); + + return worker; + } + + returnWorker(url, worker){ + this.workers[url].push(worker); + } + }; + + //Potree.workerPool = new Potree.WorkerPool(); + + function createPointcloudData(pointcloud) { + + let material = pointcloud.material; + + let ranges = []; + + for(let [name, value] of material.ranges){ + ranges.push({ + name: name, + value: value, + }); + } + + if(typeof material.elevationRange[0] === "number"){ + ranges.push({ + name: "elevationRange", + value: material.elevationRange, + }); + } + if(typeof material.intensityRange[0] === "number"){ + ranges.push({ + name: "intensityRange", + value: material.intensityRange, + }); + } + + let pointSizeTypeName = Object.entries(Potree.PointSizeType).find(e => e[1] === material.pointSizeType)[0]; + + let jsonMaterial = { + activeAttributeName: material.activeAttributeName, + ranges: ranges, + size: material.size, + minSize: material.minSize, + pointSizeType: pointSizeTypeName, + matcap: material.matcap, + }; + + const pcdata = { + name: pointcloud.name, + url: pointcloud.pcoGeometry.url, + position: pointcloud.position.toArray(), + rotation: pointcloud.rotation.toArray(), + scale: pointcloud.scale.toArray(), + material: jsonMaterial, + }; + + return pcdata; + } + + function createProfileData(profile){ + const data = { + uuid: profile.uuid, + name: profile.name, + points: profile.points.map(p => p.toArray()), + height: profile.height, + width: profile.width, + }; + + return data; + } + + function createVolumeData(volume){ + const data = { + uuid: volume.uuid, + type: volume.constructor.name, + name: volume.name, + position: volume.position.toArray(), + rotation: volume.rotation.toArray(), + scale: volume.scale.toArray(), + visible: volume.visible, + clip: volume.clip, + }; + + return data; + } + + function createCameraAnimationData(animation){ + + const controlPoints = animation.controlPoints.map( cp => { + const cpdata = { + position: cp.position.toArray(), + target: cp.target.toArray(), + }; + + return cpdata; + }); + + const data = { + uuid: animation.uuid, + name: animation.name, + duration: animation.duration, + t: animation.t, + curveType: animation.curveType, + visible: animation.visible, + controlPoints: controlPoints, + }; + + return data; + } + + function createMeasurementData(measurement){ + + const data = { + uuid: measurement.uuid, + name: measurement.name, + points: measurement.points.map(p => p.position.toArray()), + showDistances: measurement.showDistances, + showCoordinates: measurement.showCoordinates, + showArea: measurement.showArea, + closed: measurement.closed, + showAngles: measurement.showAngles, + showHeight: measurement.showHeight, + showCircle: measurement.showCircle, + showAzimuth: measurement.showAzimuth, + showEdges: measurement.showEdges, + color: measurement.color.toArray(), + }; + + return data; + } + + function createOrientedImagesData(images){ + const data = { + cameraParamsPath: images.cameraParamsPath, + imageParamsPath: images.imageParamsPath, + }; + + return data; + } + + function createGeopackageData(geopackage){ + const data = { + path: geopackage.path, + }; + + return data; + } + + function createAnnotationData(annotation){ + + const data = { + uuid: annotation.uuid, + title: annotation.title.toString(), + description: annotation.description, + position: annotation.position.toArray(), + offset: annotation.offset.toArray(), + children: [], + }; + + if(annotation.cameraPosition){ + data.cameraPosition = annotation.cameraPosition.toArray(); + } + + if(annotation.cameraTarget){ + data.cameraTarget = annotation.cameraTarget.toArray(); + } + + if(typeof annotation.radius !== "undefined"){ + data.radius = annotation.radius; + } + + return data; + } + + function createAnnotationsData(viewer){ + + const map = new Map(); + + viewer.scene.annotations.traverseDescendants(a => { + const aData = createAnnotationData(a); + + map.set(a, aData); + }); + + for(const [annotation, data] of map){ + for(const child of annotation.children){ + const childData = map.get(child); + data.children.push(childData); + } + } + + const annotations = viewer.scene.annotations.children.map(a => map.get(a)); + + return annotations; + } + + function createSettingsData(viewer){ + return { + pointBudget: viewer.getPointBudget(), + fov: viewer.getFOV(), + edlEnabled: viewer.getEDLEnabled(), + edlRadius: viewer.getEDLRadius(), + edlStrength: viewer.getEDLStrength(), + background: viewer.getBackground(), + minNodeSize: viewer.getMinNodeSize(), + showBoundingBoxes: viewer.getShowBoundingBox(), + }; + } + + function createSceneContentData(viewer){ + + const data = []; + + const potreeObjects = []; + + viewer.scene.scene.traverse(node => { + if(node.potree){ + potreeObjects.push(node); + } + }); + + for(const object of potreeObjects){ + + if(object.potree.file){ + const saveObject = { + file: object.potree.file, + }; + + data.push(saveObject); + } + + + } + + + return data; + } + + function createViewData(viewer){ + const view = viewer.scene.view; + + const data = { + position: view.position.toArray(), + target: view.getPivot().toArray(), + }; + + return data; + } + + function createClassificationData(viewer){ + const classifications = viewer.classifications; + + const data = classifications; + + return data; + } + + function saveProject(viewer) { + + const scene = viewer.scene; + + const data = { + type: "Potree", + version: 1.7, + settings: createSettingsData(viewer), + view: createViewData(viewer), + classification: createClassificationData(viewer), + pointclouds: scene.pointclouds.map(createPointcloudData), + measurements: scene.measurements.map(createMeasurementData), + volumes: scene.volumes.map(createVolumeData), + cameraAnimations: scene.cameraAnimations.map(createCameraAnimationData), + profiles: scene.profiles.map(createProfileData), + annotations: createAnnotationsData(viewer), + orientedImages: scene.orientedImages.map(createOrientedImagesData), + geopackages: scene.geopackages.map(createGeopackageData), + // objects: createSceneContentData(viewer), + }; + + return data; + } + + class ControlPoint{ + + constructor(){ + this.position = new Vector3(0, 0, 0); + this.target = new Vector3(0, 0, 0); + this.positionHandle = null; + this.targetHandle = null; + } + + }; + + + + class CameraAnimation extends EventDispatcher{ + + constructor(viewer){ + super(); + + this.viewer = viewer; + + this.selectedElement = null; + + this.controlPoints = []; + + this.uuid = MathUtils.generateUUID(); + + this.node = new Object3D(); + this.node.name = "camera animation"; + this.viewer.scene.scene.add(this.node); + + this.frustum = this.createFrustum(); + this.node.add(this.frustum); + + this.name = "Camera Animation"; + this.duration = 5; + this.t = 0; + // "centripetal", "chordal", "catmullrom" + this.curveType = "centripetal"; + this.visible = true; + + this.createUpdateHook(); + this.createPath(); + } + + static defaultFromView(viewer){ + const animation = new CameraAnimation(viewer); + + const camera = viewer.scene.getActiveCamera(); + const target = viewer.scene.view.getPivot(); + + const cpCenter = new Vector3( + 0.3 * camera.position.x + 0.7 * target.x, + 0.3 * camera.position.y + 0.7 * target.y, + 0.3 * camera.position.z + 0.7 * target.z, + ); + + const targetCenter = new Vector3( + 0.05 * camera.position.x + 0.95 * target.x, + 0.05 * camera.position.y + 0.95 * target.y, + 0.05 * camera.position.z + 0.95 * target.z, + ); + + const r = camera.position.distanceTo(target) * 0.3; + + //const dir = target.clone().sub(camera.position).normalize(); + const angle = Utils.computeAzimuth(camera.position, target); + + const n = 5; + for(let i = 0; i < n; i++){ + let u = 1.5 * Math.PI * (i / n) + angle; + + const dx = r * Math.cos(u); + const dy = r * Math.sin(u); + + const cpPos = [ + cpCenter.x + dx, + cpCenter.y + dy, + cpCenter.z, + ]; + + const targetPos = [ + targetCenter.x + dx * 0.1, + targetCenter.y + dy * 0.1, + targetCenter.z, + ]; + + const cp = animation.createControlPoint(); + cp.position.set(...cpPos); + cp.target.set(...targetPos); + } + + return animation; + } + + createUpdateHook(){ + const viewer = this.viewer; + + viewer.addEventListener("update", () => { + + const camera = viewer.scene.getActiveCamera(); + const {width, height} = viewer.renderer.getSize(new Vector2()); + + this.node.visible = this.visible; + + for(const cp of this.controlPoints){ + + { // position + const projected = cp.position.clone().project(camera); + + const visible = this.visible && (projected.z < 1 && projected.z > -1); + + if(visible){ + const x = width * (projected.x * 0.5 + 0.5); + const y = height - height * (projected.y * 0.5 + 0.5); + + cp.positionHandle.svg.style.left = x - cp.positionHandle.svg.clientWidth / 2; + cp.positionHandle.svg.style.top = y - cp.positionHandle.svg.clientHeight / 2; + cp.positionHandle.svg.style.display = ""; + }else { + cp.positionHandle.svg.style.display = "none"; + } + } + + { // target + const projected = cp.target.clone().project(camera); + + const visible = this.visible && (projected.z < 1 && projected.z > -1); + + if(visible){ + const x = width * (projected.x * 0.5 + 0.5); + const y = height - height * (projected.y * 0.5 + 0.5); + + cp.targetHandle.svg.style.left = x - cp.targetHandle.svg.clientWidth / 2; + cp.targetHandle.svg.style.top = y - cp.targetHandle.svg.clientHeight / 2; + cp.targetHandle.svg.style.display = ""; + }else { + cp.targetHandle.svg.style.display = "none"; + } + } + + } + + this.line.material.resolution.set(width, height); + + this.updatePath(); + + { // frustum + const frame = this.at(this.t); + const frustum = this.frustum; + + frustum.position.copy(frame.position); + frustum.lookAt(...frame.target.toArray()); + frustum.scale.set(20, 20, 20); + + frustum.material.resolution.set(width, height); + } + + }); + } + + createControlPoint(index){ + + if(index === undefined){ + index = this.controlPoints.length; + } + + const cp = new ControlPoint(); + + + if(this.controlPoints.length >= 2 && index === 0){ + const cp1 = this.controlPoints[0]; + const cp2 = this.controlPoints[1]; + + const dir = cp1.position.clone().sub(cp2.position).multiplyScalar(0.5); + cp.position.copy(cp1.position).add(dir); + + const tDir = cp1.target.clone().sub(cp2.target).multiplyScalar(0.5); + cp.target.copy(cp1.target).add(tDir); + }else if(this.controlPoints.length >= 2 && index === this.controlPoints.length){ + const cp1 = this.controlPoints[this.controlPoints.length - 2]; + const cp2 = this.controlPoints[this.controlPoints.length - 1]; + + const dir = cp2.position.clone().sub(cp1.position).multiplyScalar(0.5); + cp.position.copy(cp1.position).add(dir); + + const tDir = cp2.target.clone().sub(cp1.target).multiplyScalar(0.5); + cp.target.copy(cp2.target).add(tDir); + }else if(this.controlPoints.length >= 2){ + const cp1 = this.controlPoints[index - 1]; + const cp2 = this.controlPoints[index]; + + cp.position.copy(cp1.position.clone().add(cp2.position).multiplyScalar(0.5)); + cp.target.copy(cp1.target.clone().add(cp2.target).multiplyScalar(0.5)); + } + + // cp.position.copy(viewer.scene.view.position); + // cp.target.copy(viewer.scene.view.getPivot()); + + cp.positionHandle = this.createHandle(cp.position); + cp.targetHandle = this.createHandle(cp.target); + + this.controlPoints.splice(index, 0, cp); + + this.dispatchEvent({ + type: "controlpoint_added", + controlpoint: cp, + }); + + return cp; + } + + removeControlPoint(cp){ + this.controlPoints = this.controlPoints.filter(_cp => _cp !== cp); + + this.dispatchEvent({ + type: "controlpoint_removed", + controlpoint: cp, + }); + + cp.positionHandle.svg.remove(); + cp.targetHandle.svg.remove(); + + // TODO destroy cp + } + + createPath(){ + + { // position + const geometry = new LineGeometry(); + + let material = new LineMaterial({ + color: 0x00ff00, + dashSize: 5, + gapSize: 2, + linewidth: 2, + resolution: new Vector2(1000, 1000), + }); + + const line = new Line2(geometry, material); + + this.line = line; + this.node.add(line); + } + + { // target + const geometry = new LineGeometry(); + + let material = new LineMaterial({ + color: 0x0000ff, + dashSize: 5, + gapSize: 2, + linewidth: 2, + resolution: new Vector2(1000, 1000), + }); + + const line = new Line2(geometry, material); + + this.targetLine = line; + this.node.add(line); + } + } + + createFrustum(){ + + const f = 0.3; + + const positions = [ + 0, 0, 0, + -f, -f, +1, + + 0, 0, 0, + f, -f, +1, + + 0, 0, 0, + f, f, +1, + + 0, 0, 0, + -f, f, +1, + + -f, -f, +1, + f, -f, +1, + + f, -f, +1, + f, f, +1, + + f, f, +1, + -f, f, +1, + + -f, f, +1, + -f, -f, +1, + ]; + + const geometry = new LineGeometry(); + + geometry.setPositions(positions); + geometry.verticesNeedUpdate = true; + geometry.computeBoundingSphere(); + + let material = new LineMaterial({ + color: 0xff0000, + linewidth: 2, + resolution: new Vector2(1000, 1000), + }); + + const line = new Line2(geometry, material); + line.computeLineDistances(); + + return line; + } + + updatePath(){ + + { // positions + const positions = this.controlPoints.map(cp => cp.position); + const first = positions[0]; + + const curve = new CatmullRomCurve3(positions); + curve.curveType = this.curveType; + + const n = 100; + + const curvePositions = []; + for(let k = 0; k <= n; k++){ + const t = k / n; + + const position = curve.getPoint(t).sub(first); + + curvePositions.push(position.x, position.y, position.z); + } + + this.line.geometry.setPositions(curvePositions); + this.line.geometry.verticesNeedUpdate = true; + this.line.geometry.computeBoundingSphere(); + this.line.position.copy(first); + this.line.computeLineDistances(); + + this.cameraCurve = curve; + } + + { // targets + const positions = this.controlPoints.map(cp => cp.target); + const first = positions[0]; + + const curve = new CatmullRomCurve3(positions); + curve.curveType = this.curveType; + + const n = 100; + + const curvePositions = []; + for(let k = 0; k <= n; k++){ + const t = k / n; + + const position = curve.getPoint(t).sub(first); + + curvePositions.push(position.x, position.y, position.z); + } + + this.targetLine.geometry.setPositions(curvePositions); + this.targetLine.geometry.verticesNeedUpdate = true; + this.targetLine.geometry.computeBoundingSphere(); + this.targetLine.position.copy(first); + this.targetLine.computeLineDistances(); + + this.targetCurve = curve; + } + } + + at(t){ + + if(t > 1){ + t = 1; + }else if(t < 0){ + t = 0; + } + + const camPos = this.cameraCurve.getPointAt(t); + const target = this.targetCurve.getPointAt(t); + + const frame = { + position: camPos, + target: target, + }; + + return frame; + } + + set(t){ + this.t = t; + } + + createHandle(vector){ + + const svgns = "http://www.w3.org/2000/svg"; + const svg = document.createElementNS(svgns, "svg"); + + svg.setAttribute("width", "2em"); + svg.setAttribute("height", "2em"); + svg.setAttribute("position", "absolute"); + + svg.style.left = "50px"; + svg.style.top = "50px"; + svg.style.position = "absolute"; + svg.style.zIndex = "10000"; + + const circle = document.createElementNS(svgns, 'circle'); + circle.setAttributeNS(null, 'cx', "1em"); + circle.setAttributeNS(null, 'cy', "1em"); + circle.setAttributeNS(null, 'r', "0.5em"); + circle.setAttributeNS(null, 'style', 'fill: red; stroke: black; stroke-width: 0.2em;' ); + svg.appendChild(circle); + + + const element = this.viewer.renderer.domElement.parentElement; + element.appendChild(svg); + + + const startDrag = (evt) => { + this.selectedElement = svg; + + document.addEventListener("mousemove", drag); + }; + + const endDrag = (evt) => { + this.selectedElement = null; + + document.removeEventListener("mousemove", drag); + }; + + const drag = (evt) => { + if (this.selectedElement) { + evt.preventDefault(); + + const rect = viewer.renderer.domElement.getBoundingClientRect(); + + const x = evt.clientX - rect.x; + const y = evt.clientY - rect.y; + + const {width, height} = this.viewer.renderer.getSize(new Vector2()); + const camera = this.viewer.scene.getActiveCamera(); + //const cp = this.controlPoints.find(cp => cp.handle.svg === svg); + const projected = vector.clone().project(camera); + + projected.x = ((x / width) - 0.5) / 0.5; + projected.y = (-(y - height) / height - 0.5) / 0.5; + + const unprojected = projected.clone().unproject(camera); + vector.set(unprojected.x, unprojected.y, unprojected.z); + + + } + }; + + svg.addEventListener('mousedown', startDrag); + svg.addEventListener('mouseup', endDrag); + + const handle = { + svg: svg, + }; + + return handle; + } + + setVisible(visible){ + this.node.visible = visible; + + const display = visible ? "" : "none"; + + for(const cp of this.controlPoints){ + cp.positionHandle.svg.style.display = display; + cp.targetHandle.svg.style.display = display; + } + + this.visible = visible; + } + + setDuration(duration){ + this.duration = duration; + } + + getDuration(duration){ + return this.duration; + } + + play(){ + + const tStart = performance.now(); + const duration = this.duration; + + const originalyVisible = this.visible; + this.setVisible(false); + + const onUpdate = (delta) => { + + let tNow = performance.now(); + let elapsed = (tNow - tStart) / 1000; + let t = elapsed / duration; + + this.set(t); + + const frame = this.at(t); + + viewer.scene.view.position.copy(frame.position); + viewer.scene.view.lookAt(frame.target); + + + if(t > 1){ + this.setVisible(originalyVisible); + + this.viewer.removeEventListener("update", onUpdate); + } + + }; + + this.viewer.addEventListener("update", onUpdate); + + } + + } + + function loadPointCloud(viewer, data){ + + let loadMaterial = (target) => { + + if(data.material){ + + if(data.material.activeAttributeName != null){ + target.activeAttributeName = data.material.activeAttributeName; + } + + if(data.material.ranges != null){ + for(let range of data.material.ranges){ + + if(range.name === "elevationRange"){ + target.elevationRange = range.value; + }else if(range.name === "intensityRange"){ + target.intensityRange = range.value; + }else { + target.setRange(range.name, range.value); + } + + } + } + + if(data.material.size != null){ + target.size = data.material.size; + } + + if(data.material.minSize != null){ + target.minSize = data.material.minSize; + } + + if(data.material.pointSizeType != null){ + target.pointSizeType = PointSizeType[data.material.pointSizeType]; + } + + if(data.material.matcap != null){ + target.matcap = data.material.matcap; + } + + }else if(data.activeAttributeName != null){ + target.activeAttributeName = data.activeAttributeName; + }else { + // no material data + } + + }; + + const promise = new Promise((resolve) => { + + const names = viewer.scene.pointclouds.map(p => p.name); + const alreadyExists = names.includes(data.name); + + if(alreadyExists){ + resolve(); + return; + } + + Potree.loadPointCloud(data.url, data.name, (e) => { + const {pointcloud} = e; + + pointcloud.position.set(...data.position); + pointcloud.rotation.set(...data.rotation); + pointcloud.scale.set(...data.scale); + + loadMaterial(pointcloud.material); + + viewer.scene.addPointCloud(pointcloud); + + resolve(pointcloud); + }); + }); + + return promise; + } + + function loadMeasurement(viewer, data){ + + const duplicate = viewer.scene.measurements.find(measure => measure.uuid === data.uuid); + if(duplicate){ + return; + } + + const measure = new Measure(); + + measure.uuid = data.uuid; + measure.name = data.name; + measure.showDistances = data.showDistances; + measure.showCoordinates = data.showCoordinates; + measure.showArea = data.showArea; + measure.closed = data.closed; + measure.showAngles = data.showAngles; + measure.showHeight = data.showHeight; + measure.showCircle = data.showCircle; + measure.showAzimuth = data.showAzimuth; + measure.showEdges = data.showEdges; + // color + + for(const point of data.points){ + const pos = new Vector3(...point); + measure.addMarker(pos); + } + + viewer.scene.addMeasurement(measure); + + } + + function loadVolume(viewer, data){ + + const duplicate = viewer.scene.volumes.find(volume => volume.uuid === data.uuid); + if(duplicate){ + return; + } + + let volume = new Potree[data.type]; + + volume.uuid = data.uuid; + volume.name = data.name; + volume.position.set(...data.position); + volume.rotation.set(...data.rotation); + volume.scale.set(...data.scale); + volume.visible = data.visible; + volume.clip = data.clip; + + viewer.scene.addVolume(volume); + } + + function loadCameraAnimation(viewer, data){ + + const duplicate = viewer.scene.cameraAnimations.find(a => a.uuid === data.uuid); + if(duplicate){ + return; + } + + const animation = new CameraAnimation(viewer); + + animation.uuid = data.uuid; + animation.name = data.name; + animation.duration = data.duration; + animation.t = data.t; + animation.curveType = data.curveType; + animation.visible = data.visible; + animation.controlPoints = []; + + for(const cpdata of data.controlPoints){ + const cp = animation.createControlPoint(); + + cp.position.set(...cpdata.position); + cp.target.set(...cpdata.target); + } + + viewer.scene.addCameraAnimation(animation); + } + + function loadOrientedImages(viewer, images){ + + const {cameraParamsPath, imageParamsPath} = images; + + const duplicate = viewer.scene.orientedImages.find(i => i.imageParamsPath === imageParamsPath); + if(duplicate){ + return; + } + + Potree.OrientedImageLoader.load(cameraParamsPath, imageParamsPath, viewer).then( images => { + viewer.scene.addOrientedImages(images); + }); + + } + + function loadGeopackage(viewer, geopackage){ + + const path = geopackage.path; + + const duplicate = viewer.scene.geopackages.find(i => i.path === path); + if(duplicate){ + return; + } + + const projection = viewer.getProjection(); + + proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"); + proj4.defs("pointcloud", projection); + const transform = proj4("WGS84", "pointcloud"); + const params = { + transform: transform, + }; + + Potree.GeoPackageLoader.loadUrl(path, params).then(data => { + viewer.scene.addGeopackage(data); + }); + + + } + + function loadSettings(viewer, data){ + if(!data){ + return; + } + + viewer.setPointBudget(data.pointBudget); + viewer.setFOV(data.fov); + viewer.setEDLEnabled(data.edlEnabled); + viewer.setEDLRadius(data.edlRadius); + viewer.setEDLStrength(data.edlStrength); + viewer.setBackground(data.background); + viewer.setMinNodeSize(data.minNodeSize); + viewer.setShowBoundingBox(data.showBoundingBoxes); + } + + function loadView(viewer, view){ + viewer.scene.view.position.set(...view.position); + viewer.scene.view.lookAt(...view.target); + } + + function loadAnnotationItem(item){ + + const annotation = new Annotation({ + position: item.position, + title: item.title, + cameraPosition: item.cameraPosition, + cameraTarget: item.cameraTarget, + }); + + + annotation.description = item.description; + annotation.uuid = item.uuid; + + if(item.offset){ + annotation.offset.set(...item.offset); + } + + return annotation; + } + + function loadAnnotations(viewer, data){ + + if(!data){ + return; + } + + const findDuplicate = (item) => { + + let duplicate = null; + + viewer.scene.annotations.traverse( a => { + if(a.uuid === item.uuid){ + duplicate = a; + } + }); + + return duplicate; + }; + + const traverse = (item, parent) => { + + const duplicate = findDuplicate(item); + if(duplicate){ + return; + } + + const annotation = loadAnnotationItem(item); + + for(const childItem of item.children){ + traverse(childItem, annotation); + } + + parent.add(annotation); + + }; + + for(const item of data){ + traverse(item, viewer.scene.annotations); + } + + } + + function loadProfile(viewer, data){ + + const {name, points} = data; + + const duplicate = viewer.scene.profiles.find(profile => profile.uuid === data.uuid); + if(duplicate){ + return; + } + + let profile = new Potree.Profile(); + profile.name = name; + profile.uuid = data.uuid; + + profile.setWidth(data.width); + + for(const point of points){ + profile.addMarker(new Vector3(...point)); + } + + viewer.scene.addProfile(profile); + } + + function loadClassification(viewer, data){ + if(!data){ + return; + } + + const classifications = data; + + viewer.setClassifications(classifications); + } + + async function loadProject(viewer, data){ + + if(data.type !== "Potree"){ + console.error("not a valid Potree project"); + return; + } + + loadSettings(viewer, data.settings); + + loadView(viewer, data.view); + + const pointcloudPromises = []; + for(const pointcloud of data.pointclouds){ + const promise = loadPointCloud(viewer, pointcloud); + pointcloudPromises.push(promise); + } + + for(const measure of data.measurements){ + loadMeasurement(viewer, measure); + } + + for(const volume of data.volumes){ + loadVolume(viewer, volume); + } + + for(const animation of data.cameraAnimations){ + loadCameraAnimation(viewer, animation); + } + + for(const profile of data.profiles){ + loadProfile(viewer, profile); + } + + if(data.orientedImages){ + for(const images of data.orientedImages){ + loadOrientedImages(viewer, images); + } + } + + loadAnnotations(viewer, data.annotations); + + loadClassification(viewer, data.classification); + + // need to load at least one point cloud that defines the scene projection, + // before we can load stuff in other projections such as geopackages + //await Promise.any(pointcloudPromises); // (not yet supported) + Utils.waitAny(pointcloudPromises).then( () => { + if(data.geopackages){ + for(const geopackage of data.geopackages){ + loadGeopackage(viewer, geopackage); + } + } + }); + + await Promise.all(pointcloudPromises); + } + + // + // Algorithm by Christian Boucheny + // shader code taken and adapted from CloudCompare + // + // see + // https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL + // http://www.kitware.com/source/home/post/9 + // https://tel.archives-ouvertes.fr/tel-00438464/document p. 115+ (french) + + class EyeDomeLightingMaterial extends RawShaderMaterial{ + + constructor(parameters = {}){ + super(); + + let uniforms = { + screenWidth: { type: 'f', value: 0 }, + screenHeight: { type: 'f', value: 0 }, + edlStrength: { type: 'f', value: 1.0 }, + uNear: { type: 'f', value: 1.0 }, + uFar: { type: 'f', value: 1.0 }, + radius: { type: 'f', value: 1.0 }, + neighbours: { type: '2fv', value: [] }, + depthMap: { type: 't', value: null }, + uEDLColor: { type: 't', value: null }, + uEDLDepth: { type: 't', value: null }, + opacity: { type: 'f', value: 1.0 }, + uProj: { type: "Matrix4fv", value: [] }, + }; + + this.setValues({ + uniforms: uniforms, + vertexShader: this.getDefines() + Shaders['edl.vs'], + fragmentShader: this.getDefines() + Shaders['edl.fs'], + lights: false + }); + + this.neighbourCount = 8; + } + + getDefines() { + let defines = ''; + + defines += '#define NEIGHBOUR_COUNT ' + this.neighbourCount + '\n'; + + return defines; + } + + updateShaderSource() { + + let vs = this.getDefines() + Shaders['edl.vs']; + let fs = this.getDefines() + Shaders['edl.fs']; + + this.setValues({ + vertexShader: vs, + fragmentShader: fs + }); + + this.uniforms.neighbours.value = this.neighbours; + + this.needsUpdate = true; + } + + get neighbourCount(){ + return this._neighbourCount; + } + + set neighbourCount(value){ + if (this._neighbourCount !== value) { + this._neighbourCount = value; + this.neighbours = new Float32Array(this._neighbourCount * 2); + for (let c = 0; c < this._neighbourCount; c++) { + this.neighbours[2 * c + 0] = Math.cos(2 * c * Math.PI / this._neighbourCount); + this.neighbours[2 * c + 1] = Math.sin(2 * c * Math.PI / this._neighbourCount); + } + + this.updateShaderSource(); + } + } + + + } + + class NormalizationEDLMaterial extends RawShaderMaterial{ + + constructor(parameters = {}){ + super(); + + let uniforms = { + screenWidth: { type: 'f', value: 0 }, + screenHeight: { type: 'f', value: 0 }, + edlStrength: { type: 'f', value: 1.0 }, + radius: { type: 'f', value: 1.0 }, + neighbours: { type: '2fv', value: [] }, + uEDLMap: { type: 't', value: null }, + uDepthMap: { type: 't', value: null }, + uWeightMap: { type: 't', value: null }, + }; + + this.setValues({ + uniforms: uniforms, + vertexShader: this.getDefines() + Shaders['normalize.vs'], + fragmentShader: this.getDefines() + Shaders['normalize_and_edl.fs'], + }); + + this.neighbourCount = 8; + } + + getDefines() { + let defines = ''; + + defines += '#define NEIGHBOUR_COUNT ' + this.neighbourCount + '\n'; + + return defines; + } + + updateShaderSource() { + + let vs = this.getDefines() + Shaders['normalize.vs']; + let fs = this.getDefines() + Shaders['normalize_and_edl.fs']; + + this.setValues({ + vertexShader: vs, + fragmentShader: fs + }); + + this.uniforms.neighbours.value = this.neighbours; + + this.needsUpdate = true; + } + + get neighbourCount(){ + return this._neighbourCount; + } + + set neighbourCount(value){ + if (this._neighbourCount !== value) { + this._neighbourCount = value; + this.neighbours = new Float32Array(this._neighbourCount * 2); + for (let c = 0; c < this._neighbourCount; c++) { + this.neighbours[2 * c + 0] = Math.cos(2 * c * Math.PI / this._neighbourCount); + this.neighbours[2 * c + 1] = Math.sin(2 * c * Math.PI / this._neighbourCount); + } + + this.updateShaderSource(); + } + } + + } + + class NormalizationMaterial extends RawShaderMaterial{ + + constructor(parameters = {}){ + super(); + + let uniforms = { + uDepthMap: { type: 't', value: null }, + uWeightMap: { type: 't', value: null }, + }; + + this.setValues({ + uniforms: uniforms, + vertexShader: this.getDefines() + Shaders['normalize.vs'], + fragmentShader: this.getDefines() + Shaders['normalize.fs'], + }); + } + + getDefines() { + let defines = ''; + + return defines; + } + + updateShaderSource() { + + let vs = this.getDefines() + Shaders['normalize.vs']; + let fs = this.getDefines() + Shaders['normalize.fs']; + + this.setValues({ + vertexShader: vs, + fragmentShader: fs + }); + + this.needsUpdate = true; + } + + } + + /** + * laslaz code taken and adapted from plas.io js-laslaz + * http://plas.io/ + * https://github.com/verma/plasio + * + * Thanks to Uday Verma and Howard Butler + * + */ + + class LasLazLoader { + + constructor (version, extension) { + if (typeof (version) === 'string') { + this.version = new Version(version); + } else { + this.version = version; + } + + this.extension = extension; + } + + static progressCB () { + + } + + load (node) { + if (node.loaded) { + return; + } + + let url = node.getURL(); + + if (this.version.equalOrHigher('1.4')) { + url += `.${this.extension}`; + } + + let xhr = XHRFactory.createXMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + xhr.onreadystatechange = () => { + if (xhr.readyState === 4) { + if (xhr.status === 200 || xhr.status === 0) { + let buffer = xhr.response; + this.parse(node, buffer); + } else { + console.log('Failed to load file! HTTP status: ' + xhr.status + ', file: ' + url); + } + } + }; + + xhr.send(null); + } + + async parse(node, buffer){ + let lf = new LASFile(buffer); + let handler = new LasLazBatcher(node); + + try{ + await lf.open(); + lf.isOpen = true; + }catch(e){ + console.log("failed to open file. :("); + + return; + } + + let header = await lf.getHeader(); + + let skip = 1; + let totalRead = 0; + let totalToRead = (skip <= 1 ? header.pointsCount : header.pointsCount / skip); + + let hasMoreData = true; + + while(hasMoreData){ + let data = await lf.readData(1000 * 1000, 0, skip); + + handler.push(new LASDecoder(data.buffer, + header.pointsFormatId, + header.pointsStructSize, + data.count, + header.scale, + header.offset, + header.mins, header.maxs)); + + totalRead += data.count; + LasLazLoader.progressCB(totalRead / totalToRead); + + hasMoreData = data.hasMoreData; + } + + header.totalRead = totalRead; + header.versionAsString = lf.versionAsString; + header.isCompressed = lf.isCompressed; + + LasLazLoader.progressCB(1); + + try{ + await lf.close(); + + lf.isOpen = false; + }catch(e){ + console.error("failed to close las/laz file!!!"); + + throw e; + } + } + + handle (node, url) { + + } + }; + + class LasLazBatcher{ + + constructor (node) { + this.node = node; + } + + push (lasBuffer) { + const workerPath = Potree.scriptPath + '/workers/LASDecoderWorker.js'; + const worker = Potree.workerPool.getWorker(workerPath); + const node = this.node; + const pointAttributes = node.pcoGeometry.pointAttributes; + + worker.onmessage = (e) => { + let geometry = new BufferGeometry(); + let numPoints = lasBuffer.pointsCount; + + let positions = new Float32Array(e.data.position); + let colors = new Uint8Array(e.data.color); + let intensities = new Float32Array(e.data.intensity); + let classifications = new Uint8Array(e.data.classification); + let returnNumbers = new Uint8Array(e.data.returnNumber); + let numberOfReturns = new Uint8Array(e.data.numberOfReturns); + let pointSourceIDs = new Uint16Array(e.data.pointSourceID); + let indices = new Uint8Array(e.data.indices); + + geometry.setAttribute('position', new BufferAttribute(positions, 3)); + geometry.setAttribute('color', new BufferAttribute(colors, 4, true)); + geometry.setAttribute('intensity', new BufferAttribute(intensities, 1)); + geometry.setAttribute('classification', new BufferAttribute(classifications, 1)); + geometry.setAttribute('return number', new BufferAttribute(returnNumbers, 1)); + geometry.setAttribute('number of returns', new BufferAttribute(numberOfReturns, 1)); + geometry.setAttribute('source id', new BufferAttribute(pointSourceIDs, 1)); + geometry.setAttribute('indices', new BufferAttribute(indices, 4)); + geometry.attributes.indices.normalized = true; + + for(const key in e.data.ranges){ + const range = e.data.ranges[key]; + + const attribute = pointAttributes.attributes.find(a => a.name === key); + attribute.range[0] = Math.min(attribute.range[0], range[0]); + attribute.range[1] = Math.max(attribute.range[1], range[1]); + } + + let tightBoundingBox = new Box3( + new Vector3().fromArray(e.data.tightBoundingBox.min), + new Vector3().fromArray(e.data.tightBoundingBox.max) + ); + + geometry.boundingBox = this.node.boundingBox; + this.node.tightBoundingBox = tightBoundingBox; + + this.node.geometry = geometry; + this.node.numPoints = numPoints; + this.node.loaded = true; + this.node.loading = false; + Potree.numNodesLoading--; + this.node.mean = new Vector3(...e.data.mean); + + Potree.workerPool.returnWorker(workerPath, worker); + }; + + let message = { + buffer: lasBuffer.arrayb, + numPoints: lasBuffer.pointsCount, + pointSize: lasBuffer.pointSize, + pointFormatID: 2, + scale: lasBuffer.scale, + offset: lasBuffer.offset, + mins: lasBuffer.mins, + maxs: lasBuffer.maxs + }; + worker.postMessage(message, [message.buffer]); + }; + } + + class BinaryLoader{ + + constructor(version, boundingBox, scale){ + if (typeof (version) === 'string') { + this.version = new Version(version); + } else { + this.version = version; + } + + this.boundingBox = boundingBox; + this.scale = scale; + } + + load(node){ + if (node.loaded) { + return; + } + + let url = node.getURL(); + + if (this.version.equalOrHigher('1.4')) { + url += '.bin'; + } + + let xhr = XHRFactory.createXMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + xhr.onreadystatechange = () => { + if (xhr.readyState === 4) { + if((xhr.status === 200 || xhr.status === 0) && xhr.response !== null){ + let buffer = xhr.response; + this.parse(node, buffer); + } else { + //console.error(`Failed to load file! HTTP status: ${xhr.status}, file: ${url}`); + throw new Error(`Failed to load file! HTTP status: ${xhr.status}, file: ${url}`); + } + } + }; + + try { + xhr.send(null); + } catch (e) { + console.log('fehler beim laden der punktwolke: ' + e); + } + }; + + parse(node, buffer){ + let pointAttributes = node.pcoGeometry.pointAttributes; + let numPoints = buffer.byteLength / node.pcoGeometry.pointAttributes.byteSize; + + if (this.version.upTo('1.5')) { + node.numPoints = numPoints; + } + + let workerPath = Potree.scriptPath + '/workers/BinaryDecoderWorker.js'; + let worker = Potree.workerPool.getWorker(workerPath); + + worker.onmessage = function (e) { + + let data = e.data; + let buffers = data.attributeBuffers; + let tightBoundingBox = new Box3( + new Vector3().fromArray(data.tightBoundingBox.min), + new Vector3().fromArray(data.tightBoundingBox.max) + ); + + Potree.workerPool.returnWorker(workerPath, worker); + + let geometry = new BufferGeometry(); + + for(let property in buffers){ + let buffer = buffers[property].buffer; + let batchAttribute = buffers[property].attribute; + + if (property === "POSITION_CARTESIAN") { + geometry.setAttribute('position', new BufferAttribute(new Float32Array(buffer), 3)); + } else if (property === "rgba") { + geometry.setAttribute("rgba", new BufferAttribute(new Uint8Array(buffer), 4, true)); + } else if (property === "NORMAL_SPHEREMAPPED") { + geometry.setAttribute('normal', new BufferAttribute(new Float32Array(buffer), 3)); + } else if (property === "NORMAL_OCT16") { + geometry.setAttribute('normal', new BufferAttribute(new Float32Array(buffer), 3)); + } else if (property === "NORMAL") { + geometry.setAttribute('normal', new BufferAttribute(new Float32Array(buffer), 3)); + } else if (property === "INDICES") { + let bufferAttribute = new BufferAttribute(new Uint8Array(buffer), 4); + bufferAttribute.normalized = true; + geometry.setAttribute('indices', bufferAttribute); + } else if (property === "SPACING") { + let bufferAttribute = new BufferAttribute(new Float32Array(buffer), 1); + geometry.setAttribute('spacing', bufferAttribute); + } else { + const bufferAttribute = new BufferAttribute(new Float32Array(buffer), 1); + + bufferAttribute.potree = { + offset: buffers[property].offset, + scale: buffers[property].scale, + preciseBuffer: buffers[property].preciseBuffer, + range: batchAttribute.range, + }; + + geometry.setAttribute(property, bufferAttribute); + + const attribute = pointAttributes.attributes.find(a => a.name === batchAttribute.name); + attribute.range[0] = Math.min(attribute.range[0], batchAttribute.range[0]); + attribute.range[1] = Math.max(attribute.range[1], batchAttribute.range[1]); + + if(node.getLevel() === 0){ + attribute.initialRange = batchAttribute.range; + } + + } + } + + tightBoundingBox.max.sub(tightBoundingBox.min); + tightBoundingBox.min.set(0, 0, 0); + + let numPoints = e.data.buffer.byteLength / pointAttributes.byteSize; + + node.numPoints = numPoints; + node.geometry = geometry; + node.mean = new Vector3(...data.mean); + node.tightBoundingBox = tightBoundingBox; + node.loaded = true; + node.loading = false; + node.estimatedSpacing = data.estimatedSpacing; + Potree.numNodesLoading--; + }; + + let message = { + buffer: buffer, + pointAttributes: pointAttributes, + version: this.version.version, + min: [ node.boundingBox.min.x, node.boundingBox.min.y, node.boundingBox.min.z ], + offset: [node.pcoGeometry.offset.x, node.pcoGeometry.offset.y, node.pcoGeometry.offset.z], + scale: this.scale, + spacing: node.spacing, + hasChildren: node.hasChildren, + name: node.name + }; + worker.postMessage(message, [message.buffer]); + }; + + + } + + function parseAttributes(cloudjs){ + + let version = new Version(cloudjs.version); + + const replacements = { + "COLOR_PACKED": "rgba", + "RGBA": "rgba", + "INTENSITY": "intensity", + "CLASSIFICATION": "classification", + "GPS_TIME": "gps-time", + }; + + const replaceOldNames = (old) => { + if(replacements[old]){ + return replacements[old]; + }else { + return old; + } + }; + + const pointAttributes = []; + if(version.upTo('1.7')){ + + for(let attributeName of cloudjs.pointAttributes){ + const oldAttribute = PointAttribute[attributeName]; + + const attribute = { + name: oldAttribute.name, + size: oldAttribute.byteSize, + elements: oldAttribute.numElements, + elementSize: oldAttribute.byteSize / oldAttribute.numElements, + type: oldAttribute.type.name, + description: "", + }; + + pointAttributes.push(attribute); + } + + }else { + pointAttributes.push(...cloudjs.pointAttributes); + } + + + { + const attributes = new PointAttributes(); + + const typeConversion = { + int8: PointAttributeTypes.DATA_TYPE_INT8, + int16: PointAttributeTypes.DATA_TYPE_INT16, + int32: PointAttributeTypes.DATA_TYPE_INT32, + int64: PointAttributeTypes.DATA_TYPE_INT64, + uint8: PointAttributeTypes.DATA_TYPE_UINT8, + uint16: PointAttributeTypes.DATA_TYPE_UINT16, + uint32: PointAttributeTypes.DATA_TYPE_UINT32, + uint64: PointAttributeTypes.DATA_TYPE_UINT64, + double: PointAttributeTypes.DATA_TYPE_DOUBLE, + float: PointAttributeTypes.DATA_TYPE_FLOAT, + }; + + for(const jsAttribute of pointAttributes){ + const name = replaceOldNames(jsAttribute.name); + const type = typeConversion[jsAttribute.type]; + const numElements = jsAttribute.elements; + const description = jsAttribute.description; + + const attribute = new PointAttribute(name, type, numElements); + + attributes.add(attribute); + } + + { + // check if it has normals + let hasNormals = + pointAttributes.find(a => a.name === "NormalX") !== undefined && + pointAttributes.find(a => a.name === "NormalY") !== undefined && + pointAttributes.find(a => a.name === "NormalZ") !== undefined; + + if(hasNormals){ + let vector = { + name: "NORMAL", + attributes: ["NormalX", "NormalY", "NormalZ"], + }; + attributes.addVector(vector); + } + } + + return attributes; + } + + } + + function lasLazAttributes(fMno){ + const attributes = new PointAttributes(); + + attributes.add(PointAttribute.POSITION_CARTESIAN); + attributes.add(new PointAttribute("rgba", PointAttributeTypes.DATA_TYPE_UINT8, 4)); + attributes.add(new PointAttribute("intensity", PointAttributeTypes.DATA_TYPE_UINT16, 1)); + attributes.add(new PointAttribute("classification", PointAttributeTypes.DATA_TYPE_UINT8, 1)); + attributes.add(new PointAttribute("gps-time", PointAttributeTypes.DATA_TYPE_DOUBLE, 1)); + attributes.add(new PointAttribute("number of returns", PointAttributeTypes.DATA_TYPE_UINT8, 1)); + attributes.add(new PointAttribute("return number", PointAttributeTypes.DATA_TYPE_UINT8, 1)); + attributes.add(new PointAttribute("source id", PointAttributeTypes.DATA_TYPE_UINT16, 1)); + //attributes.add(new PointAttribute("pointSourceID", PointAttributeTypes.DATA_TYPE_INT8, 4)); + + + return attributes; + } + + class POCLoader { + + static load(url, callback){ + try { + let pco = new PointCloudOctreeGeometry(); + pco.url = url; + let xhr = XHRFactory.createXMLHttpRequest(); + xhr.open('GET', url, true); + + xhr.onreadystatechange = function () { + if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 0)) { + let fMno = JSON.parse(xhr.responseText); + + let version = new Version(fMno.version); + + // assume octreeDir is absolute if it starts with http + if (fMno.octreeDir.indexOf('http') === 0) { + pco.octreeDir = fMno.octreeDir; + } else { + pco.octreeDir = url + '/../' + fMno.octreeDir; + } + + pco.spacing = fMno.spacing; + pco.hierarchyStepSize = fMno.hierarchyStepSize; + + pco.pointAttributes = fMno.pointAttributes; + + let min = new Vector3(fMno.boundingBox.lx, fMno.boundingBox.ly, fMno.boundingBox.lz); + let max = new Vector3(fMno.boundingBox.ux, fMno.boundingBox.uy, fMno.boundingBox.uz); + let boundingBox = new Box3(min, max); + let tightBoundingBox = boundingBox.clone(); + + if (fMno.tightBoundingBox) { + tightBoundingBox.min.copy(new Vector3(fMno.tightBoundingBox.lx, fMno.tightBoundingBox.ly, fMno.tightBoundingBox.lz)); + tightBoundingBox.max.copy(new Vector3(fMno.tightBoundingBox.ux, fMno.tightBoundingBox.uy, fMno.tightBoundingBox.uz)); + } + + let offset = min.clone(); + + boundingBox.min.sub(offset); + boundingBox.max.sub(offset); + + tightBoundingBox.min.sub(offset); + tightBoundingBox.max.sub(offset); + + pco.projection = fMno.projection; + pco.boundingBox = boundingBox; + pco.tightBoundingBox = tightBoundingBox; + pco.boundingSphere = boundingBox.getBoundingSphere(new Sphere()); + pco.tightBoundingSphere = tightBoundingBox.getBoundingSphere(new Sphere()); + pco.offset = offset; + if (fMno.pointAttributes === 'LAS') { + pco.loader = new LasLazLoader(fMno.version, "las"); + pco.pointAttributes = lasLazAttributes(fMno); + } else if (fMno.pointAttributes === 'LAZ') { + pco.loader = new LasLazLoader(fMno.version, "laz"); + pco.pointAttributes = lasLazAttributes(fMno); + } else { + pco.loader = new BinaryLoader(fMno.version, boundingBox, fMno.scale); + pco.pointAttributes = parseAttributes(fMno); + } + + let nodes = {}; + + { // load root + let name = 'r'; + + let root = new PointCloudOctreeGeometryNode(name, pco, boundingBox); + root.level = 0; + root.hasChildren = true; + root.spacing = pco.spacing; + if (version.upTo('1.5')) { + root.numPoints = fMno.hierarchy[0][1]; + } else { + root.numPoints = 0; + } + pco.root = root; + pco.root.load(); + nodes[name] = root; + } + + // load remaining hierarchy + if (version.upTo('1.4')) { + for (let i = 1; i < fMno.hierarchy.length; i++) { + let name = fMno.hierarchy[i][0]; + let numPoints = fMno.hierarchy[i][1]; + let index = parseInt(name.charAt(name.length - 1)); + let parentName = name.substring(0, name.length - 1); + let parentNode = nodes[parentName]; + let level = name.length - 1; + //let boundingBox = POCLoader.createChildAABB(parentNode.boundingBox, index); + let boundingBox = Utils.createChildAABB(parentNode.boundingBox, index); + + let node = new PointCloudOctreeGeometryNode(name, pco, boundingBox); + node.level = level; + node.numPoints = numPoints; + node.spacing = pco.spacing / Math.pow(2, level); + parentNode.addChild(node); + nodes[name] = node; + } + } + + pco.nodes = nodes; + + callback(pco); + } + }; + + xhr.send(null); + } catch (e) { + console.log("loading failed: '" + url + "'"); + console.log(e); + + callback(); + } + } + + loadPointAttributes(mno){ + let fpa = mno.pointAttributes; + let pa = new PointAttributes(); + + for (let i = 0; i < fpa.length; i++) { + let pointAttribute = PointAttribute[fpa[i]]; + pa.add(pointAttribute); + } + + return pa; + } + + createChildAABB(aabb, index){ + let min = aabb.min.clone(); + let max = aabb.max.clone(); + let size = new Vector3().subVectors(max, min); + + if ((index & 0b0001) > 0) { + min.z += size.z / 2; + } else { + max.z -= size.z / 2; + } + + if ((index & 0b0010) > 0) { + min.y += size.y / 2; + } else { + max.y -= size.y / 2; + } + + if ((index & 0b0100) > 0) { + min.x += size.x / 2; + } else { + max.x -= size.x / 2; + } + + return new Box3(min, max); + } + } + + class OctreeGeometry{ + + constructor(){ + this.url = null; + this.spacing = 0; + this.boundingBox = null; + this.root = null; + this.pointAttributes = null; + this.loader = null; + } + + }; + + class OctreeGeometryNode{ + + constructor(name, octreeGeometry, boundingBox){ + this.id = OctreeGeometryNode.IDCount++; + this.name = name; + this.index = parseInt(name.charAt(name.length - 1)); + this.octreeGeometry = octreeGeometry; + this.boundingBox = boundingBox; + this.boundingSphere = boundingBox.getBoundingSphere(new Sphere()); + this.children = {}; + this.numPoints = 0; + this.level = null; + this.oneTimeDisposeHandlers = []; + } + + isGeometryNode(){ + return true; + } + + getLevel(){ + return this.level; + } + + isTreeNode(){ + return false; + } + + isLoaded(){ + return this.loaded; + } + + getBoundingSphere(){ + return this.boundingSphere; + } + + getBoundingBox(){ + return this.boundingBox; + } + + getChildren(){ + let children = []; + + for (let i = 0; i < 8; i++) { + if (this.children[i]) { + children.push(this.children[i]); + } + } + + return children; + } + + getBoundingBox(){ + return this.boundingBox; + } + + load(){ + + if (Potree.numNodesLoading >= Potree.maxNodesLoading) { + return; + } + + this.octreeGeometry.loader.load(this); + } + + getNumPoints(){ + return this.numPoints; + } + + dispose(){ + if (this.geometry && this.parent != null) { + this.geometry.dispose(); + this.geometry = null; + this.loaded = false; + + // this.dispatchEvent( { type: 'dispose' } ); + for (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) { + let handler = this.oneTimeDisposeHandlers[i]; + handler(); + } + this.oneTimeDisposeHandlers = []; + } + } + + }; + + OctreeGeometryNode.IDCount = 0; + + // let loadedNodes = new Set(); + + class NodeLoader{ + + constructor(url){ + this.url = url; + } + + async load(node){ + + if(node.loaded || node.loading){ + return; + } + + node.loading = true; + Potree.numNodesLoading++; + + // console.log(node.name, node.numPoints); + + // if(loadedNodes.has(node.name)){ + // // debugger; + // } + // loadedNodes.add(node.name); + + try{ + if(node.nodeType === 2){ + await this.loadHierarchy(node); + } + + let {byteOffset, byteSize} = node; + + + let urlOctree = `${this.url}/../octree.bin`; + + let first = byteOffset; + let last = byteOffset + byteSize - 1n; + + let buffer; + + if(byteSize === 0n){ + buffer = new ArrayBuffer(0); + console.warn(`loaded node with 0 bytes: ${node.name}`); + }else { + let response = await fetch(urlOctree, { + headers: { + 'content-type': 'multipart/byteranges', + 'Range': `bytes=${first}-${last}`, + }, + }); + + buffer = await response.arrayBuffer(); + } + + let workerPath; + if(this.metadata.encoding === "BROTLI"){ + workerPath = Potree.scriptPath + '/workers/2.0/DecoderWorker_brotli.js'; + }else { + workerPath = Potree.scriptPath + '/workers/2.0/DecoderWorker.js'; + } + + let worker = Potree.workerPool.getWorker(workerPath); + + worker.onmessage = function (e) { + + let data = e.data; + let buffers = data.attributeBuffers; + + Potree.workerPool.returnWorker(workerPath, worker); + + let geometry = new BufferGeometry(); + + for(let property in buffers){ + + let buffer = buffers[property].buffer; + + if(property === "position"){ + geometry.setAttribute('position', new BufferAttribute(new Float32Array(buffer), 3)); + }else if(property === "rgba"){ + geometry.setAttribute('rgba', new BufferAttribute(new Uint8Array(buffer), 4, true)); + }else if(property === "NORMAL"){ + //geometry.setAttribute('rgba', new THREE.BufferAttribute(new Uint8Array(buffer), 4, true)); + geometry.setAttribute('normal', new BufferAttribute(new Float32Array(buffer), 3)); + }else if (property === "INDICES") { + let bufferAttribute = new BufferAttribute(new Uint8Array(buffer), 4); + bufferAttribute.normalized = true; + geometry.setAttribute('indices', bufferAttribute); + }else { + const bufferAttribute = new BufferAttribute(new Float32Array(buffer), 1); + + let batchAttribute = buffers[property].attribute; + bufferAttribute.potree = { + offset: buffers[property].offset, + scale: buffers[property].scale, + preciseBuffer: buffers[property].preciseBuffer, + range: batchAttribute.range, + }; + + geometry.setAttribute(property, bufferAttribute); + } + + } + // indices ?? + + node.density = data.density; + node.geometry = geometry; + node.loaded = true; + node.loading = false; + Potree.numNodesLoading--; + }; + + let pointAttributes = node.octreeGeometry.pointAttributes; + let scale = node.octreeGeometry.scale; + + let box = node.boundingBox; + let min = node.octreeGeometry.offset.clone().add(box.min); + let size = box.max.clone().sub(box.min); + let max = min.clone().add(size); + let numPoints = node.numPoints; + + let offset = node.octreeGeometry.loader.offset; + + let message = { + name: node.name, + buffer: buffer, + pointAttributes: pointAttributes, + scale: scale, + min: min, + max: max, + size: size, + offset: offset, + numPoints: numPoints + }; + + worker.postMessage(message, [message.buffer]); + }catch(e){ + node.loaded = false; + node.loading = false; + Potree.numNodesLoading--; + + console.log(`failed to load ${node.name}`); + console.log(e); + console.log(`trying again!`); + } + } + + parseHierarchy(node, buffer){ + + let view = new DataView(buffer); + let tStart = performance.now(); + + let bytesPerNode = 22; + let numNodes = buffer.byteLength / bytesPerNode; + + let octree = node.octreeGeometry; + // let nodes = [node]; + let nodes = new Array(numNodes); + nodes[0] = node; + let nodePos = 1; + + for(let i = 0; i < numNodes; i++){ + let current = nodes[i]; + + let type = view.getUint8(i * bytesPerNode + 0); + let childMask = view.getUint8(i * bytesPerNode + 1); + let numPoints = view.getUint32(i * bytesPerNode + 2, true); + let byteOffset = view.getBigInt64(i * bytesPerNode + 6, true); + let byteSize = view.getBigInt64(i * bytesPerNode + 14, true); + + // if(byteSize === 0n){ + // // debugger; + // } + + + if(current.nodeType === 2){ + // replace proxy with real node + current.byteOffset = byteOffset; + current.byteSize = byteSize; + current.numPoints = numPoints; + }else if(type === 2){ + // load proxy + current.hierarchyByteOffset = byteOffset; + current.hierarchyByteSize = byteSize; + current.numPoints = numPoints; + }else { + // load real node + current.byteOffset = byteOffset; + current.byteSize = byteSize; + current.numPoints = numPoints; + } + + current.nodeType = type; + + if(current.nodeType === 2){ + continue; + } + + for(let childIndex = 0; childIndex < 8; childIndex++){ + let childExists = ((1 << childIndex) & childMask) !== 0; + + if(!childExists){ + continue; + } + + let childName = current.name + childIndex; + + let childAABB = createChildAABB(current.boundingBox, childIndex); + let child = new OctreeGeometryNode(childName, octree, childAABB); + child.name = childName; + child.spacing = current.spacing / 2; + child.level = current.level + 1; + + current.children[childIndex] = child; + child.parent = current; + + // nodes.push(child); + nodes[nodePos] = child; + nodePos++; + } + + // if((i % 500) === 0){ + // yield; + // } + } + + let duration = (performance.now() - tStart); + + // if(duration > 20){ + // let msg = `duration: ${duration}ms, numNodes: ${numNodes}`; + // console.log(msg); + // } + } + + async loadHierarchy(node){ + + let {hierarchyByteOffset, hierarchyByteSize} = node; + let hierarchyPath = `${this.url}/../hierarchy.bin`; + + let first = hierarchyByteOffset; + let last = first + hierarchyByteSize - 1n; + + let response = await fetch(hierarchyPath, { + headers: { + 'content-type': 'multipart/byteranges', + 'Range': `bytes=${first}-${last}`, + }, + }); + + + + let buffer = await response.arrayBuffer(); + + this.parseHierarchy(node, buffer); + + // let promise = new Promise((resolve) => { + // let generator = this.parseHierarchy(node, buffer); + + // let repeatUntilDone = () => { + // let result = generator.next(); + + // if(result.done){ + // resolve(); + // }else{ + // requestAnimationFrame(repeatUntilDone); + // } + // }; + + // repeatUntilDone(); + // }); + + // await promise; + + + + + + } + + } + + let tmpVec3 = new Vector3(); + function createChildAABB(aabb, index){ + let min = aabb.min.clone(); + let max = aabb.max.clone(); + let size = tmpVec3.subVectors(max, min); + + if ((index & 0b0001) > 0) { + min.z += size.z / 2; + } else { + max.z -= size.z / 2; + } + + if ((index & 0b0010) > 0) { + min.y += size.y / 2; + } else { + max.y -= size.y / 2; + } + + if ((index & 0b0100) > 0) { + min.x += size.x / 2; + } else { + max.x -= size.x / 2; + } + + return new Box3(min, max); + } + + let typenameTypeattributeMap = { + "double": PointAttributeTypes.DATA_TYPE_DOUBLE, + "float": PointAttributeTypes.DATA_TYPE_FLOAT, + "int8": PointAttributeTypes.DATA_TYPE_INT8, + "uint8": PointAttributeTypes.DATA_TYPE_UINT8, + "int16": PointAttributeTypes.DATA_TYPE_INT16, + "uint16": PointAttributeTypes.DATA_TYPE_UINT16, + "int32": PointAttributeTypes.DATA_TYPE_INT32, + "uint32": PointAttributeTypes.DATA_TYPE_UINT32, + "int64": PointAttributeTypes.DATA_TYPE_INT64, + "uint64": PointAttributeTypes.DATA_TYPE_UINT64, + }; + + class OctreeLoader{ + + static parseAttributes(jsonAttributes){ + + let attributes = new PointAttributes(); + + let replacements = { + "rgb": "rgba", + }; + + for (const jsonAttribute of jsonAttributes) { + let {name, description, size, numElements, elementSize, min, max} = jsonAttribute; + + let type = typenameTypeattributeMap[jsonAttribute.type]; + + let potreeAttributeName = replacements[name] ? replacements[name] : name; + + let attribute = new PointAttribute(potreeAttributeName, type, numElements); + + if(numElements === 1){ + attribute.range = [min[0], max[0]]; + }else { + attribute.range = [min, max]; + } + + if (name === "gps-time") { // HACK: Guard against bad gpsTime range in metadata, see potree/potree#909 + if (attribute.range[0] === attribute.range[1]) { + attribute.range[1] += 1; + } + } + + attribute.initialRange = attribute.range; + + attributes.add(attribute); + } + + { + // check if it has normals + let hasNormals = + attributes.attributes.find(a => a.name === "NormalX") !== undefined && + attributes.attributes.find(a => a.name === "NormalY") !== undefined && + attributes.attributes.find(a => a.name === "NormalZ") !== undefined; + + if(hasNormals){ + let vector = { + name: "NORMAL", + attributes: ["NormalX", "NormalY", "NormalZ"], + }; + attributes.addVector(vector); + } + } + + return attributes; + } + + static async load(url){ + + let response = await fetch(url); + let metadata = await response.json(); + + let attributes = OctreeLoader.parseAttributes(metadata.attributes); + + let loader = new NodeLoader(url); + loader.metadata = metadata; + loader.attributes = attributes; + loader.scale = metadata.scale; + loader.offset = metadata.offset; + + let octree = new OctreeGeometry(); + octree.url = url; + octree.spacing = metadata.spacing; + octree.scale = metadata.scale; + + // let aPosition = metadata.attributes.find(a => a.name === "position"); + // octree + + let min = new Vector3(...metadata.boundingBox.min); + let max = new Vector3(...metadata.boundingBox.max); + let boundingBox = new Box3(min, max); + + let offset = min.clone(); + boundingBox.min.sub(offset); + boundingBox.max.sub(offset); + + octree.projection = metadata.projection; + octree.boundingBox = boundingBox; + octree.tightBoundingBox = boundingBox.clone(); + octree.boundingSphere = boundingBox.getBoundingSphere(new Sphere()); + octree.tightBoundingSphere = boundingBox.getBoundingSphere(new Sphere()); + octree.offset = offset; + octree.pointAttributes = OctreeLoader.parseAttributes(metadata.attributes); + octree.loader = loader; + + let root = new OctreeGeometryNode("r", octree, boundingBox); + root.level = 0; + root.nodeType = 2; + root.hierarchyByteOffset = 0n; + root.hierarchyByteSize = BigInt(metadata.hierarchy.firstChunkSize); + root.hasChildren = false; + root.spacing = octree.spacing; + root.byteOffset = 0; + + octree.root = root; + + loader.load(root); + + let result = { + geometry: octree, + }; + + return result; + + } + + }; + + /** + * @author Connor Manning + */ + + class EptLoader { + static async load(file, callback) { + + let response = await fetch(file); + let json = await response.json(); + + let url = file.substr(0, file.lastIndexOf('ept.json')); + let geometry = new Potree.PointCloudEptGeometry(url, json); + let root = new Potree.PointCloudEptGeometryNode(geometry); + + geometry.root = root; + geometry.root.load(); + + callback(geometry); + } + }; + + class EptBinaryLoader { + extension() { + return '.bin'; + } + + workerPath() { + return Potree.scriptPath + '/workers/EptBinaryDecoderWorker.js'; + } + + load(node) { + if (node.loaded) return; + + let url = node.url() + this.extension(); + + let xhr = XHRFactory.createXMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + xhr.onreadystatechange = () => { + if (xhr.readyState === 4) { + if (xhr.status === 200) { + let buffer = xhr.response; + this.parse(node, buffer); + } else { + console.log('Failed ' + url + ': ' + xhr.status); + } + } + }; + + try { + xhr.send(null); + } + catch (e) { + console.log('Failed request: ' + e); + } + } + + parse(node, buffer) { + let workerPath = this.workerPath(); + let worker = Potree.workerPool.getWorker(workerPath); + + worker.onmessage = function(e) { + let g = new BufferGeometry(); + let numPoints = e.data.numPoints; + + let position = new Float32Array(e.data.position); + g.setAttribute('position', new BufferAttribute(position, 3)); + + let indices = new Uint8Array(e.data.indices); + g.setAttribute('indices', new BufferAttribute(indices, 4)); + + if (e.data.color) { + let color = new Uint8Array(e.data.color); + g.setAttribute('color', new BufferAttribute(color, 4, true)); + } + if (e.data.intensity) { + let intensity = new Float32Array(e.data.intensity); + g.setAttribute('intensity', + new BufferAttribute(intensity, 1)); + } + if (e.data.classification) { + let classification = new Uint8Array(e.data.classification); + g.setAttribute('classification', + new BufferAttribute(classification, 1)); + } + if (e.data.returnNumber) { + let returnNumber = new Uint8Array(e.data.returnNumber); + g.setAttribute('return number', + new BufferAttribute(returnNumber, 1)); + } + if (e.data.numberOfReturns) { + let numberOfReturns = new Uint8Array(e.data.numberOfReturns); + g.setAttribute('number of returns', + new BufferAttribute(numberOfReturns, 1)); + } + if (e.data.pointSourceId) { + let pointSourceId = new Uint16Array(e.data.pointSourceId); + g.setAttribute('source id', + new BufferAttribute(pointSourceId, 1)); + } + + g.attributes.indices.normalized = true; + + let tightBoundingBox = new Box3( + new Vector3().fromArray(e.data.tightBoundingBox.min), + new Vector3().fromArray(e.data.tightBoundingBox.max) + ); + + node.doneLoading( + g, + tightBoundingBox, + numPoints, + new Vector3(...e.data.mean)); + + Potree.workerPool.returnWorker(workerPath, worker); + }; + + let toArray = (v) => [v.x, v.y, v.z]; + let message = { + buffer: buffer, + schema: node.ept.schema, + scale: node.ept.eptScale, + offset: node.ept.eptOffset, + mins: toArray(node.key.b.min) + }; + + worker.postMessage(message, [message.buffer]); + } + }; + + /** + * laslaz code taken and adapted from plas.io js-laslaz + * http://plas.io/ + * https://github.com/verma/plasio + * + * Thanks to Uday Verma and Howard Butler + * + */ + + class EptLaszipLoader { + load(node) { + if (node.loaded) return; + + let url = node.url() + '.laz'; + + let xhr = XHRFactory.createXMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + xhr.onreadystatechange = () => { + if (xhr.readyState === 4) { + if (xhr.status === 200) { + let buffer = xhr.response; + this.parse(node, buffer); + } else { + console.log('Failed ' + url + ': ' + xhr.status); + } + } + }; + + xhr.send(null); + } + + async parse(node, buffer){ + let lf = new LASFile(buffer); + let handler = new EptLazBatcher(node); + + try{ + await lf.open(); + + lf.isOpen = true; + + const header = await lf.getHeader(); + + { + let i = 0; + + let toArray = (v) => [v.x, v.y, v.z]; + let mins = toArray(node.key.b.min); + let maxs = toArray(node.key.b.max); + + let hasMoreData = true; + + while(hasMoreData){ + const data = await lf.readData(1000000, 0, 1); + + let d = new LASDecoder( + data.buffer, + header.pointsFormatId, + header.pointsStructSize, + data.count, + header.scale, + header.offset, + mins, + maxs); + + d.extraBytes = header.extraBytes; + d.pointsFormatId = header.pointsFormatId; + handler.push(d); + + i += data.count; + + hasMoreData = data.hasMoreData; + } + + header.totalRead = i; + header.versionAsString = lf.versionAsString; + header.isCompressed = lf.isCompressed; + + await lf.close(); + + lf.isOpen = false; + } + + }catch(err){ + console.error('Error reading LAZ:', err); + + if (lf.isOpen) { + await lf.close(); + + lf.isOpen = false; + } + + throw err; + } + } + }; + + class EptLazBatcher { + constructor(node) { this.node = node; } + + push(las) { + let workerPath = Potree.scriptPath + + '/workers/EptLaszipDecoderWorker.js'; + let worker = Potree.workerPool.getWorker(workerPath); + + worker.onmessage = (e) => { + let g = new BufferGeometry(); + let numPoints = las.pointsCount; + + let positions = new Float32Array(e.data.position); + let colors = new Uint8Array(e.data.color); + + let intensities = new Float32Array(e.data.intensity); + let classifications = new Uint8Array(e.data.classification); + let returnNumbers = new Uint8Array(e.data.returnNumber); + let numberOfReturns = new Uint8Array(e.data.numberOfReturns); + let pointSourceIDs = new Uint16Array(e.data.pointSourceID); + let indices = new Uint8Array(e.data.indices); + let gpsTime = new Float32Array(e.data.gpsTime); + + g.setAttribute('position', + new BufferAttribute(positions, 3)); + g.setAttribute('rgba', + new BufferAttribute(colors, 4, true)); + g.setAttribute('intensity', + new BufferAttribute(intensities, 1)); + g.setAttribute('classification', + new BufferAttribute(classifications, 1)); + g.setAttribute('return number', + new BufferAttribute(returnNumbers, 1)); + g.setAttribute('number of returns', + new BufferAttribute(numberOfReturns, 1)); + g.setAttribute('source id', + new BufferAttribute(pointSourceIDs, 1)); + g.setAttribute('indices', + new BufferAttribute(indices, 4)); + g.setAttribute('gpsTime', + new BufferAttribute(gpsTime, 1)); + this.node.gpsTime = e.data.gpsMeta; + + g.attributes.indices.normalized = true; + + let tightBoundingBox = new Box3( + new Vector3().fromArray(e.data.tightBoundingBox.min), + new Vector3().fromArray(e.data.tightBoundingBox.max) + ); + + this.node.doneLoading( + g, + tightBoundingBox, + numPoints, + new Vector3(...e.data.mean)); + + Potree.workerPool.returnWorker(workerPath, worker); + }; + + let message = { + buffer: las.arrayb, + numPoints: las.pointsCount, + pointSize: las.pointSize, + pointFormatID: las.pointsFormatId, + scale: las.scale, + offset: las.offset, + mins: las.mins, + maxs: las.maxs + }; + + worker.postMessage(message, [message.buffer]); + }; + }; + + class EptZstandardLoader extends EptBinaryLoader { + extension() { + return '.zst'; + } + + workerPath() { + return Potree.scriptPath + '/workers/EptZstandardDecoderWorker.js'; + } + }; + + class ShapefileLoader{ + + constructor(){ + this.transform = null; + } + + async load(path){ + + const matLine = new LineMaterial( { + color: 0xff0000, + linewidth: 3, // in pixels + resolution: new Vector2(1000, 1000), + dashed: false + } ); + + const features = await this.loadShapefileFeatures(path); + const node = new Object3D(); + + for(const feature of features){ + const fnode = this.featureToSceneNode(feature, matLine); + node.add(fnode); + } + + let setResolution = (x, y) => { + matLine.resolution.set(x, y); + }; + + const result = { + features: features, + node: node, + setResolution: setResolution, + }; + + return result; + } + + featureToSceneNode(feature, matLine){ + let geometry = feature.geometry; + + let color = new Color(1, 1, 1); + + let transform = this.transform; + if(transform === null){ + transform = {forward: (v) => v}; + } + + if(feature.geometry.type === "Point"){ + let sg = new SphereGeometry(1, 18, 18); + let sm = new MeshNormalMaterial(); + let s = new Mesh(sg, sm); + + let [long, lat] = geometry.coordinates; + let pos = transform.forward([long, lat]); + + s.position.set(...pos, 20); + + s.scale.set(10, 10, 10); + + return s; + }else if(geometry.type === "LineString"){ + let coordinates = []; + + let min = new Vector3(Infinity, Infinity, Infinity); + for(let i = 0; i < geometry.coordinates.length; i++){ + let [long, lat] = geometry.coordinates[i]; + let pos = transform.forward([long, lat]); + + min.x = Math.min(min.x, pos[0]); + min.y = Math.min(min.y, pos[1]); + min.z = Math.min(min.z, 20); + + coordinates.push(...pos, 20); + if(i > 0 && i < geometry.coordinates.length - 1){ + coordinates.push(...pos, 20); + } + } + + for(let i = 0; i < coordinates.length; i += 3){ + coordinates[i+0] -= min.x; + coordinates[i+1] -= min.y; + coordinates[i+2] -= min.z; + } + + const lineGeometry = new LineGeometry(); + lineGeometry.setPositions( coordinates ); + + const line = new Line2( lineGeometry, matLine ); + line.computeLineDistances(); + line.scale.set( 1, 1, 1 ); + line.position.copy(min); + + return line; + }else if(geometry.type === "Polygon"){ + for(let pc of geometry.coordinates){ + let coordinates = []; + + let min = new Vector3(Infinity, Infinity, Infinity); + for(let i = 0; i < pc.length; i++){ + let [long, lat] = pc[i]; + let pos = transform.forward([long, lat]); + + min.x = Math.min(min.x, pos[0]); + min.y = Math.min(min.y, pos[1]); + min.z = Math.min(min.z, 20); + + coordinates.push(...pos, 20); + if(i > 0 && i < pc.length - 1){ + coordinates.push(...pos, 20); + } + } + + for(let i = 0; i < coordinates.length; i += 3){ + coordinates[i+0] -= min.x; + coordinates[i+1] -= min.y; + coordinates[i+2] -= min.z; + } + + const lineGeometry = new LineGeometry(); + lineGeometry.setPositions( coordinates ); + + const line = new Line2( lineGeometry, matLine ); + line.computeLineDistances(); + line.scale.set( 1, 1, 1 ); + line.position.copy(min); + + return line; + } + }else { + console.log("unhandled feature: ", feature); + } + } + + async loadShapefileFeatures(file){ + let features = []; + + let source = await shapefile.open(file); + + while(true){ + let result = await source.read(); + + if (result.done) { + break; + } + + if (result.value && result.value.type === 'Feature' && result.value.geometry !== undefined) { + features.push(result.value); + } + } + + return features; + } + + }; + + const defaultColors = { + "landuse": [0.5, 0.5, 0.5], + "natural": [0.0, 1.0, 0.0], + "places": [1.0, 0.0, 1.0], + "points": [0.0, 1.0, 1.0], + "roads": [1.0, 1.0, 0.0], + "waterways": [0.0, 0.0, 1.0], + "default": [0.9, 0.6, 0.1], + }; + + function getColor(feature){ + let color = defaultColors[feature]; + + if(!color){ + color = defaultColors["default"]; + } + + return color; + } + + class Geopackage$1{ + constructor(){ + this.path = null; + this.node = null; + } + }; + + class GeoPackageLoader{ + + constructor(){ + + } + + static async loadUrl(url, params){ + + await Promise.all([ + Utils.loadScript(`${Potree.scriptPath}/lazylibs/geopackage/geopackage.js`), + Utils.loadScript(`${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.js`), + ]); + + const result = await fetch(url); + const buffer = await result.arrayBuffer(); + + params = params || {}; + + params.source = url; + + return GeoPackageLoader.loadBuffer(buffer, params); + } + + static async loadBuffer(buffer, params){ + + await Promise.all([ + Utils.loadScript(`${Potree.scriptPath}/lazylibs/geopackage/geopackage.js`), + Utils.loadScript(`${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.js`), + ]); + + params = params || {}; + + const resolver = async (resolve) => { + + let transform = params.transform; + if(!transform){ + transform = {forward: (arg) => arg}; + } + + const wasmPath = `${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.wasm`; + const SQL = await initSqlJs({ locateFile: filename => wasmPath}); + + const u8 = new Uint8Array(buffer); + + const data = await geopackage.open(u8); + window.data = data; + + const geopackageNode = new Object3D(); + geopackageNode.name = params.source; + geopackageNode.potree = { + source: params.source, + }; + + const geo = new Geopackage$1(); + geo.path = params.source; + geo.node = geopackageNode; + + const tables = data.getTables(); + + for(const table of tables.features){ + const dao = data.getFeatureDao(table); + + let boundingBox = dao.getBoundingBox(); + boundingBox = boundingBox.projectBoundingBox(dao.projection, 'EPSG:4326'); + const geoJson = data.queryForGeoJSONFeaturesInTable(table, boundingBox); + + const matLine = new LineMaterial( { + color: new Color().setRGB(...getColor(table)), + linewidth: 2, + resolution: new Vector2(1000, 1000), + dashed: false + } ); + + const node = new Object3D(); + node.name = table; + geo.node.add(node); + + for(const [index, feature] of Object.entries(geoJson)){ + //const featureNode = GeoPackageLoader.featureToSceneNode(feature, matLine, transform); + const featureNode = GeoPackageLoader.featureToSceneNode(feature, matLine, dao.projection, transform); + node.add(featureNode); + } + } + + resolve(geo); + }; + + return new Promise(resolver); + } + + static featureToSceneNode(feature, matLine, geopackageProjection, transform){ + let geometry = feature.geometry; + + let color = new Color(1, 1, 1); + + if(feature.geometry.type === "Point"){ + let sg = new SphereGeometry(1, 18, 18); + let sm = new MeshNormalMaterial(); + let s = new Mesh(sg, sm); + + let [long, lat] = geometry.coordinates; + let pos = transform.forward(geopackageProjection.forward([long, lat])); + + s.position.set(...pos, 20); + + s.scale.set(10, 10, 10); + + return s; + }else if(geometry.type === "LineString"){ + let coordinates = []; + + let min = new Vector3(Infinity, Infinity, Infinity); + for(let i = 0; i < geometry.coordinates.length; i++){ + let [long, lat] = geometry.coordinates[i]; + let pos = transform.forward(geopackageProjection.forward([long, lat])); + + min.x = Math.min(min.x, pos[0]); + min.y = Math.min(min.y, pos[1]); + min.z = Math.min(min.z, 20); + + coordinates.push(...pos, 20); + if(i > 0 && i < geometry.coordinates.length - 1){ + coordinates.push(...pos, 20); + } + } + + for(let i = 0; i < coordinates.length; i += 3){ + coordinates[i+0] -= min.x; + coordinates[i+1] -= min.y; + coordinates[i+2] -= min.z; + } + + const lineGeometry = new LineGeometry(); + lineGeometry.setPositions( coordinates ); + + const line = new Line2( lineGeometry, matLine ); + line.computeLineDistances(); + line.scale.set( 1, 1, 1 ); + line.position.copy(min); + + return line; + }else if(geometry.type === "Polygon"){ + for(let pc of geometry.coordinates){ + let coordinates = []; + + let min = new Vector3(Infinity, Infinity, Infinity); + for(let i = 0; i < pc.length; i++){ + let [long, lat] = pc[i]; + + let pos = transform.forward(geopackageProjection.forward([long, lat])); + + min.x = Math.min(min.x, pos[0]); + min.y = Math.min(min.y, pos[1]); + min.z = Math.min(min.z, 20); + + coordinates.push(...pos, 20); + if(i > 0 && i < pc.length - 1){ + coordinates.push(...pos, 20); + } + } + + for(let i = 0; i < coordinates.length; i += 3){ + coordinates[i+0] -= min.x; + coordinates[i+1] -= min.y; + coordinates[i+2] -= min.z; + } + + const lineGeometry = new LineGeometry(); + lineGeometry.setPositions( coordinates ); + + const line = new Line2( lineGeometry, matLine ); + line.computeLineDistances(); + line.scale.set( 1, 1, 1 ); + line.position.copy(min); + + return line; + } + }else { + console.log("unhandled feature: ", feature); + } + } + + }; + + class ClipVolume extends Object3D{ + + constructor(args){ + super(); + + this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1; + this.name = "clip_volume_" + this.constructor.counter; + + let alpha = args.alpha || 0; + let beta = args.beta || 0; + let gamma = args.gamma || 0; + + this.rotation.x = alpha; + this.rotation.y = beta; + this.rotation.z = gamma; + + this.clipOffset = 0.001; + this.clipRotOffset = 1; + + let boxGeometry = new BoxGeometry(1, 1, 1); + boxGeometry.computeBoundingBox(); + + let boxFrameGeometry = new Geometry(); + { + // bottom + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, 0.5)); + // top + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, 0.5)); + // sides + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, -0.5)); + + boxFrameGeometry.colors.push(new Vector3(1, 1, 1)); + } + + let planeFrameGeometry = new Geometry(); + { + // middle line + planeFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, 0.0)); + planeFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, 0.0)); + planeFrameGeometry.vertices.push(new Vector3(0.5, 0.5, 0.0)); + planeFrameGeometry.vertices.push(new Vector3(0.5, -0.5, 0.0)); + planeFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, 0.0)); + planeFrameGeometry.vertices.push(new Vector3(0.5, 0.5, 0.0)); + planeFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, 0.0)); + planeFrameGeometry.vertices.push(new Vector3(0.5, -0.5, 0.0)); + } + + this.dimension = new Vector3(1, 1, 1); + this.material = new MeshBasicMaterial( { + color: 0x00ff00, + transparent: true, + opacity: 0.3, + depthTest: true, + depthWrite: false} ); + this.box = new Mesh(boxGeometry, this.material); + this.box.geometry.computeBoundingBox(); + this.boundingBox = this.box.geometry.boundingBox; + this.add(this.box); + + this.frame = new LineSegments( boxFrameGeometry, new LineBasicMaterial({color: 0x000000})); + this.add(this.frame); + this.planeFrame = new LineSegments( planeFrameGeometry, new LineBasicMaterial({color: 0xff0000})); + this.add(this.planeFrame); + + // set default thickness + this.setScaleZ(0.1); + + // create local coordinate system + let createArrow = (name, direction, color) => { + let material = new MeshBasicMaterial({ + color: color, + depthTest: false, + depthWrite: false}); + + let shaftGeometry = new Geometry(); + shaftGeometry.vertices.push(new Vector3(0, 0, 0)); + shaftGeometry.vertices.push(new Vector3(0, 1, 0)); + + let shaftMaterial = new LineBasicMaterial({ + color: color, + depthTest: false, + depthWrite: false, + transparent: true + }); + let shaft = new Line(shaftGeometry, shaftMaterial); + shaft.name = name + "_shaft"; + + let headGeometry = new CylinderGeometry(0, 0.04, 0.1, 10, 1, false); + let headMaterial = material; + let head = new Mesh(headGeometry, headMaterial); + head.name = name + "_head"; + head.position.y = 1; + + let arrow = new Object3D(); + arrow.name = name; + arrow.add(shaft); + arrow.add(head); + + return arrow; + }; + + this.arrowX = createArrow("arrow_x", new Vector3(1, 0, 0), 0xFF0000); + this.arrowY = createArrow("arrow_y", new Vector3(0, 1, 0), 0x00FF00); + this.arrowZ = createArrow("arrow_z", new Vector3(0, 0, 1), 0x0000FF); + + this.arrowX.rotation.z = -Math.PI / 2; + this.arrowZ.rotation.x = Math.PI / 2; + + this.arrowX.visible = false; + this.arrowY.visible = false; + this.arrowZ.visible = false; + + this.add(this.arrowX); + this.add(this.arrowY); + this.add(this.arrowZ); + + { // event listeners + this.addEventListener("ui_select", e => { + this.arrowX.visible = true; + this.arrowY.visible = true; + this.arrowZ.visible = true; + }); + this.addEventListener("ui_deselect", e => { + this.arrowX.visible = false; + this.arrowY.visible = false; + this.arrowZ.visible = false; + }); + this.addEventListener("select", e => { + let scene_header = $("#" + this.name + " .scene_header"); + if(!scene_header.next().is(":visible")) { + scene_header.click(); + } + }); + this.addEventListener("deselect", e => { + let scene_header = $("#" + this.name + " .scene_header"); + if(scene_header.next().is(":visible")) { + scene_header.click(); + } + }); + } + + this.update(); + }; + + setClipOffset(offset) { + this.clipOffset = offset; + } + + setClipRotOffset(offset) { + this.clipRotOffset = offset; + } + + setScaleX(x) { + this.box.scale.x = x; + this.frame.scale.x = x; + this.planeFrame.scale.x = x; + } + + setScaleY(y) { + this.box.scale.y = y; + this.frame.scale.y = y; + this.planeFrame.scale.y = y; + } + + setScaleZ(z) { + this.box.scale.z = z; + this.frame.scale.z = z; + this.planeFrame.scale.z = z; + } + + offset(args) { + let cs = args.cs || null; + let axis = args.axis || null; + let dir = args.dir || null; + + if(!cs || !axis || !dir) return; + + if(axis === "x") { + if(cs === "local") { + this.position.add(this.localX.clone().multiplyScalar(dir * this.clipOffset)); + } else if(cs === "global") { + this.position.x = this.position.x + dir * this.clipOffset; + } + }else if(axis === "y") { + if(cs === "local") { + this.position.add(this.localY.clone().multiplyScalar(dir * this.clipOffset)); + } else if(cs === "global") { + this.position.y = this.position.y + dir * this.clipOffset; + } + }else if(axis === "z") { + if(cs === "local") { + this.position.add(this.localZ.clone().multiplyScalar(dir * this.clipOffset)); + } else if(cs === "global") { + this.position.z = this.position.z + dir * this.clipOffset; + } + } + + this.dispatchEvent({"type": "clip_volume_changed", "viewer": viewer, "volume": this}); + } + + rotate(args) { + let cs = args.cs || null; + let axis = args.axis || null; + let dir = args.dir || null; + + if(!cs || !axis || !dir) return; + + if(cs === "local") { + if(axis === "x") { + this.rotateOnAxis(new Vector3(1, 0, 0), dir * this.clipRotOffset * Math.PI / 180); + } else if(axis === "y") { + this.rotateOnAxis(new Vector3(0, 1, 0), dir * this.clipRotOffset * Math.PI / 180); + } else if(axis === "z") { + this.rotateOnAxis(new Vector3(0, 0, 1), dir * this.clipRotOffset * Math.PI / 180); + } + } else if(cs === "global") { + let rotaxis = new Vector4(1, 0, 0, 0); + if(axis === "y") { + rotaxis = new Vector4(0, 1, 0, 0); + } else if(axis === "z") { + rotaxis = new Vector4(0, 0, 1, 0); + } + this.updateMatrixWorld(); + let invM = newthis.matrixWorld.clone().invert(); + rotaxis = rotaxis.applyMatrix4(invM).normalize(); + rotaxis = new Vector3(rotaxis.x, rotaxis.y, rotaxis.z); + this.rotateOnAxis(rotaxis, dir * this.clipRotOffset * Math.PI / 180); + } + + this.updateLocalSystem(); + + this.dispatchEvent({"type": "clip_volume_changed", "viewer": viewer, "volume": this}); + } + + update(){ + this.boundingBox = this.box.geometry.boundingBox; + this.boundingSphere = this.boundingBox.getBoundingSphere(new Sphere()); + + this.box.visible = false; + + this.updateLocalSystem(); + }; + + updateLocalSystem() { + // extract local coordinate axes + let rotQuat = this.getWorldQuaternion(); + this.localX = new Vector3(1, 0, 0).applyQuaternion(rotQuat).normalize(); + this.localY = new Vector3(0, 1, 0).applyQuaternion(rotQuat).normalize(); + this.localZ = new Vector3(0, 0, 1).applyQuaternion(rotQuat).normalize(); + } + + raycast(raycaster, intersects){ + + let is = []; + this.box.raycast(raycaster, is); + + if(is.length > 0){ + let I = is[0]; + intersects.push({ + distance: I.distance, + object: this, + point: I.point.clone() + }); + } + }; + }; + + class ClippingTool extends EventDispatcher{ + + constructor(viewer){ + super(); + + this.viewer = viewer; + + this.maxPolygonVertices = 8; + + this.addEventListener("start_inserting_clipping_volume", e => { + this.viewer.dispatchEvent({ + type: "cancel_insertions" + }); + }); + + this.sceneMarker = new Scene(); + this.sceneVolume = new Scene(); + this.sceneVolume.name = "scene_clip_volume"; + this.viewer.inputHandler.registerInteractiveScene(this.sceneVolume); + + this.onRemove = e => { + this.sceneVolume.remove(e.volume); + }; + + this.onAdd = e => { + this.sceneVolume.add(e.volume); + }; + + this.viewer.inputHandler.addEventListener("delete", e => { + let volumes = e.selection.filter(e => (e instanceof ClipVolume)); + volumes.forEach(e => this.viewer.scene.removeClipVolume(e)); + let polyVolumes = e.selection.filter(e => (e instanceof PolygonClipVolume)); + polyVolumes.forEach(e => this.viewer.scene.removePolygonClipVolume(e)); + }); + } + + setScene(scene){ + if(this.scene === scene){ + return; + } + + if(this.scene){ + this.scene.removeEventListeners("clip_volume_added", this.onAdd); + this.scene.removeEventListeners("clip_volume_removed", this.onRemove); + this.scene.removeEventListeners("polygon_clip_volume_added", this.onAdd); + this.scene.removeEventListeners("polygon_clip_volume_removed", this.onRemove); + } + + this.scene = scene; + + this.scene.addEventListener("clip_volume_added", this.onAdd); + this.scene.addEventListener("clip_volume_removed", this.onRemove); + this.scene.addEventListener("polygon_clip_volume_added", this.onAdd); + this.scene.addEventListener("polygon_clip_volume_removed", this.onRemove); + } + + startInsertion(args = {}) { + let type = args.type || null; + + if(!type) return null; + + let domElement = this.viewer.renderer.domElement; + let canvasSize = this.viewer.renderer.getSize(new Vector2()); + + let svg = $(` + + + + + + + + + + + + `); + $(domElement.parentElement).append(svg); + + let polyClipVol = new PolygonClipVolume(this.viewer.scene.getActiveCamera().clone()); + + this.dispatchEvent({"type": "start_inserting_clipping_volume"}); + + this.viewer.scene.addPolygonClipVolume(polyClipVol); + this.sceneMarker.add(polyClipVol); + + let cancel = { + callback: null + }; + + let insertionCallback = (e) => { + if(e.button === MOUSE.LEFT){ + + polyClipVol.addMarker(); + + // SVC Screen Line + svg.find("polyline").each((index, target) => { + let newPoint = svg[0].createSVGPoint(); + newPoint.x = e.offsetX; + newPoint.y = e.offsetY; + let polyline = target.points.appendItem(newPoint); + }); + + + if(polyClipVol.markers.length > this.maxPolygonVertices){ + cancel.callback(); + } + + this.viewer.inputHandler.startDragging( + polyClipVol.markers[polyClipVol.markers.length - 1]); + }else if(e.button === MOUSE.RIGHT){ + cancel.callback(e); + } + }; + + cancel.callback = e => { + + //let first = svg.find("polyline")[0].points[0]; + //svg.find("polyline").each((index, target) => { + // let newPoint = svg[0].createSVGPoint(); + // newPoint.x = first.x; + // newPoint.y = first.y; + // let polyline = target.points.appendItem(newPoint); + //}); + svg.remove(); + + if(polyClipVol.markers.length > 3) { + polyClipVol.removeLastMarker(); + polyClipVol.initialized = true; + } else { + this.viewer.scene.removePolygonClipVolume(polyClipVol); + } + + this.viewer.renderer.domElement.removeEventListener("mouseup", insertionCallback, true); + this.viewer.removeEventListener("cancel_insertions", cancel.callback); + this.viewer.inputHandler.enabled = true; + }; + + this.viewer.addEventListener("cancel_insertions", cancel.callback); + this.viewer.renderer.domElement.addEventListener("mouseup", insertionCallback , true); + this.viewer.inputHandler.enabled = false; + + polyClipVol.addMarker(); + this.viewer.inputHandler.startDragging( + polyClipVol.markers[polyClipVol.markers.length - 1]); + + return polyClipVol; + } + + update() { + + } + }; + + var GeoTIFF = (function (exports) { + 'use strict'; + + const Endianness = new Enum({ + LITTLE: "II", + BIG: "MM", + }); + + const Type = new Enum({ + BYTE: {value: 1, bytes: 1}, + ASCII: {value: 2, bytes: 1}, + SHORT: {value: 3, bytes: 2}, + LONG: {value: 4, bytes: 4}, + RATIONAL: {value: 5, bytes: 8}, + SBYTE: {value: 6, bytes: 1}, + UNDEFINED: {value: 7, bytes: 1}, + SSHORT: {value: 8, bytes: 2}, + SLONG: {value: 9, bytes: 4}, + SRATIONAL: {value: 10, bytes: 8}, + FLOAT: {value: 11, bytes: 4}, + DOUBLE: {value: 12, bytes: 8}, + }); + + const Tag = new Enum({ + IMAGE_WIDTH: 256, + IMAGE_HEIGHT: 257, + BITS_PER_SAMPLE: 258, + COMPRESSION: 259, + PHOTOMETRIC_INTERPRETATION: 262, + STRIP_OFFSETS: 273, + ORIENTATION: 274, + SAMPLES_PER_PIXEL: 277, + ROWS_PER_STRIP: 278, + STRIP_BYTE_COUNTS: 279, + X_RESOLUTION: 282, + Y_RESOLUTION: 283, + PLANAR_CONFIGURATION: 284, + RESOLUTION_UNIT: 296, + SOFTWARE: 305, + COLOR_MAP: 320, + SAMPLE_FORMAT: 339, + MODEL_PIXEL_SCALE: 33550, // [GeoTIFF] TYPE: double N: 3 + MODEL_TIEPOINT: 33922, // [GeoTIFF] TYPE: double N: 6 * NUM_TIEPOINTS + GEO_KEY_DIRECTORY: 34735, // [GeoTIFF] TYPE: short N: >= 4 + GEO_DOUBLE_PARAMS: 34736, // [GeoTIFF] TYPE: short N: variable + GEO_ASCII_PARAMS: 34737, // [GeoTIFF] TYPE: ascii N: variable + }); + + const typeMapping = new Map([ + [Type.BYTE, Uint8Array], + [Type.ASCII, Uint8Array], + [Type.SHORT, Uint16Array], + [Type.LONG, Uint32Array], + [Type.RATIONAL, Uint32Array], + [Type.SBYTE, Int8Array], + [Type.UNDEFINED, Uint8Array], + [Type.SSHORT, Int16Array], + [Type.SLONG, Int32Array], + [Type.SRATIONAL, Int32Array], + [Type.FLOAT, Float32Array], + [Type.DOUBLE, Float64Array], + ]); + + class IFDEntry{ + + constructor(tag, type, count, offset, value){ + this.tag = tag; + this.type = type; + this.count = count; + this.offset = offset; + this.value = value; + } + + } + + class Image{ + + constructor(){ + this.width = 0; + this.height = 0; + this.buffer = null; + this.metadata = []; + } + + } + + class Reader{ + + constructor(){ + + } + + static read(data){ + + let endiannessTag = String.fromCharCode(...Array.from(data.slice(0, 2))); + let endianness = Endianness.fromValue(endiannessTag); + + let tiffCheckTag = data.readUInt8(2); + + if(tiffCheckTag !== 42){ + throw new Error("not a valid tiff file"); + } + + let offsetToFirstIFD = data.readUInt32LE(4); + + console.log("offsetToFirstIFD", offsetToFirstIFD); + + let ifds = []; + let IFDsRead = false; + let currentIFDOffset = offsetToFirstIFD; + let i = 0; + while(IFDsRead || i < 100){ + + console.log("currentIFDOffset", currentIFDOffset); + let numEntries = data.readUInt16LE(currentIFDOffset); + let nextIFDOffset = data.readUInt32LE(currentIFDOffset + 2 + numEntries * 12); + + console.log("next offset: ", currentIFDOffset + 2 + numEntries * 12); + + let entryBuffer = data.slice(currentIFDOffset + 2, currentIFDOffset + 2 + 12 * numEntries); + + for(let i = 0; i < numEntries; i++){ + let tag = Tag.fromValue(entryBuffer.readUInt16LE(i * 12)); + let type = Type.fromValue(entryBuffer.readUInt16LE(i * 12 + 2)); + let count = entryBuffer.readUInt32LE(i * 12 + 4); + let offsetOrValue = entryBuffer.readUInt32LE(i * 12 + 8); + let valueBytes = type.bytes * count; + + let value; + if(valueBytes <= 4){ + value = offsetOrValue; + }else { + let valueBuffer = new Uint8Array(valueBytes); + valueBuffer.set(data.slice(offsetOrValue, offsetOrValue + valueBytes)); + + let ArrayType = typeMapping.get(type); + + value = new ArrayType(valueBuffer.buffer); + + if(type === Type.ASCII){ + value = String.fromCharCode(...value); + } + } + + let ifd = new IFDEntry(tag, type, count, offsetOrValue, value); + + ifds.push(ifd); + } + + console.log("nextIFDOffset", nextIFDOffset); + + if(nextIFDOffset === 0){ + break; + } + + currentIFDOffset = nextIFDOffset; + i++; + } + + let ifdForTag = (tag) => { + for(let entry of ifds){ + if(entry.tag === tag){ + return entry; + } + } + + return null; + }; + + let width = ifdForTag(Tag.IMAGE_WIDTH, ifds).value; + let height = ifdForTag(Tag.IMAGE_HEIGHT, ifds).value; + let compression = ifdForTag(Tag.COMPRESSION, ifds).value; + let rowsPerStrip = ifdForTag(Tag.ROWS_PER_STRIP, ifds).value; + let ifdStripOffsets = ifdForTag(Tag.STRIP_OFFSETS, ifds); + let ifdStripByteCounts = ifdForTag(Tag.STRIP_BYTE_COUNTS, ifds); + + let numStrips = Math.ceil(height / rowsPerStrip); + + let stripByteCounts = []; + for(let i = 0; i < ifdStripByteCounts.count; i++){ + let type = ifdStripByteCounts.type; + let offset = ifdStripByteCounts.offset + i * type.bytes; + + let value; + if(type === Type.SHORT){ + value = data.readUInt16LE(offset); + }else if(type === Type.LONG){ + value = data.readUInt32LE(offset); + } + + stripByteCounts.push(value); + } + + let stripOffsets = []; + for(let i = 0; i < ifdStripOffsets.count; i++){ + let type = ifdStripOffsets.type; + let offset = ifdStripOffsets.offset + i * type.bytes; + + let value; + if(type === Type.SHORT){ + value = data.readUInt16LE(offset); + }else if(type === Type.LONG){ + value = data.readUInt32LE(offset); + } + + stripOffsets.push(value); + } + + let imageBuffer = new Uint8Array(width * height * 3); + + let linesProcessed = 0; + for(let i = 0; i < numStrips; i++){ + let stripOffset = stripOffsets[i]; + let stripBytes = stripByteCounts[i]; + let stripData = data.slice(stripOffset, stripOffset + stripBytes); + let lineBytes = width * 3; + for(let y = 0; y < rowsPerStrip; y++){ + let line = stripData.slice(y * lineBytes, y * lineBytes + lineBytes); + imageBuffer.set(line, linesProcessed * lineBytes); + + if(line.length === lineBytes){ + linesProcessed++; + }else { + break; + } + } + } + + console.log(`width: ${width}`); + console.log(`height: ${height}`); + console.log(`numStrips: ${numStrips}`); + console.log("stripByteCounts", stripByteCounts.join(", ")); + console.log("stripOffsets", stripOffsets.join(", ")); + + let image = new Image(); + image.width = width; + image.height = height; + image.buffer = imageBuffer; + image.metadata = ifds; + + return image; + } + + } + + + class Exporter{ + + constructor(){ + + } + + static toTiffBuffer(image, params = {}){ + + let offsetToFirstIFD = 8; + + let headerBuffer = new Uint8Array([0x49, 0x49, 42, 0, offsetToFirstIFD, 0, 0, 0]); + + let [width, height] = [image.width, image.height]; + + let ifds = [ + new IFDEntry(Tag.IMAGE_WIDTH, Type.SHORT, 1, null, width), + new IFDEntry(Tag.IMAGE_HEIGHT, Type.SHORT, 1, null, height), + new IFDEntry(Tag.BITS_PER_SAMPLE, Type.SHORT, 4, null, new Uint16Array([8, 8, 8, 8])), + new IFDEntry(Tag.COMPRESSION, Type.SHORT, 1, null, 1), + new IFDEntry(Tag.PHOTOMETRIC_INTERPRETATION, Type.SHORT, 1, null, 2), + new IFDEntry(Tag.ORIENTATION, Type.SHORT, 1, null, 1), + new IFDEntry(Tag.SAMPLES_PER_PIXEL, Type.SHORT, 1, null, 4), + new IFDEntry(Tag.ROWS_PER_STRIP, Type.LONG, 1, null, height), + new IFDEntry(Tag.STRIP_BYTE_COUNTS, Type.LONG, 1, null, width * height * 3), + new IFDEntry(Tag.PLANAR_CONFIGURATION, Type.SHORT, 1, null, 1), + new IFDEntry(Tag.RESOLUTION_UNIT, Type.SHORT, 1, null, 1), + new IFDEntry(Tag.SOFTWARE, Type.ASCII, 6, null, "......"), + new IFDEntry(Tag.STRIP_OFFSETS, Type.LONG, 1, null, null), + new IFDEntry(Tag.X_RESOLUTION, Type.RATIONAL, 1, null, new Uint32Array([1, 1])), + new IFDEntry(Tag.Y_RESOLUTION, Type.RATIONAL, 1, null, new Uint32Array([1, 1])), + ]; + + if(params.ifdEntries){ + ifds.push(...params.ifdEntries); + } + + let valueOffset = offsetToFirstIFD + 2 + ifds.length * 12 + 4; + + // create 12 byte buffer for each ifd and variable length buffers for ifd values + let ifdEntryBuffers = new Map(); + let ifdValueBuffers = new Map(); + for(let ifd of ifds){ + let entryBuffer = new ArrayBuffer(12); + let entryView = new DataView(entryBuffer); + + let valueBytes = ifd.type.bytes * ifd.count; + + entryView.setUint16(0, ifd.tag.value, true); + entryView.setUint16(2, ifd.type.value, true); + entryView.setUint32(4, ifd.count, true); + + if(ifd.count === 1 && ifd.type.bytes <= 4){ + entryView.setUint32(8, ifd.value, true); + }else { + entryView.setUint32(8, valueOffset, true); + + let valueBuffer = new Uint8Array(ifd.count * ifd.type.bytes); + if(ifd.type === Type.ASCII){ + valueBuffer.set(new Uint8Array(ifd.value.split("").map(c => c.charCodeAt(0)))); + }else { + valueBuffer.set(new Uint8Array(ifd.value.buffer)); + } + ifdValueBuffers.set(ifd.tag, valueBuffer); + + valueOffset = valueOffset + valueBuffer.byteLength; + } + + ifdEntryBuffers.set(ifd.tag, entryBuffer); + } + + let imageBufferOffset = valueOffset; + + new DataView(ifdEntryBuffers.get(Tag.STRIP_OFFSETS)).setUint32(8, imageBufferOffset, true); + + let concatBuffers = (buffers) => { + + let totalLength = buffers.reduce( (sum, buffer) => (sum + buffer.byteLength), 0); + let merged = new Uint8Array(totalLength); + + let offset = 0; + for(let buffer of buffers){ + merged.set(new Uint8Array(buffer), offset); + offset += buffer.byteLength; + } + + return merged; + }; + + let ifdBuffer = concatBuffers([ + new Uint16Array([ifds.length]), + ...ifdEntryBuffers.values(), + new Uint32Array([0])]); + let ifdValueBuffer = concatBuffers([...ifdValueBuffers.values()]); + + let tiffBuffer = concatBuffers([ + headerBuffer, + ifdBuffer, + ifdValueBuffer, + image.buffer + ]); + + return {width: width, height: height, buffer: tiffBuffer}; + } + + } + + exports.Tag = Tag; + exports.Type = Type; + exports.IFDEntry = IFDEntry; + exports.Image = Image; + exports.Reader = Reader; + exports.Exporter = Exporter; + + return exports; + + }({})); + + function updateAzimuth(viewer, measure){ + + const azimuth = measure.azimuth; + + const isOkay = measure.points.length === 2; + + azimuth.node.visible = isOkay && measure.showAzimuth; + + if(!azimuth.node.visible){ + return; + } + + const camera = viewer.scene.getActiveCamera(); + const renderAreaSize = viewer.renderer.getSize(new Vector2()); + const width = renderAreaSize.width; + const height = renderAreaSize.height; + + const [p0, p1] = measure.points; + const r = p0.position.distanceTo(p1.position); + const northVec = Utils.getNorthVec(p0.position, r, viewer.getProjection()); + const northPos = p0.position.clone().add(northVec); + + azimuth.center.position.copy(p0.position); + azimuth.center.scale.set(2, 2, 2); + + azimuth.center.visible = false; + // azimuth.target.visible = false; + + + { // north + azimuth.north.position.copy(northPos); + azimuth.north.scale.set(2, 2, 2); + + let distance = azimuth.north.position.distanceTo(camera.position); + let pr = Utils.projectedRadius(1, camera, distance, width, height); + + let scale = (5 / pr); + azimuth.north.scale.set(scale, scale, scale); + } + + { // target + azimuth.target.position.copy(p1.position); + azimuth.target.position.z = azimuth.north.position.z; + + let distance = azimuth.target.position.distanceTo(camera.position); + let pr = Utils.projectedRadius(1, camera, distance, width, height); + + let scale = (5 / pr); + azimuth.target.scale.set(scale, scale, scale); + } + + + azimuth.circle.position.copy(p0.position); + azimuth.circle.scale.set(r, r, r); + azimuth.circle.material.resolution.set(width, height); + + // to target + azimuth.centerToTarget.geometry.setPositions([ + 0, 0, 0, + ...p1.position.clone().sub(p0.position).toArray(), + ]); + azimuth.centerToTarget.position.copy(p0.position); + azimuth.centerToTarget.geometry.verticesNeedUpdate = true; + azimuth.centerToTarget.geometry.computeBoundingSphere(); + azimuth.centerToTarget.computeLineDistances(); + azimuth.centerToTarget.material.resolution.set(width, height); + + // to target ground + azimuth.centerToTargetground.geometry.setPositions([ + 0, 0, 0, + p1.position.x - p0.position.x, + p1.position.y - p0.position.y, + 0, + ]); + azimuth.centerToTargetground.position.copy(p0.position); + azimuth.centerToTargetground.geometry.verticesNeedUpdate = true; + azimuth.centerToTargetground.geometry.computeBoundingSphere(); + azimuth.centerToTargetground.computeLineDistances(); + azimuth.centerToTargetground.material.resolution.set(width, height); + + // to north + azimuth.centerToNorth.geometry.setPositions([ + 0, 0, 0, + northPos.x - p0.position.x, + northPos.y - p0.position.y, + 0, + ]); + azimuth.centerToNorth.position.copy(p0.position); + azimuth.centerToNorth.geometry.verticesNeedUpdate = true; + azimuth.centerToNorth.geometry.computeBoundingSphere(); + azimuth.centerToNorth.computeLineDistances(); + azimuth.centerToNorth.material.resolution.set(width, height); + + // label + const radians = Utils.computeAzimuth(p0.position, p1.position, viewer.getProjection()); + let degrees = MathUtils.radToDeg(radians); + if(degrees < 0){ + degrees = 360 + degrees; + } + const txtDegrees = `${degrees.toFixed(2)}°`; + const labelDir = northPos.clone().add(p1.position).multiplyScalar(0.5).sub(p0.position); + if(labelDir.length() > 0){ + labelDir.z = 0; + labelDir.normalize(); + const labelVec = labelDir.clone().multiplyScalar(r); + const labelPos = p0.position.clone().add(labelVec); + azimuth.label.position.copy(labelPos); + } + azimuth.label.setText(txtDegrees); + let distance = azimuth.label.position.distanceTo(camera.position); + let pr = Utils.projectedRadius(1, camera, distance, width, height); + let scale = (70 / pr); + azimuth.label.scale.set(scale, scale, scale); + } + + class MeasuringTool extends EventDispatcher{ + constructor (viewer) { + super(); + + this.viewer = viewer; + this.renderer = viewer.renderer; + + this.addEventListener('start_inserting_measurement', e => { + this.viewer.dispatchEvent({ + type: 'cancel_insertions' + }); + }); + + this.showLabels = true; + this.scene = new Scene(); + this.scene.name = 'scene_measurement'; + this.light = new PointLight(0xffffff, 1.0); + this.scene.add(this.light); + + this.viewer.inputHandler.registerInteractiveScene(this.scene); + + this.onRemove = (e) => { this.scene.remove(e.measurement);}; + this.onAdd = e => {this.scene.add(e.measurement);}; + + for(let measurement of viewer.scene.measurements){ + this.onAdd({measurement: measurement}); + } + + viewer.addEventListener("update", this.update.bind(this)); + viewer.addEventListener("render.pass.perspective_overlay", this.render.bind(this)); + viewer.addEventListener("scene_changed", this.onSceneChange.bind(this)); + + viewer.scene.addEventListener('measurement_added', this.onAdd); + viewer.scene.addEventListener('measurement_removed', this.onRemove); + } + + onSceneChange(e){ + if(e.oldScene){ + e.oldScene.removeEventListener('measurement_added', this.onAdd); + e.oldScene.removeEventListener('measurement_removed', this.onRemove); + } + + e.scene.addEventListener('measurement_added', this.onAdd); + e.scene.addEventListener('measurement_removed', this.onRemove); + } + + startInsertion (args = {}) { + let domElement = this.viewer.renderer.domElement; + + let measure = new Measure(); + + this.dispatchEvent({ + type: 'start_inserting_measurement', + measure: measure + }); + + const pick = (defaul, alternative) => { + if(defaul != null){ + return defaul; + }else { + return alternative; + } + }; + + measure.showDistances = (args.showDistances === null) ? true : args.showDistances; + + measure.showArea = pick(args.showArea, false); + measure.showAngles = pick(args.showAngles, false); + measure.showCoordinates = pick(args.showCoordinates, false); + measure.showHeight = pick(args.showHeight, false); + measure.showCircle = pick(args.showCircle, false); + measure.showAzimuth = pick(args.showAzimuth, false); + measure.showEdges = pick(args.showEdges, true); + measure.closed = pick(args.closed, false); + measure.maxMarkers = pick(args.maxMarkers, Infinity); + + measure.name = args.name || 'Measurement'; + + this.scene.add(measure); + + let cancel = { + removeLastMarker: measure.maxMarkers > 3, + callback: null + }; + + let insertionCallback = (e) => { + if (e.button === MOUSE.LEFT) { + measure.addMarker(measure.points[measure.points.length - 1].position.clone()); + + if (measure.points.length >= measure.maxMarkers) { + cancel.callback(); + } + + this.viewer.inputHandler.startDragging( + measure.spheres[measure.spheres.length - 1]); + } else if (e.button === MOUSE.RIGHT) { + cancel.callback(); + } + }; + + cancel.callback = e => { + if (cancel.removeLastMarker) { + measure.removeMarker(measure.points.length - 1); + } + domElement.removeEventListener('mouseup', insertionCallback, true); + this.viewer.removeEventListener('cancel_insertions', cancel.callback); + }; + + if (measure.maxMarkers > 1) { + this.viewer.addEventListener('cancel_insertions', cancel.callback); + domElement.addEventListener('mouseup', insertionCallback, true); + } + + measure.addMarker(new Vector3(0, 0, 0)); + this.viewer.inputHandler.startDragging( + measure.spheres[measure.spheres.length - 1]); + + this.viewer.scene.addMeasurement(measure); + + return measure; + } + + update(){ + let camera = this.viewer.scene.getActiveCamera(); + let domElement = this.renderer.domElement; + let measurements = this.viewer.scene.measurements; + + const renderAreaSize = this.renderer.getSize(new Vector2()); + let clientWidth = renderAreaSize.width; + let clientHeight = renderAreaSize.height; + + this.light.position.copy(camera.position); + + // make size independant of distance + for (let measure of measurements) { + measure.lengthUnit = this.viewer.lengthUnit; + measure.lengthUnitDisplay = this.viewer.lengthUnitDisplay; + measure.update(); + + updateAzimuth(this.viewer, measure); + + // spheres + for(let sphere of measure.spheres){ + let distance = camera.position.distanceTo(sphere.getWorldPosition(new Vector3())); + let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); + let scale = (15 / pr); + sphere.scale.set(scale, scale, scale); + } + + // labels + let labels = measure.edgeLabels.concat(measure.angleLabels); + for(let label of labels){ + let distance = camera.position.distanceTo(label.getWorldPosition(new Vector3())); + let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); + let scale = (70 / pr); + + if(Potree.debug.scale){ + scale = (Potree.debug.scale / pr); + } + + label.scale.set(scale, scale, scale); + } + + // coordinate labels + for (let j = 0; j < measure.coordinateLabels.length; j++) { + let label = measure.coordinateLabels[j]; + let sphere = measure.spheres[j]; + + let distance = camera.position.distanceTo(sphere.getWorldPosition(new Vector3())); + + let screenPos = sphere.getWorldPosition(new Vector3()).clone().project(camera); + screenPos.x = Math.round((screenPos.x + 1) * clientWidth / 2); + screenPos.y = Math.round((-screenPos.y + 1) * clientHeight / 2); + screenPos.z = 0; + screenPos.y -= 30; + + let labelPos = new Vector3( + (screenPos.x / clientWidth) * 2 - 1, + -(screenPos.y / clientHeight) * 2 + 1, + 0.5 ); + labelPos.unproject(camera); + if(this.viewer.scene.cameraMode == CameraMode.PERSPECTIVE) { + let direction = labelPos.sub(camera.position).normalize(); + labelPos = new Vector3().addVectors( + camera.position, direction.multiplyScalar(distance)); + + } + label.position.copy(labelPos); + let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); + let scale = (70 / pr); + label.scale.set(scale, scale, scale); + } + + // height label + if (measure.showHeight) { + let label = measure.heightLabel; + + { + let distance = label.position.distanceTo(camera.position); + let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); + let scale = (70 / pr); + label.scale.set(scale, scale, scale); + } + + { // height edge + let edge = measure.heightEdge; + + let sorted = measure.points.slice().sort((a, b) => a.position.z - b.position.z); + let lowPoint = sorted[0].position.clone(); + let highPoint = sorted[sorted.length - 1].position.clone(); + let min = lowPoint.z; + let max = highPoint.z; + + let start = new Vector3(highPoint.x, highPoint.y, min); + let end = new Vector3(highPoint.x, highPoint.y, max); + + let lowScreen = lowPoint.clone().project(camera); + let startScreen = start.clone().project(camera); + let endScreen = end.clone().project(camera); + + let toPixelCoordinates = v => { + let r = v.clone().addScalar(1).divideScalar(2); + r.x = r.x * clientWidth; + r.y = r.y * clientHeight; + r.z = 0; + + return r; + }; + + let lowEL = toPixelCoordinates(lowScreen); + let startEL = toPixelCoordinates(startScreen); + let endEL = toPixelCoordinates(endScreen); + + let lToS = lowEL.distanceTo(startEL); + let sToE = startEL.distanceTo(endEL); + + edge.geometry.lineDistances = [0, lToS, lToS, lToS + sToE]; + edge.geometry.lineDistancesNeedUpdate = true; + + edge.material.dashSize = 10; + edge.material.gapSize = 10; + } + } + + { // area label + let label = measure.areaLabel; + let distance = label.position.distanceTo(camera.position); + let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); + + let scale = (70 / pr); + label.scale.set(scale, scale, scale); + } + + { // radius label + let label = measure.circleRadiusLabel; + let distance = label.position.distanceTo(camera.position); + let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); + + let scale = (70 / pr); + label.scale.set(scale, scale, scale); + } + + { // edges + const materials = [ + measure.circleRadiusLine.material, + ...measure.edges.map( (e) => e.material), + measure.heightEdge.material, + measure.circleLine.material, + ]; + + for(const material of materials){ + material.resolution.set(clientWidth, clientHeight); + } + } + + if(!this.showLabels){ + + const labels = [ + ...measure.sphereLabels, + ...measure.edgeLabels, + ...measure.angleLabels, + ...measure.coordinateLabels, + measure.heightLabel, + measure.areaLabel, + measure.circleRadiusLabel, + ]; + + for(const label of labels){ + label.visible = false; + } + } + } + } + + render(){ + this.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera()); + } + }; + + class Message{ + + constructor(content){ + this.content = content; + + let closeIcon = `${exports.resourcePath}/icons/close.svg`; + + this.element = $(` +
    + + +
    `); + + this.elClose = this.element.find("img[name=close]"); + + this.elContainer = this.element.find("span[name=content_container]"); + + if(typeof content === "string"){ + this.elContainer.append($(`${content}`)); + }else { + this.elContainer.append(content); + } + + } + + setMessage(content){ + this.elContainer.empty(); + if(typeof content === "string"){ + this.elContainer.append($(`${content}`)); + }else { + this.elContainer.append(content); + } + } + + } + + class PointCloudSM{ + + constructor(potreeRenderer){ + + this.potreeRenderer = potreeRenderer; + this.threeRenderer = this.potreeRenderer.threeRenderer; + + this.target = new WebGLRenderTarget(2 * 1024, 2 * 1024, { + minFilter: LinearFilter, + magFilter: LinearFilter, + format: RGBAFormat, + type: FloatType + }); + this.target.depthTexture = new DepthTexture(); + this.target.depthTexture.type = UnsignedIntType; + + //this.threeRenderer.setClearColor(0x000000, 1); + this.threeRenderer.setClearColor(0xff0000, 1); + + //HACK? removed while moving to three.js 109 + //this.threeRenderer.clearTarget(this.target, true, true, true); + { + const oldTarget = this.threeRenderer.getRenderTarget(); + + this.threeRenderer.setRenderTarget(this.target); + this.threeRenderer.clear(true, true, true); + + this.threeRenderer.setRenderTarget(oldTarget); + } + } + + setLight(light){ + this.light = light; + + let fov = (180 * light.angle) / Math.PI; + let aspect = light.shadow.mapSize.width / light.shadow.mapSize.height; + let near = 0.1; + let far = light.distance === 0 ? 10000 : light.distance; + this.camera = new PerspectiveCamera(fov, aspect, near, far); + this.camera.up.set(0, 0, 1); + this.camera.position.copy(light.position); + + let target = new Vector3().subVectors(light.position, light.getWorldDirection(new Vector3())); + this.camera.lookAt(target); + + this.camera.updateProjectionMatrix(); + this.camera.updateMatrix(); + this.camera.updateMatrixWorld(); + this.camera.matrixWorldInverse.copy(this.camera.matrixWorld).invert(); + } + + setSize(width, height){ + if(this.target.width !== width || this.target.height !== height){ + this.target.dispose(); + } + this.target.setSize(width, height); + } + + render(scene, camera){ + + this.threeRenderer.setClearColor(0x000000, 1); + + const oldTarget = this.threeRenderer.getRenderTarget(); + + this.threeRenderer.setRenderTarget(this.target); + this.threeRenderer.clear(true, true, true); + + this.potreeRenderer.render(scene, this.camera, this.target, {}); + + this.threeRenderer.setRenderTarget(oldTarget); + } + + + } + + class ProfileTool extends EventDispatcher { + constructor (viewer) { + super(); + + this.viewer = viewer; + this.renderer = viewer.renderer; + + this.addEventListener('start_inserting_profile', e => { + this.viewer.dispatchEvent({ + type: 'cancel_insertions' + }); + }); + + this.scene = new Scene(); + this.scene.name = 'scene_profile'; + this.light = new PointLight(0xffffff, 1.0); + this.scene.add(this.light); + + this.viewer.inputHandler.registerInteractiveScene(this.scene); + + this.onRemove = e => this.scene.remove(e.profile); + this.onAdd = e => this.scene.add(e.profile); + + for(let profile of viewer.scene.profiles){ + this.onAdd({profile: profile}); + } + + viewer.addEventListener("update", this.update.bind(this)); + viewer.addEventListener("render.pass.perspective_overlay", this.render.bind(this)); + viewer.addEventListener("scene_changed", this.onSceneChange.bind(this)); + + viewer.scene.addEventListener('profile_added', this.onAdd); + viewer.scene.addEventListener('profile_removed', this.onRemove); + } + + onSceneChange(e){ + if(e.oldScene){ + e.oldScene.removeEventListeners('profile_added', this.onAdd); + e.oldScene.removeEventListeners('profile_removed', this.onRemove); + } + + e.scene.addEventListener('profile_added', this.onAdd); + e.scene.addEventListener('profile_removed', this.onRemove); + } + + startInsertion (args = {}) { + let domElement = this.viewer.renderer.domElement; + + let profile = new Profile(); + profile.name = args.name || 'Profile'; + + this.dispatchEvent({ + type: 'start_inserting_profile', + profile: profile + }); + + this.scene.add(profile); + + let cancel = { + callback: null + }; + + let insertionCallback = (e) => { + if(e.button === MOUSE.LEFT){ + if(profile.points.length <= 1){ + let camera = this.viewer.scene.getActiveCamera(); + let distance = camera.position.distanceTo(profile.points[0]); + let clientSize = this.viewer.renderer.getSize(new Vector2()); + let pr = Utils.projectedRadius(1, camera, distance, clientSize.width, clientSize.height); + let width = (10 / pr); + + profile.setWidth(width); + } + + profile.addMarker(profile.points[profile.points.length - 1].clone()); + + this.viewer.inputHandler.startDragging( + profile.spheres[profile.spheres.length - 1]); + } else if (e.button === MOUSE.RIGHT) { + cancel.callback(); + } + }; + + cancel.callback = e => { + profile.removeMarker(profile.points.length - 1); + domElement.removeEventListener('mouseup', insertionCallback, true); + this.viewer.removeEventListener('cancel_insertions', cancel.callback); + }; + + this.viewer.addEventListener('cancel_insertions', cancel.callback); + domElement.addEventListener('mouseup', insertionCallback, true); + + profile.addMarker(new Vector3(0, 0, 0)); + this.viewer.inputHandler.startDragging( + profile.spheres[profile.spheres.length - 1]); + + this.viewer.scene.addProfile(profile); + + return profile; + } + + update(){ + let camera = this.viewer.scene.getActiveCamera(); + let profiles = this.viewer.scene.profiles; + let renderAreaSize = this.viewer.renderer.getSize(new Vector2()); + let clientWidth = renderAreaSize.width; + let clientHeight = renderAreaSize.height; + + this.light.position.copy(camera.position); + + // make size independant of distance + for(let profile of profiles){ + for(let sphere of profile.spheres){ + let distance = camera.position.distanceTo(sphere.getWorldPosition(new Vector3())); + let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); + let scale = (15 / pr); + sphere.scale.set(scale, scale, scale); + } + } + } + + render(){ + this.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera()); + } + + } + + class ScreenBoxSelectTool extends EventDispatcher{ + + constructor(viewer){ + super(); + + this.viewer = viewer; + this.scene = new Scene(); + + viewer.addEventListener("update", this.update.bind(this)); + viewer.addEventListener("render.pass.perspective_overlay", this.render.bind(this)); + viewer.addEventListener("scene_changed", this.onSceneChange.bind(this)); + } + + onSceneChange(scene){ + console.log("scene changed"); + } + + startInsertion(){ + let domElement = this.viewer.renderer.domElement; + + let volume = new BoxVolume(); + volume.position.set(12345, 12345, 12345); + volume.showVolumeLabel = false; + volume.visible = false; + volume.update(); + this.viewer.scene.addVolume(volume); + + this.importance = 10; + + let selectionBox = $(`
    `); + $(domElement.parentElement).append(selectionBox); + selectionBox.css("right", "10px"); + selectionBox.css("bottom", "10px"); + + let drag = e =>{ + + volume.visible = true; + + let mStart = e.drag.start; + let mEnd = e.drag.end; + + let box2D = new Box2(); + box2D.expandByPoint(mStart); + box2D.expandByPoint(mEnd); + + selectionBox.css("left", `${box2D.min.x}px`); + selectionBox.css("top", `${box2D.min.y}px`); + selectionBox.css("width", `${box2D.max.x - box2D.min.x}px`); + selectionBox.css("height", `${box2D.max.y - box2D.min.y}px`); + + let camera = e.viewer.scene.getActiveCamera(); + let size = e.viewer.renderer.getSize(new Vector2()); + let frustumSize = new Vector2( + camera.right - camera.left, + camera.top - camera.bottom); + + let screenCentroid = new Vector2().addVectors(e.drag.end, e.drag.start).multiplyScalar(0.5); + let ray = Utils.mouseToRay(screenCentroid, camera, size.width, size.height); + + let diff = new Vector2().subVectors(e.drag.end, e.drag.start); + diff.divide(size).multiply(frustumSize); + + volume.position.copy(ray.origin); + volume.up.copy(camera.up); + volume.rotation.copy(camera.rotation); + volume.scale.set(diff.x, diff.y, 1000 * 100); + + e.consume(); + }; + + let drop = e => { + this.importance = 0; + + $(selectionBox).remove(); + + this.viewer.inputHandler.deselectAll(); + this.viewer.inputHandler.toggleSelection(volume); + + let camera = e.viewer.scene.getActiveCamera(); + let size = e.viewer.renderer.getSize(new Vector2()); + let screenCentroid = new Vector2().addVectors(e.drag.end, e.drag.start).multiplyScalar(0.5); + let ray = Utils.mouseToRay(screenCentroid, camera, size.width, size.height); + + let line = new Line3(ray.origin, new Vector3().addVectors(ray.origin, ray.direction)); + + this.removeEventListener("drag", drag); + this.removeEventListener("drop", drop); + + let allPointsNear = []; + let allPointsFar = []; + + // TODO support more than one point cloud + for(let pointcloud of this.viewer.scene.pointclouds){ + + if(!pointcloud.visible){ + continue; + } + + let volCam = camera.clone(); + volCam.left = -volume.scale.x / 2; + volCam.right = +volume.scale.x / 2; + volCam.top = +volume.scale.y / 2; + volCam.bottom = -volume.scale.y / 2; + volCam.near = -volume.scale.z / 2; + volCam.far = +volume.scale.z / 2; + volCam.rotation.copy(volume.rotation); + volCam.position.copy(volume.position); + + volCam.updateMatrix(); + volCam.updateMatrixWorld(); + volCam.updateProjectionMatrix(); + volCam.matrixWorldInverse.copy(volCam.matrixWorld).invert(); + + let ray = new Ray(volCam.getWorldPosition(new Vector3()), volCam.getWorldDirection(new Vector3())); + let rayInverse = new Ray( + ray.origin.clone().add(ray.direction.clone().multiplyScalar(volume.scale.z)), + ray.direction.clone().multiplyScalar(-1)); + + let pickerSettings = { + width: 8, + height: 8, + pickWindowSize: 8, + all: true, + pickClipped: true, + pointSizeType: PointSizeType.FIXED, + pointSize: 1}; + let pointsNear = pointcloud.pick(viewer, volCam, ray, pickerSettings); + + volCam.rotateX(Math.PI); + volCam.updateMatrix(); + volCam.updateMatrixWorld(); + volCam.updateProjectionMatrix(); + volCam.matrixWorldInverse.copy(volCam.matrixWorld).invert(); + let pointsFar = pointcloud.pick(viewer, volCam, rayInverse, pickerSettings); + + allPointsNear.push(...pointsNear); + allPointsFar.push(...pointsFar); + } + + if(allPointsNear.length > 0 && allPointsFar.length > 0){ + let viewLine = new Line3(ray.origin, new Vector3().addVectors(ray.origin, ray.direction)); + + let closestOnLine = allPointsNear.map(p => viewLine.closestPointToPoint(p.position, false, new Vector3())); + let closest = closestOnLine.sort( (a, b) => ray.origin.distanceTo(a) - ray.origin.distanceTo(b))[0]; + + let farthestOnLine = allPointsFar.map(p => viewLine.closestPointToPoint(p.position, false, new Vector3())); + let farthest = farthestOnLine.sort( (a, b) => ray.origin.distanceTo(b) - ray.origin.distanceTo(a))[0]; + + let distance = closest.distanceTo(farthest); + let centroid = new Vector3().addVectors(closest, farthest).multiplyScalar(0.5); + volume.scale.z = distance * 1.1; + volume.position.copy(centroid); + } + + volume.clip = true; + }; + + this.addEventListener("drag", drag); + this.addEventListener("drop", drop); + + viewer.inputHandler.addInputListener(this); + + return volume; + } + + update(e){ + //console.log(e.delta) + } + + render(){ + this.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera()); + } + + } + + class SpotLightHelper$1 extends Object3D{ + + constructor(light, color){ + super(); + + this.light = light; + this.color = color; + + //this.up.set(0, 0, 1); + this.updateMatrix(); + this.updateMatrixWorld(); + + { // SPHERE + let sg = new SphereGeometry(1, 32, 32); + let sm = new MeshNormalMaterial(); + this.sphere = new Mesh(sg, sm); + this.sphere.scale.set(0.5, 0.5, 0.5); + this.add(this.sphere); + } + + { // LINES + + + let positions = new Float32Array([ + +0, +0, +0, +0, +0, -1, + + +0, +0, +0, -1, -1, -1, + +0, +0, +0, +1, -1, -1, + +0, +0, +0, +1, +1, -1, + +0, +0, +0, -1, +1, -1, + + -1, -1, -1, +1, -1, -1, + +1, -1, -1, +1, +1, -1, + +1, +1, -1, -1, +1, -1, + -1, +1, -1, -1, -1, -1, + ]); + + let geometry = new BufferGeometry(); + geometry.setAttribute("position", new BufferAttribute(positions, 3)); + + let material = new LineBasicMaterial(); + + this.frustum = new LineSegments(geometry, material); + this.add(this.frustum); + + } + + this.update(); + } + + update(){ + + this.light.updateMatrix(); + this.light.updateMatrixWorld(); + + let position = this.light.position; + let target = new Vector3().addVectors( + this.light.position, this.light.getWorldDirection(new Vector3()).multiplyScalar(-1)); + + let quat = new Quaternion().setFromRotationMatrix( + new Matrix4().lookAt( position, target, new Vector3( 0, 0, 1 ) ) + ); + + this.setRotationFromQuaternion(quat); + this.position.copy(position); + + + let coneLength = (this.light.distance > 0) ? this.light.distance : 1000; + let coneWidth = coneLength * Math.tan( this.light.angle * 0.5 ); + + this.frustum.scale.set(coneWidth, coneWidth, coneLength); + + } + + } + + class TransformationTool { + constructor(viewer) { + this.viewer = viewer; + + this.scene = new Scene(); + + this.selection = []; + this.pivot = new Vector3(); + this.dragging = false; + this.showPickVolumes = false; + + this.viewer.inputHandler.registerInteractiveScene(this.scene); + this.viewer.inputHandler.addEventListener('selection_changed', (e) => { + for(let selected of this.selection){ + this.viewer.inputHandler.blacklist.delete(selected); + } + + this.selection = e.selection; + + for(let selected of this.selection){ + this.viewer.inputHandler.blacklist.add(selected); + } + + }); + + let red = 0xE73100; + let green = 0x44A24A; + let blue = 0x2669E7; + + this.activeHandle = null; + this.scaleHandles = { + "scale.x+": {name: "scale.x+", node: new Object3D(), color: red, alignment: [+1, +0, +0]}, + "scale.x-": {name: "scale.x-", node: new Object3D(), color: red, alignment: [-1, +0, +0]}, + "scale.y+": {name: "scale.y+", node: new Object3D(), color: green, alignment: [+0, +1, +0]}, + "scale.y-": {name: "scale.y-", node: new Object3D(), color: green, alignment: [+0, -1, +0]}, + "scale.z+": {name: "scale.z+", node: new Object3D(), color: blue, alignment: [+0, +0, +1]}, + "scale.z-": {name: "scale.z-", node: new Object3D(), color: blue, alignment: [+0, +0, -1]}, + }; + this.focusHandles = { + "focus.x+": {name: "focus.x+", node: new Object3D(), color: red, alignment: [+1, +0, +0]}, + "focus.x-": {name: "focus.x-", node: new Object3D(), color: red, alignment: [-1, +0, +0]}, + "focus.y+": {name: "focus.y+", node: new Object3D(), color: green, alignment: [+0, +1, +0]}, + "focus.y-": {name: "focus.y-", node: new Object3D(), color: green, alignment: [+0, -1, +0]}, + "focus.z+": {name: "focus.z+", node: new Object3D(), color: blue, alignment: [+0, +0, +1]}, + "focus.z-": {name: "focus.z-", node: new Object3D(), color: blue, alignment: [+0, +0, -1]}, + }; + this.translationHandles = { + "translation.x": {name: "translation.x", node: new Object3D(), color: red, alignment: [1, 0, 0]}, + "translation.y": {name: "translation.y", node: new Object3D(), color: green, alignment: [0, 1, 0]}, + "translation.z": {name: "translation.z", node: new Object3D(), color: blue, alignment: [0, 0, 1]}, + }; + this.rotationHandles = { + "rotation.x": {name: "rotation.x", node: new Object3D(), color: red, alignment: [1, 0, 0]}, + "rotation.y": {name: "rotation.y", node: new Object3D(), color: green, alignment: [0, 1, 0]}, + "rotation.z": {name: "rotation.z", node: new Object3D(), color: blue, alignment: [0, 0, 1]}, + }; + this.handles = Object.assign({}, this.scaleHandles, this.focusHandles, this.translationHandles, this.rotationHandles); + this.pickVolumes = []; + + this.initializeScaleHandles(); + this.initializeFocusHandles(); + this.initializeTranslationHandles(); + this.initializeRotationHandles(); + + + let boxFrameGeometry = new Geometry(); + { + // bottom + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, 0.5)); + // top + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, 0.5)); + // sides + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, 0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(0.5, 0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, -0.5, -0.5)); + boxFrameGeometry.vertices.push(new Vector3(-0.5, 0.5, -0.5)); + } + this.frame = new LineSegments(boxFrameGeometry, new LineBasicMaterial({color: 0xffff00})); + this.scene.add(this.frame); + + + } + + initializeScaleHandles(){ + let sgSphere = new SphereGeometry(1, 32, 32); + let sgLowPolySphere = new SphereGeometry(1, 16, 16); + + for(let handleName of Object.keys(this.scaleHandles)){ + let handle = this.scaleHandles[handleName]; + let node = handle.node; + this.scene.add(node); + node.position.set(...handle.alignment).multiplyScalar(0.5); + + let material = new MeshBasicMaterial({ + color: handle.color, + opacity: 0.4, + transparent: true + }); + + let outlineMaterial = new MeshBasicMaterial({ + color: 0x000000, + side: BackSide, + opacity: 0.4, + transparent: true}); + + let pickMaterial = new MeshNormalMaterial({ + opacity: 0.2, + transparent: true, + visible: this.showPickVolumes}); + + let sphere = new Mesh(sgSphere, material); + sphere.scale.set(1.3, 1.3, 1.3); + sphere.name = `${handleName}.handle`; + node.add(sphere); + + let outline = new Mesh(sgSphere, outlineMaterial); + outline.scale.set(1.4, 1.4, 1.4); + outline.name = `${handleName}.outline`; + sphere.add(outline); + + let pickSphere = new Mesh(sgLowPolySphere, pickMaterial); + pickSphere.name = `${handleName}.pick_volume`; + pickSphere.scale.set(3, 3, 3); + sphere.add(pickSphere); + pickSphere.handle = handleName; + this.pickVolumes.push(pickSphere); + + node.setOpacity = (target) => { + let opacity = {x: material.opacity}; + let t = new TWEEN.Tween(opacity).to({x: target}, 100); + t.onUpdate(() => { + sphere.visible = opacity.x > 0; + pickSphere.visible = opacity.x > 0; + material.opacity = opacity.x; + outlineMaterial.opacity = opacity.x; + pickSphere.material.opacity = opacity.x * 0.5; + }); + t.start(); + }; + + pickSphere.addEventListener("drag", (e) => this.dragScaleHandle(e)); + pickSphere.addEventListener("drop", (e) => this.dropScaleHandle(e)); + + pickSphere.addEventListener("mouseover", e => { + //node.setOpacity(1); + }); + + pickSphere.addEventListener("click", e => { + e.consume(); + }); + + pickSphere.addEventListener("mouseleave", e => { + //node.setOpacity(0.4); + }); + } + } + + initializeFocusHandles(){ + //let sgBox = new THREE.BoxGeometry(1, 1, 1); + let sgPlane = new PlaneGeometry(4, 4, 1, 1); + let sgLowPolySphere = new SphereGeometry(1, 16, 16); + + let texture = new TextureLoader().load(`${exports.resourcePath}/icons/eye_2.png`); + + for(let handleName of Object.keys(this.focusHandles)){ + let handle = this.focusHandles[handleName]; + let node = handle.node; + this.scene.add(node); + let align = handle.alignment; + + //node.lookAt(new THREE.Vector3().addVectors(node.position, new THREE.Vector3(...align))); + node.lookAt(new Vector3(...align)); + + let off = 0.8; + if(align[0] === 1){ + node.position.set(1, off, -off).multiplyScalar(0.5); + node.rotation.z = Math.PI / 2; + }else if(align[0] === -1){ + node.position.set(-1, -off, -off).multiplyScalar(0.5); + node.rotation.z = Math.PI / 2; + }else if(align[1] === 1){ + node.position.set(-off, 1, -off).multiplyScalar(0.5); + node.rotation.set(Math.PI / 2, Math.PI, 0.0); + }else if(align[1] === -1){ + node.position.set(off, -1, -off).multiplyScalar(0.5); + node.rotation.set(Math.PI / 2, 0.0, 0.0); + }else if(align[2] === 1){ + node.position.set(off, off, 1).multiplyScalar(0.5); + }else if(align[2] === -1){ + node.position.set(-off, off, -1).multiplyScalar(0.5); + } + + let material = new MeshBasicMaterial({ + color: handle.color, + opacity: 0, + transparent: true, + map: texture + }); + + //let outlineMaterial = new THREE.MeshBasicMaterial({ + // color: 0x000000, + // side: THREE.BackSide, + // opacity: 0, + // transparent: true}); + + let pickMaterial = new MeshNormalMaterial({ + //opacity: 0, + transparent: true, + visible: this.showPickVolumes}); + + let box = new Mesh(sgPlane, material); + box.name = `${handleName}.handle`; + box.scale.set(1.5, 1.5, 1.5); + box.position.set(0, 0, 0); + box.visible = false; + node.add(box); + //handle.focusNode = box; + + //let outline = new THREE.Mesh(sgPlane, outlineMaterial); + //outline.scale.set(1.4, 1.4, 1.4); + //outline.name = `${handleName}.outline`; + //box.add(outline); + + let pickSphere = new Mesh(sgLowPolySphere, pickMaterial); + pickSphere.name = `${handleName}.pick_volume`; + pickSphere.scale.set(3, 3, 3); + box.add(pickSphere); + pickSphere.handle = handleName; + this.pickVolumes.push(pickSphere); + + node.setOpacity = (target) => { + let opacity = {x: material.opacity}; + let t = new TWEEN.Tween(opacity).to({x: target}, 100); + t.onUpdate(() => { + pickSphere.visible = opacity.x > 0; + box.visible = opacity.x > 0; + material.opacity = opacity.x; + //outlineMaterial.opacity = opacity.x; + pickSphere.material.opacity = opacity.x * 0.5; + }); + t.start(); + }; + + pickSphere.addEventListener("drag", e => {}); + + pickSphere.addEventListener("mouseup", e => { + e.consume(); + }); + + pickSphere.addEventListener("mousedown", e => { + e.consume(); + }); + + pickSphere.addEventListener("click", e => { + e.consume(); + + let selected = this.selection[0]; + let maxScale = Math.max(...selected.scale.toArray()); + let minScale = Math.min(...selected.scale.toArray()); + let handleLength = Math.abs(selected.scale.dot(new Vector3(...handle.alignment))); + let alignment = new Vector3(...handle.alignment).multiplyScalar(2 * maxScale / handleLength); + alignment.applyMatrix4(selected.matrixWorld); + let newCamPos = alignment; + let newCamTarget = selected.getWorldPosition(new Vector3()); + + Utils.moveTo(this.viewer.scene, newCamPos, newCamTarget); + }); + + pickSphere.addEventListener("mouseover", e => { + //box.setOpacity(1); + }); + + pickSphere.addEventListener("mouseleave", e => { + //box.setOpacity(0.4); + }); + } + } + + initializeTranslationHandles(){ + let boxGeometry = new BoxGeometry(1, 1, 1); + + for(let handleName of Object.keys(this.translationHandles)){ + let handle = this.handles[handleName]; + let node = handle.node; + this.scene.add(node); + + let material = new MeshBasicMaterial({ + color: handle.color, + opacity: 0.4, + transparent: true}); + + let outlineMaterial = new MeshBasicMaterial({ + color: 0x000000, + side: BackSide, + opacity: 0.4, + transparent: true}); + + let pickMaterial = new MeshNormalMaterial({ + opacity: 0.2, + transparent: true, + visible: this.showPickVolumes + }); + + let box = new Mesh(boxGeometry, material); + box.name = `${handleName}.handle`; + box.scale.set(0.2, 0.2, 40); + box.lookAt(new Vector3(...handle.alignment)); + box.renderOrder = 10; + node.add(box); + handle.translateNode = box; + + let outline = new Mesh(boxGeometry, outlineMaterial); + outline.name = `${handleName}.outline`; + outline.scale.set(3, 3, 1.03); + outline.renderOrder = 0; + box.add(outline); + + let pickVolume = new Mesh(boxGeometry, pickMaterial); + pickVolume.name = `${handleName}.pick_volume`; + pickVolume.scale.set(12, 12, 1.1); + pickVolume.handle = handleName; + box.add(pickVolume); + this.pickVolumes.push(pickVolume); + + node.setOpacity = (target) => { + let opacity = {x: material.opacity}; + let t = new TWEEN.Tween(opacity).to({x: target}, 100); + t.onUpdate(() => { + box.visible = opacity.x > 0; + pickVolume.visible = opacity.x > 0; + material.opacity = opacity.x; + outlineMaterial.opacity = opacity.x; + pickMaterial.opacity = opacity.x * 0.5; + }); + t.start(); + }; + + pickVolume.addEventListener("drag", (e) => {this.dragTranslationHandle(e);}); + pickVolume.addEventListener("drop", (e) => {this.dropTranslationHandle(e);}); + } + } + + initializeRotationHandles(){ + let adjust = 0.5; + let torusGeometry = new TorusGeometry(1, adjust * 0.015, 8, 64, Math.PI / 2); + let outlineGeometry = new TorusGeometry(1, adjust * 0.04, 8, 64, Math.PI / 2); + let pickGeometry = new TorusGeometry(1, adjust * 0.1, 6, 4, Math.PI / 2); + + for(let handleName of Object.keys(this.rotationHandles)){ + let handle = this.handles[handleName]; + let node = handle.node; + this.scene.add(node); + + let material = new MeshBasicMaterial({ + color: handle.color, + opacity: 0.4, + transparent: true}); + + let outlineMaterial = new MeshBasicMaterial({ + color: 0x000000, + side: BackSide, + opacity: 0.4, + transparent: true}); + + let pickMaterial = new MeshNormalMaterial({ + opacity: 0.2, + transparent: true, + visible: this.showPickVolumes + }); + + let box = new Mesh(torusGeometry, material); + box.name = `${handleName}.handle`; + box.scale.set(20, 20, 20); + box.lookAt(new Vector3(...handle.alignment)); + node.add(box); + handle.translateNode = box; + + let outline = new Mesh(outlineGeometry, outlineMaterial); + outline.name = `${handleName}.outline`; + outline.scale.set(1, 1, 1); + outline.renderOrder = 0; + box.add(outline); + + let pickVolume = new Mesh(pickGeometry, pickMaterial); + pickVolume.name = `${handleName}.pick_volume`; + pickVolume.scale.set(1, 1, 1); + pickVolume.handle = handleName; + box.add(pickVolume); + this.pickVolumes.push(pickVolume); + + node.setOpacity = (target) => { + let opacity = {x: material.opacity}; + let t = new TWEEN.Tween(opacity).to({x: target}, 100); + t.onUpdate(() => { + box.visible = opacity.x > 0; + pickVolume.visible = opacity.x > 0; + material.opacity = opacity.x; + outlineMaterial.opacity = opacity.x; + pickMaterial.opacity = opacity.x * 0.5; + }); + t.start(); + }; + + + //pickVolume.addEventListener("mouseover", (e) => { + // //let a = this.viewer.scene.getActiveCamera().getWorldDirection(new THREE.Vector3()).dot(pickVolume.getWorldDirection(new THREE.Vector3())); + // console.log(pickVolume.getWorldDirection(new THREE.Vector3())); + //}); + + pickVolume.addEventListener("drag", (e) => {this.dragRotationHandle(e);}); + pickVolume.addEventListener("drop", (e) => {this.dropRotationHandle(e);}); + } + } + + dragRotationHandle(e){ + let drag = e.drag; + let handle = this.activeHandle; + let camera = this.viewer.scene.getActiveCamera(); + + if(!handle){ + return + }; + + let localNormal = new Vector3(...handle.alignment); + let n = new Vector3(); + n.copy(new Vector4(...localNormal.toArray(), 0).applyMatrix4(handle.node.matrixWorld)); + n.normalize(); + + if (!drag.intersectionStart){ + + //this.viewer.scene.scene.remove(this.debug); + //this.debug = new THREE.Object3D(); + //this.viewer.scene.scene.add(this.debug); + //Utils.debugSphere(this.debug, drag.location, 3, 0xaaaaaa); + //let debugEnd = drag.location.clone().add(n.clone().multiplyScalar(20)); + //Utils.debugLine(this.debug, drag.location, debugEnd, 0xff0000); + + drag.intersectionStart = drag.location; + drag.objectStart = drag.object.getWorldPosition(new Vector3()); + drag.handle = handle; + + let plane = new Plane().setFromNormalAndCoplanarPoint(n, drag.intersectionStart); + + drag.dragPlane = plane; + drag.pivot = drag.intersectionStart; + }else { + handle = drag.handle; + } + + this.dragging = true; + + let mouse = drag.end; + let domElement = this.viewer.renderer.domElement; + let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); + + let I = ray.intersectPlane(drag.dragPlane, new Vector3()); + + if (I) { + let center = this.scene.getWorldPosition(new Vector3()); + let from = drag.pivot; + let to = I; + + let v1 = from.clone().sub(center).normalize(); + let v2 = to.clone().sub(center).normalize(); + + let angle = Math.acos(v1.dot(v2)); + let sign = Math.sign(v1.cross(v2).dot(n)); + angle = angle * sign; + if (Number.isNaN(angle)) { + return; + } + + let normal = new Vector3(...handle.alignment); + for (let selection of this.selection) { + selection.rotateOnAxis(normal, angle); + selection.dispatchEvent({ + type: "orientation_changed", + object: selection + }); + } + + drag.pivot = I; + } + } + + dropRotationHandle(e){ + this.dragging = false; + this.setActiveHandle(null); + } + + dragTranslationHandle(e){ + let drag = e.drag; + let handle = this.activeHandle; + let camera = this.viewer.scene.getActiveCamera(); + + if(!drag.intersectionStart && handle){ + drag.intersectionStart = drag.location; + drag.objectStart = drag.object.getWorldPosition(new Vector3()); + + let start = drag.intersectionStart; + let dir = new Vector4(...handle.alignment, 0).applyMatrix4(this.scene.matrixWorld); + let end = new Vector3().addVectors(start, dir); + let line = new Line3(start.clone(), end.clone()); + drag.line = line; + + let camOnLine = line.closestPointToPoint(camera.position, false, new Vector3()); + let normal = new Vector3().subVectors(camera.position, camOnLine); + let plane = new Plane().setFromNormalAndCoplanarPoint(normal, drag.intersectionStart); + drag.dragPlane = plane; + drag.pivot = drag.intersectionStart; + }else { + handle = drag.handle; + } + + this.dragging = true; + + { + let mouse = drag.end; + let domElement = this.viewer.renderer.domElement; + let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); + let I = ray.intersectPlane(drag.dragPlane, new Vector3()); + + if (I) { + let iOnLine = drag.line.closestPointToPoint(I, false, new Vector3()); + + let diff = new Vector3().subVectors(iOnLine, drag.pivot); + + for (let selection of this.selection) { + selection.position.add(diff); + selection.dispatchEvent({ + type: "position_changed", + object: selection + }); + } + + drag.pivot = drag.pivot.add(diff); + } + } + } + + dropTranslationHandle(e){ + this.dragging = false; + this.setActiveHandle(null); + } + + dropScaleHandle(e){ + this.dragging = false; + this.setActiveHandle(null); + } + + dragScaleHandle(e){ + let drag = e.drag; + let handle = this.activeHandle; + let camera = this.viewer.scene.getActiveCamera(); + + if(!drag.intersectionStart){ + drag.intersectionStart = drag.location; + drag.objectStart = drag.object.getWorldPosition(new Vector3()); + drag.handle = handle; + + let start = drag.intersectionStart; + let dir = new Vector4(...handle.alignment, 0).applyMatrix4(this.scene.matrixWorld); + let end = new Vector3().addVectors(start, dir); + let line = new Line3(start.clone(), end.clone()); + drag.line = line; + + let camOnLine = line.closestPointToPoint(camera.position, false, new Vector3()); + let normal = new Vector3().subVectors(camera.position, camOnLine); + let plane = new Plane().setFromNormalAndCoplanarPoint(normal, drag.intersectionStart); + drag.dragPlane = plane; + drag.pivot = drag.intersectionStart; + + //Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05); + }else { + handle = drag.handle; + } + + this.dragging = true; + + { + let mouse = drag.end; + let domElement = this.viewer.renderer.domElement; + let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); + let I = ray.intersectPlane(drag.dragPlane, new Vector3()); + + if (I) { + let iOnLine = drag.line.closestPointToPoint(I, false, new Vector3()); + let direction = handle.alignment.reduce( (a, v) => a + v, 0); + + let toObjectSpace = this.selection[0].matrixWorld.clone().invert(); + let iOnLineOS = iOnLine.clone().applyMatrix4(toObjectSpace); + let pivotOS = drag.pivot.clone().applyMatrix4(toObjectSpace); + let diffOS = new Vector3().subVectors(iOnLineOS, pivotOS); + let dragDirectionOS = diffOS.clone().normalize(); + if(iOnLine.distanceTo(drag.pivot) === 0){ + dragDirectionOS.set(0, 0, 0); + } + let dragDirection = dragDirectionOS.dot(new Vector3(...handle.alignment)); + + let diff = new Vector3().subVectors(iOnLine, drag.pivot); + let diffScale = new Vector3(...handle.alignment).multiplyScalar(diff.length() * direction * dragDirection); + let diffPosition = diff.clone().multiplyScalar(0.5); + + for (let selection of this.selection) { + selection.scale.add(diffScale); + selection.scale.x = Math.max(0.1, selection.scale.x); + selection.scale.y = Math.max(0.1, selection.scale.y); + selection.scale.z = Math.max(0.1, selection.scale.z); + selection.position.add(diffPosition); + selection.dispatchEvent({ + type: "position_changed", + object: selection + }); + selection.dispatchEvent({ + type: "scale_changed", + object: selection + }); + } + + drag.pivot.copy(iOnLine); + //Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05); + } + } + } + + setActiveHandle(handle){ + if(this.dragging){ + return; + } + + if(this.activeHandle === handle){ + return; + } + + this.activeHandle = handle; + + if(handle === null){ + for(let handleName of Object.keys(this.handles)){ + let handle = this.handles[handleName]; + handle.node.setOpacity(0); + } + } + + for(let handleName of Object.keys(this.focusHandles)){ + let handle = this.focusHandles[handleName]; + + if(this.activeHandle === handle){ + handle.node.setOpacity(1.0); + }else { + handle.node.setOpacity(0.4); + } + } + + for(let handleName of Object.keys(this.translationHandles)){ + let handle = this.translationHandles[handleName]; + + if(this.activeHandle === handle){ + handle.node.setOpacity(1.0); + }else { + handle.node.setOpacity(0.4); + } + } + + for(let handleName of Object.keys(this.rotationHandles)){ + let handle = this.rotationHandles[handleName]; + + //if(this.activeHandle === handle){ + // handle.node.setOpacity(1.0); + //}else{ + // handle.node.setOpacity(0.4) + //} + + handle.node.setOpacity(0.4); + } + + for(let handleName of Object.keys(this.scaleHandles)){ + let handle = this.scaleHandles[handleName]; + + if(this.activeHandle === handle){ + handle.node.setOpacity(1.0); + + let relatedFocusHandle = this.focusHandles[handle.name.replace("scale", "focus")]; + let relatedFocusNode = relatedFocusHandle.node; + relatedFocusNode.setOpacity(0.4); + + for(let translationHandleName of Object.keys(this.translationHandles)){ + let translationHandle = this.translationHandles[translationHandleName]; + translationHandle.node.setOpacity(0.4); + } + + //let relatedTranslationHandle = this.translationHandles[ + // handle.name.replace("scale", "translation").replace(/[+-]/g, "")]; + //let relatedTranslationNode = relatedTranslationHandle.node; + //relatedTranslationNode.setOpacity(0.4); + + + }else { + handle.node.setOpacity(0.4); + } + } + + + + + + if(handle){ + handle.node.setOpacity(1.0); + } + + + } + + update () { + + if(this.selection.length === 1){ + + this.scene.visible = true; + + this.scene.updateMatrix(); + this.scene.updateMatrixWorld(); + + let selected = this.selection[0]; + let world = selected.matrixWorld; + let camera = this.viewer.scene.getActiveCamera(); + let domElement = this.viewer.renderer.domElement; + let mouse = this.viewer.inputHandler.mouse; + + let center = selected.boundingBox.getCenter(new Vector3()).clone().applyMatrix4(selected.matrixWorld); + + this.scene.scale.copy(selected.boundingBox.getSize(new Vector3()).multiply(selected.scale)); + this.scene.position.copy(center); + this.scene.rotation.copy(selected.rotation); + + this.scene.updateMatrixWorld(); + + { + // adjust scale of components + for(let handleName of Object.keys(this.handles)){ + let handle = this.handles[handleName]; + let node = handle.node; + + let handlePos = node.getWorldPosition(new Vector3()); + let distance = handlePos.distanceTo(camera.position); + let pr = Utils.projectedRadius(1, camera, distance, domElement.clientWidth, domElement.clientHeight); + + let ws = node.parent.getWorldScale(new Vector3()); + + let s = (7 / pr); + let scale = new Vector3(s, s, s).divide(ws); + + let rot = new Matrix4().makeRotationFromEuler(node.rotation); + let rotInv = rot.clone().invert(); + + scale.applyMatrix4(rotInv); + scale.x = Math.abs(scale.x); + scale.y = Math.abs(scale.y); + scale.z = Math.abs(scale.z); + + node.scale.copy(scale); + } + + // adjust rotation handles + if(!this.dragging){ + let tWorld = this.scene.matrixWorld; + let tObject = tWorld.clone().invert(); + let camObjectPos = camera.getWorldPosition(new Vector3()).applyMatrix4(tObject); + + let x = this.rotationHandles["rotation.x"].node.rotation; + let y = this.rotationHandles["rotation.y"].node.rotation; + let z = this.rotationHandles["rotation.z"].node.rotation; + + x.order = "ZYX"; + y.order = "ZYX"; + + let above = camObjectPos.z > 0; + let below = !above; + let PI_HALF = Math.PI / 2; + + if(above){ + if(camObjectPos.x > 0 && camObjectPos.y > 0){ + x.x = 1 * PI_HALF; + y.y = 3 * PI_HALF; + z.z = 0 * PI_HALF; + }else if(camObjectPos.x < 0 && camObjectPos.y > 0){ + x.x = 1 * PI_HALF; + y.y = 2 * PI_HALF; + z.z = 1 * PI_HALF; + }else if(camObjectPos.x < 0 && camObjectPos.y < 0){ + x.x = 2 * PI_HALF; + y.y = 2 * PI_HALF; + z.z = 2 * PI_HALF; + }else if(camObjectPos.x > 0 && camObjectPos.y < 0){ + x.x = 2 * PI_HALF; + y.y = 3 * PI_HALF; + z.z = 3 * PI_HALF; + } + }else if(below){ + if(camObjectPos.x > 0 && camObjectPos.y > 0){ + x.x = 0 * PI_HALF; + y.y = 0 * PI_HALF; + z.z = 0 * PI_HALF; + }else if(camObjectPos.x < 0 && camObjectPos.y > 0){ + x.x = 0 * PI_HALF; + y.y = 1 * PI_HALF; + z.z = 1 * PI_HALF; + }else if(camObjectPos.x < 0 && camObjectPos.y < 0){ + x.x = 3 * PI_HALF; + y.y = 1 * PI_HALF; + z.z = 2 * PI_HALF; + }else if(camObjectPos.x > 0 && camObjectPos.y < 0){ + x.x = 3 * PI_HALF; + y.y = 0 * PI_HALF; + z.z = 3 * PI_HALF; + } + } + } + + { + let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); + let raycaster = new Raycaster(ray.origin, ray.direction); + let intersects = raycaster.intersectObjects(this.pickVolumes.filter(v => v.visible), true); + + if(intersects.length > 0){ + let I = intersects[0]; + let handleName = I.object.handle; + this.setActiveHandle(this.handles[handleName]); + }else { + this.setActiveHandle(null); + } + } + + // + for(let handleName of Object.keys(this.scaleHandles)){ + let handle = this.handles[handleName]; + let node = handle.node; + let alignment = handle.alignment; + + + + } + } + + }else { + this.scene.visible = false; + } + + } + + }; + + class VolumeTool extends EventDispatcher{ + constructor (viewer) { + super(); + + this.viewer = viewer; + this.renderer = viewer.renderer; + + this.addEventListener('start_inserting_volume', e => { + this.viewer.dispatchEvent({ + type: 'cancel_insertions' + }); + }); + + this.scene = new Scene(); + this.scene.name = 'scene_volume'; + + this.viewer.inputHandler.registerInteractiveScene(this.scene); + + this.onRemove = e => { + this.scene.remove(e.volume); + }; + + this.onAdd = e => { + this.scene.add(e.volume); + }; + + for(let volume of viewer.scene.volumes){ + this.onAdd({volume: volume}); + } + + this.viewer.inputHandler.addEventListener('delete', e => { + let volumes = e.selection.filter(e => (e instanceof Volume)); + volumes.forEach(e => this.viewer.scene.removeVolume(e)); + }); + + viewer.addEventListener("update", this.update.bind(this)); + viewer.addEventListener("render.pass.scene", e => this.render(e)); + viewer.addEventListener("scene_changed", this.onSceneChange.bind(this)); + + viewer.scene.addEventListener('volume_added', this.onAdd); + viewer.scene.addEventListener('volume_removed', this.onRemove); + } + + onSceneChange(e){ + if(e.oldScene){ + e.oldScene.removeEventListeners('volume_added', this.onAdd); + e.oldScene.removeEventListeners('volume_removed', this.onRemove); + } + + e.scene.addEventListener('volume_added', this.onAdd); + e.scene.addEventListener('volume_removed', this.onRemove); + } + + startInsertion (args = {}) { + let volume; + if(args.type){ + volume = new args.type(); + }else { + volume = new BoxVolume(); + } + + volume.clip = args.clip || false; + volume.name = args.name || 'Volume'; + + this.dispatchEvent({ + type: 'start_inserting_volume', + volume: volume + }); + + this.viewer.scene.addVolume(volume); + this.scene.add(volume); + + let cancel = { + callback: null + }; + + let drag = e => { + let camera = this.viewer.scene.getActiveCamera(); + + let I = Utils.getMousePointCloudIntersection( + e.drag.end, + this.viewer.scene.getActiveCamera(), + this.viewer, + this.viewer.scene.pointclouds, + {pickClipped: false}); + + if (I) { + volume.position.copy(I.location); + + let wp = volume.getWorldPosition(new Vector3()).applyMatrix4(camera.matrixWorldInverse); + // let pp = new THREE.Vector4(wp.x, wp.y, wp.z).applyMatrix4(camera.projectionMatrix); + let w = Math.abs((wp.z / 5)); + volume.scale.set(w, w, w); + } + }; + + let drop = e => { + volume.removeEventListener('drag', drag); + volume.removeEventListener('drop', drop); + + cancel.callback(); + }; + + cancel.callback = e => { + volume.removeEventListener('drag', drag); + volume.removeEventListener('drop', drop); + this.viewer.removeEventListener('cancel_insertions', cancel.callback); + }; + + volume.addEventListener('drag', drag); + volume.addEventListener('drop', drop); + this.viewer.addEventListener('cancel_insertions', cancel.callback); + + this.viewer.inputHandler.startDragging(volume); + + return volume; + } + + update(){ + if (!this.viewer.scene) { + return; + } + + let camera = this.viewer.scene.getActiveCamera(); + let renderAreaSize = this.viewer.renderer.getSize(new Vector2()); + let clientWidth = renderAreaSize.width; + let clientHeight = renderAreaSize.height; + + let volumes = this.viewer.scene.volumes; + for (let volume of volumes) { + let label = volume.label; + + { + + let distance = label.position.distanceTo(camera.position); + let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight); + + let scale = (70 / pr); + label.scale.set(scale, scale, scale); + } + + let calculatedVolume = volume.getVolume(); + calculatedVolume = calculatedVolume / Math.pow(this.viewer.lengthUnit.unitspermeter, 3) * Math.pow(this.viewer.lengthUnitDisplay.unitspermeter, 3); //convert to cubic meters then to the cubic display unit + let text = Utils.addCommas(calculatedVolume.toFixed(3)) + ' ' + this.viewer.lengthUnitDisplay.code + '\u00B3'; + label.setText(text); + } + } + + render(params){ + const renderer = this.viewer.renderer; + + const oldTarget = renderer.getRenderTarget(); + + if(params.renderTarget){ + renderer.setRenderTarget(params.renderTarget); + } + renderer.render(this.scene, this.viewer.scene.getActiveCamera()); + renderer.setRenderTarget(oldTarget); + } + + } + + class Compass{ + + constructor(viewer){ + this.viewer = viewer; + + this.visible = false; + this.dom = this.createElement(); + + viewer.addEventListener("update", () => { + const direction = viewer.scene.view.direction.clone(); + direction.z = 0; + direction.normalize(); + + const camera = viewer.scene.getActiveCamera(); + + const p1 = camera.getWorldPosition(new Vector3()); + const p2 = p1.clone().add(direction); + + const projection = viewer.getProjection(); + const azimuth = Utils.computeAzimuth(p1, p2, projection); + + this.dom.css("transform", `rotateZ(${-azimuth}rad)`); + }); + + this.dom.click( () => { + viewer.setTopView(); + }); + + const renderArea = $(viewer.renderArea); + renderArea.append(this.dom); + + this.setVisible(this.visible); + } + + setVisible(visible){ + this.visible = visible; + + const value = visible ? "" : "none"; + this.dom.css("display", value); + } + + isVisible(){ + return this.visible; + } + + createElement(){ + const style = `style="position: absolute; top: 10px; right: 10px; z-index: 10000; width: 64px;"`; + const img = $(``); + + return img; + } + + }; + + class PotreeRenderer { + + constructor (viewer) { + this.viewer = viewer; + this.renderer = viewer.renderer; + + { + let dummyScene = new Scene(); + let geometry = new SphereGeometry(0.001, 2, 2); + let mesh = new Mesh(geometry, new MeshBasicMaterial()); + mesh.position.set(36453, 35163, 764712); + dummyScene.add(mesh); + + this.dummyMesh = mesh; + this.dummyScene = dummyScene; + } + } + + clearTargets(){ + + } + + clear(){ + let {viewer, renderer} = this; + + + // render skybox + if(viewer.background === "skybox"){ + renderer.setClearColor(0xff0000, 1); + }else if(viewer.background === "gradient"){ + renderer.setClearColor(0x00ff00, 1); + }else if(viewer.background === "black"){ + renderer.setClearColor(0x000000, 1); + }else if(viewer.background === "white"){ + renderer.setClearColor(0xFFFFFF, 1); + }else { + renderer.setClearColor(0x000000, 0); + } + + renderer.clear(); + } + + render(params){ + let {viewer, renderer} = this; + + const camera = params.camera ? params.camera : viewer.scene.getActiveCamera(); + + viewer.dispatchEvent({type: "render.pass.begin",viewer: viewer}); + + const renderAreaSize = renderer.getSize(new Vector2()); + const width = params.viewport ? params.viewport[2] : renderAreaSize.x; + const height = params.viewport ? params.viewport[3] : renderAreaSize.y; + + // render skybox + if(viewer.background === "skybox"){ + viewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation); + viewer.skybox.camera.fov = viewer.scene.cameraP.fov; + viewer.skybox.camera.aspect = viewer.scene.cameraP.aspect; + + viewer.skybox.parent.rotation.x = 0; + viewer.skybox.parent.updateMatrixWorld(); + + viewer.skybox.camera.updateProjectionMatrix(); + renderer.render(viewer.skybox.scene, viewer.skybox.camera); + }else if(viewer.background === "gradient"){ + renderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG); + } + + for(let pointcloud of this.viewer.scene.pointclouds){ + const {material} = pointcloud; + material.useEDL = false; + } + + viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null, { + clipSpheres: viewer.scene.volumes.filter(v => (v instanceof Potree.SphereVolume)), + }); + + // render scene + renderer.render(viewer.scene.scene, camera); + + viewer.dispatchEvent({type: "render.pass.scene",viewer: viewer}); + + viewer.clippingTool.update(); + renderer.render(viewer.clippingTool.sceneMarker, viewer.scene.cameraScreenSpace); //viewer.scene.cameraScreenSpace); + renderer.render(viewer.clippingTool.sceneVolume, camera); + + renderer.render(viewer.controls.sceneControls, camera); + + renderer.clearDepth(); + + viewer.transformationTool.update(); + + viewer.dispatchEvent({type: "render.pass.perspective_overlay",viewer: viewer}); + + // renderer.render(viewer.controls.sceneControls, camera); + // renderer.render(viewer.clippingTool.sceneVolume, camera); + // renderer.render(viewer.transformationTool.scene, camera); + + // renderer.setViewport(width - viewer.navigationCube.width, + // height - viewer.navigationCube.width, + // viewer.navigationCube.width, viewer.navigationCube.width); + // renderer.render(viewer.navigationCube, viewer.navigationCube.camera); + // renderer.setViewport(0, 0, width, height); + + viewer.dispatchEvent({type: "render.pass.end",viewer: viewer}); + } + + } + + class EDLRenderer{ + constructor(viewer){ + this.viewer = viewer; + + this.edlMaterial = null; + + this.rtRegular; + this.rtEDL; + + this.gl = viewer.renderer.getContext(); + + this.shadowMap = new PointCloudSM(this.viewer.pRenderer); + } + + initEDL(){ + if (this.edlMaterial != null) { + return; + } + + this.edlMaterial = new EyeDomeLightingMaterial(); + this.edlMaterial.depthTest = true; + this.edlMaterial.depthWrite = true; + this.edlMaterial.transparent = true; + + this.rtEDL = new WebGLRenderTarget(1024, 1024, { + minFilter: NearestFilter, + magFilter: NearestFilter, + format: RGBAFormat, + type: FloatType, + depthTexture: new DepthTexture(undefined, undefined, UnsignedIntType) + }); + + this.rtRegular = new WebGLRenderTarget(1024, 1024, { + minFilter: NearestFilter, + magFilter: NearestFilter, + format: RGBAFormat, + depthTexture: new DepthTexture(undefined, undefined, UnsignedIntType) + }); + }; + + resize(width, height){ + if(this.screenshot){ + width = this.screenshot.target.width; + height = this.screenshot.target.height; + } + + this.rtEDL.setSize(width , height); + this.rtRegular.setSize(width , height); + } + + makeScreenshot(camera, size, callback){ + + if(camera === undefined || camera === null){ + camera = this.viewer.scene.getActiveCamera(); + } + + if(size === undefined || size === null){ + size = this.viewer.renderer.getSize(new Vector2()); + } + + let {width, height} = size; + + //let maxTextureSize = viewer.renderer.capabilities.maxTextureSize; + //if(width * 4 < + width = 2 * width; + height = 2 * height; + + let target = new WebGLRenderTarget(width, height, { + format: RGBAFormat, + }); + + this.screenshot = { + target: target + }; + + // HACK? removed because of error, was this important? + //this.viewer.renderer.clearTarget(target, true, true, true); + + this.render(); + + let pixelCount = width * height; + let buffer = new Uint8Array(4 * pixelCount); + + this.viewer.renderer.readRenderTargetPixels(target, 0, 0, width, height, buffer); + + // flip vertically + let bytesPerLine = width * 4; + for(let i = 0; i < parseInt(height / 2); i++){ + let j = height - i - 1; + + let lineI = buffer.slice(i * bytesPerLine, i * bytesPerLine + bytesPerLine); + let lineJ = buffer.slice(j * bytesPerLine, j * bytesPerLine + bytesPerLine); + buffer.set(lineJ, i * bytesPerLine); + buffer.set(lineI, j * bytesPerLine); + } + + this.screenshot.target.dispose(); + delete this.screenshot; + + return { + width: width, + height: height, + buffer: buffer + }; + } + + clearTargets(){ + const viewer = this.viewer; + const {renderer} = viewer; + + const oldTarget = renderer.getRenderTarget(); + + renderer.setRenderTarget( this.rtEDL ); + renderer.clear( true, true, true ); + + renderer.setRenderTarget( this.rtRegular ); + renderer.clear( true, true, false ); + + renderer.setRenderTarget(oldTarget); + } + + clear(){ + this.initEDL(); + const viewer = this.viewer; + + const {renderer, background} = viewer; + + if(background === "skybox"){ + renderer.setClearColor(0x000000, 0); + } else if (background === 'gradient') { + renderer.setClearColor(0x000000, 0); + } else if (background === 'black') { + renderer.setClearColor(0x000000, 1); + } else if (background === 'white') { + renderer.setClearColor(0xFFFFFF, 1); + } else { + renderer.setClearColor(0x000000, 0); + } + + renderer.clear(); + + this.clearTargets(); + } + + renderShadowMap(visiblePointClouds, camera, lights){ + + const {viewer} = this; + + const doShadows = lights.length > 0 && !(lights[0].disableShadowUpdates); + if(doShadows){ + let light = lights[0]; + + this.shadowMap.setLight(light); + + let originalAttributes = new Map(); + for(let pointcloud of viewer.scene.pointclouds){ + // TODO IMPORTANT !!! check + originalAttributes.set(pointcloud, pointcloud.material.activeAttributeName); + pointcloud.material.disableEvents(); + pointcloud.material.activeAttributeName = "depth"; + //pointcloud.material.pointColorType = PointColorType.DEPTH; + } + + this.shadowMap.render(viewer.scene.scenePointCloud, camera); + + for(let pointcloud of visiblePointClouds){ + let originalAttribute = originalAttributes.get(pointcloud); + // TODO IMPORTANT !!! check + pointcloud.material.activeAttributeName = originalAttribute; + pointcloud.material.enableEvents(); + } + + viewer.shadowTestCam.updateMatrixWorld(); + viewer.shadowTestCam.matrixWorldInverse.copy(viewer.shadowTestCam.matrixWorld).invert(); + viewer.shadowTestCam.updateProjectionMatrix(); + } + + } + + render(params){ + this.initEDL(); + + const viewer = this.viewer; + let camera = params.camera ? params.camera : viewer.scene.getActiveCamera(); + const {width, height} = this.viewer.renderer.getSize(new Vector2()); + + + viewer.dispatchEvent({type: "render.pass.begin",viewer: viewer}); + + this.resize(width, height); + + const visiblePointClouds = viewer.scene.pointclouds.filter(pc => pc.visible); + + if(this.screenshot){ + let oldBudget = Potree.pointBudget; + Potree.pointBudget = Math.max(10 * 1000 * 1000, 2 * oldBudget); + let result = Potree.updatePointClouds( + viewer.scene.pointclouds, + camera, + viewer.renderer); + Potree.pointBudget = oldBudget; + } + + let lights = []; + viewer.scene.scene.traverse(node => { + if(node.type === "SpotLight"){ + lights.push(node); + } + }); + + if(viewer.background === "skybox"){ + viewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation); + viewer.skybox.camera.fov = viewer.scene.cameraP.fov; + viewer.skybox.camera.aspect = viewer.scene.cameraP.aspect; + + viewer.skybox.parent.rotation.x = 0; + viewer.skybox.parent.updateMatrixWorld(); + + viewer.skybox.camera.updateProjectionMatrix(); + viewer.renderer.render(viewer.skybox.scene, viewer.skybox.camera); + } else if (viewer.background === 'gradient') { + viewer.renderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG); + } + + //TODO adapt to multiple lights + this.renderShadowMap(visiblePointClouds, camera, lights); + + { // COLOR & DEPTH PASS + for (let pointcloud of visiblePointClouds) { + let octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new Vector3()).x; + + let material = pointcloud.material; + material.weighted = false; + material.useLogarithmicDepthBuffer = false; + material.useEDL = true; + + material.screenWidth = width; + material.screenHeight = height; + material.uniforms.visibleNodes.value = pointcloud.material.visibleNodesTexture; + material.uniforms.octreeSize.value = octreeSize; + material.spacing = pointcloud.pcoGeometry.spacing; // * Math.max(pointcloud.scale.x, pointcloud.scale.y, pointcloud.scale.z); + } + + // TODO adapt to multiple lights + viewer.renderer.setRenderTarget(this.rtEDL); + + if(lights.length > 0){ + viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtEDL, { + clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)), + shadowMaps: [this.shadowMap], + transparent: false, + }); + }else { + + + // let test = camera.clone(); + // test.matrixAutoUpdate = false; + + // //test.updateMatrixWorld = () => {}; + + // let mat = new THREE.Matrix4().set( + // 1, 0, 0, 0, + // 0, 0, 1, 0, + // 0, -1, 0, 0, + // 0, 0, 0, 1, + // ); + // mat.invert() + + // test.matrix.multiplyMatrices(mat, test.matrix); + // test.updateMatrixWorld(); + + //test.matrixWorld.multiplyMatrices(mat, test.matrixWorld); + //test.matrixWorld.multiply(mat); + //test.matrixWorldInverse.invert(test.matrixWorld); + //test.matrixWorldInverse.multiplyMatrices(test.matrixWorldInverse, mat); + + + viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtEDL, { + clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)), + transparent: false, + }); + } + + + } + + viewer.dispatchEvent({type: "render.pass.scene", viewer: viewer, renderTarget: this.rtRegular}); + viewer.renderer.setRenderTarget(null); + viewer.renderer.render(viewer.scene.scene, camera); + + { // EDL PASS + + const uniforms = this.edlMaterial.uniforms; + + uniforms.screenWidth.value = width; + uniforms.screenHeight.value = height; + + let proj = camera.projectionMatrix; + let projArray = new Float32Array(16); + projArray.set(proj.elements); + + uniforms.uNear.value = camera.near; + uniforms.uFar.value = camera.far; + uniforms.uEDLColor.value = this.rtEDL.texture; + uniforms.uEDLDepth.value = this.rtEDL.depthTexture; + uniforms.uProj.value = projArray; + + uniforms.edlStrength.value = viewer.edlStrength; + uniforms.radius.value = viewer.edlRadius; + uniforms.opacity.value = viewer.edlOpacity; // HACK + + Utils.screenPass.render(viewer.renderer, this.edlMaterial); + + if(this.screenshot){ + Utils.screenPass.render(viewer.renderer, this.edlMaterial, this.screenshot.target); + } + + } + + viewer.dispatchEvent({type: "render.pass.scene", viewer: viewer}); + + viewer.renderer.clearDepth(); + + viewer.transformationTool.update(); + + viewer.dispatchEvent({type: "render.pass.perspective_overlay",viewer: viewer}); + + viewer.renderer.render(viewer.controls.sceneControls, camera); + viewer.renderer.render(viewer.clippingTool.sceneVolume, camera); + viewer.renderer.render(viewer.transformationTool.scene, camera); + + viewer.dispatchEvent({type: "render.pass.end",viewer: viewer}); + + } + } + + class HQSplatRenderer{ + + constructor(viewer){ + this.viewer = viewer; + + this.depthMaterials = new Map(); + this.attributeMaterials = new Map(); + this.normalizationMaterial = null; + + this.rtDepth = null; + this.rtAttribute = null; + this.gl = viewer.renderer.getContext(); + + this.initialized = false; + } + + init(){ + if (this.initialized) { + return; + } + + this.normalizationMaterial = new NormalizationMaterial(); + this.normalizationMaterial.depthTest = true; + this.normalizationMaterial.depthWrite = true; + this.normalizationMaterial.transparent = true; + + this.normalizationEDLMaterial = new NormalizationEDLMaterial(); + this.normalizationEDLMaterial.depthTest = true; + this.normalizationEDLMaterial.depthWrite = true; + this.normalizationEDLMaterial.transparent = true; + + this.rtDepth = new WebGLRenderTarget(1024, 1024, { + minFilter: NearestFilter, + magFilter: NearestFilter, + format: RGBAFormat, + type: FloatType, + depthTexture: new DepthTexture(undefined, undefined, UnsignedIntType) + }); + + this.rtAttribute = new WebGLRenderTarget(1024, 1024, { + minFilter: NearestFilter, + magFilter: NearestFilter, + format: RGBAFormat, + type: FloatType, + depthTexture: this.rtDepth.depthTexture, + }); + + this.initialized = true; + }; + + resize(width, height){ + this.rtDepth.setSize(width, height); + this.rtAttribute.setSize(width, height); + } + + clearTargets(){ + const viewer = this.viewer; + const {renderer} = viewer; + + const oldTarget = renderer.getRenderTarget(); + + renderer.setClearColor(0x000000, 0); + + renderer.setRenderTarget( this.rtDepth ); + renderer.clear( true, true, true ); + + renderer.setRenderTarget( this.rtAttribute ); + renderer.clear( true, true, true ); + + renderer.setRenderTarget(oldTarget); + } + + + clear(){ + this.init(); + + const {renderer, background} = this.viewer; + + if(background === "skybox"){ + renderer.setClearColor(0x000000, 0); + } else if (background === 'gradient') { + renderer.setClearColor(0x000000, 0); + } else if (background === 'black') { + renderer.setClearColor(0x000000, 1); + } else if (background === 'white') { + renderer.setClearColor(0xFFFFFF, 1); + } else { + renderer.setClearColor(0x000000, 0); + } + + renderer.clear(); + + this.clearTargets(); + } + + render (params) { + this.init(); + + const viewer = this.viewer; + const camera = params.camera ? params.camera : viewer.scene.getActiveCamera(); + const {width, height} = this.viewer.renderer.getSize(new Vector2()); + + viewer.dispatchEvent({type: "render.pass.begin",viewer: viewer}); + + this.resize(width, height); + + const visiblePointClouds = viewer.scene.pointclouds.filter(pc => pc.visible); + const originalMaterials = new Map(); + + for(let pointcloud of visiblePointClouds){ + originalMaterials.set(pointcloud, pointcloud.material); + + if(!this.attributeMaterials.has(pointcloud)){ + let attributeMaterial = new PointCloudMaterial$1(); + this.attributeMaterials.set(pointcloud, attributeMaterial); + } + + if(!this.depthMaterials.has(pointcloud)){ + let depthMaterial = new PointCloudMaterial$1(); + + depthMaterial.setDefine("depth_pass", "#define hq_depth_pass"); + depthMaterial.setDefine("use_edl", "#define use_edl"); + + this.depthMaterials.set(pointcloud, depthMaterial); + } + } + + { // DEPTH PASS + for (let pointcloud of visiblePointClouds) { + let octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new Vector3()).x; + + let material = originalMaterials.get(pointcloud); + let depthMaterial = this.depthMaterials.get(pointcloud); + + depthMaterial.size = material.size; + depthMaterial.minSize = material.minSize; + depthMaterial.maxSize = material.maxSize; + + depthMaterial.pointSizeType = material.pointSizeType; + depthMaterial.visibleNodesTexture = material.visibleNodesTexture; + depthMaterial.weighted = false; + depthMaterial.screenWidth = width; + depthMaterial.shape = PointShape.CIRCLE; + depthMaterial.screenHeight = height; + depthMaterial.uniforms.visibleNodes.value = material.visibleNodesTexture; + depthMaterial.uniforms.octreeSize.value = octreeSize; + depthMaterial.spacing = pointcloud.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray()); + depthMaterial.classification = material.classification; + depthMaterial.uniforms.classificationLUT.value.image.data = material.uniforms.classificationLUT.value.image.data; + depthMaterial.classificationTexture.needsUpdate = true; + + depthMaterial.uniforms.uFilterReturnNumberRange.value = material.uniforms.uFilterReturnNumberRange.value; + depthMaterial.uniforms.uFilterNumberOfReturnsRange.value = material.uniforms.uFilterNumberOfReturnsRange.value; + depthMaterial.uniforms.uFilterGPSTimeClipRange.value = material.uniforms.uFilterGPSTimeClipRange.value; + depthMaterial.uniforms.uFilterPointSourceIDClipRange.value = material.uniforms.uFilterPointSourceIDClipRange.value; + + depthMaterial.clipTask = material.clipTask; + depthMaterial.clipMethod = material.clipMethod; + depthMaterial.setClipBoxes(material.clipBoxes); + depthMaterial.setClipPolygons(material.clipPolygons); + + pointcloud.material = depthMaterial; + } + + viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtDepth, { + clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)), + }); + } + + { // ATTRIBUTE PASS + for (let pointcloud of visiblePointClouds) { + let octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new Vector3()).x; + + let material = originalMaterials.get(pointcloud); + let attributeMaterial = this.attributeMaterials.get(pointcloud); + + attributeMaterial.size = material.size; + attributeMaterial.minSize = material.minSize; + attributeMaterial.maxSize = material.maxSize; + + attributeMaterial.pointSizeType = material.pointSizeType; + attributeMaterial.activeAttributeName = material.activeAttributeName; + attributeMaterial.visibleNodesTexture = material.visibleNodesTexture; + attributeMaterial.weighted = true; + attributeMaterial.screenWidth = width; + attributeMaterial.screenHeight = height; + attributeMaterial.shape = PointShape.CIRCLE; + attributeMaterial.uniforms.visibleNodes.value = material.visibleNodesTexture; + attributeMaterial.uniforms.octreeSize.value = octreeSize; + attributeMaterial.spacing = pointcloud.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray()); + attributeMaterial.classification = material.classification; + attributeMaterial.uniforms.classificationLUT.value.image.data = material.uniforms.classificationLUT.value.image.data; + attributeMaterial.classificationTexture.needsUpdate = true; + + attributeMaterial.uniforms.uFilterReturnNumberRange.value = material.uniforms.uFilterReturnNumberRange.value; + attributeMaterial.uniforms.uFilterNumberOfReturnsRange.value = material.uniforms.uFilterNumberOfReturnsRange.value; + attributeMaterial.uniforms.uFilterGPSTimeClipRange.value = material.uniforms.uFilterGPSTimeClipRange.value; + attributeMaterial.uniforms.uFilterPointSourceIDClipRange.value = material.uniforms.uFilterPointSourceIDClipRange.value; + + attributeMaterial.elevationGradientRepeat = material.elevationGradientRepeat; + attributeMaterial.elevationRange = material.elevationRange; + attributeMaterial.gradient = material.gradient; + attributeMaterial.matcap = material.matcap; + + attributeMaterial.intensityRange = material.intensityRange; + attributeMaterial.intensityGamma = material.intensityGamma; + attributeMaterial.intensityContrast = material.intensityContrast; + attributeMaterial.intensityBrightness = material.intensityBrightness; + + attributeMaterial.rgbGamma = material.rgbGamma; + attributeMaterial.rgbContrast = material.rgbContrast; + attributeMaterial.rgbBrightness = material.rgbBrightness; + + attributeMaterial.weightRGB = material.weightRGB; + attributeMaterial.weightIntensity = material.weightIntensity; + attributeMaterial.weightElevation = material.weightElevation; + attributeMaterial.weightRGB = material.weightRGB; + attributeMaterial.weightClassification = material.weightClassification; + attributeMaterial.weightReturnNumber = material.weightReturnNumber; + attributeMaterial.weightSourceID = material.weightSourceID; + + attributeMaterial.color = material.color; + + attributeMaterial.clipTask = material.clipTask; + attributeMaterial.clipMethod = material.clipMethod; + attributeMaterial.setClipBoxes(material.clipBoxes); + attributeMaterial.setClipPolygons(material.clipPolygons); + + pointcloud.material = attributeMaterial; + } + + let gl = this.gl; + + viewer.renderer.setRenderTarget(null); + viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtAttribute, { + clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)), + //material: this.attributeMaterial, + blendFunc: [gl.SRC_ALPHA, gl.ONE], + //depthTest: false, + depthWrite: false + }); + } + + for(let [pointcloud, material] of originalMaterials){ + pointcloud.material = material; + } + + viewer.renderer.setRenderTarget(null); + if(viewer.background === "skybox"){ + viewer.renderer.setClearColor(0x000000, 0); + viewer.renderer.clear(); + viewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation); + viewer.skybox.camera.fov = viewer.scene.cameraP.fov; + viewer.skybox.camera.aspect = viewer.scene.cameraP.aspect; + + viewer.skybox.parent.rotation.x = 0; + viewer.skybox.parent.updateMatrixWorld(); + + viewer.skybox.camera.updateProjectionMatrix(); + viewer.renderer.render(viewer.skybox.scene, viewer.skybox.camera); + } else if (viewer.background === 'gradient') { + viewer.renderer.setClearColor(0x000000, 0); + viewer.renderer.clear(); + viewer.renderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG); + } else if (viewer.background === 'black') { + viewer.renderer.setClearColor(0x000000, 1); + viewer.renderer.clear(); + } else if (viewer.background === 'white') { + viewer.renderer.setClearColor(0xFFFFFF, 1); + viewer.renderer.clear(); + } else { + viewer.renderer.setClearColor(0x000000, 0); + viewer.renderer.clear(); + } + + { // NORMALIZATION PASS + let normalizationMaterial = this.useEDL ? this.normalizationEDLMaterial : this.normalizationMaterial; + + if(this.useEDL){ + normalizationMaterial.uniforms.edlStrength.value = viewer.edlStrength; + normalizationMaterial.uniforms.radius.value = viewer.edlRadius; + normalizationMaterial.uniforms.screenWidth.value = width; + normalizationMaterial.uniforms.screenHeight.value = height; + normalizationMaterial.uniforms.uEDLMap.value = this.rtDepth.texture; + } + + normalizationMaterial.uniforms.uWeightMap.value = this.rtAttribute.texture; + normalizationMaterial.uniforms.uDepthMap.value = this.rtAttribute.depthTexture; + + Utils.screenPass.render(viewer.renderer, normalizationMaterial); + } + + viewer.renderer.render(viewer.scene.scene, camera); + + viewer.dispatchEvent({type: "render.pass.scene", viewer: viewer}); + + viewer.renderer.clearDepth(); + + viewer.transformationTool.update(); + + viewer.dispatchEvent({type: "render.pass.perspective_overlay",viewer: viewer}); + + viewer.renderer.render(viewer.controls.sceneControls, camera); + viewer.renderer.render(viewer.clippingTool.sceneVolume, camera); + viewer.renderer.render(viewer.transformationTool.scene, camera); + + viewer.renderer.setViewport(width - viewer.navigationCube.width, + height - viewer.navigationCube.width, + viewer.navigationCube.width, viewer.navigationCube.width); + viewer.renderer.render(viewer.navigationCube, viewer.navigationCube.camera); + viewer.renderer.setViewport(0, 0, width, height); + + viewer.dispatchEvent({type: "render.pass.end",viewer: viewer}); + + } + + } + + class View{ + constructor () { + this.position = new Vector3(0, 0, 0); + + this.yaw = Math.PI / 4; + this._pitch = -Math.PI / 4; + this.radius = 1; + + this.maxPitch = Math.PI / 2; + this.minPitch = -Math.PI / 2; + } + + clone () { + let c = new View(); + c.yaw = this.yaw; + c._pitch = this.pitch; + c.radius = this.radius; + c.maxPitch = this.maxPitch; + c.minPitch = this.minPitch; + + return c; + } + + get pitch () { + return this._pitch; + } + + set pitch (angle) { + this._pitch = Math.max(Math.min(angle, this.maxPitch), this.minPitch); + } + + get direction () { + let dir = new Vector3(0, 1, 0); + + dir.applyAxisAngle(new Vector3(1, 0, 0), this.pitch); + dir.applyAxisAngle(new Vector3(0, 0, 1), this.yaw); + + return dir; + } + + set direction (dir) { + + //if(dir.x === dir.y){ + if(dir.x === 0 && dir.y === 0){ + this.pitch = Math.PI / 2 * Math.sign(dir.z); + }else { + let yaw = Math.atan2(dir.y, dir.x) - Math.PI / 2; + let pitch = Math.atan2(dir.z, Math.sqrt(dir.x * dir.x + dir.y * dir.y)); + + this.yaw = yaw; + this.pitch = pitch; + } + + } + + lookAt(t){ + let V; + if(arguments.length === 1){ + V = new Vector3().subVectors(t, this.position); + }else if(arguments.length === 3){ + V = new Vector3().subVectors(new Vector3(...arguments), this.position); + } + + let radius = V.length(); + let dir = V.normalize(); + + this.radius = radius; + this.direction = dir; + } + + getPivot () { + return new Vector3().addVectors(this.position, this.direction.multiplyScalar(this.radius)); + } + + getSide () { + let side = new Vector3(1, 0, 0); + side.applyAxisAngle(new Vector3(0, 0, 1), this.yaw); + + return side; + } + + pan (x, y) { + let dir = new Vector3(0, 1, 0); + dir.applyAxisAngle(new Vector3(1, 0, 0), this.pitch); + dir.applyAxisAngle(new Vector3(0, 0, 1), this.yaw); + + // let side = new THREE.Vector3(1, 0, 0); + // side.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw); + + let side = this.getSide(); + + let up = side.clone().cross(dir); + + let pan = side.multiplyScalar(x).add(up.multiplyScalar(y)); + + this.position = this.position.add(pan); + // this.target = this.target.add(pan); + } + + translate (x, y, z) { + let dir = new Vector3(0, 1, 0); + dir.applyAxisAngle(new Vector3(1, 0, 0), this.pitch); + dir.applyAxisAngle(new Vector3(0, 0, 1), this.yaw); + + let side = new Vector3(1, 0, 0); + side.applyAxisAngle(new Vector3(0, 0, 1), this.yaw); + + let up = side.clone().cross(dir); + + let t = side.multiplyScalar(x) + .add(dir.multiplyScalar(y)) + .add(up.multiplyScalar(z)); + + this.position = this.position.add(t); + } + + translateWorld (x, y, z) { + this.position.x += x; + this.position.y += y; + this.position.z += z; + } + + setView(position, target, duration = 0, callback = null){ + + let endPosition = null; + if(position instanceof Array){ + endPosition = new Vector3(...position); + }else if(position.x != null){ + endPosition = position.clone(); + } + + let endTarget = null; + if(target instanceof Array){ + endTarget = new Vector3(...target); + }else if(target.x != null){ + endTarget = target.clone(); + } + + const startPosition = this.position.clone(); + const startTarget = this.getPivot(); + + //const endPosition = position.clone(); + //const endTarget = target.clone(); + + let easing = TWEEN.Easing.Quartic.Out; + + if(duration === 0){ + this.position.copy(endPosition); + this.lookAt(endTarget); + }else { + let value = {x: 0}; + let tween = new TWEEN.Tween(value).to({x: 1}, duration); + tween.easing(easing); + //this.tweens.push(tween); + + tween.onUpdate(() => { + let t = value.x; + + //console.log(t); + + const pos = new Vector3( + (1 - t) * startPosition.x + t * endPosition.x, + (1 - t) * startPosition.y + t * endPosition.y, + (1 - t) * startPosition.z + t * endPosition.z, + ); + + const target = new Vector3( + (1 - t) * startTarget.x + t * endTarget.x, + (1 - t) * startTarget.y + t * endTarget.y, + (1 - t) * startTarget.z + t * endTarget.z, + ); + + this.position.copy(pos); + this.lookAt(target); + + }); + + tween.start(); + + tween.onComplete(() => { + if(callback){ + callback(); + } + }); + } + + } + + }; + + class Scene$1 extends EventDispatcher{ + + constructor(){ + super(); + + this.annotations = new Annotation(); + + this.scene = new Scene(); + this.sceneBG = new Scene(); + this.scenePointCloud = new Scene(); + + this.cameraP = new PerspectiveCamera(this.fov, 1, 0.1, 1000*1000); + this.cameraO = new OrthographicCamera(-1, 1, 1, -1, 0.1, 1000*1000); + this.cameraVR = new PerspectiveCamera(); + this.cameraBG = new Camera(); + this.cameraScreenSpace = new OrthographicCamera(-1, 1, 1, -1, 0.1, 10); + this.cameraMode = CameraMode.PERSPECTIVE; + this.overrideCamera = null; + this.pointclouds = []; + + this.measurements = []; + this.profiles = []; + this.volumes = []; + this.polygonClipVolumes = []; + this.cameraAnimations = []; + this.orientedImages = []; + this.images360 = []; + this.geopackages = []; + + this.fpControls = null; + this.orbitControls = null; + this.earthControls = null; + this.geoControls = null; + this.deviceControls = null; + this.inputHandler = null; + + this.view = new View(); + + this.directionalLight = null; + + this.initialize(); + } + + estimateHeightAt (position) { + let height = null; + let fromSpacing = Infinity; + + for (let pointcloud of this.pointclouds) { + if (pointcloud.root.geometryNode === undefined) { + continue; + } + + let pHeight = null; + let pFromSpacing = Infinity; + + let lpos = position.clone().sub(pointcloud.position); + lpos.z = 0; + let ray = new Ray(lpos, new Vector3(0, 0, 1)); + + let stack = [pointcloud.root]; + while (stack.length > 0) { + let node = stack.pop(); + let box = node.getBoundingBox(); + + let inside = ray.intersectBox(box); + + if (!inside) { + continue; + } + + let h = node.geometryNode.mean.z + + pointcloud.position.z + + node.geometryNode.boundingBox.min.z; + + if (node.geometryNode.spacing <= pFromSpacing) { + pHeight = h; + pFromSpacing = node.geometryNode.spacing; + } + + for (let index of Object.keys(node.children)) { + let child = node.children[index]; + if (child.geometryNode) { + stack.push(node.children[index]); + } + } + } + + if (height === null || pFromSpacing < fromSpacing) { + height = pHeight; + fromSpacing = pFromSpacing; + } + } + + return height; + } + + getBoundingBox(pointclouds = this.pointclouds){ + let box = new Box3(); + + this.scenePointCloud.updateMatrixWorld(true); + this.referenceFrame.updateMatrixWorld(true); + + for (let pointcloud of pointclouds) { + pointcloud.updateMatrixWorld(true); + + let pointcloudBox = pointcloud.pcoGeometry.tightBoundingBox ? pointcloud.pcoGeometry.tightBoundingBox : pointcloud.boundingBox; + let boxWorld = Utils.computeTransformedBoundingBox(pointcloudBox, pointcloud.matrixWorld); + box.union(boxWorld); + } + + return box; + } + + addPointCloud (pointcloud) { + this.pointclouds.push(pointcloud); + this.scenePointCloud.add(pointcloud); + + this.dispatchEvent({ + type: 'pointcloud_added', + pointcloud: pointcloud + }); + } + + addVolume (volume) { + this.volumes.push(volume); + this.dispatchEvent({ + 'type': 'volume_added', + 'scene': this, + 'volume': volume + }); + } + + addOrientedImages(images){ + this.orientedImages.push(images); + this.scene.add(images.node); + + this.dispatchEvent({ + 'type': 'oriented_images_added', + 'scene': this, + 'images': images + }); + }; + + removeOrientedImages(images){ + let index = this.orientedImages.indexOf(images); + if (index > -1) { + this.orientedImages.splice(index, 1); + + this.dispatchEvent({ + 'type': 'oriented_images_removed', + 'scene': this, + 'images': images + }); + } + }; + + add360Images(images){ + this.images360.push(images); + this.scene.add(images.node); + + this.dispatchEvent({ + 'type': '360_images_added', + 'scene': this, + 'images': images + }); + } + + remove360Images(images){ + let index = this.images360.indexOf(images); + if (index > -1) { + this.images360.splice(index, 1); + + this.dispatchEvent({ + 'type': '360_images_removed', + 'scene': this, + 'images': images + }); + } + } + + addGeopackage(geopackage){ + this.geopackages.push(geopackage); + this.scene.add(geopackage.node); + + this.dispatchEvent({ + 'type': 'geopackage_added', + 'scene': this, + 'geopackage': geopackage + }); + }; + + removeGeopackage(geopackage){ + let index = this.geopackages.indexOf(geopackage); + if (index > -1) { + this.geopackages.splice(index, 1); + + this.dispatchEvent({ + 'type': 'geopackage_removed', + 'scene': this, + 'geopackage': geopackage + }); + } + }; + + removeVolume (volume) { + let index = this.volumes.indexOf(volume); + if (index > -1) { + this.volumes.splice(index, 1); + + this.dispatchEvent({ + 'type': 'volume_removed', + 'scene': this, + 'volume': volume + }); + } + }; + + addCameraAnimation(animation) { + this.cameraAnimations.push(animation); + this.dispatchEvent({ + 'type': 'camera_animation_added', + 'scene': this, + 'animation': animation + }); + }; + + removeCameraAnimation(animation){ + let index = this.cameraAnimations.indexOf(volume); + if (index > -1) { + this.cameraAnimations.splice(index, 1); + + this.dispatchEvent({ + 'type': 'camera_animation_removed', + 'scene': this, + 'animation': animation + }); + } + }; + + addPolygonClipVolume(volume){ + this.polygonClipVolumes.push(volume); + this.dispatchEvent({ + "type": "polygon_clip_volume_added", + "scene": this, + "volume": volume + }); + }; + + removePolygonClipVolume(volume){ + let index = this.polygonClipVolumes.indexOf(volume); + if (index > -1) { + this.polygonClipVolumes.splice(index, 1); + this.dispatchEvent({ + "type": "polygon_clip_volume_removed", + "scene": this, + "volume": volume + }); + } + }; + + addMeasurement(measurement){ + measurement.lengthUnit = this.lengthUnit; + measurement.lengthUnitDisplay = this.lengthUnitDisplay; + this.measurements.push(measurement); + this.dispatchEvent({ + 'type': 'measurement_added', + 'scene': this, + 'measurement': measurement + }); + }; + + removeMeasurement (measurement) { + let index = this.measurements.indexOf(measurement); + if (index > -1) { + this.measurements.splice(index, 1); + this.dispatchEvent({ + 'type': 'measurement_removed', + 'scene': this, + 'measurement': measurement + }); + } + } + + addProfile (profile) { + this.profiles.push(profile); + this.dispatchEvent({ + 'type': 'profile_added', + 'scene': this, + 'profile': profile + }); + } + + removeProfile (profile) { + let index = this.profiles.indexOf(profile); + if (index > -1) { + this.profiles.splice(index, 1); + this.dispatchEvent({ + 'type': 'profile_removed', + 'scene': this, + 'profile': profile + }); + } + } + + removeAllMeasurements () { + while (this.measurements.length > 0) { + this.removeMeasurement(this.measurements[0]); + } + + while (this.profiles.length > 0) { + this.removeProfile(this.profiles[0]); + } + + while (this.volumes.length > 0) { + this.removeVolume(this.volumes[0]); + } + } + + removeAllClipVolumes(){ + let clipVolumes = this.volumes.filter(volume => volume.clip === true); + for(let clipVolume of clipVolumes){ + this.removeVolume(clipVolume); + } + + while(this.polygonClipVolumes.length > 0){ + this.removePolygonClipVolume(this.polygonClipVolumes[0]); + } + } + + getActiveCamera() { + + if(this.overrideCamera){ + return this.overrideCamera; + } + + if(this.cameraMode === CameraMode.PERSPECTIVE){ + return this.cameraP; + }else if(this.cameraMode === CameraMode.ORTHOGRAPHIC){ + return this.cameraO; + }else if(this.cameraMode === CameraMode.VR){ + return this.cameraVR; + } + + return null; + } + + initialize(){ + + this.referenceFrame = new Object3D(); + this.referenceFrame.matrixAutoUpdate = false; + this.scenePointCloud.add(this.referenceFrame); + + this.cameraP.up.set(0, 0, 1); + this.cameraP.position.set(1000, 1000, 1000); + this.cameraO.up.set(0, 0, 1); + this.cameraO.position.set(1000, 1000, 1000); + //this.camera.rotation.y = -Math.PI / 4; + //this.camera.rotation.x = -Math.PI / 6; + this.cameraScreenSpace.lookAt(new Vector3(0, 0, 0), new Vector3(0, 0, -1), new Vector3(0, 1, 0)); + + this.directionalLight = new DirectionalLight( 0xffffff, 0.5 ); + this.directionalLight.position.set( 10, 10, 10 ); + this.directionalLight.lookAt( new Vector3(0, 0, 0)); + this.scenePointCloud.add( this.directionalLight ); + + let light = new AmbientLight( 0x555555 ); // soft white light + this.scenePointCloud.add( light ); + + { // background + let texture = Utils.createBackgroundTexture(512, 512); + + texture.minFilter = texture.magFilter = NearestFilter; + texture.minFilter = texture.magFilter = LinearFilter; + let bg = new Mesh( + new PlaneBufferGeometry(2, 2, 1), + new MeshBasicMaterial({ + map: texture + }) + ); + bg.material.depthTest = false; + bg.material.depthWrite = false; + this.sceneBG.add(bg); + } + + // { // lights + // { + // let light = new THREE.DirectionalLight(0xffffff); + // light.position.set(10, 10, 1); + // light.target.position.set(0, 0, 0); + // this.scene.add(light); + // } + + // { + // let light = new THREE.DirectionalLight(0xffffff); + // light.position.set(-10, 10, 1); + // light.target.position.set(0, 0, 0); + // this.scene.add(light); + // } + + // { + // let light = new THREE.DirectionalLight(0xffffff); + // light.position.set(0, -10, 20); + // light.target.position.set(0, 0, 0); + // this.scene.add(light); + // } + // } + } + + addAnnotation(position, args = {}){ + if(position instanceof Array){ + args.position = new Vector3().fromArray(position); + } else if (position.x != null) { + args.position = position; + } + let annotation = new Annotation(args); + this.annotations.add(annotation); + + return annotation; + } + + getAnnotations () { + return this.annotations; + }; + + removeAnnotation(annotationToRemove) { + this.annotations.remove(annotationToRemove); + } + }; + + // http://epsg.io/ + proj4.defs([ + ['UTM10N', '+proj=utm +zone=10 +ellps=GRS80 +datum=NAD83 +units=m +no_defs'], + ['EPSG:6339', '+proj=utm +zone=10 +ellps=GRS80 +units=m +no_defs'], + ['EPSG:6340', '+proj=utm +zone=11 +ellps=GRS80 +units=m +no_defs'], + ['EPSG:6341', '+proj=utm +zone=12 +ellps=GRS80 +units=m +no_defs'], + ['EPSG:6342', '+proj=utm +zone=13 +ellps=GRS80 +units=m +no_defs'], + ['EPSG:6343', '+proj=utm +zone=14 +ellps=GRS80 +units=m +no_defs'], + ['EPSG:6344', '+proj=utm +zone=15 +ellps=GRS80 +units=m +no_defs'], + ['EPSG:6345', '+proj=utm +zone=16 +ellps=GRS80 +units=m +no_defs'], + ['EPSG:6346', '+proj=utm +zone=17 +ellps=GRS80 +units=m +no_defs'], + ['EPSG:6347', '+proj=utm +zone=18 +ellps=GRS80 +units=m +no_defs'], + ['EPSG:6348', '+proj=utm +zone=19 +ellps=GRS80 +units=m +no_defs'], + ['EPSG:26910', '+proj=utm +zone=10 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], + ['EPSG:26911', '+proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], + ['EPSG:26912', '+proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], + ['EPSG:26913', '+proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], + ['EPSG:26914', '+proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], + ['EPSG:26915', '+proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], + ['EPSG:26916', '+proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], + ['EPSG:26917', '+proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], + ['EPSG:26918', '+proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], + ['EPSG:26919', '+proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '], + ]); + + class MapView{ + + constructor (viewer) { + this.viewer = viewer; + + this.webMapService = 'WMTS'; + this.mapProjectionName = 'EPSG:3857'; + this.mapProjection = proj4.defs(this.mapProjectionName); + this.sceneProjection = null; + + this.extentsLayer = null; + this.cameraLayer = null; + this.toolLayer = null; + this.sourcesLayer = null; + this.sourcesLabelLayer = null; + this.images360Layer = null; + this.enabled = false; + + this.createAnnotationStyle = (text) => { + return [ + new ol.style.Style({ + image: new ol.style.Circle({ + radius: 10, + stroke: new ol.style.Stroke({ + color: [255, 255, 255, 0.5], + width: 2 + }), + fill: new ol.style.Fill({ + color: [0, 0, 0, 0.5] + }) + }) + }) + ]; + }; + + this.createLabelStyle = (text) => { + let style = new ol.style.Style({ + image: new ol.style.Circle({ + radius: 6, + stroke: new ol.style.Stroke({ + color: 'white', + width: 2 + }), + fill: new ol.style.Fill({ + color: 'green' + }) + }), + text: new ol.style.Text({ + font: '12px helvetica,sans-serif', + text: text, + fill: new ol.style.Fill({ + color: '#000' + }), + stroke: new ol.style.Stroke({ + color: '#fff', + width: 2 + }) + }) + }); + + return style; + }; + } + + showSources (show) { + this.sourcesLayer.setVisible(show); + this.sourcesLabelLayer.setVisible(show); + } + + init () { + + if(typeof ol === "undefined"){ + return; + } + + this.elMap = $('#potree_map'); + this.elMap.draggable({ handle: $('#potree_map_header') }); + this.elMap.resizable(); + + this.elTooltip = $(`
    `); + this.elMap.append(this.elTooltip); + + let extentsLayer = this.getExtentsLayer(); + let cameraLayer = this.getCameraLayer(); + this.getToolLayer(); + let sourcesLayer = this.getSourcesLayer(); + this.images360Layer = this.getImages360Layer(); + this.getSourcesLabelLayer(); + this.getAnnotationsLayer(); + + let mousePositionControl = new ol.control.MousePosition({ + coordinateFormat: ol.coordinate.createStringXY(5), + projection: 'EPSG:4326', + undefinedHTML: ' ' + }); + + let _this = this; + let DownloadSelectionControl = function (optOptions) { + let options = optOptions || {}; + + // TOGGLE TILES + let btToggleTiles = document.createElement('button'); + btToggleTiles.innerHTML = 'T'; + btToggleTiles.addEventListener('click', () => { + let visible = sourcesLayer.getVisible(); + _this.showSources(!visible); + }, false); + btToggleTiles.style.float = 'left'; + btToggleTiles.title = 'show / hide tiles'; + + // DOWNLOAD SELECTED TILES + let link = document.createElement('a'); + link.href = '#'; + link.download = 'list.txt'; + link.style.float = 'left'; + + let button = document.createElement('button'); + button.innerHTML = 'D'; + link.appendChild(button); + + let handleDownload = (e) => { + let features = selectedFeatures.getArray(); + + let url = [document.location.protocol, '//', document.location.host, document.location.pathname].join(''); + + if (features.length === 0) { + alert('No tiles were selected. Select area with ctrl + left mouse button!'); + e.preventDefault(); + e.stopImmediatePropagation(); + return false; + } else if (features.length === 1) { + let feature = features[0]; + + if (feature.source) { + let cloudjsurl = feature.pointcloud.pcoGeometry.url; + let sourceurl = new URL(url + '/../' + cloudjsurl + '/../source/' + feature.source.name); + link.href = sourceurl.href; + link.download = feature.source.name; + } + } else { + let content = ''; + for (let i = 0; i < features.length; i++) { + let feature = features[i]; + + if (feature.source) { + let cloudjsurl = feature.pointcloud.pcoGeometry.url; + let sourceurl = new URL(url + '/../' + cloudjsurl + '/../source/' + feature.source.name); + content += sourceurl.href + '\n'; + } + } + + let uri = 'data:application/octet-stream;base64,' + btoa(content); + link.href = uri; + link.download = 'list_of_files.txt'; + } + }; + + button.addEventListener('click', handleDownload, false); + + // assemble container + let element = document.createElement('div'); + element.className = 'ol-unselectable ol-control'; + element.appendChild(link); + element.appendChild(btToggleTiles); + element.style.bottom = '0.5em'; + element.style.left = '0.5em'; + element.title = 'Download file or list of selected tiles. Select tile with left mouse button or area using ctrl + left mouse.'; + + ol.control.Control.call(this, { + element: element, + target: options.target + }); + }; + ol.inherits(DownloadSelectionControl, ol.control.Control); + + this.map = new ol.Map({ + controls: ol.control.defaults({ + attributionOptions: ({ + collapsible: false + }) + }).extend([ + // this.controls.zoomToExtent, + new DownloadSelectionControl(), + mousePositionControl + ]), + layers: [ + new ol.layer.Tile({source: new ol.source.OSM()}), + this.toolLayer, + this.annotationsLayer, + this.sourcesLayer, + this.sourcesLabelLayer, + this.images360Layer, + extentsLayer, + cameraLayer + ], + target: 'potree_map_content', + view: new ol.View({ + center: this.olCenter, + zoom: 9 + }) + }); + + // DRAGBOX / SELECTION + this.dragBoxLayer = new ol.layer.Vector({ + source: new ol.source.Vector({}), + style: new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'rgba(0, 0, 255, 1)', + width: 2 + }) + }) + }); + this.map.addLayer(this.dragBoxLayer); + + let select = new ol.interaction.Select(); + this.map.addInteraction(select); + + let selectedFeatures = select.getFeatures(); + + let dragBox = new ol.interaction.DragBox({ + condition: ol.events.condition.platformModifierKeyOnly + }); + + this.map.addInteraction(dragBox); + + // this.map.on('pointermove', evt => { + // let pixel = evt.pixel; + // let feature = this.map.forEachFeatureAtPixel(pixel, function (feature) { + // return feature; + // }); + + // // console.log(feature); + // // this.elTooltip.css("display", feature ? '' : 'none'); + // this.elTooltip.css('display', 'none'); + // if (feature && feature.onHover) { + // feature.onHover(evt); + // // overlay.setPosition(evt.coordinate); + // // tooltip.innerHTML = feature.get('name'); + // } + // }); + + this.map.on('click', evt => { + let pixel = evt.pixel; + let feature = this.map.forEachFeatureAtPixel(pixel, function (feature) { + return feature; + }); + + if (feature && feature.onClick) { + feature.onClick(evt); + } + }); + + dragBox.on('boxend', (e) => { + // features that intersect the box are added to the collection of + // selected features, and their names are displayed in the "info" + // div + let extent = dragBox.getGeometry().getExtent(); + this.getSourcesLayer().getSource().forEachFeatureIntersectingExtent(extent, (feature) => { + selectedFeatures.push(feature); + }); + }); + + // clear selection when drawing a new box and when clicking on the map + dragBox.on('boxstart', (e) => { + selectedFeatures.clear(); + }); + this.map.on('click', () => { + selectedFeatures.clear(); + }); + + this.viewer.addEventListener('scene_changed', e => { + this.setScene(e.scene); + }); + + this.onPointcloudAdded = e => { + this.load(e.pointcloud); + }; + + this.on360ImagesAdded = e => { + this.addImages360(e.images); + }; + + this.onAnnotationAdded = e => { + if (!this.sceneProjection) { + return; + } + + let annotation = e.annotation; + let position = annotation.position; + let mapPos = this.toMap.forward([position.x, position.y]); + let feature = new ol.Feature({ + geometry: new ol.geom.Point(mapPos), + name: annotation.title + }); + feature.setStyle(this.createAnnotationStyle(annotation.title)); + + feature.onHover = evt => { + let coordinates = feature.getGeometry().getCoordinates(); + let p = this.map.getPixelFromCoordinate(coordinates); + + this.elTooltip.html(annotation.title); + this.elTooltip.css('display', ''); + this.elTooltip.css('left', `${p[0]}px`); + this.elTooltip.css('top', `${p[1]}px`); + }; + + feature.onClick = evt => { + annotation.clickTitle(); + }; + + this.getAnnotationsLayer().getSource().addFeature(feature); + }; + + this.setScene(this.viewer.scene); + } + + setScene (scene) { + if (this.scene === scene) { + return; + }; + + if (this.scene) { + this.scene.removeEventListener('pointcloud_added', this.onPointcloudAdded); + this.scene.removeEventListener('360_images_added', this.on360ImagesAdded); + this.scene.annotations.removeEventListener('annotation_added', this.onAnnotationAdded); + } + + this.scene = scene; + + this.scene.addEventListener('pointcloud_added', this.onPointcloudAdded); + this.scene.addEventListener('360_images_added', this.on360ImagesAdded); + this.scene.annotations.addEventListener('annotation_added', this.onAnnotationAdded); + + for (let pointcloud of this.viewer.scene.pointclouds) { + this.load(pointcloud); + } + + this.viewer.scene.annotations.traverseDescendants(annotation => { + this.onAnnotationAdded({annotation: annotation}); + }); + + for(let images of this.viewer.scene.images360){ + this.on360ImagesAdded({images: images}); + } + } + + getExtentsLayer () { + if (this.extentsLayer) { + return this.extentsLayer; + } + + this.gExtent = new ol.geom.LineString([[0, 0], [0, 0]]); + + let feature = new ol.Feature(this.gExtent); + let featureVector = new ol.source.Vector({ + features: [feature] + }); + + this.extentsLayer = new ol.layer.Vector({ + source: featureVector, + style: new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255, 255, 255, 0.2)' + }), + stroke: new ol.style.Stroke({ + color: '#0000ff', + width: 2 + }), + image: new ol.style.Circle({ + radius: 3, + fill: new ol.style.Fill({ + color: '#0000ff' + }) + }) + }) + }); + + return this.extentsLayer; + } + + getAnnotationsLayer () { + if (this.annotationsLayer) { + return this.annotationsLayer; + } + + this.annotationsLayer = new ol.layer.Vector({ + source: new ol.source.Vector({ + }), + style: new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255, 0, 0, 1)' + }), + stroke: new ol.style.Stroke({ + color: 'rgba(255, 0, 0, 1)', + width: 2 + }) + }) + }); + + return this.annotationsLayer; + } + + getCameraLayer () { + if (this.cameraLayer) { + return this.cameraLayer; + } + + // CAMERA LAYER + this.gCamera = new ol.geom.LineString([[0, 0], [0, 0], [0, 0], [0, 0]]); + let feature = new ol.Feature(this.gCamera); + let featureVector = new ol.source.Vector({ + features: [feature] + }); + + this.cameraLayer = new ol.layer.Vector({ + source: featureVector, + style: new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#0000ff', + width: 2 + }) + }) + }); + + return this.cameraLayer; + } + + getToolLayer () { + if (this.toolLayer) { + return this.toolLayer; + } + + this.toolLayer = new ol.layer.Vector({ + source: new ol.source.Vector({ + }), + style: new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255, 0, 0, 1)' + }), + stroke: new ol.style.Stroke({ + color: 'rgba(255, 0, 0, 1)', + width: 2 + }) + }) + }); + + return this.toolLayer; + } + + getImages360Layer(){ + if(this.images360Layer){ + return this.images360Layer; + } + + let style = new ol.style.Style({ + image: new ol.style.Circle({ + radius: 4, + stroke: new ol.style.Stroke({ + color: [255, 0, 0, 1], + width: 2 + }), + fill: new ol.style.Fill({ + color: [255, 100, 100, 1] + }) + }) + }); + + let layer = new ol.layer.Vector({ + source: new ol.source.Vector({}), + style: style, + }); + + this.images360Layer = layer; + + return this.images360Layer; + } + + getSourcesLayer () { + if (this.sourcesLayer) { + return this.sourcesLayer; + } + + this.sourcesLayer = new ol.layer.Vector({ + source: new ol.source.Vector({}), + style: new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(0, 0, 150, 0.1)' + }), + stroke: new ol.style.Stroke({ + color: 'rgba(0, 0, 150, 1)', + width: 1 + }) + }) + }); + + return this.sourcesLayer; + } + + getSourcesLabelLayer () { + if (this.sourcesLabelLayer) { + return this.sourcesLabelLayer; + } + + this.sourcesLabelLayer = new ol.layer.Vector({ + source: new ol.source.Vector({ + }), + style: new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255, 0, 0, 0.1)' + }), + stroke: new ol.style.Stroke({ + color: 'rgba(255, 0, 0, 1)', + width: 2 + }) + }), + minResolution: 0.01, + maxResolution: 20 + }); + + return this.sourcesLabelLayer; + } + + setSceneProjection (sceneProjection) { + this.sceneProjection = sceneProjection; + this.toMap = proj4(this.sceneProjection, this.mapProjection); + this.toScene = proj4(this.mapProjection, this.sceneProjection); + }; + + getMapExtent () { + let bb = this.viewer.getBoundingBox(); + + let bottomLeft = this.toMap.forward([bb.min.x, bb.min.y]); + let bottomRight = this.toMap.forward([bb.max.x, bb.min.y]); + let topRight = this.toMap.forward([bb.max.x, bb.max.y]); + let topLeft = this.toMap.forward([bb.min.x, bb.max.y]); + + let extent = { + bottomLeft: bottomLeft, + bottomRight: bottomRight, + topRight: topRight, + topLeft: topLeft + }; + + return extent; + }; + + getMapCenter () { + let mapExtent = this.getMapExtent(); + + let mapCenter = [ + (mapExtent.bottomLeft[0] + mapExtent.topRight[0]) / 2, + (mapExtent.bottomLeft[1] + mapExtent.topRight[1]) / 2 + ]; + + return mapCenter; + }; + + updateToolDrawings () { + this.toolLayer.getSource().clear(); + + let profiles = this.viewer.profileTool.profiles; + for (let i = 0; i < profiles.length; i++) { + let profile = profiles[i]; + let coordinates = []; + + for (let j = 0; j < profile.points.length; j++) { + let point = profile.points[j]; + let pointMap = this.toMap.forward([point.x, point.y]); + coordinates.push(pointMap); + } + + let line = new ol.geom.LineString(coordinates); + let feature = new ol.Feature(line); + this.toolLayer.getSource().addFeature(feature); + } + + let measurements = this.viewer.measuringTool.measurements; + for (let i = 0; i < measurements.length; i++) { + let measurement = measurements[i]; + let coordinates = []; + + for (let j = 0; j < measurement.points.length; j++) { + let point = measurement.points[j].position; + let pointMap = this.toMap.forward([point.x, point.y]); + coordinates.push(pointMap); + } + + if (measurement.closed && measurement.points.length > 0) { + coordinates.push(coordinates[0]); + } + + let line = new ol.geom.LineString(coordinates); + let feature = new ol.Feature(line); + this.toolLayer.getSource().addFeature(feature); + } + } + + addImages360(images){ + let transform = this.toMap.forward; + let layer = this.getImages360Layer(); + + for(let image of images.images){ + + let p = transform([image.position[0], image.position[1]]); + + let feature = new ol.Feature({ + 'geometry': new ol.geom.Point(p), + }); + + feature.onClick = () => { + images.focus(image); + }; + + layer.getSource().addFeature(feature); + } + } + + async load (pointcloud) { + if (!pointcloud) { + return; + } + + if (!pointcloud.projection) { + return; + } + + if (!this.sceneProjection) { + try { + this.setSceneProjection(pointcloud.projection); + }catch (e) { + console.log('Failed projection:', e); + + if (pointcloud.fallbackProjection) { + try { + console.log('Trying fallback projection...'); + this.setSceneProjection(pointcloud.fallbackProjection); + console.log('Set projection from fallback'); + }catch (e) { + console.log('Failed fallback projection:', e); + return; + } + }else { + return; + }; + } + } + + let mapExtent = this.getMapExtent(); + let mapCenter = this.getMapCenter(); + + let view = this.map.getView(); + view.setCenter(mapCenter); + + this.gExtent.setCoordinates([ + mapExtent.bottomLeft, + mapExtent.bottomRight, + mapExtent.topRight, + mapExtent.topLeft, + mapExtent.bottomLeft + ]); + + view.fit(this.gExtent, [300, 300], { + constrainResolution: false + }); + + if (pointcloud.pcoGeometry.type == 'ept'){ + return; + } + + let url = `${pointcloud.pcoGeometry.url}/../sources.json`; + //let response = await fetch(url); + + fetch(url).then(async (response) => { + let data = await response.json(); + + let sources = data.sources; + + for (let i = 0; i < sources.length; i++) { + let source = sources[i]; + let name = source.name; + let bounds = source.bounds; + + let mapBounds = { + min: this.toMap.forward([bounds.min[0], bounds.min[1]]), + max: this.toMap.forward([bounds.max[0], bounds.max[1]]) + }; + let mapCenter = [ + (mapBounds.min[0] + mapBounds.max[0]) / 2, + (mapBounds.min[1] + mapBounds.max[1]) / 2 + ]; + + let p1 = this.toMap.forward([bounds.min[0], bounds.min[1]]); + let p2 = this.toMap.forward([bounds.max[0], bounds.min[1]]); + let p3 = this.toMap.forward([bounds.max[0], bounds.max[1]]); + let p4 = this.toMap.forward([bounds.min[0], bounds.max[1]]); + + // let feature = new ol.Feature({ + // 'geometry': new ol.geom.LineString([p1, p2, p3, p4, p1]) + // }); + let feature = new ol.Feature({ + 'geometry': new ol.geom.Polygon([[p1, p2, p3, p4, p1]]) + }); + feature.source = source; + feature.pointcloud = pointcloud; + this.getSourcesLayer().getSource().addFeature(feature); + + feature = new ol.Feature({ + geometry: new ol.geom.Point(mapCenter), + name: name + }); + feature.setStyle(this.createLabelStyle(name)); + this.sourcesLabelLayer.getSource().addFeature(feature); + } + }).catch(() => { + + }); + + } + + toggle () { + if (this.elMap.is(':visible')) { + this.elMap.css('display', 'none'); + this.enabled = false; + } else { + this.elMap.css('display', 'block'); + this.enabled = true; + } + } + + update (delta) { + if (!this.sceneProjection) { + return; + } + + let pm = $('#potree_map'); + + if (!this.enabled) { + return; + } + + // resize + let mapSize = this.map.getSize(); + let resized = (pm.width() !== mapSize[0] || pm.height() !== mapSize[1]); + if (resized) { + this.map.updateSize(); + } + + // + let camera = this.viewer.scene.getActiveCamera(); + + let scale = this.map.getView().getResolution(); + let campos = camera.position; + let camdir = camera.getWorldDirection(new Vector3()); + let sceneLookAt = camdir.clone().multiplyScalar(30 * scale).add(campos); + let geoPos = camera.position; + let geoLookAt = sceneLookAt; + let mapPos = new Vector2().fromArray(this.toMap.forward([geoPos.x, geoPos.y])); + let mapLookAt = new Vector2().fromArray(this.toMap.forward([geoLookAt.x, geoLookAt.y])); + let mapDir = new Vector2().subVectors(mapLookAt, mapPos).normalize(); + + mapLookAt = mapPos.clone().add(mapDir.clone().multiplyScalar(30 * scale)); + let mapLength = mapPos.distanceTo(mapLookAt); + let mapSide = new Vector2(-mapDir.y, mapDir.x); + + let p1 = mapPos.toArray(); + let p2 = mapLookAt.clone().sub(mapSide.clone().multiplyScalar(0.3 * mapLength)).toArray(); + let p3 = mapLookAt.clone().add(mapSide.clone().multiplyScalar(0.3 * mapLength)).toArray(); + + this.gCamera.setCoordinates([p1, p2, p3, p1]); + } + + get sourcesVisible () { + return this.getSourcesLayer().getVisible(); + } + + set sourcesVisible (value) { + this.getSourcesLayer().setVisible(value); + } + + } + + class CSVExporter { + static toString (points) { + let string = ''; + + let attributes = Object.keys(points.data) + .filter(a => a !== 'normal') + .sort((a, b) => { + if (a === 'position') return -1; + if (b === 'position') return 1; + if (a === 'rgba') return -1; + if (b === 'rgba') return 1; + }); + + let headerValues = []; + for (let attribute of attributes) { + let itemSize = points.data[attribute].length / points.numPoints; + + if (attribute === 'position') { + headerValues = headerValues.concat(['x', 'y', 'z']); + } else if (attribute === 'rgba') { + headerValues = headerValues.concat(['r', 'g', 'b', 'a']); + } else if (itemSize > 1) { + for (let i = 0; i < itemSize; i++) { + headerValues.push(`${attribute}_${i}`); + } + } else { + headerValues.push(attribute); + } + } + string = headerValues.join(', ') + '\n'; + + for (let i = 0; i < points.numPoints; i++) { + let values = []; + + for (let attribute of attributes) { + let itemSize = points.data[attribute].length / points.numPoints; + let value = points.data[attribute] + .subarray(itemSize * i, itemSize * i + itemSize) + .join(', '); + values.push(value); + } + + string += values.join(', ') + '\n'; + } + + return string; + } + }; + + class LASExporter { + static toLAS (points) { + // TODO Unused: let string = ''; + + let boundingBox = points.boundingBox; + let offset = boundingBox.min.clone(); + let diagonal = boundingBox.min.distanceTo(boundingBox.max); + let scale = new Vector3(0.001, 0.001, 0.001); + if (diagonal > 1000 * 1000) { + scale = new Vector3(0.01, 0.01, 0.01); + } else { + scale = new Vector3(0.001, 0.001, 0.001); + } + + let setString = function (string, offset, buffer) { + let view = new Uint8Array(buffer); + + for (let i = 0; i < string.length; i++) { + let charCode = string.charCodeAt(i); + view[offset + i] = charCode; + } + }; + + let buffer = new ArrayBuffer(227 + 28 * points.numPoints); + let view = new DataView(buffer); + let u8View = new Uint8Array(buffer); + // let u16View = new Uint16Array(buffer); + + setString('LASF', 0, buffer); + u8View[24] = 1; + u8View[25] = 2; + + // system identifier o:26 l:32 + + // generating software o:58 l:32 + setString('Potree 1.7', 58, buffer); + + // file creation day of year o:90 l:2 + // file creation year o:92 l:2 + + // header size o:94 l:2 + view.setUint16(94, 227, true); + + // offset to point data o:96 l:4 + view.setUint32(96, 227, true); + + // number of letiable length records o:100 l:4 + + // point data record format 104 1 + u8View[104] = 2; + + // point data record length 105 2 + view.setUint16(105, 28, true); + + // number of point records 107 4 + view.setUint32(107, points.numPoints, true); + + // number of points by return 111 20 + + // x scale factor 131 8 + view.setFloat64(131, scale.x, true); + + // y scale factor 139 8 + view.setFloat64(139, scale.y, true); + + // z scale factor 147 8 + view.setFloat64(147, scale.z, true); + + // x offset 155 8 + view.setFloat64(155, offset.x, true); + + // y offset 163 8 + view.setFloat64(163, offset.y, true); + + // z offset 171 8 + view.setFloat64(171, offset.z, true); + + // max x 179 8 + view.setFloat64(179, boundingBox.max.x, true); + + // min x 187 8 + view.setFloat64(187, boundingBox.min.x, true); + + // max y 195 8 + view.setFloat64(195, boundingBox.max.y, true); + + // min y 203 8 + view.setFloat64(203, boundingBox.min.y, true); + + // max z 211 8 + view.setFloat64(211, boundingBox.max.z, true); + + // min z 219 8 + view.setFloat64(219, boundingBox.min.z, true); + + let boffset = 227; + for (let i = 0; i < points.numPoints; i++) { + + let px = points.data.position[3 * i + 0]; + let py = points.data.position[3 * i + 1]; + let pz = points.data.position[3 * i + 2]; + + let ux = parseInt((px - offset.x) / scale.x); + let uy = parseInt((py - offset.y) / scale.y); + let uz = parseInt((pz - offset.z) / scale.z); + + view.setUint32(boffset + 0, ux, true); + view.setUint32(boffset + 4, uy, true); + view.setUint32(boffset + 8, uz, true); + + if (points.data.intensity) { + view.setUint16(boffset + 12, (points.data.intensity[i]), true); + } + + let rt = 0; + if (points.data.returnNumber) { + rt += points.data.returnNumber[i]; + } + if (points.data.numberOfReturns) { + rt += (points.data.numberOfReturns[i] << 3); + } + view.setUint8(boffset + 14, rt); + + if (points.data.classification) { + view.setUint8(boffset + 15, points.data.classification[i]); + } + // scan angle rank + // user data + // point source id + if (points.data.pointSourceID) { + view.setUint16(boffset + 18, points.data.pointSourceID[i]); + } + + if (points.data.rgba) { + let rgba = points.data.rgba; + view.setUint16(boffset + 20, (rgba[4 * i + 0] * 255), true); + view.setUint16(boffset + 22, (rgba[4 * i + 1] * 255), true); + view.setUint16(boffset + 24, (rgba[4 * i + 2] * 255), true); + } + + boffset += 28; + } + + return buffer; + } + + } + + function copyMaterial(source, target){ + + for(let name of Object.keys(target.uniforms)){ + target.uniforms[name].value = source.uniforms[name].value; + } + + target.gradientTexture = source.gradientTexture; + target.visibleNodesTexture = source.visibleNodesTexture; + target.classificationTexture = source.classificationTexture; + target.matcapTexture = source.matcapTexture; + + target.activeAttributeName = source.activeAttributeName; + target.ranges = source.ranges; + + //target.updateShaderSource(); + } + + + class Batch{ + + constructor(geometry, material){ + this.geometry = geometry; + this.material = material; + + this.sceneNode = new Points(geometry, material); + + this.geometryNode = { + estimatedSpacing: 1.0, + geometry: geometry, + }; + } + + getLevel(){ + return 0; + } + + } + + class ProfileFakeOctree extends PointCloudTree{ + + constructor(octree){ + super(); + + this.trueOctree = octree; + this.pcoGeometry = octree.pcoGeometry; + this.points = []; + this.visibleNodes = []; + + //this.material = this.trueOctree.material; + this.material = new PointCloudMaterial$1(); + //this.material.copy(this.trueOctree.material); + copyMaterial(this.trueOctree.material, this.material); + this.material.pointSizeType = PointSizeType.FIXED; + + this.batchSize = 100 * 1000; + this.currentBatch = null; + } + + getAttribute(name){ + return this.trueOctree.getAttribute(name); + } + + dispose(){ + for(let node of this.visibleNodes){ + node.geometry.dispose(); + } + + this.visibleNodes = []; + this.currentBatch = null; + this.points = []; + } + + addPoints(data){ + // since each call to addPoints can deliver very very few points, + // we're going to batch them into larger buffers for efficiency. + + if(this.currentBatch === null){ + this.currentBatch = this.createNewBatch(data); + } + + this.points.push(data); + + + let updateRange = { + start: this.currentBatch.geometry.drawRange.count, + count: 0 + }; + let projectedBox = new Box3(); + + let truePos = new Vector3(); + + for(let i = 0; i < data.numPoints; i++){ + + if(updateRange.start + updateRange.count >= this.batchSize){ + // current batch full, start new batch + + for(let key of Object.keys(this.currentBatch.geometry.attributes)){ + let attribute = this.currentBatch.geometry.attributes[key]; + attribute.updateRange.offset = updateRange.start; + attribute.updateRange.count = updateRange.count; + attribute.needsUpdate = true; + } + + this.currentBatch.geometry.computeBoundingBox(); + this.currentBatch.geometry.computeBoundingSphere(); + + this.currentBatch = this.createNewBatch(data); + updateRange = { + start: 0, + count: 0 + }; + } + + truePos.set( + data.data.position[3 * i + 0] + this.trueOctree.position.x, + data.data.position[3 * i + 1] + this.trueOctree.position.y, + data.data.position[3 * i + 2] + this.trueOctree.position.z, + ); + + let x = data.data.mileage[i]; + let y = 0; + let z = truePos.z; + + projectedBox.expandByPoint(new Vector3(x, y, z)); + + let index = updateRange.start + updateRange.count; + let geometry = this.currentBatch.geometry; + + for(let attributeName of Object.keys(data.data)){ + let source = data.data[attributeName]; + let target = geometry.attributes[attributeName]; + let numElements = target.itemSize; + + for(let item = 0; item < numElements; item++){ + target.array[numElements * index + item] = source[numElements * i + item]; + } + } + + { + let position = geometry.attributes.position; + + position.array[3 * index + 0] = x; + position.array[3 * index + 1] = y; + position.array[3 * index + 2] = z; + } + + updateRange.count++; + this.currentBatch.geometry.drawRange.count++; + } + + for(let key of Object.keys(this.currentBatch.geometry.attributes)){ + let attribute = this.currentBatch.geometry.attributes[key]; + attribute.updateRange.offset = updateRange.start; + attribute.updateRange.count = updateRange.count; + attribute.needsUpdate = true; + } + + data.projectedBox = projectedBox; + + this.projectedBox = this.points.reduce( (a, i) => a.union(i.projectedBox), new Box3()); + } + + createNewBatch(data){ + let geometry = new BufferGeometry(); + + // create new batches with batch_size elements of the same type as the attribute + for(let attributeName of Object.keys(data.data)){ + let buffer = data.data[attributeName]; + let numElements = buffer.length / data.numPoints; // 3 for pos, 4 for col, 1 for scalars + let constructor = buffer.constructor; + let normalized = false; + + if(this.trueOctree.root.sceneNode){ + if(this.trueOctree.root.sceneNode.geometry.attributes[attributeName]){ + normalized = this.trueOctree.root.sceneNode.geometry.attributes[attributeName].normalized; + } + } + + + let batchBuffer = new constructor(numElements * this.batchSize); + + let bufferAttribute = new BufferAttribute(batchBuffer, numElements, normalized); + bufferAttribute.potree = { + range: [0, 1], + }; + + geometry.setAttribute(attributeName, bufferAttribute); + } + + geometry.drawRange.start = 0; + geometry.drawRange.count = 0; + + let batch = new Batch(geometry, this.material); + + this.visibleNodes.push(batch); + + return batch; + } + + computeVisibilityTextureData(){ + let data = new Uint8Array(this.visibleNodes.length * 4); + let offsets = new Map(); + + for(let i = 0; i < this.visibleNodes.length; i++){ + let node = this.visibleNodes[i]; + + offsets[node] = i; + } + + + return { + data: data, + offsets: offsets, + }; + } + + } + + class ProfileWindow extends EventDispatcher { + constructor (viewer) { + super(); + + this.viewer = viewer; + this.elRoot = $('#profile_window'); + this.renderArea = this.elRoot.find('#profileCanvasContainer'); + this.svg = d3.select('svg#profileSVG'); + this.mouseIsDown = false; + + this.projectedBox = new Box3(); + this.pointclouds = new Map(); + this.numPoints = 0; + this.lastAddPointsTimestamp = undefined; + + this.mouse = new Vector2(0, 0); + this.scale = new Vector3(1, 1, 1); + + this.autoFitEnabled = true; // completely disable/enable + this.autoFit = false; // internal + + let cwIcon = `${exports.resourcePath}/icons/arrow_cw.svg`; + $('#potree_profile_rotate_cw').attr('src', cwIcon); + + let ccwIcon = `${exports.resourcePath}/icons/arrow_ccw.svg`; + $('#potree_profile_rotate_ccw').attr('src', ccwIcon); + + let forwardIcon = `${exports.resourcePath}/icons/arrow_up.svg`; + $('#potree_profile_move_forward').attr('src', forwardIcon); + + let backwardIcon = `${exports.resourcePath}/icons/arrow_down.svg`; + $('#potree_profile_move_backward').attr('src', backwardIcon); + + let csvIcon = `${exports.resourcePath}/icons/file_csv_2d.svg`; + $('#potree_download_csv_icon').attr('src', csvIcon); + + let lasIcon = `${exports.resourcePath}/icons/file_las_3d.svg`; + $('#potree_download_las_icon').attr('src', lasIcon); + + let closeIcon = `${exports.resourcePath}/icons/close.svg`; + $('#closeProfileContainer').attr("src", closeIcon); + + this.initTHREE(); + this.initSVG(); + this.initListeners(); + + this.pRenderer = new Renderer(this.renderer); + + this.elRoot.i18n(); + } + + initListeners () { + $(window).resize(() => { + if (this.enabled) { + this.render(); + } + }); + + this.renderArea.mousedown(e => { + this.mouseIsDown = true; + }); + + this.renderArea.mouseup(e => { + this.mouseIsDown = false; + }); + + let viewerPickSphereSizeHandler = () => { + let camera = this.viewer.scene.getActiveCamera(); + let domElement = this.viewer.renderer.domElement; + let distance = this.viewerPickSphere.position.distanceTo(camera.position); + let pr = Utils.projectedRadius(1, camera, distance, domElement.clientWidth, domElement.clientHeight); + let scale = (10 / pr); + this.viewerPickSphere.scale.set(scale, scale, scale); + }; + + this.renderArea.mousemove(e => { + if (this.pointclouds.size === 0) { + return; + } + + let rect = this.renderArea[0].getBoundingClientRect(); + let x = e.clientX - rect.left; + let y = e.clientY - rect.top; + + let newMouse = new Vector2(x, y); + + if (this.mouseIsDown) { + // DRAG + this.autoFit = false; + this.lastDrag = new Date().getTime(); + + let cPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)]; + let ncPos = [this.scaleX.invert(newMouse.x), this.scaleY.invert(newMouse.y)]; + + this.camera.position.x -= ncPos[0] - cPos[0]; + this.camera.position.z -= ncPos[1] - cPos[1]; + + this.render(); + } else if (this.pointclouds.size > 0) { + // FIND HOVERED POINT + let radius = Math.abs(this.scaleX.invert(0) - this.scaleX.invert(40)); + let mileage = this.scaleX.invert(newMouse.x); + let elevation = this.scaleY.invert(newMouse.y); + + let closest = this.selectPoint(mileage, elevation, radius); + + if (closest) { + let point = closest.point; + + let position = new Float64Array([ + point.position[0] + closest.pointcloud.position.x, + point.position[1] + closest.pointcloud.position.y, + point.position[2] + closest.pointcloud.position.z + ]); + + this.elRoot.find('#profileSelectionProperties').fadeIn(200); + this.pickSphere.visible = true; + this.pickSphere.scale.set(0.5 * radius, 0.5 * radius, 0.5 * radius); + this.pickSphere.position.set(point.mileage, 0, position[2]); + + this.viewerPickSphere.position.set(...position); + + if(!this.viewer.scene.scene.children.includes(this.viewerPickSphere)){ + this.viewer.scene.scene.add(this.viewerPickSphere); + if(!this.viewer.hasEventListener("update", viewerPickSphereSizeHandler)){ + this.viewer.addEventListener("update", viewerPickSphereSizeHandler); + } + } + + + let info = this.elRoot.find('#profileSelectionProperties'); + let html = ''; + + for (let attributeName of Object.keys(point)) { + + let value = point[attributeName]; + let attribute = closest.pointcloud.getAttribute(attributeName); + + let transform = value => value; + if(attribute && attribute.type.size > 4){ + let range = attribute.initialRange; + let scale = 1 / (range[1] - range[0]); + let offset = range[0]; + transform = value => value / scale + offset; + } + + + + + + if (attributeName === 'position') { + let values = [...position].map(v => Utils.addCommas(v.toFixed(3))); + html += ` + + + + + + + + + + + + `; + } else if (attributeName === 'rgba') { + html += ` + + + + `; + } else if (attributeName === 'normal') { + continue; + } else if (attributeName === 'mileage') { + html += ` + + + + `; + } else { + html += ` + + + + `; + } + } + html += '
    x${values[0]}
    y${values[1]}
    z${values[2]}
    ${attributeName}${value.join(', ')}
    ${attributeName}${value.toFixed(3)}
    ${attributeName}${transform(value)}
    '; + info.html(html); + + this.selectedPoint = point; + } else { + // this.pickSphere.visible = false; + // this.selectedPoint = null; + + this.viewer.scene.scene.add(this.viewerPickSphere); + + let index = this.viewer.scene.scene.children.indexOf(this.viewerPickSphere); + if(index >= 0){ + this.viewer.scene.scene.children.splice(index, 1); + } + this.viewer.removeEventListener("update", viewerPickSphereSizeHandler); + + + } + this.render(); + } + + this.mouse.copy(newMouse); + }); + + let onWheel = e => { + this.autoFit = false; + + let delta = 0; + if (e.wheelDelta !== undefined) { // WebKit / Opera / Explorer 9 + delta = e.wheelDelta; + } else if (e.detail !== undefined) { // Firefox + delta = -e.detail; + } + + let ndelta = Math.sign(delta); + + let cPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)]; + + if (ndelta > 0) { + // + 10% + this.scale.multiplyScalar(1.1); + } else { + // - 10% + this.scale.multiplyScalar(100 / 110); + } + + this.updateScales(); + let ncPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)]; + + this.camera.position.x -= ncPos[0] - cPos[0]; + this.camera.position.z -= ncPos[1] - cPos[1]; + + this.render(); + this.updateScales(); + }; + $(this.renderArea)[0].addEventListener('mousewheel', onWheel, false); + $(this.renderArea)[0].addEventListener('DOMMouseScroll', onWheel, false); // Firefox + + $('#closeProfileContainer').click(() => { + this.hide(); + }); + + let getProfilePoints = () => { + let points = new Points$1(); + + for(let [pointcloud, entry] of this.pointclouds){ + for(let pointSet of entry.points){ + + let originPos = pointSet.data.position; + let trueElevationPosition = new Float32Array(originPos); + for(let i = 0; i < pointSet.numPoints; i++){ + trueElevationPosition[3 * i + 2] += pointcloud.position.z; + } + + pointSet.data.position = trueElevationPosition; + points.add(pointSet); + pointSet.data.position = originPos; + } + } + + return points; + }; + + $('#potree_download_csv_icon').click(() => { + + let points = getProfilePoints(); + + let string = CSVExporter.toString(points); + + let blob = new Blob([string], {type: "text/string"}); + $('#potree_download_profile_ortho_link').attr('href', URL.createObjectURL(blob)); + }); + + $('#potree_download_las_icon').click(() => { + + let points = getProfilePoints(); + + let buffer = LASExporter.toLAS(points); + + let blob = new Blob([buffer], {type: "application/octet-binary"}); + $('#potree_download_profile_link').attr('href', URL.createObjectURL(blob)); + }); + } + + selectPoint (mileage, elevation, radius) { + let closest = { + distance: Infinity, + pointcloud: null, + points: null, + index: null + }; + + let pointBox = new Box2( + new Vector2(mileage - radius, elevation - radius), + new Vector2(mileage + radius, elevation + radius)); + + let numTested = 0; + let numSkipped = 0; + let numTestedPoints = 0; + let numSkippedPoints = 0; + + for (let [pointcloud, entry] of this.pointclouds) { + for(let points of entry.points){ + + let collisionBox = new Box2( + new Vector2(points.projectedBox.min.x, points.projectedBox.min.z), + new Vector2(points.projectedBox.max.x, points.projectedBox.max.z) + ); + + let intersects = collisionBox.intersectsBox(pointBox); + + if(!intersects){ + numSkipped++; + numSkippedPoints += points.numPoints; + continue; + } + + numTested++; + numTestedPoints += points.numPoints; + + for (let i = 0; i < points.numPoints; i++) { + + let m = points.data.mileage[i] - mileage; + let e = points.data.position[3 * i + 2] - elevation + pointcloud.position.z; + let r = Math.sqrt(m * m + e * e); + + const withinDistance = r < radius && r < closest.distance; + let unfilteredClass = true; + + if(points.data.classification){ + const classification = pointcloud.material.classification; + + const pointClassID = points.data.classification[i]; + const pointClassValue = classification[pointClassID]; + + if(pointClassValue && (!pointClassValue.visible || pointClassValue.color.w === 0)){ + unfilteredClass = false; + } + } + + if (withinDistance && unfilteredClass) { + closest = { + distance: r, + pointcloud: pointcloud, + points: points, + index: i + }; + } + } + } + } + + + //console.log(`nodes: ${numTested}, ${numSkipped} || points: ${numTestedPoints}, ${numSkippedPoints}`); + + if (closest.distance < Infinity) { + let points = closest.points; + + let point = {}; + + let attributes = Object.keys(points.data); + for (let attribute of attributes) { + let attributeData = points.data[attribute]; + let itemSize = attributeData.length / points.numPoints; + let value = attributeData.subarray(itemSize * closest.index, itemSize * closest.index + itemSize); + + if (value.length === 1) { + point[attribute] = value[0]; + } else { + point[attribute] = value; + } + } + + closest.point = point; + + return closest; + } else { + return null; + } + } + + initTHREE () { + this.renderer = new WebGLRenderer({alpha: true, premultipliedAlpha: false}); + this.renderer.setClearColor(0x000000, 0); + this.renderer.setSize(10, 10); + this.renderer.autoClear = false; + this.renderArea.append($(this.renderer.domElement)); + this.renderer.domElement.tabIndex = '2222'; + $(this.renderer.domElement).css('width', '100%'); + $(this.renderer.domElement).css('height', '100%'); + + + { + let gl = this.renderer.getContext(); + + if(gl.createVertexArray == null){ + let extVAO = gl.getExtension('OES_vertex_array_object'); + + if(!extVAO){ + throw new Error("OES_vertex_array_object extension not supported"); + } + + gl.createVertexArray = extVAO.createVertexArrayOES.bind(extVAO); + gl.bindVertexArray = extVAO.bindVertexArrayOES.bind(extVAO); + } + + } + + this.camera = new OrthographicCamera(-1000, 1000, 1000, -1000, -1000, 1000); + this.camera.up.set(0, 0, 1); + this.camera.rotation.order = "ZXY"; + this.camera.rotation.x = Math.PI / 2.0; + + + this.scene = new Scene(); + this.profileScene = new Scene(); + + let sg = new SphereGeometry(1, 16, 16); + let sm = new MeshNormalMaterial(); + this.pickSphere = new Mesh(sg, sm); + this.scene.add(this.pickSphere); + + { + const sg = new SphereGeometry(2); + const sm = new MeshNormalMaterial(); + const s = new Mesh(sg, sm); + + s.position.set(589530.450, 231398.860, 769.735); + + this.scene.add(s); + } + + this.viewerPickSphere = new Mesh(sg, sm); + } + + initSVG () { + let width = this.renderArea[0].clientWidth; + let height = this.renderArea[0].clientHeight; + let marginLeft = this.renderArea[0].offsetLeft; + + this.svg.selectAll('*').remove(); + + this.scaleX = d3.scale.linear() + .domain([this.camera.left + this.camera.position.x, this.camera.right + this.camera.position.x]) + .range([0, width]); + this.scaleY = d3.scale.linear() + .domain([this.camera.bottom + this.camera.position.z, this.camera.top + this.camera.position.z]) + .range([height, 0]); + + this.xAxis = d3.svg.axis() + .scale(this.scaleX) + .orient('bottom') + .innerTickSize(-height) + .outerTickSize(1) + .tickPadding(10) + .ticks(width / 50); + + this.yAxis = d3.svg.axis() + .scale(this.scaleY) + .orient('left') + .innerTickSize(-width) + .outerTickSize(1) + .tickPadding(10) + .ticks(height / 20); + + this.elXAxis = this.svg.append('g') + .attr('class', 'x axis') + .attr('transform', `translate(${marginLeft}, ${height})`) + .call(this.xAxis); + + this.elYAxis = this.svg.append('g') + .attr('class', 'y axis') + .attr('transform', `translate(${marginLeft}, 0)`) + .call(this.yAxis); + } + + addPoints (pointcloud, points) { + + if(points.numPoints === 0){ + return; + } + + let entry = this.pointclouds.get(pointcloud); + if(!entry){ + entry = new ProfileFakeOctree(pointcloud); + this.pointclouds.set(pointcloud, entry); + this.profileScene.add(entry); + + let materialChanged = () => { + this.render(); + }; + + materialChanged(); + + pointcloud.material.addEventListener('material_property_changed', materialChanged); + this.addEventListener("on_reset_once", () => { + pointcloud.material.removeEventListener('material_property_changed', materialChanged); + }); + } + + entry.addPoints(points); + this.projectedBox.union(entry.projectedBox); + + if (this.autoFit && this.autoFitEnabled) { + let width = this.renderArea[0].clientWidth; + let height = this.renderArea[0].clientHeight; + + let size = this.projectedBox.getSize(new Vector3()); + + let sx = width / size.x; + let sy = height / size.z; + let scale = Math.min(sx, sy); + + let center = this.projectedBox.getCenter(new Vector3()); + this.scale.set(scale, scale, 1); + this.camera.position.copy(center); + + //console.log("camera: ", this.camera.position.toArray().join(", ")); + } + + //console.log(entry); + + this.render(); + + let numPoints = 0; + for (let [key, value] of this.pointclouds.entries()) { + numPoints += value.points.reduce( (a, i) => a + i.numPoints, 0); + } + $(`#profile_num_points`).html(Utils.addCommas(numPoints)); + + } + + reset () { + this.lastReset = new Date().getTime(); + + this.dispatchEvent({type: "on_reset_once"}); + this.removeEventListeners("on_reset_once"); + + this.autoFit = true; + this.projectedBox = new Box3(); + + for(let [key, entry] of this.pointclouds){ + entry.dispose(); + } + + this.pointclouds.clear(); + this.mouseIsDown = false; + this.mouse.set(0, 0); + + if(this.autoFitEnabled){ + this.scale.set(1, 1, 1); + } + this.pickSphere.visible = false; + + this.elRoot.find('#profileSelectionProperties').hide(); + + this.render(); + } + + show () { + this.elRoot.fadeIn(); + this.enabled = true; + } + + hide () { + this.elRoot.fadeOut(); + this.enabled = false; + } + + updateScales () { + + let width = this.renderArea[0].clientWidth; + let height = this.renderArea[0].clientHeight; + + let left = (-width / 2) / this.scale.x; + let right = (+width / 2) / this.scale.x; + let top = (+height / 2) / this.scale.y; + let bottom = (-height / 2) / this.scale.y; + + this.camera.left = left; + this.camera.right = right; + this.camera.top = top; + this.camera.bottom = bottom; + this.camera.updateProjectionMatrix(); + + this.scaleX.domain([this.camera.left + this.camera.position.x, this.camera.right + this.camera.position.x]) + .range([0, width]); + this.scaleY.domain([this.camera.bottom + this.camera.position.z, this.camera.top + this.camera.position.z]) + .range([height, 0]); + + let marginLeft = this.renderArea[0].offsetLeft; + + this.xAxis.scale(this.scaleX) + .orient('bottom') + .innerTickSize(-height) + .outerTickSize(1) + .tickPadding(10) + .ticks(width / 50); + this.yAxis.scale(this.scaleY) + .orient('left') + .innerTickSize(-width) + .outerTickSize(1) + .tickPadding(10) + .ticks(height / 20); + + + this.elXAxis + .attr('transform', `translate(${marginLeft}, ${height})`) + .call(this.xAxis); + this.elYAxis + .attr('transform', `translate(${marginLeft}, 0)`) + .call(this.yAxis); + } + + requestScaleUpdate(){ + + let threshold = 100; + let allowUpdate = ((this.lastReset === undefined) || (this.lastScaleUpdate === undefined)) + || ((new Date().getTime() - this.lastReset) > threshold && (new Date().getTime() - this.lastScaleUpdate) > threshold); + + if(allowUpdate){ + + this.updateScales(); + + this.lastScaleUpdate = new Date().getTime(); + + + + this.scaleUpdatePending = false; + }else if(!this.scaleUpdatePending) { + setTimeout(this.requestScaleUpdate.bind(this), 100); + this.scaleUpdatePending = true; + } + + } + + render () { + let width = this.renderArea[0].clientWidth; + let height = this.renderArea[0].clientHeight; + + let {renderer, pRenderer, camera, profileScene, scene} = this; + let {scaleX, pickSphere} = this; + + renderer.setSize(width, height); + + renderer.setClearColor(0x000000, 0); + renderer.clear(true, true, false); + + for(let pointcloud of this.pointclouds.keys()){ + let source = pointcloud.material; + let target = this.pointclouds.get(pointcloud).material; + + copyMaterial(source, target); + target.size = 2; + } + + pRenderer.render(profileScene, camera, null); + + let radius = Math.abs(scaleX.invert(0) - scaleX.invert(5)); + + if (radius === 0) { + pickSphere.visible = false; + } else { + pickSphere.scale.set(radius, radius, radius); + pickSphere.visible = true; + } + + renderer.render(scene, camera); + + this.requestScaleUpdate(); + } + }; + + class ProfileWindowController { + constructor (viewer) { + this.viewer = viewer; + this.profileWindow = viewer.profileWindow; + this.profile = null; + this.numPoints = 0; + this.threshold = 60 * 1000; + this.rotateAmount = 10; + + this.scheduledRecomputeTime = null; + + this.enabled = true; + + this.requests = []; + + this._recompute = () => { this.recompute(); }; + + this.viewer.addEventListener("scene_changed", e => { + e.oldScene.removeEventListener("pointcloud_added", this._recompute); + e.scene.addEventListener("pointcloud_added", this._recompute); + }); + this.viewer.scene.addEventListener("pointcloud_added", this._recompute); + + $("#potree_profile_rotate_amount").val(parseInt(this.rotateAmount)); + $("#potree_profile_rotate_amount").on("input", (e) => { + const str = $("#potree_profile_rotate_amount").val(); + + if(!isNaN(str)){ + const value = parseFloat(str); + this.rotateAmount = value; + $("#potree_profile_rotate_amount").css("background-color", ""); + }else { + $("#potree_profile_rotate_amount").css("background-color", "#ff9999"); + } + + }); + + const rotate = (radians) => { + const profile = this.profile; + const points = profile.points; + const start = points[0]; + const end = points[points.length - 1]; + const center = start.clone().add(end).multiplyScalar(0.5); + + const mMoveOrigin = new Matrix4().makeTranslation(-center.x, -center.y, -center.z); + const mRotate = new Matrix4().makeRotationZ(radians); + const mMoveBack = new Matrix4().makeTranslation(center.x, center.y, center.z); + //const transform = mMoveOrigin.multiply(mRotate).multiply(mMoveBack); + const transform = mMoveBack.multiply(mRotate).multiply(mMoveOrigin); + + const rotatedPoints = points.map( point => point.clone().applyMatrix4(transform) ); + + this.profileWindow.autoFitEnabled = false; + + for(let i = 0; i < points.length; i++){ + profile.setPosition(i, rotatedPoints[i]); + } + }; + + $("#potree_profile_rotate_cw").click( () => { + const radians = MathUtils.degToRad(this.rotateAmount); + rotate(-radians); + }); + + $("#potree_profile_rotate_ccw").click( () => { + const radians = MathUtils.degToRad(this.rotateAmount); + rotate(radians); + }); + + $("#potree_profile_move_forward").click( () => { + const profile = this.profile; + const points = profile.points; + const start = points[0]; + const end = points[points.length - 1]; + + const dir = end.clone().sub(start).normalize(); + const up = new Vector3(0, 0, 1); + const forward = up.cross(dir); + const move = forward.clone().multiplyScalar(profile.width / 2); + + this.profileWindow.autoFitEnabled = false; + + for(let i = 0; i < points.length; i++){ + profile.setPosition(i, points[i].clone().add(move)); + } + }); + + $("#potree_profile_move_backward").click( () => { + const profile = this.profile; + const points = profile.points; + const start = points[0]; + const end = points[points.length - 1]; + + const dir = end.clone().sub(start).normalize(); + const up = new Vector3(0, 0, 1); + const forward = up.cross(dir); + const move = forward.clone().multiplyScalar(-profile.width / 2); + + this.profileWindow.autoFitEnabled = false; + + for(let i = 0; i < points.length; i++){ + profile.setPosition(i, points[i].clone().add(move)); + } + }); + } + + setProfile (profile) { + if (this.profile !== null && this.profile !== profile) { + this.profile.removeEventListener('marker_moved', this._recompute); + this.profile.removeEventListener('marker_added', this._recompute); + this.profile.removeEventListener('marker_removed', this._recompute); + this.profile.removeEventListener('width_changed', this._recompute); + } + + this.profile = profile; + + { + this.profile.addEventListener('marker_moved', this._recompute); + this.profile.addEventListener('marker_added', this._recompute); + this.profile.addEventListener('marker_removed', this._recompute); + this.profile.addEventListener('width_changed', this._recompute); + } + + this.recompute(); + } + + reset () { + this.profileWindow.reset(); + + this.numPoints = 0; + + if (this.profile) { + for (let request of this.requests) { + request.cancel(); + } + } + } + + progressHandler (pointcloud, progress) { + for (let segment of progress.segments) { + this.profileWindow.addPoints(pointcloud, segment.points); + this.numPoints += segment.points.numPoints; + } + } + + cancel () { + for (let request of this.requests) { + request.cancel(); + // request.finishLevelThenCancel(); + } + + this.requests = []; + }; + + finishLevelThenCancel(){ + for (let request of this.requests) { + request.finishLevelThenCancel(); + } + + this.requests = []; + } + + recompute () { + if (!this.profile) { + return; + } + + if (this.scheduledRecomputeTime !== null && this.scheduledRecomputeTime > new Date().getTime()) { + return; + } else { + this.scheduledRecomputeTime = new Date().getTime() + 100; + } + this.scheduledRecomputeTime = null; + + this.reset(); + + for (let pointcloud of this.viewer.scene.pointclouds.filter(p => p.visible)) { + let request = pointcloud.getPointsInProfile(this.profile, null, { + 'onProgress': (event) => { + if (!this.enabled) { + return; + } + + this.progressHandler(pointcloud, event.points); + + if (this.numPoints > this.threshold) { + this.finishLevelThenCancel(); + } + }, + 'onFinish': (event) => { + if (!this.enabled) { + + } + }, + 'onCancel': () => { + if (!this.enabled) { + + } + } + }); + + this.requests.push(request); + } + } + }; + + /** + * + * @author sigeom sa / http://sigeom.ch + * @author Ioda-Net Sàrl / https://www.ioda-net.ch/ + * @author Markus Schütz / http://potree.org + * + */ + + class GeoJSONExporter{ + + static measurementToFeatures (measurement) { + let coords = measurement.points.map(e => e.position.toArray()); + + let features = []; + + if (coords.length === 1) { + let feature = { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: coords[0] + }, + properties: { + name: measurement.name + } + }; + features.push(feature); + } else if (coords.length > 1 && !measurement.closed) { + let object = { + 'type': 'Feature', + 'geometry': { + 'type': 'LineString', + 'coordinates': coords + }, + 'properties': { + name: measurement.name + } + }; + + features.push(object); + } else if (coords.length > 1 && measurement.closed) { + let object = { + 'type': 'Feature', + 'geometry': { + 'type': 'Polygon', + 'coordinates': [[...coords, coords[0]]] + }, + 'properties': { + name: measurement.name + } + }; + features.push(object); + } + + if (measurement.showDistances) { + measurement.edgeLabels.forEach((label) => { + let labelPoint = { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: label.position.toArray() + }, + properties: { + distance: label.text + } + }; + features.push(labelPoint); + }); + } + + if (measurement.showArea) { + let point = measurement.areaLabel.position; + let labelArea = { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: point.toArray() + }, + properties: { + area: measurement.areaLabel.text + } + }; + features.push(labelArea); + } + + return features; + } + + static toString (measurements) { + if (!(measurements instanceof Array)) { + measurements = [measurements]; + } + + measurements = measurements.filter(m => m instanceof Measure); + + let features = []; + for (let measure of measurements) { + let f = GeoJSONExporter.measurementToFeatures(measure); + + features = features.concat(f); + } + + let geojson = { + 'type': 'FeatureCollection', + 'features': features + }; + + return JSON.stringify(geojson, null, '\t'); + } + + } + + /** + * + * @author sigeom sa / http://sigeom.ch + * @author Ioda-Net Sàrl / https://www.ioda-net.ch/ + * @author Markus Schuetz / http://potree.org + * + */ + + class DXFExporter { + + static measurementPointSection (measurement) { + let position = measurement.points[0].position; + + if (!position) { + return ''; + } + + let dxfSection = `0 +CIRCLE +8 +layer_point +10 +${position.x} +20 +${position.y} +30 +${position.z} +40 +1.0 +`; + + return dxfSection; + } + + static measurementPolylineSection (measurement) { + // bit code for polygons/polylines: + // https://www.autodesk.com/techpubs/autocad/acad2000/dxf/polyline_dxf_06.htm + let geomCode = 8; + if (measurement.closed) { + geomCode += 1; + } + + let dxfSection = `0 +POLYLINE +8 +layer_polyline +62 +1 +66 +1 +10 +0.0 +20 +0.0 +30 +0.0 +70 +${geomCode} +`; + + let xMax = 0.0; + let yMax = 0.0; + let zMax = 0.0; + for (let point of measurement.points) { + point = point.position; + xMax = Math.max(xMax, point.x); + yMax = Math.max(yMax, point.y); + zMax = Math.max(zMax, point.z); + + dxfSection += `0 +VERTEX +8 +0 +10 +${point.x} +20 +${point.y} +30 +${point.z} +70 +32 +`; + } + dxfSection += `0 +SEQEND +`; + + return dxfSection; + } + + static measurementSection (measurement) { + // if(measurement.points.length <= 1){ + // return ""; + // } + + if (measurement.points.length === 0) { + return ''; + } else if (measurement.points.length === 1) { + return DXFExporter.measurementPointSection(measurement); + } else if (measurement.points.length >= 2) { + return DXFExporter.measurementPolylineSection(measurement); + } + } + + static toString(measurements){ + if (!(measurements instanceof Array)) { + measurements = [measurements]; + } + measurements = measurements.filter(m => m instanceof Measure); + + let points = measurements.filter(m => (m instanceof Measure)) + .map(m => m.points) + .reduce((a, v) => a.concat(v)) + .map(p => p.position); + + let min = new Vector3(Infinity, Infinity, Infinity); + let max = new Vector3(-Infinity, -Infinity, -Infinity); + for (let point of points) { + min.min(point); + max.max(point); + } + + let dxfHeader = `999 +DXF created from potree +0 +SECTION +2 +HEADER +9 +$ACADVER +1 +AC1006 +9 +$INSBASE +10 +0.0 +20 +0.0 +30 +0.0 +9 +$EXTMIN +10 +${min.x} +20 +${min.y} +30 +${min.z} +9 +$EXTMAX +10 +${max.x} +20 +${max.y} +30 +${max.z} +0 +ENDSEC +`; + + let dxfBody = `0 +SECTION +2 +ENTITIES +`; + + for (let measurement of measurements) { + dxfBody += DXFExporter.measurementSection(measurement); + } + + dxfBody += `0 +ENDSEC +`; + + let dxf = dxfHeader + dxfBody + '0\nEOF'; + + return dxf; + } + + } + + class MeasurePanel{ + + constructor(viewer, measurement, propertiesPanel){ + this.viewer = viewer; + this.measurement = measurement; + this.propertiesPanel = propertiesPanel; + + this._update = () => { this.update(); }; + } + + createCoordinatesTable(points){ + let table = $(` + + + + + + + +
    xyz
    + `); + + let copyIconPath = Potree.resourcePath + '/icons/copy.svg'; + + for (let point of points) { + let x = Utils.addCommas(point.x.toFixed(3)); + let y = Utils.addCommas(point.y.toFixed(3)); + let z = Utils.addCommas(point.z.toFixed(3)); + + let row = $(` + + ${x} + ${y} + ${z} + + + + + `); + + this.elCopy = row.find("img[name=copy]"); + this.elCopy.click( () => { + let msg = point.toArray().map(c => c.toFixed(3)).join(", "); + Utils.clipboardCopy(msg); + + this.viewer.postMessage( + `Copied value to clipboard:
    '${msg}'`, + {duration: 3000}); + }); + + table.append(row); + } + + return table; + }; + + createAttributesTable(){ + let elTable = $('
    '); + + let point = this.measurement.points[0]; + + for(let attributeName of Object.keys(point)){ + if(attributeName === "position"){ + + }else if(attributeName === "rgba"){ + let color = point.rgba; + let text = color.join(', '); + + elTable.append($(` + + rgb + ${text} + + `)); + }else { + let value = point[attributeName]; + let text = value.join(', '); + + elTable.append($(` + + ${attributeName} + ${text} + + `)); + } + } + + return elTable; + } + + update(){ + + } + }; + + class DistancePanel extends MeasurePanel{ + constructor(viewer, measurement, propertiesPanel){ + super(viewer, measurement, propertiesPanel); + + let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; + this.elContent = $(` +
    + +
    +
    + + +
    + + + + + +
    +
    + `); + + this.elRemove = this.elContent.find("img[name=remove]"); + this.elRemove.click( () => { + this.viewer.scene.removeMeasurement(measurement); + }); + + this.elMakeProfile = this.elContent.find("input[name=make_profile]"); + this.elMakeProfile.click( () => { + //measurement.points; + const profile = new Profile(); + + profile.name = measurement.name; + profile.width = measurement.getTotalDistance() / 50; + + for(const point of measurement.points){ + profile.addMarker(point.position.clone()); + } + + this.viewer.scene.addProfile(profile); + + }); + + this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + + this.update(); + } + + update(){ + let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); + elCoordiantesContainer.empty(); + elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + + let positions = this.measurement.points.map(p => p.position); + let distances = []; + for (let i = 0; i < positions.length - 1; i++) { + let d = positions[i].distanceTo(positions[i + 1]); + distances.push(d.toFixed(3)); + } + + let totalDistance = this.measurement.getTotalDistance().toFixed(3); + let elDistanceTable = this.elContent.find(`#distances_table`); + elDistanceTable.empty(); + + for (let i = 0; i < distances.length; i++) { + let label = (i === 0) ? 'Distances: ' : ''; + let distance = distances[i]; + let elDistance = $(` + + ${label} + ${distance} + `); + elDistanceTable.append(elDistance); + } + + let elTotal = $(` + + Total: ${totalDistance} + `); + elDistanceTable.append(elTotal); + } + }; + + class PointPanel extends MeasurePanel{ + constructor(viewer, measurement, propertiesPanel){ + super(viewer, measurement, propertiesPanel); + + let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; + this.elContent = $(` +
    + +
    + + + +
    + + + +
    +
    + `); + + this.elRemove = this.elContent.find("img[name=remove]"); + this.elRemove.click( () => { + this.viewer.scene.removeMeasurement(measurement); + }); + + this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + + this.update(); + } + + update(){ + let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); + elCoordiantesContainer.empty(); + elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + + let elAttributesContainer = this.elContent.find('.attributes_table_container'); + elAttributesContainer.empty(); + elAttributesContainer.append(this.createAttributesTable()); + } + }; + + class AreaPanel extends MeasurePanel{ + constructor(viewer, measurement, propertiesPanel){ + super(viewer, measurement, propertiesPanel); + + let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; + this.elContent = $(` +
    + +
    + Area: + + + +
    + + + +
    +
    + `); + + this.elRemove = this.elContent.find("img[name=remove]"); + this.elRemove.click( () => { + this.viewer.scene.removeMeasurement(measurement); + }); + + this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + + this.update(); + } + + update(){ + let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); + elCoordiantesContainer.empty(); + elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + + let elArea = this.elContent.find(`#measurement_area`); + elArea.html(this.measurement.getArea().toFixed(3)); + } + }; + + class AnglePanel extends MeasurePanel{ + constructor(viewer, measurement, propertiesPanel){ + super(viewer, measurement, propertiesPanel); + + let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; + this.elContent = $(` +
    + +
    + + + + + + + + + + + +
    \u03b1\u03b2\u03b3
    + + +
    + + + +
    +
    + `); + + this.elRemove = this.elContent.find("img[name=remove]"); + this.elRemove.click( () => { + this.viewer.scene.removeMeasurement(measurement); + }); + + this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + + this.update(); + } + + update(){ + let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); + elCoordiantesContainer.empty(); + elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + + let angles = []; + for(let i = 0; i < this.measurement.points.length; i++){ + angles.push(this.measurement.getAngle(i) * (180.0 / Math.PI)); + } + angles = angles.map(a => a.toFixed(1) + '\u00B0'); + + let elAlpha = this.elContent.find(`#angle_cell_alpha`); + let elBetta = this.elContent.find(`#angle_cell_betta`); + let elGamma = this.elContent.find(`#angle_cell_gamma`); + + elAlpha.html(angles[0]); + elBetta.html(angles[1]); + elGamma.html(angles[2]); + } + }; + + class CirclePanel extends MeasurePanel{ + constructor(viewer, measurement, propertiesPanel){ + super(viewer, measurement, propertiesPanel); + + let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; + this.elContent = $(` +
    + +
    +
    + + +
    + + + +
    +
    + `); + + this.elRemove = this.elContent.find("img[name=remove]"); + this.elRemove.click( () => { + this.viewer.scene.removeMeasurement(measurement); + }); + + this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + + this.update(); + } + + update(){ + let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); + elCoordiantesContainer.empty(); + elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + + const elInfos = this.elContent.find(`#infos_table`); + + if(this.measurement.points.length !== 3){ + elInfos.empty(); + + return; + } + + const A = this.measurement.points[0].position; + const B = this.measurement.points[1].position; + const C = this.measurement.points[2].position; + + const center = Potree.Utils.computeCircleCenter(A, B, C); + const radius = center.distanceTo(A); + const circumference = 2 * Math.PI * radius; + + const format = (number) => { + return Potree.Utils.addCommas(number.toFixed(3)); + }; + + + const txtCenter = `${format(center.x)} ${format(center.y)} ${format(center.z)}`; + const txtRadius = format(radius); + const txtCircumference = format(circumference); + + const thStyle = `style="text-align: left"`; + const tdStyle = `style="width: 100%; padding: 5px;"`; + + elInfos.html(` + + Center: + + + + + ${txtCenter} + + + + Radius: + ${txtRadius} + + + Circumference: + ${txtCircumference} + + `); + } + }; + + class HeightPanel extends MeasurePanel{ + constructor(viewer, measurement, propertiesPanel){ + super(viewer, measurement, propertiesPanel); + + let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; + this.elContent = $(` +
    + +
    + Height:
    + + +
    + + + +
    +
    + `); + + this.elRemove = this.elContent.find("img[name=remove]"); + this.elRemove.click( () => { + this.viewer.scene.removeMeasurement(measurement); + }); + + this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + + this.update(); + } + + update(){ + let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); + elCoordiantesContainer.empty(); + elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position))); + + { + let points = this.measurement.points; + + let sorted = points.slice().sort((a, b) => a.position.z - b.position.z); + let lowPoint = sorted[0].position.clone(); + let highPoint = sorted[sorted.length - 1].position.clone(); + let min = lowPoint.z; + let max = highPoint.z; + let height = max - min; + height = height.toFixed(3); + + this.elHeightLabel = this.elContent.find(`#height_label`); + this.elHeightLabel.html(`Height: ${height}`); + } + } + }; + + class VolumePanel extends MeasurePanel{ + constructor(viewer, measurement, propertiesPanel){ + super(viewer, measurement, propertiesPanel); + + let copyIconPath = Potree.resourcePath + '/icons/copy.svg'; + let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; + + let lblLengthText = new Map([ + [BoxVolume, "length"], + [SphereVolume, "rx"], + ]).get(measurement.constructor); + + let lblWidthText = new Map([ + [BoxVolume, "width"], + [SphereVolume, "ry"], + ]).get(measurement.constructor); + + let lblHeightText = new Map([ + [BoxVolume, "height"], + [SphereVolume, "rz"], + ]).get(measurement.constructor); + + this.elContent = $(` +
    + + + + + + + + + + + + + + + +
    \u03b1\u03b2\u03b3
    + +
    + + + + + + + + + + + + + + +
    ${lblLengthText}${lblWidthText}${lblHeightText}
    + +
    + +
    + Volume: + + + + +
  • + +
  • + +
  • + +
    +
  • + + + +
  • + + +
  • +
    + + + +
    +
    + `); + + { // download + this.elDownloadButton = this.elContent.find("input[name=download_volume]"); + + if(this.propertiesPanel.viewer.server){ + this.elDownloadButton.click(() => this.download()); + } else { + this.elDownloadButton.hide(); + } + } + + this.elCopyRotation = this.elContent.find("img[name=copyRotation]"); + this.elCopyRotation.click( () => { + let rotation = this.measurement.rotation.toArray().slice(0, 3); + let msg = rotation.map(c => c.toFixed(3)).join(", "); + Utils.clipboardCopy(msg); + + this.viewer.postMessage( + `Copied value to clipboard:
    '${msg}'`, + {duration: 3000}); + }); + + this.elCopyScale = this.elContent.find("img[name=copyScale]"); + this.elCopyScale.click( () => { + let scale = this.measurement.scale.toArray(); + let msg = scale.map(c => c.toFixed(3)).join(", "); + Utils.clipboardCopy(msg); + + this.viewer.postMessage( + `Copied value to clipboard:
    '${msg}'`, + {duration: 3000}); + }); + + this.elRemove = this.elContent.find("img[name=remove]"); + this.elRemove.click( () => { + this.viewer.scene.removeVolume(measurement); + }); + + this.elContent.find("#volume_reset_orientation").click(() => { + measurement.rotation.set(0, 0, 0); + }); + + this.elContent.find("#volume_make_uniform").click(() => { + let mean = (measurement.scale.x + measurement.scale.y + measurement.scale.z) / 3; + measurement.scale.set(mean, mean, mean); + }); + + this.elCheckClip = this.elContent.find('#volume_clip'); + this.elCheckClip.click(event => { + this.measurement.clip = event.target.checked; + }); + + this.elCheckShow = this.elContent.find('#volume_show'); + this.elCheckShow.click(event => { + this.measurement.visible = event.target.checked; + }); + + this.propertiesPanel.addVolatileListener(measurement, "position_changed", this._update); + this.propertiesPanel.addVolatileListener(measurement, "orientation_changed", this._update); + this.propertiesPanel.addVolatileListener(measurement, "scale_changed", this._update); + this.propertiesPanel.addVolatileListener(measurement, "clip_changed", this._update); + + this.update(); + } + + async download(){ + + let clipBox = this.measurement; + + let regions = []; + //for(let clipBox of boxes){ + { + let toClip = clipBox.matrixWorld; + + let px = new Vector3(+0.5, 0, 0).applyMatrix4(toClip); + let nx = new Vector3(-0.5, 0, 0).applyMatrix4(toClip); + let py = new Vector3(0, +0.5, 0).applyMatrix4(toClip); + let ny = new Vector3(0, -0.5, 0).applyMatrix4(toClip); + let pz = new Vector3(0, 0, +0.5).applyMatrix4(toClip); + let nz = new Vector3(0, 0, -0.5).applyMatrix4(toClip); + + let pxN = new Vector3().subVectors(nx, px).normalize(); + let nxN = pxN.clone().multiplyScalar(-1); + let pyN = new Vector3().subVectors(ny, py).normalize(); + let nyN = pyN.clone().multiplyScalar(-1); + let pzN = new Vector3().subVectors(nz, pz).normalize(); + let nzN = pzN.clone().multiplyScalar(-1); + + let planes = [ + new Plane().setFromNormalAndCoplanarPoint(pxN, px), + new Plane().setFromNormalAndCoplanarPoint(nxN, nx), + new Plane().setFromNormalAndCoplanarPoint(pyN, py), + new Plane().setFromNormalAndCoplanarPoint(nyN, ny), + new Plane().setFromNormalAndCoplanarPoint(pzN, pz), + new Plane().setFromNormalAndCoplanarPoint(nzN, nz), + ]; + + let planeQueryParts = []; + for(let plane of planes){ + let part = [plane.normal.toArray(), plane.constant].join(","); + part = `[${part}]`; + planeQueryParts.push(part); + } + let region = "[" + planeQueryParts.join(",") + "]"; + regions.push(region); + } + + let regionsArg = regions.join(","); + + let pointcloudArgs = []; + for(let pointcloud of this.viewer.scene.pointclouds){ + if(!pointcloud.visible){ + continue; + } + + let offset = pointcloud.pcoGeometry.offset.clone(); + let negateOffset = new Matrix4().makeTranslation(...offset.multiplyScalar(-1).toArray()); + let matrixWorld = pointcloud.matrixWorld; + + let transform = new Matrix4().multiplyMatrices(matrixWorld, negateOffset); + + let path = `${window.location.pathname}/../${pointcloud.pcoGeometry.url}`; + + let arg = { + path: path, + transform: transform.elements, + }; + let argString = JSON.stringify(arg); + + pointcloudArgs.push(argString); + } + let pointcloudsArg = pointcloudArgs.join(","); + + let elMessage = this.elContent.find("div[name=download_message]"); + + let error = (message) => { + elMessage.html(`
    ERROR: ${message}
    `); + }; + + let info = (message) => { + elMessage.html(`${message}`); + }; + + let handle = null; + { // START FILTER + let url = `${viewer.server}/create_regions_filter?pointclouds=[${pointcloudsArg}]®ions=[${regionsArg}]`; + + //console.log(url); + + info("estimating results ..."); + + let response = await fetch(url); + let jsResponse = await response.json(); + //console.log(jsResponse); + + if(!jsResponse.handle){ + error(jsResponse.message); + return; + }else { + handle = jsResponse.handle; + } + } + + { // WAIT, CHECK PROGRESS, HANDLE FINISH + let url = `${viewer.server}/check_regions_filter?handle=${handle}`; + + let sleep = (function(duration){ + return new Promise( (res, rej) => { + setTimeout(() => { + res(); + }, duration); + }); + }); + + let handleFiltering = (jsResponse) => { + let {progress, estimate} = jsResponse; + + let progressFract = progress["processed points"] / estimate.points; + let progressPercents = parseInt(progressFract * 100); + + info(`progress: ${progressPercents}%`); + }; + + let handleFinish = (jsResponse) => { + let message = "downloads ready:
    "; + message += "
      "; + + for(let i = 0; i < jsResponse.pointclouds.length; i++){ + let url = `${viewer.server}/download_regions_filter_result?handle=${handle}&index=${i}`; + + message += `
    • result_${i}.las
    • \n`; + } + + let reportURL = `${viewer.server}/download_regions_filter_report?handle=${handle}`; + message += `
    • report.json
    • \n`; + message += "
    "; + + info(message); + }; + + let handleUnexpected = (jsResponse) => { + let message = `Unexpected Response.
    status: ${jsResponse.status}
    message: ${jsResponse.message}`; + info(message); + }; + + let handleError = (jsResponse) => { + let message = `ERROR: ${jsResponse.message}`; + error(message); + + throw new Error(message); + }; + + let start = Date.now(); + + while(true){ + let response = await fetch(url); + let jsResponse = await response.json(); + + if(jsResponse.status === "ERROR"){ + handleError(jsResponse); + }else if(jsResponse.status === "FILTERING"){ + handleFiltering(jsResponse); + }else if(jsResponse.status === "FINISHED"){ + handleFinish(jsResponse); + + break; + }else { + handleUnexpected(jsResponse); + } + + let durationS = (Date.now() - start) / 1000; + let sleepAmountMS = durationS < 10 ? 100 : 1000; + + await sleep(sleepAmountMS); + } + } + + } + + update(){ + let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); + elCoordiantesContainer.empty(); + elCoordiantesContainer.append(this.createCoordinatesTable([this.measurement.position])); + + { + let angles = this.measurement.rotation.toVector3(); + angles = angles.toArray(); + //angles = [angles.z, angles.x, angles.y]; + angles = angles.map(v => 180 * v / Math.PI); + angles = angles.map(a => a.toFixed(1) + '\u00B0'); + + let elAlpha = this.elContent.find(`#angle_cell_alpha`); + let elBetta = this.elContent.find(`#angle_cell_betta`); + let elGamma = this.elContent.find(`#angle_cell_gamma`); + + elAlpha.html(angles[0]); + elBetta.html(angles[1]); + elGamma.html(angles[2]); + } + + { + let dimensions = this.measurement.scale.toArray(); + dimensions = dimensions.map(v => Utils.addCommas(v.toFixed(2))); + + let elLength = this.elContent.find(`#cell_length`); + let elWidth = this.elContent.find(`#cell_width`); + let elHeight = this.elContent.find(`#cell_height`); + + elLength.html(dimensions[0]); + elWidth.html(dimensions[1]); + elHeight.html(dimensions[2]); + } + + { + let elVolume = this.elContent.find(`#measurement_volume`); + let volume = this.measurement.getVolume(); + elVolume.html(Utils.addCommas(volume.toFixed(2))); + } + + this.elCheckClip.prop("checked", this.measurement.clip); + this.elCheckShow.prop("checked", this.measurement.visible); + + } + }; + + class ProfilePanel extends MeasurePanel{ + constructor(viewer, measurement, propertiesPanel){ + super(viewer, measurement, propertiesPanel); + + let removeIconPath = Potree.resourcePath + '/icons/remove.svg'; + this.elContent = $(` +
    + +
    + + Width: + + +
    + +
  • + +
    +
  • + +
    + + + + +
    + + + +
    +
    + `); + + this.elRemove = this.elContent.find("img[name=remove]"); + this.elRemove.click( () => { + this.viewer.scene.removeProfile(measurement); + }); + + { // download + this.elDownloadButton = this.elContent.find(`input[name=download_profile]`); + + if(this.propertiesPanel.viewer.server){ + this.elDownloadButton.click(() => this.download()); + } else { + this.elDownloadButton.hide(); + } + } + + { // width spinner + let elWidthSlider = this.elContent.find(`#sldProfileWidth`); + + elWidthSlider.spinner({ + min: 0, max: 10 * 1000 * 1000, step: 0.01, + numberFormat: 'n', + start: () => {}, + spin: (event, ui) => { + let value = elWidthSlider.spinner('value'); + measurement.setWidth(value); + }, + change: (event, ui) => { + let value = elWidthSlider.spinner('value'); + measurement.setWidth(value); + }, + stop: (event, ui) => { + let value = elWidthSlider.spinner('value'); + measurement.setWidth(value); + }, + incremental: (count) => { + let value = elWidthSlider.spinner('value'); + let step = elWidthSlider.spinner('option', 'step'); + + let delta = value * 0.05; + let increments = Math.max(1, parseInt(delta / step)); + + return increments; + } + }); + elWidthSlider.spinner('value', measurement.getWidth()); + elWidthSlider.spinner('widget').css('width', '100%'); + + let widthListener = (event) => { + let value = elWidthSlider.spinner('value'); + if (value !== measurement.getWidth()) { + elWidthSlider.spinner('value', measurement.getWidth()); + } + }; + this.propertiesPanel.addVolatileListener(measurement, "width_changed", widthListener); + } + + let elShow2DProfile = this.elContent.find(`#show_2d_profile`); + elShow2DProfile.click(() => { + this.propertiesPanel.viewer.profileWindow.show(); + this.propertiesPanel.viewer.profileWindowController.setProfile(measurement); + }); + + this.propertiesPanel.addVolatileListener(measurement, "marker_added", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_removed", this._update); + this.propertiesPanel.addVolatileListener(measurement, "marker_moved", this._update); + + this.update(); + } + + update(){ + let elCoordiantesContainer = this.elContent.find('.coordinates_table_container'); + elCoordiantesContainer.empty(); + elCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points)); + } + + async download(){ + + let profile = this.measurement; + + let regions = []; + { + let segments = profile.getSegments(); + let width = profile.width; + + for(let segment of segments){ + let start = segment.start.clone().multiply(new Vector3(1, 1, 0)); + let end = segment.end.clone().multiply(new Vector3(1, 1, 0)); + let center = new Vector3().addVectors(start, end).multiplyScalar(0.5); + + let startEndDir = new Vector3().subVectors(end, start).normalize(); + let endStartDir = new Vector3().subVectors(start, end).normalize(); + let upDir = new Vector3(0, 0, 1); + let rightDir = new Vector3().crossVectors(startEndDir, upDir); + let leftDir = new Vector3().crossVectors(endStartDir, upDir); + + console.log(leftDir); + + let right = rightDir.clone().multiplyScalar(width * 0.5).add(center); + let left = leftDir.clone().multiplyScalar(width * 0.5).add(center); + + let planes = [ + new Plane().setFromNormalAndCoplanarPoint(startEndDir, start), + new Plane().setFromNormalAndCoplanarPoint(endStartDir, end), + new Plane().setFromNormalAndCoplanarPoint(leftDir, right), + new Plane().setFromNormalAndCoplanarPoint(rightDir, left), + ]; + + let planeQueryParts = []; + for(let plane of planes){ + let part = [plane.normal.toArray(), plane.constant].join(","); + part = `[${part}]`; + planeQueryParts.push(part); + } + let region = "[" + planeQueryParts.join(",") + "]"; + regions.push(region); + } + } + + let regionsArg = regions.join(","); + + let pointcloudArgs = []; + for(let pointcloud of this.viewer.scene.pointclouds){ + if(!pointcloud.visible){ + continue; + } + + let offset = pointcloud.pcoGeometry.offset.clone(); + let negateOffset = new Matrix4().makeTranslation(...offset.multiplyScalar(-1).toArray()); + let matrixWorld = pointcloud.matrixWorld; + + let transform = new Matrix4().multiplyMatrices(matrixWorld, negateOffset); + + let path = `${window.location.pathname}/../${pointcloud.pcoGeometry.url}`; + + let arg = { + path: path, + transform: transform.elements, + }; + let argString = JSON.stringify(arg); + + pointcloudArgs.push(argString); + } + let pointcloudsArg = pointcloudArgs.join(","); + + let elMessage = this.elContent.find("div[name=download_message]"); + + let error = (message) => { + elMessage.html(`
    ERROR: ${message}
    `); + }; + + let info = (message) => { + elMessage.html(`${message}`); + }; + + let handle = null; + { // START FILTER + let url = `${viewer.server}/create_regions_filter?pointclouds=[${pointcloudsArg}]®ions=[${regionsArg}]`; + + //console.log(url); + + info("estimating results ..."); + + let response = await fetch(url); + let jsResponse = await response.json(); + //console.log(jsResponse); + + if(!jsResponse.handle){ + error(jsResponse.message); + return; + }else { + handle = jsResponse.handle; + } + } + + { // WAIT, CHECK PROGRESS, HANDLE FINISH + let url = `${viewer.server}/check_regions_filter?handle=${handle}`; + + let sleep = (function(duration){ + return new Promise( (res, rej) => { + setTimeout(() => { + res(); + }, duration); + }); + }); + + let handleFiltering = (jsResponse) => { + let {progress, estimate} = jsResponse; + + let progressFract = progress["processed points"] / estimate.points; + let progressPercents = parseInt(progressFract * 100); + + info(`progress: ${progressPercents}%`); + }; + + let handleFinish = (jsResponse) => { + let message = "downloads ready:
    "; + message += "
      "; + + for(let i = 0; i < jsResponse.pointclouds.length; i++){ + let url = `${viewer.server}/download_regions_filter_result?handle=${handle}&index=${i}`; + + message += `
    • result_${i}.las
    • \n`; + } + + let reportURL = `${viewer.server}/download_regions_filter_report?handle=${handle}`; + message += `
    • report.json
    • \n`; + message += "
    "; + + info(message); + }; + + let handleUnexpected = (jsResponse) => { + let message = `Unexpected Response.
    status: ${jsResponse.status}
    message: ${jsResponse.message}`; + info(message); + }; + + let handleError = (jsResponse) => { + let message = `ERROR: ${jsResponse.message}`; + error(message); + + throw new Error(message); + }; + + let start = Date.now(); + + while(true){ + let response = await fetch(url); + let jsResponse = await response.json(); + + if(jsResponse.status === "ERROR"){ + handleError(jsResponse); + }else if(jsResponse.status === "FILTERING"){ + handleFiltering(jsResponse); + }else if(jsResponse.status === "FINISHED"){ + handleFinish(jsResponse); + + break; + }else { + handleUnexpected(jsResponse); + } + + let durationS = (Date.now() - start) / 1000; + let sleepAmountMS = durationS < 10 ? 100 : 1000; + + await sleep(sleepAmountMS); + } + } + + } + }; + + class CameraPanel{ + constructor(viewer, propertiesPanel){ + this.viewer = viewer; + this.propertiesPanel = propertiesPanel; + + this._update = () => { this.update(); }; + + let copyIconPath = Potree.resourcePath + '/icons/copy.svg'; + this.elContent = $(` +
    + + + + + + + + + + + + + + + + + + + + + +
    position
    + +
    target
    + +
    +
    + `); + + this.elCopyPosition = this.elContent.find("img[name=copyPosition]"); + this.elCopyPosition.click( () => { + let pos = this.viewer.scene.getActiveCamera().position.toArray(); + let msg = pos.map(c => c.toFixed(3)).join(", "); + Utils.clipboardCopy(msg); + + this.viewer.postMessage( + `Copied value to clipboard:
    '${msg}'`, + {duration: 3000}); + }); + + this.elCopyTarget = this.elContent.find("img[name=copyTarget]"); + this.elCopyTarget.click( () => { + let pos = this.viewer.scene.view.getPivot().toArray(); + let msg = pos.map(c => c.toFixed(3)).join(", "); + Utils.clipboardCopy(msg); + + this.viewer.postMessage( + `Copied value to clipboard:
    '${msg}'`, + {duration: 3000}); + }); + + this.propertiesPanel.addVolatileListener(viewer, "camera_changed", this._update); + + this.update(); + } + + update(){ + //console.log("updating camera panel"); + + let camera = this.viewer.scene.getActiveCamera(); + let view = this.viewer.scene.view; + + let pos = camera.position.toArray().map(c => Utils.addCommas(c.toFixed(3))); + this.elContent.find("#camera_position_x").html(pos[0]); + this.elContent.find("#camera_position_y").html(pos[1]); + this.elContent.find("#camera_position_z").html(pos[2]); + + let target = view.getPivot().toArray().map(c => Utils.addCommas(c.toFixed(3))); + this.elContent.find("#camera_target_x").html(target[0]); + this.elContent.find("#camera_target_y").html(target[1]); + this.elContent.find("#camera_target_z").html(target[2]); + } + }; + + class AnnotationPanel{ + constructor(viewer, propertiesPanel, annotation){ + this.viewer = viewer; + this.propertiesPanel = propertiesPanel; + this.annotation = annotation; + + this._update = () => { this.update(); }; + + let copyIconPath = `${Potree.resourcePath}/icons/copy.svg`; + this.elContent = $(` +
    + + + + + + + + + + + + +
    position
    + +
    + +
    + +
    Title
    +
    + Annotation Title +
    + +
    Description
    +
    + A longer description of this annotation. + Can be multiple lines long. TODO: the user should be able + to modify title and description. +
    + +
    + +
    + `); + + this.elCopyPosition = this.elContent.find("img[name=copyPosition]"); + this.elCopyPosition.click( () => { + let pos = this.annotation.position.toArray(); + let msg = pos.map(c => c.toFixed(3)).join(", "); + Utils.clipboardCopy(msg); + + this.viewer.postMessage( + `Copied value to clipboard:
    '${msg}'`, + {duration: 3000}); + }); + + this.elTitle = this.elContent.find("#annotation_title").html(annotation.title); + this.elDescription = this.elContent.find("#annotation_description").html(annotation.description); + + this.elTitle[0].addEventListener("input", () => { + const title = this.elTitle.html(); + annotation.title = title; + + }, false); + + this.elDescription[0].addEventListener("input", () => { + const description = this.elDescription.html(); + annotation.description = description; + }, false); + + this.update(); + } + + update(){ + const {annotation, elContent, elTitle, elDescription} = this; + + let pos = annotation.position.toArray().map(c => Utils.addCommas(c.toFixed(3))); + elContent.find("#annotation_position_x").html(pos[0]); + elContent.find("#annotation_position_y").html(pos[1]); + elContent.find("#annotation_position_z").html(pos[2]); + + elTitle.html(annotation.title); + elDescription.html(annotation.description); + + + } + }; + + class CameraAnimationPanel{ + constructor(viewer, propertiesPanel, animation){ + this.viewer = viewer; + this.propertiesPanel = propertiesPanel; + this.animation = animation; + + this.elContent = $(` +
    + + + + + + Duration: + + + + Time:
    + + +
    +
    + `); + + const elPlay = this.elContent.find("input[name=play]"); + elPlay.click( () => { + animation.play(); + }); + + const elSlider = this.elContent.find('#sldTime'); + elSlider.slider({ + value: 0, + min: 0, + max: 1, + step: 0.001, + slide: (event, ui) => { + animation.set(ui.value); + } + }); + + let elDuration = this.elContent.find(`input[name=spnDuration]`); + elDuration.spinner({ + min: 0, max: 300, step: 0.01, + numberFormat: 'n', + start: () => {}, + spin: (event, ui) => { + let value = elDuration.spinner('value'); + animation.setDuration(value); + }, + change: (event, ui) => { + let value = elDuration.spinner('value'); + animation.setDuration(value); + }, + stop: (event, ui) => { + let value = elDuration.spinner('value'); + animation.setDuration(value); + }, + incremental: (count) => { + let value = elDuration.spinner('value'); + let step = elDuration.spinner('option', 'step'); + + let delta = value * 0.05; + let increments = Math.max(1, parseInt(delta / step)); + + return increments; + } + }); + elDuration.spinner('value', animation.getDuration()); + elDuration.spinner('widget').css('width', '100%'); + + const elKeyframes = this.elContent.find("#animation_keyframes"); + + const updateKeyframes = () => { + elKeyframes.empty(); + + //let index = 0; + + // + // + // + + const addNewKeyframeItem = (index) => { + let elNewKeyframe = $(` +
    + + + +
    + `); + + const elAdd = elNewKeyframe.find("input[name=add]"); + elAdd.click( () => { + animation.createControlPoint(index); + }); + + elKeyframes.append(elNewKeyframe); + }; + + const addKeyframeItem = (index) => { + let elKeyframe = $(` +
    + + + + + + + + keyframe + + + + +
    + `); + + const elAssign = elKeyframe.find("img[name=assign]"); + const elMove = elKeyframe.find("img[name=move]"); + const elDelete = elKeyframe.find("img[name=delete]"); + + elAssign.click( () => { + const cp = animation.controlPoints[index]; + + cp.position.copy(viewer.scene.view.position); + cp.target.copy(viewer.scene.view.getPivot()); + }); + + elMove.click( () => { + const cp = animation.controlPoints[index]; + + viewer.scene.view.position.copy(cp.position); + viewer.scene.view.lookAt(cp.target); + }); + + elDelete.click( () => { + const cp = animation.controlPoints[index]; + animation.removeControlPoint(cp); + }); + + elKeyframes.append(elKeyframe); + }; + + let index = 0; + + addNewKeyframeItem(index); + + for(const cp of animation.controlPoints){ + + addKeyframeItem(index); + index++; + addNewKeyframeItem(index); + + } + }; + + updateKeyframes(); + + animation.addEventListener("controlpoint_added", updateKeyframes); + animation.addEventListener("controlpoint_removed", updateKeyframes); + + + + + // this._update = () => { this.update(); }; + + // this.update(); + } + + update(){ + + } + }; + + class PropertiesPanel{ + + constructor(container, viewer){ + this.container = container; + this.viewer = viewer; + this.object = null; + this.cleanupTasks = []; + this.scene = null; + } + + setScene(scene){ + this.scene = scene; + } + + set(object){ + if(this.object === object){ + return; + } + + this.object = object; + + for(let task of this.cleanupTasks){ + task(); + } + this.cleanupTasks = []; + this.container.empty(); + + if(object instanceof PointCloudTree){ + this.setPointCloud(object); + }else if(object instanceof Measure || object instanceof Profile || object instanceof Volume){ + this.setMeasurement(object); + }else if(object instanceof Camera){ + this.setCamera(object); + }else if(object instanceof Annotation){ + this.setAnnotation(object); + }else if(object instanceof CameraAnimation){ + this.setCameraAnimation(object); + } + + } + + // + // Used for events that should be removed when the property object changes. + // This is for listening to materials, scene, point clouds, etc. + // not required for DOM listeners, since they are automatically cleared by removing the DOM subtree. + // + addVolatileListener(target, type, callback){ + target.addEventListener(type, callback); + this.cleanupTasks.push(() => { + target.removeEventListener(type, callback); + }); + } + + setPointCloud(pointcloud){ + + let material = pointcloud.material; + + let panel = $(` +
    +
      + +
    • +
      +
    • +
    • +
      +
    • + + +
    • + + +
    • + + +
    • +
      + +
    • + +
    • + +
    • + + +
    • :
    • + +
      + Attribute +
      + +
    • + +
    • + +
      +
      + Attribute Weights +
      + +
    • RGB:
    • +
    • Intensity:
    • +
    • Elevation:
    • +
    • Classification:
    • +
    • Return Number:
    • +
    • Source ID:
    • +
      + +
      +
      + RGB +
      + +
    • Gamma:
    • +
    • Brightness:
    • +
    • Contrast:
    • +
      + +
      +
      + Extra Attribute +
      + +
    • :
    • + +
    • Gamma:
    • +
    • Brightness:
    • +
    • Contrast:
    • +
      + +
      +
      + MATCAP +
      + +
    • +
      +
    • +
      + +
      +
      + Color +
      + + +
      + + +
      +
      + Elevation +
      + +
    • :
    • + +
    • + + + + + +
    • + +
    • + Gradient Scheme: +
      +
      +
    • +
      + +
      +
      + Transition +
      + +
    • transition:
    • +
      + +
      +
      + Intensity +
      + +
    • Range:
    • +
    • Gamma:
    • +
    • Brightness:
    • +
    • Contrast:
    • +
      + +
      +
      + GPS Time +
      + +
      + +
      +
      + Indices +
      +
      + + +
    +
    + `); + + panel.i18n(); + this.container.append(panel); + + { // POINT SIZE + let sldPointSize = panel.find(`#sldPointSize`); + let lblPointSize = panel.find(`#lblPointSize`); + + sldPointSize.slider({ + value: material.size, + min: 0, + max: 3, + step: 0.01, + slide: function (event, ui) { material.size = ui.value; } + }); + + let update = (e) => { + lblPointSize.html(material.size.toFixed(2)); + sldPointSize.slider({value: material.size}); + }; + this.addVolatileListener(material, "point_size_changed", update); + + update(); + } + + { // MINIMUM POINT SIZE + let sldMinPointSize = panel.find(`#sldMinPointSize`); + let lblMinPointSize = panel.find(`#lblMinPointSize`); + + sldMinPointSize.slider({ + value: material.size, + min: 0, + max: 3, + step: 0.01, + slide: function (event, ui) { material.minSize = ui.value; } + }); + + let update = (e) => { + lblMinPointSize.html(material.minSize.toFixed(2)); + sldMinPointSize.slider({value: material.minSize}); + }; + this.addVolatileListener(material, "point_size_changed", update); + + update(); + } + + { // POINT SIZING + let strSizeType = Object.keys(PointSizeType)[material.pointSizeType]; + + let opt = panel.find(`#optPointSizing`); + opt.selectmenu(); + opt.val(strSizeType).selectmenu('refresh'); + + opt.selectmenu({ + change: (event, ui) => { + material.pointSizeType = PointSizeType[ui.item.value]; + } + }); + } + + { // SHAPE + let opt = panel.find(`#optShape`); + + opt.selectmenu({ + change: (event, ui) => { + let value = ui.item.value; + + material.shape = PointShape[value]; + } + }); + + let update = () => { + let typename = Object.keys(PointShape)[material.shape]; + + opt.selectmenu().val(typename).selectmenu('refresh'); + }; + this.addVolatileListener(material, "point_shape_changed", update); + + update(); + } + + { // BACKFACE CULLING + + let opt = panel.find(`#set_backface_culling`); + opt.click(() => { + material.backfaceCulling = opt.prop("checked"); + }); + let update = () => { + let value = material.backfaceCulling; + opt.prop("checked", value); + }; + this.addVolatileListener(material, "backface_changed", update); + update(); + + let blockBackface = $('#materials_backface_container'); + blockBackface.css('display', 'none'); + + const pointAttributes = pointcloud.pcoGeometry.pointAttributes; + const hasNormals = pointAttributes.hasNormals ? pointAttributes.hasNormals() : false; + if(hasNormals) { + blockBackface.css('display', 'block'); + } + /* + opt.checkboxradio({ + clicked: (event, ui) => { + // let value = ui.item.value; + let value = ui.item.checked; + console.log(value); + material.backfaceCulling = value; // $('#set_freeze').prop("checked"); + } + }); + */ + } + + { // OPACITY + let sldOpacity = panel.find(`#sldOpacity`); + let lblOpacity = panel.find(`#lblOpacity`); + + sldOpacity.slider({ + value: material.opacity, + min: 0, + max: 1, + step: 0.001, + slide: function (event, ui) { + material.opacity = ui.value; + } + }); + + let update = (e) => { + lblOpacity.html(material.opacity.toFixed(2)); + sldOpacity.slider({value: material.opacity}); + }; + this.addVolatileListener(material, "opacity_changed", update); + + update(); + } + + { + + const attributes = pointcloud.pcoGeometry.pointAttributes.attributes; + + let options = []; + + options.push(...attributes.map(a => a.name)); + + const intensityIndex = options.indexOf("intensity"); + if(intensityIndex >= 0){ + options.splice(intensityIndex + 1, 0, "intensity gradient"); + } + + options.push( + "elevation", + "color", + 'matcap', + 'indices', + 'level of detail', + 'composite' + ); + + const blacklist = [ + "POSITION_CARTESIAN", + "position", + ]; + + options = options.filter(o => !blacklist.includes(o)); + + let attributeSelection = panel.find('#optMaterial'); + for(let option of options){ + let elOption = $(``); + attributeSelection.append(elOption); + } + + let updateMaterialPanel = (event, ui) => { + let selectedValue = attributeSelection.selectmenu().val(); + material.activeAttributeName = selectedValue; + + let attribute = pointcloud.getAttribute(selectedValue); + + if(selectedValue === "intensity gradient"){ + attribute = pointcloud.getAttribute("intensity"); + } + + const isIntensity = attribute ? ["intensity", "intensity gradient"].includes(attribute.name) : false; + + if(isIntensity){ + if(pointcloud.material.intensityRange[0] === Infinity){ + pointcloud.material.intensityRange = attribute.range; + } + + const [min, max] = attribute.range; + + panel.find('#sldIntensityRange').slider({ + range: true, + min: min, max: max, step: 0.01, + values: [min, max], + slide: (event, ui) => { + let min = ui.values[0]; + let max = ui.values[1]; + material.intensityRange = [min, max]; + } + }); + } else if(attribute){ + const [min, max] = attribute.range; + + let selectedRange = material.getRange(attribute.name); + + if(!selectedRange){ + selectedRange = [...attribute.range]; + } + + let minMaxAreNumbers = typeof min === "number" && typeof max === "number"; + + if(minMaxAreNumbers){ + panel.find('#sldExtraRange').slider({ + range: true, + min: min, + max: max, + step: 0.01, + values: selectedRange, + slide: (event, ui) => { + let [a, b] = ui.values; + + material.setRange(attribute.name, [a, b]); + } + }); + } + + } + + let blockWeights = $('#materials\\.composite_weight_container'); + let blockElevation = $('#materials\\.elevation_container'); + let blockRGB = $('#materials\\.rgb_container'); + let blockExtra = $('#materials\\.extra_container'); + let blockColor = $('#materials\\.color_container'); + let blockIntensity = $('#materials\\.intensity_container'); + let blockIndex = $('#materials\\.index_container'); + let blockTransition = $('#materials\\.transition_container'); + let blockGps = $('#materials\\.gpstime_container'); + let blockMatcap = $('#materials\\.matcap_container'); + + blockIndex.css('display', 'none'); + blockIntensity.css('display', 'none'); + blockElevation.css('display', 'none'); + blockRGB.css('display', 'none'); + blockExtra.css('display', 'none'); + blockColor.css('display', 'none'); + blockWeights.css('display', 'none'); + blockTransition.css('display', 'none'); + blockMatcap.css('display', 'none'); + blockGps.css('display', 'none'); + + if (selectedValue === 'composite') { + blockWeights.css('display', 'block'); + blockElevation.css('display', 'block'); + blockRGB.css('display', 'block'); + blockIntensity.css('display', 'block'); + } else if (selectedValue === 'elevation') { + blockElevation.css('display', 'block'); + } else if (selectedValue === 'RGB and Elevation') { + blockRGB.css('display', 'block'); + blockElevation.css('display', 'block'); + } else if (selectedValue === 'rgba') { + blockRGB.css('display', 'block'); + } else if (selectedValue === 'color') { + blockColor.css('display', 'block'); + } else if (selectedValue === 'intensity') { + blockIntensity.css('display', 'block'); + } else if (selectedValue === 'intensity gradient') { + blockIntensity.css('display', 'block'); + } else if (selectedValue === "indices" ){ + blockIndex.css('display', 'block'); + } else if (selectedValue === "matcap" ){ + blockMatcap.css('display', 'block'); + } else if (selectedValue === "classification" ){ + // add classification color selctor? + } else if (selectedValue === "gps-time" ){ + blockGps.css('display', 'block'); + } else if(selectedValue === "number of returns"){ + + } else if(selectedValue === "return number"){ + + } else if(["source id", "point source id"].includes(selectedValue)){ + + } else { + blockExtra.css('display', 'block'); + } + }; + + attributeSelection.selectmenu({change: updateMaterialPanel}); + + let update = () => { + attributeSelection.val(material.activeAttributeName).selectmenu('refresh'); + }; + this.addVolatileListener(material, "point_color_type_changed", update); + this.addVolatileListener(material, "active_attribute_changed", update); + + update(); + updateMaterialPanel(); + } + + { + const schemes = Object.keys(Potree.Gradients).map(name => ({name: name, values: Gradients[name]})); + + let elSchemeContainer = panel.find("#elevation_gradient_scheme_selection"); + + for(let scheme of schemes){ + let elScheme = $(` + + + `); + + const svg = Potree.Utils.createSvgGradient(scheme.values); + svg.setAttributeNS(null, "class", `button-icon`); + + elScheme.append($(svg)); + + elScheme.click( () => { + material.gradient = Gradients[scheme.name]; + }); + + elSchemeContainer.append(elScheme); + } + } + + { + let matcaps = [ + {name: "Normals", icon: `${Potree.resourcePath}/icons/matcap/check_normal+y.jpg`}, + {name: "Basic 1", icon: `${Potree.resourcePath}/icons/matcap/basic_1.jpg`}, + {name: "Basic 2", icon: `${Potree.resourcePath}/icons/matcap/basic_2.jpg`}, + {name: "Basic Dark", icon: `${Potree.resourcePath}/icons/matcap/basic_dark.jpg`}, + {name: "Basic Side", icon: `${Potree.resourcePath}/icons/matcap/basic_side.jpg`}, + {name: "Ceramic Dark", icon: `${Potree.resourcePath}/icons/matcap/ceramic_dark.jpg`}, + {name: "Ceramic Lightbulb", icon: `${Potree.resourcePath}/icons/matcap/ceramic_lightbulb.jpg`}, + {name: "Clay Brown", icon: `${Potree.resourcePath}/icons/matcap/clay_brown.jpg`}, + {name: "Clay Muddy", icon: `${Potree.resourcePath}/icons/matcap/clay_muddy.jpg`}, + {name: "Clay Studio", icon: `${Potree.resourcePath}/icons/matcap/clay_studio.jpg`}, + {name: "Resin", icon: `${Potree.resourcePath}/icons/matcap/resin.jpg`}, + {name: "Skin", icon: `${Potree.resourcePath}/icons/matcap/skin.jpg`}, + {name: "Jade", icon: `${Potree.resourcePath}/icons/matcap/jade.jpg`}, + {name: "Metal_ Anisotropic", icon: `${Potree.resourcePath}/icons/matcap/metal_anisotropic.jpg`}, + {name: "Metal Carpaint", icon: `${Potree.resourcePath}/icons/matcap/metal_carpaint.jpg`}, + {name: "Metal Lead", icon: `${Potree.resourcePath}/icons/matcap/metal_lead.jpg`}, + {name: "Metal Shiny", icon: `${Potree.resourcePath}/icons/matcap/metal_shiny.jpg`}, + {name: "Pearl", icon: `${Potree.resourcePath}/icons/matcap/pearl.jpg`}, + {name: "Toon", icon: `${Potree.resourcePath}/icons/matcap/toon.jpg`}, + {name: "Check Rim Light", icon: `${Potree.resourcePath}/icons/matcap/check_rim_light.jpg`}, + {name: "Check Rim Dark", icon: `${Potree.resourcePath}/icons/matcap/check_rim_dark.jpg`}, + {name: "Contours 1", icon: `${Potree.resourcePath}/icons/matcap/contours_1.jpg`}, + {name: "Contours 2", icon: `${Potree.resourcePath}/icons/matcap/contours_2.jpg`}, + {name: "Contours 3", icon: `${Potree.resourcePath}/icons/matcap/contours_3.jpg`}, + {name: "Reflection Check Horizontal", icon: `${Potree.resourcePath}/icons/matcap/reflection_check_horizontal.jpg`}, + {name: "Reflection Check Vertical", icon: `${Potree.resourcePath}/icons/matcap/reflection_check_vertical.jpg`}, + ]; + + let elMatcapContainer = panel.find("#matcap_scheme_selection"); + + for(let matcap of matcaps){ + let elMatcap = $(` + + `); + + elMatcap.click( () => { + material.matcap = matcap.icon.substring(matcap.icon.lastIndexOf('/')); + }); + + elMatcapContainer.append(elMatcap); + } + } + + { + panel.find('#sldRGBGamma').slider({ + value: material.rgbGamma, + min: 0, max: 4, step: 0.01, + slide: (event, ui) => {material.rgbGamma = ui.value;} + }); + + panel.find('#sldRGBContrast').slider({ + value: material.rgbContrast, + min: -1, max: 1, step: 0.01, + slide: (event, ui) => {material.rgbContrast = ui.value;} + }); + + panel.find('#sldRGBBrightness').slider({ + value: material.rgbBrightness, + min: -1, max: 1, step: 0.01, + slide: (event, ui) => {material.rgbBrightness = ui.value;} + }); + + panel.find('#sldExtraGamma').slider({ + value: material.extraGamma, + min: 0, max: 4, step: 0.01, + slide: (event, ui) => {material.extraGamma = ui.value;} + }); + + panel.find('#sldExtraBrightness').slider({ + value: material.extraBrightness, + min: -1, max: 1, step: 0.01, + slide: (event, ui) => {material.extraBrightness = ui.value;} + }); + + panel.find('#sldExtraContrast').slider({ + value: material.extraContrast, + min: -1, max: 1, step: 0.01, + slide: (event, ui) => {material.extraContrast = ui.value;} + }); + + panel.find('#sldHeightRange').slider({ + range: true, + min: 0, max: 1000, step: 0.01, + values: [0, 1000], + slide: (event, ui) => { + material.heightMin = ui.values[0]; + material.heightMax = ui.values[1]; + } + }); + + panel.find('#sldIntensityGamma').slider({ + value: material.intensityGamma, + min: 0, max: 4, step: 0.01, + slide: (event, ui) => {material.intensityGamma = ui.value;} + }); + + panel.find('#sldIntensityContrast').slider({ + value: material.intensityContrast, + min: -1, max: 1, step: 0.01, + slide: (event, ui) => {material.intensityContrast = ui.value;} + }); + + panel.find('#sldIntensityBrightness').slider({ + value: material.intensityBrightness, + min: -1, max: 1, step: 0.01, + slide: (event, ui) => {material.intensityBrightness = ui.value;} + }); + + panel.find('#sldWeightRGB').slider({ + value: material.weightRGB, + min: 0, max: 1, step: 0.01, + slide: (event, ui) => {material.weightRGB = ui.value;} + }); + + panel.find('#sldWeightIntensity').slider({ + value: material.weightIntensity, + min: 0, max: 1, step: 0.01, + slide: (event, ui) => {material.weightIntensity = ui.value;} + }); + + panel.find('#sldWeightElevation').slider({ + value: material.weightElevation, + min: 0, max: 1, step: 0.01, + slide: (event, ui) => {material.weightElevation = ui.value;} + }); + + panel.find('#sldWeightClassification').slider({ + value: material.weightClassification, + min: 0, max: 1, step: 0.01, + slide: (event, ui) => {material.weightClassification = ui.value;} + }); + + panel.find('#sldWeightReturnNumber').slider({ + value: material.weightReturnNumber, + min: 0, max: 1, step: 0.01, + slide: (event, ui) => {material.weightReturnNumber = ui.value;} + }); + + panel.find('#sldWeightSourceID').slider({ + value: material.weightSourceID, + min: 0, max: 1, step: 0.01, + slide: (event, ui) => {material.weightSourceID = ui.value;} + }); + + panel.find(`#materials\\.color\\.picker`).spectrum({ + flat: true, + showInput: true, + preferredFormat: 'rgb', + cancelText: '', + chooseText: 'Apply', + color: `#${material.color.getHexString()}`, + move: color => { + let cRGB = color.toRgb(); + let tc = new Color().setRGB(cRGB.r / 255, cRGB.g / 255, cRGB.b / 255); + material.color = tc; + }, + change: color => { + let cRGB = color.toRgb(); + let tc = new Color().setRGB(cRGB.r / 255, cRGB.g / 255, cRGB.b / 255); + material.color = tc; + } + }); + + this.addVolatileListener(material, "color_changed", () => { + panel.find(`#materials\\.color\\.picker`) + .spectrum('set', `#${material.color.getHexString()}`); + }); + + let updateHeightRange = function () { + + + let aPosition = pointcloud.getAttribute("position"); + + let bMin, bMax; + + if(aPosition){ + // for new format 2.0 and loader that contain precomputed min/max of attributes + let min = aPosition.range[0][2]; + let max = aPosition.range[1][2]; + let width = max - min; + + bMin = min - 0.2 * width; + bMax = max + 0.2 * width; + }else { + // for format up until exlusive 2.0 + let box = [pointcloud.pcoGeometry.tightBoundingBox, pointcloud.getBoundingBoxWorld()] + .find(v => v !== undefined); + + pointcloud.updateMatrixWorld(true); + box = Utils.computeTransformedBoundingBox(box, pointcloud.matrixWorld); + + let bWidth = box.max.z - box.min.z; + bMin = box.min.z - 0.2 * bWidth; + bMax = box.max.z + 0.2 * bWidth; + } + + let range = material.elevationRange; + + panel.find('#lblHeightRange').html(`${range[0].toFixed(2)} to ${range[1].toFixed(2)}`); + panel.find('#sldHeightRange').slider({min: bMin, max: bMax, values: range}); + }; + + let updateExtraRange = function () { + + let attributeName = material.activeAttributeName; + let attribute = pointcloud.getAttribute(attributeName); + + if(attribute == null){ + return; + } + + let range = material.getRange(attributeName); + + if(range == null){ + range = attribute.range; + } + + // currently only supporting scalar ranges. + // rgba, normals, positions, etc have vector ranges, however + let isValidRange = (typeof range[0] === "number") && (typeof range[1] === "number"); + if(!isValidRange){ + return; + } + + if(range){ + let msg = `${range[0].toFixed(2)} to ${range[1].toFixed(2)}`; + panel.find('#lblExtraRange').html(msg); + }else { + panel.find("could not deduce range"); + } + }; + + let updateIntensityRange = function () { + let range = material.intensityRange; + + panel.find('#lblIntensityRange').html(`${parseInt(range[0])} to ${parseInt(range[1])}`); + }; + + { + updateHeightRange(); + panel.find(`#sldHeightRange`).slider('option', 'min'); + panel.find(`#sldHeightRange`).slider('option', 'max'); + } + + { + let elGradientRepeat = panel.find("#gradient_repeat_option"); + elGradientRepeat.selectgroup({title: "Gradient"}); + + elGradientRepeat.find("input").click( (e) => { + this.viewer.setElevationGradientRepeat(ElevationGradientRepeat[e.target.value]); + }); + + let current = Object.keys(ElevationGradientRepeat) + .filter(key => ElevationGradientRepeat[key] === this.viewer.elevationGradientRepeat); + elGradientRepeat.find(`input[value=${current}]`).trigger("click"); + } + + let onIntensityChange = () => { + let gamma = material.intensityGamma; + let contrast = material.intensityContrast; + let brightness = material.intensityBrightness; + + updateIntensityRange(); + + panel.find('#lblIntensityGamma').html(gamma.toFixed(2)); + panel.find('#lblIntensityContrast').html(contrast.toFixed(2)); + panel.find('#lblIntensityBrightness').html(brightness.toFixed(2)); + + panel.find('#sldIntensityGamma').slider({value: gamma}); + panel.find('#sldIntensityContrast').slider({value: contrast}); + panel.find('#sldIntensityBrightness').slider({value: brightness}); + }; + + let onRGBChange = () => { + let gamma = material.rgbGamma; + let contrast = material.rgbContrast; + let brightness = material.rgbBrightness; + + panel.find('#lblRGBGamma').html(gamma.toFixed(2)); + panel.find('#lblRGBContrast').html(contrast.toFixed(2)); + panel.find('#lblRGBBrightness').html(brightness.toFixed(2)); + + panel.find('#sldRGBGamma').slider({value: gamma}); + panel.find('#sldRGBContrast').slider({value: contrast}); + panel.find('#sldRGBBrightness').slider({value: brightness}); + }; + + this.addVolatileListener(material, "material_property_changed", updateExtraRange); + this.addVolatileListener(material, "material_property_changed", updateHeightRange); + this.addVolatileListener(material, "material_property_changed", onIntensityChange); + this.addVolatileListener(material, "material_property_changed", onRGBChange); + + updateExtraRange(); + updateHeightRange(); + onIntensityChange(); + onRGBChange(); + } + + } + + + + setMeasurement(object){ + + let TYPE = { + DISTANCE: {panel: DistancePanel}, + AREA: {panel: AreaPanel}, + POINT: {panel: PointPanel}, + ANGLE: {panel: AnglePanel}, + HEIGHT: {panel: HeightPanel}, + PROFILE: {panel: ProfilePanel}, + VOLUME: {panel: VolumePanel}, + CIRCLE: {panel: CirclePanel}, + OTHER: {panel: PointPanel}, + }; + + let getType = (measurement) => { + if (measurement instanceof Measure) { + if (measurement.showDistances && !measurement.showArea && !measurement.showAngles) { + return TYPE.DISTANCE; + } else if (measurement.showDistances && measurement.showArea && !measurement.showAngles) { + return TYPE.AREA; + } else if (measurement.maxMarkers === 1) { + return TYPE.POINT; + } else if (!measurement.showDistances && !measurement.showArea && measurement.showAngles) { + return TYPE.ANGLE; + } else if (measurement.showHeight) { + return TYPE.HEIGHT; + } else if (measurement.showCircle) { + return TYPE.CIRCLE; + } else { + return TYPE.OTHER; + } + } else if (measurement instanceof Profile) { + return TYPE.PROFILE; + } else if (measurement instanceof Volume) { + return TYPE.VOLUME; + } + }; + + //this.container.html("measurement"); + + let type = getType(object); + let Panel = type.panel; + + let panel = new Panel(this.viewer, object, this); + this.container.append(panel.elContent); + } + + setCamera(camera){ + let panel = new CameraPanel(this.viewer, this); + this.container.append(panel.elContent); + } + + setAnnotation(annotation){ + let panel = new AnnotationPanel(this.viewer, this, annotation); + this.container.append(panel.elContent); + } + + setCameraAnimation(animation){ + let panel = new CameraAnimationPanel(this.viewer, this, animation); + this.container.append(panel.elContent); + } + + } + + function addCommas(nStr){ + nStr += ''; + let x = nStr.split('.'); + let x1 = x[0]; + let x2 = x.length > 1 ? '.' + x[1] : ''; + let rgx = /(\d+)(\d{3})/; + while (rgx.test(x1)) { + x1 = x1.replace(rgx, '$1' + ',' + '$2'); + } + return x1 + x2; + }; + + function format(value){ + return addCommas(value.toFixed(3)); + }; + + class HierarchicalSlider{ + + constructor(params = {}){ + + this.element = document.createElement("div"); + + this.labels = []; + this.sliders = []; + this.range = params.range != null ? params.range : [0, 1]; + this.slide = params.slide != null ? params.slide : null; + this.step = params.step != null ? params.step : 0.0001; + + let levels = params.levels != null ? params.levels : 1; + + for(let level = 0; level < levels; level++){ + this.addLevel(); + } + + } + + setRange(range){ + this.range = [...range]; + + { // root slider + let slider = this.sliders[0]; + + $(slider).slider({ + min: range[0], + max: range[1], + }); + } + + for(let i = 1; i < this.sliders.length; i++){ + let parentSlider = this.sliders[i - 1]; + let slider = this.sliders[i]; + + let parentValues = $(parentSlider).slider("option", "values"); + let childRange = [...parentValues]; + + $(slider).slider({ + min: childRange[0], + max: childRange[1], + }); + } + + this.updateLabels(); + } + + setValues(values){ + for(let slider of this.sliders){ + $(slider).slider({ + values: [...values], + }); + } + + this.updateLabels(); + } + + addLevel(){ + const elLevel = document.createElement("li"); + const elRange = document.createTextNode("Range: "); + const label = document.createElement("span"); + const slider = document.createElement("div"); + + let level = this.sliders.length; + let [min, max] = [0, 0]; + + if(this.sliders.length === 0){ + [min, max] = this.range; + }else { + let parentSlider = this.sliders[this.sliders.length - 1]; + [min, max] = $(parentSlider).slider("option", "values"); + } + + $(slider).slider({ + range: true, + min: min, + max: max, + step: this.step, + values: [min, max], + slide: (event, ui) => { + + // set all descendants to same range + let levels = this.sliders.length; + for(let i = level + 1; i < levels; i++){ + let descendant = this.sliders[i]; + + $(descendant).slider({ + range: true, + min: ui.values[0], + max: ui.values[1], + values: [...ui.values], + }); + } + + if(this.slide){ + let values = [...ui.values]; + + this.slide({ + target: this, + range: this.range, + values: values, + }); + } + + this.updateLabels(); + }, + }); + + elLevel.append(elRange, label, slider); + + this.sliders.push(slider); + this.labels.push(label); + this.element.append(elLevel); + + this.updateLabels(); + } + + removeLevel(){ + + } + + updateSliders(){ + + } + + updateLabels(){ + + let levels = this.sliders.length; + + for(let i = 0; i < levels; i++){ + + let slider = this.sliders[i]; + let label = this.labels[i]; + + let [min, max] = $(slider).slider("option", "values"); + let strMin = format(min); + let strMax = format(max); + let strLabel = `${strMin} to ${strMax}`; + + label.innerHTML = strLabel; + } + + } + + + } + + class OrientedImageControls extends EventDispatcher{ + + constructor(viewer){ + super(); + + this.viewer = viewer; + this.renderer = viewer.renderer; + + this.originalCam = viewer.scene.getActiveCamera(); + this.shearCam = viewer.scene.getActiveCamera().clone(); + this.shearCam.rotation.set(this.originalCam.rotation.toArray()); + this.shearCam.updateProjectionMatrix(); + this.shearCam.updateProjectionMatrix = () => { + return this.shearCam.projectionMatrix; + }; + + this.image = null; + + this.fadeFactor = 20; + this.fovDelta = 0; + + this.fovMin = 0.1; + this.fovMax = 120; + + this.shear = [0, 0]; + + // const style = ``; + this.elUp = $(``); + this.elRight = $(``); + this.elDown = $(``); + this.elLeft = $(``); + this.elExit = $(``); + + this.elExit.click( () => { + this.release(); + }); + + this.elUp.click(() => { + const fovY = viewer.getFOV(); + const top = Math.tan(MathUtils.degToRad(fovY / 2)); + this.shear[1] += 0.1 * top; + }); + + this.elRight.click(() => { + const fovY = viewer.getFOV(); + const top = Math.tan(MathUtils.degToRad(fovY / 2)); + this.shear[0] += 0.1 * top; + }); + + this.elDown.click(() => { + const fovY = viewer.getFOV(); + const top = Math.tan(MathUtils.degToRad(fovY / 2)); + this.shear[1] -= 0.1 * top; + }); + + this.elLeft.click(() => { + const fovY = viewer.getFOV(); + const top = Math.tan(MathUtils.degToRad(fovY / 2)); + this.shear[0] -= 0.1 * top; + }); + + this.scene = null; + this.sceneControls = new Scene(); + + let scroll = (e) => { + this.fovDelta += -e.delta * 1.0; + }; + + this.addEventListener('mousewheel', scroll); + //this.addEventListener("mousemove", onMove); + } + + hasSomethingCaptured(){ + return this.image !== null; + } + + capture(image){ + if(this.hasSomethingCaptured()){ + return; + } + + this.image = image; + + this.originalFOV = this.viewer.getFOV(); + this.originalControls = this.viewer.getControls(); + + this.viewer.setControls(this); + this.viewer.scene.overrideCamera = this.shearCam; + + const elCanvas = this.viewer.renderer.domElement; + const elRoot = $(elCanvas.parentElement); + + this.shear = [0, 0]; + + + elRoot.append(this.elUp); + elRoot.append(this.elRight); + elRoot.append(this.elDown); + elRoot.append(this.elLeft); + elRoot.append(this.elExit); + } + + release(){ + this.image = null; + + this.viewer.scene.overrideCamera = null; + + this.elUp.detach(); + this.elRight.detach(); + this.elDown.detach(); + this.elLeft.detach(); + this.elExit.detach(); + + this.viewer.setFOV(this.originalFOV); + this.viewer.setControls(this.originalControls); + } + + setScene (scene) { + this.scene = scene; + } + + update (delta) { + // const view = this.scene.view; + + // let prevTotal = this.shearCam.projectionMatrix.elements.reduce( (a, i) => a + i, 0); + + //const progression = Math.min(1, this.fadeFactor * delta); + //const attenuation = Math.max(0, 1 - this.fadeFactor * delta); + const progression = 1; + const attenuation = 0; + + const oldFov = this.viewer.getFOV(); + let fovProgression = progression * this.fovDelta; + let newFov = oldFov * ((1 + fovProgression / 10)); + + newFov = Math.max(this.fovMin, newFov); + newFov = Math.min(this.fovMax, newFov); + + let diff = newFov / oldFov; + + const mouse = this.viewer.inputHandler.mouse; + const canvasSize = this.viewer.renderer.getSize(new Vector2()); + const uv = [ + (mouse.x / canvasSize.x), + ((canvasSize.y - mouse.y) / canvasSize.y) + ]; + + const fovY = newFov; + const aspect = canvasSize.x / canvasSize.y; + const top = Math.tan(MathUtils.degToRad(fovY / 2)); + const height = 2 * top; + const width = aspect * height; + + const shearRangeX = [ + this.shear[0] - 0.5 * width, + this.shear[0] + 0.5 * width, + ]; + + const shearRangeY = [ + this.shear[1] - 0.5 * height, + this.shear[1] + 0.5 * height, + ]; + + const shx = (1 - uv[0]) * shearRangeX[0] + uv[0] * shearRangeX[1]; + const shy = (1 - uv[1]) * shearRangeY[0] + uv[1] * shearRangeY[1]; + + const shu = (1 - diff); + + const newShear = [ + (1 - shu) * this.shear[0] + shu * shx, + (1 - shu) * this.shear[1] + shu * shy, + ]; + + this.shear = newShear; + this.viewer.setFOV(newFov); + + const {originalCam, shearCam} = this; + + originalCam.fov = newFov; + originalCam.updateMatrixWorld(); + originalCam.updateProjectionMatrix(); + shearCam.copy(originalCam); + shearCam.rotation.set(...originalCam.rotation.toArray()); + + shearCam.updateMatrixWorld(); + shearCam.projectionMatrix.copy(originalCam.projectionMatrix); + + const [sx, sy] = this.shear; + const mShear = new Matrix4().set( + 1, 0, sx, 0, + 0, 1, sy, 0, + 0, 0, 1, 0, + 0, 0, 0, 1, + ); + + const proj = shearCam.projectionMatrix; + proj.multiply(mShear); + shearCam.projectionMatrixInverse.copy(proj).invert(); + + let total = shearCam.projectionMatrix.elements.reduce( (a, i) => a + i, 0); + + this.fovDelta *= attenuation; + } + }; + + // https://support.pix4d.com/hc/en-us/articles/205675256-How-are-yaw-pitch-roll-defined + // https://support.pix4d.com/hc/en-us/articles/202558969-How-are-omega-phi-kappa-defined + + function createMaterial(){ + + let vertexShader = ` + uniform float uNear; + varying vec2 vUV; + varying vec4 vDebug; + + void main(){ + vDebug = vec4(0.0, 1.0, 0.0, 1.0); + vec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0); + // make sure that this mesh is at least in front of the near plane + modelViewPosition.xyz += normalize(modelViewPosition.xyz) * uNear; + gl_Position = projectionMatrix * modelViewPosition; + vUV = uv; + } + `; + + let fragmentShader = ` + uniform sampler2D tColor; + uniform float uOpacity; + varying vec2 vUV; + varying vec4 vDebug; + void main(){ + vec4 color = texture2D(tColor, vUV); + gl_FragColor = color; + gl_FragColor.a = uOpacity; + } + `; + const material = new ShaderMaterial( { + uniforms: { + // time: { value: 1.0 }, + // resolution: { value: new THREE.Vector2() } + tColor: {value: new Texture() }, + uNear: {value: 0.0}, + uOpacity: {value: 1.0}, + }, + vertexShader: vertexShader, + fragmentShader: fragmentShader, + side: DoubleSide, + } ); + + material.side = DoubleSide; + + return material; + } + + const planeGeometry = new PlaneGeometry(1, 1); + const lineGeometry = new Geometry(); + + lineGeometry.vertices.push( + new Vector3(-0.5, -0.5, 0), + new Vector3( 0.5, -0.5, 0), + new Vector3( 0.5, 0.5, 0), + new Vector3(-0.5, 0.5, 0), + new Vector3(-0.5, -0.5, 0), + ); + + class OrientedImage{ + + constructor(id){ + + this.id = id; + this.fov = 1.0; + this.position = new Vector3(); + this.rotation = new Vector3(); + this.width = 0; + this.height = 0; + this.fov = 1.0; + + const material = createMaterial(); + const lineMaterial = new LineBasicMaterial( { color: 0x00ff00 } ); + this.mesh = new Mesh(planeGeometry, material); + this.line = new Line(lineGeometry, lineMaterial); + this.texture = null; + + this.mesh.orientedImage = this; + } + + set(position, rotation, dimension, fov){ + + let radians = rotation.map(MathUtils.degToRad); + + this.position.set(...position); + this.mesh.position.set(...position); + + this.rotation.set(...radians); + this.mesh.rotation.set(...radians); + + [this.width, this.height] = dimension; + this.mesh.scale.set(this.width / this.height, 1, 1); + + this.fov = fov; + + this.updateTransform(); + } + + updateTransform(){ + let {mesh, line, fov} = this; + + mesh.updateMatrixWorld(); + const dir = mesh.getWorldDirection(); + const alpha = MathUtils.degToRad(fov / 2); + const d = -0.5 / Math.tan(alpha); + const move = dir.clone().multiplyScalar(d); + mesh.position.add(move); + + line.position.copy(mesh.position); + line.scale.copy(mesh.scale); + line.rotation.copy(mesh.rotation); + } + + }; + + class OrientedImages extends EventDispatcher{ + + constructor(){ + super(); + + this.node = null; + this.cameraParams = null; + this.imageParams = null; + this.images = null; + this._visible = true; + } + + set visible(visible){ + if(this._visible === visible){ + return; + } + + for(const image of this.images){ + image.mesh.visible = visible; + image.line.visible = visible; + } + + this._visible = visible; + this.dispatchEvent({ + type: "visibility_changed", + images: this, + }); + } + + get visible(){ + return this._visible; + } + + + }; + + class OrientedImageLoader{ + + static async loadCameraParams(path){ + const res = await fetch(path); + const text = await res.text(); + + const parser = new DOMParser(); + const doc = parser.parseFromString(text, "application/xml"); + + const width = parseInt(doc.getElementsByTagName("width")[0].textContent); + const height = parseInt(doc.getElementsByTagName("height")[0].textContent); + const f = parseFloat(doc.getElementsByTagName("f")[0].textContent); + + let a = (height / 2) / f; + let fov = 2 * MathUtils.radToDeg(Math.atan(a)); + + const params = { + path: path, + width: width, + height: height, + f: f, + fov: fov, + }; + + return params; + } + + static async loadImageParams(path){ + + const response = await fetch(path); + if(!response.ok){ + console.error(`failed to load ${path}`); + return; + } + + const content = await response.text(); + const lines = content.split(/\r?\n/); + const imageParams = []; + + for(let i = 1; i < lines.length; i++){ + const line = lines[i]; + + if(line.startsWith("#")){ + continue; + } + + const tokens = line.split(/\s+/); + + if(tokens.length < 6){ + continue; + } + + const params = { + id: tokens[0], + x: Number.parseFloat(tokens[1]), + y: Number.parseFloat(tokens[2]), + z: Number.parseFloat(tokens[3]), + omega: Number.parseFloat(tokens[4]), + phi: Number.parseFloat(tokens[5]), + kappa: Number.parseFloat(tokens[6]), + }; + + // const whitelist = ["47518.jpg"]; + // if(whitelist.includes(params.id)){ + // imageParams.push(params); + // } + imageParams.push(params); + } + + // debug + //return [imageParams[50]]; + + return imageParams; + } + + static async load(cameraParamsPath, imageParamsPath, viewer){ + + const tStart = performance.now(); + + const [cameraParams, imageParams] = await Promise.all([ + OrientedImageLoader.loadCameraParams(cameraParamsPath), + OrientedImageLoader.loadImageParams(imageParamsPath), + ]); + + const orientedImageControls = new OrientedImageControls(viewer); + const raycaster = new Raycaster(); + + const tEnd = performance.now(); + console.log(tEnd - tStart); + + // const sp = new THREE.PlaneGeometry(1, 1); + // const lg = new THREE.Geometry(); + + // lg.vertices.push( + // new THREE.Vector3(-0.5, -0.5, 0), + // new THREE.Vector3( 0.5, -0.5, 0), + // new THREE.Vector3( 0.5, 0.5, 0), + // new THREE.Vector3(-0.5, 0.5, 0), + // new THREE.Vector3(-0.5, -0.5, 0), + // ); + + const {width, height} = cameraParams; + const orientedImages = []; + const sceneNode = new Object3D(); + sceneNode.name = "oriented_images"; + + for(const params of imageParams){ + + // const material = createMaterial(); + // const lm = new THREE.LineBasicMaterial( { color: 0x00ff00 } ); + // const mesh = new THREE.Mesh(sp, material); + + const {x, y, z, omega, phi, kappa} = params; + // const [rx, ry, rz] = [omega, phi, kappa] + // .map(THREE.Math.degToRad); + + // mesh.position.set(x, y, z); + // mesh.scale.set(width / height, 1, 1); + // mesh.rotation.set(rx, ry, rz); + // { + // mesh.updateMatrixWorld(); + // const dir = mesh.getWorldDirection(); + // const alpha = THREE.Math.degToRad(cameraParams.fov / 2); + // const d = -0.5 / Math.tan(alpha); + // const move = dir.clone().multiplyScalar(d); + // mesh.position.add(move); + // } + // sceneNode.add(mesh); + + // const line = new THREE.Line(lg, lm); + // line.position.copy(mesh.position); + // line.scale.copy(mesh.scale); + // line.rotation.copy(mesh.rotation); + // sceneNode.add(line); + + let orientedImage = new OrientedImage(params.id); + // orientedImage.setPosition(x, y, z); + // orientedImage.setRotation(omega, phi, kappa); + // orientedImage.setDimension(width, height); + let position = [x, y, z]; + let rotation = [omega, phi, kappa]; + let dimension = [width, height]; + orientedImage.set(position, rotation, dimension, cameraParams.fov); + + sceneNode.add(orientedImage.mesh); + sceneNode.add(orientedImage.line); + + orientedImages.push(orientedImage); + } + + let hoveredElement = null; + let clipVolume = null; + + const onMouseMove = (evt) => { + const tStart = performance.now(); + if(hoveredElement){ + hoveredElement.line.material.color.setRGB(0, 1, 0); + } + evt.preventDefault(); + + //var array = getMousePosition( container, evt.clientX, evt.clientY ); + const rect = viewer.renderer.domElement.getBoundingClientRect(); + const [x, y] = [evt.clientX, evt.clientY]; + const array = [ + ( x - rect.left ) / rect.width, + ( y - rect.top ) / rect.height + ]; + const onClickPosition = new Vector2(...array); + //const intersects = getIntersects(onClickPosition, scene.children); + const camera = viewer.scene.getActiveCamera(); + const mouse = new Vector3( + + ( onClickPosition.x * 2 ) - 1, + - ( onClickPosition.y * 2 ) + 1 ); + const objects = orientedImages.map(i => i.mesh); + raycaster.setFromCamera( mouse, camera ); + const intersects = raycaster.intersectObjects( objects ); + let selectionChanged = false; + + if ( intersects.length > 0){ + //console.log(intersects); + const intersection = intersects[0]; + const orientedImage = intersection.object.orientedImage; + orientedImage.line.material.color.setRGB(1, 0, 0); + selectionChanged = hoveredElement !== orientedImage; + hoveredElement = orientedImage; + }else { + hoveredElement = null; + } + + let shouldRemoveClipVolume = clipVolume !== null && hoveredElement === null; + let shouldAddClipVolume = clipVolume === null && hoveredElement !== null; + + if(clipVolume !== null && (hoveredElement === null || selectionChanged)){ + // remove existing + viewer.scene.removePolygonClipVolume(clipVolume); + clipVolume = null; + } + + if(shouldAddClipVolume || selectionChanged){ + const img = hoveredElement; + const fov = cameraParams.fov; + const aspect = cameraParams.width / cameraParams.height; + const near = 1.0; + const far = 1000 * 1000; + const camera = new PerspectiveCamera(fov, aspect, near, far); + camera.rotation.order = viewer.scene.getActiveCamera().rotation.order; + camera.rotation.copy(img.mesh.rotation); + { + const mesh = img.mesh; + const dir = mesh.getWorldDirection(); + const pos = mesh.position; + const alpha = MathUtils.degToRad(fov / 2); + const d = 0.5 / Math.tan(alpha); + const newCamPos = pos.clone().add(dir.clone().multiplyScalar(d)); + const newCamDir = pos.clone().sub(newCamPos); + const newCamTarget = new Vector3().addVectors( + newCamPos, + newCamDir.clone().multiplyScalar(viewer.getMoveSpeed())); + camera.position.copy(newCamPos); + } + let volume = new Potree.PolygonClipVolume(camera); + let m0 = new Mesh(); + let m1 = new Mesh(); + let m2 = new Mesh(); + let m3 = new Mesh(); + m0.position.set(-1, -1, 0); + m1.position.set( 1, -1, 0); + m2.position.set( 1, 1, 0); + m3.position.set(-1, 1, 0); + volume.markers.push(m0, m1, m2, m3); + volume.initialized = true; + + viewer.scene.addPolygonClipVolume(volume); + clipVolume = volume; + } + const tEnd = performance.now(); + //console.log(tEnd - tStart); + }; + + const moveToImage = (image) => { + console.log("move to image " + image.id); + + const mesh = image.mesh; + const newCamPos = image.position.clone(); + const newCamTarget = mesh.position.clone(); + + viewer.scene.view.setView(newCamPos, newCamTarget, 500, () => { + orientedImageControls.capture(image); + }); + + if(image.texture === null){ + + const target = image; + + const tmpImagePath = `${Potree.resourcePath}/images/loading.jpg`; + new TextureLoader().load(tmpImagePath, + (texture) => { + if(target.texture === null){ + target.texture = texture; + target.mesh.material.uniforms.tColor.value = texture; + mesh.material.needsUpdate = true; + } + } + ); + + const imagePath = `${imageParamsPath}/../${target.id}`; + new TextureLoader().load(imagePath, + (texture) => { + target.texture = texture; + target.mesh.material.uniforms.tColor.value = texture; + mesh.material.needsUpdate = true; + } + ); + + + } + }; + + const onMouseClick = (evt) => { + + if(orientedImageControls.hasSomethingCaptured()){ + return; + } + + if(hoveredElement){ + moveToImage(hoveredElement); + } + }; + viewer.renderer.domElement.addEventListener( 'mousemove', onMouseMove, false ); + viewer.renderer.domElement.addEventListener( 'mousedown', onMouseClick, false ); + + viewer.addEventListener("update", () => { + + for(const image of orientedImages){ + const world = image.mesh.matrixWorld; + const {width, height} = image; + const aspect = width / height; + + const camera = viewer.scene.getActiveCamera(); + + const imgPos = image.mesh.getWorldPosition(new Vector3()); + const camPos = camera.position; + const d = camPos.distanceTo(imgPos); + + const minSize = 1; // in degrees of fov + const a = MathUtils.degToRad(minSize); + let r = d * Math.tan(a); + r = Math.max(r, 1); + + + image.mesh.scale.set(r * aspect, r, 1); + image.line.scale.set(r * aspect, r, 1); + + image.mesh.material.uniforms.uNear.value = camera.near; + + } + + }); + + const images = new OrientedImages(); + images.node = sceneNode; + images.cameraParamsPath = cameraParamsPath; + images.imageParamsPath = imageParamsPath; + images.cameraParams = cameraParams; + images.imageParams = imageParams; + images.images = orientedImages; + + Potree.debug.moveToImage = moveToImage; + + return images; + } + } + + let sg = new SphereGeometry(1, 8, 8); + let sgHigh = new SphereGeometry(1, 128, 128); + + let sm = new MeshBasicMaterial({side: BackSide}); + let smHovered = new MeshBasicMaterial({side: BackSide, color: 0xff0000}); + + let raycaster = new Raycaster(); + let currentlyHovered = null; + + let previousView = { + controls: null, + position: null, + target: null, + }; + + class Image360{ + + constructor(file, time, longitude, latitude, altitude, course, pitch, roll){ + this.file = file; + this.time = time; + this.longitude = longitude; + this.latitude = latitude; + this.altitude = altitude; + this.course = course; + this.pitch = pitch; + this.roll = roll; + this.mesh = null; + } + }; + + class Images360 extends EventDispatcher{ + + constructor(viewer){ + super(); + + this.viewer = viewer; + + this.selectingEnabled = true; + + this.images = []; + this.node = new Object3D(); + + this.sphere = new Mesh(sgHigh, sm); + this.sphere.visible = false; + this.sphere.scale.set(1000, 1000, 1000); + this.node.add(this.sphere); + this._visible = true; + // this.node.add(label); + + this.focusedImage = null; + + let elUnfocus = document.createElement("input"); + elUnfocus.type = "button"; + elUnfocus.value = "unfocus"; + elUnfocus.style.position = "absolute"; + elUnfocus.style.right = "10px"; + elUnfocus.style.bottom = "10px"; + elUnfocus.style.zIndex = "10000"; + elUnfocus.style.fontSize = "2em"; + elUnfocus.addEventListener("click", () => this.unfocus()); + this.elUnfocus = elUnfocus; + + this.domRoot = viewer.renderer.domElement.parentElement; + this.domRoot.appendChild(elUnfocus); + this.elUnfocus.style.display = "none"; + + viewer.addEventListener("update", () => { this.update(viewer); }); viewer.inputHandler.addInputListener(this); @@ -25045,16 +77430,16 @@ ENDSEC { // orientation let {course, pitch, roll} = image360; this.sphere.rotation.set( - THREE.Math.degToRad(+roll + 90), - THREE.Math.degToRad(-pitch), - THREE.Math.degToRad(-course + 90), + MathUtils.degToRad(+roll + 90), + MathUtils.degToRad(-pitch), + MathUtils.degToRad(-course + 90), "ZYX" ); } this.sphere.position.set(...image360.position); - let target = new THREE.Vector3(...image360.position); + let target = new Vector3(...image360.position); let dir = target.clone().sub(viewer.scene.view.position).normalize(); let move = dir.multiplyScalar(0.000001); let newCamPos = target.clone().sub(move); @@ -25112,8 +77497,8 @@ ENDSEC load(image360){ return new Promise(resolve => { - let texture = new THREE.TextureLoader().load(image360.file, resolve); - texture.wrapS = THREE.RepeatWrapping; + let texture = new TextureLoader().load(image360.file, resolve); + texture.wrapS = RepeatWrapping; texture.repeat.x = -1; image360.texture = texture; @@ -25224,7 +77609,7 @@ ENDSEC let {longitude, latitude, altitude} = image360; let xy = transform.forward([longitude, latitude]); - let mesh = new THREE.Mesh(sg, sm); + let mesh = new Mesh(sg, sm); mesh.position.set(...xy, altitude); mesh.scale.set(1, 1, 1); mesh.material.transparent = true; @@ -25234,9 +77619,9 @@ ENDSEC { // orientation var {course, pitch, roll} = image360; mesh.rotation.set( - THREE.Math.degToRad(+roll + 90), - THREE.Math.degToRad(-pitch), - THREE.Math.degToRad(-course + 90), + MathUtils.degToRad(+roll + 90), + MathUtils.degToRad(-pitch), + MathUtils.degToRad(-course + 90), "ZYX" ); } @@ -25251,4806 +77636,10183 @@ ENDSEC }; - // This is a generated file. Do not edit. - var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/; - var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/; - var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/; + // This is a generated file. Do not edit. + var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/; + var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/; + var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/; + + var unicode = { + Space_Separator: Space_Separator, + ID_Start: ID_Start, + ID_Continue: ID_Continue + }; + + var util = { + isSpaceSeparator (c) { + return typeof c === 'string' && unicode.Space_Separator.test(c) + }, + + isIdStartChar (c) { + return typeof c === 'string' && ( + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + (c === '$') || (c === '_') || + unicode.ID_Start.test(c) + ) + }, + + isIdContinueChar (c) { + return typeof c === 'string' && ( + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || + (c === '$') || (c === '_') || + (c === '\u200C') || (c === '\u200D') || + unicode.ID_Continue.test(c) + ) + }, + + isDigit (c) { + return typeof c === 'string' && /[0-9]/.test(c) + }, + + isHexDigit (c) { + return typeof c === 'string' && /[0-9A-Fa-f]/.test(c) + }, + }; + + let source; + let parseState; + let stack; + let pos; + let line; + let column; + let token; + let key; + let root; + + var parse = function parse (text, reviver) { + source = String(text); + parseState = 'start'; + stack = []; + pos = 0; + line = 1; + column = 0; + token = undefined; + key = undefined; + root = undefined; + + do { + token = lex(); + + // This code is unreachable. + // if (!parseStates[parseState]) { + // throw invalidParseState() + // } + + parseStates[parseState](); + } while (token.type !== 'eof') + + if (typeof reviver === 'function') { + return internalize({'': root}, '', reviver) + } + + return root + }; + + function internalize (holder, name, reviver) { + const value = holder[name]; + if (value != null && typeof value === 'object') { + for (const key in value) { + const replacement = internalize(value, key, reviver); + if (replacement === undefined) { + delete value[key]; + } else { + value[key] = replacement; + } + } + } + + return reviver.call(holder, name, value) + } + + let lexState; + let buffer; + let doubleQuote; + let sign$1; + let c; + + function lex () { + lexState = 'default'; + buffer = ''; + doubleQuote = false; + sign$1 = 1; + + for (;;) { + c = peek(); + + // This code is unreachable. + // if (!lexStates[lexState]) { + // throw invalidLexState(lexState) + // } + + const token = lexStates[lexState](); + if (token) { + return token + } + } + } + + function peek () { + if (source[pos]) { + return String.fromCodePoint(source.codePointAt(pos)) + } + } + + function read () { + const c = peek(); + + if (c === '\n') { + line++; + column = 0; + } else if (c) { + column += c.length; + } else { + column++; + } + + if (c) { + pos += c.length; + } + + return c + } + + const lexStates = { + default () { + switch (c) { + case '\t': + case '\v': + case '\f': + case ' ': + case '\u00A0': + case '\uFEFF': + case '\n': + case '\r': + case '\u2028': + case '\u2029': + read(); + return + + case '/': + read(); + lexState = 'comment'; + return + + case undefined: + read(); + return newToken('eof') + } + + if (util.isSpaceSeparator(c)) { + read(); + return + } + + // This code is unreachable. + // if (!lexStates[parseState]) { + // throw invalidLexState(parseState) + // } + + return lexStates[parseState]() + }, + + comment () { + switch (c) { + case '*': + read(); + lexState = 'multiLineComment'; + return + + case '/': + read(); + lexState = 'singleLineComment'; + return + } + + throw invalidChar(read()) + }, + + multiLineComment () { + switch (c) { + case '*': + read(); + lexState = 'multiLineCommentAsterisk'; + return + + case undefined: + throw invalidChar(read()) + } + + read(); + }, + + multiLineCommentAsterisk () { + switch (c) { + case '*': + read(); + return + + case '/': + read(); + lexState = 'default'; + return + + case undefined: + throw invalidChar(read()) + } + + read(); + lexState = 'multiLineComment'; + }, + + singleLineComment () { + switch (c) { + case '\n': + case '\r': + case '\u2028': + case '\u2029': + read(); + lexState = 'default'; + return + + case undefined: + read(); + return newToken('eof') + } + + read(); + }, + + value () { + switch (c) { + case '{': + case '[': + return newToken('punctuator', read()) + + case 'n': + read(); + literal('ull'); + return newToken('null', null) + + case 't': + read(); + literal('rue'); + return newToken('boolean', true) + + case 'f': + read(); + literal('alse'); + return newToken('boolean', false) + + case '-': + case '+': + if (read() === '-') { + sign$1 = -1; + } + + lexState = 'sign'; + return + + case '.': + buffer = read(); + lexState = 'decimalPointLeading'; + return + + case '0': + buffer = read(); + lexState = 'zero'; + return + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + buffer = read(); + lexState = 'decimalInteger'; + return + + case 'I': + read(); + literal('nfinity'); + return newToken('numeric', Infinity) + + case 'N': + read(); + literal('aN'); + return newToken('numeric', NaN) + + case '"': + case "'": + doubleQuote = (read() === '"'); + buffer = ''; + lexState = 'string'; + return + } + + throw invalidChar(read()) + }, + + identifierNameStartEscape () { + if (c !== 'u') { + throw invalidChar(read()) + } + + read(); + const u = unicodeEscape(); + switch (u) { + case '$': + case '_': + break + + default: + if (!util.isIdStartChar(u)) { + throw invalidIdentifier() + } + + break + } + + buffer += u; + lexState = 'identifierName'; + }, + + identifierName () { + switch (c) { + case '$': + case '_': + case '\u200C': + case '\u200D': + buffer += read(); + return + + case '\\': + read(); + lexState = 'identifierNameEscape'; + return + } + + if (util.isIdContinueChar(c)) { + buffer += read(); + return + } + + return newToken('identifier', buffer) + }, + + identifierNameEscape () { + if (c !== 'u') { + throw invalidChar(read()) + } + + read(); + const u = unicodeEscape(); + switch (u) { + case '$': + case '_': + case '\u200C': + case '\u200D': + break + + default: + if (!util.isIdContinueChar(u)) { + throw invalidIdentifier() + } + + break + } + + buffer += u; + lexState = 'identifierName'; + }, + + sign () { + switch (c) { + case '.': + buffer = read(); + lexState = 'decimalPointLeading'; + return + + case '0': + buffer = read(); + lexState = 'zero'; + return + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + buffer = read(); + lexState = 'decimalInteger'; + return + + case 'I': + read(); + literal('nfinity'); + return newToken('numeric', sign$1 * Infinity) + + case 'N': + read(); + literal('aN'); + return newToken('numeric', NaN) + } + + throw invalidChar(read()) + }, + + zero () { + switch (c) { + case '.': + buffer += read(); + lexState = 'decimalPoint'; + return + + case 'e': + case 'E': + buffer += read(); + lexState = 'decimalExponent'; + return + + case 'x': + case 'X': + buffer += read(); + lexState = 'hexadecimal'; + return + } + + return newToken('numeric', sign$1 * 0) + }, + + decimalInteger () { + switch (c) { + case '.': + buffer += read(); + lexState = 'decimalPoint'; + return + + case 'e': + case 'E': + buffer += read(); + lexState = 'decimalExponent'; + return + } + + if (util.isDigit(c)) { + buffer += read(); + return + } + + return newToken('numeric', sign$1 * Number(buffer)) + }, + + decimalPointLeading () { + if (util.isDigit(c)) { + buffer += read(); + lexState = 'decimalFraction'; + return + } + + throw invalidChar(read()) + }, + + decimalPoint () { + switch (c) { + case 'e': + case 'E': + buffer += read(); + lexState = 'decimalExponent'; + return + } + + if (util.isDigit(c)) { + buffer += read(); + lexState = 'decimalFraction'; + return + } + + return newToken('numeric', sign$1 * Number(buffer)) + }, + + decimalFraction () { + switch (c) { + case 'e': + case 'E': + buffer += read(); + lexState = 'decimalExponent'; + return + } + + if (util.isDigit(c)) { + buffer += read(); + return + } + + return newToken('numeric', sign$1 * Number(buffer)) + }, + + decimalExponent () { + switch (c) { + case '+': + case '-': + buffer += read(); + lexState = 'decimalExponentSign'; + return + } + + if (util.isDigit(c)) { + buffer += read(); + lexState = 'decimalExponentInteger'; + return + } + + throw invalidChar(read()) + }, + + decimalExponentSign () { + if (util.isDigit(c)) { + buffer += read(); + lexState = 'decimalExponentInteger'; + return + } + + throw invalidChar(read()) + }, + + decimalExponentInteger () { + if (util.isDigit(c)) { + buffer += read(); + return + } + + return newToken('numeric', sign$1 * Number(buffer)) + }, + + hexadecimal () { + if (util.isHexDigit(c)) { + buffer += read(); + lexState = 'hexadecimalInteger'; + return + } + + throw invalidChar(read()) + }, + + hexadecimalInteger () { + if (util.isHexDigit(c)) { + buffer += read(); + return + } + + return newToken('numeric', sign$1 * Number(buffer)) + }, + + string () { + switch (c) { + case '\\': + read(); + buffer += escape$1(); + return + + case '"': + if (doubleQuote) { + read(); + return newToken('string', buffer) + } + + buffer += read(); + return + + case "'": + if (!doubleQuote) { + read(); + return newToken('string', buffer) + } + + buffer += read(); + return + + case '\n': + case '\r': + throw invalidChar(read()) + + case '\u2028': + case '\u2029': + separatorChar(c); + break + + case undefined: + throw invalidChar(read()) + } + + buffer += read(); + }, + + start () { + switch (c) { + case '{': + case '[': + return newToken('punctuator', read()) + + // This code is unreachable since the default lexState handles eof. + // case undefined: + // return newToken('eof') + } + + lexState = 'value'; + }, + + beforePropertyName () { + switch (c) { + case '$': + case '_': + buffer = read(); + lexState = 'identifierName'; + return + + case '\\': + read(); + lexState = 'identifierNameStartEscape'; + return + + case '}': + return newToken('punctuator', read()) + + case '"': + case "'": + doubleQuote = (read() === '"'); + lexState = 'string'; + return + } + + if (util.isIdStartChar(c)) { + buffer += read(); + lexState = 'identifierName'; + return + } + + throw invalidChar(read()) + }, + + afterPropertyName () { + if (c === ':') { + return newToken('punctuator', read()) + } + + throw invalidChar(read()) + }, + + beforePropertyValue () { + lexState = 'value'; + }, + + afterPropertyValue () { + switch (c) { + case ',': + case '}': + return newToken('punctuator', read()) + } + + throw invalidChar(read()) + }, + + beforeArrayValue () { + if (c === ']') { + return newToken('punctuator', read()) + } + + lexState = 'value'; + }, + + afterArrayValue () { + switch (c) { + case ',': + case ']': + return newToken('punctuator', read()) + } + + throw invalidChar(read()) + }, + + end () { + // This code is unreachable since it's handled by the default lexState. + // if (c === undefined) { + // read() + // return newToken('eof') + // } + + throw invalidChar(read()) + }, + }; + + function newToken (type, value) { + return { + type, + value, + line, + column, + } + } + + function literal (s) { + for (const c of s) { + const p = peek(); + + if (p !== c) { + throw invalidChar(read()) + } + + read(); + } + } + + function escape$1 () { + const c = peek(); + switch (c) { + case 'b': + read(); + return '\b' + + case 'f': + read(); + return '\f' + + case 'n': + read(); + return '\n' + + case 'r': + read(); + return '\r' + + case 't': + read(); + return '\t' + + case 'v': + read(); + return '\v' + + case '0': + read(); + if (util.isDigit(peek())) { + throw invalidChar(read()) + } + + return '\0' + + case 'x': + read(); + return hexEscape() + + case 'u': + read(); + return unicodeEscape() + + case '\n': + case '\u2028': + case '\u2029': + read(); + return '' + + case '\r': + read(); + if (peek() === '\n') { + read(); + } + + return '' + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + throw invalidChar(read()) + + case undefined: + throw invalidChar(read()) + } + + return read() + } + + function hexEscape () { + let buffer = ''; + let c = peek(); + + if (!util.isHexDigit(c)) { + throw invalidChar(read()) + } + + buffer += read(); + + c = peek(); + if (!util.isHexDigit(c)) { + throw invalidChar(read()) + } + + buffer += read(); + + return String.fromCodePoint(parseInt(buffer, 16)) + } + + function unicodeEscape () { + let buffer = ''; + let count = 4; + + while (count-- > 0) { + const c = peek(); + if (!util.isHexDigit(c)) { + throw invalidChar(read()) + } + + buffer += read(); + } + + return String.fromCodePoint(parseInt(buffer, 16)) + } + + const parseStates = { + start () { + if (token.type === 'eof') { + throw invalidEOF() + } + + push(); + }, + + beforePropertyName () { + switch (token.type) { + case 'identifier': + case 'string': + key = token.value; + parseState = 'afterPropertyName'; + return + + case 'punctuator': + // This code is unreachable since it's handled by the lexState. + // if (token.value !== '}') { + // throw invalidToken() + // } + + pop(); + return + + case 'eof': + throw invalidEOF() + } + + // This code is unreachable since it's handled by the lexState. + // throw invalidToken() + }, + + afterPropertyName () { + // This code is unreachable since it's handled by the lexState. + // if (token.type !== 'punctuator' || token.value !== ':') { + // throw invalidToken() + // } + + if (token.type === 'eof') { + throw invalidEOF() + } + + parseState = 'beforePropertyValue'; + }, + + beforePropertyValue () { + if (token.type === 'eof') { + throw invalidEOF() + } + + push(); + }, + + beforeArrayValue () { + if (token.type === 'eof') { + throw invalidEOF() + } + + if (token.type === 'punctuator' && token.value === ']') { + pop(); + return + } + + push(); + }, + + afterPropertyValue () { + // This code is unreachable since it's handled by the lexState. + // if (token.type !== 'punctuator') { + // throw invalidToken() + // } + + if (token.type === 'eof') { + throw invalidEOF() + } + + switch (token.value) { + case ',': + parseState = 'beforePropertyName'; + return + + case '}': + pop(); + } + + // This code is unreachable since it's handled by the lexState. + // throw invalidToken() + }, + + afterArrayValue () { + // This code is unreachable since it's handled by the lexState. + // if (token.type !== 'punctuator') { + // throw invalidToken() + // } + + if (token.type === 'eof') { + throw invalidEOF() + } + + switch (token.value) { + case ',': + parseState = 'beforeArrayValue'; + return + + case ']': + pop(); + } + + // This code is unreachable since it's handled by the lexState. + // throw invalidToken() + }, + + end () { + // This code is unreachable since it's handled by the lexState. + // if (token.type !== 'eof') { + // throw invalidToken() + // } + }, + }; + + function push () { + let value; + + switch (token.type) { + case 'punctuator': + switch (token.value) { + case '{': + value = {}; + break + + case '[': + value = []; + break + } + + break + + case 'null': + case 'boolean': + case 'numeric': + case 'string': + value = token.value; + break + + // This code is unreachable. + // default: + // throw invalidToken() + } + + if (root === undefined) { + root = value; + } else { + const parent = stack[stack.length - 1]; + if (Array.isArray(parent)) { + parent.push(value); + } else { + parent[key] = value; + } + } + + if (value !== null && typeof value === 'object') { + stack.push(value); + + if (Array.isArray(value)) { + parseState = 'beforeArrayValue'; + } else { + parseState = 'beforePropertyName'; + } + } else { + const current = stack[stack.length - 1]; + if (current == null) { + parseState = 'end'; + } else if (Array.isArray(current)) { + parseState = 'afterArrayValue'; + } else { + parseState = 'afterPropertyValue'; + } + } + } + + function pop () { + stack.pop(); + + const current = stack[stack.length - 1]; + if (current == null) { + parseState = 'end'; + } else if (Array.isArray(current)) { + parseState = 'afterArrayValue'; + } else { + parseState = 'afterPropertyValue'; + } + } + + // This code is unreachable. + // function invalidParseState () { + // return new Error(`JSON5: invalid parse state '${parseState}'`) + // } + + // This code is unreachable. + // function invalidLexState (state) { + // return new Error(`JSON5: invalid lex state '${state}'`) + // } + + function invalidChar (c) { + if (c === undefined) { + return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) + } + + return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`) + } + + function invalidEOF () { + return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) + } + + // This code is unreachable. + // function invalidToken () { + // if (token.type === 'eof') { + // return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) + // } + + // const c = String.fromCodePoint(token.value.codePointAt(0)) + // return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`) + // } + + function invalidIdentifier () { + column -= 5; + return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`) + } + + function separatorChar (c) { + console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`); + } + + function formatChar (c) { + const replacements = { + "'": "\\'", + '"': '\\"', + '\\': '\\\\', + '\b': '\\b', + '\f': '\\f', + '\n': '\\n', + '\r': '\\r', + '\t': '\\t', + '\v': '\\v', + '\0': '\\0', + '\u2028': '\\u2028', + '\u2029': '\\u2029', + }; + + if (replacements[c]) { + return replacements[c] + } + + if (c < ' ') { + const hexString = c.charCodeAt(0).toString(16); + return '\\x' + ('00' + hexString).substring(hexString.length) + } + + return c + } + + function syntaxError (message) { + const err = new SyntaxError(message); + err.lineNumber = line; + err.columnNumber = column; + return err + } + + var stringify = function stringify (value, replacer, space) { + const stack = []; + let indent = ''; + let propertyList; + let replacerFunc; + let gap = ''; + let quote; + + if ( + replacer != null && + typeof replacer === 'object' && + !Array.isArray(replacer) + ) { + space = replacer.space; + quote = replacer.quote; + replacer = replacer.replacer; + } + + if (typeof replacer === 'function') { + replacerFunc = replacer; + } else if (Array.isArray(replacer)) { + propertyList = []; + for (const v of replacer) { + let item; + + if (typeof v === 'string') { + item = v; + } else if ( + typeof v === 'number' || + v instanceof String || + v instanceof Number + ) { + item = String(v); + } + + if (item !== undefined && propertyList.indexOf(item) < 0) { + propertyList.push(item); + } + } + } + + if (space instanceof Number) { + space = Number(space); + } else if (space instanceof String) { + space = String(space); + } + + if (typeof space === 'number') { + if (space > 0) { + space = Math.min(10, Math.floor(space)); + gap = ' '.substr(0, space); + } + } else if (typeof space === 'string') { + gap = space.substr(0, 10); + } + + return serializeProperty('', {'': value}) + + function serializeProperty (key, holder) { + let value = holder[key]; + if (value != null) { + if (typeof value.toJSON5 === 'function') { + value = value.toJSON5(key); + } else if (typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + } + + if (replacerFunc) { + value = replacerFunc.call(holder, key, value); + } + + if (value instanceof Number) { + value = Number(value); + } else if (value instanceof String) { + value = String(value); + } else if (value instanceof Boolean) { + value = value.valueOf(); + } + + switch (value) { + case null: return 'null' + case true: return 'true' + case false: return 'false' + } + + if (typeof value === 'string') { + return quoteString(value, false) + } + + if (typeof value === 'number') { + return String(value) + } + + if (typeof value === 'object') { + return Array.isArray(value) ? serializeArray(value) : serializeObject(value) + } + + return undefined + } + + function quoteString (value) { + const quotes = { + "'": 0.1, + '"': 0.2, + }; + + const replacements = { + "'": "\\'", + '"': '\\"', + '\\': '\\\\', + '\b': '\\b', + '\f': '\\f', + '\n': '\\n', + '\r': '\\r', + '\t': '\\t', + '\v': '\\v', + '\0': '\\0', + '\u2028': '\\u2028', + '\u2029': '\\u2029', + }; + + let product = ''; + + for (let i = 0; i < value.length; i++) { + const c = value[i]; + switch (c) { + case "'": + case '"': + quotes[c]++; + product += c; + continue + + case '\0': + if (util.isDigit(value[i + 1])) { + product += '\\x00'; + continue + } + } + + if (replacements[c]) { + product += replacements[c]; + continue + } + + if (c < ' ') { + let hexString = c.charCodeAt(0).toString(16); + product += '\\x' + ('00' + hexString).substring(hexString.length); + continue + } + + product += c; + } + + const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b); + + product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]); + + return quoteChar + product + quoteChar + } + + function serializeObject (value) { + if (stack.indexOf(value) >= 0) { + throw TypeError('Converting circular structure to JSON5') + } + + stack.push(value); + + let stepback = indent; + indent = indent + gap; + + let keys = propertyList || Object.keys(value); + let partial = []; + for (const key of keys) { + const propertyString = serializeProperty(key, value); + if (propertyString !== undefined) { + let member = serializeKey(key) + ':'; + if (gap !== '') { + member += ' '; + } + member += propertyString; + partial.push(member); + } + } + + let final; + if (partial.length === 0) { + final = '{}'; + } else { + let properties; + if (gap === '') { + properties = partial.join(','); + final = '{' + properties + '}'; + } else { + let separator = ',\n' + indent; + properties = partial.join(separator); + final = '{\n' + indent + properties + ',\n' + stepback + '}'; + } + } + + stack.pop(); + indent = stepback; + return final + } + + function serializeKey (key) { + if (key.length === 0) { + return quoteString(key, true) + } + + const firstChar = String.fromCodePoint(key.codePointAt(0)); + if (!util.isIdStartChar(firstChar)) { + return quoteString(key, true) + } + + for (let i = firstChar.length; i < key.length; i++) { + if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) { + return quoteString(key, true) + } + } + + return key + } + + function serializeArray (value) { + if (stack.indexOf(value) >= 0) { + throw TypeError('Converting circular structure to JSON5') + } + + stack.push(value); + + let stepback = indent; + indent = indent + gap; + + let partial = []; + for (let i = 0; i < value.length; i++) { + const propertyString = serializeProperty(String(i), value); + partial.push((propertyString !== undefined) ? propertyString : 'null'); + } + + let final; + if (partial.length === 0) { + final = '[]'; + } else { + if (gap === '') { + let properties = partial.join(','); + final = '[' + properties + ']'; + } else { + let separator = ',\n' + indent; + let properties = partial.join(separator); + final = '[\n' + indent + properties + ',\n' + stepback + ']'; + } + } + + stack.pop(); + indent = stepback; + return final + } + }; + + const JSON5 = { + parse, + stringify, + }; + + var lib = JSON5; + + class Sidebar{ + + constructor(viewer){ + this.viewer = viewer; + + this.measuringTool = viewer.measuringTool; + this.profileTool = viewer.profileTool; + this.volumeTool = viewer.volumeTool; + + this.dom = $("#sidebar_root"); + } + + createToolIcon(icon, title, callback){ + let element = $(` + + `); + + element.click(callback); + + return element; + } + + init(){ + + this.initAccordion(); + this.initAppearance(); + this.initToolbar(); + this.initScene(); + this.initNavigation(); + this.initFilters(); + this.initClippingTool(); + this.initSettings(); + + $('#potree_version_number').html(Potree.version.major + "." + Potree.version.minor + Potree.version.suffix); + } + + + + initToolbar(){ + + // ANGLE + let elToolbar = $('#tools'); + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/angle.png', + '[title]tt.angle_measurement', + () => { + $('#menu_measurements').next().slideDown(); + let measurement = this.measuringTool.startInsertion({ + showDistances: false, + showAngles: true, + showArea: false, + closed: true, + maxMarkers: 3, + name: 'Angle'}); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // POINT + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/point.svg', + '[title]tt.point_measurement', + () => { + $('#menu_measurements').next().slideDown(); + let measurement = this.measuringTool.startInsertion({ + showDistances: false, + showAngles: false, + showCoordinates: true, + showArea: false, + closed: true, + maxMarkers: 1, + name: 'Point'}); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // DISTANCE + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/distance.svg', + '[title]tt.distance_measurement', + () => { + $('#menu_measurements').next().slideDown(); + let measurement = this.measuringTool.startInsertion({ + showDistances: true, + showArea: false, + closed: false, + name: 'Distance'}); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // HEIGHT + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/height.svg', + '[title]tt.height_measurement', + () => { + $('#menu_measurements').next().slideDown(); + let measurement = this.measuringTool.startInsertion({ + showDistances: false, + showHeight: true, + showArea: false, + closed: false, + maxMarkers: 2, + name: 'Height'}); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // CIRCLE + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/circle.svg', + '[title]tt.circle_measurement', + () => { + $('#menu_measurements').next().slideDown(); + let measurement = this.measuringTool.startInsertion({ + showDistances: false, + showHeight: false, + showArea: false, + showCircle: true, + showEdges: false, + closed: false, + maxMarkers: 3, + name: 'Circle'}); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // AZIMUTH + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/azimuth.svg', + 'Azimuth', + () => { + $('#menu_measurements').next().slideDown(); + let measurement = this.measuringTool.startInsertion({ + showDistances: false, + showHeight: false, + showArea: false, + showCircle: false, + showEdges: false, + showAzimuth: true, + closed: false, + maxMarkers: 2, + name: 'Azimuth'}); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // AREA + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/area.svg', + '[title]tt.area_measurement', + () => { + $('#menu_measurements').next().slideDown(); + let measurement = this.measuringTool.startInsertion({ + showDistances: true, + showArea: true, + closed: true, + name: 'Area'}); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // VOLUME + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/volume.svg', + '[title]tt.volume_measurement', + () => { + let volume = this.volumeTool.startInsertion(); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === volume.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // SPHERE VOLUME + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/sphere_distances.svg', + '[title]tt.volume_measurement', + () => { + let volume = this.volumeTool.startInsertion({type: SphereVolume}); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === volume.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // PROFILE + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/profile.svg', + '[title]tt.height_profile', + () => { + $('#menu_measurements').next().slideDown(); ; + let profile = this.profileTool.startInsertion(); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === profile.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // ANNOTATION + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/annotation.svg', + '[title]tt.annotation', + () => { + $('#menu_measurements').next().slideDown(); ; + let annotation = this.viewer.annotationTool.startInsertion(); + + let annotationsRoot = $("#jstree_scene").jstree().get_json("annotations"); + let jsonNode = annotationsRoot.children.find(child => child.data.uuid === annotation.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // REMOVE ALL + elToolbar.append(this.createToolIcon( + Potree.resourcePath + '/icons/reset_tools.svg', + '[title]tt.remove_all_measurement', + () => { + this.viewer.scene.removeAllMeasurements(); + } + )); + + + { // SHOW / HIDE Measurements + let elShow = $("#measurement_options_show"); + elShow.selectgroup({title: "Show/Hide labels"}); + + elShow.find("input").click( (e) => { + const show = e.target.value === "SHOW"; + this.measuringTool.showLabels = show; + }); + + let currentShow = this.measuringTool.showLabels ? "SHOW" : "HIDE"; + elShow.find(`input[value=${currentShow}]`).trigger("click"); + } + } + + initScene(){ + + let elScene = $("#menu_scene"); + let elObjects = elScene.next().find("#scene_objects"); + let elProperties = elScene.next().find("#scene_object_properties"); + + + { + let elExport = elScene.next().find("#scene_export"); + + let geoJSONIcon = `${Potree.resourcePath}/icons/file_geojson.svg`; + let dxfIcon = `${Potree.resourcePath}/icons/file_dxf.svg`; + let potreeIcon = `${Potree.resourcePath}/icons/file_potree.svg`; + + elExport.append(` + Export:
    + + + + `); + + let elDownloadJSON = elExport.find("img[name=geojson_export_button]").parent(); + elDownloadJSON.click( (event) => { + let scene = this.viewer.scene; + let measurements = [...scene.measurements, ...scene.profiles, ...scene.volumes]; + + if(measurements.length > 0){ + let geoJson = GeoJSONExporter.toString(measurements); + + let url = window.URL.createObjectURL(new Blob([geoJson], {type: 'data:application/octet-stream'})); + elDownloadJSON.attr('href', url); + }else { + this.viewer.postError("no measurements to export"); + event.preventDefault(); + } + }); + + let elDownloadDXF = elExport.find("img[name=dxf_export_button]").parent(); + elDownloadDXF.click( (event) => { + let scene = this.viewer.scene; + let measurements = [...scene.measurements, ...scene.profiles, ...scene.volumes]; + + if(measurements.length > 0){ + let dxf = DXFExporter.toString(measurements); + + let url = window.URL.createObjectURL(new Blob([dxf], {type: 'data:application/octet-stream'})); + elDownloadDXF.attr('href', url); + }else { + this.viewer.postError("no measurements to export"); + event.preventDefault(); + } + }); + + let elDownloadPotree = elExport.find("img[name=potree_export_button]").parent(); + elDownloadPotree.click( (event) => { + + let data = Potree.saveProject(this.viewer); + let dataString = lib.stringify(data, null, "\t"); + + let url = window.URL.createObjectURL(new Blob([dataString], {type: 'data:application/octet-stream'})); + elDownloadPotree.attr('href', url); + }); + } + + let propertiesPanel = new PropertiesPanel(elProperties, this.viewer); + propertiesPanel.setScene(this.viewer.scene); + + localStorage.removeItem('jstree'); + + let tree = $(`
    `); + elObjects.append(tree); + + tree.jstree({ + 'plugins': ["checkbox", "state"], + 'core': { + "dblclick_toggle": false, + "state": { + "checked" : true + }, + 'check_callback': true, + "expand_selected_onload": true + }, + "checkbox" : { + "keep_selected_style": true, + "three_state": false, + "whole_node": false, + "tie_selection": false, + }, + }); + + let createNode = (parent, text, icon, object) => { + let nodeID = tree.jstree('create_node', parent, { + "text": text, + "icon": icon, + "data": object + }, + "last", false, false); + + if(object.visible){ + tree.jstree('check_node', nodeID); + }else { + tree.jstree('uncheck_node', nodeID); + } + + return nodeID; + }; + + let pcID = tree.jstree('create_node', "#", { "text": "Point Clouds", "id": "pointclouds"}, "last", false, false); + let measurementID = tree.jstree('create_node', "#", { "text": "Measurements", "id": "measurements" }, "last", false, false); + let annotationsID = tree.jstree('create_node', "#", { "text": "Annotations", "id": "annotations" }, "last", false, false); + let otherID = tree.jstree('create_node', "#", { "text": "Other", "id": "other" }, "last", false, false); + let vectorsID = tree.jstree('create_node', "#", { "text": "Vectors", "id": "vectors" }, "last", false, false); + let imagesID = tree.jstree('create_node', "#", { "text": " Images", "id": "images" }, "last", false, false); + + tree.jstree("check_node", pcID); + tree.jstree("check_node", measurementID); + tree.jstree("check_node", annotationsID); + tree.jstree("check_node", otherID); + tree.jstree("check_node", vectorsID); + tree.jstree("check_node", imagesID); + + tree.on('create_node.jstree', (e, data) => { + tree.jstree("open_all"); + }); + + tree.on("select_node.jstree", (e, data) => { + let object = data.node.data; + propertiesPanel.set(object); + + this.viewer.inputHandler.deselectAll(); + + if(object instanceof Volume){ + this.viewer.inputHandler.toggleSelection(object); + } + + $(this.viewer.renderer.domElement).focus(); + }); + + tree.on("deselect_node.jstree", (e, data) => { + propertiesPanel.set(null); + }); + + tree.on("delete_node.jstree", (e, data) => { + propertiesPanel.set(null); + }); + + tree.on('dblclick','.jstree-anchor', (e) => { + + let instance = $.jstree.reference(e.target); + let node = instance.get_node(e.target); + let object = node.data; + + // ignore double click on checkbox + if(e.target.classList.contains("jstree-checkbox")){ + return; + } + + if(object instanceof PointCloudTree){ + let box = this.viewer.getBoundingBox([object]); + let node = new Object3D(); + node.boundingBox = box; + this.viewer.zoomTo(node, 1, 500); + }else if(object instanceof Measure){ + let points = object.points.map(p => p.position); + let box = new Box3().setFromPoints(points); + if(box.getSize(new Vector3()).length() > 0){ + let node = new Object3D(); + node.boundingBox = box; + this.viewer.zoomTo(node, 2, 500); + } + }else if(object instanceof Profile){ + let points = object.points; + let box = new Box3().setFromPoints(points); + if(box.getSize(new Vector3()).length() > 0){ + let node = new Object3D(); + node.boundingBox = box; + this.viewer.zoomTo(node, 1, 500); + } + }else if(object instanceof Volume){ + + let box = object.boundingBox.clone().applyMatrix4(object.matrixWorld); + + if(box.getSize(new Vector3()).length() > 0){ + let node = new Object3D(); + node.boundingBox = box; + this.viewer.zoomTo(node, 1, 500); + } + }else if(object instanceof Annotation){ + object.moveHere(this.viewer.scene.getActiveCamera()); + }else if(object instanceof PolygonClipVolume){ + let dir = object.camera.getWorldDirection(new Vector3()); + let target; + + if(object.camera instanceof OrthographicCamera){ + dir.multiplyScalar(object.camera.right); + target = new Vector3().addVectors(object.camera.position, dir); + this.viewer.setCameraMode(CameraMode.ORTHOGRAPHIC); + }else if(object.camera instanceof PerspectiveCamera){ + dir.multiplyScalar(this.viewer.scene.view.radius); + target = new Vector3().addVectors(object.camera.position, dir); + this.viewer.setCameraMode(CameraMode.PERSPECTIVE); + } + + this.viewer.scene.view.position.copy(object.camera.position); + this.viewer.scene.view.lookAt(target); + }else if(object.type === "SpotLight"){ + let distance = (object.distance > 0) ? object.distance / 4 : 5 * 1000; + let position = object.position; + let target = new Vector3().addVectors( + position, + object.getWorldDirection(new Vector3()).multiplyScalar(distance)); + + this.viewer.scene.view.position.copy(object.position); + this.viewer.scene.view.lookAt(target); + }else if(object instanceof Object3D){ + let box = new Box3().setFromObject(object); + + if(box.getSize(new Vector3()).length() > 0){ + let node = new Object3D(); + node.boundingBox = box; + this.viewer.zoomTo(node, 1, 500); + } + }else if(object instanceof OrientedImage){ + // TODO zoom to images + + // let box = new THREE.Box3().setFromObject(object); + + // if(box.getSize(new THREE.Vector3()).length() > 0){ + // let node = new THREE.Object3D(); + // node.boundingBox = box; + // this.viewer.zoomTo(node, 1, 500); + // } + }else if(object instanceof Images360){ + // TODO + }else if(object instanceof Geopackage){ + // TODO + } + }); + + tree.on("uncheck_node.jstree", (e, data) => { + let object = data.node.data; + + if(object){ + object.visible = false; + } + }); + + tree.on("check_node.jstree", (e, data) => { + let object = data.node.data; + + if(object){ + object.visible = true; + } + }); + + + let onPointCloudAdded = (e) => { + let pointcloud = e.pointcloud; + let cloudIcon = `${Potree.resourcePath}/icons/cloud.svg`; + let node = createNode(pcID, pointcloud.name, cloudIcon, pointcloud); + + pointcloud.addEventListener("visibility_changed", () => { + if(pointcloud.visible){ + tree.jstree('check_node', node); + }else { + tree.jstree('uncheck_node', node); + } + }); + }; + + let onMeasurementAdded = (e) => { + let measurement = e.measurement; + let icon = Utils.getMeasurementIcon(measurement); + createNode(measurementID, measurement.name, icon, measurement); + }; + + let onVolumeAdded = (e) => { + let volume = e.volume; + let icon = Utils.getMeasurementIcon(volume); + let node = createNode(measurementID, volume.name, icon, volume); + + volume.addEventListener("visibility_changed", () => { + if(volume.visible){ + tree.jstree('check_node', node); + }else { + tree.jstree('uncheck_node', node); + } + }); + }; + + let onProfileAdded = (e) => { + let profile = e.profile; + let icon = Utils.getMeasurementIcon(profile); + createNode(measurementID, profile.name, icon, profile); + }; + + let onAnnotationAdded = (e) => { + let annotation = e.annotation; + + let annotationIcon = `${Potree.resourcePath}/icons/annotation.svg`; + let parentID = this.annotationMapping.get(annotation.parent); + let annotationID = createNode(parentID, annotation.title, annotationIcon, annotation); + this.annotationMapping.set(annotation, annotationID); + + annotation.addEventListener("annotation_changed", (e) => { + let annotationsRoot = $("#jstree_scene").jstree().get_json("annotations"); + let jsonNode = annotationsRoot.children.find(child => child.data.uuid === annotation.uuid); + + $.jstree.reference(jsonNode.id).rename_node(jsonNode.id, annotation.title); + }); + }; + + let onCameraAnimationAdded = (e) => { + const animation = e.animation; + + const animationIcon = `${Potree.resourcePath}/icons/camera_animation.svg`; + createNode(otherID, "animation", animationIcon, animation); + }; + + let onOrientedImagesAdded = (e) => { + const images = e.images; + + const imagesIcon = `${Potree.resourcePath}/icons/picture.svg`; + const node = createNode(imagesID, "images", imagesIcon, images); + + images.addEventListener("visibility_changed", () => { + if(images.visible){ + tree.jstree('check_node', node); + }else { + tree.jstree('uncheck_node', node); + } + }); + }; + + let onImages360Added = (e) => { + const images = e.images; + + const imagesIcon = `${Potree.resourcePath}/icons/picture.svg`; + const node = createNode(imagesID, "360° images", imagesIcon, images); + + images.addEventListener("visibility_changed", () => { + if(images.visible){ + tree.jstree('check_node', node); + }else { + tree.jstree('uncheck_node', node); + } + }); + }; + + const onGeopackageAdded = (e) => { + const geopackage = e.geopackage; + + const geopackageIcon = `${Potree.resourcePath}/icons/triangle.svg`; + const tree = $(`#jstree_scene`); + const parentNode = "vectors"; + + for(const layer of geopackage.node.children){ + const name = layer.name; + + let shpPointsID = tree.jstree('create_node', parentNode, { + "text": name, + "icon": geopackageIcon, + "object": layer, + "data": layer, + }, + "last", false, false); + tree.jstree(layer.visible ? "check_node" : "uncheck_node", shpPointsID); + } + + }; + + this.viewer.scene.addEventListener("pointcloud_added", onPointCloudAdded); + this.viewer.scene.addEventListener("measurement_added", onMeasurementAdded); + this.viewer.scene.addEventListener("profile_added", onProfileAdded); + this.viewer.scene.addEventListener("volume_added", onVolumeAdded); + this.viewer.scene.addEventListener("camera_animation_added", onCameraAnimationAdded); + this.viewer.scene.addEventListener("oriented_images_added", onOrientedImagesAdded); + this.viewer.scene.addEventListener("360_images_added", onImages360Added); + this.viewer.scene.addEventListener("geopackage_added", onGeopackageAdded); + this.viewer.scene.addEventListener("polygon_clip_volume_added", onVolumeAdded); + this.viewer.scene.annotations.addEventListener("annotation_added", onAnnotationAdded); + + let onMeasurementRemoved = (e) => { + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.measurement.uuid); + + tree.jstree("delete_node", jsonNode.id); + }; + + let onVolumeRemoved = (e) => { + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.volume.uuid); + + tree.jstree("delete_node", jsonNode.id); + }; + + let onPolygonClipVolumeRemoved = (e) => { + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.volume.uuid); + + tree.jstree("delete_node", jsonNode.id); + }; + + let onProfileRemoved = (e) => { + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.profile.uuid); + + tree.jstree("delete_node", jsonNode.id); + }; + + this.viewer.scene.addEventListener("measurement_removed", onMeasurementRemoved); + this.viewer.scene.addEventListener("volume_removed", onVolumeRemoved); + this.viewer.scene.addEventListener("polygon_clip_volume_removed", onPolygonClipVolumeRemoved); + this.viewer.scene.addEventListener("profile_removed", onProfileRemoved); + + { + let annotationIcon = `${Potree.resourcePath}/icons/annotation.svg`; + this.annotationMapping = new Map(); + this.annotationMapping.set(this.viewer.scene.annotations, annotationsID); + this.viewer.scene.annotations.traverseDescendants(annotation => { + let parentID = this.annotationMapping.get(annotation.parent); + let annotationID = createNode(parentID, annotation.title, annotationIcon, annotation); + this.annotationMapping.set(annotation, annotationID); + }); + } + + const scene = this.viewer.scene; + for(let pointcloud of scene.pointclouds){ + onPointCloudAdded({pointcloud: pointcloud}); + } + + for(let measurement of scene.measurements){ + onMeasurementAdded({measurement: measurement}); + } + + for(let volume of [...scene.volumes, ...scene.polygonClipVolumes]){ + onVolumeAdded({volume: volume}); + } + + for(let animation of scene.cameraAnimations){ + onCameraAnimationAdded({animation: animation}); + } + + for(let images of scene.orientedImages){ + onOrientedImagesAdded({images: images}); + } + + for(let images of scene.images360){ + onImages360Added({images: images}); + } + + for(const geopackage of scene.geopackages){ + onGeopackageAdded({geopackage: geopackage}); + } + + for(let profile of scene.profiles){ + onProfileAdded({profile: profile}); + } + + { + createNode(otherID, "Camera", null, new Camera()); + } + + this.viewer.addEventListener("scene_changed", (e) => { + propertiesPanel.setScene(e.scene); + + e.oldScene.removeEventListener("pointcloud_added", onPointCloudAdded); + e.oldScene.removeEventListener("measurement_added", onMeasurementAdded); + e.oldScene.removeEventListener("profile_added", onProfileAdded); + e.oldScene.removeEventListener("volume_added", onVolumeAdded); + e.oldScene.removeEventListener("polygon_clip_volume_added", onVolumeAdded); + e.oldScene.removeEventListener("measurement_removed", onMeasurementRemoved); + + e.scene.addEventListener("pointcloud_added", onPointCloudAdded); + e.scene.addEventListener("measurement_added", onMeasurementAdded); + e.scene.addEventListener("profile_added", onProfileAdded); + e.scene.addEventListener("volume_added", onVolumeAdded); + e.scene.addEventListener("polygon_clip_volume_added", onVolumeAdded); + e.scene.addEventListener("measurement_removed", onMeasurementRemoved); + }); + + } + + initClippingTool(){ + + + this.viewer.addEventListener("cliptask_changed", (event) => { + console.log("TODO"); + }); + + this.viewer.addEventListener("clipmethod_changed", (event) => { + console.log("TODO"); + }); + + { + let elClipTask = $("#cliptask_options"); + elClipTask.selectgroup({title: "Clip Task"}); + + elClipTask.find("input").click( (e) => { + this.viewer.setClipTask(ClipTask[e.target.value]); + }); + + let currentClipTask = Object.keys(ClipTask) + .filter(key => ClipTask[key] === this.viewer.clipTask); + elClipTask.find(`input[value=${currentClipTask}]`).trigger("click"); + } + + { + let elClipMethod = $("#clipmethod_options"); + elClipMethod.selectgroup({title: "Clip Method"}); + + elClipMethod.find("input").click( (e) => { + this.viewer.setClipMethod(ClipMethod[e.target.value]); + }); + + let currentClipMethod = Object.keys(ClipMethod) + .filter(key => ClipMethod[key] === this.viewer.clipMethod); + elClipMethod.find(`input[value=${currentClipMethod}]`).trigger("click"); + } + + let clippingToolBar = $("#clipping_tools"); + + // CLIP VOLUME + clippingToolBar.append(this.createToolIcon( + Potree.resourcePath + '/icons/clip_volume.svg', + '[title]tt.clip_volume', + () => { + let item = this.volumeTool.startInsertion({clip: true}); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + // CLIP POLYGON + clippingToolBar.append(this.createToolIcon( + Potree.resourcePath + "/icons/clip-polygon.svg", + "[title]tt.clip_polygon", + () => { + let item = this.viewer.clippingTool.startInsertion({type: "polygon"}); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + + {// SCREEN BOX SELECT + let boxSelectTool = new ScreenBoxSelectTool(this.viewer); + + clippingToolBar.append(this.createToolIcon( + Potree.resourcePath + "/icons/clip-screen.svg", + "[title]tt.screen_clip_box", + () => { + if(!(this.viewer.scene.getActiveCamera() instanceof OrthographicCamera)){ + this.viewer.postMessage(`Switch to Orthographic Camera Mode before using the Screen-Box-Select tool.`, + {duration: 2000}); + return; + } + + let item = boxSelectTool.startInsertion(); + + let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); + let jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid); + $.jstree.reference(jsonNode.id).deselect_all(); + $.jstree.reference(jsonNode.id).select_node(jsonNode.id); + } + )); + } + + { // REMOVE CLIPPING TOOLS + clippingToolBar.append(this.createToolIcon( + Potree.resourcePath + "/icons/remove.svg", + "[title]tt.remove_all_measurement", + () => { + + this.viewer.scene.removeAllClipVolumes(); + } + )); + } + + } + + initFilters(){ + this.initClassificationList(); + this.initReturnFilters(); + this.initGPSTimeFilters(); + this.initPointSourceIDFilters(); + + } + + initReturnFilters(){ + let elReturnFilterPanel = $('#return_filter_panel'); + + { // RETURN NUMBER + let sldReturnNumber = elReturnFilterPanel.find('#sldReturnNumber'); + let lblReturnNumber = elReturnFilterPanel.find('#lblReturnNumber'); + + sldReturnNumber.slider({ + range: true, + min: 0, max: 7, step: 1, + values: [0, 7], + slide: (event, ui) => { + this.viewer.setFilterReturnNumberRange(ui.values[0], ui.values[1]); + } + }); + + let onReturnNumberChanged = (event) => { + let [from, to] = this.viewer.filterReturnNumberRange; + + lblReturnNumber[0].innerHTML = `${from} to ${to}`; + sldReturnNumber.slider({values: [from, to]}); + }; + + this.viewer.addEventListener('filter_return_number_range_changed', onReturnNumberChanged); + + onReturnNumberChanged(); + } + + { // NUMBER OF RETURNS + let sldNumberOfReturns = elReturnFilterPanel.find('#sldNumberOfReturns'); + let lblNumberOfReturns = elReturnFilterPanel.find('#lblNumberOfReturns'); + + sldNumberOfReturns.slider({ + range: true, + min: 0, max: 7, step: 1, + values: [0, 7], + slide: (event, ui) => { + this.viewer.setFilterNumberOfReturnsRange(ui.values[0], ui.values[1]); + } + }); + + let onNumberOfReturnsChanged = (event) => { + let [from, to] = this.viewer.filterNumberOfReturnsRange; + + lblNumberOfReturns[0].innerHTML = `${from} to ${to}`; + sldNumberOfReturns.slider({values: [from, to]}); + }; + + this.viewer.addEventListener('filter_number_of_returns_range_changed', onNumberOfReturnsChanged); + + onNumberOfReturnsChanged(); + } + } + + initGPSTimeFilters(){ + + let elGPSTimeFilterPanel = $('#gpstime_filter_panel'); + + { + let slider = new HierarchicalSlider({ + levels: 4, + slide: (event) => { + this.viewer.setFilterGPSTimeRange(...event.values); + }, + }); + + let initialized = false; + + let initialize = () => { + + let elRangeContainer = $("#gpstime_multilevel_range_container"); + elRangeContainer[0].prepend(slider.element); + + let extent = this.viewer.getGpsTimeExtent(); + + slider.setRange(extent); + slider.setValues(extent); + + + initialized = true; + }; + + this.viewer.addEventListener("update", (e) => { + let extent = this.viewer.getGpsTimeExtent(); + let gpsTimeAvailable = extent[0] !== Infinity; + + if(!initialized && gpsTimeAvailable){ + initialize(); + } + + slider.setRange(extent); + }); + } + + + { + + const txtGpsTime = elGPSTimeFilterPanel.find("#txtGpsTime"); + const btnFindGpsTime = elGPSTimeFilterPanel.find("#btnFindGpsTime"); + + let targetTime = null; + + txtGpsTime.on("input", (e) => { + const str = txtGpsTime.val(); + + if(!isNaN(str)){ + const value = parseFloat(str); + targetTime = value; + + txtGpsTime.css("background-color", ""); + }else { + targetTime = null; + + txtGpsTime.css("background-color", "#ff9999"); + } + + }); + + btnFindGpsTime.click( () => { + + if(targetTime !== null){ + viewer.moveToGpsTimeVicinity(targetTime); + } + }); + } + + } + + initPointSourceIDFilters() { + let elPointSourceIDFilterPanel = $('#pointsourceid_filter_panel'); + + { + let slider = new HierarchicalSlider({ + levels: 4, + range: [0, 65535], + precision: 1, + slide: (event) => { + let values = event.values; + this.viewer.setFilterPointSourceIDRange(values[0], values[1]); + } + }); + + let initialized = false; + + let initialize = () => { + elPointSourceIDFilterPanel[0].prepend(slider.element); + + initialized = true; + }; + + this.viewer.addEventListener("update", (e) => { + let extent = this.viewer.filterPointSourceIDRange; + + if(!initialized){ + initialize(); + + slider.setValues(extent); + } + + }); + } + + // let lblPointSourceID = elPointSourceIDFilterPanel.find("#lblPointSourceID"); + // let elPointSourceID = elPointSourceIDFilterPanel.find("#spnPointSourceID"); + + // let slider = new ZoomableSlider(); + // elPointSourceID[0].appendChild(slider.element); + // slider.update(); + + // slider.change( () => { + // let range = slider.chosenRange; + // this.viewer.setFilterPointSourceIDRange(range[0], range[1]); + // }); + + // let onPointSourceIDExtentChanged = (event) => { + // let range = this.viewer.filterPointSourceIDExtent; + // slider.setVisibleRange(range); + // }; + + // let onPointSourceIDChanged = (event) => { + // let range = this.viewer.filterPointSourceIDRange; + + // let precision = 1; + // let from = `${Utils.addCommas(range[0].toFixed(precision))}`; + // let to = `${Utils.addCommas(range[1].toFixed(precision))}`; + // lblPointSourceID[0].innerHTML = `${from} to ${to}`; + + // slider.setRange(range); + // }; + + // this.viewer.addEventListener('filter_point_source_id_range_changed', onPointSourceIDChanged); + // this.viewer.addEventListener('filter_point_source_id_extent_changed', onPointSourceIDExtentChanged); + + } + + initClassificationList(){ + let elClassificationList = $('#classificationList'); + + let addClassificationItem = (code, name) => { + const classification = this.viewer.classifications[code]; + const inputID = 'chkClassification_' + code; + const colorPickerID = 'colorPickerClassification_' + code; + + const checked = classification.visible ? "checked" : ""; + + let element = $(` +
  • + +
  • + `); + + const elInput = element.find('input'); + const elColorPicker = element.find(`#${colorPickerID}`); + + elInput.click(event => { + this.viewer.setClassificationVisibility(code, event.target.checked); + }); + + let defaultColor = classification.color.map(c => c * 255).join(", "); + defaultColor = `rgb(${defaultColor})`; + + + elColorPicker.spectrum({ + // flat: true, + color: defaultColor, + showInput: true, + preferredFormat: 'rgb', + cancelText: '', + chooseText: 'Apply', + move: color => { + let rgb = color.toRgb(); + const c = [rgb.r / 255, rgb.g / 255, rgb.b / 255, 1]; + classification.color = c; + }, + change: color => { + let rgb = color.toRgb(); + const c = [rgb.r / 255, rgb.g / 255, rgb.b / 255, 1]; + classification.color = c; + } + }); + + elClassificationList.append(element); + }; + + const addToggleAllButton = () => { // toggle all button + const element = $(` +
  • + +
  • + `); + + let elInput = element.find('input'); + + elInput.click(event => { + this.viewer.toggleAllClassificationsVisibility(); + }); + + elClassificationList.append(element); + }; + + const addInvertButton = () => { + const element = $(` +
  • + +
  • + `); + + let elInput = element.find('input'); + + elInput.click( () => { + const classifications = this.viewer.classifications; + + for(let key of Object.keys(classifications)){ + let value = classifications[key]; + this.viewer.setClassificationVisibility(key, !value.visible); + } + }); + + elClassificationList.append(element); + }; + + const populate = () => { + addToggleAllButton(); + for (let classID in this.viewer.classifications) { + addClassificationItem(classID, this.viewer.classifications[classID].name); + } + addInvertButton(); + }; + + populate(); + + this.viewer.addEventListener("classifications_changed", () => { + elClassificationList.empty(); + populate(); + }); + + this.viewer.addEventListener("classification_visibility_changed", () => { + + { // set checked state of classification buttons + for(const classID of Object.keys(this.viewer.classifications)){ + const classValue = this.viewer.classifications[classID]; + + let elItem = elClassificationList.find(`#chkClassification_${classID}`); + elItem.prop("checked", classValue.visible); + } + } + + { // set checked state of toggle button based on state of all other buttons + let numVisible = 0; + let numItems = 0; + for(const key of Object.keys(this.viewer.classifications)){ + if(this.viewer.classifications[key].visible){ + numVisible++; + } + numItems++; + } + const allVisible = numVisible === numItems; + + let elToggle = elClassificationList.find("#toggleClassificationFilters"); + elToggle.prop("checked", allVisible); + } + }); + } + + initAccordion(){ + $('.accordion > h3').each(function(){ + let header = $(this); + let content = $(this).next(); + + //header.addClass('accordion-header ui-widget'); + //content.addClass('accordion-content ui-widget'); + + content.hide(); + + header.click(() => { + content.slideToggle(); + }); + }); + + let languages = [ + ["EN", "en"], + ["FR", "fr"], + ["DE", "de"], + ["JP", "jp"], + ["ES", "es"], + ["SE", "se"] + ]; + + let elLanguages = $('#potree_languages'); + for(let i = 0; i < languages.length; i++){ + let [key, value] = languages[i]; + let element = $(`${key}`); + element.click(() => this.viewer.setLanguage(value)); + + if(i === 0){ + element.css("margin-left", "30px"); + } + + elLanguages.append(element); + + if(i < languages.length - 1){ + elLanguages.append($(document.createTextNode(' - '))); + } + } + + + // to close all, call + // $(".accordion > div").hide() + + // to open the, for example, tool menu, call: + // $("#menu_tools").next().show() + } + + initAppearance(){ + + const sldPointBudget = this.dom.find('#sldPointBudget'); + + sldPointBudget.slider({ + value: this.viewer.getPointBudget(), + min: 100 * 1000, + max: 10 * 1000 * 1000, + step: 1000, + slide: (event, ui) => { this.viewer.setPointBudget(ui.value); } + }); + + this.dom.find('#sldFOV').slider({ + value: this.viewer.getFOV(), + min: 20, + max: 100, + step: 1, + slide: (event, ui) => { this.viewer.setFOV(ui.value); } + }); + + $('#sldEDLRadius').slider({ + value: this.viewer.getEDLRadius(), + min: 1, + max: 4, + step: 0.01, + slide: (event, ui) => { this.viewer.setEDLRadius(ui.value); } + }); + + $('#sldEDLStrength').slider({ + value: this.viewer.getEDLStrength(), + min: 0, + max: 5, + step: 0.01, + slide: (event, ui) => { this.viewer.setEDLStrength(ui.value); } + }); + + $('#sldEDLOpacity').slider({ + value: this.viewer.getEDLOpacity(), + min: 0, + max: 1, + step: 0.01, + slide: (event, ui) => { this.viewer.setEDLOpacity(ui.value); } + }); + + this.viewer.addEventListener('point_budget_changed', (event) => { + $('#lblPointBudget')[0].innerHTML = Utils.addCommas(this.viewer.getPointBudget()); + sldPointBudget.slider({value: this.viewer.getPointBudget()}); + }); + + this.viewer.addEventListener('fov_changed', (event) => { + $('#lblFOV')[0].innerHTML = parseInt(this.viewer.getFOV()); + $('#sldFOV').slider({value: this.viewer.getFOV()}); + }); + + this.viewer.addEventListener('use_edl_changed', (event) => { + $('#chkEDLEnabled')[0].checked = this.viewer.getEDLEnabled(); + }); + + this.viewer.addEventListener('edl_radius_changed', (event) => { + $('#lblEDLRadius')[0].innerHTML = this.viewer.getEDLRadius().toFixed(1); + $('#sldEDLRadius').slider({value: this.viewer.getEDLRadius()}); + }); + + this.viewer.addEventListener('edl_strength_changed', (event) => { + $('#lblEDLStrength')[0].innerHTML = this.viewer.getEDLStrength().toFixed(1); + $('#sldEDLStrength').slider({value: this.viewer.getEDLStrength()}); + }); + + this.viewer.addEventListener('background_changed', (event) => { + $("input[name=background][value='" + this.viewer.getBackground() + "']").prop('checked', true); + }); + + $('#lblPointBudget')[0].innerHTML = Utils.addCommas(this.viewer.getPointBudget()); + $('#lblFOV')[0].innerHTML = parseInt(this.viewer.getFOV()); + $('#lblEDLRadius')[0].innerHTML = this.viewer.getEDLRadius().toFixed(1); + $('#lblEDLStrength')[0].innerHTML = this.viewer.getEDLStrength().toFixed(1); + $('#chkEDLEnabled')[0].checked = this.viewer.getEDLEnabled(); + + { + let elBackground = $(`#background_options`); + elBackground.selectgroup(); + + elBackground.find("input").click( (e) => { + this.viewer.setBackground(e.target.value); + }); + + let currentBackground = this.viewer.getBackground(); + $(`input[name=background_options][value=${currentBackground}]`).trigger("click"); + } + + $('#chkEDLEnabled').click( () => { + this.viewer.setEDLEnabled($('#chkEDLEnabled').prop("checked")); + }); + } + + initNavigation(){ + let elNavigation = $('#navigation'); + let sldMoveSpeed = $('#sldMoveSpeed'); + let lblMoveSpeed = $('#lblMoveSpeed'); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + '/icons/earth_controls_1.png', + '[title]tt.earth_control', + () => { this.viewer.setControls(this.viewer.earthControls); } + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + '/icons/fps_controls.svg', + '[title]tt.flight_control', + () => { + this.viewer.setControls(this.viewer.fpControls); + this.viewer.fpControls.lockElevation = false; + } + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + '/icons/helicopter_controls.svg', + '[title]tt.heli_control', + () => { + this.viewer.setControls(this.viewer.fpControls); + this.viewer.fpControls.lockElevation = true; + } + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + '/icons/orbit_controls.svg', + '[title]tt.orbit_control', + () => { this.viewer.setControls(this.viewer.orbitControls); } + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + '/icons/focus.svg', + '[title]tt.focus_control', + () => { this.viewer.fitToScreen(); } + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + "/icons/navigation_cube.svg", + "[title]tt.navigation_cube_control", + () => {this.viewer.toggleNavigationCube();} + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + "/images/compas.svg", + "[title]tt.compass", + () => { + const visible = !this.viewer.compass.isVisible(); + this.viewer.compass.setVisible(visible); + } + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + "/icons/camera_animation.svg", + "[title]tt.camera_animation", + () => { + const animation = CameraAnimation.defaultFromView(this.viewer); + + viewer.scene.addCameraAnimation(animation); + } + )); + + + elNavigation.append("
    "); + + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + "/icons/left.svg", + "[title]tt.left_view_control", + () => {this.viewer.setLeftView();} + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + "/icons/right.svg", + "[title]tt.right_view_control", + () => {this.viewer.setRightView();} + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + "/icons/front.svg", + "[title]tt.front_view_control", + () => {this.viewer.setFrontView();} + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + "/icons/back.svg", + "[title]tt.back_view_control", + () => {this.viewer.setBackView();} + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + "/icons/top.svg", + "[title]tt.top_view_control", + () => {this.viewer.setTopView();} + )); + + elNavigation.append(this.createToolIcon( + Potree.resourcePath + "/icons/bottom.svg", + "[title]tt.bottom_view_control", + () => {this.viewer.setBottomView();} + )); + + + + + + let elCameraProjection = $(` + + + + + `); + elNavigation.append(elCameraProjection); + elCameraProjection.selectgroup({title: "Camera Projection"}); + elCameraProjection.find("input").click( (e) => { + this.viewer.setCameraMode(CameraMode[e.target.value]); + }); + let cameraMode = Object.keys(CameraMode) + .filter(key => CameraMode[key] === this.viewer.scene.cameraMode); + elCameraProjection.find(`input[value=${cameraMode}]`).trigger("click"); + + let speedRange = new Vector2(1, 10 * 1000); + + let toLinearSpeed = (value) => { + return Math.pow(value, 4) * speedRange.y + speedRange.x; + }; + + let toExpSpeed = (value) => { + return Math.pow((value - speedRange.x) / speedRange.y, 1 / 4); + }; + + sldMoveSpeed.slider({ + value: toExpSpeed(this.viewer.getMoveSpeed()), + min: 0, + max: 1, + step: 0.01, + slide: (event, ui) => { this.viewer.setMoveSpeed(toLinearSpeed(ui.value)); } + }); + + this.viewer.addEventListener('move_speed_changed', (event) => { + lblMoveSpeed.html(this.viewer.getMoveSpeed().toFixed(1)); + sldMoveSpeed.slider({value: toExpSpeed(this.viewer.getMoveSpeed())}); + }); + + lblMoveSpeed.html(this.viewer.getMoveSpeed().toFixed(1)); + } + + + initSettings(){ + + { + $('#sldMinNodeSize').slider({ + value: this.viewer.getMinNodeSize(), + min: 0, + max: 1000, + step: 0.01, + slide: (event, ui) => { this.viewer.setMinNodeSize(ui.value); } + }); + + this.viewer.addEventListener('minnodesize_changed', (event) => { + $('#lblMinNodeSize').html(parseInt(this.viewer.getMinNodeSize())); + $('#sldMinNodeSize').slider({value: this.viewer.getMinNodeSize()}); + }); + $('#lblMinNodeSize').html(parseInt(this.viewer.getMinNodeSize())); + } + + { + let elSplatQuality = $("#splat_quality_options"); + elSplatQuality.selectgroup({title: "Splat Quality"}); + + elSplatQuality.find("input").click( (e) => { + if(e.target.value === "standard"){ + this.viewer.useHQ = false; + }else if(e.target.value === "hq"){ + this.viewer.useHQ = true; + } + }); + + let currentQuality = this.viewer.useHQ ? "hq" : "standard"; + elSplatQuality.find(`input[value=${currentQuality}]`).trigger("click"); + } + + $('#show_bounding_box').click(() => { + this.viewer.setShowBoundingBox($('#show_bounding_box').prop("checked")); + }); + + $('#set_freeze').click(() => { + this.viewer.setFreeze($('#set_freeze').prop("checked")); + }); + } + + } + + class AnnotationTool extends EventDispatcher{ + constructor (viewer) { + super(); + + this.viewer = viewer; + this.renderer = viewer.renderer; + + this.sg = new SphereGeometry(0.1); + this.sm = new MeshNormalMaterial(); + this.s = new Mesh(this.sg, this.sm); + } + + startInsertion (args = {}) { + let domElement = this.viewer.renderer.domElement; + + let annotation = new Annotation({ + position: [589748.270, 231444.540, 753.675], + title: "Annotation Title", + description: `Annotation Description` + }); + this.dispatchEvent({type: 'start_inserting_annotation', annotation: annotation}); + + const annotations = this.viewer.scene.annotations; + annotations.add(annotation); + + let callbacks = { + cancel: null, + finish: null, + }; + + let insertionCallback = (e) => { + if (e.button === MOUSE.LEFT) { + callbacks.finish(); + } else if (e.button === MOUSE.RIGHT) { + callbacks.cancel(); + } + }; + + callbacks.cancel = e => { + annotations.remove(annotation); + + domElement.removeEventListener('mouseup', insertionCallback, true); + }; + + callbacks.finish = e => { + domElement.removeEventListener('mouseup', insertionCallback, true); + }; + + domElement.addEventListener('mouseup', insertionCallback, true); + + let drag = (e) => { + let I = Utils.getMousePointCloudIntersection( + e.drag.end, + e.viewer.scene.getActiveCamera(), + e.viewer, + e.viewer.scene.pointclouds, + {pickClipped: true}); + + if (I) { + this.s.position.copy(I.location); + + annotation.position.copy(I.location); + } + }; + + let drop = (e) => { + viewer.scene.scene.remove(this.s); + this.s.removeEventListener("drag", drag); + this.s.removeEventListener("drop", drop); + }; + + this.s.addEventListener('drag', drag); + this.s.addEventListener('drop', drop); + + this.viewer.scene.scene.add(this.s); + this.viewer.inputHandler.startDragging(this.s); + + return annotation; + } + + update(){ + // let camera = this.viewer.scene.getActiveCamera(); + // let domElement = this.renderer.domElement; + // let measurements = this.viewer.scene.measurements; + + // const renderAreaSize = this.renderer.getSize(new THREE.Vector2()); + // let clientWidth = renderAreaSize.width; + // let clientHeight = renderAreaSize.height; + + } + + render(){ + //this.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera()); + } + }; + + /** + * @author mschuetz / http://mschuetz.at + * + * + */ + + class InputHandler extends EventDispatcher { + constructor (viewer) { + super(); + + this.viewer = viewer; + this.renderer = viewer.renderer; + this.domElement = this.renderer.domElement; + this.enabled = true; + + this.scene = null; + this.interactiveScenes = []; + this.interactiveObjects = new Set(); + this.inputListeners = []; + this.blacklist = new Set(); + + this.drag = null; + this.mouse = new Vector2(0, 0); + + this.selection = []; + + this.hoveredElements = []; + this.pressedKeys = {}; + + this.wheelDelta = 0; + + this.speed = 1; + + this.logMessages = false; + + if (this.domElement.tabIndex === -1) { + this.domElement.tabIndex = 2222; + } + + this.domElement.addEventListener('contextmenu', (event) => { event.preventDefault(); }, false); + this.domElement.addEventListener('click', this.onMouseClick.bind(this), false); + this.domElement.addEventListener('mousedown', this.onMouseDown.bind(this), false); + this.domElement.addEventListener('mouseup', this.onMouseUp.bind(this), false); + this.domElement.addEventListener('mousemove', this.onMouseMove.bind(this), false); + this.domElement.addEventListener('mousewheel', this.onMouseWheel.bind(this), false); + this.domElement.addEventListener('DOMMouseScroll', this.onMouseWheel.bind(this), false); // Firefox + this.domElement.addEventListener('dblclick', this.onDoubleClick.bind(this)); + this.domElement.addEventListener('keydown', this.onKeyDown.bind(this)); + this.domElement.addEventListener('keyup', this.onKeyUp.bind(this)); + this.domElement.addEventListener('touchstart', this.onTouchStart.bind(this)); + this.domElement.addEventListener('touchend', this.onTouchEnd.bind(this)); + this.domElement.addEventListener('touchmove', this.onTouchMove.bind(this)); + } + + addInputListener (listener) { + this.inputListeners.push(listener); + } + + removeInputListener (listener) { + this.inputListeners = this.inputListeners.filter(e => e !== listener); + } + + getSortedListeners(){ + return this.inputListeners.sort( (a, b) => { + let ia = (a.importance !== undefined) ? a.importance : 0; + let ib = (b.importance !== undefined) ? b.importance : 0; + + return ib - ia; + }); + } + + onTouchStart (e) { + if (this.logMessages) console.log(this.constructor.name + ': onTouchStart'); + + e.preventDefault(); + + if (e.touches.length === 1) { + let rect = this.domElement.getBoundingClientRect(); + let x = e.touches[0].pageX - rect.left; + let y = e.touches[0].pageY - rect.top; + this.mouse.set(x, y); + + this.startDragging(null); + } + + + for (let inputListener of this.getSortedListeners()) { + inputListener.dispatchEvent({ + type: e.type, + touches: e.touches, + changedTouches: e.changedTouches + }); + } + } + + onTouchEnd (e) { + if (this.logMessages) console.log(this.constructor.name + ': onTouchEnd'); + + e.preventDefault(); + + for (let inputListener of this.getSortedListeners()) { + inputListener.dispatchEvent({ + type: 'drop', + drag: this.drag, + viewer: this.viewer + }); + } + + this.drag = null; + + for (let inputListener of this.getSortedListeners()) { + inputListener.dispatchEvent({ + type: e.type, + touches: e.touches, + changedTouches: e.changedTouches + }); + } + } + + onTouchMove (e) { + if (this.logMessages) console.log(this.constructor.name + ': onTouchMove'); + + e.preventDefault(); + + if (e.touches.length === 1) { + let rect = this.domElement.getBoundingClientRect(); + let x = e.touches[0].pageX - rect.left; + let y = e.touches[0].pageY - rect.top; + this.mouse.set(x, y); + + if (this.drag) { + this.drag.mouse = 1; + + this.drag.lastDrag.x = x - this.drag.end.x; + this.drag.lastDrag.y = y - this.drag.end.y; + + this.drag.end.set(x, y); + + if (this.logMessages) console.log(this.constructor.name + ': drag: '); + for (let inputListener of this.getSortedListeners()) { + inputListener.dispatchEvent({ + type: 'drag', + drag: this.drag, + viewer: this.viewer + }); + } + } + } + + for (let inputListener of this.getSortedListeners()) { + inputListener.dispatchEvent({ + type: e.type, + touches: e.touches, + changedTouches: e.changedTouches + }); + } + + // DEBUG CODE + // let debugTouches = [...e.touches, { + // pageX: this.domElement.clientWidth / 2, + // pageY: this.domElement.clientHeight / 2}]; + // for(let inputListener of this.getSortedListeners()){ + // inputListener.dispatchEvent({ + // type: e.type, + // touches: debugTouches, + // changedTouches: e.changedTouches + // }); + // } + } + + onKeyDown (e) { + if (this.logMessages) console.log(this.constructor.name + ': onKeyDown'); + + // DELETE + if (e.keyCode === KeyCodes.DELETE && this.selection.length > 0) { + this.dispatchEvent({ + type: 'delete', + selection: this.selection + }); + + this.deselectAll(); + } + + this.dispatchEvent({ + type: 'keydown', + keyCode: e.keyCode, + event: e + }); + + // for(let l of this.getSortedListeners()){ + // l.dispatchEvent({ + // type: "keydown", + // keyCode: e.keyCode, + // event: e + // }); + // } + + this.pressedKeys[e.keyCode] = true; + + // e.preventDefault(); + } + + onKeyUp (e) { + if (this.logMessages) console.log(this.constructor.name + ': onKeyUp'); + + delete this.pressedKeys[e.keyCode]; + + e.preventDefault(); + } + + onDoubleClick (e) { + if (this.logMessages) console.log(this.constructor.name + ': onDoubleClick'); + + let consumed = false; + for (let hovered of this.hoveredElements) { + if (hovered._listeners && hovered._listeners['dblclick']) { + hovered.object.dispatchEvent({ + type: 'dblclick', + mouse: this.mouse, + object: hovered.object + }); + consumed = true; + break; + } + } + + if (!consumed) { + for (let inputListener of this.getSortedListeners()) { + inputListener.dispatchEvent({ + type: 'dblclick', + mouse: this.mouse, + object: null + }); + } + } + + e.preventDefault(); + } + + onMouseClick (e) { + if (this.logMessages) console.log(this.constructor.name + ': onMouseClick'); + + e.preventDefault(); + } + + onMouseDown (e) { + if (this.logMessages) console.log(this.constructor.name + ': onMouseDown'); + + e.preventDefault(); + + let consumed = false; + let consume = () => { return consumed = true; }; + if (this.hoveredElements.length === 0) { + for (let inputListener of this.getSortedListeners()) { + inputListener.dispatchEvent({ + type: 'mousedown', + viewer: this.viewer, + mouse: this.mouse + }); + } + }else { + for(let hovered of this.hoveredElements){ + let object = hovered.object; + object.dispatchEvent({ + type: 'mousedown', + viewer: this.viewer, + consume: consume + }); + + if(consumed){ + break; + } + } + } + + if (!this.drag) { + let target = this.hoveredElements + .find(el => ( + el.object._listeners && + el.object._listeners['drag'] && + el.object._listeners['drag'].length > 0)); + + if (target) { + this.startDragging(target.object, {location: target.point}); + } else { + this.startDragging(null); + } + } + + if (this.scene) { + this.viewStart = this.scene.view.clone(); + } + } + + onMouseUp (e) { + if (this.logMessages) console.log(this.constructor.name + ': onMouseUp'); + + e.preventDefault(); + + let noMovement = this.getNormalizedDrag().length() === 0; + + + let consumed = false; + let consume = () => { return consumed = true; }; + if (this.hoveredElements.length === 0) { + for (let inputListener of this.getSortedListeners()) { + inputListener.dispatchEvent({ + type: 'mouseup', + viewer: this.viewer, + mouse: this.mouse, + consume: consume + }); + + if(consumed){ + break; + } + } + }else { + let hovered = this.hoveredElements + .map(e => e.object) + .find(e => (e._listeners && e._listeners['mouseup'])); + if(hovered){ + hovered.dispatchEvent({ + type: 'mouseup', + viewer: this.viewer, + consume: consume + }); + } + } + + if (this.drag) { + if (this.drag.object) { + if (this.logMessages) console.log(`${this.constructor.name}: drop ${this.drag.object.name}`); + this.drag.object.dispatchEvent({ + type: 'drop', + drag: this.drag, + viewer: this.viewer + + }); + } else { + for (let inputListener of this.getSortedListeners()) { + inputListener.dispatchEvent({ + type: 'drop', + drag: this.drag, + viewer: this.viewer + }); + } + } + + // check for a click + let clicked = this.hoveredElements.map(h => h.object).find(v => v === this.drag.object) !== undefined; + if(clicked){ + if (this.logMessages) console.log(`${this.constructor.name}: click ${this.drag.object.name}`); + this.drag.object.dispatchEvent({ + type: 'click', + viewer: this.viewer, + consume: consume, + }); + } + + this.drag = null; + } + + if(!consumed){ + if (e.button === MOUSE.LEFT) { + if (noMovement) { + let selectable = this.hoveredElements + .find(el => el.object._listeners && el.object._listeners['select']); + + if (selectable) { + selectable = selectable.object; + + if (this.isSelected(selectable)) { + this.selection + .filter(e => e !== selectable) + .forEach(e => this.toggleSelection(e)); + } else { + this.deselectAll(); + this.toggleSelection(selectable); + } + } else { + this.deselectAll(); + } + } + } else if ((e.button === MOUSE.RIGHT) && noMovement) { + this.deselectAll(); + } + } + } + + onMouseMove (e) { + e.preventDefault(); + + let rect = this.domElement.getBoundingClientRect(); + let x = e.clientX - rect.left; + let y = e.clientY - rect.top; + this.mouse.set(x, y); + + let hoveredElements = this.getHoveredElements(); + if(hoveredElements.length > 0){ + let names = hoveredElements.map(h => h.object.name).join(", "); + if (this.logMessages) console.log(`${this.constructor.name}: onMouseMove; hovered: '${names}'`); + } + + if (this.drag) { + this.drag.mouse = e.buttons; + + this.drag.lastDrag.x = x - this.drag.end.x; + this.drag.lastDrag.y = y - this.drag.end.y; + + this.drag.end.set(x, y); + + if (this.drag.object) { + if (this.logMessages) console.log(this.constructor.name + ': drag: ' + this.drag.object.name); + this.drag.object.dispatchEvent({ + type: 'drag', + drag: this.drag, + viewer: this.viewer + }); + } else { + if (this.logMessages) console.log(this.constructor.name + ': drag: '); + + let dragConsumed = false; + for (let inputListener of this.getSortedListeners()) { + inputListener.dispatchEvent({ + type: 'drag', + drag: this.drag, + viewer: this.viewer, + consume: () => {dragConsumed = true;} + }); + + if(dragConsumed){ + break; + } + } + } + }else { + let curr = hoveredElements.map(a => a.object).find(a => true); + let prev = this.hoveredElements.map(a => a.object).find(a => true); + + if(curr !== prev){ + if(curr){ + if (this.logMessages) console.log(`${this.constructor.name}: mouseover: ${curr.name}`); + curr.dispatchEvent({ + type: 'mouseover', + object: curr, + }); + } + if(prev){ + if (this.logMessages) console.log(`${this.constructor.name}: mouseleave: ${prev.name}`); + prev.dispatchEvent({ + type: 'mouseleave', + object: prev, + }); + } + } + + if(hoveredElements.length > 0){ + let object = hoveredElements + .map(e => e.object) + .find(e => (e._listeners && e._listeners['mousemove'])); + + if(object){ + object.dispatchEvent({ + type: 'mousemove', + object: object + }); + } + } + + } + + // for (let inputListener of this.getSortedListeners()) { + // inputListener.dispatchEvent({ + // type: 'mousemove', + // object: null + // }); + // } + + + this.hoveredElements = hoveredElements; + } + + onMouseWheel(e){ + if(!this.enabled) return; + + if(this.logMessages) console.log(this.constructor.name + ": onMouseWheel"); + + e.preventDefault(); + + let delta = 0; + if (e.wheelDelta !== undefined) { // WebKit / Opera / Explorer 9 + delta = e.wheelDelta; + } else if (e.detail !== undefined) { // Firefox + delta = -e.detail; + } + + let ndelta = Math.sign(delta); + + // this.wheelDelta += Math.sign(delta); + + if (this.hoveredElement) { + this.hoveredElement.object.dispatchEvent({ + type: 'mousewheel', + delta: ndelta, + object: this.hoveredElement.object + }); + } else { + for (let inputListener of this.getSortedListeners()) { + inputListener.dispatchEvent({ + type: 'mousewheel', + delta: ndelta, + object: null + }); + } + } + } + + startDragging (object, args = null) { + + let name = object ? object.name : "no name"; + if (this.logMessages) console.log(`${this.constructor.name}: startDragging: '${name}'`); + + this.drag = { + start: this.mouse.clone(), + end: this.mouse.clone(), + lastDrag: new Vector2(0, 0), + startView: this.scene.view.clone(), + object: object + }; + + if (args) { + for (let key of Object.keys(args)) { + this.drag[key] = args[key]; + } + } + } + + getMousePointCloudIntersection (mouse) { + return Utils.getMousePointCloudIntersection( + this.mouse, + this.scene.getActiveCamera(), + this.viewer, + this.scene.pointclouds); + } + + toggleSelection (object) { + let oldSelection = this.selection; + + let index = this.selection.indexOf(object); + + if (index === -1) { + this.selection.push(object); + object.dispatchEvent({ + type: 'select' + }); + } else { + this.selection.splice(index, 1); + object.dispatchEvent({ + type: 'deselect' + }); + } + + this.dispatchEvent({ + type: 'selection_changed', + oldSelection: oldSelection, + selection: this.selection + }); + } + + deselect(object){ + + let oldSelection = this.selection; + + let index = this.selection.indexOf(object); + + if(index >= 0){ + this.selection.splice(index, 1); + object.dispatchEvent({ + type: 'deselect' + }); + + this.dispatchEvent({ + type: 'selection_changed', + oldSelection: oldSelection, + selection: this.selection + }); + } + } + + deselectAll () { + for (let object of this.selection) { + object.dispatchEvent({ + type: 'deselect' + }); + } + + let oldSelection = this.selection; + + if (this.selection.length > 0) { + this.selection = []; + this.dispatchEvent({ + type: 'selection_changed', + oldSelection: oldSelection, + selection: this.selection + }); + } + } + + isSelected (object) { + let index = this.selection.indexOf(object); + + return index !== -1; + } + + registerInteractiveObject(object){ + this.interactiveObjects.add(object); + } + + removeInteractiveObject(object){ + this.interactiveObjects.delete(object); + } + + registerInteractiveScene (scene) { + let index = this.interactiveScenes.indexOf(scene); + if (index === -1) { + this.interactiveScenes.push(scene); + } + } + + unregisterInteractiveScene (scene) { + let index = this.interactiveScenes.indexOf(scene); + if (index > -1) { + this.interactiveScenes.splice(index, 1); + } + } + + getHoveredElement () { + let hoveredElements = this.getHoveredElements(); + if (hoveredElements.length > 0) { + return hoveredElements[0]; + } else { + return null; + } + } + + getHoveredElements () { + let scenes = this.interactiveScenes.concat(this.scene.scene); + + let interactableListeners = ['mouseup', 'mousemove', 'mouseover', 'mouseleave', 'drag', 'drop', 'click', 'select', 'deselect']; + let interactables = []; + for (let scene of scenes) { + scene.traverseVisible(node => { + if (node._listeners && node.visible && !this.blacklist.has(node)) { + let hasInteractableListener = interactableListeners.filter((e) => { + return node._listeners[e] !== undefined; + }).length > 0; + + if (hasInteractableListener) { + interactables.push(node); + } + } + }); + } + + let camera = this.scene.getActiveCamera(); + let ray = Utils.mouseToRay(this.mouse, camera, this.domElement.clientWidth, this.domElement.clientHeight); + + let raycaster = new Raycaster(); + raycaster.ray.set(ray.origin, ray.direction); + raycaster.params.Line.threshold = 0.2; + + let intersections = raycaster.intersectObjects(interactables.filter(o => o.visible), false); + + return intersections; + } + + setScene (scene) { + this.deselectAll(); + + this.scene = scene; + } + + update (delta) { + + } + + getNormalizedDrag () { + if (!this.drag) { + return new Vector2(0, 0); + } + + let diff = new Vector2().subVectors(this.drag.end, this.drag.start); + + diff.x = diff.x / this.domElement.clientWidth; + diff.y = diff.y / this.domElement.clientHeight; + + return diff; + } + + getNormalizedLastDrag () { + if (!this.drag) { + return new Vector2(0, 0); + } + + let lastDrag = this.drag.lastDrag.clone(); + + lastDrag.x = lastDrag.x / this.domElement.clientWidth; + lastDrag.y = lastDrag.y / this.domElement.clientHeight; + + return lastDrag; + } + } + + class NavigationCube extends Object3D { + + constructor(viewer){ + super(); + + this.viewer = viewer; + + let createPlaneMaterial = (img) => { + let material = new MeshBasicMaterial( { + depthTest: true, + depthWrite: true, + side: DoubleSide + }); + new TextureLoader().load( + exports.resourcePath + '/textures/navigation/' + img, + function(texture) { + texture.anisotropy = viewer.renderer.capabilities.getMaxAnisotropy(); + material.map = texture; + material.needsUpdate = true; + }); + return material; + }; + + let planeGeometry = new PlaneGeometry(1, 1); + + this.front = new Mesh(planeGeometry, createPlaneMaterial('F.png')); + this.front.position.y = -0.5; + this.front.rotation.x = Math.PI / 2.0; + this.front.updateMatrixWorld(); + this.front.name = "F"; + this.add(this.front); + + this.back = new Mesh(planeGeometry, createPlaneMaterial('B.png')); + this.back.position.y = 0.5; + this.back.rotation.x = Math.PI / 2.0; + this.back.updateMatrixWorld(); + this.back.name = "B"; + this.add(this.back); + + this.left = new Mesh(planeGeometry, createPlaneMaterial('L.png')); + this.left.position.x = -0.5; + this.left.rotation.y = Math.PI / 2.0; + this.left.updateMatrixWorld(); + this.left.name = "L"; + this.add(this.left); + + this.right = new Mesh(planeGeometry, createPlaneMaterial('R.png')); + this.right.position.x = 0.5; + this.right.rotation.y = Math.PI / 2.0; + this.right.updateMatrixWorld(); + this.right.name = "R"; + this.add(this.right); + + this.bottom = new Mesh(planeGeometry, createPlaneMaterial('D.png')); + this.bottom.position.z = -0.5; + this.bottom.updateMatrixWorld(); + this.bottom.name = "D"; + this.add(this.bottom); + + this.top = new Mesh(planeGeometry, createPlaneMaterial('U.png')); + this.top.position.z = 0.5; + this.top.updateMatrixWorld(); + this.top.name = "U"; + this.add(this.top); + + this.width = 150; // in px + + this.camera = new OrthographicCamera(-1, 1, 1, -1, -1, 1); + this.camera.position.copy(new Vector3(0, 0, 0)); + this.camera.lookAt(new Vector3(0, 1, 0)); + this.camera.updateMatrixWorld(); + this.camera.rotation.order = "ZXY"; + + let onMouseDown = (event) => { + if (!this.visible) { + return; + } + + this.pickedFace = null; + let mouse = new Vector2(); + mouse.x = event.clientX - (window.innerWidth - this.width); + mouse.y = event.clientY; + + if(mouse.x < 0 || mouse.y > this.width) return; + + mouse.x = (mouse.x / this.width) * 2 - 1; + mouse.y = -(mouse.y / this.width) * 2 + 1; + + let raycaster = new Raycaster(); + raycaster.setFromCamera(mouse, this.camera); + raycaster.ray.origin.sub(this.camera.getWorldDirection(new Vector3())); + + let intersects = raycaster.intersectObjects(this.children); + + let minDistance = 1000; + for (let i = 0; i < intersects.length; i++) { + if(intersects[i].distance < minDistance) { + this.pickedFace = intersects[i].object.name; + minDistance = intersects[i].distance; + } + } + + if(this.pickedFace) { + this.viewer.setView(this.pickedFace); + } + }; + + this.viewer.renderer.domElement.addEventListener('mousedown', onMouseDown, false); + } + + update(rotation) { + this.camera.rotation.copy(rotation); + this.camera.updateMatrixWorld(); + } + + } + + /** + * @author mschuetz / http://mschuetz.at + * + * adapted from THREE.OrbitControls by + * + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + * + * + * + */ + + + class OrbitControls extends EventDispatcher{ + + constructor(viewer){ + super(); + + this.viewer = viewer; + this.renderer = viewer.renderer; + + this.scene = null; + this.sceneControls = new Scene(); + + this.rotationSpeed = 5; + + this.fadeFactor = 20; + this.yawDelta = 0; + this.pitchDelta = 0; + this.panDelta = new Vector2(0, 0); + this.radiusDelta = 0; + + this.doubleClockZoomEnabled = true; + + this.tweens = []; + + let drag = (e) => { + if (e.drag.object !== null) { + return; + } + + if (e.drag.startHandled === undefined) { + e.drag.startHandled = true; + + this.dispatchEvent({type: 'start'}); + } + + let ndrag = { + x: e.drag.lastDrag.x / this.renderer.domElement.clientWidth, + y: e.drag.lastDrag.y / this.renderer.domElement.clientHeight + }; + + if (e.drag.mouse === MOUSE$1.LEFT) { + this.yawDelta += ndrag.x * this.rotationSpeed; + this.pitchDelta += ndrag.y * this.rotationSpeed; + + this.stopTweens(); + } else if (e.drag.mouse === MOUSE$1.RIGHT) { + this.panDelta.x += ndrag.x; + this.panDelta.y += ndrag.y; + + this.stopTweens(); + } + }; + + let drop = e => { + this.dispatchEvent({type: 'end'}); + }; + + let scroll = (e) => { + let resolvedRadius = this.scene.view.radius + this.radiusDelta; + + this.radiusDelta += -e.delta * resolvedRadius * 0.1; + + this.stopTweens(); + }; + + let dblclick = (e) => { + if(this.doubleClockZoomEnabled){ + this.zoomToLocation(e.mouse); + } + }; + + let previousTouch = null; + let touchStart = e => { + previousTouch = e; + }; + + let touchEnd = e => { + previousTouch = e; + }; + + let touchMove = e => { + if (e.touches.length === 2 && previousTouch.touches.length === 2){ + let prev = previousTouch; + let curr = e; + + let prevDX = prev.touches[0].pageX - prev.touches[1].pageX; + let prevDY = prev.touches[0].pageY - prev.touches[1].pageY; + let prevDist = Math.sqrt(prevDX * prevDX + prevDY * prevDY); + + let currDX = curr.touches[0].pageX - curr.touches[1].pageX; + let currDY = curr.touches[0].pageY - curr.touches[1].pageY; + let currDist = Math.sqrt(currDX * currDX + currDY * currDY); + + let delta = currDist / prevDist; + let resolvedRadius = this.scene.view.radius + this.radiusDelta; + let newRadius = resolvedRadius / delta; + this.radiusDelta = newRadius - resolvedRadius; + + this.stopTweens(); + }else if(e.touches.length === 3 && previousTouch.touches.length === 3){ + let prev = previousTouch; + let curr = e; + + let prevMeanX = (prev.touches[0].pageX + prev.touches[1].pageX + prev.touches[2].pageX) / 3; + let prevMeanY = (prev.touches[0].pageY + prev.touches[1].pageY + prev.touches[2].pageY) / 3; + + let currMeanX = (curr.touches[0].pageX + curr.touches[1].pageX + curr.touches[2].pageX) / 3; + let currMeanY = (curr.touches[0].pageY + curr.touches[1].pageY + curr.touches[2].pageY) / 3; + + let delta = { + x: (currMeanX - prevMeanX) / this.renderer.domElement.clientWidth, + y: (currMeanY - prevMeanY) / this.renderer.domElement.clientHeight + }; + + this.panDelta.x += delta.x; + this.panDelta.y += delta.y; + + this.stopTweens(); + } + + previousTouch = e; + }; + + this.addEventListener('touchstart', touchStart); + this.addEventListener('touchend', touchEnd); + this.addEventListener('touchmove', touchMove); + this.addEventListener('drag', drag); + this.addEventListener('drop', drop); + this.addEventListener('mousewheel', scroll); + this.addEventListener('dblclick', dblclick); + } + + setScene (scene) { + this.scene = scene; + } + + stop(){ + this.yawDelta = 0; + this.pitchDelta = 0; + this.radiusDelta = 0; + this.panDelta.set(0, 0); + } + + zoomToLocation(mouse){ + let camera = this.scene.getActiveCamera(); + + let I = Utils.getMousePointCloudIntersection( + mouse, + camera, + this.viewer, + this.scene.pointclouds, + {pickClipped: true}); + + if (I === null) { + return; + } + + let targetRadius = 0; + { + let minimumJumpDistance = 0.2; + + let domElement = this.renderer.domElement; + let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); + + let nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray); + let lastNode = nodes[nodes.length - 1]; + let radius = lastNode.getBoundingSphere(new Sphere()).radius; + targetRadius = Math.min(this.scene.view.radius, radius); + targetRadius = Math.max(minimumJumpDistance, targetRadius); + } + + let d = this.scene.view.direction.multiplyScalar(-1); + let cameraTargetPosition = new Vector3().addVectors(I.location, d.multiplyScalar(targetRadius)); + // TODO Unused: let controlsTargetPosition = I.location; + + let animationDuration = 600; + let easing = TWEEN.Easing.Quartic.Out; + + { // animate + let value = {x: 0}; + let tween = new TWEEN.Tween(value).to({x: 1}, animationDuration); + tween.easing(easing); + this.tweens.push(tween); + + let startPos = this.scene.view.position.clone(); + let targetPos = cameraTargetPosition.clone(); + let startRadius = this.scene.view.radius; + let targetRadius = cameraTargetPosition.distanceTo(I.location); + + tween.onUpdate(() => { + let t = value.x; + this.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x; + this.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y; + this.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z; + + this.scene.view.radius = (1 - t) * startRadius + t * targetRadius; + this.viewer.setMoveSpeed(this.scene.view.radius); + }); + + tween.onComplete(() => { + this.tweens = this.tweens.filter(e => e !== tween); + }); + + tween.start(); + } + } + + stopTweens () { + this.tweens.forEach(e => e.stop()); + this.tweens = []; + } + + update (delta) { + let view = this.scene.view; + + { // apply rotation + let progression = Math.min(1, this.fadeFactor * delta); + + let yaw = view.yaw; + let pitch = view.pitch; + let pivot = view.getPivot(); + + yaw -= progression * this.yawDelta; + pitch -= progression * this.pitchDelta; + + view.yaw = yaw; + view.pitch = pitch; + + let V = this.scene.view.direction.multiplyScalar(-view.radius); + let position = new Vector3().addVectors(pivot, V); + + view.position.copy(position); + } + + { // apply pan + let progression = Math.min(1, this.fadeFactor * delta); + let panDistance = progression * view.radius * 3; + + let px = -this.panDelta.x * panDistance; + let py = this.panDelta.y * panDistance; + + view.pan(px, py); + } + + { // apply zoom + let progression = Math.min(1, this.fadeFactor * delta); + + // let radius = view.radius + progression * this.radiusDelta * view.radius * 0.1; + let radius = view.radius + progression * this.radiusDelta; + + let V = view.direction.multiplyScalar(-radius); + let position = new Vector3().addVectors(view.getPivot(), V); + view.radius = radius; + + view.position.copy(position); + } + + { + let speed = view.radius; + this.viewer.setMoveSpeed(speed); + } + + { // decelerate over time + let progression = Math.min(1, this.fadeFactor * delta); + let attenuation = Math.max(0, 1 - this.fadeFactor * delta); + + this.yawDelta *= attenuation; + this.pitchDelta *= attenuation; + this.panDelta.multiplyScalar(attenuation); + // this.radiusDelta *= attenuation; + this.radiusDelta -= progression * this.radiusDelta; + } + } + }; + + /** + * @author mschuetz / http://mschuetz.at + * + * adapted from THREE.OrbitControls by + * + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + * + * + * + */ + + + class FirstPersonControls extends EventDispatcher { + constructor (viewer) { + super(); + + this.viewer = viewer; + this.renderer = viewer.renderer; + + this.scene = null; + this.sceneControls = new Scene(); + + this.rotationSpeed = 200; + this.moveSpeed = 10; + this.lockElevation = false; + + this.keys = { + FORWARD: ['W'.charCodeAt(0), 38], + BACKWARD: ['S'.charCodeAt(0), 40], + LEFT: ['A'.charCodeAt(0), 37], + RIGHT: ['D'.charCodeAt(0), 39], + UP: ['R'.charCodeAt(0), 33], + DOWN: ['F'.charCodeAt(0), 34] + }; + + this.fadeFactor = 50; + this.yawDelta = 0; + this.pitchDelta = 0; + this.translationDelta = new Vector3(0, 0, 0); + this.translationWorldDelta = new Vector3(0, 0, 0); + + this.tweens = []; + + let drag = (e) => { + if (e.drag.object !== null) { + return; + } + + if (e.drag.startHandled === undefined) { + e.drag.startHandled = true; + + this.dispatchEvent({type: 'start'}); + } + + let moveSpeed = this.viewer.getMoveSpeed(); + + let ndrag = { + x: e.drag.lastDrag.x / this.renderer.domElement.clientWidth, + y: e.drag.lastDrag.y / this.renderer.domElement.clientHeight + }; + + if (e.drag.mouse === MOUSE$1.LEFT) { + this.yawDelta += ndrag.x * this.rotationSpeed; + this.pitchDelta += ndrag.y * this.rotationSpeed; + } else if (e.drag.mouse === MOUSE$1.RIGHT) { + this.translationDelta.x -= ndrag.x * moveSpeed * 100; + this.translationDelta.z += ndrag.y * moveSpeed * 100; + } + }; + + let drop = e => { + this.dispatchEvent({type: 'end'}); + }; + + let scroll = (e) => { + let speed = this.viewer.getMoveSpeed(); + + if (e.delta < 0) { + speed = speed * 0.9; + } else if (e.delta > 0) { + speed = speed / 0.9; + } + + speed = Math.max(speed, 0.1); + + this.viewer.setMoveSpeed(speed); + }; + + let dblclick = (e) => { + this.zoomToLocation(e.mouse); + }; + + this.addEventListener('drag', drag); + this.addEventListener('drop', drop); + this.addEventListener('mousewheel', scroll); + this.addEventListener('dblclick', dblclick); + } + + setScene (scene) { + this.scene = scene; + } + + stop(){ + this.yawDelta = 0; + this.pitchDelta = 0; + this.translationDelta.set(0, 0, 0); + } + + zoomToLocation(mouse){ + let camera = this.scene.getActiveCamera(); + + let I = Utils.getMousePointCloudIntersection( + mouse, + camera, + this.viewer, + this.scene.pointclouds); + + if (I === null) { + return; + } + + let targetRadius = 0; + { + let minimumJumpDistance = 0.2; + + let domElement = this.renderer.domElement; + let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); + + let nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray); + let lastNode = nodes[nodes.length - 1]; + let radius = lastNode.getBoundingSphere(new Sphere()).radius; + targetRadius = Math.min(this.scene.view.radius, radius); + targetRadius = Math.max(minimumJumpDistance, targetRadius); + } + + let d = this.scene.view.direction.multiplyScalar(-1); + let cameraTargetPosition = new Vector3().addVectors(I.location, d.multiplyScalar(targetRadius)); + // TODO Unused: let controlsTargetPosition = I.location; + + let animationDuration = 600; + let easing = TWEEN.Easing.Quartic.Out; + + { // animate + let value = {x: 0}; + let tween = new TWEEN.Tween(value).to({x: 1}, animationDuration); + tween.easing(easing); + this.tweens.push(tween); + + let startPos = this.scene.view.position.clone(); + let targetPos = cameraTargetPosition.clone(); + let startRadius = this.scene.view.radius; + let targetRadius = cameraTargetPosition.distanceTo(I.location); + + tween.onUpdate(() => { + let t = value.x; + this.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x; + this.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y; + this.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z; + + this.scene.view.radius = (1 - t) * startRadius + t * targetRadius; + this.viewer.setMoveSpeed(this.scene.view.radius / 2.5); + }); + + tween.onComplete(() => { + this.tweens = this.tweens.filter(e => e !== tween); + }); + + tween.start(); + } + } + + update (delta) { + let view = this.scene.view; + + { // cancel move animations on user input + let changes = [ this.yawDelta, + this.pitchDelta, + this.translationDelta.length(), + this.translationWorldDelta.length() ]; + let changeHappens = changes.some(e => Math.abs(e) > 0.001); + if (changeHappens && this.tweens.length > 0) { + this.tweens.forEach(e => e.stop()); + this.tweens = []; + } + } + + { // accelerate while input is given + let ih = this.viewer.inputHandler; + + let moveForward = this.keys.FORWARD.some(e => ih.pressedKeys[e]); + let moveBackward = this.keys.BACKWARD.some(e => ih.pressedKeys[e]); + let moveLeft = this.keys.LEFT.some(e => ih.pressedKeys[e]); + let moveRight = this.keys.RIGHT.some(e => ih.pressedKeys[e]); + let moveUp = this.keys.UP.some(e => ih.pressedKeys[e]); + let moveDown = this.keys.DOWN.some(e => ih.pressedKeys[e]); + + if(this.lockElevation){ + let dir = view.direction; + dir.z = 0; + dir.normalize(); + + if (moveForward && moveBackward) { + this.translationWorldDelta.set(0, 0, 0); + } else if (moveForward) { + this.translationWorldDelta.copy(dir.multiplyScalar(this.viewer.getMoveSpeed())); + } else if (moveBackward) { + this.translationWorldDelta.copy(dir.multiplyScalar(-this.viewer.getMoveSpeed())); + } + }else { + if (moveForward && moveBackward) { + this.translationDelta.y = 0; + } else if (moveForward) { + this.translationDelta.y = this.viewer.getMoveSpeed(); + } else if (moveBackward) { + this.translationDelta.y = -this.viewer.getMoveSpeed(); + } + } + + if (moveLeft && moveRight) { + this.translationDelta.x = 0; + } else if (moveLeft) { + this.translationDelta.x = -this.viewer.getMoveSpeed(); + } else if (moveRight) { + this.translationDelta.x = this.viewer.getMoveSpeed(); + } + + if (moveUp && moveDown) { + this.translationWorldDelta.z = 0; + } else if (moveUp) { + this.translationWorldDelta.z = this.viewer.getMoveSpeed(); + } else if (moveDown) { + this.translationWorldDelta.z = -this.viewer.getMoveSpeed(); + } + } + + { // apply rotation + let yaw = view.yaw; + let pitch = view.pitch; + + yaw -= this.yawDelta * delta; + pitch -= this.pitchDelta * delta; + + view.yaw = yaw; + view.pitch = pitch; + } + + { // apply translation + view.translate( + this.translationDelta.x * delta, + this.translationDelta.y * delta, + this.translationDelta.z * delta + ); + + view.translateWorld( + this.translationWorldDelta.x * delta, + this.translationWorldDelta.y * delta, + this.translationWorldDelta.z * delta + ); + } + + { // set view target according to speed + view.radius = 3 * this.viewer.getMoveSpeed(); + } + + { // decelerate over time + let attenuation = Math.max(0, 1 - this.fadeFactor * delta); + this.yawDelta *= attenuation; + this.pitchDelta *= attenuation; + this.translationDelta.multiplyScalar(attenuation); + this.translationWorldDelta.multiplyScalar(attenuation); + } + } + }; + + class EarthControls extends EventDispatcher { + constructor (viewer) { + super(viewer); + + this.viewer = viewer; + this.renderer = viewer.renderer; + + this.scene = null; + this.sceneControls = new Scene(); + + this.rotationSpeed = 10; + + this.fadeFactor = 20; + this.wheelDelta = 0; + this.zoomDelta = new Vector3(); + this.camStart = null; + + this.tweens = []; + + { + let sg = new SphereGeometry(1, 16, 16); + let sm = new MeshNormalMaterial(); + this.pivotIndicator = new Mesh(sg, sm); + this.pivotIndicator.visible = false; + this.sceneControls.add(this.pivotIndicator); + } + + let drag = (e) => { + if (e.drag.object !== null) { + return; + } + + if (!this.pivot) { + return; + } + + if (e.drag.startHandled === undefined) { + e.drag.startHandled = true; + + this.dispatchEvent({type: 'start'}); + } + + let camStart = this.camStart; + let camera = this.scene.getActiveCamera(); + let view = this.viewer.scene.view; + + // let camera = this.viewer.scene.camera; + let mouse = e.drag.end; + let domElement = this.viewer.renderer.domElement; + + if (e.drag.mouse === MOUSE$1.LEFT) { + + let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); + let plane = new Plane().setFromNormalAndCoplanarPoint( + new Vector3(0, 0, 1), + this.pivot); + + let distanceToPlane = ray.distanceToPlane(plane); + + if (distanceToPlane > 0) { + let I = new Vector3().addVectors( + camStart.position, + ray.direction.clone().multiplyScalar(distanceToPlane)); + + let movedBy = new Vector3().subVectors( + I, this.pivot); + + let newCamPos = camStart.position.clone().sub(movedBy); + + view.position.copy(newCamPos); + + { + let distance = newCamPos.distanceTo(this.pivot); + view.radius = distance; + let speed = view.radius / 2.5; + this.viewer.setMoveSpeed(speed); + } + } + } else if (e.drag.mouse === MOUSE$1.RIGHT) { + let ndrag = { + x: e.drag.lastDrag.x / this.renderer.domElement.clientWidth, + y: e.drag.lastDrag.y / this.renderer.domElement.clientHeight + }; + + let yawDelta = -ndrag.x * this.rotationSpeed * 0.5; + let pitchDelta = -ndrag.y * this.rotationSpeed * 0.2; + + let originalPitch = view.pitch; + let tmpView = view.clone(); + tmpView.pitch = tmpView.pitch + pitchDelta; + pitchDelta = tmpView.pitch - originalPitch; + + let pivotToCam = new Vector3().subVectors(view.position, this.pivot); + let pivotToCamTarget = new Vector3().subVectors(view.getPivot(), this.pivot); + let side = view.getSide(); + + pivotToCam.applyAxisAngle(side, pitchDelta); + pivotToCamTarget.applyAxisAngle(side, pitchDelta); + + pivotToCam.applyAxisAngle(new Vector3(0, 0, 1), yawDelta); + pivotToCamTarget.applyAxisAngle(new Vector3(0, 0, 1), yawDelta); + + let newCam = new Vector3().addVectors(this.pivot, pivotToCam); + // TODO: Unused: let newCamTarget = new THREE.Vector3().addVectors(this.pivot, pivotToCamTarget); + + view.position.copy(newCam); + view.yaw += yawDelta; + view.pitch += pitchDelta; + } + }; + + let onMouseDown = e => { + let I = Utils.getMousePointCloudIntersection( + e.mouse, + this.scene.getActiveCamera(), + this.viewer, + this.scene.pointclouds, + {pickClipped: false}); + + if (I) { + this.pivot = I.location; + this.camStart = this.scene.getActiveCamera().clone(); + this.pivotIndicator.visible = true; + this.pivotIndicator.position.copy(I.location); + } + }; + + let drop = e => { + this.dispatchEvent({type: 'end'}); + }; + + let onMouseUp = e => { + this.camStart = null; + this.pivot = null; + this.pivotIndicator.visible = false; + }; + + let scroll = (e) => { + this.wheelDelta += e.delta; + }; + + let dblclick = (e) => { + this.zoomToLocation(e.mouse); + }; + + this.addEventListener('drag', drag); + this.addEventListener('drop', drop); + this.addEventListener('mousewheel', scroll); + this.addEventListener('mousedown', onMouseDown); + this.addEventListener('mouseup', onMouseUp); + this.addEventListener('dblclick', dblclick); + } + + setScene (scene) { + this.scene = scene; + } + + stop(){ + this.wheelDelta = 0; + this.zoomDelta.set(0, 0, 0); + } + + zoomToLocation(mouse){ + let camera = this.scene.getActiveCamera(); + + let I = Utils.getMousePointCloudIntersection( + mouse, + camera, + this.viewer, + this.scene.pointclouds); + + if (I === null) { + return; + } + + let targetRadius = 0; + { + let minimumJumpDistance = 0.2; + + let domElement = this.renderer.domElement; + let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); + + let nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray); + let lastNode = nodes[nodes.length - 1]; + let radius = lastNode.getBoundingSphere(new Sphere()).radius; + targetRadius = Math.min(this.scene.view.radius, radius); + targetRadius = Math.max(minimumJumpDistance, targetRadius); + } + + let d = this.scene.view.direction.multiplyScalar(-1); + let cameraTargetPosition = new Vector3().addVectors(I.location, d.multiplyScalar(targetRadius)); + // TODO Unused: let controlsTargetPosition = I.location; + + let animationDuration = 600; + let easing = TWEEN.Easing.Quartic.Out; + + { // animate + let value = {x: 0}; + let tween = new TWEEN.Tween(value).to({x: 1}, animationDuration); + tween.easing(easing); + this.tweens.push(tween); + + let startPos = this.scene.view.position.clone(); + let targetPos = cameraTargetPosition.clone(); + let startRadius = this.scene.view.radius; + let targetRadius = cameraTargetPosition.distanceTo(I.location); + + tween.onUpdate(() => { + let t = value.x; + this.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x; + this.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y; + this.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z; + + this.scene.view.radius = (1 - t) * startRadius + t * targetRadius; + this.viewer.setMoveSpeed(this.scene.view.radius / 2.5); + }); + + tween.onComplete(() => { + this.tweens = this.tweens.filter(e => e !== tween); + }); + + tween.start(); + } + } + + update (delta) { + let view = this.scene.view; + let fade = Math.pow(0.5, this.fadeFactor * delta); + let progression = 1 - fade; + let camera = this.scene.getActiveCamera(); + + // compute zoom + if (this.wheelDelta !== 0) { + let I = Utils.getMousePointCloudIntersection( + this.viewer.inputHandler.mouse, + this.scene.getActiveCamera(), + this.viewer, + this.scene.pointclouds); + + if (I) { + let resolvedPos = new Vector3().addVectors(view.position, this.zoomDelta); + let distance = I.location.distanceTo(resolvedPos); + let jumpDistance = distance * 0.2 * this.wheelDelta; + let targetDir = new Vector3().subVectors(I.location, view.position); + targetDir.normalize(); + + resolvedPos.add(targetDir.multiplyScalar(jumpDistance)); + this.zoomDelta.subVectors(resolvedPos, view.position); + + { + let distance = resolvedPos.distanceTo(I.location); + view.radius = distance; + let speed = view.radius / 2.5; + this.viewer.setMoveSpeed(speed); + } + } + } + + // apply zoom + if (this.zoomDelta.length() !== 0) { + let p = this.zoomDelta.clone().multiplyScalar(progression); + + let newPos = new Vector3().addVectors(view.position, p); + view.position.copy(newPos); + } + + if (this.pivotIndicator.visible) { + let distance = this.pivotIndicator.position.distanceTo(view.position); + let pixelwidth = this.renderer.domElement.clientwidth; + let pixelHeight = this.renderer.domElement.clientHeight; + let pr = Utils.projectedRadius(1, camera, distance, pixelwidth, pixelHeight); + let scale = (10 / pr); + this.pivotIndicator.scale.set(scale, scale, scale); + } + + // decelerate over time + { + this.zoomDelta.multiplyScalar(fade); + this.wheelDelta = 0; + } + } + }; + + /** + * @author chrisl / Geodan + * + * adapted from Potree.FirstPersonControls by + * + * @author mschuetz / http://mschuetz.at + * + * and THREE.DeviceOrientationControls by + * + * @author richt / http://richt.me + * @author WestLangley / http://github.com/WestLangley + * + * + * + */ + + class DeviceOrientationControls extends EventDispatcher{ + constructor(viewer){ + super(); + + this.viewer = viewer; + this.renderer = viewer.renderer; + + this.scene = null; + this.sceneControls = new Scene(); + + this.screenOrientation = window.orientation || 0; + + let deviceOrientationChange = e => { + this.deviceOrientation = e; + }; + + let screenOrientationChange = e => { + this.screenOrientation = window.orientation || 0; + }; + + if ('ondeviceorientationabsolute' in window) { + window.addEventListener('deviceorientationabsolute', deviceOrientationChange); + } else if ('ondeviceorientation' in window) { + window.addEventListener('deviceorientation', deviceOrientationChange); + } else { + console.warn("No device orientation found."); + } + // window.addEventListener('deviceorientation', deviceOrientationChange); + window.addEventListener('orientationchange', screenOrientationChange); + } + + setScene (scene) { + this.scene = scene; + } + + update (delta) { + let computeQuaternion = function (alpha, beta, gamma, orient) { + let quaternion = new Quaternion(); + + let zee = new Vector3(0, 0, 1); + let euler = new Euler(); + let q0 = new Quaternion(); + + euler.set(beta, gamma, alpha, 'ZXY'); + quaternion.setFromEuler(euler); + quaternion.multiply(q0.setFromAxisAngle(zee, -orient)); + + return quaternion; + }; + + if (typeof this.deviceOrientation !== 'undefined') { + let alpha = this.deviceOrientation.alpha ? MathUtils.degToRad(this.deviceOrientation.alpha) : 0; + let beta = this.deviceOrientation.beta ? MathUtils.degToRad(this.deviceOrientation.beta) : 0; + let gamma = this.deviceOrientation.gamma ? MathUtils.degToRad(this.deviceOrientation.gamma) : 0; + let orient = this.screenOrientation ? MathUtils.degToRad(this.screenOrientation) : 0; + + let quaternion = computeQuaternion(alpha, beta, gamma, orient); + viewer.scene.cameraP.quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w); + } + } + }; + + var GLTFLoader = ( function () { + + function GLTFLoader( manager ) { + + Loader.call( this, manager ); + + this.dracoLoader = null; + this.ddsLoader = null; + this.ktx2Loader = null; + this.meshoptDecoder = null; + + this.pluginCallbacks = []; + + this.register( function ( parser ) { + + return new GLTFMaterialsClearcoatExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureBasisUExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureWebPExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsTransmissionExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFLightsExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMeshoptCompression( parser ); + + } ); + + } + + GLTFLoader.prototype = Object.assign( Object.create( Loader.prototype ), { + + constructor: GLTFLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var resourcePath; + + if ( this.resourcePath !== '' ) { + + resourcePath = this.resourcePath; + + } else if ( this.path !== '' ) { + + resourcePath = this.path; + + } else { + + resourcePath = LoaderUtils.extractUrlBase( url ); + + } + + // Tells the LoadingManager to track an extra item, which resolves after + // the model is fully loaded. This means the count of items loaded will + // be incorrect, but ensures manager.onLoad() does not fire early. + this.manager.itemStart( url ); + + var _onError = function ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + }; + + var loader = new FileLoader( this.manager ); + + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + + loader.load( url, function ( data ) { + + try { + + scope.parse( data, resourcePath, function ( gltf ) { + + onLoad( gltf ); + + scope.manager.itemEnd( url ); + + }, _onError ); + + } catch ( e ) { + + _onError( e ); + + } + + }, onProgress, _onError ); + + }, + + setDRACOLoader: function ( dracoLoader ) { + + this.dracoLoader = dracoLoader; + return this; + + }, + + setDDSLoader: function ( ddsLoader ) { + + this.ddsLoader = ddsLoader; + return this; + + }, + + setKTX2Loader: function ( ktx2Loader ) { + + this.ktx2Loader = ktx2Loader; + return this; + + }, + + setMeshoptDecoder: function ( meshoptDecoder ) { + + this.meshoptDecoder = meshoptDecoder; + return this; + + }, + + register: function ( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) === - 1 ) { + + this.pluginCallbacks.push( callback ); + + } + + return this; + + }, + + unregister: function ( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) { + + this.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 ); + + } + + return this; + + }, + + parse: function ( data, path, onLoad, onError ) { + + var content; + var extensions = {}; + var plugins = {}; + + if ( typeof data === 'string' ) { + + content = data; + + } else { + + var magic = LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) ); + + if ( magic === BINARY_EXTENSION_HEADER_MAGIC ) { + + try { + + extensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data ); + + } catch ( error ) { + + if ( onError ) onError( error ); + return; + + } + + content = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content; + + } else { + + content = LoaderUtils.decodeText( new Uint8Array( data ) ); + + } + + } + + var json = JSON.parse( content ); + + if ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) { + + if ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) ); + return; + + } + + var parser = new GLTFParser( json, { + + path: path || this.resourcePath || '', + crossOrigin: this.crossOrigin, + manager: this.manager, + ktx2Loader: this.ktx2Loader, + meshoptDecoder: this.meshoptDecoder + + } ); + + parser.fileLoader.setRequestHeader( this.requestHeader ); + + for ( var i = 0; i < this.pluginCallbacks.length; i ++ ) { + + var plugin = this.pluginCallbacks[ i ]( parser ); + plugins[ plugin.name ] = plugin; + + // Workaround to avoid determining as unknown extension + // in addUnknownExtensionsToUserData(). + // Remove this workaround if we move all the existing + // extension handlers to plugin system + extensions[ plugin.name ] = true; + + } + + if ( json.extensionsUsed ) { + + for ( var i = 0; i < json.extensionsUsed.length; ++ i ) { + + var extensionName = json.extensionsUsed[ i ]; + var extensionsRequired = json.extensionsRequired || []; + + switch ( extensionName ) { + + case EXTENSIONS.KHR_MATERIALS_UNLIT: + extensions[ extensionName ] = new GLTFMaterialsUnlitExtension(); + break; + + case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: + extensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension(); + break; + + case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: + extensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader ); + break; + + case EXTENSIONS.MSFT_TEXTURE_DDS: + extensions[ extensionName ] = new GLTFTextureDDSExtension( this.ddsLoader ); + break; + + case EXTENSIONS.KHR_TEXTURE_TRANSFORM: + extensions[ extensionName ] = new GLTFTextureTransformExtension(); + break; + + case EXTENSIONS.KHR_MESH_QUANTIZATION: + extensions[ extensionName ] = new GLTFMeshQuantizationExtension(); + break; + + default: + + if ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) { + + console.warn( 'THREE.GLTFLoader: Unknown extension "' + extensionName + '".' ); + + } + + } + + } + + } + + parser.setExtensions( extensions ); + parser.setPlugins( plugins ); + parser.parse( onLoad, onError ); + + } + + } ); + + /* GLTFREGISTRY */ + + function GLTFRegistry() { + + var objects = {}; + + return { + + get: function ( key ) { + + return objects[ key ]; + + }, + + add: function ( key, object ) { + + objects[ key ] = object; + + }, + + remove: function ( key ) { + + delete objects[ key ]; + + }, + + removeAll: function () { + + objects = {}; + + } + + }; + + } + + /*********************************/ + /********** EXTENSIONS ***********/ + /*********************************/ + + var EXTENSIONS = { + KHR_BINARY_GLTF: 'KHR_binary_glTF', + KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression', + KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual', + KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat', + KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness', + KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission', + KHR_MATERIALS_UNLIT: 'KHR_materials_unlit', + KHR_TEXTURE_BASISU: 'KHR_texture_basisu', + KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform', + KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization', + EXT_TEXTURE_WEBP: 'EXT_texture_webp', + EXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression', + MSFT_TEXTURE_DDS: 'MSFT_texture_dds' + }; + + /** + * DDS Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/MSFT_texture_dds + * + */ + function GLTFTextureDDSExtension( ddsLoader ) { + + if ( ! ddsLoader ) { + + throw new Error( 'THREE.GLTFLoader: Attempting to load .dds texture without importing DDSLoader' ); + + } + + this.name = EXTENSIONS.MSFT_TEXTURE_DDS; + this.ddsLoader = ddsLoader; + + } + + /** + * Punctual Lights Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual + */ + function GLTFLightsExtension( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; + + // Object3D instance caches + this.cache = { refs: {}, uses: {} }; + + } + + GLTFLightsExtension.prototype._markDefs = function () { + + var parser = this.parser; + var nodeDefs = this.parser.json.nodes || []; + + for ( var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { + + var nodeDef = nodeDefs[ nodeIndex ]; + + if ( nodeDef.extensions + && nodeDef.extensions[ this.name ] + && nodeDef.extensions[ this.name ].light !== undefined ) { + + parser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light ); + + } + + } + + }; + + GLTFLightsExtension.prototype._loadLight = function ( lightIndex ) { + + var parser = this.parser; + var cacheKey = 'light:' + lightIndex; + var dependency = parser.cache.get( cacheKey ); + + if ( dependency ) return dependency; + + var json = parser.json; + var extensions = ( json.extensions && json.extensions[ this.name ] ) || {}; + var lightDefs = extensions.lights || []; + var lightDef = lightDefs[ lightIndex ]; + var lightNode; + + var color = new Color( 0xffffff ); + + if ( lightDef.color !== undefined ) color.fromArray( lightDef.color ); + + var range = lightDef.range !== undefined ? lightDef.range : 0; + + switch ( lightDef.type ) { + + case 'directional': + lightNode = new DirectionalLight( color ); + lightNode.target.position.set( 0, 0, - 1 ); + lightNode.add( lightNode.target ); + break; + + case 'point': + lightNode = new PointLight( color ); + lightNode.distance = range; + break; + + case 'spot': + lightNode = new SpotLight( color ); + lightNode.distance = range; + // Handle spotlight properties. + lightDef.spot = lightDef.spot || {}; + lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0; + lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0; + lightNode.angle = lightDef.spot.outerConeAngle; + lightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; + lightNode.target.position.set( 0, 0, - 1 ); + lightNode.add( lightNode.target ); + break; + + default: + throw new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type ); + + } + + // Some lights (e.g. spot) default to a position other than the origin. Reset the position + // here, because node-level parsing will only override position if explicitly specified. + lightNode.position.set( 0, 0, 0 ); + + lightNode.decay = 2; + + if ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity; + + lightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) ); + + dependency = Promise.resolve( lightNode ); + + parser.cache.add( cacheKey, dependency ); + + return dependency; + + }; + + GLTFLightsExtension.prototype.createNodeAttachment = function ( nodeIndex ) { + + var self = this; + var parser = this.parser; + var json = parser.json; + var nodeDef = json.nodes[ nodeIndex ]; + var lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {}; + var lightIndex = lightDef.light; + + if ( lightIndex === undefined ) return null; + + return this._loadLight( lightIndex ).then( function ( light ) { + + return parser._getNodeRef( self.cache, lightIndex, light ); + + } ); + + }; + + /** + * Unlit Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit + */ + function GLTFMaterialsUnlitExtension() { + + this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; + + } + + GLTFMaterialsUnlitExtension.prototype.getMaterialType = function () { + + return MeshBasicMaterial; + + }; + + GLTFMaterialsUnlitExtension.prototype.extendParams = function ( materialParams, materialDef, parser ) { + + var pending = []; + + materialParams.color = new Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + var metallicRoughness = materialDef.pbrMetallicRoughness; + + if ( metallicRoughness ) { + + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { + + var array = metallicRoughness.baseColorFactor; + + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; + + } + + if ( metallicRoughness.baseColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); + + } + + } + + return Promise.all( pending ); + + }; + + /** + * Clearcoat Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat + */ + function GLTFMaterialsClearcoatExtension( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT; + + } + + GLTFMaterialsClearcoatExtension.prototype.getMaterialType = function ( materialIndex ) { + + var parser = this.parser; + var materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + }; + + GLTFMaterialsClearcoatExtension.prototype.extendMaterialParams = function ( materialIndex, materialParams ) { + + var parser = this.parser; + var materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + var pending = []; + + var extension = materialDef.extensions[ this.name ]; + + if ( extension.clearcoatFactor !== undefined ) { + + materialParams.clearcoat = extension.clearcoatFactor; + + } + + if ( extension.clearcoatTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) ); + + } + + if ( extension.clearcoatRoughnessFactor !== undefined ) { + + materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor; + + } + + if ( extension.clearcoatRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) ); + + } + + if ( extension.clearcoatNormalTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) ); + + if ( extension.clearcoatNormalTexture.scale !== undefined ) { + + var scale = extension.clearcoatNormalTexture.scale; + + materialParams.clearcoatNormalScale = new Vector2( scale, scale ); + + } + + } + + return Promise.all( pending ); + + }; + + /** + * Transmission Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission + * Draft: https://github.com/KhronosGroup/glTF/pull/1698 + */ + function GLTFMaterialsTransmissionExtension( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION; + + } + + GLTFMaterialsTransmissionExtension.prototype.getMaterialType = function ( materialIndex ) { + + var parser = this.parser; + var materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + }; + + GLTFMaterialsTransmissionExtension.prototype.extendMaterialParams = function ( materialIndex, materialParams ) { + + var parser = this.parser; + var materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + var pending = []; + + var extension = materialDef.extensions[ this.name ]; + + if ( extension.transmissionFactor !== undefined ) { + + materialParams.transmission = extension.transmissionFactor; + + } + + if ( extension.transmissionTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) ); + + } + + return Promise.all( pending ); + + }; + + /** + * BasisU Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu + */ + function GLTFTextureBasisUExtension( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_TEXTURE_BASISU; + + } + + GLTFTextureBasisUExtension.prototype.loadTexture = function ( textureIndex ) { + + var parser = this.parser; + var json = parser.json; + + var textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) { + + return null; + + } + + var extension = textureDef.extensions[ this.name ]; + var source = json.images[ extension.source ]; + var loader = parser.options.ktx2Loader; + + if ( ! loader ) { + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' ); + + } else { + + // Assumes that the extension is optional and that a fallback texture is present + return null; + + } + + } + + return parser.loadTextureImage( textureIndex, source, loader ); + + }; + + /** + * WebP Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp + */ + function GLTFTextureWebPExtension( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.EXT_TEXTURE_WEBP; + this.isSupported = null; + + } + + GLTFTextureWebPExtension.prototype.loadTexture = function ( textureIndex ) { + + var name = this.name; + var parser = this.parser; + var json = parser.json; + + var textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) { + + return null; + + } + + var extension = textureDef.extensions[ name ]; + var source = json.images[ extension.source ]; + var loader = source.uri ? parser.options.manager.getHandler( source.uri ) : parser.textureLoader; + + return this.detectSupport().then( function ( isSupported ) { + + if ( isSupported ) return parser.loadTextureImage( textureIndex, source, loader ); + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' ); + + } + + // Fall back to PNG or JPEG. + return parser.loadTexture( textureIndex ); + + } ); + + }; + + GLTFTextureWebPExtension.prototype.detectSupport = function () { + + if ( ! this.isSupported ) { + + this.isSupported = new Promise( function ( resolve ) { + + var image = new Image(); + + // Lossy test image. Support for lossy images doesn't guarantee support for all + // WebP images, unfortunately. + image.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA'; + + image.onload = image.onerror = function () { + + resolve( image.height === 1 ); + + }; + + } ); + + } + + return this.isSupported; + + }; + + /** + * meshopt BufferView Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression + */ + function GLTFMeshoptCompression( parser ) { + + this.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION; + this.parser = parser; + + } + + GLTFMeshoptCompression.prototype.loadBufferView = function ( index ) { + + var json = this.parser.json; + var bufferView = json.bufferViews[ index ]; + + if ( bufferView.extensions && bufferView.extensions[ this.name ] ) { + + var extensionDef = bufferView.extensions[ this.name ]; + + var buffer = this.parser.getDependency( 'buffer', extensionDef.buffer ); + var decoder = this.parser.options.meshoptDecoder; + + if ( ! decoder || ! decoder.supported ) { + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' ); + + } else { + + // Assumes that the extension is optional and that fallback buffer data is present + return null; + + } + + } + + return Promise.all( [ buffer, decoder.ready ] ).then( function ( res ) { + + var byteOffset = extensionDef.byteOffset || 0; + var byteLength = extensionDef.byteLength || 0; + + var count = extensionDef.count; + var stride = extensionDef.byteStride; + + var result = new ArrayBuffer( count * stride ); + var source = new Uint8Array( res[ 0 ], byteOffset, byteLength ); + + decoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter ); + return result; + + } ); + + } else { + + return null; + + } + + }; + + /* BINARY EXTENSION */ + var BINARY_EXTENSION_HEADER_MAGIC = 'glTF'; + var BINARY_EXTENSION_HEADER_LENGTH = 12; + var BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 }; + + function GLTFBinaryExtension( data ) { + + this.name = EXTENSIONS.KHR_BINARY_GLTF; + this.content = null; + this.body = null; + + var headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH ); + + this.header = { + magic: LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ), + version: headerView.getUint32( 4, true ), + length: headerView.getUint32( 8, true ) + }; + + if ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) { + + throw new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' ); + + } else if ( this.header.version < 2.0 ) { + + throw new Error( 'THREE.GLTFLoader: Legacy binary file detected.' ); + + } + + var chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH ); + var chunkIndex = 0; + + while ( chunkIndex < chunkView.byteLength ) { + + var chunkLength = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + var chunkType = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) { + + var contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength ); + this.content = LoaderUtils.decodeText( contentArray ); + + } else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) { + + var byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; + this.body = data.slice( byteOffset, byteOffset + chunkLength ); + + } + + // Clients must ignore chunks with unknown types. + + chunkIndex += chunkLength; + + } + + if ( this.content === null ) { + + throw new Error( 'THREE.GLTFLoader: JSON content not found.' ); + + } + + } + + /** + * DRACO Mesh Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression + */ + function GLTFDracoMeshCompressionExtension( json, dracoLoader ) { + + if ( ! dracoLoader ) { + + throw new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' ); + + } + + this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; + this.json = json; + this.dracoLoader = dracoLoader; + this.dracoLoader.preload(); + + } + + GLTFDracoMeshCompressionExtension.prototype.decodePrimitive = function ( primitive, parser ) { + + var json = this.json; + var dracoLoader = this.dracoLoader; + var bufferViewIndex = primitive.extensions[ this.name ].bufferView; + var gltfAttributeMap = primitive.extensions[ this.name ].attributes; + var threeAttributeMap = {}; + var attributeNormalizedMap = {}; + var attributeTypeMap = {}; + + for ( var attributeName in gltfAttributeMap ) { + + var threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + threeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ]; + + } + + for ( attributeName in primitive.attributes ) { + + var threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + if ( gltfAttributeMap[ attributeName ] !== undefined ) { + + var accessorDef = json.accessors[ primitive.attributes[ attributeName ] ]; + var componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + + attributeTypeMap[ threeAttributeName ] = componentType; + attributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true; + + } + + } + + return parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) { + + return new Promise( function ( resolve ) { + + dracoLoader.decodeDracoFile( bufferView, function ( geometry ) { + + for ( var attributeName in geometry.attributes ) { + + var attribute = geometry.attributes[ attributeName ]; + var normalized = attributeNormalizedMap[ attributeName ]; + + if ( normalized !== undefined ) attribute.normalized = normalized; + + } + + resolve( geometry ); + + }, threeAttributeMap, attributeTypeMap ); + + } ); + + } ); + + }; + + /** + * Texture Transform Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform + */ + function GLTFTextureTransformExtension() { + + this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; + + } + + GLTFTextureTransformExtension.prototype.extendTexture = function ( texture, transform ) { + + texture = texture.clone(); + + if ( transform.offset !== undefined ) { + + texture.offset.fromArray( transform.offset ); + + } + + if ( transform.rotation !== undefined ) { + + texture.rotation = transform.rotation; + + } + + if ( transform.scale !== undefined ) { + + texture.repeat.fromArray( transform.scale ); + + } + + if ( transform.texCoord !== undefined ) { + + console.warn( 'THREE.GLTFLoader: Custom UV sets in "' + this.name + '" extension not yet supported.' ); + + } + + texture.needsUpdate = true; + + return texture; + + }; + + /** + * Specular-Glossiness Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness + */ + + /** + * A sub class of StandardMaterial with some of the functionality + * changed via the `onBeforeCompile` callback + * @pailhead + */ + + function GLTFMeshStandardSGMaterial( params ) { + + MeshStandardMaterial.call( this ); + + this.isGLTFSpecularGlossinessMaterial = true; + + //various chunks that need replacing + var specularMapParsFragmentChunk = [ + '#ifdef USE_SPECULARMAP', + ' uniform sampler2D specularMap;', + '#endif' + ].join( '\n' ); + + var glossinessMapParsFragmentChunk = [ + '#ifdef USE_GLOSSINESSMAP', + ' uniform sampler2D glossinessMap;', + '#endif' + ].join( '\n' ); + + var specularMapFragmentChunk = [ + 'vec3 specularFactor = specular;', + '#ifdef USE_SPECULARMAP', + ' vec4 texelSpecular = texture2D( specularMap, vUv );', + ' texelSpecular = sRGBToLinear( texelSpecular );', + ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' specularFactor *= texelSpecular.rgb;', + '#endif' + ].join( '\n' ); + + var glossinessMapFragmentChunk = [ + 'float glossinessFactor = glossiness;', + '#ifdef USE_GLOSSINESSMAP', + ' vec4 texelGlossiness = texture2D( glossinessMap, vUv );', + ' // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' glossinessFactor *= texelGlossiness.a;', + '#endif' + ].join( '\n' ); + + var lightPhysicalFragmentChunk = [ + 'PhysicalMaterial material;', + 'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );', + 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );', + 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );', + 'material.specularRoughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.', + 'material.specularRoughness += geometryRoughness;', + 'material.specularRoughness = min( material.specularRoughness, 1.0 );', + 'material.specularColor = specularFactor;', + ].join( '\n' ); + + var uniforms = { + specular: { value: new Color().setHex( 0xffffff ) }, + glossiness: { value: 1 }, + specularMap: { value: null }, + glossinessMap: { value: null } + }; + + this._extraUniforms = uniforms; + + this.onBeforeCompile = function ( shader ) { + + for ( var uniformName in uniforms ) { + + shader.uniforms[ uniformName ] = uniforms[ uniformName ]; + + } + + shader.fragmentShader = shader.fragmentShader + .replace( 'uniform float roughness;', 'uniform vec3 specular;' ) + .replace( 'uniform float metalness;', 'uniform float glossiness;' ) + .replace( '#include ', specularMapParsFragmentChunk ) + .replace( '#include ', glossinessMapParsFragmentChunk ) + .replace( '#include ', specularMapFragmentChunk ) + .replace( '#include ', glossinessMapFragmentChunk ) + .replace( '#include ', lightPhysicalFragmentChunk ); + + }; + + Object.defineProperties( this, { + + specular: { + get: function () { + + return uniforms.specular.value; + + }, + set: function ( v ) { + + uniforms.specular.value = v; + + } + }, + + specularMap: { + get: function () { + + return uniforms.specularMap.value; + + }, + set: function ( v ) { + + uniforms.specularMap.value = v; + + if ( v ) { + + this.defines.USE_SPECULARMAP = ''; // USE_UV is set by the renderer for specular maps + + } else { + + delete this.defines.USE_SPECULARMAP; + + } + + } + }, + + glossiness: { + get: function () { + + return uniforms.glossiness.value; + + }, + set: function ( v ) { + + uniforms.glossiness.value = v; + + } + }, + + glossinessMap: { + get: function () { + + return uniforms.glossinessMap.value; + + }, + set: function ( v ) { + + uniforms.glossinessMap.value = v; + + if ( v ) { + + this.defines.USE_GLOSSINESSMAP = ''; + this.defines.USE_UV = ''; + + } else { + + delete this.defines.USE_GLOSSINESSMAP; + delete this.defines.USE_UV; + + } + + } + } + + } ); + + delete this.metalness; + delete this.roughness; + delete this.metalnessMap; + delete this.roughnessMap; + + this.setValues( params ); + + } + + GLTFMeshStandardSGMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + GLTFMeshStandardSGMaterial.prototype.constructor = GLTFMeshStandardSGMaterial; + + GLTFMeshStandardSGMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + this.specularMap = source.specularMap; + this.specular.copy( source.specular ); + this.glossinessMap = source.glossinessMap; + this.glossiness = source.glossiness; + delete this.metalness; + delete this.roughness; + delete this.metalnessMap; + delete this.roughnessMap; + return this; + + }; + + function GLTFMaterialsPbrSpecularGlossinessExtension() { + + return { + + name: EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS, + + specularGlossinessParams: [ + 'color', + 'map', + 'lightMap', + 'lightMapIntensity', + 'aoMap', + 'aoMapIntensity', + 'emissive', + 'emissiveIntensity', + 'emissiveMap', + 'bumpMap', + 'bumpScale', + 'normalMap', + 'normalMapType', + 'displacementMap', + 'displacementScale', + 'displacementBias', + 'specularMap', + 'specular', + 'glossinessMap', + 'glossiness', + 'alphaMap', + 'envMap', + 'envMapIntensity', + 'refractionRatio', + ], + + getMaterialType: function () { + + return GLTFMeshStandardSGMaterial; + + }, + + extendParams: function ( materialParams, materialDef, parser ) { + + var pbrSpecularGlossiness = materialDef.extensions[ this.name ]; + + materialParams.color = new Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + var pending = []; + + if ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) { + + var array = pbrSpecularGlossiness.diffuseFactor; + + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; + + } + + if ( pbrSpecularGlossiness.diffuseTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) ); + + } + + materialParams.emissive = new Color( 0.0, 0.0, 0.0 ); + materialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0; + materialParams.specular = new Color( 1.0, 1.0, 1.0 ); + + if ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) { + + materialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor ); + + } + + if ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) { + + var specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture; + pending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) ); + pending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) ); + + } + + return Promise.all( pending ); + + }, + + createMaterial: function ( materialParams ) { + + var material = new GLTFMeshStandardSGMaterial( materialParams ); + material.fog = true; + + material.color = materialParams.color; + + material.map = materialParams.map === undefined ? null : materialParams.map; + + material.lightMap = null; + material.lightMapIntensity = 1.0; + + material.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap; + material.aoMapIntensity = 1.0; + + material.emissive = materialParams.emissive; + material.emissiveIntensity = 1.0; + material.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap; + + material.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap; + material.bumpScale = 1; + + material.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap; + material.normalMapType = TangentSpaceNormalMap; + + if ( materialParams.normalScale ) material.normalScale = materialParams.normalScale; + + material.displacementMap = null; + material.displacementScale = 1; + material.displacementBias = 0; + + material.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap; + material.specular = materialParams.specular; + + material.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap; + material.glossiness = materialParams.glossiness; + + material.alphaMap = null; + + material.envMap = materialParams.envMap === undefined ? null : materialParams.envMap; + material.envMapIntensity = 1.0; + + material.refractionRatio = 0.98; + + return material; + + }, + + }; + + } + + /** + * Mesh Quantization Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization + */ + function GLTFMeshQuantizationExtension() { + + this.name = EXTENSIONS.KHR_MESH_QUANTIZATION; + + } + + /*********************************/ + /********** INTERPOLATION ********/ + /*********************************/ + + // Spline Interpolation + // Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation + function GLTFCubicSplineInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + GLTFCubicSplineInterpolant.prototype = Object.create( Interpolant.prototype ); + GLTFCubicSplineInterpolant.prototype.constructor = GLTFCubicSplineInterpolant; + + GLTFCubicSplineInterpolant.prototype.copySampleValue_ = function ( index ) { + + // Copies a sample value to the result buffer. See description of glTF + // CUBICSPLINE values layout in interpolate_() function below. + + var result = this.resultBuffer, + values = this.sampleValues, + valueSize = this.valueSize, + offset = index * valueSize * 3 + valueSize; + + for ( var i = 0; i !== valueSize; i ++ ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }; + + GLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; + + GLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; + + GLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer; + var values = this.sampleValues; + var stride = this.valueSize; + + var stride2 = stride * 2; + var stride3 = stride * 3; + + var td = t1 - t0; + + var p = ( t - t0 ) / td; + var pp = p * p; + var ppp = pp * p; + + var offset1 = i1 * stride3; + var offset0 = offset1 - stride3; + + var s2 = - 2 * ppp + 3 * pp; + var s3 = ppp - pp; + var s0 = 1 - s2; + var s1 = s3 - pp + p; + + // Layout of keyframe output values for CUBICSPLINE animations: + // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] + for ( var i = 0; i !== stride; i ++ ) { + + var p0 = values[ offset0 + i + stride ]; // splineVertex_k + var m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k) + var p1 = values[ offset1 + i + stride ]; // splineVertex_k+1 + var m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k) + + result[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; + + } + + return result; + + }; + + /*********************************/ + /********** INTERNALS ************/ + /*********************************/ + + /* CONSTANTS */ + + var WEBGL_CONSTANTS = { + FLOAT: 5126, + //FLOAT_MAT2: 35674, + FLOAT_MAT3: 35675, + FLOAT_MAT4: 35676, + FLOAT_VEC2: 35664, + FLOAT_VEC3: 35665, + FLOAT_VEC4: 35666, + LINEAR: 9729, + REPEAT: 10497, + SAMPLER_2D: 35678, + POINTS: 0, + LINES: 1, + LINE_LOOP: 2, + LINE_STRIP: 3, + TRIANGLES: 4, + TRIANGLE_STRIP: 5, + TRIANGLE_FAN: 6, + UNSIGNED_BYTE: 5121, + UNSIGNED_SHORT: 5123 + }; + + var WEBGL_COMPONENT_TYPES = { + 5120: Int8Array, + 5121: Uint8Array, + 5122: Int16Array, + 5123: Uint16Array, + 5125: Uint32Array, + 5126: Float32Array + }; + + var WEBGL_FILTERS = { + 9728: NearestFilter, + 9729: LinearFilter, + 9984: NearestMipmapNearestFilter, + 9985: LinearMipmapNearestFilter, + 9986: NearestMipmapLinearFilter, + 9987: LinearMipmapLinearFilter + }; + + var WEBGL_WRAPPINGS = { + 33071: ClampToEdgeWrapping, + 33648: MirroredRepeatWrapping, + 10497: RepeatWrapping + }; + + var WEBGL_TYPE_SIZES = { + 'SCALAR': 1, + 'VEC2': 2, + 'VEC3': 3, + 'VEC4': 4, + 'MAT2': 4, + 'MAT3': 9, + 'MAT4': 16 + }; + + var ATTRIBUTES = { + POSITION: 'position', + NORMAL: 'normal', + TANGENT: 'tangent', + TEXCOORD_0: 'uv', + TEXCOORD_1: 'uv2', + COLOR_0: 'color', + WEIGHTS_0: 'skinWeight', + JOINTS_0: 'skinIndex', + }; + + var PATH_PROPERTIES = { + scale: 'scale', + translation: 'position', + rotation: 'quaternion', + weights: 'morphTargetInfluences' + }; + + var INTERPOLATION = { + CUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each + // keyframe track will be initialized with a default interpolation type, then modified. + LINEAR: InterpolateLinear, + STEP: InterpolateDiscrete + }; + + var ALPHA_MODES = { + OPAQUE: 'OPAQUE', + MASK: 'MASK', + BLEND: 'BLEND' + }; + + /* UTILITY FUNCTIONS */ + + function resolveURL( url, path ) { + + // Invalid URL + if ( typeof url !== 'string' || url === '' ) return ''; + + // Host Relative URL + if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) { + + path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' ); + + } + + // Absolute URL http://,https://,// + if ( /^(https?:)?\/\//i.test( url ) ) return url; + + // Data URI + if ( /^data:.*,.*$/i.test( url ) ) return url; + + // Blob URL + if ( /^blob:.*$/i.test( url ) ) return url; + + // Relative URL + return path + url; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material + */ + function createDefaultMaterial( cache ) { + + if ( cache[ 'DefaultMaterial' ] === undefined ) { + + cache[ 'DefaultMaterial' ] = new MeshStandardMaterial( { + color: 0xFFFFFF, + emissive: 0x000000, + metalness: 1, + roughness: 1, + transparent: false, + depthTest: true, + side: FrontSide + } ); + + } + + return cache[ 'DefaultMaterial' ]; + + } + + function addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) { + + // Add unknown glTF extensions to an object's userData. + + for ( var name in objectDef.extensions ) { + + if ( knownExtensions[ name ] === undefined ) { + + object.userData.gltfExtensions = object.userData.gltfExtensions || {}; + object.userData.gltfExtensions[ name ] = objectDef.extensions[ name ]; + + } + + } + + } + + /** + * @param {Object3D|Material|BufferGeometry} object + * @param {GLTF.definition} gltfDef + */ + function assignExtrasToUserData( object, gltfDef ) { + + if ( gltfDef.extras !== undefined ) { + + if ( typeof gltfDef.extras === 'object' ) { + + Object.assign( object.userData, gltfDef.extras ); + + } else { + + console.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras ); + + } + + } + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets + * + * @param {BufferGeometry} geometry + * @param {Array} targets + * @param {GLTFParser} parser + * @return {Promise} + */ + function addMorphTargets( geometry, targets, parser ) { + + var hasMorphPosition = false; + var hasMorphNormal = false; + + for ( var i = 0, il = targets.length; i < il; i ++ ) { + + var target = targets[ i ]; + + if ( target.POSITION !== undefined ) hasMorphPosition = true; + if ( target.NORMAL !== undefined ) hasMorphNormal = true; + + if ( hasMorphPosition && hasMorphNormal ) break; + + } + + if ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry ); - var unicode = { - Space_Separator: Space_Separator, - ID_Start: ID_Start, - ID_Continue: ID_Continue - }; + var pendingPositionAccessors = []; + var pendingNormalAccessors = []; - var util = { - isSpaceSeparator (c) { - return typeof c === 'string' && unicode.Space_Separator.test(c) - }, + for ( var i = 0, il = targets.length; i < il; i ++ ) { - isIdStartChar (c) { - return typeof c === 'string' && ( - (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c === '$') || (c === '_') || - unicode.ID_Start.test(c) - ) - }, + var target = targets[ i ]; - isIdContinueChar (c) { - return typeof c === 'string' && ( - (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9') || - (c === '$') || (c === '_') || - (c === '\u200C') || (c === '\u200D') || - unicode.ID_Continue.test(c) - ) - }, + if ( hasMorphPosition ) { - isDigit (c) { - return typeof c === 'string' && /[0-9]/.test(c) - }, + var pendingAccessor = target.POSITION !== undefined + ? parser.getDependency( 'accessor', target.POSITION ) + : geometry.attributes.position; - isHexDigit (c) { - return typeof c === 'string' && /[0-9A-Fa-f]/.test(c) - }, - }; + pendingPositionAccessors.push( pendingAccessor ); - let source; - let parseState; - let stack; - let pos; - let line; - let column; - let token; - let key; - let root; + } - var parse = function parse (text, reviver) { - source = String(text); - parseState = 'start'; - stack = []; - pos = 0; - line = 1; - column = 0; - token = undefined; - key = undefined; - root = undefined; + if ( hasMorphNormal ) { - do { - token = lex(); + var pendingAccessor = target.NORMAL !== undefined + ? parser.getDependency( 'accessor', target.NORMAL ) + : geometry.attributes.normal; - // This code is unreachable. - // if (!parseStates[parseState]) { - // throw invalidParseState() - // } + pendingNormalAccessors.push( pendingAccessor ); - parseStates[parseState](); - } while (token.type !== 'eof') + } - if (typeof reviver === 'function') { - return internalize({'': root}, '', reviver) - } + } - return root - }; + return Promise.all( [ + Promise.all( pendingPositionAccessors ), + Promise.all( pendingNormalAccessors ) + ] ).then( function ( accessors ) { - function internalize (holder, name, reviver) { - const value = holder[name]; - if (value != null && typeof value === 'object') { - for (const key in value) { - const replacement = internalize(value, key, reviver); - if (replacement === undefined) { - delete value[key]; - } else { - value[key] = replacement; - } - } - } + var morphPositions = accessors[ 0 ]; + var morphNormals = accessors[ 1 ]; - return reviver.call(holder, name, value) - } + if ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions; + if ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals; + geometry.morphTargetsRelative = true; - let lexState; - let buffer; - let doubleQuote; - let sign; - let c; + return geometry; - function lex () { - lexState = 'default'; - buffer = ''; - doubleQuote = false; - sign = 1; + } ); - for (;;) { - c = peek(); + } - // This code is unreachable. - // if (!lexStates[lexState]) { - // throw invalidLexState(lexState) - // } + /** + * @param {Mesh} mesh + * @param {GLTF.Mesh} meshDef + */ + function updateMorphTargets( mesh, meshDef ) { - const token = lexStates[lexState](); - if (token) { - return token - } - } - } + mesh.updateMorphTargets(); - function peek () { - if (source[pos]) { - return String.fromCodePoint(source.codePointAt(pos)) - } - } + if ( meshDef.weights !== undefined ) { - function read () { - const c = peek(); + for ( var i = 0, il = meshDef.weights.length; i < il; i ++ ) { - if (c === '\n') { - line++; - column = 0; - } else if (c) { - column += c.length; - } else { - column++; - } + mesh.morphTargetInfluences[ i ] = meshDef.weights[ i ]; - if (c) { - pos += c.length; - } + } - return c - } + } - const lexStates = { - default () { - switch (c) { - case '\t': - case '\v': - case '\f': - case ' ': - case '\u00A0': - case '\uFEFF': - case '\n': - case '\r': - case '\u2028': - case '\u2029': - read(); - return + // .extras has user-defined data, so check that .extras.targetNames is an array. + if ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) { - case '/': - read(); - lexState = 'comment'; - return + var targetNames = meshDef.extras.targetNames; - case undefined: - read(); - return newToken('eof') - } + if ( mesh.morphTargetInfluences.length === targetNames.length ) { - if (util.isSpaceSeparator(c)) { - read(); - return - } + mesh.morphTargetDictionary = {}; - // This code is unreachable. - // if (!lexStates[parseState]) { - // throw invalidLexState(parseState) - // } + for ( var i = 0, il = targetNames.length; i < il; i ++ ) { - return lexStates[parseState]() - }, + mesh.morphTargetDictionary[ targetNames[ i ] ] = i; - comment () { - switch (c) { - case '*': - read(); - lexState = 'multiLineComment'; - return + } - case '/': - read(); - lexState = 'singleLineComment'; - return - } + } else { - throw invalidChar(read()) - }, + console.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' ); - multiLineComment () { - switch (c) { - case '*': - read(); - lexState = 'multiLineCommentAsterisk'; - return + } - case undefined: - throw invalidChar(read()) - } + } - read(); - }, + } - multiLineCommentAsterisk () { - switch (c) { - case '*': - read(); - return + function createPrimitiveKey( primitiveDef ) { - case '/': - read(); - lexState = 'default'; - return + var dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]; + var geometryKey; - case undefined: - throw invalidChar(read()) - } + if ( dracoExtension ) { - read(); - lexState = 'multiLineComment'; - }, + geometryKey = 'draco:' + dracoExtension.bufferView + + ':' + dracoExtension.indices + + ':' + createAttributesKey( dracoExtension.attributes ); - singleLineComment () { - switch (c) { - case '\n': - case '\r': - case '\u2028': - case '\u2029': - read(); - lexState = 'default'; - return + } else { - case undefined: - read(); - return newToken('eof') - } + geometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode; - read(); - }, + } - value () { - switch (c) { - case '{': - case '[': - return newToken('punctuator', read()) + return geometryKey; - case 'n': - read(); - literal('ull'); - return newToken('null', null) + } - case 't': - read(); - literal('rue'); - return newToken('boolean', true) + function createAttributesKey( attributes ) { - case 'f': - read(); - literal('alse'); - return newToken('boolean', false) + var attributesKey = ''; - case '-': - case '+': - if (read() === '-') { - sign = -1; - } + var keys = Object.keys( attributes ).sort(); - lexState = 'sign'; - return + for ( var i = 0, il = keys.length; i < il; i ++ ) { - case '.': - buffer = read(); - lexState = 'decimalPointLeading'; - return + attributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';'; - case '0': - buffer = read(); - lexState = 'zero'; - return + } - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - buffer = read(); - lexState = 'decimalInteger'; - return + return attributesKey; - case 'I': - read(); - literal('nfinity'); - return newToken('numeric', Infinity) + } - case 'N': - read(); - literal('aN'); - return newToken('numeric', NaN) + /* GLTF PARSER */ - case '"': - case "'": - doubleQuote = (read() === '"'); - buffer = ''; - lexState = 'string'; - return - } + function GLTFParser( json, options ) { - throw invalidChar(read()) - }, + this.json = json || {}; + this.extensions = {}; + this.plugins = {}; + this.options = options || {}; - identifierNameStartEscape () { - if (c !== 'u') { - throw invalidChar(read()) - } + // loader object cache + this.cache = new GLTFRegistry(); - read(); - const u = unicodeEscape(); - switch (u) { - case '$': - case '_': - break + // associations between Three.js objects and glTF elements + this.associations = new Map(); - default: - if (!util.isIdStartChar(u)) { - throw invalidIdentifier() - } + // BufferGeometry caching + this.primitiveCache = {}; - break - } + // Object3D instance caches + this.meshCache = { refs: {}, uses: {} }; + this.cameraCache = { refs: {}, uses: {} }; + this.lightCache = { refs: {}, uses: {} }; - buffer += u; - lexState = 'identifierName'; - }, + // Track node names, to ensure no duplicates + this.nodeNamesUsed = {}; - identifierName () { - switch (c) { - case '$': - case '_': - case '\u200C': - case '\u200D': - buffer += read(); - return + // Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the + // expensive work of uploading a texture to the GPU off the main thread. + if ( typeof createImageBitmap !== 'undefined' && /Firefox/.test( navigator.userAgent ) === false ) { - case '\\': - read(); - lexState = 'identifierNameEscape'; - return - } + this.textureLoader = new ImageBitmapLoader( this.options.manager ); - if (util.isIdContinueChar(c)) { - buffer += read(); - return - } + } else { - return newToken('identifier', buffer) - }, + this.textureLoader = new TextureLoader( this.options.manager ); - identifierNameEscape () { - if (c !== 'u') { - throw invalidChar(read()) - } + } - read(); - const u = unicodeEscape(); - switch (u) { - case '$': - case '_': - case '\u200C': - case '\u200D': - break + this.textureLoader.setCrossOrigin( this.options.crossOrigin ); + + this.fileLoader = new FileLoader( this.options.manager ); + this.fileLoader.setResponseType( 'arraybuffer' ); + + if ( this.options.crossOrigin === 'use-credentials' ) { + + this.fileLoader.setWithCredentials( true ); + + } + + } + + GLTFParser.prototype.setExtensions = function ( extensions ) { + + this.extensions = extensions; + + }; + + GLTFParser.prototype.setPlugins = function ( plugins ) { + + this.plugins = plugins; + + }; + + GLTFParser.prototype.parse = function ( onLoad, onError ) { + + var parser = this; + var json = this.json; + var extensions = this.extensions; + + // Clear the loader cache + this.cache.removeAll(); + + // Mark the special nodes/meshes in json for efficient parse + this._invokeAll( function ( ext ) { + + return ext._markDefs && ext._markDefs(); + + } ); + + Promise.all( [ + + this.getDependencies( 'scene' ), + this.getDependencies( 'animation' ), + this.getDependencies( 'camera' ), + + ] ).then( function ( dependencies ) { + + var result = { + scene: dependencies[ 0 ][ json.scene || 0 ], + scenes: dependencies[ 0 ], + animations: dependencies[ 1 ], + cameras: dependencies[ 2 ], + asset: json.asset, + parser: parser, + userData: {} + }; + + addUnknownExtensionsToUserData( extensions, result, json ); + + assignExtrasToUserData( result, json ); + + onLoad( result ); + + } ).catch( onError ); + + }; + + /** + * Marks the special nodes/meshes in json for efficient parse. + */ + GLTFParser.prototype._markDefs = function () { + + var nodeDefs = this.json.nodes || []; + var skinDefs = this.json.skins || []; + var meshDefs = this.json.meshes || []; + + // Nothing in the node definition indicates whether it is a Bone or an + // Object3D. Use the skins' joint references to mark bones. + for ( var skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) { + + var joints = skinDefs[ skinIndex ].joints; + + for ( var i = 0, il = joints.length; i < il; i ++ ) { + + nodeDefs[ joints[ i ] ].isBone = true; + + } + + } + + // Iterate over all nodes, marking references to shared resources, + // as well as skeleton joints. + for ( var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { + + var nodeDef = nodeDefs[ nodeIndex ]; + + if ( nodeDef.mesh !== undefined ) { + + this._addNodeRef( this.meshCache, nodeDef.mesh ); + + // Nothing in the mesh definition indicates whether it is + // a SkinnedMesh or Mesh. Use the node's mesh reference + // to mark SkinnedMesh if node has skin. + if ( nodeDef.skin !== undefined ) { + + meshDefs[ nodeDef.mesh ].isSkinnedMesh = true; + + } + + } + + if ( nodeDef.camera !== undefined ) { + + this._addNodeRef( this.cameraCache, nodeDef.camera ); + + } + + } + + }; + + /** + * Counts references to shared node / Object3D resources. These resources + * can be reused, or "instantiated", at multiple nodes in the scene + * hierarchy. Mesh, Camera, and Light instances are instantiated and must + * be marked. Non-scenegraph resources (like Materials, Geometries, and + * Textures) can be reused directly and are not marked here. + * + * Example: CesiumMilkTruck sample model reuses "Wheel" meshes. + */ + GLTFParser.prototype._addNodeRef = function ( cache, index ) { + + if ( index === undefined ) return; + + if ( cache.refs[ index ] === undefined ) { + + cache.refs[ index ] = cache.uses[ index ] = 0; + + } + + cache.refs[ index ] ++; + + }; + + /** Returns a reference to a shared resource, cloning it if necessary. */ + GLTFParser.prototype._getNodeRef = function ( cache, index, object ) { + + if ( cache.refs[ index ] <= 1 ) return object; + + var ref = object.clone(); + + ref.name += '_instance_' + ( cache.uses[ index ] ++ ); + + return ref; + + }; + + GLTFParser.prototype._invokeOne = function ( func ) { + + var extensions = Object.values( this.plugins ); + extensions.push( this ); + + for ( var i = 0; i < extensions.length; i ++ ) { + + var result = func( extensions[ i ] ); + + if ( result ) return result; + + } + + }; + + GLTFParser.prototype._invokeAll = function ( func ) { + + var extensions = Object.values( this.plugins ); + extensions.unshift( this ); + + var pending = []; + + for ( var i = 0; i < extensions.length; i ++ ) { + + var result = func( extensions[ i ] ); + + if ( result ) pending.push( result ); + + } + + return pending; + + }; + + /** + * Requests the specified dependency asynchronously, with caching. + * @param {string} type + * @param {number} index + * @return {Promise} + */ + GLTFParser.prototype.getDependency = function ( type, index ) { + + var cacheKey = type + ':' + index; + var dependency = this.cache.get( cacheKey ); + + if ( ! dependency ) { + + switch ( type ) { + + case 'scene': + dependency = this.loadScene( index ); + break; + + case 'node': + dependency = this.loadNode( index ); + break; + + case 'mesh': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadMesh && ext.loadMesh( index ); + + } ); + break; + + case 'accessor': + dependency = this.loadAccessor( index ); + break; + + case 'bufferView': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadBufferView && ext.loadBufferView( index ); + + } ); + break; + + case 'buffer': + dependency = this.loadBuffer( index ); + break; + + case 'material': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadMaterial && ext.loadMaterial( index ); + + } ); + break; + + case 'texture': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadTexture && ext.loadTexture( index ); + + } ); + break; + + case 'skin': + dependency = this.loadSkin( index ); + break; + + case 'animation': + dependency = this.loadAnimation( index ); + break; + + case 'camera': + dependency = this.loadCamera( index ); + break; + + default: + throw new Error( 'Unknown type: ' + type ); + + } + + this.cache.add( cacheKey, dependency ); + + } + + return dependency; + + }; + + /** + * Requests all dependencies of the specified type asynchronously, with caching. + * @param {string} type + * @return {Promise>} + */ + GLTFParser.prototype.getDependencies = function ( type ) { + + var dependencies = this.cache.get( type ); + + if ( ! dependencies ) { + + var parser = this; + var defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || []; + + dependencies = Promise.all( defs.map( function ( def, index ) { + + return parser.getDependency( type, index ); + + } ) ); + + this.cache.add( type, dependencies ); + + } + + return dependencies; + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferIndex + * @return {Promise} + */ + GLTFParser.prototype.loadBuffer = function ( bufferIndex ) { + + var bufferDef = this.json.buffers[ bufferIndex ]; + var loader = this.fileLoader; + + if ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) { + + throw new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' ); + + } - default: - if (!util.isIdContinueChar(u)) { - throw invalidIdentifier() - } + // If present, GLB container is required to be the first buffer. + if ( bufferDef.uri === undefined && bufferIndex === 0 ) { - break - } + return Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body ); - buffer += u; - lexState = 'identifierName'; - }, + } - sign () { - switch (c) { - case '.': - buffer = read(); - lexState = 'decimalPointLeading'; - return + var options = this.options; - case '0': - buffer = read(); - lexState = 'zero'; - return + return new Promise( function ( resolve, reject ) { - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - buffer = read(); - lexState = 'decimalInteger'; - return + loader.load( resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () { - case 'I': - read(); - literal('nfinity'); - return newToken('numeric', sign * Infinity) + reject( new Error( 'THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".' ) ); - case 'N': - read(); - literal('aN'); - return newToken('numeric', NaN) - } + } ); - throw invalidChar(read()) - }, + } ); - zero () { - switch (c) { - case '.': - buffer += read(); - lexState = 'decimalPoint'; - return + }; - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferViewIndex + * @return {Promise} + */ + GLTFParser.prototype.loadBufferView = function ( bufferViewIndex ) { - case 'x': - case 'X': - buffer += read(); - lexState = 'hexadecimal'; - return - } + var bufferViewDef = this.json.bufferViews[ bufferViewIndex ]; - return newToken('numeric', sign * 0) - }, + return this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) { - decimalInteger () { - switch (c) { - case '.': - buffer += read(); - lexState = 'decimalPoint'; - return + var byteLength = bufferViewDef.byteLength || 0; + var byteOffset = bufferViewDef.byteOffset || 0; + return buffer.slice( byteOffset, byteOffset + byteLength ); - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return - } + } ); - if (util.isDigit(c)) { - buffer += read(); - return - } + }; - return newToken('numeric', sign * Number(buffer)) - }, + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors + * @param {number} accessorIndex + * @return {Promise} + */ + GLTFParser.prototype.loadAccessor = function ( accessorIndex ) { - decimalPointLeading () { - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalFraction'; - return - } + var parser = this; + var json = this.json; - throw invalidChar(read()) - }, + var accessorDef = this.json.accessors[ accessorIndex ]; - decimalPoint () { - switch (c) { - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return - } + if ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) { - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalFraction'; - return - } + // Ignore empty accessors, which may be used to declare runtime + // information about attributes coming from another source (e.g. Draco + // compression extension). + return Promise.resolve( null ); - return newToken('numeric', sign * Number(buffer)) - }, + } - decimalFraction () { - switch (c) { - case 'e': - case 'E': - buffer += read(); - lexState = 'decimalExponent'; - return - } + var pendingBufferViews = []; - if (util.isDigit(c)) { - buffer += read(); - return - } + if ( accessorDef.bufferView !== undefined ) { - return newToken('numeric', sign * Number(buffer)) - }, + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) ); - decimalExponent () { - switch (c) { - case '+': - case '-': - buffer += read(); - lexState = 'decimalExponentSign'; - return - } + } else { - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalExponentInteger'; - return - } + pendingBufferViews.push( null ); - throw invalidChar(read()) - }, + } - decimalExponentSign () { - if (util.isDigit(c)) { - buffer += read(); - lexState = 'decimalExponentInteger'; - return - } + if ( accessorDef.sparse !== undefined ) { - throw invalidChar(read()) - }, + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) ); + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) ); - decimalExponentInteger () { - if (util.isDigit(c)) { - buffer += read(); - return - } + } - return newToken('numeric', sign * Number(buffer)) - }, + return Promise.all( pendingBufferViews ).then( function ( bufferViews ) { - hexadecimal () { - if (util.isHexDigit(c)) { - buffer += read(); - lexState = 'hexadecimalInteger'; - return - } + var bufferView = bufferViews[ 0 ]; - throw invalidChar(read()) - }, + var itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ]; + var TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; - hexadecimalInteger () { - if (util.isHexDigit(c)) { - buffer += read(); - return - } + // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12. + var elementBytes = TypedArray.BYTES_PER_ELEMENT; + var itemBytes = elementBytes * itemSize; + var byteOffset = accessorDef.byteOffset || 0; + var byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined; + var normalized = accessorDef.normalized === true; + var array, bufferAttribute; - return newToken('numeric', sign * Number(buffer)) - }, + // The buffer is not interleaved if the stride is the item size in bytes. + if ( byteStride && byteStride !== itemBytes ) { - string () { - switch (c) { - case '\\': - read(); - buffer += escape(); - return + // Each "slice" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer + // This makes sure that IBA.count reflects accessor.count properly + var ibSlice = Math.floor( byteOffset / byteStride ); + var ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count; + var ib = parser.cache.get( ibCacheKey ); - case '"': - if (doubleQuote) { - read(); - return newToken('string', buffer) - } + if ( ! ib ) { - buffer += read(); - return + array = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes ); - case "'": - if (!doubleQuote) { - read(); - return newToken('string', buffer) - } + // Integer parameters to IB/IBA are in array elements, not bytes. + ib = new InterleavedBuffer( array, byteStride / elementBytes ); - buffer += read(); - return + parser.cache.add( ibCacheKey, ib ); - case '\n': - case '\r': - throw invalidChar(read()) + } - case '\u2028': - case '\u2029': - separatorChar(c); - break + bufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized ); - case undefined: - throw invalidChar(read()) - } + } else { - buffer += read(); - }, + if ( bufferView === null ) { - start () { - switch (c) { - case '{': - case '[': - return newToken('punctuator', read()) + array = new TypedArray( accessorDef.count * itemSize ); - // This code is unreachable since the default lexState handles eof. - // case undefined: - // return newToken('eof') - } + } else { - lexState = 'value'; - }, + array = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize ); - beforePropertyName () { - switch (c) { - case '$': - case '_': - buffer = read(); - lexState = 'identifierName'; - return + } - case '\\': - read(); - lexState = 'identifierNameStartEscape'; - return + bufferAttribute = new BufferAttribute( array, itemSize, normalized ); - case '}': - return newToken('punctuator', read()) + } - case '"': - case "'": - doubleQuote = (read() === '"'); - lexState = 'string'; - return - } + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors + if ( accessorDef.sparse !== undefined ) { - if (util.isIdStartChar(c)) { - buffer += read(); - lexState = 'identifierName'; - return - } + var itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; + var TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ]; - throw invalidChar(read()) - }, + var byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; + var byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; - afterPropertyName () { - if (c === ':') { - return newToken('punctuator', read()) - } + var sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices ); + var sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize ); - throw invalidChar(read()) - }, + if ( bufferView !== null ) { - beforePropertyValue () { - lexState = 'value'; - }, + // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes. + bufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized ); - afterPropertyValue () { - switch (c) { - case ',': - case '}': - return newToken('punctuator', read()) - } + } - throw invalidChar(read()) - }, + for ( var i = 0, il = sparseIndices.length; i < il; i ++ ) { - beforeArrayValue () { - if (c === ']') { - return newToken('punctuator', read()) - } + var index = sparseIndices[ i ]; - lexState = 'value'; - }, + bufferAttribute.setX( index, sparseValues[ i * itemSize ] ); + if ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] ); + if ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] ); + if ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] ); + if ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' ); - afterArrayValue () { - switch (c) { - case ',': - case ']': - return newToken('punctuator', read()) - } + } - throw invalidChar(read()) - }, + } - end () { - // This code is unreachable since it's handled by the default lexState. - // if (c === undefined) { - // read() - // return newToken('eof') - // } + return bufferAttribute; - throw invalidChar(read()) - }, - }; + } ); - function newToken (type, value) { - return { - type, - value, - line, - column, - } - } + }; - function literal (s) { - for (const c of s) { - const p = peek(); + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures + * @param {number} textureIndex + * @return {Promise} + */ + GLTFParser.prototype.loadTexture = function ( textureIndex ) { - if (p !== c) { - throw invalidChar(read()) - } + var parser = this; + var json = this.json; + var options = this.options; - read(); - } - } + var textureDef = json.textures[ textureIndex ]; - function escape () { - const c = peek(); - switch (c) { - case 'b': - read(); - return '\b' + var textureExtensions = textureDef.extensions || {}; - case 'f': - read(); - return '\f' + var source; - case 'n': - read(); - return '\n' + if ( textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ] ) { - case 'r': - read(); - return '\r' + source = json.images[ textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].source ]; - case 't': - read(); - return '\t' + } else { - case 'v': - read(); - return '\v' + source = json.images[ textureDef.source ]; - case '0': - read(); - if (util.isDigit(peek())) { - throw invalidChar(read()) - } + } - return '\0' + var loader; - case 'x': - read(); - return hexEscape() + if ( source.uri ) { - case 'u': - read(); - return unicodeEscape() + loader = options.manager.getHandler( source.uri ); - case '\n': - case '\u2028': - case '\u2029': - read(); - return '' + } - case '\r': - read(); - if (peek() === '\n') { - read(); - } + if ( ! loader ) { - return '' + loader = textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ] + ? parser.extensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].ddsLoader + : this.textureLoader; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - throw invalidChar(read()) + } - case undefined: - throw invalidChar(read()) - } + return this.loadTextureImage( textureIndex, source, loader ); - return read() - } + }; - function hexEscape () { - let buffer = ''; - let c = peek(); + GLTFParser.prototype.loadTextureImage = function ( textureIndex, source, loader ) { - if (!util.isHexDigit(c)) { - throw invalidChar(read()) - } + var parser = this; + var json = this.json; + var options = this.options; - buffer += read(); + var textureDef = json.textures[ textureIndex ]; - c = peek(); - if (!util.isHexDigit(c)) { - throw invalidChar(read()) - } + var URL = self.URL || self.webkitURL; - buffer += read(); + var sourceURI = source.uri; + var isObjectURL = false; + var hasAlpha = true; - return String.fromCodePoint(parseInt(buffer, 16)) - } + if ( source.mimeType === 'image/jpeg' ) hasAlpha = false; - function unicodeEscape () { - let buffer = ''; - let count = 4; + if ( source.bufferView !== undefined ) { - while (count-- > 0) { - const c = peek(); - if (!util.isHexDigit(c)) { - throw invalidChar(read()) - } + // Load binary image data from bufferView, if provided. - buffer += read(); - } + sourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) { - return String.fromCodePoint(parseInt(buffer, 16)) - } + if ( source.mimeType === 'image/png' ) { - const parseStates = { - start () { - if (token.type === 'eof') { - throw invalidEOF() - } + // Inspect the PNG 'IHDR' chunk to determine whether the image could have an + // alpha channel. This check is conservative — the image could have an alpha + // channel with all values == 1, and the indexed type (colorType == 3) only + // sometimes contains alpha. + // + // https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header + var colorType = new DataView( bufferView, 25, 1 ).getUint8( 0, false ); + hasAlpha = colorType === 6 || colorType === 4 || colorType === 3; - push(); - }, + } - beforePropertyName () { - switch (token.type) { - case 'identifier': - case 'string': - key = token.value; - parseState = 'afterPropertyName'; - return + isObjectURL = true; + var blob = new Blob( [ bufferView ], { type: source.mimeType } ); + sourceURI = URL.createObjectURL( blob ); + return sourceURI; - case 'punctuator': - // This code is unreachable since it's handled by the lexState. - // if (token.value !== '}') { - // throw invalidToken() - // } + } ); - pop(); - return + } - case 'eof': - throw invalidEOF() - } + return Promise.resolve( sourceURI ).then( function ( sourceURI ) { - // This code is unreachable since it's handled by the lexState. - // throw invalidToken() - }, + return new Promise( function ( resolve, reject ) { - afterPropertyName () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'punctuator' || token.value !== ':') { - // throw invalidToken() - // } + var onLoad = resolve; - if (token.type === 'eof') { - throw invalidEOF() - } + if ( loader.isImageBitmapLoader === true ) { - parseState = 'beforePropertyValue'; - }, + onLoad = function ( imageBitmap ) { - beforePropertyValue () { - if (token.type === 'eof') { - throw invalidEOF() - } + resolve( new CanvasTexture( imageBitmap ) ); - push(); - }, + }; - beforeArrayValue () { - if (token.type === 'eof') { - throw invalidEOF() - } + } - if (token.type === 'punctuator' && token.value === ']') { - pop(); - return - } + loader.load( resolveURL( sourceURI, options.path ), onLoad, undefined, reject ); - push(); - }, + } ); - afterPropertyValue () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'punctuator') { - // throw invalidToken() - // } + } ).then( function ( texture ) { - if (token.type === 'eof') { - throw invalidEOF() - } + // Clean up resources and configure Texture. - switch (token.value) { - case ',': - parseState = 'beforePropertyName'; - return + if ( isObjectURL === true ) { - case '}': - pop(); - } + URL.revokeObjectURL( sourceURI ); - // This code is unreachable since it's handled by the lexState. - // throw invalidToken() - }, + } - afterArrayValue () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'punctuator') { - // throw invalidToken() - // } + texture.flipY = false; - if (token.type === 'eof') { - throw invalidEOF() - } + if ( textureDef.name ) texture.name = textureDef.name; - switch (token.value) { - case ',': - parseState = 'beforeArrayValue'; - return + // When there is definitely no alpha channel in the texture, set RGBFormat to save space. + if ( ! hasAlpha ) texture.format = RGBFormat; - case ']': - pop(); - } + var samplers = json.samplers || {}; + var sampler = samplers[ textureDef.sampler ] || {}; - // This code is unreachable since it's handled by the lexState. - // throw invalidToken() - }, + texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter; + texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter; + texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping; + texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping; - end () { - // This code is unreachable since it's handled by the lexState. - // if (token.type !== 'eof') { - // throw invalidToken() - // } - }, - }; + parser.associations.set( texture, { + type: 'textures', + index: textureIndex + } ); - function push () { - let value; + return texture; - switch (token.type) { - case 'punctuator': - switch (token.value) { - case '{': - value = {}; - break + } ); - case '[': - value = []; - break - } + }; + + /** + * Asynchronously assigns a texture to the given material parameters. + * @param {Object} materialParams + * @param {string} mapName + * @param {Object} mapDef + * @return {Promise} + */ + GLTFParser.prototype.assignTexture = function ( materialParams, mapName, mapDef ) { - break + var parser = this; - case 'null': - case 'boolean': - case 'numeric': - case 'string': - value = token.value; - break + return this.getDependency( 'texture', mapDef.index ).then( function ( texture ) { - // This code is unreachable. - // default: - // throw invalidToken() - } + // Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured + // However, we will copy UV set 0 to UV set 1 on demand for aoMap + if ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) { - if (root === undefined) { - root = value; - } else { - const parent = stack[stack.length - 1]; - if (Array.isArray(parent)) { - parent.push(value); - } else { - parent[key] = value; - } - } + console.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' ); - if (value !== null && typeof value === 'object') { - stack.push(value); + } - if (Array.isArray(value)) { - parseState = 'beforeArrayValue'; - } else { - parseState = 'beforePropertyName'; - } - } else { - const current = stack[stack.length - 1]; - if (current == null) { - parseState = 'end'; - } else if (Array.isArray(current)) { - parseState = 'afterArrayValue'; - } else { - parseState = 'afterPropertyValue'; - } - } - } + if ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) { - function pop () { - stack.pop(); + var transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined; - const current = stack[stack.length - 1]; - if (current == null) { - parseState = 'end'; - } else if (Array.isArray(current)) { - parseState = 'afterArrayValue'; - } else { - parseState = 'afterPropertyValue'; - } - } + if ( transform ) { - // This code is unreachable. - // function invalidParseState () { - // return new Error(`JSON5: invalid parse state '${parseState}'`) - // } + var gltfReference = parser.associations.get( texture ); + texture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform ); + parser.associations.set( texture, gltfReference ); - // This code is unreachable. - // function invalidLexState (state) { - // return new Error(`JSON5: invalid lex state '${state}'`) - // } + } - function invalidChar (c) { - if (c === undefined) { - return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) - } + } - return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`) - } + materialParams[ mapName ] = texture; - function invalidEOF () { - return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) - } + } ); - // This code is unreachable. - // function invalidToken () { - // if (token.type === 'eof') { - // return syntaxError(`JSON5: invalid end of input at ${line}:${column}`) - // } + }; - // const c = String.fromCodePoint(token.value.codePointAt(0)) - // return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`) - // } + /** + * Assigns final material to a Mesh, Line, or Points instance. The instance + * already has a material (generated from the glTF material options alone) + * but reuse of the same glTF material may require multiple threejs materials + * to accomodate different primitive types, defines, etc. New materials will + * be created if necessary, and reused from a cache. + * @param {Object3D} mesh Mesh, Line, or Points instance. + */ + GLTFParser.prototype.assignFinalMaterial = function ( mesh ) { - function invalidIdentifier () { - column -= 5; - return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`) - } + var geometry = mesh.geometry; + var material = mesh.material; - function separatorChar (c) { - console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`); - } + var useVertexTangents = geometry.attributes.tangent !== undefined; + var useVertexColors = geometry.attributes.color !== undefined; + var useFlatShading = geometry.attributes.normal === undefined; + var useSkinning = mesh.isSkinnedMesh === true; + var useMorphTargets = Object.keys( geometry.morphAttributes ).length > 0; + var useMorphNormals = useMorphTargets && geometry.morphAttributes.normal !== undefined; - function formatChar (c) { - const replacements = { - "'": "\\'", - '"': '\\"', - '\\': '\\\\', - '\b': '\\b', - '\f': '\\f', - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', - '\v': '\\v', - '\0': '\\0', - '\u2028': '\\u2028', - '\u2029': '\\u2029', - }; + if ( mesh.isPoints ) { - if (replacements[c]) { - return replacements[c] - } + var cacheKey = 'PointsMaterial:' + material.uuid; - if (c < ' ') { - const hexString = c.charCodeAt(0).toString(16); - return '\\x' + ('00' + hexString).substring(hexString.length) - } + var pointsMaterial = this.cache.get( cacheKey ); - return c - } + if ( ! pointsMaterial ) { - function syntaxError (message) { - const err = new SyntaxError(message); - err.lineNumber = line; - err.columnNumber = column; - return err - } + pointsMaterial = new PointsMaterial(); + Material.prototype.copy.call( pointsMaterial, material ); + pointsMaterial.color.copy( material.color ); + pointsMaterial.map = material.map; + pointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px - var stringify = function stringify (value, replacer, space) { - const stack = []; - let indent = ''; - let propertyList; - let replacerFunc; - let gap = ''; - let quote; + this.cache.add( cacheKey, pointsMaterial ); - if ( - replacer != null && - typeof replacer === 'object' && - !Array.isArray(replacer) - ) { - space = replacer.space; - quote = replacer.quote; - replacer = replacer.replacer; - } + } - if (typeof replacer === 'function') { - replacerFunc = replacer; - } else if (Array.isArray(replacer)) { - propertyList = []; - for (const v of replacer) { - let item; + material = pointsMaterial; - if (typeof v === 'string') { - item = v; - } else if ( - typeof v === 'number' || - v instanceof String || - v instanceof Number - ) { - item = String(v); - } + } else if ( mesh.isLine ) { - if (item !== undefined && propertyList.indexOf(item) < 0) { - propertyList.push(item); - } - } - } + var cacheKey = 'LineBasicMaterial:' + material.uuid; - if (space instanceof Number) { - space = Number(space); - } else if (space instanceof String) { - space = String(space); - } + var lineMaterial = this.cache.get( cacheKey ); - if (typeof space === 'number') { - if (space > 0) { - space = Math.min(10, Math.floor(space)); - gap = ' '.substr(0, space); - } - } else if (typeof space === 'string') { - gap = space.substr(0, 10); - } + if ( ! lineMaterial ) { - return serializeProperty('', {'': value}) + lineMaterial = new LineBasicMaterial(); + Material.prototype.copy.call( lineMaterial, material ); + lineMaterial.color.copy( material.color ); - function serializeProperty (key, holder) { - let value = holder[key]; - if (value != null) { - if (typeof value.toJSON5 === 'function') { - value = value.toJSON5(key); - } else if (typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - } + this.cache.add( cacheKey, lineMaterial ); - if (replacerFunc) { - value = replacerFunc.call(holder, key, value); - } + } - if (value instanceof Number) { - value = Number(value); - } else if (value instanceof String) { - value = String(value); - } else if (value instanceof Boolean) { - value = value.valueOf(); - } + material = lineMaterial; - switch (value) { - case null: return 'null' - case true: return 'true' - case false: return 'false' - } + } - if (typeof value === 'string') { - return quoteString(value, false) - } + // Clone the material if it will be modified + if ( useVertexTangents || useVertexColors || useFlatShading || useSkinning || useMorphTargets ) { - if (typeof value === 'number') { - return String(value) - } + var cacheKey = 'ClonedMaterial:' + material.uuid + ':'; - if (typeof value === 'object') { - return Array.isArray(value) ? serializeArray(value) : serializeObject(value) - } + if ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:'; + if ( useSkinning ) cacheKey += 'skinning:'; + if ( useVertexTangents ) cacheKey += 'vertex-tangents:'; + if ( useVertexColors ) cacheKey += 'vertex-colors:'; + if ( useFlatShading ) cacheKey += 'flat-shading:'; + if ( useMorphTargets ) cacheKey += 'morph-targets:'; + if ( useMorphNormals ) cacheKey += 'morph-normals:'; - return undefined - } + var cachedMaterial = this.cache.get( cacheKey ); - function quoteString (value) { - const quotes = { - "'": 0.1, - '"': 0.2, - }; + if ( ! cachedMaterial ) { - const replacements = { - "'": "\\'", - '"': '\\"', - '\\': '\\\\', - '\b': '\\b', - '\f': '\\f', - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', - '\v': '\\v', - '\0': '\\0', - '\u2028': '\\u2028', - '\u2029': '\\u2029', - }; + cachedMaterial = material.clone(); - let product = ''; + if ( useSkinning ) cachedMaterial.skinning = true; + if ( useVertexTangents ) cachedMaterial.vertexTangents = true; + if ( useVertexColors ) cachedMaterial.vertexColors = true; + if ( useFlatShading ) cachedMaterial.flatShading = true; + if ( useMorphTargets ) cachedMaterial.morphTargets = true; + if ( useMorphNormals ) cachedMaterial.morphNormals = true; - for (let i = 0; i < value.length; i++) { - const c = value[i]; - switch (c) { - case "'": - case '"': - quotes[c]++; - product += c; - continue + this.cache.add( cacheKey, cachedMaterial ); - case '\0': - if (util.isDigit(value[i + 1])) { - product += '\\x00'; - continue - } - } + this.associations.set( cachedMaterial, this.associations.get( material ) ); - if (replacements[c]) { - product += replacements[c]; - continue - } + } - if (c < ' ') { - let hexString = c.charCodeAt(0).toString(16); - product += '\\x' + ('00' + hexString).substring(hexString.length); - continue - } + material = cachedMaterial; - product += c; - } + } - const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b); + // workarounds for mesh and geometry - product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]); + if ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) { - return quoteChar + product + quoteChar - } + geometry.setAttribute( 'uv2', geometry.attributes.uv ); - function serializeObject (value) { - if (stack.indexOf(value) >= 0) { - throw TypeError('Converting circular structure to JSON5') - } + } - stack.push(value); + // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 + if ( material.normalScale && ! useVertexTangents ) { - let stepback = indent; - indent = indent + gap; + material.normalScale.y = - material.normalScale.y; - let keys = propertyList || Object.keys(value); - let partial = []; - for (const key of keys) { - const propertyString = serializeProperty(key, value); - if (propertyString !== undefined) { - let member = serializeKey(key) + ':'; - if (gap !== '') { - member += ' '; - } - member += propertyString; - partial.push(member); - } - } + } - let final; - if (partial.length === 0) { - final = '{}'; - } else { - let properties; - if (gap === '') { - properties = partial.join(','); - final = '{' + properties + '}'; - } else { - let separator = ',\n' + indent; - properties = partial.join(separator); - final = '{\n' + indent + properties + ',\n' + stepback + '}'; - } - } + if ( material.clearcoatNormalScale && ! useVertexTangents ) { - stack.pop(); - indent = stepback; - return final - } + material.clearcoatNormalScale.y = - material.clearcoatNormalScale.y; - function serializeKey (key) { - if (key.length === 0) { - return quoteString(key, true) - } + } - const firstChar = String.fromCodePoint(key.codePointAt(0)); - if (!util.isIdStartChar(firstChar)) { - return quoteString(key, true) - } + mesh.material = material; - for (let i = firstChar.length; i < key.length; i++) { - if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) { - return quoteString(key, true) - } - } + }; - return key - } + GLTFParser.prototype.getMaterialType = function ( /* materialIndex */ ) { - function serializeArray (value) { - if (stack.indexOf(value) >= 0) { - throw TypeError('Converting circular structure to JSON5') - } + return MeshStandardMaterial; - stack.push(value); + }; - let stepback = indent; - indent = indent + gap; + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials + * @param {number} materialIndex + * @return {Promise} + */ + GLTFParser.prototype.loadMaterial = function ( materialIndex ) { - let partial = []; - for (let i = 0; i < value.length; i++) { - const propertyString = serializeProperty(String(i), value); - partial.push((propertyString !== undefined) ? propertyString : 'null'); - } + var parser = this; + var json = this.json; + var extensions = this.extensions; + var materialDef = json.materials[ materialIndex ]; - let final; - if (partial.length === 0) { - final = '[]'; - } else { - if (gap === '') { - let properties = partial.join(','); - final = '[' + properties + ']'; - } else { - let separator = ',\n' + indent; - let properties = partial.join(separator); - final = '[\n' + indent + properties + ',\n' + stepback + ']'; - } - } + var materialType; + var materialParams = {}; + var materialExtensions = materialDef.extensions || {}; - stack.pop(); - indent = stepback; - return final - } - }; + var pending = []; - const JSON5 = { - parse, - stringify, - }; + if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) { - var lib = JSON5; + var sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ]; + materialType = sgExtension.getMaterialType(); + pending.push( sgExtension.extendParams( materialParams, materialDef, parser ) ); - class Sidebar{ + } else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) { - constructor(viewer){ - this.viewer = viewer; + var kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ]; + materialType = kmuExtension.getMaterialType(); + pending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) ); - this.measuringTool = viewer.measuringTool; - this.profileTool = viewer.profileTool; - this.volumeTool = viewer.volumeTool; + } else { - this.dom = $("#sidebar_root"); - } + // Specification: + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material - createToolIcon(icon, title, callback){ - let element = $(` - - `); + var metallicRoughness = materialDef.pbrMetallicRoughness || {}; - element.click(callback); + materialParams.color = new Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; - return element; - } + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { - init(){ + var array = metallicRoughness.baseColorFactor; - this.initAccordion(); - this.initAppearance(); - this.initToolbar(); - this.initScene(); - this.initNavigation(); - this.initFilters(); - this.initClippingTool(); - this.initSettings(); - - $('#potree_version_number').html(Potree.version.major + "." + Potree.version.minor + Potree.version.suffix); - } + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; - + } - initToolbar(){ + if ( metallicRoughness.baseColorTexture !== undefined ) { - // ANGLE - let elToolbar = $('#tools'); - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/angle.png', - '[title]tt.angle_measurement', - () => { - $('#menu_measurements').next().slideDown(); - let measurement = this.measuringTool.startInsertion({ - showDistances: false, - showAngles: true, - showArea: false, - closed: true, - maxMarkers: 3, - name: 'Angle'}); + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); } - )); - // POINT - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/point.svg', - '[title]tt.point_measurement', - () => { - $('#menu_measurements').next().slideDown(); - let measurement = this.measuringTool.startInsertion({ - showDistances: false, - showAngles: false, - showCoordinates: true, - showArea: false, - closed: true, - maxMarkers: 1, - name: 'Point'}); + materialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0; + materialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0; - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); - } - )); + if ( metallicRoughness.metallicRoughnessTexture !== undefined ) { - // DISTANCE - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/distance.svg', - '[title]tt.distance_measurement', - () => { - $('#menu_measurements').next().slideDown(); - let measurement = this.measuringTool.startInsertion({ - showDistances: true, - showArea: false, - closed: false, - name: 'Distance'}); + pending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) ); + pending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) ); - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); } - )); - // HEIGHT - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/height.svg', - '[title]tt.height_measurement', - () => { - $('#menu_measurements').next().slideDown(); - let measurement = this.measuringTool.startInsertion({ - showDistances: false, - showHeight: true, - showArea: false, - closed: false, - maxMarkers: 2, - name: 'Height'}); + materialType = this._invokeOne( function ( ext ) { - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); - } - )); + return ext.getMaterialType && ext.getMaterialType( materialIndex ); - // CIRCLE - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/circle.svg', - '[title]tt.circle_measurement', - () => { - $('#menu_measurements').next().slideDown(); - let measurement = this.measuringTool.startInsertion({ - showDistances: false, - showHeight: false, - showArea: false, - showCircle: true, - showEdges: false, - closed: false, - maxMarkers: 3, - name: 'Circle'}); + } ); - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); - } - )); + pending.push( Promise.all( this._invokeAll( function ( ext ) { - // AZIMUTH - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/azimuth.svg', - 'Azimuth', - () => { - $('#menu_measurements').next().slideDown(); - let measurement = this.measuringTool.startInsertion({ - showDistances: false, - showHeight: false, - showArea: false, - showCircle: false, - showEdges: false, - showAzimuth: true, - closed: false, - maxMarkers: 2, - name: 'Azimuth'}); + return ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams ); + + } ) ) ); + + } + + if ( materialDef.doubleSided === true ) { + + materialParams.side = DoubleSide; + + } + + var alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; + + if ( alphaMode === ALPHA_MODES.BLEND ) { + + materialParams.transparent = true; + + // See: https://github.com/mrdoob/three.js/issues/17706 + materialParams.depthWrite = false; + + } else { + + materialParams.transparent = false; - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); - } - )); + if ( alphaMode === ALPHA_MODES.MASK ) { - // AREA - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/area.svg', - '[title]tt.area_measurement', - () => { - $('#menu_measurements').next().slideDown(); - let measurement = this.measuringTool.startInsertion({ - showDistances: true, - showArea: true, - closed: true, - name: 'Area'}); + materialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5; - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); } - )); - // VOLUME - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/volume.svg', - '[title]tt.volume_measurement', - () => { - let volume = this.volumeTool.startInsertion(); + } - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === volume.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); - } - )); + if ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) { - // SPHERE VOLUME - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/sphere_distances.svg', - '[title]tt.volume_measurement', - () => { - let volume = this.volumeTool.startInsertion({type: SphereVolume}); + pending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) ); - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === volume.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); - } - )); + materialParams.normalScale = new Vector2( 1, 1 ); - // PROFILE - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/profile.svg', - '[title]tt.height_profile', - () => { - $('#menu_measurements').next().slideDown(); ; - let profile = this.profileTool.startInsertion(); + if ( materialDef.normalTexture.scale !== undefined ) { + + materialParams.normalScale.set( materialDef.normalTexture.scale, materialDef.normalTexture.scale ); - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === profile.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); } - )); - // ANNOTATION - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/annotation.svg', - '[title]tt.annotation', - () => { - $('#menu_measurements').next().slideDown(); ; - let annotation = this.viewer.annotationTool.startInsertion(); + } - let annotationsRoot = $("#jstree_scene").jstree().get_json("annotations"); - let jsonNode = annotationsRoot.children.find(child => child.data.uuid === annotation.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); - } - )); + if ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) ); + + if ( materialDef.occlusionTexture.strength !== undefined ) { + + materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; - // REMOVE ALL - elToolbar.append(this.createToolIcon( - Potree.resourcePath + '/icons/reset_tools.svg', - '[title]tt.remove_all_measurement', - () => { - this.viewer.scene.removeAllMeasurements(); } - )); + } - { // SHOW / HIDE Measurements - let elShow = $("#measurement_options_show"); - elShow.selectgroup({title: "Show/Hide labels"}); + if ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) { - elShow.find("input").click( (e) => { - const show = e.target.value === "SHOW"; - this.measuringTool.showLabels = show; - }); + materialParams.emissive = new Color().fromArray( materialDef.emissiveFactor ); - let currentShow = this.measuringTool.showLabels ? "SHOW" : "HIDE"; - elShow.find(`input[value=${currentShow}]`).trigger("click"); } - } - initScene(){ + if ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) { - let elScene = $("#menu_scene"); - let elObjects = elScene.next().find("#scene_objects"); - let elProperties = elScene.next().find("#scene_object_properties"); - + pending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) ); - { - let elExport = elScene.next().find("#scene_export"); + } - let geoJSONIcon = `${Potree.resourcePath}/icons/file_geojson.svg`; - let dxfIcon = `${Potree.resourcePath}/icons/file_dxf.svg`; - let potreeIcon = `${Potree.resourcePath}/icons/file_potree.svg`; + return Promise.all( pending ).then( function () { - elExport.append(` - Export:
    - - - - `); + var material; - let elDownloadJSON = elExport.find("img[name=geojson_export_button]").parent(); - elDownloadJSON.click( (event) => { - let scene = this.viewer.scene; - let measurements = [...scene.measurements, ...scene.profiles, ...scene.volumes]; + if ( materialType === GLTFMeshStandardSGMaterial ) { - if(measurements.length > 0){ - let geoJson = GeoJSONExporter.toString(measurements); + material = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams ); - let url = window.URL.createObjectURL(new Blob([geoJson], {type: 'data:application/octet-stream'})); - elDownloadJSON.attr('href', url); - }else { - this.viewer.postError("no measurements to export"); - event.preventDefault(); - } - }); + } else { - let elDownloadDXF = elExport.find("img[name=dxf_export_button]").parent(); - elDownloadDXF.click( (event) => { - let scene = this.viewer.scene; - let measurements = [...scene.measurements, ...scene.profiles, ...scene.volumes]; + material = new materialType( materialParams ); - if(measurements.length > 0){ - let dxf = DXFExporter.toString(measurements); + } - let url = window.URL.createObjectURL(new Blob([dxf], {type: 'data:application/octet-stream'})); - elDownloadDXF.attr('href', url); - }else { - this.viewer.postError("no measurements to export"); - event.preventDefault(); - } - }); + if ( materialDef.name ) material.name = materialDef.name; - let elDownloadPotree = elExport.find("img[name=potree_export_button]").parent(); - elDownloadPotree.click( (event) => { + // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding. + if ( material.map ) material.map.encoding = sRGBEncoding; + if ( material.emissiveMap ) material.emissiveMap.encoding = sRGBEncoding; - let data = Potree.saveProject(this.viewer); - let dataString = lib.stringify(data, null, "\t"); + assignExtrasToUserData( material, materialDef ); - let url = window.URL.createObjectURL(new Blob([dataString], {type: 'data:application/octet-stream'})); - elDownloadPotree.attr('href', url); - }); - } + parser.associations.set( material, { type: 'materials', index: materialIndex } ); - let propertiesPanel = new PropertiesPanel(elProperties, this.viewer); - propertiesPanel.setScene(this.viewer.scene); - - localStorage.removeItem('jstree'); + if ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef ); - let tree = $(`
    `); - elObjects.append(tree); + return material; - tree.jstree({ - 'plugins': ["checkbox", "state"], - 'core': { - "dblclick_toggle": false, - "state": { - "checked" : true - }, - 'check_callback': true, - "expand_selected_onload": true - }, - "checkbox" : { - "keep_selected_style": true, - "three_state": false, - "whole_node": false, - "tie_selection": false, - }, - }); + } ); - let createNode = (parent, text, icon, object) => { - let nodeID = tree.jstree('create_node', parent, { - "text": text, - "icon": icon, - "data": object - }, - "last", false, false); - - if(object.visible){ - tree.jstree('check_node', nodeID); - }else { - tree.jstree('uncheck_node', nodeID); - } + }; - return nodeID; - }; + /** When Object3D instances are targeted by animation, they need unique names. */ + GLTFParser.prototype.createUniqueName = function ( originalName ) { - let pcID = tree.jstree('create_node', "#", { "text": "Point Clouds", "id": "pointclouds"}, "last", false, false); - let measurementID = tree.jstree('create_node', "#", { "text": "Measurements", "id": "measurements" }, "last", false, false); - let annotationsID = tree.jstree('create_node', "#", { "text": "Annotations", "id": "annotations" }, "last", false, false); - let otherID = tree.jstree('create_node', "#", { "text": "Other", "id": "other" }, "last", false, false); - let vectorsID = tree.jstree('create_node', "#", { "text": "Vectors", "id": "vectors" }, "last", false, false); - let imagesID = tree.jstree('create_node', "#", { "text": " Images", "id": "images" }, "last", false, false); + var sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' ); - tree.jstree("check_node", pcID); - tree.jstree("check_node", measurementID); - tree.jstree("check_node", annotationsID); - tree.jstree("check_node", otherID); - tree.jstree("check_node", vectorsID); - tree.jstree("check_node", imagesID); + var name = sanitizedName; - tree.on('create_node.jstree', (e, data) => { - tree.jstree("open_all"); - }); + for ( var i = 1; this.nodeNamesUsed[ name ]; ++ i ) { - tree.on("select_node.jstree", (e, data) => { - let object = data.node.data; - propertiesPanel.set(object); + name = sanitizedName + '_' + i; - this.viewer.inputHandler.deselectAll(); + } - if(object instanceof Volume){ - this.viewer.inputHandler.toggleSelection(object); - } + this.nodeNamesUsed[ name ] = true; - $(this.viewer.renderer.domElement).focus(); - }); + return name; - tree.on("deselect_node.jstree", (e, data) => { - propertiesPanel.set(null); - }); + }; - tree.on("delete_node.jstree", (e, data) => { - propertiesPanel.set(null); - }); + /** + * @param {BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + */ + function computeBounds( geometry, primitiveDef, parser ) { - tree.on('dblclick','.jstree-anchor', (e) => { + var attributes = primitiveDef.attributes; - let instance = $.jstree.reference(e.target); - let node = instance.get_node(e.target); - let object = node.data; + var box = new Box3(); - // ignore double click on checkbox - if(e.target.classList.contains("jstree-checkbox")){ - return; - } + if ( attributes.POSITION !== undefined ) { - if(object instanceof PointCloudTree){ - let box = this.viewer.getBoundingBox([object]); - let node = new THREE.Object3D(); - node.boundingBox = box; - this.viewer.zoomTo(node, 1, 500); - }else if(object instanceof Measure){ - let points = object.points.map(p => p.position); - let box = new THREE.Box3().setFromPoints(points); - if(box.getSize(new THREE.Vector3()).length() > 0){ - let node = new THREE.Object3D(); - node.boundingBox = box; - this.viewer.zoomTo(node, 2, 500); - } - }else if(object instanceof Profile){ - let points = object.points; - let box = new THREE.Box3().setFromPoints(points); - if(box.getSize(new THREE.Vector3()).length() > 0){ - let node = new THREE.Object3D(); - node.boundingBox = box; - this.viewer.zoomTo(node, 1, 500); - } - }else if(object instanceof Volume){ - - let box = object.boundingBox.clone().applyMatrix4(object.matrixWorld); + var accessor = parser.json.accessors[ attributes.POSITION ]; - if(box.getSize(new THREE.Vector3()).length() > 0){ - let node = new THREE.Object3D(); - node.boundingBox = box; - this.viewer.zoomTo(node, 1, 500); - } - }else if(object instanceof Annotation){ - object.moveHere(this.viewer.scene.getActiveCamera()); - }else if(object instanceof PolygonClipVolume){ - let dir = object.camera.getWorldDirection(new THREE.Vector3()); - let target; + var min = accessor.min; + var max = accessor.max; - if(object.camera instanceof THREE.OrthographicCamera){ - dir.multiplyScalar(object.camera.right); - target = new THREE.Vector3().addVectors(object.camera.position, dir); - this.viewer.setCameraMode(CameraMode.ORTHOGRAPHIC); - }else if(object.camera instanceof THREE.PerspectiveCamera){ - dir.multiplyScalar(this.viewer.scene.view.radius); - target = new THREE.Vector3().addVectors(object.camera.position, dir); - this.viewer.setCameraMode(CameraMode.PERSPECTIVE); - } - - this.viewer.scene.view.position.copy(object.camera.position); - this.viewer.scene.view.lookAt(target); - }else if(object instanceof THREE.SpotLight){ - let distance = (object.distance > 0) ? object.distance / 4 : 5 * 1000; - let position = object.position; - let target = new THREE.Vector3().addVectors( - position, - object.getWorldDirection(new THREE.Vector3()).multiplyScalar(distance)); + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. - this.viewer.scene.view.position.copy(object.position); - this.viewer.scene.view.lookAt(target); - }else if(object instanceof THREE.Object3D){ - let box = new THREE.Box3().setFromObject(object); + if ( min !== undefined && max !== undefined ) { - if(box.getSize(new THREE.Vector3()).length() > 0){ - let node = new THREE.Object3D(); - node.boundingBox = box; - this.viewer.zoomTo(node, 1, 500); - } - }else if(object instanceof OrientedImage){ - // TODO zoom to images + box.set( + new Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ), + new Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) ); - // let box = new THREE.Box3().setFromObject(object); + } else { - // if(box.getSize(new THREE.Vector3()).length() > 0){ - // let node = new THREE.Object3D(); - // node.boundingBox = box; - // this.viewer.zoomTo(node, 1, 500); - // } - }else if(object instanceof Images360){ - // TODO - }else if(object instanceof Geopackage){ - // TODO - } - }); + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); - tree.on("uncheck_node.jstree", (e, data) => { - let object = data.node.data; + return; - if(object){ - object.visible = false; } - }); - tree.on("check_node.jstree", (e, data) => { - let object = data.node.data; + } else { - if(object){ - object.visible = true; - } - }); + return; + } - let onPointCloudAdded = (e) => { - let pointcloud = e.pointcloud; - let cloudIcon = `${Potree.resourcePath}/icons/cloud.svg`; - let node = createNode(pcID, pointcloud.name, cloudIcon, pointcloud); + var targets = primitiveDef.targets; - pointcloud.addEventListener("visibility_changed", () => { - if(pointcloud.visible){ - tree.jstree('check_node', node); - }else { - tree.jstree('uncheck_node', node); - } - }); - }; + if ( targets !== undefined ) { - let onMeasurementAdded = (e) => { - let measurement = e.measurement; - let icon = Utils.getMeasurementIcon(measurement); - createNode(measurementID, measurement.name, icon, measurement); - }; + var maxDisplacement = new Vector3(); + var vector = new Vector3(); - let onVolumeAdded = (e) => { - let volume = e.volume; - let icon = Utils.getMeasurementIcon(volume); - let node = createNode(measurementID, volume.name, icon, volume); + for ( var i = 0, il = targets.length; i < il; i ++ ) { - volume.addEventListener("visibility_changed", () => { - if(volume.visible){ - tree.jstree('check_node', node); - }else { - tree.jstree('uncheck_node', node); - } - }); - }; + var target = targets[ i ]; - let onProfileAdded = (e) => { - let profile = e.profile; - let icon = Utils.getMeasurementIcon(profile); - createNode(measurementID, profile.name, icon, profile); - }; + if ( target.POSITION !== undefined ) { - let onAnnotationAdded = (e) => { - let annotation = e.annotation; + var accessor = parser.json.accessors[ target.POSITION ]; + var min = accessor.min; + var max = accessor.max; - let annotationIcon = `${Potree.resourcePath}/icons/annotation.svg`; - let parentID = this.annotationMapping.get(annotation.parent); - let annotationID = createNode(parentID, annotation.title, annotationIcon, annotation); - this.annotationMapping.set(annotation, annotationID); + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. - annotation.addEventListener("annotation_changed", (e) => { - let annotationsRoot = $("#jstree_scene").jstree().get_json("annotations"); - let jsonNode = annotationsRoot.children.find(child => child.data.uuid === annotation.uuid); - - $.jstree.reference(jsonNode.id).rename_node(jsonNode.id, annotation.title); - }); - }; + if ( min !== undefined && max !== undefined ) { - let onCameraAnimationAdded = (e) => { - const animation = e.animation; + // we need to get max of absolute components because target weight is [-1,1] + vector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) ); + vector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) ); + vector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) ); - const animationIcon = `${Potree.resourcePath}/icons/camera_animation.svg`; - createNode(otherID, "animation", animationIcon, animation); - }; + // Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative + // to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets + // are used to implement key-frame animations and as such only two are active at a time - this results in very large + // boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size. + maxDisplacement.max( vector ); - let onOrientedImagesAdded = (e) => { - const images = e.images; + } else { - const imagesIcon = `${Potree.resourcePath}/icons/picture.svg`; - const node = createNode(imagesID, "images", imagesIcon, images); + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); + + } - images.addEventListener("visibility_changed", () => { - if(images.visible){ - tree.jstree('check_node', node); - }else { - tree.jstree('uncheck_node', node); } - }); - }; - let onImages360Added = (e) => { - const images = e.images; + } - const imagesIcon = `${Potree.resourcePath}/icons/picture.svg`; - const node = createNode(imagesID, "360° images", imagesIcon, images); + // As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets. + box.expandByVector( maxDisplacement ); - images.addEventListener("visibility_changed", () => { - if(images.visible){ - tree.jstree('check_node', node); - }else { - tree.jstree('uncheck_node', node); - } - }); - }; + } - const onGeopackageAdded = (e) => { - const geopackage = e.geopackage; + geometry.boundingBox = box; - const geopackageIcon = `${Potree.resourcePath}/icons/triangle.svg`; - const tree = $(`#jstree_scene`); - const parentNode = "vectors"; + var sphere = new Sphere(); - for(const layer of geopackage.node.children){ - const name = layer.name; + box.getCenter( sphere.center ); + sphere.radius = box.min.distanceTo( box.max ) / 2; - let shpPointsID = tree.jstree('create_node', parentNode, { - "text": name, - "icon": geopackageIcon, - "object": layer, - "data": layer, - }, - "last", false, false); - tree.jstree(layer.visible ? "check_node" : "uncheck_node", shpPointsID); - } + geometry.boundingSphere = sphere; - }; + } - this.viewer.scene.addEventListener("pointcloud_added", onPointCloudAdded); - this.viewer.scene.addEventListener("measurement_added", onMeasurementAdded); - this.viewer.scene.addEventListener("profile_added", onProfileAdded); - this.viewer.scene.addEventListener("volume_added", onVolumeAdded); - this.viewer.scene.addEventListener("camera_animation_added", onCameraAnimationAdded); - this.viewer.scene.addEventListener("oriented_images_added", onOrientedImagesAdded); - this.viewer.scene.addEventListener("360_images_added", onImages360Added); - this.viewer.scene.addEventListener("geopackage_added", onGeopackageAdded); - this.viewer.scene.addEventListener("polygon_clip_volume_added", onVolumeAdded); - this.viewer.scene.annotations.addEventListener("annotation_added", onAnnotationAdded); + /** + * @param {BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + * @return {Promise} + */ + function addPrimitiveAttributes( geometry, primitiveDef, parser ) { - let onMeasurementRemoved = (e) => { - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.measurement.uuid); - - tree.jstree("delete_node", jsonNode.id); - }; + var attributes = primitiveDef.attributes; - let onVolumeRemoved = (e) => { - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.volume.uuid); - - tree.jstree("delete_node", jsonNode.id); - }; + var pending = []; - let onPolygonClipVolumeRemoved = (e) => { - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.volume.uuid); - - tree.jstree("delete_node", jsonNode.id); - }; + function assignAttributeAccessor( accessorIndex, attributeName ) { - let onProfileRemoved = (e) => { - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.profile.uuid); - - tree.jstree("delete_node", jsonNode.id); - }; + return parser.getDependency( 'accessor', accessorIndex ) + .then( function ( accessor ) { - this.viewer.scene.addEventListener("measurement_removed", onMeasurementRemoved); - this.viewer.scene.addEventListener("volume_removed", onVolumeRemoved); - this.viewer.scene.addEventListener("polygon_clip_volume_removed", onPolygonClipVolumeRemoved); - this.viewer.scene.addEventListener("profile_removed", onProfileRemoved); + geometry.setAttribute( attributeName, accessor ); + + } ); - { - let annotationIcon = `${Potree.resourcePath}/icons/annotation.svg`; - this.annotationMapping = new Map(); - this.annotationMapping.set(this.viewer.scene.annotations, annotationsID); - this.viewer.scene.annotations.traverseDescendants(annotation => { - let parentID = this.annotationMapping.get(annotation.parent); - let annotationID = createNode(parentID, annotation.title, annotationIcon, annotation); - this.annotationMapping.set(annotation, annotationID); - }); } - const scene = this.viewer.scene; - for(let pointcloud of scene.pointclouds){ - onPointCloudAdded({pointcloud: pointcloud}); + for ( var gltfAttributeName in attributes ) { + + var threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase(); + + // Skip attributes already provided by e.g. Draco extension. + if ( threeAttributeName in geometry.attributes ) continue; + + pending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) ); + } - for(let measurement of scene.measurements){ - onMeasurementAdded({measurement: measurement}); + if ( primitiveDef.indices !== undefined && ! geometry.index ) { + + var accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) { + + geometry.setIndex( accessor ); + + } ); + + pending.push( accessor ); + } - for(let volume of [...scene.volumes, ...scene.polygonClipVolumes]){ - onVolumeAdded({volume: volume}); + assignExtrasToUserData( geometry, primitiveDef ); + + computeBounds( geometry, primitiveDef, parser ); + + return Promise.all( pending ).then( function () { + + return primitiveDef.targets !== undefined + ? addMorphTargets( geometry, primitiveDef.targets, parser ) + : geometry; + + } ); + + } + + /** + * @param {BufferGeometry} geometry + * @param {Number} drawMode + * @return {BufferGeometry} + */ + function toTrianglesDrawMode( geometry, drawMode ) { + + var index = geometry.getIndex(); + + // generate index if not present + + if ( index === null ) { + + var indices = []; + + var position = geometry.getAttribute( 'position' ); + + if ( position !== undefined ) { + + for ( var i = 0; i < position.count; i ++ ) { + + indices.push( i ); + + } + + geometry.setIndex( indices ); + index = geometry.getIndex(); + + } else { + + console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' ); + return geometry; + + } + } - for(let animation of scene.cameraAnimations){ - onCameraAnimationAdded({animation: animation}); - } + // + + var numberOfTriangles = index.count - 2; + var newIndices = []; + + if ( drawMode === TriangleFanDrawMode ) { + + // gl.TRIANGLE_FAN + + for ( var i = 1; i <= numberOfTriangles; i ++ ) { + + newIndices.push( index.getX( 0 ) ); + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + + } + + } else { + + // gl.TRIANGLE_STRIP + + for ( var i = 0; i < numberOfTriangles; i ++ ) { + + if ( i % 2 === 0 ) { + + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i + 2 ) ); + + + } else { + + newIndices.push( index.getX( i + 2 ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i ) ); - for(let images of scene.orientedImages){ - onOrientedImagesAdded({images: images}); - } + } - for(let images of scene.images360){ - onImages360Added({images: images}); - } + } - for(const geopackage of scene.geopackages){ - onGeopackageAdded({geopackage: geopackage}); } - for(let profile of scene.profiles){ - onProfileAdded({profile: profile}); - } + if ( ( newIndices.length / 3 ) !== numberOfTriangles ) { + + console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' ); - { - createNode(otherID, "Camera", null, new THREE.Camera()); } - this.viewer.addEventListener("scene_changed", (e) => { - propertiesPanel.setScene(e.scene); + // build final geometry - e.oldScene.removeEventListener("pointcloud_added", onPointCloudAdded); - e.oldScene.removeEventListener("measurement_added", onMeasurementAdded); - e.oldScene.removeEventListener("profile_added", onProfileAdded); - e.oldScene.removeEventListener("volume_added", onVolumeAdded); - e.oldScene.removeEventListener("polygon_clip_volume_added", onVolumeAdded); - e.oldScene.removeEventListener("measurement_removed", onMeasurementRemoved); + var newGeometry = geometry.clone(); + newGeometry.setIndex( newIndices ); - e.scene.addEventListener("pointcloud_added", onPointCloudAdded); - e.scene.addEventListener("measurement_added", onMeasurementAdded); - e.scene.addEventListener("profile_added", onProfileAdded); - e.scene.addEventListener("volume_added", onVolumeAdded); - e.scene.addEventListener("polygon_clip_volume_added", onVolumeAdded); - e.scene.addEventListener("measurement_removed", onMeasurementRemoved); - }); + return newGeometry; } - initClippingTool(){ + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry + * + * Creates BufferGeometries from primitives. + * + * @param {Array} primitives + * @return {Promise>} + */ + GLTFParser.prototype.loadGeometries = function ( primitives ) { + var parser = this; + var extensions = this.extensions; + var cache = this.primitiveCache; - this.viewer.addEventListener("cliptask_changed", (event) => { - console.log("TODO"); - }); + function createDracoPrimitive( primitive ) { - this.viewer.addEventListener("clipmethod_changed", (event) => { - console.log("TODO"); - }); + return extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] + .decodePrimitive( primitive, parser ) + .then( function ( geometry ) { - { - let elClipTask = $("#cliptask_options"); - elClipTask.selectgroup({title: "Clip Task"}); + return addPrimitiveAttributes( geometry, primitive, parser ); - elClipTask.find("input").click( (e) => { - this.viewer.setClipTask(ClipTask[e.target.value]); - }); + } ); - let currentClipTask = Object.keys(ClipTask) - .filter(key => ClipTask[key] === this.viewer.clipTask); - elClipTask.find(`input[value=${currentClipTask}]`).trigger("click"); } - { - let elClipMethod = $("#clipmethod_options"); - elClipMethod.selectgroup({title: "Clip Method"}); + var pending = []; - elClipMethod.find("input").click( (e) => { - this.viewer.setClipMethod(ClipMethod[e.target.value]); - }); + for ( var i = 0, il = primitives.length; i < il; i ++ ) { - let currentClipMethod = Object.keys(ClipMethod) - .filter(key => ClipMethod[key] === this.viewer.clipMethod); - elClipMethod.find(`input[value=${currentClipMethod}]`).trigger("click"); - } + var primitive = primitives[ i ]; + var cacheKey = createPrimitiveKey( primitive ); - let clippingToolBar = $("#clipping_tools"); + // See if we've already created this geometry + var cached = cache[ cacheKey ]; - // CLIP VOLUME - clippingToolBar.append(this.createToolIcon( - Potree.resourcePath + '/icons/clip_volume.svg', - '[title]tt.clip_volume', - () => { - let item = this.volumeTool.startInsertion({clip: true}); + if ( cached ) { - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); - } - )); + // Use the cached geometry if it exists + pending.push( cached.promise ); - // CLIP POLYGON - clippingToolBar.append(this.createToolIcon( - Potree.resourcePath + "/icons/clip-polygon.svg", - "[title]tt.clip_polygon", - () => { - let item = this.viewer.clippingTool.startInsertion({type: "polygon"}); + } else { - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); - } - )); + var geometryPromise; - {// SCREEN BOX SELECT - let boxSelectTool = new ScreenBoxSelectTool(this.viewer); + if ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) { - clippingToolBar.append(this.createToolIcon( - Potree.resourcePath + "/icons/clip-screen.svg", - "[title]tt.screen_clip_box", - () => { - if(!(this.viewer.scene.getActiveCamera() instanceof THREE.OrthographicCamera)){ - this.viewer.postMessage(`Switch to Orthographic Camera Mode before using the Screen-Box-Select tool.`, - {duration: 2000}); - return; - } - - let item = boxSelectTool.startInsertion(); + // Use DRACO geometry if available + geometryPromise = createDracoPrimitive( primitive ); - let measurementsRoot = $("#jstree_scene").jstree().get_json("measurements"); - let jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid); - $.jstree.reference(jsonNode.id).deselect_all(); - $.jstree.reference(jsonNode.id).select_node(jsonNode.id); - } - )); - } + } else { - { // REMOVE CLIPPING TOOLS - clippingToolBar.append(this.createToolIcon( - Potree.resourcePath + "/icons/remove.svg", - "[title]tt.remove_all_measurement", - () => { + // Otherwise create a new geometry + geometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser ); - this.viewer.scene.removeAllClipVolumes(); } - )); - } - - } - initFilters(){ - this.initClassificationList(); - this.initReturnFilters(); - this.initGPSTimeFilters(); - this.initPointSourceIDFilters(); - - } + // Cache this geometry + cache[ cacheKey ] = { primitive: primitive, promise: geometryPromise }; - initReturnFilters(){ - let elReturnFilterPanel = $('#return_filter_panel'); + pending.push( geometryPromise ); - { // RETURN NUMBER - let sldReturnNumber = elReturnFilterPanel.find('#sldReturnNumber'); - let lblReturnNumber = elReturnFilterPanel.find('#lblReturnNumber'); + } - sldReturnNumber.slider({ - range: true, - min: 0, max: 7, step: 1, - values: [0, 7], - slide: (event, ui) => { - this.viewer.setFilterReturnNumberRange(ui.values[0], ui.values[1]); - } - }); + } - let onReturnNumberChanged = (event) => { - let [from, to] = this.viewer.filterReturnNumberRange; + return Promise.all( pending ); - lblReturnNumber[0].innerHTML = `${from} to ${to}`; - sldReturnNumber.slider({values: [from, to]}); - }; + }; - this.viewer.addEventListener('filter_return_number_range_changed', onReturnNumberChanged); + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes + * @param {number} meshIndex + * @return {Promise} + */ + GLTFParser.prototype.loadMesh = function ( meshIndex ) { - onReturnNumberChanged(); - } + var parser = this; + var json = this.json; + var extensions = this.extensions; - { // NUMBER OF RETURNS - let sldNumberOfReturns = elReturnFilterPanel.find('#sldNumberOfReturns'); - let lblNumberOfReturns = elReturnFilterPanel.find('#lblNumberOfReturns'); + var meshDef = json.meshes[ meshIndex ]; + var primitives = meshDef.primitives; - sldNumberOfReturns.slider({ - range: true, - min: 0, max: 7, step: 1, - values: [0, 7], - slide: (event, ui) => { - this.viewer.setFilterNumberOfReturnsRange(ui.values[0], ui.values[1]); - } - }); + var pending = []; - let onNumberOfReturnsChanged = (event) => { - let [from, to] = this.viewer.filterNumberOfReturnsRange; + for ( var i = 0, il = primitives.length; i < il; i ++ ) { - lblNumberOfReturns[0].innerHTML = `${from} to ${to}`; - sldNumberOfReturns.slider({values: [from, to]}); - }; + var material = primitives[ i ].material === undefined + ? createDefaultMaterial( this.cache ) + : this.getDependency( 'material', primitives[ i ].material ); - this.viewer.addEventListener('filter_number_of_returns_range_changed', onNumberOfReturnsChanged); + pending.push( material ); - onNumberOfReturnsChanged(); } - } - initGPSTimeFilters(){ + pending.push( parser.loadGeometries( primitives ) ); - let elGPSTimeFilterPanel = $('#gpstime_filter_panel'); + return Promise.all( pending ).then( function ( results ) { - { - let slider = new HierarchicalSlider({ - levels: 4, - slide: (event) => { - this.viewer.setFilterGPSTimeRange(...event.values); - }, - }); + var materials = results.slice( 0, results.length - 1 ); + var geometries = results[ results.length - 1 ]; - let initialized = false; + var meshes = []; - let initialize = () => { - - let elRangeContainer = $("#gpstime_multilevel_range_container"); - elRangeContainer[0].prepend(slider.element); + for ( var i = 0, il = geometries.length; i < il; i ++ ) { - let extent = this.viewer.getGpsTimeExtent(); + var geometry = geometries[ i ]; + var primitive = primitives[ i ]; - slider.setRange(extent); - slider.setValues(extent); + // 1. create Mesh + var mesh; - initialized = true; - }; + var material = materials[ i ]; - this.viewer.addEventListener("update", (e) => { - let extent = this.viewer.getGpsTimeExtent(); - let gpsTimeAvailable = extent[0] !== Infinity; + if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || + primitive.mode === undefined ) { - if(!initialized && gpsTimeAvailable){ - initialize(); - } + // .isSkinnedMesh isn't in glTF spec. See ._markDefs() + mesh = meshDef.isSkinnedMesh === true + ? new SkinnedMesh( geometry, material ) + : new Mesh( geometry, material ); - slider.setRange(extent); - }); - } + if ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) { + // we normalize floating point skin weight array to fix malformed assets (see #15319) + // it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs + mesh.normalizeSkinWeights(); - { - - const txtGpsTime = elGPSTimeFilterPanel.find("#txtGpsTime"); - const btnFindGpsTime = elGPSTimeFilterPanel.find("#btnFindGpsTime"); + } - let targetTime = null; + if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) { - txtGpsTime.on("input", (e) => { - const str = txtGpsTime.val(); + mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode ); - if(!isNaN(str)){ - const value = parseFloat(str); - targetTime = value; + } else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) { - txtGpsTime.css("background-color", ""); - }else { - targetTime = null; + mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode ); - txtGpsTime.css("background-color", "#ff9999"); - } + } - }); + } else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) { - btnFindGpsTime.click( () => { - - if(targetTime !== null){ - viewer.moveToGpsTimeVicinity(targetTime); - } - }); - } + mesh = new LineSegments( geometry, material ); - } + } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) { - initPointSourceIDFilters() { - let elPointSourceIDFilterPanel = $('#pointsourceid_filter_panel'); + mesh = new Line( geometry, material ); - { - let slider = new HierarchicalSlider({ - levels: 4, - range: [0, 65535], - precision: 1, - slide: (event) => { - let values = event.values; - this.viewer.setFilterPointSourceIDRange(values[0], values[1]); - } - }); + } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) { - let initialized = false; + mesh = new LineLoop( geometry, material ); - let initialize = () => { - elPointSourceIDFilterPanel[0].prepend(slider.element); + } else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) { - initialized = true; - }; + mesh = new Points( geometry, material ); - this.viewer.addEventListener("update", (e) => { - let extent = this.viewer.filterPointSourceIDRange; + } else { - if(!initialized){ - initialize(); + throw new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode ); - slider.setValues(extent); } - - }); - } - // let lblPointSourceID = elPointSourceIDFilterPanel.find("#lblPointSourceID"); - // let elPointSourceID = elPointSourceIDFilterPanel.find("#spnPointSourceID"); + if ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) { - // let slider = new ZoomableSlider(); - // elPointSourceID[0].appendChild(slider.element); - // slider.update(); + updateMorphTargets( mesh, meshDef ); - // slider.change( () => { - // let range = slider.chosenRange; - // this.viewer.setFilterPointSourceIDRange(range[0], range[1]); - // }); + } - // let onPointSourceIDExtentChanged = (event) => { - // let range = this.viewer.filterPointSourceIDExtent; - // slider.setVisibleRange(range); - // }; + mesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) ); - // let onPointSourceIDChanged = (event) => { - // let range = this.viewer.filterPointSourceIDRange; + assignExtrasToUserData( mesh, meshDef ); - // let precision = 1; - // let from = `${Utils.addCommas(range[0].toFixed(precision))}`; - // let to = `${Utils.addCommas(range[1].toFixed(precision))}`; - // lblPointSourceID[0].innerHTML = `${from} to ${to}`; + if ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive ); - // slider.setRange(range); - // }; + parser.assignFinalMaterial( mesh ); - // this.viewer.addEventListener('filter_point_source_id_range_changed', onPointSourceIDChanged); - // this.viewer.addEventListener('filter_point_source_id_extent_changed', onPointSourceIDExtentChanged); + meshes.push( mesh ); - } + } - initClassificationList(){ - let elClassificationList = $('#classificationList'); + if ( meshes.length === 1 ) { - let addClassificationItem = (code, name) => { - const classification = this.viewer.classifications[code]; - const inputID = 'chkClassification_' + code; - const colorPickerID = 'colorPickerClassification_' + code; + return meshes[ 0 ]; - const checked = classification.visible ? "checked" : ""; + } - let element = $(` -
  • - -
  • - `); + var group = new Group(); - const elInput = element.find('input'); - const elColorPicker = element.find(`#${colorPickerID}`); + for ( var i = 0, il = meshes.length; i < il; i ++ ) { - elInput.click(event => { - this.viewer.setClassificationVisibility(code, event.target.checked); - }); + group.add( meshes[ i ] ); - let defaultColor = classification.color.map(c => c * 255).join(", "); - defaultColor = `rgb(${defaultColor})`; + } + return group; - elColorPicker.spectrum({ - // flat: true, - color: defaultColor, - showInput: true, - preferredFormat: 'rgb', - cancelText: '', - chooseText: 'Apply', - move: color => { - let rgb = color.toRgb(); - const c = [rgb.r / 255, rgb.g / 255, rgb.b / 255, 1]; - classification.color = c; - }, - change: color => { - let rgb = color.toRgb(); - const c = [rgb.r / 255, rgb.g / 255, rgb.b / 255, 1]; - classification.color = c; - } - }); + } ); - elClassificationList.append(element); - }; + }; - const addToggleAllButton = () => { // toggle all button - const element = $(` -
  • - -
  • - `); + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras + * @param {number} cameraIndex + * @return {Promise} + */ + GLTFParser.prototype.loadCamera = function ( cameraIndex ) { - let elInput = element.find('input'); + var camera; + var cameraDef = this.json.cameras[ cameraIndex ]; + var params = cameraDef[ cameraDef.type ]; - elInput.click(event => { - this.viewer.toggleAllClassificationsVisibility(); - }); + if ( ! params ) { - elClassificationList.append(element); - }; + console.warn( 'THREE.GLTFLoader: Missing camera parameters.' ); + return; - const addInvertButton = () => { - const element = $(` -
  • - -
  • - `); + } - let elInput = element.find('input'); + if ( cameraDef.type === 'perspective' ) { - elInput.click( () => { - const classifications = this.viewer.classifications; - - for(let key of Object.keys(classifications)){ - let value = classifications[key]; - this.viewer.setClassificationVisibility(key, !value.visible); - } - }); + camera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 ); - elClassificationList.append(element); - }; + } else if ( cameraDef.type === 'orthographic' ) { - const populate = () => { - addToggleAllButton(); - for (let classID in this.viewer.classifications) { - addClassificationItem(classID, this.viewer.classifications[classID].name); - } - addInvertButton(); - }; + camera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar ); - populate(); + } - this.viewer.addEventListener("classifications_changed", () => { - elClassificationList.empty(); - populate(); - }); + if ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name ); - this.viewer.addEventListener("classification_visibility_changed", () => { + assignExtrasToUserData( camera, cameraDef ); - { // set checked state of classification buttons - for(const classID of Object.keys(this.viewer.classifications)){ - const classValue = this.viewer.classifications[classID]; + return Promise.resolve( camera ); - let elItem = elClassificationList.find(`#chkClassification_${classID}`); - elItem.prop("checked", classValue.visible); - } - } + }; - { // set checked state of toggle button based on state of all other buttons - let numVisible = 0; - let numItems = 0; - for(const key of Object.keys(this.viewer.classifications)){ - if(this.viewer.classifications[key].visible){ - numVisible++; - } - numItems++; - } - const allVisible = numVisible === numItems; + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins + * @param {number} skinIndex + * @return {Promise} + */ + GLTFParser.prototype.loadSkin = function ( skinIndex ) { - let elToggle = elClassificationList.find("#toggleClassificationFilters"); - elToggle.prop("checked", allVisible); - } - }); - } + var skinDef = this.json.skins[ skinIndex ]; - initAccordion(){ - $('.accordion > h3').each(function(){ - let header = $(this); - let content = $(this).next(); + var skinEntry = { joints: skinDef.joints }; - //header.addClass('accordion-header ui-widget'); - //content.addClass('accordion-content ui-widget'); + if ( skinDef.inverseBindMatrices === undefined ) { - content.hide(); + return Promise.resolve( skinEntry ); - header.click(() => { - content.slideToggle(); - }); - }); + } - let languages = [ - ["EN", "en"], - ["FR", "fr"], - ["DE", "de"], - ["JP", "jp"], - ["ES", "es"], - ["SE", "se"] - ]; + return this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) { - let elLanguages = $('#potree_languages'); - for(let i = 0; i < languages.length; i++){ - let [key, value] = languages[i]; - let element = $(`${key}`); - element.click(() => this.viewer.setLanguage(value)); + skinEntry.inverseBindMatrices = accessor; - if(i === 0){ - element.css("margin-left", "30px"); - } - - elLanguages.append(element); + return skinEntry; - if(i < languages.length - 1){ - elLanguages.append($(document.createTextNode(' - '))); - } - } + } ); + }; - // to close all, call - // $(".accordion > div").hide() + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations + * @param {number} animationIndex + * @return {Promise} + */ + GLTFParser.prototype.loadAnimation = function ( animationIndex ) { - // to open the, for example, tool menu, call: - // $("#menu_tools").next().show() - } + var json = this.json; - initAppearance(){ + var animationDef = json.animations[ animationIndex ]; - const sldPointBudget = this.dom.find('#sldPointBudget'); + var pendingNodes = []; + var pendingInputAccessors = []; + var pendingOutputAccessors = []; + var pendingSamplers = []; + var pendingTargets = []; - sldPointBudget.slider({ - value: this.viewer.getPointBudget(), - min: 100 * 1000, - max: 10 * 1000 * 1000, - step: 1000, - slide: (event, ui) => { this.viewer.setPointBudget(ui.value); } - }); + for ( var i = 0, il = animationDef.channels.length; i < il; i ++ ) { - this.dom.find('#sldFOV').slider({ - value: this.viewer.getFOV(), - min: 20, - max: 100, - step: 1, - slide: (event, ui) => { this.viewer.setFOV(ui.value); } - }); + var channel = animationDef.channels[ i ]; + var sampler = animationDef.samplers[ channel.sampler ]; + var target = channel.target; + var name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated. + var input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input; + var output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output; - $('#sldEDLRadius').slider({ - value: this.viewer.getEDLRadius(), - min: 1, - max: 4, - step: 0.01, - slide: (event, ui) => { this.viewer.setEDLRadius(ui.value); } - }); + pendingNodes.push( this.getDependency( 'node', name ) ); + pendingInputAccessors.push( this.getDependency( 'accessor', input ) ); + pendingOutputAccessors.push( this.getDependency( 'accessor', output ) ); + pendingSamplers.push( sampler ); + pendingTargets.push( target ); - $('#sldEDLStrength').slider({ - value: this.viewer.getEDLStrength(), - min: 0, - max: 5, - step: 0.01, - slide: (event, ui) => { this.viewer.setEDLStrength(ui.value); } - }); + } - $('#sldEDLOpacity').slider({ - value: this.viewer.getEDLOpacity(), - min: 0, - max: 1, - step: 0.01, - slide: (event, ui) => { this.viewer.setEDLOpacity(ui.value); } - }); + return Promise.all( [ - this.viewer.addEventListener('point_budget_changed', (event) => { - $('#lblPointBudget')[0].innerHTML = Utils.addCommas(this.viewer.getPointBudget()); - sldPointBudget.slider({value: this.viewer.getPointBudget()}); - }); + Promise.all( pendingNodes ), + Promise.all( pendingInputAccessors ), + Promise.all( pendingOutputAccessors ), + Promise.all( pendingSamplers ), + Promise.all( pendingTargets ) - this.viewer.addEventListener('fov_changed', (event) => { - $('#lblFOV')[0].innerHTML = parseInt(this.viewer.getFOV()); - $('#sldFOV').slider({value: this.viewer.getFOV()}); - }); + ] ).then( function ( dependencies ) { - this.viewer.addEventListener('use_edl_changed', (event) => { - $('#chkEDLEnabled')[0].checked = this.viewer.getEDLEnabled(); - }); + var nodes = dependencies[ 0 ]; + var inputAccessors = dependencies[ 1 ]; + var outputAccessors = dependencies[ 2 ]; + var samplers = dependencies[ 3 ]; + var targets = dependencies[ 4 ]; - this.viewer.addEventListener('edl_radius_changed', (event) => { - $('#lblEDLRadius')[0].innerHTML = this.viewer.getEDLRadius().toFixed(1); - $('#sldEDLRadius').slider({value: this.viewer.getEDLRadius()}); - }); + var tracks = []; - this.viewer.addEventListener('edl_strength_changed', (event) => { - $('#lblEDLStrength')[0].innerHTML = this.viewer.getEDLStrength().toFixed(1); - $('#sldEDLStrength').slider({value: this.viewer.getEDLStrength()}); - }); + for ( var i = 0, il = nodes.length; i < il; i ++ ) { - this.viewer.addEventListener('background_changed', (event) => { - $("input[name=background][value='" + this.viewer.getBackground() + "']").prop('checked', true); - }); + var node = nodes[ i ]; + var inputAccessor = inputAccessors[ i ]; + var outputAccessor = outputAccessors[ i ]; + var sampler = samplers[ i ]; + var target = targets[ i ]; - $('#lblPointBudget')[0].innerHTML = Utils.addCommas(this.viewer.getPointBudget()); - $('#lblFOV')[0].innerHTML = parseInt(this.viewer.getFOV()); - $('#lblEDLRadius')[0].innerHTML = this.viewer.getEDLRadius().toFixed(1); - $('#lblEDLStrength')[0].innerHTML = this.viewer.getEDLStrength().toFixed(1); - $('#chkEDLEnabled')[0].checked = this.viewer.getEDLEnabled(); - - { - let elBackground = $(`#background_options`); - elBackground.selectgroup(); + if ( node === undefined ) continue; - elBackground.find("input").click( (e) => { - this.viewer.setBackground(e.target.value); - }); + node.updateMatrix(); + node.matrixAutoUpdate = true; - let currentBackground = this.viewer.getBackground(); - $(`input[name=background_options][value=${currentBackground}]`).trigger("click"); - } + var TypedKeyframeTrack; - $('#chkEDLEnabled').click( () => { - this.viewer.setEDLEnabled($('#chkEDLEnabled').prop("checked")); - }); - } + switch ( PATH_PROPERTIES[ target.path ] ) { - initNavigation(){ - let elNavigation = $('#navigation'); - let sldMoveSpeed = $('#sldMoveSpeed'); - let lblMoveSpeed = $('#lblMoveSpeed'); + case PATH_PROPERTIES.weights: - elNavigation.append(this.createToolIcon( - Potree.resourcePath + '/icons/earth_controls_1.png', - '[title]tt.earth_control', - () => { this.viewer.setControls(this.viewer.earthControls); } - )); + TypedKeyframeTrack = NumberKeyframeTrack; + break; - elNavigation.append(this.createToolIcon( - Potree.resourcePath + '/icons/fps_controls.svg', - '[title]tt.flight_control', - () => { - this.viewer.setControls(this.viewer.fpControls); - this.viewer.fpControls.lockElevation = false; - } - )); + case PATH_PROPERTIES.rotation: - elNavigation.append(this.createToolIcon( - Potree.resourcePath + '/icons/helicopter_controls.svg', - '[title]tt.heli_control', - () => { - this.viewer.setControls(this.viewer.fpControls); - this.viewer.fpControls.lockElevation = true; - } - )); + TypedKeyframeTrack = QuaternionKeyframeTrack; + break; - elNavigation.append(this.createToolIcon( - Potree.resourcePath + '/icons/orbit_controls.svg', - '[title]tt.orbit_control', - () => { this.viewer.setControls(this.viewer.orbitControls); } - )); + case PATH_PROPERTIES.position: + case PATH_PROPERTIES.scale: + default: - elNavigation.append(this.createToolIcon( - Potree.resourcePath + '/icons/focus.svg', - '[title]tt.focus_control', - () => { this.viewer.fitToScreen(); } - )); + TypedKeyframeTrack = VectorKeyframeTrack; + break; - elNavigation.append(this.createToolIcon( - Potree.resourcePath + "/icons/navigation_cube.svg", - "[title]tt.navigation_cube_control", - () => {this.viewer.toggleNavigationCube();} - )); + } - elNavigation.append(this.createToolIcon( - Potree.resourcePath + "/images/compas.svg", - "[title]tt.compass", - () => { - const visible = !this.viewer.compass.isVisible(); - this.viewer.compass.setVisible(visible); - } - )); + var targetName = node.name ? node.name : node.uuid; - elNavigation.append(this.createToolIcon( - Potree.resourcePath + "/icons/camera_animation.svg", - "[title]tt.camera_animation", - () => { - const animation = CameraAnimation.defaultFromView(this.viewer); + var interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear; - viewer.scene.addCameraAnimation(animation); - } - )); + var targetNames = []; + if ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) { - elNavigation.append("
    "); + // Node may be a Group (glTF mesh with several primitives) or a Mesh. + node.traverse( function ( object ) { + if ( object.isMesh === true && object.morphTargetInfluences ) { - elNavigation.append(this.createToolIcon( - Potree.resourcePath + "/icons/left.svg", - "[title]tt.left_view_control", - () => {this.viewer.setLeftView();} - )); + targetNames.push( object.name ? object.name : object.uuid ); - elNavigation.append(this.createToolIcon( - Potree.resourcePath + "/icons/right.svg", - "[title]tt.right_view_control", - () => {this.viewer.setRightView();} - )); + } - elNavigation.append(this.createToolIcon( - Potree.resourcePath + "/icons/front.svg", - "[title]tt.front_view_control", - () => {this.viewer.setFrontView();} - )); + } ); - elNavigation.append(this.createToolIcon( - Potree.resourcePath + "/icons/back.svg", - "[title]tt.back_view_control", - () => {this.viewer.setBackView();} - )); + } else { - elNavigation.append(this.createToolIcon( - Potree.resourcePath + "/icons/top.svg", - "[title]tt.top_view_control", - () => {this.viewer.setTopView();} - )); + targetNames.push( targetName ); - elNavigation.append(this.createToolIcon( - Potree.resourcePath + "/icons/bottom.svg", - "[title]tt.bottom_view_control", - () => {this.viewer.setBottomView();} - )); + } + var outputArray = outputAccessor.array; + if ( outputAccessor.normalized ) { + var scale; + if ( outputArray.constructor === Int8Array ) { - let elCameraProjection = $(` - - - - - `); - elNavigation.append(elCameraProjection); - elCameraProjection.selectgroup({title: "Camera Projection"}); - elCameraProjection.find("input").click( (e) => { - this.viewer.setCameraMode(CameraMode[e.target.value]); - }); - let cameraMode = Object.keys(CameraMode) - .filter(key => CameraMode[key] === this.viewer.scene.cameraMode); - elCameraProjection.find(`input[value=${cameraMode}]`).trigger("click"); + scale = 1 / 127; - let speedRange = new THREE.Vector2(1, 10 * 1000); + } else if ( outputArray.constructor === Uint8Array ) { - let toLinearSpeed = (value) => { - return Math.pow(value, 4) * speedRange.y + speedRange.x; - }; + scale = 1 / 255; - let toExpSpeed = (value) => { - return Math.pow((value - speedRange.x) / speedRange.y, 1 / 4); - }; + } else if ( outputArray.constructor == Int16Array ) { - sldMoveSpeed.slider({ - value: toExpSpeed(this.viewer.getMoveSpeed()), - min: 0, - max: 1, - step: 0.01, - slide: (event, ui) => { this.viewer.setMoveSpeed(toLinearSpeed(ui.value)); } - }); + scale = 1 / 32767; - this.viewer.addEventListener('move_speed_changed', (event) => { - lblMoveSpeed.html(this.viewer.getMoveSpeed().toFixed(1)); - sldMoveSpeed.slider({value: toExpSpeed(this.viewer.getMoveSpeed())}); - }); + } else if ( outputArray.constructor === Uint16Array ) { - lblMoveSpeed.html(this.viewer.getMoveSpeed().toFixed(1)); - } + scale = 1 / 65535; + } else { - initSettings(){ + throw new Error( 'THREE.GLTFLoader: Unsupported output accessor component type.' ); - { - $('#sldMinNodeSize').slider({ - value: this.viewer.getMinNodeSize(), - min: 0, - max: 1000, - step: 0.01, - slide: (event, ui) => { this.viewer.setMinNodeSize(ui.value); } - }); + } - this.viewer.addEventListener('minnodesize_changed', (event) => { - $('#lblMinNodeSize').html(parseInt(this.viewer.getMinNodeSize())); - $('#sldMinNodeSize').slider({value: this.viewer.getMinNodeSize()}); - }); - $('#lblMinNodeSize').html(parseInt(this.viewer.getMinNodeSize())); - } + var scaled = new Float32Array( outputArray.length ); - { - let elSplatQuality = $("#splat_quality_options"); - elSplatQuality.selectgroup({title: "Splat Quality"}); + for ( var j = 0, jl = outputArray.length; j < jl; j ++ ) { + + scaled[ j ] = outputArray[ j ] * scale; + + } + + outputArray = scaled; - elSplatQuality.find("input").click( (e) => { - if(e.target.value === "standard"){ - this.viewer.useHQ = false; - }else if(e.target.value === "hq"){ - this.viewer.useHQ = true; } - }); - let currentQuality = this.viewer.useHQ ? "hq" : "standard"; - elSplatQuality.find(`input[value=${currentQuality}]`).trigger("click"); - } + for ( var j = 0, jl = targetNames.length; j < jl; j ++ ) { - $('#show_bounding_box').click(() => { - this.viewer.setShowBoundingBox($('#show_bounding_box').prop("checked")); - }); + var track = new TypedKeyframeTrack( + targetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ], + inputAccessor.array, + outputArray, + interpolation + ); - $('#set_freeze').click(() => { - this.viewer.setFreeze($('#set_freeze').prop("checked")); - }); - } + // Override interpolation with custom factory method. + if ( sampler.interpolation === 'CUBICSPLINE' ) { - } + track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) { - class AnnotationTool extends EventDispatcher{ - constructor (viewer) { - super(); + // A CUBICSPLINE keyframe in glTF has three output values for each input value, + // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize() + // must be divided by three to get the interpolant's sampleSize argument. - this.viewer = viewer; - this.renderer = viewer.renderer; + return new GLTFCubicSplineInterpolant( this.times, this.values, this.getValueSize() / 3, result ); - this.sg = new THREE.SphereGeometry(0.1); - this.sm = new THREE.MeshNormalMaterial(); - this.s = new THREE.Mesh(this.sg, this.sm); - } + }; - startInsertion (args = {}) { - let domElement = this.viewer.renderer.domElement; + // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants. + track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; - let annotation = new Annotation({ - position: [589748.270, 231444.540, 753.675], - title: "Annotation Title", - description: `Annotation Description` - }); - this.dispatchEvent({type: 'start_inserting_annotation', annotation: annotation}); + } - const annotations = this.viewer.scene.annotations; - annotations.add(annotation); + tracks.push( track ); - let callbacks = { - cancel: null, - finish: null, - }; + } - let insertionCallback = (e) => { - if (e.button === THREE.MOUSE.LEFT) { - callbacks.finish(); - } else if (e.button === THREE.MOUSE.RIGHT) { - callbacks.cancel(); } - }; - callbacks.cancel = e => { - annotations.remove(annotation); + var name = animationDef.name ? animationDef.name : 'animation_' + animationIndex; - domElement.removeEventListener('mouseup', insertionCallback, true); - }; + return new AnimationClip( name, undefined, tracks ); - callbacks.finish = e => { - domElement.removeEventListener('mouseup', insertionCallback, true); - }; + } ); - domElement.addEventListener('mouseup', insertionCallback, true); + }; - let drag = (e) => { - let I = Utils.getMousePointCloudIntersection( - e.drag.end, - e.viewer.scene.getActiveCamera(), - e.viewer, - e.viewer.scene.pointclouds, - {pickClipped: true}); + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy + * @param {number} nodeIndex + * @return {Promise} + */ + GLTFParser.prototype.loadNode = function ( nodeIndex ) { - if (I) { - this.s.position.copy(I.location); + var json = this.json; + var extensions = this.extensions; + var parser = this; - annotation.position.copy(I.location); - } - }; + var nodeDef = json.nodes[ nodeIndex ]; - let drop = (e) => { - viewer.scene.scene.remove(this.s); - this.s.removeEventListener("drag", drag); - this.s.removeEventListener("drop", drop); - }; + // reserve node's name before its dependencies, so the root has the intended name. + var nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : ''; - this.s.addEventListener('drag', drag); - this.s.addEventListener('drop', drop); + return ( function () { - this.viewer.scene.scene.add(this.s); - this.viewer.inputHandler.startDragging(this.s); + var pending = []; - return annotation; - } - - update(){ - // let camera = this.viewer.scene.getActiveCamera(); - // let domElement = this.renderer.domElement; - // let measurements = this.viewer.scene.measurements; + if ( nodeDef.mesh !== undefined ) { - // const renderAreaSize = this.renderer.getSize(new THREE.Vector2()); - // let clientWidth = renderAreaSize.width; - // let clientHeight = renderAreaSize.height; + pending.push( parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) { - } + var node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh ); - render(){ - //this.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera()); - } - }; + // if weights are provided on the node, override weights on the mesh. + if ( nodeDef.weights !== undefined ) { - /** - * @author mschuetz / http://mschuetz.at - * - * - */ + node.traverse( function ( o ) { - class InputHandler extends EventDispatcher { - constructor (viewer) { - super(); + if ( ! o.isMesh ) return; - this.viewer = viewer; - this.renderer = viewer.renderer; - this.domElement = this.renderer.domElement; - this.enabled = true; - - this.scene = null; - this.interactiveScenes = []; - this.interactiveObjects = new Set(); - this.inputListeners = []; - this.blacklist = new Set(); + for ( var i = 0, il = nodeDef.weights.length; i < il; i ++ ) { - this.drag = null; - this.mouse = new THREE.Vector2(0, 0); + o.morphTargetInfluences[ i ] = nodeDef.weights[ i ]; - this.selection = []; + } - this.hoveredElements = []; - this.pressedKeys = {}; + } ); - this.wheelDelta = 0; + } - this.speed = 1; + return node; - this.logMessages = false; + } ) ); - if (this.domElement.tabIndex === -1) { - this.domElement.tabIndex = 2222; - } + } - this.domElement.addEventListener('contextmenu', (event) => { event.preventDefault(); }, false); - this.domElement.addEventListener('click', this.onMouseClick.bind(this), false); - this.domElement.addEventListener('mousedown', this.onMouseDown.bind(this), false); - this.domElement.addEventListener('mouseup', this.onMouseUp.bind(this), false); - this.domElement.addEventListener('mousemove', this.onMouseMove.bind(this), false); - this.domElement.addEventListener('mousewheel', this.onMouseWheel.bind(this), false); - this.domElement.addEventListener('DOMMouseScroll', this.onMouseWheel.bind(this), false); // Firefox - this.domElement.addEventListener('dblclick', this.onDoubleClick.bind(this)); - this.domElement.addEventListener('keydown', this.onKeyDown.bind(this)); - this.domElement.addEventListener('keyup', this.onKeyUp.bind(this)); - this.domElement.addEventListener('touchstart', this.onTouchStart.bind(this)); - this.domElement.addEventListener('touchend', this.onTouchEnd.bind(this)); - this.domElement.addEventListener('touchmove', this.onTouchMove.bind(this)); - } + if ( nodeDef.camera !== undefined ) { - addInputListener (listener) { - this.inputListeners.push(listener); - } + pending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) { - removeInputListener (listener) { - this.inputListeners = this.inputListeners.filter(e => e !== listener); - } + return parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera ); - getSortedListeners(){ - return this.inputListeners.sort( (a, b) => { - let ia = (a.importance !== undefined) ? a.importance : 0; - let ib = (b.importance !== undefined) ? b.importance : 0; + } ) ); - return ib - ia; - }); - } + } - onTouchStart (e) { - if (this.logMessages) console.log(this.constructor.name + ': onTouchStart'); + parser._invokeAll( function ( ext ) { - e.preventDefault(); + return ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex ); - if (e.touches.length === 1) { - let rect = this.domElement.getBoundingClientRect(); - let x = e.touches[0].pageX - rect.left; - let y = e.touches[0].pageY - rect.top; - this.mouse.set(x, y); + } ).forEach( function ( promise ) { - this.startDragging(null); - } + pending.push( promise ); - - for (let inputListener of this.getSortedListeners()) { - inputListener.dispatchEvent({ - type: e.type, - touches: e.touches, - changedTouches: e.changedTouches - }); - } - } + } ); - onTouchEnd (e) { - if (this.logMessages) console.log(this.constructor.name + ': onTouchEnd'); + return Promise.all( pending ); - e.preventDefault(); + }() ).then( function ( objects ) { - for (let inputListener of this.getSortedListeners()) { - inputListener.dispatchEvent({ - type: 'drop', - drag: this.drag, - viewer: this.viewer - }); - } + var node; - this.drag = null; + // .isBone isn't in glTF spec. See ._markDefs + if ( nodeDef.isBone === true ) { - for (let inputListener of this.getSortedListeners()) { - inputListener.dispatchEvent({ - type: e.type, - touches: e.touches, - changedTouches: e.changedTouches - }); - } - } + node = new Bone(); - onTouchMove (e) { - if (this.logMessages) console.log(this.constructor.name + ': onTouchMove'); + } else if ( objects.length > 1 ) { - e.preventDefault(); + node = new Group(); - if (e.touches.length === 1) { - let rect = this.domElement.getBoundingClientRect(); - let x = e.touches[0].pageX - rect.left; - let y = e.touches[0].pageY - rect.top; - this.mouse.set(x, y); + } else if ( objects.length === 1 ) { - if (this.drag) { - this.drag.mouse = 1; + node = objects[ 0 ]; - this.drag.lastDrag.x = x - this.drag.end.x; - this.drag.lastDrag.y = y - this.drag.end.y; + } else { - this.drag.end.set(x, y); + node = new Object3D(); - if (this.logMessages) console.log(this.constructor.name + ': drag: '); - for (let inputListener of this.getSortedListeners()) { - inputListener.dispatchEvent({ - type: 'drag', - drag: this.drag, - viewer: this.viewer - }); - } } - } - for (let inputListener of this.getSortedListeners()) { - inputListener.dispatchEvent({ - type: e.type, - touches: e.touches, - changedTouches: e.changedTouches - }); - } + if ( node !== objects[ 0 ] ) { - // DEBUG CODE - // let debugTouches = [...e.touches, { - // pageX: this.domElement.clientWidth / 2, - // pageY: this.domElement.clientHeight / 2}]; - // for(let inputListener of this.getSortedListeners()){ - // inputListener.dispatchEvent({ - // type: e.type, - // touches: debugTouches, - // changedTouches: e.changedTouches - // }); - // } - } + for ( var i = 0, il = objects.length; i < il; i ++ ) { - onKeyDown (e) { - if (this.logMessages) console.log(this.constructor.name + ': onKeyDown'); + node.add( objects[ i ] ); - // DELETE - if (e.keyCode === KeyCodes.DELETE && this.selection.length > 0) { - this.dispatchEvent({ - type: 'delete', - selection: this.selection - }); + } - this.deselectAll(); - } + } - this.dispatchEvent({ - type: 'keydown', - keyCode: e.keyCode, - event: e - }); + if ( nodeDef.name ) { - // for(let l of this.getSortedListeners()){ - // l.dispatchEvent({ - // type: "keydown", - // keyCode: e.keyCode, - // event: e - // }); - // } + node.userData.name = nodeDef.name; + node.name = nodeName; - this.pressedKeys[e.keyCode] = true; + } - // e.preventDefault(); - } + assignExtrasToUserData( node, nodeDef ); - onKeyUp (e) { - if (this.logMessages) console.log(this.constructor.name + ': onKeyUp'); + if ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef ); - delete this.pressedKeys[e.keyCode]; + if ( nodeDef.matrix !== undefined ) { - e.preventDefault(); - } + var matrix = new Matrix4(); + matrix.fromArray( nodeDef.matrix ); + node.applyMatrix4( matrix ); - onDoubleClick (e) { - if (this.logMessages) console.log(this.constructor.name + ': onDoubleClick'); + } else { - let consumed = false; - for (let hovered of this.hoveredElements) { - if (hovered._listeners && hovered._listeners['dblclick']) { - hovered.object.dispatchEvent({ - type: 'dblclick', - mouse: this.mouse, - object: hovered.object - }); - consumed = true; - break; - } - } + if ( nodeDef.translation !== undefined ) { - if (!consumed) { - for (let inputListener of this.getSortedListeners()) { - inputListener.dispatchEvent({ - type: 'dblclick', - mouse: this.mouse, - object: null - }); - } - } + node.position.fromArray( nodeDef.translation ); - e.preventDefault(); - } + } - onMouseClick (e) { - if (this.logMessages) console.log(this.constructor.name + ': onMouseClick'); + if ( nodeDef.rotation !== undefined ) { - e.preventDefault(); - } + node.quaternion.fromArray( nodeDef.rotation ); - onMouseDown (e) { - if (this.logMessages) console.log(this.constructor.name + ': onMouseDown'); + } - e.preventDefault(); + if ( nodeDef.scale !== undefined ) { - let consumed = false; - let consume = () => { return consumed = true; }; - if (this.hoveredElements.length === 0) { - for (let inputListener of this.getSortedListeners()) { - inputListener.dispatchEvent({ - type: 'mousedown', - viewer: this.viewer, - mouse: this.mouse - }); - } - }else { - for(let hovered of this.hoveredElements){ - let object = hovered.object; - object.dispatchEvent({ - type: 'mousedown', - viewer: this.viewer, - consume: consume - }); + node.scale.fromArray( nodeDef.scale ); - if(consumed){ - break; } + } - } - if (!this.drag) { - let target = this.hoveredElements - .find(el => ( - el.object._listeners && - el.object._listeners['drag'] && - el.object._listeners['drag'].length > 0)); + parser.associations.set( node, { type: 'nodes', index: nodeIndex } ); + + return node; + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes + * @param {number} sceneIndex + * @return {Promise} + */ + GLTFParser.prototype.loadScene = function () { + + // scene node hierachy builder + + function buildNodeHierachy( nodeId, parentObject, json, parser ) { + + var nodeDef = json.nodes[ nodeId ]; + + return parser.getDependency( 'node', nodeId ).then( function ( node ) { + + if ( nodeDef.skin === undefined ) return node; + + // build skeleton here as well + + var skinEntry; + + return parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) { + + skinEntry = skin; + + var pendingJoints = []; + + for ( var i = 0, il = skinEntry.joints.length; i < il; i ++ ) { + + pendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) ); + + } + + return Promise.all( pendingJoints ); + + } ).then( function ( jointNodes ) { - if (target) { - this.startDragging(target.object, {location: target.point}); - } else { - this.startDragging(null); - } - } + node.traverse( function ( mesh ) { - if (this.scene) { - this.viewStart = this.scene.view.clone(); - } - } + if ( ! mesh.isMesh ) return; - onMouseUp (e) { - if (this.logMessages) console.log(this.constructor.name + ': onMouseUp'); + var bones = []; + var boneInverses = []; - e.preventDefault(); + for ( var j = 0, jl = jointNodes.length; j < jl; j ++ ) { - let noMovement = this.getNormalizedDrag().length() === 0; + var jointNode = jointNodes[ j ]; - - let consumed = false; - let consume = () => { return consumed = true; }; - if (this.hoveredElements.length === 0) { - for (let inputListener of this.getSortedListeners()) { - inputListener.dispatchEvent({ - type: 'mouseup', - viewer: this.viewer, - mouse: this.mouse, - consume: consume - }); + if ( jointNode ) { - if(consumed){ - break; - } - } - }else { - let hovered = this.hoveredElements - .map(e => e.object) - .find(e => (e._listeners && e._listeners['mouseup'])); - if(hovered){ - hovered.dispatchEvent({ - type: 'mouseup', - viewer: this.viewer, - consume: consume - }); - } - } + bones.push( jointNode ); - if (this.drag) { - if (this.drag.object) { - if (this.logMessages) console.log(`${this.constructor.name}: drop ${this.drag.object.name}`); - this.drag.object.dispatchEvent({ - type: 'drop', - drag: this.drag, - viewer: this.viewer + var mat = new Matrix4(); - }); - } else { - for (let inputListener of this.getSortedListeners()) { - inputListener.dispatchEvent({ - type: 'drop', - drag: this.drag, - viewer: this.viewer - }); - } - } + if ( skinEntry.inverseBindMatrices !== undefined ) { - // check for a click - let clicked = this.hoveredElements.map(h => h.object).find(v => v === this.drag.object) !== undefined; - if(clicked){ - if (this.logMessages) console.log(`${this.constructor.name}: click ${this.drag.object.name}`); - this.drag.object.dispatchEvent({ - type: 'click', - viewer: this.viewer, - consume: consume, - }); - } + mat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 ); - this.drag = null; - } + } - if(!consumed){ - if (e.button === THREE.MOUSE.LEFT) { - if (noMovement) { - let selectable = this.hoveredElements - .find(el => el.object._listeners && el.object._listeners['select']); + boneInverses.push( mat ); - if (selectable) { - selectable = selectable.object; + } else { + + console.warn( 'THREE.GLTFLoader: Joint "%s" could not be found.', skinEntry.joints[ j ] ); + + } - if (this.isSelected(selectable)) { - this.selection - .filter(e => e !== selectable) - .forEach(e => this.toggleSelection(e)); - } else { - this.deselectAll(); - this.toggleSelection(selectable); } - } else { - this.deselectAll(); - } - } - } else if ((e.button === THREE.MOUSE.RIGHT) && noMovement) { - this.deselectAll(); - } - } - } - onMouseMove (e) { - e.preventDefault(); + mesh.bind( new Skeleton( bones, boneInverses ), mesh.matrixWorld ); - let rect = this.domElement.getBoundingClientRect(); - let x = e.clientX - rect.left; - let y = e.clientY - rect.top; - this.mouse.set(x, y); + } ); - let hoveredElements = this.getHoveredElements(); - if(hoveredElements.length > 0){ - let names = hoveredElements.map(h => h.object.name).join(", "); - if (this.logMessages) console.log(`${this.constructor.name}: onMouseMove; hovered: '${names}'`); - } + return node; - if (this.drag) { - this.drag.mouse = e.buttons; + } ); - this.drag.lastDrag.x = x - this.drag.end.x; - this.drag.lastDrag.y = y - this.drag.end.y; + } ).then( function ( node ) { - this.drag.end.set(x, y); + // build node hierachy - if (this.drag.object) { - if (this.logMessages) console.log(this.constructor.name + ': drag: ' + this.drag.object.name); - this.drag.object.dispatchEvent({ - type: 'drag', - drag: this.drag, - viewer: this.viewer - }); - } else { - if (this.logMessages) console.log(this.constructor.name + ': drag: '); + parentObject.add( node ); - let dragConsumed = false; - for (let inputListener of this.getSortedListeners()) { - inputListener.dispatchEvent({ - type: 'drag', - drag: this.drag, - viewer: this.viewer, - consume: () => {dragConsumed = true;} - }); + var pending = []; + + if ( nodeDef.children ) { + + var children = nodeDef.children; + + for ( var i = 0, il = children.length; i < il; i ++ ) { + + var child = children[ i ]; + pending.push( buildNodeHierachy( child, node, json, parser ) ); - if(dragConsumed){ - break; } - } - } - }else { - let curr = hoveredElements.map(a => a.object).find(a => true); - let prev = this.hoveredElements.map(a => a.object).find(a => true); - if(curr !== prev){ - if(curr){ - if (this.logMessages) console.log(`${this.constructor.name}: mouseover: ${curr.name}`); - curr.dispatchEvent({ - type: 'mouseover', - object: curr, - }); - } - if(prev){ - if (this.logMessages) console.log(`${this.constructor.name}: mouseleave: ${prev.name}`); - prev.dispatchEvent({ - type: 'mouseleave', - object: prev, - }); } - } - if(hoveredElements.length > 0){ - let object = hoveredElements - .map(e => e.object) - .find(e => (e._listeners && e._listeners['mousemove'])); - - if(object){ - object.dispatchEvent({ - type: 'mousemove', - object: object - }); - } - } + return Promise.all( pending ); + + } ); } - - // for (let inputListener of this.getSortedListeners()) { - // inputListener.dispatchEvent({ - // type: 'mousemove', - // object: null - // }); - // } - - this.hoveredElements = hoveredElements; - } - - onMouseWheel(e){ - if(!this.enabled) return; + return function loadScene( sceneIndex ) { - if(this.logMessages) console.log(this.constructor.name + ": onMouseWheel"); - - e.preventDefault(); + var json = this.json; + var extensions = this.extensions; + var sceneDef = this.json.scenes[ sceneIndex ]; + var parser = this; - let delta = 0; - if (e.wheelDelta !== undefined) { // WebKit / Opera / Explorer 9 - delta = e.wheelDelta; - } else if (e.detail !== undefined) { // Firefox - delta = -e.detail; - } + // Loader returns Group, not Scene. + // See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172 + var scene = new Group(); + if ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name ); - let ndelta = Math.sign(delta); + assignExtrasToUserData( scene, sceneDef ); - // this.wheelDelta += Math.sign(delta); + if ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef ); - if (this.hoveredElement) { - this.hoveredElement.object.dispatchEvent({ - type: 'mousewheel', - delta: ndelta, - object: this.hoveredElement.object - }); - } else { - for (let inputListener of this.getSortedListeners()) { - inputListener.dispatchEvent({ - type: 'mousewheel', - delta: ndelta, - object: null - }); - } - } - } + var nodeIds = sceneDef.nodes || []; - startDragging (object, args = null) { + var pending = []; - let name = object ? object.name : "no name"; - if (this.logMessages) console.log(`${this.constructor.name}: startDragging: '${name}'`); + for ( var i = 0, il = nodeIds.length; i < il; i ++ ) { - this.drag = { - start: this.mouse.clone(), - end: this.mouse.clone(), - lastDrag: new THREE.Vector2(0, 0), - startView: this.scene.view.clone(), - object: object - }; + pending.push( buildNodeHierachy( nodeIds[ i ], scene, json, parser ) ); - if (args) { - for (let key of Object.keys(args)) { - this.drag[key] = args[key]; } - } - } - - getMousePointCloudIntersection (mouse) { - return Utils.getMousePointCloudIntersection( - this.mouse, - this.scene.getActiveCamera(), - this.viewer, - this.scene.pointclouds); - } - toggleSelection (object) { - let oldSelection = this.selection; + return Promise.all( pending ).then( function () { - let index = this.selection.indexOf(object); + return scene; - if (index === -1) { - this.selection.push(object); - object.dispatchEvent({ - type: 'select' - }); - } else { - this.selection.splice(index, 1); - object.dispatchEvent({ - type: 'deselect' - }); - } + } ); - this.dispatchEvent({ - type: 'selection_changed', - oldSelection: oldSelection, - selection: this.selection - }); - } + }; - deselect(object){ + }(); - let oldSelection = this.selection; + return GLTFLoader; - let index = this.selection.indexOf(object); + } )(); - if(index >= 0){ - this.selection.splice(index, 1); - object.dispatchEvent({ - type: 'deselect' - }); + /** + * @webxr-input-profiles/motion-controllers 1.0.0 https://github.com/immersive-web/webxr-input-profiles + */ - this.dispatchEvent({ - type: 'selection_changed', - oldSelection: oldSelection, - selection: this.selection - }); - } - } + const Constants = { + Handedness: Object.freeze({ + NONE: 'none', + LEFT: 'left', + RIGHT: 'right' + }), + + ComponentState: Object.freeze({ + DEFAULT: 'default', + TOUCHED: 'touched', + PRESSED: 'pressed' + }), + + ComponentProperty: Object.freeze({ + BUTTON: 'button', + X_AXIS: 'xAxis', + Y_AXIS: 'yAxis', + STATE: 'state' + }), + + ComponentType: Object.freeze({ + TRIGGER: 'trigger', + SQUEEZE: 'squeeze', + TOUCHPAD: 'touchpad', + THUMBSTICK: 'thumbstick', + BUTTON: 'button' + }), + + ButtonTouchThreshold: 0.05, + + AxisTouchThreshold: 0.1, + + VisualResponseProperty: Object.freeze({ + TRANSFORM: 'transform', + VISIBILITY: 'visibility' + }) + }; - deselectAll () { - for (let object of this.selection) { - object.dispatchEvent({ - type: 'deselect' - }); - } + /** + * @description Static helper function to fetch a JSON file and turn it into a JS object + * @param {string} path - Path to JSON file to be fetched + */ + async function fetchJsonFile(path) { + const response = await fetch(path); + if (!response.ok) { + throw new Error(response.statusText); + } else { + return response.json(); + } + } - let oldSelection = this.selection; + async function fetchProfilesList(basePath) { + if (!basePath) { + throw new Error('No basePath supplied'); + } - if (this.selection.length > 0) { - this.selection = []; - this.dispatchEvent({ - type: 'selection_changed', - oldSelection: oldSelection, - selection: this.selection - }); - } - } + const profileListFileName = 'profilesList.json'; + const profilesList = await fetchJsonFile(`${basePath}/${profileListFileName}`); + return profilesList; + } - isSelected (object) { - let index = this.selection.indexOf(object); + async function fetchProfile(xrInputSource, basePath, defaultProfile = null, getAssetPath = true) { + if (!xrInputSource) { + throw new Error('No xrInputSource supplied'); + } + + if (!basePath) { + throw new Error('No basePath supplied'); + } + + // Get the list of profiles + const supportedProfilesList = await fetchProfilesList(basePath); + + // Find the relative path to the first requested profile that is recognized + let match; + xrInputSource.profiles.some((profileId) => { + const supportedProfile = supportedProfilesList[profileId]; + if (supportedProfile) { + match = { + profileId, + profilePath: `${basePath}/${supportedProfile.path}`, + deprecated: !!supportedProfile.deprecated + }; + } + return !!match; + }); - return index !== -1; - } + if (!match) { + if (!defaultProfile) { + throw new Error('No matching profile name found'); + } - registerInteractiveObject(object){ - this.interactiveObjects.add(object); - } + const supportedProfile = supportedProfilesList[defaultProfile]; + if (!supportedProfile) { + throw new Error(`No matching profile name found and default profile "${defaultProfile}" missing.`); + } - removeInteractiveObject(object){ - this.interactiveObjects.delete(object); - } + match = { + profileId: defaultProfile, + profilePath: `${basePath}/${supportedProfile.path}`, + deprecated: !!supportedProfile.deprecated + }; + } - registerInteractiveScene (scene) { - let index = this.interactiveScenes.indexOf(scene); - if (index === -1) { - this.interactiveScenes.push(scene); - } - } + const profile = await fetchJsonFile(match.profilePath); - unregisterInteractiveScene (scene) { - let index = this.interactiveScenes.indexOf(scene); - if (index > -1) { - this.interactiveScenes.splice(index, 1); - } - } + let assetPath; + if (getAssetPath) { + let layout; + if (xrInputSource.handedness === 'any') { + layout = profile.layouts[Object.keys(profile.layouts)[0]]; + } else { + layout = profile.layouts[xrInputSource.handedness]; + } + if (!layout) { + throw new Error( + `No matching handedness, ${xrInputSource.handedness}, in profile ${match.profileId}` + ); + } - getHoveredElement () { - let hoveredElements = this.getHoveredElements(); - if (hoveredElements.length > 0) { - return hoveredElements[0]; - } else { - return null; - } - } + if (layout.assetPath) { + assetPath = match.profilePath.replace('profile.json', layout.assetPath); + } + } - getHoveredElements () { - let scenes = this.interactiveScenes.concat(this.scene.scene); + return { profile, assetPath }; + } - let interactableListeners = ['mouseup', 'mousemove', 'mouseover', 'mouseleave', 'drag', 'drop', 'click', 'select', 'deselect']; - let interactables = []; - for (let scene of scenes) { - scene.traverseVisible(node => { - if (node._listeners && node.visible && !this.blacklist.has(node)) { - let hasInteractableListener = interactableListeners.filter((e) => { - return node._listeners[e] !== undefined; - }).length > 0; + /** @constant {Object} */ + const defaultComponentValues = { + xAxis: 0, + yAxis: 0, + button: 0, + state: Constants.ComponentState.DEFAULT + }; - if (hasInteractableListener) { - interactables.push(node); - } - } - }); - } - - let camera = this.scene.getActiveCamera(); - let ray = Utils.mouseToRay(this.mouse, camera, this.domElement.clientWidth, this.domElement.clientHeight); - - let raycaster = new THREE.Raycaster(); - raycaster.ray.set(ray.origin, ray.direction); - raycaster.linePrecision = 0.2; + /** + * @description Converts an X, Y coordinate from the range -1 to 1 (as reported by the Gamepad + * API) to the range 0 to 1 (for interpolation). Also caps the X, Y values to be bounded within + * a circle. This ensures that thumbsticks are not animated outside the bounds of their physical + * range of motion and touchpads do not report touch locations off their physical bounds. + * @param {number} x The original x coordinate in the range -1 to 1 + * @param {number} y The original y coordinate in the range -1 to 1 + */ + function normalizeAxes(x = 0, y = 0) { + let xAxis = x; + let yAxis = y; + + // Determine if the point is outside the bounds of the circle + // and, if so, place it on the edge of the circle + const hypotenuse = Math.sqrt((x * x) + (y * y)); + if (hypotenuse > 1) { + const theta = Math.atan2(y, x); + xAxis = Math.cos(theta); + yAxis = Math.sin(theta); + } + + // Scale and move the circle so values are in the interpolation range. The circle's origin moves + // from (0, 0) to (0.5, 0.5). The circle's radius scales from 1 to be 0.5. + const result = { + normalizedXAxis: (xAxis * 0.5) + 0.5, + normalizedYAxis: (yAxis * 0.5) + 0.5 + }; + return result; + } - let intersections = raycaster.intersectObjects(interactables.filter(o => o.visible), false); + /** + * Contains the description of how the 3D model should visually respond to a specific user input. + * This is accomplished by initializing the object with the name of a node in the 3D model and + * property that need to be modified in response to user input, the name of the nodes representing + * the allowable range of motion, and the name of the input which triggers the change. In response + * to the named input changing, this object computes the appropriate weighting to use for + * interpolating between the range of motion nodes. + */ + class VisualResponse { + constructor(visualResponseDescription) { + this.componentProperty = visualResponseDescription.componentProperty; + this.states = visualResponseDescription.states; + this.valueNodeName = visualResponseDescription.valueNodeName; + this.valueNodeProperty = visualResponseDescription.valueNodeProperty; + + if (this.valueNodeProperty === Constants.VisualResponseProperty.TRANSFORM) { + this.minNodeName = visualResponseDescription.minNodeName; + this.maxNodeName = visualResponseDescription.maxNodeName; + } - return intersections; + // Initializes the response's current value based on default data + this.value = 0; + this.updateFromComponent(defaultComponentValues); + } + + /** + * Computes the visual response's interpolation weight based on component state + * @param {Object} componentValues - The component from which to update + * @param {number} xAxis - The reported X axis value of the component + * @param {number} yAxis - The reported Y axis value of the component + * @param {number} button - The reported value of the component's button + * @param {string} state - The component's active state + */ + updateFromComponent({ + xAxis, yAxis, button, state + }) { + const { normalizedXAxis, normalizedYAxis } = normalizeAxes(xAxis, yAxis); + switch (this.componentProperty) { + case Constants.ComponentProperty.X_AXIS: + this.value = (this.states.includes(state)) ? normalizedXAxis : 0.5; + break; + case Constants.ComponentProperty.Y_AXIS: + this.value = (this.states.includes(state)) ? normalizedYAxis : 0.5; + break; + case Constants.ComponentProperty.BUTTON: + this.value = (this.states.includes(state)) ? button : 0; + break; + case Constants.ComponentProperty.STATE: + if (this.valueNodeProperty === Constants.VisualResponseProperty.VISIBILITY) { + this.value = (this.states.includes(state)); + } else { + this.value = this.states.includes(state) ? 1.0 : 0.0; + } + break; + default: + throw new Error(`Unexpected visualResponse componentProperty ${this.componentProperty}`); + } + } + } - // if(intersections.length > 0){ - // return intersections[0]; - // }else{ - // return null; - // } - } + class Component { + /** + * @param {Object} componentId - Id of the component + * @param {Object} componentDescription - Description of the component to be created + */ + constructor(componentId, componentDescription) { + if (!componentId + || !componentDescription + || !componentDescription.visualResponses + || !componentDescription.gamepadIndices + || Object.keys(componentDescription.gamepadIndices).length === 0) { + throw new Error('Invalid arguments supplied'); + } - setScene (scene) { - this.deselectAll(); + this.id = componentId; + this.type = componentDescription.type; + this.rootNodeName = componentDescription.rootNodeName; + this.touchPointNodeName = componentDescription.touchPointNodeName; + + // Build all the visual responses for this component + this.visualResponses = {}; + Object.keys(componentDescription.visualResponses).forEach((responseName) => { + const visualResponse = new VisualResponse(componentDescription.visualResponses[responseName]); + this.visualResponses[responseName] = visualResponse; + }); + + // Set default values + this.gamepadIndices = Object.assign({}, componentDescription.gamepadIndices); + + this.values = { + state: Constants.ComponentState.DEFAULT, + button: (this.gamepadIndices.button !== undefined) ? 0 : undefined, + xAxis: (this.gamepadIndices.xAxis !== undefined) ? 0 : undefined, + yAxis: (this.gamepadIndices.yAxis !== undefined) ? 0 : undefined + }; + } + + get data() { + const data = { id: this.id, ...this.values }; + return data; + } + + /** + * @description Poll for updated data based on current gamepad state + * @param {Object} gamepad - The gamepad object from which the component data should be polled + */ + updateFromGamepad(gamepad) { + // Set the state to default before processing other data sources + this.values.state = Constants.ComponentState.DEFAULT; + + // Get and normalize button + if (this.gamepadIndices.button !== undefined + && gamepad.buttons.length > this.gamepadIndices.button) { + const gamepadButton = gamepad.buttons[this.gamepadIndices.button]; + this.values.button = gamepadButton.value; + this.values.button = (this.values.button < 0) ? 0 : this.values.button; + this.values.button = (this.values.button > 1) ? 1 : this.values.button; + + // Set the state based on the button + if (gamepadButton.pressed || this.values.button === 1) { + this.values.state = Constants.ComponentState.PRESSED; + } else if (gamepadButton.touched || this.values.button > Constants.ButtonTouchThreshold) { + this.values.state = Constants.ComponentState.TOUCHED; + } + } - this.scene = scene; - } + // Get and normalize x axis value + if (this.gamepadIndices.xAxis !== undefined + && gamepad.axes.length > this.gamepadIndices.xAxis) { + this.values.xAxis = gamepad.axes[this.gamepadIndices.xAxis]; + this.values.xAxis = (this.values.xAxis < -1) ? -1 : this.values.xAxis; + this.values.xAxis = (this.values.xAxis > 1) ? 1 : this.values.xAxis; + + // If the state is still default, check if the xAxis makes it touched + if (this.values.state === Constants.ComponentState.DEFAULT + && Math.abs(this.values.xAxis) > Constants.AxisTouchThreshold) { + this.values.state = Constants.ComponentState.TOUCHED; + } + } - update (delta) { + // Get and normalize Y axis value + if (this.gamepadIndices.yAxis !== undefined + && gamepad.axes.length > this.gamepadIndices.yAxis) { + this.values.yAxis = gamepad.axes[this.gamepadIndices.yAxis]; + this.values.yAxis = (this.values.yAxis < -1) ? -1 : this.values.yAxis; + this.values.yAxis = (this.values.yAxis > 1) ? 1 : this.values.yAxis; + + // If the state is still default, check if the yAxis makes it touched + if (this.values.state === Constants.ComponentState.DEFAULT + && Math.abs(this.values.yAxis) > Constants.AxisTouchThreshold) { + this.values.state = Constants.ComponentState.TOUCHED; + } + } - } + // Update the visual response weights based on the current component data + Object.values(this.visualResponses).forEach((visualResponse) => { + visualResponse.updateFromComponent(this.values); + }); + } + } - getNormalizedDrag () { - if (!this.drag) { - return new THREE.Vector2(0, 0); - } + /** + * @description Builds a motion controller with components and visual responses based on the + * supplied profile description. Data is polled from the xrInputSource's gamepad. + * @author Nell Waliczek / https://github.com/NellWaliczek + */ + class MotionController { + /** + * @param {Object} xrInputSource - The XRInputSource to build the MotionController around + * @param {Object} profile - The best matched profile description for the supplied xrInputSource + * @param {Object} assetUrl + */ + constructor(xrInputSource, profile, assetUrl) { + if (!xrInputSource) { + throw new Error('No xrInputSource supplied'); + } - let diff = new THREE.Vector2().subVectors(this.drag.end, this.drag.start); + if (!profile) { + throw new Error('No profile supplied'); + } - diff.x = diff.x / this.domElement.clientWidth; - diff.y = diff.y / this.domElement.clientHeight; + this.xrInputSource = xrInputSource; + this.assetUrl = assetUrl; + this.id = profile.profileId; + + // Build child components as described in the profile description + this.layoutDescription = profile.layouts[xrInputSource.handedness]; + this.components = {}; + Object.keys(this.layoutDescription.components).forEach((componentId) => { + const componentDescription = this.layoutDescription.components[componentId]; + this.components[componentId] = new Component(componentId, componentDescription); + }); + + // Initialize components based on current gamepad state + this.updateFromGamepad(); + } + + get gripSpace() { + return this.xrInputSource.gripSpace; + } + + get targetRaySpace() { + return this.xrInputSource.targetRaySpace; + } + + /** + * @description Returns a subset of component data for simplified debugging + */ + get data() { + const data = []; + Object.values(this.components).forEach((component) => { + data.push(component.data); + }); + return data; + } + + /** + * @description Poll for updated data based on current gamepad state + */ + updateFromGamepad() { + Object.values(this.components).forEach((component) => { + component.updateFromGamepad(this.xrInputSource.gamepad); + }); + } + } - return diff; - } + const DEFAULT_PROFILES_PATH = 'https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles'; + const DEFAULT_PROFILE = 'generic-trigger'; - getNormalizedLastDrag () { - if (!this.drag) { - return new THREE.Vector2(0, 0); - } + function XRControllerModel( ) { - let lastDrag = this.drag.lastDrag.clone(); + Object3D.call( this ); - lastDrag.x = lastDrag.x / this.domElement.clientWidth; - lastDrag.y = lastDrag.y / this.domElement.clientHeight; + this.motionController = null; + this.envMap = null; - return lastDrag; - } } - class NavigationCube extends THREE.Object3D { + XRControllerModel.prototype = Object.assign( Object.create( Object3D.prototype ), { - constructor(viewer){ - super(); + constructor: XRControllerModel, - this.viewer = viewer; + setEnvironmentMap: function ( envMap ) { - let createPlaneMaterial = (img) => { - let material = new THREE.MeshBasicMaterial( { - depthTest: true, - depthWrite: true, - side: THREE.DoubleSide - }); - new THREE.TextureLoader().load( - exports.resourcePath + '/textures/navigation/' + img, - function(texture) { - texture.anisotropy = viewer.renderer.capabilities.getMaxAnisotropy(); - material.map = texture; - material.needsUpdate = true; - }); - return material; - }; + if ( this.envMap == envMap ) { - let planeGeometry = new THREE.PlaneGeometry(1, 1); + return this; - this.front = new THREE.Mesh(planeGeometry, createPlaneMaterial('F.png')); - this.front.position.y = -0.5; - this.front.rotation.x = Math.PI / 2.0; - this.front.updateMatrixWorld(); - this.front.name = "F"; - this.add(this.front); + } - this.back = new THREE.Mesh(planeGeometry, createPlaneMaterial('B.png')); - this.back.position.y = 0.5; - this.back.rotation.x = Math.PI / 2.0; - this.back.updateMatrixWorld(); - this.back.name = "B"; - this.add(this.back); + this.envMap = envMap; + this.traverse( ( child ) => { - this.left = new THREE.Mesh(planeGeometry, createPlaneMaterial('L.png')); - this.left.position.x = -0.5; - this.left.rotation.y = Math.PI / 2.0; - this.left.updateMatrixWorld(); - this.left.name = "L"; - this.add(this.left); + if ( child.isMesh ) { - this.right = new THREE.Mesh(planeGeometry, createPlaneMaterial('R.png')); - this.right.position.x = 0.5; - this.right.rotation.y = Math.PI / 2.0; - this.right.updateMatrixWorld(); - this.right.name = "R"; - this.add(this.right); + child.material.envMap = this.envMap; + child.material.needsUpdate = true; - this.bottom = new THREE.Mesh(planeGeometry, createPlaneMaterial('D.png')); - this.bottom.position.z = -0.5; - this.bottom.updateMatrixWorld(); - this.bottom.name = "D"; - this.add(this.bottom); + } - this.top = new THREE.Mesh(planeGeometry, createPlaneMaterial('U.png')); - this.top.position.z = 0.5; - this.top.updateMatrixWorld(); - this.top.name = "U"; - this.add(this.top); + } ); - this.width = 150; // in px + return this; - this.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, -1, 1); - this.camera.position.copy(new THREE.Vector3(0, 0, 0)); - this.camera.lookAt(new THREE.Vector3(0, 1, 0)); - this.camera.updateMatrixWorld(); - this.camera.rotation.order = "ZXY"; + }, - let onMouseDown = (event) => { - if (!this.visible) { - return; - } - - this.pickedFace = null; - let mouse = new THREE.Vector2(); - mouse.x = event.clientX - (window.innerWidth - this.width); - mouse.y = event.clientY; + /** + * Polls data from the XRInputSource and updates the model's components to match + * the real world data + */ + updateMatrixWorld: function ( force ) { - if(mouse.x < 0 || mouse.y > this.width) return; + Object3D.prototype.updateMatrixWorld.call( this, force ); - mouse.x = (mouse.x / this.width) * 2 - 1; - mouse.y = -(mouse.y / this.width) * 2 + 1; + if ( ! this.motionController ) return; - let raycaster = new THREE.Raycaster(); - raycaster.setFromCamera(mouse, this.camera); - raycaster.ray.origin.sub(this.camera.getWorldDirection(new THREE.Vector3())); + // Cause the MotionController to poll the Gamepad for data + this.motionController.updateFromGamepad(); - let intersects = raycaster.intersectObjects(this.children); + // Update the 3D model to reflect the button, thumbstick, and touchpad state + Object.values( this.motionController.components ).forEach( ( component ) => { - let minDistance = 1000; - for (let i = 0; i < intersects.length; i++) { - if(intersects[i].distance < minDistance) { - this.pickedFace = intersects[i].object.name; - minDistance = intersects[i].distance; - } - } - - if(this.pickedFace) { - this.viewer.setView(this.pickedFace); - } - }; + // Update node data based on the visual responses' current states + Object.values( component.visualResponses ).forEach( ( visualResponse ) => { - this.viewer.renderer.domElement.addEventListener('mousedown', onMouseDown, false); - } + const { valueNode, minNode, maxNode, value, valueNodeProperty } = visualResponse; - update(rotation) { - this.camera.rotation.copy(rotation); - this.camera.updateMatrixWorld(); - } + // Skip if the visual response node is not found. No error is needed, + // because it will have been reported at load time. + if ( ! valueNode ) return; - } + // Calculate the new properties based on the weight supplied + if ( valueNodeProperty === Constants.VisualResponseProperty.VISIBILITY ) { - /** - * @author mschuetz / http://mschuetz.at - * - * adapted from THREE.OrbitControls by - * - * @author qiao / https://github.com/qiao - * @author mrdoob / http://mrdoob.com - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author erich666 / http://erichaines.com - * - * - * - */ + valueNode.visible = value; - - class OrbitControls extends EventDispatcher{ - - constructor(viewer){ - super(); - - this.viewer = viewer; - this.renderer = viewer.renderer; + } else if ( valueNodeProperty === Constants.VisualResponseProperty.TRANSFORM ) { - this.scene = null; - this.sceneControls = new THREE.Scene(); + Quaternion.slerp( + minNode.quaternion, + maxNode.quaternion, + valueNode.quaternion, + value + ); - this.rotationSpeed = 5; + valueNode.position.lerpVectors( + minNode.position, + maxNode.position, + value + ); - this.fadeFactor = 20; - this.yawDelta = 0; - this.pitchDelta = 0; - this.panDelta = new THREE.Vector2(0, 0); - this.radiusDelta = 0; + } + + } ); + + } ); + + } - this.doubleClockZoomEnabled = true; + } ); - this.tweens = []; + /** + * Walks the model's tree to find the nodes needed to animate the components and + * saves them to the motionContoller components for use in the frame loop. When + * touchpads are found, attaches a touch dot to them. + */ + function findNodes( motionController, scene ) { - let drag = (e) => { - if (e.drag.object !== null) { - return; - } + // Loop through the components and find the nodes needed for each components' visual responses + Object.values( motionController.components ).forEach( ( component ) => { - if (e.drag.startHandled === undefined) { - e.drag.startHandled = true; + const { type, touchPointNodeName, visualResponses } = component; - this.dispatchEvent({type: 'start'}); - } + if ( type === Constants.ComponentType.TOUCHPAD ) { - let ndrag = { - x: e.drag.lastDrag.x / this.renderer.domElement.clientWidth, - y: e.drag.lastDrag.y / this.renderer.domElement.clientHeight - }; + component.touchPointNode = scene.getObjectByName( touchPointNodeName ); + if ( component.touchPointNode ) { - if (e.drag.mouse === MOUSE.LEFT) { - this.yawDelta += ndrag.x * this.rotationSpeed; - this.pitchDelta += ndrag.y * this.rotationSpeed; + // Attach a touch dot to the touchpad. + const sphereGeometry = new SphereBufferGeometry( 0.001 ); + const material = new MeshBasicMaterial( { color: 0x0000FF } ); + const sphere = new Mesh( sphereGeometry, material ); + component.touchPointNode.add( sphere ); - this.stopTweens(); - } else if (e.drag.mouse === MOUSE.RIGHT) { - this.panDelta.x += ndrag.x; - this.panDelta.y += ndrag.y; + } else { + + console.warn( `Could not find touch dot, ${component.touchPointNodeName}, in touchpad component ${component.id}` ); - this.stopTweens(); } - }; - let drop = e => { - this.dispatchEvent({type: 'end'}); - }; + } - let scroll = (e) => { - let resolvedRadius = this.scene.view.radius + this.radiusDelta; + // Loop through all the visual responses to be applied to this component + Object.values( visualResponses ).forEach( ( visualResponse ) => { - this.radiusDelta += -e.delta * resolvedRadius * 0.1; + const { valueNodeName, minNodeName, maxNodeName, valueNodeProperty } = visualResponse; - this.stopTweens(); - }; + // If animating a transform, find the two nodes to be interpolated between. + if ( valueNodeProperty === Constants.VisualResponseProperty.TRANSFORM ) { - let dblclick = (e) => { - if(this.doubleClockZoomEnabled){ - this.zoomToLocation(e.mouse); - } - }; + visualResponse.minNode = scene.getObjectByName( minNodeName ); + visualResponse.maxNode = scene.getObjectByName( maxNodeName ); - let previousTouch = null; - let touchStart = e => { - previousTouch = e; - }; + // If the extents cannot be found, skip this animation + if ( ! visualResponse.minNode ) { - let touchEnd = e => { - previousTouch = e; - }; + console.warn( `Could not find ${minNodeName} in the model` ); + return; - let touchMove = e => { - if (e.touches.length === 2 && previousTouch.touches.length === 2){ - let prev = previousTouch; - let curr = e; + } - let prevDX = prev.touches[0].pageX - prev.touches[1].pageX; - let prevDY = prev.touches[0].pageY - prev.touches[1].pageY; - let prevDist = Math.sqrt(prevDX * prevDX + prevDY * prevDY); + if ( ! visualResponse.maxNode ) { - let currDX = curr.touches[0].pageX - curr.touches[1].pageX; - let currDY = curr.touches[0].pageY - curr.touches[1].pageY; - let currDist = Math.sqrt(currDX * currDX + currDY * currDY); + console.warn( `Could not find ${maxNodeName} in the model` ); + return; - let delta = currDist / prevDist; - let resolvedRadius = this.scene.view.radius + this.radiusDelta; - let newRadius = resolvedRadius / delta; - this.radiusDelta = newRadius - resolvedRadius; + } - this.stopTweens(); - }else if(e.touches.length === 3 && previousTouch.touches.length === 3){ - let prev = previousTouch; - let curr = e; + } - let prevMeanX = (prev.touches[0].pageX + prev.touches[1].pageX + prev.touches[2].pageX) / 3; - let prevMeanY = (prev.touches[0].pageY + prev.touches[1].pageY + prev.touches[2].pageY) / 3; + // If the target node cannot be found, skip this animation + visualResponse.valueNode = scene.getObjectByName( valueNodeName ); + if ( ! visualResponse.valueNode ) { - let currMeanX = (curr.touches[0].pageX + curr.touches[1].pageX + curr.touches[2].pageX) / 3; - let currMeanY = (curr.touches[0].pageY + curr.touches[1].pageY + curr.touches[2].pageY) / 3; + console.warn( `Could not find ${valueNodeName} in the model` ); - let delta = { - x: (currMeanX - prevMeanX) / this.renderer.domElement.clientWidth, - y: (currMeanY - prevMeanY) / this.renderer.domElement.clientHeight - }; + } - this.panDelta.x += delta.x; - this.panDelta.y += delta.y; + } ); - this.stopTweens(); - } + } ); - previousTouch = e; - }; + } - this.addEventListener('touchstart', touchStart); - this.addEventListener('touchend', touchEnd); - this.addEventListener('touchmove', touchMove); - this.addEventListener('drag', drag); - this.addEventListener('drop', drop); - this.addEventListener('mousewheel', scroll); - this.addEventListener('dblclick', dblclick); - } + function addAssetSceneToControllerModel( controllerModel, scene ) { - setScene (scene) { - this.scene = scene; - } + // Find the nodes needed for animation and cache them on the motionController. + findNodes( controllerModel.motionController, scene ); - stop(){ - this.yawDelta = 0; - this.pitchDelta = 0; - this.radiusDelta = 0; - this.panDelta.set(0, 0); - } - - zoomToLocation(mouse){ - let camera = this.scene.getActiveCamera(); - - let I = Utils.getMousePointCloudIntersection( - mouse, - camera, - this.viewer, - this.scene.pointclouds, - {pickClipped: true}); + // Apply any environment map that the mesh already has set. + if ( controllerModel.envMap ) { - if (I === null) { - return; - } + scene.traverse( ( child ) => { - let targetRadius = 0; - { - let minimumJumpDistance = 0.2; + if ( child.isMesh ) { - let domElement = this.renderer.domElement; - let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); + child.material.envMap = controllerModel.envMap; + child.material.needsUpdate = true; - let nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray); - let lastNode = nodes[nodes.length - 1]; - let radius = lastNode.getBoundingSphere(new THREE.Sphere()).radius; - targetRadius = Math.min(this.scene.view.radius, radius); - targetRadius = Math.max(minimumJumpDistance, targetRadius); - } + } - let d = this.scene.view.direction.multiplyScalar(-1); - let cameraTargetPosition = new THREE.Vector3().addVectors(I.location, d.multiplyScalar(targetRadius)); - // TODO Unused: let controlsTargetPosition = I.location; + } ); - let animationDuration = 600; - let easing = TWEEN.Easing.Quartic.Out; + } - { // animate - let value = {x: 0}; - let tween = new TWEEN.Tween(value).to({x: 1}, animationDuration); - tween.easing(easing); - this.tweens.push(tween); + // Add the glTF scene to the controllerModel. + controllerModel.add( scene ); - let startPos = this.scene.view.position.clone(); - let targetPos = cameraTargetPosition.clone(); - let startRadius = this.scene.view.radius; - let targetRadius = cameraTargetPosition.distanceTo(I.location); + } - tween.onUpdate(() => { - let t = value.x; - this.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x; - this.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y; - this.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z; + var XRControllerModelFactory = ( function () { - this.scene.view.radius = (1 - t) * startRadius + t * targetRadius; - this.viewer.setMoveSpeed(this.scene.view.radius / 2.5); - }); + function XRControllerModelFactory( gltfLoader = null ) { - tween.onComplete(() => { - this.tweens = this.tweens.filter(e => e !== tween); - }); + this.gltfLoader = gltfLoader; + this.path = DEFAULT_PROFILES_PATH; + this._assetCache = {}; + + // If a GLTFLoader wasn't supplied to the constructor create a new one. + if ( ! this.gltfLoader ) { + + this.gltfLoader = new GLTFLoader(); - tween.start(); } - } - stopTweens () { - this.tweens.forEach(e => e.stop()); - this.tweens = []; } - update (delta) { - let view = this.scene.view; + XRControllerModelFactory.prototype = { - { // apply rotation - let progression = Math.min(1, this.fadeFactor * delta); + constructor: XRControllerModelFactory, - let yaw = view.yaw; - let pitch = view.pitch; - let pivot = view.getPivot(); + createControllerModel: function ( controller ) { - yaw -= progression * this.yawDelta; - pitch -= progression * this.pitchDelta; + const controllerModel = new XRControllerModel(); + let scene = null; - view.yaw = yaw; - view.pitch = pitch; + controller.addEventListener( 'connected', ( event ) => { - let V = this.scene.view.direction.multiplyScalar(-view.radius); - let position = new THREE.Vector3().addVectors(pivot, V); + const xrInputSource = event.data; - view.position.copy(position); - } + if ( xrInputSource.targetRayMode !== 'tracked-pointer' || ! xrInputSource.gamepad ) return; - { // apply pan - let progression = Math.min(1, this.fadeFactor * delta); - let panDistance = progression * view.radius * 3; + fetchProfile( xrInputSource, this.path, DEFAULT_PROFILE ).then( ( { profile, assetPath } ) => { - let px = -this.panDelta.x * panDistance; - let py = this.panDelta.y * panDistance; + controllerModel.motionController = new MotionController( + xrInputSource, + profile, + assetPath + ); - view.pan(px, py); - } + const cachedAsset = this._assetCache[ controllerModel.motionController.assetUrl ]; + if ( cachedAsset ) { - { // apply zoom - let progression = Math.min(1, this.fadeFactor * delta); + scene = cachedAsset.scene.clone(); - // let radius = view.radius + progression * this.radiusDelta * view.radius * 0.1; - let radius = view.radius + progression * this.radiusDelta; + addAssetSceneToControllerModel( controllerModel, scene ); - let V = view.direction.multiplyScalar(-radius); - let position = new THREE.Vector3().addVectors(view.getPivot(), V); - view.radius = radius; + } else { - view.position.copy(position); - } + if ( ! this.gltfLoader ) { - { - let speed = view.radius / 2.5; - this.viewer.setMoveSpeed(speed); - } + throw new Error( 'GLTFLoader not set.' ); - { // decelerate over time - let progression = Math.min(1, this.fadeFactor * delta); - let attenuation = Math.max(0, 1 - this.fadeFactor * delta); + } - this.yawDelta *= attenuation; - this.pitchDelta *= attenuation; - this.panDelta.multiplyScalar(attenuation); - // this.radiusDelta *= attenuation; - this.radiusDelta -= progression * this.radiusDelta; - } - } - }; + this.gltfLoader.setPath( '' ); + this.gltfLoader.load( controllerModel.motionController.assetUrl, ( asset ) => { - /** - * @author mschuetz / http://mschuetz.at - * - * adapted from THREE.OrbitControls by - * - * @author qiao / https://github.com/qiao - * @author mrdoob / http://mrdoob.com - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author erich666 / http://erichaines.com - * - * - * - */ + this._assetCache[ controllerModel.motionController.assetUrl ] = asset; + scene = asset.scene.clone(); - class FirstPersonControls extends EventDispatcher { - constructor (viewer) { - super(); + addAssetSceneToControllerModel( controllerModel, scene ); - this.viewer = viewer; - this.renderer = viewer.renderer; + }, + null, + () => { - this.scene = null; - this.sceneControls = new THREE.Scene(); + throw new Error( `Asset ${controllerModel.motionController.assetUrl} missing or malformed.` ); - this.rotationSpeed = 200; - this.moveSpeed = 10; - this.lockElevation = false; + } ); - this.keys = { - FORWARD: ['W'.charCodeAt(0), 38], - BACKWARD: ['S'.charCodeAt(0), 40], - LEFT: ['A'.charCodeAt(0), 37], - RIGHT: ['D'.charCodeAt(0), 39], - UP: ['R'.charCodeAt(0), 33], - DOWN: ['F'.charCodeAt(0), 34] - }; + } - this.fadeFactor = 50; - this.yawDelta = 0; - this.pitchDelta = 0; - this.translationDelta = new THREE.Vector3(0, 0, 0); - this.translationWorldDelta = new THREE.Vector3(0, 0, 0); + } ).catch( ( err ) => { - this.tweens = []; + console.warn( err ); - let drag = (e) => { - if (e.drag.object !== null) { - return; - } + } ); - if (e.drag.startHandled === undefined) { - e.drag.startHandled = true; + } ); - this.dispatchEvent({type: 'start'}); - } + controller.addEventListener( 'disconnected', () => { - let moveSpeed = this.viewer.getMoveSpeed(); + controllerModel.motionController = null; + controllerModel.remove( scene ); + scene = null; - let ndrag = { - x: e.drag.lastDrag.x / this.renderer.domElement.clientWidth, - y: e.drag.lastDrag.y / this.renderer.domElement.clientHeight - }; + } ); - if (e.drag.mouse === MOUSE.LEFT) { - this.yawDelta += ndrag.x * this.rotationSpeed; - this.pitchDelta += ndrag.y * this.rotationSpeed; - } else if (e.drag.mouse === MOUSE.RIGHT) { - this.translationDelta.x -= ndrag.x * moveSpeed * 100; - this.translationDelta.z += ndrag.y * moveSpeed * 100; - } - }; + return controllerModel; - let drop = e => { - this.dispatchEvent({type: 'end'}); - }; + } - let scroll = (e) => { - let speed = this.viewer.getMoveSpeed(); + }; - if (e.delta < 0) { - speed = speed * 0.9; - } else if (e.delta > 0) { - speed = speed / 0.9; - } + return XRControllerModelFactory; - speed = Math.max(speed, 0.1); + } )(); + + let fakeCam = new PerspectiveCamera(); + + function toScene(vec, ref){ + let node = ref.clone(); + node.updateMatrix(); + node.updateMatrixWorld(); + + let result = vec.clone().applyMatrix4(node.matrix); + result.z -= 0.8 * node.scale.x; + + return result; + }; + + function computeMove(vrControls, controller){ + + if(!controller || !controller.inputSource || !controller.inputSource.gamepad){ + return null; + } + + let pad = controller.inputSource.gamepad; + + let axes = pad.axes; + // [0,1] are for touchpad, [2,3] for thumbsticks? + let y = 0; + if(axes.length === 2){ + y = axes[1]; + }else if(axes.length === 4){ + y = axes[3]; + } + + y = Math.sign(y) * (2 * y) ** 2; + + let maxSize = 0; + for(let pc of viewer.scene.pointclouds){ + let size = pc.boundingBox.min.distanceTo(pc.boundingBox.max); + maxSize = Math.max(maxSize, size); + } + let multiplicator = Math.pow(maxSize, 0.5) / 2; + + let scale = vrControls.node.scale.x; + let moveSpeed = viewer.getMoveSpeed(); + let amount = multiplicator * y * (moveSpeed ** 0.5) / scale; + + + let rotation = new Quaternion().setFromEuler(controller.rotation); + let dir = new Vector3(0, 0, -1); + dir.applyQuaternion(rotation); + + let move = dir.clone().multiplyScalar(amount); + + let p1 = vrControls.toScene(controller.position); + let p2 = vrControls.toScene(controller.position.clone().add(move)); + + move = p2.clone().sub(p1); + + return move; + }; + + + class FlyMode{ + + constructor(vrControls){ + this.moveFactor = 1; + this.dbgLabel = null; + } + + start(vrControls){ + if(!this.dbgLabel){ + this.dbgLabel = new Potree.TextSprite("abc"); + this.dbgLabel.name = "debug label"; + vrControls.viewer.sceneVR.add(this.dbgLabel); + this.dbgLabel.visible = false; + } + } + + end(){ + + } + + update(vrControls, delta){ + + let primary = vrControls.cPrimary; + let secondary = vrControls.cSecondary; + + let move1 = computeMove(vrControls, primary); + let move2 = computeMove(vrControls, secondary); + + + if(!move1){ + move1 = new Vector3(); + } + + if(!move2){ + move2 = new Vector3(); + } + + let move = move1.clone().add(move2); + + move.multiplyScalar(-delta * this.moveFactor); + vrControls.node.position.add(move); + + + let scale = vrControls.node.scale.x; + + let camVR = vrControls.viewer.renderer.xr.getCamera(fakeCam); + + let vrPos = camVR.getWorldPosition(new Vector3()); + let vrDir = camVR.getWorldDirection(new Vector3()); + let vrTarget = vrPos.clone().add(vrDir.multiplyScalar(scale)); + + let scenePos = toScene(vrPos, vrControls.node); + let sceneDir = toScene(vrPos.clone().add(vrDir), vrControls.node).sub(scenePos); + sceneDir.normalize().multiplyScalar(scale); + let sceneTarget = scenePos.clone().add(sceneDir); + + vrControls.viewer.scene.view.setView(scenePos, sceneTarget); + + if(Potree.debug.message){ + this.dbgLabel.visible = true; + this.dbgLabel.setText(Potree.debug.message); + this.dbgLabel.scale.set(0.1, 0.1, 0.1); + this.dbgLabel.position.copy(primary.position); + } + } + }; + + class TranslationMode{ + + constructor(){ + this.controller = null; + this.startPos = null; + this.debugLine = null; + } + + start(vrControls){ + this.controller = vrControls.triggered.values().next().value; + this.startPos = vrControls.node.position.clone(); + } + + end(vrControls){ + + } + + update(vrControls, delta){ + + let start = this.controller.start.position; + let end = this.controller.position; + + start = vrControls.toScene(start); + end = vrControls.toScene(end); + + let diff = end.clone().sub(start); + diff.set(-diff.x, -diff.y, -diff.z); + + let pos = new Vector3().addVectors(this.startPos, diff); + + vrControls.node.position.copy(pos); + } + + }; + + class RotScaleMode{ + + constructor(){ + this.line = null; + this.startState = null; + } + + start(vrControls){ + if(!this.line){ + this.line = Potree.Utils.debugLine( + vrControls.viewer.sceneVR, + new Vector3(0, 0, 0), + new Vector3(0, 0, 0), + 0xffff00, + ); + + this.dbgLabel = new Potree.TextSprite("abc"); + this.dbgLabel.scale.set(0.1, 0.1, 0.1); + vrControls.viewer.sceneVR.add(this.dbgLabel); + } + + this.line.node.visible = true; + + this.startState = vrControls.node.clone(); + } + + end(vrControls){ + this.line.node.visible = false; + this.dbgLabel.visible = false; + } + + update(vrControls, delta){ + + let start_c1 = vrControls.cPrimary.start.position.clone(); + let start_c2 = vrControls.cSecondary.start.position.clone(); + let start_center = start_c1.clone().add(start_c2).multiplyScalar(0.5); + let start_c1_c2 = start_c2.clone().sub(start_c1); + let end_c1 = vrControls.cPrimary.position.clone(); + let end_c2 = vrControls.cSecondary.position.clone(); + let end_center = end_c1.clone().add(end_c2).multiplyScalar(0.5); + let end_c1_c2 = end_c2.clone().sub(end_c1); + + let d1 = start_c1_c2.length(); + let d2 = end_c1_c2.length(); + + let angleStart = new Vector2(start_c1_c2.x, start_c1_c2.z).angle(); + let angleEnd = new Vector2(end_c1_c2.x, end_c1_c2.z).angle(); + let angleDiff = angleEnd - angleStart; + + let scale = d2 / d1; + + let node = this.startState.clone(); + node.updateMatrix(); + node.matrixAutoUpdate = false; + + let mToOrigin = new Matrix4().makeTranslation(...toScene(start_center, this.startState).multiplyScalar(-1).toArray()); + let mToStart = new Matrix4().makeTranslation(...toScene(start_center, this.startState).toArray()); + let mRotate = new Matrix4().makeRotationZ(angleDiff); + let mScale = new Matrix4().makeScale(1 / scale, 1 / scale, 1 / scale); + + node.applyMatrix4(mToOrigin); + node.applyMatrix4(mRotate); + node.applyMatrix4(mScale); + node.applyMatrix4(mToStart); + + let oldScenePos = toScene(start_center, this.startState); + let newScenePos = toScene(end_center, node); + let toNew = oldScenePos.clone().sub(newScenePos); + let mToNew = new Matrix4().makeTranslation(...toNew.toArray()); + node.applyMatrix4(mToNew); + + node.matrix.decompose(node.position, node.quaternion, node.scale ); + + vrControls.node.position.copy(node.position); + vrControls.node.quaternion.copy(node.quaternion); + vrControls.node.scale.copy(node.scale); + vrControls.node.updateMatrix(); + + { + let scale = vrControls.node.scale.x; + let camVR = vrControls.viewer.renderer.xr.getCamera(fakeCam); + + let vrPos = camVR.getWorldPosition(new Vector3()); + let vrDir = camVR.getWorldDirection(new Vector3()); + let vrTarget = vrPos.clone().add(vrDir.multiplyScalar(scale)); + + let scenePos = toScene(vrPos, this.startState); + let sceneDir = toScene(vrPos.clone().add(vrDir), this.startState).sub(scenePos); + sceneDir.normalize().multiplyScalar(scale); + let sceneTarget = scenePos.clone().add(sceneDir); + + vrControls.viewer.scene.view.setView(scenePos, sceneTarget); + vrControls.viewer.setMoveSpeed(scale); + } + + { // update "GUI" + this.line.set(end_c1, end_c2); + + let scale = vrControls.node.scale.x; + this.dbgLabel.visible = true; + this.dbgLabel.position.copy(end_center); + this.dbgLabel.setText(`scale: 1 : ${scale.toFixed(2)}`); + this.dbgLabel.scale.set(0.05, 0.05, 0.05); + } + + } + + }; + + + class VRControls extends EventDispatcher{ + + constructor(viewer){ + super(viewer); + + this.viewer = viewer; + + viewer.addEventListener("vr_start", this.onStart.bind(this)); + viewer.addEventListener("vr_end", this.onEnd.bind(this)); + + this.node = new Object3D(); + this.node.up.set(0, 0, 1); + this.triggered = new Set(); + + let xr = viewer.renderer.xr; + + { // lights + + const light = new PointLight( 0xffffff, 5, 0, 1 ); + light.position.set(0, 2, 0); + this.viewer.sceneVR.add(light); + } + + this.menu = null; + + const controllerModelFactory = new XRControllerModelFactory(); + + let sg = new SphereGeometry(1, 32, 32); + let sm = new MeshNormalMaterial(); + + { // setup primary controller + let controller = xr.getController(0); + + let grip = xr.getControllerGrip(0); + grip.name = "grip(0)"; + + // ADD CONTROLLERMODEL + grip.add( controllerModelFactory.createControllerModel( grip ) ); + this.viewer.sceneVR.add(grip); + + // ADD SPHERE + let sphere = new Mesh(sg, sm); + sphere.scale.set(0.005, 0.005, 0.005); + + controller.add(sphere); + controller.visible = true; + this.viewer.sceneVR.add(controller); + + { // ADD LINE + + let lineGeometry = new LineGeometry(); + + lineGeometry.setPositions([ + 0, 0, -0.15, + 0, 0, 0.05, + ]); + + let lineMaterial = new LineMaterial({ + color: 0xff0000, + linewidth: 2, + resolution: new Vector2(1000, 1000), + }); + + const line = new Line2(lineGeometry, lineMaterial); + + controller.add(line); + } + + + controller.addEventListener( 'connected', function ( event ) { + const xrInputSource = event.data; + controller.inputSource = xrInputSource; + // initInfo(controller); + }); + + controller.addEventListener( 'selectstart', () => {this.onTriggerStart(controller);}); + controller.addEventListener( 'selectend', () => {this.onTriggerEnd(controller);}); + + this.cPrimary = controller; + + } + + { // setup secondary controller + let controller = xr.getController(1); + + let grip = xr.getControllerGrip(1); + + // ADD CONTROLLER MODEL + let model = controllerModelFactory.createControllerModel( grip ); + grip.add(model); + this.viewer.sceneVR.add( grip ); + + // ADD SPHERE + let sphere = new Mesh(sg, sm); + sphere.scale.set(0.005, 0.005, 0.005); + controller.add(sphere); + controller.visible = true; + this.viewer.sceneVR.add(controller); + + { // ADD LINE + + let lineGeometry = new LineGeometry(); + + lineGeometry.setPositions([ + 0, 0, -0.15, + 0, 0, 0.05, + ]); + + let lineMaterial = new LineMaterial({ + color: 0xff0000, + linewidth: 2, + resolution: new Vector2(1000, 1000), + }); + + const line = new Line2(lineGeometry, lineMaterial); + + controller.add(line); + } + + controller.addEventListener( 'connected', (event) => { + const xrInputSource = event.data; + controller.inputSource = xrInputSource; + this.initMenu(controller); + }); + + controller.addEventListener( 'selectstart', () => {this.onTriggerStart(controller);}); + controller.addEventListener( 'selectend', () => {this.onTriggerEnd(controller);}); + + this.cSecondary = controller; + } + + this.mode_fly = new FlyMode(); + this.mode_translate = new TranslationMode(); + this.mode_rotScale = new RotScaleMode(); + this.setMode(this.mode_fly); + } + + createSlider(label, min, max){ + + let sg = new SphereGeometry(1, 8, 8); + let cg = new CylinderGeometry(1, 1, 1, 8); + let matHandle = new MeshBasicMaterial({color: 0xff0000}); + let matScale = new MeshBasicMaterial({color: 0xff4444}); + let matValue = new MeshNormalMaterial(); + + let node = new Object3D("slider"); + let nLabel = new Potree.TextSprite(`${label}: 0`); + let nMax = new Mesh(sg, matHandle); + let nMin = new Mesh(sg, matHandle); + let nValue = new Mesh(sg, matValue); + let nScale = new Mesh(cg, matScale); + + nLabel.scale.set(0.2, 0.2, 0.2); + nLabel.position.set(0, 0.35, 0); + + nMax.scale.set(0.02, 0.02, 0.02); + nMax.position.set(0, 0.25, 0); + + nMin.scale.set(0.02, 0.02, 0.02); + nMin.position.set(0, -0.25, 0); + + nValue.scale.set(0.02, 0.02, 0.02); + nValue.position.set(0, 0, 0); + + nScale.scale.set(0.005, 0.5, 0.005); + + node.add(nLabel); + node.add(nMax); + node.add(nMin); + node.add(nValue); + node.add(nScale); + + return node; + } + + createInfo(){ + + let texture = new TextureLoader().load(`${Potree.resourcePath}/images/vr_controller_help.jpg`); + let plane = new PlaneBufferGeometry(1, 1, 1, 1); + let infoMaterial = new MeshBasicMaterial({map: texture}); + let infoNode = new Mesh(plane, infoMaterial); + + return infoNode; + } + + initMenu(controller){ + + if(this.menu){ + return; + } + + let node = new Object3D("vr menu"); + + // let nSlider = this.createSlider("speed", 0, 1); + // let nInfo = this.createInfo(); + + // // node.add(nSlider); + // node.add(nInfo); + + // { + // node.rotation.set(-1.5, 0, 0) + // node.scale.set(0.3, 0.3, 0.3); + // node.position.set(-0.2, -0.002, -0.1) + + // // nInfo.position.set(0.5, 0, 0); + // nInfo.scale.set(0.8, 0.6, 0); + + // // controller.add(node); + // } + + // node.position.set(-0.3, 1.2, 0.2); + // node.scale.set(0.3, 0.2, 0.3); + // node.lookAt(new THREE.Vector3(0, 1.5, 0.1)); + + // this.viewer.sceneVR.add(node); + + this.menu = node; + + // window.vrSlider = nSlider; + window.vrMenu = node; + + } + + + toScene(vec){ + let camVR = this.getCamera(); + + let mat = camVR.matrixWorld; + let result = vec.clone().applyMatrix4(mat); + + return result; + } + + toVR(vec){ + let camVR = this.getCamera(); + + let mat = camVR.matrixWorld.clone(); + mat.invert(); + let result = vec.clone().applyMatrix4(mat); + + return result; + } + + setMode(mode){ + + if(this.mode === mode){ + return; + } + + if(this.mode){ + this.mode.end(this); + } + + for(let controller of [this.cPrimary, this.cSecondary]){ + + let start = { + position: controller.position.clone(), + rotation: controller.rotation.clone(), + }; + + controller.start = start; + } + + this.mode = mode; + this.mode.start(this); + } + + onTriggerStart(controller){ + this.triggered.add(controller); + + if(this.triggered.size === 0){ + this.setMode(this.mode_fly); + }else if(this.triggered.size === 1){ + this.setMode(this.mode_translate); + }else if(this.triggered.size === 2){ + this.setMode(this.mode_rotScale); + } + } + + onTriggerEnd(controller){ + this.triggered.delete(controller); + + if(this.triggered.size === 0){ + this.setMode(this.mode_fly); + }else if(this.triggered.size === 1){ + this.setMode(this.mode_translate); + }else if(this.triggered.size === 2){ + this.setMode(this.mode_rotScale); + } + } + + onStart(){ + + let position = this.viewer.scene.view.position.clone(); + let direction = this.viewer.scene.view.direction; + direction.multiplyScalar(-1); + + let target = position.clone().add(direction); + target.z = position.z; + + let scale = this.viewer.getMoveSpeed(); + + this.node.position.copy(position); + this.node.lookAt(target); + this.node.scale.set(scale, scale, scale); + this.node.updateMatrix(); + this.node.updateMatrixWorld(); + } + + onEnd(){ + + } + + + setScene(scene){ + this.scene = scene; + } + + getCamera(){ + let reference = this.viewer.scene.getActiveCamera(); + let camera = new PerspectiveCamera(); + + // let scale = this.node.scale.x; + let scale = this.viewer.getMoveSpeed(); + //camera.near = 0.01 / scale; + camera.near = 0.1; + camera.far = 1000; + // camera.near = reference.near / scale; + // camera.far = reference.far / scale; + camera.up.set(0, 0, 1); + camera.lookAt(new Vector3(0, -1, 0)); + camera.updateMatrix(); + camera.updateMatrixWorld(); + + camera.position.copy(this.node.position); + camera.rotation.copy(this.node.rotation); + camera.scale.set(scale, scale, scale); + camera.updateMatrix(); + camera.updateMatrixWorld(); + camera.matrixAutoUpdate = false; + camera.parent = camera; + + return camera; + } + + update(delta){ + + + + // if(this.mode === this.mode_fly){ + // let ray = new THREE.Ray(origin, direction); + + // for(let object of this.selectables){ + + // if(object.intersectsRay(ray)){ + // object.onHit(ray); + // } + + // } + + // } + + this.mode.update(this, delta); + + + + } + }; - this.viewer.setMoveSpeed(speed); - }; + // Adapted from three.js VRButton - let dblclick = (e) => { - this.zoomToLocation(e.mouse); - }; - this.addEventListener('drag', drag); - this.addEventListener('drop', drop); - this.addEventListener('mousewheel', scroll); - this.addEventListener('dblclick', dblclick); - } + class VRButton { - setScene (scene) { - this.scene = scene; + constructor(){ + this.onStartListeners = []; + this.onEndListeners = []; + this.element = null; } - stop(){ - this.yawDelta = 0; - this.pitchDelta = 0; - this.translationDelta.set(0, 0, 0); + onStart(callback){ + this.onStartListeners.push(callback); } - - zoomToLocation(mouse){ - let camera = this.scene.getActiveCamera(); - - let I = Utils.getMousePointCloudIntersection( - mouse, - camera, - this.viewer, - this.scene.pointclouds); - - if (I === null) { - return; - } - - let targetRadius = 0; - { - let minimumJumpDistance = 0.2; - - let domElement = this.renderer.domElement; - let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); - - let nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray); - let lastNode = nodes[nodes.length - 1]; - let radius = lastNode.getBoundingSphere(new THREE.Sphere()).radius; - targetRadius = Math.min(this.scene.view.radius, radius); - targetRadius = Math.max(minimumJumpDistance, targetRadius); - } - - let d = this.scene.view.direction.multiplyScalar(-1); - let cameraTargetPosition = new THREE.Vector3().addVectors(I.location, d.multiplyScalar(targetRadius)); - // TODO Unused: let controlsTargetPosition = I.location; - - let animationDuration = 600; - let easing = TWEEN.Easing.Quartic.Out; - - { // animate - let value = {x: 0}; - let tween = new TWEEN.Tween(value).to({x: 1}, animationDuration); - tween.easing(easing); - this.tweens.push(tween); - - let startPos = this.scene.view.position.clone(); - let targetPos = cameraTargetPosition.clone(); - let startRadius = this.scene.view.radius; - let targetRadius = cameraTargetPosition.distanceTo(I.location); - tween.onUpdate(() => { - let t = value.x; - this.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x; - this.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y; - this.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z; - - this.scene.view.radius = (1 - t) * startRadius + t * targetRadius; - this.viewer.setMoveSpeed(this.scene.view.radius / 2.5); - }); - - tween.onComplete(() => { - this.tweens = this.tweens.filter(e => e !== tween); - }); - - tween.start(); - } + onEnd(callback){ + this.onEndListeners.push(callback); } - update (delta) { - let view = this.scene.view; - - { // cancel move animations on user input - let changes = [ this.yawDelta, - this.pitchDelta, - this.translationDelta.length(), - this.translationWorldDelta.length() ]; - let changeHappens = changes.some(e => Math.abs(e) > 0.001); - if (changeHappens && this.tweens.length > 0) { - this.tweens.forEach(e => e.stop()); - this.tweens = []; - } - } - - { // accelerate while input is given - let ih = this.viewer.inputHandler; - - let moveForward = this.keys.FORWARD.some(e => ih.pressedKeys[e]); - let moveBackward = this.keys.BACKWARD.some(e => ih.pressedKeys[e]); - let moveLeft = this.keys.LEFT.some(e => ih.pressedKeys[e]); - let moveRight = this.keys.RIGHT.some(e => ih.pressedKeys[e]); - let moveUp = this.keys.UP.some(e => ih.pressedKeys[e]); - let moveDown = this.keys.DOWN.some(e => ih.pressedKeys[e]); - - if(this.lockElevation){ - let dir = view.direction; - dir.z = 0; - dir.normalize(); - - if (moveForward && moveBackward) { - this.translationWorldDelta.set(0, 0, 0); - } else if (moveForward) { - this.translationWorldDelta.copy(dir.multiplyScalar(this.viewer.getMoveSpeed())); - } else if (moveBackward) { - this.translationWorldDelta.copy(dir.multiplyScalar(-this.viewer.getMoveSpeed())); - } - }else { - if (moveForward && moveBackward) { - this.translationDelta.y = 0; - } else if (moveForward) { - this.translationDelta.y = this.viewer.getMoveSpeed(); - } else if (moveBackward) { - this.translationDelta.y = -this.viewer.getMoveSpeed(); - } - } - - if (moveLeft && moveRight) { - this.translationDelta.x = 0; - } else if (moveLeft) { - this.translationDelta.x = -this.viewer.getMoveSpeed(); - } else if (moveRight) { - this.translationDelta.x = this.viewer.getMoveSpeed(); - } - - if (moveUp && moveDown) { - this.translationWorldDelta.z = 0; - } else if (moveUp) { - this.translationWorldDelta.z = this.viewer.getMoveSpeed(); - } else if (moveDown) { - this.translationWorldDelta.z = -this.viewer.getMoveSpeed(); - } - } + static async createButton( renderer, options ) { - { // apply rotation - let yaw = view.yaw; - let pitch = view.pitch; + if ( options ) { - yaw -= this.yawDelta * delta; - pitch -= this.pitchDelta * delta; + console.error( 'THREE.VRButton: The "options" parameter has been removed. Please set the reference space type via renderer.xr.setReferenceSpaceType() instead.' ); - view.yaw = yaw; - view.pitch = pitch; } - { // apply translation - view.translate( - this.translationDelta.x * delta, - this.translationDelta.y * delta, - this.translationDelta.z * delta - ); + const button = new VRButton(); + const element = document.createElement( 'button' ); - view.translateWorld( - this.translationWorldDelta.x * delta, - this.translationWorldDelta.y * delta, - this.translationWorldDelta.z * delta - ); - } + button.element = element; - { // set view target according to speed - view.radius = 3 * this.viewer.getMoveSpeed(); + function setEnter(){ + button.element.innerHTML = ` +
    ENTER
    +
    VR
    + `; } - { // decelerate over time - let attenuation = Math.max(0, 1 - this.fadeFactor * delta); - this.yawDelta *= attenuation; - this.pitchDelta *= attenuation; - this.translationDelta.multiplyScalar(attenuation); - this.translationWorldDelta.multiplyScalar(attenuation); + function setExit(){ + button.element.innerHTML = ` +
    EXIT
    +
    VR
    + `; } - } - }; - - class EarthControls extends EventDispatcher { - constructor (viewer) { - super(viewer); - this.viewer = viewer; - this.renderer = viewer.renderer; - - this.scene = null; - this.sceneControls = new THREE.Scene(); + function showEnterVR( /*device*/ ) { - this.rotationSpeed = 10; + let currentSession = null; - this.fadeFactor = 20; - this.wheelDelta = 0; - this.zoomDelta = new THREE.Vector3(); - this.camStart = null; + function onSessionStarted( session ) { - this.tweens = []; + session.addEventListener( 'end', onSessionEnded ); - { - let sg = new THREE.SphereGeometry(1, 16, 16); - let sm = new THREE.MeshNormalMaterial(); - this.pivotIndicator = new THREE.Mesh(sg, sm); - this.pivotIndicator.visible = false; - this.sceneControls.add(this.pivotIndicator); - } + for(let listener of button.onStartListeners){ + listener(); + } - let drag = (e) => { - if (e.drag.object !== null) { - return; - } - if (!this.pivot) { - return; - } + renderer.xr.setSession( session ); + setExit(); - if (e.drag.startHandled === undefined) { - e.drag.startHandled = true; + currentSession = session; - this.dispatchEvent({type: 'start'}); } - let camStart = this.camStart; - let camera = this.scene.getActiveCamera(); - let view = this.viewer.scene.view; - - // let camera = this.viewer.scene.camera; - let mouse = e.drag.end; - let domElement = this.viewer.renderer.domElement; - - if (e.drag.mouse === MOUSE.LEFT) { + function onSessionEnded( /*event*/ ) { - let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); - let plane = new THREE.Plane().setFromNormalAndCoplanarPoint( - new THREE.Vector3(0, 0, 1), - this.pivot); + currentSession.removeEventListener( 'end', onSessionEnded ); - let distanceToPlane = ray.distanceToPlane(plane); + for(let listener of button.onEndListeners){ + listener(); + } - if (distanceToPlane > 0) { - let I = new THREE.Vector3().addVectors( - camStart.position, - ray.direction.clone().multiplyScalar(distanceToPlane)); + setEnter(); - let movedBy = new THREE.Vector3().subVectors( - I, this.pivot); + currentSession = null; - let newCamPos = camStart.position.clone().sub(movedBy); + } - view.position.copy(newCamPos); + // - { - let distance = newCamPos.distanceTo(this.pivot); - view.radius = distance; - let speed = view.radius / 2.5; - this.viewer.setMoveSpeed(speed); - } - } - } else if (e.drag.mouse === MOUSE.RIGHT) { - let ndrag = { - x: e.drag.lastDrag.x / this.renderer.domElement.clientWidth, - y: e.drag.lastDrag.y / this.renderer.domElement.clientHeight - }; + button.element.style.display = ''; - let yawDelta = -ndrag.x * this.rotationSpeed * 0.5; - let pitchDelta = -ndrag.y * this.rotationSpeed * 0.2; + button.element.style.cursor = 'pointer'; - let originalPitch = view.pitch; - let tmpView = view.clone(); - tmpView.pitch = tmpView.pitch + pitchDelta; - pitchDelta = tmpView.pitch - originalPitch; + setEnter(); - let pivotToCam = new THREE.Vector3().subVectors(view.position, this.pivot); - let pivotToCamTarget = new THREE.Vector3().subVectors(view.getPivot(), this.pivot); - let side = view.getSide(); + button.element.onmouseenter = function () { - pivotToCam.applyAxisAngle(side, pitchDelta); - pivotToCamTarget.applyAxisAngle(side, pitchDelta); + button.element.style.opacity = '1.0'; - pivotToCam.applyAxisAngle(new THREE.Vector3(0, 0, 1), yawDelta); - pivotToCamTarget.applyAxisAngle(new THREE.Vector3(0, 0, 1), yawDelta); + }; - let newCam = new THREE.Vector3().addVectors(this.pivot, pivotToCam); - // TODO: Unused: let newCamTarget = new THREE.Vector3().addVectors(this.pivot, pivotToCamTarget); + button.element.onmouseleave = function () { - view.position.copy(newCam); - view.yaw += yawDelta; - view.pitch += pitchDelta; - } - }; + button.element.style.opacity = '0.7'; - let onMouseDown = e => { - let I = Utils.getMousePointCloudIntersection( - e.mouse, - this.scene.getActiveCamera(), - this.viewer, - this.scene.pointclouds, - {pickClipped: false}); + }; - if (I) { - this.pivot = I.location; - this.camStart = this.scene.getActiveCamera().clone(); - this.pivotIndicator.visible = true; - this.pivotIndicator.position.copy(I.location); - } - }; + button.element.onclick = function () { - let drop = e => { - this.dispatchEvent({type: 'end'}); - }; + if ( currentSession === null ) { - let onMouseUp = e => { - this.camStart = null; - this.pivot = null; - this.pivotIndicator.visible = false; - }; + // WebXR's requestReferenceSpace only works if the corresponding feature + // was requested at session creation time. For simplicity, just ask for + // the interesting ones as optional features, but be aware that the + // requestReferenceSpace call will fail if it turns out to be unavailable. + // ('local' is always available for immersive sessions and doesn't need to + // be requested separately.) - let scroll = (e) => { - this.wheelDelta += e.delta; - }; + const sessionInit = { optionalFeatures: [ 'local-floor', 'bounded-floor', 'hand-tracking' ] }; + navigator.xr.requestSession( 'immersive-vr', sessionInit ).then( onSessionStarted ); - let dblclick = (e) => { - this.zoomToLocation(e.mouse); - }; + } else { - this.addEventListener('drag', drag); - this.addEventListener('drop', drop); - this.addEventListener('mousewheel', scroll); - this.addEventListener('mousedown', onMouseDown); - this.addEventListener('mouseup', onMouseUp); - this.addEventListener('dblclick', dblclick); - } + currentSession.end(); - setScene (scene) { - this.scene = scene; - } + } - stop(){ - this.wheelDelta = 0; - this.zoomDelta.set(0, 0, 0); - } - - zoomToLocation(mouse){ - let camera = this.scene.getActiveCamera(); - - let I = Utils.getMousePointCloudIntersection( - mouse, - camera, - this.viewer, - this.scene.pointclouds); + }; - if (I === null) { - return; } - let targetRadius = 0; - { - let minimumJumpDistance = 0.2; + function stylizeElement( element ) { - let domElement = this.renderer.domElement; - let ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight); + element.style.position = 'absolute'; + element.style.bottom = '20px'; + element.style.padding = '12px 6px'; + element.style.border = '1px solid #fff'; + element.style.borderRadius = '4px'; + element.style.background = 'rgba(0,0,0,0.1)'; + element.style.color = '#fff'; + element.style.font = 'normal 13px sans-serif'; + element.style.textAlign = 'center'; + element.style.opacity = '0.7'; + element.style.outline = 'none'; + element.style.zIndex = '999'; - let nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray); - let lastNode = nodes[nodes.length - 1]; - let radius = lastNode.getBoundingSphere(new THREE.Sphere()).radius; - targetRadius = Math.min(this.scene.view.radius, radius); - targetRadius = Math.max(minimumJumpDistance, targetRadius); } - let d = this.scene.view.direction.multiplyScalar(-1); - let cameraTargetPosition = new THREE.Vector3().addVectors(I.location, d.multiplyScalar(targetRadius)); - // TODO Unused: let controlsTargetPosition = I.location; - - let animationDuration = 600; - let easing = TWEEN.Easing.Quartic.Out; - - { // animate - let value = {x: 0}; - let tween = new TWEEN.Tween(value).to({x: 1}, animationDuration); - tween.easing(easing); - this.tweens.push(tween); - - let startPos = this.scene.view.position.clone(); - let targetPos = cameraTargetPosition.clone(); - let startRadius = this.scene.view.radius; - let targetRadius = cameraTargetPosition.distanceTo(I.location); - - tween.onUpdate(() => { - let t = value.x; - this.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x; - this.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y; - this.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z; - - this.scene.view.radius = (1 - t) * startRadius + t * targetRadius; - this.viewer.setMoveSpeed(this.scene.view.radius / 2.5); - }); - - tween.onComplete(() => { - this.tweens = this.tweens.filter(e => e !== tween); - }); + if ( 'xr' in navigator ) { - tween.start(); - } - } + button.element.id = 'VRButton'; + button.element.style.display = 'none'; - update (delta) { - let view = this.scene.view; - let fade = Math.pow(0.5, this.fadeFactor * delta); - let progression = 1 - fade; - let camera = this.scene.getActiveCamera(); - - // compute zoom - if (this.wheelDelta !== 0) { - let I = Utils.getMousePointCloudIntersection( - this.viewer.inputHandler.mouse, - this.scene.getActiveCamera(), - this.viewer, - this.scene.pointclouds); + stylizeElement( button.element ); - if (I) { - let resolvedPos = new THREE.Vector3().addVectors(view.position, this.zoomDelta); - let distance = I.location.distanceTo(resolvedPos); - let jumpDistance = distance * 0.2 * this.wheelDelta; - let targetDir = new THREE.Vector3().subVectors(I.location, view.position); - targetDir.normalize(); + let supported = await navigator.xr.isSessionSupported( 'immersive-vr' ); - resolvedPos.add(targetDir.multiplyScalar(jumpDistance)); - this.zoomDelta.subVectors(resolvedPos, view.position); + if(supported){ + showEnterVR(); - { - let distance = resolvedPos.distanceTo(I.location); - view.radius = distance; - let speed = view.radius / 2.5; - this.viewer.setMoveSpeed(speed); - } + return button; + }else { + return null; } - } - - // apply zoom - if (this.zoomDelta.length() !== 0) { - let p = this.zoomDelta.clone().multiplyScalar(progression); - - let newPos = new THREE.Vector3().addVectors(view.position, p); - view.position.copy(newPos); - } - if (this.pivotIndicator.visible) { - let distance = this.pivotIndicator.position.distanceTo(view.position); - let pixelwidth = this.renderer.domElement.clientwidth; - let pixelHeight = this.renderer.domElement.clientHeight; - let pr = Utils.projectedRadius(1, camera, distance, pixelwidth, pixelHeight); - let scale = (10 / pr); - this.pivotIndicator.scale.set(scale, scale, scale); - } + } else { - // decelerate over time - { - this.zoomDelta.multiplyScalar(fade); - this.wheelDelta = 0; - } - } - }; + if ( window.isSecureContext === false ) { - /** - * @author chrisl / Geodan - * - * adapted from Potree.FirstPersonControls by - * - * @author mschuetz / http://mschuetz.at - * - * and THREE.DeviceOrientationControls by - * - * @author richt / http://richt.me - * @author WestLangley / http://github.com/WestLangley - * - * - * - */ + console.log("WEBXR NEEDS HTTPS"); - class DeviceOrientationControls extends EventDispatcher{ - constructor(viewer){ - super(); + } else { - this.viewer = viewer; - this.renderer = viewer.renderer; + console.log("WEBXR not available"); - this.scene = null; - this.sceneControls = new THREE.Scene(); + } - this.screenOrientation = window.orientation || 0; + return null; - let deviceOrientationChange = e => { - this.deviceOrientation = e; - }; - let screenOrientationChange = e => { - this.screenOrientation = window.orientation || 0; - }; - if ('ondeviceorientationabsolute' in window) { - window.addEventListener('deviceorientationabsolute', deviceOrientationChange); - } else if ('ondeviceorientation' in window) { - window.addEventListener('deviceorientation', deviceOrientationChange); - } else { - console.warn("No device orientation found."); } - // window.addEventListener('deviceorientation', deviceOrientationChange); - window.addEventListener('orientationchange', screenOrientationChange); - } - setScene (scene) { - this.scene = scene; } - update (delta) { - let computeQuaternion = function (alpha, beta, gamma, orient) { - let quaternion = new THREE.Quaternion(); - - let zee = new THREE.Vector3(0, 0, 1); - let euler = new THREE.Euler(); - let q0 = new THREE.Quaternion(); - - euler.set(beta, gamma, alpha, 'ZXY'); - quaternion.setFromEuler(euler); - quaternion.multiply(q0.setFromAxisAngle(zee, -orient)); - - return quaternion; - }; - - if (typeof this.deviceOrientation !== 'undefined') { - let alpha = this.deviceOrientation.alpha ? THREE.Math.degToRad(this.deviceOrientation.alpha) : 0; - let beta = this.deviceOrientation.beta ? THREE.Math.degToRad(this.deviceOrientation.beta) : 0; - let gamma = this.deviceOrientation.gamma ? THREE.Math.degToRad(this.deviceOrientation.gamma) : 0; - let orient = this.screenOrientation ? THREE.Math.degToRad(this.screenOrientation) : 0; - - let quaternion = computeQuaternion(alpha, beta, gamma, orient); - viewer.scene.cameraP.quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w); - } - } - }; + } class Viewer extends EventDispatcher{ @@ -30061,7 +87823,6 @@ ENDSEC this.guiLoaded = false; this.guiLoadTasks = []; - this.vr = null; this.onVrListeners = []; this.messages = []; @@ -30096,6 +87857,44 @@ ENDSEC style="position: absolute; z-index: 100000; width: 100%; height: 100%; pointer-events: none;">`); $(domElement).append(potreeAnnotationContainer); } + + if ($(domElement).find('#potree_quick_buttons').length === 0) { + let potreeMap = $(` +
    +
    + `); + + // { + // let imgMenuToggle = document.createElement('img'); + // imgMenuToggle.src = new URL(Potree.resourcePath + '/icons/menu_button.svg').href; + // imgMenuToggle.onclick = this.toggleSidebar; + // // imgMenuToggle.classList.add('potree_menu_toggle'); + + // potreeMap.append(imgMenuToggle); + // } + + // { + // let imgMenuToggle = document.createElement('img'); + // imgMenuToggle.src = new URL(Potree.resourcePath + '/icons/menu_button.svg').href; + // imgMenuToggle.onclick = this.toggleSidebar; + // // imgMenuToggle.classList.add('potree_menu_toggle'); + + // potreeMap.append(imgMenuToggle); + // } + + // { + // let imgMenuToggle = document.createElement('img'); + // imgMenuToggle.src = new URL(Potree.resourcePath + '/icons/menu_button.svg').href; + // imgMenuToggle.onclick = this.toggleSidebar; + // // imgMenuToggle.classList.add('potree_menu_toggle'); + + // potreeMap.append(imgMenuToggle); + // } + + + + $(domElement).append(potreeMap); + } } this.pointCloudLoadedCallback = args.onPointCloudLoaded || function () {}; @@ -30143,6 +87942,7 @@ ENDSEC this.pRenderer = null; this.scene = null; + this.sceneVR = null; this.overlay = null; this.overlayCamera = null; @@ -30155,11 +87955,10 @@ ENDSEC this.compass = null; this.skybox = null; - this.clock = new THREE.Clock(); + this.clock = new Clock(); this.background = null; this.initThree(); - this.prepareVR(); if(args.noDragAndDrop){ @@ -30186,8 +87985,8 @@ ENDSEC } { - this.overlay = new THREE.Scene(); - this.overlayCamera = new THREE.OrthographicCamera( + this.overlay = new Scene(); + this.overlayCamera = new OrthographicCamera( 0, 1, 1, 0, -1000, 1000 @@ -30201,13 +88000,30 @@ ENDSEC let far = 10.0; let fov = 90; - this.shadowTestCam = new THREE.PerspectiveCamera(90, 1, near, far); + this.shadowTestCam = new PerspectiveCamera(90, 1, near, far); this.shadowTestCam.position.set(3.50, -2.80, 8.561); - this.shadowTestCam.lookAt(new THREE.Vector3(0, 0, 4.87)); + this.shadowTestCam.lookAt(new Vector3(0, 0, 4.87)); } - let scene = new Scene(this.renderer); + let scene = new Scene$1(this.renderer); + + { // create VR scene + this.sceneVR = new Scene(); + + // let texture = new THREE.TextureLoader().load(`${Potree.resourcePath}/images/vr_controller_help.jpg`); + + // let plane = new THREE.PlaneBufferGeometry(1, 1, 1, 1); + // let infoMaterial = new THREE.MeshBasicMaterial({map: texture}); + // let infoNode = new THREE.Mesh(plane, infoMaterial); + // infoNode.position.set(-0.5, 1, 0); + // infoNode.scale.set(0.4, 0.3, 1); + // infoNode.lookAt(0, 1, 0) + // this.sceneVR.add(infoNode); + + // window.infoNode = infoNode; + } + this.setScene(scene); { @@ -30227,7 +88043,7 @@ ENDSEC let onPointcloudAdded = (e) => { if (this.scene.pointclouds.length === 1) { - let speed = e.pointcloud.boundingBox.getSize(new THREE.Vector3()).length(); + let speed = e.pointcloud.boundingBox.getSize(new Vector3()).length(); speed = speed / 5; this.setMoveSpeed(speed); } @@ -30275,9 +88091,11 @@ ENDSEC } // start rendering! - if(args.useDefaultRenderLoop === undefined || args.useDefaultRenderLoop === true){ - requestAnimationFrame(this.loop.bind(this)); - } + //if(args.useDefaultRenderLoop === undefined || args.useDefaultRenderLoop === true){ + //requestAnimationFrame(this.loop.bind(this)); + //} + + this.renderer.setAnimationLoop(this.loop.bind(this)); this.loadGUI = this.loadGUI.bind(this); @@ -30398,7 +88216,13 @@ ENDSEC } getControls () { - return this.controls; + + if(this.renderer.xr.isPresenting){ + return this.vrControls; + }else { + return this.controls; + } + } getMinNodeSize () { @@ -30556,7 +88380,8 @@ ENDSEC }; setEDLEnabled (value) { - value = Boolean(value); + value = Boolean(value) && Features.SHADER_EDL.isSupported(); + if (this.useEDL !== value) { this.useEDL = value; this.dispatchEvent({'type': 'use_edl_changed', 'viewer': this}); @@ -30758,7 +88583,7 @@ ENDSEC } else if (node.geometry && node.geometry.boundingSphere) { bs = node.geometry.boundingSphere; } else { - bs = node.boundingBox.getBoundingSphere(new THREE.Sphere()); + bs = node.boundingBox.getBoundingSphere(new Sphere()); } bs = bs.clone().applyMatrix4(node.matrixWorld); @@ -30807,7 +88632,7 @@ ENDSEC const diameter = box.min.distanceTo(box.max); const camera = this.scene.getActiveCamera(); - const offset = camera.getWorldDirection(new THREE.Vector3()).multiplyScalar(diameter); + const offset = camera.getWorldDirection(new Vector3()).multiplyScalar(diameter); const newCamPos = result.position.clone().sub(offset); this.scene.view.position.copy(newCamPos); @@ -30843,7 +88668,7 @@ ENDSEC fitToScreen (factor = 1, animationDuration = 0) { let box = this.getBoundingBox(this.scene.pointclouds); - let node = new THREE.Object3D(); + let node = new Object3D(); node.boundingBox = box; this.zoomTo(node, factor, animationDuration); @@ -31038,7 +88863,7 @@ ENDSEC let y = parseFloat(tokens[1]); let z = parseFloat(tokens[2]); - this.scene.view.lookAt(new THREE.Vector3(x, y, z)); + this.scene.view.lookAt(new Vector3(x, y, z)); } if (Utils.getParameterByName('background')) { @@ -31100,6 +88925,15 @@ ENDSEC this.deviceControls.addEventListener('start', this.disableAnnotations.bind(this)); this.deviceControls.addEventListener('end', this.enableAnnotations.bind(this)); } + + { // create VR CONTROLS + this.vrControls = new VRControls(this); + this.vrControls.enabled = false; + this.vrControls.addEventListener('start', this.disableAnnotations.bind(this)); + this.vrControls.addEventListener('end', this.enableAnnotations.bind(this)); + } + + }; toggleSidebar () { @@ -31165,8 +88999,47 @@ ENDSEC imgMapToggle.onclick = e => { this.toggleMap(); }; imgMapToggle.id = 'potree_map_toggle'; - viewer.renderArea.insertBefore(imgMapToggle, viewer.renderArea.children[0]); - viewer.renderArea.insertBefore(imgMenuToggle, viewer.renderArea.children[0]); + + + let elButtons = $("#potree_quick_buttons").get(0); + + elButtons.append(imgMenuToggle); + elButtons.append(imgMapToggle); + + + VRButton.createButton(this.renderer).then(vrButton => { + + if(vrButton == null){ + console.log("VR not supported or active."); + + return; + } + + this.renderer.xr.enabled = true; + + let element = vrButton.element; + + element.style.position = ""; + element.style.bottom = ""; + element.style.left = ""; + element.style.margin = "4px"; + element.style.fontSize = "100%"; + element.style.width = "2.5em"; + element.style.height = "2.5em"; + element.style.padding = "0"; + element.style.textShadow = "black 2px 2px 2px"; + element.style.display = "block"; + + elButtons.append(element); + + vrButton.onStart(() => { + this.dispatchEvent({type: "vr_start"}); + }); + + vrButton.onEnd(() => { + this.dispatchEvent({type: "vr_end"}); + }); + }); this.mapView = new MapView(this); this.mapView.init(); @@ -31306,7 +89179,7 @@ ENDSEC initThree () { - console.log(`initializing three.js ${THREE.REVISION}`); + console.log(`initializing three.js ${REVISION}`); let width = this.renderArea.clientWidth; let height = this.renderArea.clientHeight; @@ -31335,7 +89208,7 @@ ENDSEC let context = canvas.getContext('webgl', contextAttributes ); - this.renderer = new THREE.WebGLRenderer({ + this.renderer = new WebGLRenderer({ alpha: true, premultipliedAlpha: false, canvas: canvas, @@ -31358,7 +89231,7 @@ ENDSEC gl.getExtension('WEBGL_depth_texture'); gl.getExtension('WEBGL_color_buffer_float'); // Enable explicitly for more portability, EXT_color_buffer_float is the proper name in WebGL 2 - //if(gl instanceof WebGLRenderingContext){ + if(gl.createVertexArray == null){ let extVAO = gl.getExtension('OES_vertex_array_object'); if(!extVAO){ @@ -31367,62 +89240,6 @@ ENDSEC gl.createVertexArray = extVAO.createVertexArrayOES.bind(extVAO); gl.bindVertexArray = extVAO.bindVertexArrayOES.bind(extVAO); - //}else if(gl instanceof WebGL2RenderingContext){ - // gl.getExtension("EXT_color_buffer_float"); - //} - - } - - onVr(callback){ - - if(this.vr){ - callback(); - }else { - this.onVrListeners.push(callback); - } - - } - - async prepareVR(){ - - if(!navigator.getVRDisplays){ - console.info("browser does not support WebVR"); - - return false; - } - - try{ - let frameData = new VRFrameData(); - let displays = await navigator.getVRDisplays(); - - if(displays.length == 0){ - console.info("no VR display found"); - return false; - } - - let display = displays[displays.length - 1]; - display.depthNear = 0.1; - display.depthFar = 10000.0; - - if(!display.capabilities.canPresent){ - // Not sure why canPresent would ever be false? - console.error("VR display canPresent === false"); - return false; - } - - this.vr = { - frameData: frameData, - display: display, - node: new THREE.Object3D(), - }; - - for(const listener of this.onVrListeners){ - listener(); - } - }catch(err){ - console.error(err); - - return false; } } @@ -31439,7 +89256,7 @@ ENDSEC let distances = []; - let renderAreaSize = this.renderer.getSize(new THREE.Vector2()); + let renderAreaSize = this.renderer.getSize(new Vector2()); let viewer = this; @@ -31461,13 +89278,13 @@ ENDSEC let position = annotation.position.clone(); position.add(annotation.offset); if (!position) { - position = annotation.boundingBox.getCenter(new THREE.Vector3()); + position = annotation.boundingBox.getCenter(new Vector3()); } let distance = viewer.scene.cameraP.position.distanceTo(position); - let radius = annotation.boundingBox.getBoundingSphere(new THREE.Sphere()).radius; + let radius = annotation.boundingBox.getBoundingSphere(new Sphere()).radius; - let screenPos = new THREE.Vector3(); + let screenPos = new Vector3(); let screenSize = 0; { @@ -31548,6 +89365,12 @@ ENDSEC const material = pointcloud.material; + const attIntensity = pointcloud.getAttribute("intensity"); + + if(attIntensity != null && material.intensityRange[0] === Infinity){ + material.intensityRange = [...attIntensity.range]; + } + // const attIntensity = pointcloud.getAttribute("intensity"); // if(attIntensity && material.intensityRange[0] === Infinity){ // material.intensityRange = [...attIntensity.range]; @@ -31570,6 +89393,11 @@ ENDSEC if(Potree.measureTimings) performance.mark("update-start"); + this.dispatchEvent({ + type: 'update_start', + delta: delta, + timestamp: timestamp}); + const scene = this.scene; const camera = scene.getActiveCamera(); @@ -31577,7 +89405,7 @@ ENDSEC Potree.pointLoadLimit = Potree.pointBudget * 2; - const lTarget = camera.position.clone().add(camera.getWorldDirection(new THREE.Vector3()).multiplyScalar(1000)); + const lTarget = camera.position.clone().add(camera.getWorldDirection(new Vector3()).multiplyScalar(1000)); this.scene.directionalLight.position.copy(camera.position); this.scene.directionalLight.lookAt(lTarget); @@ -31605,7 +89433,7 @@ ENDSEC if(this.showBoundingBox){ let bbRoot = this.scene.scene.getObjectByName("potree_bounding_box_root"); if(!bbRoot){ - let node = new THREE.Object3D(); + let node = new Object3D(); node.name = "potree_bounding_box_root"; this.scene.scene.add(node); bbRoot = node; @@ -31722,15 +89550,16 @@ ENDSEC this.scene.cameraP.fov = this.fov; - if (this.getControls() === this.deviceControls) { + let controls = this.getControls(); + if (controls === this.deviceControls) { this.controls.setScene(scene); this.controls.update(delta); this.scene.cameraP.position.copy(scene.view.position); this.scene.cameraO.position.copy(scene.view.position); - } else if (this.controls !== null) { - this.controls.setScene(scene); - this.controls.update(delta); + } else if (controls !== null) { + controls.setScene(scene); + controls.update(delta); if(typeof debugDisabled === "undefined" ){ this.scene.cameraP.position.copy(scene.view.position); @@ -31747,12 +89576,12 @@ ENDSEC camera.updateMatrix(); camera.updateMatrixWorld(); - camera.matrixWorldInverse.getInverse(camera.matrixWorld); + camera.matrixWorldInverse.copy(camera.matrixWorld).invert(); { if(this._previousCamera === undefined){ this._previousCamera = this.scene.getActiveCamera().clone(); - this._previousCamera.rotation.copy(this.scene.getActiveCamera()); + this._previousCamera.rotation.copy(this.scene.getActiveCamera().rotation); } if(!this._previousCamera.matrixWorld.equals(camera.matrixWorld)){ @@ -31770,7 +89599,7 @@ ENDSEC } this._previousCamera = this.scene.getActiveCamera().clone(); - this._previousCamera.rotation.copy(this.scene.getActiveCamera()); + this._previousCamera.rotation.copy(this.scene.getActiveCamera().rotation); } @@ -31792,8 +89621,8 @@ ENDSEC let clipBoxes = boxes.filter(degenerate).map( box => { box.updateMatrixWorld(); - let boxInverse = new THREE.Matrix4().getInverse(box.matrixWorld); - let boxPosition = box.getWorldPosition(new THREE.Vector3()); + let boxInverse = box.matrixWorld.clone().invert(); + let boxPosition = box.getWorldPosition(new Vector3()); return {box: box, inverse: boxInverse, position: boxPosition}; }); @@ -31841,192 +89670,237 @@ ENDSEC performance.measure("update", "update-start", "update-end"); } } - - render(){ - if(Potree.measureTimings) performance.mark("render-start"); - try{ + getPRenderer(){ + if(this.useHQ){ + if (!this.hqRenderer) { + this.hqRenderer = new HQSplatRenderer(this); + } + this.hqRenderer.useEDL = this.useEDL; - let pRenderer = null; + return this.hqRenderer; + }else { + if (this.useEDL && Features.SHADER_EDL.isSupported()) { + if (!this.edlRenderer) { + this.edlRenderer = new EDLRenderer(this); + } - if(this.useHQ){ - if (!this.hqRenderer) { - this.hqRenderer = new HQSplatRenderer(this); + return this.edlRenderer; + } else { + if (!this.potreeRenderer) { + this.potreeRenderer = new PotreeRenderer(this); } - this.hqRenderer.useEDL = this.useEDL; - //this.hqRenderer.render(this.renderer); - pRenderer = this.hqRenderer; + return this.potreeRenderer; + } + } + } + + renderVR(){ + + let renderer = this.renderer; + + renderer.setClearColor(0x550000, 0); + renderer.clear(); + + let xr = renderer.xr; + let dbg = new PerspectiveCamera(); + let xrCameras = xr.getCamera(dbg); + + if(xrCameras.cameras.length !== 2){ + return; + } + + let makeCam = this.vrControls.getCamera.bind(this.vrControls); + + { // clear framebuffer + if(viewer.background === "skybox"){ + renderer.setClearColor(0xff0000, 1); + }else if(viewer.background === "gradient"){ + renderer.setClearColor(0x112233, 1); + }else if(viewer.background === "black"){ + renderer.setClearColor(0x000000, 1); + }else if(viewer.background === "white"){ + renderer.setClearColor(0xFFFFFF, 1); }else { - if (this.useEDL && Features.SHADER_EDL.isSupported()) { - if (!this.edlRenderer) { - this.edlRenderer = new EDLRenderer(this); - } - //this.edlRenderer.render(this.renderer); - pRenderer = this.edlRenderer; - } else { - if (!this.potreeRenderer) { - this.potreeRenderer = new PotreeRenderer(this); - } - //this.potreeRenderer.render(); - pRenderer = this.potreeRenderer; - } + renderer.setClearColor(0x000000, 0); } - - const vr = this.vr; - const vrActive = (vr && vr.display.isPresenting); - if(vrActive){ + renderer.clear(); + } - const {display, frameData} = vr; + // render background + if(this.background === "skybox"){ + let {skybox} = this; - const leftEye = display.getEyeParameters("left"); - const rightEye = display.getEyeParameters("right"); + let cam = makeCam(); + skybox.camera.rotation.copy(cam.rotation); + skybox.camera.fov = cam.fov; + skybox.camera.aspect = cam.aspect; + + // let dbg = new THREE.Object3D(); + let dbg = skybox.parent; + // dbg.up.set(0, 0, 1); + dbg.rotation.x = Math.PI / 2; - let width = Math.max(leftEye.renderWidth, rightEye.renderWidth) * 2; - let height = Math.max(leftEye.renderHeight, rightEye.renderHeight); + // skybox.camera.parent = dbg; + // dbg.children.push(skybox.camera); - // width *= 0.5; - // height *= 0.5; + dbg.updateMatrix(); + dbg.updateMatrixWorld(); - this.renderer.setSize(width, height); + skybox.camera.updateMatrix(); + skybox.camera.updateMatrixWorld(); + skybox.camera.updateProjectionMatrix(); - pRenderer.clear(); + renderer.render(skybox.scene, skybox.camera); + // renderer.render(skybox.scene, cam); + }else if(this.background === "gradient"){ + // renderer.render(this.scene.sceneBG, this.scene.cameraBG); + } - //const camera = new THREE.Camera(); - viewer.scene.cameraMode = CameraMode.VR; - const camera = viewer.scene.getActiveCamera(); - { - camera.near = display.depthNear; - camera.far = display.depthFar; - camera.projectionMatrix = new THREE.Matrix4(); - camera.matrixWorldInverse = new THREE.Matrix4(); - camera.matrixWorld = new THREE.Matrix4(); - camera.updateProjectionMatrix = () => {}; - camera.updateMatrixWorld = () => {}; - camera.fov = 60; - }; + this.renderer.xr.getSession().updateRenderState({ + depthNear: 0.1, + depthFar: 10000 + }); + + let cam = null; + let view = null; - const flipWorld = new THREE.Matrix4().fromArray([ - 1, 0, 0, 0, - 0, 0, 1, 0, - 0, -1, 0, 0, - 0, 0, 0, 1 - ]); - const flipView = new THREE.Matrix4().getInverse(flipWorld); + { // render world scene + cam = makeCam(); + cam.position.z -= 0.8 * cam.scale.x; + cam.parent = null; + // cam.near = 0.05; + cam.near = viewer.scene.getActiveCamera().near; + cam.far = viewer.scene.getActiveCamera().far; + cam.updateMatrix(); + cam.updateMatrixWorld(); - vr.node.updateMatrixWorld(); + this.scene.scene.updateMatrix(); + this.scene.scene.updateMatrixWorld(); + this.scene.scene.matrixAutoUpdate = false; - {// LEFT - camera.projectionMatrix.fromArray(frameData.leftProjectionMatrix); + let camWorld = cam.matrixWorld.clone(); + view = camWorld.clone().invert(); + this.scene.scene.matrix.copy(view); + this.scene.scene.matrixWorld.copy(view); - const leftView = new THREE.Matrix4().fromArray(frameData.leftViewMatrix); - const view = new THREE.Matrix4().multiplyMatrices(leftView, flipView); - const world = new THREE.Matrix4().getInverse(view); + cam.matrix.identity(); + cam.matrixWorld.identity(); + cam.matrixWorldInverse.identity(); - { - const tmp = new THREE.Matrix4().multiplyMatrices(vr.node.matrixWorld, world); - world.copy(tmp); - view.getInverse(world); - } + renderer.render(this.scene.scene, cam); - camera.matrixWorldInverse.copy(view); - camera.matrixWorld.copy(world); + this.scene.scene.matrixWorld.identity(); - const viewport = [0, 0, width / 2, height]; + } + + for(let pointcloud of this.scene.pointclouds){ - this.renderer.setViewport(...viewport); - pRenderer.render({camera: camera, viewport: viewport}); - //this.renderer.render(this.overlay, this.overlayCamera); - } + let viewport = xrCameras.cameras[0].viewport; - {// RIGHT - - camera.projectionMatrix.fromArray(frameData.rightProjectionMatrix); + pointcloud.material.useEDL = false; + pointcloud.screenHeight = viewport.height; + pointcloud.screenWidth = viewport.width; - const rightView = new THREE.Matrix4().fromArray(frameData.rightViewMatrix); - const view = new THREE.Matrix4().multiplyMatrices(rightView, flipView); - const world = new THREE.Matrix4().getInverse(view); + // automatically switch to paraboloids because they cause far less flickering in VR, + // when point sizes are larger than around 2 pixels + // if(Features.SHADER_INTERPOLATION.isSupported()){ + // pointcloud.material.shape = Potree.PointShape.PARABOLOID; + // } + } + + // render point clouds + for(let xrCamera of xrCameras.cameras){ - { - const tmp = new THREE.Matrix4().multiplyMatrices(vr.node.matrixWorld, world); - world.copy(tmp); - view.getInverse(world); - } + let v = xrCamera.viewport; + renderer.setViewport(v.x, v.y, v.width, v.height); - camera.matrixWorldInverse.copy(view); - camera.matrixWorld.copy(world); + // xrCamera.fov = 90; - const viewport = [width / 2, 0, width / 2, height]; + { // estimate VR fov + let proj = xrCamera.projectionMatrix; + let inv = proj.clone().invert(); - this.renderer.setViewport(...viewport); - pRenderer.clearTargets(); - pRenderer.render({camera: camera, viewport: viewport, debug: 2}); - //this.renderer.render(this.overlay, this.overlayCamera); - } + let p1 = new Vector4(0, 1, -1, 1).applyMatrix4(inv); + let rad = p1.y; + let fov = 180 * (rad / Math.PI); - { // CENTER + xrCamera.fov = fov; + } - { // central view matrix - // TODO this can't be right...can it? + for(let pointcloud of this.scene.pointclouds){ + const {material} = pointcloud; + material.useEDL = false; + } - const left = frameData.leftViewMatrix; - const right = frameData.rightViewMatrix; + let vrWorld = view.clone().invert(); + vrWorld.multiply(xrCamera.matrixWorld); + let vrView = vrWorld.clone().invert(); - const centerView = new THREE.Matrix4(); + this.pRenderer.render(this.scene.scenePointCloud, xrCamera, null, { + viewOverride: vrView, + }); - for(let i = 0; i < centerView.elements.length; i++){ - centerView.elements[i] = (left[i] + right[i]) / 2; - } + } - const view = new THREE.Matrix4().multiplyMatrices(centerView, flipView); - const world = new THREE.Matrix4().getInverse(view); + { // render VR scene + let cam = makeCam(); + cam.parent = null; - { - const tmp = new THREE.Matrix4().multiplyMatrices(vr.node.matrixWorld, world); - world.copy(tmp); - view.getInverse(world); - } + renderer.render(this.sceneVR, cam); + } - camera.matrixWorldInverse.copy(view); - camera.matrixWorld.copy(world); - } + renderer.resetState(); + } - camera.fov = leftEye.fieldOfView.upDegrees; - } + renderDefault(){ + let pRenderer = this.getPRenderer(); - }else { + { // resize + const width = this.scaleFactor * this.renderArea.clientWidth; + const height = this.scaleFactor * this.renderArea.clientHeight; - { // resize - const width = this.scaleFactor * this.renderArea.clientWidth; - const height = this.scaleFactor * this.renderArea.clientHeight; + this.renderer.setSize(width, height); + const pixelRatio = this.renderer.getPixelRatio(); + const aspect = width / height; - this.renderer.setSize(width, height); - const pixelRatio = this.renderer.getPixelRatio(); - const aspect = width / height; + const scene = this.scene; - const scene = this.scene; + scene.cameraP.aspect = aspect; + scene.cameraP.updateProjectionMatrix(); - scene.cameraP.aspect = aspect; - scene.cameraP.updateProjectionMatrix(); + let frustumScale = this.scene.view.radius; + scene.cameraO.left = -frustumScale; + scene.cameraO.right = frustumScale; + scene.cameraO.top = frustumScale * 1 / aspect; + scene.cameraO.bottom = -frustumScale * 1 / aspect; + scene.cameraO.updateProjectionMatrix(); - let frustumScale = this.scene.view.radius; - scene.cameraO.left = -frustumScale; - scene.cameraO.right = frustumScale; - scene.cameraO.top = frustumScale * 1 / aspect; - scene.cameraO.bottom = -frustumScale * 1 / aspect; - scene.cameraO.updateProjectionMatrix(); + scene.cameraScreenSpace.top = 1/aspect; + scene.cameraScreenSpace.bottom = -1/aspect; + scene.cameraScreenSpace.updateProjectionMatrix(); + } - scene.cameraScreenSpace.top = 1/aspect; - scene.cameraScreenSpace.bottom = -1/aspect; - scene.cameraScreenSpace.updateProjectionMatrix(); - } + pRenderer.clear(); + + pRenderer.render(this.renderer); + this.renderer.render(this.overlay, this.overlayCamera); + } + + render(){ + if(Potree.measureTimings) performance.mark("render-start"); + + try{ - pRenderer.clear(); + const vrActive = this.renderer.xr.isPresenting; - pRenderer.render(this.renderer); - this.renderer.render(this.overlay, this.overlayCamera); + if(vrActive){ + this.renderVR(); + }else { + this.renderDefault(); } }catch(e){ @@ -32139,76 +90013,28 @@ ENDSEC } } - async toggleVR(){ - const vrActive = (this.vr && this.vr.display.isPresenting); - - if(vrActive){ - this.stopVR(); - }else { - this.startVR(); - } - } - - async startVR(){ - - if(this.vr === null){ - return; - } - - let canvas = this.renderer.domElement; - let display = this.vr.display; - - try{ - await display.requestPresent([{ source: canvas }]); - }catch(e){ - console.error(e); - this.postError("requestPresent failed"); - return; - } - - //window.addEventListener('vrdisplaypresentchange', onVRPresentChange, false); - //window.addEventListener('vrdisplayactivate', onVRRequestPresent, false); - //window.addEventListener('vrdisplaydeactivate', onVRExitPresent, false); - - } - - async stopVR(){ - // TODO shutdown VR - } - loop(timestamp){ if(this.stats){ this.stats.begin(); } - let queryAll; if(Potree.measureTimings){ performance.mark("loop-start"); } + this.update(this.clock.getDelta(), timestamp); + this.render(); - const vrActive = (this.vr && this.vr.display.isPresenting); - - if(vrActive){ - const {display, frameData} = this.vr; - - display.requestAnimationFrame(this.loop.bind(this)); - - display.getFrameData(frameData); - - this.update(this.clock.getDelta(), timestamp); - - this.render(); - - this.vr.display.submitFrame(); - }else { - requestAnimationFrame(this.loop.bind(this)); - - this.update(this.clock.getDelta(), timestamp); + // let vrActive = viewer.renderer.xr.isPresenting; + // if(vrActive){ + // this.update(this.clock.getDelta(), timestamp); + // this.render(); + // }else{ - this.render(); - } + // this.update(this.clock.getDelta(), timestamp); + // this.render(); + // } if(Potree.measureTimings){ @@ -32269,615 +90095,7 @@ ENDSEC } }; - class VRControlls{ - - constructor(viewer){ - - this.viewer = viewer; - - this.previousPads = []; - - this.selection = []; - - this.triggerStarts = []; - - this.scaleState = null; - - this.selectionBox = this.createBox(); - this.viewer.scene.scene.add(this.selectionBox); - - this.speed = 1; - this.speedModificationFactor = 50; - - this.snLeft = this.createControllerModel(); - this.snRight = this.createControllerModel(); - - this.viewer.scene.scene.add(this.snLeft.node); - this.viewer.scene.scene.add(this.snRight.node); - //this.viewer.scene.scene.add(this.snLeft.debug); - //this.viewer.scene.scene.add(this.snRight.debug); - - } - - createControllerModel(){ - const geometry = new THREE.SphereGeometry(1, 32, 32); - const material = new THREE.MeshLambertMaterial( { color: 0xff0000, side: THREE.DoubleSide, flatShading: true } ); - const node = new THREE.Mesh(geometry, material); - - node.position.set(0, 0, 0.5); - node.scale.set(0.02, 0.02, 0.02); - node.visible = false; - - viewer.scene.scene.add(node); - - const debug = new THREE.Mesh(geometry, new THREE.MeshNormalMaterial()); - debug.position.set(0, 0, 0.5); - debug.scale.set(0.01, 0.01, 0.01); - debug.visible = false; - - - const controller = { - node: node, - debug: debug, - }; - //viewer.scene.scene.add(node); - - return controller; - } - - createBox(){ - const color = 0xffff00; - - const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); - const positions = [ - 1, 1, 1, - 0, 1, 1, - 0, 0, 1, - 1, 0, 1, - 1, 1, 0, - 0, 1, 0, - 0, 0, 0, - 1, 0, 0 - ]; - const geometry = new THREE.BufferGeometry(); - - geometry.setIndex( new THREE.BufferAttribute( indices, 1 ) ); - geometry.addAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) ); - - geometry.computeBoundingSphere(); - - const mesh = new THREE.LineSegments(geometry, new THREE.LineBasicMaterial( { color: color } ) ); - mesh.visible = false; - - return mesh; - } - - debugLine(start, end, index, color){ - - if(typeof this.debugLines === "undefined"){ - - const geometry = new THREE.SphereGeometry(1, 8, 8); - - this.debugLines = { - geometry: geometry, - }; - } - - const n = 100; - - if(!this.debugLines[index]){ - const geometry = this.debugLines.geometry; - const material = new THREE.MeshBasicMaterial({color: color}); - const nodes = []; - - for(let i = 0; i <= n; i++){ - const u = i / n; - - const node = new THREE.Mesh(geometry, material); - - const position = new THREE.Vector3().addVectors( - start.clone().multiplyScalar(1-u), - end.clone().multiplyScalar(u) - ); - - node.position.copy(position); - node.scale.set(0.002, 0.002, 0.002); - this.viewer.scene.scene.add(node); - nodes.push(node); - } - - const debugLine = { - material: material, - nodes: nodes, - }; - - this.debugLines[index] = debugLine; - }else { - const debugLine = this.debugLines[index]; - - for(let i = 0; i <= n; i++){ - const node = debugLine.nodes[i]; - const u = i / n; - - const position = new THREE.Vector3().addVectors( - start.clone().multiplyScalar(1-u), - end.clone().multiplyScalar(u) - ); - - node.position.copy(position); - } - } - - - } - - getPointcloudsAt(pointclouds, position){ - - const I = []; - for(const pointcloud of pointclouds){ - - const intersects = pointcloud.intersectsPoint(position); - - if(intersects){ - I.push(pointcloud); - } - } - - return I; - } - - copyPad(pad){ - const axes = pad.axes.map(a => a); - const buttons = pad.buttons.map(b => {return {pressed: b.pressed}}); - - const pose = { - position: new Float32Array(pad.pose.position), - orientation: new Float32Array(pad.pose.orientation), - }; - - const copy = { - axes: axes, - buttons: buttons, - pose: pose, - hand: pad.hand, - index: pad.index, - }; - - return copy; - } - - previousPad(gamepad){ - return this.previousPads.find(c => c.index === gamepad.index); - } - - toScene(position){ - - const vr = viewer.vr; - - vr.node.updateMatrixWorld(); - const world = vr.node.matrixWorld; - - const scenePos = new THREE.Vector3(position.x, -position.z, position.y); - scenePos.applyMatrix4(world); - - return scenePos; - } - - update(delta){ - - const {selection, viewer, snLeft, snRight} = this; - const toScene = this.toScene.bind(this); - const vr = viewer.vr; - - const vrActive = vr && vr.display.isPresenting; - - snLeft.node.visible = vrActive; - snRight.node.visible = vrActive; - - if(!vrActive){ - - return; - } - - const pointclouds = viewer.scene.pointclouds; - - const gamepads = Array.from(navigator.getGamepads()).filter(p => p !== null).map(this.copyPad); - - const getPad = (list, pattern) => list.find(pad => pad.index === pattern.index); - - if(this.previousPads.length !== gamepads.length){ - this.previousPads = gamepads; - } - - const left = gamepads.find(gp => gp.hand && gp.hand === "left"); - const right = gamepads.find(gp => gp.hand && gp.hand === "right"); - - const triggered = gamepads.filter(gamepad => { - return gamepad.buttons[1].pressed; - }); - - const justTriggered = triggered.filter(gamepad => { - const prev = this.previousPad(gamepad); - const previouslyTriggered = prev.buttons[1].pressed; - const currentlyTriggered = gamepad.buttons[1].pressed; - - return !previouslyTriggered && currentlyTriggered; - }); - - const justUntriggered = gamepads.filter(gamepad => { - const prev = this.previousPad(gamepad); - const previouslyTriggered = prev.buttons[1].pressed; - const currentlyTriggered = gamepad.buttons[1].pressed; - - return previouslyTriggered && !currentlyTriggered; - }); - - if(triggered.length === 0){ - - for(const pad of gamepads){ - const position = new THREE.Vector3(...pad.pose.position); - - const I = this.getPointcloudsAt(pointclouds, position); - - let controler = { - "left": snLeft, - "right": snRight, - }[pad.hand]; - - if(I.length > 0){ - controler.node.material.color.setRGB(0, 1, 0); - console.log(pad.hand); - }else { - controler.node.material.color.setRGB(1, 0, 0); - } - } - }else { - if(selection.length > 0){ - const pointcloud = selection[0]; - this.selectionBox.scale.copy(pointcloud.boundingBox.max).multiply(pointcloud.scale); - this.selectionBox.position.copy(pointcloud.position); - this.selectionBox.rotation.copy(pointcloud.rotation); - } - } - - if(justTriggered.length > 0){ - - const pad = justTriggered[0]; - const position = toScene(new THREE.Vector3(...pad.pose.position)); - const I = this.getPointcloudsAt(pointclouds, position); - - const pcs = I.map(p => { - return { - node: p, - position: p.position.clone(), - rotation: p.rotation.clone(), - scale: p.scale.clone(), - }; - }); - - const event = { - pad: pad, - pointclouds: pcs, - }; - - this.triggerStarts.push(event); - } - - if(justUntriggered.length > 0){ - for(let untriggeredPad of justUntriggered){ - const p = getPad(this.triggerStarts.map(t => t.pad), untriggeredPad); - this.triggerStarts = this.triggerStarts.filter(e => e.pad !== p); - } - } - - if(triggered.length === 0){ - selection.length = 0; - this.triggerStarts = []; - } - - if(justTriggered.length === 1 && triggered.length === 1){ - // one controller was triggered this frame - const pad = justTriggered[0]; - const position = toScene(new THREE.Vector3(...pad.pose.position)); - const I = this.getPointcloudsAt(pointclouds, position); - - if(I.length > 0){ - selection.length = 0; - selection.push(I[0]); - } - }else if(justTriggered.length === 2 && triggered.length === 2){ - // two controllers were triggered this frame - const pad = justTriggered[0]; - const position = toScene(new THREE.Vector3(...pad.pose.position)); - const I = this.getPointcloudsAt(pointclouds, position); - - if(I.length > 0){ - selection.length = 0; - selection.push(I[0]); - } - } - - if(justTriggered.length > 0 && triggered.length === 2){ - // START SCALE/ROTATE - - const pcs = selection.map(p => ({ - node: p, - position: p.position.clone(), - rotation: p.rotation.clone(), - scale: p.scale.clone(), - })); - - this.scaleState = { - first: triggered[0], - second: triggered[1], - pointclouds: pcs, - }; - }else if(triggered.length < 2){ - // STOP SCALE/ROTATE - this.scaleState = null; - } - - if(this.scaleState){ - // SCALE/ROTATE - - const {first, second, pointclouds} = this.scaleState; - - if(pointclouds.length > 0){ - - const pointcloud = pointclouds[0]; - - const p1Start = toScene(new THREE.Vector3(...first.pose.position)); - const p2Start = toScene(new THREE.Vector3(...second.pose.position)); - - const p1End = toScene(new THREE.Vector3(...getPad(gamepads, first).pose.position)); - const p2End = toScene(new THREE.Vector3(...getPad(gamepads, second).pose.position)); - - const diffStart = new THREE.Vector3().subVectors(p2Start, p1Start); - const diffEnd = new THREE.Vector3().subVectors(p2End, p1End); - - // this.debugLine(p1Start, p2Start, 0, 0xFF0000); - // this.debugLine(p1End, p2End, 1, 0x00FF00); - - // ROTATION - const diffStartG = new THREE.Vector3(diffStart.x, diffStart.y, 0); - const diffEndG = new THREE.Vector3(diffEnd.x, diffEnd.y, 0); - let sign = Math.sign(diffStartG.clone().cross(diffEndG).z); - sign = sign === 0 ? 1 : sign; - const angle = sign * diffStartG.angleTo(diffEndG); - const newAngle = pointcloud.rotation.z + angle; - - // SCALE - const scale = diffEnd.length() / diffStart.length(); - const newScale = pointcloud.scale.clone().multiplyScalar(scale); - - // POSITION - const p1ToP = new THREE.Vector3().subVectors(pointcloud.position, p1Start); - p1ToP.multiplyScalar(scale); - p1ToP.applyAxisAngle(new THREE.Vector3(0, 0, 1), angle); - const newPosition = p1End.clone().add(p1ToP); - - //this.debugLine(pointcloud.position, newPosition, 0, 0xFF0000); - - //console.log(newScale, p1ToP, angle); - - pointcloud.node.rotation.z = newAngle; - pointcloud.node.scale.copy(newScale); - pointcloud.node.position.copy(newPosition); - - pointcloud.node.updateMatrix(); - pointcloud.node.updateMatrixWorld(); - - - - } - - } - - if(triggered.length === 1){ - // TRANSLATE POINT CLOUDS - const pad = triggered[0]; - const prev = this.previousPad(pad); - - const flipWorld = new THREE.Matrix4().fromArray([ - 1, 0, 0, 0, - 0, 0, 1, 0, - 0, -1, 0, 0, - 0, 0, 0, 1 - ]); - const flipView = new THREE.Matrix4().getInverse(flipWorld); - - const p1 = new THREE.Vector3(...pad.pose.position).applyMatrix4(flipWorld); - const p2 = new THREE.Vector3(...prev.pose.position).applyMatrix4(flipWorld); - - p1.applyMatrix4(vr.node.matrixWorld); - p2.applyMatrix4(vr.node.matrixWorld); - - const diff = new THREE.Vector3().subVectors(p1, p2); - - //const diff = toScene(new THREE.Vector3( - // pad.pose.position[0] - prev.pose.position[0], - // pad.pose.position[1] - prev.pose.position[1], - // pad.pose.position[2] - prev.pose.position[2], - //)); - - for(const pc of selection){ - pc.position.add(diff); - } - } - - { // MOVE WITH JOYSTICK - - const flipWorld = new THREE.Matrix4().fromArray([ - 1, 0, 0, 0, - 0, 0, 1, 0, - 0, -1, 0, 0, - 0, 0, 0, 1 - ]); - const flipView = new THREE.Matrix4().getInverse(flipWorld); - const {display, frameData} = vr; - - const computeMove = (pad) => { - const axes = pad.axes; - - const opos = new THREE.Vector3(...pad.pose.position); - const rotation = new THREE.Quaternion(...pad.pose.orientation); - const d = new THREE.Vector3(0, 0, -1); - d.applyQuaternion(rotation); - - const worldPos = toScene(opos); - const worldTarget = toScene(new THREE.Vector3().addVectors(opos, d)); - const dir = new THREE.Vector3().subVectors(worldTarget, worldPos).normalize(); - - const amount = axes[1] * this.speed; - - const move = dir.clone().multiplyScalar(amount); - - return move; - }; - - let flip = 1; - if(display.displayName.includes("Oculus")){ - flip = -1; - } - - let move = null; - - if(left && right){ - move = computeMove(right); - - const leftAdjustAxe = flip * left.axes[1]; - const adjust = this.speedModificationFactor ** leftAdjustAxe; - - move = move.multiplyScalar(adjust); - - - }else if(right){ - move = computeMove(right); - }else if(left){ - move = computeMove(left); - } - - if(move){ - move.multiplyScalar(delta * flip); - - vr.node.position.add(move); - } - - // for(const pad of [left, right].filter(pad => pad)){ - - - - // moves.push(move); - - // // vr.node.position.add(move); - // } - - // if(moves.length === 1){ - // vr.node.position.add(moves[0]); - // }else if(moves.length > 1){ - - // const factor = 10; - // const [adjust, main] = moves; - // // main gives direction, adjust modifies speed between [0, factor] - - // const mMain = main.length(); - - - // let mAdjust = - - - - // const move = mMain.multiplyScalar(adjust); - - - // // const move = moves[0].clone().add(moves[1]); - - // // const amount = (move.length() ** 3) * delta; - // // move.multiplyScalar(amount); - - // // vr.node.position.add(move); - // } - - - // let pad = [right, left].find(pad => pad !== undefined); - - // if(pad){ - - // const axes = pad.axes; - - - // // const leftView = new THREE.Matrix4().fromArray(frameData.leftViewMatrix); - // // const view = new THREE.Matrix4().multiplyMatrices(leftView, flipView); - // // const world = new THREE.Matrix4().getInverse(view); - - // { // move to where the controller points - // const opos = new THREE.Vector3(...right.pose.position); - // const rotation = new THREE.Quaternion(...pad.pose.orientation); - // const d = new THREE.Vector3(0, 0, -1); - // d.applyQuaternion(rotation); - - // const worldPos = toScene(opos); - // const worldTarget = toScene(new THREE.Vector3().addVectors(opos, d)); - // const dir = new THREE.Vector3().subVectors(worldTarget, worldPos).normalize(); - - // const amount = axes[1]; - - // const move = dir.clone().multiplyScalar(delta * amount); - - // //const d = dir.clone().multiplyScalar(delta); - // vr.node.position.add(move); - // } - - // { // move to trigger direction - // // const pos = new THREE.Vector3(0, 0, 0).applyMatrix4(world); - // // const pForward = new THREE.Vector3(0, 0, -1).applyMatrix4(world); - // // const pRight = new THREE.Vector3(1, 0, 0).applyMatrix4(world); - // // const pUp = new THREE.Vector3(0, 1, 0).applyMatrix4(world); - - // // const dForward = new THREE.Vector3().subVectors(pForward, pos).normalize(); - // // const dRight = new THREE.Vector3().subVectors(pRight, pos).normalize(); - // // const dUp = new THREE.Vector3().subVectors(pUp, pos).normalize(); - - // // const dir = new THREE.Vector3().addVectors( - // // dRight.clone().multiplyScalar(axes[0]), - // // dForward.clone().multiplyScalar(axes[1]) - // // ); - - // // const d = dir.clone().multiplyScalar(delta); - // // vr.node.position.add(d); - // } - - // } - - } - - { // MOVE CONTROLLER SCENE NODE - if(right){ - const {node, debug} = snRight; - const opos = new THREE.Vector3(...right.pose.position); - const position = toScene(opos); - - const rotation = new THREE.Quaternion(...right.pose.orientation); - const d = new THREE.Vector3(0, 0, -1); - d.applyQuaternion(rotation); - // const target = toScene(new THREE.Vector3().addVectors(opos, d)); - - node.position.copy(position); - } - - if(left){ - const {node, debug} = snLeft; - - const position = toScene(new THREE.Vector3(...left.pose.position)); - node.position.copy(position); - } - } - - this.previousPads = gamepads; - } - }; - - THREE.OrthographicCamera.prototype.zoomTo = function( node, factor = 1){ + OrthographicCamera.prototype.zoomTo = function( node, factor = 1){ if ( !node.geometry && !node.boundingBox) { return; @@ -32895,7 +90113,7 @@ ENDSEC this.updateProjectionMatrix(); }; - THREE.PerspectiveCamera.prototype.zoomTo = function (node, factor) { + PerspectiveCamera.prototype.zoomTo = function (node, factor) { if (!node.geometry && !node.boundingSphere && !node.boundingBox) { return; } @@ -32913,7 +90131,7 @@ ENDSEC } else if (node.geometry && node.geometry.boundingSphere) { bs = node.geometry.boundingSphere; } else { - bs = node.boundingBox.getBoundingSphere(new THREE.Sphere()); + bs = node.boundingBox.getBoundingSphere(new Sphere()); } let _factor = factor || 1; @@ -32928,11 +90146,11 @@ ENDSEC let distanceFactor = Math.abs(radius / Math.sin(fovr / 2)) * _factor; - let offset = this.getWorldDirection(new THREE.Vector3()).multiplyScalar(-distanceFactor); + let offset = this.getWorldDirection(new Vector3()).multiplyScalar(-distanceFactor); this.position.copy(bs.center.clone().add(offset)); }; - THREE.Ray.prototype.distanceToPlaneWithNegative = function (plane) { + Ray.prototype.distanceToPlaneWithNegative = function (plane) { let denominator = plane.normal.dot(this.direction); if (denominator === 0) { // line is coplanar, return origin @@ -32952,8 +90170,8 @@ ENDSEC const version = { major: 1, - minor: 7, - suffix: '.1' + minor: 8, + suffix: '.0' }; let lru = new LRU(); @@ -33020,7 +90238,7 @@ ENDSEC } }); } else if (path.indexOf('metadata.json') > 0) { - Potree.OctreeLoader_1_8.load(path).then(e => { + Potree.OctreeLoader.load(path).then(e => { let geometry = e.geometry; if(!geometry){ @@ -33041,7 +90259,7 @@ ENDSEC } }); - OctreeLoader_1_8.load(path, function (geometry) { + OctreeLoader.load(path, function (geometry) { if (!geometry) { //callback({type: 'loading_failed'}); console.error(new Error(`failed to load point cloud from URL: ${path}`)); @@ -33157,7 +90375,7 @@ ENDSEC exports.Action = Action; exports.AnimationPath = AnimationPath; exports.Annotation = Annotation; - exports.Box3Helper = Box3Helper; + exports.Box3Helper = Box3Helper$1; exports.BoxVolume = BoxVolume; exports.CameraAnimation = CameraAnimation; exports.CameraMode = CameraMode; @@ -33192,14 +90410,14 @@ ENDSEC exports.LRU = LRU; exports.LRUItem = LRUItem; exports.LengthUnits = LengthUnits; - exports.MOUSE = MOUSE; + exports.MOUSE = MOUSE$1; exports.Measure = Measure; exports.MeasuringTool = MeasuringTool; exports.Message = Message; exports.NodeLoader = NodeLoader; exports.NormalizationEDLMaterial = NormalizationEDLMaterial; exports.NormalizationMaterial = NormalizationMaterial; - exports.OctreeLoader_1_8 = OctreeLoader_1_8; + exports.OctreeLoader = OctreeLoader; exports.OrbitControls = OrbitControls; exports.OrientedImage = OrientedImage; exports.OrientedImageLoader = OrientedImageLoader; @@ -33211,7 +90429,7 @@ ENDSEC exports.PointAttributes = PointAttributes; exports.PointCloudEptGeometry = PointCloudEptGeometry; exports.PointCloudEptGeometryNode = PointCloudEptGeometryNode; - exports.PointCloudMaterial = PointCloudMaterial; + exports.PointCloudMaterial = PointCloudMaterial$1; exports.PointCloudOctree = PointCloudOctree; exports.PointCloudOctreeGeometry = PointCloudOctreeGeometry; exports.PointCloudOctreeGeometryNode = PointCloudOctreeGeometryNode; @@ -33221,23 +90439,23 @@ ENDSEC exports.PointCloudTreeNode = PointCloudTreeNode; exports.PointShape = PointShape; exports.PointSizeType = PointSizeType; - exports.Points = Points; + exports.Points = Points$1; exports.PolygonClipVolume = PolygonClipVolume; exports.Profile = Profile; exports.ProfileData = ProfileData; exports.ProfileRequest = ProfileRequest; exports.ProfileTool = ProfileTool; exports.Renderer = Renderer; - exports.Scene = Scene; + exports.Scene = Scene$1; exports.ScreenBoxSelectTool = ScreenBoxSelectTool; exports.ShapefileLoader = ShapefileLoader; exports.SphereVolume = SphereVolume; - exports.SpotLightHelper = SpotLightHelper; + exports.SpotLightHelper = SpotLightHelper$1; exports.TextSprite = TextSprite; exports.TransformationTool = TransformationTool; exports.TreeType = TreeType; exports.Utils = Utils; - exports.VRControlls = VRControlls; + exports.VRControls = VRControls; exports.Version = Version; exports.Viewer = Viewer; exports.Volume = Volume; diff --git a/resources/page_template/libs/potree/potree.js.map b/resources/page_template/libs/potree/potree.js.map index a50b078d..244f7418 100644 --- a/resources/page_template/libs/potree/potree.js.map +++ b/resources/page_template/libs/potree/potree.js.map @@ -1 +1 @@ -{"version":3,"file":"potree.js","sources":["../../src/EventDispatcher.js","../../src/Actions.js","../../src/AnimationPath.js","../../src/XHRFactory.js","../../src/TextSprite.js","../../src/utils/Volume.js","../../src/utils/Profile.js","../../src/utils/Measure.js","../../src/utils/PolygonClipVolume.js","../../src/utils.js","../../src/Annotation.js","../../src/Enum.js","../../src/defines.js","../../src/Features.js","../../src/KeyCodes.js","../../src/LRU.js","../../src/PointCloudTree.js","../../src/loader/PointAttributes.js","../../src/PointCloudEptGeometry.js","../../src/PointCloudOctreeGeometry.js","../../src/materials/Gradients.js","../shaders/shaders.js","../../src/materials/ClassificationScheme.js","../../src/materials/PointCloudMaterial.js","../../src/PointCloudOctree.js","../../src/Points.js","../../src/utils/Box3Helper.js","../../src/Potree_update_visibility.js","../../src/arena4d/PointCloudArena4D.js","../../src/PotreeRenderer.js","../../src/ProfileRequest.js","../../src/Version.js","../../src/WorkerPool.js","../../src/viewer/SaveProject.js","../../src/modules/CameraAnimation/CameraAnimation.js","../../src/viewer/LoadProject.js","../../src/materials/EyeDomeLightingMaterial.js","../../src/materials/NormalizationEDLMaterial.js","../../src/materials/NormalizationMaterial.js","../../src/loader/LasLazLoader.js","../../src/loader/BinaryLoader.js","../../src/loader/POCLoader.js","../../src/modules/Loader_1.8/OctreeGeometry.js","../../src/modules/Loader_1.8/OctreeLoader_1_8.js","../../src/loader/EptLoader.js","../../src/loader/ept/BinaryLoader.js","../../src/loader/ept/LaszipLoader.js","../../src/loader/ept/ZstandardLoader.js","../../src/loader/ShapefileLoader.js","../../src/loader/GeoPackageLoader.js","../../src/utils/ClipVolume.js","../../src/utils/ClippingTool.js","../../src/utils/GeoTIFF.js","../../src/utils/MeasuringTool.js","../../src/utils/Message.js","../../src/utils/PointCloudSM.js","../../src/utils/ProfileTool.js","../../src/utils/ScreenBoxSelectTool.js","../../src/utils/SpotLightHelper.js","../../src/utils/TransformationTool.js","../../src/utils/VolumeTool.js","../../src/utils/Compass.js","../../src/viewer/PotreeRenderer.js","../../src/viewer/EDLRenderer.js","../../src/viewer/HQSplatRenderer.js","../../src/viewer/View.js","../../src/viewer/Scene.js","../../src/viewer/map.js","../../src/exporter/CSVExporter.js","../../src/exporter/LASExporter.js","../../src/viewer/profile.js","../../src/exporter/GeoJSONExporter.js","../../src/exporter/DXFExporter.js","../../src/viewer/PropertyPanels/MeasurePanel.js","../../src/viewer/PropertyPanels/DistancePanel.js","../../src/viewer/PropertyPanels/PointPanel.js","../../src/viewer/PropertyPanels/AreaPanel.js","../../src/viewer/PropertyPanels/AnglePanel.js","../../src/viewer/PropertyPanels/CirclePanel.js","../../src/viewer/PropertyPanels/HeightPanel.js","../../src/viewer/PropertyPanels/VolumePanel.js","../../src/viewer/PropertyPanels/ProfilePanel.js","../../src/viewer/PropertyPanels/CameraPanel.js","../../src/viewer/PropertyPanels/AnnotationPanel.js","../../src/viewer/PropertyPanels/CameraAnimationPanel.js","../../src/viewer/PropertyPanels/PropertiesPanel.js","../../src/viewer/HierarchicalSlider.js","../../src/modules/OrientedImages/OrientedImageControls.js","../../src/modules/OrientedImages/OrientedImages.js","../../src/modules/Images360/Images360.js","../../libs/json5-2.1.3/json5.mjs","../../src/viewer/sidebar.js","../../src/utils/AnnotationTool.js","../../src/navigation/InputHandler.js","../../src/viewer/NavigationCube.js","../../src/navigation/OrbitControls.js","../../src/navigation/FirstPersonControls.js","../../src/navigation/EarthControls.js","../../src/navigation/DeviceOrientationControls.js","../../src/viewer/viewer.js","../../src/navigation/VRControlls.js","../../src/extensions/OrthographicCamera.js","../../src/extensions/PerspectiveCamera.js","../../src/extensions/Ray.js","../../src/Potree.js"],"sourcesContent":["\n/**\n * @author mrdoob / http://mrdoob.com/ https://github.com/mrdoob/eventdispatcher.js\n * \n * with slight modifications by mschuetz, http://potree.org\n * \n */\n\n// The MIT License\n// \n// Copyright (c) 2011 Mr.doob\n// \n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n// \n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n\n\n\nexport class EventDispatcher{\n\n\tconstructor(){\n\t\tthis._listeners = {};\n\t}\n\n\taddEventListener(type, listener){\n\n\t\tconst listeners = this._listeners;\n\n\t\tif(listeners[type] === undefined){\n\t\t\tlisteners[type] = [];\n\t\t}\n\n\t\tif(listeners[type].indexOf(listener) === - 1){\n\t\t\tlisteners[type].push( listener );\n\t\t}\n\n\t}\n\n\thasEventListener(type, listener){\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[type] !== undefined && listeners[type].indexOf(listener) !== - 1;\n\t}\n\n\tremoveEventListener(type, listener){\n\n\t\tlet listeners = this._listeners;\n\t\tlet listenerArray = listeners[type];\n\n\t\tif (listenerArray !== undefined){\n\n\t\t\tlet index = listenerArray.indexOf(listener);\n\n\t\t\tif(index !== - 1){\n\t\t\t\tlistenerArray.splice(index, 1);\n\t\t\t}\n\t\t}\n\n\t}\n\n\tremoveEventListeners(type){\n\t\tif(this._listeners[type] !== undefined){\n\t\t\tdelete this._listeners[type];\n\t\t}\n\t};\n\n\tdispatchEvent(event){\n\n\t\tlet listeners = this._listeners;\n\t\tlet listenerArray = listeners[event.type];\n\n\t\tif ( listenerArray !== undefined ) {\n\t\t\tevent.target = this;\n\n\t\t\tfor(let listener of listenerArray.slice(0)){\n\t\t\t\tlistener.call(this, event);\n\t\t\t}\n\t\t}\n\n\t}\n\n}","\n\nimport {EventDispatcher} from \"./EventDispatcher.js\";\n\nexport class Action extends EventDispatcher {\n\tconstructor (args = {}) {\n\t\tsuper();\n\n\t\tthis.icon = args.icon || '';\n\t\tthis.tooltip = args.tooltip;\n\n\t\tif (args.onclick !== undefined) {\n\t\t\tthis.onclick = args.onclick;\n\t\t}\n\t}\n\n\tonclick (event) {\n\n\t}\n\n\tpairWith (object) {\n\n\t}\n\n\tsetIcon (newIcon) {\n\t\tlet oldIcon = this.icon;\n\n\t\tif (newIcon === oldIcon) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.icon = newIcon;\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'icon_changed',\n\t\t\taction: this,\n\t\t\ticon: newIcon,\n\t\t\toldIcon: oldIcon\n\t\t});\n\t}\n};\n\n//Potree.Actions = {};\n//\n//Potree.Actions.ToggleAnnotationVisibility = class ToggleAnnotationVisibility extends Potree.Action {\n//\tconstructor (args = {}) {\n//\t\tsuper(args);\n//\n//\t\tthis.icon = Potree.resourcePath + '/icons/eye.svg';\n//\t\tthis.showIn = 'sidebar';\n//\t\tthis.tooltip = 'toggle visibility';\n//\t}\n//\n//\tpairWith (annotation) {\n//\t\tif (annotation.visible) {\n//\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye.svg');\n//\t\t} else {\n//\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye_crossed.svg');\n//\t\t}\n//\n//\t\tannotation.addEventListener('visibility_changed', e => {\n//\t\t\tlet annotation = e.annotation;\n//\n//\t\t\tif (annotation.visible) {\n//\t\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye.svg');\n//\t\t\t} else {\n//\t\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye_crossed.svg');\n//\t\t\t}\n//\t\t});\n//\t}\n//\n//\tonclick (event) {\n//\t\tlet annotation = event.annotation;\n//\n//\t\tannotation.visible = !annotation.visible;\n//\n//\t\tif (annotation.visible) {\n//\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye.svg');\n//\t\t} else {\n//\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye_crossed.svg');\n//\t\t}\n//\t}\n//};\n","\n\nexport class PathAnimation{\n\t\n\tconstructor(path, start, end, speed, callback){\n\t\t\tthis.path = path;\n\t\t\tthis.length = this.path.spline.getLength();\n\t\t\tthis.speed = speed;\n\t\t\tthis.callback = callback;\n\t\t\tthis.tween = null;\n\t\t\tthis.startPoint = Math.max(start, 0);\n\t\t\tthis.endPoint = Math.min(end, this.length);\n\t\t\tthis.t = 0.0;\n\t}\n\n\tstart(resume = false){\n\t\tif(this.tween){\n\t\t\tthis.tween.stop();\n\t\t\tthis.tween = null;\n\t\t}\n\t\n\t\tlet tStart;\n\t\tif(resume){\n\t\t\ttStart = this.t;\n\t\t}else{\n\t\t\ttStart = this.startPoint / this.length;\n\t\t}\n\t\tlet tEnd = this.endPoint / this.length;\n\t\tlet animationDuration = (tEnd - tStart) * this.length * 1000 / this.speed;\n\t\n\t\tlet progress = {t: tStart};\n\t\tthis.tween = new TWEEN.Tween(progress).to({t: tEnd}, animationDuration);\n\t\tthis.tween.easing(TWEEN.Easing.Linear.None);\n\t\tthis.tween.onUpdate((e) => {\n\t\t\tthis.t = progress.t;\n\t\t\tthis.callback(progress.t);\n\t\t});\n\t\tthis.tween.onComplete(() => {\n\t\t\tif(this.repeat){\n\t\t\t\tthis.start();\n\t\t\t}\n\t\t});\n\n\t\tsetTimeout(() => {\n\t\t\tthis.tween.start();\n\t\t}, 0);\n\t}\n\n\tstop(){\n\t\tif(!this.tween){\n\t\t\treturn;\n\t\t}\n\t\tthis.tween.stop();\n\t\tthis.tween = null;\n\t\tthis.t = 0;\n\t}\n\n\tpause(){\n\t\tif(!this.tween){\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.tween.stop();\n\t\tTWEEN.remove(this.tween);\n\t\tthis.tween = null;\n\t}\n\n\tresume(){\n\t\tthis.start(true);\n\t}\n\n\tgetPoint(t){\n\t\treturn this.path.spline.getPoint(t);\n\t}\n\n}\n\nexport class AnimationPath{\n\tconstructor (points = []) {\n\t\tthis.points = points;\n\t\tthis.spline = new THREE.CatmullRomCurve3(points);\n\t\t//this.spline.reparametrizeByArcLength(1 / this.spline.getLength().total);\n\t}\n\n\tget (t) {\n\t\treturn this.spline.getPoint(t);\n\t}\n\n\tgetLength () {\n\t\treturn this.spline.getLength();\n\t}\n\n\tanimate (start, end, speed, callback) {\n\t\tlet animation = new PathAnimation(this, start, end, speed, callback);\n\t\tanimation.start();\n\n\t\treturn animation;\n\t}\n\n\tpause () {\n\t\tif (this.tween) {\n\t\t\tthis.tween.stop();\n\t\t}\n\t}\n\n\tresume () {\n\t\tif (this.tween) {\n\t\t\tthis.tween.start();\n\t\t}\n\t}\n\n\tgetGeometry () {\n\t\tlet geometry = new THREE.Geometry();\n\n\t\tlet samples = 500;\n\t\tlet i = 0;\n\t\tfor (let u = 0; u <= 1; u += 1 / samples) {\n\t\t\tlet position = this.spline.getPoint(u);\n\t\t\tgeometry.vertices[i] = new THREE.Vector3(position.x, position.y, position.z);\n\n\t\t\ti++;\n\t\t}\n\n\t\tif(this.closed){\n\t\t\tlet position = this.spline.getPoint(0);\n\t\t\tgeometry.vertices[i] = new THREE.Vector3(position.x, position.y, position.z);\n\t\t}\n\n\t\treturn geometry;\n\t}\n\n\tget closed(){\n\t\treturn this.spline.closed;\n\t}\n\n\tset closed(value){\n\t\tthis.spline.closed = value;\n\t}\n\n}\n\t\n\t/*\n\t{\n\t\tlet target = new THREE.Vector3(589854.34, 231411.19, 692.77);\n\t\tlet points = [\n\t\t\tnew THREE.Vector3(589815.52, 231738.31, 959.48 ),\n\t\t\tnew THREE.Vector3(589604.73, 231615.00, 968.10 ),\n\t\t\tnew THREE.Vector3(589579.11, 231354.41, 1010.06),\n\t\t\tnew THREE.Vector3(589723.00, 231169.95, 1015.57),\n\t\t\tnew THREE.Vector3(589960.76, 231116.87, 978.60 ),\n\t\t\tnew THREE.Vector3(590139.29, 231268.71, 972.33 )\n\t\t];\n\t\n\t\tlet path = new Potree.AnimationPath(points);\n\t\n\t\tlet geometry = path.getGeometry();\n\t\tlet material = new THREE.LineBasicMaterial();\n\t\tlet line = new THREE.Line(geometry, material);\n\t\tviewer.scene.scene.add(line);\n\t\n\t\tlet [start, end, speed] = [0, path.getLength(), 10];\n\t\tpath.animate(start, end, speed, t => {\n\t\t\tviewer.scene.view.position.copy(path.spline.getPoint(t));\n\t\t});\n\t\n\t}\n\t*/\n\t","\nconst XHRFactory = {\n\tconfig: {\n\t\twithCredentials: false,\n\t\tcustomHeaders: [\n\t\t\t{ header: null, value: null }\n\t\t]\n\t},\n\n\tcreateXMLHttpRequest: function () {\n\t\tlet xhr = new XMLHttpRequest();\n\n\t\tif (this.config.customHeaders &&\n\t\t\tArray.isArray(this.config.customHeaders) &&\n\t\t\tthis.config.customHeaders.length > 0) {\n\t\t\tlet baseOpen = xhr.open;\n\t\t\tlet customHeaders = this.config.customHeaders;\n\t\t\txhr.open = function () {\n\t\t\t\tbaseOpen.apply(this, [].slice.call(arguments));\n\t\t\t\tcustomHeaders.forEach(function (customHeader) {\n\t\t\t\t\tif (!!customHeader.header && !!customHeader.value) {\n\t\t\t\t\t\txhr.setRequestHeader(customHeader.header, customHeader.value);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\treturn xhr;\n\t}\n};\n\nexport {XHRFactory};","\n\n// /**\n// * adapted from http://stemkoski.github.io/Three.js/Sprite-Text-Labels.html\n// */\n\n// let vs2D = `\n// // precision mediump float;\n// // precision mediump int;\n\n// // attribute vec3 position;\n// // attribute vec4 color;\n// // attribute vec2 uv;\n\n// // uniform mat4 modelViewMatrix;\n// // uniform mat4 projectionMatrix;\n// // uniform mat3 uvTransform;\n\n// uniform vec2 uPosition;\n// uniform vec2 uScale;\n\n// varying vec2 vUv;\n\n\n// void main(){\n\n// \tvec2 pos = position.xy * uScale;\n\n// \tgl_Position = vec4(pos, 0.0, 1.0);\n\n// \tvUv = uv;\n\n\n\n// }\n\n// `;\n\n// let fs2D = `\n// precision mediump float;\n// precision mediump int;\n\n// uniform sampler2D map;\n\n// // varying vec3 vPosition;\n// // varying vec4 vColor;\n// varying vec2 vUv;\n\n\n// void main()\t{\n\n// \tgl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n\n// \tgl_FragColor = vec4(vUv, 0.0, 1.0);\n\n// \tvec4 texelColor = texture2D( map, vUv );\n// \t//texelColor = mapTexelToLinear( texelColor );\n\n// \tgl_FragColor = vec4(texelColor.xyz, 1.0);\n\n\n// }\n\n// `;\n\n// function getRawMaterial(map){\n// \tlet material = new THREE.ShaderMaterial( {\n// \t\tuniforms: {\n// \t\t\tmap: { type: \"t\", value: map },\n// \t\t\tuPosition: {type: \"vec2\", value: [0, 0]},\n// \t\t\tuScale: {type: \"vec2\", value: [1, 1]},\n// \t\t},\n// \t\tvertexShader: vs2D,\n// \t\tfragmentShader: fs2D,\n// \t\tside: THREE.DoubleSide,\n// \t\ttransparent: false,\n\n// \t} );\n\n// \treturn material;\n// }\n\n\nexport class TextSprite extends THREE.Object3D{\n\t\n\tconstructor(text){\n\t\tsuper();\n\n\t\tlet texture = new THREE.Texture();\n\t\ttexture.minFilter = THREE.LinearFilter;\n\t\ttexture.magFilter = THREE.LinearFilter;\n\t\tlet spriteMaterial = new THREE.SpriteMaterial({\n\t\t\tmap: texture,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false});\n\n\t\tthis.texture = texture;\n\n\t\tthis.material = spriteMaterial;\n\t\t//this.material = getRawMaterial(texture);\n\t\tthis.sprite = new THREE.Sprite(this.material);\n\t\tthis.add(this.sprite);\n\n\t\tthis.borderThickness = 4;\n\t\tthis.fontface = 'Arial';\n\t\tthis.fontsize = 28;\n\t\tthis.borderColor = { r: 0, g: 0, b: 0, a: 1.0 };\n\t\tthis.backgroundColor = { r: 255, g: 255, b: 255, a: 1.0 };\n\t\tthis.textColor = {r: 255, g: 255, b: 255, a: 1.0};\n\t\tthis.text = '';\n\n\t\tthis.setText(text);\n\t}\n\n\tsetText(text){\n\t\tif (this.text !== text){\n\t\t\tthis.text = text;\n\n\t\t\tthis.update();\n\t\t}\n\t}\n\n\tsetTextColor(color){\n\t\tthis.textColor = color;\n\n\t\tthis.update();\n\t}\n\n\tsetBorderColor(color){\n\t\tthis.borderColor = color;\n\n\t\tthis.update();\n\t}\n\n\tsetBackgroundColor(color){\n\t\tthis.backgroundColor = color;\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet canvas = document.createElement('canvas');\n\t\tlet context = canvas.getContext('2d');\n\t\tcontext.font = 'Bold ' + this.fontsize + 'px ' + this.fontface;\n\n\t\t// get size data (height depends only on font size)\n\t\tlet metrics = context.measureText(this.text);\n\t\tlet textWidth = metrics.width;\n\t\tlet margin = 5;\n\t\tlet spriteWidth = 2 * margin + textWidth + 2 * this.borderThickness;\n\t\tlet spriteHeight = this.fontsize * 1.4 + 2 * this.borderThickness;\n\n\t\tcontext.canvas.width = spriteWidth;\n\t\tcontext.canvas.height = spriteHeight;\n\t\tcontext.font = 'Bold ' + this.fontsize + 'px ' + this.fontface;\n\n\t\t// background color\n\t\tcontext.fillStyle = 'rgba(' + this.backgroundColor.r + ',' + this.backgroundColor.g + ',' +\n\t\t\tthis.backgroundColor.b + ',' + this.backgroundColor.a + ')';\n\t\t// border color\n\t\tcontext.strokeStyle = 'rgba(' + this.borderColor.r + ',' + this.borderColor.g + ',' +\n\t\t\tthis.borderColor.b + ',' + this.borderColor.a + ')';\n\n\t\tcontext.lineWidth = this.borderThickness;\n\t\tthis.roundRect(context, this.borderThickness / 2, this.borderThickness / 2,\n\t\t\ttextWidth + this.borderThickness + 2 * margin, this.fontsize * 1.4 + this.borderThickness, 6);\n\n\t\t// text color\n\t\tcontext.strokeStyle = 'rgba(0, 0, 0, 1.0)';\n\t\tcontext.strokeText(this.text, this.borderThickness + margin, this.fontsize + this.borderThickness);\n\n\t\tcontext.fillStyle = 'rgba(' + this.textColor.r + ',' + this.textColor.g + ',' +\n\t\t\tthis.textColor.b + ',' + this.textColor.a + ')';\n\t\tcontext.fillText(this.text, this.borderThickness + margin, this.fontsize + this.borderThickness);\n\n\t\tlet texture = new THREE.Texture(canvas);\n\t\ttexture.minFilter = THREE.LinearFilter;\n\t\ttexture.magFilter = THREE.LinearFilter;\n\t\ttexture.needsUpdate = true;\n\t\t//this.material.needsUpdate = true;\n\n\t\t// { // screen-space sprite\n\t\t// \tlet [screenWidth, screenHeight] = [1620, 937];\n\n\t\t// \tlet uniforms = this.sprite.material.uniforms;\n\t\t// \tlet aspect = spriteHeight / spriteWidth;\n\t\t// \tlet factor = 0.5;\n\n\t\t// \tlet w = spriteWidth / screenWidth;\n\t\t// \tlet h = spriteHeight / screenHeight;\n\n\t\t// \tuniforms.uScale.value = [2 * w, 2 * h];\n\t\t// \t//uniforms.uScale.value = [factor * 1, factor * aspect];\n\t\t//\tthis.sprite.material.uniforms.map.value = texture;\n\t\t// }\n\n\t\tthis.sprite.material.map = texture;\n\t\tthis.texture = texture;\n\n\t\tthis.sprite.scale.set(spriteWidth * 0.01, spriteHeight * 0.01, 1.0);\n\t}\n\n\troundRect(ctx, x, y, w, h, r){\n\t\tctx.beginPath();\n\t\tctx.moveTo(x + r, y);\n\t\tctx.lineTo(x + w - r, y);\n\t\tctx.quadraticCurveTo(x + w, y, x + w, y + r);\n\t\tctx.lineTo(x + w, y + h - r);\n\t\tctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n\t\tctx.lineTo(x + r, y + h);\n\t\tctx.quadraticCurveTo(x, y + h, x, y + h - r);\n\t\tctx.lineTo(x, y + r);\n\t\tctx.quadraticCurveTo(x, y, x + r, y);\n\t\tctx.closePath();\n\t\tctx.fill();\n\t\tctx.stroke();\n\t}\n\n}\n\n\n","\nimport {TextSprite} from \"../TextSprite.js\";\n\nexport class Volume extends THREE.Object3D {\n\tconstructor (args = {}) {\n\t\tsuper();\n\n\t\tif(this.constructor.name === \"Volume\"){\n\t\t\tconsole.warn(\"Can't create object of class Volume directly. Use classes BoxVolume or SphereVolume instead.\");\n\t\t}\n\n\t\t//console.log(this);\n\t\t//console.log(this.constructor);\n\t\t//console.log(this.constructor.name);\n\n\t\tthis._clip = args.clip || false;\n\t\tthis._visible = true;\n\t\tthis.showVolumeLabel = true;\n\t\tthis._modifiable = args.modifiable || true;\n\n\t\tthis.label = new TextSprite('0');\n\t\tthis.label.setBorderColor({r: 0, g: 255, b: 0, a: 0.0});\n\t\tthis.label.setBackgroundColor({r: 0, g: 255, b: 0, a: 0.0});\n\t\tthis.label.material.depthTest = false;\n\t\tthis.label.material.depthWrite = false;\n\t\tthis.label.material.transparent = true;\n\t\tthis.label.position.y -= 0.5;\n\t\tthis.add(this.label);\n\n\t\tthis.label.updateMatrixWorld = () => {\n\t\t\tlet volumeWorldPos = new THREE.Vector3();\n\t\t\tvolumeWorldPos.setFromMatrixPosition(this.matrixWorld);\n\t\t\tthis.label.position.copy(volumeWorldPos);\n\t\t\tthis.label.updateMatrix();\n\t\t\tthis.label.matrixWorld.copy(this.label.matrix);\n\t\t\tthis.label.matrixWorldNeedsUpdate = false;\n\n\t\t\tfor (let i = 0, l = this.label.children.length; i < l; i++) {\n\t\t\t\tthis.label.children[ i ].updateMatrixWorld(true);\n\t\t\t}\n\t\t};\n\n\t\t{ // event listeners\n\t\t\tthis.addEventListener('select', e => {});\n\t\t\tthis.addEventListener('deselect', e => {});\n\t\t}\n\n\t}\n\n\tget visible(){\n\t\treturn this._visible;\n\t}\n\n\tset visible(value){\n\t\tif(this._visible !== value){\n\t\t\tthis._visible = value;\n\n\t\t\tthis.dispatchEvent({type: \"visibility_changed\", object: this});\n\t\t}\n\t}\n\n\tgetVolume () {\n\t\tconsole.warn(\"override this in subclass\");\n\t}\n\n\tupdate () {\n\t\t\n\t};\n\n\traycast (raycaster, intersects) {\n\n\t}\n\n\tget clip () {\n\t\treturn this._clip;\n\t}\n\n\tset clip (value) {\n\n\t\tif(this._clip !== value){\n\t\t\tthis._clip = value;\n\n\t\t\tthis.update();\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: \"clip_changed\",\n\t\t\t\tobject: this\n\t\t\t});\n\t\t}\n\t\t\n\t}\n\n\tget modifieable () {\n\t\treturn this._modifiable;\n\t}\n\n\tset modifieable (value) {\n\t\tthis._modifiable = value;\n\n\t\tthis.update();\n\t}\n};\n\n\nexport class BoxVolume extends Volume{\n\n\tconstructor(args = {}){\n\t\tsuper(args);\n\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\t\tthis.name = 'box_' + this.constructor.counter;\n\n\t\tlet boxGeometry = new THREE.BoxGeometry(1, 1, 1);\n\t\tboxGeometry.computeBoundingBox();\n\n\t\tlet boxFrameGeometry = new THREE.Geometry();\n\t\t{\n\t\t\tlet Vector3 = THREE.Vector3;\n\n\t\t\tboxFrameGeometry.vertices.push(\n\n\t\t\t\t// bottom\n\t\t\t\tnew Vector3(-0.5, -0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, -0.5, 0.5),\n\t\t\t\t// top\n\t\t\t\tnew Vector3(-0.5, 0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, -0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, 0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, 0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, 0.5, 0.5),\n\t\t\t\t// sides\n\t\t\t\tnew Vector3(-0.5, -0.5, 0.5),\n\t\t\t\tnew Vector3(-0.5, 0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, 0.5, -0.5),\n\n\t\t\t);\n\n\t\t}\n\n\t\tthis.material = new THREE.MeshBasicMaterial({\n\t\t\tcolor: 0x00ff00,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.3,\n\t\t\tdepthTest: true,\n\t\t\tdepthWrite: false});\n\t\tthis.box = new THREE.Mesh(boxGeometry, this.material);\n\t\tthis.box.geometry.computeBoundingBox();\n\t\tthis.boundingBox = this.box.geometry.boundingBox;\n\t\tthis.add(this.box);\n\n\t\tthis.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: 0x000000}));\n\t\t// this.frame.mode = THREE.Lines;\n\t\tthis.add(this.frame);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tthis.boundingBox = this.box.geometry.boundingBox;\n\t\tthis.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere());\n\n\t\tif (this._clip) {\n\t\t\tthis.box.visible = false;\n\t\t\tthis.label.visible = false;\n\t\t} else {\n\t\t\tthis.box.visible = true;\n\t\t\tthis.label.visible = this.showVolumeLabel;\n\t\t}\n\t}\n\n\traycast (raycaster, intersects) {\n\t\tlet is = [];\n\t\tthis.box.raycast(raycaster, is);\n\n\t\tif (is.length > 0) {\n\t\t\tlet I = is[0];\n\t\t\tintersects.push({\n\t\t\t\tdistance: I.distance,\n\t\t\t\tobject: this,\n\t\t\t\tpoint: I.point.clone()\n\t\t\t});\n\t\t}\n\t}\n\n\tgetVolume(){\n\t\treturn Math.abs(this.scale.x * this.scale.y * this.scale.z);\n\t}\n\n};\n\nexport class SphereVolume extends Volume{\n\n\tconstructor(args = {}){\n\t\tsuper(args);\n\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\t\tthis.name = 'sphere_' + this.constructor.counter;\n\n\t\tlet sphereGeometry = new THREE.SphereGeometry(1, 32, 32);\n\t\tsphereGeometry.computeBoundingBox();\n\n\t\tthis.material = new THREE.MeshBasicMaterial({\n\t\t\tcolor: 0x00ff00,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.3,\n\t\t\tdepthTest: true,\n\t\t\tdepthWrite: false});\n\t\tthis.sphere = new THREE.Mesh(sphereGeometry, this.material);\n\t\tthis.sphere.visible = false;\n\t\tthis.sphere.geometry.computeBoundingBox();\n\t\tthis.boundingBox = this.sphere.geometry.boundingBox;\n\t\tthis.add(this.sphere);\n\n\t\tthis.label.visible = false;\n\n\n\t\tlet frameGeometry = new THREE.Geometry();\n\t\t{\n\t\t\tlet steps = 64;\n\t\t\tlet uSegments = 8;\n\t\t\tlet vSegments = 5;\n\t\t\tlet r = 1;\n\n\t\t\tfor(let uSegment = 0; uSegment < uSegments; uSegment++){\n\n\t\t\t\tlet alpha = (uSegment / uSegments) * Math.PI * 2;\n\t\t\t\tlet dirx = Math.cos(alpha);\n\t\t\t\tlet diry = Math.sin(alpha);\n\n\t\t\t\tfor(let i = 0; i <= steps; i++){\n\t\t\t\t\tlet v = (i / steps) * Math.PI * 2;\n\t\t\t\t\tlet vNext = v + 2 * Math.PI / steps;\n\n\t\t\t\t\tlet height = Math.sin(v);\n\t\t\t\t\tlet xyAmount = Math.cos(v);\n\n\t\t\t\t\tlet heightNext = Math.sin(vNext);\n\t\t\t\t\tlet xyAmountNext = Math.cos(vNext);\n\n\t\t\t\t\tlet vertex = new THREE.Vector3(dirx * xyAmount, diry * xyAmount, height);\n\t\t\t\t\tframeGeometry.vertices.push(vertex);\n\n\t\t\t\t\tlet vertexNext = new THREE.Vector3(dirx * xyAmountNext, diry * xyAmountNext, heightNext);\n\t\t\t\t\tframeGeometry.vertices.push(vertexNext);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// creates rings at poles, just because it's easier to implement\n\t\t\tfor(let vSegment = 0; vSegment <= vSegments + 1; vSegment++){\n\n\t\t\t\t//let height = (vSegment / (vSegments + 1)) * 2 - 1; // -1 to 1\n\t\t\t\tlet uh = (vSegment / (vSegments + 1)); // -1 to 1\n\t\t\t\tuh = (1 - uh) * (-Math.PI / 2) + uh *(Math.PI / 2);\n\t\t\t\tlet height = Math.sin(uh);\n\n\t\t\t\tconsole.log(uh, height);\n\n\t\t\t\tfor(let i = 0; i <= steps; i++){\n\t\t\t\t\tlet u = (i / steps) * Math.PI * 2;\n\t\t\t\t\tlet uNext = u + 2 * Math.PI / steps;\n\n\t\t\t\t\tlet dirx = Math.cos(u);\n\t\t\t\t\tlet diry = Math.sin(u);\n\n\t\t\t\t\tlet dirxNext = Math.cos(uNext);\n\t\t\t\t\tlet diryNext = Math.sin(uNext);\n\n\t\t\t\t\tlet xyAmount = Math.sqrt(1 - height * height);\n\n\t\t\t\t\tlet vertex = new THREE.Vector3(dirx * xyAmount, diry * xyAmount, height);\n\t\t\t\t\tframeGeometry.vertices.push(vertex);\n\n\t\t\t\t\tlet vertexNext = new THREE.Vector3(dirxNext * xyAmount, diryNext * xyAmount, height);\n\t\t\t\t\tframeGeometry.vertices.push(vertexNext);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.frame = new THREE.LineSegments(frameGeometry, new THREE.LineBasicMaterial({color: 0x000000}));\n\t\tthis.add(this.frame);\n\n\t\tlet frameMaterial = new THREE.MeshBasicMaterial({wireframe: true, color: 0x000000});\n\t\tthis.frame = new THREE.Mesh(sphereGeometry, frameMaterial);\n\t\t//this.add(this.frame);\n\n\t\t//this.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: 0x000000}));\n\t\t// this.frame.mode = THREE.Lines;\n\t\t//this.add(this.frame);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tthis.boundingBox = this.sphere.geometry.boundingBox;\n\t\tthis.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere());\n\n\t\t//if (this._clip) {\n\t\t//\tthis.sphere.visible = false;\n\t\t//\tthis.label.visible = false;\n\t\t//} else {\n\t\t//\tthis.sphere.visible = true;\n\t\t//\tthis.label.visible = this.showVolumeLabel;\n\t\t//}\n\t}\n\n\traycast (raycaster, intersects) {\n\t\tlet is = [];\n\t\tthis.sphere.raycast(raycaster, is);\n\n\t\tif (is.length > 0) {\n\t\t\tlet I = is[0];\n\t\t\tintersects.push({\n\t\t\t\tdistance: I.distance,\n\t\t\t\tobject: this,\n\t\t\t\tpoint: I.point.clone()\n\t\t\t});\n\t\t}\n\t}\n\t\n\t// see https://en.wikipedia.org/wiki/Ellipsoid#Volume\n\tgetVolume(){\n\t\treturn (4 / 3) * Math.PI * this.scale.x * this.scale.y * this.scale.z;\n\t}\n\n};","\nimport {Utils} from \"../utils.js\";\n\nexport class Profile extends THREE.Object3D{\n\n\tconstructor () {\n\t\tsuper();\n\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\n\t\tthis.name = 'Profile_' + this.constructor.counter;\n\t\tthis.points = [];\n\t\tthis.spheres = [];\n\t\tthis.edges = [];\n\t\tthis.boxes = [];\n\t\tthis.width = 1;\n\t\tthis.height = 20;\n\t\tthis._modifiable = true;\n\n\t\tthis.sphereGeometry = new THREE.SphereGeometry(0.4, 10, 10);\n\t\tthis.color = new THREE.Color(0xff0000);\n\t\tthis.lineColor = new THREE.Color(0xff0000);\n\t}\n\n\tcreateSphereMaterial () {\n\t\tlet sphereMaterial = new THREE.MeshLambertMaterial({\n\t\t\t//shading: THREE.SmoothShading,\n\t\t\tcolor: 0xff0000,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false}\n\t\t);\n\n\t\treturn sphereMaterial;\n\t};\n\n\tgetSegments () {\n\t\tlet segments = [];\n\n\t\tfor (let i = 0; i < this.points.length - 1; i++) {\n\t\t\tlet start = this.points[i].clone();\n\t\t\tlet end = this.points[i + 1].clone();\n\t\t\tsegments.push({start: start, end: end});\n\t\t}\n\n\t\treturn segments;\n\t}\n\n\tgetSegmentMatrices () {\n\t\tlet segments = this.getSegments();\n\t\tlet matrices = [];\n\n\t\tfor (let segment of segments) {\n\t\t\tlet {start, end} = segment;\n\n\t\t\tlet box = new THREE.Object3D();\n\n\t\t\tlet length = start.clone().setZ(0).distanceTo(end.clone().setZ(0));\n\t\t\tbox.scale.set(length, 10000, this.width);\n\t\t\tbox.up.set(0, 0, 1);\n\n\t\t\tlet center = new THREE.Vector3().addVectors(start, end).multiplyScalar(0.5);\n\t\t\tlet diff = new THREE.Vector3().subVectors(end, start);\n\t\t\tlet target = new THREE.Vector3(diff.y, -diff.x, 0);\n\n\t\t\tbox.position.set(0, 0, 0);\n\t\t\tbox.lookAt(target);\n\t\t\tbox.position.copy(center);\n\n\t\t\tbox.updateMatrixWorld();\n\t\t\tmatrices.push(box.matrixWorld);\n\t\t}\n\n\t\treturn matrices;\n\t}\n\n\taddMarker (point) {\n\t\tthis.points.push(point);\n\n\t\tlet sphere = new THREE.Mesh(this.sphereGeometry, this.createSphereMaterial());\n\n\t\tthis.add(sphere);\n\t\tthis.spheres.push(sphere);\n\n\t\t// edges & boxes\n\t\tif (this.points.length > 1) {\n\t\t\tlet lineGeometry = new THREE.Geometry();\n\t\t\tlineGeometry.vertices.push(new THREE.Vector3(), new THREE.Vector3());\n\t\t\tlineGeometry.colors.push(this.lineColor, this.lineColor, this.lineColor);\n\t\t\tlet lineMaterial = new THREE.LineBasicMaterial({\n\t\t\t\tvertexColors: THREE.VertexColors,\n\t\t\t\tlinewidth: 2,\n\t\t\t\ttransparent: true,\n\t\t\t\topacity: 0.4\n\t\t\t});\n\t\t\tlineMaterial.depthTest = false;\n\t\t\tlet edge = new THREE.Line(lineGeometry, lineMaterial);\n\t\t\tedge.visible = false;\n\n\t\t\tthis.add(edge);\n\t\t\tthis.edges.push(edge);\n\n\t\t\tlet boxGeometry = new THREE.BoxGeometry(1, 1, 1);\n\t\t\tlet boxMaterial = new THREE.MeshBasicMaterial({color: 0xff0000, transparent: true, opacity: 0.2});\n\t\t\tlet box = new THREE.Mesh(boxGeometry, boxMaterial);\n\t\t\tbox.visible = false;\n\n\t\t\tthis.add(box);\n\t\t\tthis.boxes.push(box);\n\t\t}\n\n\t\t{ // event listeners\n\t\t\tlet drag = (e) => {\n\t\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\t\te.drag.end, \n\t\t\t\t\te.viewer.scene.getActiveCamera(), \n\t\t\t\t\te.viewer, \n\t\t\t\t\te.viewer.scene.pointclouds);\n\n\t\t\t\tif (I) {\n\t\t\t\t\tlet i = this.spheres.indexOf(e.drag.object);\n\t\t\t\t\tif (i !== -1) {\n\t\t\t\t\t\tthis.setPosition(i, I.location);\n\t\t\t\t\t\t//this.dispatchEvent({\n\t\t\t\t\t\t//\t'type': 'marker_moved',\n\t\t\t\t\t\t//\t'profile': this,\n\t\t\t\t\t\t//\t'index': i\n\t\t\t\t\t\t//});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet drop = e => {\n\t\t\t\tlet i = this.spheres.indexOf(e.drag.object);\n\t\t\t\tif (i !== -1) {\n\t\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\t\t'type': 'marker_dropped',\n\t\t\t\t\t\t'profile': this,\n\t\t\t\t\t\t'index': i\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet mouseover = (e) => e.object.material.emissive.setHex(0x888888);\n\t\t\tlet mouseleave = (e) => e.object.material.emissive.setHex(0x000000);\n\n\t\t\tsphere.addEventListener('drag', drag);\n\t\t\tsphere.addEventListener('drop', drop);\n\t\t\tsphere.addEventListener('mouseover', mouseover);\n\t\t\tsphere.addEventListener('mouseleave', mouseleave);\n\t\t}\n\n\t\tlet event = {\n\t\t\ttype: 'marker_added',\n\t\t\tprofile: this,\n\t\t\tsphere: sphere\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.setPosition(this.points.length - 1, point);\n\t}\n\n\tremoveMarker (index) {\n\t\tthis.points.splice(index, 1);\n\n\t\tthis.remove(this.spheres[index]);\n\n\t\tlet edgeIndex = (index === 0) ? 0 : (index - 1);\n\t\tthis.remove(this.edges[edgeIndex]);\n\t\tthis.edges.splice(edgeIndex, 1);\n\t\tthis.remove(this.boxes[edgeIndex]);\n\t\tthis.boxes.splice(edgeIndex, 1);\n\n\t\tthis.spheres.splice(index, 1);\n\n\t\tthis.update();\n\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'marker_removed',\n\t\t\t'profile': this\n\t\t});\n\t}\n\n\tsetPosition (index, position) {\n\t\tlet point = this.points[index];\n\t\tpoint.copy(position);\n\n\t\tlet event = {\n\t\t\ttype: 'marker_moved',\n\t\t\tprofile:\tthis,\n\t\t\tindex:\tindex,\n\t\t\tposition: point.clone()\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.update();\n\t}\n\n\tsetWidth (width) {\n\t\tthis.width = width;\n\n\t\tlet event = {\n\t\t\ttype: 'width_changed',\n\t\t\tprofile:\tthis,\n\t\t\twidth:\twidth\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.update();\n\t}\n\n\tgetWidth () {\n\t\treturn this.width;\n\t}\n\n\tupdate () {\n\t\tif (this.points.length === 0) {\n\t\t\treturn;\n\t\t} else if (this.points.length === 1) {\n\t\t\tlet point = this.points[0];\n\t\t\tthis.spheres[0].position.copy(point);\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet min = this.points[0].clone();\n\t\tlet max = this.points[0].clone();\n\t\tlet centroid = new THREE.Vector3();\n\t\tlet lastIndex = this.points.length - 1;\n\t\tfor (let i = 0; i <= lastIndex; i++) {\n\t\t\tlet point = this.points[i];\n\t\t\tlet sphere = this.spheres[i];\n\t\t\tlet leftIndex = (i === 0) ? lastIndex : i - 1;\n\t\t\t// let rightIndex = (i === lastIndex) ? 0 : i + 1;\n\t\t\tlet leftVertex = this.points[leftIndex];\n\t\t\t// let rightVertex = this.points[rightIndex];\n\t\t\tlet leftEdge = this.edges[leftIndex];\n\t\t\tlet rightEdge = this.edges[i];\n\t\t\tlet leftBox = this.boxes[leftIndex];\n\t\t\t// rightBox = this.boxes[i];\n\n\t\t\t// let leftEdgeLength = point.distanceTo(leftVertex);\n\t\t\t// let rightEdgeLength = point.distanceTo(rightVertex);\n\t\t\t// let leftEdgeCenter = new THREE.Vector3().addVectors(leftVertex, point).multiplyScalar(0.5);\n\t\t\t// let rightEdgeCenter = new THREE.Vector3().addVectors(point, rightVertex).multiplyScalar(0.5);\n\n\t\t\tsphere.position.copy(point);\n\n\t\t\tif (this._modifiable) {\n\t\t\t\tsphere.visible = true;\n\t\t\t} else {\n\t\t\t\tsphere.visible = false;\n\t\t\t}\n\n\t\t\tif (leftEdge) {\n\t\t\t\tleftEdge.geometry.vertices[1].copy(point);\n\t\t\t\tleftEdge.geometry.verticesNeedUpdate = true;\n\t\t\t\tleftEdge.geometry.computeBoundingSphere();\n\t\t\t}\n\n\t\t\tif (rightEdge) {\n\t\t\t\trightEdge.geometry.vertices[0].copy(point);\n\t\t\t\trightEdge.geometry.verticesNeedUpdate = true;\n\t\t\t\trightEdge.geometry.computeBoundingSphere();\n\t\t\t}\n\n\t\t\tif (leftBox) {\n\t\t\t\tlet start = leftVertex;\n\t\t\t\tlet end = point;\n\t\t\t\tlet length = start.clone().setZ(0).distanceTo(end.clone().setZ(0));\n\t\t\t\tleftBox.scale.set(length, 1000000, this.width);\n\t\t\t\tleftBox.up.set(0, 0, 1);\n\n\t\t\t\tlet center = new THREE.Vector3().addVectors(start, end).multiplyScalar(0.5);\n\t\t\t\tlet diff = new THREE.Vector3().subVectors(end, start);\n\t\t\t\tlet target = new THREE.Vector3(diff.y, -diff.x, 0);\n\n\t\t\t\tleftBox.position.set(0, 0, 0);\n\t\t\t\tleftBox.lookAt(target);\n\t\t\t\tleftBox.position.copy(center);\n\t\t\t}\n\n\t\t\tcentroid.add(point);\n\t\t\tmin.min(point);\n\t\t\tmax.max(point);\n\t\t}\n\t\tcentroid.multiplyScalar(1 / this.points.length);\n\n\t\tfor (let i = 0; i < this.boxes.length; i++) {\n\t\t\tlet box = this.boxes[i];\n\n\t\t\tbox.position.z = min.z + (max.z - min.z) / 2;\n\t\t}\n\t}\n\n\traycast (raycaster, intersects) {\n\t\tfor (let i = 0; i < this.points.length; i++) {\n\t\t\tlet sphere = this.spheres[i];\n\n\t\t\tsphere.raycast(raycaster, intersects);\n\t\t}\n\n\t\t// recalculate distances because they are not necessarely correct\n\t\t// for scaled objects.\n\t\t// see https://github.com/mrdoob/three.js/issues/5827\n\t\t// TODO: remove this once the bug has been fixed\n\t\tfor (let i = 0; i < intersects.length; i++) {\n\t\t\tlet I = intersects[i];\n\t\t\tI.distance = raycaster.ray.origin.distanceTo(I.point);\n\t\t}\n\t\tintersects.sort(function (a, b) { return a.distance - b.distance; });\n\t};\n\n\tget modifiable () {\n\t\treturn this._modifiable;\n\t}\n\n\tset modifiable (value) {\n\t\tthis._modifiable = value;\n\t\tthis.update();\n\t}\n\n}\n","\nimport {TextSprite} from \"../TextSprite.js\";\nimport {Utils} from \"../utils.js\";\n\nfunction createHeightLine(){\n\tlet lineGeometry = new THREE.LineGeometry();\n\n\tlineGeometry.setPositions([\n\t\t0, 0, 0,\n\t\t0, 0, 0,\n\t]);\n\n\tlet lineMaterial = new THREE.LineMaterial({ \n\t\tcolor: 0x00ff00, \n\t\tdashSize: 5, \n\t\tgapSize: 2,\n\t\tlinewidth: 2, \n\t\tresolution: new THREE.Vector2(1000, 1000),\n\t});\n\n\tlineMaterial.depthTest = false;\n\tconst heightEdge = new THREE.Line2(lineGeometry, lineMaterial);\n\theightEdge.visible = false;\n\n\t//this.add(this.heightEdge);\n\t\n\treturn heightEdge;\n}\n\nfunction createHeightLabel(){\n\tconst heightLabel = new TextSprite('');\n\n\theightLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0});\n\theightLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\theightLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\theightLabel.fontsize = 16;\n\theightLabel.material.depthTest = false;\n\theightLabel.material.opacity = 1;\n\theightLabel.visible = false;\n\n\treturn heightLabel;\n}\n\nfunction createAreaLabel(){\n\tconst areaLabel = new TextSprite('');\n\n\tareaLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0});\n\tareaLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\tareaLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\tareaLabel.fontsize = 16;\n\tareaLabel.material.depthTest = false;\n\tareaLabel.material.opacity = 1;\n\tareaLabel.visible = false;\n\t\n\treturn areaLabel;\n}\n\nfunction createCircleRadiusLabel(){\n\tconst circleRadiusLabel = new TextSprite(\"\");\n\n\tcircleRadiusLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0});\n\tcircleRadiusLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\tcircleRadiusLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\tcircleRadiusLabel.fontsize = 16;\n\tcircleRadiusLabel.material.depthTest = false;\n\tcircleRadiusLabel.material.opacity = 1;\n\tcircleRadiusLabel.visible = false;\n\t\n\treturn circleRadiusLabel;\n}\n\nfunction createCircleRadiusLine(){\n\tconst lineGeometry = new THREE.LineGeometry();\n\n\tlineGeometry.setPositions([\n\t\t0, 0, 0,\n\t\t0, 0, 0,\n\t]);\n\n\tconst lineMaterial = new THREE.LineMaterial({ \n\t\tcolor: 0xff0000, \n\t\tlinewidth: 2, \n\t\tresolution: new THREE.Vector2(1000, 1000),\n\t\tgapSize: 1,\n\t\tdashed: true,\n\t});\n\n\tlineMaterial.depthTest = false;\n\n\tconst circleRadiusLine = new THREE.Line2(lineGeometry, lineMaterial);\n\tcircleRadiusLine.visible = false;\n\n\treturn circleRadiusLine;\n}\n\nfunction createCircleLine(){\n\tconst coordinates = [];\n\n\tlet n = 128;\n\tfor(let i = 0; i <= n; i++){\n\t\tlet u0 = 2 * Math.PI * (i / n);\n\t\tlet u1 = 2 * Math.PI * (i + 1) / n;\n\n\t\tlet p0 = new THREE.Vector3(\n\t\t\tMath.cos(u0), \n\t\t\tMath.sin(u0), \n\t\t\t0\n\t\t);\n\n\t\tlet p1 = new THREE.Vector3(\n\t\t\tMath.cos(u1), \n\t\t\tMath.sin(u1), \n\t\t\t0\n\t\t);\n\n\t\tcoordinates.push(\n\t\t\t...p0.toArray(),\n\t\t\t...p1.toArray(),\n\t\t);\n\t}\n\n\tconst geometry = new THREE.LineGeometry();\n\tgeometry.setPositions(coordinates);\n\n\tconst material = new THREE.LineMaterial({ \n\t\tcolor: 0xff0000, \n\t\tdashSize: 5, \n\t\tgapSize: 2,\n\t\tlinewidth: 2, \n\t\tresolution: new THREE.Vector2(1000, 1000),\n\t});\n\n\tmaterial.depthTest = false;\n\n\tconst circleLine = new THREE.Line2(geometry, material);\n\tcircleLine.visible = false;\n\tcircleLine.computeLineDistances();\n\n\treturn circleLine;\n}\n\nfunction createCircleCenter(){\n\tconst sg = new THREE.SphereGeometry(1, 32, 32);\n\tconst sm = new THREE.MeshNormalMaterial();\n\t\n\tconst circleCenter = new THREE.Mesh(sg, sm);\n\tcircleCenter.visible = false;\n\n\treturn circleCenter;\n}\n\nfunction createLine(){\n\tconst geometry = new THREE.LineGeometry();\n\n\tgeometry.setPositions([\n\t\t0, 0, 0,\n\t\t0, 0, 0,\n\t]);\n\n\tconst material = new THREE.LineMaterial({ \n\t\tcolor: 0xff0000, \n\t\tlinewidth: 2, \n\t\tresolution: new THREE.Vector2(1000, 1000),\n\t\tgapSize: 1,\n\t\tdashed: true,\n\t});\n\n\tmaterial.depthTest = false;\n\n\tconst line = new THREE.Line2(geometry, material);\n\n\treturn line;\n}\n\nfunction createCircle(){\n\n\tconst coordinates = [];\n\n\tlet n = 128;\n\tfor(let i = 0; i <= n; i++){\n\t\tlet u0 = 2 * Math.PI * (i / n);\n\t\tlet u1 = 2 * Math.PI * (i + 1) / n;\n\n\t\tlet p0 = new THREE.Vector3(\n\t\t\tMath.cos(u0), \n\t\t\tMath.sin(u0), \n\t\t\t0\n\t\t);\n\n\t\tlet p1 = new THREE.Vector3(\n\t\t\tMath.cos(u1), \n\t\t\tMath.sin(u1), \n\t\t\t0\n\t\t);\n\n\t\tcoordinates.push(\n\t\t\t...p0.toArray(),\n\t\t\t...p1.toArray(),\n\t\t);\n\t}\n\n\tconst geometry = new THREE.LineGeometry();\n\tgeometry.setPositions(coordinates);\n\n\tconst material = new THREE.LineMaterial({ \n\t\tcolor: 0xff0000, \n\t\tdashSize: 5, \n\t\tgapSize: 2,\n\t\tlinewidth: 2, \n\t\tresolution: new THREE.Vector2(1000, 1000),\n\t});\n\n\tmaterial.depthTest = false;\n\n\tconst line = new THREE.Line2(geometry, material);\n\tline.computeLineDistances();\n\n\treturn line;\n\n}\n\nfunction createAzimuth(){\n\n\tconst azimuth = {\n\t\tlabel: null,\n\t\tcenter: null,\n\t\ttarget: null,\n\t\tnorth: null,\n\t\tcenterToNorth: null,\n\t\tcenterToTarget: null,\n\t\tcenterToTargetground: null,\n\t\ttargetgroundToTarget: null,\n\t\tcircle: null,\n\n\t\tnode: null,\n\t};\n\n\tconst sg = new THREE.SphereGeometry(1, 32, 32);\n\tconst sm = new THREE.MeshNormalMaterial();\n\n\t{\n\t\tconst label = new TextSprite(\"\");\n\n\t\tlabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0});\n\t\tlabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\tlabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\tlabel.fontsize = 16;\n\t\tlabel.material.depthTest = false;\n\t\tlabel.material.opacity = 1;\n\n\t\tazimuth.label = label;\n\t}\n\n\tazimuth.center = new THREE.Mesh(sg, sm);\n\tazimuth.target = new THREE.Mesh(sg, sm);\n\tazimuth.north = new THREE.Mesh(sg, sm);\n\tazimuth.centerToNorth = createLine();\n\tazimuth.centerToTarget = createLine();\n\tazimuth.centerToTargetground = createLine();\n\tazimuth.targetgroundToTarget = createLine();\n\tazimuth.circle = createCircle();\n\n\tazimuth.node = new THREE.Object3D();\n\tazimuth.node.add(\n\t\tazimuth.centerToNorth,\n\t\tazimuth.centerToTarget,\n\t\tazimuth.centerToTargetground,\n\t\tazimuth.targetgroundToTarget,\n\t\tazimuth.circle,\n\t\tazimuth.label,\n\t\tazimuth.center,\n\t\tazimuth.target,\n\t\tazimuth.north,\n\t);\n\n\treturn azimuth;\n}\n\nexport class Measure extends THREE.Object3D {\n\tconstructor () {\n\t\tsuper();\n\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\n\t\tthis.name = 'Measure_' + this.constructor.counter;\n\t\tthis.points = [];\n\t\tthis._showDistances = true;\n\t\tthis._showCoordinates = false;\n\t\tthis._showArea = false;\n\t\tthis._closed = true;\n\t\tthis._showAngles = false;\n\t\tthis._showCircle = false;\n\t\tthis._showHeight = false;\n\t\tthis._showEdges = true;\n\t\tthis._showAzimuth = false;\n\t\tthis.maxMarkers = Number.MAX_SAFE_INTEGER;\n\n\t\tthis.sphereGeometry = new THREE.SphereGeometry(0.4, 10, 10);\n\t\tthis.color = new THREE.Color(0xff0000);\n\n\t\tthis.spheres = [];\n\t\tthis.edges = [];\n\t\tthis.sphereLabels = [];\n\t\tthis.edgeLabels = [];\n\t\tthis.angleLabels = [];\n\t\tthis.coordinateLabels = [];\n\n\t\tthis.heightEdge = createHeightLine();\n\t\tthis.heightLabel = createHeightLabel();\n\t\tthis.areaLabel = createAreaLabel();\n\t\tthis.circleRadiusLabel = createCircleRadiusLabel();\n\t\tthis.circleRadiusLine = createCircleRadiusLine();\n\t\tthis.circleLine = createCircleLine();\n\t\tthis.circleCenter = createCircleCenter();\n\n\t\tthis.azimuth = createAzimuth();\n\n\t\tthis.add(this.heightEdge);\n\t\tthis.add(this.heightLabel);\n\t\tthis.add(this.areaLabel);\n\t\tthis.add(this.circleRadiusLabel);\n\t\tthis.add(this.circleRadiusLine);\n\t\tthis.add(this.circleLine);\n\t\tthis.add(this.circleCenter);\n\n\t\tthis.add(this.azimuth.node);\n\n\t}\n\n\tcreateSphereMaterial () {\n\t\tlet sphereMaterial = new THREE.MeshLambertMaterial({\n\t\t\t//shading: THREE.SmoothShading,\n\t\t\tcolor: this.color,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false}\n\t\t);\n\n\t\treturn sphereMaterial;\n\t};\n\n\taddMarker (point) {\n\t\tif (point instanceof THREE.Vector3) {\n\t\t\tpoint = {position: point};\n\t\t}else if(point instanceof Array){\n\t\t\tpoint = {position: new THREE.Vector3(...point)};\n\t\t}\n\t\tthis.points.push(point);\n\n\t\t// sphere\n\t\tlet sphere = new THREE.Mesh(this.sphereGeometry, this.createSphereMaterial());\n\n\t\tthis.add(sphere);\n\t\tthis.spheres.push(sphere);\n\n\t\t{ // edges\n\t\t\tlet lineGeometry = new THREE.LineGeometry();\n\t\t\tlineGeometry.setPositions( [\n\t\t\t\t\t0, 0, 0,\n\t\t\t\t\t0, 0, 0,\n\t\t\t]);\n\n\t\t\tlet lineMaterial = new THREE.LineMaterial({\n\t\t\t\tcolor: 0xff0000, \n\t\t\t\tlinewidth: 2, \n\t\t\t\tresolution: new THREE.Vector2(1000, 1000),\n\t\t\t});\n\n\t\t\tlineMaterial.depthTest = false;\n\n\t\t\tlet edge = new THREE.Line2(lineGeometry, lineMaterial);\n\t\t\tedge.visible = true;\n\n\t\t\tthis.add(edge);\n\t\t\tthis.edges.push(edge);\n\t\t}\n\n\t\t{ // edge labels\n\t\t\tlet edgeLabel = new TextSprite();\n\t\t\tedgeLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tedgeLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tedgeLabel.material.depthTest = false;\n\t\t\tedgeLabel.visible = false;\n\t\t\tedgeLabel.fontsize = 16;\n\t\t\tthis.edgeLabels.push(edgeLabel);\n\t\t\tthis.add(edgeLabel);\n\t\t}\n\n\t\t{ // angle labels\n\t\t\tlet angleLabel = new TextSprite();\n\t\t\tangleLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tangleLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tangleLabel.fontsize = 16;\n\t\t\tangleLabel.material.depthTest = false;\n\t\t\tangleLabel.material.opacity = 1;\n\t\t\tangleLabel.visible = false;\n\t\t\tthis.angleLabels.push(angleLabel);\n\t\t\tthis.add(angleLabel);\n\t\t}\n\n\t\t{ // coordinate labels\n\t\t\tlet coordinateLabel = new TextSprite();\n\t\t\tcoordinateLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tcoordinateLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tcoordinateLabel.fontsize = 16;\n\t\t\tcoordinateLabel.material.depthTest = false;\n\t\t\tcoordinateLabel.material.opacity = 1;\n\t\t\tcoordinateLabel.visible = false;\n\t\t\tthis.coordinateLabels.push(coordinateLabel);\n\t\t\tthis.add(coordinateLabel);\n\t\t}\n\n\t\t{ // Event Listeners\n\t\t\tlet drag = (e) => {\n\t\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\t\te.drag.end, \n\t\t\t\t\te.viewer.scene.getActiveCamera(), \n\t\t\t\t\te.viewer, \n\t\t\t\t\te.viewer.scene.pointclouds,\n\t\t\t\t\t{pickClipped: true});\n\n\t\t\t\tif (I) {\n\t\t\t\t\tlet i = this.spheres.indexOf(e.drag.object);\n\t\t\t\t\tif (i !== -1) {\n\t\t\t\t\t\tlet point = this.points[i];\n\t\t\t\t\t\tfor (let key of Object.keys(I.point).filter(e => e !== 'position')) {\n\t\t\t\t\t\t\tpoint[key] = I.point[key];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.setPosition(i, I.location);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet drop = e => {\n\t\t\t\tlet i = this.spheres.indexOf(e.drag.object);\n\t\t\t\tif (i !== -1) {\n\t\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\t\t'type': 'marker_dropped',\n\t\t\t\t\t\t'measurement': this,\n\t\t\t\t\t\t'index': i\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet mouseover = (e) => e.object.material.emissive.setHex(0x888888);\n\t\t\tlet mouseleave = (e) => e.object.material.emissive.setHex(0x000000);\n\n\t\t\tsphere.addEventListener('drag', drag);\n\t\t\tsphere.addEventListener('drop', drop);\n\t\t\tsphere.addEventListener('mouseover', mouseover);\n\t\t\tsphere.addEventListener('mouseleave', mouseleave);\n\t\t}\n\n\t\tlet event = {\n\t\t\ttype: 'marker_added',\n\t\t\tmeasurement: this,\n\t\t\tsphere: sphere\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.setMarker(this.points.length - 1, point);\n\t};\n\n\tremoveMarker (index) {\n\t\tthis.points.splice(index, 1);\n\n\t\tthis.remove(this.spheres[index]);\n\n\t\tlet edgeIndex = (index === 0) ? 0 : (index - 1);\n\t\tthis.remove(this.edges[edgeIndex]);\n\t\tthis.edges.splice(edgeIndex, 1);\n\n\t\tthis.remove(this.edgeLabels[edgeIndex]);\n\t\tthis.edgeLabels.splice(edgeIndex, 1);\n\t\tthis.coordinateLabels.splice(index, 1);\n\n\t\tthis.remove(this.angleLabels[index]);\n\t\tthis.angleLabels.splice(index, 1);\n\n\t\tthis.spheres.splice(index, 1);\n\n\t\tthis.update();\n\n\t\tthis.dispatchEvent({type: 'marker_removed', measurement: this});\n\t};\n\n\tsetMarker (index, point) {\n\t\tthis.points[index] = point;\n\n\t\tlet event = {\n\t\t\ttype: 'marker_moved',\n\t\t\tmeasure:\tthis,\n\t\t\tindex:\tindex,\n\t\t\tposition: point.position.clone()\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.update();\n\t}\n\n\tsetPosition (index, position) {\n\t\tlet point = this.points[index];\n\t\tpoint.position.copy(position);\n\n\t\tlet event = {\n\t\t\ttype: 'marker_moved',\n\t\t\tmeasure:\tthis,\n\t\t\tindex:\tindex,\n\t\t\tposition: position.clone()\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.update();\n\t};\n\n\tgetArea () {\n\t\tlet area = 0;\n\t\tlet j = this.points.length - 1;\n\n\t\tfor (let i = 0; i < this.points.length; i++) {\n\t\t\tlet p1 = this.points[i].position;\n\t\t\tlet p2 = this.points[j].position;\n\t\t\tarea += (p2.x + p1.x) * (p1.y - p2.y);\n\t\t\tj = i;\n\t\t}\n\n\t\treturn Math.abs(area / 2);\n\t};\n\n\tgetTotalDistance () {\n\t\tif (this.points.length === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet distance = 0;\n\n\t\tfor (let i = 1; i < this.points.length; i++) {\n\t\t\tlet prev = this.points[i - 1].position;\n\t\t\tlet curr = this.points[i].position;\n\t\t\tlet d = prev.distanceTo(curr);\n\n\t\t\tdistance += d;\n\t\t}\n\n\t\tif (this.closed && this.points.length > 1) {\n\t\t\tlet first = this.points[0].position;\n\t\t\tlet last = this.points[this.points.length - 1].position;\n\t\t\tlet d = last.distanceTo(first);\n\n\t\t\tdistance += d;\n\t\t}\n\n\t\treturn distance;\n\t}\n\n\tgetAngleBetweenLines (cornerPoint, point1, point2) {\n\t\tlet v1 = new THREE.Vector3().subVectors(point1.position, cornerPoint.position);\n\t\tlet v2 = new THREE.Vector3().subVectors(point2.position, cornerPoint.position);\n\n\t\t// avoid the error printed by threejs if denominator is 0\n\t\tconst denominator = Math.sqrt( v1.lengthSq() * v2.lengthSq() );\n\t\tif(denominator === 0){\n\t\t\treturn 0;\n\t\t}else{\n\t\t\treturn v1.angleTo(v2);\n\t\t}\n\t};\n\n\tgetAngle (index) {\n\t\tif (this.points.length < 3 || index >= this.points.length) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet previous = (index === 0) ? this.points[this.points.length - 1] : this.points[index - 1];\n\t\tlet point = this.points[index];\n\t\tlet next = this.points[(index + 1) % (this.points.length)];\n\n\t\treturn this.getAngleBetweenLines(point, previous, next);\n\t}\n\n\t// updateAzimuth(){\n\t// \t// if(this.points.length !== 2){\n\t// \t// \treturn;\n\t// \t// }\n\n\t// \t// const azimuth = this.azimuth;\n\n\t// \t// const [p0, p1] = this.points;\n\n\t// \t// const r = p0.position.distanceTo(p1.position);\n\t\t\n\t// }\n\n\tupdate () {\n\t\tif (this.points.length === 0) {\n\t\t\treturn;\n\t\t} else if (this.points.length === 1) {\n\t\t\tlet point = this.points[0];\n\t\t\tlet position = point.position;\n\t\t\tthis.spheres[0].position.copy(position);\n\n\t\t\t{ // coordinate labels\n\t\t\t\tlet coordinateLabel = this.coordinateLabels[0];\n\t\t\t\t\n\t\t\t\tlet msg = position.toArray().map(p => Utils.addCommas(p.toFixed(2))).join(\" / \");\n\t\t\t\tcoordinateLabel.setText(msg);\n\n\t\t\t\tcoordinateLabel.visible = this.showCoordinates;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet lastIndex = this.points.length - 1;\n\n\t\tlet centroid = new THREE.Vector3();\n\t\tfor (let i = 0; i <= lastIndex; i++) {\n\t\t\tlet point = this.points[i];\n\t\t\tcentroid.add(point.position);\n\t\t}\n\t\tcentroid.divideScalar(this.points.length);\n\n\t\tfor (let i = 0; i <= lastIndex; i++) {\n\t\t\tlet index = i;\n\t\t\tlet nextIndex = (i + 1 > lastIndex) ? 0 : i + 1;\n\t\t\tlet previousIndex = (i === 0) ? lastIndex : i - 1;\n\n\t\t\tlet point = this.points[index];\n\t\t\tlet nextPoint = this.points[nextIndex];\n\t\t\tlet previousPoint = this.points[previousIndex];\n\n\t\t\tlet sphere = this.spheres[index];\n\n\t\t\t// spheres\n\t\t\tsphere.position.copy(point.position);\n\t\t\tsphere.material.color = this.color;\n\n\t\t\t{ // edges\n\t\t\t\tlet edge = this.edges[index];\n\n\t\t\t\tedge.material.color = this.color;\n\n\t\t\t\tedge.position.copy(point.position);\n\n\t\t\t\tedge.geometry.setPositions([\n\t\t\t\t\t0, 0, 0,\n\t\t\t\t\t...nextPoint.position.clone().sub(point.position).toArray(),\n\t\t\t\t]);\n\n\t\t\t\tedge.geometry.verticesNeedUpdate = true;\n\t\t\t\tedge.geometry.computeBoundingSphere();\n\t\t\t\tedge.computeLineDistances();\n\t\t\t\tedge.visible = index < lastIndex || this.closed;\n\t\t\t\t\n\t\t\t\tif(!this.showEdges){\n\t\t\t\t\tedge.visible = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t{ // edge labels\n\t\t\t\tlet edgeLabel = this.edgeLabels[i];\n\n\t\t\t\tlet center = new THREE.Vector3().add(point.position);\n\t\t\t\tcenter.add(nextPoint.position);\n\t\t\t\tcenter = center.multiplyScalar(0.5);\n\t\t\t\tlet distance = point.position.distanceTo(nextPoint.position);\n\n\t\t\t\tedgeLabel.position.copy(center);\n\n\t\t\t\tlet suffix = \"\";\n\t\t\t\tif(this.lengthUnit != null && this.lengthUnitDisplay != null){\n\t\t\t\t\tdistance = distance / this.lengthUnit.unitspermeter * this.lengthUnitDisplay.unitspermeter; //convert to meters then to the display unit\n\t\t\t\t\tsuffix = this.lengthUnitDisplay.code;\n\t\t\t\t}\n\n\t\t\t\tlet txtLength = Utils.addCommas(distance.toFixed(2));\n\t\t\t\tedgeLabel.setText(`${txtLength} ${suffix}`);\n\t\t\t\tedgeLabel.visible = this.showDistances && (index < lastIndex || this.closed) && this.points.length >= 2 && distance > 0;\n\t\t\t}\n\n\t\t\t{ // angle labels\n\t\t\t\tlet angleLabel = this.angleLabels[i];\n\t\t\t\tlet angle = this.getAngleBetweenLines(point, previousPoint, nextPoint);\n\n\t\t\t\tlet dir = nextPoint.position.clone().sub(previousPoint.position);\n\t\t\t\tdir.multiplyScalar(0.5);\n\t\t\t\tdir = previousPoint.position.clone().add(dir).sub(point.position).normalize();\n\n\t\t\t\tlet dist = Math.min(point.position.distanceTo(previousPoint.position), point.position.distanceTo(nextPoint.position));\n\t\t\t\tdist = dist / 9;\n\n\t\t\t\tlet labelPos = point.position.clone().add(dir.multiplyScalar(dist));\n\t\t\t\tangleLabel.position.copy(labelPos);\n\n\t\t\t\tlet msg = Utils.addCommas((angle * (180.0 / Math.PI)).toFixed(1)) + '\\u00B0';\n\t\t\t\tangleLabel.setText(msg);\n\n\t\t\t\tangleLabel.visible = this.showAngles && (index < lastIndex || this.closed) && this.points.length >= 3 && angle > 0;\n\t\t\t}\n\t\t}\n\n\t\t{ // update height stuff\n\t\t\tlet heightEdge = this.heightEdge;\n\t\t\theightEdge.visible = this.showHeight;\n\t\t\tthis.heightLabel.visible = this.showHeight;\n\n\t\t\tif (this.showHeight) {\n\t\t\t\tlet sorted = this.points.slice().sort((a, b) => a.position.z - b.position.z);\n\t\t\t\tlet lowPoint = sorted[0].position.clone();\n\t\t\t\tlet highPoint = sorted[sorted.length - 1].position.clone();\n\t\t\t\tlet min = lowPoint.z;\n\t\t\t\tlet max = highPoint.z;\n\t\t\t\tlet height = max - min;\n\n\t\t\t\tlet start = new THREE.Vector3(highPoint.x, highPoint.y, min);\n\t\t\t\tlet end = new THREE.Vector3(highPoint.x, highPoint.y, max);\n\n\t\t\t\theightEdge.position.copy(lowPoint);\n\n\t\t\t\theightEdge.geometry.setPositions([\n\t\t\t\t\t0, 0, 0,\n\t\t\t\t\t...start.clone().sub(lowPoint).toArray(),\n\t\t\t\t\t...start.clone().sub(lowPoint).toArray(),\n\t\t\t\t\t...end.clone().sub(lowPoint).toArray(),\n\t\t\t\t]);\n\n\t\t\t\theightEdge.geometry.verticesNeedUpdate = true;\n\t\t\t\t// heightEdge.geometry.computeLineDistances();\n\t\t\t\t// heightEdge.geometry.lineDistancesNeedUpdate = true;\n\t\t\t\theightEdge.geometry.computeBoundingSphere();\n\t\t\t\theightEdge.computeLineDistances();\n\n\t\t\t\t// heightEdge.material.dashSize = height / 40;\n\t\t\t\t// heightEdge.material.gapSize = height / 40;\n\n\t\t\t\tlet heightLabelPosition = start.clone().add(end).multiplyScalar(0.5);\n\t\t\t\tthis.heightLabel.position.copy(heightLabelPosition);\n\n\t\t\t\tlet suffix = \"\";\n\t\t\t\tif(this.lengthUnit != null && this.lengthUnitDisplay != null){\n\t\t\t\t\theight = height / this.lengthUnit.unitspermeter * this.lengthUnitDisplay.unitspermeter; //convert to meters then to the display unit\n\t\t\t\t\tsuffix = this.lengthUnitDisplay.code;\n\t\t\t\t}\n\n\t\t\t\tlet txtHeight = Utils.addCommas(height.toFixed(2));\n\t\t\t\tlet msg = `${txtHeight} ${suffix}`;\n\t\t\t\tthis.heightLabel.setText(msg);\n\t\t\t}\n\t\t}\n\n\t\t{ // update circle stuff\n\t\t\tconst circleRadiusLabel = this.circleRadiusLabel;\n\t\t\tconst circleRadiusLine = this.circleRadiusLine;\n\t\t\tconst circleLine = this.circleLine;\n\t\t\tconst circleCenter = this.circleCenter;\n\n\t\t\tconst circleOkay = this.points.length === 3;\n\n\t\t\tcircleRadiusLabel.visible = this.showCircle && circleOkay;\n\t\t\tcircleRadiusLine.visible = this.showCircle && circleOkay;\n\t\t\tcircleLine.visible = this.showCircle && circleOkay;\n\t\t\tcircleCenter.visible = this.showCircle && circleOkay;\n\n\t\t\tif(this.showCircle && circleOkay){\n\n\t\t\t\tconst A = this.points[0].position;\n\t\t\t\tconst B = this.points[1].position;\n\t\t\t\tconst C = this.points[2].position;\n\t\t\t\tconst AB = B.clone().sub(A);\n\t\t\t\tconst AC = C.clone().sub(A);\n\t\t\t\tconst N = AC.clone().cross(AB).normalize();\n\n\t\t\t\tconst center = Potree.Utils.computeCircleCenter(A, B, C);\n\t\t\t\tconst radius = center.distanceTo(A);\n\n\n\t\t\t\tconst scale = radius / 20;\n\t\t\t\tcircleCenter.position.copy(center);\n\t\t\t\tcircleCenter.scale.set(scale, scale, scale);\n\n\t\t\t\t//circleRadiusLine.geometry.vertices[0].set(0, 0, 0);\n\t\t\t\t//circleRadiusLine.geometry.vertices[1].copy(B.clone().sub(center));\n\n\t\t\t\tcircleRadiusLine.geometry.setPositions( [\n\t\t\t\t\t0, 0, 0,\n\t\t\t\t\t...B.clone().sub(center).toArray()\n\t\t\t\t] );\n\n\t\t\t\tcircleRadiusLine.geometry.verticesNeedUpdate = true;\n\t\t\t\tcircleRadiusLine.geometry.computeBoundingSphere();\n\t\t\t\tcircleRadiusLine.position.copy(center);\n\t\t\t\tcircleRadiusLine.computeLineDistances();\n\n\t\t\t\tconst target = center.clone().add(N);\n\t\t\t\tcircleLine.position.copy(center);\n\t\t\t\tcircleLine.scale.set(radius, radius, radius);\n\t\t\t\tcircleLine.lookAt(target);\n\t\t\t\t\n\t\t\t\tcircleRadiusLabel.visible = true;\n\t\t\t\tcircleRadiusLabel.position.copy(center.clone().add(B).multiplyScalar(0.5));\n\t\t\t\tcircleRadiusLabel.setText(`${radius.toFixed(3)}`);\n\n\t\t\t}\n\t\t}\n\n\t\t{ // update area label\n\t\t\tthis.areaLabel.position.copy(centroid);\n\t\t\tthis.areaLabel.visible = this.showArea && this.points.length >= 3;\n\t\t\tlet area = this.getArea();\n\n\t\t\tlet suffix = \"\";\n\t\t\tif(this.lengthUnit != null && this.lengthUnitDisplay != null){\n\t\t\t\tarea = area / Math.pow(this.lengthUnit.unitspermeter, 2) * Math.pow(this.lengthUnitDisplay.unitspermeter, 2); //convert to square meters then to the square display unit\n\t\t\t\tsuffix = this.lengthUnitDisplay.code;\n\t\t\t}\n\n\t\t\tlet txtArea = Utils.addCommas(area.toFixed(1));\n\t\t\tlet msg = `${txtArea} ${suffix}\\u00B2`;\n\t\t\tthis.areaLabel.setText(msg);\n\t\t}\n\n\t\t// this.updateAzimuth();\n\t};\n\n\traycast (raycaster, intersects) {\n\t\tfor (let i = 0; i < this.points.length; i++) {\n\t\t\tlet sphere = this.spheres[i];\n\n\t\t\tsphere.raycast(raycaster, intersects);\n\t\t}\n\n\t\t// recalculate distances because they are not necessarely correct\n\t\t// for scaled objects.\n\t\t// see https://github.com/mrdoob/three.js/issues/5827\n\t\t// TODO: remove this once the bug has been fixed\n\t\tfor (let i = 0; i < intersects.length; i++) {\n\t\t\tlet I = intersects[i];\n\t\t\tI.distance = raycaster.ray.origin.distanceTo(I.point);\n\t\t}\n\t\tintersects.sort(function (a, b) { return a.distance - b.distance; });\n\t};\n\n\tget showCoordinates () {\n\t\treturn this._showCoordinates;\n\t}\n\n\tset showCoordinates (value) {\n\t\tthis._showCoordinates = value;\n\t\tthis.update();\n\t}\n\n\tget showAngles () {\n\t\treturn this._showAngles;\n\t}\n\n\tset showAngles (value) {\n\t\tthis._showAngles = value;\n\t\tthis.update();\n\t}\n\n\tget showCircle () {\n\t\treturn this._showCircle;\n\t}\n\n\tset showCircle (value) {\n\t\tthis._showCircle = value;\n\t\tthis.update();\n\t}\n\n\tget showAzimuth(){\n\t\treturn this._showAzimuth;\n\t}\n\n\tset showAzimuth(value){\n\t\tthis._showAzimuth = value;\n\t\tthis.update();\n\t}\n\n\tget showEdges () {\n\t\treturn this._showEdges;\n\t}\n\n\tset showEdges (value) {\n\t\tthis._showEdges = value;\n\t\tthis.update();\n\t}\n\n\tget showHeight () {\n\t\treturn this._showHeight;\n\t}\n\n\tset showHeight (value) {\n\t\tthis._showHeight = value;\n\t\tthis.update();\n\t}\n\n\tget showArea () {\n\t\treturn this._showArea;\n\t}\n\n\tset showArea (value) {\n\t\tthis._showArea = value;\n\t\tthis.update();\n\t}\n\n\tget closed () {\n\t\treturn this._closed;\n\t}\n\n\tset closed (value) {\n\t\tthis._closed = value;\n\t\tthis.update();\n\t}\n\n\tget showDistances () {\n\t\treturn this._showDistances;\n\t}\n\n\tset showDistances (value) {\n\t\tthis._showDistances = value;\n\t\tthis.update();\n\t}\n\n}\n","\nexport class PolygonClipVolume extends THREE.Object3D{\n\t\n\tconstructor(camera){\n\t\tsuper();\n\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\t\tthis.name = \"polygon_clip_volume_\" + this.constructor.counter;\n\n\t\tthis.camera = camera.clone();\n\t\tthis.camera.rotation.set(...camera.rotation.toArray()); // [r85] workaround because camera.clone() doesn't work on rotation\n\t\tthis.camera.rotation.order = camera.rotation.order;\n\t\tthis.camera.updateMatrixWorld();\n\t\tthis.camera.updateProjectionMatrix();\n\t\tthis.camera.matrixWorldInverse.getInverse(this.camera.matrixWorld);\n\n\t\tthis.viewMatrix = this.camera.matrixWorldInverse.clone();\n\t\tthis.projMatrix = this.camera.projectionMatrix.clone();\n\n\t\t// projected markers\n\t\tthis.markers = [];\n\t\tthis.initialized = false;\n\t}\n\n\taddMarker() {\n\n\t\tlet marker = new THREE.Mesh();\n\n\t\tlet cancel;\n\n\t\tlet drag = e => {\n\t\t\tlet size = e.viewer.renderer.getSize(new THREE.Vector2());\n\t\t\tlet projectedPos = new THREE.Vector3(\n\t\t\t\t2.0 * (e.drag.end.x / size.width) - 1.0,\n\t\t\t\t-2.0 * (e.drag.end.y / size.height) + 1.0,\n\t\t\t\t0\n\t\t\t);\n\n\t\t\tmarker.position.copy(projectedPos);\n\t\t};\n\t\t\n\t\tlet drop = e => {\t\n\t\t\tcancel();\n\t\t};\n\t\t\n\t\tcancel = e => {\n\t\t\tmarker.removeEventListener(\"drag\", drag);\n\t\t\tmarker.removeEventListener(\"drop\", drop);\n\t\t};\n\t\t\n\t\tmarker.addEventListener(\"drag\", drag);\n\t\tmarker.addEventListener(\"drop\", drop);\n\n\n\t\tthis.markers.push(marker);\n\t}\n\n\tremoveLastMarker() {\n\t\tif(this.markers.length > 0) {\n\t\t\tthis.markers.splice(this.markers.length - 1, 1);\n\t\t}\n\t}\n\n};","\nimport {XHRFactory} from \"./XHRFactory.js\";\nimport {Volume} from \"./utils/Volume.js\";\nimport {Profile} from \"./utils/Profile.js\";\nimport {Measure} from \"./utils/Measure.js\";\nimport {PolygonClipVolume} from \"./utils/PolygonClipVolume.js\";\n\nexport class Utils {\n\tstatic async loadShapefileFeatures (file, callback) {\n\t\tlet features = [];\n\n\t\tlet handleFinish = () => {\n\t\t\tcallback(features);\n\t\t};\n\n\t\tlet source = await shapefile.open(file);\n\n\t\twhile(true){\n\t\t\tlet result = await source.read();\n\n\t\t\tif (result.done) {\n\t\t\t\thandleFinish();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (result.value && result.value.type === 'Feature' && result.value.geometry !== undefined) {\n\t\t\t\tfeatures.push(result.value);\n\t\t\t}\n\t\t}\n\n\t}\n\n\tstatic toString (value) {\n\t\tif (value instanceof THREE.Vector3) {\n\t\t\treturn value.x.toFixed(2) + ', ' + value.y.toFixed(2) + ', ' + value.z.toFixed(2);\n\t\t} else {\n\t\t\treturn '' + value + '';\n\t\t}\n\t}\n\n\tstatic normalizeURL (url) {\n\t\tlet u = new URL(url);\n\n\t\treturn u.protocol + '//' + u.hostname + u.pathname.replace(/\\/+/g, '/');\n\t};\n\n\tstatic pathExists (url) {\n\t\tlet req = XHRFactory.createXMLHttpRequest();\n\t\treq.open('GET', url, false);\n\t\treq.send(null);\n\t\tif (req.status !== 200) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tstatic debugSphere(parent, position, scale, color){\n\t\tlet geometry = new THREE.SphereGeometry(1, 8, 8);\n\t\tlet material;\n\n\t\tif(color !== undefined){\n\t\t\tmaterial = new THREE.MeshBasicMaterial({color: color});\n\t\t}else{\n\t\t\tmaterial = new THREE.MeshNormalMaterial();\n\t\t}\n\t\tlet sphere = new THREE.Mesh(geometry, material);\n\t\tsphere.position.copy(position);\n\t\tsphere.scale.set(scale, scale, scale);\n\t\tparent.add(sphere);\n\t}\n\n\tstatic debugLine(parent, start, end, color){\n\n\t\tlet material = new THREE.LineBasicMaterial({ color: color }); \n\t\tlet geometry = new THREE.Geometry();\n\n\t\tconst p1 = new THREE.Vector3(0, 0, 0);\n\t\tconst p2 = end.clone().sub(start);\n\n\t\tgeometry.vertices.push(p1, p2);\n\n\t\tlet tl = new THREE.Line( geometry, material );\n\t\ttl.position.copy(start);\n\n\t\tparent.add(tl);\n\t}\n\n\tstatic debugCircle(parent, center, radius, normal, color){\n\t\tlet material = new THREE.LineBasicMaterial({ color: color });\n\n\t\tlet geometry = new THREE.Geometry();\n\n\t\tlet n = 32;\n\t\tfor(let i = 0; i <= n; i++){\n\t\t\tlet u0 = 2 * Math.PI * (i / n);\n\t\t\tlet u1 = 2 * Math.PI * (i + 1) / n;\n\n\t\t\tlet p0 = new THREE.Vector3(\n\t\t\t\tMath.cos(u0), \n\t\t\t\tMath.sin(u0), \n\t\t\t\t0\n\t\t\t);\n\n\t\t\tlet p1 = new THREE.Vector3(\n\t\t\t\tMath.cos(u1), \n\t\t\t\tMath.sin(u1), \n\t\t\t\t0\n\t\t\t);\n\n\t\t\tgeometry.vertices.push(p0, p1); \n\t\t}\n\n\t\tlet tl = new THREE.Line( geometry, material ); \n\t\ttl.position.copy(center);\n\t\ttl.scale.set(radius, radius, radius);\n\n\t\tparent.add(tl);\n\t}\n\n\tstatic debugBox(parent, box, transform = new THREE.Matrix4(), color = 0xFFFF00){\n\t\t\n\t\tlet vertices = [\n\t\t\t[box.min.x, box.min.y, box.min.z],\n\t\t\t[box.min.x, box.min.y, box.max.z],\n\t\t\t[box.min.x, box.max.y, box.min.z],\n\t\t\t[box.min.x, box.max.y, box.max.z],\n\n\t\t\t[box.max.x, box.min.y, box.min.z],\n\t\t\t[box.max.x, box.min.y, box.max.z],\n\t\t\t[box.max.x, box.max.y, box.min.z],\n\t\t\t[box.max.x, box.max.y, box.max.z],\n\t\t].map(v => new THREE.Vector3(...v));\n\n\t\tlet edges = [\n\t\t\t[0, 4], [4, 5], [5, 1], [1, 0],\n\t\t\t[2, 6], [6, 7], [7, 3], [3, 2],\n\t\t\t[0, 2], [4, 6], [5, 7], [1, 3]\n\t\t];\n\n\t\tlet center = box.getCenter(new THREE.Vector3());\n\n\t\tlet centroids = [\n\t\t\t{position: [box.min.x, center.y, center.z], color: 0xFF0000},\n\t\t\t{position: [box.max.x, center.y, center.z], color: 0x880000},\n\n\t\t\t{position: [center.x, box.min.y, center.z], color: 0x00FF00},\n\t\t\t{position: [center.x, box.max.y, center.z], color: 0x008800},\n\n\t\t\t{position: [center.x, center.y, box.min.z], color: 0x0000FF},\n\t\t\t{position: [center.x, center.y, box.max.z], color: 0x000088},\n\t\t];\n\n\t\tfor(let vertex of vertices){\n\t\t\tlet pos = vertex.clone().applyMatrix4(transform);\n\n\t\t\tUtils.debugSphere(parent, pos, 0.1, 0xFF0000);\n\t\t}\n\n\t\tfor(let edge of edges){\n\t\t\tlet start = vertices[edge[0]].clone().applyMatrix4(transform);\n\t\t\tlet end = vertices[edge[1]].clone().applyMatrix4(transform);\n\n\t\t\tUtils.debugLine(parent, start, end, color);\n\t\t}\n\n\t\tfor(let centroid of centroids){\n\t\t\tlet pos = new THREE.Vector3(...centroid.position).applyMatrix4(transform);\n\n\t\t\tUtils.debugSphere(parent, pos, 0.1, centroid.color);\n\t\t}\n\t}\n\n\tstatic debugPlane(parent, plane, size = 1, color = 0x0000FF){\n\n\t\tlet planehelper = new THREE.PlaneHelper(plane, size, color);\n\n\t\tparent.add(planehelper);\n\n\t}\n\n\t/**\n\t * adapted from mhluska at https://github.com/mrdoob/three.js/issues/1561\n\t */\n\tstatic computeTransformedBoundingBox (box, transform) {\n\t\tlet vertices = [\n\t\t\tnew THREE.Vector3(box.min.x, box.min.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.min.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.min.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.max.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.min.y, box.max.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.max.y, box.max.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.max.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.min.y, box.max.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.max.y, box.max.z).applyMatrix4(transform)\n\t\t];\n\n\t\tlet boundingBox = new THREE.Box3();\n\t\tboundingBox.setFromPoints(vertices);\n\n\t\treturn boundingBox;\n\t};\n\n\t/**\n\t * add separators to large numbers\n\t *\n\t * @param nStr\n\t * @returns\n\t */\n\tstatic addCommas (nStr) {\n\t\tnStr += '';\n\t\tlet x = nStr.split('.');\n\t\tlet x1 = x[0];\n\t\tlet x2 = x.length > 1 ? '.' + x[1] : '';\n\t\tlet rgx = /(\\d+)(\\d{3})/;\n\t\twhile (rgx.test(x1)) {\n\t\t\tx1 = x1.replace(rgx, '$1' + ',' + '$2');\n\t\t}\n\t\treturn x1 + x2;\n\t};\n\n\tstatic removeCommas (str) {\n\t\treturn str.replace(/,/g, '');\n\t}\n\n\t/**\n\t * create worker from a string\n\t *\n\t * code from http://stackoverflow.com/questions/10343913/how-to-create-a-web-worker-from-a-string\n\t */\n\tstatic createWorker (code) {\n\t\tlet blob = new Blob([code], {type: 'application/javascript'});\n\t\tlet worker = new Worker(URL.createObjectURL(blob));\n\n\t\treturn worker;\n\t};\n\n\tstatic moveTo(scene, endPosition, endTarget){\n\n\t\tlet view = scene.view;\n\t\tlet camera = scene.getActiveCamera();\n\t\tlet animationDuration = 500;\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\t{ // animate camera position\n\t\t\tlet tween = new TWEEN.Tween(view.position).to(endPosition, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\ttween.start();\n\t\t}\n\n\t\t{ // animate camera target\n\t\t\tlet camTargetDistance = camera.position.distanceTo(endTarget);\n\t\t\tlet target = new THREE.Vector3().addVectors(\n\t\t\t\tcamera.position,\n\t\t\t\tcamera.getWorldDirection(new THREE.Vector3()).clone().multiplyScalar(camTargetDistance)\n\t\t\t);\n\t\t\tlet tween = new TWEEN.Tween(target).to(endTarget, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tview.lookAt(target);\n\t\t\t});\n\t\t\ttween.onComplete(() => {\n\t\t\t\tview.lookAt(target);\n\t\t\t});\n\t\t\ttween.start();\n\t\t}\n\n\t}\n\n\tstatic loadSkybox (path) {\n\t\tlet camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 100000);\n\t\tcamera.up.set(0, 0, 1);\n\t\tlet scene = new THREE.Scene();\n\n\t\tlet format = '.jpg';\n\t\tlet urls = [\n\t\t\tpath + 'px' + format, path + 'nx' + format,\n\t\t\tpath + 'py' + format, path + 'ny' + format,\n\t\t\tpath + 'pz' + format, path + 'nz' + format\n\t\t];\n\n\t\tlet materialArray = [];\n\t\t{\n\t\t\tfor (let i = 0; i < 6; i++) {\n\t\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\t\tmap: null,\n\t\t\t\t\tside: THREE.BackSide,\n\t\t\t\t\tdepthTest: false,\n\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\tcolor: 0x424556\n\t\t\t\t});\n\n\t\t\t\tmaterialArray.push(material);\n\n\t\t\t\tlet loader = new THREE.TextureLoader();\n\t\t\t\tloader.load(urls[i],\n\t\t\t\t\tfunction loaded (texture) {\n\t\t\t\t\t\tmaterial.map = texture;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t\t\tmaterial.color.setHex(0xffffff);\n\t\t\t\t\t}, function progress (xhr) {\n\t\t\t\t\t\t// console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );\n\t\t\t\t\t}, function error (xhr) {\n\t\t\t\t\t\tconsole.log('An error happened', xhr);\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tlet skyGeometry = new THREE.CubeGeometry(5000, 5000, 5000);\n\t\tlet skybox = new THREE.Mesh(skyGeometry, materialArray);\n\n\t\tscene.add(skybox);\n\n\t\t// z up\n\t\tscene.rotation.x = Math.PI / 2;\n\n\t\treturn {'camera': camera, 'scene': scene};\n\t};\n\n\tstatic createGrid (width, length, spacing, color) {\n\t\tlet material = new THREE.LineBasicMaterial({\n\t\t\tcolor: color || 0x888888\n\t\t});\n\n\t\tlet geometry = new THREE.Geometry();\n\t\tfor (let i = 0; i <= length; i++) {\n\t\t\tgeometry.vertices.push(new THREE.Vector3(-(spacing * width) / 2, i * spacing - (spacing * length) / 2, 0));\n\t\t\tgeometry.vertices.push(new THREE.Vector3(+(spacing * width) / 2, i * spacing - (spacing * length) / 2, 0));\n\t\t}\n\n\t\tfor (let i = 0; i <= width; i++) {\n\t\t\tgeometry.vertices.push(new THREE.Vector3(i * spacing - (spacing * width) / 2, -(spacing * length) / 2, 0));\n\t\t\tgeometry.vertices.push(new THREE.Vector3(i * spacing - (spacing * width) / 2, +(spacing * length) / 2, 0));\n\t\t}\n\n\t\tlet line = new THREE.LineSegments(geometry, material, THREE.LinePieces);\n\t\tline.receiveShadow = true;\n\t\treturn line;\n\t}\n\n\tstatic createBackgroundTexture (width, height) {\n\t\tfunction gauss (x, y) {\n\t\t\treturn (1 / (2 * Math.PI)) * Math.exp(-(x * x + y * y) / 2);\n\t\t};\n\n\t\t// map.magFilter = THREE.NearestFilter;\n\t\tlet size = width * height;\n\t\tlet data = new Uint8Array(3 * size);\n\n\t\tlet chroma = [1, 1.5, 1.7];\n\t\tlet max = gauss(0, 0);\n\n\t\tfor (let x = 0; x < width; x++) {\n\t\t\tfor (let y = 0; y < height; y++) {\n\t\t\t\tlet u = 2 * (x / width) - 1;\n\t\t\t\tlet v = 2 * (y / height) - 1;\n\n\t\t\t\tlet i = x + width * y;\n\t\t\t\tlet d = gauss(2 * u, 2 * v) / max;\n\t\t\t\tlet r = (Math.random() + Math.random() + Math.random()) / 3;\n\t\t\t\tr = (d * 0.5 + 0.5) * r * 0.03;\n\t\t\t\tr = r * 0.4;\n\n\t\t\t\t// d = Math.pow(d, 0.6);\n\n\t\t\t\tdata[3 * i + 0] = 255 * (d / 15 + 0.05 + r) * chroma[0];\n\t\t\t\tdata[3 * i + 1] = 255 * (d / 15 + 0.05 + r) * chroma[1];\n\t\t\t\tdata[3 * i + 2] = 255 * (d / 15 + 0.05 + r) * chroma[2];\n\t\t\t}\n\t\t}\n\n\t\tlet texture = new THREE.DataTexture(data, width, height, THREE.RGBFormat);\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\t}\n\n\tstatic getMousePointCloudIntersection (mouse, camera, viewer, pointclouds, params = {}) {\n\t\t\n\t\tlet renderer = viewer.renderer;\n\t\t\n\t\tlet nmouse = {\n\t\t\tx: (mouse.x / renderer.domElement.clientWidth) * 2 - 1,\n\t\t\ty: -(mouse.y / renderer.domElement.clientHeight) * 2 + 1\n\t\t};\n\n\t\tlet pickParams = {};\n\n\t\tif(params.pickClipped){\n\t\t\tpickParams.pickClipped = params.pickClipped;\n\t\t}\n\n\t\tpickParams.x = mouse.x;\n\t\tpickParams.y = renderer.domElement.clientHeight - mouse.y;\n\n\t\tlet raycaster = new THREE.Raycaster();\n\t\traycaster.setFromCamera(nmouse, camera);\n\t\tlet ray = raycaster.ray;\n\n\t\tlet selectedPointcloud = null;\n\t\tlet closestDistance = Infinity;\n\t\tlet closestIntersection = null;\n\t\tlet closestPoint = null;\n\t\t\n\t\tfor(let pointcloud of pointclouds){\n\t\t\tlet point = pointcloud.pick(viewer, camera, ray, pickParams);\n\t\t\t\n\t\t\tif(!point){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet distance = camera.position.distanceTo(point.position);\n\n\t\t\tif (distance < closestDistance) {\n\t\t\t\tclosestDistance = distance;\n\t\t\t\tselectedPointcloud = pointcloud;\n\t\t\t\tclosestIntersection = point.position;\n\t\t\t\tclosestPoint = point;\n\t\t\t}\n\t\t}\n\n\t\tif (selectedPointcloud) {\n\t\t\treturn {\n\t\t\t\tlocation: closestIntersection,\n\t\t\t\tdistance: closestDistance,\n\t\t\t\tpointcloud: selectedPointcloud,\n\t\t\t\tpoint: closestPoint\n\t\t\t};\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tstatic pixelsArrayToImage (pixels, width, height) {\n\t\tlet canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tlet context = canvas.getContext('2d');\n\n\t\tpixels = new pixels.constructor(pixels);\n\n\t\tfor (let i = 0; i < pixels.length; i++) {\n\t\t\tpixels[i * 4 + 3] = 255;\n\t\t}\n\n\t\tlet imageData = context.createImageData(width, height);\n\t\timageData.data.set(pixels);\n\t\tcontext.putImageData(imageData, 0, 0);\n\n\t\tlet img = new Image();\n\t\timg.src = canvas.toDataURL();\n\t\t// img.style.transform = \"scaleY(-1)\";\n\n\t\treturn img;\n\t}\n\n\tstatic pixelsArrayToDataUrl(pixels, width, height) {\n\t\tlet canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tlet context = canvas.getContext('2d');\n\n\t\tpixels = new pixels.constructor(pixels);\n\n\t\tfor (let i = 0; i < pixels.length; i++) {\n\t\t\tpixels[i * 4 + 3] = 255;\n\t\t}\n\n\t\tlet imageData = context.createImageData(width, height);\n\t\timageData.data.set(pixels);\n\t\tcontext.putImageData(imageData, 0, 0);\n\n\t\tlet dataURL = canvas.toDataURL();\n\n\t\treturn dataURL;\n\t}\n\n\tstatic pixelsArrayToCanvas(pixels, width, height){\n\t\tlet canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tlet context = canvas.getContext('2d');\n\n\t\tpixels = new pixels.constructor(pixels);\n\n\t\t//for (let i = 0; i < pixels.length; i++) {\n\t\t//\tpixels[i * 4 + 3] = 255;\n\t\t//}\n\n\t\t// flip vertically\n\t\tlet bytesPerLine = width * 4;\n\t\tfor(let i = 0; i < parseInt(height / 2); i++){\n\t\t\tlet j = height - i - 1;\n\n\t\t\tlet lineI = pixels.slice(i * bytesPerLine, i * bytesPerLine + bytesPerLine);\n\t\t\tlet lineJ = pixels.slice(j * bytesPerLine, j * bytesPerLine + bytesPerLine);\n\t\t\tpixels.set(lineJ, i * bytesPerLine);\n\t\t\tpixels.set(lineI, j * bytesPerLine);\n\t\t}\n\n\t\tlet imageData = context.createImageData(width, height);\n\t\timageData.data.set(pixels);\n\t\tcontext.putImageData(imageData, 0, 0);\n\n\t\treturn canvas;\n\t}\n\n\tstatic removeListeners(dispatcher, type){\n\t\tif (dispatcher._listeners === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (dispatcher._listeners[ type ]) {\n\t\t\tdelete dispatcher._listeners[ type ];\n\t\t}\n\t}\n\n\tstatic mouseToRay(mouse, camera, width, height){\n\n\t\tlet normalizedMouse = {\n\t\t\tx: (mouse.x / width) * 2 - 1,\n\t\t\ty: -(mouse.y / height) * 2 + 1\n\t\t};\n\n\t\tlet vector = new THREE.Vector3(normalizedMouse.x, normalizedMouse.y, 0.5);\n\t\tlet origin = camera.position.clone();\n\t\tvector.unproject(camera);\n\t\tlet direction = new THREE.Vector3().subVectors(vector, origin).normalize();\n\n\t\tlet ray = new THREE.Ray(origin, direction);\n\n\t\treturn ray;\n\t}\n\n\tstatic projectedRadius(radius, camera, distance, screenWidth, screenHeight){\n\t\tif(camera instanceof THREE.OrthographicCamera){\n\t\t\treturn Utils.projectedRadiusOrtho(radius, camera.projectionMatrix, screenWidth, screenHeight);\n\t\t}else if(camera instanceof THREE.PerspectiveCamera){\n\t\t\treturn Utils.projectedRadiusPerspective(radius, camera.fov * Math.PI / 180, distance, screenHeight);\n\t\t}else{\n\t\t\tthrow new Error(\"invalid parameters\");\n\t\t}\n\t}\n\n\tstatic projectedRadiusPerspective(radius, fov, distance, screenHeight) {\n\t\tlet projFactor = (1 / Math.tan(fov / 2)) / distance;\n\t\tprojFactor = projFactor * screenHeight / 2;\n\n\t\treturn radius * projFactor;\n\t}\n\n\tstatic projectedRadiusOrtho(radius, proj, screenWidth, screenHeight) {\n\t\tlet p1 = new THREE.Vector4(0);\n\t\tlet p2 = new THREE.Vector4(radius);\n\n\t\tp1.applyMatrix4(proj);\n\t\tp2.applyMatrix4(proj);\n\t\tp1 = new THREE.Vector3(p1.x, p1.y, p1.z);\n\t\tp2 = new THREE.Vector3(p2.x, p2.y, p2.z);\n\t\tp1.x = (p1.x + 1.0) * 0.5 * screenWidth;\n\t\tp1.y = (p1.y + 1.0) * 0.5 * screenHeight;\n\t\tp2.x = (p2.x + 1.0) * 0.5 * screenWidth;\n\t\tp2.y = (p2.y + 1.0) * 0.5 * screenHeight;\n\t\treturn p1.distanceTo(p2);\n\t}\n\t\t\n\t\t\n\tstatic topView(camera, node){\n\t\tcamera.position.set(0, 1, 0);\n\t\tcamera.rotation.set(-Math.PI / 2, 0, 0);\n\t\tcamera.zoomTo(node, 1);\n\t}\n\n\tstatic frontView (camera, node) {\n\t\tcamera.position.set(0, 0, 1);\n\t\tcamera.rotation.set(0, 0, 0);\n\t\tcamera.zoomTo(node, 1);\n\t}\n\n\tstatic leftView (camera, node) {\n\t\tcamera.position.set(-1, 0, 0);\n\t\tcamera.rotation.set(0, -Math.PI / 2, 0);\n\t\tcamera.zoomTo(node, 1);\n\t}\n\n\tstatic rightView (camera, node) {\n\t\tcamera.position.set(1, 0, 0);\n\t\tcamera.rotation.set(0, Math.PI / 2, 0);\n\t\tcamera.zoomTo(node, 1);\n\t}\n\n\t\n\tstatic findClosestGpsTime(target, viewer){\n\t\tconst start = performance.now();\n\n\t\tconst nodes = [];\n\t\tfor(const pc of viewer.scene.pointclouds){\n\t\t\tnodes.push(pc.root);\n\n\t\t\tfor(const child of pc.root.children){\n\t\t\t\tif(child){\n\t\t\t\t\tnodes.push(child);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet closestNode = null;\n\t\tlet closestIndex = Infinity;\n\t\tlet closestDistance = Infinity;\n\t\tlet closestValue = 0;\n\n\t\tfor(const node of nodes){\n\n\t\t\tconst isOkay = node.geometryNode != null \n\t\t\t\t&& node.geometryNode.geometry != null\n\t\t\t\t&& node.sceneNode != null;\n\n\t\t\tif(!isOkay){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet geometry = node.geometryNode.geometry;\n\t\t\tlet gpsTime = geometry.attributes[\"gps-time\"];\n\t\t\tlet range = gpsTime.potree.range;\n\n\t\t\tfor(let i = 0; i < gpsTime.array.length; i++){\n\t\t\t\tlet value = gpsTime.array[i];\n\t\t\t\tvalue = value * (range[1] - range[0]) + range[0];\n\t\t\t\tconst distance = Math.abs(target - value);\n\n\t\t\t\tif(distance < closestDistance){\n\t\t\t\t\tclosestIndex = i;\n\t\t\t\t\tclosestDistance = distance;\n\t\t\t\t\tclosestValue = value;\n\t\t\t\t\tclosestNode = node;\n\t\t\t\t\t//console.log(\"found a closer one: \" + value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst geometry = closestNode.geometryNode.geometry;\n\t\tconst position = new THREE.Vector3(\n\t\t\tgeometry.attributes.position.array[3 * closestIndex + 0],\n\t\t\tgeometry.attributes.position.array[3 * closestIndex + 1],\n\t\t\tgeometry.attributes.position.array[3 * closestIndex + 2],\n\t\t);\n\n\t\tposition.applyMatrix4(closestNode.sceneNode.matrixWorld);\n\n\t\tconst end = performance.now();\n\t\tconst duration = (end - start);\n\t\tconsole.log(`duration: ${duration.toFixed(3)}ms`);\n\n\t\treturn {\n\t\t\tnode: closestNode,\n\t\t\tindex: closestIndex,\n\t\t\tposition: position,\n\t\t};\n\t}\n\n\t/**\n\t *\n\t * 0: no intersection\n\t * 1: intersection\n\t * 2: fully inside\n\t */\n\tstatic frustumSphereIntersection (frustum, sphere) {\n\t\tlet planes = frustum.planes;\n\t\tlet center = sphere.center;\n\t\tlet negRadius = -sphere.radius;\n\n\t\tlet minDistance = Number.MAX_VALUE;\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tlet distance = planes[ i ].distanceToPoint(center);\n\n\t\t\tif (distance < negRadius) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tminDistance = Math.min(minDistance, distance);\n\t\t}\n\n\t\treturn (minDistance >= sphere.radius) ? 2 : 1;\n\t}\n\n\t// code taken from three.js\n\t// ImageUtils - generateDataTexture()\n\tstatic generateDataTexture (width, height, color) {\n\t\tlet size = width * height;\n\t\tlet data = new Uint8Array(4 * width * height);\n\n\t\tlet r = Math.floor(color.r * 255);\n\t\tlet g = Math.floor(color.g * 255);\n\t\tlet b = Math.floor(color.b * 255);\n\n\t\tfor (let i = 0; i < size; i++) {\n\t\t\tdata[ i * 3 ] = r;\n\t\t\tdata[ i * 3 + 1 ] = g;\n\t\t\tdata[ i * 3 + 2 ] = b;\n\t\t}\n\n\t\tlet texture = new THREE.DataTexture(data, width, height, THREE.RGBAFormat);\n\t\ttexture.needsUpdate = true;\n\t\ttexture.magFilter = THREE.NearestFilter;\n\n\t\treturn texture;\n\t}\n\n\t// from http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript\n\tstatic getParameterByName (name) {\n\t\tname = name.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n\t\tlet regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)');\n\t\tlet results = regex.exec(document.location.search);\n\t\treturn results === null ? null : decodeURIComponent(results[1].replace(/\\+/g, ' '));\n\t}\n\n\tstatic setParameter (name, value) {\n\t\t// value = encodeURIComponent(value);\n\n\t\tname = name.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n\t\tlet regex = new RegExp('([\\\\?&])(' + name + '=([^&#]*))');\n\t\tlet results = regex.exec(document.location.search);\n\n\t\tlet url = window.location.href;\n\t\tif (results === null) {\n\t\t\tif (window.location.search.length === 0) {\n\t\t\t\turl = url + '?';\n\t\t\t} else {\n\t\t\t\turl = url + '&';\n\t\t\t}\n\n\t\t\turl = url + name + '=' + value;\n\t\t} else {\n\t\t\tlet newValue = name + '=' + value;\n\t\t\turl = url.replace(results[2], newValue);\n\t\t}\n\t\twindow.history.replaceState({}, '', url);\n\t}\n\n\tstatic createChildAABB(aabb, index){\n\t\tlet min = aabb.min.clone();\n\t\tlet max = aabb.max.clone();\n\t\tlet size = new THREE.Vector3().subVectors(max, min);\n\n\t\tif ((index & 0b0001) > 0) {\n\t\t\tmin.z += size.z / 2;\n\t\t} else {\n\t\t\tmax.z -= size.z / 2;\n\t\t}\n\n\t\tif ((index & 0b0010) > 0) {\n\t\t\tmin.y += size.y / 2;\n\t\t} else {\n\t\t\tmax.y -= size.y / 2;\n\t\t}\n\n\t\tif ((index & 0b0100) > 0) {\n\t\t\tmin.x += size.x / 2;\n\t\t} else {\n\t\t\tmax.x -= size.x / 2;\n\t\t}\n\n\t\treturn new THREE.Box3(min, max);\n\t}\n\n\t// see https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript\n\tstatic clipboardCopy(text){\n\t\tlet textArea = document.createElement(\"textarea\");\n\n\t\ttextArea.style.position = 'fixed';\n\t\ttextArea.style.top = 0;\n\t\ttextArea.style.left = 0;\n\n\t\ttextArea.style.width = '2em';\n\t\ttextArea.style.height = '2em';\n\n\t\ttextArea.style.padding = 0;\n\n\t\ttextArea.style.border = 'none';\n\t\ttextArea.style.outline = 'none';\n\t\ttextArea.style.boxShadow = 'none';\n\n\t\ttextArea.style.background = 'transparent';\n\n\t\ttextArea.value = text;\n\n\t\tdocument.body.appendChild(textArea);\n\n\t\ttextArea.select();\n\n\t\t try {\n\t\t\tlet success = document.execCommand('copy');\n\t\t\tif(success){\n\t\t\t\tconsole.log(\"copied text to clipboard\");\n\t\t\t}else{\n\t\t\t\tconsole.log(\"copy to clipboard failed\");\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.log(\"error while trying to copy to clipboard\");\n\t\t}\n\n\t\tdocument.body.removeChild(textArea);\n\n\t}\n\n\tstatic getMeasurementIcon(measurement){\n\t\tif (measurement instanceof Measure) {\n\t\t\tif (measurement.showDistances && !measurement.showArea && !measurement.showAngles) {\n\t\t\t\treturn `${Potree.resourcePath}/icons/distance.svg`;\n\t\t\t} else if (measurement.showDistances && measurement.showArea && !measurement.showAngles) {\n\t\t\t\treturn `${Potree.resourcePath}/icons/area.svg`;\n\t\t\t} else if (measurement.maxMarkers === 1) {\n\t\t\t\treturn `${Potree.resourcePath}/icons/point.svg`;\n\t\t\t} else if (!measurement.showDistances && !measurement.showArea && measurement.showAngles) {\n\t\t\t\treturn `${Potree.resourcePath}/icons/angle.png`;\n\t\t\t} else if (measurement.showHeight) {\n\t\t\t\treturn `${Potree.resourcePath}/icons/height.svg`;\n\t\t\t} else {\n\t\t\t\treturn `${Potree.resourcePath}/icons/distance.svg`;\n\t\t\t}\n\t\t} else if (measurement instanceof Profile) {\n\t\t\treturn `${Potree.resourcePath}/icons/profile.svg`;\n\t\t} else if (measurement instanceof Volume) {\n\t\t\treturn `${Potree.resourcePath}/icons/volume.svg`;\n\t\t} else if (measurement instanceof PolygonClipVolume) {\n\t\t\treturn `${Potree.resourcePath}/icons/clip-polygon.svg`;\n\t\t}\n\t}\n\n\tstatic lineToLineIntersection(P0, P1, P2, P3){\n\n\t\tconst P = [P0, P1, P2, P3];\n\n\t\tconst d = (m, n, o, p) => {\n\t\t\tlet result = \n\t\t\t\t (P[m].x - P[n].x) * (P[o].x - P[p].x)\n\t\t\t\t+ (P[m].y - P[n].y) * (P[o].y - P[p].y)\n\t\t\t\t+ (P[m].z - P[n].z) * (P[o].z - P[p].z);\n\n\t\t\treturn result;\n\t\t};\n\n\n\t\tconst mua = (d(0, 2, 3, 2) * d(3, 2, 1, 0) - d(0, 2, 1, 0) * d(3, 2, 3, 2))\n\t\t /**-----------------------------------------------------------------**/ /\n\t\t (d(1, 0, 1, 0) * d(3, 2, 3, 2) - d(3, 2, 1, 0) * d(3, 2, 1, 0));\n\n\n\t\tconst mub = (d(0, 2, 3, 2) + mua * d(3, 2, 1, 0))\n\t\t /**--------------------------------------**/ /\n\t\t d(3, 2, 3, 2);\n\n\n\t\tconst P01 = P1.clone().sub(P0);\n\t\tconst P23 = P3.clone().sub(P2);\n\t\t\n\t\tconst Pa = P0.clone().add(P01.multiplyScalar(mua));\n\t\tconst Pb = P2.clone().add(P23.multiplyScalar(mub));\n\n\t\tconst center = Pa.clone().add(Pb).multiplyScalar(0.5);\n\n\t\treturn center;\n\t}\n\n\tstatic computeCircleCenter(A, B, C){\n\t\tconst AB = B.clone().sub(A);\n\t\tconst AC = C.clone().sub(A);\n\n\t\tconst N = AC.clone().cross(AB).normalize();\n\n\t\tconst ab_dir = AB.clone().cross(N).normalize();\n\t\tconst ac_dir = AC.clone().cross(N).normalize();\n\n\t\tconst ab_origin = A.clone().add(B).multiplyScalar(0.5);\n\t\tconst ac_origin = A.clone().add(C).multiplyScalar(0.5);\n\n\t\tconst P0 = ab_origin;\n\t\tconst P1 = ab_origin.clone().add(ab_dir);\n\n\t\tconst P2 = ac_origin;\n\t\tconst P3 = ac_origin.clone().add(ac_dir);\n\n\t\tconst center = Utils.lineToLineIntersection(P0, P1, P2, P3);\n\n\t\treturn center;\n\n\t\t// Potree.Utils.debugLine(viewer.scene.scene, P0, P1, 0x00ff00);\n\t\t// Potree.Utils.debugLine(viewer.scene.scene, P2, P3, 0x0000ff);\n\n\t\t// Potree.Utils.debugSphere(viewer.scene.scene, center, 0.03, 0xff00ff);\n\n\t\t// const radius = center.distanceTo(A);\n\t\t// Potree.Utils.debugCircle(viewer.scene.scene, center, radius, new THREE.Vector3(0, 0, 1), 0xff00ff);\n\t}\n\n\tstatic getNorthVec(p1, distance, projection){\n\t\tif(projection){\n\t\t\t// if there is a projection, transform coordinates to WGS84\n\t\t\t// and compute angle to north there\n\n\t\t\tproj4.defs(\"pointcloud\", projection);\n\t\t\tconst transform = proj4(\"pointcloud\", \"WGS84\");\n\n\t\t\tconst llP1 = transform.forward(p1.toArray());\n\t\t\tlet llP2 = transform.forward([p1.x, p1.y + distance]);\n\t\t\tconst polarRadius = Math.sqrt((llP2[0] - llP1[0]) ** 2 + (llP2[1] - llP1[1]) ** 2);\n\t\t\tllP2 = [llP1[0], llP1[1] + polarRadius];\n\n\t\t\tconst northVec = transform.inverse(llP2);\n\t\t\t\n\t\t\treturn new THREE.Vector3(...northVec, p1.z).sub(p1);\n\t\t}else{\n\t\t\t// if there is no projection, assume [0, 1, 0] as north direction\n\n\t\t\tconst vec = new THREE.Vector3(0, 1, 0).multiplyScalar(distance);\n\t\t\t\n\t\t\treturn vec;\n\t\t}\n\t}\n\n\tstatic computeAzimuth(p1, p2, projection){\n\n\t\tlet azimuth = 0;\n\n\t\tif(projection){\n\t\t\t// if there is a projection, transform coordinates to WGS84\n\t\t\t// and compute angle to north there\n\n\t\t\tlet transform;\n\n\t\t\tif (projection.includes('EPSG')) {\n\t\t\t\ttransform = proj4(projection, \"WGS84\");\n\t\t\t} else {\n\t\t\t\tproj4.defs(\"pointcloud\", projection);\n\t\t\t\ttransform = proj4(\"pointcloud\", \"WGS84\");\n\t\t\t}\n\n\t\t\tconst llP1 = transform.forward(p1.toArray());\n\t\t\tconst llP2 = transform.forward(p2.toArray());\n\t\t\tconst dir = [\n\t\t\t\tllP2[0] - llP1[0],\n\t\t\t\tllP2[1] - llP1[1],\n\t\t\t];\n\t\t\tazimuth = Math.atan2(dir[1], dir[0]) - Math.PI / 2;\n\t\t}else{\n\t\t\t// if there is no projection, assume [0, 1, 0] as north direction\n\n\t\t\tconst dir = [p2.x - p1.x, p2.y - p1.y];\n\t\t\tazimuth = Math.atan2(dir[1], dir[0]) - Math.PI / 2;\n\t\t}\n\n\t\t// make clockwise\n\t\tazimuth = -azimuth;\n\n\t\treturn azimuth;\n\t}\n\n\tstatic async loadScript(url){\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tconst element = document.getElementById(url);\n\n\t\t\tif(element){\n\t\t\t\tresolve();\n\t\t\t}else{\n\t\t\t\tconst script = document.createElement(\"script\");\n\n\t\t\t\tscript.id = url;\n\n\t\t\t\tscript.onload = () => {\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\t\t\t\tscript.src = url;\n\n\t\t\t\tdocument.body.appendChild(script);\n\t\t\t}\n\t\t});\n\t}\n\n\tstatic createSvgGradient(scheme){\n\n\t\t// this is what we are creating:\n\t\t//\n\t\t//\n\t\t//\t\n\t\t//\t\t\n\t\t//\t\t\n\t\t//\t\t...\n\t\t//\t\t\n\t\t//\t\t\n\t\t//\t\n\t\t//\t\n\t\t//\t\n\t\t//\n\n\n\t\tconst gradientId = `${Math.random()}_${Date.now()}`;\n\t\t\n\t\tconst svgn = \"http://www.w3.org/2000/svg\";\n\t\tconst svg = document.createElementNS(svgn, \"svg\");\n\t\tsvg.setAttributeNS(null, \"width\", \"2em\");\n\t\tsvg.setAttributeNS(null, \"height\", \"3em\");\n\t\t\n\t\t{ // \n\t\t\tconst defs = document.createElementNS(svgn, \"defs\");\n\t\t\t\n\t\t\tconst linearGradient = document.createElementNS(svgn, \"linearGradient\");\n\t\t\tlinearGradient.setAttributeNS(null, \"id\", gradientId);\n\t\t\tlinearGradient.setAttributeNS(null, \"gradientTransform\", \"rotate(90)\");\n\n\t\t\tfor(let i = scheme.length - 1; i >= 0; i--){\n\t\t\t\tconst stopVal = scheme[i];\n\t\t\t\tconst percent = parseInt(100 - stopVal[0] * 100);\n\t\t\t\tconst [r, g, b] = stopVal[1].toArray().map(v => parseInt(v * 255));\n\n\t\t\t\tconst stop = document.createElementNS(svgn, \"stop\");\n\t\t\t\tstop.setAttributeNS(null, \"offset\", `${percent}%`);\n\t\t\t\tstop.setAttributeNS(null, \"stop-color\", `rgb(${r}, ${g}, ${b})`);\n\n\t\t\t\tlinearGradient.appendChild(stop);\n\t\t\t}\n\n\t\t\tdefs.appendChild(linearGradient);\n\t\t\tsvg.appendChild(defs);\n\t\t}\n\n\t\tconst rect = document.createElementNS(svgn, \"rect\");\n\t\trect.setAttributeNS(null, \"width\", `100%`);\n\t\trect.setAttributeNS(null, \"height\", `100%`);\n\t\trect.setAttributeNS(null, \"fill\", `url(\"#${gradientId}\")`);\n\t\trect.setAttributeNS(null, \"stroke\", `black`);\n\t\trect.setAttributeNS(null, \"stroke-width\", `0.1em`);\n\n\t\tsvg.appendChild(rect);\n\t\t\n\t\treturn svg;\n\t}\n\n\tstatic async waitAny(promises){\n\t\t\n\t\treturn new Promise( (resolve) => {\n\n\t\t\tpromises.map( promise => {\n\t\t\t\tpromise.then( () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t});\n\n\t}\n\n}\n\nUtils.screenPass = new function () {\n\tthis.screenScene = new THREE.Scene();\n\tthis.screenQuad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2, 0));\n\tthis.screenQuad.material.depthTest = true;\n\tthis.screenQuad.material.depthWrite = true;\n\tthis.screenQuad.material.transparent = true;\n\tthis.screenScene.add(this.screenQuad);\n\tthis.camera = new THREE.Camera();\n\n\tthis.render = function (renderer, material, target) {\n\t\tthis.screenQuad.material = material;\n\n\t\tif (typeof target === 'undefined') {\n\t\t\trenderer.render(this.screenScene, this.camera);\n\t\t} else {\n\t\t\trenderer.render(this.screenScene, this.camera, target);\n\t\t}\n\t};\n}();\n","\n\nimport {Action} from \"./Actions.js\";\nimport {Utils} from \"./utils.js\";\nimport {EventDispatcher} from \"./EventDispatcher.js\";\n\nexport class Annotation extends EventDispatcher {\n\tconstructor (args = {}) {\n\t\tsuper();\n\n\t\tthis.scene = null;\n\t\tthis._title = args.title || 'No Title';\n\t\tthis._description = args.description || '';\n\t\tthis.offset = new THREE.Vector3();\n\t\tthis.uuid = THREE.Math.generateUUID();\n\n\t\tif (!args.position) {\n\t\t\tthis.position = null;\n\t\t} else if (args.position instanceof THREE.Vector3) {\n\t\t\tthis.position = args.position;\n\t\t} else {\n\t\t\tthis.position = new THREE.Vector3(...args.position);\n\t\t}\n\n\t\tthis.cameraPosition = (args.cameraPosition instanceof Array)\n\t\t\t? new THREE.Vector3().fromArray(args.cameraPosition) : args.cameraPosition;\n\t\tthis.cameraTarget = (args.cameraTarget instanceof Array)\n\t\t\t? new THREE.Vector3().fromArray(args.cameraTarget) : args.cameraTarget;\n\t\tthis.radius = args.radius;\n\t\tthis.view = args.view || null;\n\t\tthis.keepOpen = false;\n\t\tthis.descriptionVisible = false;\n\t\tthis.showDescription = true;\n\t\tthis.actions = args.actions || [];\n\t\tthis.isHighlighted = false;\n\t\tthis._visible = true;\n\t\tthis.__visible = true;\n\t\tthis._display = true;\n\t\tthis._expand = false;\n\t\tthis.collapseThreshold = [args.collapseThreshold, 100].find(e => e !== undefined);\n\n\t\tthis.children = [];\n\t\tthis.parent = null;\n\t\tthis.boundingBox = new THREE.Box3();\n\n\t\tlet iconClose = exports.resourcePath + '/icons/close.svg';\n\n\t\tthis.domElement = $(`\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t${this._description}\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elTitlebar = this.domElement.find('.annotation-titlebar');\n\t\tthis.elTitle = this.elTitlebar.find('.annotation-label');\n\t\tthis.elTitle.append(this._title);\n\t\tthis.elDescription = this.domElement.find('.annotation-description');\n\t\tthis.elDescriptionClose = this.elDescription.find('.annotation-description-close');\n\t\t// this.elDescriptionContent = this.elDescription.find(\".annotation-description-content\");\n\n\t\tthis.clickTitle = () => {\n\t\t\tif(this.hasView()){\n\t\t\t\tthis.moveHere(this.scene.getActiveCamera());\n\t\t\t}\n\t\t\tthis.dispatchEvent({type: 'click', target: this});\n\t\t};\n\n\t\tthis.elTitle.click(this.clickTitle);\n\n\t\tthis.actions = this.actions.map(a => {\n\t\t\tif (a instanceof Action) {\n\t\t\t\treturn a;\n\t\t\t} else {\n\t\t\t\treturn new Action(a);\n\t\t\t}\n\t\t});\n\n\t\tfor (let action of this.actions) {\n\t\t\taction.pairWith(this);\n\t\t}\n\n\t\tlet actions = this.actions.filter(\n\t\t\ta => a.showIn === undefined || a.showIn.includes('scene'));\n\n\t\tfor (let action of actions) {\n\t\t\tlet elButton = $(``);\n\t\t\tthis.elTitlebar.append(elButton);\n\t\t\telButton.click(() => action.onclick({annotation: this}));\n\t\t}\n\n\t\tthis.elDescriptionClose.hover(\n\t\t\te => this.elDescriptionClose.css('opacity', '1'),\n\t\t\te => this.elDescriptionClose.css('opacity', '0.5')\n\t\t);\n\t\tthis.elDescriptionClose.click(e => this.setHighlighted(false));\n\t\t// this.elDescriptionContent.html(this._description);\n\n\t\tthis.domElement.mouseenter(e => this.setHighlighted(true));\n\t\tthis.domElement.mouseleave(e => this.setHighlighted(false));\n\n\t\tthis.domElement.on('touchstart', e => {\n\t\t\tthis.setHighlighted(!this.isHighlighted);\n\t\t});\n\n\t\tthis.display = false;\n\t\t//this.display = true;\n\n\t}\n\n\tinstallHandles(viewer){\n\t\tif(this.handles !== undefined){\n\t\t\treturn;\n\t\t}\n\n\t\tlet domElement = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t`);\n\t\t\n\t\tlet svg = domElement.find(\"svg\")[0];\n\t\tlet elLine = domElement.find(\"line\")[0];\n\t\tlet elStart = domElement.find(\"circle\")[0];\n\t\tlet elEnd = domElement.find(\"circle\")[1];\n\n\t\tlet setCoordinates = (start, end) => {\n\t\t\telStart.setAttribute(\"cx\", `${start.x}`);\n\t\t\telStart.setAttribute(\"cy\", `${start.y}`);\n\n\t\t\telEnd.setAttribute(\"cx\", `${end.x}`);\n\t\t\telEnd.setAttribute(\"cy\", `${end.y}`);\n\n\t\t\telLine.setAttribute(\"x1\", start.x);\n\t\t\telLine.setAttribute(\"y1\", start.y);\n\t\t\telLine.setAttribute(\"x2\", end.x);\n\t\t\telLine.setAttribute(\"y2\", end.y);\n\n\t\t\tlet box = svg.getBBox();\n\t\t\tsvg.setAttribute(\"width\", `${box.width}`);\n\t\t\tsvg.setAttribute(\"height\", `${box.height}`);\n\t\t\tsvg.setAttribute(\"viewBox\", `${box.x} ${box.y} ${box.width} ${box.height}`);\n\n\t\t\tlet ya = start.y - end.y;\n\t\t\tlet xa = start.x - end.x;\n\n\t\t\tif(ya > 0){\n\t\t\t\tstart.y = start.y - ya;\n\t\t\t}\n\t\t\tif(xa > 0){\n\t\t\t\tstart.x = start.x - xa;\n\t\t\t}\n\n\t\t\tdomElement.css(\"left\", `${start.x}px`);\n\t\t\tdomElement.css(\"top\", `${start.y}px`);\n\n\t\t};\n\n\t\t$(viewer.renderArea).append(domElement);\n\n\n\t\tlet annotationStartPos = this.position.clone();\n\t\tlet annotationStartOffset = this.offset.clone();\n\n\t\t$(this.domElement).draggable({\n\t\t\tstart: (event, ui) => {\n\t\t\t\tannotationStartPos = this.position.clone();\n\t\t\t\tannotationStartOffset = this.offset.clone();\n\t\t\t\t$(this.domElement).find(\".annotation-titlebar\").css(\"pointer-events\", \"none\");\n\n\t\t\t\tconsole.log($(this.domElement).find(\".annotation-titlebar\"));\n\t\t\t},\n\t\t\tstop: () => {\n\t\t\t\t$(this.domElement).find(\".annotation-titlebar\").css(\"pointer-events\", \"\");\n\t\t\t},\n\t\t\tdrag: (event, ui ) => {\n\t\t\t\tlet renderAreaWidth = viewer.renderer.getSize(new THREE.Vector2()).width;\n\t\t\t\t//let renderAreaHeight = viewer.renderer.getSize().height;\n\n\t\t\t\tlet diff = {\n\t\t\t\t\tx: ui.originalPosition.left - ui.position.left, \n\t\t\t\t\ty: ui.originalPosition.top - ui.position.top\n\t\t\t\t};\n\n\t\t\t\tlet nDiff = {\n\t\t\t\t\tx: -(diff.x / renderAreaWidth) * 2,\n\t\t\t\t\ty: (diff.y / renderAreaWidth) * 2\n\t\t\t\t};\n\n\t\t\t\tlet camera = viewer.scene.getActiveCamera();\n\t\t\t\tlet oldScreenPos = new THREE.Vector3()\n\t\t\t\t\t.addVectors(annotationStartPos, annotationStartOffset)\n\t\t\t\t\t.project(camera);\n\n\t\t\t\tlet newScreenPos = oldScreenPos.clone();\n\t\t\t\tnewScreenPos.x += nDiff.x;\n\t\t\t\tnewScreenPos.y += nDiff.y;\n\n\t\t\t\tlet newPos = newScreenPos.clone();\n\t\t\t\tnewPos.unproject(camera);\n\n\t\t\t\tlet newOffset = new THREE.Vector3().subVectors(newPos, this.position);\n\t\t\t\tthis.offset.copy(newOffset);\n\t\t\t}\n\t\t});\n\n\t\tlet updateCallback = () => {\n\t\t\tlet position = this.position;\n\t\t\tlet scene = viewer.scene;\n\n\t\t\tconst renderAreaSize = viewer.renderer.getSize(new THREE.Vector2());\n\t\t\tlet renderAreaWidth = renderAreaSize.width;\n\t\t\tlet renderAreaHeight = renderAreaSize.height;\n\n\t\t\tlet start = this.position.clone();\n\t\t\tlet end = new THREE.Vector3().addVectors(this.position, this.offset);\n\n\t\t\tlet toScreen = (position) => {\n\t\t\t\tlet camera = scene.getActiveCamera();\n\t\t\t\tlet screenPos = new THREE.Vector3();\n\n\t\t\t\tlet worldView = new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\t\t\t\tlet ndc = new THREE.Vector4(position.x, position.y, position.z, 1.0).applyMatrix4(worldView);\n\t\t\t\t// limit w to small positive value, in case position is behind the camera\n\t\t\t\tndc.w = Math.max(ndc.w, 0.1);\n\t\t\t\tndc.divideScalar(ndc.w);\n\n\t\t\t\tscreenPos.copy(ndc);\n\t\t\t\tscreenPos.x = renderAreaWidth * (screenPos.x + 1) / 2;\n\t\t\t\tscreenPos.y = renderAreaHeight * (1 - (screenPos.y + 1) / 2);\n\n\t\t\t\treturn screenPos;\n\t\t\t};\n\t\t\t\n\t\t\tstart = toScreen(start);\n\t\t\tend = toScreen(end);\n\n\t\t\tsetCoordinates(start, end);\n\n\t\t};\n\n\t\tviewer.addEventListener(\"update\", updateCallback);\n\n\t\tthis.handles = {\n\t\t\tdomElement: domElement,\n\t\t\tsetCoordinates: setCoordinates,\n\t\t\tupdateCallback: updateCallback\n\t\t};\n\t}\n\n\tremoveHandles(viewer){\n\t\tif(this.handles === undefined){\n\t\t\treturn;\n\t\t}\n\n\t\t//$(viewer.renderArea).remove(this.handles.domElement);\n\t\tthis.handles.domElement.remove();\n\t\tviewer.removeEventListener(\"update\", this.handles.updateCallback);\n\n\t\tdelete this.handles;\n\t}\n\n\tget visible () {\n\t\treturn this._visible;\n\t}\n\n\tset visible (value) {\n\t\tif (this._visible === value) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._visible = value;\n\n\t\t//this.traverse(node => {\n\t\t//\tnode.display = value;\n\t\t//});\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'visibility_changed',\n\t\t\tannotation: this\n\t\t});\n\t}\n\n\tget display () {\n\t\treturn this._display;\n\t}\n\n\tset display (display) {\n\t\tif (this._display === display) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._display = display;\n\n\t\tif (display) {\n\t\t\t// this.domElement.fadeIn(200);\n\t\t\tthis.domElement.show();\n\t\t} else {\n\t\t\t// this.domElement.fadeOut(200);\n\t\t\tthis.domElement.hide();\n\t\t}\n\t}\n\n\tget expand () {\n\t\treturn this._expand;\n\t}\n\n\tset expand (expand) {\n\t\tif (this._expand === expand) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (expand) {\n\t\t\tthis.display = false;\n\t\t} else {\n\t\t\tthis.display = true;\n\t\t\tthis.traverseDescendants(node => {\n\t\t\t\tnode.display = false;\n\t\t\t});\n\t\t}\n\n\t\tthis._expand = expand;\n\t}\n\n\tget title () {\n\t\treturn this._title;\n\t}\n\n\tset title (title) {\n\t\tif (this._title === title) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._title = title;\n\t\tthis.elTitle.empty();\n\t\tthis.elTitle.append(this._title);\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: \"annotation_changed\",\n\t\t\tannotation: this,\n\t\t});\n\t}\n\n\tget description () {\n\t\treturn this._description;\n\t}\n\n\tset description (description) {\n\t\tif (this._description === description) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._description = description;\n\n\t\tconst elDescriptionContent = this.elDescription.find(\".annotation-description-content\");\n\t\telDescriptionContent.empty();\n\t\telDescriptionContent.append(this._description);\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: \"annotation_changed\",\n\t\t\tannotation: this,\n\t\t});\n\t}\n\n\tadd (annotation) {\n\t\tif (!this.children.includes(annotation)) {\n\t\t\tthis.children.push(annotation);\n\t\t\tannotation.parent = this;\n\n\t\t\tlet descendants = [];\n\t\t\tannotation.traverse(a => { descendants.push(a); });\n\n\t\t\tfor (let descendant of descendants) {\n\t\t\t\tlet c = this;\n\t\t\t\twhile (c !== null) {\n\t\t\t\t\tc.dispatchEvent({\n\t\t\t\t\t\t'type': 'annotation_added',\n\t\t\t\t\t\t'annotation': descendant\n\t\t\t\t\t});\n\t\t\t\t\tc = c.parent;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlevel () {\n\t\tif (this.parent === null) {\n\t\t\treturn 0;\n\t\t} else {\n\t\t\treturn this.parent.level() + 1;\n\t\t}\n\t}\n\n\thasChild(annotation) {\n\t\treturn this.children.includes(annotation);\n\t}\n\n\tremove (annotation) {\n\t\tif (this.hasChild(annotation)) {\n\t\t\tannotation.removeAllChildren();\n\t\t\tannotation.dispose();\n\t\t\tthis.children = this.children.filter(e => e !== annotation);\n\t\t\tannotation.parent = null;\n\t\t}\n\t}\n\n\tremoveAllChildren() {\n\t\tthis.children.forEach((child) => {\n\t\t\tif (child.children.length > 0) {\n\t\t\t\tchild.removeAllChildren();\n\t\t\t}\n\n\t\t\tthis.remove(child);\n\t\t});\n\t}\n\n\tupdateBounds () {\n\t\tlet box = new THREE.Box3();\n\n\t\tif (this.position) {\n\t\t\tbox.expandByPoint(this.position);\n\t\t}\n\n\t\tfor (let child of this.children) {\n\t\t\tchild.updateBounds();\n\n\t\t\tbox.union(child.boundingBox);\n\t\t}\n\n\t\tthis.boundingBox.copy(box);\n\t}\n\n\ttraverse (handler) {\n\t\tlet expand = handler(this);\n\n\t\tif (expand === undefined || expand === true) {\n\t\t\tfor (let child of this.children) {\n\t\t\t\tchild.traverse(handler);\n\t\t\t}\n\t\t}\n\t}\n\n\ttraverseDescendants (handler) {\n\t\tfor (let child of this.children) {\n\t\t\tchild.traverse(handler);\n\t\t}\n\t}\n\n\tflatten () {\n\t\tlet annotations = [];\n\n\t\tthis.traverse(annotation => {\n\t\t\tannotations.push(annotation);\n\t\t});\n\n\t\treturn annotations;\n\t}\n\n\tdescendants () {\n\t\tlet annotations = [];\n\n\t\tthis.traverse(annotation => {\n\t\t\tif (annotation !== this) {\n\t\t\t\tannotations.push(annotation);\n\t\t\t}\n\t\t});\n\n\t\treturn annotations;\n\t}\n\n\tsetHighlighted (highlighted) {\n\t\tif (highlighted) {\n\t\t\tthis.domElement.css('opacity', '0.8');\n\t\t\tthis.elTitlebar.css('box-shadow', '0 0 5px #fff');\n\t\t\tthis.domElement.css('z-index', '1000');\n\n\t\t\tif (this._description) {\n\t\t\t\tthis.descriptionVisible = true;\n\t\t\t\tthis.elDescription.fadeIn(200);\n\t\t\t\tthis.elDescription.css('position', 'relative');\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domElement.css('opacity', '0.5');\n\t\t\tthis.elTitlebar.css('box-shadow', '');\n\t\t\tthis.domElement.css('z-index', '100');\n\t\t\tthis.descriptionVisible = false;\n\t\t\tthis.elDescription.css('display', 'none');\n\t\t}\n\n\t\tthis.isHighlighted = highlighted;\n\t}\n\n\thasView () {\n\t\tlet hasPosTargetView = this.cameraTarget instanceof THREE.Vector3;\n\t\thasPosTargetView = hasPosTargetView && this.cameraPosition instanceof THREE.Vector3;\n\n\t\tlet hasRadiusView = this.radius !== undefined;\n\n\t\tlet hasView = hasPosTargetView || hasRadiusView;\n\n\t\treturn hasView;\n\t};\n\n\tmoveHere (camera) {\n\t\tif (!this.hasView()) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet view = this.scene.view;\n\t\tlet animationDuration = 500;\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\tlet endTarget;\n\t\tif (this.cameraTarget) {\n\t\t\tendTarget = this.cameraTarget;\n\t\t} else if (this.position) {\n\t\t\tendTarget = this.position;\n\t\t} else {\n\t\t\tendTarget = this.boundingBox.getCenter(new THREE.Vector3());\n\t\t}\n\n\t\tif (this.cameraPosition) {\n\t\t\tlet endPosition = this.cameraPosition;\n\n\t\t\tUtils.moveTo(this.scene, endPosition, endTarget);\n\t\t} else if (this.radius) {\n\t\t\tlet direction = view.direction;\n\t\t\tlet endPosition = endTarget.clone().add(direction.multiplyScalar(-this.radius));\n\t\t\tlet startRadius = view.radius;\n\t\t\tlet endRadius = this.radius;\n\n\t\t\t{ // animate camera position\n\t\t\t\tlet tween = new TWEEN.Tween(view.position).to(endPosition, animationDuration);\n\t\t\t\ttween.easing(easing);\n\t\t\t\ttween.start();\n\t\t\t}\n\n\t\t\t{ // animate radius\n\t\t\t\tlet t = {x: 0};\n\n\t\t\t\tlet tween = new TWEEN.Tween(t)\n\t\t\t\t\t.to({x: 1}, animationDuration)\n\t\t\t\t\t.onUpdate(function () {\n\t\t\t\t\t\tview.radius = this.x * endRadius + (1 - this.x) * startRadius;\n\t\t\t\t\t});\n\t\t\t\ttween.easing(easing);\n\t\t\t\ttween.start();\n\t\t\t}\n\t\t}\n\t};\n\n\tdispose () {\n\t\tif (this.domElement.parentElement) {\n\t\t\tthis.domElement.parentElement.removeChild(this.domElement);\n\t\t}\n\t};\n\n\ttoString () {\n\t\treturn 'Annotation: ' + this._title;\n\t}\n};\n","\nclass EnumItem{\n\tconstructor(object){\n\t\tfor(let key of Object.keys(object)){\n\t\t\tthis[key] = object[key];\n\t\t}\n\t}\n\n\tinspect(){\n\t\treturn `Enum(${this.name}: ${this.value})`;\n\t}\n};\n\nclass Enum{\n\n\tconstructor(object){\n\t\tthis.object = object;\n\n\t\tfor(let key of Object.keys(object)){\n\t\t\tlet value = object[key];\n\n\t\t\tif(typeof value === \"object\"){\n\t\t\t\tvalue.name = key;\n\t\t\t}else{\n\t\t\t\tvalue = {name: key, value: value};\n\t\t\t}\n\t\t\t\n\t\t\tthis[key] = new EnumItem(value);\n\t\t}\n\t}\n\n\tfromValue(value){\n\t\tfor(let key of Object.keys(this.object)){\n\t\t\tif(this[key].value === value){\n\t\t\t\treturn this[key];\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(`No enum for value: ${value}`);\n\t}\n\t\n};\n\nexport {Enum, EnumItem};","\nimport {Enum} from \"./Enum.js\";\n\n\nexport const CameraMode = {\n\tORTHOGRAPHIC: 0,\n\tPERSPECTIVE: 1,\n\tVR: 2,\n};\n\nexport const ClipTask = {\n\tNONE: 0,\n\tHIGHLIGHT: 1,\n\tSHOW_INSIDE: 2,\n\tSHOW_OUTSIDE: 3\n};\n\nexport const ClipMethod = {\n\tINSIDE_ANY: 0,\n\tINSIDE_ALL: 1\n};\n\nexport const ElevationGradientRepeat = {\n\tCLAMP: 0,\n\tREPEAT: 1,\n\tMIRRORED_REPEAT: 2,\n};\n\nexport const MOUSE = {\n\tLEFT: 0b0001,\n\tRIGHT: 0b0010,\n\tMIDDLE: 0b0100\n};\n\nexport const PointSizeType = {\n\tFIXED: 0,\n\tATTENUATED: 1,\n\tADAPTIVE: 2\n};\n\nexport const PointShape = {\n\tSQUARE: 0,\n\tCIRCLE: 1,\n\tPARABOLOID: 2\n};\n\nexport const TreeType = {\n\tOCTREE:\t0,\n\tKDTREE:\t1\n};\n\nexport const LengthUnits = {\n\tMETER: {code: 'm', unitspermeter: 1.0},\n\tFEET: {code: 'ft', unitspermeter: 3.28084},\n\tINCH: {code: '\\u2033', unitspermeter: 39.3701}\n};","\nlet ftCanvas = document.createElement('canvas');\n\nexport const Features = (function () {\n\n\tlet gl = ftCanvas.getContext('webgl') || ftCanvas.getContext('experimental-webgl');\n\tif (gl === null){ \n\t\treturn null; \n\t}\n\n\t// -- code taken from THREE.WebGLRenderer --\n\tlet _vertexShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT);\n\tlet _vertexShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT);\n\t// Unused: let _vertexShaderPrecisionLowpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT);\n\n\tlet _fragmentShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT);\n\tlet _fragmentShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT);\n\t// Unused: let _fragmentShaderPrecisionLowpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT);\n\n\tlet highpAvailable = _vertexShaderPrecisionHighpFloat.precision > 0 && _fragmentShaderPrecisionHighpFloat.precision > 0;\n\tlet mediumpAvailable = _vertexShaderPrecisionMediumpFloat.precision > 0 && _fragmentShaderPrecisionMediumpFloat.precision > 0;\n\t// -----------------------------------------\n\n\tlet precision;\n\tif (highpAvailable) {\n\t\tprecision = 'highp';\n\t} else if (mediumpAvailable) {\n\t\tprecision = 'mediump';\n\t} else {\n\t\tprecision = 'lowp';\n\t}\n\n\treturn {\n\t\tSHADER_INTERPOLATION: {\n\t\t\tisSupported: function () {\n\t\t\t\tlet supported = true;\n\n\t\t\t\tsupported = supported && gl.getExtension('EXT_frag_depth');\n\t\t\t\tsupported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8;\n\n\t\t\t\treturn supported;\n\t\t\t}\n\t\t},\n\t\tSHADER_SPLATS: {\n\t\t\tisSupported: function () {\n\t\t\t\tlet supported = true;\n\n\t\t\t\tsupported = supported && gl.getExtension('EXT_frag_depth');\n\t\t\t\tsupported = supported && gl.getExtension('OES_texture_float');\n\t\t\t\tsupported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8;\n\n\t\t\t\treturn supported;\n\t\t\t}\n\n\t\t},\n\t\tSHADER_EDL: {\n\t\t\tisSupported: function () {\n\t\t\t\tlet supported = true;\n\n\t\t\t\t//supported = supported && gl.getExtension('EXT_frag_depth');\n\t\t\t\tsupported = supported && gl.getExtension('OES_texture_float');\n\t\t\t\tsupported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8;\n\n\t\t\t\t//supported = supported || (gl instanceof WebGL2RenderingContext);\n\n\t\t\t\treturn supported;\n\t\t\t}\n\n\t\t},\n\t\t//WEBGL2: {\n\t\t//\tisSupported: function(){\n\t\t//\t\treturn gl instanceof WebGL2RenderingContext;\n\t\t//\t}\n\t\t//},\n\t\tprecision: precision\n\t};\n}());\n\n","\n\nexport const KeyCodes = {\n\n\tLEFT: 37,\n\tUP: 38,\n\tRIGHT: 39,\n\tBOTTOM: 40,\n\tDELETE: 46,\n\n\tA: 'A'.charCodeAt(0),\n\tS: 'S'.charCodeAt(0),\n\tD: 'D'.charCodeAt(0),\n\tW: 'W'.charCodeAt(0),\n\tQ: 'Q'.charCodeAt(0),\n\tE: 'E'.charCodeAt(0),\n\tR: 'R'.charCodeAt(0),\n\tF: 'F'.charCodeAt(0)\n\t\n};","\n\nclass LRUItem{\n\n\tconstructor(node){\n\t\tthis.previous = null;\n\t\tthis.next = null;\n\t\tthis.node = node;\n\t}\n\n}\n\n/**\n *\n * @class A doubly-linked-list of the least recently used elements.\n */\nclass LRU{\n\n\tconstructor(){\n\t\t// the least recently used item\n\t\tthis.first = null;\n\t\t// the most recently used item\n\t\tthis.last = null;\n\t\t// a list of all items in the lru list\n\t\tthis.items = {};\n\t\tthis.elements = 0;\n\t\tthis.numPoints = 0;\n\t}\n\n\tsize(){\n\t\treturn this.elements;\n\t}\n\n\tcontains(node){\n\t\treturn this.items[node.id] == null;\n\t}\n\n\ttouch(node){\n\t\tif (!node.loaded) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet item;\n\t\tif (this.items[node.id] == null) {\n\t\t\t// add to list\n\t\t\titem = new LRUItem(node);\n\t\t\titem.previous = this.last;\n\t\t\tthis.last = item;\n\t\t\tif (item.previous !== null) {\n\t\t\t\titem.previous.next = item;\n\t\t\t}\n\n\t\t\tthis.items[node.id] = item;\n\t\t\tthis.elements++;\n\n\t\t\tif (this.first === null) {\n\t\t\t\tthis.first = item;\n\t\t\t}\n\t\t\tthis.numPoints += node.numPoints;\n\t\t} else {\n\t\t\t// update in list\n\t\t\titem = this.items[node.id];\n\t\t\tif (item.previous === null) {\n\t\t\t\t// handle touch on first element\n\t\t\t\tif (item.next !== null) {\n\t\t\t\t\tthis.first = item.next;\n\t\t\t\t\tthis.first.previous = null;\n\t\t\t\t\titem.previous = this.last;\n\t\t\t\t\titem.next = null;\n\t\t\t\t\tthis.last = item;\n\t\t\t\t\titem.previous.next = item;\n\t\t\t\t}\n\t\t\t} else if (item.next === null) {\n\t\t\t\t// handle touch on last element\n\t\t\t} else {\n\t\t\t\t// handle touch on any other element\n\t\t\t\titem.previous.next = item.next;\n\t\t\t\titem.next.previous = item.previous;\n\t\t\t\titem.previous = this.last;\n\t\t\t\titem.next = null;\n\t\t\t\tthis.last = item;\n\t\t\t\titem.previous.next = item;\n\t\t\t}\n\t\t}\n\t}\n\n\tremove(node){\n\t\tlet lruItem = this.items[node.id];\n\t\tif (lruItem) {\n\t\t\tif (this.elements === 1) {\n\t\t\t\tthis.first = null;\n\t\t\t\tthis.last = null;\n\t\t\t} else {\n\t\t\t\tif (!lruItem.previous) {\n\t\t\t\t\tthis.first = lruItem.next;\n\t\t\t\t\tthis.first.previous = null;\n\t\t\t\t}\n\t\t\t\tif (!lruItem.next) {\n\t\t\t\t\tthis.last = lruItem.previous;\n\t\t\t\t\tthis.last.next = null;\n\t\t\t\t}\n\t\t\t\tif (lruItem.previous && lruItem.next) {\n\t\t\t\t\tlruItem.previous.next = lruItem.next;\n\t\t\t\t\tlruItem.next.previous = lruItem.previous;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdelete this.items[node.id];\n\t\t\tthis.elements--;\n\t\t\tthis.numPoints -= node.numPoints;\n\t\t}\n\t}\n\n\tgetLRUItem(){\n\t\tif (this.first === null) {\n\t\t\treturn null;\n\t\t}\n\t\tlet lru = this.first;\n\n\t\treturn lru.node;\n\t}\n\n\ttoString(){\n\t\tlet string = '{ ';\n\t\tlet curr = this.first;\n\t\twhile (curr !== null) {\n\t\t\tstring += curr.node.id;\n\t\t\tif (curr.next !== null) {\n\t\t\t\tstring += ', ';\n\t\t\t}\n\t\t\tcurr = curr.next;\n\t\t}\n\t\tstring += '}';\n\t\tstring += '(' + this.size() + ')';\n\t\treturn string;\n\t}\n\n\tfreeMemory(){\n\t\tif (this.elements <= 1) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this.numPoints > Potree.pointLoadLimit) {\n\t\t\tlet element = this.first;\n\t\t\tlet node = element.node;\n\t\t\tthis.disposeDescendants(node);\n\t\t}\n\t}\n\n\tdisposeDescendants(node){\n\t\tlet stack = [];\n\t\tstack.push(node);\n\t\twhile (stack.length > 0) {\n\t\t\tlet current = stack.pop();\n\n\t\t\t// console.log(current);\n\n\t\t\tcurrent.dispose();\n\t\t\tthis.remove(current);\n\n\t\t\tfor (let key in current.children) {\n\t\t\t\tif (current.children.hasOwnProperty(key)) {\n\t\t\t\t\tlet child = current.children[key];\n\t\t\t\t\tif (child.loaded) {\n\t\t\t\t\t\tstack.push(current.children[key]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nexport {LRU, LRUItem};","\n\nimport { EventDispatcher } from \"./EventDispatcher.js\";\n\n\nexport class PointCloudTreeNode extends EventDispatcher{\n\n\tconstructor(){\n\t\tsuper();\n\t\tthis.needsTransformUpdate = true;\n\t}\n\n\tgetChildren () {\n\t\tthrow new Error('override function');\n\t}\n\n\tgetBoundingBox () {\n\t\tthrow new Error('override function');\n\t}\n\n\tisLoaded () {\n\t\tthrow new Error('override function');\n\t}\n\n\tisGeometryNode () {\n\t\tthrow new Error('override function');\n\t}\n\n\tisTreeNode () {\n\t\tthrow new Error('override function');\n\t}\n\n\tgetLevel () {\n\t\tthrow new Error('override function');\n\t}\n\n\tgetBoundingSphere () {\n\t\tthrow new Error('override function');\n\t}\n};\n\nexport class PointCloudTree extends THREE.Object3D {\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tinitialized () {\n\t\treturn this.root !== null;\n\t}\n};\n","\n/**\n * Some types of possible point attribute data formats\n *\n * @class\n */\nconst PointAttributeTypes = {\n\tDATA_TYPE_DOUBLE: {ordinal: 0, name: \"double\", size: 8},\n\tDATA_TYPE_FLOAT: {ordinal: 1, name: \"float\", size: 4},\n\tDATA_TYPE_INT8: {ordinal: 2, name: \"int8\", size: 1},\n\tDATA_TYPE_UINT8: {ordinal: 3, name: \"uint8\", size: 1},\n\tDATA_TYPE_INT16: {ordinal: 4, name: \"int16\", size: 2},\n\tDATA_TYPE_UINT16: {ordinal: 5, name: \"uint16\", size: 2},\n\tDATA_TYPE_INT32: {ordinal: 6, name: \"int32\", size: 4},\n\tDATA_TYPE_UINT32: {ordinal: 7, name: \"uint32\", size: 4},\n\tDATA_TYPE_INT64: {ordinal: 8, name: \"int64\", size: 8},\n\tDATA_TYPE_UINT64: {ordinal: 9, name: \"uint64\", size: 8}\n};\n\nlet i = 0;\nfor (let obj in PointAttributeTypes) {\n\tPointAttributeTypes[i] = PointAttributeTypes[obj];\n\ti++;\n}\n\nexport {PointAttributeTypes};\n\n\nclass PointAttribute{\n\t\n\tconstructor(name, type, numElements){\n\t\tthis.name = name;\n\t\tthis.type = type;\n\t\tthis.numElements = numElements;\n\t\tthis.byteSize = this.numElements * this.type.size;\n\t\tthis.description = \"\";\n\t\tthis.range = [Infinity, -Infinity];\n\t}\n\n};\n\nPointAttribute.POSITION_CARTESIAN = new PointAttribute(\n\t\"POSITION_CARTESIAN\", PointAttributeTypes.DATA_TYPE_FLOAT, 3);\n\nPointAttribute.RGBA_PACKED = new PointAttribute(\n\t\"COLOR_PACKED\", PointAttributeTypes.DATA_TYPE_INT8, 4);\n\nPointAttribute.COLOR_PACKED = PointAttribute.RGBA_PACKED;\n\nPointAttribute.RGB_PACKED = new PointAttribute(\n\t\"COLOR_PACKED\", PointAttributeTypes.DATA_TYPE_INT8, 3);\n\nPointAttribute.NORMAL_FLOATS = new PointAttribute(\n\t\"NORMAL_FLOATS\", PointAttributeTypes.DATA_TYPE_FLOAT, 3);\n\nPointAttribute.INTENSITY = new PointAttribute(\n\t\"INTENSITY\", PointAttributeTypes.DATA_TYPE_UINT16, 1);\n\nPointAttribute.CLASSIFICATION = new PointAttribute(\n\t\"CLASSIFICATION\", PointAttributeTypes.DATA_TYPE_UINT8, 1);\n\nPointAttribute.NORMAL_SPHEREMAPPED = new PointAttribute(\n\t\"NORMAL_SPHEREMAPPED\", PointAttributeTypes.DATA_TYPE_UINT8, 2);\n\nPointAttribute.NORMAL_OCT16 = new PointAttribute(\n\t\"NORMAL_OCT16\", PointAttributeTypes.DATA_TYPE_UINT8, 2);\n\nPointAttribute.NORMAL = new PointAttribute(\n\t\"NORMAL\", PointAttributeTypes.DATA_TYPE_FLOAT, 3);\n\t\nPointAttribute.RETURN_NUMBER = new PointAttribute(\n\t\"RETURN_NUMBER\", PointAttributeTypes.DATA_TYPE_UINT8, 1);\n\t\nPointAttribute.NUMBER_OF_RETURNS = new PointAttribute(\n\t\"NUMBER_OF_RETURNS\", PointAttributeTypes.DATA_TYPE_UINT8, 1);\n\t\nPointAttribute.SOURCE_ID = new PointAttribute(\n\t\"SOURCE_ID\", PointAttributeTypes.DATA_TYPE_UINT16, 1);\n\nPointAttribute.INDICES = new PointAttribute(\n\t\"INDICES\", PointAttributeTypes.DATA_TYPE_UINT32, 1);\n\nPointAttribute.SPACING = new PointAttribute(\n\t\"SPACING\", PointAttributeTypes.DATA_TYPE_FLOAT, 1);\n\nPointAttribute.GPS_TIME = new PointAttribute(\n\t\"GPS_TIME\", PointAttributeTypes.DATA_TYPE_DOUBLE, 1);\n\nexport {PointAttribute};\n\nexport class PointAttributes{\n\n\tconstructor(pointAttributes){\n\t\tthis.attributes = [];\n\t\tthis.byteSize = 0;\n\t\tthis.size = 0;\n\t\tthis.vectors = [];\n\n\t\tif (pointAttributes != null) {\n\t\t\tfor (let i = 0; i < pointAttributes.length; i++) {\n\t\t\t\tlet pointAttributeName = pointAttributes[i];\n\t\t\t\tlet pointAttribute = PointAttribute[pointAttributeName];\n\t\t\t\tthis.attributes.push(pointAttribute);\n\t\t\t\tthis.byteSize += pointAttribute.byteSize;\n\t\t\t\tthis.size++;\n\t\t\t}\n\t\t}\n\t}\n\n\n\tadd(pointAttribute){\n\t\tthis.attributes.push(pointAttribute);\n\t\tthis.byteSize += pointAttribute.byteSize;\n\t\tthis.size++;\n\t};\n\n\taddVector(vector){\n\t\tthis.vectors.push(vector);\n\t}\n\n\thasColors(){\n\t\tfor (let name in this.attributes) {\n\t\t\tlet pointAttribute = this.attributes[name];\n\t\t\tif (pointAttribute.name === PointAttributeNames.COLOR_PACKED) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\thasNormals(){\n\t\tfor (let name in this.attributes) {\n\t\t\tlet pointAttribute = this.attributes[name];\n\t\t\tif (\n\t\t\t\tpointAttribute === PointAttribute.NORMAL_SPHEREMAPPED ||\n\t\t\t\tpointAttribute === PointAttribute.NORMAL_FLOATS ||\n\t\t\t\tpointAttribute === PointAttribute.NORMAL ||\n\t\t\t\tpointAttribute === PointAttribute.NORMAL_OCT16) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n}\n","import {PointCloudTreeNode} from \"./PointCloudTree.js\";\nimport {PointAttributes, PointAttribute, PointAttributeTypes} from \"./loader/PointAttributes.js\";\n\nclass U {\n\tstatic toVector3(v, offset) {\n\t\treturn new THREE.Vector3().fromArray(v, offset || 0);\n\t}\n\n\tstatic toBox3(b) {\n\t\treturn new THREE.Box3(U.toVector3(b), U.toVector3(b, 3));\n\t};\n\n\tstatic findDim(schema, name) {\n\t\tvar dim = schema.find((dim) => dim.name == name);\n\t\tif (!dim) throw new Error('Failed to find ' + name + ' in schema');\n\t\treturn dim;\n\t}\n\n\tstatic sphereFrom(b) {\n\t\treturn b.getBoundingSphere(new THREE.Sphere());\n\t}\n};\n\nexport class PointCloudEptGeometry {\n\tconstructor(url, info) {\n\t\tlet version = info.version;\n\t\tlet schema = info.schema;\n\t\tlet bounds = info.bounds;\n\t\tlet boundsConforming = info.boundsConforming;\n\n\t\tlet xyz = [\n\t\t\tU.findDim(schema, 'X'),\n\t\t\tU.findDim(schema, 'Y'),\n\t\t\tU.findDim(schema, 'Z')\n\t\t];\n\t\tlet scale = xyz.map((d) => d.scale || 1);\n\t\tlet offset = xyz.map((d) => d.offset || 0);\n\t\tthis.eptScale = U.toVector3(scale);\n\t\tthis.eptOffset = U.toVector3(offset);\n\n\t\tthis.url = url;\n\t\tthis.info = info;\n\t\tthis.type = 'ept';\n\n\t\tthis.schema = schema;\n\t\tthis.span = info.span || info.ticks;\n\t\tthis.boundingBox = U.toBox3(bounds);\n\t\tthis.tightBoundingBox = U.toBox3(boundsConforming);\n\t\tthis.offset = U.toVector3([0, 0, 0]);\n\t\tthis.boundingSphere = U.sphereFrom(this.boundingBox);\n\t\tthis.tightBoundingSphere = U.sphereFrom(this.tightBoundingBox);\n\t\tthis.version = new Potree.Version('1.7');\n\n\t\tthis.projection = null;\n\t\tthis.fallbackProjection = null;\n\n\t\tif (info.srs && info.srs.horizontal) {\n\t\t\tthis.projection = info.srs.authority + ':' + info.srs.horizontal;\n\t\t}\n\n\t\tif (info.srs.wkt) {\n\t\t\tif (!this.projection) this.projection = info.srs.wkt;\n\t\t\telse this.fallbackProjection = info.srs.wkt;\n\t\t}\n\n\t\t{ \n\t\t\t// TODO [mschuetz]: named projections that proj4 can't handle seem to cause problems.\n\t\t\t// remove them for now\n\n\t\t\ttry{\n\t\t\t\tproj4(this.projection);\n\t\t\t}catch(e){\n\t\t\t\tthis.projection = null;\n\t\t\t}\n\n\t\t\n\n\t\t}\n\n\t\t\n\t\t{\n\t\t\tconst attributes = new PointAttributes();\n\n\t\t\tattributes.add(PointAttribute.POSITION_CARTESIAN);\n\t\t\tattributes.add(new PointAttribute(\"rgba\", PointAttributeTypes.DATA_TYPE_UINT8, 4));\n\t\t\tattributes.add(new PointAttribute(\"intensity\", PointAttributeTypes.DATA_TYPE_UINT16, 1));\n\t\t\tattributes.add(new PointAttribute(\"classification\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\t\t\tattributes.add(new PointAttribute(\"gps-time\", PointAttributeTypes.DATA_TYPE_DOUBLE, 1));\n\t\t\tattributes.add(new PointAttribute(\"returnNumber\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\t\t\tattributes.add(new PointAttribute(\"number of returns\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\t\t\tattributes.add(new PointAttribute(\"return number\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\t\t\tattributes.add(new PointAttribute(\"source id\", PointAttributeTypes.DATA_TYPE_UINT16, 1));\n\n\t\t\tthis.pointAttributes = attributes;\n\t\t}\n\n\n\n\t\tthis.spacing =\n\t\t\t(this.boundingBox.max.x - this.boundingBox.min.x) / this.span;\n\n\t\tlet hierarchyType = info.hierarchyType || 'json';\n\n\t\tconst dataType = info.dataType;\n\t\tif (dataType == 'laszip') {\n\t\t\tthis.loader = new Potree.EptLaszipLoader();\n\t\t}\n\t\telse if (dataType == 'binary') {\n\t\t\tthis.loader = new Potree.EptBinaryLoader();\n\t\t}\n\t\telse if (dataType == 'zstandard') {\n\t\t\tthis.loader = new Potree.EptZstandardLoader();\n\t\t}\n\t\telse {\n\t\t\tthrow new Error('Could not read data type: ' + dataType);\n\t\t}\n\t}\n};\n\nexport class EptKey {\n\tconstructor(ept, b, d, x, y, z) {\n\t\tthis.ept = ept;\n\t\tthis.b = b;\n\t\tthis.d = d;\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t}\n\n\tname() {\n\t\treturn this.d + '-' + this.x + '-' + this.y + '-' + this.z;\n\t}\n\n\tstep(a, b, c) {\n\t\tlet min = this.b.min.clone();\n\t\tlet max = this.b.max.clone();\n\t\tlet dst = new THREE.Vector3().subVectors(max, min);\n\n\t\tif (a)\tmin.x += dst.x / 2;\n\t\telse\tmax.x -= dst.x / 2;\n\n\t\tif (b)\tmin.y += dst.y / 2;\n\t\telse\tmax.y -= dst.y / 2;\n\n\t\tif (c)\tmin.z += dst.z / 2;\n\t\telse\tmax.z -= dst.z / 2;\n\n\t\treturn new Potree.EptKey(\n\t\t\t\tthis.ept,\n\t\t\t\tnew THREE.Box3(min, max),\n\t\t\t\tthis.d + 1,\n\t\t\t\tthis.x * 2 + a,\n\t\t\t\tthis.y * 2 + b,\n\t\t\t\tthis.z * 2 + c);\n\t}\n\n\tchildren() {\n\t\tvar result = [];\n\t\tfor (var a = 0; a < 2; ++a) {\n\t\t\tfor (var b = 0; b < 2; ++b) {\n\t\t\t\tfor (var c = 0; c < 2; ++c) {\n\t\t\t\t\tvar add = this.step(a, b, c).name();\n\t\t\t\t\tif (!result.includes(add)) result = result.concat(add);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n\nexport class PointCloudEptGeometryNode extends PointCloudTreeNode {\n\tconstructor(ept, b, d, x, y, z) {\n\t\tsuper();\n\n\t\tthis.ept = ept;\n\t\tthis.key = new Potree.EptKey(\n\t\t\t\tthis.ept,\n\t\t\t\tb || this.ept.boundingBox,\n\t\t\t\td || 0,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\tz);\n\n\t\tthis.id = PointCloudEptGeometryNode.IDCount++;\n\t\tthis.geometry = null;\n\t\tthis.boundingBox = this.key.b;\n\t\tthis.tightBoundingBox = this.boundingBox;\n\t\tthis.spacing = this.ept.spacing / Math.pow(2, this.key.d);\n\t\tthis.boundingSphere = U.sphereFrom(this.boundingBox);\n\n\t\t// These are set during hierarchy loading.\n\t\tthis.hasChildren = false;\n\t\tthis.children = { };\n\t\tthis.numPoints = -1;\n\n\t\tthis.level = this.key.d;\n\t\tthis.loaded = false;\n\t\tthis.loading = false;\n\t\tthis.oneTimeDisposeHandlers = [];\n\n\t\tlet k = this.key;\n\t\tthis.name = this.toPotreeName(k.d, k.x, k.y, k.z);\n\t\tthis.index = parseInt(this.name.charAt(this.name.length - 1));\n\t}\n\n\tisGeometryNode() { return true; }\n\tgetLevel() { return this.level; }\n\tisTreeNode() { return false; }\n\tisLoaded() { return this.loaded; }\n\tgetBoundingSphere() { return this.boundingSphere; }\n\tgetBoundingBox() { return this.boundingBox; }\n\turl() { return this.ept.url + 'ept-data/' + this.filename(); }\n\tgetNumPoints() { return this.numPoints; }\n\n\tfilename() { return this.key.name(); }\n\n\tgetChildren() {\n\t\tlet children = [];\n\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tif (this.children[i]) {\n\t\t\t\tchildren.push(this.children[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn children;\n\t}\n\n\taddChild(child) {\n\t\tthis.children[child.index] = child;\n\t\tchild.parent = this;\n\t}\n\n\tload() {\n\t\tif (this.loaded || this.loading) return;\n\t\tif (Potree.numNodesLoading >= Potree.maxNodesLoading) return;\n\n\t\tthis.loading = true;\n\t\t++Potree.numNodesLoading;\n\n\t\tif (this.numPoints == -1) this.loadHierarchy();\n\t\tthis.loadPoints();\n\t}\n\n\tloadPoints(){\n\t\tthis.ept.loader.load(this);\n\t}\n\n\tasync loadHierarchy() {\n\t\tlet nodes = { };\n\t\tnodes[this.filename()] = this;\n\t\tthis.hasChildren = false;\n\n\t\tlet eptHierarchyFile =\n\t\t\t`${this.ept.url}ept-hierarchy/${this.filename()}.json`;\n\n\t\tlet response = await fetch(eptHierarchyFile);\n\t\tlet hier = await response.json();\n\n\t\t// Since we want to traverse top-down, and 10 comes\n\t\t// lexicographically before 9 (for example), do a deep sort.\n\t\tvar keys = Object.keys(hier).sort((a, b) => {\n\t\t\tlet [da, xa, ya, za] = a.split('-').map((n) => parseInt(n, 10));\n\t\t\tlet [db, xb, yb, zb] = b.split('-').map((n) => parseInt(n, 10));\n\t\t\tif (da < db) return -1; if (da > db) return 1;\n\t\t\tif (xa < xb) return -1; if (xa > xb) return 1;\n\t\t\tif (ya < yb) return -1; if (ya > yb) return 1;\n\t\t\tif (za < zb) return -1; if (za > zb) return 1;\n\t\t\treturn 0;\n\t\t});\n\n\t\tkeys.forEach((v) => {\n\t\t\tlet [d, x, y, z] = v.split('-').map((n) => parseInt(n, 10));\n\t\t\tlet a = x & 1, b = y & 1, c = z & 1;\n\t\t\tlet parentName =\n\t\t\t\t(d - 1) + '-' + (x >> 1) + '-' + (y >> 1) + '-' + (z >> 1);\n\n\t\t\tlet parentNode = nodes[parentName];\n\t\t\tif (!parentNode) return;\n\t\t\tparentNode.hasChildren = true;\n\n\t\t\tlet key = parentNode.key.step(a, b, c);\n\n\t\t\tlet node = new Potree.PointCloudEptGeometryNode(\n\t\t\t\t\tthis.ept,\n\t\t\t\t\tkey.b,\n\t\t\t\t\tkey.d,\n\t\t\t\t\tkey.x,\n\t\t\t\t\tkey.y,\n\t\t\t\t\tkey.z);\n\n\t\t\tnode.level = d;\n\t\t\tnode.numPoints = hier[v];\n\n\t\t\tparentNode.addChild(node);\n\t\t\tnodes[key.name()] = node;\n\t\t});\n\t}\n\n\tdoneLoading(bufferGeometry, tightBoundingBox, np, mean) {\n\t\tbufferGeometry.boundingBox = this.boundingBox;\n\t\tthis.geometry = bufferGeometry;\n\t\tthis.tightBoundingBox = tightBoundingBox;\n\t\tthis.numPoints = np;\n\t\tthis.mean = mean;\n\t\tthis.loaded = true;\n\t\tthis.loading = false;\n\t\t--Potree.numNodesLoading;\n\t}\n\n\ttoPotreeName(d, x, y, z) {\n\t\tvar name = 'r';\n\n\t\tfor (var i = 0; i < d; ++i) {\n\t\t\tvar shift = d - i - 1;\n\t\t\tvar mask = 1 << shift;\n\t\t\tvar step = 0;\n\n\t\t\tif (x & mask) step += 4;\n\t\t\tif (y & mask) step += 2;\n\t\t\tif (z & mask) step += 1;\n\n\t\t\tname += step;\n\t\t}\n\n\t\treturn name;\n\t}\n\n\tdispose() {\n\t\tif (this.geometry && this.parent != null) {\n\t\t\tthis.geometry.dispose();\n\t\t\tthis.geometry = null;\n\t\t\tthis.loaded = false;\n\n\t\t\t// this.dispatchEvent( { type: 'dispose' } );\n\t\t\tfor (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) {\n\t\t\t\tlet handler = this.oneTimeDisposeHandlers[i];\n\t\t\t\thandler();\n\t\t\t}\n\t\t\tthis.oneTimeDisposeHandlers = [];\n\t\t}\n\t}\n}\n\nPointCloudEptGeometryNode.IDCount = 0;\n\n","\n\nimport {PointCloudTreeNode} from \"./PointCloudTree.js\";\nimport {XHRFactory} from \"./XHRFactory.js\";\nimport {Utils} from \"./utils.js\";\n\nexport class PointCloudOctreeGeometry{\n\n\tconstructor(){\n\t\tthis.url = null;\n\t\tthis.octreeDir = null;\n\t\tthis.spacing = 0;\n\t\tthis.boundingBox = null;\n\t\tthis.root = null;\n\t\tthis.nodes = null;\n\t\tthis.pointAttributes = null;\n\t\tthis.hierarchyStepSize = -1;\n\t\tthis.loader = null;\n\t}\n\t\n}\n\nexport class PointCloudOctreeGeometryNode extends PointCloudTreeNode{\n\n\tconstructor(name, pcoGeometry, boundingBox){\n\t\tsuper();\n\n\t\tthis.id = PointCloudOctreeGeometryNode.IDCount++;\n\t\tthis.name = name;\n\t\tthis.index = parseInt(name.charAt(name.length - 1));\n\t\tthis.pcoGeometry = pcoGeometry;\n\t\tthis.geometry = null;\n\t\tthis.boundingBox = boundingBox;\n\t\tthis.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\tthis.children = {};\n\t\tthis.numPoints = 0;\n\t\tthis.level = null;\n\t\tthis.loaded = false;\n\t\tthis.oneTimeDisposeHandlers = [];\n\t}\n\n\tisGeometryNode(){\n\t\treturn true;\n\t}\n\n\tgetLevel(){\n\t\treturn this.level;\n\t}\n\n\tisTreeNode(){\n\t\treturn false;\n\t}\n\n\tisLoaded(){\n\t\treturn this.loaded;\n\t}\n\n\tgetBoundingSphere(){\n\t\treturn this.boundingSphere;\n\t}\n\n\tgetBoundingBox(){\n\t\treturn this.boundingBox;\n\t}\n\n\tgetChildren(){\n\t\tlet children = [];\n\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tif (this.children[i]) {\n\t\t\t\tchildren.push(this.children[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn children;\n\t}\n\n\tgetBoundingBox(){\n\t\treturn this.boundingBox;\n\t}\n\n\tgetURL(){\n\t\tlet url = '';\n\n\t\tlet version = this.pcoGeometry.loader.version;\n\n\t\tif (version.equalOrHigher('1.5')) {\n\t\t\turl = this.pcoGeometry.octreeDir + '/' + this.getHierarchyPath() + '/' + this.name;\n\t\t} else if (version.equalOrHigher('1.4')) {\n\t\t\turl = this.pcoGeometry.octreeDir + '/' + this.name;\n\t\t} else if (version.upTo('1.3')) {\n\t\t\turl = this.pcoGeometry.octreeDir + '/' + this.name;\n\t\t}\n\n\t\treturn url;\n\t}\n\n\tgetHierarchyPath(){\n\t\tlet path = 'r/';\n\n\t\tlet hierarchyStepSize = this.pcoGeometry.hierarchyStepSize;\n\t\tlet indices = this.name.substr(1);\n\n\t\tlet numParts = Math.floor(indices.length / hierarchyStepSize);\n\t\tfor (let i = 0; i < numParts; i++) {\n\t\t\tpath += indices.substr(i * hierarchyStepSize, hierarchyStepSize) + '/';\n\t\t}\n\n\t\tpath = path.slice(0, -1);\n\n\t\treturn path;\n\t}\n\n\taddChild(child) {\n\t\tthis.children[child.index] = child;\n\t\tchild.parent = this;\n\t}\n\n\tload(){\n\t\tif (this.loading === true || this.loaded === true || Potree.numNodesLoading >= Potree.maxNodesLoading) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.loading = true;\n\n\t\tPotree.numNodesLoading++;\n\n\t\tif (this.pcoGeometry.loader.version.equalOrHigher('1.5')) {\n\t\t\tif ((this.level % this.pcoGeometry.hierarchyStepSize) === 0 && this.hasChildren) {\n\t\t\t\tthis.loadHierachyThenPoints();\n\t\t\t} else {\n\t\t\t\tthis.loadPoints();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.loadPoints();\n\t\t}\n\t}\n\n\tloadPoints(){\n\t\tthis.pcoGeometry.loader.load(this);\n\t}\n\n\tloadHierachyThenPoints(){\n\t\tlet node = this;\n\n\t\t// load hierarchy\n\t\tlet callback = function (node, hbuffer) {\n\n\t\t\tlet tStart = performance.now();\n\n\t\t\tlet view = new DataView(hbuffer);\n\n\t\t\tlet stack = [];\n\t\t\tlet children = view.getUint8(0);\n\t\t\tlet numPoints = view.getUint32(1, true);\n\t\t\tnode.numPoints = numPoints;\n\t\t\tstack.push({children: children, numPoints: numPoints, name: node.name});\n\n\t\t\tlet decoded = [];\n\n\t\t\tlet offset = 5;\n\t\t\twhile (stack.length > 0) {\n\t\t\t\tlet snode = stack.shift();\n\t\t\t\tlet mask = 1;\n\t\t\t\tfor (let i = 0; i < 8; i++) {\n\t\t\t\t\tif ((snode.children & mask) !== 0) {\n\t\t\t\t\t\tlet childName = snode.name + i;\n\n\t\t\t\t\t\tlet childChildren = view.getUint8(offset);\n\t\t\t\t\t\tlet childNumPoints = view.getUint32(offset + 1, true);\n\n\t\t\t\t\t\tstack.push({children: childChildren, numPoints: childNumPoints, name: childName});\n\n\t\t\t\t\t\tdecoded.push({children: childChildren, numPoints: childNumPoints, name: childName});\n\n\t\t\t\t\t\toffset += 5;\n\t\t\t\t\t}\n\n\t\t\t\t\tmask = mask * 2;\n\t\t\t\t}\n\n\t\t\t\tif (offset === hbuffer.byteLength) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// console.log(decoded);\n\n\t\t\tlet nodes = {};\n\t\t\tnodes[node.name] = node;\n\t\t\tlet pco = node.pcoGeometry;\n\n\t\t\tfor (let i = 0; i < decoded.length; i++) {\n\t\t\t\tlet name = decoded[i].name;\n\t\t\t\tlet decodedNumPoints = decoded[i].numPoints;\n\t\t\t\tlet index = parseInt(name.charAt(name.length - 1));\n\t\t\t\tlet parentName = name.substring(0, name.length - 1);\n\t\t\t\tlet parentNode = nodes[parentName];\n\t\t\t\tlet level = name.length - 1;\n\t\t\t\tlet boundingBox = Utils.createChildAABB(parentNode.boundingBox, index);\n\n\t\t\t\tlet currentNode = new PointCloudOctreeGeometryNode(name, pco, boundingBox);\n\t\t\t\tcurrentNode.level = level;\n\t\t\t\tcurrentNode.numPoints = decodedNumPoints;\n\t\t\t\tcurrentNode.hasChildren = decoded[i].children > 0;\n\t\t\t\tcurrentNode.spacing = pco.spacing / Math.pow(2, level);\n\t\t\t\tparentNode.addChild(currentNode);\n\t\t\t\tnodes[name] = currentNode;\n\t\t\t}\n\n\t\t\tlet duration = performance.now() - tStart;\n\t\t\tif(duration > 5){\n\t\t\t\tlet msg = `duration: ${duration}ms, numNodes: ${decoded.length}`;\n\t\t\t\tconsole.log(msg);\n\t\t\t}\n\n\t\t\tnode.loadPoints();\n\t\t};\n\t\tif ((node.level % node.pcoGeometry.hierarchyStepSize) === 0) {\n\t\t\t// let hurl = node.pcoGeometry.octreeDir + \"/../hierarchy/\" + node.name + \".hrc\";\n\t\t\tlet hurl = node.pcoGeometry.octreeDir + '/' + node.getHierarchyPath() + '/' + node.name + '.hrc';\n\n\t\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\t\txhr.open('GET', hurl, true);\n\t\t\txhr.responseType = 'arraybuffer';\n\t\t\txhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t\t\txhr.onreadystatechange = () => {\n\t\t\t\tif (xhr.readyState === 4) {\n\t\t\t\t\tif (xhr.status === 200 || xhr.status === 0) {\n\t\t\t\t\t\tlet hbuffer = xhr.response;\n\t\t\t\t\t\tcallback(node, hbuffer);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.log('Failed to load file! HTTP status: ' + xhr.status + ', file: ' + hurl);\n\t\t\t\t\t\tPotree.numNodesLoading--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\ttry {\n\t\t\t\txhr.send(null);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log('fehler beim laden der punktwolke: ' + e);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetNumPoints(){\n\t\treturn this.numPoints;\n\t}\n\n\tdispose(){\n\t\tif (this.geometry && this.parent != null) {\n\t\t\tthis.geometry.dispose();\n\t\t\tthis.geometry = null;\n\t\t\tthis.loaded = false;\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\t\t\t\n\t\t\tfor (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) {\n\t\t\t\tlet handler = this.oneTimeDisposeHandlers[i];\n\t\t\t\thandler();\n\t\t\t}\n\t\t\tthis.oneTimeDisposeHandlers = [];\n\t\t}\n\t}\n\t\n}\n\nPointCloudOctreeGeometryNode.IDCount = 0;\n","\n// -------------------------------------------\n// to get a ready to use gradient array from a chroma.js gradient:\n// http://gka.github.io/chroma.js/\n// -------------------------------------------\n//\n// let stops = [];\n// for(let i = 0; i <= 10; i++){\n//\tlet range = chroma.scale(['yellow', 'navy']).mode('lch').domain([10,0])(i)._rgb\n//\t\t.slice(0, 3)\n//\t\t.map(v => (v / 255).toFixed(4))\n//\t\t.join(\", \");\n//\n//\tlet line = `[${i / 10}, new THREE.Color(${range})],`;\n//\n//\tstops.push(line);\n// }\n// stops.join(\"\\n\");\n//\n//\n//\n// -------------------------------------------\n// to get a ready to use gradient array from matplotlib:\n// -------------------------------------------\n// import matplotlib.pyplot as plt\n// import matplotlib.colors as colors\n//\n// norm = colors.Normalize(vmin=0,vmax=1)\n// cmap = plt.cm.viridis\n//\n// for i in range(0,11):\n//\tu = i / 10\n//\trgb = cmap(norm(u))[0:3]\n//\trgb = [\"{0:.3f}\".format(v) for v in rgb]\n//\trgb = \"[\" + str(u) + \", new THREE.Color(\" + \", \".join(rgb) + \")],\"\n//\tprint(rgb)\n\nlet Gradients = {\n\t// From chroma spectral http://gka.github.io/chroma.js/\n\tSPECTRAL: [\n\t\t[0, new THREE.Color(0.3686, 0.3098, 0.6353)],\n\t\t[0.1, new THREE.Color(0.1961, 0.5333, 0.7412)],\n\t\t[0.2, new THREE.Color(0.4000, 0.7608, 0.6471)],\n\t\t[0.3, new THREE.Color(0.6706, 0.8667, 0.6431)],\n\t\t[0.4, new THREE.Color(0.9020, 0.9608, 0.5961)],\n\t\t[0.5, new THREE.Color(1.0000, 1.0000, 0.7490)],\n\t\t[0.6, new THREE.Color(0.9961, 0.8784, 0.5451)],\n\t\t[0.7, new THREE.Color(0.9922, 0.6824, 0.3804)],\n\t\t[0.8, new THREE.Color(0.9569, 0.4275, 0.2627)],\n\t\t[0.9, new THREE.Color(0.8353, 0.2431, 0.3098)],\n\t\t[1, new THREE.Color(0.6196, 0.0039, 0.2588)]\n\t],\n\tPLASMA: [\n\t\t[0.0, new THREE.Color(0.241, 0.015, 0.610)],\n\t\t[0.1, new THREE.Color(0.387, 0.001, 0.654)],\n\t\t[0.2, new THREE.Color(0.524, 0.025, 0.653)],\n\t\t[0.3, new THREE.Color(0.651, 0.125, 0.596)],\n\t\t[0.4, new THREE.Color(0.752, 0.227, 0.513)],\n\t\t[0.5, new THREE.Color(0.837, 0.329, 0.431)],\n\t\t[0.6, new THREE.Color(0.907, 0.435, 0.353)],\n\t\t[0.7, new THREE.Color(0.963, 0.554, 0.272)],\n\t\t[0.8, new THREE.Color(0.992, 0.681, 0.195)],\n\t\t[0.9, new THREE.Color(0.987, 0.822, 0.144)],\n\t\t[1.0, new THREE.Color(0.940, 0.975, 0.131)]\n\t],\n\tYELLOW_GREEN: [\n\t\t[0, new THREE.Color(0.1647, 0.2824, 0.3451)],\n\t\t[0.1, new THREE.Color(0.1338, 0.3555, 0.4227)],\n\t\t[0.2, new THREE.Color(0.0610, 0.4319, 0.4864)],\n\t\t[0.3, new THREE.Color(0.0000, 0.5099, 0.5319)],\n\t\t[0.4, new THREE.Color(0.0000, 0.5881, 0.5569)],\n\t\t[0.5, new THREE.Color(0.1370, 0.6650, 0.5614)],\n\t\t[0.6, new THREE.Color(0.2906, 0.7395, 0.5477)],\n\t\t[0.7, new THREE.Color(0.4453, 0.8099, 0.5201)],\n\t\t[0.8, new THREE.Color(0.6102, 0.8748, 0.4850)],\n\t\t[0.9, new THREE.Color(0.7883, 0.9323, 0.4514)],\n\t\t[1, new THREE.Color(0.9804, 0.9804, 0.4314)]\n\t],\n\tVIRIDIS: [\n\t\t[0.0, new THREE.Color(0.267, 0.005, 0.329)],\n\t\t[0.1, new THREE.Color(0.283, 0.141, 0.458)],\n\t\t[0.2, new THREE.Color(0.254, 0.265, 0.530)],\n\t\t[0.3, new THREE.Color(0.207, 0.372, 0.553)],\n\t\t[0.4, new THREE.Color(0.164, 0.471, 0.558)],\n\t\t[0.5, new THREE.Color(0.128, 0.567, 0.551)],\n\t\t[0.6, new THREE.Color(0.135, 0.659, 0.518)],\n\t\t[0.7, new THREE.Color(0.267, 0.749, 0.441)],\n\t\t[0.8, new THREE.Color(0.478, 0.821, 0.318)],\n\t\t[0.9, new THREE.Color(0.741, 0.873, 0.150)],\n\t\t[1.0, new THREE.Color(0.993, 0.906, 0.144)]\n\t],\n\tINFERNO: [\n\t\t[0.0, new THREE.Color(0.077, 0.042, 0.206)],\n\t\t[0.1, new THREE.Color(0.225, 0.036, 0.388)],\n\t\t[0.2, new THREE.Color(0.373, 0.074, 0.432)],\n\t\t[0.3, new THREE.Color(0.522, 0.128, 0.420)],\n\t\t[0.4, new THREE.Color(0.665, 0.182, 0.370)],\n\t\t[0.5, new THREE.Color(0.797, 0.255, 0.287)],\n\t\t[0.6, new THREE.Color(0.902, 0.364, 0.184)],\n\t\t[0.7, new THREE.Color(0.969, 0.516, 0.063)],\n\t\t[0.8, new THREE.Color(0.988, 0.683, 0.072)],\n\t\t[0.9, new THREE.Color(0.961, 0.859, 0.298)],\n\t\t[1.0, new THREE.Color(0.988, 0.998, 0.645)]\n\t],\n\tGRAYSCALE: [\n\t\t[0, new THREE.Color(0, 0, 0)],\n\t\t[1, new THREE.Color(1, 1, 1)]\n\t],\n\t// 16 samples of the TURBU color scheme\n\t// values taken from: https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f\n\t// original file licensed under Apache-2.0\n\tTURBO: [\n\t\t[0.00, new THREE.Color(0.18995, 0.07176, 0.23217)],\n\t\t[0.07, new THREE.Color(0.25107, 0.25237, 0.63374)],\n\t\t[0.13, new THREE.Color(0.27628, 0.42118, 0.89123)],\n\t\t[0.20, new THREE.Color(0.25862, 0.57958, 0.99876)],\n\t\t[0.27, new THREE.Color(0.15844, 0.73551, 0.92305)],\n\t\t[0.33, new THREE.Color(0.09267, 0.86554, 0.7623)],\n\t\t[0.40, new THREE.Color(0.19659, 0.94901, 0.59466)],\n\t\t[0.47, new THREE.Color(0.42778, 0.99419, 0.38575)],\n\t\t[0.53, new THREE.Color(0.64362, 0.98999, 0.23356)],\n\t\t[0.60, new THREE.Color(0.80473, 0.92452, 0.20459)],\n\t\t[0.67, new THREE.Color(0.93301, 0.81236, 0.22667)],\n\t\t[0.73, new THREE.Color(0.99314, 0.67408, 0.20348)],\n\t\t[0.80, new THREE.Color(0.9836, 0.49291, 0.12849)],\n\t\t[0.87, new THREE.Color(0.92105, 0.31489, 0.05475)],\n\t\t[0.93, new THREE.Color(0.81608, 0.18462, 0.01809)],\n\t\t[1.00, new THREE.Color(0.66449, 0.08436, 0.00424)],\n\t],\n\tRAINBOW: [\n\t\t[0, new THREE.Color(0.278, 0, 0.714)],\n\t\t[1 / 6, new THREE.Color(0, 0, 1)],\n\t\t[2 / 6, new THREE.Color(0, 1, 1)],\n\t\t[3 / 6, new THREE.Color(0, 1, 0)],\n\t\t[4 / 6, new THREE.Color(1, 1, 0)],\n\t\t[5 / 6, new THREE.Color(1, 0.64, 0)],\n\t\t[1, new THREE.Color(1, 0, 0)]\n\t],\n\tCONTOUR: [\n\t\t[0.00, new THREE.Color(0, 0, 0)],\n\t\t[0.03, new THREE.Color(0, 0, 0)],\n\t\t[0.04, new THREE.Color(1, 1, 1)],\n\t\t[1.00, new THREE.Color(1, 1, 1)]\n\t],\n};\n\n\nexport {Gradients};\n","let Shaders = {};\n\nShaders[\"pointcloud.vs\"] = `\nprecision highp float;\nprecision highp int;\n\n#define max_clip_polygons 8\n#define PI 3.141592653589793\n\nattribute vec3 position;\nattribute vec3 color;\nattribute float intensity;\nattribute float classification;\nattribute float returnNumber;\nattribute float numberOfReturns;\nattribute float pointSourceID;\nattribute vec4 indices;\nattribute float spacing;\nattribute float gpsTime;\nattribute vec3 normal;\nattribute float aExtra;\n\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 uViewInv;\n\nuniform float uScreenWidth;\nuniform float uScreenHeight;\nuniform float fov;\nuniform float near;\nuniform float far;\n\nuniform bool uDebug;\n\nuniform bool uUseOrthographicCamera;\nuniform float uOrthoWidth;\nuniform float uOrthoHeight;\n\n#define CLIPTASK_NONE 0\n#define CLIPTASK_HIGHLIGHT 1\n#define CLIPTASK_SHOW_INSIDE 2\n#define CLIPTASK_SHOW_OUTSIDE 3\n\n#define CLIPMETHOD_INSIDE_ANY 0\n#define CLIPMETHOD_INSIDE_ALL 1\n\nuniform int clipTask;\nuniform int clipMethod;\n#if defined(num_clipboxes) && num_clipboxes > 0\n\tuniform mat4 clipBoxes[num_clipboxes];\n#endif\n\n#if defined(num_clipspheres) && num_clipspheres > 0\n\tuniform mat4 uClipSpheres[num_clipspheres];\n#endif\n\n#if defined(num_clippolygons) && num_clippolygons > 0\n\tuniform int uClipPolygonVCount[num_clippolygons];\n\tuniform vec3 uClipPolygonVertices[num_clippolygons * 8];\n\tuniform mat4 uClipPolygonWVP[num_clippolygons];\n#endif\n\n\nuniform float size;\nuniform float minSize;\nuniform float maxSize;\n\nuniform float uPCIndex;\nuniform float uOctreeSpacing;\nuniform float uNodeSpacing;\nuniform float uOctreeSize;\nuniform vec3 uBBSize;\nuniform float uLevel;\nuniform float uVNStart;\nuniform bool uIsLeafNode;\n\nuniform vec3 uColor;\nuniform float uOpacity;\n\nuniform vec2 elevationRange;\nuniform vec2 intensityRange;\n\nuniform vec2 uFilterReturnNumberRange;\nuniform vec2 uFilterNumberOfReturnsRange;\nuniform vec2 uFilterPointSourceIDClipRange;\nuniform vec2 uFilterGPSTimeClipRange;\nuniform float uGpsScale;\nuniform float uGpsOffset;\n\nuniform vec2 uNormalizedGpsBufferRange;\n\nuniform vec3 uIntensity_gbc;\nuniform vec3 uRGB_gbc;\nuniform vec3 uExtra_gbc;\n\nuniform float uTransition;\nuniform float wRGB;\nuniform float wIntensity;\nuniform float wElevation;\nuniform float wClassification;\nuniform float wReturnNumber;\nuniform float wSourceID;\n\nuniform vec2 uExtraNormalizedRange;\nuniform vec2 uExtraRange;\nuniform float uExtraScale;\nuniform float uExtraOffset;\n\nuniform vec3 uShadowColor;\n\nuniform sampler2D visibleNodes;\nuniform sampler2D gradient;\nuniform sampler2D classificationLUT;\n\n#if defined(color_type_matcap)\nuniform sampler2D matcapTextureUniform;\n#endif\nuniform bool backfaceCulling;\n\n#if defined(num_shadowmaps) && num_shadowmaps > 0\nuniform sampler2D uShadowMap[num_shadowmaps];\nuniform mat4 uShadowWorldView[num_shadowmaps];\nuniform mat4 uShadowProj[num_shadowmaps];\n#endif\n\nvarying vec3\tvColor;\nvarying float\tvLogDepth;\nvarying vec3\tvViewPosition;\nvarying float \tvRadius;\nvarying float \tvPointSize;\n\n\nfloat round(float number){\n\treturn floor(number + 0.5);\n}\n\n// \n// ### ######## ### ######## ######## #### ## ## ######## ###### #### ######## ######## ###### \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## ######## ## ## ## ## ###### ###### ## ## ###### ###### \n// ######### ## ## ######### ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ######## ## ## ## ## #### ### ######## ###### #### ######## ######## ###### \n// \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n// ---------------------\n// OCTREE\n// ---------------------\n\n#if (defined(adaptive_point_size) || defined(color_type_level_of_detail)) && defined(tree_type_octree)\n/**\n * number of 1-bits up to inclusive index position\n * number is treated as if it were an integer in the range 0-255\n *\n */\nint numberOfOnes(int number, int index){\n\tint numOnes = 0;\n\tint tmp = 128;\n\tfor(int i = 7; i >= 0; i--){\n\t\t\n\t\tif(number >= tmp){\n\t\t\tnumber = number - tmp;\n\n\t\t\tif(i <= index){\n\t\t\t\tnumOnes++;\n\t\t\t}\n\t\t}\n\t\t\n\t\ttmp = tmp / 2;\n\t}\n\n\treturn numOnes;\n}\n\n\n/**\n * checks whether the bit at index is 1\n * number is treated as if it were an integer in the range 0-255\n *\n */\nbool isBitSet(int number, int index){\n\n\t// weird multi else if due to lack of proper array, int and bitwise support in WebGL 1.0\n\tint powi = 1;\n\tif(index == 0){\n\t\tpowi = 1;\n\t}else if(index == 1){\n\t\tpowi = 2;\n\t}else if(index == 2){\n\t\tpowi = 4;\n\t}else if(index == 3){\n\t\tpowi = 8;\n\t}else if(index == 4){\n\t\tpowi = 16;\n\t}else if(index == 5){\n\t\tpowi = 32;\n\t}else if(index == 6){\n\t\tpowi = 64;\n\t}else if(index == 7){\n\t\tpowi = 128;\n\t}else{\n\t\treturn false;\n\t}\n\n\tint ndp = number / powi;\n\n\treturn mod(float(ndp), 2.0) != 0.0;\n}\n\n\n/**\n * find the LOD at the point position\n */\nfloat getLOD(){\n\t\n\tvec3 offset = vec3(0.0, 0.0, 0.0);\n\tint iOffset = int(uVNStart);\n\tfloat depth = uLevel;\n\tfor(float i = 0.0; i <= 30.0; i++){\n\t\tfloat nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0);\n\t\t\n\t\tvec3 index3d = (position-offset) / nodeSizeAtLevel;\n\t\tindex3d = floor(index3d + 0.5);\n\t\tint index = int(round(4.0 * index3d.x + 2.0 * index3d.y + index3d.z));\n\t\t\n\t\tvec4 value = texture2D(visibleNodes, vec2(float(iOffset) / 2048.0, 0.0));\n\t\tint mask = int(round(value.r * 255.0));\n\n\t\tif(isBitSet(mask, index)){\n\t\t\t// there are more visible child nodes at this position\n\t\t\tint advanceG = int(round(value.g * 255.0)) * 256;\n\t\t\tint advanceB = int(round(value.b * 255.0));\n\t\t\tint advanceChild = numberOfOnes(mask, index - 1);\n\t\t\tint advance = advanceG + advanceB + advanceChild;\n\n\t\t\tiOffset = iOffset + advance;\n\t\t\t\n\t\t\tdepth++;\n\t\t}else{\n\t\t\t// no more visible child nodes at this position\n\t\t\t//return value.a * 255.0;\n\n\t\t\tfloat lodOffset = (255.0 * value.a) / 10.0 - 10.0;\n\n\t\t\treturn depth + lodOffset;\n\t\t}\n\t\t\n\t\toffset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d;\n\t}\n\t\t\n\treturn depth;\n}\n\nfloat getSpacing(){\n\tvec3 offset = vec3(0.0, 0.0, 0.0);\n\tint iOffset = int(uVNStart);\n\tfloat depth = uLevel;\n\tfloat spacing = uNodeSpacing;\n\tfor(float i = 0.0; i <= 30.0; i++){\n\t\tfloat nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0);\n\t\t\n\t\tvec3 index3d = (position-offset) / nodeSizeAtLevel;\n\t\tindex3d = floor(index3d + 0.5);\n\t\tint index = int(round(4.0 * index3d.x + 2.0 * index3d.y + index3d.z));\n\t\t\n\t\tvec4 value = texture2D(visibleNodes, vec2(float(iOffset) / 2048.0, 0.0));\n\t\tint mask = int(round(value.r * 255.0));\n\t\tfloat spacingFactor = value.a;\n\n\t\tif(i > 0.0){\n\t\t\tspacing = spacing / (255.0 * spacingFactor);\n\t\t}\n\t\t\n\n\t\tif(isBitSet(mask, index)){\n\t\t\t// there are more visible child nodes at this position\n\t\t\tint advanceG = int(round(value.g * 255.0)) * 256;\n\t\t\tint advanceB = int(round(value.b * 255.0));\n\t\t\tint advanceChild = numberOfOnes(mask, index - 1);\n\t\t\tint advance = advanceG + advanceB + advanceChild;\n\n\t\t\tiOffset = iOffset + advance;\n\n\t\t\t//spacing = spacing / (255.0 * spacingFactor);\n\t\t\t//spacing = spacing / 3.0;\n\t\t\t\n\t\t\tdepth++;\n\t\t}else{\n\t\t\t// no more visible child nodes at this position\n\t\t\treturn spacing;\n\t\t}\n\t\t\n\t\toffset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d;\n\t}\n\t\t\n\treturn spacing;\n}\n\nfloat getPointSizeAttenuation(){\n\treturn pow(2.0, getLOD());\n}\n\n\n#endif\n\n\n// ---------------------\n// KD-TREE\n// ---------------------\n\n#if (defined(adaptive_point_size) || defined(color_type_level_of_detail)) && defined(tree_type_kdtree)\n\nfloat getLOD(){\n\tvec3 offset = vec3(0.0, 0.0, 0.0);\n\tfloat iOffset = 0.0;\n\tfloat depth = 0.0;\n\t\t\n\t\t\n\tvec3 size = uBBSize;\t\n\tvec3 pos = position;\n\t\t\n\tfor(float i = 0.0; i <= 1000.0; i++){\n\t\t\n\t\tvec4 value = texture2D(visibleNodes, vec2(iOffset / 2048.0, 0.0));\n\t\t\n\t\tint children = int(value.r * 255.0);\n\t\tfloat next = value.g * 255.0;\n\t\tint split = int(value.b * 255.0);\n\t\t\n\t\tif(next == 0.0){\n\t\t \treturn depth;\n\t\t}\n\t\t\n\t\tvec3 splitv = vec3(0.0, 0.0, 0.0);\n\t\tif(split == 1){\n\t\t\tsplitv.x = 1.0;\n\t\t}else if(split == 2){\n\t\t \tsplitv.y = 1.0;\n\t\t}else if(split == 4){\n\t\t \tsplitv.z = 1.0;\n\t\t}\n\t\t\n\t\tiOffset = iOffset + next;\n\t\t\n\t\tfloat factor = length(pos * splitv / size);\n\t\tif(factor < 0.5){\n\t\t\t// left\n\t\tif(children == 0 || children == 2){\n\t\t\t\treturn depth;\n\t\t\t}\n\t\t}else{\n\t\t\t// right\n\t\t\tpos = pos - size * splitv * 0.5;\n\t\t\tif(children == 0 || children == 1){\n\t\t\t\treturn depth;\n\t\t\t}\n\t\t\tif(children == 3){\n\t\t\t\tiOffset = iOffset + 1.0;\n\t\t\t}\n\t\t}\n\t\tsize = size * ((1.0 - (splitv + 1.0) / 2.0) + 0.5);\n\t\t\n\t\tdepth++;\n\t}\n\t\t\n\t\t\n\treturn depth;\t\n}\n\nfloat getPointSizeAttenuation(){\n\treturn 0.5 * pow(1.3, getLOD());\n}\n\n#endif\n\n\n\n// \n// ### ######## ######## ######## #### ######## ## ## ######## ######## ###### \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ######## ## ######## ## ## ## ###### ###### \n// ######### ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## #### ######## ####### ## ######## ###### \n// \n\n\n\n// formula adapted from: http://www.dfstudios.co.uk/articles/programming/image-programming-algorithms/image-processing-algorithms-part-5-contrast-adjustment/\nfloat getContrastFactor(float contrast){\n\treturn (1.0158730158730156 * (contrast + 1.0)) / (1.0158730158730156 - contrast);\n}\n\nvec3 getRGB(){\n\tvec3 rgb = color;\n\t\n\trgb = pow(rgb, vec3(uRGB_gbc.x));\n\trgb = rgb + uRGB_gbc.y;\n\trgb = (rgb - 0.5) * getContrastFactor(uRGB_gbc.z) + 0.5;\n\trgb = clamp(rgb, 0.0, 1.0);\n\n\treturn rgb;\n}\n\nfloat getIntensity(){\n\tfloat w = (intensity - intensityRange.x) / (intensityRange.y - intensityRange.x);\n\tw = pow(w, uIntensity_gbc.x);\n\tw = w + uIntensity_gbc.y;\n\tw = (w - 0.5) * getContrastFactor(uIntensity_gbc.z) + 0.5;\n\tw = clamp(w, 0.0, 1.0);\n\n\treturn w;\n}\n\nvec3 getGpsTime(){\n\n\tfloat w = (gpsTime + uGpsOffset) * uGpsScale;\n\n\n\tvec3 c = texture2D(gradient, vec2(w, 1.0 - w)).rgb;\n\n\n\t// vec2 r = uNormalizedGpsBufferRange;\n\t// float w = gpsTime * (r.y - r.x) + r.x;\n\t// w = clamp(w, 0.0, 1.0);\n\t// vec3 c = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\t\n\treturn c;\n}\n\nvec3 getElevation(){\n\tvec4 world = modelMatrix * vec4( position, 1.0 );\n\tfloat w = (world.z - elevationRange.x) / (elevationRange.y - elevationRange.x);\n\tvec3 cElevation = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\t\n\treturn cElevation;\n}\n\nvec4 getClassification(){\n\tvec2 uv = vec2(classification / 255.0, 0.5);\n\tvec4 classColor = texture2D(classificationLUT, uv);\n\t\n\treturn classColor;\n}\n\nvec3 getReturns(){\n\n\t// 0b 00_000_111\n\tfloat rn = mod(returnNumber, 8.0);\n\t// 0b 00_111_000\n\tfloat nr = mod(returnNumber / 8.0, 8.0);\n\n\tif(nr <= 1.0){\n\t\treturn vec3(1.0, 0.0, 0.0);\n\t}else{\n\t\treturn vec3(0.0, 1.0, 0.0);\n\t}\n\n\t// return vec3(nr / 4.0, 0.0, 0.0);\n\n\t// if(nr == 1.0){\n\t// \treturn vec3(1.0, 1.0, 0.0);\n\t// }else{\n\t// \tif(rn == 1.0){\n\t// \t\treturn vec3(1.0, 0.0, 0.0);\n\t// \t}else if(rn == nr){\n\t// \t\treturn vec3(0.0, 0.0, 1.0);\n\t// \t}else{\n\t// \t\treturn vec3(0.0, 1.0, 0.0);\n\t// \t}\n\t// }\n\n\t// if(numberOfReturns == 1.0){\n\t// \treturn vec3(1.0, 1.0, 0.0);\n\t// }else{\n\t// \tif(returnNumber == 1.0){\n\t// \t\treturn vec3(1.0, 0.0, 0.0);\n\t// \t}else if(returnNumber == numberOfReturns){\n\t// \t\treturn vec3(0.0, 0.0, 1.0);\n\t// \t}else{\n\t// \t\treturn vec3(0.0, 1.0, 0.0);\n\t// \t}\n\t// }\n}\n\nvec3 getReturnNumber(){\n\tif(numberOfReturns == 1.0){\n\t\treturn vec3(1.0, 1.0, 0.0);\n\t}else{\n\t\tif(returnNumber == 1.0){\n\t\t\treturn vec3(1.0, 0.0, 0.0);\n\t\t}else if(returnNumber == numberOfReturns){\n\t\t\treturn vec3(0.0, 0.0, 1.0);\n\t\t}else{\n\t\t\treturn vec3(0.0, 1.0, 0.0);\n\t\t}\n\t}\n}\n\nvec3 getNumberOfReturns(){\n\tfloat value = numberOfReturns;\n\n\tfloat w = value / 6.0;\n\n\tvec3 color = texture2D(gradient, vec2(w, 1.0 - w)).rgb;\n\n\treturn color;\n}\n\nvec3 getSourceID(){\n\tfloat w = mod(pointSourceID, 10.0) / 10.0;\n\treturn texture2D(gradient, vec2(w,1.0 - w)).rgb;\n}\n\nvec3 getCompositeColor(){\n\tvec3 c;\n\tfloat w;\n\n\tc += wRGB * getRGB();\n\tw += wRGB;\n\t\n\tc += wIntensity * getIntensity() * vec3(1.0, 1.0, 1.0);\n\tw += wIntensity;\n\t\n\tc += wElevation * getElevation();\n\tw += wElevation;\n\t\n\tc += wReturnNumber * getReturnNumber();\n\tw += wReturnNumber;\n\t\n\tc += wSourceID * getSourceID();\n\tw += wSourceID;\n\t\n\tvec4 cl = wClassification * getClassification();\n\tc += cl.a * cl.rgb;\n\tw += wClassification * cl.a;\n\n\tc = c / w;\n\t\n\tif(w == 0.0){\n\t\t//c = color;\n\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t}\n\t\n\treturn c;\n}\n\n\nvec3 getNormal(){\n\t//vec3 n_hsv = vec3( modelMatrix * vec4( normal, 0.0 )) * 0.5 + 0.5; // (n_world.xyz + vec3(1.,1.,1.)) / 2.;\n\tvec3 n_view = normalize( vec3(modelViewMatrix * vec4( normal, 0.0 )) );\n\treturn n_view;\n}\nbool applyBackfaceCulling() {\n\t// Black not facing vertices / Backface culling\n\tvec3 e = normalize(vec3(modelViewMatrix * vec4( position, 1. )));\n\tvec3 n = getNormal(); // normalize( vec3(modelViewMatrix * vec4( normal, 0.0 )) );\n\n\tif((uUseOrthographicCamera && n.z <= 0.) || (!uUseOrthographicCamera && dot( n, e ) >= 0.)) { \n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\n#if defined(color_type_matcap)\n// Matcap Material\nvec3 getMatcap(){ \n\tvec3 eye = normalize( vec3( modelViewMatrix * vec4( position, 1. ) ) ); \n\tif(uUseOrthographicCamera) { \n\t\teye = vec3(0., 0., -1.);\n\t}\n\tvec3 r_en = reflect( eye, getNormal() ); // or r_en = e - 2. * dot( n, e ) * n;\n\tfloat m = 2. * sqrt(pow( r_en.x, 2. ) + pow( r_en.y, 2. ) + pow( r_en.z + 1., 2. ));\n\tvec2 vN = r_en.xy / m + .5;\n\treturn texture2D(matcapTextureUniform, vN).rgb; \n}\n#endif\n\nvec3 getExtra(){\n\n\tfloat w = (aExtra + uExtraOffset) * uExtraScale;\n\tw = clamp(w, 0.0, 1.0);\n\n\tvec3 color = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\n\t// vec2 r = uExtraNormalizedRange;\n\n\t// float w = aExtra * (r.y - r.x) + r.x;\n\n\t// w = (w - uExtraRange.x) / (uExtraRange.y - uExtraRange.x);\n\n\t// w = clamp(w, 0.0, 1.0);\n\n\t// vec3 color = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\n\treturn color;\n}\n\nvec3 getColor(){\n\tvec3 color;\n\t\n\t#ifdef color_type_rgba\n\t\tcolor = getRGB();\n\t#elif defined color_type_height || defined color_type_elevation\n\t\tcolor = getElevation();\n\t#elif defined color_type_rgb_height\n\t\tvec3 cHeight = getElevation();\n\t\tcolor = (1.0 - uTransition) * getRGB() + uTransition * cHeight;\n\t#elif defined color_type_depth\n\t\tfloat linearDepth = gl_Position.w;\n\t\tfloat expDepth = (gl_Position.z / gl_Position.w) * 0.5 + 0.5;\n\t\tcolor = vec3(linearDepth, expDepth, 0.0);\n\t\t//color = vec3(1.0, 0.5, 0.3);\n\t#elif defined color_type_intensity\n\t\tfloat w = getIntensity();\n\t\tcolor = vec3(w, w, w);\n\t#elif defined color_type_gps_time\n\t\tcolor = getGpsTime();\n\t#elif defined color_type_intensity_gradient\n\t\tfloat w = getIntensity();\n\t\tcolor = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\t#elif defined color_type_color\n\t\tcolor = uColor;\n\t#elif defined color_type_level_of_detail\n\t\tfloat depth = getLOD();\n\t\tfloat w = depth / 10.0;\n\t\tcolor = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\t#elif defined color_type_indices\n\t\tcolor = indices.rgb;\n\t#elif defined color_type_classification\n\t\tvec4 cl = getClassification(); \n\t\tcolor = cl.rgb;\n\t#elif defined color_type_return_number\n\t\tcolor = getReturnNumber();\n\t#elif defined color_type_returns\n\t\tcolor = getReturns();\n\t#elif defined color_type_number_of_returns\n\t\tcolor = getNumberOfReturns();\n\t#elif defined color_type_source_id\n\t\tcolor = getSourceID();\n\t#elif defined color_type_point_source_id\n\t\tcolor = getSourceID();\n\t#elif defined color_type_normal\n\t\tcolor = (modelMatrix * vec4(normal, 0.0)).xyz;\n\t#elif defined color_type_phong\n\t\tcolor = color;\n\t#elif defined color_type_composite\n\t\tcolor = getCompositeColor();\n\t#elif defined color_type_matcap\n\t\tcolor = getMatcap();\n\t#else \n\t\tcolor = getExtra();\n\t#endif\n\t\n\tif (backfaceCulling && applyBackfaceCulling()) {\n\t\tcolor = vec3(0.);\n\t}\n\n\treturn color;\n}\n\nfloat getPointSize(){\n\tfloat pointSize = 1.0;\n\t\n\tfloat slope = tan(fov / 2.0);\n\tfloat projFactor = -0.5 * uScreenHeight / (slope * vViewPosition.z);\n\t\n\tfloat r = uOctreeSpacing * 1.7;\n\tvRadius = r;\n\t#if defined fixed_point_size\n\t\tpointSize = size;\n\t#elif defined attenuated_point_size\n\t\tif(uUseOrthographicCamera){\n\t\t\tpointSize = size;\n\t\t}else{\n\t\t\tpointSize = size * spacing * projFactor;\n\t\t\t//pointSize = pointSize * projFactor;\n\t\t}\n\t#elif defined adaptive_point_size\n\t\tif(uUseOrthographicCamera) {\n\t\t\tfloat worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation();\n\t\t\tpointSize = (worldSpaceSize / uOrthoWidth) * uScreenWidth;\n\t\t} else {\n\n\t\t\t// float leafSpacing = 0.122069092 * 8.0;\n\t\t\t\n\t\t\t// bool isLeafNode = getLOD() == 1000.0;\n\t\t\t// if(isLeafNode){\n\t\t\t// \t// pointSize = size * spacing * projFactor;\n\n\t\t\t// \tfloat worldSpaceSize = size * leafSpacing;\n\t\t\t// \tpointSize = worldSpaceSize * projFactor;\n\t\t\t// }else{\n\t\t\t\tfloat worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation();\n\n\t\t\t\t// minimum world space size\n\t\t\t\t// worldSpaceSize = max(worldSpaceSize, leafSpacing);\n\n\t\t\t\tpointSize = worldSpaceSize * projFactor;\n\t\t\t// }\n\t\t}\n\t#endif\n\n\tpointSize = max(minSize, pointSize);\n\tpointSize = min(maxSize, pointSize);\n\t\n\tvRadius = pointSize / projFactor;\n\n\treturn pointSize;\n}\n\n#if defined(num_clippolygons) && num_clippolygons > 0\nbool pointInClipPolygon(vec3 point, int polyIdx) {\n\n\tmat4 wvp = uClipPolygonWVP[polyIdx];\n\t//vec4 screenClipPos = uClipPolygonVP[polyIdx] * modelMatrix * vec4(point, 1.0);\n\t//screenClipPos.xy = screenClipPos.xy / screenClipPos.w * 0.5 + 0.5;\n\n\tvec4 pointNDC = wvp * vec4(point, 1.0);\n\tpointNDC.xy = pointNDC.xy / pointNDC.w;\n\n\tint j = uClipPolygonVCount[polyIdx] - 1;\n\tbool c = false;\n\tfor(int i = 0; i < 8; i++) {\n\t\tif(i == uClipPolygonVCount[polyIdx]) {\n\t\t\tbreak;\n\t\t}\n\n\t\t//vec4 verti = wvp * vec4(uClipPolygonVertices[polyIdx * 8 + i], 1);\n\t\t//vec4 vertj = wvp * vec4(uClipPolygonVertices[polyIdx * 8 + j], 1);\n\n\t\t//verti.xy = verti.xy / verti.w;\n\t\t//vertj.xy = vertj.xy / vertj.w;\n\n\t\t//verti.xy = verti.xy / verti.w * 0.5 + 0.5;\n\t\t//vertj.xy = vertj.xy / vertj.w * 0.5 + 0.5;\n\n\t\tvec3 verti = uClipPolygonVertices[polyIdx * 8 + i];\n\t\tvec3 vertj = uClipPolygonVertices[polyIdx * 8 + j];\n\n\t\tif( ((verti.y > pointNDC.y) != (vertj.y > pointNDC.y)) && \n\t\t\t(pointNDC.x < (vertj.x-verti.x) * (pointNDC.y-verti.y) / (vertj.y-verti.y) + verti.x) ) {\n\t\t\tc = !c;\n\t\t}\n\t\tj = i;\n\t}\n\n\treturn c;\n}\n#endif\n\nvoid doClipping(){\n\n\t{\n\t\tvec4 cl = getClassification(); \n\t\tif(cl.a == 0.0){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\n\t#if defined(clip_return_number_enabled)\n\t{ // return number filter\n\t\tvec2 range = uFilterReturnNumberRange;\n\t\tif(returnNumber < range.x || returnNumber > range.y){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\t#endif\n\n\t#if defined(clip_number_of_returns_enabled)\n\t{ // number of return filter\n\t\tvec2 range = uFilterNumberOfReturnsRange;\n\t\tif(numberOfReturns < range.x || numberOfReturns > range.y){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\t#endif\n\n\t#if defined(clip_gps_enabled)\n\t{ // GPS time filter\n\t\tfloat time = (gpsTime + uGpsOffset) * uGpsScale;\n\t\tvec2 range = uFilterGPSTimeClipRange;\n\n\t\tif(time < range.x || time > range.y){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\t#endif\n\n\t#if defined(clip_point_source_id_enabled)\n\t{ // point source id filter\n\t\tvec2 range = uFilterPointSourceIDClipRange;\n\t\tif(pointSourceID < range.x || pointSourceID > range.y){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\t#endif\n\n\tint clipVolumesCount = 0;\n\tint insideCount = 0;\n\n\t#if defined(num_clipboxes) && num_clipboxes > 0\n\t\tfor(int i = 0; i < num_clipboxes; i++){\n\t\t\tvec4 clipPosition = clipBoxes[i] * modelMatrix * vec4( position, 1.0 );\n\t\t\tbool inside = -0.5 <= clipPosition.x && clipPosition.x <= 0.5;\n\t\t\tinside = inside && -0.5 <= clipPosition.y && clipPosition.y <= 0.5;\n\t\t\tinside = inside && -0.5 <= clipPosition.z && clipPosition.z <= 0.5;\n\n\t\t\tinsideCount = insideCount + (inside ? 1 : 0);\n\t\t\tclipVolumesCount++;\n\t\t}\t\n\t#endif\n\n\t#if defined(num_clippolygons) && num_clippolygons > 0\n\t\tfor(int i = 0; i < num_clippolygons; i++) {\n\t\t\tbool inside = pointInClipPolygon(position, i);\n\n\t\t\tinsideCount = insideCount + (inside ? 1 : 0);\n\t\t\tclipVolumesCount++;\n\t\t}\n\t#endif\n\n\tbool insideAny = insideCount > 0;\n\tbool insideAll = (clipVolumesCount > 0) && (clipVolumesCount == insideCount);\n\n\tif(clipMethod == CLIPMETHOD_INSIDE_ANY){\n\t\tif(insideAny && clipTask == CLIPTASK_HIGHLIGHT){\n\t\t\tvColor.r += 0.5;\n\t\t}else if(!insideAny && clipTask == CLIPTASK_SHOW_INSIDE){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 1.0);\n\t\t}else if(insideAny && clipTask == CLIPTASK_SHOW_OUTSIDE){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 1.0);\n\t\t}\n\t}else if(clipMethod == CLIPMETHOD_INSIDE_ALL){\n\t\tif(insideAll && clipTask == CLIPTASK_HIGHLIGHT){\n\t\t\tvColor.r += 0.5;\n\t\t}else if(!insideAll && clipTask == CLIPTASK_SHOW_INSIDE){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 1.0);\n\t\t}else if(insideAll && clipTask == CLIPTASK_SHOW_OUTSIDE){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 1.0);\n\t\t}\n\t}\n}\n\n\n\n// \n// ## ## ### #### ## ## \n// ### ### ## ## ## ### ## \n// #### #### ## ## ## #### ## \n// ## ### ## ## ## ## ## ## ## \n// ## ## ######### ## ## #### \n// ## ## ## ## ## ## ### \n// ## ## ## ## #### ## ## \n//\n\nvoid main() {\n\tvec4 mvPosition = modelViewMatrix * vec4(position, 1.0 );\n\tvViewPosition = mvPosition.xyz;\n\tgl_Position = projectionMatrix * mvPosition;\n\tvLogDepth = log2(-mvPosition.z);\n\n\t// POINT SIZE\n\tfloat pointSize = getPointSize();\n\tgl_PointSize = pointSize;\n\tvPointSize = pointSize;\n\n\t// COLOR\n\tvColor = getColor();\n\n\t//gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n\t//gl_Position = vec4(position.xzy / 1000.0, 1.0 );\n\n\t//gl_PointSize = 5.0;\n\t//vColor = vec3(1.0, 1.0, 1.0);\n\n\t// only for \"replacing\" approaches\n\t// if(getLOD() != uLevel){\n\t// \tgl_Position = vec4(10.0, 10.0, 10.0, 1.0);\n\t// }\n\n\n\t#if defined hq_depth_pass\n\t\tfloat originalDepth = gl_Position.w;\n\t\tfloat adjustedDepth = originalDepth + 2.0 * vRadius;\n\t\tfloat adjust = adjustedDepth / originalDepth;\n\n\t\tmvPosition.xyz = mvPosition.xyz * adjust;\n\t\tgl_Position = projectionMatrix * mvPosition;\n\t#endif\n\n\n\t// CLIPPING\n\tdoClipping();\n\n\t#if defined(num_clipspheres) && num_clipspheres > 0\n\t\tfor(int i = 0; i < num_clipspheres; i++){\n\t\t\tvec4 sphereLocal = uClipSpheres[i] * mvPosition;\n\n\t\t\tfloat distance = length(sphereLocal.xyz);\n\n\t\t\tif(distance < 1.0){\n\t\t\t\tfloat w = distance;\n\t\t\t\tvec3 cGradient = texture2D(gradient, vec2(w, 1.0 - w)).rgb;\n\t\t\t\t\n\t\t\t\tvColor = cGradient;\n\t\t\t\t//vColor = cGradient * 0.7 + vColor * 0.3;\n\t\t\t}\n\t\t}\n\t#endif\n\n\t#if defined(num_shadowmaps) && num_shadowmaps > 0\n\n\t\tconst float sm_near = 0.1;\n\t\tconst float sm_far = 10000.0;\n\n\t\tfor(int i = 0; i < num_shadowmaps; i++){\n\t\t\tvec3 viewPos = (uShadowWorldView[i] * vec4(position, 1.0)).xyz;\n\t\t\tfloat distanceToLight = abs(viewPos.z);\n\t\t\t\n\t\t\tvec4 projPos = uShadowProj[i] * uShadowWorldView[i] * vec4(position, 1);\n\t\t\tvec3 nc = projPos.xyz / projPos.w;\n\t\t\t\n\t\t\tfloat u = nc.x * 0.5 + 0.5;\n\t\t\tfloat v = nc.y * 0.5 + 0.5;\n\n\t\t\tvec2 sampleStep = vec2(1.0 / (2.0*1024.0), 1.0 / (2.0*1024.0)) * 1.5;\n\t\t\tvec2 sampleLocations[9];\n\t\t\tsampleLocations[0] = vec2(0.0, 0.0);\n\t\t\tsampleLocations[1] = sampleStep;\n\t\t\tsampleLocations[2] = -sampleStep;\n\t\t\tsampleLocations[3] = vec2(sampleStep.x, -sampleStep.y);\n\t\t\tsampleLocations[4] = vec2(-sampleStep.x, sampleStep.y);\n\n\t\t\tsampleLocations[5] = vec2(0.0, sampleStep.y);\n\t\t\tsampleLocations[6] = vec2(0.0, -sampleStep.y);\n\t\t\tsampleLocations[7] = vec2(sampleStep.x, 0.0);\n\t\t\tsampleLocations[8] = vec2(-sampleStep.x, 0.0);\n\n\t\t\tfloat visibleSamples = 0.0;\n\t\t\tfloat numSamples = 0.0;\n\n\t\t\tfloat bias = vRadius * 2.0;\n\n\t\t\tfor(int j = 0; j < 9; j++){\n\t\t\t\tvec4 depthMapValue = texture2D(uShadowMap[i], vec2(u, v) + sampleLocations[j]);\n\n\t\t\t\tfloat linearDepthFromSM = depthMapValue.x + bias;\n\t\t\t\tfloat linearDepthFromViewer = distanceToLight;\n\n\t\t\t\tif(linearDepthFromSM > linearDepthFromViewer){\n\t\t\t\t\tvisibleSamples += 1.0;\n\t\t\t\t}\n\n\t\t\t\tnumSamples += 1.0;\n\t\t\t}\n\n\t\t\tfloat visibility = visibleSamples / numSamples;\n\n\t\t\tif(u < 0.0 || u > 1.0 || v < 0.0 || v > 1.0 || nc.x < -1.0 || nc.x > 1.0 || nc.y < -1.0 || nc.y > 1.0 || nc.z < -1.0 || nc.z > 1.0){\n\t\t\t\t//vColor = vec3(0.0, 0.0, 0.2);\n\t\t\t}else{\n\t\t\t\t//vColor = vec3(1.0, 1.0, 1.0) * visibility + vec3(1.0, 1.0, 1.0) * vec3(0.5, 0.0, 0.0) * (1.0 - visibility);\n\t\t\t\tvColor = vColor * visibility + vColor * uShadowColor * (1.0 - visibility);\n\t\t\t}\n\n\n\t\t}\n\n\t#endif\n}\n`\n\nShaders[\"pointcloud.fs\"] = `\n#if defined paraboloid_point_shape\n\t#extension GL_EXT_frag_depth : enable\n#endif\n\nprecision highp float;\nprecision highp int;\n\nuniform mat4 viewMatrix;\nuniform mat4 uViewInv;\nuniform mat4 uProjInv;\nuniform vec3 cameraPosition;\n\n\nuniform mat4 projectionMatrix;\nuniform float uOpacity;\n\nuniform float blendHardness;\nuniform float blendDepthSupplement;\nuniform float fov;\nuniform float uSpacing;\nuniform float near;\nuniform float far;\nuniform float uPCIndex;\nuniform float uScreenWidth;\nuniform float uScreenHeight;\n\nvarying vec3\tvColor;\nvarying float\tvLogDepth;\nvarying vec3\tvViewPosition;\nvarying float\tvRadius;\nvarying float \tvPointSize;\nvarying vec3 \tvPosition;\n\n\nfloat specularStrength = 1.0;\n\nvoid main() {\n\n\tvec3 color = vColor;\n\tfloat depth = gl_FragCoord.z;\n\n\t#if defined(circle_point_shape) || defined(paraboloid_point_shape) \n\t\tfloat u = 2.0 * gl_PointCoord.x - 1.0;\n\t\tfloat v = 2.0 * gl_PointCoord.y - 1.0;\n\t#endif\n\t\n\t#if defined(circle_point_shape) \n\t\tfloat cc = u*u + v*v;\n\t\tif(cc > 1.0){\n\t\t\tdiscard;\n\t\t}\n\t#endif\n\t\t\n\t#if defined color_type_indices\n\t\tgl_FragColor = vec4(color, uPCIndex / 255.0);\n\t#else\n\t\tgl_FragColor = vec4(color, uOpacity);\n\t#endif\n\n\t#if defined paraboloid_point_shape\n\t\tfloat wi = 0.0 - ( u*u + v*v);\n\t\tvec4 pos = vec4(vViewPosition, 1.0);\n\t\tpos.z += wi * vRadius;\n\t\tfloat linearDepth = -pos.z;\n\t\tpos = projectionMatrix * pos;\n\t\tpos = pos / pos.w;\n\t\tfloat expDepth = pos.z;\n\t\tdepth = (pos.z + 1.0) / 2.0;\n\t\tgl_FragDepthEXT = depth;\n\t\t\n\t\t#if defined(color_type_depth)\n\t\t\tcolor.r = linearDepth;\n\t\t\tcolor.g = expDepth;\n\t\t#endif\n\t\t\n\t\t#if defined(use_edl)\n\t\t\tgl_FragColor.a = log2(linearDepth);\n\t\t#endif\n\t\t\n\t#else\n\t\t#if defined(use_edl)\n\t\t\tgl_FragColor.a = vLogDepth;\n\t\t#endif\n\t#endif\n\n\t#if defined(weighted_splats)\n\t\tfloat distance = 2.0 * length(gl_PointCoord.xy - 0.5);\n\t\tfloat weight = max(0.0, 1.0 - distance);\n\t\tweight = pow(weight, 1.5);\n\n\t\tgl_FragColor.a = weight;\n\t\tgl_FragColor.xyz = gl_FragColor.xyz * weight;\n\t#endif\n\n\t//gl_FragColor = vec4(0.0, 0.7, 0.0, 1.0);\n\t\n}\n\n\n`\n\nShaders[\"pointcloud_sm.vs\"] = `\nprecision mediump float;\nprecision mediump int;\n\nattribute vec3 position;\nattribute vec3 color;\n\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\n\nuniform float uScreenWidth;\nuniform float uScreenHeight;\nuniform float near;\nuniform float far;\n\nuniform float uSpacing;\nuniform float uOctreeSize;\nuniform float uLevel;\nuniform float uVNStart;\n\nuniform sampler2D visibleNodes;\n\nvarying float vLinearDepth;\nvarying vec3 vColor;\n\n#define PI 3.141592653589793\n\n\n\n// ---------------------\n// OCTREE\n// ---------------------\n\n#if defined(adaptive_point_size)\n/**\n * number of 1-bits up to inclusive index position\n * number is treated as if it were an integer in the range 0-255\n *\n */\nfloat numberOfOnes(float number, float index){\n\tfloat tmp = mod(number, pow(2.0, index + 1.0));\n\tfloat numOnes = 0.0;\n\tfor(float i = 0.0; i < 8.0; i++){\n\t\tif(mod(tmp, 2.0) != 0.0){\n\t\t\tnumOnes++;\n\t\t}\n\t\ttmp = floor(tmp / 2.0);\n\t}\n\treturn numOnes;\n}\n\n\n/**\n * checks whether the bit at index is 1\n * number is treated as if it were an integer in the range 0-255\n *\n */\nbool isBitSet(float number, float index){\n\treturn mod(floor(number / pow(2.0, index)), 2.0) != 0.0;\n}\n\n\n/**\n * find the LOD at the point position\n */\nfloat getLOD(){\n\t\n\tvec3 offset = vec3(0.0, 0.0, 0.0);\n\tfloat iOffset = uVNStart;\n\tfloat depth = uLevel;\n\tfor(float i = 0.0; i <= 30.0; i++){\n\t\tfloat nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0);\n\t\t\n\t\tvec3 index3d = (position-offset) / nodeSizeAtLevel;\n\t\tindex3d = floor(index3d + 0.5);\n\t\tfloat index = 4.0 * index3d.x + 2.0 * index3d.y + index3d.z;\n\t\t\n\t\tvec4 value = texture2D(visibleNodes, vec2(iOffset / 2048.0, 0.0));\n\t\tfloat mask = value.r * 255.0;\n\t\tif(isBitSet(mask, index)){\n\t\t\t// there are more visible child nodes at this position\n\t\t\tiOffset = iOffset + value.g * 255.0 * 256.0 + value.b * 255.0 + numberOfOnes(mask, index - 1.0);\n\t\t\tdepth++;\n\t\t}else{\n\t\t\t// no more visible child nodes at this position\n\t\t\treturn depth;\n\t\t}\n\t\t\n\t\toffset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d;\n\t}\n\t\t\n\treturn depth;\n}\n\n#endif\n\nfloat getPointSize(){\n\tfloat pointSize = 1.0;\n\t\n\tfloat slope = tan(fov / 2.0);\n\tfloat projFactor = -0.5 * uScreenHeight / (slope * vViewPosition.z);\n\t\n\tfloat r = uOctreeSpacing * 1.5;\n\tvRadius = r;\n\t#if defined fixed_point_size\n\t\tpointSize = size;\n\t#elif defined attenuated_point_size\n\t\tif(uUseOrthographicCamera){\n\t\t\tpointSize = size;\t\t\t\n\t\t}else{\n\t\t\tpointSize = pointSize * projFactor;\n\t\t}\n\t#elif defined adaptive_point_size\n\t\tif(uUseOrthographicCamera) {\n\t\t\tfloat worldSpaceSize = 1.5 * size * r / getPointSizeAttenuation();\n\t\t\tpointSize = (worldSpaceSize / uOrthoWidth) * uScreenWidth;\n\t\t} else {\n\t\t\tfloat worldSpaceSize = 1.5 * size * r / getPointSizeAttenuation();\n\t\t\tpointSize = worldSpaceSize * projFactor;\n\t\t}\n\t#endif\n\n\tpointSize = max(minSize, pointSize);\n\tpointSize = min(maxSize, pointSize);\n\t\n\tvRadius = pointSize / projFactor;\n\n\treturn pointSize;\n}\n\n\nvoid main() {\n\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tvLinearDepth = gl_Position.w;\n\n\tfloat pointSize = getPointSize();\n\tgl_PointSize = pointSize;\n\n}\n`\n\nShaders[\"pointcloud_sm.fs\"] = `\nprecision mediump float;\nprecision mediump int;\n\nvarying vec3 vColor;\nvarying float vLinearDepth;\n\nvoid main() {\n\n\t//gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n\t//gl_FragColor = vec4(vColor, 1.0);\n\t//gl_FragColor = vec4(vLinearDepth, pow(vLinearDepth, 2.0), 0.0, 1.0);\n\tgl_FragColor = vec4(vLinearDepth, vLinearDepth / 30.0, vLinearDepth / 30.0, 1.0);\n\t\n}\n\n\n`\n\nShaders[\"normalize.vs\"] = `\nprecision mediump float;\nprecision mediump int;\n\nattribute vec3 position;\nattribute vec2 uv;\n\nuniform mat4 projectionMatrix;\nuniform mat4 modelViewMatrix;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\n}`\n\nShaders[\"normalize.fs\"] = `\n#extension GL_EXT_frag_depth : enable\n\nprecision mediump float;\nprecision mediump int;\n\nuniform sampler2D uWeightMap;\nuniform sampler2D uDepthMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tfloat depth = texture2D(uDepthMap, vUv).r;\n\t\n\tif(depth >= 1.0){\n\t\tdiscard;\n\t}\n\n\tgl_FragColor = vec4(depth, 1.0, 0.0, 1.0);\n\n\tvec4 color = texture2D(uWeightMap, vUv); \n\tcolor = color / color.w;\n\t\n\tgl_FragColor = vec4(color.xyz, 1.0); \n\t\n\tgl_FragDepthEXT = depth;\n\n\n}`\n\nShaders[\"normalize_and_edl.fs\"] = `\n#extension GL_EXT_frag_depth : enable\n\n// \n// adapted from the EDL shader code from Christian Boucheny in cloud compare:\n// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL\n//\n\nprecision mediump float;\nprecision mediump int;\n\nuniform sampler2D uWeightMap;\nuniform sampler2D uEDLMap;\nuniform sampler2D uDepthMap;\n\nuniform float screenWidth;\nuniform float screenHeight;\nuniform vec2 neighbours[NEIGHBOUR_COUNT];\nuniform float edlStrength;\nuniform float radius;\n\nvarying vec2 vUv;\n\nfloat response(float depth){\n\tvec2 uvRadius = radius / vec2(screenWidth, screenHeight);\n\t\n\tfloat sum = 0.0;\n\t\n\tfor(int i = 0; i < NEIGHBOUR_COUNT; i++){\n\t\tvec2 uvNeighbor = vUv + uvRadius * neighbours[i];\n\t\t\n\t\tfloat neighbourDepth = texture2D(uEDLMap, uvNeighbor).a;\n\n\t\tif(neighbourDepth != 0.0){\n\t\t\tif(depth == 0.0){\n\t\t\t\tsum += 100.0;\n\t\t\t}else{\n\t\t\t\tsum += max(0.0, depth - neighbourDepth);\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn sum / float(NEIGHBOUR_COUNT);\n}\n\nvoid main() {\n\n\tfloat edlDepth = texture2D(uEDLMap, vUv).a;\n\tfloat res = response(edlDepth);\n\tfloat shade = exp(-res * 300.0 * edlStrength);\n\n\tfloat depth = texture2D(uDepthMap, vUv).r;\n\tif(depth >= 1.0 && res == 0.0){\n\t\tdiscard;\n\t}\n\t\n\tvec4 color = texture2D(uWeightMap, vUv); \n\tcolor = color / color.w;\n\tcolor = color * shade;\n\n\tgl_FragColor = vec4(color.xyz, 1.0); \n\n\tgl_FragDepthEXT = depth;\n}`\n\nShaders[\"edl.vs\"] = `\nprecision mediump float;\nprecision mediump int;\n\nattribute vec3 position;\nattribute vec2 uv;\n\nuniform mat4 projectionMatrix;\nuniform mat4 modelViewMatrix;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\t\n\tvec4 mvPosition = modelViewMatrix * vec4(position,1.0);\n\n\tgl_Position = projectionMatrix * mvPosition;\n}`\n\nShaders[\"edl.fs\"] = `\n#extension GL_EXT_frag_depth : enable\n\n// \n// adapted from the EDL shader code from Christian Boucheny in cloud compare:\n// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL\n//\n\nprecision mediump float;\nprecision mediump int;\n\nuniform float screenWidth;\nuniform float screenHeight;\nuniform vec2 neighbours[NEIGHBOUR_COUNT];\nuniform float edlStrength;\nuniform float radius;\nuniform float opacity;\n\nuniform float uNear;\nuniform float uFar;\n\nuniform mat4 uProj;\n\nuniform sampler2D uEDLColor;\nuniform sampler2D uEDLDepth;\n\nvarying vec2 vUv;\n\nfloat response(float depth){\n\tvec2 uvRadius = radius / vec2(screenWidth, screenHeight);\n\t\n\tfloat sum = 0.0;\n\t\n\tfor(int i = 0; i < NEIGHBOUR_COUNT; i++){\n\t\tvec2 uvNeighbor = vUv + uvRadius * neighbours[i];\n\t\t\n\t\tfloat neighbourDepth = texture2D(uEDLColor, uvNeighbor).a;\n\t\tneighbourDepth = (neighbourDepth == 1.0) ? 0.0 : neighbourDepth;\n\n\t\tif(neighbourDepth != 0.0){\n\t\t\tif(depth == 0.0){\n\t\t\t\tsum += 100.0;\n\t\t\t}else{\n\t\t\t\tsum += max(0.0, depth - neighbourDepth);\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn sum / float(NEIGHBOUR_COUNT);\n}\n\nvoid main(){\n\tvec4 cEDL = texture2D(uEDLColor, vUv);\n\t\n\tfloat depth = cEDL.a;\n\tdepth = (depth == 1.0) ? 0.0 : depth;\n\tfloat res = response(depth);\n\tfloat shade = exp(-res * 300.0 * edlStrength);\n\n\tgl_FragColor = vec4(cEDL.rgb * shade, opacity);\n\n\t{ // write regular hyperbolic depth values to depth buffer\n\t\tfloat dl = pow(2.0, depth);\n\n\t\tvec4 dp = uProj * vec4(0.0, 0.0, -dl, 1.0);\n\t\tfloat pz = dp.z / dp.w;\n\t\tfloat fragDepth = (pz + 1.0) / 2.0;\n\n\t\tgl_FragDepthEXT = fragDepth;\n\t}\n\n\tif(depth == 0.0){\n\t\tdiscard;\n\t}\n\n}\n`\n\nShaders[\"blur.vs\"] = `\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\n}`\n\nShaders[\"blur.fs\"] = `\nuniform mat4 projectionMatrix;\n\nuniform float screenWidth;\nuniform float screenHeight;\nuniform float near;\nuniform float far;\n\nuniform sampler2D map;\n\nvarying vec2 vUv;\n\nvoid main() {\n\n\tfloat dx = 1.0 / screenWidth;\n\tfloat dy = 1.0 / screenHeight;\n\n\tvec3 color = vec3(0.0, 0.0, 0.0);\n\tcolor += texture2D(map, vUv + vec2(-dx, -dy)).rgb;\n\tcolor += texture2D(map, vUv + vec2( 0, -dy)).rgb;\n\tcolor += texture2D(map, vUv + vec2(+dx, -dy)).rgb;\n\tcolor += texture2D(map, vUv + vec2(-dx, 0)).rgb;\n\tcolor += texture2D(map, vUv + vec2( 0, 0)).rgb;\n\tcolor += texture2D(map, vUv + vec2(+dx, 0)).rgb;\n\tcolor += texture2D(map, vUv + vec2(-dx, dy)).rgb;\n\tcolor += texture2D(map, vUv + vec2( 0, dy)).rgb;\n\tcolor += texture2D(map, vUv + vec2(+dx, dy)).rgb;\n\n\tcolor = color / 9.0;\n\t\n\tgl_FragColor = vec4(color, 1.0);\n}`\n\nexport {Shaders};","\nexport const ClassificationScheme = {\n\n\tDEFAULT: {\n\t\t0: { visible: true, name: 'never classified' , color: [0.5, 0.5, 0.5, 1.0] },\n\t\t1: { visible: true, name: 'unclassified' , color: [0.5, 0.5, 0.5, 1.0] },\n\t\t2: { visible: true, name: 'ground' , color: [0.63, 0.32, 0.18, 1.0] },\n\t\t3: { visible: true, name: 'low vegetation' , color: [0.0, 1.0, 0.0, 1.0] },\n\t\t4: { visible: true, name: 'medium vegetation' , color: [0.0, 0.8, 0.0, 1.0] },\n\t\t5: { visible: true, name: 'high vegetation' , color: [0.0, 0.6, 0.0, 1.0] },\n\t\t6: { visible: true, name: 'building' , color: [1.0, 0.66, 0.0, 1.0] },\n\t\t7: { visible: true, name: 'low point(noise)' , color: [1.0, 0.0, 1.0, 1.0] },\n\t\t8: { visible: true, name: 'key-point' , color: [1.0, 0.0, 0.0, 1.0] },\n\t\t9: { visible: true, name: 'water' , color: [0.0, 0.0, 1.0, 1.0] },\n\t\t12: { visible: true, name: 'overlap' , color: [1.0, 1.0, 0.0, 1.0] },\n\t\tDEFAULT: { visible: true, name: 'default' , color: [0.3, 0.6, 0.6, 0.5] },\n\t}\n};\n\nObject.defineProperty(ClassificationScheme, 'RANDOM', {\n\tget: function() { \n\n\t\tlet scheme = {};\n\n\t\tfor(let i = 0; i <= 255; i++){\n\t\t\tscheme[i] = new THREE.Vector4(Math.random(), Math.random(), Math.random());\n\t\t}\n\n\t\tscheme[\"DEFAULT\"] = new THREE.Vector4(Math.random(), Math.random(), Math.random());\n\n\t\treturn scheme;\n\t}\n});","\nimport {Utils} from \"../utils.js\";\nimport {Gradients} from \"./Gradients.js\";\nimport {Shaders} from \"../../build/shaders/shaders.js\";\nimport {ClassificationScheme} from \"./ClassificationScheme.js\";\nimport {PointSizeType, PointShape, TreeType, ElevationGradientRepeat} from \"../defines.js\";\n\n//\n// how to calculate the radius of a projected sphere in screen space\n// http://stackoverflow.com/questions/21648630/radius-of-projected-sphere-in-screen-space\n// http://stackoverflow.com/questions/3717226/radius-of-projected-sphere\n//\n\n\nexport class PointCloudMaterial extends THREE.RawShaderMaterial {\n\tconstructor (parameters = {}) {\n\t\tsuper();\n\n\t\tthis.visibleNodesTexture = Utils.generateDataTexture(2048, 1, new THREE.Color(0xffffff));\n\t\tthis.visibleNodesTexture.minFilter = THREE.NearestFilter;\n\t\tthis.visibleNodesTexture.magFilter = THREE.NearestFilter;\n\n\t\tlet getValid = (a, b) => {\n\t\t\tif(a !== undefined){\n\t\t\t\treturn a;\n\t\t\t}else{\n\t\t\t\treturn b;\n\t\t\t}\n\t\t}\n\n\t\tlet pointSize = getValid(parameters.size, 1.0);\n\t\tlet minSize = getValid(parameters.minSize, 2.0);\n\t\tlet maxSize = getValid(parameters.maxSize, 50.0);\n\t\tlet treeType = getValid(parameters.treeType, TreeType.OCTREE);\n\n\t\tthis._pointSizeType = PointSizeType.FIXED;\n\t\tthis._shape = PointShape.SQUARE;\n\t\tthis._useClipBox = false;\n\t\tthis.clipBoxes = [];\n\t\tthis.clipPolygons = [];\n\t\tthis._weighted = false;\n\t\tthis._gradient = Gradients.SPECTRAL;\n\t\tthis.gradientTexture = PointCloudMaterial.generateGradientTexture(this._gradient);\n\t\tthis._matcap = \"matcap.jpg\";\n\t\tthis.matcapTexture = Potree.PointCloudMaterial.generateMatcapTexture(this._matcap);\n\t\tthis.lights = false;\n\t\tthis.fog = false;\n\t\tthis._treeType = treeType;\n\t\tthis._useEDL = false;\n\t\tthis.defines = new Map();\n\n\t\tthis.ranges = new Map();\n\n\t\tthis._activeAttributeName = null;\n\n\t\tthis._defaultIntensityRangeChanged = false;\n\t\tthis._defaultElevationRangeChanged = false;\n\n\t\t{\n\t\t\tconst [width, height] = [256, 1];\n\t\t\tlet data = new Uint8Array(width * 4);\n\t\t\tlet texture = new THREE.DataTexture(data, width, height, THREE.RGBAFormat);\n\t\t\ttexture.magFilter = THREE.NearestFilter;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tthis.classificationTexture = texture;\n\t\t}\n\n\t\tthis.attributes = {\n\t\t\tposition: { type: 'fv', value: [] },\n\t\t\tcolor: { type: 'fv', value: [] },\n\t\t\tnormal: { type: 'fv', value: [] },\n\t\t\tintensity: { type: 'f', value: [] },\n\t\t\tclassification: { type: 'f', value: [] },\n\t\t\treturnNumber: { type: 'f', value: [] },\n\t\t\tnumberOfReturns: { type: 'f', value: [] },\n\t\t\tpointSourceID: { type: 'f', value: [] },\n\t\t\tindices: { type: 'fv', value: [] }\n\t\t};\n\n\t\tthis.uniforms = {\n\t\t\tlevel:\t\t\t\t{ type: \"f\", value: 0.0 },\n\t\t\tvnStart:\t\t\t{ type: \"f\", value: 0.0 },\n\t\t\tspacing:\t\t\t{ type: \"f\", value: 1.0 },\n\t\t\tblendHardness:\t\t{ type: \"f\", value: 2.0 },\n\t\t\tblendDepthSupplement:\t{ type: \"f\", value: 0.0 },\n\t\t\tfov:\t\t\t\t{ type: \"f\", value: 1.0 },\n\t\t\tscreenWidth:\t\t{ type: \"f\", value: 1.0 },\n\t\t\tscreenHeight:\t\t{ type: \"f\", value: 1.0 },\n\t\t\tnear:\t\t\t\t{ type: \"f\", value: 0.1 },\n\t\t\tfar:\t\t\t\t{ type: \"f\", value: 1.0 },\n\t\t\tuColor:\t\t\t\t{ type: \"c\", value: new THREE.Color( 0xffffff ) },\n\t\t\tuOpacity:\t\t\t{ type: \"f\", value: 1.0 },\n\t\t\tsize:\t\t\t\t{ type: \"f\", value: pointSize },\n\t\t\tminSize:\t\t\t{ type: \"f\", value: minSize },\n\t\t\tmaxSize:\t\t\t{ type: \"f\", value: maxSize },\n\t\t\toctreeSize:\t\t\t{ type: \"f\", value: 0 },\n\t\t\tbbSize:\t\t\t\t{ type: \"fv\", value: [0, 0, 0] },\n\t\t\televationRange:\t\t{ type: \"2fv\", value: [0, 0] },\n\n\t\t\tclipBoxCount:\t\t{ type: \"f\", value: 0 },\n\t\t\t//clipSphereCount:\t{ type: \"f\", value: 0 },\n\t\t\tclipPolygonCount:\t{ type: \"i\", value: 0 },\n\t\t\tclipBoxes:\t\t\t{ type: \"Matrix4fv\", value: [] },\n\t\t\t//clipSpheres:\t\t{ type: \"Matrix4fv\", value: [] },\n\t\t\tclipPolygons:\t\t{ type: \"3fv\", value: [] },\n\t\t\tclipPolygonVCount:\t{ type: \"iv\", value: [] },\n\t\t\tclipPolygonVP:\t\t{ type: \"Matrix4fv\", value: [] },\n\n\t\t\tvisibleNodes:\t\t{ type: \"t\", value: this.visibleNodesTexture },\n\t\t\tpcIndex:\t\t\t{ type: \"f\", value: 0 },\n\t\t\tgradient:\t\t\t{ type: \"t\", value: this.gradientTexture },\n\t\t\tclassificationLUT:\t{ type: \"t\", value: this.classificationTexture },\n\t\t\tuHQDepthMap:\t\t{ type: \"t\", value: null },\n\t\t\ttoModel:\t\t\t{ type: \"Matrix4f\", value: [] },\n\t\t\tdiffuse:\t\t\t{ type: \"fv\", value: [1, 1, 1] },\n\t\t\ttransition:\t\t\t{ type: \"f\", value: 0.5 },\n\n\t\t\t intensityRange:\t\t{ type: \"fv\", value: [Infinity, -Infinity] },\n\n\t\t\tintensity_gbc: \t\t{ type: \"fv\", value: [1, 0, 0]},\n\t\t\tuRGB_gbc:\t \t\t{ type: \"fv\", value: [1, 0, 0]},\n\t\t\t// intensityGamma:\t\t{ type: \"f\", value: 1 },\n\t\t\t// intensityContrast:\t{ type: \"f\", value: 0 },\n\t\t\t// intensityBrightness:{ type: \"f\", value: 0 },\n\t\t\t// rgbGamma:\t\t\t{ type: \"f\", value: 1 },\n\t\t\t// rgbContrast:\t\t{ type: \"f\", value: 0 },\n\t\t\t// rgbBrightness:\t\t{ type: \"f\", value: 0 },\n\t\t\twRGB:\t\t\t\t{ type: \"f\", value: 1 },\n\t\t\twIntensity:\t\t\t{ type: \"f\", value: 0 },\n\t\t\twElevation:\t\t\t{ type: \"f\", value: 0 },\n\t\t\twClassification:\t{ type: \"f\", value: 0 },\n\t\t\twReturnNumber:\t\t{ type: \"f\", value: 0 },\n\t\t\twSourceID:\t\t\t{ type: \"f\", value: 0 },\n\t\t\tuseOrthographicCamera: { type: \"b\", value: false },\n\t\t\televationGradientRepat: { type: \"i\", value: ElevationGradientRepeat.CLAMP },\n\t\t\tclipTask:\t\t\t{ type: \"i\", value: 1 },\n\t\t\tclipMethod:\t\t\t{ type: \"i\", value: 1 },\n\t\t\tuShadowColor:\t\t{ type: \"3fv\", value: [0, 0, 0] },\n\n\t\t\tuExtraScale:\t\t{ type: \"f\", value: 1},\n\t\t\tuExtraOffset:\t\t{ type: \"f\", value: 0},\n\t\t\tuExtraRange:\t\t{ type: \"2fv\", value: [0, 1] },\n\t\t\tuExtraGammaBrightContr:\t{ type: \"3fv\", value: [1, 0, 0] },\n\n\t\t\tuFilterReturnNumberRange:\t\t{ type: \"fv\", value: [0, 7]},\n\t\t\tuFilterNumberOfReturnsRange:\t{ type: \"fv\", value: [0, 7]},\n\t\t\tuFilterGPSTimeClipRange:\t\t{ type: \"fv\", value: [0, 7]},\n\t\t\tuFilterPointSourceIDClipRange:\t\t{ type: \"fv\", value: [0, 65535]},\n\t\t\tmatcapTextureUniform: \t{ type: \"t\", value: this.matcapTexture },\n\t\t\tbackfaceCulling: { type: \"b\", value: false },\n\t\t};\n\n\t\tthis.classification = ClassificationScheme.DEFAULT;\n\n\t\tthis.defaultAttributeValues.normal = [0, 0, 0];\n\t\tthis.defaultAttributeValues.classification = [0, 0, 0];\n\t\tthis.defaultAttributeValues.indices = [0, 0, 0, 0];\n\n\t\tthis.vertexShader = Shaders['pointcloud.vs'];\n\t\tthis.fragmentShader = Shaders['pointcloud.fs'];\n\t\t\n\t\tthis.vertexColors = THREE.VertexColors;\n\n\t\tthis.updateShaderSource();\n\t}\n\n\tsetDefine(key, value){\n\t\tif(value !== undefined && value !== null){\n\t\t\tif(this.defines.get(key) !== value){\n\t\t\t\tthis.defines.set(key, value);\n\t\t\t\tthis.updateShaderSource();\n\t\t\t}\n\t\t}else{\n\t\t\tthis.removeDefine(key);\n\t\t}\n\t}\n\n\tremoveDefine(key){\n\t\tthis.defines.delete(key);\n\t}\n\n\tupdateShaderSource () {\n\n\t\tlet vs = Shaders['pointcloud.vs'];\n\t\tlet fs = Shaders['pointcloud.fs'];\n\t\tlet definesString = this.getDefines();\n\n\t\tlet vsVersionIndex = vs.indexOf(\"#version \");\n\t\tlet fsVersionIndex = fs.indexOf(\"#version \");\n\n\t\tif(vsVersionIndex >= 0){\n\t\t\tvs = vs.replace(/(#version .*)/, `$1\\n${definesString}`)\n\t\t}else{\n\t\t\tvs = `${definesString}\\n${vs}`;\n\t\t}\n\n\t\tif(fsVersionIndex >= 0){\n\t\t\tfs = fs.replace(/(#version .*)/, `$1\\n${definesString}`)\n\t\t}else{\n\t\t\tfs = `${definesString}\\n${fs}`;\n\t\t}\n\n\t\tthis.vertexShader = vs;\n\t\tthis.fragmentShader = fs;\n\n\t\tif (this.opacity === 1.0) {\n\t\t\tthis.blending = THREE.NoBlending;\n\t\t\tthis.transparent = false;\n\t\t\tthis.depthTest = true;\n\t\t\tthis.depthWrite = true;\n\t\t\tthis.depthFunc = THREE.LessEqualDepth;\n\t\t} else if (this.opacity < 1.0 && !this.useEDL) {\n\t\t\tthis.blending = THREE.AdditiveBlending;\n\t\t\tthis.transparent = true;\n\t\t\tthis.depthTest = false;\n\t\t\tthis.depthWrite = true;\n\t\t\tthis.depthFunc = THREE.AlwaysDepth;\n\t\t}\n\n\t\tif (this.weighted) {\n\t\t\tthis.blending = THREE.AdditiveBlending;\n\t\t\tthis.transparent = true;\n\t\t\tthis.depthTest = true;\n\t\t\tthis.depthWrite = false;\n\t\t}\n\n\t\tthis.needsUpdate = true;\n\t}\n\n\tgetDefines () {\n\t\tlet defines = [];\n\n\t\tif (this.pointSizeType === PointSizeType.FIXED) {\n\t\t\tdefines.push('#define fixed_point_size');\n\t\t} else if (this.pointSizeType === PointSizeType.ATTENUATED) {\n\t\t\tdefines.push('#define attenuated_point_size');\n\t\t} else if (this.pointSizeType === PointSizeType.ADAPTIVE) {\n\t\t\tdefines.push('#define adaptive_point_size');\n\t\t}\n\n\t\tif (this.shape === PointShape.SQUARE) {\n\t\t\tdefines.push('#define square_point_shape');\n\t\t} else if (this.shape === PointShape.CIRCLE) {\n\t\t\tdefines.push('#define circle_point_shape');\n\t\t} else if (this.shape === PointShape.PARABOLOID) {\n\t\t\tdefines.push('#define paraboloid_point_shape');\n\t\t}\n\n\t\tif (this._useEDL) {\n\t\t\tdefines.push('#define use_edl');\n\t\t}\n\n\t\tif(this.activeAttributeName){\n\t\t\tlet attributeName = this.activeAttributeName.replace(/[^a-zA-Z0-9]/g, '_');\n\n\t\t\tdefines.push(`#define color_type_${attributeName}`);\n\t\t}\n\t\t\n\t\tif(this._treeType === TreeType.OCTREE){\n\t\t\tdefines.push('#define tree_type_octree');\n\t\t}else if(this._treeType === TreeType.KDTREE){\n\t\t\tdefines.push('#define tree_type_kdtree');\n\t\t}\n\n\t\tif (this.weighted) {\n\t\t\tdefines.push('#define weighted_splats');\n\t\t}\n\n\t\tfor(let [key, value] of this.defines){\n\t\t\tdefines.push(value);\n\t\t}\n\n\t\treturn defines.join(\"\\n\");\n\t}\n\n\tsetClipBoxes (clipBoxes) {\n\t\tif (!clipBoxes) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet doUpdate = (this.clipBoxes.length !== clipBoxes.length) && (clipBoxes.length === 0 || this.clipBoxes.length === 0);\n\n\t\tthis.uniforms.clipBoxCount.value = this.clipBoxes.length;\n\t\tthis.clipBoxes = clipBoxes;\n\n\t\tif (doUpdate) {\n\t\t\tthis.updateShaderSource();\n\t\t}\n\n\t\tthis.uniforms.clipBoxes.value = new Float32Array(this.clipBoxes.length * 16);\n\n\t\tfor (let i = 0; i < this.clipBoxes.length; i++) {\n\t\t\tlet box = clipBoxes[i];\n\n\t\t\tthis.uniforms.clipBoxes.value.set(box.inverse.elements, 16 * i);\n\t\t}\n\n\t\tfor (let i = 0; i < this.uniforms.clipBoxes.value.length; i++) {\n\t\t\tif (Number.isNaN(this.uniforms.clipBoxes.value[i])) {\n\t\t\t\tthis.uniforms.clipBoxes.value[i] = Infinity;\n\t\t\t}\n\t\t}\n\t}\n\n\tsetClipPolygons(clipPolygons, maxPolygonVertices) {\n\t\tif(!clipPolygons){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clipPolygons = clipPolygons;\n\n\t\tlet doUpdate = (this.clipPolygons.length !== clipPolygons.length);\n\n\t\tif(doUpdate){\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\t\n\tget gradient(){\n\t\treturn this._gradient;\n\t}\n\n\tset gradient (value) {\n\t\tif (this._gradient !== value) {\n\t\t\tthis._gradient = value;\n\t\t\tthis.gradientTexture = PointCloudMaterial.generateGradientTexture(this._gradient);\n\t\t\tthis.uniforms.gradient.value = this.gradientTexture;\n\t\t}\n\t}\n\n\tget matcap(){\n\t\treturn this._matcap;\n\t}\n\n\tset matcap (value) {\n\t\tif (this._matcap !== value) {\n\t\t\tthis._matcap = value;\n\t\t\tthis.matcapTexture = Potree.PointCloudMaterial.generateMatcapTexture(this._matcap);\n\t\t\tthis.uniforms.matcapTextureUniform.value = this.matcapTexture;\n\t\t}\n\t}\n\tget useOrthographicCamera() {\n\t\treturn this.uniforms.useOrthographicCamera.value;\n\t}\n\n\tset useOrthographicCamera(value) {\n\t\tif(this.uniforms.useOrthographicCamera.value !== value){\n\t\t\tthis.uniforms.useOrthographicCamera.value = value;\n\t\t}\n\t}\n\tget backfaceCulling() {\n\t\treturn this.uniforms.backfaceCulling.value;\n\t}\n\n\tset backfaceCulling(value) {\n\t\tif(this.uniforms.backfaceCulling.value !== value){\n\t\t\tthis.uniforms.backfaceCulling.value = value;\n\t\t\tthis.dispatchEvent({type: 'backface_changed', target: this});\n\t\t}\n\t}\n\n\trecomputeClassification () {\n\t\tconst classification = this.classification;\n\t\tconst data = this.classificationTexture.image.data;\n\n\t\tlet width = 256;\n\t\tconst black = [1, 1, 1, 1];\n\n\t\tlet valuesChanged = false;\n\n\t\tfor (let i = 0; i < width; i++) {\n\n\t\t\tlet color;\n\t\t\tlet visible = true;\n\n\t\t\tif (classification[i]) {\n\t\t\t\tcolor = classification[i].color;\n\t\t\t\tvisible = classification[i].visible;\n\t\t\t} else if (classification[i % 32]) {\n\t\t\t\tcolor = classification[i % 32].color;\n\t\t\t\tvisible = classification[i % 32].visible;\n\t\t\t} else if(classification.DEFAULT) {\n\t\t\t\tcolor = classification.DEFAULT.color;\n\t\t\t\tvisible = classification.DEFAULT.visible;\n\t\t\t}else{\n\t\t\t\tcolor = black;\n\t\t\t}\n\n\t\t\tconst r = parseInt(255 * color[0]);\n\t\t\tconst g = parseInt(255 * color[1]);\n\t\t\tconst b = parseInt(255 * color[2]);\n\t\t\tconst a = visible ? parseInt(255 * color[3]) : 0;\n\n\n\t\t\tif(data[4 * i + 0] !== r){\n\t\t\t\tdata[4 * i + 0] = r;\n\t\t\t\tvaluesChanged = true;\n\t\t\t}\n\n\t\t\tif(data[4 * i + 1] !== g){\n\t\t\t\tdata[4 * i + 1] = g;\n\t\t\t\tvaluesChanged = true;\n\t\t\t}\n\n\t\t\tif(data[4 * i + 2] !== b){\n\t\t\t\tdata[4 * i + 2] = b;\n\t\t\t\tvaluesChanged = true;\n\t\t\t}\n\n\t\t\tif(data[4 * i + 3] !== a){\n\t\t\t\tdata[4 * i + 3] = a;\n\t\t\t\tvaluesChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif(valuesChanged){\n\t\t\tthis.classificationTexture.needsUpdate = true;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget spacing () {\n\t\treturn this.uniforms.spacing.value;\n\t}\n\n\tset spacing (value) {\n\t\tif (this.uniforms.spacing.value !== value) {\n\t\t\tthis.uniforms.spacing.value = value;\n\t\t}\n\t}\n\n\tget useClipBox () {\n\t\treturn this._useClipBox;\n\t}\n\n\tset useClipBox (value) {\n\t\tif (this._useClipBox !== value) {\n\t\t\tthis._useClipBox = value;\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\n\tget clipTask(){\n\t\treturn this.uniforms.clipTask.value;\n\t}\n\n\tset clipTask(mode){\n\t\tthis.uniforms.clipTask.value = mode;\n\t}\n\n\tget elevationGradientRepat(){\n\t\treturn this.uniforms.elevationGradientRepat.value;\n\t}\n\n\tset elevationGradientRepat(mode){\n\t\tthis.uniforms.elevationGradientRepat.value = mode;\n\t}\n\n\tget clipMethod(){\n\t\treturn this.uniforms.clipMethod.value;\n\t}\n\n\tset clipMethod(mode){\n\t\tthis.uniforms.clipMethod.value = mode;\n\t}\n\n\tget weighted(){\n\t\treturn this._weighted;\n\t}\n\n\tset weighted (value) {\n\t\tif (this._weighted !== value) {\n\t\t\tthis._weighted = value;\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\n\tget fov () {\n\t\treturn this.uniforms.fov.value;\n\t}\n\n\tset fov (value) {\n\t\tif (this.uniforms.fov.value !== value) {\n\t\t\tthis.uniforms.fov.value = value;\n\t\t\t// this.updateShaderSource();\n\t\t}\n\t}\n\n\tget screenWidth () {\n\t\treturn this.uniforms.screenWidth.value;\n\t}\n\n\tset screenWidth (value) {\n\t\tif (this.uniforms.screenWidth.value !== value) {\n\t\t\tthis.uniforms.screenWidth.value = value;\n\t\t\t// this.updateShaderSource();\n\t\t}\n\t}\n\n\tget screenHeight () {\n\t\treturn this.uniforms.screenHeight.value;\n\t}\n\n\tset screenHeight (value) {\n\t\tif (this.uniforms.screenHeight.value !== value) {\n\t\t\tthis.uniforms.screenHeight.value = value;\n\t\t\t// this.updateShaderSource();\n\t\t}\n\t}\n\n\tget near () {\n\t\treturn this.uniforms.near.value;\n\t}\n\n\tset near (value) {\n\t\tif (this.uniforms.near.value !== value) {\n\t\t\tthis.uniforms.near.value = value;\n\t\t}\n\t}\n\n\tget far () {\n\t\treturn this.uniforms.far.value;\n\t}\n\n\tset far (value) {\n\t\tif (this.uniforms.far.value !== value) {\n\t\t\tthis.uniforms.far.value = value;\n\t\t}\n\t}\n\t\n\tget opacity(){\n\t\treturn this.uniforms.uOpacity.value;\n\t}\n\n\tset opacity (value) {\n\t\tif (this.uniforms && this.uniforms.uOpacity) {\n\t\t\tif (this.uniforms.uOpacity.value !== value) {\n\t\t\t\tthis.uniforms.uOpacity.value = value;\n\t\t\t\tthis.updateShaderSource();\n\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\ttype: 'opacity_changed',\n\t\t\t\t\ttarget: this\n\t\t\t\t});\n\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\ttype: 'material_property_changed',\n\t\t\t\t\ttarget: this\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tget activeAttributeName(){\n\t\treturn this._activeAttributeName;\n\t}\n\n\tset activeAttributeName(value){\n\t\tif (this._activeAttributeName !== value) {\n\t\t\tthis._activeAttributeName = value;\n\n\t\t\tthis.updateShaderSource();\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'active_attribute_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget pointSizeType () {\n\t\treturn this._pointSizeType;\n\t}\n\n\tset pointSizeType (value) {\n\t\tif (this._pointSizeType !== value) {\n\t\t\tthis._pointSizeType = value;\n\t\t\tthis.updateShaderSource();\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'point_size_type_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget useEDL(){\n\t\treturn this._useEDL;\n\t}\n\n\tset useEDL (value) {\n\t\tif (this._useEDL !== value) {\n\t\t\tthis._useEDL = value;\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\n\tget color () {\n\t\treturn this.uniforms.uColor.value;\n\t}\n\n\tset color (value) {\n\t\tif (!this.uniforms.uColor.value.equals(value)) {\n\t\t\tthis.uniforms.uColor.value.copy(value);\n\t\t\t\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'color_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget shape () {\n\t\treturn this._shape;\n\t}\n\n\tset shape (value) {\n\t\tif (this._shape !== value) {\n\t\t\tthis._shape = value;\n\t\t\tthis.updateShaderSource();\n\t\t\tthis.dispatchEvent({type: 'point_shape_changed', target: this});\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget treeType () {\n\t\treturn this._treeType;\n\t}\n\n\tset treeType (value) {\n\t\tif (this._treeType !== value) {\n\t\t\tthis._treeType = value;\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\n\tget bbSize () {\n\t\treturn this.uniforms.bbSize.value;\n\t}\n\n\tset bbSize (value) {\n\t\tthis.uniforms.bbSize.value = value;\n\t}\n\n\tget size () {\n\t\treturn this.uniforms.size.value;\n\t}\n\n\tset size (value) {\n\t\tif (this.uniforms.size.value !== value) {\n\t\t\tthis.uniforms.size.value = value;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'point_size_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget minSize(){\n\t\treturn this.uniforms.minSize.value;\n\t}\n\n\tset minSize(value){\n\t\tif (this.uniforms.minSize.value !== value) {\n\t\t\tthis.uniforms.minSize.value = value;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'point_size_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget elevationRange () {\n\t\treturn this.uniforms.elevationRange.value;\n\t}\n\n\tset elevationRange (value) {\n\t\tlet changed = this.uniforms.elevationRange.value[0] !== value[0]\n\t\t\t|| this.uniforms.elevationRange.value[1] !== value[1];\n\n\t\tif(changed){\n\t\t\tthis.uniforms.elevationRange.value = value;\n\n\t\t\tthis._defaultElevationRangeChanged = true;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget heightMin () {\n\t\treturn this.uniforms.elevationRange.value[0];\n\t}\n\n\tset heightMin (value) {\n\t\tthis.elevationRange = [value, this.elevationRange[1]];\n\t}\n\n\tget heightMax () {\n\t\treturn this.uniforms.elevationRange.value[1];\n\t}\n\n\tset heightMax (value) {\n\t\tthis.elevationRange = [this.elevationRange[0], value];\n\t}\n\n\tget transition () {\n\t\treturn this.uniforms.transition.value;\n\t}\n\n\tset transition (value) {\n\t\tthis.uniforms.transition.value = value;\n\t}\n\n\tget intensityRange () {\n\t\treturn this.uniforms.intensityRange.value;\n\t}\n\n\tset intensityRange (value) {\n\t\tif (!(value instanceof Array && value.length === 2)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (value[0] === this.uniforms.intensityRange.value[0] &&\n\t\t\tvalue[1] === this.uniforms.intensityRange.value[1]) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.uniforms.intensityRange.value = value;\n\n\t\tthis._defaultIntensityRangeChanged = true;\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'material_property_changed',\n\t\t\ttarget: this\n\t\t});\n\t}\n\n\tget intensityGamma () {\n\t\treturn this.uniforms.intensity_gbc.value[0];\n\t}\n\n\tset intensityGamma (value) {\n\t\tif (this.uniforms.intensity_gbc.value[0] !== value) {\n\t\t\tthis.uniforms.intensity_gbc.value[0] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget intensityContrast () {\n\t\treturn this.uniforms.intensity_gbc.value[2];\n\t}\n\n\tset intensityContrast (value) {\n\t\tif (this.uniforms.intensity_gbc.value[2] !== value) {\n\t\t\tthis.uniforms.intensity_gbc.value[2] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget intensityBrightness () {\n\t\treturn this.uniforms.intensity_gbc.value[1];\n\t}\n\n\tset intensityBrightness (value) {\n\t\tif (this.uniforms.intensity_gbc.value[1] !== value) {\n\t\t\tthis.uniforms.intensity_gbc.value[1] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget rgbGamma () {\n\t\treturn this.uniforms.uRGB_gbc.value[0];\n\t}\n\n\tset rgbGamma (value) {\n\t\tif (this.uniforms.uRGB_gbc.value[0] !== value) {\n\t\t\tthis.uniforms.uRGB_gbc.value[0] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget rgbContrast () {\n\t\treturn this.uniforms.uRGB_gbc.value[2];\n\t}\n\n\tset rgbContrast (value) {\n\t\tif (this.uniforms.uRGB_gbc.value[2] !== value) {\n\t\t\tthis.uniforms.uRGB_gbc.value[2] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget rgbBrightness () {\n\t\treturn this.uniforms.uRGB_gbc.value[1];\n\t}\n\n\tset rgbBrightness (value) {\n\t\tif (this.uniforms.uRGB_gbc.value[1] !== value) {\n\t\t\tthis.uniforms.uRGB_gbc.value[1] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\t\n\tget extraGamma () {\n\t\treturn this.uniforms.uExtraGammaBrightContr.value[0];\n\t}\n\n\tset extraGamma (value) {\n\t\tif (this.uniforms.uExtraGammaBrightContr.value[0] !== value) {\n\t\t\tthis.uniforms.uExtraGammaBrightContr.value[0] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget extraBrightness () {\n\t\treturn this.uniforms.uExtraGammaBrightContr.value[1];\n\t}\n\n\tset extraBrightness (value) {\n\t\tif (this.uniforms.uExtraGammaBrightContr.value[1] !== value) {\n\t\t\tthis.uniforms.uExtraGammaBrightContr.value[1] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget extraContrast () {\n\t\treturn this.uniforms.uExtraGammaBrightContr.value[2];\n\t}\n\n\tset extraContrast (value) {\n\t\tif (this.uniforms.uExtraGammaBrightContr.value[2] !== value) {\n\t\t\tthis.uniforms.uExtraGammaBrightContr.value[2] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tgetRange(attributeName){\n\t\treturn this.ranges.get(attributeName);\n\t}\n\n\tsetRange(attributeName, newRange){\n\n\t\tlet rangeChanged = false;\n\n\t\tlet oldRange = this.ranges.get(attributeName);\n\n\t\tif(oldRange != null && newRange != null){\n\t\t\trangeChanged = oldRange[0] !== newRange[0] || oldRange[1] !== newRange[1];\n\t\t}else{\n\t\t\trangeChanged = true;\n\t\t}\n\n\t\tthis.ranges.set(attributeName, newRange);\n\n\t\tif(rangeChanged){\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget extraRange () {\n\t\treturn this.uniforms.uExtraRange.value;\n\t}\n\n\tset extraRange (value) {\n\t\tif (!(value instanceof Array && value.length === 2)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (value[0] === this.uniforms.uExtraRange.value[0] &&\n\t\t\tvalue[1] === this.uniforms.uExtraRange.value[1]) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.uniforms.uExtraRange.value = value;\n\n\t\tthis._defaultExtraRangeChanged = true;\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'material_property_changed',\n\t\t\ttarget: this\n\t\t});\n\t}\n\n\tget weightRGB () {\n\t\treturn this.uniforms.wRGB.value;\n\t}\n\n\tset weightRGB (value) {\n\t\tif(this.uniforms.wRGB.value !== value){\n\t\t\tthis.uniforms.wRGB.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightIntensity () {\n\t\treturn this.uniforms.wIntensity.value;\n\t}\n\n\tset weightIntensity (value) {\n\t\tif(this.uniforms.wIntensity.value !== value){\n\t\t\tthis.uniforms.wIntensity.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightElevation () {\n\t\treturn this.uniforms.wElevation.value;\n\t}\n\n\tset weightElevation (value) {\n\t\tif(this.uniforms.wElevation.value !== value){\n\t\t\tthis.uniforms.wElevation.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightClassification () {\n\t\treturn this.uniforms.wClassification.value;\n\t}\n\n\tset weightClassification (value) {\n\t\tif(this.uniforms.wClassification.value !== value){\n\t\t\tthis.uniforms.wClassification.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightReturnNumber () {\n\t\treturn this.uniforms.wReturnNumber.value;\n\t}\n\n\tset weightReturnNumber (value) {\n\t\tif(this.uniforms.wReturnNumber.value !== value){\n\t\t\tthis.uniforms.wReturnNumber.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightSourceID () {\n\t\treturn this.uniforms.wSourceID.value;\n\t}\n\n\tset weightSourceID (value) {\n\t\tif(this.uniforms.wSourceID.value !== value){\n\t\t\tthis.uniforms.wSourceID.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tstatic generateGradientTexture (gradient) {\n\t\tlet size = 64;\n\n\t\t// create canvas\n\t\tlet canvas = document.createElement('canvas');\n\t\tcanvas.width = size;\n\t\tcanvas.height = size;\n\n\t\t// get context\n\t\tlet context = canvas.getContext('2d');\n\n\t\t// draw gradient\n\t\tcontext.rect(0, 0, size, size);\n\t\tlet ctxGradient = context.createLinearGradient(0, 0, size, size);\n\n\t\tfor (let i = 0; i < gradient.length; i++) {\n\t\t\tlet step = gradient[i];\n\n\t\t\tctxGradient.addColorStop(step[0], '#' + step[1].getHexString());\n\t\t}\n\n\t\tcontext.fillStyle = ctxGradient;\n\t\tcontext.fill();\n\t\t\n\t\t//let texture = new THREE.Texture(canvas);\n\t\tlet texture = new THREE.CanvasTexture(canvas);\n\t\ttexture.needsUpdate = true;\n\t\t\n\t\ttexture.minFilter = THREE.LinearFilter;\n\t\ttexture.wrap = THREE.RepeatWrapping;\n\t\ttexture.repeat = 2;\n\t\t// textureImage = texture.image;\n\n\t\treturn texture;\n\t}\n\t\n\tstatic generateMatcapTexture (matcap) {\n\tvar url = new URL(Potree.resourcePath + \"/textures/matcap/\" + matcap).href;\n\tlet texture = new THREE.TextureLoader().load( url );\n\t\ttexture.magFilter = texture.minFilter = THREE.LinearFilter; \n\t\ttexture.needsUpdate = true;\n\t\t// PotreeConverter_1.6_2018_07_29_windows_x64\\PotreeConverter.exe autzen_xyzrgbXYZ_ascii.xyz -f xyzrgbXYZ -a RGB NORMAL -o autzen_xyzrgbXYZ_ascii_a -p index --overwrite\n\t\t// Switch matcap texture on the fly : viewer.scene.pointclouds[0].material.matcap = 'matcap1.jpg'; \n\t\t// For non power of 2, use LinearFilter and dont generate mipmaps, For power of 2, use NearestFilter and generate mipmaps : matcap2.jpg 1 2 8 11 12 13\n\t\treturn texture; \n\t}\n\n\tstatic generateMatcapTexture (matcap) {\n\tvar url = new URL(Potree.resourcePath + \"/textures/matcap/\" + matcap).href;\n\tlet texture = new THREE.TextureLoader().load( url );\n\t\ttexture.magFilter = texture.minFilter = THREE.LinearFilter; \n\t\ttexture.needsUpdate = true;\n\t\t// PotreeConverter_1.6_2018_07_29_windows_x64\\PotreeConverter.exe autzen_xyzrgbXYZ_ascii.xyz -f xyzrgbXYZ -a RGB NORMAL -o autzen_xyzrgbXYZ_ascii_a -p index --overwrite\n\t\t// Switch matcap texture on the fly : viewer.scene.pointclouds[0].material.matcap = 'matcap1.jpg'; \n\t\t// For non power of 2, use LinearFilter and dont generate mipmaps, For power of 2, use NearestFilter and generate mipmaps : matcap2.jpg 1 2 8 11 12 13\n\t\treturn texture; \n\t}\n\n\tdisableEvents(){\n\t\tif(this._hiddenListeners === undefined){\n\t\t\tthis._hiddenListeners = this._listeners;\n\t\t\tthis._listeners = {};\n\t\t}\n\t};\n\n\tenableEvents(){\n\t\tthis._listeners = this._hiddenListeners;\n\t\tthis._hiddenListeners = undefined;\n\t};\n\n\t// copyFrom(from){\n\n\t// \tvar a = 10;\n\n\t// \tfor(let name of Object.keys(this.uniforms)){\n\t// \t\tthis.uniforms[name].value = from.uniforms[name].value;\n\t// \t}\n\t// }\n\n\t// copy(from){\n\t// \tthis.copyFrom(from);\n\t// }\n\n}\n","\nimport {PointCloudTree, PointCloudTreeNode} from \"./PointCloudTree.js\";\nimport {PointCloudOctreeGeometryNode} from \"./PointCloudOctreeGeometry.js\";\nimport {Utils} from \"./utils.js\";\nimport {PointCloudMaterial} from \"./materials/PointCloudMaterial.js\";\n\n\nexport class PointCloudOctreeNode extends PointCloudTreeNode {\n\tconstructor () {\n\t\tsuper();\n\n\t\t//this.children = {};\n\t\tthis.children = [];\n\t\tthis.sceneNode = null;\n\t\tthis.octree = null;\n\t}\n\n\tgetNumPoints () {\n\t\treturn this.geometryNode.numPoints;\n\t}\n\n\tisLoaded () {\n\t\treturn true;\n\t}\n\n\tisTreeNode () {\n\t\treturn true;\n\t}\n\n\tisGeometryNode () {\n\t\treturn false;\n\t}\n\n\tgetLevel () {\n\t\treturn this.geometryNode.level;\n\t}\n\n\tgetBoundingSphere () {\n\t\treturn this.geometryNode.boundingSphere;\n\t}\n\n\tgetBoundingBox () {\n\t\treturn this.geometryNode.boundingBox;\n\t}\n\n\tgetChildren () {\n\t\tlet children = [];\n\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tif (this.children[i]) {\n\t\t\t\tchildren.push(this.children[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn children;\n\t}\n\n\tgetPointsInBox(boxNode){\n\n\t\tif(!this.sceneNode){\n\t\t\treturn null;\n\t\t}\n\n\t\tlet buffer = this.geometryNode.buffer;\n\n\t\tlet posOffset = buffer.offset(\"position\");\n\t\tlet stride = buffer.stride;\n\t\tlet view = new DataView(buffer.data);\n\n\t\tlet worldToBox = new THREE.Matrix4().getInverse(boxNode.matrixWorld);\n\t\tlet objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, this.sceneNode.matrixWorld);\n\n\t\tlet inBox = [];\n\n\t\tlet pos = new THREE.Vector4();\n\t\tfor(let i = 0; i < buffer.numElements; i++){\n\t\t\tlet x = view.getFloat32(i * stride + posOffset + 0, true);\n\t\t\tlet y = view.getFloat32(i * stride + posOffset + 4, true);\n\t\t\tlet z = view.getFloat32(i * stride + posOffset + 8, true);\n\n\t\t\tpos.set(x, y, z, 1);\n\t\t\tpos.applyMatrix4(objectToBox);\n\n\t\t\tif(-0.5 < pos.x && pos.x < 0.5){\n\t\t\t\tif(-0.5 < pos.y && pos.y < 0.5){\n\t\t\t\t\tif(-0.5 < pos.z && pos.z < 0.5){\n\t\t\t\t\t\tpos.set(x, y, z, 1).applyMatrix4(this.sceneNode.matrixWorld);\n\t\t\t\t\t\tinBox.push(new THREE.Vector3(pos.x, pos.y, pos.z));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn inBox;\n\t}\n\n\tget name () {\n\t\treturn this.geometryNode.name;\n\t}\n};\n\nexport class PointCloudOctree extends PointCloudTree {\n\tconstructor (geometry, material) {\n\t\tsuper();\n\n\t\tthis.pointBudget = Infinity;\n\t\tthis.pcoGeometry = geometry;\n\t\tthis.boundingBox = this.pcoGeometry.boundingBox;\n\t\tthis.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\tthis.material = material || new PointCloudMaterial();\n\t\tthis.visiblePointsTarget = 2 * 1000 * 1000;\n\t\tthis.minimumNodePixelSize = 150;\n\t\tthis.level = 0;\n\t\tthis.position.copy(geometry.offset);\n\t\tthis.updateMatrix();\n\n\t\t{\n\t\t\tlet attributeName = \"rgba\";\n\t\t\tif(this.pcoGeometry.pointAttributes.attributes.length > 1){\n\t\t\t\tattributeName = this.pcoGeometry.pointAttributes.attributes[1].name;\n\t\t\t}\n\t\t\tthis.material.activeAttributeName = attributeName;\n\t\t}\n\n\t\tthis.showBoundingBox = false;\n\t\tthis.boundingBoxNodes = [];\n\t\tthis.loadQueue = [];\n\t\tthis.visibleBounds = new THREE.Box3();\n\t\tthis.visibleNodes = [];\n\t\tthis.visibleGeometry = [];\n\t\tthis.generateDEM = false;\n\t\tthis.profileRequests = [];\n\t\tthis.name = '';\n\t\tthis._visible = true;\n\n\t\t{\n\t\t\tlet box = [this.pcoGeometry.tightBoundingBox, this.getBoundingBoxWorld()]\n\t\t\t\t.find(v => v !== undefined);\n\n\t\t\tthis.updateMatrixWorld(true);\n\t\t\tbox = Utils.computeTransformedBoundingBox(box, this.matrixWorld);\n\n\t\t\tlet bMin = box.min.z;\n\t\t\tlet bMax = box.max.z;\n\t\t\tthis.material.heightMin = bMin;\n\t\t\tthis.material.heightMax = bMax;\n\t\t}\n\n\t\t// TODO read projection from file instead\n\t\tthis.projection = geometry.projection;\n\t\tthis.fallbackProjection = geometry.fallbackProjection;\n\n\t\tthis.root = this.pcoGeometry.root;\n\t}\n\n\tsetName (name) {\n\t\tif (this.name !== name) {\n\t\t\tthis.name = name;\n\t\t\tthis.dispatchEvent({type: 'name_changed', name: name, pointcloud: this});\n\t\t}\n\t}\n\n\tgetName () {\n\t\treturn this.name;\n\t}\n\n\tgetAttribute(name){\n\n\t\tconst attribute = this.pcoGeometry.pointAttributes.attributes.find(a => a.name === name);\n\n\t\tif(attribute){\n\t\t\treturn attribute;\n\t\t}else{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tgetAttributes(){\n\t\treturn this.pcoGeometry.pointAttributes;\n\t}\n\n\ttoTreeNode (geometryNode, parent) {\n\t\tlet node = new PointCloudOctreeNode();\n\n\t\t// if(geometryNode.name === \"r40206\"){\n\t\t//\tconsole.log(\"creating node for r40206\");\n\t\t// }\n\t\tlet sceneNode = new THREE.Points(geometryNode.geometry, this.material);\n\t\tsceneNode.name = geometryNode.name;\n\t\tsceneNode.position.copy(geometryNode.boundingBox.min);\n\t\tsceneNode.frustumCulled = false;\n\t\tsceneNode.onBeforeRender = (_this, scene, camera, geometry, material, group) => {\n\t\t\tif (material.program) {\n\t\t\t\t_this.getContext().useProgram(material.program.program);\n\n\t\t\t\tif (material.program.getUniforms().map.level) {\n\t\t\t\t\tlet level = geometryNode.getLevel();\n\t\t\t\t\tmaterial.uniforms.level.value = level;\n\t\t\t\t\tmaterial.program.getUniforms().map.level.setValue(_this.getContext(), level);\n\t\t\t\t}\n\n\t\t\t\tif (this.visibleNodeTextureOffsets && material.program.getUniforms().map.vnStart) {\n\t\t\t\t\tlet vnStart = this.visibleNodeTextureOffsets.get(node);\n\t\t\t\t\tmaterial.uniforms.vnStart.value = vnStart;\n\t\t\t\t\tmaterial.program.getUniforms().map.vnStart.setValue(_this.getContext(), vnStart);\n\t\t\t\t}\n\n\t\t\t\tif (material.program.getUniforms().map.pcIndex) {\n\t\t\t\t\tlet i = node.pcIndex ? node.pcIndex : this.visibleNodes.indexOf(node);\n\t\t\t\t\tmaterial.uniforms.pcIndex.value = i;\n\t\t\t\t\tmaterial.program.getUniforms().map.pcIndex.setValue(_this.getContext(), i);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// { // DEBUG\n\t\t//\tlet sg = new THREE.SphereGeometry(1, 16, 16);\n\t\t//\tlet sm = new THREE.MeshNormalMaterial();\n\t\t//\tlet s = new THREE.Mesh(sg, sm);\n\t\t//\ts.scale.set(5, 5, 5);\n\t\t//\ts.position.copy(geometryNode.mean)\n\t\t//\t\t.add(this.position)\n\t\t//\t\t.add(geometryNode.boundingBox.min);\n\t\t//\n\t\t//\tviewer.scene.scene.add(s);\n\t\t// }\n\n\t\tnode.geometryNode = geometryNode;\n\t\tnode.sceneNode = sceneNode;\n\t\tnode.pointcloud = this;\n\t\tnode.children = [];\n\t\t//for (let key in geometryNode.children) {\n\t\t//\tnode.children[key] = geometryNode.children[key];\n\t\t//}\n\t\tfor(let i = 0; i < 8; i++){\n\t\t\tnode.children[i] = geometryNode.children[i];\n\t\t}\n\n\t\tif (!parent) {\n\t\t\tthis.root = node;\n\t\t\tthis.add(sceneNode);\n\t\t} else {\n\t\t\tlet childIndex = parseInt(geometryNode.name[geometryNode.name.length - 1]);\n\t\t\tparent.sceneNode.add(sceneNode);\n\t\t\tparent.children[childIndex] = node;\n\t\t}\n\n\t\tlet disposeListener = function () {\n\t\t\tlet childIndex = parseInt(geometryNode.name[geometryNode.name.length - 1]);\n\t\t\tparent.sceneNode.remove(node.sceneNode);\n\t\t\tparent.children[childIndex] = geometryNode;\n\t\t};\n\t\tgeometryNode.oneTimeDisposeHandlers.push(disposeListener);\n\n\t\treturn node;\n\t}\n\n\tupdateVisibleBounds () {\n\t\tlet leafNodes = [];\n\t\tfor (let i = 0; i < this.visibleNodes.length; i++) {\n\t\t\tlet node = this.visibleNodes[i];\n\t\t\tlet isLeaf = true;\n\n\t\t\tfor (let j = 0; j < node.children.length; j++) {\n\t\t\t\tlet child = node.children[j];\n\t\t\t\tif (child instanceof PointCloudOctreeNode) {\n\t\t\t\t\tisLeaf = isLeaf && !child.sceneNode.visible;\n\t\t\t\t} else if (child instanceof PointCloudOctreeGeometryNode) {\n\t\t\t\t\tisLeaf = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isLeaf) {\n\t\t\t\tleafNodes.push(node);\n\t\t\t}\n\t\t}\n\n\t\tthis.visibleBounds.min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\tthis.visibleBounds.max = new THREE.Vector3(-Infinity, -Infinity, -Infinity);\n\t\tfor (let i = 0; i < leafNodes.length; i++) {\n\t\t\tlet node = leafNodes[i];\n\n\t\t\tthis.visibleBounds.expandByPoint(node.getBoundingBox().min);\n\t\t\tthis.visibleBounds.expandByPoint(node.getBoundingBox().max);\n\t\t}\n\t}\n\n\tupdateMaterial (material, visibleNodes, camera, renderer) {\n\t\tmaterial.fov = camera.fov * (Math.PI / 180);\n\t\tmaterial.screenWidth = renderer.domElement.clientWidth;\n\t\tmaterial.screenHeight = renderer.domElement.clientHeight;\n\t\tmaterial.spacing = this.pcoGeometry.spacing * Math.max(this.scale.x, this.scale.y, this.scale.z);\n\t\tmaterial.near = camera.near;\n\t\tmaterial.far = camera.far;\n\t\tmaterial.uniforms.octreeSize.value = this.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x;\n\t}\n\n\tcomputeVisibilityTextureData(nodes, camera){\n\n\t\tif(Potree.measureTimings) performance.mark(\"computeVisibilityTextureData-start\");\n\n\t\tlet data = new Uint8Array(nodes.length * 4);\n\t\tlet visibleNodeTextureOffsets = new Map();\n\n\t\t// copy array\n\t\tnodes = nodes.slice();\n\n\t\t// sort by level and index, e.g. r, r0, r3, r4, r01, r07, r30, ...\n\t\tlet sort = function (a, b) {\n\t\t\tlet na = a.geometryNode.name;\n\t\t\tlet nb = b.geometryNode.name;\n\t\t\tif (na.length !== nb.length) return na.length - nb.length;\n\t\t\tif (na < nb) return -1;\n\t\t\tif (na > nb) return 1;\n\t\t\treturn 0;\n\t\t};\n\t\tnodes.sort(sort);\n\n\t\t// code sample taken from three.js src/math/Ray.js\n\t\tlet v1 = new THREE.Vector3();\n\t\tlet intersectSphereBack = (ray, sphere) => {\n\t\t\tv1.subVectors( sphere.center, ray.origin );\n\t\t\tlet tca = v1.dot( ray.direction );\n\t\t\tlet d2 = v1.dot( v1 ) - tca * tca;\n\t\t\tlet radius2 = sphere.radius * sphere.radius;\n\n\t\t\tif(d2 > radius2){\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlet thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\tlet t1 = tca + thc;\n\n\t\t\tif(t1 < 0 ){\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn t1;\n\t\t};\n\n\t\tlet lodRanges = new Map();\n\t\tlet leafNodeLodRanges = new Map();\n\n\t\tlet bBox = new THREE.Box3();\n\t\tlet bSphere = new THREE.Sphere();\n\t\tlet worldDir = new THREE.Vector3();\n\t\tlet cameraRay = new THREE.Ray(camera.position, camera.getWorldDirection(worldDir));\n\n\t\tlet nodeMap = new Map();\n\t\tlet offsetsToChild = new Array(nodes.length).fill(Infinity);\n\n\t\tfor(let i = 0; i < nodes.length; i++){\n\t\t\tlet node = nodes[i];\n\n\t\t\tnodeMap.set(node.name, node);\n\t\t\tvisibleNodeTextureOffsets.set(node, i);\n\n\t\t\tif(i > 0){\n\t\t\t\tlet index = parseInt(node.name.slice(-1));\n\t\t\t\tlet parentName = node.name.slice(0, -1);\n\t\t\t\tlet parent = nodeMap.get(parentName);\n\t\t\t\tlet parentOffset = visibleNodeTextureOffsets.get(parent);\n\n\t\t\t\tlet parentOffsetToChild = (i - parentOffset);\n\n\t\t\t\toffsetsToChild[parentOffset] = Math.min(offsetsToChild[parentOffset], parentOffsetToChild);\n\n\t\t\t\tdata[parentOffset * 4 + 0] = data[parentOffset * 4 + 0] | (1 << index);\n\t\t\t\tdata[parentOffset * 4 + 1] = (offsetsToChild[parentOffset] >> 8);\n\t\t\t\tdata[parentOffset * 4 + 2] = (offsetsToChild[parentOffset] % 256);\n\t\t\t}\n\n\t\t\t// data[i * 4 + 3] = node.geometryNode.nodeType === 1 ? 1 : 0;\n\t\t\t// data[i * 4 + 3] = node.name.length - 1;\n\n\t\t\tlet density = node.geometryNode.density;\n\t\t\t\n\t\t\tif(typeof density === \"number\"){\n\t\t\t\tlet lodOffset = Math.log2(density) / 2 - 1.5;\n\n\t\t\t\tlet offsetUint8 = (lodOffset + 10) * 10;\n\n\t\t\t\tdata[i * 4 + 3] = offsetUint8;\n\t\t\t}else{\n\t\t\t\tdata[i * 4 + 3] = 100;\n\t\t\t}\n\n\t\t}\n\n\t\tvar a = 10;\n\n\t\tif(Potree.measureTimings){\n\t\t\tperformance.mark(\"computeVisibilityTextureData-end\");\n\t\t\tperformance.measure(\"render.computeVisibilityTextureData\", \"computeVisibilityTextureData-start\", \"computeVisibilityTextureData-end\");\n\t\t}\n\n\t\treturn {\n\t\t\tdata: data,\n\t\t\toffsets: visibleNodeTextureOffsets\n\t\t};\n\t}\n\n\tnodeIntersectsProfile (node, profile) {\n\t\tlet bbWorld = node.boundingBox.clone().applyMatrix4(this.matrixWorld);\n\t\tlet bsWorld = bbWorld.getBoundingSphere(new THREE.Sphere());\n\n\t\tlet intersects = false;\n\n\t\tfor (let i = 0; i < profile.points.length - 1; i++) {\n\n\t\t\tlet start = new THREE.Vector3(profile.points[i + 0].x, profile.points[i + 0].y, bsWorld.center.z);\n\t\t\tlet end = new THREE.Vector3(profile.points[i + 1].x, profile.points[i + 1].y, bsWorld.center.z);\n\n\t\t\tlet closest = new THREE.Line3(start, end).closestPointToPoint(bsWorld.center, true, new THREE.Vector3());\n\t\t\tlet distance = closest.distanceTo(bsWorld.center);\n\n\t\t\tintersects = intersects || (distance < (bsWorld.radius + profile.width));\n\t\t}\n\n\t\t//console.log(`${node.name}: ${intersects}`);\n\n\t\treturn intersects;\n\t}\n\n\tdeepestNodeAt(position){\n\t\t\n\t\tconst toObjectSpace = new THREE.Matrix4().getInverse(this.matrixWorld);\n\n\t\tconst objPos = position.clone().applyMatrix4(toObjectSpace);\n\n\t\tlet current = this.root;\n\t\twhile(true){\n\n\t\t\tlet containingChild = null;\n\n\t\t\tfor(const child of current.children){\n\n\t\t\t\tif(child !== undefined){\n\t\t\t\t\tif(child.getBoundingBox().containsPoint(objPos)){\n\t\t\t\t\t\tcontainingChild = child;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(containingChild !== null && containingChild instanceof PointCloudOctreeNode){\n\t\t\t\tcurrent = containingChild;\n\t\t\t}else{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst deepest = current;\n\n\t\treturn deepest;\n\t}\n\n\tnodesOnRay (nodes, ray) {\n\t\tlet nodesOnRay = [];\n\n\t\tlet _ray = ray.clone();\n\t\tfor (let i = 0; i < nodes.length; i++) {\n\t\t\tlet node = nodes[i];\n\t\t\t// let inverseWorld = new THREE.Matrix4().getInverse(node.matrixWorld);\n\t\t\t// let sphere = node.getBoundingSphere().clone().applyMatrix4(node.sceneNode.matrixWorld);\n\t\t\tlet sphere = node.getBoundingSphere().clone().applyMatrix4(this.matrixWorld);\n\n\t\t\tif (_ray.intersectsSphere(sphere)) {\n\t\t\t\tnodesOnRay.push(node);\n\t\t\t}\n\t\t}\n\n\t\treturn nodesOnRay;\n\t}\n\n\tupdateMatrixWorld (force) {\n\t\tif (this.matrixAutoUpdate === true) this.updateMatrix();\n\n\t\tif (this.matrixWorldNeedsUpdate === true || force === true) {\n\t\t\tif (!this.parent) {\n\t\t\t\tthis.matrixWorld.copy(this.matrix);\n\t\t\t} else {\n\t\t\t\tthis.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix);\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\t\t}\n\t}\n\n\thideDescendants (object) {\n\t\tlet stack = [];\n\t\tfor (let i = 0; i < object.children.length; i++) {\n\t\t\tlet child = object.children[i];\n\t\t\tif (child.visible) {\n\t\t\t\tstack.push(child);\n\t\t\t}\n\t\t}\n\n\t\twhile (stack.length > 0) {\n\t\t\tlet object = stack.shift();\n\n\t\t\tobject.visible = false;\n\n\t\t\tfor (let i = 0; i < object.children.length; i++) {\n\t\t\t\tlet child = object.children[i];\n\t\t\t\tif (child.visible) {\n\t\t\t\t\tstack.push(child);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tmoveToOrigin () {\n\t\tthis.position.set(0, 0, 0);\n\t\tthis.updateMatrixWorld(true);\n\t\tlet box = this.boundingBox;\n\t\tlet transform = this.matrixWorld;\n\t\tlet tBox = Utils.computeTransformedBoundingBox(box, transform);\n\t\tthis.position.set(0, 0, 0).sub(tBox.getCenter(new THREE.Vector3()));\n\t};\n\n\tmoveToGroundPlane () {\n\t\tthis.updateMatrixWorld(true);\n\t\tlet box = this.boundingBox;\n\t\tlet transform = this.matrixWorld;\n\t\tlet tBox = Utils.computeTransformedBoundingBox(box, transform);\n\t\tthis.position.y += -tBox.min.y;\n\t};\n\n\tgetBoundingBoxWorld () {\n\t\tthis.updateMatrixWorld(true);\n\t\tlet box = this.boundingBox;\n\t\tlet transform = this.matrixWorld;\n\t\tlet tBox = Utils.computeTransformedBoundingBox(box, transform);\n\n\t\treturn tBox;\n\t};\n\n\t/**\n\t * returns points inside the profile points\n\t *\n\t * maxDepth:\t\tsearch points up to the given octree depth\n\t *\n\t *\n\t * The return value is an array with all segments of the profile path\n\t *\tlet segment = {\n\t *\t\tstart:\tTHREE.Vector3,\n\t *\t\tend:\tTHREE.Vector3,\n\t *\t\tpoints: {}\n\t *\t\tproject: function()\n\t *\t};\n\t *\n\t * The project() function inside each segment can be used to transform\n\t * that segments point coordinates to line up along the x-axis.\n\t *\n\t *\n\t */\n\tgetPointsInProfile (profile, maxDepth, callback) {\n\t\tif (callback) {\n\t\t\tlet request = new Potree.ProfileRequest(this, profile, maxDepth, callback);\n\t\t\tthis.profileRequests.push(request);\n\n\t\t\treturn request;\n\t\t}\n\n\t\tlet points = {\n\t\t\tsegments: [],\n\t\t\tboundingBox: new THREE.Box3(),\n\t\t\tprojectedBoundingBox: new THREE.Box2()\n\t\t};\n\n\t\t// evaluate segments\n\t\tfor (let i = 0; i < profile.points.length - 1; i++) {\n\t\t\tlet start = profile.points[i];\n\t\t\tlet end = profile.points[i + 1];\n\t\t\tlet ps = this.getProfile(start, end, profile.width, maxDepth);\n\n\t\t\tlet segment = {\n\t\t\t\tstart: start,\n\t\t\t\tend: end,\n\t\t\t\tpoints: ps,\n\t\t\t\tproject: null\n\t\t\t};\n\n\t\t\tpoints.segments.push(segment);\n\n\t\t\tpoints.boundingBox.expandByPoint(ps.boundingBox.min);\n\t\t\tpoints.boundingBox.expandByPoint(ps.boundingBox.max);\n\t\t}\n\n\t\t// add projection functions to the segments\n\t\tlet mileage = new THREE.Vector3();\n\t\tfor (let i = 0; i < points.segments.length; i++) {\n\t\t\tlet segment = points.segments[i];\n\t\t\tlet start = segment.start;\n\t\t\tlet end = segment.end;\n\n\t\t\tlet project = (function (_start, _end, _mileage, _boundingBox) {\n\t\t\t\tlet start = _start;\n\t\t\t\tlet end = _end;\n\t\t\t\tlet mileage = _mileage;\n\t\t\t\tlet boundingBox = _boundingBox;\n\n\t\t\t\tlet xAxis = new THREE.Vector3(1, 0, 0);\n\t\t\t\tlet dir = new THREE.Vector3().subVectors(end, start);\n\t\t\t\tdir.y = 0;\n\t\t\t\tdir.normalize();\n\t\t\t\tlet alpha = Math.acos(xAxis.dot(dir));\n\t\t\t\tif (dir.z > 0) {\n\t\t\t\t\talpha = -alpha;\n\t\t\t\t}\n\n\t\t\t\treturn function (position) {\n\t\t\t\t\tlet toOrigin = new THREE.Matrix4().makeTranslation(-start.x, -boundingBox.min.y, -start.z);\n\t\t\t\t\tlet alignWithX = new THREE.Matrix4().makeRotationY(-alpha);\n\t\t\t\t\tlet applyMileage = new THREE.Matrix4().makeTranslation(mileage.x, 0, 0);\n\n\t\t\t\t\tlet pos = position.clone();\n\t\t\t\t\tpos.applyMatrix4(toOrigin);\n\t\t\t\t\tpos.applyMatrix4(alignWithX);\n\t\t\t\t\tpos.applyMatrix4(applyMileage);\n\n\t\t\t\t\treturn pos;\n\t\t\t\t};\n\t\t\t}(start, end, mileage.clone(), points.boundingBox.clone()));\n\n\t\t\tsegment.project = project;\n\n\t\t\tmileage.x += new THREE.Vector3(start.x, 0, start.z).distanceTo(new THREE.Vector3(end.x, 0, end.z));\n\t\t\tmileage.y += end.y - start.y;\n\t\t}\n\n\t\tpoints.projectedBoundingBox.min.x = 0;\n\t\tpoints.projectedBoundingBox.min.y = points.boundingBox.min.y;\n\t\tpoints.projectedBoundingBox.max.x = mileage.x;\n\t\tpoints.projectedBoundingBox.max.y = points.boundingBox.max.y;\n\n\t\treturn points;\n\t}\n\n\t/**\n\t * returns points inside the given profile bounds.\n\t *\n\t * start:\n\t * end:\n\t * width:\n\t * depth:\t\tsearch points up to the given octree depth\n\t * callback:\tif specified, points are loaded before searching\n\t *\n\t *\n\t */\n\tgetProfile (start, end, width, depth, callback) {\n\t\tlet request = new Potree.ProfileRequest(start, end, width, depth, callback);\n\t\tthis.profileRequests.push(request);\n\t};\n\n\tgetVisibleExtent () {\n\t\treturn this.visibleBounds.applyMatrix4(this.matrixWorld);\n\t};\n\n\tintersectsPoint(position){\n\n\t\tlet rootAvailable = this.pcoGeometry.root && this.pcoGeometry.root.geometry;\n\n\t\tif(!rootAvailable){\n\t\t\treturn false;\n\t\t}\n\n\t\tif(typeof this.signedDistanceField === \"undefined\"){\n\n\t\t\tconst resolution = 32;\n\t\t\tconst field = new Float32Array(resolution ** 3).fill(Infinity);\n\n\t\t\tconst positions = this.pcoGeometry.root.geometry.attributes.position;\n\t\t\tconst boundingBox = this.boundingBox;\n\n\t\t\tconst n = positions.count;\n\n\t\t\tfor(let i = 0; i < n; i = i + 3){\n\t\t\t\tconst x = positions.array[3 * i + 0];\n\t\t\t\tconst y = positions.array[3 * i + 1];\n\t\t\t\tconst z = positions.array[3 * i + 2];\n\n\t\t\t\tconst ix = parseInt(Math.min(resolution * (x / boundingBox.max.x), resolution - 1));\n\t\t\t\tconst iy = parseInt(Math.min(resolution * (y / boundingBox.max.y), resolution - 1));\n\t\t\t\tconst iz = parseInt(Math.min(resolution * (z / boundingBox.max.z), resolution - 1));\n\n\t\t\t\tconst index = ix + iy * resolution + iz * resolution * resolution;\n\n\t\t\t\tfield[index] = 0;\n\t\t\t}\n\n\t\t\tconst sdf = {\n\t\t\t\tresolution: resolution,\n\t\t\t\tfield: field,\n\t\t\t};\n\n\t\t\tthis.signedDistanceField = sdf;\n\t\t}\n\n\n\t\t{\n\t\t\tconst sdf = this.signedDistanceField;\n\t\t\tconst boundingBox = this.boundingBox;\n\n\t\t\tconst toObjectSpace = new THREE.Matrix4().getInverse(this.matrixWorld);\n\n\t\t\tconst objPos = position.clone().applyMatrix4(toObjectSpace);\n\n\t\t\tconst resolution = sdf.resolution;\n\t\t\tconst ix = parseInt(resolution * (objPos.x / boundingBox.max.x));\n\t\t\tconst iy = parseInt(resolution * (objPos.y / boundingBox.max.y));\n\t\t\tconst iz = parseInt(resolution * (objPos.z / boundingBox.max.z));\n\n\t\t\tif(ix < 0 || iy < 0 || iz < 0){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif(ix >= resolution || iy >= resolution || iz >= resolution){\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst index = ix + iy * resolution + iz * resolution * resolution;\n\n\t\t\tconst value = sdf.field[index];\n\n\t\t\tif(value === 0){\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t *\n\t *\n\t *\n\t * params.pickWindowSize:\tLook for points inside a pixel window of this size.\n\t *\t\t\t\t\t\t\tUse odd values: 1, 3, 5, ...\n\t *\n\t *\n\t * TODO: only draw pixels that are actually read with readPixels().\n\t *\n\t */\n\tpick(viewer, camera, ray, params = {}){\n\n\t\tlet renderer = viewer.renderer;\n\t\tlet pRenderer = viewer.pRenderer;\n\n\t\tperformance.mark(\"pick-start\");\n\n\t\tlet getVal = (a, b) => a !== undefined ? a : b;\n\n\t\tlet pickWindowSize = getVal(params.pickWindowSize, 17);\n\t\tlet pickOutsideClipRegion = getVal(params.pickOutsideClipRegion, false);\n\n\t\tpickWindowSize = 65;\n\n\t\tlet size = renderer.getSize(new THREE.Vector2());\n\n\t\tlet width = Math.ceil(getVal(params.width, size.width));\n\t\tlet height = Math.ceil(getVal(params.height, size.height));\n\n\t\tlet pointSizeType = getVal(params.pointSizeType, this.material.pointSizeType);\n\t\tlet pointSize = getVal(params.pointSize, this.material.size);\n\n\t\tlet nodes = this.nodesOnRay(this.visibleNodes, ray);\n\n\t\tif (nodes.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (!this.pickState) {\n\t\t\tlet scene = new THREE.Scene();\n\n\t\t\tlet material = new Potree.PointCloudMaterial();\n\t\t\tmaterial.activeAttributeName = \"indices\";\n\n\t\t\tlet renderTarget = new THREE.WebGLRenderTarget(\n\t\t\t\t1, 1,\n\t\t\t\t{ minFilter: THREE.LinearFilter,\n\t\t\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\t\t\tformat: THREE.RGBAFormat }\n\t\t\t);\n\n\t\t\tthis.pickState = {\n\t\t\t\trenderTarget: renderTarget,\n\t\t\t\tmaterial: material,\n\t\t\t\tscene: scene\n\t\t\t};\n\t\t};\n\n\t\tlet pickState = this.pickState;\n\t\tlet pickMaterial = pickState.material;\n\n\t\t{ // update pick material\n\t\t\tpickMaterial.pointSizeType = pointSizeType;\n\t\t\t//pickMaterial.shape = this.material.shape;\n\t\t\tpickMaterial.shape = Potree.PointShape.PARABOLOID;\n\n\t\t\tpickMaterial.uniforms.uFilterReturnNumberRange.value = this.material.uniforms.uFilterReturnNumberRange.value;\n\t\t\tpickMaterial.uniforms.uFilterNumberOfReturnsRange.value = this.material.uniforms.uFilterNumberOfReturnsRange.value;\n\t\t\tpickMaterial.uniforms.uFilterGPSTimeClipRange.value = this.material.uniforms.uFilterGPSTimeClipRange.value;\n\t\t\tpickMaterial.uniforms.uFilterPointSourceIDClipRange.value = this.material.uniforms.uFilterPointSourceIDClipRange.value;\n\n\t\t\tpickMaterial.activeAttributeName = \"indices\";\n\n\t\t\tpickMaterial.size = pointSize;\n\t\t\tpickMaterial.uniforms.minSize.value = this.material.uniforms.minSize.value;\n\t\t\tpickMaterial.uniforms.maxSize.value = this.material.uniforms.maxSize.value;\n\t\t\tpickMaterial.classification = this.material.classification;\n\t\t\tpickMaterial.recomputeClassification();\n\n\t\t\tif(params.pickClipped){\n\t\t\t\tpickMaterial.clipBoxes = this.material.clipBoxes;\n\t\t\t\tpickMaterial.uniforms.clipBoxes = this.material.uniforms.clipBoxes;\n\t\t\t\tif(this.material.clipTask === Potree.ClipTask.HIGHLIGHT){\n\t\t\t\t\tpickMaterial.clipTask = Potree.ClipTask.NONE;\n\t\t\t\t}else{\n\t\t\t\t\tpickMaterial.clipTask = this.material.clipTask;\n\t\t\t\t}\n\t\t\t\tpickMaterial.clipMethod = this.material.clipMethod;\n\t\t\t}else{\n\t\t\t\tpickMaterial.clipBoxes = [];\n\t\t\t}\n\n\t\t\tthis.updateMaterial(pickMaterial, nodes, camera, renderer);\n\t\t}\n\n\t\tpickState.renderTarget.setSize(width, height);\n\n\t\tlet pixelPos = new THREE.Vector2(params.x, params.y);\n\n\t\tlet gl = renderer.getContext();\n\t\tgl.enable(gl.SCISSOR_TEST);\n\t\tgl.scissor(\n\t\t\tparseInt(pixelPos.x - (pickWindowSize - 1) / 2),\n\t\t\tparseInt(pixelPos.y - (pickWindowSize - 1) / 2),\n\t\t\tparseInt(pickWindowSize), parseInt(pickWindowSize));\n\n\n\t\trenderer.state.buffers.depth.setTest(pickMaterial.depthTest);\n\t\trenderer.state.buffers.depth.setMask(pickMaterial.depthWrite);\n\t\trenderer.state.setBlending(THREE.NoBlending);\n\n\t\t{ // RENDER\n\t\t\trenderer.setRenderTarget(pickState.renderTarget);\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\trenderer.clear(true, true, true);\n\n\t\t\tlet tmp = this.material;\n\t\t\tthis.material = pickMaterial;\n\n\t\t\tpRenderer.renderOctree(this, nodes, camera, pickState.renderTarget);\n\n\t\t\tthis.material = tmp;\n\t\t}\n\n\t\tlet clamp = (number, min, max) => Math.min(Math.max(min, number), max);\n\n\t\tlet x = parseInt(clamp(pixelPos.x - (pickWindowSize - 1) / 2, 0, width));\n\t\tlet y = parseInt(clamp(pixelPos.y - (pickWindowSize - 1) / 2, 0, height));\n\t\tlet w = parseInt(Math.min(x + pickWindowSize, width) - x);\n\t\tlet h = parseInt(Math.min(y + pickWindowSize, height) - y);\n\n\t\tlet pixelCount = w * h;\n\t\tlet buffer = new Uint8Array(4 * pixelCount);\n\n\t\tgl.readPixels(x, y, pickWindowSize, pickWindowSize, gl.RGBA, gl.UNSIGNED_BYTE, buffer);\n\n\t\trenderer.setRenderTarget(null);\n\t\trenderer.state.reset();\n\t\trenderer.setScissorTest(false);\n\t\tgl.disable(gl.SCISSOR_TEST);\n\n\t\tlet pixels = buffer;\n\t\tlet ibuffer = new Uint32Array(buffer.buffer);\n\n\t\t// find closest hit inside pixelWindow boundaries\n\t\tlet min = Number.MAX_VALUE;\n\t\tlet hits = [];\n\t\tfor (let u = 0; u < pickWindowSize; u++) {\n\t\t\tfor (let v = 0; v < pickWindowSize; v++) {\n\t\t\t\tlet offset = (u + v * pickWindowSize);\n\t\t\t\tlet distance = Math.pow(u - (pickWindowSize - 1) / 2, 2) + Math.pow(v - (pickWindowSize - 1) / 2, 2);\n\n\t\t\t\tlet pcIndex = pixels[4 * offset + 3];\n\t\t\t\tpixels[4 * offset + 3] = 0;\n\t\t\t\tlet pIndex = ibuffer[offset];\n\n\t\t\t\tif(!(pcIndex === 0 && pIndex === 0) && (pcIndex !== undefined) && (pIndex !== undefined)){\n\t\t\t\t\tlet hit = {\n\t\t\t\t\t\tpIndex: pIndex,\n\t\t\t\t\t\tpcIndex: pcIndex,\n\t\t\t\t\t\tdistanceToCenter: distance\n\t\t\t\t\t};\n\n\t\t\t\t\tif(params.all){\n\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tif(hits.length > 0){\n\t\t\t\t\t\t\tif(distance < hits[0].distanceToCenter){\n\t\t\t\t\t\t\t\thits[0] = hit;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//DEBUG: show panel with pick image\n\t\t// {\n\t\t// \tlet img = Utils.pixelsArrayToImage(buffer, w, h);\n\t\t// \tlet screenshot = img.src;\n\t\t\n\t\t// \tif(!this.debugDIV){\n\t\t// \t\tthis.debugDIV = $(`\n\t\t// \t\t\t
    `);\n\t\t// \t\t$(document.body).append(this.debugDIV);\n\t\t// \t}\n\t\t\n\t\t// \tthis.debugDIV.empty();\n\t\t// \tthis.debugDIV.append($(``));\n\t\t// \t//$(this.debugWindow.document).append($(``));\n\t\t// \t//this.debugWindow.document.write('');\n\t\t// }\n\n\n\t\tfor(let hit of hits){\n\t\t\tlet point = {};\n\n\t\t\tif (!nodes[hit.pcIndex]) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlet node = nodes[hit.pcIndex];\n\t\t\tlet pc = node.sceneNode;\n\t\t\tlet geometry = node.geometryNode.geometry;\n\n\t\t\tfor(let attributeName in geometry.attributes){\n\t\t\t\tlet attribute = geometry.attributes[attributeName];\n\n\t\t\t\tif (attributeName === 'position') {\n\t\t\t\t\tlet x = attribute.array[3 * hit.pIndex + 0];\n\t\t\t\t\tlet y = attribute.array[3 * hit.pIndex + 1];\n\t\t\t\t\tlet z = attribute.array[3 * hit.pIndex + 2];\n\n\t\t\t\t\tlet position = new THREE.Vector3(x, y, z);\n\t\t\t\t\tposition.applyMatrix4(pc.matrixWorld);\n\n\t\t\t\t\tpoint[attributeName] = position;\n\t\t\t\t} else if (attributeName === 'indices') {\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet values = attribute.array.slice(attribute.itemSize * hit.pIndex, attribute.itemSize * (hit.pIndex + 1)) ;\n\n\t\t\t\t\tif(attribute.potree){\n\t\t\t\t\t\tconst {scale, offset} = attribute.potree;\n\t\t\t\t\t\tvalues = values.map(v => v / scale + offset);\n\t\t\t\t\t}\n\n\t\t\t\t\tpoint[attributeName] = values;\n\n\t\t\t\t\t//debugger;\n\t\t\t\t\t//if (values.itemSize === 1) {\n\t\t\t\t\t//\tpoint[attribute.name] = values.array[hit.pIndex];\n\t\t\t\t\t//} else {\n\t\t\t\t\t//\tlet value = [];\n\t\t\t\t\t//\tfor (let j = 0; j < values.itemSize; j++) {\n\t\t\t\t\t//\t\tvalue.push(values.array[values.itemSize * hit.pIndex + j]);\n\t\t\t\t\t//\t}\n\t\t\t\t\t//\tpoint[attribute.name] = value;\n\t\t\t\t\t//}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thit.point = point;\n\t\t}\n\n\t\tperformance.mark(\"pick-end\");\n\t\tperformance.measure(\"pick\", \"pick-start\", \"pick-end\");\n\n\t\tif(params.all){\n\t\t\treturn hits.map(hit => hit.point);\n\t\t}else{\n\t\t\tif(hits.length === 0){\n\t\t\t\treturn null;\n\t\t\t}else{\n\t\t\t\treturn hits[0].point;\n\t\t\t\t//let sorted = hits.sort( (a, b) => a.distanceToCenter - b.distanceToCenter);\n\n\t\t\t\t//return sorted[0].point;\n\t\t\t}\n\t\t}\n\n\t};\n\n\t* getFittedBoxGen(boxNode){\n\t\tlet start = performance.now();\n\n\t\tlet shrinkedLocalBounds = new THREE.Box3();\n\t\tlet worldToBox = new THREE.Matrix4().getInverse(boxNode.matrixWorld);\n\n\t\tfor(let node of this.visibleNodes){\n\t\t\tif(!node.sceneNode){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet buffer = node.geometryNode.buffer;\n\n\t\t\tlet posOffset = buffer.offset(\"position\");\n\t\t\tlet stride = buffer.stride;\n\t\t\tlet view = new DataView(buffer.data);\n\n\t\t\tlet objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, node.sceneNode.matrixWorld);\n\n\t\t\tlet pos = new THREE.Vector4();\n\t\t\tfor(let i = 0; i < buffer.numElements; i++){\n\t\t\t\tlet x = view.getFloat32(i * stride + posOffset + 0, true);\n\t\t\t\tlet y = view.getFloat32(i * stride + posOffset + 4, true);\n\t\t\t\tlet z = view.getFloat32(i * stride + posOffset + 8, true);\n\n\t\t\t\tpos.set(x, y, z, 1);\n\t\t\t\tpos.applyMatrix4(objectToBox);\n\n\t\t\t\tif(-0.5 < pos.x && pos.x < 0.5){\n\t\t\t\t\tif(-0.5 < pos.y && pos.y < 0.5){\n\t\t\t\t\t\tif(-0.5 < pos.z && pos.z < 0.5){\n\t\t\t\t\t\t\tshrinkedLocalBounds.expandByPoint(pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tyield;\n\t\t}\n\n\t\tlet fittedPosition = shrinkedLocalBounds.getCenter(new THREE.Vector3()).applyMatrix4(boxNode.matrixWorld);\n\n\t\tlet fitted = new THREE.Object3D();\n\t\tfitted.position.copy(fittedPosition);\n\t\tfitted.scale.copy(boxNode.scale);\n\t\tfitted.rotation.copy(boxNode.rotation);\n\n\t\tlet ds = new THREE.Vector3().subVectors(shrinkedLocalBounds.max, shrinkedLocalBounds.min);\n\t\tfitted.scale.multiply(ds);\n\n\t\tlet duration = performance.now() - start;\n\t\tconsole.log(\"duration: \", duration);\n\n\t\tyield fitted;\n\t}\n\n\tgetFittedBox(boxNode, maxLevel = Infinity){\n\n\t\tmaxLevel = Infinity;\n\n\t\tlet start = performance.now();\n\n\t\tlet shrinkedLocalBounds = new THREE.Box3();\n\t\tlet worldToBox = new THREE.Matrix4().getInverse(boxNode.matrixWorld);\n\n\t\tfor(let node of this.visibleNodes){\n\t\t\tif(!node.sceneNode || node.getLevel() > maxLevel){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet buffer = node.geometryNode.buffer;\n\n\t\t\tlet posOffset = buffer.offset(\"position\");\n\t\t\tlet stride = buffer.stride;\n\t\t\tlet view = new DataView(buffer.data);\n\n\t\t\tlet objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, node.sceneNode.matrixWorld);\n\n\t\t\tlet pos = new THREE.Vector4();\n\t\t\tfor(let i = 0; i < buffer.numElements; i++){\n\t\t\t\tlet x = view.getFloat32(i * stride + posOffset + 0, true);\n\t\t\t\tlet y = view.getFloat32(i * stride + posOffset + 4, true);\n\t\t\t\tlet z = view.getFloat32(i * stride + posOffset + 8, true);\n\n\t\t\t\tpos.set(x, y, z, 1);\n\t\t\t\tpos.applyMatrix4(objectToBox);\n\n\t\t\t\tif(-0.5 < pos.x && pos.x < 0.5){\n\t\t\t\t\tif(-0.5 < pos.y && pos.y < 0.5){\n\t\t\t\t\t\tif(-0.5 < pos.z && pos.z < 0.5){\n\t\t\t\t\t\t\tshrinkedLocalBounds.expandByPoint(pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet fittedPosition = shrinkedLocalBounds.getCenter(new THREE.Vector3()).applyMatrix4(boxNode.matrixWorld);\n\n\t\tlet fitted = new THREE.Object3D();\n\t\tfitted.position.copy(fittedPosition);\n\t\tfitted.scale.copy(boxNode.scale);\n\t\tfitted.rotation.copy(boxNode.rotation);\n\n\t\tlet ds = new THREE.Vector3().subVectors(shrinkedLocalBounds.max, shrinkedLocalBounds.min);\n\t\tfitted.scale.multiply(ds);\n\n\t\tlet duration = performance.now() - start;\n\t\tconsole.log(\"duration: \", duration);\n\n\t\treturn fitted;\n\t}\n\n\tget progress () {\n\t\treturn this.visibleNodes.length / this.visibleGeometry.length;\n\t}\n\n\tfind(name){\n\t\tlet node = null;\n\t\tfor(let char of name){\n\t\t\tif(char === \"r\"){\n\t\t\t\tnode = this.root;\n\t\t\t}else{\n\t\t\t\tnode = node.children[char];\n\t\t\t}\n\t\t}\n\n\t\treturn node;\n\t}\n\n\tget visible(){\n\t\treturn this._visible;\n\t}\n\n\tset visible(value){\n\n\t\tif(value !== this._visible){\n\t\t\tthis._visible = value;\n\n\t\t\tthis.dispatchEvent({type: 'visibility_changed', pointcloud: this});\n\t\t}\n\n\t}\n\n}\n\n\n\n\n\n\n\n\n\n\n","\n\nexport class Points {\n\t\n\tconstructor () {\n\t\tthis.boundingBox = new THREE.Box3();\n\t\tthis.numPoints = 0;\n\t\tthis.data = {};\n\t}\n\n\tadd (points) {\n\t\tlet currentSize = this.numPoints;\n\t\tlet additionalSize = points.numPoints;\n\t\tlet newSize = currentSize + additionalSize;\n\n\t\tlet thisAttributes = Object.keys(this.data);\n\t\tlet otherAttributes = Object.keys(points.data);\n\t\tlet attributes = new Set([...thisAttributes, ...otherAttributes]);\n\n\t\tfor (let attribute of attributes) {\n\t\t\tif (thisAttributes.includes(attribute) && otherAttributes.includes(attribute)) {\n\t\t\t\t// attribute in both, merge\n\t\t\t\tlet Type = this.data[attribute].constructor;\n\t\t\t\tlet merged = new Type(this.data[attribute].length + points.data[attribute].length);\n\t\t\t\tmerged.set(this.data[attribute], 0);\n\t\t\t\tmerged.set(points.data[attribute], this.data[attribute].length);\n\t\t\t\tthis.data[attribute] = merged;\n\t\t\t} else if (thisAttributes.includes(attribute) && !otherAttributes.includes(attribute)) {\n\t\t\t\t// attribute only in this; take over this and expand to new size\n\t\t\t\tlet elementsPerPoint = this.data[attribute].length / this.numPoints;\n\t\t\t\tlet Type = this.data[attribute].constructor;\n\t\t\t\tlet expanded = new Type(elementsPerPoint * newSize);\n\t\t\t\texpanded.set(this.data[attribute], 0);\n\t\t\t\tthis.data[attribute] = expanded;\n\t\t\t} else if (!thisAttributes.includes(attribute) && otherAttributes.includes(attribute)) {\n\t\t\t\t// attribute only in points to be added; take over new points and expand to new size\n\t\t\t\tlet elementsPerPoint = points.data[attribute].length / points.numPoints;\n\t\t\t\tlet Type = points.data[attribute].constructor;\n\t\t\t\tlet expanded = new Type(elementsPerPoint * newSize);\n\t\t\t\texpanded.set(points.data[attribute], elementsPerPoint * currentSize);\n\t\t\t\tthis.data[attribute] = expanded;\n\t\t\t}\n\t\t}\n\n\t\tthis.numPoints = newSize;\n\n\t\tthis.boundingBox.union(points.boundingBox);\n\t}\n}","/**\n *\n * code adapted from three.js BoxHelper.js\n * https://github.com/mrdoob/three.js/blob/dev/src/helpers/BoxHelper.js\n *\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / http://github.com/Mugen87\n * @author mschuetz / http://potree.org\n */\n\nexport class Box3Helper extends THREE.LineSegments {\n\tconstructor (box, color) {\n\t\tif (color === undefined) color = 0xffff00;\n\n\t\tlet indices = new Uint16Array([ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ]);\n\t\tlet positions = new Float32Array([\n\t\t\tbox.min.x, box.min.y, box.min.z,\n\t\t\tbox.max.x, box.min.y, box.min.z,\n\t\t\tbox.max.x, box.min.y, box.max.z,\n\t\t\tbox.min.x, box.min.y, box.max.z,\n\t\t\tbox.min.x, box.max.y, box.min.z,\n\t\t\tbox.max.x, box.max.y, box.min.z,\n\t\t\tbox.max.x, box.max.y, box.max.z,\n\t\t\tbox.min.x, box.max.y, box.max.z\n\t\t]);\n\n\t\tlet geometry = new THREE.BufferGeometry();\n\t\tgeometry.setIndex(new THREE.BufferAttribute(indices, 1));\n\t\tgeometry.addAttribute('position', new THREE.BufferAttribute(positions, 3));\n\n\t\tlet material = new THREE.LineBasicMaterial({ color: color });\n\n\t\tsuper(geometry, material);\n\t}\n}\n","\nimport {ClipTask, ClipMethod} from \"./defines.js\";\nimport {Box3Helper} from \"./utils/Box3Helper.js\";\n\nexport function updatePointClouds(pointclouds, camera, renderer){\n\n\tfor (let pointcloud of pointclouds) {\n\t\tlet start = performance.now();\n\n\t\tfor (let profileRequest of pointcloud.profileRequests) {\n\t\t\tprofileRequest.update();\n\n\t\t\tlet duration = performance.now() - start;\n\t\t\tif(duration > 5){\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tlet duration = performance.now() - start;\n\t}\n\n\tlet result = updateVisibility(pointclouds, camera, renderer);\n\n\tfor (let pointcloud of pointclouds) {\n\t\tpointcloud.updateMaterial(pointcloud.material, pointcloud.visibleNodes, camera, renderer);\n\t\tpointcloud.updateVisibleBounds();\n\t}\n\n\texports.lru.freeMemory();\n\n\treturn result;\n};\n\n\n\nexport function updateVisibilityStructures(pointclouds, camera, renderer) {\n\tlet frustums = [];\n\tlet camObjPositions = [];\n\tlet priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; });\n\n\tfor (let i = 0; i < pointclouds.length; i++) {\n\t\tlet pointcloud = pointclouds[i];\n\n\t\tif (!pointcloud.initialized()) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tpointcloud.numVisibleNodes = 0;\n\t\tpointcloud.numVisiblePoints = 0;\n\t\tpointcloud.deepestVisibleLevel = 0;\n\t\tpointcloud.visibleNodes = [];\n\t\tpointcloud.visibleGeometry = [];\n\n\t\t// frustum in object space\n\t\tcamera.updateMatrixWorld();\n\t\tlet frustum = new THREE.Frustum();\n\t\tlet viewI = camera.matrixWorldInverse;\n\t\tlet world = pointcloud.matrixWorld;\n\t\t\n\t\t// use close near plane for frustum intersection\n\t\tlet frustumCam = camera.clone();\n\t\tfrustumCam.near = Math.min(camera.near, 0.1);\n\t\tfrustumCam.updateProjectionMatrix();\n\t\tlet proj = camera.projectionMatrix;\n\n\t\tlet fm = new THREE.Matrix4().multiply(proj).multiply(viewI).multiply(world);\n\t\tfrustum.setFromMatrix(fm);\n\t\tfrustums.push(frustum);\n\n\t\t// camera position in object space\n\t\tlet view = camera.matrixWorld;\n\t\tlet worldI = new THREE.Matrix4().getInverse(world);\n\t\tlet camMatrixObject = new THREE.Matrix4().multiply(worldI).multiply(view);\n\t\tlet camObjPos = new THREE.Vector3().setFromMatrixPosition(camMatrixObject);\n\t\tcamObjPositions.push(camObjPos);\n\n\t\tif (pointcloud.visible && pointcloud.root !== null) {\n\t\t\tpriorityQueue.push({pointcloud: i, node: pointcloud.root, weight: Number.MAX_VALUE});\n\t\t}\n\n\t\t// hide all previously visible nodes\n\t\t// if(pointcloud.root instanceof PointCloudOctreeNode){\n\t\t//\tpointcloud.hideDescendants(pointcloud.root.sceneNode);\n\t\t// }\n\t\tif (pointcloud.root.isTreeNode()) {\n\t\t\tpointcloud.hideDescendants(pointcloud.root.sceneNode);\n\t\t}\n\n\t\tfor (let j = 0; j < pointcloud.boundingBoxNodes.length; j++) {\n\t\t\tpointcloud.boundingBoxNodes[j].visible = false;\n\t\t}\n\t}\n\n\treturn {\n\t\t'frustums': frustums,\n\t\t'camObjPositions': camObjPositions,\n\t\t'priorityQueue': priorityQueue\n\t};\n};\n\n\nexport function updateVisibility(pointclouds, camera, renderer){\n\n\tlet numVisibleNodes = 0;\n\tlet numVisiblePoints = 0;\n\n\tlet numVisiblePointsInPointclouds = new Map(pointclouds.map(pc => [pc, 0]));\n\n\tlet visibleNodes = [];\n\tlet visibleGeometry = [];\n\tlet unloadedGeometry = [];\n\n\tlet lowestSpacing = Infinity;\n\n\t// calculate object space frustum and cam pos and setup priority queue\n\tlet s = updateVisibilityStructures(pointclouds, camera, renderer);\n\tlet frustums = s.frustums;\n\tlet camObjPositions = s.camObjPositions;\n\tlet priorityQueue = s.priorityQueue;\n\n\tlet loadedToGPUThisFrame = 0;\n\t\n\tlet domWidth = renderer.domElement.clientWidth;\n\tlet domHeight = renderer.domElement.clientHeight;\n\n\t// check if pointcloud has been transformed\n\t// some code will only be executed if changes have been detected\n\tif(!Potree._pointcloudTransformVersion){\n\t\tPotree._pointcloudTransformVersion = new Map();\n\t}\n\tlet pointcloudTransformVersion = Potree._pointcloudTransformVersion;\n\tfor(let pointcloud of pointclouds){\n\n\t\tif(!pointcloud.visible){\n\t\t\tcontinue;\n\t\t}\n\n\t\tpointcloud.updateMatrixWorld();\n\n\t\tif(!pointcloudTransformVersion.has(pointcloud)){\n\t\t\tpointcloudTransformVersion.set(pointcloud, {number: 0, transform: pointcloud.matrixWorld.clone()});\n\t\t}else{\n\t\t\tlet version = pointcloudTransformVersion.get(pointcloud);\n\n\t\t\tif(!version.transform.equals(pointcloud.matrixWorld)){\n\t\t\t\tversion.number++;\n\t\t\t\tversion.transform.copy(pointcloud.matrixWorld);\n\n\t\t\t\tpointcloud.dispatchEvent({\n\t\t\t\t\ttype: \"transformation_changed\",\n\t\t\t\t\ttarget: pointcloud\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\twhile (priorityQueue.size() > 0) {\n\t\tlet element = priorityQueue.pop();\n\t\tlet node = element.node;\n\t\tlet parent = element.parent;\n\t\tlet pointcloud = pointclouds[element.pointcloud];\n\n\t\t// { // restrict to certain nodes for debugging\n\t\t//\tlet allowedNodes = [\"r\", \"r0\", \"r4\"];\n\t\t//\tif(!allowedNodes.includes(node.name)){\n\t\t//\t\tcontinue;\n\t\t//\t}\n\t\t// }\n\n\t\tlet box = node.getBoundingBox();\n\t\tlet frustum = frustums[element.pointcloud];\n\t\tlet camObjPos = camObjPositions[element.pointcloud];\n\n\t\tlet insideFrustum = frustum.intersectsBox(box);\n\t\tlet maxLevel = pointcloud.maxLevel || Infinity;\n\t\tlet level = node.getLevel();\n\t\tlet visible = insideFrustum;\n\t\tvisible = visible && !(numVisiblePoints + node.getNumPoints() > Potree.pointBudget);\n\t\tvisible = visible && !(numVisiblePointsInPointclouds.get(pointcloud) + node.getNumPoints() > pointcloud.pointBudget);\n\t\tvisible = visible && level < maxLevel;\n\t\t//visible = visible && node.name !== \"r613\";\n\n\t\tlet clipBoxes = pointcloud.material.clipBoxes;\n\t\tif(true && clipBoxes.length > 0){\n\n\t\t\t//node.debug = false;\n\n\t\t\tlet numIntersecting = 0;\n\t\t\tlet numIntersectionVolumes = 0;\n\n\t\t\t//if(node.name === \"r60\"){\n\t\t\t//\tvar a = 10;\n\t\t\t//}\n\n\t\t\tfor(let clipBox of clipBoxes){\n\n\t\t\t\tlet pcWorldInverse = new THREE.Matrix4().getInverse(pointcloud.matrixWorld);\n\t\t\t\tlet toPCObject = pcWorldInverse.multiply(clipBox.box.matrixWorld);\n\n\t\t\t\tlet px = new THREE.Vector3(+0.5, 0, 0).applyMatrix4(pcWorldInverse);\n\t\t\t\tlet nx = new THREE.Vector3(-0.5, 0, 0).applyMatrix4(pcWorldInverse);\n\t\t\t\tlet py = new THREE.Vector3(0, +0.5, 0).applyMatrix4(pcWorldInverse);\n\t\t\t\tlet ny = new THREE.Vector3(0, -0.5, 0).applyMatrix4(pcWorldInverse);\n\t\t\t\tlet pz = new THREE.Vector3(0, 0, +0.5).applyMatrix4(pcWorldInverse);\n\t\t\t\tlet nz = new THREE.Vector3(0, 0, -0.5).applyMatrix4(pcWorldInverse);\n\n\t\t\t\tlet pxN = new THREE.Vector3().subVectors(nx, px).normalize();\n\t\t\t\tlet nxN = pxN.clone().multiplyScalar(-1);\n\t\t\t\tlet pyN = new THREE.Vector3().subVectors(ny, py).normalize();\n\t\t\t\tlet nyN = pyN.clone().multiplyScalar(-1);\n\t\t\t\tlet pzN = new THREE.Vector3().subVectors(nz, pz).normalize();\n\t\t\t\tlet nzN = pzN.clone().multiplyScalar(-1);\n\n\t\t\t\tlet pxPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(pxN, px);\n\t\t\t\tlet nxPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(nxN, nx);\n\t\t\t\tlet pyPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(pyN, py);\n\t\t\t\tlet nyPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(nyN, ny);\n\t\t\t\tlet pzPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(pzN, pz);\n\t\t\t\tlet nzPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(nzN, nz);\n\n\t\t\t\t//if(window.debugdraw !== undefined && window.debugdraw === true && node.name === \"r60\"){\n\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, pxPlane, 1, 0xFF0000);\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, nxPlane, 1, 0x990000);\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, pyPlane, 1, 0x00FF00);\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, nyPlane, 1, 0x009900);\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, pzPlane, 1, 0x0000FF);\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, nzPlane, 1, 0x000099);\n\n\t\t\t\t//\tPotree.utils.debugBox(viewer.scene.scene, box, new THREE.Matrix4(), 0x00FF00);\n\t\t\t\t//\tPotree.utils.debugBox(viewer.scene.scene, box, pointcloud.matrixWorld, 0xFF0000);\n\t\t\t\t//\tPotree.utils.debugBox(viewer.scene.scene, clipBox.box.boundingBox, clipBox.box.matrixWorld, 0xFF0000);\n\n\t\t\t\t//\twindow.debugdraw = false;\n\t\t\t\t//}\n\n\t\t\t\tlet frustum = new THREE.Frustum(pxPlane, nxPlane, pyPlane, nyPlane, pzPlane, nzPlane);\n\t\t\t\tlet intersects = frustum.intersectsBox(box);\n\n\t\t\t\tif(intersects){\n\t\t\t\t\tnumIntersecting++;\n\t\t\t\t}\n\t\t\t\tnumIntersectionVolumes++;\n\t\t\t}\n\n\t\t\tlet insideAny = numIntersecting > 0;\n\t\t\tlet insideAll = numIntersecting === numIntersectionVolumes;\n\n\t\t\tif(pointcloud.material.clipTask === ClipTask.SHOW_INSIDE){\n\t\t\t\tif(pointcloud.material.clipMethod === ClipMethod.INSIDE_ANY && insideAny){\n\t\t\t\t\t//node.debug = true\n\t\t\t\t}else if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ALL && insideAll){\n\t\t\t\t\t//node.debug = true;\n\t\t\t\t}else{\n\t\t\t\t\tvisible = false;\n\t\t\t\t}\n\t\t\t} else if(pointcloud.material.clipTask === ClipTask.SHOW_OUTSIDE){\n\t\t\t\t//if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ANY && !insideAny){\n\t\t\t\t//\t//visible = true;\n\t\t\t\t//\tlet a = 10;\n\t\t\t\t//}else if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ALL && !insideAll){\n\t\t\t\t//\t//visible = true;\n\t\t\t\t//\tlet a = 20;\n\t\t\t\t//}else{\n\t\t\t\t//\tvisible = false;\n\t\t\t\t//}\n\t\t\t}\n\t\t\t\n\n\t\t}\n\n\t\t// visible = [\"r\", \"r0\", \"r06\", \"r060\"].includes(node.name);\n\t\t// visible = [\"r\"].includes(node.name);\n\n\t\tif (node.spacing) {\n\t\t\tlowestSpacing = Math.min(lowestSpacing, node.spacing);\n\t\t} else if (node.geometryNode && node.geometryNode.spacing) {\n\t\t\tlowestSpacing = Math.min(lowestSpacing, node.geometryNode.spacing);\n\t\t}\n\n\t\tif (numVisiblePoints + node.getNumPoints() > Potree.pointBudget) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (!visible) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TODO: not used, same as the declaration?\n\t\t// numVisibleNodes++;\n\t\tnumVisiblePoints += node.getNumPoints();\n\t\tlet numVisiblePointsInPointcloud = numVisiblePointsInPointclouds.get(pointcloud);\n\t\tnumVisiblePointsInPointclouds.set(pointcloud, numVisiblePointsInPointcloud + node.getNumPoints());\n\n\t\tpointcloud.numVisibleNodes++;\n\t\tpointcloud.numVisiblePoints += node.getNumPoints();\n\n\t\tif (node.isGeometryNode() && (!parent || parent.isTreeNode())) {\n\t\t\tif (node.isLoaded() && loadedToGPUThisFrame < 2) {\n\t\t\t\tnode = pointcloud.toTreeNode(node, parent);\n\t\t\t\tloadedToGPUThisFrame++;\n\t\t\t} else {\n\t\t\t\tunloadedGeometry.push(node);\n\t\t\t\tvisibleGeometry.push(node);\n\t\t\t}\n\t\t}\n\n\t\tif (node.isTreeNode()) {\n\t\t\texports.lru.touch(node.geometryNode);\n\t\t\tnode.sceneNode.visible = true;\n\t\t\tnode.sceneNode.material = pointcloud.material;\n\n\t\t\tvisibleNodes.push(node);\n\t\t\tpointcloud.visibleNodes.push(node);\n\n\t\t\tif(node._transformVersion === undefined){\n\t\t\t\tnode._transformVersion = -1;\n\t\t\t}\n\t\t\tlet transformVersion = pointcloudTransformVersion.get(pointcloud);\n\t\t\tif(node._transformVersion !== transformVersion.number){\n\t\t\t\tnode.sceneNode.updateMatrix();\n\t\t\t\tnode.sceneNode.matrixWorld.multiplyMatrices(pointcloud.matrixWorld, node.sceneNode.matrix);\t\n\t\t\t\tnode._transformVersion = transformVersion.number;\n\t\t\t}\n\n\t\t\tif (pointcloud.showBoundingBox && !node.boundingBoxNode && node.getBoundingBox) {\n\t\t\t\tlet boxHelper = new Box3Helper(node.getBoundingBox());\n\t\t\t\tboxHelper.matrixAutoUpdate = false;\n\t\t\t\tpointcloud.boundingBoxNodes.push(boxHelper);\n\t\t\t\tnode.boundingBoxNode = boxHelper;\n\t\t\t\tnode.boundingBoxNode.matrix.copy(pointcloud.matrixWorld);\n\t\t\t} else if (pointcloud.showBoundingBox) {\n\t\t\t\tnode.boundingBoxNode.visible = true;\n\t\t\t\tnode.boundingBoxNode.matrix.copy(pointcloud.matrixWorld);\n\t\t\t} else if (!pointcloud.showBoundingBox && node.boundingBoxNode) {\n\t\t\t\tnode.boundingBoxNode.visible = false;\n\t\t\t}\n\n\t\t\t// if(node.boundingBoxNode !== undefined && exports.debug.allowedNodes !== undefined){\n\t\t\t// \tif(!exports.debug.allowedNodes.includes(node.name)){\n\t\t\t// \t\tnode.boundingBoxNode.visible = false;\n\t\t\t// \t}\n\t\t\t// }\n\t\t}\n\n\t\t// add child nodes to priorityQueue\n\t\tlet children = node.getChildren();\n\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\tlet child = children[i];\n\n\t\t\tlet weight = 0; \n\t\t\tif(camera.isPerspectiveCamera){\n\t\t\t\tlet sphere = child.getBoundingSphere();\n\t\t\t\tlet center = sphere.center;\n\t\t\t\t//let distance = sphere.center.distanceTo(camObjPos);\n\t\t\t\t\n\t\t\t\tlet dx = camObjPos.x - center.x;\n\t\t\t\tlet dy = camObjPos.y - center.y;\n\t\t\t\tlet dz = camObjPos.z - center.z;\n\t\t\t\t\n\t\t\t\tlet dd = dx * dx + dy * dy + dz * dz;\n\t\t\t\tlet distance = Math.sqrt(dd);\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tlet radius = sphere.radius;\n\t\t\t\t\n\t\t\t\tlet fov = (camera.fov * Math.PI) / 180;\n\t\t\t\tlet slope = Math.tan(fov / 2);\n\t\t\t\tlet projFactor = (0.5 * domHeight) / (slope * distance);\n\t\t\t\tlet screenPixelRadius = radius * projFactor;\n\t\t\t\t\n\t\t\t\tif(screenPixelRadius < pointcloud.minimumNodePixelSize){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\n\t\t\t\tweight = screenPixelRadius;\n\n\t\t\t\tif(distance - radius < 0){\n\t\t\t\t\tweight = Number.MAX_VALUE;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// TODO ortho visibility\n\t\t\t\tlet bb = child.getBoundingBox();\t\t\t\t\n\t\t\t\tlet distance = child.getBoundingSphere().center.distanceTo(camObjPos);\n\t\t\t\tlet diagonal = bb.max.clone().sub(bb.min).length();\n\t\t\t\t//weight = diagonal / distance;\n\n\t\t\t\tweight = diagonal;\n\t\t\t}\n\n\t\t\tpriorityQueue.push({pointcloud: element.pointcloud, node: child, parent: node, weight: weight});\n\t\t}\n\t}// end priority queue loop\n\n\t{ // update DEM\n\t\tlet maxDEMLevel = 4;\n\t\tlet candidates = pointclouds\n\t\t\t.filter(p => (p.generateDEM && p.dem instanceof Potree.DEM));\n\t\tfor (let pointcloud of candidates) {\n\t\t\tlet updatingNodes = pointcloud.visibleNodes.filter(n => n.getLevel() <= maxDEMLevel);\n\t\t\tpointcloud.dem.update(updatingNodes);\n\t\t}\n\t}\n\n\tfor (let i = 0; i < Math.min(Potree.maxNodesLoading, unloadedGeometry.length); i++) {\n\t\tunloadedGeometry[i].load();\n\t}\n\n\treturn {\n\t\tvisibleNodes: visibleNodes,\n\t\tnumVisiblePoints: numVisiblePoints,\n\t\tlowestSpacing: lowestSpacing\n\t};\n};\n\n","\n\nimport {PointCloudTree, PointCloudTreeNode} from \"../PointCloudTree.js\";\nimport {PointCloudMaterial} from \"../materials/PointCloudMaterial.js\";\nimport {PointSizeType, ClipTask, TreeType} from \"../defines.js\";\nimport {Utils} from \"../utils.js\";\n\n\n\nexport class PointCloudArena4DNode extends PointCloudTreeNode {\n\tconstructor () {\n\t\tsuper();\n\n\t\tthis.left = null;\n\t\tthis.right = null;\n\t\tthis.sceneNode = null;\n\t\tthis.kdtree = null;\n\t}\n\n\tgetNumPoints () {\n\t\treturn this.geometryNode.numPoints;\n\t}\n\n\tisLoaded () {\n\t\treturn true;\n\t}\n\n\tisTreeNode () {\n\t\treturn true;\n\t}\n\n\tisGeometryNode () {\n\t\treturn false;\n\t}\n\n\tgetLevel () {\n\t\treturn this.geometryNode.level;\n\t}\n\n\tgetBoundingSphere () {\n\t\treturn this.geometryNode.boundingSphere;\n\t}\n\n\tgetBoundingBox () {\n\t\treturn this.geometryNode.boundingBox;\n\t}\n\n\ttoTreeNode (child) {\n\t\tlet geometryNode = null;\n\n\t\tif (this.left === child) {\n\t\t\tgeometryNode = this.left;\n\t\t} else if (this.right === child) {\n\t\t\tgeometryNode = this.right;\n\t\t}\n\n\t\tif (!geometryNode.loaded) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet node = new PointCloudArena4DNode();\n\t\tlet sceneNode = THREE.PointCloud(geometryNode.geometry, this.kdtree.material);\n\t\tsceneNode.visible = false;\n\n\t\tnode.kdtree = this.kdtree;\n\t\tnode.geometryNode = geometryNode;\n\t\tnode.sceneNode = sceneNode;\n\t\tnode.parent = this;\n\t\tnode.left = this.geometryNode.left;\n\t\tnode.right = this.geometryNode.right;\n\t}\n\n\tgetChildren () {\n\t\tlet children = [];\n\n\t\tif (this.left) {\n\t\t\tchildren.push(this.left);\n\t\t}\n\n\t\tif (this.right) {\n\t\t\tchildren.push(this.right);\n\t\t}\n\n\t\treturn children;\n\t}\n};\n\nexport class PointCloudArena4D extends PointCloudTree{\n\tconstructor (geometry) {\n\t\tsuper();\n\n\t\tthis.root = null;\n\t\tif (geometry.root) {\n\t\t\tthis.root = geometry.root;\n\t\t} else {\n\t\t\tgeometry.addEventListener('hierarchy_loaded', () => {\n\t\t\t\tthis.root = geometry.root;\n\t\t\t});\n\t\t}\n\n\t\tthis.visiblePointsTarget = 2 * 1000 * 1000;\n\t\tthis.minimumNodePixelSize = 150;\n\n\t\tthis.position.sub(geometry.offset);\n\t\tthis.updateMatrix();\n\n\t\tthis.numVisibleNodes = 0;\n\t\tthis.numVisiblePoints = 0;\n\n\t\tthis.boundingBoxNodes = [];\n\t\tthis.loadQueue = [];\n\t\tthis.visibleNodes = [];\n\n\t\tthis.pcoGeometry = geometry;\n\t\tthis.boundingBox = this.pcoGeometry.boundingBox;\n\t\tthis.boundingSphere = this.pcoGeometry.boundingSphere;\n\t\tthis.material = new PointCloudMaterial({vertexColors: THREE.VertexColors, size: 0.05, treeType: TreeType.KDTREE});\n\t\tthis.material.sizeType = PointSizeType.ATTENUATED;\n\t\tthis.material.size = 0.05;\n\t\tthis.profileRequests = [];\n\t\tthis.name = '';\n\t}\n\n\tgetBoundingBoxWorld () {\n\t\tthis.updateMatrixWorld(true);\n\t\tlet box = this.boundingBox;\n\t\tlet transform = this.matrixWorld;\n\t\tlet tBox = Utils.computeTransformedBoundingBox(box, transform);\n\n\t\treturn tBox;\n\t};\n\n\tsetName (name) {\n\t\tif (this.name !== name) {\n\t\t\tthis.name = name;\n\t\t\tthis.dispatchEvent({type: 'name_changed', name: name, pointcloud: this});\n\t\t}\n\t}\n\n\tgetName () {\n\t\treturn this.name;\n\t}\n\n\tgetLevel () {\n\t\treturn this.level;\n\t}\n\n\ttoTreeNode (geometryNode, parent) {\n\t\tlet node = new PointCloudArena4DNode();\n\t\tlet sceneNode = new THREE.Points(geometryNode.geometry, this.material);\n\n\t\tsceneNode.frustumCulled = false;\n\t\tsceneNode.onBeforeRender = (_this, scene, camera, geometry, material, group) => {\n\t\t\tif (material.program) {\n\t\t\t\t_this.getContext().useProgram(material.program.program);\n\n\t\t\t\tif (material.program.getUniforms().map.level) {\n\t\t\t\t\tlet level = geometryNode.getLevel();\n\t\t\t\t\tmaterial.uniforms.level.value = level;\n\t\t\t\t\tmaterial.program.getUniforms().map.level.setValue(_this.getContext(), level);\n\t\t\t\t}\n\n\t\t\t\tif (this.visibleNodeTextureOffsets && material.program.getUniforms().map.vnStart) {\n\t\t\t\t\tlet vnStart = this.visibleNodeTextureOffsets.get(node);\n\t\t\t\t\tmaterial.uniforms.vnStart.value = vnStart;\n\t\t\t\t\tmaterial.program.getUniforms().map.vnStart.setValue(_this.getContext(), vnStart);\n\t\t\t\t}\n\n\t\t\t\tif (material.program.getUniforms().map.pcIndex) {\n\t\t\t\t\tlet i = node.pcIndex ? node.pcIndex : this.visibleNodes.indexOf(node);\n\t\t\t\t\tmaterial.uniforms.pcIndex.value = i;\n\t\t\t\t\tmaterial.program.getUniforms().map.pcIndex.setValue(_this.getContext(), i);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tnode.geometryNode = geometryNode;\n\t\tnode.sceneNode = sceneNode;\n\t\tnode.pointcloud = this;\n\t\tnode.left = geometryNode.left;\n\t\tnode.right = geometryNode.right;\n\n\t\tif (!parent) {\n\t\t\tthis.root = node;\n\t\t\tthis.add(sceneNode);\n\t\t} else {\n\t\t\tparent.sceneNode.add(sceneNode);\n\n\t\t\tif (parent.left === geometryNode) {\n\t\t\t\tparent.left = node;\n\t\t\t} else if (parent.right === geometryNode) {\n\t\t\t\tparent.right = node;\n\t\t\t}\n\t\t}\n\n\t\tlet disposeListener = function () {\n\t\t\tparent.sceneNode.remove(node.sceneNode);\n\n\t\t\tif (parent.left === node) {\n\t\t\t\tparent.left = geometryNode;\n\t\t\t} else if (parent.right === node) {\n\t\t\t\tparent.right = geometryNode;\n\t\t\t}\n\t\t};\n\t\tgeometryNode.oneTimeDisposeHandlers.push(disposeListener);\n\n\t\treturn node;\n\t}\n\n\tupdateMaterial (material, visibleNodes, camera, renderer) {\n\t\tmaterial.fov = camera.fov * (Math.PI / 180);\n\t\tmaterial.screenWidth = renderer.domElement.clientWidth;\n\t\tmaterial.screenHeight = renderer.domElement.clientHeight;\n\t\tmaterial.spacing = this.pcoGeometry.spacing;\n\t\tmaterial.near = camera.near;\n\t\tmaterial.far = camera.far;\n\n\t\t// reduce shader source updates by setting maxLevel slightly higher than actually necessary\n\t\tif (this.maxLevel > material.levels) {\n\t\t\tmaterial.levels = this.maxLevel + 2;\n\t\t}\n\n\t\t// material.uniforms.octreeSize.value = this.boundingBox.size().x;\n\t\tlet bbSize = this.boundingBox.getSize(new THREE.Vector3());\n\t\tmaterial.bbSize = [bbSize.x, bbSize.y, bbSize.z];\n\t}\n\n\tupdateVisibleBounds () {\n\n\t}\n\n\thideDescendants (object) {\n\t\tlet stack = [];\n\t\tfor (let i = 0; i < object.children.length; i++) {\n\t\t\tlet child = object.children[i];\n\t\t\tif (child.visible) {\n\t\t\t\tstack.push(child);\n\t\t\t}\n\t\t}\n\n\t\twhile (stack.length > 0) {\n\t\t\tlet child = stack.shift();\n\n\t\t\tchild.visible = false;\n\t\t\tif (child.boundingBoxNode) {\n\t\t\t\tchild.boundingBoxNode.visible = false;\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < child.children.length; i++) {\n\t\t\t\tlet childOfChild = child.children[i];\n\t\t\t\tif (childOfChild.visible) {\n\t\t\t\t\tstack.push(childOfChild);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateMatrixWorld (force) {\n\t\t// node.matrixWorld.multiplyMatrices( node.parent.matrixWorld, node.matrix );\n\n\t\tif (this.matrixAutoUpdate === true) this.updateMatrix();\n\n\t\tif (this.matrixWorldNeedsUpdate === true || force === true) {\n\t\t\tif (this.parent === undefined) {\n\t\t\t\tthis.matrixWorld.copy(this.matrix);\n\t\t\t} else {\n\t\t\t\tthis.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix);\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\t\t}\n\t}\n\n\tnodesOnRay (nodes, ray) {\n\t\tlet nodesOnRay = [];\n\n\t\tlet _ray = ray.clone();\n\t\tfor (let i = 0; i < nodes.length; i++) {\n\t\t\tlet node = nodes[i];\n\t\t\tlet sphere = node.getBoundingSphere().clone().applyMatrix4(node.sceneNode.matrixWorld);\n\t\t\t// TODO Unused: let box = node.getBoundingBox().clone().applyMatrix4(node.sceneNode.matrixWorld);\n\n\t\t\tif (_ray.intersectsSphere(sphere)) {\n\t\t\t\tnodesOnRay.push(node);\n\t\t\t}\n\t\t\t// if(_ray.isIntersectionBox(box)){\n\t\t\t//\tnodesOnRay.push(node);\n\t\t\t// }\n\t\t}\n\n\t\treturn nodesOnRay;\n\t}\n\n\tpick(viewer, camera, ray, params = {}){\n\n\t\tlet renderer = viewer.renderer;\n\t\tlet pRenderer = viewer.pRenderer;\n\n\t\tperformance.mark(\"pick-start\");\n\n\t\tlet getVal = (a, b) => a !== undefined ? a : b;\n\n\t\tlet pickWindowSize = getVal(params.pickWindowSize, 17);\n\t\tlet pickOutsideClipRegion = getVal(params.pickOutsideClipRegion, false);\n\n\t\tlet size = renderer.getSize(new THREE.Vector2());\n\n\t\tlet width = Math.ceil(getVal(params.width, size.width));\n\t\tlet height = Math.ceil(getVal(params.height, size.height));\n\n\t\tlet pointSizeType = getVal(params.pointSizeType, this.material.pointSizeType);\n\t\tlet pointSize = getVal(params.pointSize, this.material.size);\n\n\t\tlet nodes = this.nodesOnRay(this.visibleNodes, ray);\n\n\t\tif (nodes.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (!this.pickState) {\n\t\t\tlet scene = new THREE.Scene();\n\n\t\t\tlet material = new PointCloudMaterial();\n\t\t\tmaterial.activeAttributeName = \"indices\";\n\n\t\t\tlet renderTarget = new THREE.WebGLRenderTarget(\n\t\t\t\t1, 1,\n\t\t\t\t{ minFilter: THREE.LinearFilter,\n\t\t\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\t\t\tformat: THREE.RGBAFormat }\n\t\t\t);\n\n\t\t\tthis.pickState = {\n\t\t\t\trenderTarget: renderTarget,\n\t\t\t\tmaterial: material,\n\t\t\t\tscene: scene\n\t\t\t};\n\t\t};\n\n\t\tlet pickState = this.pickState;\n\t\tlet pickMaterial = pickState.material;\n\n\t\t{ // update pick material\n\t\t\tpickMaterial.pointSizeType = pointSizeType;\n\t\t\tpickMaterial.shape = this.material.shape;\n\n\t\t\tpickMaterial.size = pointSize;\n\t\t\tpickMaterial.uniforms.minSize.value = this.material.uniforms.minSize.value;\n\t\t\tpickMaterial.uniforms.maxSize.value = this.material.uniforms.maxSize.value;\n\t\t\tpickMaterial.classification = this.material.classification;\n\t\t\tif(params.pickClipped){\n\t\t\t\tpickMaterial.clipBoxes = this.material.clipBoxes;\n\t\t\t\tif(this.material.clipTask === ClipTask.HIGHLIGHT){\n\t\t\t\t\tpickMaterial.clipTask = ClipTask.NONE;\n\t\t\t\t}else{\n\t\t\t\t\tpickMaterial.clipTask = this.material.clipTask;\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tpickMaterial.clipBoxes = [];\n\t\t\t}\n\t\t\t\n\t\t\tthis.updateMaterial(pickMaterial, nodes, camera, renderer);\n\t\t}\n\n\t\tpickState.renderTarget.setSize(width, height);\n\n\t\tlet pixelPos = new THREE.Vector2(params.x, params.y);\n\t\t\n\t\tlet gl = renderer.getContext();\n\t\tgl.enable(gl.SCISSOR_TEST);\n\t\tgl.scissor(\n\t\t\tparseInt(pixelPos.x - (pickWindowSize - 1) / 2),\n\t\t\tparseInt(pixelPos.y - (pickWindowSize - 1) / 2),\n\t\t\tparseInt(pickWindowSize), parseInt(pickWindowSize));\n\n\n\t\trenderer.state.buffers.depth.setTest(pickMaterial.depthTest);\n\t\trenderer.state.buffers.depth.setMask(pickMaterial.depthWrite);\n\t\trenderer.state.setBlending(THREE.NoBlending);\n\n\t\trenderer.clearTarget(pickState.renderTarget, true, true, true);\n\n\t\t{ // RENDER\n\t\t\trenderer.setRenderTarget(pickState.renderTarget);\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\trenderer.clearTarget( pickState.renderTarget, true, true, true );\n\t\t\t\n\t\t\tlet tmp = this.material;\n\t\t\tthis.material = pickMaterial;\n\t\t\t\n\t\t\tpRenderer.renderOctree(this, nodes, camera, pickState.renderTarget);\n\t\t\t\n\t\t\tthis.material = tmp;\n\t\t}\n\n\t\tlet clamp = (number, min, max) => Math.min(Math.max(min, number), max);\n\n\t\tlet x = parseInt(clamp(pixelPos.x - (pickWindowSize - 1) / 2, 0, width));\n\t\tlet y = parseInt(clamp(pixelPos.y - (pickWindowSize - 1) / 2, 0, height));\n\t\tlet w = parseInt(Math.min(x + pickWindowSize, width) - x);\n\t\tlet h = parseInt(Math.min(y + pickWindowSize, height) - y);\n\n\t\tlet pixelCount = w * h;\n\t\tlet buffer = new Uint8Array(4 * pixelCount);\n\t\t\n\t\tgl.readPixels(x, y, pickWindowSize, pickWindowSize, gl.RGBA, gl.UNSIGNED_BYTE, buffer); \n\t\t\n\t\trenderer.setRenderTarget(null);\n\t\trenderer.state.reset();\n\t\trenderer.setScissorTest(false);\n\t\tgl.disable(gl.SCISSOR_TEST);\n\t\t\n\t\tlet pixels = buffer;\n\t\tlet ibuffer = new Uint32Array(buffer.buffer);\n\n\t\t// find closest hit inside pixelWindow boundaries\n\t\tlet min = Number.MAX_VALUE;\n\t\tlet hits = [];\n\t\tfor (let u = 0; u < pickWindowSize; u++) {\n\t\t\tfor (let v = 0; v < pickWindowSize; v++) {\n\t\t\t\tlet offset = (u + v * pickWindowSize);\n\t\t\t\tlet distance = Math.pow(u - (pickWindowSize - 1) / 2, 2) + Math.pow(v - (pickWindowSize - 1) / 2, 2);\n\n\t\t\t\tlet pcIndex = pixels[4 * offset + 3];\n\t\t\t\tpixels[4 * offset + 3] = 0;\n\t\t\t\tlet pIndex = ibuffer[offset];\n\n\t\t\t\tif(!(pcIndex === 0 && pIndex === 0) && (pcIndex !== undefined) && (pIndex !== undefined)){\n\t\t\t\t\tlet hit = {\n\t\t\t\t\t\tpIndex: pIndex,\n\t\t\t\t\t\tpcIndex: pcIndex,\n\t\t\t\t\t\tdistanceToCenter: distance\n\t\t\t\t\t};\n\n\t\t\t\t\tif(params.all){\n\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tif(hits.length > 0){\n\t\t\t\t\t\t\tif(distance < hits[0].distanceToCenter){\n\t\t\t\t\t\t\t\thits[0] = hit;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\n\t\tfor(let hit of hits){\n\t\t\tlet point = {};\n\t\t\n\t\t\tif (!nodes[hit.pcIndex]) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\n\t\t\tlet node = nodes[hit.pcIndex];\n\t\t\tlet pc = node.sceneNode;\n\t\t\tlet geometry = node.geometryNode.geometry;\n\t\t\t\n\t\t\tfor(let attributeName in geometry.attributes){\n\t\t\t\tlet attribute = geometry.attributes[attributeName];\n\t\t\n\t\t\t\tif (attributeName === 'position') {\n\t\t\t\t\tlet x = attribute.array[3 * hit.pIndex + 0];\n\t\t\t\t\tlet y = attribute.array[3 * hit.pIndex + 1];\n\t\t\t\t\tlet z = attribute.array[3 * hit.pIndex + 2];\n\t\t\t\t\t\n\t\t\t\t\tlet position = new THREE.Vector3(x, y, z);\n\t\t\t\t\tposition.applyMatrix4(pc.matrixWorld);\n\t\t\n\t\t\t\t\tpoint[attributeName] = position;\n\t\t\t\t} else if (attributeName === 'indices') {\n\t\t\n\t\t\t\t} else {\n\t\t\t\t\t//if (values.itemSize === 1) {\n\t\t\t\t\t//\tpoint[attribute.name] = values.array[hit.pIndex];\n\t\t\t\t\t//} else {\n\t\t\t\t\t//\tlet value = [];\n\t\t\t\t\t//\tfor (let j = 0; j < values.itemSize; j++) {\n\t\t\t\t\t//\t\tvalue.push(values.array[values.itemSize * hit.pIndex + j]);\n\t\t\t\t\t//\t}\n\t\t\t\t\t//\tpoint[attribute.name] = value;\n\t\t\t\t\t//}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\n\t\t\thit.point = point;\n\t\t}\n\n\t\tperformance.mark(\"pick-end\");\n\t\tperformance.measure(\"pick\", \"pick-start\", \"pick-end\");\n\n\t\tif(params.all){\n\t\t\treturn hits.map(hit => hit.point);\n\t\t}else{\n\t\t\tif(hits.length === 0){\n\t\t\t\treturn null;\n\t\t\t}else{\n\t\t\t\treturn hits[0].point;\n\t\t\t}\n\t\t}\n\t}\n\n\tcomputeVisibilityTextureData(nodes){\n\n\t\tif(exports.measureTimings) performance.mark(\"computeVisibilityTextureData-start\");\n\n\t\tlet data = new Uint8Array(nodes.length * 3);\n\t\tlet visibleNodeTextureOffsets = new Map();\n\n\t\t// copy array\n\t\tnodes = nodes.slice();\n\n\t\t// sort by level and number\n\t\tlet sort = function (a, b) {\n\t\t\tlet la = a.geometryNode.level;\n\t\t\tlet lb = b.geometryNode.level;\n\t\t\tlet na = a.geometryNode.number;\n\t\t\tlet nb = b.geometryNode.number;\n\t\t\tif (la !== lb) return la - lb;\n\t\t\tif (na < nb) return -1;\n\t\t\tif (na > nb) return 1;\n\t\t\treturn 0;\n\t\t};\n\t\tnodes.sort(sort);\n\n\t\tlet visibleNodeNames = [];\n\t\tfor (let i = 0; i < nodes.length; i++) {\n\t\t\tvisibleNodeNames.push(nodes[i].geometryNode.number);\n\t\t}\n\n\t\tfor (let i = 0; i < nodes.length; i++) {\n\t\t\tlet node = nodes[i];\n\n\t\t\tvisibleNodeTextureOffsets.set(node, i);\n\n\t\t\tlet b1 = 0;\t// children\n\t\t\tlet b2 = 0;\t// offset to first child\n\t\t\tlet b3 = 0;\t// split\n\n\t\t\tif (node.geometryNode.left && visibleNodeNames.indexOf(node.geometryNode.left.number) > 0) {\n\t\t\t\tb1 += 1;\n\t\t\t\tb2 = visibleNodeNames.indexOf(node.geometryNode.left.number) - i;\n\t\t\t}\n\t\t\tif (node.geometryNode.right && visibleNodeNames.indexOf(node.geometryNode.right.number) > 0) {\n\t\t\t\tb1 += 2;\n\t\t\t\tb2 = (b2 === 0) ? visibleNodeNames.indexOf(node.geometryNode.right.number) - i : b2;\n\t\t\t}\n\n\t\t\tif (node.geometryNode.split === 'X') {\n\t\t\t\tb3 = 1;\n\t\t\t} else if (node.geometryNode.split === 'Y') {\n\t\t\t\tb3 = 2;\n\t\t\t} else if (node.geometryNode.split === 'Z') {\n\t\t\t\tb3 = 4;\n\t\t\t}\n\n\t\t\tdata[i * 3 + 0] = b1;\n\t\t\tdata[i * 3 + 1] = b2;\n\t\t\tdata[i * 3 + 2] = b3;\n\t\t}\n\n\t\tif(exports.measureTimings){\n\t\t\tperformance.mark(\"computeVisibilityTextureData-end\");\n\t\t\tperformance.measure(\"render.computeVisibilityTextureData\", \"computeVisibilityTextureData-start\", \"computeVisibilityTextureData-end\");\n\t\t}\n\n\t\treturn {\n\t\t\tdata: data,\n\t\t\toffsets: visibleNodeTextureOffsets\n\t\t};\n\t}\n\n\tget progress () {\n\t\tif (this.pcoGeometry.root) {\n\t\t\treturn exports.numNodesLoading > 0 ? 0 : 1;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n};\n","\nimport {PointCloudTree} from \"./PointCloudTree.js\";\nimport {PointCloudOctreeNode} from \"./PointCloudOctree.js\";\nimport {PointCloudArena4DNode} from \"./arena4d/PointCloudArena4D.js\";\nimport {PointSizeType, ClipTask, ElevationGradientRepeat} from \"./defines.js\";\n\n// Copied from three.js: WebGLRenderer.js\nfunction paramThreeToGL(_gl, p) {\n\n\tlet extension;\n\n\tif (p === THREE.RepeatWrapping) return _gl.REPEAT;\n\tif (p === THREE.ClampToEdgeWrapping) return _gl.CLAMP_TO_EDGE;\n\tif (p === THREE.MirroredRepeatWrapping) return _gl.MIRRORED_REPEAT;\n\n\tif (p === THREE.NearestFilter) return _gl.NEAREST;\n\tif (p === THREE.NearestMipMapNearestFilter) return _gl.NEAREST_MIPMAP_NEAREST;\n\tif (p === THREE.NearestMipMapLinearFilter) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\tif (p === THREE.LinearFilter) return _gl.LINEAR;\n\tif (p === THREE.LinearMipMapNearestFilter) return _gl.LINEAR_MIPMAP_NEAREST;\n\tif (p === THREE.LinearMipMapLinearFilter) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\tif (p === THREE.UnsignedByteType) return _gl.UNSIGNED_BYTE;\n\tif (p === THREE.UnsignedShort4444Type) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\tif (p === THREE.UnsignedShort5551Type) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\tif (p === THREE.UnsignedShort565Type) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\tif (p === THREE.ByteType) return _gl.BYTE;\n\tif (p === THREE.ShortType) return _gl.SHORT;\n\tif (p === THREE.UnsignedShortType) return _gl.UNSIGNED_SHORT;\n\tif (p === THREE.IntType) return _gl.INT;\n\tif (p === THREE.UnsignedIntType) return _gl.UNSIGNED_INT;\n\tif (p === THREE.FloatType) return _gl.FLOAT;\n\n\tif (p === THREE.HalfFloatType) {\n\n\t\textension = extensions.get('OES_texture_half_float');\n\n\t\tif (extension !== null) return extension.HALF_FLOAT_OES;\n\n\t}\n\n\tif (p === THREE.AlphaFormat) return _gl.ALPHA;\n\tif (p === THREE.RGBFormat) return _gl.RGB;\n\tif (p === THREE.RGBAFormat) return _gl.RGBA;\n\tif (p === THREE.LuminanceFormat) return _gl.LUMINANCE;\n\tif (p === THREE.LuminanceAlphaFormat) return _gl.LUMINANCE_ALPHA;\n\tif (p === THREE.DepthFormat) return _gl.DEPTH_COMPONENT;\n\tif (p === THREE.DepthStencilFormat) return _gl.DEPTH_STENCIL;\n\n\tif (p === THREE.AddEquation) return _gl.FUNC_ADD;\n\tif (p === THREE.SubtractEquation) return _gl.FUNC_SUBTRACT;\n\tif (p === THREE.ReverseSubtractEquation) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\tif (p === THREE.ZeroFactor) return _gl.ZERO;\n\tif (p === THREE.OneFactor) return _gl.ONE;\n\tif (p === THREE.SrcColorFactor) return _gl.SRC_COLOR;\n\tif (p === THREE.OneMinusSrcColorFactor) return _gl.ONE_MINUS_SRC_COLOR;\n\tif (p === THREE.SrcAlphaFactor) return _gl.SRC_ALPHA;\n\tif (p === THREE.OneMinusSrcAlphaFactor) return _gl.ONE_MINUS_SRC_ALPHA;\n\tif (p === THREE.DstAlphaFactor) return _gl.DST_ALPHA;\n\tif (p === THREE.OneMinusDstAlphaFactor) return _gl.ONE_MINUS_DST_ALPHA;\n\n\tif (p === THREE.DstColorFactor) return _gl.DST_COLOR;\n\tif (p === THREE.OneMinusDstColorFactor) return _gl.ONE_MINUS_DST_COLOR;\n\tif (p === THREE.SrcAlphaSaturateFactor) return _gl.SRC_ALPHA_SATURATE;\n\n\tif (p === THREE.RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\tp === THREE.RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format) {\n\n\t\textension = extensions.get('WEBGL_compressed_texture_s3tc');\n\n\t\tif (extension !== null) {\n\n\t\t\tif (p === THREE.RGB_S3TC_DXT1_Format) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\tif (p === THREE.RGBA_S3TC_DXT1_Format) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\tif (p === THREE.RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\tif (p === THREE.RGBA_S3TC_DXT5_Format) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t}\n\n\t}\n\n\tif (p === THREE.RGB_PVRTC_4BPPV1_Format || p === THREE.RGB_PVRTC_2BPPV1_Format ||\n\t\tp === THREE.RGBA_PVRTC_4BPPV1_Format || p === THREE.RGBA_PVRTC_2BPPV1_Format) {\n\n\t\textension = extensions.get('WEBGL_compressed_texture_pvrtc');\n\n\t\tif (extension !== null) {\n\n\t\t\tif (p === THREE.RGB_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\tif (p === THREE.RGB_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\tif (p === THREE.RGBA_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\tif (p === THREE.RGBA_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t}\n\n\t}\n\n\tif (p === THREE.RGB_ETC1_Format) {\n\n\t\textension = extensions.get('WEBGL_compressed_texture_etc1');\n\n\t\tif (extension !== null) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t}\n\n\tif (p === THREE.MinEquation || p === THREE.MaxEquation) {\n\n\t\textension = extensions.get('EXT_blend_minmax');\n\n\t\tif (extension !== null) {\n\n\t\t\tif (p === THREE.MinEquation) return extension.MIN_EXT;\n\t\t\tif (p === THREE.MaxEquation) return extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tif (p === UnsignedInt248Type) {\n\n\t\textension = extensions.get('WEBGL_depth_texture');\n\n\t\tif (extension !== null) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t}\n\n\treturn 0;\n\n};\n\nlet attributeLocations = {\n\t\"position\": {name: \"position\", location: 0},\n\t\"color\": {name: \"color\", location: 1},\n\t\"rgba\": {name: \"color\", location: 1},\n\t\"intensity\": {name: \"intensity\", location: 2},\n\t\"classification\": {name: \"classification\", location: 3},\n\t\"returnNumber\": {name: \"returnNumber\", location: 4},\n\t\"return number\": {name: \"returnNumber\", location: 4},\n\t\"returns\": {name: \"returnNumber\", location: 4},\n\t\"numberOfReturns\": {name: \"numberOfReturns\", location: 5},\n\t\"number of returns\": {name: \"numberOfReturns\", location: 5},\n\t\"pointSourceID\": {name: \"pointSourceID\", location: 6},\n\t\"source id\": {name: \"pointSourceID\", location: 6},\n\t\"point source id\": {name: \"pointSourceID\", location: 6},\n\t\"indices\": {name: \"indices\", location: 7},\n\t\"normal\": {name: \"normal\", location: 8},\n\t\"spacing\": {name: \"spacing\", location: 9},\n\t\"gps-time\": {name: \"gpsTime\", location: 10},\n\t\"aExtra\": {name: \"aExtra\", location: 11},\n};\n\nclass Shader {\n\n\tconstructor(gl, name, vsSource, fsSource) {\n\t\tthis.gl = gl;\n\t\tthis.name = name;\n\t\tthis.vsSource = vsSource;\n\t\tthis.fsSource = fsSource;\n\n\t\tthis.cache = new Map();\n\n\t\tthis.vs = null;\n\t\tthis.fs = null;\n\t\tthis.program = null;\n\n\t\tthis.uniformLocations = {};\n\t\tthis.attributeLocations = {};\n\t\tthis.uniformBlockIndices = {};\n\t\tthis.uniformBlocks = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.update(vsSource, fsSource);\n\t}\n\n\tupdate(vsSource, fsSource) {\n\t\tthis.vsSource = vsSource;\n\t\tthis.fsSource = fsSource;\n\n\t\tthis.linkProgram();\n\t}\n\n\tcompileShader(shader, source){\n\t\tlet gl = this.gl;\n\n\t\tgl.shaderSource(shader, source);\n\n\t\tgl.compileShader(shader);\n\n\t\tlet success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\t\tif (!success) {\n\t\t\tlet info = gl.getShaderInfoLog(shader);\n\t\t\tlet numberedSource = source.split(\"\\n\").map((a, i) => `${i + 1}`.padEnd(5) + a).join(\"\\n\");\n\t\t\tthrow `could not compile shader ${this.name}: ${info}, \\n${numberedSource}`;\n\t\t}\n\t}\n\n\tlinkProgram() {\n\n\t\tconst tStart = performance.now();\n\n\t\tlet gl = this.gl;\n\n\t\tthis.uniformLocations = {};\n\t\tthis.attributeLocations = {};\n\t\tthis.uniforms = {};\n\n\t\tgl.useProgram(null);\n\n\t\tlet cached = this.cache.get(`${this.vsSource}, ${this.fsSource}`);\n\t\tif (cached) {\n\t\t\tthis.program = cached.program;\n\t\t\tthis.vs = cached.vs;\n\t\t\tthis.fs = cached.fs;\n\t\t\tthis.attributeLocations = cached.attributeLocations;\n\t\t\tthis.uniformLocations = cached.uniformLocations;\n\t\t\tthis.uniformBlocks = cached.uniformBlocks;\n\t\t\tthis.uniforms = cached.uniforms;\n\n\t\t\treturn;\n\t\t} else {\n\n\t\t\tthis.vs = gl.createShader(gl.VERTEX_SHADER);\n\t\t\tthis.fs = gl.createShader(gl.FRAGMENT_SHADER);\n\t\t\tthis.program = gl.createProgram();\n\n\t\t\tfor(let name of Object.keys(attributeLocations)){\n\t\t\t\tlet location = attributeLocations[name].location;\n\t\t\t\tlet glslName = attributeLocations[name].name;\n\t\t\t\tgl.bindAttribLocation(this.program, location, glslName);\n\t\t\t}\n\n\t\t\tthis.compileShader(this.vs, this.vsSource);\n\t\t\tthis.compileShader(this.fs, this.fsSource);\n\n\t\t\tlet program = this.program;\n\n\t\t\tgl.attachShader(program, this.vs);\n\t\t\tgl.attachShader(program, this.fs);\n\n\t\t\tgl.linkProgram(program);\n\n\t\t\tgl.detachShader(program, this.vs);\n\t\t\tgl.detachShader(program, this.fs);\n\n\t\t\tlet success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\t\t\tif (!success) {\n\t\t\t\tlet info = gl.getProgramInfoLog(program);\n\t\t\t\tthrow `could not link program ${this.name}: ${info}`;\n\t\t\t}\n\n\t\t\t{ // attribute locations\n\t\t\t\tlet numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n\n\t\t\t\tfor (let i = 0; i < numAttributes; i++) {\n\t\t\t\t\tlet attribute = gl.getActiveAttrib(program, i);\n\n\t\t\t\t\tlet location = gl.getAttribLocation(program, attribute.name);\n\n\t\t\t\t\tthis.attributeLocations[attribute.name] = location;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t{ // uniform locations\n\t\t\t\tlet numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n\n\t\t\t\tfor (let i = 0; i < numUniforms; i++) {\n\t\t\t\t\tlet uniform = gl.getActiveUniform(program, i);\n\n\t\t\t\t\tlet location = gl.getUniformLocation(program, uniform.name);\n\n\t\t\t\t\tthis.uniformLocations[uniform.name] = location;\n\t\t\t\t\tthis.uniforms[uniform.name] = {\n\t\t\t\t\t\tlocation: location,\n\t\t\t\t\t\tvalue: null,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// uniform blocks\n\t\t\tif(gl instanceof WebGL2RenderingContext){ \n\t\t\t\tlet numBlocks = gl.getProgramParameter(program, gl.ACTIVE_UNIFORM_BLOCKS);\n\n\t\t\t\tfor (let i = 0; i < numBlocks; i++) {\n\t\t\t\t\tlet blockName = gl.getActiveUniformBlockName(program, i);\n\n\t\t\t\t\tlet blockIndex = gl.getUniformBlockIndex(program, blockName);\n\n\t\t\t\t\tthis.uniformBlockIndices[blockName] = blockIndex;\n\n\t\t\t\t\tgl.uniformBlockBinding(program, blockIndex, blockIndex);\n\t\t\t\t\tlet dataSize = gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_DATA_SIZE);\n\n\t\t\t\t\tlet uBuffer = gl.createBuffer();\t\n\t\t\t\t\tgl.bindBuffer(gl.UNIFORM_BUFFER, uBuffer);\n\t\t\t\t\tgl.bufferData(gl.UNIFORM_BUFFER, dataSize, gl.DYNAMIC_READ);\n\n\t\t\t\t\tgl.bindBufferBase(gl.UNIFORM_BUFFER, blockIndex, uBuffer);\n\n\t\t\t\t\tgl.bindBuffer(gl.UNIFORM_BUFFER, null);\n\n\t\t\t\t\tthis.uniformBlocks[blockName] = {\n\t\t\t\t\t\tname: blockName,\n\t\t\t\t\t\tindex: blockIndex,\n\t\t\t\t\t\tdataSize: dataSize,\n\t\t\t\t\t\tbuffer: uBuffer\n\t\t\t\t\t};\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet cached = {\n\t\t\t\tprogram: this.program,\n\t\t\t\tvs: this.vs,\n\t\t\t\tfs: this.fs,\n\t\t\t\tattributeLocations: this.attributeLocations,\n\t\t\t\tuniformLocations: this.uniformLocations,\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tuniformBlocks: this.uniformBlocks,\n\t\t\t};\n\n\t\t\tthis.cache.set(`${this.vsSource}, ${this.fsSource}`, cached);\n\t\t}\n\n\t\tconst tEnd = performance.now();\n\t\tconst duration = tEnd - tStart;\n\n\t\tconsole.log(`shader compile duration: ${duration.toFixed(3)}`);\n\n\n\t}\n\n\tsetUniformMatrix4(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst location = this.uniformLocations[name];\n\n\t\tif (location == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmp = new Float32Array(value.elements);\n\t\tgl.uniformMatrix4fv(location, false, tmp);\n\t}\n\n\tsetUniform1f(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst uniform = this.uniforms[name];\n\n\t\tif (uniform === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(uniform.value === value){\n\t\t\treturn;\n\t\t}\n\n\t\tuniform.value = value;\n\n\t\tgl.uniform1f(uniform.location, value);\n\t}\n\n\tsetUniformBoolean(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst uniform = this.uniforms[name];\n\n\t\tif (uniform === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(uniform.value === value){\n\t\t\treturn;\n\t\t}\n\n\t\tuniform.value = value;\n\n\t\tgl.uniform1i(uniform.location, value);\n\t}\n\n\tsetUniformTexture(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst location = this.uniformLocations[name];\n\n\t\tif (location == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.uniform1i(location, value);\n\t}\n\n\tsetUniform2f(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst location = this.uniformLocations[name];\n\n\t\tif (location == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.uniform2f(location, value[0], value[1]);\n\t}\n\n\tsetUniform3f(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst location = this.uniformLocations[name];\n\n\t\tif (location == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.uniform3f(location, value[0], value[1], value[2]);\n\t}\n\n\tsetUniform(name, value) {\n\n\t\tif (value.constructor === THREE.Matrix4) {\n\t\t\tthis.setUniformMatrix4(name, value);\n\t\t} else if (typeof value === \"number\") {\n\t\t\tthis.setUniform1f(name, value);\n\t\t} else if (typeof value === \"boolean\") {\n\t\t\tthis.setUniformBoolean(name, value);\n\t\t} else if (value instanceof WebGLTexture) {\n\t\t\tthis.setUniformTexture(name, value);\n\t\t} else if (value instanceof Array) {\n\n\t\t\tif (value.length === 2) {\n\t\t\t\tthis.setUniform2f(name, value);\n\t\t\t} else if (value.length === 3) {\n\t\t\t\tthis.setUniform3f(name, value);\n\t\t\t}\n\n\t\t} else {\n\t\t\tconsole.error(\"unhandled uniform type: \", name, value);\n\t\t}\n\n\t}\n\n\n\tsetUniform1i(name, value) {\n\t\tlet gl = this.gl;\n\t\tlet location = this.uniformLocations[name];\n\n\t\tif (location == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.uniform1i(location, value);\n\t}\n\n};\n\nclass WebGLTexture {\n\n\tconstructor(gl, texture) {\n\t\tthis.gl = gl;\n\n\t\tthis.texture = texture;\n\t\tthis.id = gl.createTexture();\n\n\t\tthis.target = gl.TEXTURE_2D;\n\t\tthis.version = -1;\n\n\t\tthis.update(texture);\n\t}\n\n\tupdate() {\n\n\t\tif (!this.texture.image) {\n\t\t\tthis.version = this.texture.version;\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet gl = this.gl;\n\t\tlet texture = this.texture;\n\n\t\tif (this.version === texture.version) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.target = gl.TEXTURE_2D;\n\n\t\tgl.bindTexture(this.target, this.id);\n\n\t\tlet level = 0;\n\t\tlet internalFormat = paramThreeToGL(gl, texture.format);\n\t\tlet width = texture.image.width;\n\t\tlet height = texture.image.height;\n\t\tlet border = 0;\n\t\tlet srcFormat = internalFormat;\n\t\tlet srcType = paramThreeToGL(gl, texture.type);\n\t\tlet data;\n\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, texture.flipY);\n\t\tgl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha);\n\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment);\n\n\t\tif (texture instanceof THREE.DataTexture) {\n\t\t\tdata = texture.image.data;\n\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_MAG_FILTER, paramThreeToGL(gl, texture.magFilter));\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_MIN_FILTER, paramThreeToGL(gl, texture.minFilter));\n\n\t\t\tgl.texImage2D(this.target, level, internalFormat,\n\t\t\t\twidth, height, border, srcFormat, srcType,\n\t\t\t\tdata);\n\t\t} else if ((texture instanceof THREE.CanvasTexture) || (texture instanceof THREE.Texture)) {\n\t\t\tdata = texture.image;\n\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_WRAP_S, paramThreeToGL(gl, texture.wrapS));\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_WRAP_T, paramThreeToGL(gl, texture.wrapT));\n\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_MAG_FILTER, paramThreeToGL(gl, texture.magFilter));\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_MIN_FILTER, paramThreeToGL(gl, texture.minFilter));\n\n\t\t\tgl.texImage2D(this.target, level, internalFormat,\n\t\t\t\tinternalFormat, srcType, data);\n\n\t\t\tif (texture instanceof THREE.Texture) {gl.generateMipmap(gl.TEXTURE_2D);}\n\t\t}\n\n\t\tgl.bindTexture(this.target, null);\n\n\t\tthis.version = texture.version;\n\t}\n\n};\n\nclass WebGLBuffer {\n\n\tconstructor() {\n\t\tthis.numElements = 0;\n\t\tthis.vao = null;\n\t\tthis.vbos = new Map();\n\t}\n\n};\n\nexport class Renderer {\n\n\tconstructor(threeRenderer) {\n\t\tthis.threeRenderer = threeRenderer;\n\t\tthis.gl = this.threeRenderer.getContext();\n\n\t\tthis.buffers = new Map();\n\t\tthis.shaders = new Map();\n\t\tthis.textures = new Map();\n\n\t\tthis.glTypeMapping = new Map();\n\t\tthis.glTypeMapping.set(Float32Array, this.gl.FLOAT);\n\t\tthis.glTypeMapping.set(Uint8Array, this.gl.UNSIGNED_BYTE);\n\t\tthis.glTypeMapping.set(Uint16Array, this.gl.UNSIGNED_SHORT);\n\n\t\tthis.toggle = 0;\n\t}\n\n\tdeleteBuffer(geometry) {\n\n\t\tlet gl = this.gl;\n\t\tlet webglBuffer = this.buffers.get(geometry);\n\t\tif (webglBuffer != null) {\n\t\t\tfor (let attributeName in geometry.attributes) {\n\t\t\t\tgl.deleteBuffer(webglBuffer.vbos.get(attributeName).handle);\n\t\t\t}\n\t\t\tthis.buffers.delete(geometry);\n\t\t}\n\t}\n\n\tcreateBuffer(geometry){\n\t\tlet gl = this.gl;\n\t\tlet webglBuffer = new WebGLBuffer();\n\t\twebglBuffer.vao = gl.createVertexArray();\n\t\twebglBuffer.numElements = geometry.attributes.position.count;\n\n\t\tgl.bindVertexArray(webglBuffer.vao);\n\n\t\tfor(let attributeName in geometry.attributes){\n\t\t\tlet bufferAttribute = geometry.attributes[attributeName];\n\n\t\t\tlet vbo = gl.createBuffer();\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n\t\t\tgl.bufferData(gl.ARRAY_BUFFER, bufferAttribute.array, gl.STATIC_DRAW);\n\n\t\t\tlet normalized = bufferAttribute.normalized;\n\t\t\tlet type = this.glTypeMapping.get(bufferAttribute.array.constructor);\n\n\t\t\tif(attributeLocations[attributeName] === undefined){\n\t\t\t\t//attributeLocation = attributeLocations[\"aExtra\"];\n\t\t\t}else{\n\t\t\t\tlet attributeLocation = attributeLocations[attributeName].location;\n\n\t\t\t\tgl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0);\n\t\t\t\tgl.enableVertexAttribArray(attributeLocation);\n\t\t\t}\n\n\n\t\t\twebglBuffer.vbos.set(attributeName, {\n\t\t\t\thandle: vbo,\n\t\t\t\tname: attributeName,\n\t\t\t\tcount: bufferAttribute.count,\n\t\t\t\titemSize: bufferAttribute.itemSize,\n\t\t\t\ttype: geometry.attributes.position.array.constructor,\n\t\t\t\tversion: 0\n\t\t\t});\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, null);\n\t\tgl.bindVertexArray(null);\n\n\t\tlet disposeHandler = (event) => {\n\t\t\tthis.deleteBuffer(geometry);\n\t\t\tgeometry.removeEventListener(\"dispose\", disposeHandler);\n\t\t};\n\t\tgeometry.addEventListener(\"dispose\", disposeHandler);\n\n\t\treturn webglBuffer;\n\t}\n\n\tupdateBuffer(geometry){\n\t\tlet gl = this.gl;\n\n\t\tlet webglBuffer = this.buffers.get(geometry);\n\n\t\tgl.bindVertexArray(webglBuffer.vao);\n\n\t\tfor(let attributeName in geometry.attributes){\n\t\t\tlet bufferAttribute = geometry.attributes[attributeName];\n\n\t\t\tlet normalized = bufferAttribute.normalized;\n\t\t\tlet type = this.glTypeMapping.get(bufferAttribute.array.constructor);\n\n\t\t\tlet vbo = null;\n\t\t\tif(!webglBuffer.vbos.has(attributeName)){\n\t\t\t\tvbo = gl.createBuffer();\n\n\t\t\t\twebglBuffer.vbos.set(attributeName, {\n\t\t\t\t\thandle: vbo,\n\t\t\t\t\tname: attributeName,\n\t\t\t\t\tcount: bufferAttribute.count,\n\t\t\t\t\titemSize: bufferAttribute.itemSize,\n\t\t\t\t\ttype: geometry.attributes.position.array.constructor,\n\t\t\t\t\tversion: bufferAttribute.version\n\t\t\t\t});\n\t\t\t}else{\n\t\t\t\tvbo = webglBuffer.vbos.get(attributeName).handle;\n\t\t\t\twebglBuffer.vbos.get(attributeName).version = bufferAttribute.version;\n\t\t\t}\n\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n\t\t\tgl.bufferData(gl.ARRAY_BUFFER, bufferAttribute.array, gl.STATIC_DRAW);\n\n\t\t\tif(attributeLocations[attributeName] === undefined){\n\t\t\t\t//attributeLocation = attributeLocations[\"aExtra\"];\n\t\t\t}else{\n\t\t\t\tlet attributeLocation = attributeLocations[attributeName].location;\n\t\t\t\t\n\t\t\t\tgl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0);\n\t\t\t\tgl.enableVertexAttribArray(attributeLocation);\n\t\t\t}\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, null);\n\t\tgl.bindVertexArray(null);\n\t}\n\n\ttraverse(scene) {\n\n\t\tlet octrees = [];\n\n\t\tlet stack = [scene];\n\t\twhile (stack.length > 0) {\n\n\t\t\tlet node = stack.pop();\n\n\t\t\tif (node instanceof PointCloudTree) {\n\t\t\t\toctrees.push(node);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet visibleChildren = node.children.filter(c => c.visible);\n\t\t\tstack.push(...visibleChildren);\n\n\t\t}\n\n\t\tlet result = {\n\t\t\toctrees: octrees\n\t\t};\n\n\t\treturn result;\n\t}\n\n\n\n\trenderNodes(octree, nodes, visibilityTextureData, camera, target, shader, params) {\n\n\t\tif (exports.measureTimings) performance.mark(\"renderNodes-start\");\n\n\t\tlet gl = this.gl;\n\n\t\tlet material = params.material ? params.material : octree.material;\n\t\tlet shadowMaps = params.shadowMaps == null ? [] : params.shadowMaps;\n\t\tlet view = camera.matrixWorldInverse;\n\t\tlet worldView = new THREE.Matrix4();\n\n\t\tlet mat4holder = new Float32Array(16);\n\n\t\tlet i = 0;\n\t\tfor (let node of nodes) {\n\n\t\t\tif(exports.debug.allowedNodes !== undefined){\n\t\t\t\tif(!exports.debug.allowedNodes.includes(node.name)){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet world = node.sceneNode.matrixWorld;\n\t\t\tworldView.multiplyMatrices(view, world);\n\n\t\t\tif (visibilityTextureData) {\n\t\t\t\tlet vnStart = visibilityTextureData.offsets.get(node);\n\t\t\t\tshader.setUniform1f(\"uVNStart\", vnStart);\n\t\t\t}\n\n\n\t\t\tlet level = node.getLevel();\n\n\t\t\tif(node.debug){\n\t\t\t\tshader.setUniform(\"uDebug\", true);\n\t\t\t}else{\n\t\t\t\tshader.setUniform(\"uDebug\", false);\n\t\t\t}\n\n\t\t\t// let isLeaf = false;\n\t\t\t// if(node instanceof PointCloudOctreeNode){\n\t\t\t// \tisLeaf = Object.keys(node.children).length === 0;\n\t\t\t// }else if(node instanceof PointCloudArena4DNode){\n\t\t\t// \tisLeaf = node.geometryNode.isLeaf;\n\t\t\t// }\n\t\t\t// shader.setUniform(\"uIsLeafNode\", isLeaf);\n\n\t\t\t// let isLeaf = node.children.filter(n => n != null).length === 0;\n\t\t\t// if(!isLeaf){\n\t\t\t// \tcontinue;\n\t\t\t// }\n\n\n\t\t\t// TODO consider passing matrices in an array to avoid uniformMatrix4fv overhead\n\t\t\tconst lModel = shader.uniformLocations[\"modelMatrix\"];\n\t\t\tif (lModel) {\n\t\t\t\tmat4holder.set(world.elements);\n\t\t\t\tgl.uniformMatrix4fv(lModel, false, mat4holder);\n\t\t\t}\n\n\t\t\tconst lModelView = shader.uniformLocations[\"modelViewMatrix\"];\n\t\t\t//mat4holder.set(worldView.elements);\n\t\t\t// faster then set in chrome 63\n\t\t\tfor(let j = 0; j < 16; j++){\n\t\t\t\tmat4holder[j] = worldView.elements[j];\n\t\t\t}\n\t\t\tgl.uniformMatrix4fv(lModelView, false, mat4holder);\n\n\t\t\t{ // Clip Polygons\n\t\t\t\tif(material.clipPolygons && material.clipPolygons.length > 0){\n\n\t\t\t\t\tlet clipPolygonVCount = [];\n\t\t\t\t\tlet worldViewProjMatrices = [];\n\n\t\t\t\t\tfor(let clipPolygon of material.clipPolygons){\n\n\t\t\t\t\t\tlet view = clipPolygon.viewMatrix;\n\t\t\t\t\t\tlet proj = clipPolygon.projMatrix;\n\n\t\t\t\t\t\tlet worldViewProj = proj.clone().multiply(view).multiply(world);\n\n\t\t\t\t\t\tclipPolygonVCount.push(clipPolygon.markers.length);\n\t\t\t\t\t\tworldViewProjMatrices.push(worldViewProj);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet flattenedMatrices = [].concat(...worldViewProjMatrices.map(m => m.elements));\n\n\t\t\t\t\tlet flattenedVertices = new Array(8 * 3 * material.clipPolygons.length);\n\t\t\t\t\tfor(let i = 0; i < material.clipPolygons.length; i++){\n\t\t\t\t\t\tlet clipPolygon = material.clipPolygons[i];\n\t\t\t\t\t\tfor(let j = 0; j < clipPolygon.markers.length; j++){\n\t\t\t\t\t\t\tflattenedVertices[i * 24 + (j * 3 + 0)] = clipPolygon.markers[j].position.x;\n\t\t\t\t\t\t\tflattenedVertices[i * 24 + (j * 3 + 1)] = clipPolygon.markers[j].position.y;\n\t\t\t\t\t\t\tflattenedVertices[i * 24 + (j * 3 + 2)] = clipPolygon.markers[j].position.z;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst lClipPolygonVCount = shader.uniformLocations[\"uClipPolygonVCount[0]\"];\n\t\t\t\t\tgl.uniform1iv(lClipPolygonVCount, clipPolygonVCount);\n\n\t\t\t\t\tconst lClipPolygonVP = shader.uniformLocations[\"uClipPolygonWVP[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lClipPolygonVP, false, flattenedMatrices);\n\n\t\t\t\t\tconst lClipPolygons = shader.uniformLocations[\"uClipPolygonVertices[0]\"];\n\t\t\t\t\tgl.uniform3fv(lClipPolygons, flattenedVertices);\n\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\t//shader.setUniformMatrix4(\"modelMatrix\", world);\n\t\t\t//shader.setUniformMatrix4(\"modelViewMatrix\", worldView);\n\t\t\tshader.setUniform1f(\"uLevel\", level);\n\t\t\tshader.setUniform1f(\"uNodeSpacing\", node.geometryNode.estimatedSpacing);\n\n\t\t\tshader.setUniform1f(\"uPCIndex\", i);\n\t\t\t// uBBSize\n\n\t\t\tif (shadowMaps.length > 0) {\n\n\t\t\t\tconst lShadowMap = shader.uniformLocations[\"uShadowMap[0]\"];\n\n\t\t\t\tshader.setUniform3f(\"uShadowColor\", material.uniforms.uShadowColor.value);\n\n\t\t\t\tlet bindingStart = 5;\n\t\t\t\tlet bindingPoints = new Array(shadowMaps.length).fill(bindingStart).map((a, i) => (a + i));\n\t\t\t\tgl.uniform1iv(lShadowMap, bindingPoints);\n\n\t\t\t\tfor (let i = 0; i < shadowMaps.length; i++) {\n\t\t\t\t\tlet shadowMap = shadowMaps[i];\n\t\t\t\t\tlet bindingPoint = bindingPoints[i];\n\t\t\t\t\tlet glTexture = this.threeRenderer.properties.get(shadowMap.target.texture).__webglTexture;\n\n\t\t\t\t\tgl.activeTexture(gl[`TEXTURE${bindingPoint}`]);\n\t\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, glTexture);\n\t\t\t\t}\n\n\t\t\t\t{\n\n\t\t\t\t\tlet worldViewMatrices = shadowMaps\n\t\t\t\t\t\t.map(sm => sm.camera.matrixWorldInverse)\n\t\t\t\t\t\t.map(view => new THREE.Matrix4().multiplyMatrices(view, world))\n\n\t\t\t\t\tlet flattenedMatrices = [].concat(...worldViewMatrices.map(c => c.elements));\n\t\t\t\t\tconst lWorldView = shader.uniformLocations[\"uShadowWorldView[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lWorldView, false, flattenedMatrices);\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\tlet flattenedMatrices = [].concat(...shadowMaps.map(sm => sm.camera.projectionMatrix.elements));\n\t\t\t\t\tconst lProj = shader.uniformLocations[\"uShadowProj[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lProj, false, flattenedMatrices);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst geometry = node.geometryNode.geometry;\n\n\t\t\tif(geometry.attributes[\"gps-time\"]){\n\t\t\t\tconst bufferAttribute = geometry.attributes[\"gps-time\"];\n\t\t\t\tconst attGPS = octree.getAttribute(\"gps-time\");\n\n\t\t\t\tlet initialRange = attGPS.initialRange;\n\t\t\t\tlet initialRangeSize = initialRange[1] - initialRange[0];\n\n\t\t\t\tlet globalRange = attGPS.range;\n\t\t\t\tlet globalRangeSize = globalRange[1] - globalRange[0];\n\n\t\t\t\tlet scale = initialRangeSize / globalRangeSize;\n\t\t\t\tlet offset = -(globalRange[0] - initialRange[0]) / initialRangeSize;\n\n\t\t\t\tshader.setUniform1f(\"uGpsScale\", scale);\n\t\t\t\tshader.setUniform1f(\"uGpsOffset\", offset);\n\t\t\t\t//shader.setUniform2f(\"uFilterGPSTimeClipRange\", [-Infinity, Infinity]);\n\n\t\t\t\tlet uFilterGPSTimeClipRange = material.uniforms.uFilterGPSTimeClipRange.value;\n\t\t\t\t// let gpsCliPRangeMin = uFilterGPSTimeClipRange[0]\n\t\t\t\t// let gpsCliPRangeMax = uFilterGPSTimeClipRange[1]\n\t\t\t\t// shader.setUniform2f(\"uFilterGPSTimeClipRange\", [gpsCliPRangeMin, gpsCliPRangeMax]);\n\n\t\t\t\tlet normalizedClipRange = [\n\t\t\t\t\t(uFilterGPSTimeClipRange[0] - globalRange[0]) / globalRangeSize,\n\t\t\t\t\t(uFilterGPSTimeClipRange[1] - globalRange[0]) / globalRangeSize,\n\t\t\t\t];\n\n\t\t\t\tshader.setUniform2f(\"uFilterGPSTimeClipRange\", normalizedClipRange);\n\n\n\n\t\t\t\t// // ranges in full gps coordinate system\n\t\t\t\t// const globalRange = attGPS.range;\n\t\t\t\t// const bufferRange = bufferAttribute.potree.range;\n\n\t\t\t\t// // ranges in [0, 1]\n\t\t\t\t// // normalizedGlobalRange = [0, 1]\n\t\t\t\t// // normalizedBufferRange: norm buffer within norm global range e.g. [0.2, 0.8]\n\t\t\t\t// const globalWidth = globalRange[1] - globalRange[0];\n\t\t\t\t// const normalizedBufferRange = [\n\t\t\t\t// \t(bufferRange[0] - globalRange[0]) / globalWidth,\n\t\t\t\t// \t(bufferRange[1] - globalRange[0]) / globalWidth,\n\t\t\t\t// ];\n\n\t\t\t\t// shader.setUniform2f(\"uNormalizedGpsBufferRange\", normalizedBufferRange);\n\n\t\t\t\t// let uFilterGPSTimeClipRange = material.uniforms.uFilterGPSTimeClipRange.value;\n\t\t\t\t// let gpsCliPRangeMin = uFilterGPSTimeClipRange[0]\n\t\t\t\t// let gpsCliPRangeMax = uFilterGPSTimeClipRange[1]\n\t\t\t\t// shader.setUniform2f(\"uFilterGPSTimeClipRange\", [gpsCliPRangeMin, gpsCliPRangeMax]);\n\n\t\t\t\t// shader.setUniform1f(\"uGpsScale\", bufferAttribute.potree.scale);\n\t\t\t\t// shader.setUniform1f(\"uGpsOffset\", bufferAttribute.potree.offset);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tlet uFilterReturnNumberRange = material.uniforms.uFilterReturnNumberRange.value;\n\t\t\t\tlet uFilterNumberOfReturnsRange = material.uniforms.uFilterNumberOfReturnsRange.value;\n\t\t\t\tlet uFilterPointSourceIDClipRange = material.uniforms.uFilterPointSourceIDClipRange.value;\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tshader.setUniform2f(\"uFilterReturnNumberRange\", uFilterReturnNumberRange);\n\t\t\t\tshader.setUniform2f(\"uFilterNumberOfReturnsRange\", uFilterNumberOfReturnsRange);\n\t\t\t\tshader.setUniform2f(\"uFilterPointSourceIDClipRange\", uFilterPointSourceIDClipRange);\n\t\t\t}\n\n\t\t\tlet webglBuffer = null;\n\t\t\tif(!this.buffers.has(geometry)){\n\t\t\t\twebglBuffer = this.createBuffer(geometry);\n\t\t\t\tthis.buffers.set(geometry, webglBuffer);\n\t\t\t}else{\n\t\t\t\twebglBuffer = this.buffers.get(geometry);\n\t\t\t\tfor(let attributeName in geometry.attributes){\n\t\t\t\t\tlet attribute = geometry.attributes[attributeName];\n\n\t\t\t\t\tif(attribute.version > webglBuffer.vbos.get(attributeName).version){\n\t\t\t\t\t\tthis.updateBuffer(geometry);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgl.bindVertexArray(webglBuffer.vao);\n\n\t\t\tlet isExtraAttribute =\n\t\t\t\tattributeLocations[material.activeAttributeName] === undefined\n\t\t\t\t&& Object.keys(geometry.attributes).includes(material.activeAttributeName);\n\n\t\t\tif(isExtraAttribute){\n\n\t\t\t\tconst attributeLocation = attributeLocations[\"aExtra\"].location;\n\n\t\t\t\tfor(const attributeName in geometry.attributes){\n\t\t\t\t\tconst bufferAttribute = geometry.attributes[attributeName];\n\t\t\t\t\tconst vbo = webglBuffer.vbos.get(attributeName);\n\t\t\t\t\t\n\t\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle);\n\t\t\t\t\tgl.disableVertexAttribArray(attributeLocation);\n\t\t\t\t}\n\n\t\t\t\tconst attName = material.activeAttributeName;\n\t\t\t\tconst bufferAttribute = geometry.attributes[attName];\n\t\t\t\tconst vbo = webglBuffer.vbos.get(attName);\n\n\t\t\t\tif(bufferAttribute !== undefined && vbo !== undefined){\n\t\t\t\t\tlet type = this.glTypeMapping.get(bufferAttribute.array.constructor);\n\t\t\t\t\tlet normalized = bufferAttribute.normalized;\n\n\t\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle);\n\t\t\t\t\tgl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0);\n\t\t\t\t\tgl.enableVertexAttribArray(attributeLocation);\n\t\t\t\t}\n\n\n\n\n\t\t\t\t{\n\t\t\t\t\tconst attExtra = octree.pcoGeometry.pointAttributes.attributes\n\t\t\t\t\t\t.find(a => a.name === attName);\n\n\t\t\t\t\tlet range = material.getRange(attName);\n\t\t\t\t\tif(!range){\n\t\t\t\t\t\trange = attExtra.range;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(!range){\n\t\t\t\t\t\trange = [0, 1];\n\t\t\t\t\t}\n\n\t\t\t\t\tlet initialRange = attExtra.initialRange;\n\t\t\t\t\tlet initialRangeSize = initialRange[1] - initialRange[0];\n\n\t\t\t\t\tlet globalRange = range;\n\t\t\t\t\tlet globalRangeSize = globalRange[1] - globalRange[0];\n\n\t\t\t\t\tlet scale = initialRangeSize / globalRangeSize;\n\t\t\t\t\tlet offset = -(globalRange[0] - initialRange[0]) / initialRangeSize;\n\n\t\t\t\t\tshader.setUniform1f(\"uExtraScale\", scale);\n\t\t\t\t\tshader.setUniform1f(\"uExtraOffset\", offset);\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t}else{\n\n\t\t\t\tfor(const attributeName in geometry.attributes){\n\t\t\t\t\tconst bufferAttribute = geometry.attributes[attributeName];\n\t\t\t\t\tconst vbo = webglBuffer.vbos.get(attributeName);\n\n\n\t\t\t\t\tif(attributeLocations[attributeName] !== undefined){\n\t\t\t\t\t\tconst attributeLocation = attributeLocations[attributeName].location;\n\n\t\t\t\t\t\tlet type = this.glTypeMapping.get(bufferAttribute.array.constructor);\n\t\t\t\t\t\tlet normalized = bufferAttribute.normalized;\n\t\t\t\t\t\t\n\t\t\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle);\n\t\t\t\t\t\tgl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0);\n\t\t\t\t\t\tgl.enableVertexAttribArray(attributeLocation);\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet numPoints = webglBuffer.numElements;\n\t\t\tgl.drawArrays(gl.POINTS, 0, numPoints);\n\n\t\t\ti++;\n\t\t}\n\n\t\tgl.bindVertexArray(null);\n\n\t\tif (exports.measureTimings) {\n\t\t\tperformance.mark(\"renderNodes-end\");\n\t\t\tperformance.measure(\"render.renderNodes\", \"renderNodes-start\", \"renderNodes-end\");\n\t\t}\n\t}\n\n\trenderOctree(octree, nodes, camera, target, params = {}){\n\n\t\tlet gl = this.gl;\n\n\t\tlet material = params.material ? params.material : octree.material;\n\t\tlet shadowMaps = params.shadowMaps == null ? [] : params.shadowMaps;\n\t\tlet view = camera.matrixWorldInverse;\n\t\tlet viewInv = camera.matrixWorld;\n\t\tlet proj = camera.projectionMatrix;\n\t\tlet projInv = new THREE.Matrix4().getInverse(proj);\n\t\tlet worldView = new THREE.Matrix4();\n\n\t\tlet shader = null;\n\t\tlet visibilityTextureData = null;\n\n\t\tlet currentTextureBindingPoint = 0;\n\n\t\tif (material.pointSizeType >= 0) {\n\t\t\tif (material.pointSizeType === PointSizeType.ADAPTIVE ||\n\t\t\t\tmaterial.activeAttributeName === \"level of detail\") {\n\n\t\t\t\tlet vnNodes = (params.vnTextureNodes != null) ? params.vnTextureNodes : nodes;\n\t\t\t\tvisibilityTextureData = octree.computeVisibilityTextureData(vnNodes, camera);\n\n\t\t\t\tconst vnt = material.visibleNodesTexture;\n\t\t\t\tconst data = vnt.image.data;\n\t\t\t\tdata.set(visibilityTextureData.data);\n\t\t\t\tvnt.needsUpdate = true;\n\n\t\t\t}\n\t\t}\n\n\t\t{ // UPDATE SHADER AND TEXTURES\n\t\t\tif (!this.shaders.has(material)) {\n\t\t\t\tlet [vs, fs] = [material.vertexShader, material.fragmentShader];\n\t\t\t\tlet shader = new Shader(gl, \"pointcloud\", vs, fs);\n\n\t\t\t\tthis.shaders.set(material, shader);\n\t\t\t}\n\n\t\t\tshader = this.shaders.get(material);\n\n\t\t\t//if(material.needsUpdate){\n\t\t\t{\n\t\t\t\tlet [vs, fs] = [material.vertexShader, material.fragmentShader];\n\n\t\t\t\tlet numSnapshots = material.snapEnabled ? material.numSnapshots : 0;\n\t\t\t\tlet numClipBoxes = (material.clipBoxes && material.clipBoxes.length) ? material.clipBoxes.length : 0;\n\t\t\t\tlet numClipSpheres = (params.clipSpheres && params.clipSpheres.length) ? params.clipSpheres.length : 0;\n\t\t\t\tlet numClipPolygons = (material.clipPolygons && material.clipPolygons.length) ? material.clipPolygons.length : 0;\n\n\t\t\t\tlet defines = [\n\t\t\t\t\t`#define num_shadowmaps ${shadowMaps.length}`,\n\t\t\t\t\t`#define num_snapshots ${numSnapshots}`,\n\t\t\t\t\t`#define num_clipboxes ${numClipBoxes}`,\n\t\t\t\t\t`#define num_clipspheres ${numClipSpheres}`,\n\t\t\t\t\t`#define num_clippolygons ${numClipPolygons}`,\n\t\t\t\t];\n\n\n\t\t\t\tif(octree.pcoGeometry.root.isLoaded()){\n\t\t\t\t\tlet attributes = octree.pcoGeometry.root.geometry.attributes;\n\n\t\t\t\t\tif(attributes[\"gps-time\"]){\n\t\t\t\t\t\tdefines.push(\"#define clip_gps_enabled\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif(attributes[\"return number\"]){\n\t\t\t\t\t\tdefines.push(\"#define clip_return_number_enabled\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif(attributes[\"number of returns\"]){\n\t\t\t\t\t\tdefines.push(\"#define clip_number_of_returns_enabled\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif(attributes[\"source id\"] || attributes[\"point source id\"]){\n\t\t\t\t\t\tdefines.push(\"#define clip_point_source_id_enabled\");\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tlet definesString = defines.join(\"\\n\");\n\n\t\t\t\tlet vsVersionIndex = vs.indexOf(\"#version \");\n\t\t\t\tlet fsVersionIndex = fs.indexOf(\"#version \");\n\n\t\t\t\tif(vsVersionIndex >= 0){\n\t\t\t\t\tvs = vs.replace(/(#version .*)/, `$1\\n${definesString}`)\n\t\t\t\t}else{\n\t\t\t\t\tvs = `${definesString}\\n${vs}`;\n\t\t\t\t}\n\n\t\t\t\tif(fsVersionIndex >= 0){\n\t\t\t\t\tfs = fs.replace(/(#version .*)/, `$1\\n${definesString}`)\n\t\t\t\t}else{\n\t\t\t\t\tfs = `${definesString}\\n${fs}`;\n\t\t\t\t}\n\n\n\t\t\t\tshader.update(vs, fs);\n\n\t\t\t\tmaterial.needsUpdate = false;\n\t\t\t}\n\n\t\t\tfor (let uniformName of Object.keys(material.uniforms)) {\n\t\t\t\tlet uniform = material.uniforms[uniformName];\n\n\t\t\t\tif (uniform.type == \"t\") {\n\n\t\t\t\t\tlet texture = uniform.value;\n\n\t\t\t\t\tif (!texture) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this.textures.has(texture)) {\n\t\t\t\t\t\tlet webglTexture = new WebGLTexture(gl, texture);\n\n\t\t\t\t\t\tthis.textures.set(texture, webglTexture);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet webGLTexture = this.textures.get(texture);\n\t\t\t\t\twebGLTexture.update();\n\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tgl.useProgram(shader.program);\n\n\t\tlet transparent = false;\n\t\tif(params.transparent !== undefined){\n\t\t\ttransparent = params.transparent && material.opacity < 1;\n\t\t}else{\n\t\t\ttransparent = material.opacity < 1;\n\t\t}\n\n\t\tif (transparent){\n\t\t\tgl.enable(gl.BLEND);\n\t\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE);\n\t\t\tgl.depthMask(false);\n\t\t\tgl.disable(gl.DEPTH_TEST);\n\t\t} else {\n\t\t\tgl.disable(gl.BLEND);\n\t\t\tgl.depthMask(true);\n\t\t\tgl.enable(gl.DEPTH_TEST);\n\t\t}\n\n\t\tif(params.blendFunc !== undefined){\n\t\t\tgl.enable(gl.BLEND);\n\t\t\tgl.blendFunc(...params.blendFunc);\n\t\t}\n\n\t\tif(params.depthTest !== undefined){\n\t\t\tif(params.depthTest === true){\n\t\t\t\tgl.enable(gl.DEPTH_TEST);\n\t\t\t}else{\n\t\t\t\tgl.disable(gl.DEPTH_TEST);\n\t\t\t}\n\t\t}\n\n\t\tif(params.depthWrite !== undefined){\n\t\t\t if(params.depthWrite === true){\n\t\t\t\t gl.depthMask(true);\n\t\t\t }else{\n\t\t\t\t gl.depthMask(false);\n\t\t\t }\n\t\t\t \n\t\t}\n\n\n\t\t{ // UPDATE UNIFORMS\n\t\t\tshader.setUniformMatrix4(\"projectionMatrix\", proj);\n\t\t\tshader.setUniformMatrix4(\"viewMatrix\", view);\n\t\t\tshader.setUniformMatrix4(\"uViewInv\", viewInv);\n\t\t\tshader.setUniformMatrix4(\"uProjInv\", projInv);\n\n\t\t\tlet screenWidth = target ? target.width : material.screenWidth;\n\t\t\tlet screenHeight = target ? target.height : material.screenHeight;\n\n\t\t\tshader.setUniform1f(\"uScreenWidth\", screenWidth);\n\t\t\tshader.setUniform1f(\"uScreenHeight\", screenHeight);\n\t\t\tshader.setUniform1f(\"fov\", Math.PI * camera.fov / 180);\n\t\t\tshader.setUniform1f(\"near\", camera.near);\n\t\t\tshader.setUniform1f(\"far\", camera.far);\n\t\t\t\n\t\t\tif(camera instanceof THREE.OrthographicCamera){\n\t\t\t\tshader.setUniform(\"uUseOrthographicCamera\", true);\n\t\t\t\tshader.setUniform(\"uOrthoWidth\", camera.right - camera.left); \n\t\t\t\tshader.setUniform(\"uOrthoHeight\", camera.top - camera.bottom);\n\t\t\t}else{\n\t\t\t\tshader.setUniform(\"uUseOrthographicCamera\", false);\n\t\t\t}\n\n\t\t\tif(material.clipBoxes.length + material.clipPolygons.length === 0){\n\t\t\t\tshader.setUniform1i(\"clipTask\", ClipTask.NONE);\n\t\t\t}else{\n\t\t\t\tshader.setUniform1i(\"clipTask\", material.clipTask);\n\t\t\t}\n\n\t\t\tshader.setUniform1i(\"clipMethod\", material.clipMethod);\n\n\t\t\tif (material.clipBoxes && material.clipBoxes.length > 0) {\n\t\t\t\t//let flattenedMatrices = [].concat(...material.clipBoxes.map(c => c.inverse.elements));\n\n\t\t\t\t//const lClipBoxes = shader.uniformLocations[\"clipBoxes[0]\"];\n\t\t\t\t//gl.uniformMatrix4fv(lClipBoxes, false, flattenedMatrices);\n\n\t\t\t\tconst lClipBoxes = shader.uniformLocations[\"clipBoxes[0]\"];\n\t\t\t\tgl.uniformMatrix4fv(lClipBoxes, false, material.uniforms.clipBoxes.value);\n\t\t\t}\n\n\t\t\t// TODO CLIPSPHERES\n\t\t\tif(params.clipSpheres && params.clipSpheres.length > 0){\n\n\t\t\t\tlet clipSpheres = params.clipSpheres;\n\n\t\t\t\tlet matrices = [];\n\t\t\t\tfor(let clipSphere of clipSpheres){\n\t\t\t\t\t//let mScale = new THREE.Matrix4().makeScale(...clipSphere.scale.toArray());\n\t\t\t\t\t//let mTranslate = new THREE.Matrix4().makeTranslation(...clipSphere.position.toArray());\n\n\t\t\t\t\t//let clipToWorld = new THREE.Matrix4().multiplyMatrices(mTranslate, mScale);\n\t\t\t\t\tlet clipToWorld = clipSphere.matrixWorld;\n\t\t\t\t\tlet viewToWorld = camera.matrixWorld\n\t\t\t\t\tlet worldToClip = new THREE.Matrix4().getInverse(clipToWorld);\n\n\t\t\t\t\tlet viewToClip = new THREE.Matrix4().multiplyMatrices(worldToClip, viewToWorld);\n\n\t\t\t\t\tmatrices.push(viewToClip);\n\t\t\t\t}\n\n\t\t\t\tlet flattenedMatrices = [].concat(...matrices.map(matrix => matrix.elements));\n\n\t\t\t\tconst lClipSpheres = shader.uniformLocations[\"uClipSpheres[0]\"];\n\t\t\t\tgl.uniformMatrix4fv(lClipSpheres, false, flattenedMatrices);\n\t\t\t\t\n\t\t\t\t//const lClipSpheres = shader.uniformLocations[\"uClipSpheres[0]\"];\n\t\t\t\t//gl.uniformMatrix4fv(lClipSpheres, false, material.uniforms.clipSpheres.value);\n\t\t\t}\n\n\n\t\t\tshader.setUniform1f(\"size\", material.size);\n\t\t\tshader.setUniform1f(\"maxSize\", material.uniforms.maxSize.value);\n\t\t\tshader.setUniform1f(\"minSize\", material.uniforms.minSize.value);\n\n\n\t\t\t// uniform float uPCIndex\n\t\t\tshader.setUniform1f(\"uOctreeSpacing\", material.spacing);\n\t\t\tshader.setUniform(\"uOctreeSize\", material.uniforms.octreeSize.value);\n\n\n\t\t\t//uniform vec3 uColor;\n\t\t\tshader.setUniform3f(\"uColor\", material.color.toArray());\n\t\t\t//uniform float opacity;\n\t\t\tshader.setUniform1f(\"uOpacity\", material.opacity);\n\n\t\t\tshader.setUniform2f(\"elevationRange\", material.elevationRange);\n\t\t\tshader.setUniform2f(\"intensityRange\", material.intensityRange);\n\n\n\t\t\tshader.setUniform3f(\"uIntensity_gbc\", [\n\t\t\t\tmaterial.intensityGamma, \n\t\t\t\tmaterial.intensityBrightness, \n\t\t\t\tmaterial.intensityContrast\n\t\t\t]);\n\n\t\t\tshader.setUniform3f(\"uRGB_gbc\", [\n\t\t\t\tmaterial.rgbGamma, \n\t\t\t\tmaterial.rgbBrightness, \n\t\t\t\tmaterial.rgbContrast\n\t\t\t]);\n\n\t\t\tshader.setUniform1f(\"uTransition\", material.transition);\n\t\t\tshader.setUniform1f(\"wRGB\", material.weightRGB);\n\t\t\tshader.setUniform1f(\"wIntensity\", material.weightIntensity);\n\t\t\tshader.setUniform1f(\"wElevation\", material.weightElevation);\n\t\t\tshader.setUniform1f(\"wClassification\", material.weightClassification);\n\t\t\tshader.setUniform1f(\"wReturnNumber\", material.weightReturnNumber);\n\t\t\tshader.setUniform1f(\"wSourceID\", material.weightSourceID);\n\n\t\t\tshader.setUniform(\"backfaceCulling\", material.uniforms.backfaceCulling.value);\n\n\t\t\tlet vnWebGLTexture = this.textures.get(material.visibleNodesTexture);\n\t\t\tif(vnWebGLTexture){\n\t\t\t\tshader.setUniform1i(\"visibleNodesTexture\", currentTextureBindingPoint);\n\t\t\t\tgl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint);\n\t\t\t\tgl.bindTexture(vnWebGLTexture.target, vnWebGLTexture.id);\n\t\t\t\tcurrentTextureBindingPoint++;\n\t\t\t}\n\n\t\t\tlet gradientTexture = this.textures.get(material.gradientTexture);\n\t\t\tshader.setUniform1i(\"gradient\", currentTextureBindingPoint);\n\t\t\tgl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint);\n\t\t\tgl.bindTexture(gradientTexture.target, gradientTexture.id);\n\n\t\t\tconst repeat = material.elevationGradientRepeat;\n\t\t\tif(repeat === ElevationGradientRepeat.REPEAT){\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.REPEAT);\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.REPEAT);\n\t\t\t}else if(repeat === ElevationGradientRepeat.MIRRORED_REPEAT){\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t\t\t}else{\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\t\t}\n\t\t\tcurrentTextureBindingPoint++;\n\n\t\t\tlet classificationTexture = this.textures.get(material.classificationTexture);\n\t\t\tshader.setUniform1i(\"classificationLUT\", currentTextureBindingPoint);\n\t\t\tgl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint);\n\t\t\tgl.bindTexture(classificationTexture.target, classificationTexture.id);\n\t\t\tcurrentTextureBindingPoint++;\n\n\t\t\tlet matcapTexture = this.textures.get(material.matcapTexture);\n\t\t\tshader.setUniform1i(\"matcapTextureUniform\", currentTextureBindingPoint);\n\t\t\tgl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint);\n\t\t\tgl.bindTexture(matcapTexture.target, matcapTexture.id);\n\t\t\tcurrentTextureBindingPoint++;\n\n\n\t\t\tif (material.snapEnabled === true) {\n\n\t\t\t\t{\n\t\t\t\t\tconst lSnapshot = shader.uniformLocations[\"uSnapshot[0]\"];\n\t\t\t\t\tconst lSnapshotDepth = shader.uniformLocations[\"uSnapshotDepth[0]\"];\n\n\t\t\t\t\tlet bindingStart = currentTextureBindingPoint;\n\t\t\t\t\tlet lSnapshotBindingPoints = new Array(5).fill(bindingStart).map((a, i) => (a + i));\n\t\t\t\t\tlet lSnapshotDepthBindingPoints = new Array(5)\n\t\t\t\t\t\t.fill(1 + Math.max(...lSnapshotBindingPoints))\n\t\t\t\t\t\t.map((a, i) => (a + i));\n\t\t\t\t\tcurrentTextureBindingPoint = 1 + Math.max(...lSnapshotDepthBindingPoints);\n\n\t\t\t\t\tgl.uniform1iv(lSnapshot, lSnapshotBindingPoints);\n\t\t\t\t\tgl.uniform1iv(lSnapshotDepth, lSnapshotDepthBindingPoints);\n\n\t\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\t\tlet texture = material.uniforms[`uSnapshot`].value[i];\n\t\t\t\t\t\tlet textureDepth = material.uniforms[`uSnapshotDepth`].value[i];\n\n\t\t\t\t\t\tif (!texture) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet snapTexture = this.threeRenderer.properties.get(texture).__webglTexture;\n\t\t\t\t\t\tlet snapTextureDepth = this.threeRenderer.properties.get(textureDepth).__webglTexture;\n\n\t\t\t\t\t\tlet bindingPoint = lSnapshotBindingPoints[i];\n\t\t\t\t\t\tlet depthBindingPoint = lSnapshotDepthBindingPoints[i];\n\n\t\t\t\t\t\tgl.activeTexture(gl[`TEXTURE${bindingPoint}`]);\n\t\t\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, snapTexture);\n\n\t\t\t\t\t\tgl.activeTexture(gl[`TEXTURE${depthBindingPoint}`]);\n\t\t\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, snapTextureDepth);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\tlet flattenedMatrices = [].concat(...material.uniforms.uSnapView.value.map(c => c.elements));\n\t\t\t\t\tconst lSnapView = shader.uniformLocations[\"uSnapView[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lSnapView, false, flattenedMatrices);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tlet flattenedMatrices = [].concat(...material.uniforms.uSnapProj.value.map(c => c.elements));\n\t\t\t\t\tconst lSnapProj = shader.uniformLocations[\"uSnapProj[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lSnapProj, false, flattenedMatrices);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tlet flattenedMatrices = [].concat(...material.uniforms.uSnapProjInv.value.map(c => c.elements));\n\t\t\t\t\tconst lSnapProjInv = shader.uniformLocations[\"uSnapProjInv[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lSnapProjInv, false, flattenedMatrices);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tlet flattenedMatrices = [].concat(...material.uniforms.uSnapViewInv.value.map(c => c.elements));\n\t\t\t\t\tconst lSnapViewInv = shader.uniformLocations[\"uSnapViewInv[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lSnapViewInv, false, flattenedMatrices);\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tthis.renderNodes(octree, nodes, visibilityTextureData, camera, target, shader, params);\n\n\t\tgl.activeTexture(gl.TEXTURE2);\n\t\tgl.bindTexture(gl.TEXTURE_2D, null);\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t}\n\n\trender(scene, camera, target = null, params = {}) {\n\n\t\tconst gl = this.gl;\n\n\t\t// PREPARE \n\t\tif (target != null) {\n\t\t\tthis.threeRenderer.setRenderTarget(target);\n\t\t}\n\n\t\tcamera.updateProjectionMatrix();\n\n\t\tconst traversalResult = this.traverse(scene);\n\n\n\t\t// RENDER\n\t\tfor (const octree of traversalResult.octrees) {\n\t\t\tlet nodes = octree.visibleNodes;\n\t\t\tthis.renderOctree(octree, nodes, camera, target, params);\n\t\t}\n\n\n\t\t// CLEANUP\n\t\tgl.activeTexture(gl.TEXTURE1);\n\t\tgl.bindTexture(gl.TEXTURE_2D, null)\n\n\t\tthis.threeRenderer.state.reset();\n\t}\n\n\n\n};\n\n\n\n\n\n\n\n\n","\nimport {Points} from \"./Points.js\";\n\nexport class ProfileData {\n\tconstructor (profile) {\n\t\tthis.profile = profile;\n\n\t\tthis.segments = [];\n\t\tthis.boundingBox = new THREE.Box3();\n\n\t\tfor (let i = 0; i < profile.points.length - 1; i++) {\n\t\t\tlet start = profile.points[i];\n\t\t\tlet end = profile.points[i + 1];\n\n\t\t\tlet startGround = new THREE.Vector3(start.x, start.y, 0);\n\t\t\tlet endGround = new THREE.Vector3(end.x, end.y, 0);\n\n\t\t\tlet center = new THREE.Vector3().addVectors(endGround, startGround).multiplyScalar(0.5);\n\t\t\tlet length = startGround.distanceTo(endGround);\n\t\t\tlet side = new THREE.Vector3().subVectors(endGround, startGround).normalize();\n\t\t\tlet up = new THREE.Vector3(0, 0, 1);\n\t\t\tlet forward = new THREE.Vector3().crossVectors(side, up).normalize();\n\t\t\tlet N = forward;\n\t\t\tlet cutPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(N, startGround);\n\t\t\tlet halfPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(side, center);\n\n\t\t\tlet segment = {\n\t\t\t\tstart: start,\n\t\t\t\tend: end,\n\t\t\t\tcutPlane: cutPlane,\n\t\t\t\thalfPlane: halfPlane,\n\t\t\t\tlength: length,\n\t\t\t\tpoints: new Points()\n\t\t\t};\n\n\t\t\tthis.segments.push(segment);\n\t\t}\n\t}\n\n\tsize () {\n\t\tlet size = 0;\n\t\tfor (let segment of this.segments) {\n\t\t\tsize += segment.points.numPoints;\n\t\t}\n\n\t\treturn size;\n\t}\n};\n\nexport class ProfileRequest {\n\tconstructor (pointcloud, profile, maxDepth, callback) {\n\t\tthis.pointcloud = pointcloud;\n\t\tthis.profile = profile;\n\t\tthis.maxDepth = maxDepth || Number.MAX_VALUE;\n\t\tthis.callback = callback;\n\t\tthis.temporaryResult = new ProfileData(this.profile);\n\t\tthis.pointsServed = 0;\n\t\tthis.highestLevelServed = 0;\n\n\t\tthis.priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; });\n\n\t\tthis.initialize();\n\t}\n\n\tinitialize () {\n\t\tthis.priorityQueue.push({node: this.pointcloud.pcoGeometry.root, weight: Infinity});\n\t};\n\n\t// traverse the node and add intersecting descendants to queue\n\ttraverse (node) {\n\t\tlet stack = [];\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tlet child = node.children[i];\n\t\t\tif (child && this.pointcloud.nodeIntersectsProfile(child, this.profile)) {\n\t\t\t\tstack.push(child);\n\t\t\t}\n\t\t}\n\n\t\twhile (stack.length > 0) {\n\t\t\tlet node = stack.pop();\n\t\t\tlet weight = node.boundingSphere.radius;\n\n\t\t\tthis.priorityQueue.push({node: node, weight: weight});\n\n\t\t\t// add children that intersect the cutting plane\n\t\t\tif (node.level < this.maxDepth) {\n\t\t\t\tfor (let i = 0; i < 8; i++) {\n\t\t\t\t\tlet child = node.children[i];\n\t\t\t\t\tif (child && this.pointcloud.nodeIntersectsProfile(child, this.profile)) {\n\t\t\t\t\t\tstack.push(child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tupdate(){\n\t\tif(!this.updateGeneratorInstance){\n\t\t\tthis.updateGeneratorInstance = this.updateGenerator();\n\t\t}\n\n\t\tlet result = this.updateGeneratorInstance.next();\n\t\tif(result.done){\n\t\t\tthis.updateGeneratorInstance = null;\n\t\t}\n\t}\n\n\t* updateGenerator(){\n\t\t// load nodes in queue\n\t\t// if hierarchy expands, also load nodes from expanded hierarchy\n\t\t// once loaded, add data to this.points and remove node from queue\n\t\t// only evaluate 1-50 nodes per frame to maintain responsiveness\n\n\t\tlet start = performance.now();\n\n\t\tlet maxNodesPerUpdate = 1;\n\t\tlet intersectedNodes = [];\n\n\t\tfor (let i = 0; i < Math.min(maxNodesPerUpdate, this.priorityQueue.size()); i++) {\n\t\t\tlet element = this.priorityQueue.pop();\n\t\t\tlet node = element.node;\n\n\t\t\tif(node.level > this.maxDepth){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (node.loaded) {\n\t\t\t\t// add points to result\n\t\t\t\tintersectedNodes.push(node);\n\t\t\t\texports.lru.touch(node);\n\t\t\t\tthis.highestLevelServed = Math.max(node.getLevel(), this.highestLevelServed);\n\n\t\t\t\tvar geom = node.pcoGeometry;\n\t\t\t\tvar hierarchyStepSize = geom ? geom.hierarchyStepSize : 1;\n\n\t\t\t\tvar doTraverse = node.getLevel() === 0 ||\n\t\t\t\t\t(node.level % hierarchyStepSize === 0 && node.hasChildren);\n\n\t\t\t\tif (doTraverse) {\n\t\t\t\t\tthis.traverse(node);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode.load();\n\t\t\t\tthis.priorityQueue.push(element);\n\t\t\t}\n\t\t}\n\n\t\tif (intersectedNodes.length > 0) {\n\n\t\t\tfor(let done of this.getPointsInsideProfile(intersectedNodes, this.temporaryResult)){\n\t\t\t\tif(!done){\n\t\t\t\t\t//console.log(\"updateGenerator yields\");\n\t\t\t\t\tyield false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.temporaryResult.size() > 100) {\n\t\t\t\tthis.pointsServed += this.temporaryResult.size();\n\t\t\t\tthis.callback.onProgress({request: this, points: this.temporaryResult});\n\t\t\t\tthis.temporaryResult = new ProfileData(this.profile);\n\t\t\t}\n\t\t}\n\n\t\tif (this.priorityQueue.size() === 0) {\n\t\t\t// we're done! inform callback and remove from pending requests\n\n\t\t\tif (this.temporaryResult.size() > 0) {\n\t\t\t\tthis.pointsServed += this.temporaryResult.size();\n\t\t\t\tthis.callback.onProgress({request: this, points: this.temporaryResult});\n\t\t\t\tthis.temporaryResult = new ProfileData(this.profile);\n\t\t\t}\n\n\t\t\tthis.callback.onFinish({request: this});\n\n\t\t\tlet index = this.pointcloud.profileRequests.indexOf(this);\n\t\t\tif (index >= 0) {\n\t\t\t\tthis.pointcloud.profileRequests.splice(index, 1);\n\t\t\t}\n\t\t}\n\n\t\tyield true;\n\t};\n\n\t* getAccepted(numPoints, node, matrix, segment, segmentDir, points, totalMileage){\n\t\tlet checkpoint = performance.now();\n\n\t\tlet accepted = new Uint32Array(numPoints);\n\t\tlet mileage = new Float64Array(numPoints);\n\t\tlet acceptedPositions = new Float32Array(numPoints * 3);\n\t\tlet numAccepted = 0;\n\n\t\tlet pos = new THREE.Vector3();\n\t\tlet svp = new THREE.Vector3();\n\n\t\tlet view = new Float32Array(node.geometry.attributes.position.array);\n\n\t\tfor (let i = 0; i < numPoints; i++) {\n\n\t\t\tpos.set(\n\t\t\t\tview[i * 3 + 0],\n\t\t\t\tview[i * 3 + 1],\n\t\t\t\tview[i * 3 + 2]);\n\n\t\t\tpos.applyMatrix4(matrix);\n\t\t\tlet distance = Math.abs(segment.cutPlane.distanceToPoint(pos));\n\t\t\tlet centerDistance = Math.abs(segment.halfPlane.distanceToPoint(pos));\n\n\t\t\tif (distance < this.profile.width / 2 && centerDistance < segment.length / 2) {\n\t\t\t\tsvp.subVectors(pos, segment.start);\n\t\t\t\tlet localMileage = segmentDir.dot(svp);\n\n\t\t\t\taccepted[numAccepted] = i;\n\t\t\t\tmileage[numAccepted] = localMileage + totalMileage;\n\t\t\t\tpoints.boundingBox.expandByPoint(pos);\n\n\t\t\t\tpos.sub(this.pointcloud.position);\n\n\t\t\t\tacceptedPositions[3 * numAccepted + 0] = pos.x;\n\t\t\t\tacceptedPositions[3 * numAccepted + 1] = pos.y;\n\t\t\t\tacceptedPositions[3 * numAccepted + 2] = pos.z;\n\n\t\t\t\tnumAccepted++;\n\t\t\t}\n\n\t\t\tif((i % 1000) === 0){\n\t\t\t\tlet duration = performance.now() - checkpoint;\n\t\t\t\tif(duration > 4){\n\t\t\t\t\t//console.log(`getAccepted yield after ${duration}ms`);\n\t\t\t\t\tyield false;\n\t\t\t\t\tcheckpoint = performance.now();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\taccepted = accepted.subarray(0, numAccepted);\n\t\tmileage = mileage.subarray(0, numAccepted);\n\t\tacceptedPositions = acceptedPositions.subarray(0, numAccepted * 3);\n\n\t\t//let end = performance.now();\n\t\t//let duration = end - start;\n\t\t//console.log(\"accepted duration \", duration)\n\n\t\t//console.log(`getAccepted finished`);\n\n\t\tyield [accepted, mileage, acceptedPositions];\n\t}\n\n\t* getPointsInsideProfile(nodes, target){\n\t\tlet checkpoint = performance.now();\n\t\tlet totalMileage = 0;\n\n\t\tlet pointsProcessed = 0;\n\n\t\tfor (let segment of target.segments) {\n\t\t\tfor (let node of nodes) {\n\t\t\t\tlet numPoints = node.numPoints;\n\t\t\t\tlet geometry = node.geometry;\n\n\t\t\t\tif(!numPoints){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t{ // skip if current node doesn't intersect current segment\n\t\t\t\t\tlet bbWorld = node.boundingBox.clone().applyMatrix4(this.pointcloud.matrixWorld);\n\t\t\t\t\tlet bsWorld = bbWorld.getBoundingSphere(new THREE.Sphere());\n\n\t\t\t\t\tlet start = new THREE.Vector3(segment.start.x, segment.start.y, bsWorld.center.z);\n\t\t\t\t\tlet end = new THREE.Vector3(segment.end.x, segment.end.y, bsWorld.center.z);\n\n\t\t\t\t\tlet closest = new THREE.Line3(start, end).closestPointToPoint(bsWorld.center, true, new THREE.Vector3());\n\t\t\t\t\tlet distance = closest.distanceTo(bsWorld.center);\n\n\t\t\t\t\tlet intersects = (distance < (bsWorld.radius + target.profile.width));\n\n\t\t\t\t\tif(!intersects){\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//{// DEBUG\n\t\t\t\t//\tconsole.log(node.name);\n\t\t\t\t//\tlet boxHelper = new Potree.Box3Helper(node.getBoundingBox());\n\t\t\t\t//\tboxHelper.matrixAutoUpdate = false;\n\t\t\t\t//\tboxHelper.matrix.copy(viewer.scene.pointclouds[0].matrixWorld);\n\t\t\t\t//\tviewer.scene.scene.add(boxHelper);\n\t\t\t\t//}\n\n\t\t\t\tlet sv = new THREE.Vector3().subVectors(segment.end, segment.start).setZ(0);\n\t\t\t\tlet segmentDir = sv.clone().normalize();\n\n\t\t\t\tlet points = new Points();\n\n\t\t\t\tlet nodeMatrix = new THREE.Matrix4().makeTranslation(...node.boundingBox.min.toArray());\n\n\t\t\t\tlet matrix = new THREE.Matrix4().multiplyMatrices(\n\t\t\t\t\tthis.pointcloud.matrixWorld, nodeMatrix);\n\n\t\t\t\tpointsProcessed = pointsProcessed + numPoints;\n\n\t\t\t\tlet accepted = null;\n\t\t\t\tlet mileage = null;\n\t\t\t\tlet acceptedPositions = null;\n\t\t\t\tfor(let result of this.getAccepted(numPoints, node, matrix, segment, segmentDir, points,totalMileage)){\n\t\t\t\t\tif(!result){\n\t\t\t\t\t\tlet duration = performance.now() - checkpoint;\n\t\t\t\t\t\t//console.log(`getPointsInsideProfile yield after ${duration}ms`);\n\t\t\t\t\t\tyield false;\n\t\t\t\t\t\tcheckpoint = performance.now();\n\t\t\t\t\t}else{\n\t\t\t\t\t\t[accepted, mileage, acceptedPositions] = result;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet duration = performance.now() - checkpoint;\n\t\t\t\tif(duration > 4){\n\t\t\t\t\t//console.log(`getPointsInsideProfile yield after ${duration}ms`);\n\t\t\t\t\tyield false;\n\t\t\t\t\tcheckpoint = performance.now();\n\t\t\t\t}\n\n\t\t\t\tpoints.data.position = acceptedPositions;\n\n\t\t\t\tlet relevantAttributes = Object.keys(geometry.attributes).filter(a => ![\"position\", \"indices\"].includes(a));\n\t\t\t\tfor(let attributeName of relevantAttributes){\n\n\t\t\t\t\tlet attribute = geometry.attributes[attributeName];\n\t\t\t\t\tlet numElements = attribute.array.length / numPoints;\n\n\t\t\t\t\tif(numElements !== parseInt(numElements)){\n\t\t\t\t\t\tdebugger;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet Type = attribute.array.constructor;\n\n\t\t\t\t\tlet filteredBuffer = new Type(numElements * accepted.length);\n\n\t\t\t\t\tlet source = attribute.array;\n\t\t\t\t\tlet target = filteredBuffer;\n\n\t\t\t\t\tfor(let i = 0; i < accepted.length; i++){\n\n\t\t\t\t\t\tlet index = accepted[i];\n\n\t\t\t\t\t\tlet start = index * numElements;\n\t\t\t\t\t\tlet end = start + numElements;\n\t\t\t\t\t\tlet sub = source.subarray(start, end);\n\n\t\t\t\t\t\ttarget.set(sub, i * numElements);\n\t\t\t\t\t}\n\n\t\t\t\t\tpoints.data[attributeName] = filteredBuffer;\n\t\t\t\t}\n\n\t\t\t\tpoints.data['mileage'] = mileage;\n\t\t\t\tpoints.numPoints = accepted.length;\n\n\t\t\t\tsegment.points.add(points);\n\t\t\t}\n\n\t\t\ttotalMileage += segment.length;\n\t\t}\n\n\t\tfor (let segment of target.segments) {\n\t\t\ttarget.boundingBox.union(segment.points.boundingBox);\n\t\t}\n\n\t\t//console.log(`getPointsInsideProfile finished`);\n\t\tyield true;\n\t};\n\n\tfinishLevelThenCancel () {\n\t\tif (this.cancelRequested) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.maxDepth = this.highestLevelServed;\n\t\tthis.cancelRequested = true;\n\n\t\t//console.log(`maxDepth: ${this.maxDepth}`);\n\t};\n\n\tcancel () {\n\t\tthis.callback.onCancel();\n\n\t\tthis.priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; });\n\n\t\tlet index = this.pointcloud.profileRequests.indexOf(this);\n\t\tif (index >= 0) {\n\t\t\tthis.pointcloud.profileRequests.splice(index, 1);\n\t\t}\n\t};\n}\n","\nexport class Version{\n\n\tconstructor(version){\n\t\tthis.version = version;\n\t\tlet vmLength = (version.indexOf('.') === -1) ? version.length : version.indexOf('.');\n\t\tthis.versionMajor = parseInt(version.substr(0, vmLength));\n\t\tthis.versionMinor = parseInt(version.substr(vmLength + 1));\n\t\tif (this.versionMinor.length === 0) {\n\t\t\tthis.versionMinor = 0;\n\t\t}\n\t}\n\n\tnewerThan(version){\n\t\tlet v = new Version(version);\n\n\t\tif (this.versionMajor > v.versionMajor) {\n\t\t\treturn true;\n\t\t} else if (this.versionMajor === v.versionMajor && this.versionMinor > v.versionMinor) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tequalOrHigher(version){\n\t\tlet v = new Version(version);\n\n\t\tif (this.versionMajor > v.versionMajor) {\n\t\t\treturn true;\n\t\t} else if (this.versionMajor === v.versionMajor && this.versionMinor >= v.versionMinor) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tupTo(version){\n\t\treturn !this.newerThan(version);\n\t}\n\n}\n\n\n","\nexport class WorkerPool{\n\tconstructor(){\n\t\tthis.workers = {};\n\t}\n\n\tgetWorker(url){\n\t\tif (!this.workers[url]){\n\t\t\tthis.workers[url] = [];\n\t\t}\n\n\t\tif (this.workers[url].length === 0){\n\t\t\tlet worker = new Worker(url);\n\t\t\tthis.workers[url].push(worker);\n\t\t}\n\n\t\tlet worker = this.workers[url].pop();\n\n\t\treturn worker;\n\t}\n\n\treturnWorker(url, worker){\n\t\tthis.workers[url].push(worker);\n\t}\n};\n\n//Potree.workerPool = new Potree.WorkerPool();\n","\r\n\r\nfunction createPointcloudData(pointcloud) {\r\n\r\n\tlet material = pointcloud.material;\r\n\r\n\tlet ranges = [];\r\n\t\r\n\tfor(let [name, value] of material.ranges){\r\n\t\tranges.push({\r\n\t\t\tname: name,\r\n\t\t\tvalue: value,\r\n\t\t});\r\n\t}\r\n\r\n\tif(typeof material.elevationRange[0] === \"number\"){\r\n\t\tranges.push({\r\n\t\t\tname: \"elevationRange\",\r\n\t\t\tvalue: material.elevationRange,\r\n\t\t});\r\n\t}\r\n\tif(typeof material.intensityRange[0] === \"number\"){\r\n\t\tranges.push({\r\n\t\t\tname: \"intensityRange\",\r\n\t\t\tvalue: material.intensityRange,\r\n\t\t});\r\n\t}\r\n\r\n\tlet pointSizeTypeName = Object.entries(Potree.PointSizeType).find(e => e[1] === material.pointSizeType)[0];\r\n\r\n\tlet jsonMaterial = {\r\n\t\tactiveAttributeName: material.activeAttributeName,\r\n\t\tranges: ranges,\r\n\t\tsize: material.size,\r\n\t\tminSize: material.minSize,\r\n\t\tpointSizeType: pointSizeTypeName,\r\n\t\tmatcap: material.matcap,\r\n\t};\r\n\r\n\tconst pcdata = {\r\n\t\tname: pointcloud.name,\r\n\t\turl: pointcloud.pcoGeometry.url,\r\n\t\tposition: pointcloud.position.toArray(),\r\n\t\trotation: pointcloud.rotation.toArray(),\r\n\t\tscale: pointcloud.scale.toArray(),\r\n\t\tmaterial: jsonMaterial,\r\n\t};\r\n\r\n\treturn pcdata;\r\n}\r\n\r\nfunction createProfileData(profile){\r\n\tconst data = {\r\n\t\tuuid: profile.uuid,\r\n\t\tname: profile.name,\r\n\t\tpoints: profile.points.map(p => p.toArray()),\r\n\t\theight: profile.height,\r\n\t\twidth: profile.width,\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createVolumeData(volume){\r\n\tconst data = {\r\n\t\tuuid: volume.uuid,\r\n\t\ttype: volume.constructor.name,\r\n\t\tname: volume.name,\r\n\t\tposition: volume.position.toArray(),\r\n\t\trotation: volume.rotation.toArray(),\r\n\t\tscale: volume.scale.toArray(),\r\n\t\tvisible: volume.visible,\r\n\t\tclip: volume.clip,\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createCameraAnimationData(animation){\r\n\r\n\tconst controlPoints = animation.controlPoints.map( cp => {\r\n\t\tconst cpdata = {\r\n\t\t\tposition: cp.position.toArray(),\r\n\t\t\ttarget: cp.target.toArray(),\r\n\t\t};\r\n\r\n\t\treturn cpdata;\r\n\t});\r\n\r\n\tconst data = {\r\n\t\tuuid: animation.uuid,\r\n\t\tname: animation.name,\r\n\t\tduration: animation.duration,\r\n\t\tt: animation.t,\r\n\t\tcurveType: animation.curveType,\r\n\t\tvisible: animation.visible,\r\n\t\tcontrolPoints: controlPoints,\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createMeasurementData(measurement){\r\n\r\n\tconst data = {\r\n\t\tuuid: measurement.uuid,\r\n\t\tname: measurement.name,\r\n\t\tpoints: measurement.points.map(p => p.position.toArray()),\r\n\t\tshowDistances: measurement.showDistances,\r\n\t\tshowCoordinates: measurement.showCoordinates,\r\n\t\tshowArea: measurement.showArea,\r\n\t\tclosed: measurement.closed,\r\n\t\tshowAngles: measurement.showAngles,\r\n\t\tshowHeight: measurement.showHeight,\r\n\t\tshowCircle: measurement.showCircle,\r\n\t\tshowAzimuth: measurement.showAzimuth,\r\n\t\tshowEdges: measurement.showEdges,\r\n\t\tcolor: measurement.color.toArray(),\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createOrientedImagesData(images){\r\n\tconst data = {\r\n\t\tcameraParamsPath: images.cameraParamsPath,\r\n\t\timageParamsPath: images.imageParamsPath,\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createGeopackageData(geopackage){\r\n\tconst data = {\r\n\t\tpath: geopackage.path,\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createAnnotationData(annotation){\r\n\r\n\tconst data = {\r\n\t\tuuid: annotation.uuid,\r\n\t\ttitle: annotation.title.toString(),\r\n\t\tdescription: annotation.description,\r\n\t\tposition: annotation.position.toArray(),\r\n\t\toffset: annotation.offset.toArray(),\r\n\t\tchildren: [],\r\n\t};\r\n\r\n\tif(annotation.cameraPosition){\r\n\t\tdata.cameraPosition = annotation.cameraPosition.toArray();\r\n\t}\r\n\r\n\tif(annotation.cameraTarget){\r\n\t\tdata.cameraTarget = annotation.cameraTarget.toArray();\r\n\t}\r\n\r\n\tif(typeof annotation.radius !== \"undefined\"){\r\n\t\tdata.radius = annotation.radius;\r\n\t}\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createAnnotationsData(viewer){\r\n\t\r\n\tconst map = new Map();\r\n\r\n\tviewer.scene.annotations.traverseDescendants(a => {\r\n\t\tconst aData = createAnnotationData(a);\r\n\r\n\t\tmap.set(a, aData);\r\n\t});\r\n\r\n\tfor(const [annotation, data] of map){\r\n\t\tfor(const child of annotation.children){\r\n\t\t\tconst childData = map.get(child);\r\n\t\t\tdata.children.push(childData);\r\n\t\t}\r\n\t}\r\n\r\n\tconst annotations = viewer.scene.annotations.children.map(a => map.get(a));\r\n\r\n\treturn annotations;\r\n}\r\n\r\nfunction createSettingsData(viewer){\r\n\treturn {\r\n\t\tpointBudget: viewer.getPointBudget(),\r\n\t\tfov: viewer.getFOV(),\r\n\t\tedlEnabled: viewer.getEDLEnabled(),\r\n\t\tedlRadius: viewer.getEDLRadius(),\r\n\t\tedlStrength: viewer.getEDLStrength(),\r\n\t\tbackground: viewer.getBackground(),\r\n\t\tminNodeSize: viewer.getMinNodeSize(),\r\n\t\tshowBoundingBoxes: viewer.getShowBoundingBox(),\r\n\t};\r\n}\r\n\r\nfunction createSceneContentData(viewer){\r\n\r\n\tconst data = [];\r\n\r\n\tconst potreeObjects = [];\r\n\r\n\tviewer.scene.scene.traverse(node => {\r\n\t\tif(node.potree){\r\n\t\t\tpotreeObjects.push(node);\r\n\t\t}\r\n\t});\r\n\r\n\tfor(const object of potreeObjects){\r\n\t\t\r\n\t\tif(object.potree.file){\r\n\t\t\tconst saveObject = {\r\n\t\t\t\tfile: object.potree.file,\r\n\t\t\t};\r\n\r\n\t\t\tdata.push(saveObject);\r\n\t\t}\r\n\r\n\r\n\t}\r\n\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createViewData(viewer){\r\n\tconst view = viewer.scene.view;\r\n\r\n\tconst data = {\r\n\t\tposition: view.position.toArray(),\r\n\t\ttarget: view.getPivot().toArray(),\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createClassificationData(viewer){\r\n\tconst classifications = viewer.classifications;\r\n\r\n\tconst data = classifications;\r\n\r\n\treturn data;\r\n}\r\n\r\nexport function saveProject(viewer) {\r\n\r\n\tconst scene = viewer.scene;\r\n\r\n\tconst data = {\r\n\t\ttype: \"Potree\",\r\n\t\tversion: 1.7,\r\n\t\tsettings: createSettingsData(viewer),\r\n\t\tview: createViewData(viewer),\r\n\t\tclassification: createClassificationData(viewer),\r\n\t\tpointclouds: scene.pointclouds.map(createPointcloudData),\r\n\t\tmeasurements: scene.measurements.map(createMeasurementData),\r\n\t\tvolumes: scene.volumes.map(createVolumeData),\r\n\t\tcameraAnimations: scene.cameraAnimations.map(createCameraAnimationData),\r\n\t\tprofiles: scene.profiles.map(createProfileData),\r\n\t\tannotations: createAnnotationsData(viewer),\r\n\t\torientedImages: scene.orientedImages.map(createOrientedImagesData),\r\n\t\tgeopackages: scene.geopackages.map(createGeopackageData),\r\n\t\t// objects: createSceneContentData(viewer),\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n","\r\nimport { EventDispatcher } from \"../../EventDispatcher.js\";\r\nimport { Utils } from \"../../utils.js\";\r\n\r\nclass ControlPoint{\r\n\r\n\tconstructor(){\r\n\t\tthis.position = new THREE.Vector3(0, 0, 0);\r\n\t\tthis.target = new THREE.Vector3(0, 0, 0);\r\n\t\tthis.positionHandle = null;\r\n\t\tthis.targetHandle = null;\r\n\t}\r\n\r\n};\r\n\r\n\r\n\r\nexport class CameraAnimation extends EventDispatcher{\r\n\r\n\tconstructor(viewer){\r\n\t\tsuper();\r\n\t\t\r\n\t\tthis.viewer = viewer;\r\n\r\n\t\tthis.selectedElement = null;\r\n\r\n\t\tthis.controlPoints = [];\r\n\r\n\t\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\t\tthis.node = new THREE.Object3D();\r\n\t\tthis.node.name = \"camera animation\";\r\n\t\tthis.viewer.scene.scene.add(this.node);\r\n\r\n\t\tthis.frustum = this.createFrustum();\r\n\t\tthis.node.add(this.frustum);\r\n\r\n\t\tthis.name = \"Camera Animation\";\r\n\t\tthis.duration = 5;\r\n\t\tthis.t = 0;\r\n\t\t// \"centripetal\", \"chordal\", \"catmullrom\"\r\n\t\tthis.curveType = \"centripetal\" \r\n\t\tthis.visible = true;\r\n\r\n\t\tthis.createUpdateHook();\r\n\t\tthis.createPath();\r\n\t}\r\n\r\n\tstatic defaultFromView(viewer){\r\n\t\tconst animation = new CameraAnimation(viewer);\r\n\r\n\t\tconst camera = viewer.scene.getActiveCamera();\r\n\t\tconst target = viewer.scene.view.getPivot();\r\n\r\n\t\tconst cpCenter = new THREE.Vector3(\r\n\t\t\t0.3 * camera.position.x + 0.7 * target.x,\r\n\t\t\t0.3 * camera.position.y + 0.7 * target.y,\r\n\t\t\t0.3 * camera.position.z + 0.7 * target.z,\r\n\t\t);\r\n\r\n\t\tconst targetCenter = new THREE.Vector3(\r\n\t\t\t0.05 * camera.position.x + 0.95 * target.x,\r\n\t\t\t0.05 * camera.position.y + 0.95 * target.y,\r\n\t\t\t0.05 * camera.position.z + 0.95 * target.z,\r\n\t\t);\r\n\r\n\t\tconst r = camera.position.distanceTo(target) * 0.3;\r\n\r\n\t\t//const dir = target.clone().sub(camera.position).normalize();\r\n\t\tconst angle = Utils.computeAzimuth(camera.position, target);\r\n\r\n\t\tconst n = 5;\r\n\t\tfor(let i = 0; i < n; i++){\r\n\t\t\tlet u = 1.5 * Math.PI * (i / n) + angle;\r\n\r\n\t\t\tconst dx = r * Math.cos(u);\r\n\t\t\tconst dy = r * Math.sin(u);\r\n\r\n\t\t\tconst cpPos = [\r\n\t\t\t\tcpCenter.x + dx,\r\n\t\t\t\tcpCenter.y + dy,\r\n\t\t\t\tcpCenter.z,\r\n\t\t\t];\r\n\r\n\t\t\tconst targetPos = [\r\n\t\t\t\ttargetCenter.x + dx * 0.1,\r\n\t\t\t\ttargetCenter.y + dy * 0.1,\r\n\t\t\t\ttargetCenter.z,\r\n\t\t\t];\r\n\r\n\t\t\tconst cp = animation.createControlPoint();\r\n\t\t\tcp.position.set(...cpPos);\r\n\t\t\tcp.target.set(...targetPos);\r\n\t\t}\r\n\r\n\t\treturn animation;\r\n\t}\r\n\r\n\tcreateUpdateHook(){\r\n\t\tconst viewer = this.viewer;\r\n\r\n\t\tviewer.addEventListener(\"update\", () => {\r\n\r\n\t\t\tconst camera = viewer.scene.getActiveCamera();\r\n\t\t\tconst {width, height} = viewer.renderer.getSize(new THREE.Vector2());\r\n\r\n\t\t\tthis.node.visible = this.visible;\r\n\r\n\t\t\tfor(const cp of this.controlPoints){\r\n\t\t\t\t\r\n\t\t\t\t{ // position\r\n\t\t\t\t\tconst projected = cp.position.clone().project(camera);\r\n\r\n\t\t\t\t\tconst visible = this.visible && (projected.z < 1 && projected.z > -1);\r\n\r\n\t\t\t\t\tif(visible){\r\n\t\t\t\t\t\tconst x = width * (projected.x * 0.5 + 0.5);\r\n\t\t\t\t\t\tconst y = height - height * (projected.y * 0.5 + 0.5);\r\n\r\n\t\t\t\t\t\tcp.positionHandle.svg.style.left = x - cp.positionHandle.svg.clientWidth / 2;\r\n\t\t\t\t\t\tcp.positionHandle.svg.style.top = y - cp.positionHandle.svg.clientHeight / 2;\r\n\t\t\t\t\t\tcp.positionHandle.svg.style.display = \"\";\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tcp.positionHandle.svg.style.display = \"none\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t{ // target\r\n\t\t\t\t\tconst projected = cp.target.clone().project(camera);\r\n\r\n\t\t\t\t\tconst visible = this.visible && (projected.z < 1 && projected.z > -1);\r\n\r\n\t\t\t\t\tif(visible){\r\n\t\t\t\t\t\tconst x = width * (projected.x * 0.5 + 0.5);\r\n\t\t\t\t\t\tconst y = height - height * (projected.y * 0.5 + 0.5);\r\n\r\n\t\t\t\t\t\tcp.targetHandle.svg.style.left = x - cp.targetHandle.svg.clientWidth / 2;\r\n\t\t\t\t\t\tcp.targetHandle.svg.style.top = y - cp.targetHandle.svg.clientHeight / 2;\r\n\t\t\t\t\t\tcp.targetHandle.svg.style.display = \"\";\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tcp.targetHandle.svg.style.display = \"none\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.line.material.resolution.set(width, height);\r\n\r\n\t\t\tthis.updatePath();\r\n\r\n\t\t\t{ // frustum\r\n\t\t\t\tconst frame = this.at(this.t);\r\n\t\t\t\tconst frustum = this.frustum;\r\n\r\n\t\t\t\tfrustum.position.copy(frame.position);\r\n\t\t\t\tfrustum.lookAt(...frame.target.toArray());\r\n\t\t\t\tfrustum.scale.set(20, 20, 20);\r\n\r\n\t\t\t\tfrustum.material.resolution.set(width, height);\r\n\t\t\t}\r\n\r\n\t\t});\r\n\t}\r\n\r\n\tcreateControlPoint(index){\r\n\r\n\t\tif(index === undefined){\r\n\t\t\tindex = this.controlPoints.length;\r\n\t\t}\r\n\r\n\t\tconst cp = new ControlPoint();\r\n\r\n\r\n\t\tif(this.controlPoints.length >= 2 && index === 0){\r\n\t\t\tconst cp1 = this.controlPoints[0];\r\n\t\t\tconst cp2 = this.controlPoints[1];\r\n\r\n\t\t\tconst dir = cp1.position.clone().sub(cp2.position).multiplyScalar(0.5);\r\n\t\t\tcp.position.copy(cp1.position).add(dir);\r\n\r\n\t\t\tconst tDir = cp1.target.clone().sub(cp2.target).multiplyScalar(0.5);\r\n\t\t\tcp.target.copy(cp1.target).add(tDir);\r\n\t\t}else if(this.controlPoints.length >= 2 && index === this.controlPoints.length){\r\n\t\t\tconst cp1 = this.controlPoints[this.controlPoints.length - 2];\r\n\t\t\tconst cp2 = this.controlPoints[this.controlPoints.length - 1];\r\n\r\n\t\t\tconst dir = cp2.position.clone().sub(cp1.position).multiplyScalar(0.5);\r\n\t\t\tcp.position.copy(cp1.position).add(dir);\r\n\r\n\t\t\tconst tDir = cp2.target.clone().sub(cp1.target).multiplyScalar(0.5);\r\n\t\t\tcp.target.copy(cp2.target).add(tDir);\r\n\t\t}else if(this.controlPoints.length >= 2){\r\n\t\t\tconst cp1 = this.controlPoints[index - 1];\r\n\t\t\tconst cp2 = this.controlPoints[index];\r\n\r\n\t\t\tcp.position.copy(cp1.position.clone().add(cp2.position).multiplyScalar(0.5));\r\n\t\t\tcp.target.copy(cp1.target.clone().add(cp2.target).multiplyScalar(0.5));\r\n\t\t}\r\n\r\n\t\t// cp.position.copy(viewer.scene.view.position);\r\n\t\t// cp.target.copy(viewer.scene.view.getPivot());\r\n\r\n\t\tcp.positionHandle = this.createHandle(cp.position);\r\n\t\tcp.targetHandle = this.createHandle(cp.target);\r\n\r\n\t\tthis.controlPoints.splice(index, 0, cp);\r\n\r\n\t\tthis.dispatchEvent({\r\n\t\t\ttype: \"controlpoint_added\",\r\n\t\t\tcontrolpoint: cp,\r\n\t\t});\r\n\r\n\t\treturn cp;\r\n\t}\r\n\r\n\tremoveControlPoint(cp){\r\n\t\tthis.controlPoints = this.controlPoints.filter(_cp => _cp !== cp);\r\n\r\n\t\tthis.dispatchEvent({\r\n\t\t\ttype: \"controlpoint_removed\",\r\n\t\t\tcontrolpoint: cp,\r\n\t\t});\r\n\r\n\t\tcp.positionHandle.svg.remove();\r\n\t\tcp.targetHandle.svg.remove();\r\n\r\n\t\t// TODO destroy cp\r\n\t}\r\n\r\n\tcreatePath(){\r\n\r\n\t\t{ // position\r\n\t\t\tconst geometry = new THREE.LineGeometry();\r\n\r\n\t\t\tlet material = new THREE.LineMaterial({ \r\n\t\t\t\tcolor: 0x00ff00, \r\n\t\t\t\tdashSize: 5, \r\n\t\t\t\tgapSize: 2,\r\n\t\t\t\tlinewidth: 2, \r\n\t\t\t\tresolution: new THREE.Vector2(1000, 1000),\r\n\t\t\t});\r\n\r\n\t\t\tconst line = new THREE.Line2(geometry, material);\r\n\r\n\t\t\tthis.line = line;\r\n\t\t\tthis.node.add(line);\r\n\t\t}\r\n\r\n\t\t{ // target\r\n\t\t\tconst geometry = new THREE.LineGeometry();\r\n\r\n\t\t\tlet material = new THREE.LineMaterial({ \r\n\t\t\t\tcolor: 0x0000ff, \r\n\t\t\t\tdashSize: 5, \r\n\t\t\t\tgapSize: 2,\r\n\t\t\t\tlinewidth: 2, \r\n\t\t\t\tresolution: new THREE.Vector2(1000, 1000),\r\n\t\t\t});\r\n\r\n\t\t\tconst line = new THREE.Line2(geometry, material);\r\n\r\n\t\t\tthis.targetLine = line;\r\n\t\t\tthis.node.add(line);\r\n\t\t}\r\n\t}\r\n\r\n\tcreateFrustum(){\r\n\r\n\t\tconst f = 0.3;\r\n\r\n\t\tconst positions = [\r\n\t\t\t 0, 0, 0,\r\n\t\t\t-f, -f, +1,\r\n\r\n\t\t\t 0, 0, 0,\r\n\t\t\t f, -f, +1,\r\n\r\n\t\t\t 0, 0, 0,\r\n\t\t\t f, f, +1,\r\n\r\n\t\t\t 0, 0, 0,\r\n\t\t\t-f, f, +1,\r\n\r\n\t\t\t-f, -f, +1,\r\n\t\t\t f, -f, +1,\r\n\r\n\t\t\t f, -f, +1,\r\n\t\t\t f, f, +1,\r\n\r\n\t\t\t f, f, +1,\r\n\t\t\t-f, f, +1,\r\n\r\n\t\t\t-f, f, +1,\r\n\t\t\t-f, -f, +1,\r\n\t\t];\r\n\r\n\t\tconst geometry = new THREE.LineGeometry();\r\n\r\n\t\tgeometry.setPositions(positions);\r\n\t\tgeometry.verticesNeedUpdate = true;\r\n\t\tgeometry.computeBoundingSphere();\r\n\r\n\t\tlet material = new THREE.LineMaterial({ \r\n\t\t\tcolor: 0xff0000, \r\n\t\t\tlinewidth: 2, \r\n\t\t\tresolution: new THREE.Vector2(1000, 1000),\r\n\t\t});\r\n\r\n\t\tconst line = new THREE.Line2(geometry, material);\r\n\t\tline.computeLineDistances();\r\n\t\t\r\n\t\treturn line;\r\n\t}\r\n\r\n\tupdatePath(){\r\n\r\n\t\t{ // positions\r\n\t\t\tconst positions = this.controlPoints.map(cp => cp.position);\r\n\t\t\tconst first = positions[0];\r\n\r\n\t\t\tconst curve = new THREE.CatmullRomCurve3(positions);\r\n\t\t\tcurve.curveType = this.curveType;\r\n\r\n\t\t\tconst n = 100;\r\n\r\n\t\t\tconst curvePositions = [];\r\n\t\t\tfor(let k = 0; k <= n; k++){\r\n\t\t\t\tconst t = k / n;\r\n\r\n\t\t\t\tconst position = curve.getPoint(t).sub(first);\r\n\r\n\t\t\t\tcurvePositions.push(position.x, position.y, position.z);\r\n\t\t\t}\r\n\r\n\t\t\tthis.line.geometry.setPositions(curvePositions);\r\n\t\t\tthis.line.geometry.verticesNeedUpdate = true;\r\n\t\t\tthis.line.geometry.computeBoundingSphere();\r\n\t\t\tthis.line.position.copy(first);\r\n\t\t\tthis.line.computeLineDistances();\r\n\r\n\t\t\tthis.cameraCurve = curve;\r\n\t\t}\r\n\r\n\t\t{ // targets\r\n\t\t\tconst positions = this.controlPoints.map(cp => cp.target);\r\n\t\t\tconst first = positions[0];\r\n\r\n\t\t\tconst curve = new THREE.CatmullRomCurve3(positions);\r\n\t\t\tcurve.curveType = this.curveType;\r\n\r\n\t\t\tconst n = 100;\r\n\r\n\t\t\tconst curvePositions = [];\r\n\t\t\tfor(let k = 0; k <= n; k++){\r\n\t\t\t\tconst t = k / n;\r\n\r\n\t\t\t\tconst position = curve.getPoint(t).sub(first);\r\n\r\n\t\t\t\tcurvePositions.push(position.x, position.y, position.z);\r\n\t\t\t}\r\n\r\n\t\t\tthis.targetLine.geometry.setPositions(curvePositions);\r\n\t\t\tthis.targetLine.geometry.verticesNeedUpdate = true;\r\n\t\t\tthis.targetLine.geometry.computeBoundingSphere();\r\n\t\t\tthis.targetLine.position.copy(first);\r\n\t\t\tthis.targetLine.computeLineDistances();\r\n\r\n\t\t\tthis.targetCurve = curve;\r\n\t\t}\r\n\t}\r\n\r\n\tat(t){\r\n\t\t\r\n\t\tif(t > 1){\r\n\t\t\tt = 1;\r\n\t\t}else if(t < 0){\r\n\t\t\tt = 0;\r\n\t\t}\r\n\r\n\t\tconst camPos = this.cameraCurve.getPointAt(t);\r\n\t\tconst target = this.targetCurve.getPointAt(t);\r\n\r\n\t\tconst frame = {\r\n\t\t\tposition: camPos,\r\n\t\t\ttarget: target,\r\n\t\t};\r\n\r\n\t\treturn frame;\r\n\t}\r\n\r\n\tset(t){\r\n\t\tthis.t = t;\r\n\t}\r\n\r\n\tcreateHandle(vector){\r\n\t\t\r\n\t\tconst svgns = \"http://www.w3.org/2000/svg\";\r\n\t\tconst svg = document.createElementNS(svgns, \"svg\");\r\n\r\n\t\tsvg.setAttribute(\"width\", \"2em\");\r\n\t\tsvg.setAttribute(\"height\", \"2em\");\r\n\t\tsvg.setAttribute(\"position\", \"absolute\");\r\n\r\n\t\tsvg.style.left = \"50px\";\r\n\t\tsvg.style.top = \"50px\";\r\n\t\tsvg.style.position = \"absolute\";\r\n\t\tsvg.style.zIndex = \"10000\";\r\n\r\n\t\tconst circle = document.createElementNS(svgns, 'circle');\r\n\t\tcircle.setAttributeNS(null, 'cx', \"1em\");\r\n\t\tcircle.setAttributeNS(null, 'cy', \"1em\");\r\n\t\tcircle.setAttributeNS(null, 'r', \"0.5em\");\r\n\t\tcircle.setAttributeNS(null, 'style', 'fill: red; stroke: black; stroke-width: 0.2em;' );\r\n\t\tsvg.appendChild(circle);\r\n\r\n\r\n\t\tconst element = this.viewer.renderer.domElement.parentElement;\r\n\t\telement.appendChild(svg);\r\n\r\n\r\n\t\tconst startDrag = (evt) => {\r\n\t\t\tthis.selectedElement = svg;\r\n\r\n\t\t\tdocument.addEventListener(\"mousemove\", drag);\r\n\t\t};\r\n\r\n\t\tconst endDrag = (evt) => {\r\n\t\t\tthis.selectedElement = null;\r\n\r\n\t\t\tdocument.removeEventListener(\"mousemove\", drag);\r\n\t\t};\r\n\r\n\t\tconst drag = (evt) => {\r\n\t\t\tif (this.selectedElement) {\r\n\t\t\t\tevt.preventDefault();\r\n\r\n\t\t\t\tconst rect = viewer.renderer.domElement.getBoundingClientRect();\r\n\r\n\t\t\t\tconst x = evt.clientX - rect.x;\r\n\t\t\t\tconst y = evt.clientY - rect.y;\r\n\r\n\t\t\t\tconst {width, height} = this.viewer.renderer.getSize(new THREE.Vector2());\r\n\t\t\t\tconst camera = this.viewer.scene.getActiveCamera();\r\n\t\t\t\t//const cp = this.controlPoints.find(cp => cp.handle.svg === svg);\r\n\t\t\t\tconst projected = vector.clone().project(camera);\r\n\r\n\t\t\t\tprojected.x = ((x / width) - 0.5) / 0.5;\r\n\t\t\t\tprojected.y = (-(y - height) / height - 0.5) / 0.5;\r\n\r\n\t\t\t\tconst unprojected = projected.clone().unproject(camera);\r\n\t\t\t\tvector.set(unprojected.x, unprojected.y, unprojected.z);\r\n\r\n\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tsvg.addEventListener('mousedown', startDrag);\r\n\t\tsvg.addEventListener('mouseup', endDrag);\r\n\r\n\t\tconst handle = {\r\n\t\t\tsvg: svg,\r\n\t\t};\r\n\r\n\t\treturn handle;\r\n\t}\r\n\r\n\tsetVisible(visible){\r\n\t\tthis.node.visible = visible;\r\n\r\n\t\tconst display = visible ? \"\" : \"none\";\r\n\r\n\t\tfor(const cp of this.controlPoints){\r\n\t\t\tcp.positionHandle.svg.style.display = display;\r\n\t\t\tcp.targetHandle.svg.style.display = display;\r\n\t\t}\r\n\r\n\t\tthis.visible = visible;\r\n\t}\r\n\r\n\tsetDuration(duration){\r\n\t\tthis.duration = duration;\r\n\t}\r\n\r\n\tgetDuration(duration){\r\n\t\treturn this.duration;\r\n\t}\r\n\r\n\tplay(){\r\n\r\n\t\tconst tStart = performance.now();\r\n\t\tconst duration = this.duration;\r\n\r\n\t\tconst originalyVisible = this.visible;\r\n\t\tthis.setVisible(false);\r\n\r\n\t\tconst onUpdate = (delta) => {\r\n\r\n\t\t\tlet tNow = performance.now();\r\n\t\t\tlet elapsed = (tNow - tStart) / 1000;\r\n\t\t\tlet t = elapsed / duration;\r\n\r\n\t\t\tthis.set(t);\r\n\r\n\t\t\tconst frame = this.at(t);\r\n\r\n\t\t\tviewer.scene.view.position.copy(frame.position);\r\n\t\t\tviewer.scene.view.lookAt(frame.target);\r\n\r\n\r\n\t\t\tif(t > 1){\r\n\t\t\t\tthis.setVisible(originalyVisible);\r\n\r\n\t\t\t\tthis.viewer.removeEventListener(\"update\", onUpdate);\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t\tthis.viewer.addEventListener(\"update\", onUpdate);\r\n\r\n\t}\r\n\r\n}\r\n\r\n\r\n","\r\n\r\nimport {Annotation} from \"../Annotation.js\";\r\nimport {Measure} from \"../utils/Measure.js\";\r\nimport {CameraAnimation} from \"../modules/CameraAnimation/CameraAnimation.js\";\r\nimport {Utils} from \"../utils.js\";\r\nimport {PointSizeType} from \"../defines.js\";\r\n\r\nfunction loadPointCloud(viewer, data){\r\n\r\n\tlet loadMaterial = (target) => {\r\n\r\n\t\tif(data.material){\r\n\r\n\t\t\tif(data.material.activeAttributeName != null){\r\n\t\t\t\ttarget.activeAttributeName = data.material.activeAttributeName;\r\n\t\t\t}\r\n\r\n\t\t\tif(data.material.ranges != null){\r\n\t\t\t\tfor(let range of data.material.ranges){\r\n\r\n\t\t\t\t\tif(range.name === \"elevationRange\"){\r\n\t\t\t\t\t\ttarget.elevationRange = range.value;\r\n\t\t\t\t\t}else if(range.name === \"intensityRange\"){\r\n\t\t\t\t\t\ttarget.intensityRange = range.value;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\ttarget.setRange(range.name, range.value);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(data.material.size != null){\r\n\t\t\t\ttarget.size = data.material.size;\r\n\t\t\t}\r\n\r\n\t\t\tif(data.material.minSize != null){\r\n\t\t\t\ttarget.minSize = data.material.minSize;\r\n\t\t\t}\r\n\r\n\t\t\tif(data.material.pointSizeType != null){\r\n\t\t\t\ttarget.pointSizeType = PointSizeType[data.material.pointSizeType];\r\n\t\t\t}\r\n\r\n\t\t\tif(data.material.matcap != null){\r\n\t\t\t\ttarget.matcap = data.material.matcap;\r\n\t\t\t}\r\n\r\n\t\t}else if(data.activeAttributeName != null){\r\n\t\t\ttarget.activeAttributeName = data.activeAttributeName;\r\n\t\t}else{\r\n\t\t\t// no material data\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tconst promise = new Promise((resolve) => {\r\n\r\n\t\tconst names = viewer.scene.pointclouds.map(p => p.name);\r\n\t\tconst alreadyExists = names.includes(data.name);\r\n\r\n\t\tif(alreadyExists){\r\n\t\t\tresolve();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tPotree.loadPointCloud(data.url, data.name, (e) => {\r\n\t\t\tconst {pointcloud} = e;\r\n\r\n\t\t\tpointcloud.position.set(...data.position);\r\n\t\t\tpointcloud.rotation.set(...data.rotation);\r\n\t\t\tpointcloud.scale.set(...data.scale);\r\n\r\n\t\t\tloadMaterial(pointcloud.material);\r\n\r\n\t\t\tviewer.scene.addPointCloud(pointcloud);\r\n\r\n\t\t\tresolve(pointcloud);\r\n\t\t});\r\n\t});\r\n\r\n\treturn promise;\r\n}\r\n\r\nfunction loadMeasurement(viewer, data){\r\n\r\n\tconst duplicate = viewer.scene.measurements.find(measure => measure.uuid === data.uuid);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst measure = new Measure();\r\n\r\n\tmeasure.uuid = data.uuid;\r\n\tmeasure.name = data.name;\r\n\tmeasure.showDistances = data.showDistances;\r\n\tmeasure.showCoordinates = data.showCoordinates;\r\n\tmeasure.showArea = data.showArea;\r\n\tmeasure.closed = data.closed;\r\n\tmeasure.showAngles = data.showAngles;\r\n\tmeasure.showHeight = data.showHeight;\r\n\tmeasure.showCircle = data.showCircle;\r\n\tmeasure.showAzimuth = data.showAzimuth;\r\n\tmeasure.showEdges = data.showEdges;\r\n\t// color\r\n\r\n\tfor(const point of data.points){\r\n\t\tconst pos = new THREE.Vector3(...point);\r\n\t\tmeasure.addMarker(pos);\r\n\t}\r\n\r\n\tviewer.scene.addMeasurement(measure);\r\n\r\n}\r\n\r\nfunction loadVolume(viewer, data){\r\n\r\n\tconst duplicate = viewer.scene.volumes.find(volume => volume.uuid === data.uuid);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet volume = new Potree[data.type];\r\n\r\n\tvolume.uuid = data.uuid;\r\n\tvolume.name = data.name;\r\n\tvolume.position.set(...data.position);\r\n\tvolume.rotation.set(...data.rotation);\r\n\tvolume.scale.set(...data.scale);\r\n\tvolume.visible = data.visible;\r\n\tvolume.clip = data.clip;\r\n\r\n\tviewer.scene.addVolume(volume);\r\n}\r\n\r\nfunction loadCameraAnimation(viewer, data){\r\n\r\n\tconst duplicate = viewer.scene.cameraAnimations.find(a => a.uuid === data.uuid);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst animation = new CameraAnimation(viewer);\r\n\r\n\tanimation.uuid = data.uuid;\r\n\tanimation.name = data.name;\r\n\tanimation.duration = data.duration;\r\n\tanimation.t = data.t;\r\n\tanimation.curveType = data.curveType;\r\n\tanimation.visible = data.visible;\r\n\tanimation.controlPoints = [];\r\n\r\n\tfor(const cpdata of data.controlPoints){\r\n\t\tconst cp = animation.createControlPoint();\r\n\r\n\t\tcp.position.set(...cpdata.position);\r\n\t\tcp.target.set(...cpdata.target);\r\n\t}\r\n\r\n\tviewer.scene.addCameraAnimation(animation);\r\n}\r\n\r\nfunction loadOrientedImages(viewer, images){\r\n\r\n\tconst {cameraParamsPath, imageParamsPath} = images;\r\n\r\n\tconst duplicate = viewer.scene.orientedImages.find(i => i.imageParamsPath === imageParamsPath);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tPotree.OrientedImageLoader.load(cameraParamsPath, imageParamsPath, viewer).then( images => {\r\n\t\tviewer.scene.addOrientedImages(images);\r\n\t});\r\n\r\n}\r\n\r\nfunction loadGeopackage(viewer, geopackage){\r\n\r\n\tconst path = geopackage.path;\r\n\r\n\tconst duplicate = viewer.scene.geopackages.find(i => i.path === path);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst projection = viewer.getProjection();\r\n\r\n\tproj4.defs(\"WGS84\", \"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs\");\r\n\tproj4.defs(\"pointcloud\", projection);\r\n\tconst transform = proj4(\"WGS84\", \"pointcloud\");\r\n\tconst params = {\r\n\t\ttransform: transform,\r\n\t};\r\n\r\n\tPotree.GeoPackageLoader.loadUrl(path, params).then(data => {\r\n\t\tviewer.scene.addGeopackage(data);\r\n\t});\r\n\t\r\n\r\n}\r\n\r\nfunction loadSettings(viewer, data){\r\n\tif(!data){\r\n\t\treturn;\r\n\t}\r\n\r\n\tviewer.setPointBudget(data.pointBudget);\r\n\tviewer.setFOV(data.fov);\r\n\tviewer.setEDLEnabled(data.edlEnabled);\r\n\tviewer.setEDLRadius(data.edlRadius);\r\n\tviewer.setEDLStrength(data.edlStrength);\r\n\tviewer.setBackground(data.background);\r\n\tviewer.setMinNodeSize(data.minNodeSize);\r\n\tviewer.setShowBoundingBox(data.showBoundingBoxes);\r\n}\r\n\r\nfunction loadView(viewer, view){\r\n\tviewer.scene.view.position.set(...view.position);\r\n\tviewer.scene.view.lookAt(...view.target);\r\n}\r\n\r\nfunction loadAnnotationItem(item){\r\n\r\n\tconst annotation = new Annotation({\r\n\t\tposition: item.position,\r\n\t\ttitle: item.title,\r\n\t\tcameraPosition: item.cameraPosition,\r\n\t\tcameraTarget: item.cameraTarget,\r\n\t});\r\n\r\n\r\n\tannotation.description = item.description;\r\n\tannotation.uuid = item.uuid;\r\n\r\n\tif(item.offset){\r\n\t\tannotation.offset.set(...item.offset);\r\n\t}\r\n\r\n\treturn annotation;\r\n}\r\n\r\nfunction loadAnnotations(viewer, data){\r\n\r\n\tif(!data){\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst findDuplicate = (item) => {\r\n\r\n\t\tlet duplicate = null;\r\n\r\n\t\tviewer.scene.annotations.traverse( a => {\r\n\t\t\tif(a.uuid === item.uuid){\r\n\t\t\t\tduplicate = a;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn duplicate;\r\n\t};\r\n\r\n\tconst traverse = (item, parent) => {\r\n\r\n\t\tconst duplicate = findDuplicate(item);\r\n\t\tif(duplicate){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst annotation = loadAnnotationItem(item);\r\n\r\n\t\tfor(const childItem of item.children){\r\n\t\t\ttraverse(childItem, annotation);\r\n\t\t}\r\n\r\n\t\tparent.add(annotation);\r\n\r\n\t};\r\n\r\n\tfor(const item of data){\r\n\t\ttraverse(item, viewer.scene.annotations);\r\n\t}\r\n\r\n}\r\n\r\nfunction loadProfile(viewer, data){\r\n\t\r\n\tconst {name, points} = data;\r\n\r\n\tconst duplicate = viewer.scene.profiles.find(profile => profile.uuid === data.uuid);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet profile = new Potree.Profile();\r\n\tprofile.name = name;\r\n\tprofile.uuid = data.uuid;\r\n\r\n\tprofile.setWidth(data.width);\r\n\r\n\tfor(const point of points){\r\n\t\tprofile.addMarker(new THREE.Vector3(...point));\r\n\t}\r\n\t\r\n\tviewer.scene.addProfile(profile);\r\n}\r\n\r\nfunction loadClassification(viewer, data){\r\n\tif(!data){\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst classifications = data;\r\n\r\n\tviewer.setClassifications(classifications);\r\n}\r\n\r\nexport async function loadProject(viewer, data){\r\n\r\n\tif(data.type !== \"Potree\"){\r\n\t\tconsole.error(\"not a valid Potree project\");\r\n\t\treturn;\r\n\t}\r\n\r\n\tloadSettings(viewer, data.settings);\r\n\r\n\tloadView(viewer, data.view);\r\n\r\n\tconst pointcloudPromises = [];\r\n\tfor(const pointcloud of data.pointclouds){\r\n\t\tconst promise = loadPointCloud(viewer, pointcloud);\r\n\t\tpointcloudPromises.push(promise);\r\n\t}\r\n\r\n\tfor(const measure of data.measurements){\r\n\t\tloadMeasurement(viewer, measure);\r\n\t}\r\n\r\n\tfor(const volume of data.volumes){\r\n\t\tloadVolume(viewer, volume);\r\n\t}\r\n\r\n\tfor(const animation of data.cameraAnimations){\r\n\t\tloadCameraAnimation(viewer, animation);\r\n\t}\r\n\r\n\tfor(const profile of data.profiles){\r\n\t\tloadProfile(viewer, profile);\r\n\t}\r\n\r\n\tif(data.orientedImages){\r\n\t\tfor(const images of data.orientedImages){\r\n\t\t\tloadOrientedImages(viewer, images);\r\n\t\t}\r\n\t}\r\n\r\n\tloadAnnotations(viewer, data.annotations);\r\n\r\n\tloadClassification(viewer, data.classification);\r\n\r\n\t// need to load at least one point cloud that defines the scene projection,\r\n\t// before we can load stuff in other projections such as geopackages\r\n\t//await Promise.any(pointcloudPromises); // (not yet supported)\r\n\tUtils.waitAny(pointcloudPromises).then( () => {\r\n\t\tif(data.geopackages){\r\n\t\t\tfor(const geopackage of data.geopackages){\r\n\t\t\t\tloadGeopackage(viewer, geopackage);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\tawait Promise.all(pointcloudPromises);\r\n}","\nimport {Shaders} from \"../../build/shaders/shaders.js\";\n\n//\n// Algorithm by Christian Boucheny\n// shader code taken and adapted from CloudCompare\n//\n// see\n// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL\n// http://www.kitware.com/source/home/post/9\n// https://tel.archives-ouvertes.fr/tel-00438464/document p. 115+ (french)\n\nexport class EyeDomeLightingMaterial extends THREE.RawShaderMaterial{\n\n\tconstructor(parameters = {}){\n\t\tsuper();\n\n\t\tlet uniforms = {\n\t\t\tscreenWidth: { type: 'f', \tvalue: 0 },\n\t\t\tscreenHeight: { type: 'f', \tvalue: 0 },\n\t\t\tedlStrength: { type: 'f', \tvalue: 1.0 },\n\t\t\tuNear: { type: 'f', \tvalue: 1.0 },\n\t\t\tuFar: { type: 'f', \tvalue: 1.0 },\n\t\t\tradius: { type: 'f', \tvalue: 1.0 },\n\t\t\tneighbours: { type: '2fv', \tvalue: [] },\n\t\t\tdepthMap: { type: 't', \tvalue: null },\n\t\t\tuEDLColor: { type: 't', \tvalue: null },\n\t\t\tuEDLDepth: { type: 't', \tvalue: null },\n\t\t\topacity: { type: 'f',\tvalue: 1.0 },\n\t\t\tuProj: { type: \"Matrix4fv\", value: [] },\n\t\t};\n\n\t\tthis.setValues({\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: this.getDefines() + Shaders['edl.vs'],\n\t\t\tfragmentShader: this.getDefines() + Shaders['edl.fs'],\n\t\t\tlights: false\n\t\t});\n\n\t\tthis.neighbourCount = 8;\n\t}\n\n\tgetDefines() {\n\t\tlet defines = '';\n\n\t\tdefines += '#define NEIGHBOUR_COUNT ' + this.neighbourCount + '\\n';\n\n\t\treturn defines;\n\t}\n\n\tupdateShaderSource() {\n\n\t\tlet vs = this.getDefines() + Shaders['edl.vs'];\n\t\tlet fs = this.getDefines() + Shaders['edl.fs'];\n\n\t\tthis.setValues({\n\t\t\tvertexShader: vs,\n\t\t\tfragmentShader: fs\n\t\t});\n\n\t\tthis.uniforms.neighbours.value = this.neighbours;\n\n\t\tthis.needsUpdate = true;\n\t}\n\n\tget neighbourCount(){\n\t\treturn this._neighbourCount;\n\t}\n\n\tset neighbourCount(value){\n\t\tif (this._neighbourCount !== value) {\n\t\t\tthis._neighbourCount = value;\n\t\t\tthis.neighbours = new Float32Array(this._neighbourCount * 2);\n\t\t\tfor (let c = 0; c < this._neighbourCount; c++) {\n\t\t\t\tthis.neighbours[2 * c + 0] = Math.cos(2 * c * Math.PI / this._neighbourCount);\n\t\t\t\tthis.neighbours[2 * c + 1] = Math.sin(2 * c * Math.PI / this._neighbourCount);\n\t\t\t}\n\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\n\t\n}\n\n","\n\nimport {Shaders} from \"../../build/shaders/shaders.js\";\n\n\nexport class NormalizationEDLMaterial extends THREE.RawShaderMaterial{\n\n\tconstructor(parameters = {}){\n\t\tsuper();\n\n\t\tlet uniforms = {\n\t\t\tscreenWidth: { type: 'f', value: 0 },\n\t\t\tscreenHeight: { type: 'f', value: 0 },\n\t\t\tedlStrength: { type: 'f', value: 1.0 },\n\t\t\tradius: { type: 'f', value: 1.0 },\n\t\t\tneighbours: { type: '2fv', value: [] },\n\t\t\tuEDLMap: { type: 't', value: null },\n\t\t\tuDepthMap: { type: 't', value: null },\n\t\t\tuWeightMap: { type: 't', value: null },\n\t\t};\n\n\t\tthis.setValues({\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: this.getDefines() + Shaders['normalize.vs'],\n\t\t\tfragmentShader: this.getDefines() + Shaders['normalize_and_edl.fs'],\n\t\t});\n\n\t\tthis.neighbourCount = 8;\n\t}\n\n\tgetDefines() {\n\t\tlet defines = '';\n\n\t\tdefines += '#define NEIGHBOUR_COUNT ' + this.neighbourCount + '\\n';\n\n\t\treturn defines;\n\t}\n\n\tupdateShaderSource() {\n\n\t\tlet vs = this.getDefines() + Shaders['normalize.vs'];\n\t\tlet fs = this.getDefines() + Shaders['normalize_and_edl.fs'];\n\n\t\tthis.setValues({\n\t\t\tvertexShader: vs,\n\t\t\tfragmentShader: fs\n\t\t});\n\n\t\tthis.uniforms.neighbours.value = this.neighbours;\n\n\t\tthis.needsUpdate = true;\n\t}\n\n\tget neighbourCount(){\n\t\treturn this._neighbourCount;\n\t}\n\n\tset neighbourCount(value){\n\t\tif (this._neighbourCount !== value) {\n\t\t\tthis._neighbourCount = value;\n\t\t\tthis.neighbours = new Float32Array(this._neighbourCount * 2);\n\t\t\tfor (let c = 0; c < this._neighbourCount; c++) {\n\t\t\t\tthis.neighbours[2 * c + 0] = Math.cos(2 * c * Math.PI / this._neighbourCount);\n\t\t\t\tthis.neighbours[2 * c + 1] = Math.sin(2 * c * Math.PI / this._neighbourCount);\n\t\t\t}\n\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\t\n}\n\n","\nimport {Shaders} from \"../../build/shaders/shaders.js\";\n\nexport class NormalizationMaterial extends THREE.RawShaderMaterial{\n\n\tconstructor(parameters = {}){\n\t\tsuper();\n\n\t\tlet uniforms = {\n\t\t\tuDepthMap:\t\t{ type: 't', value: null },\n\t\t\tuWeightMap:\t\t{ type: 't', value: null },\n\t\t};\n\n\t\tthis.setValues({\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: this.getDefines() + Shaders['normalize.vs'],\n\t\t\tfragmentShader: this.getDefines() + Shaders['normalize.fs'],\n\t\t});\n\t}\n\n\tgetDefines() {\n\t\tlet defines = '';\n\n\t\treturn defines;\n\t}\n\n\tupdateShaderSource() {\n\n\t\tlet vs = this.getDefines() + Shaders['normalize.vs'];\n\t\tlet fs = this.getDefines() + Shaders['normalize.fs'];\n\n\t\tthis.setValues({\n\t\t\tvertexShader: vs,\n\t\t\tfragmentShader: fs\n\t\t});\n\n\t\tthis.needsUpdate = true;\n\t}\n\n}\n\n","\n\nimport {Version} from \"../Version.js\";\nimport {XHRFactory} from \"../XHRFactory.js\";\n\n/**\n * laslaz code taken and adapted from plas.io js-laslaz\n *\thttp://plas.io/\n * https://github.com/verma/plasio\n *\n * Thanks to Uday Verma and Howard Butler\n *\n */\n\nexport class LasLazLoader {\n\n\tconstructor (version, extension) {\n\t\tif (typeof (version) === 'string') {\n\t\t\tthis.version = new Version(version);\n\t\t} else {\n\t\t\tthis.version = version;\n\t\t}\n\n\t\tthis.extension = extension;\n\t}\n\n\tstatic progressCB () {\n\n\t}\n\n\tload (node) {\n\t\tif (node.loaded) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet url = node.getURL();\n\n\t\tif (this.version.equalOrHigher('1.4')) {\n\t\t\turl += `.${this.extension}`;\n\t\t}\n\n\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open('GET', url, true);\n\t\txhr.responseType = 'arraybuffer';\n\t\txhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t\txhr.onreadystatechange = () => {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tif (xhr.status === 200 || xhr.status === 0) {\n\t\t\t\t\tlet buffer = xhr.response;\n\t\t\t\t\tthis.parse(node, buffer);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('Failed to load file! HTTP status: ' + xhr.status + ', file: ' + url);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\txhr.send(null);\n\t}\n\n\tasync parse(node, buffer){\n\t\tlet lf = new LASFile(buffer);\n\t\tlet handler = new LasLazBatcher(node);\n\n\t\ttry{\n\t\t\t await lf.open();\n\t\t\t lf.isOpen = true;\n\t\t}catch(e){\n\t\t\tconsole.log(\"failed to open file. :(\");\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet header = await lf.getHeader();\n\n\t\tlet skip = 1;\n\t\tlet totalRead = 0;\n\t\tlet totalToRead = (skip <= 1 ? header.pointsCount : header.pointsCount / skip);\n\n\t\tlet hasMoreData = true;\n\n\t\twhile(hasMoreData){\n\t\t\tlet data = await lf.readData(1000 * 1000, 0, skip);\n\n\t\t\thandler.push(new LASDecoder(data.buffer,\n\t\t\t\theader.pointsFormatId,\n\t\t\t\theader.pointsStructSize,\n\t\t\t\tdata.count,\n\t\t\t\theader.scale,\n\t\t\t\theader.offset,\n\t\t\t\theader.mins, header.maxs));\n\n\t\t\ttotalRead += data.count;\n\t\t\tLasLazLoader.progressCB(totalRead / totalToRead);\n\n\t\t\thasMoreData = data.hasMoreData;\n\t\t}\n\n\t\theader.totalRead = totalRead;\n\t\theader.versionAsString = lf.versionAsString;\n\t\theader.isCompressed = lf.isCompressed;\n\n\t\tLasLazLoader.progressCB(1);\n\n\t\ttry{\n\t\t\tawait lf.close();\n\n\t\t\tlf.isOpen = false;\n\t\t}catch(e){\n\t\t\tconsole.error(\"failed to close las/laz file!!!\");\n\t\t\t\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\thandle (node, url) {\n\n\t}\n};\n\nexport class LasLazBatcher{\n\n\tconstructor (node) {\n\t\tthis.node = node;\n\t}\n\n\tpush (lasBuffer) {\n\t\tconst workerPath = Potree.scriptPath + '/workers/LASDecoderWorker.js';\n\t\tconst worker = Potree.workerPool.getWorker(workerPath);\n\t\tconst node = this.node;\n\t\tconst pointAttributes = node.pcoGeometry.pointAttributes;\n\n\t\tworker.onmessage = (e) => {\n\t\t\tlet geometry = new THREE.BufferGeometry();\n\t\t\tlet numPoints = lasBuffer.pointsCount;\n\n\t\t\tlet positions = new Float32Array(e.data.position);\n\t\t\tlet colors = new Uint8Array(e.data.color);\n\t\t\tlet intensities = new Float32Array(e.data.intensity);\n\t\t\tlet classifications = new Uint8Array(e.data.classification);\n\t\t\tlet returnNumbers = new Uint8Array(e.data.returnNumber);\n\t\t\tlet numberOfReturns = new Uint8Array(e.data.numberOfReturns);\n\t\t\tlet pointSourceIDs = new Uint16Array(e.data.pointSourceID);\n\t\t\tlet indices = new Uint8Array(e.data.indices);\n\n\t\t\tgeometry.addAttribute('position', new THREE.BufferAttribute(positions, 3));\n\t\t\tgeometry.addAttribute('color', new THREE.BufferAttribute(colors, 4, true));\n\t\t\tgeometry.addAttribute('intensity', new THREE.BufferAttribute(intensities, 1));\n\t\t\tgeometry.addAttribute('classification', new THREE.BufferAttribute(classifications, 1));\n\t\t\tgeometry.addAttribute('return number', new THREE.BufferAttribute(returnNumbers, 1));\n\t\t\tgeometry.addAttribute('number of returns', new THREE.BufferAttribute(numberOfReturns, 1));\n\t\t\tgeometry.addAttribute('source id', new THREE.BufferAttribute(pointSourceIDs, 1));\n\t\t\tgeometry.addAttribute('indices', new THREE.BufferAttribute(indices, 4));\n\t\t\tgeometry.attributes.indices.normalized = true;\n\n\t\t\tfor(const key in e.data.ranges){\n\t\t\t\tconst range = e.data.ranges[key];\n\n\t\t\t\tconst attribute = pointAttributes.attributes.find(a => a.name === key);\n\t\t\t\tattribute.range[0] = Math.min(attribute.range[0], range[0]);\n\t\t\t\tattribute.range[1] = Math.max(attribute.range[1], range[1]);\n\t\t\t}\n\n\t\t\tlet tightBoundingBox = new THREE.Box3(\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tgeometry.boundingBox = this.node.boundingBox;\n\t\t\tthis.node.tightBoundingBox = tightBoundingBox;\n\n\t\t\tthis.node.geometry = geometry;\n\t\t\tthis.node.numPoints = numPoints;\n\t\t\tthis.node.loaded = true;\n\t\t\tthis.node.loading = false;\n\t\t\tPotree.numNodesLoading--;\n\t\t\tthis.node.mean = new THREE.Vector3(...e.data.mean);\n\n\t\t\tPotree.workerPool.returnWorker(workerPath, worker);\n\t\t};\n\n\t\tlet message = {\n\t\t\tbuffer: lasBuffer.arrayb,\n\t\t\tnumPoints: lasBuffer.pointsCount,\n\t\t\tpointSize: lasBuffer.pointSize,\n\t\t\tpointFormatID: 2,\n\t\t\tscale: lasBuffer.scale,\n\t\t\toffset: lasBuffer.offset,\n\t\t\tmins: lasBuffer.mins,\n\t\t\tmaxs: lasBuffer.maxs\n\t\t};\n\t\tworker.postMessage(message, [message.buffer]);\n\t};\n}\n","\n\nimport {Version} from \"../Version.js\";\nimport {XHRFactory} from \"../XHRFactory.js\";\n\n\nexport class BinaryLoader{\n\n\tconstructor(version, boundingBox, scale){\n\t\tif (typeof (version) === 'string') {\n\t\t\tthis.version = new Version(version);\n\t\t} else {\n\t\t\tthis.version = version;\n\t\t}\n\n\t\tthis.boundingBox = boundingBox;\n\t\tthis.scale = scale;\n\t}\n\n\tload(node){\n\t\tif (node.loaded) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet url = node.getURL();\n\n\t\tif (this.version.equalOrHigher('1.4')) {\n\t\t\turl += '.bin';\n\t\t}\n\n\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open('GET', url, true);\n\t\txhr.responseType = 'arraybuffer';\n\t\txhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t\txhr.onreadystatechange = () => {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tif((xhr.status === 200 || xhr.status === 0) && xhr.response !== null){\n\t\t\t\t\tlet buffer = xhr.response;\n\t\t\t\t\tthis.parse(node, buffer);\n\t\t\t\t} else {\n\t\t\t\t\t//console.error(`Failed to load file! HTTP status: ${xhr.status}, file: ${url}`);\n\t\t\t\t\tthrow new Error(`Failed to load file! HTTP status: ${xhr.status}, file: ${url}`);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t\n\t\ttry {\n\t\t\txhr.send(null);\n\t\t} catch (e) {\n\t\t\tconsole.log('fehler beim laden der punktwolke: ' + e);\n\t\t}\n\t};\n\n\tparse(node, buffer){\n\t\tlet pointAttributes = node.pcoGeometry.pointAttributes;\n\t\tlet numPoints = buffer.byteLength / node.pcoGeometry.pointAttributes.byteSize;\n\n\t\tif (this.version.upTo('1.5')) {\n\t\t\tnode.numPoints = numPoints;\n\t\t}\n\n\t\tlet workerPath = Potree.scriptPath + '/workers/BinaryDecoderWorker.js';\n\t\tlet worker = Potree.workerPool.getWorker(workerPath);\n\n\t\tworker.onmessage = function (e) {\n\n\t\t\tlet data = e.data;\n\t\t\tlet buffers = data.attributeBuffers;\n\t\t\tlet tightBoundingBox = new THREE.Box3(\n\t\t\t\tnew THREE.Vector3().fromArray(data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tPotree.workerPool.returnWorker(workerPath, worker);\n\n\t\t\tlet geometry = new THREE.BufferGeometry();\n\n\t\t\tfor(let property in buffers){\n\t\t\t\tlet buffer = buffers[property].buffer;\n\t\t\t\tlet batchAttribute = buffers[property].attribute;\n\n\t\t\t\tif (property === \"POSITION_CARTESIAN\") {\n\t\t\t\t\tgeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t} else if (property === \"rgba\") {\n\t\t\t\t\tgeometry.addAttribute(\"rgba\", new THREE.BufferAttribute(new Uint8Array(buffer), 4, true));\n\t\t\t\t} else if (property === \"NORMAL_SPHEREMAPPED\") {\n\t\t\t\t\tgeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t} else if (property === \"NORMAL_OCT16\") {\n\t\t\t\t\tgeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t} else if (property === \"NORMAL\") {\n\t\t\t\t\tgeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t} else if (property === \"INDICES\") {\n\t\t\t\t\tlet bufferAttribute = new THREE.BufferAttribute(new Uint8Array(buffer), 4);\n\t\t\t\t\tbufferAttribute.normalized = true;\n\t\t\t\t\tgeometry.addAttribute('indices', bufferAttribute);\n\t\t\t\t} else if (property === \"SPACING\") {\n\t\t\t\t\tlet bufferAttribute = new THREE.BufferAttribute(new Float32Array(buffer), 1);\n\t\t\t\t\tgeometry.addAttribute('spacing', bufferAttribute);\n\t\t\t\t} else {\n\t\t\t\t\tconst bufferAttribute = new THREE.BufferAttribute(new Float32Array(buffer), 1);\n\n\t\t\t\t\tbufferAttribute.potree = {\n\t\t\t\t\t\toffset: buffers[property].offset,\n\t\t\t\t\t\tscale: buffers[property].scale,\n\t\t\t\t\t\tpreciseBuffer: buffers[property].preciseBuffer,\n\t\t\t\t\t\trange: batchAttribute.range,\n\t\t\t\t\t};\n\n\t\t\t\t\tgeometry.addAttribute(property, bufferAttribute);\n\n\t\t\t\t\tconst attribute = pointAttributes.attributes.find(a => a.name === batchAttribute.name);\n\t\t\t\t\tattribute.range[0] = Math.min(attribute.range[0], batchAttribute.range[0]);\n\t\t\t\t\tattribute.range[1] = Math.max(attribute.range[1], batchAttribute.range[1]);\n\n\t\t\t\t\tif(node.getLevel() === 0){\n\t\t\t\t\t\tattribute.initialRange = batchAttribute.range;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttightBoundingBox.max.sub(tightBoundingBox.min);\n\t\t\ttightBoundingBox.min.set(0, 0, 0);\n\n\t\t\tlet numPoints = e.data.buffer.byteLength / pointAttributes.byteSize;\n\t\t\t\n\t\t\tnode.numPoints = numPoints;\n\t\t\tnode.geometry = geometry;\n\t\t\tnode.mean = new THREE.Vector3(...data.mean);\n\t\t\tnode.tightBoundingBox = tightBoundingBox;\n\t\t\tnode.loaded = true;\n\t\t\tnode.loading = false;\n\t\t\tnode.estimatedSpacing = data.estimatedSpacing;\n\t\t\tPotree.numNodesLoading--;\n\t\t};\n\n\t\tlet message = {\n\t\t\tbuffer: buffer,\n\t\t\tpointAttributes: pointAttributes,\n\t\t\tversion: this.version.version,\n\t\t\tmin: [ node.boundingBox.min.x, node.boundingBox.min.y, node.boundingBox.min.z ],\n\t\t\toffset: [node.pcoGeometry.offset.x, node.pcoGeometry.offset.y, node.pcoGeometry.offset.z],\n\t\t\tscale: this.scale,\n\t\t\tspacing: node.spacing,\n\t\t\thasChildren: node.hasChildren,\n\t\t\tname: node.name\n\t\t};\n\t\tworker.postMessage(message, [message.buffer]);\n\t};\n\n\t\n}\n\n","\n\nimport {PointCloudOctreeGeometry, PointCloudOctreeGeometryNode} from \"../PointCloudOctreeGeometry.js\";\nimport {Version} from \"../Version.js\";\nimport {XHRFactory} from \"../XHRFactory.js\";\nimport {LasLazLoader} from \"./LasLazLoader.js\";\nimport {BinaryLoader} from \"./BinaryLoader.js\";\nimport {Utils} from \"../utils.js\";\nimport {PointAttribute, PointAttributes, PointAttributeTypes} from \"./PointAttributes.js\";\n\nfunction parseAttributes(cloudjs){\n\n\tlet version = new Version(cloudjs.version);\n\n\tconst replacements = {\n\t\t\"COLOR_PACKED\": \"rgba\",\n\t\t\"RGBA\": \"rgba\",\n\t\t\"INTENSITY\": \"intensity\",\n\t\t\"CLASSIFICATION\": \"classification\",\n\t};\n\n\tconst replaceOldNames = (old) => {\n\t\tif(replacements[old]){\n\t\t\treturn replacements[old];\n\t\t}else{\n\t\t\treturn old;\n\t\t}\n\t};\n\n\tconst pointAttributes = [];\n\tif(version.upTo('1.7')){\n\t\t\n\t\tfor(let attributeName of cloudjs.pointAttributes){\n\t\t\tconst oldAttribute = PointAttribute[attributeName];\n\n\t\t\tconst attribute = {\n\t\t\t\tname: oldAttribute.name,\n\t\t\t\tsize: oldAttribute.byteSize,\n\t\t\t\telements: oldAttribute.numElements,\n\t\t\t\telementSize: oldAttribute.byteSize / oldAttribute.numElements,\n\t\t\t\ttype: oldAttribute.type.name,\n\t\t\t\tdescription: \"\",\n\t\t\t};\n\n\t\t\tpointAttributes.push(attribute);\n\t\t}\n\n\t}else{\n\t\tpointAttributes.push(...cloudjs.pointAttributes);\n\t}\n\n\n\t{\n\t\tconst attributes = new PointAttributes();\n\n\t\tconst typeConversion = {\n\t\t\tint8: PointAttributeTypes.DATA_TYPE_INT8,\n\t\t\tint16: PointAttributeTypes.DATA_TYPE_INT16,\n\t\t\tint32: PointAttributeTypes.DATA_TYPE_INT32,\n\t\t\tint64: PointAttributeTypes.DATA_TYPE_INT64,\n\t\t\tuint8: PointAttributeTypes.DATA_TYPE_UINT8,\n\t\t\tuint16: PointAttributeTypes.DATA_TYPE_UINT16,\n\t\t\tuint32: PointAttributeTypes.DATA_TYPE_UINT32,\n\t\t\tuint64: PointAttributeTypes.DATA_TYPE_UINT64,\n\t\t\tdouble: PointAttributeTypes.DATA_TYPE_DOUBLE,\n\t\t\tfloat: PointAttributeTypes.DATA_TYPE_FLOAT,\n\t\t};\n\n\t\tfor(const jsAttribute of pointAttributes){\n\t\t\tconst name = replaceOldNames(jsAttribute.name);\n\t\t\tconst type = typeConversion[jsAttribute.type];\n\t\t\tconst numElements = jsAttribute.elements;\n\t\t\tconst description = jsAttribute.description;\n\n\t\t\tconst attribute = new PointAttribute(name, type, numElements);\n\n\t\t\tattributes.add(attribute);\n\t\t}\n\n\t\t{\n\t\t\t// check if it has normals\n\t\t\tlet hasNormals = \n\t\t\t\tpointAttributes.find(a => a.name === \"NormalX\") !== undefined &&\n\t\t\t\tpointAttributes.find(a => a.name === \"NormalY\") !== undefined &&\n\t\t\t\tpointAttributes.find(a => a.name === \"NormalZ\") !== undefined;\n\n\t\t\tif(hasNormals){\n\t\t\t\tlet vector = {\n\t\t\t\t\tname: \"NORMAL\",\n\t\t\t\t\tattributes: [\"NormalX\", \"NormalY\", \"NormalZ\"],\n\t\t\t\t};\n\t\t\t\tattributes.addVector(vector);\n\t\t\t}\n\t\t}\n\n\t\treturn attributes;\n\t}\n\n}\n\nfunction lasLazAttributes(fMno){\n\tconst attributes = new PointAttributes();\n\n\tattributes.add(PointAttribute.POSITION_CARTESIAN);\n\tattributes.add(new PointAttribute(\"rgba\", PointAttributeTypes.DATA_TYPE_UINT8, 4));\n\tattributes.add(new PointAttribute(\"intensity\", PointAttributeTypes.DATA_TYPE_UINT16, 1));\n\tattributes.add(new PointAttribute(\"classification\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\tattributes.add(new PointAttribute(\"gps-time\", PointAttributeTypes.DATA_TYPE_DOUBLE, 1));\n\tattributes.add(new PointAttribute(\"number of returns\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\tattributes.add(new PointAttribute(\"return number\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\tattributes.add(new PointAttribute(\"source id\", PointAttributeTypes.DATA_TYPE_UINT16, 1));\n\t//attributes.add(new PointAttribute(\"pointSourceID\", PointAttributeTypes.DATA_TYPE_INT8, 4));\n\n\n\treturn attributes;\n}\n\nexport class POCLoader {\n\n\tstatic load(url, callback){\n\t\ttry {\n\t\t\tlet pco = new PointCloudOctreeGeometry();\n\t\t\tpco.url = url;\n\t\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\t\txhr.open('GET', url, true);\n\n\t\t\txhr.onreadystatechange = function () {\n\t\t\t\tif (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 0)) {\n\t\t\t\t\tlet fMno = JSON.parse(xhr.responseText);\n\n\t\t\t\t\tlet version = new Version(fMno.version);\n\n\t\t\t\t\t// assume octreeDir is absolute if it starts with http\n\t\t\t\t\tif (fMno.octreeDir.indexOf('http') === 0) {\n\t\t\t\t\t\tpco.octreeDir = fMno.octreeDir;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpco.octreeDir = url + '/../' + fMno.octreeDir;\n\t\t\t\t\t}\n\n\t\t\t\t\tpco.spacing = fMno.spacing;\n\t\t\t\t\tpco.hierarchyStepSize = fMno.hierarchyStepSize;\n\n\t\t\t\t\tpco.pointAttributes = fMno.pointAttributes;\n\n\t\t\t\t\tlet min = new THREE.Vector3(fMno.boundingBox.lx, fMno.boundingBox.ly, fMno.boundingBox.lz);\n\t\t\t\t\tlet max = new THREE.Vector3(fMno.boundingBox.ux, fMno.boundingBox.uy, fMno.boundingBox.uz);\n\t\t\t\t\tlet boundingBox = new THREE.Box3(min, max);\n\t\t\t\t\tlet tightBoundingBox = boundingBox.clone();\n\n\t\t\t\t\tif (fMno.tightBoundingBox) {\n\t\t\t\t\t\ttightBoundingBox.min.copy(new THREE.Vector3(fMno.tightBoundingBox.lx, fMno.tightBoundingBox.ly, fMno.tightBoundingBox.lz));\n\t\t\t\t\t\ttightBoundingBox.max.copy(new THREE.Vector3(fMno.tightBoundingBox.ux, fMno.tightBoundingBox.uy, fMno.tightBoundingBox.uz));\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offset = min.clone();\n\n\t\t\t\t\tboundingBox.min.sub(offset);\n\t\t\t\t\tboundingBox.max.sub(offset);\n\n\t\t\t\t\ttightBoundingBox.min.sub(offset);\n\t\t\t\t\ttightBoundingBox.max.sub(offset);\n\n\t\t\t\t\tpco.projection = fMno.projection;\n\t\t\t\t\tpco.boundingBox = boundingBox;\n\t\t\t\t\tpco.tightBoundingBox = tightBoundingBox;\n\t\t\t\t\tpco.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\t\t\t\tpco.tightBoundingSphere = tightBoundingBox.getBoundingSphere(new THREE.Sphere());\n\t\t\t\t\tpco.offset = offset;\n\t\t\t\t\tif (fMno.pointAttributes === 'LAS') {\n\t\t\t\t\t\tpco.loader = new LasLazLoader(fMno.version, \"las\");\n\t\t\t\t\t\tpco.pointAttributes = lasLazAttributes(fMno);\n\t\t\t\t\t} else if (fMno.pointAttributes === 'LAZ') {\n\t\t\t\t\t\tpco.loader = new LasLazLoader(fMno.version, \"laz\");\n\t\t\t\t\t\tpco.pointAttributes = lasLazAttributes(fMno);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpco.loader = new BinaryLoader(fMno.version, boundingBox, fMno.scale);\n\t\t\t\t\t\tpco.pointAttributes = parseAttributes(fMno);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet nodes = {};\n\n\t\t\t\t\t{ // load root\n\t\t\t\t\t\tlet name = 'r';\n\n\t\t\t\t\t\tlet root = new PointCloudOctreeGeometryNode(name, pco, boundingBox);\n\t\t\t\t\t\troot.level = 0;\n\t\t\t\t\t\troot.hasChildren = true;\n\t\t\t\t\t\troot.spacing = pco.spacing;\n\t\t\t\t\t\tif (version.upTo('1.5')) {\n\t\t\t\t\t\t\troot.numPoints = fMno.hierarchy[0][1];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\troot.numPoints = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpco.root = root;\n\t\t\t\t\t\tpco.root.load();\n\t\t\t\t\t\tnodes[name] = root;\n\t\t\t\t\t}\n\n\t\t\t\t\t// load remaining hierarchy\n\t\t\t\t\tif (version.upTo('1.4')) {\n\t\t\t\t\t\tfor (let i = 1; i < fMno.hierarchy.length; i++) {\n\t\t\t\t\t\t\tlet name = fMno.hierarchy[i][0];\n\t\t\t\t\t\t\tlet numPoints = fMno.hierarchy[i][1];\n\t\t\t\t\t\t\tlet index = parseInt(name.charAt(name.length - 1));\n\t\t\t\t\t\t\tlet parentName = name.substring(0, name.length - 1);\n\t\t\t\t\t\t\tlet parentNode = nodes[parentName];\n\t\t\t\t\t\t\tlet level = name.length - 1;\n\t\t\t\t\t\t\t//let boundingBox = POCLoader.createChildAABB(parentNode.boundingBox, index);\n\t\t\t\t\t\t\tlet boundingBox = Utils.createChildAABB(parentNode.boundingBox, index);\n\n\t\t\t\t\t\t\tlet node = new PointCloudOctreeGeometryNode(name, pco, boundingBox);\n\t\t\t\t\t\t\tnode.level = level;\n\t\t\t\t\t\t\tnode.numPoints = numPoints;\n\t\t\t\t\t\t\tnode.spacing = pco.spacing / Math.pow(2, level);\n\t\t\t\t\t\t\tparentNode.addChild(node);\n\t\t\t\t\t\t\tnodes[name] = node;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tpco.nodes = nodes;\n\n\t\t\t\t\tcallback(pco);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\txhr.send(null);\n\t\t} catch (e) {\n\t\t\tconsole.log(\"loading failed: '\" + url + \"'\");\n\t\t\tconsole.log(e);\n\n\t\t\tcallback();\n\t\t}\n\t}\n\n\tloadPointAttributes(mno){\n\t\tlet fpa = mno.pointAttributes;\n\t\tlet pa = new PointAttributes();\n\n\t\tfor (let i = 0; i < fpa.length; i++) {\n\t\t\tlet pointAttribute = PointAttribute[fpa[i]];\n\t\t\tpa.add(pointAttribute);\n\t\t}\n\n\t\treturn pa;\n\t}\n\n\tcreateChildAABB(aabb, index){\n\t\tlet min = aabb.min.clone();\n\t\tlet max = aabb.max.clone();\n\t\tlet size = new THREE.Vector3().subVectors(max, min);\n\n\t\tif ((index & 0b0001) > 0) {\n\t\t\tmin.z += size.z / 2;\n\t\t} else {\n\t\t\tmax.z -= size.z / 2;\n\t\t}\n\n\t\tif ((index & 0b0010) > 0) {\n\t\t\tmin.y += size.y / 2;\n\t\t} else {\n\t\t\tmax.y -= size.y / 2;\n\t\t}\n\n\t\tif ((index & 0b0100) > 0) {\n\t\t\tmin.x += size.x / 2;\n\t\t} else {\n\t\t\tmax.x -= size.x / 2;\n\t\t}\n\n\t\treturn new THREE.Box3(min, max);\n\t}\n}\n\n","\r\nexport class OctreeGeometry{\r\n\r\n\tconstructor(){\r\n\t\tthis.url = null;\r\n\t\tthis.spacing = 0;\r\n\t\tthis.boundingBox = null;\r\n\t\tthis.root = null;\r\n\t\tthis.pointAttributes = null;\r\n\t\tthis.loader = null;\r\n\t}\r\n\r\n};\r\n\r\nexport class OctreeGeometryNode{\r\n\r\n\tconstructor(name, octreeGeometry, boundingBox){\r\n\t\tthis.id = OctreeGeometryNode.IDCount++;\r\n\t\tthis.name = name;\r\n\t\tthis.index = parseInt(name.charAt(name.length - 1));\r\n\t\tthis.octreeGeometry = octreeGeometry;\r\n\t\tthis.boundingBox = boundingBox;\r\n\t\tthis.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\r\n\t\tthis.children = {};\r\n\t\tthis.numPoints = 0;\r\n\t\tthis.level = null;\r\n\t\tthis.oneTimeDisposeHandlers = [];\r\n\t}\r\n\r\n\tisGeometryNode(){\r\n\t\treturn true;\r\n\t}\r\n\r\n\tgetLevel(){\r\n\t\treturn this.level;\r\n\t}\r\n\r\n\tisTreeNode(){\r\n\t\treturn false;\r\n\t}\r\n\r\n\tisLoaded(){\r\n\t\treturn this.loaded;\r\n\t}\r\n\r\n\tgetBoundingSphere(){\r\n\t\treturn this.boundingSphere;\r\n\t}\r\n\r\n\tgetBoundingBox(){\r\n\t\treturn this.boundingBox;\r\n\t}\r\n\r\n\tgetChildren(){\r\n\t\tlet children = [];\r\n\r\n\t\tfor (let i = 0; i < 8; i++) {\r\n\t\t\tif (this.children[i]) {\r\n\t\t\t\tchildren.push(this.children[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn children;\r\n\t}\r\n\r\n\tgetBoundingBox(){\r\n\t\treturn this.boundingBox;\r\n\t}\r\n\r\n\tload(){\r\n\r\n\t\tif (Potree.numNodesLoading >= Potree.maxNodesLoading) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.octreeGeometry.loader.load(this);\r\n\t}\r\n\r\n\tgetNumPoints(){\r\n\t\treturn this.numPoints;\r\n\t}\r\n\r\n\tdispose(){\r\n\t\tif (this.geometry && this.parent != null) {\r\n\t\t\tthis.geometry.dispose();\r\n\t\t\tthis.geometry = null;\r\n\t\t\tthis.loaded = false;\r\n\r\n\t\t\t// this.dispatchEvent( { type: 'dispose' } );\r\n\t\t\tfor (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) {\r\n\t\t\t\tlet handler = this.oneTimeDisposeHandlers[i];\r\n\t\t\t\thandler();\r\n\t\t\t}\r\n\t\t\tthis.oneTimeDisposeHandlers = [];\r\n\t\t}\r\n\t}\r\n\r\n};\r\n\r\nOctreeGeometryNode.IDCount = 0;","\nimport {PointAttribute, PointAttributes, PointAttributeTypes} from \"../../loader/PointAttributes.js\";\nimport {OctreeGeometry, OctreeGeometryNode} from \"./OctreeGeometry.js\";\n\nexport class NodeLoader{\n\n\tconstructor(url){\n\t\tthis.url = url;\n\t}\n\n\tasync load(node){\n\n\t\tif(node.loaded || node.loading){\n\t\t\treturn;\n\t\t}\n\n\t\tnode.loading = true;\n\t\tPotree.numNodesLoading++;\n\n\t\tif(node.nodeType === 2){\n\t\t\tawait this.loadHierarchy(node);\n\t\t}\n\n\t\tlet {byteOffset, byteSize} = node;\n\n\t\ttry{\n\n\t\t\tlet urlOctree = `${this.url}/../octree.bin`;\n\n\t\t\tlet first = byteOffset;\n\t\t\tlet last = byteOffset + byteSize - 1n;\n\n\t\t\tlet response = await fetch(urlOctree, {\n\t\t\t\theaders: {\n\t\t\t\t\t'content-type': 'multipart/byteranges',\n\t\t\t\t\t'Range': `bytes=${first}-${last}`,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tlet buffer = await response.arrayBuffer();\n\n\t\t\tlet workerPath = Potree.scriptPath + '/workers/OctreeDecoderWorker.js';\n\t\t\tlet worker = Potree.workerPool.getWorker(workerPath);\n\n\t\t\tworker.onmessage = function (e) {\n\n\t\t\t\tlet data = e.data;\n\t\t\t\tlet buffers = data.attributeBuffers;\n\n\t\t\t\tPotree.workerPool.returnWorker(workerPath, worker);\n\n\t\t\t\tlet geometry = new THREE.BufferGeometry();\n\t\t\t\t\n\t\t\t\tfor(let property in buffers){\n\n\t\t\t\t\tlet buffer = buffers[property].buffer;\n\n\t\t\t\t\tif(property === \"position\"){\n\t\t\t\t\t\tgeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t\t}else if(property === \"rgba\"){\n\t\t\t\t\t\tgeometry.addAttribute('rgba', new THREE.BufferAttribute(new Uint8Array(buffer), 4, true));\n\t\t\t\t\t}else if(property === \"NORMAL\"){\n\t\t\t\t\t\t//geometry.addAttribute('rgba', new THREE.BufferAttribute(new Uint8Array(buffer), 4, true));\n\t\t\t\t\t\tgeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t\t}else if (property === \"INDICES\") {\n\t\t\t\t\t\tlet bufferAttribute = new THREE.BufferAttribute(new Uint8Array(buffer), 4);\n\t\t\t\t\t\tbufferAttribute.normalized = true;\n\t\t\t\t\t\tgeometry.addAttribute('indices', bufferAttribute);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tconst bufferAttribute = new THREE.BufferAttribute(new Float32Array(buffer), 1);\n\n\t\t\t\t\t\tlet batchAttribute = buffers[property].attribute;\n\t\t\t\t\t\tbufferAttribute.potree = {\n\t\t\t\t\t\t\toffset: buffers[property].offset,\n\t\t\t\t\t\t\tscale: buffers[property].scale,\n\t\t\t\t\t\t\tpreciseBuffer: buffers[property].preciseBuffer,\n\t\t\t\t\t\t\trange: batchAttribute.range,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tgeometry.addAttribute(property, bufferAttribute);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// indices ??\n\n\t\t\t\tnode.density = data.density;\n\t\t\t\tnode.geometry = geometry;\n\t\t\t\tnode.loaded = true;\n\t\t\t\tnode.loading = false;\n\t\t\t\tPotree.numNodesLoading--;\n\t\t\t};\n\n\t\t\tlet pointAttributes = node.octreeGeometry.pointAttributes;\n\t\t\tlet scale = node.octreeGeometry.scale;\n\n\t\t\tlet box = node.boundingBox;\n\t\t\tlet min = node.octreeGeometry.offset.clone().add(box.min);\n\t\t\tlet size = box.max.clone().sub(box.min);\n\t\t\tlet max = min.clone().add(size);\n\n\t\t\tlet offset = node.octreeGeometry.loader.offset;\n\n\t\t\tlet message = {\n\t\t\t\tname: node.name,\n\t\t\t\tbuffer: buffer,\n\t\t\t\tpointAttributes: pointAttributes,\n\t\t\t\tscale: scale,\n\t\t\t\tmin: min,\n\t\t\t\tmax: max,\n\t\t\t\tsize: size,\n\t\t\t\toffset: offset,\n\t\t\t};\n\n\t\t\tworker.postMessage(message, [message.buffer]);\n\t\t}catch(e){\n\t\t\tnode.loaded = false;\n\t\t\tnode.loading = false;\n\t\t\tPotree.numNodesLoading--;\n\n\t\t\tconsole.log(`failed to load ${node.name}`);\n\t\t\tconsole.log(e);\n\t\t\tconsole.log(`trying again!`);\n\t\t}\n\t}\n\n\tparseHierarchy(node, buffer){\n\n\t\tlet view = new DataView(buffer);\n\t\tlet tStart = performance.now();\n\n\t\tlet bytesPerNode = 22;\n\t\tlet numNodes = buffer.byteLength / bytesPerNode;\n\n\t\tlet octree = node.octreeGeometry;\n\t\t// let nodes = [node];\n\t\tlet nodes = new Array(numNodes);\n\t\tnodes[0] = node;\n\t\tlet nodePos = 1;\n\n\t\tfor(let i = 0; i < numNodes; i++){\n\t\t\tlet current = nodes[i];\n\n\t\t\tlet type = view.getUint8(i * bytesPerNode + 0);\n\t\t\tlet childMask = view.getUint8(i * bytesPerNode + 1);\n\t\t\tlet numPoints = view.getUint32(i * bytesPerNode + 2, true);\n\t\t\tlet byteOffset = view.getBigInt64(i * bytesPerNode + 6, true);\n\t\t\tlet byteSize = view.getBigInt64(i * bytesPerNode + 14, true);\n\n\n\t\t\tif(current.nodeType === 2){\n\t\t\t\t// replace proxy with real node\n\t\t\t\tcurrent.byteOffset = byteOffset;\n\t\t\t\tcurrent.byteSize = byteSize;\n\t\t\t\tcurrent.numPoints = numPoints;\n\t\t\t}else if(type === 2){\n\t\t\t\t// load proxy\n\t\t\t\tcurrent.hierarchyByteOffset = byteOffset;\n\t\t\t\tcurrent.hierarchyByteSize = byteSize;\n\t\t\t\tcurrent.numPoints = numPoints;\n\t\t\t}else{\n\t\t\t\t// load real node \n\t\t\t\tcurrent.byteOffset = byteOffset;\n\t\t\t\tcurrent.byteSize = byteSize;\n\t\t\t\tcurrent.numPoints = numPoints;\n\t\t\t}\n\t\t\t\n\t\t\tcurrent.nodeType = type;\n\n\t\t\tif(current.nodeType === 2){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor(let childIndex = 0; childIndex < 8; childIndex++){\n\t\t\t\tlet childExists = ((1 << childIndex) & childMask) !== 0;\n\n\t\t\t\tif(!childExists){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet childName = current.name + childIndex;\n\n\t\t\t\tlet childAABB = createChildAABB(current.boundingBox, childIndex);\n\t\t\t\tlet child = new OctreeGeometryNode(childName, octree, childAABB);\n\t\t\t\tchild.name = childName;\n\t\t\t\tchild.spacing = current.spacing / 2;\n\t\t\t\tchild.level = current.level + 1;\n\n\t\t\t\tcurrent.children[childIndex] = child;\n\t\t\t\tchild.parent = current;\n\n\t\t\t\t// nodes.push(child);\n\t\t\t\tnodes[nodePos] = child;\n\t\t\t\tnodePos++;\n\t\t\t}\n\n\t\t\t// if((i % 500) === 0){\n\t\t\t// \tyield;\n\t\t\t// }\n\t\t}\n\n\t\tlet duration = (performance.now() - tStart);\n\n\t\tif(duration > 20){\n\t\t\tlet msg = `duration: ${duration}ms, numNodes: ${numNodes}`;\n\t\t\tconsole.log(msg);\n\t\t}\n\t}\n\n\tasync loadHierarchy(node){\n\n\t\tlet {hierarchyByteOffset, hierarchyByteSize} = node;\n\t\tlet hierarchyPath = `${this.url}/../hierarchy.bin`;\n\t\t\n\t\tlet first = hierarchyByteOffset;\n\t\tlet last = first + hierarchyByteSize - 1n;\n\n\t\tlet response = await fetch(hierarchyPath, {\n\t\t\theaders: {\n\t\t\t\t'content-type': 'multipart/byteranges',\n\t\t\t\t'Range': `bytes=${first}-${last}`,\n\t\t\t},\n\t\t});\n\n\n\n\t\tlet buffer = await response.arrayBuffer();\n\n\t\tthis.parseHierarchy(node, buffer);\n\n\t\t// let promise = new Promise((resolve) => {\n\t\t// \tlet generator = this.parseHierarchy(node, buffer);\n\n\t\t// \tlet repeatUntilDone = () => {\n\t\t// \t\tlet result = generator.next();\n\n\t\t// \t\tif(result.done){\n\t\t// \t\t\tresolve();\n\t\t// \t\t}else{\n\t\t// \t\t\trequestAnimationFrame(repeatUntilDone);\n\t\t// \t\t}\n\t\t// \t};\n\t\t\t\n\t\t// \trepeatUntilDone();\n\t\t// });\n\n\t\t// await promise;\n\n\t\t\n\n\n\n\t}\n\n}\n\nlet tmpVec3 = new THREE.Vector3();\nfunction createChildAABB(aabb, index){\n\tlet min = aabb.min.clone();\n\tlet max = aabb.max.clone();\n\tlet size = tmpVec3.subVectors(max, min);\n\n\tif ((index & 0b0001) > 0) {\n\t\tmin.z += size.z / 2;\n\t} else {\n\t\tmax.z -= size.z / 2;\n\t}\n\n\tif ((index & 0b0010) > 0) {\n\t\tmin.y += size.y / 2;\n\t} else {\n\t\tmax.y -= size.y / 2;\n\t}\n\t\n\tif ((index & 0b0100) > 0) {\n\t\tmin.x += size.x / 2;\n\t} else {\n\t\tmax.x -= size.x / 2;\n\t}\n\n\treturn new THREE.Box3(min, max);\n}\n\nlet typenameTypeattributeMap = {\n\t\"double\": PointAttributeTypes.DATA_TYPE_DOUBLE,\n\t\"float\": PointAttributeTypes.DATA_TYPE_FLOAT,\n\t\"int8\": PointAttributeTypes.DATA_TYPE_INT8,\n\t\"uint8\": PointAttributeTypes.DATA_TYPE_UINT8,\n\t\"int16\": PointAttributeTypes.DATA_TYPE_INT16,\n\t\"uint16\": PointAttributeTypes.DATA_TYPE_UINT16,\n\t\"int32\": PointAttributeTypes.DATA_TYPE_INT32,\n\t\"uint32\": PointAttributeTypes.DATA_TYPE_UINT32,\n\t\"int64\": PointAttributeTypes.DATA_TYPE_INT64,\n\t\"uint64\": PointAttributeTypes.DATA_TYPE_UINT64,\n}\n\nexport class OctreeLoader_1_8{\n\n\tstatic parseAttributes(jsonAttributes){\n\n\t\tlet attributes = new PointAttributes();\n\n\t\tlet replacements = {\n\t\t\t\"rgb\": \"rgba\",\n\t\t};\n\n\t\tfor(let jsonAttribute of jsonAttributes){\n\t\t\tlet {name, description, size, numElements, elementSize, min, max} = jsonAttribute;\n\n\t\t\tlet type = typenameTypeattributeMap[jsonAttribute.type];\n\n\t\t\tlet potreeAttributeName = replacements[name] ? replacements[name] : name;\n\n\t\t\tlet attribute = new PointAttribute(potreeAttributeName, type, numElements);\n\n\t\t\tif(numElements === 1){\n\t\t\t\tattribute.range = [min[0], max[0]];\n\t\t\t}else{\n\t\t\t\tattribute.range = [min, max];\n\t\t\t}\n\t\t\t\n\t\t\tattribute.initialRange = attribute.range;\n\n\t\t\tattributes.add(attribute);\n\t\t}\n\n\t\t{\n\t\t\t// check if it has normals\n\t\t\tlet hasNormals = \n\t\t\t\tattributes.attributes.find(a => a.name === \"NormalX\") !== undefined &&\n\t\t\t\tattributes.attributes.find(a => a.name === \"NormalY\") !== undefined &&\n\t\t\t\tattributes.attributes.find(a => a.name === \"NormalZ\") !== undefined;\n\n\t\t\tif(hasNormals){\n\t\t\t\tlet vector = {\n\t\t\t\t\tname: \"NORMAL\",\n\t\t\t\t\tattributes: [\"NormalX\", \"NormalY\", \"NormalZ\"],\n\t\t\t\t};\n\t\t\t\tattributes.addVector(vector);\n\t\t\t}\n\t\t}\n\n\t\treturn attributes;\n\t}\n\n\tstatic async load(url){\n\n\t\tlet response = await fetch(url);\n\t\tlet metadata = await response.json();\n\n\t\tlet attributes = OctreeLoader_1_8.parseAttributes(metadata.attributes);\n\n\t\tlet loader = new NodeLoader(url);\n\t\tloader.metadata = metadata;\n\t\tloader.attributes = attributes;\n\t\tloader.scale = metadata.scale;\n\t\tloader.offset = metadata.offset;\n\n\t\tlet octree = new OctreeGeometry();\n\t\toctree.url = url;\n\t\toctree.spacing = metadata.spacing;\n\t\toctree.scale = metadata.scale;\n\n\t\t// let aPosition = metadata.attributes.find(a => a.name === \"position\");\n\t\t// octree\n\n\t\tlet min = new THREE.Vector3(...metadata.boundingBox.min);\n\t\tlet max = new THREE.Vector3(...metadata.boundingBox.max);\n\t\tlet boundingBox = new THREE.Box3(min, max);\n\n\t\tlet offset = min.clone();\n\t\tboundingBox.min.sub(offset);\n\t\tboundingBox.max.sub(offset);\n\n\t\toctree.projection = metadata.projection;\n\t\toctree.boundingBox = boundingBox;\n\t\toctree.tightBoundingBox = boundingBox.clone();\n\t\toctree.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\toctree.tightBoundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\toctree.offset = offset;\n\t\toctree.pointAttributes = OctreeLoader_1_8.parseAttributes(metadata.attributes);\n\t\toctree.loader = loader;\n\n\t\tlet root = new OctreeGeometryNode(\"r\", octree, boundingBox);\n\t\troot.level = 0;\n\t\troot.nodeType = 2;\n\t\troot.hierarchyByteOffset = 0n;\n\t\troot.hierarchyByteSize = BigInt(metadata.hierarchy.firstChunkSize);\n\t\troot.hasChildren = false;\n\t\troot.spacing = octree.spacing;\n\t\troot.byteOffset = 0;\n\n\t\toctree.root = root;\n\n\t\t//await OctreeLoader_1_8.loadHierarchy(url, root);\n\t\tawait loader.load(root);\n\n\t\tlet result = {\n\t\t\tgeometry: octree,\n\t\t};\n\n\t\treturn result;\n\n\t}\n\n};","/**\n * @author Connor Manning\n */\n\nexport class EptLoader {\n\tstatic async load(file, callback) {\n\n\t\tlet response = await fetch(file);\n\t\tlet json = await response.json();\n\n\t\tlet url = file.substr(0, file.lastIndexOf('ept.json'));\n\t\tlet geometry = new Potree.PointCloudEptGeometry(url, json);\n\t\tlet root = new Potree.PointCloudEptGeometryNode(geometry);\n\n\t\tgeometry.root = root;\n\t\tgeometry.root.load();\n\n\t\tcallback(geometry);\n\t}\n};\n\n","import {XHRFactory} from \"../../XHRFactory.js\";\n\nexport class EptBinaryLoader {\n\textension() {\n\t\treturn '.bin';\n\t}\n\n\tworkerPath() {\n\t\treturn Potree.scriptPath + '/workers/EptBinaryDecoderWorker.js';\n\t}\n\n\tload(node) {\n\t\tif (node.loaded) return;\n\n\t\tlet url = node.url() + this.extension();\n\n\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open('GET', url, true);\n\t\txhr.responseType = 'arraybuffer';\n\t\txhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t\txhr.onreadystatechange = () => {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tif (xhr.status === 200) {\n\t\t\t\t\tlet buffer = xhr.response;\n\t\t\t\t\tthis.parse(node, buffer);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('Failed ' + url + ': ' + xhr.status);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttry {\n\t\t\txhr.send(null);\n\t\t}\n\t\tcatch (e) {\n\t\t\tconsole.log('Failed request: ' + e);\n\t\t}\n\t}\n\n\tparse(node, buffer) {\n\t\tlet workerPath = this.workerPath();\n\t\tlet worker = Potree.workerPool.getWorker(workerPath);\n\n\t\tworker.onmessage = function(e) {\n\t\t\tlet g = new THREE.BufferGeometry();\n\t\t\tlet numPoints = e.data.numPoints;\n\n\t\t\tlet position = new Float32Array(e.data.position);\n\t\t\tg.addAttribute('position', new THREE.BufferAttribute(position, 3));\n\n\t\t\tlet indices = new Uint8Array(e.data.indices);\n\t\t\tg.addAttribute('indices', new THREE.BufferAttribute(indices, 4));\n\n\t\t\tif (e.data.color) {\n\t\t\t\tlet color = new Uint8Array(e.data.color);\n\t\t\t\tg.addAttribute('color', new THREE.BufferAttribute(color, 4, true));\n\t\t\t}\n\t\t\tif (e.data.intensity) {\n\t\t\t\tlet intensity = new Float32Array(e.data.intensity);\n\t\t\t\tg.addAttribute('intensity',\n\t\t\t\t\t\tnew THREE.BufferAttribute(intensity, 1));\n\t\t\t}\n\t\t\tif (e.data.classification) {\n\t\t\t\tlet classification = new Uint8Array(e.data.classification);\n\t\t\t\tg.addAttribute('classification',\n\t\t\t\t\t\tnew THREE.BufferAttribute(classification, 1));\n\t\t\t}\n\t\t\tif (e.data.returnNumber) {\n\t\t\t\tlet returnNumber = new Uint8Array(e.data.returnNumber);\n\t\t\t\tg.addAttribute('return number',\n\t\t\t\t\t\tnew THREE.BufferAttribute(returnNumber, 1));\n\t\t\t}\n\t\t\tif (e.data.numberOfReturns) {\n\t\t\t\tlet numberOfReturns = new Uint8Array(e.data.numberOfReturns);\n\t\t\t\tg.addAttribute('number of returns',\n\t\t\t\t\t\tnew THREE.BufferAttribute(numberOfReturns, 1));\n\t\t\t}\n\t\t\tif (e.data.pointSourceId) {\n\t\t\t\tlet pointSourceId = new Uint16Array(e.data.pointSourceId);\n\t\t\t\tg.addAttribute('source id',\n\t\t\t\t\t\tnew THREE.BufferAttribute(pointSourceId, 1));\n\t\t\t}\n\n\t\t\tg.attributes.indices.normalized = true;\n\n\t\t\tlet tightBoundingBox = new THREE.Box3(\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tnode.doneLoading(\n\t\t\t\t\tg,\n\t\t\t\t\ttightBoundingBox,\n\t\t\t\t\tnumPoints,\n\t\t\t\t\tnew THREE.Vector3(...e.data.mean));\n\n\t\t\tPotree.workerPool.returnWorker(workerPath, worker);\n\t\t};\n\n\t\tlet toArray = (v) => [v.x, v.y, v.z];\n\t\tlet message = {\n\t\t\tbuffer: buffer,\n\t\t\tschema: node.ept.schema,\n\t\t\tscale: node.ept.eptScale,\n\t\t\toffset: node.ept.eptOffset,\n\t\t\tmins: toArray(node.key.b.min)\n\t\t};\n\n\t\tworker.postMessage(message, [message.buffer]);\n\t}\n};\n\n","import {XHRFactory} from \"../../XHRFactory.js\";\n\n/**\n * laslaz code taken and adapted from plas.io js-laslaz\n *\t http://plas.io/\n *\thttps://github.com/verma/plasio\n *\n * Thanks to Uday Verma and Howard Butler\n *\n */\n\nexport class EptLaszipLoader {\n\tload(node) {\n\t\tif (node.loaded) return;\n\n\t\tlet url = node.url() + '.laz';\n\n\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open('GET', url, true);\n\t\txhr.responseType = 'arraybuffer';\n\t\txhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t\txhr.onreadystatechange = () => {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tif (xhr.status === 200) {\n\t\t\t\t\tlet buffer = xhr.response;\n\t\t\t\t\tthis.parse(node, buffer);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('Failed ' + url + ': ' + xhr.status);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\txhr.send(null);\n\t}\n\n\tasync parse(node, buffer){\n\t\tlet lf = new LASFile(buffer);\n\t\tlet handler = new EptLazBatcher(node);\n\n\t\ttry{\n\t\t\tawait lf.open();\n\n\t\t\tlf.isOpen = true;\n\n\t\t\tconst header = await lf.getHeader();\n\n\t\t\t{\n\t\t\t\tlet i = 0;\n\n\t\t\t\tlet toArray = (v) => [v.x, v.y, v.z];\n\t\t\t\tlet mins = toArray(node.key.b.min);\n\t\t\t\tlet maxs = toArray(node.key.b.max);\n\n\t\t\t\tlet hasMoreData = true;\n\n\t\t\t\twhile(hasMoreData){\n\t\t\t\t\tconst data = await lf.readData(1000000, 0, 1);\n\n\t\t\t\t\tlet d = new LASDecoder(\n\t\t\t\t\t\tdata.buffer,\n\t\t\t\t\t\theader.pointsFormatId,\n\t\t\t\t\t\theader.pointsStructSize,\n\t\t\t\t\t\tdata.count,\n\t\t\t\t\t\theader.scale,\n\t\t\t\t\t\theader.offset,\n\t\t\t\t\t\tmins,\n\t\t\t\t\t\tmaxs);\n\n\t\t\t\t\td.extraBytes = header.extraBytes;\n\t\t\t\t\td.pointsFormatId = header.pointsFormatId;\n\t\t\t\t\thandler.push(d);\n\n\t\t\t\t\ti += data.count;\n\n\t\t\t\t\thasMoreData = data.hasMoreData;\n\t\t\t\t}\n\n\t\t\t\theader.totalRead = i;\n\t\t\t\theader.versionAsString = lf.versionAsString;\n\t\t\t\theader.isCompressed = lf.isCompressed;\n\n\t\t\t\tawait lf.close();\n\n\t\t\t\tlf.isOpen = false;\n\t\t\t}\n\n\t\t}catch(err){\n\t\t\tconsole.error('Error reading LAZ:', err);\n\t\t\t\n\t\t\tif (lf.isOpen) {\n\t\t\t\tawait lf.close();\n\n\t\t\t\tlf.isOpen = false;\n\t\t\t}\n\t\t\t\n\t\t\tthrow err;\n\t\t}\n\t}\n};\n\nexport class EptLazBatcher {\n\tconstructor(node) { this.node = node; }\n\n\tpush(las) {\n\t\tlet workerPath = Potree.scriptPath +\n\t\t\t'/workers/EptLaszipDecoderWorker.js';\n\t\tlet worker = Potree.workerPool.getWorker(workerPath);\n\n\t\tworker.onmessage = (e) => {\n\t\t\tlet g = new THREE.BufferGeometry();\n\t\t\tlet numPoints = las.pointsCount;\n\n\t\t\tlet positions = new Float32Array(e.data.position);\n\t\t\tlet colors = new Uint8Array(e.data.color);\n\n\t\t\tlet intensities = new Float32Array(e.data.intensity);\n\t\t\tlet classifications = new Uint8Array(e.data.classification);\n\t\t\tlet returnNumbers = new Uint8Array(e.data.returnNumber);\n\t\t\tlet numberOfReturns = new Uint8Array(e.data.numberOfReturns);\n\t\t\tlet pointSourceIDs = new Uint16Array(e.data.pointSourceID);\n\t\t\tlet indices = new Uint8Array(e.data.indices);\n\t\t\tlet gpsTime = new Float32Array(e.data.gpsTime);\n\n\t\t\tg.addAttribute('position',\n\t\t\t\t\tnew THREE.BufferAttribute(positions, 3));\n\t\t\tg.addAttribute('rgba',\n\t\t\t\t\tnew THREE.BufferAttribute(colors, 4, true));\n\t\t\tg.addAttribute('intensity',\n\t\t\t\t\tnew THREE.BufferAttribute(intensities, 1));\n\t\t\tg.addAttribute('classification',\n\t\t\t\t\tnew THREE.BufferAttribute(classifications, 1));\n\t\t\tg.addAttribute('return number',\n\t\t\t\t\tnew THREE.BufferAttribute(returnNumbers, 1));\n\t\t\tg.addAttribute('number of returns',\n\t\t\t\t\tnew THREE.BufferAttribute(numberOfReturns, 1));\n\t\t\tg.addAttribute('source id',\n\t\t\t\t\tnew THREE.BufferAttribute(pointSourceIDs, 1));\n\t\t\tg.addAttribute('indices',\n\t\t\t\t\tnew THREE.BufferAttribute(indices, 4));\n\t\t\tg.addAttribute('gpsTime',\n\t\t\t\t\tnew THREE.BufferAttribute(gpsTime, 1));\n\t\t\tthis.node.gpsTime = e.data.gpsMeta;\n\n\t\t\tg.attributes.indices.normalized = true;\n\n\t\t\tlet tightBoundingBox = new THREE.Box3(\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tthis.node.doneLoading(\n\t\t\t\tg,\n\t\t\t\ttightBoundingBox,\n\t\t\t\tnumPoints,\n\t\t\t\tnew THREE.Vector3(...e.data.mean));\n\n\t\t\tPotree.workerPool.returnWorker(workerPath, worker);\n\t\t};\n\n\t\tlet message = {\n\t\t\tbuffer: las.arrayb,\n\t\t\tnumPoints: las.pointsCount,\n\t\t\tpointSize: las.pointSize,\n\t\t\tpointFormatID: las.pointsFormatId,\n\t\t\tscale: las.scale,\n\t\t\toffset: las.offset,\n\t\t\tmins: las.mins,\n\t\t\tmaxs: las.maxs\n\t\t};\n\n\t\tworker.postMessage(message, [message.buffer]);\n\t};\n};\n\n","import {EptBinaryLoader} from \"./BinaryLoader.js\";\n\nexport class EptZstandardLoader extends EptBinaryLoader {\n extension() {\n return '.zst';\n }\n\n workerPath() {\n return Potree.scriptPath + '/workers/EptZstandardDecoderWorker.js';\n }\n};\n\n","\n\nexport class ShapefileLoader{\n\n\tconstructor(){\n\t\tthis.transform = null;\n\t}\n\n\tasync load(path){\n\n\t\tconst matLine = new THREE.LineMaterial( {\n\t\t\tcolor: 0xff0000,\n\t\t\tlinewidth: 3, // in pixels\n\t\t\tresolution: new THREE.Vector2(1000, 1000),\n\t\t\tdashed: false\n\t\t} );\n\n\t\tconst features = await this.loadShapefileFeatures(path);\n\t\tconst node = new THREE.Object3D();\n\t\t\n\t\tfor(const feature of features){\n\t\t\tconst fnode = this.featureToSceneNode(feature, matLine);\n\t\t\tnode.add(fnode);\n\t\t}\n\n\t\tlet setResolution = (x, y) => {\n\t\t\tmatLine.resolution.set(x, y);\n\t\t};\n\n\t\tconst result = {\n\t\t\tfeatures: features,\n\t\t\tnode: node,\n\t\t\tsetResolution: setResolution,\n\t\t};\n\n\t\treturn result;\n\t}\n\n\tfeatureToSceneNode(feature, matLine){\n\t\tlet geometry = feature.geometry;\n\t\t\n\t\tlet color = new THREE.Color(1, 1, 1);\n\n\t\tlet transform = this.transform;\n\t\tif(transform === null){\n\t\t\ttransform = {forward: (v) => v};\n\t\t}\n\t\t\n\t\tif(feature.geometry.type === \"Point\"){\n\t\t\tlet sg = new THREE.SphereGeometry(1, 18, 18);\n\t\t\tlet sm = new THREE.MeshNormalMaterial();\n\t\t\tlet s = new THREE.Mesh(sg, sm);\n\t\t\t\n\t\t\tlet [long, lat] = geometry.coordinates;\n\t\t\tlet pos = transform.forward([long, lat]);\n\t\t\t\n\t\t\ts.position.set(...pos, 20);\n\t\t\t\n\t\t\ts.scale.set(10, 10, 10);\n\t\t\t\n\t\t\treturn s;\n\t\t}else if(geometry.type === \"LineString\"){\n\t\t\tlet coordinates = [];\n\t\t\t\n\t\t\tlet min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\t\tfor(let i = 0; i < geometry.coordinates.length; i++){\n\t\t\t\tlet [long, lat] = geometry.coordinates[i];\n\t\t\t\tlet pos = transform.forward([long, lat]);\n\t\t\t\t\n\t\t\t\tmin.x = Math.min(min.x, pos[0]);\n\t\t\t\tmin.y = Math.min(min.y, pos[1]);\n\t\t\t\tmin.z = Math.min(min.z, 20);\n\t\t\t\t\n\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\tif(i > 0 && i < geometry.coordinates.length - 1){\n\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfor(let i = 0; i < coordinates.length; i += 3){\n\t\t\t\tcoordinates[i+0] -= min.x;\n\t\t\t\tcoordinates[i+1] -= min.y;\n\t\t\t\tcoordinates[i+2] -= min.z;\n\t\t\t}\n\t\t\t\n\t\t\tconst lineGeometry = new THREE.LineGeometry();\n\t\t\tlineGeometry.setPositions( coordinates );\n\n\t\t\tconst line = new THREE.Line2( lineGeometry, matLine );\n\t\t\tline.computeLineDistances();\n\t\t\tline.scale.set( 1, 1, 1 );\n\t\t\tline.position.copy(min);\n\t\t\t\n\t\t\treturn line;\n\t\t}else if(geometry.type === \"Polygon\"){\n\t\t\tfor(let pc of geometry.coordinates){\n\t\t\t\tlet coordinates = [];\n\t\t\t\t\n\t\t\t\tlet min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\t\t\tfor(let i = 0; i < pc.length; i++){\n\t\t\t\t\tlet [long, lat] = pc[i];\n\t\t\t\t\tlet pos = transform.forward([long, lat]);\n\t\t\t\t\t\n\t\t\t\t\tmin.x = Math.min(min.x, pos[0]);\n\t\t\t\t\tmin.y = Math.min(min.y, pos[1]);\n\t\t\t\t\tmin.z = Math.min(min.z, 20);\n\t\t\t\t\t\n\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t\tif(i > 0 && i < pc.length - 1){\n\t\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor(let i = 0; i < coordinates.length; i += 3){\n\t\t\t\t\tcoordinates[i+0] -= min.x;\n\t\t\t\t\tcoordinates[i+1] -= min.y;\n\t\t\t\t\tcoordinates[i+2] -= min.z;\n\t\t\t\t}\n\n\t\t\t\tconst lineGeometry = new THREE.LineGeometry();\n\t\t\t\tlineGeometry.setPositions( coordinates );\n\n\t\t\t\tconst line = new THREE.Line2( lineGeometry, matLine );\n\t\t\t\tline.computeLineDistances();\n\t\t\t\tline.scale.set( 1, 1, 1 );\n\t\t\t\tline.position.copy(min);\n\t\t\t\t\n\t\t\t\treturn line;\n\t\t\t}\n\t\t}else{\n\t\t\tconsole.log(\"unhandled feature: \", feature);\n\t\t}\n\t}\n\n\tasync loadShapefileFeatures(file){\n\t\tlet features = [];\n\n\t\tlet source = await shapefile.open(file);\n\n\t\twhile(true){\n\t\t\tlet result = await source.read();\n\n\t\t\tif (result.done) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (result.value && result.value.type === 'Feature' && result.value.geometry !== undefined) {\n\t\t\t\tfeatures.push(result.value);\n\t\t\t}\n\t\t}\n\n\t\treturn features;\n\t}\n\n};\n\n","\nimport {Utils} from \"../utils.js\";\n\nconst defaultColors = {\n\t\"landuse\": [0.5, 0.5, 0.5],\n\t\"natural\": [0.0, 1.0, 0.0],\n\t\"places\": [1.0, 0.0, 1.0],\n\t\"points\": [0.0, 1.0, 1.0],\n\t\"roads\": [1.0, 1.0, 0.0],\n\t\"waterways\": [0.0, 0.0, 1.0],\n\t\"default\": [0.9, 0.6, 0.1],\n};\n\nfunction getColor(feature){\n\tlet color = defaultColors[feature];\n\n\tif(!color){\n\t\tcolor = defaultColors[\"default\"];\n\t}\n\n\treturn color;\n}\n\nexport class Geopackage{\n\tconstructor(){\n\t\tthis.path = null;\n\t\tthis.node = null;\n\t}\n};\n\nexport class GeoPackageLoader{\n\n\tconstructor(){\n\n\t}\n\n\tstatic async loadUrl(url, params){\n\n\t\tawait Promise.all([\n\t\t\tUtils.loadScript(`${Potree.scriptPath}/lazylibs/geopackage/geopackage.js`),\n\t\t\tUtils.loadScript(`${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.js`),\n\t\t]);\n\t\t\n\t\tconst result = await fetch(url);\n\t\tconst buffer = await result.arrayBuffer();\n\n\t\tparams = params || {};\n\n\t\tparams.source = url;\n\n\t\treturn GeoPackageLoader.loadBuffer(buffer, params);\n\t}\n\n\tstatic async loadBuffer(buffer, params){\n\n\t\tawait Promise.all([\n\t\t\tUtils.loadScript(`${Potree.scriptPath}/lazylibs/geopackage/geopackage.js`),\n\t\t\tUtils.loadScript(`${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.js`),\n\t\t]);\n\n\t\tparams = params || {};\n\n\t\tconst resolver = async (resolve) => {\n\t\t\t\n\t\t\tlet transform = params.transform;\n\t\t\tif(!transform){\n\t\t\t\ttransform = {forward: (arg) => arg};\n\t\t\t}\n\n\t\t\tconst wasmPath = `${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.wasm`;\n\t\t\tconst SQL = await initSqlJs({ locateFile: filename => wasmPath});\n\n\t\t\tconst u8 = new Uint8Array(buffer);\n\n\t\t\tconst data = await geopackage.open(u8);\n\t\t\twindow.data = data;\n\n\t\t\tconst geopackageNode = new THREE.Object3D();\n\t\t\tgeopackageNode.name = params.source;\n\t\t\tgeopackageNode.potree = {\n\t\t\t\tsource: params.source,\n\t\t\t};\n\n\t\t\tconst geo = new Geopackage();\n\t\t\tgeo.path = params.source;\n\t\t\tgeo.node = geopackageNode;\n\n\t\t\tconst tables = data.getTables();\n\n\t\t\tfor(const table of tables.features){\n\t\t\t\tconst dao = data.getFeatureDao(table);\n\n\t\t\t\tlet boundingBox = dao.getBoundingBox();\n\t\t\t\tboundingBox = boundingBox.projectBoundingBox(dao.projection, 'EPSG:4326');\n\t\t\t\tconst geoJson = data.queryForGeoJSONFeaturesInTable(table, boundingBox);\n\n\t\t\t\tconst matLine = new THREE.LineMaterial( {\n\t\t\t\t\tcolor: new THREE.Color().setRGB(...getColor(table)),\n\t\t\t\t\tlinewidth: 2, \n\t\t\t\t\tresolution: new THREE.Vector2(1000, 1000),\n\t\t\t\t\tdashed: false\n\t\t\t\t} );\n\n\t\t\t\tconst node = new THREE.Object3D();\n\t\t\t\tnode.name = table;\n\t\t\t\tgeo.node.add(node);\n\n\t\t\t\tfor(const [index, feature] of Object.entries(geoJson)){\n\t\t\t\t\t//const featureNode = GeoPackageLoader.featureToSceneNode(feature, matLine, transform);\n\t\t\t\t\tconst featureNode = GeoPackageLoader.featureToSceneNode(feature, matLine, dao.projection, transform);\n\t\t\t\t\tnode.add(featureNode);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresolve(geo);\n\t\t}\n\n\t\treturn new Promise(resolver);\n\t}\n\n\tstatic featureToSceneNode(feature, matLine, geopackageProjection, transform){\n\t\tlet geometry = feature.geometry;\n\t\t\n\t\tlet color = new THREE.Color(1, 1, 1);\n\t\t\n\t\tif(feature.geometry.type === \"Point\"){\n\t\t\tlet sg = new THREE.SphereGeometry(1, 18, 18);\n\t\t\tlet sm = new THREE.MeshNormalMaterial();\n\t\t\tlet s = new THREE.Mesh(sg, sm);\n\t\t\t\n\t\t\tlet [long, lat] = geometry.coordinates;\n\t\t\tlet pos = transform.forward(geopackageProjection.forward([long, lat]));\n\t\t\t\n\t\t\ts.position.set(...pos, 20);\n\t\t\t\n\t\t\ts.scale.set(10, 10, 10);\n\t\t\t\n\t\t\treturn s;\n\t\t}else if(geometry.type === \"LineString\"){\n\t\t\tlet coordinates = [];\n\t\t\t\n\t\t\tlet min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\t\tfor(let i = 0; i < geometry.coordinates.length; i++){\n\t\t\t\tlet [long, lat] = geometry.coordinates[i];\n\t\t\t\tlet pos = transform.forward(geopackageProjection.forward([long, lat]));\n\t\t\t\t\n\t\t\t\tmin.x = Math.min(min.x, pos[0]);\n\t\t\t\tmin.y = Math.min(min.y, pos[1]);\n\t\t\t\tmin.z = Math.min(min.z, 20);\n\t\t\t\t\n\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\tif(i > 0 && i < geometry.coordinates.length - 1){\n\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfor(let i = 0; i < coordinates.length; i += 3){\n\t\t\t\tcoordinates[i+0] -= min.x;\n\t\t\t\tcoordinates[i+1] -= min.y;\n\t\t\t\tcoordinates[i+2] -= min.z;\n\t\t\t}\n\t\t\t\n\t\t\tconst lineGeometry = new THREE.LineGeometry();\n\t\t\tlineGeometry.setPositions( coordinates );\n\n\t\t\tconst line = new THREE.Line2( lineGeometry, matLine );\n\t\t\tline.computeLineDistances();\n\t\t\tline.scale.set( 1, 1, 1 );\n\t\t\tline.position.copy(min);\n\t\t\t\n\t\t\treturn line;\n\t\t}else if(geometry.type === \"Polygon\"){\n\t\t\tfor(let pc of geometry.coordinates){\n\t\t\t\tlet coordinates = [];\n\t\t\t\t\n\t\t\t\tlet min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\t\t\tfor(let i = 0; i < pc.length; i++){\n\t\t\t\t\tlet [long, lat] = pc[i];\n\t\t\t\t\t\n\t\t\t\t\tlet pos = transform.forward(geopackageProjection.forward([long, lat]));\n\t\t\t\t\t\n\t\t\t\t\tmin.x = Math.min(min.x, pos[0]);\n\t\t\t\t\tmin.y = Math.min(min.y, pos[1]);\n\t\t\t\t\tmin.z = Math.min(min.z, 20);\n\t\t\t\t\t\n\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t\tif(i > 0 && i < pc.length - 1){\n\t\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor(let i = 0; i < coordinates.length; i += 3){\n\t\t\t\t\tcoordinates[i+0] -= min.x;\n\t\t\t\t\tcoordinates[i+1] -= min.y;\n\t\t\t\t\tcoordinates[i+2] -= min.z;\n\t\t\t\t}\n\n\t\t\t\tconst lineGeometry = new THREE.LineGeometry();\n\t\t\t\tlineGeometry.setPositions( coordinates );\n\n\t\t\t\tconst line = new THREE.Line2( lineGeometry, matLine );\n\t\t\t\tline.computeLineDistances();\n\t\t\t\tline.scale.set( 1, 1, 1 );\n\t\t\t\tline.position.copy(min);\n\t\t\t\t\n\t\t\t\treturn line;\n\t\t\t}\n\t\t}else{\n\t\t\tconsole.log(\"unhandled feature: \", feature);\n\t\t}\n\t}\n\n};","\n\nexport class ClipVolume extends THREE.Object3D{\n\t\n\tconstructor(args){\n\t\tsuper();\n\t\t\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\t\tthis.name = \"clip_volume_\" + this.constructor.counter;\n\n\t\tlet alpha = args.alpha || 0;\n\t\tlet beta = args.beta || 0;\n\t\tlet gamma = args.gamma || 0;\n\n\t\tthis.rotation.x = alpha;\n\t\tthis.rotation.y = beta;\n\t\tthis.rotation.z = gamma;\n\n\t\tthis.clipOffset = 0.001;\n\t\tthis.clipRotOffset = 1;\n\t\t\t\t\n\t\tlet boxGeometry = new THREE.BoxGeometry(1, 1, 1);\n\t\tboxGeometry.computeBoundingBox();\n\t\t\n\t\tlet boxFrameGeometry = new THREE.Geometry();\n\t\t{\t\t\t\n\t\t\t// bottom\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\t// top\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\t// sides\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\n\t\t\tboxFrameGeometry.colors.push(new THREE.Vector3(1, 1, 1));\n\t\t}\n\n\t\tlet planeFrameGeometry = new THREE.Geometry();\n\t\t{\t\t\t\t\t\t\n\t\t\t// middle line\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.0));\n\t\t}\n\n\t\tthis.dimension = new THREE.Vector3(1, 1, 1);\n\t\tthis.material = new THREE.MeshBasicMaterial( {\n\t\t\tcolor: 0x00ff00, \n\t\t\ttransparent: true, \n\t\t\topacity: 0.3,\n\t\t\tdepthTest: true, \n\t\t\tdepthWrite: false} );\n\t\tthis.box = new THREE.Mesh(boxGeometry, this.material);\n\t\tthis.box.geometry.computeBoundingBox();\n\t\tthis.boundingBox = this.box.geometry.boundingBox;\n\t\tthis.add(this.box);\n\t\t\n\t\tthis.frame = new THREE.LineSegments( boxFrameGeometry, new THREE.LineBasicMaterial({color: 0x000000}));\n\t\tthis.add(this.frame);\n\t\tthis.planeFrame = new THREE.LineSegments( planeFrameGeometry, new THREE.LineBasicMaterial({color: 0xff0000}));\n\t\tthis.add(this.planeFrame);\n\n\t\t// set default thickness\n\t\tthis.setScaleZ(0.1);\n\n\t\t// create local coordinate system\n\t\tlet createArrow = (name, direction, color) => {\n\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: color, \n\t\t\t\tdepthTest: false, \n\t\t\t\tdepthWrite: false});\n\t\t\t\t\n\t\t\tlet shaftGeometry = new THREE.Geometry();\n\t\t\tshaftGeometry.vertices.push(new THREE.Vector3(0, 0, 0));\n\t\t\tshaftGeometry.vertices.push(new THREE.Vector3(0, 1, 0));\n\t\t\t\n\t\t\tlet shaftMaterial = new THREE.LineBasicMaterial({\n\t\t\t\tcolor: color, \n\t\t\t\tdepthTest: false, \n\t\t\t\tdepthWrite: false,\n\t\t\t\ttransparent: true\n\t\t\t\t});\n\t\t\tlet shaft = new THREE.Line(shaftGeometry, shaftMaterial);\n\t\t\tshaft.name = name + \"_shaft\";\n\t\t\t\n\t\t\tlet headGeometry = new THREE.CylinderGeometry(0, 0.04, 0.1, 10, 1, false);\n\t\t\tlet headMaterial = material;\n\t\t\tlet head = new THREE.Mesh(headGeometry, headMaterial);\n\t\t\thead.name = name + \"_head\";\n\t\t\thead.position.y = 1;\n\t\t\t\n\t\t\tlet arrow = new THREE.Object3D();\n\t\t\tarrow.name = name;\n\t\t\tarrow.add(shaft);\n\t\t\tarrow.add(head);\n\n\t\t\treturn arrow;\n\t\t};\n\t\t\n\t\tthis.arrowX = createArrow(\"arrow_x\", new THREE.Vector3(1, 0, 0), 0xFF0000);\n\t\tthis.arrowY = createArrow(\"arrow_y\", new THREE.Vector3(0, 1, 0), 0x00FF00);\n\t\tthis.arrowZ = createArrow(\"arrow_z\", new THREE.Vector3(0, 0, 1), 0x0000FF);\n\t\t\n\t\tthis.arrowX.rotation.z = -Math.PI / 2;\n\t\tthis.arrowZ.rotation.x = Math.PI / 2;\n\n\t\tthis.arrowX.visible = false;\n\t\tthis.arrowY.visible = false;\n\t\tthis.arrowZ.visible = false;\n\n\t\tthis.add(this.arrowX);\n\t\tthis.add(this.arrowY);\n\t\tthis.add(this.arrowZ);\n\t\t\n\t\t{ // event listeners\n\t\t\tthis.addEventListener(\"ui_select\", e => { \n\t\t\t\tthis.arrowX.visible = true;\n\t\t\t\tthis.arrowY.visible = true;\n\t\t\t\tthis.arrowZ.visible = true; \n\t\t\t});\n\t\t\tthis.addEventListener(\"ui_deselect\", e => {\n\t\t\t\tthis.arrowX.visible = false;\n\t\t\t\tthis.arrowY.visible = false;\n\t\t\t\tthis.arrowZ.visible = false; \t\t\t\t\n\t\t\t});\n\t\t\tthis.addEventListener(\"select\", e => { \n\t\t\t\tlet scene_header = $(\"#\" + this.name + \" .scene_header\");\n\t\t\t\tif(!scene_header.next().is(\":visible\")) {\n\t\t\t\t\tscene_header.click();\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.addEventListener(\"deselect\", e => { \n\t\t\t\tlet scene_header = $(\"#\" + this.name + \" .scene_header\");\n\t\t\t\tif(scene_header.next().is(\":visible\")) {\n\t\t\t\t\tscene_header.click();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tthis.update();\n\t};\n\n\tsetClipOffset(offset) {\t\t\n\t\tthis.clipOffset = offset;\t\n\t}\n\n\tsetClipRotOffset(offset) {\t\t\n\t\tthis.clipRotOffset = offset;\t\t\n\t}\n\n\tsetScaleX(x) {\n\t\tthis.box.scale.x = x;\n\t\tthis.frame.scale.x = x;\n\t\tthis.planeFrame.scale.x = x;\t\t\t\n\t}\n\n\tsetScaleY(y) {\n\t\tthis.box.scale.y = y;\n\t\tthis.frame.scale.y = y;\n\t\tthis.planeFrame.scale.y = y;\t\t\n\t}\n\n\tsetScaleZ(z) {\n\t\tthis.box.scale.z = z;\n\t\tthis.frame.scale.z = z;\n\t\tthis.planeFrame.scale.z = z;\t\t\n\t}\n\n\toffset(args) {\n\t\tlet cs = args.cs || null;\n\t\tlet axis = args.axis || null;\n\t\tlet dir = args.dir || null;\n\n\t\tif(!cs || !axis || !dir) return;\n\n\t\tif(axis === \"x\") {\n\t\t\tif(cs === \"local\") {\n\t\t\t\tthis.position.add(this.localX.clone().multiplyScalar(dir * this.clipOffset));\n\t\t\t} else if(cs === \"global\") {\n\t\t\t\tthis.position.x = this.position.x + dir * this.clipOffset;\n\t\t\t}\n\t\t}else if(axis === \"y\") {\n\t\t\tif(cs === \"local\") {\n\t\t\t\tthis.position.add(this.localY.clone().multiplyScalar(dir * this.clipOffset));\n\t\t\t} else if(cs === \"global\") {\n\t\t\t\tthis.position.y = this.position.y + dir * this.clipOffset;\n\t\t\t}\n\t\t}else if(axis === \"z\") {\n\t\t\tif(cs === \"local\") {\n\t\t\t\tthis.position.add(this.localZ.clone().multiplyScalar(dir * this.clipOffset));\n\t\t\t} else if(cs === \"global\") {\n\t\t\t\tthis.position.z = this.position.z + dir * this.clipOffset;\n\t\t\t}\n\t\t}\n\n\t\tthis.dispatchEvent({\"type\": \"clip_volume_changed\", \"viewer\": viewer, \"volume\": this});\n\t}\t\n\n\trotate(args) {\n\t\tlet cs = args.cs || null;\n\t\tlet axis = args.axis || null;\n\t\tlet dir = args.dir || null;\n\n\t\tif(!cs || !axis || !dir) return;\n\n\t\tif(cs === \"local\") {\n\t\t\tif(axis === \"x\") {\n\t\t\t\tthis.rotateOnAxis(new THREE.Vector3(1, 0, 0), dir * this.clipRotOffset * Math.PI / 180);\n\t\t\t} else if(axis === \"y\") {\n\t\t\t\tthis.rotateOnAxis(new THREE.Vector3(0, 1, 0), dir * this.clipRotOffset * Math.PI / 180);\n\t\t\t} else if(axis === \"z\") {\n\t\t\t\tthis.rotateOnAxis(new THREE.Vector3(0, 0, 1), dir * this.clipRotOffset * Math.PI / 180);\n\t\t\t}\n\t\t} else if(cs === \"global\") {\n\t\t\tlet rotaxis = new THREE.Vector4(1, 0, 0, 0);\t\n\t\t\tif(axis === \"y\") {\n\t\t\t\trotaxis = new THREE.Vector4(0, 1, 0, 0);\n\t\t\t} else if(axis === \"z\") {\n\t\t\t\trotaxis = new THREE.Vector4(0, 0, 1, 0);\n\t\t\t}\n\t\t\tthis.updateMatrixWorld();\n\t\t\tlet invM = new THREE.Matrix4().getInverse(this.matrixWorld);\n\t\t\trotaxis = rotaxis.applyMatrix4(invM).normalize();\n\t\t\trotaxis = new THREE.Vector3(rotaxis.x, rotaxis.y, rotaxis.z);\n\t\t\tthis.rotateOnAxis(rotaxis, dir * this.clipRotOffset * Math.PI / 180);\n\t\t}\n\n\t\tthis.updateLocalSystem();\n\n\t\tthis.dispatchEvent({\"type\": \"clip_volume_changed\", \"viewer\": viewer, \"volume\": this});\n\t}\t\n\n\tupdate(){\n\t\tthis.boundingBox = this.box.geometry.boundingBox;\n\t\tthis.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\t\n\t\tthis.box.visible = false;\n\n\t\tthis.updateLocalSystem();\n\t};\n\n\tupdateLocalSystem() {\t\t\n\t\t// extract local coordinate axes\n\t\tlet rotQuat = this.getWorldQuaternion();\n\t\tthis.localX = new THREE.Vector3(1, 0, 0).applyQuaternion(rotQuat).normalize();\n\t\tthis.localY = new THREE.Vector3(0, 1, 0).applyQuaternion(rotQuat).normalize();\n\t\tthis.localZ = new THREE.Vector3(0, 0, 1).applyQuaternion(rotQuat).normalize();\n\t}\n\t\n\traycast(raycaster, intersects){\n\t\t\n\t\tlet is = [];\n\t\tthis.box.raycast(raycaster, is);\n\t\n\t\tif(is.length > 0){\n\t\t\tlet I = is[0];\n\t\t\tintersects.push({\n\t\t\t\tdistance: I.distance,\n\t\t\t\tobject: this,\n\t\t\t\tpoint: I.point.clone()\n\t\t\t});\n\t\t}\n\t};\n};\n","\nimport {ClipVolume} from \"./ClipVolume.js\";\nimport {PolygonClipVolume} from \"./PolygonClipVolume.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\n\nexport class ClippingTool extends EventDispatcher{\n\n\tconstructor(viewer){\n\t\tsuper(); \n\n\t\tthis.viewer = viewer;\n\n\t\tthis.maxPolygonVertices = 8; \n\t\t\n\t\tthis.addEventListener(\"start_inserting_clipping_volume\", e => {\n\t\t\tthis.viewer.dispatchEvent({\n\t\t\t\ttype: \"cancel_insertions\"\n\t\t\t});\n\t\t});\n\n\t\tthis.sceneMarker = new THREE.Scene();\n\t\tthis.sceneVolume = new THREE.Scene();\n\t\tthis.sceneVolume.name = \"scene_clip_volume\";\n\t\tthis.viewer.inputHandler.registerInteractiveScene(this.sceneVolume);\n\n\t\tthis.onRemove = e => {\n\t\t\tthis.sceneVolume.remove(e.volume);\n\t\t};\n\t\t\n\t\tthis.onAdd = e => {\n\t\t\tthis.sceneVolume.add(e.volume);\n\t\t};\n\t\t\n\t\tthis.viewer.inputHandler.addEventListener(\"delete\", e => {\n\t\t\tlet volumes = e.selection.filter(e => (e instanceof ClipVolume));\n\t\t\tvolumes.forEach(e => this.viewer.scene.removeClipVolume(e));\n\t\t\tlet polyVolumes = e.selection.filter(e => (e instanceof PolygonClipVolume));\n\t\t\tpolyVolumes.forEach(e => this.viewer.scene.removePolygonClipVolume(e));\n\t\t});\n\t}\n\n\tsetScene(scene){\n\t\tif(this.scene === scene){\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(this.scene){\n\t\t\tthis.scene.removeEventListeners(\"clip_volume_added\", this.onAdd);\n\t\t\tthis.scene.removeEventListeners(\"clip_volume_removed\", this.onRemove);\n\t\t\tthis.scene.removeEventListeners(\"polygon_clip_volume_added\", this.onAdd);\n\t\t\tthis.scene.removeEventListeners(\"polygon_clip_volume_removed\", this.onRemove);\n\t\t}\n\t\t\n\t\tthis.scene = scene;\n\t\t\n\t\tthis.scene.addEventListener(\"clip_volume_added\", this.onAdd);\n\t\tthis.scene.addEventListener(\"clip_volume_removed\", this.onRemove);\n\t\tthis.scene.addEventListener(\"polygon_clip_volume_added\", this.onAdd);\n\t\tthis.scene.addEventListener(\"polygon_clip_volume_removed\", this.onRemove);\n\t}\n\n\tstartInsertion(args = {}) {\t\n\t\tlet type = args.type || null;\n\n\t\tif(!type) return null;\n\n\t\tlet domElement = this.viewer.renderer.domElement;\n\t\tlet canvasSize = this.viewer.renderer.getSize(new THREE.Vector2());\n\n\t\tlet svg = $(`\n\t\t\n\n\t\t\t\n\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\n\t\t\t\n\t\t`);\n\t\t$(domElement.parentElement).append(svg);\n\n\t\tlet polyClipVol = new PolygonClipVolume(this.viewer.scene.getActiveCamera().clone());\n\n\t\tthis.dispatchEvent({\"type\": \"start_inserting_clipping_volume\"});\n\n\t\tthis.viewer.scene.addPolygonClipVolume(polyClipVol);\n\t\tthis.sceneMarker.add(polyClipVol);\n\n\t\tlet cancel = {\n\t\t\tcallback: null\n\t\t};\n\n\t\tlet insertionCallback = (e) => {\n\t\t\tif(e.button === THREE.MOUSE.LEFT){\n\t\t\t\t\n\t\t\t\tpolyClipVol.addMarker();\n\n\t\t\t\t// SVC Screen Line\n\t\t\t\tsvg.find(\"polyline\").each((index, target) => {\n\t\t\t\t\tlet newPoint = svg[0].createSVGPoint();\n\t\t\t\t\tnewPoint.x = e.offsetX;\n\t\t\t\t\tnewPoint.y = e.offsetY;\n\t\t\t\t\tlet polyline = target.points.appendItem(newPoint);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tif(polyClipVol.markers.length > this.maxPolygonVertices){\n\t\t\t\t\tcancel.callback();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.viewer.inputHandler.startDragging(\n\t\t\t\t\tpolyClipVol.markers[polyClipVol.markers.length - 1]);\n\t\t\t}else if(e.button === THREE.MOUSE.RIGHT){\n\t\t\t\tcancel.callback(e);\n\t\t\t}\n\t\t};\n\t\t\n\t\tcancel.callback = e => {\n\n\t\t\t//let first = svg.find(\"polyline\")[0].points[0];\n\t\t\t//svg.find(\"polyline\").each((index, target) => {\n\t\t\t//\tlet newPoint = svg[0].createSVGPoint();\n\t\t\t//\tnewPoint.x = first.x;\n\t\t\t//\tnewPoint.y = first.y;\n\t\t\t//\tlet polyline = target.points.appendItem(newPoint);\n\t\t\t//});\n\t\t\tsvg.remove();\n\n\t\t\tif(polyClipVol.markers.length > 3) {\n\t\t\t\tpolyClipVol.removeLastMarker();\n\t\t\t\tpolyClipVol.initialized = true;\t\n\t\t\t} else {\n\t\t\t\tthis.viewer.scene.removePolygonClipVolume(polyClipVol);\n\t\t\t}\n\n\t\t\tthis.viewer.renderer.domElement.removeEventListener(\"mouseup\", insertionCallback, true);\n\t\t\tthis.viewer.removeEventListener(\"cancel_insertions\", cancel.callback);\n\t\t\tthis.viewer.inputHandler.enabled = true;\n\t\t};\n\t\t\n\t\tthis.viewer.addEventListener(\"cancel_insertions\", cancel.callback);\n\t\tthis.viewer.renderer.domElement.addEventListener(\"mouseup\", insertionCallback , true);\n\t\tthis.viewer.inputHandler.enabled = false;\n\t\t\n\t\tpolyClipVol.addMarker();\n\t\tthis.viewer.inputHandler.startDragging(\n\t\t\tpolyClipVol.markers[polyClipVol.markers.length - 1]);\n\n\t\treturn polyClipVol;\n\t}\n\n\tupdate() {\n\n\t}\n};","\nimport {Enum} from \"../Enum.js\";\n\nvar GeoTIFF = (function (exports) {\n'use strict';\n\nconst Endianness = new Enum({\n\tLITTLE: \"II\",\n\tBIG: \"MM\",\n});\n\nconst Type = new Enum({\n\tBYTE: {value: 1, bytes: 1},\n\tASCII: {value: 2, bytes: 1},\n\tSHORT: {value: 3, bytes: 2},\n\tLONG: {value: 4, bytes: 4},\n\tRATIONAL: {value: 5, bytes: 8},\n\tSBYTE: {value: 6, bytes: 1},\n\tUNDEFINED: {value: 7, bytes: 1},\n\tSSHORT: {value: 8, bytes: 2},\n\tSLONG: {value: 9, bytes: 4},\n\tSRATIONAL: {value: 10, bytes: 8},\n\tFLOAT: {value: 11, bytes: 4},\n\tDOUBLE: {value: 12, bytes: 8},\n});\n\nconst Tag = new Enum({\n\tIMAGE_WIDTH: 256,\n\tIMAGE_HEIGHT: 257,\n\tBITS_PER_SAMPLE: 258,\n\tCOMPRESSION: 259,\n\tPHOTOMETRIC_INTERPRETATION: 262,\n\tSTRIP_OFFSETS: 273,\n\tORIENTATION: 274,\n\tSAMPLES_PER_PIXEL: 277,\n\tROWS_PER_STRIP: 278,\n\tSTRIP_BYTE_COUNTS: 279,\n\tX_RESOLUTION: 282,\n\tY_RESOLUTION: 283,\n\tPLANAR_CONFIGURATION: 284,\n\tRESOLUTION_UNIT: 296,\n\tSOFTWARE: 305,\n\tCOLOR_MAP: 320,\n\tSAMPLE_FORMAT: 339,\n\tMODEL_PIXEL_SCALE: 33550, // [GeoTIFF] TYPE: double N: 3\n\tMODEL_TIEPOINT: 33922, // [GeoTIFF] TYPE: double N: 6 * NUM_TIEPOINTS\n\tGEO_KEY_DIRECTORY: 34735, // [GeoTIFF] TYPE: short N: >= 4\n\tGEO_DOUBLE_PARAMS: 34736, // [GeoTIFF] TYPE: short N: variable\n\tGEO_ASCII_PARAMS: 34737, // [GeoTIFF] TYPE: ascii N: variable\n});\n\nconst typeMapping = new Map([\n\t[Type.BYTE, Uint8Array],\n\t[Type.ASCII, Uint8Array],\n\t[Type.SHORT, Uint16Array],\n\t[Type.LONG, Uint32Array],\n\t[Type.RATIONAL, Uint32Array],\n\t[Type.SBYTE, Int8Array],\n\t[Type.UNDEFINED, Uint8Array],\n\t[Type.SSHORT, Int16Array],\n\t[Type.SLONG, Int32Array],\n\t[Type.SRATIONAL, Int32Array],\n\t[Type.FLOAT, Float32Array],\n\t[Type.DOUBLE, Float64Array],\n]);\n\nclass IFDEntry{\n\n\tconstructor(tag, type, count, offset, value){\n\t\tthis.tag = tag;\n\t\tthis.type = type;\n\t\tthis.count = count;\n\t\tthis.offset = offset;\n\t\tthis.value = value;\n\t}\n\n}\n\nclass Image{\n\n\tconstructor(){\n\t\tthis.width = 0;\n\t\tthis.height = 0;\n\t\tthis.buffer = null;\n\t\tthis.metadata = [];\n\t}\n\n}\n\nclass Reader{\n\n\tconstructor(){\n\n\t}\n\n\tstatic read(data){\n\n\t\tlet endiannessTag = String.fromCharCode(...Array.from(data.slice(0, 2)));\n\t\tlet endianness = Endianness.fromValue(endiannessTag);\n\n\t\tlet tiffCheckTag = data.readUInt8(2);\n\n\t\tif(tiffCheckTag !== 42){\n\t\t\tthrow new Error(\"not a valid tiff file\");\n\t\t}\n\n\t\tlet offsetToFirstIFD = data.readUInt32LE(4);\n\n\t\tconsole.log(\"offsetToFirstIFD\", offsetToFirstIFD);\n\n\t\tlet ifds = [];\n\t\tlet IFDsRead = false;\n\t\tlet currentIFDOffset = offsetToFirstIFD;\n\t\tlet i = 0;\n\t\twhile(IFDsRead || i < 100){\n\n\t\t\tconsole.log(\"currentIFDOffset\", currentIFDOffset);\n\t\t\tlet numEntries = data.readUInt16LE(currentIFDOffset);\n\t\t\tlet nextIFDOffset = data.readUInt32LE(currentIFDOffset + 2 + numEntries * 12);\n\n\t\t\tconsole.log(\"next offset: \", currentIFDOffset + 2 + numEntries * 12);\n\n\t\t\tlet entryBuffer = data.slice(currentIFDOffset + 2, currentIFDOffset + 2 + 12 * numEntries);\n\n\t\t\tfor(let i = 0; i < numEntries; i++){\n\t\t\t\tlet tag = Tag.fromValue(entryBuffer.readUInt16LE(i * 12));\n\t\t\t\tlet type = Type.fromValue(entryBuffer.readUInt16LE(i * 12 + 2));\n\t\t\t\tlet count = entryBuffer.readUInt32LE(i * 12 + 4);\n\t\t\t\tlet offsetOrValue = entryBuffer.readUInt32LE(i * 12 + 8);\n\t\t\t\tlet valueBytes = type.bytes * count;\n\n\t\t\t\tlet value;\n\t\t\t\tif(valueBytes <= 4){\n\t\t\t\t\tvalue = offsetOrValue;\n\t\t\t\t}else{\n\t\t\t\t\tlet valueBuffer = new Uint8Array(valueBytes);\n\t\t\t\t\tvalueBuffer.set(data.slice(offsetOrValue, offsetOrValue + valueBytes));\n\t\t\t\t\t\n\t\t\t\t\tlet ArrayType = typeMapping.get(type);\n\n\t\t\t\t\tvalue = new ArrayType(valueBuffer.buffer);\n\n\t\t\t\t\tif(type === Type.ASCII){\n\t\t\t\t\t\tvalue = String.fromCharCode(...value);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet ifd = new IFDEntry(tag, type, count, offsetOrValue, value);\n\n\t\t\t\tifds.push(ifd);\n\t\t\t}\n\n\t\t\tconsole.log(\"nextIFDOffset\", nextIFDOffset);\n\n\t\t\tif(nextIFDOffset === 0){\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcurrentIFDOffset = nextIFDOffset;\n\t\t\ti++;\n\t\t}\n\n\t\tlet ifdForTag = (tag) => {\n\t\t\tfor(let entry of ifds){\n\t\t\t\tif(entry.tag === tag){\n\t\t\t\t\treturn entry;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\tlet width = ifdForTag(Tag.IMAGE_WIDTH, ifds).value;\n\t\tlet height = ifdForTag(Tag.IMAGE_HEIGHT, ifds).value;\n\t\tlet compression = ifdForTag(Tag.COMPRESSION, ifds).value;\n\t\tlet rowsPerStrip = ifdForTag(Tag.ROWS_PER_STRIP, ifds).value; \n\t\tlet ifdStripOffsets = ifdForTag(Tag.STRIP_OFFSETS, ifds);\n\t\tlet ifdStripByteCounts = ifdForTag(Tag.STRIP_BYTE_COUNTS, ifds);\n\n\t\tlet numStrips = Math.ceil(height / rowsPerStrip);\n\n\t\tlet stripByteCounts = [];\n\t\tfor(let i = 0; i < ifdStripByteCounts.count; i++){\n\t\t\tlet type = ifdStripByteCounts.type;\n\t\t\tlet offset = ifdStripByteCounts.offset + i * type.bytes;\n\n\t\t\tlet value;\n\t\t\tif(type === Type.SHORT){\n\t\t\t\tvalue = data.readUInt16LE(offset);\n\t\t\t}else if(type === Type.LONG){\n\t\t\t\tvalue = data.readUInt32LE(offset);\n\t\t\t}\n\n\t\t\tstripByteCounts.push(value);\n\t\t}\n\n\t\tlet stripOffsets = [];\n\t\tfor(let i = 0; i < ifdStripOffsets.count; i++){\n\t\t\tlet type = ifdStripOffsets.type;\n\t\t\tlet offset = ifdStripOffsets.offset + i * type.bytes;\n\n\t\t\tlet value;\n\t\t\tif(type === Type.SHORT){\n\t\t\t\tvalue = data.readUInt16LE(offset);\n\t\t\t}else if(type === Type.LONG){\n\t\t\t\tvalue = data.readUInt32LE(offset);\n\t\t\t}\n\n\t\t\tstripOffsets.push(value);\n\t\t}\n\n\t\tlet imageBuffer = new Uint8Array(width * height * 3);\n\t\t\n\t\tlet linesProcessed = 0;\n\t\tfor(let i = 0; i < numStrips; i++){\n\t\t\tlet stripOffset = stripOffsets[i];\n\t\t\tlet stripBytes = stripByteCounts[i];\n\t\t\tlet stripData = data.slice(stripOffset, stripOffset + stripBytes);\n\t\t\tlet lineBytes = width * 3;\n\t\t\tfor(let y = 0; y < rowsPerStrip; y++){\n\t\t\t\tlet line = stripData.slice(y * lineBytes, y * lineBytes + lineBytes);\n\t\t\t\timageBuffer.set(line, linesProcessed * lineBytes);\n\t\t\n\t\t\t\tif(line.length === lineBytes){\n\t\t\t\t\tlinesProcessed++;\n\t\t\t\t}else{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(`width: ${width}`);\n\t\tconsole.log(`height: ${height}`);\n\t\tconsole.log(`numStrips: ${numStrips}`);\n\t\tconsole.log(\"stripByteCounts\", stripByteCounts.join(\", \"));\n\t\tconsole.log(\"stripOffsets\", stripOffsets.join(\", \"));\n\n\t\tlet image = new Image();\n\t\timage.width = width;\n\t\timage.height = height;\n\t\timage.buffer = imageBuffer;\n\t\timage.metadata = ifds;\n\n\t\treturn image;\n\t}\n\n}\n\n\nclass Exporter{\n\n\tconstructor(){\n\n\t}\n\n\tstatic toTiffBuffer(image, params = {}){\n\n\t\tlet offsetToFirstIFD = 8;\n\t\t\n\t\tlet headerBuffer = new Uint8Array([0x49, 0x49, 42, 0, offsetToFirstIFD, 0, 0, 0]);\n\n\t\tlet [width, height] = [image.width, image.height];\n\n\t\tlet ifds = [\n\t\t\tnew IFDEntry(Tag.IMAGE_WIDTH, Type.SHORT, 1, null, width),\n\t\t\tnew IFDEntry(Tag.IMAGE_HEIGHT, Type.SHORT, 1, null, height),\n\t\t\tnew IFDEntry(Tag.BITS_PER_SAMPLE, Type.SHORT, 4, null, new Uint16Array([8, 8, 8, 8])),\n\t\t\tnew IFDEntry(Tag.COMPRESSION, Type.SHORT, 1, null, 1),\n\t\t\tnew IFDEntry(Tag.PHOTOMETRIC_INTERPRETATION, Type.SHORT, 1, null, 2),\n\t\t\tnew IFDEntry(Tag.ORIENTATION, Type.SHORT, 1, null, 1),\n\t\t\tnew IFDEntry(Tag.SAMPLES_PER_PIXEL, Type.SHORT, 1, null, 4),\n\t\t\tnew IFDEntry(Tag.ROWS_PER_STRIP, Type.LONG, 1, null, height),\n\t\t\tnew IFDEntry(Tag.STRIP_BYTE_COUNTS, Type.LONG, 1, null, width * height * 3),\n\t\t\tnew IFDEntry(Tag.PLANAR_CONFIGURATION, Type.SHORT, 1, null, 1),\n\t\t\tnew IFDEntry(Tag.RESOLUTION_UNIT, Type.SHORT, 1, null, 1),\n\t\t\tnew IFDEntry(Tag.SOFTWARE, Type.ASCII, 6, null, \"......\"),\n\t\t\tnew IFDEntry(Tag.STRIP_OFFSETS, Type.LONG, 1, null, null),\n\t\t\tnew IFDEntry(Tag.X_RESOLUTION, Type.RATIONAL, 1, null, new Uint32Array([1, 1])),\n\t\t\tnew IFDEntry(Tag.Y_RESOLUTION, Type.RATIONAL, 1, null, new Uint32Array([1, 1])),\n\t\t];\n\n\t\tif(params.ifdEntries){\n\t\t\tifds.push(...params.ifdEntries);\n\t\t}\n\n\t\tlet valueOffset = offsetToFirstIFD + 2 + ifds.length * 12 + 4;\n\n\t\t// create 12 byte buffer for each ifd and variable length buffers for ifd values\n\t\tlet ifdEntryBuffers = new Map();\n\t\tlet ifdValueBuffers = new Map();\n\t\tfor(let ifd of ifds){\n\t\t\tlet entryBuffer = new ArrayBuffer(12);\n\t\t\tlet entryView = new DataView(entryBuffer);\n\n\t\t\tlet valueBytes = ifd.type.bytes * ifd.count;\n\n\t\t\tentryView.setUint16(0, ifd.tag.value, true);\n\t\t\tentryView.setUint16(2, ifd.type.value, true);\n\t\t\tentryView.setUint32(4, ifd.count, true);\n\n\t\t\tif(ifd.count === 1 && ifd.type.bytes <= 4){\n\t\t\t\tentryView.setUint32(8, ifd.value, true);\n\t\t\t}else{\n\t\t\t\tentryView.setUint32(8, valueOffset, true);\n\n\t\t\t\tlet valueBuffer = new Uint8Array(ifd.count * ifd.type.bytes);\n\t\t\t\tif(ifd.type === Type.ASCII){\n\t\t\t\t\tvalueBuffer.set(new Uint8Array(ifd.value.split(\"\").map(c => c.charCodeAt(0))));\n\t\t\t\t}else{\n\t\t\t\t\tvalueBuffer.set(new Uint8Array(ifd.value.buffer));\n\t\t\t\t}\n\t\t\t\tifdValueBuffers.set(ifd.tag, valueBuffer);\n\n\t\t\t\tvalueOffset = valueOffset + valueBuffer.byteLength;\n\t\t\t}\n\n\t\t\tifdEntryBuffers.set(ifd.tag, entryBuffer);\n\t\t}\n\n\t\tlet imageBufferOffset = valueOffset;\n\n\t\tnew DataView(ifdEntryBuffers.get(Tag.STRIP_OFFSETS)).setUint32(8, imageBufferOffset, true);\n\n\t\tlet concatBuffers = (buffers) => {\n\n\t\t\tlet totalLength = buffers.reduce( (sum, buffer) => (sum + buffer.byteLength), 0);\n\t\t\tlet merged = new Uint8Array(totalLength);\n\n\t\t\tlet offset = 0;\n\t\t\tfor(let buffer of buffers){\n\t\t\t\tmerged.set(new Uint8Array(buffer), offset);\n\t\t\t\toffset += buffer.byteLength;\n\t\t\t}\n\n\t\t\treturn merged;\n\t\t};\n\t\t\n\t\tlet ifdBuffer = concatBuffers([\n\t\t\tnew Uint16Array([ifds.length]), \n\t\t\t...ifdEntryBuffers.values(), \n\t\t\tnew Uint32Array([0])]);\n\t\tlet ifdValueBuffer = concatBuffers([...ifdValueBuffers.values()]);\n\n\t\tlet tiffBuffer = concatBuffers([\n\t\t\theaderBuffer,\n\t\t\tifdBuffer,\n\t\t\tifdValueBuffer,\n\t\t\timage.buffer\n\t\t]);\n\n\t\treturn {width: width, height: height, buffer: tiffBuffer};\n\t}\n\n}\n\nexports.Tag = Tag;\nexports.Type = Type;\nexports.IFDEntry = IFDEntry;\nexports.Image = Image;\nexports.Reader = Reader;\nexports.Exporter = Exporter;\n\nreturn exports;\n\n}({}));\n","\nimport {Measure} from \"./Measure.js\";\nimport {Utils} from \"../utils.js\";\nimport {CameraMode} from \"../defines.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\n\nfunction updateAzimuth(viewer, measure){\n\n\tconst azimuth = measure.azimuth;\n\n\tconst isOkay = measure.points.length === 2;\n\n\tazimuth.node.visible = isOkay && measure.showAzimuth;\n\n\tif(!azimuth.node.visible){\n\t\treturn;\n\t}\n\n\tconst camera = viewer.scene.getActiveCamera();\n\tconst renderAreaSize = viewer.renderer.getSize(new THREE.Vector2());\n\tconst width = renderAreaSize.width;\n\tconst height = renderAreaSize.height;\n\t\n\tconst [p0, p1] = measure.points;\n\tconst r = p0.position.distanceTo(p1.position);\n\tconst northVec = Utils.getNorthVec(p0.position, r, viewer.getProjection());\n\tconst northPos = p0.position.clone().add(northVec);\n\n\tazimuth.center.position.copy(p0.position);\n\tazimuth.center.scale.set(2, 2, 2);\n\t\n\tazimuth.center.visible = false;\n\t// azimuth.target.visible = false;\n\n\n\t{ // north\n\t\tazimuth.north.position.copy(northPos);\n\t\tazimuth.north.scale.set(2, 2, 2);\n\n\t\tlet distance = azimuth.north.position.distanceTo(camera.position);\n\t\tlet pr = Utils.projectedRadius(1, camera, distance, width, height);\n\n\t\tlet scale = (5 / pr);\n\t\tazimuth.north.scale.set(scale, scale, scale);\n\t}\n\n\t{ // target\n\t\tazimuth.target.position.copy(p1.position);\n\t\tazimuth.target.position.z = azimuth.north.position.z;\n\n\t\tlet distance = azimuth.target.position.distanceTo(camera.position);\n\t\tlet pr = Utils.projectedRadius(1, camera, distance, width, height);\n\n\t\tlet scale = (5 / pr);\n\t\tazimuth.target.scale.set(scale, scale, scale);\n\t}\n\n\n\tazimuth.circle.position.copy(p0.position);\n\tazimuth.circle.scale.set(r, r, r);\n\tazimuth.circle.material.resolution.set(width, height);\n\n\t// to target\n\tazimuth.centerToTarget.geometry.setPositions([\n\t\t0, 0, 0,\n\t\t...p1.position.clone().sub(p0.position).toArray(),\n\t]);\n\tazimuth.centerToTarget.position.copy(p0.position);\n\tazimuth.centerToTarget.geometry.verticesNeedUpdate = true;\n\tazimuth.centerToTarget.geometry.computeBoundingSphere();\n\tazimuth.centerToTarget.computeLineDistances();\n\tazimuth.centerToTarget.material.resolution.set(width, height);\n\n\t// to target ground\n\tazimuth.centerToTargetground.geometry.setPositions([\n\t\t0, 0, 0,\n\t\tp1.position.x - p0.position.x,\n\t\tp1.position.y - p0.position.y,\n\t\t0,\n\t]);\n\tazimuth.centerToTargetground.position.copy(p0.position);\n\tazimuth.centerToTargetground.geometry.verticesNeedUpdate = true;\n\tazimuth.centerToTargetground.geometry.computeBoundingSphere();\n\tazimuth.centerToTargetground.computeLineDistances();\n\tazimuth.centerToTargetground.material.resolution.set(width, height);\n\n\t// to north\n\tazimuth.centerToNorth.geometry.setPositions([\n\t\t0, 0, 0,\n\t\tnorthPos.x - p0.position.x,\n\t\tnorthPos.y - p0.position.y,\n\t\t0,\n\t]);\n\tazimuth.centerToNorth.position.copy(p0.position);\n\tazimuth.centerToNorth.geometry.verticesNeedUpdate = true;\n\tazimuth.centerToNorth.geometry.computeBoundingSphere();\n\tazimuth.centerToNorth.computeLineDistances();\n\tazimuth.centerToNorth.material.resolution.set(width, height);\n\n\t// label\n\tconst radians = Utils.computeAzimuth(p0.position, p1.position, viewer.getProjection());\n\tlet degrees = THREE.Math.radToDeg(radians);\n\tif(degrees < 0){\n\t\tdegrees = 360 + degrees;\n\t}\n\tconst txtDegrees = `${degrees.toFixed(2)}°`;\n\tconst labelDir = northPos.clone().add(p1.position).multiplyScalar(0.5).sub(p0.position);\n\tif(labelDir.length() > 0){\n\t\tlabelDir.z = 0;\n\t\tlabelDir.normalize();\n\t\tconst labelVec = labelDir.clone().multiplyScalar(r);\n\t\tconst labelPos = p0.position.clone().add(labelVec);\n\t\tazimuth.label.position.copy(labelPos);\n\t}\n\tazimuth.label.setText(txtDegrees);\n\tlet distance = azimuth.label.position.distanceTo(camera.position);\n\tlet pr = Utils.projectedRadius(1, camera, distance, width, height);\n\tlet scale = (70 / pr);\n\tazimuth.label.scale.set(scale, scale, scale);\n}\n\nexport class MeasuringTool extends EventDispatcher{\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.addEventListener('start_inserting_measurement', e => {\n\t\t\tthis.viewer.dispatchEvent({\n\t\t\t\ttype: 'cancel_insertions'\n\t\t\t});\n\t\t});\n\n\t\tthis.showLabels = true;\n\t\tthis.scene = new THREE.Scene();\n\t\tthis.scene.name = 'scene_measurement';\n\t\tthis.light = new THREE.PointLight(0xffffff, 1.0);\n\t\tthis.scene.add(this.light);\n\n\t\tthis.viewer.inputHandler.registerInteractiveScene(this.scene);\n\n\t\tthis.onRemove = (e) => { this.scene.remove(e.measurement);};\n\t\tthis.onAdd = e => {this.scene.add(e.measurement);};\n\n\t\tfor(let measurement of viewer.scene.measurements){\n\t\t\tthis.onAdd({measurement: measurement});\n\t\t}\n\n\t\tviewer.addEventListener(\"update\", this.update.bind(this));\n\t\tviewer.addEventListener(\"render.pass.perspective_overlay\", this.render.bind(this));\n\t\tviewer.addEventListener(\"scene_changed\", this.onSceneChange.bind(this));\n\n\t\tviewer.scene.addEventListener('measurement_added', this.onAdd);\n\t\tviewer.scene.addEventListener('measurement_removed', this.onRemove);\n\t}\n\n\tonSceneChange(e){\n\t\tif(e.oldScene){\n\t\t\te.oldScene.removeEventListener('measurement_added', this.onAdd);\n\t\t\te.oldScene.removeEventListener('measurement_removed', this.onRemove);\n\t\t}\n\n\t\te.scene.addEventListener('measurement_added', this.onAdd);\n\t\te.scene.addEventListener('measurement_removed', this.onRemove);\n\t}\n\n\tstartInsertion (args = {}) {\n\t\tlet domElement = this.viewer.renderer.domElement;\n\n\t\tlet measure = new Measure();\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'start_inserting_measurement',\n\t\t\tmeasure: measure\n\t\t});\n\n\t\tconst pick = (defaul, alternative) => {\n\t\t\tif(defaul != null){\n\t\t\t\treturn defaul;\n\t\t\t}else{\n\t\t\t\treturn alternative;\n\t\t\t}\n\t\t};\n\n\t\tmeasure.showDistances = (args.showDistances === null) ? true : args.showDistances;\n\n\t\tmeasure.showArea = pick(args.showArea, false);\n\t\tmeasure.showAngles = pick(args.showAngles, false);\n\t\tmeasure.showCoordinates = pick(args.showCoordinates, false);\n\t\tmeasure.showHeight = pick(args.showHeight, false);\n\t\tmeasure.showCircle = pick(args.showCircle, false);\n\t\tmeasure.showAzimuth = pick(args.showAzimuth, false);\n\t\tmeasure.showEdges = pick(args.showEdges, true);\n\t\tmeasure.closed = pick(args.closed, false);\n\t\tmeasure.maxMarkers = pick(args.maxMarkers, Infinity);\n\n\t\tmeasure.name = args.name || 'Measurement';\n\n\t\tthis.scene.add(measure);\n\n\t\tlet cancel = {\n\t\t\tremoveLastMarker: measure.maxMarkers > 3,\n\t\t\tcallback: null\n\t\t};\n\n\t\tlet insertionCallback = (e) => {\n\t\t\tif (e.button === THREE.MOUSE.LEFT) {\n\t\t\t\tmeasure.addMarker(measure.points[measure.points.length - 1].position.clone());\n\n\t\t\t\tif (measure.points.length >= measure.maxMarkers) {\n\t\t\t\t\tcancel.callback();\n\t\t\t\t}\n\n\t\t\t\tthis.viewer.inputHandler.startDragging(\n\t\t\t\t\tmeasure.spheres[measure.spheres.length - 1]);\n\t\t\t} else if (e.button === THREE.MOUSE.RIGHT) {\n\t\t\t\tcancel.callback();\n\t\t\t}\n\t\t};\n\n\t\tcancel.callback = e => {\n\t\t\tif (cancel.removeLastMarker) {\n\t\t\t\tmeasure.removeMarker(measure.points.length - 1);\n\t\t\t}\n\t\t\tdomElement.removeEventListener('mouseup', insertionCallback, true);\n\t\t\tthis.viewer.removeEventListener('cancel_insertions', cancel.callback);\n\t\t};\n\n\t\tif (measure.maxMarkers > 1) {\n\t\t\tthis.viewer.addEventListener('cancel_insertions', cancel.callback);\n\t\t\tdomElement.addEventListener('mouseup', insertionCallback, true);\n\t\t}\n\n\t\tmeasure.addMarker(new THREE.Vector3(0, 0, 0));\n\t\tthis.viewer.inputHandler.startDragging(\n\t\t\tmeasure.spheres[measure.spheres.length - 1]);\n\n\t\tthis.viewer.scene.addMeasurement(measure);\n\n\t\treturn measure;\n\t}\n\t\n\tupdate(){\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\tlet domElement = this.renderer.domElement;\n\t\tlet measurements = this.viewer.scene.measurements;\n\n\t\tconst renderAreaSize = this.renderer.getSize(new THREE.Vector2());\n\t\tlet clientWidth = renderAreaSize.width;\n\t\tlet clientHeight = renderAreaSize.height;\n\n\t\tthis.light.position.copy(camera.position);\n\n\t\t// make size independant of distance\n\t\tfor (let measure of measurements) {\n\t\t\tmeasure.lengthUnit = this.viewer.lengthUnit;\n\t\t\tmeasure.lengthUnitDisplay = this.viewer.lengthUnitDisplay;\n\t\t\tmeasure.update();\n\n\t\t\tupdateAzimuth(viewer, measure);\n\n\t\t\t// spheres\n\t\t\tfor(let sphere of measure.spheres){\n\t\t\t\tlet distance = camera.position.distanceTo(sphere.getWorldPosition(new THREE.Vector3()));\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\t\t\t\tlet scale = (15 / pr);\n\t\t\t\tsphere.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\t// labels\n\t\t\tlet labels = measure.edgeLabels.concat(measure.angleLabels);\n\t\t\tfor(let label of labels){\n\t\t\t\tlet distance = camera.position.distanceTo(label.getWorldPosition(new THREE.Vector3()));\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\t\t\t\tlet scale = (70 / pr);\n\n\t\t\t\tif(Potree.debug.scale){\n\t\t\t\t\tscale = (Potree.debug.scale / pr);\n\t\t\t\t}\n\n\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\t// coordinate labels\n\t\t\tfor (let j = 0; j < measure.coordinateLabels.length; j++) {\n\t\t\t\tlet label = measure.coordinateLabels[j];\n\t\t\t\tlet sphere = measure.spheres[j];\n\n\t\t\t\tlet distance = camera.position.distanceTo(sphere.getWorldPosition(new THREE.Vector3()));\n\n\t\t\t\tlet screenPos = sphere.getWorldPosition(new THREE.Vector3()).clone().project(camera);\n\t\t\t\tscreenPos.x = Math.round((screenPos.x + 1) * clientWidth / 2);\n\t\t\t\tscreenPos.y = Math.round((-screenPos.y + 1) * clientHeight / 2);\n\t\t\t\tscreenPos.z = 0;\n\t\t\t\tscreenPos.y -= 30;\n\n\t\t\t\tlet labelPos = new THREE.Vector3( \n\t\t\t\t\t(screenPos.x / clientWidth) * 2 - 1, \n\t\t\t\t\t-(screenPos.y / clientHeight) * 2 + 1, \n\t\t\t\t\t0.5 );\n\t\t\t\tlabelPos.unproject(camera);\n\t\t\t\tif(this.viewer.scene.cameraMode == CameraMode.PERSPECTIVE) {\n\t\t\t\t\tlet direction = labelPos.sub(camera.position).normalize();\n\t\t\t\t\tlabelPos = new THREE.Vector3().addVectors(\n\t\t\t\t\t\tcamera.position, direction.multiplyScalar(distance));\n\n\t\t\t\t}\n\t\t\t\tlabel.position.copy(labelPos);\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\t\t\t\tlet scale = (70 / pr);\n\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\t// height label\n\t\t\tif (measure.showHeight) {\n\t\t\t\tlet label = measure.heightLabel;\n\n\t\t\t\t{\n\t\t\t\t\tlet distance = label.position.distanceTo(camera.position);\n\t\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\t\t\t\t\tlet scale = (70 / pr);\n\t\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t\t}\n\n\t\t\t\t{ // height edge\n\t\t\t\t\tlet edge = measure.heightEdge;\n\n\t\t\t\t\tlet sorted = measure.points.slice().sort((a, b) => a.position.z - b.position.z);\n\t\t\t\t\tlet lowPoint = sorted[0].position.clone();\n\t\t\t\t\tlet highPoint = sorted[sorted.length - 1].position.clone();\n\t\t\t\t\tlet min = lowPoint.z;\n\t\t\t\t\tlet max = highPoint.z;\n\n\t\t\t\t\tlet start = new THREE.Vector3(highPoint.x, highPoint.y, min);\n\t\t\t\t\tlet end = new THREE.Vector3(highPoint.x, highPoint.y, max);\n\n\t\t\t\t\tlet lowScreen = lowPoint.clone().project(camera);\n\t\t\t\t\tlet startScreen = start.clone().project(camera);\n\t\t\t\t\tlet endScreen = end.clone().project(camera);\n\n\t\t\t\t\tlet toPixelCoordinates = v => {\n\t\t\t\t\t\tlet r = v.clone().addScalar(1).divideScalar(2);\n\t\t\t\t\t\tr.x = r.x * clientWidth;\n\t\t\t\t\t\tr.y = r.y * clientHeight;\n\t\t\t\t\t\tr.z = 0;\n\n\t\t\t\t\t\treturn r;\n\t\t\t\t\t};\n\n\t\t\t\t\tlet lowEL = toPixelCoordinates(lowScreen);\n\t\t\t\t\tlet startEL = toPixelCoordinates(startScreen);\n\t\t\t\t\tlet endEL = toPixelCoordinates(endScreen);\n\n\t\t\t\t\tlet lToS = lowEL.distanceTo(startEL);\n\t\t\t\t\tlet sToE = startEL.distanceTo(endEL);\n\n\t\t\t\t\tedge.geometry.lineDistances = [0, lToS, lToS, lToS + sToE];\n\t\t\t\t\tedge.geometry.lineDistancesNeedUpdate = true;\n\n\t\t\t\t\tedge.material.dashSize = 10;\n\t\t\t\t\tedge.material.gapSize = 10;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t{ // area label\n\t\t\t\tlet label = measure.areaLabel;\n\t\t\t\tlet distance = label.position.distanceTo(camera.position);\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\n\t\t\t\tlet scale = (70 / pr);\n\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\t{ // radius label\n\t\t\t\tlet label = measure.circleRadiusLabel;\n\t\t\t\tlet distance = label.position.distanceTo(camera.position);\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\n\t\t\t\tlet scale = (70 / pr);\n\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\t{ // edges\n\t\t\t\tconst materials = [\n\t\t\t\t\tmeasure.circleRadiusLine.material,\n\t\t\t\t\t...measure.edges.map( (e) => e.material),\n\t\t\t\t\tmeasure.heightEdge.material,\n\t\t\t\t\tmeasure.circleLine.material,\n\t\t\t\t];\n\n\t\t\t\tfor(const material of materials){\n\t\t\t\t\tmaterial.resolution.set(clientWidth, clientHeight);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!this.showLabels){\n\n\t\t\t\tconst labels = [\n\t\t\t\t\t...measure.sphereLabels, \n\t\t\t\t\t...measure.edgeLabels, \n\t\t\t\t\t...measure.angleLabels, \n\t\t\t\t\t...measure.coordinateLabels,\n\t\t\t\t\tmeasure.heightLabel,\n\t\t\t\t\tmeasure.areaLabel,\n\t\t\t\t\tmeasure.circleRadiusLabel,\n\t\t\t\t];\n\n\t\t\t\tfor(const label of labels){\n\t\t\t\t\tlabel.visible = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\trender(){\n\t\tthis.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera());\n\t}\n};\n","\nexport class Message{\n\n\tconstructor(content){\n\t\tthis.content = content;\n\n\t\tlet closeIcon = `${exports.resourcePath}/icons/close.svg`;\n\n\t\tthis.element = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t
    `);\n\n\t\tthis.elClose = this.element.find(\"img[name=close]\");\n\n\t\tthis.elContainer = this.element.find(\"span[name=content_container]\");\n\n\t\tif(typeof content === \"string\"){\n\t\t\tthis.elContainer.append($(`${content}`));\n\t\t}else{\n\t\t\tthis.elContainer.append(content);\n\t\t}\n\n\t}\n\n\tsetMessage(content){\n\t\tthis.elContainer.empty();\n\t\tif(typeof content === \"string\"){\n\t\t\tthis.elContainer.append($(`${content}`));\n\t\t}else{\n\t\t\tthis.elContainer.append(content);\n\t\t}\n\t}\n\n}","\nexport class PointCloudSM{\n\n\tconstructor(potreeRenderer){\n\n\t\tthis.potreeRenderer = potreeRenderer;\n\t\tthis.threeRenderer = this.potreeRenderer.threeRenderer;\n\n\t\tthis.target = new THREE.WebGLRenderTarget(2 * 1024, 2 * 1024, {\n\t\t\tminFilter: THREE.LinearFilter,\n\t\t\tmagFilter: THREE.LinearFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\ttype: THREE.FloatType\n\t\t});\n\t\tthis.target.depthTexture = new THREE.DepthTexture();\n\t\tthis.target.depthTexture.type = THREE.UnsignedIntType;\n\n\t\t//this.threeRenderer.setClearColor(0x000000, 1);\n\t\tthis.threeRenderer.setClearColor(0xff0000, 1);\n\n\t\t//HACK? removed while moving to three.js 109\n\t\t//this.threeRenderer.clearTarget(this.target, true, true, true); \n\t\t{\n\t\t\tconst oldTarget = this.threeRenderer.getRenderTarget();\n\n\t\t\tthis.threeRenderer.setRenderTarget(this.target);\n\t\t\tthis.threeRenderer.clear(true, true, true);\n\n\t\t\tthis.threeRenderer.setRenderTarget(oldTarget);\n\t\t}\n\t}\n\n\tsetLight(light){\n\t\tthis.light = light;\n\n\t\tlet fov = (180 * light.angle) / Math.PI;\n\t\tlet aspect = light.shadow.mapSize.width / light.shadow.mapSize.height;\n\t\tlet near = 0.1;\n\t\tlet far = light.distance === 0 ? 10000 : light.distance;\n\t\tthis.camera = new THREE.PerspectiveCamera(fov, aspect, near, far);\n\t\tthis.camera.up.set(0, 0, 1);\n\t\tthis.camera.position.copy(light.position);\n\n\t\tlet target = new THREE.Vector3().subVectors(light.position, light.getWorldDirection(new THREE.Vector3()));\n\t\tthis.camera.lookAt(target);\n\n\t\tthis.camera.updateProjectionMatrix();\n\t\tthis.camera.updateMatrix();\n\t\tthis.camera.updateMatrixWorld();\n\t\tthis.camera.matrixWorldInverse.getInverse(this.camera.matrixWorld);\n\t}\n\n\tsetSize(width, height){\n\t\tif(this.target.width !== width || this.target.height !== height){\n\t\t\tthis.target.dispose();\n\t\t}\n\t\tthis.target.setSize(width, height);\n\t}\n\n\trender(scene, camera){\n\n\t\tthis.threeRenderer.setClearColor(0x000000, 1);\n\t\t\n\t\tconst oldTarget = this.threeRenderer.getRenderTarget();\n\n\t\tthis.threeRenderer.setRenderTarget(this.target);\n\t\tthis.threeRenderer.clear(true, true, true);\n\n\t\tthis.potreeRenderer.render(scene, this.camera, this.target, {});\n\n\t\tthis.threeRenderer.setRenderTarget(oldTarget);\n\t}\n\n\n}","\n\nimport {Profile} from \"./Profile.js\";\nimport {Utils} from \"../utils.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\n\n\nexport class ProfileTool extends EventDispatcher {\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.addEventListener('start_inserting_profile', e => {\n\t\t\tthis.viewer.dispatchEvent({\n\t\t\t\ttype: 'cancel_insertions'\n\t\t\t});\n\t\t});\n\n\t\tthis.scene = new THREE.Scene();\n\t\tthis.scene.name = 'scene_profile';\n\t\tthis.light = new THREE.PointLight(0xffffff, 1.0);\n\t\tthis.scene.add(this.light);\n\n\t\tthis.viewer.inputHandler.registerInteractiveScene(this.scene);\n\n\t\tthis.onRemove = e => this.scene.remove(e.profile);\n\t\tthis.onAdd = e => this.scene.add(e.profile);\n\n\t\tfor(let profile of viewer.scene.profiles){\n\t\t\tthis.onAdd({profile: profile});\n\t\t}\n\n\t\tviewer.addEventListener(\"update\", this.update.bind(this));\n\t\tviewer.addEventListener(\"render.pass.perspective_overlay\", this.render.bind(this));\n\t\tviewer.addEventListener(\"scene_changed\", this.onSceneChange.bind(this));\n\n\t\tviewer.scene.addEventListener('profile_added', this.onAdd);\n\t\tviewer.scene.addEventListener('profile_removed', this.onRemove);\n\t}\n\n\tonSceneChange(e){\n\t\tif(e.oldScene){\n\t\t\te.oldScene.removeEventListeners('profile_added', this.onAdd);\n\t\t\te.oldScene.removeEventListeners('profile_removed', this.onRemove);\n\t\t}\n\n\t\te.scene.addEventListener('profile_added', this.onAdd);\n\t\te.scene.addEventListener('profile_removed', this.onRemove);\n\t}\n\n\tstartInsertion (args = {}) {\n\t\tlet domElement = this.viewer.renderer.domElement;\n\n\t\tlet profile = new Profile();\n\t\tprofile.name = args.name || 'Profile';\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'start_inserting_profile',\n\t\t\tprofile: profile\n\t\t});\n\n\t\tthis.scene.add(profile);\n\n\t\tlet cancel = {\n\t\t\tcallback: null\n\t\t};\n\n\t\tlet insertionCallback = (e) => {\n\t\t\tif(e.button === THREE.MOUSE.LEFT){\n\t\t\t\tif(profile.points.length <= 1){\n\t\t\t\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\t\t\t\tlet distance = camera.position.distanceTo(profile.points[0]);\n\t\t\t\t\tlet clientSize = this.viewer.renderer.getSize(new THREE.Vector2());\n\t\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientSize.width, clientSize.height);\n\t\t\t\t\tlet width = (10 / pr);\n\n\t\t\t\t\tprofile.setWidth(width);\n\t\t\t\t}\n\n\t\t\t\tprofile.addMarker(profile.points[profile.points.length - 1].clone());\n\n\t\t\t\tthis.viewer.inputHandler.startDragging(\n\t\t\t\t\tprofile.spheres[profile.spheres.length - 1]);\n\t\t\t} else if (e.button === THREE.MOUSE.RIGHT) {\n\t\t\t\tcancel.callback();\n\t\t\t}\n\t\t};\n\n\t\tcancel.callback = e => {\n\t\t\tprofile.removeMarker(profile.points.length - 1);\n\t\t\tdomElement.removeEventListener('mouseup', insertionCallback, true);\n\t\t\tthis.viewer.removeEventListener('cancel_insertions', cancel.callback);\n\t\t};\n\n\t\tthis.viewer.addEventListener('cancel_insertions', cancel.callback);\n\t\tdomElement.addEventListener('mouseup', insertionCallback, true);\n\n\t\tprofile.addMarker(new THREE.Vector3(0, 0, 0));\n\t\tthis.viewer.inputHandler.startDragging(\n\t\t\tprofile.spheres[profile.spheres.length - 1]);\n\n\t\tthis.viewer.scene.addProfile(profile);\n\n\t\treturn profile;\n\t}\n\t\n\tupdate(){\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\tlet profiles = this.viewer.scene.profiles;\n\t\tlet renderAreaSize = this.viewer.renderer.getSize(new THREE.Vector2());\n\t\tlet clientWidth = renderAreaSize.width;\n\t\tlet clientHeight = renderAreaSize.height;\n\n\t\tthis.light.position.copy(camera.position);\n\n\t\t// make size independant of distance\n\t\tfor(let profile of profiles){\n\t\t\tfor(let sphere of profile.spheres){\t\t\t\t\n\t\t\t\tlet distance = camera.position.distanceTo(sphere.getWorldPosition(new THREE.Vector3()));\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\t\t\t\tlet scale = (15 / pr);\n\t\t\t\tsphere.scale.set(scale, scale, scale);\n\t\t\t}\n\t\t}\n\t}\n\n\trender(){\n\t\tthis.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera());\n\t}\n\n}\n","\n\nimport {BoxVolume} from \"./Volume.js\";\nimport {Utils} from \"../utils.js\";\nimport {PointSizeType} from \"../defines.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\n\n\nexport class ScreenBoxSelectTool extends EventDispatcher{\n\n\tconstructor(viewer){\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.scene = new THREE.Scene();\n\n\t\tviewer.addEventListener(\"update\", this.update.bind(this));\n\t\tviewer.addEventListener(\"render.pass.perspective_overlay\", this.render.bind(this));\n\t\tviewer.addEventListener(\"scene_changed\", this.onSceneChange.bind(this));\n\t}\n\n\tonSceneChange(scene){\n\t\tconsole.log(\"scene changed\");\n\t}\n\n\tstartInsertion(){\n\t\tlet domElement = this.viewer.renderer.domElement;\n\n\t\tlet volume = new BoxVolume();\n\t\tvolume.position.set(12345, 12345, 12345);\n\t\tvolume.showVolumeLabel = false;\n\t\tvolume.visible = false;\n\t\tvolume.update();\n\t\tthis.viewer.scene.addVolume(volume);\n\n\t\tthis.importance = 10;\n\n\t\tlet selectionBox = $(`
    `);\n\t\t$(domElement.parentElement).append(selectionBox);\n\t\tselectionBox.css(\"right\", \"10px\");\n\t\tselectionBox.css(\"bottom\", \"10px\");\n\n\t\tlet drag = e =>{\n\n\t\t\tvolume.visible = true;\n\n\t\t\tlet mStart = e.drag.start;\n\t\t\tlet mEnd = e.drag.end;\n\n\t\t\tlet box2D = new THREE.Box2();\n\t\t\tbox2D.expandByPoint(mStart);\n\t\t\tbox2D.expandByPoint(mEnd);\n\n\t\t\tselectionBox.css(\"left\", `${box2D.min.x}px`);\n\t\t\tselectionBox.css(\"top\", `${box2D.min.y}px`);\n\t\t\tselectionBox.css(\"width\", `${box2D.max.x - box2D.min.x}px`);\n\t\t\tselectionBox.css(\"height\", `${box2D.max.y - box2D.min.y}px`);\n\n\t\t\tlet camera = e.viewer.scene.getActiveCamera();\n\t\t\tlet size = e.viewer.renderer.getSize(new THREE.Vector2());\n\t\t\tlet frustumSize = new THREE.Vector2(\n\t\t\t\tcamera.right - camera.left, \n\t\t\t\tcamera.top - camera.bottom);\n\n\t\t\tlet screenCentroid = new THREE.Vector2().addVectors(e.drag.end, e.drag.start).multiplyScalar(0.5);\n\t\t\tlet ray = Utils.mouseToRay(screenCentroid, camera, size.width, size.height);\n\n\t\t\tlet diff = new THREE.Vector2().subVectors(e.drag.end, e.drag.start);\n\t\t\tdiff.divide(size).multiply(frustumSize);\n\t\t\t\n\t\t\tvolume.position.copy(ray.origin);\n\t\t\tvolume.up.copy(camera.up);\n\t\t\tvolume.rotation.copy(camera.rotation);\n\t\t\tvolume.scale.set(diff.x, diff.y, 1000 * 100);\n\n\t\t\te.consume();\n\t\t};\n\n\t\tlet drop = e => {\n\t\t\tthis.importance = 0;\n\n\t\t\t$(selectionBox).remove();\n\n\t\t\tthis.viewer.inputHandler.deselectAll();\n\t\t\tthis.viewer.inputHandler.toggleSelection(volume);\n\n\t\t\tlet camera = e.viewer.scene.getActiveCamera();\n\t\t\tlet size = e.viewer.renderer.getSize(new THREE.Vector2());\n\t\t\tlet screenCentroid = new THREE.Vector2().addVectors(e.drag.end, e.drag.start).multiplyScalar(0.5);\n\t\t\tlet ray = Utils.mouseToRay(screenCentroid, camera, size.width, size.height);\n\n\t\t\tlet line = new THREE.Line3(ray.origin, new THREE.Vector3().addVectors(ray.origin, ray.direction));\n\n\t\t\tthis.removeEventListener(\"drag\", drag);\n\t\t\tthis.removeEventListener(\"drop\", drop);\n\n\t\t\tlet allPointsNear = [];\n\t\t\tlet allPointsFar = [];\n\n\t\t\t// TODO support more than one point cloud\n\t\t\tfor(let pointcloud of this.viewer.scene.pointclouds){\n\n\t\t\t\tif(!pointcloud.visible){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet volCam = camera.clone();\n\t\t\t\tvolCam.left = -volume.scale.x / 2; \n\t\t\t\tvolCam.right = +volume.scale.x / 2;\n\t\t\t\tvolCam.top = +volume.scale.y / 2;\n\t\t\t\tvolCam.bottom = -volume.scale.y / 2;\n\t\t\t\tvolCam.near = -volume.scale.z / 2;\n\t\t\t\tvolCam.far = +volume.scale.z / 2;\n\t\t\t\tvolCam.rotation.copy(volume.rotation);\n\t\t\t\tvolCam.position.copy(volume.position);\n\n\t\t\t\tvolCam.updateMatrix();\n\t\t\t\tvolCam.updateMatrixWorld();\n\t\t\t\tvolCam.updateProjectionMatrix();\n\t\t\t\tvolCam.matrixWorldInverse.getInverse(volCam.matrixWorld);\n\n\t\t\t\tlet ray = new THREE.Ray(volCam.getWorldPosition(new THREE.Vector3()), volCam.getWorldDirection(new THREE.Vector3()));\n\t\t\t\tlet rayInverse = new THREE.Ray(\n\t\t\t\t\tray.origin.clone().add(ray.direction.clone().multiplyScalar(volume.scale.z)),\n\t\t\t\t\tray.direction.clone().multiplyScalar(-1));\n\n\t\t\t\tlet pickerSettings = {\n\t\t\t\t\twidth: 8, \n\t\t\t\t\theight: 8, \n\t\t\t\t\tpickWindowSize: 8, \n\t\t\t\t\tall: true,\n\t\t\t\t\tpickClipped: true,\n\t\t\t\t\tpointSizeType: PointSizeType.FIXED,\n\t\t\t\t\tpointSize: 1};\n\t\t\t\tlet pointsNear = pointcloud.pick(viewer, volCam, ray, pickerSettings);\n\n\t\t\t\tvolCam.rotateX(Math.PI);\n\t\t\t\tvolCam.updateMatrix();\n\t\t\t\tvolCam.updateMatrixWorld();\n\t\t\t\tvolCam.updateProjectionMatrix();\n\t\t\t\tvolCam.matrixWorldInverse.getInverse(volCam.matrixWorld);\n\t\t\t\tlet pointsFar = pointcloud.pick(viewer, volCam, rayInverse, pickerSettings);\n\n\t\t\t\tallPointsNear.push(...pointsNear);\n\t\t\t\tallPointsFar.push(...pointsFar);\n\t\t\t}\n\n\t\t\tif(allPointsNear.length > 0 && allPointsFar.length > 0){\n\t\t\t\tlet viewLine = new THREE.Line3(ray.origin, new THREE.Vector3().addVectors(ray.origin, ray.direction));\n\n\t\t\t\tlet closestOnLine = allPointsNear.map(p => viewLine.closestPointToPoint(p.position, false, new THREE.Vector3()));\n\t\t\t\tlet closest = closestOnLine.sort( (a, b) => ray.origin.distanceTo(a) - ray.origin.distanceTo(b))[0];\n\n\t\t\t\tlet farthestOnLine = allPointsFar.map(p => viewLine.closestPointToPoint(p.position, false, new THREE.Vector3()));\n\t\t\t\tlet farthest = farthestOnLine.sort( (a, b) => ray.origin.distanceTo(b) - ray.origin.distanceTo(a))[0];\n\n\t\t\t\tlet distance = closest.distanceTo(farthest);\n\t\t\t\tlet centroid = new THREE.Vector3().addVectors(closest, farthest).multiplyScalar(0.5);\n\t\t\t\tvolume.scale.z = distance * 1.1;\n\t\t\t\tvolume.position.copy(centroid);\n\t\t\t}\n\n\t\t\tvolume.clip = true;\n\t\t};\n\n\t\tthis.addEventListener(\"drag\", drag);\n\t\tthis.addEventListener(\"drop\", drop);\n\n\t\tviewer.inputHandler.addInputListener(this);\n\n\t\treturn volume;\n\t}\n\n\tupdate(e){\n\t\t//console.log(e.delta)\n\t}\n\n\trender(){\n\t\tthis.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera());\n\t}\n\n}","\nexport class SpotLightHelper extends THREE.Object3D{\n\n\tconstructor(light, color){\n\t\tsuper();\n\n\t\tthis.light = light;\n\t\tthis.color = color;\n\n\t\t//this.up.set(0, 0, 1);\n\t\tthis.updateMatrix();\n\t\tthis.updateMatrixWorld();\n\n\t\t{ // SPHERE\n\t\t\tlet sg = new THREE.SphereGeometry(1, 32, 32);\n\t\t\tlet sm = new THREE.MeshNormalMaterial();\n\t\t\tthis.sphere = new THREE.Mesh(sg, sm);\n\t\t\tthis.sphere.scale.set(0.5, 0.5, 0.5);\n\t\t\tthis.add(this.sphere);\n\t\t}\n\n\t\t{ // LINES\n\t\t\t\n\n\t\t\tlet positions = new Float32Array([\n\t\t\t\t+0, +0, +0, +0, +0, -1,\n\n\t\t\t\t+0, +0, +0, -1, -1, -1,\n\t\t\t\t+0, +0, +0, +1, -1, -1,\n\t\t\t\t+0, +0, +0, +1, +1, -1,\n\t\t\t\t+0, +0, +0, -1, +1, -1,\n\n\t\t\t\t-1, -1, -1, +1, -1, -1,\n\t\t\t\t+1, -1, -1, +1, +1, -1,\n\t\t\t\t+1, +1, -1, -1, +1, -1,\n\t\t\t\t-1, +1, -1, -1, -1, -1,\n\t\t\t]);\n\n\t\t\tlet geometry = new THREE.BufferGeometry();\n\t\t\tgeometry.addAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n\n\t\t\tlet material = new THREE.LineBasicMaterial();\n\n\t\t\tthis.frustum = new THREE.LineSegments(geometry, material);\n\t\t\tthis.add(this.frustum);\n\n\t\t}\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\n\t\tthis.light.updateMatrix();\n\t\tthis.light.updateMatrixWorld();\n\n\t\tlet position = this.light.position;\n\t\t//let target = new THREE.Vector3().addVectors(\n\t\t//\tlight.position,\n\t\t//\tnew THREE.Vector3().subVectors(light.position, this.light.getWorldDirection(new THREE.Vector3())));\n\t\tlet target = new THREE.Vector3().addVectors(\n\t\t\tlight.position, this.light.getWorldDirection(new THREE.Vector3()).multiplyScalar(-1));\n\t\t\n\t\tlet quat = new THREE.Quaternion().setFromRotationMatrix(\n\t\t\tnew THREE.Matrix4().lookAt( position, target, new THREE.Vector3( 0, 0, 1 ) )\n\t\t);\n\n\t\tthis.setRotationFromQuaternion(quat);\n\t\tthis.position.copy(position);\n\n\n\t\tlet coneLength = (this.light.distance > 0) ? this.light.distance : 1000;\n\t\tlet coneWidth = coneLength * Math.tan( this.light.angle * 0.5 );\n\n\t\tthis.frustum.scale.set(coneWidth, coneWidth, coneLength);\n\t\t\n\n\n\t\t//{\n\t\t//\tlet fov = (180 * light.angle) / Math.PI;\n\t\t//\tlet aspect = light.shadow.mapSize.width / light.shadow.mapSize.height;\n\t\t//\tlet near = 0.1;\n\t\t//\tlet far = light.distance === 0 ? 10000 : light.distance;\n\t\t//\tthis.camera = new THREE.PerspectiveCamera(fov, aspect, near, far);\n\t\t//\tthis.camera.up.set(0, 0, 1);\n\t\t//\tthis.camera.position.copy(light.position);\n\n\t\t//\tlet target = new THREE.Vector3().addVectors(light.position, light.getWorldDirection(new THREE.Vector3()));\n\t\t//\tthis.camera.lookAt(target);\n\n\t\t//\tthis.camera.updateProjectionMatrix();\n\t\t//\tthis.camera.updateMatrix();\n\t\t//\tthis.camera.updateMatrixWorld();\n\t\t//\tthis.camera.matrixWorldInverse.getInverse(this.camera.matrixWorld);\n\t\t//}\n\n\t}\n\n}","\n\nimport {Utils} from \"../utils.js\";\n\nexport class TransformationTool {\n\tconstructor(viewer) {\n\t\tthis.viewer = viewer;\n\n\t\tthis.scene = new THREE.Scene();\n\n\t\tthis.selection = [];\n\t\tthis.pivot = new THREE.Vector3();\n\t\tthis.dragging = false;\n\t\tthis.showPickVolumes = false;\n\n\t\tthis.viewer.inputHandler.registerInteractiveScene(this.scene);\n\t\tthis.viewer.inputHandler.addEventListener('selection_changed', (e) => {\n\t\t\tfor(let selected of this.selection){\n\t\t\t\tthis.viewer.inputHandler.blacklist.delete(selected);\n\t\t\t}\n\n\t\t\tthis.selection = e.selection;\n\n\t\t\tfor(let selected of this.selection){\n\t\t\t\tthis.viewer.inputHandler.blacklist.add(selected);\n\t\t\t}\n\n\t\t});\n\n\t\tlet red = 0xE73100;\n\t\tlet green = 0x44A24A;\n\t\tlet blue = 0x2669E7;\n\t\t\n\t\tthis.activeHandle = null;\n\t\tthis.scaleHandles = {\n\t\t\t\"scale.x+\": {name: \"scale.x+\", node: new THREE.Object3D(), color: red, alignment: [+1, +0, +0]},\n\t\t\t\"scale.x-\": {name: \"scale.x-\", node: new THREE.Object3D(), color: red, alignment: [-1, +0, +0]},\n\t\t\t\"scale.y+\": {name: \"scale.y+\", node: new THREE.Object3D(), color: green, alignment: [+0, +1, +0]},\n\t\t\t\"scale.y-\": {name: \"scale.y-\", node: new THREE.Object3D(), color: green, alignment: [+0, -1, +0]},\n\t\t\t\"scale.z+\": {name: \"scale.z+\", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, +1]},\n\t\t\t\"scale.z-\": {name: \"scale.z-\", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, -1]},\n\t\t};\n\t\tthis.focusHandles = {\n\t\t\t\"focus.x+\": {name: \"focus.x+\", node: new THREE.Object3D(), color: red, alignment: [+1, +0, +0]},\n\t\t\t\"focus.x-\": {name: \"focus.x-\", node: new THREE.Object3D(), color: red, alignment: [-1, +0, +0]},\n\t\t\t\"focus.y+\": {name: \"focus.y+\", node: new THREE.Object3D(), color: green, alignment: [+0, +1, +0]},\n\t\t\t\"focus.y-\": {name: \"focus.y-\", node: new THREE.Object3D(), color: green, alignment: [+0, -1, +0]},\n\t\t\t\"focus.z+\": {name: \"focus.z+\", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, +1]},\n\t\t\t\"focus.z-\": {name: \"focus.z-\", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, -1]},\n\t\t};\n\t\tthis.translationHandles = {\n\t\t\t\"translation.x\": {name: \"translation.x\", node: new THREE.Object3D(), color: red, alignment: [1, 0, 0]},\n\t\t\t\"translation.y\": {name: \"translation.y\", node: new THREE.Object3D(), color: green, alignment: [0, 1, 0]},\n\t\t\t\"translation.z\": {name: \"translation.z\", node: new THREE.Object3D(), color: blue, alignment: [0, 0, 1]},\n\t\t};\n\t\tthis.rotationHandles = {\n\t\t\t\"rotation.x\": {name: \"rotation.x\", node: new THREE.Object3D(), color: red, alignment: [1, 0, 0]},\n\t\t\t\"rotation.y\": {name: \"rotation.y\", node: new THREE.Object3D(), color: green, alignment: [0, 1, 0]},\n\t\t\t\"rotation.z\": {name: \"rotation.z\", node: new THREE.Object3D(), color: blue, alignment: [0, 0, 1]},\n\t\t};\n\t\tthis.handles = Object.assign({}, this.scaleHandles, this.focusHandles, this.translationHandles, this.rotationHandles);\n\t\tthis.pickVolumes = [];\n\n\t\tthis.initializeScaleHandles();\n\t\tthis.initializeFocusHandles();\n\t\tthis.initializeTranslationHandles();\n\t\tthis.initializeRotationHandles();\n\n\n\t\tlet boxFrameGeometry = new THREE.Geometry();\n\t\t{\n\t\t\t// bottom\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\t// top\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\t// sides\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\t\t}\n\t\tthis.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: 0xffff00}));\n\t\tthis.scene.add(this.frame);\n\n\t\t\n\t}\n\n\tinitializeScaleHandles(){\n\t\tlet sgSphere = new THREE.SphereGeometry(1, 32, 32);\n\t\tlet sgLowPolySphere = new THREE.SphereGeometry(1, 16, 16);\n\n\t\tfor(let handleName of Object.keys(this.scaleHandles)){\n\t\t\tlet handle = this.scaleHandles[handleName];\n\t\t\tlet node = handle.node;\n\t\t\tthis.scene.add(node);\n\t\t\tnode.position.set(...handle.alignment).multiplyScalar(0.5);\n\n\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: handle.color,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true\n\t\t\t\t});\n\n\t\t\tlet outlineMaterial = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: 0x000000, \n\t\t\t\tside: THREE.BackSide,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true});\n\n\t\t\tlet pickMaterial = new THREE.MeshNormalMaterial({\n\t\t\t\topacity: 0.2,\n\t\t\t\ttransparent: true,\n\t\t\t\tvisible: this.showPickVolumes});\n\n\t\t\tlet sphere = new THREE.Mesh(sgSphere, material);\n\t\t\tsphere.scale.set(1.3, 1.3, 1.3);\n\t\t\tsphere.name = `${handleName}.handle`;\n\t\t\tnode.add(sphere);\n\t\t\t\n\t\t\tlet outline = new THREE.Mesh(sgSphere, outlineMaterial);\n\t\t\toutline.scale.set(1.4, 1.4, 1.4);\n\t\t\toutline.name = `${handleName}.outline`;\n\t\t\tsphere.add(outline);\n\n\t\t\tlet pickSphere = new THREE.Mesh(sgLowPolySphere, pickMaterial);\n\t\t\tpickSphere.name = `${handleName}.pick_volume`;\n\t\t\tpickSphere.scale.set(3, 3, 3);\n\t\t\tsphere.add(pickSphere);\n\t\t\tpickSphere.handle = handleName;\n\t\t\tthis.pickVolumes.push(pickSphere);\n\n\t\t\tnode.setOpacity = (target) => {\n\t\t\t\tlet opacity = {x: material.opacity};\n\t\t\t\tlet t = new TWEEN.Tween(opacity).to({x: target}, 100);\n\t\t\t\tt.onUpdate(() => {\n\t\t\t\t\tsphere.visible = opacity.x > 0;\n\t\t\t\t\tpickSphere.visible = opacity.x > 0;\n\t\t\t\t\tmaterial.opacity = opacity.x;\n\t\t\t\t\toutlineMaterial.opacity = opacity.x;\n\t\t\t\t\tpickSphere.material.opacity = opacity.x * 0.5;\n\t\t\t\t});\n\t\t\t\tt.start();\n\t\t\t};\n\n\t\t\tpickSphere.addEventListener(\"drag\", (e) => this.dragScaleHandle(e));\n\t\t\tpickSphere.addEventListener(\"drop\", (e) => this.dropScaleHandle(e));\n\n\t\t\tpickSphere.addEventListener(\"mouseover\", e => {\n\t\t\t\t//node.setOpacity(1);\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"click\", e => {\n\t\t\t\te.consume();\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"mouseleave\", e => {\n\t\t\t\t//node.setOpacity(0.4);\n\t\t\t});\n\t\t}\n\t}\n\n\tinitializeFocusHandles(){\n\t\t//let sgBox = new THREE.BoxGeometry(1, 1, 1);\n\t\tlet sgPlane = new THREE.PlaneGeometry(4, 4, 1, 1);\n\t\tlet sgLowPolySphere = new THREE.SphereGeometry(1, 16, 16);\n\n\t\tlet texture = new THREE.TextureLoader().load(`${exports.resourcePath}/icons/eye_2.png`);\n\n\t\tfor(let handleName of Object.keys(this.focusHandles)){\n\t\t\tlet handle = this.focusHandles[handleName];\n\t\t\tlet node = handle.node;\n\t\t\tthis.scene.add(node);\n\t\t\tlet align = handle.alignment;\n\n\t\t\t//node.lookAt(new THREE.Vector3().addVectors(node.position, new THREE.Vector3(...align)));\n\t\t\tnode.lookAt(new THREE.Vector3(...align));\n\n\t\t\tlet off = 0.8;\n\t\t\tif(align[0] === 1){\n\t\t\t\tnode.position.set(1, off, -off).multiplyScalar(0.5);\n\t\t\t\tnode.rotation.z = Math.PI / 2;\n\t\t\t}else if(align[0] === -1){\n\t\t\t\tnode.position.set(-1, -off, -off).multiplyScalar(0.5);\n\t\t\t\tnode.rotation.z = Math.PI / 2;\n\t\t\t}else if(align[1] === 1){\n\t\t\t\tnode.position.set(-off, 1, -off).multiplyScalar(0.5);\n\t\t\t\tnode.rotation.set(Math.PI / 2, Math.PI, 0.0);\n\t\t\t}else if(align[1] === -1){\n\t\t\t\tnode.position.set(off, -1, -off).multiplyScalar(0.5);\n\t\t\t\tnode.rotation.set(Math.PI / 2, 0.0, 0.0);\n\t\t\t}else if(align[2] === 1){\n\t\t\t\tnode.position.set(off, off, 1).multiplyScalar(0.5);\n\t\t\t}else if(align[2] === -1){\n\t\t\t\tnode.position.set(-off, off, -1).multiplyScalar(0.5);\n\t\t\t}\n\n\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: handle.color,\n\t\t\t\topacity: 0,\n\t\t\t\ttransparent: true,\n\t\t\t\tmap: texture\n\t\t\t});\n\n\t\t\t//let outlineMaterial = new THREE.MeshBasicMaterial({\n\t\t\t//\tcolor: 0x000000, \n\t\t\t//\tside: THREE.BackSide,\n\t\t\t//\topacity: 0,\n\t\t\t//\ttransparent: true});\n\n\t\t\tlet pickMaterial = new THREE.MeshNormalMaterial({\n\t\t\t\t//opacity: 0,\n\t\t\t\ttransparent: true,\n\t\t\t\tvisible: this.showPickVolumes});\n\n\t\t\tlet box = new THREE.Mesh(sgPlane, material);\n\t\t\tbox.name = `${handleName}.handle`;\n\t\t\tbox.scale.set(1.5, 1.5, 1.5);\n\t\t\tbox.position.set(0, 0, 0);\n\t\t\tbox.visible = false;\n\t\t\tnode.add(box);\n\t\t\t//handle.focusNode = box;\n\t\t\t\n\t\t\t//let outline = new THREE.Mesh(sgPlane, outlineMaterial);\n\t\t\t//outline.scale.set(1.4, 1.4, 1.4);\n\t\t\t//outline.name = `${handleName}.outline`;\n\t\t\t//box.add(outline);\n\n\t\t\tlet pickSphere = new THREE.Mesh(sgLowPolySphere, pickMaterial);\n\t\t\tpickSphere.name = `${handleName}.pick_volume`;\n\t\t\tpickSphere.scale.set(3, 3, 3);\n\t\t\tbox.add(pickSphere);\n\t\t\tpickSphere.handle = handleName;\n\t\t\tthis.pickVolumes.push(pickSphere);\n\n\t\t\tnode.setOpacity = (target) => {\n\t\t\t\tlet opacity = {x: material.opacity};\n\t\t\t\tlet t = new TWEEN.Tween(opacity).to({x: target}, 100);\n\t\t\t\tt.onUpdate(() => {\n\t\t\t\t\tpickSphere.visible = opacity.x > 0;\n\t\t\t\t\tbox.visible = opacity.x > 0;\n\t\t\t\t\tmaterial.opacity = opacity.x;\n\t\t\t\t\t//outlineMaterial.opacity = opacity.x;\n\t\t\t\t\tpickSphere.material.opacity = opacity.x * 0.5;\n\t\t\t\t});\n\t\t\t\tt.start();\n\t\t\t};\n\n\t\t\tpickSphere.addEventListener(\"drag\", e => {});\n\n\t\t\tpickSphere.addEventListener(\"mouseup\", e => {\n\t\t\t\te.consume();\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"mousedown\", e => {\n\t\t\t\te.consume();\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"click\", e => {\n\t\t\t\te.consume();\n\n\t\t\t\tlet selected = this.selection[0];\n\t\t\t\tlet maxScale = Math.max(...selected.scale.toArray());\n\t\t\t\tlet minScale = Math.min(...selected.scale.toArray());\n\t\t\t\tlet handleLength = Math.abs(selected.scale.dot(new THREE.Vector3(...handle.alignment)));\n\t\t\t\tlet alignment = new THREE.Vector3(...handle.alignment).multiplyScalar(2 * maxScale / handleLength);\n\t\t\t\talignment.applyMatrix4(selected.matrixWorld);\n\t\t\t\tlet newCamPos = alignment;\n\t\t\t\tlet newCamTarget = selected.getWorldPosition(new THREE.Vector3());\n\n\t\t\t\tUtils.moveTo(this.viewer.scene, newCamPos, newCamTarget);\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"mouseover\", e => {\n\t\t\t\t//box.setOpacity(1);\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"mouseleave\", e => {\n\t\t\t\t//box.setOpacity(0.4);\n\t\t\t});\n\t\t}\n\t}\n\n\tinitializeTranslationHandles(){\n\t\tlet boxGeometry = new THREE.BoxGeometry(1, 1, 1);\n\n\t\tfor(let handleName of Object.keys(this.translationHandles)){\n\t\t\tlet handle = this.handles[handleName];\n\t\t\tlet node = handle.node;\n\t\t\tthis.scene.add(node);\n\n\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: handle.color,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true});\n\n\t\t\tlet outlineMaterial = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: 0x000000, \n\t\t\t\tside: THREE.BackSide,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true});\n\n\t\t\tlet pickMaterial = new THREE.MeshNormalMaterial({\n\t\t\t\topacity: 0.2,\n\t\t\t\ttransparent: true,\n\t\t\t\tvisible: this.showPickVolumes\n\t\t\t});\n\n\t\t\tlet box = new THREE.Mesh(boxGeometry, material);\n\t\t\tbox.name = `${handleName}.handle`;\n\t\t\tbox.scale.set(0.2, 0.2, 40);\n\t\t\tbox.lookAt(new THREE.Vector3(...handle.alignment));\n\t\t\tbox.renderOrder = 10;\n\t\t\tnode.add(box);\n\t\t\thandle.translateNode = box;\n\n\t\t\tlet outline = new THREE.Mesh(boxGeometry, outlineMaterial);\n\t\t\toutline.name = `${handleName}.outline`;\n\t\t\toutline.scale.set(3, 3, 1.03);\n\t\t\toutline.renderOrder = 0;\n\t\t\tbox.add(outline);\n\n\t\t\tlet pickVolume = new THREE.Mesh(boxGeometry, pickMaterial);\n\t\t\tpickVolume.name = `${handleName}.pick_volume`;\n\t\t\tpickVolume.scale.set(12, 12, 1.1);\n\t\t\tpickVolume.handle = handleName;\n\t\t\tbox.add(pickVolume);\n\t\t\tthis.pickVolumes.push(pickVolume);\n\n\t\t\tnode.setOpacity = (target) => {\n\t\t\t\tlet opacity = {x: material.opacity};\n\t\t\t\tlet t = new TWEEN.Tween(opacity).to({x: target}, 100);\n\t\t\t\tt.onUpdate(() => {\n\t\t\t\t\tbox.visible = opacity.x > 0;\n\t\t\t\t\tpickVolume.visible = opacity.x > 0;\n\t\t\t\t\tmaterial.opacity = opacity.x;\n\t\t\t\t\toutlineMaterial.opacity = opacity.x;\n\t\t\t\t\tpickMaterial.opacity = opacity.x * 0.5;\n\t\t\t\t});\n\t\t\t\tt.start();\n\t\t\t};\n\n\t\t\tpickVolume.addEventListener(\"drag\", (e) => {this.dragTranslationHandle(e)});\n\t\t\tpickVolume.addEventListener(\"drop\", (e) => {this.dropTranslationHandle(e)});\n\t\t}\n\t}\n\n\tinitializeRotationHandles(){\n\t\tlet adjust = 0.5;\n\t\tlet torusGeometry = new THREE.TorusGeometry(1, adjust * 0.015, 8, 64, Math.PI / 2);\n\t\tlet outlineGeometry = new THREE.TorusGeometry(1, adjust * 0.04, 8, 64, Math.PI / 2);\n\t\tlet pickGeometry = new THREE.TorusGeometry(1, adjust * 0.1, 6, 4, Math.PI / 2);\n\n\t\tfor(let handleName of Object.keys(this.rotationHandles)){\n\t\t\tlet handle = this.handles[handleName];\n\t\t\tlet node = handle.node;\n\t\t\tthis.scene.add(node);\n\n\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: handle.color,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true});\n\n\t\t\tlet outlineMaterial = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: 0x000000, \n\t\t\t\tside: THREE.BackSide,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true});\n\n\t\t\tlet pickMaterial = new THREE.MeshNormalMaterial({\n\t\t\t\topacity: 0.2,\n\t\t\t\ttransparent: true,\n\t\t\t\tvisible: this.showPickVolumes\n\t\t\t});\n\n\t\t\tlet box = new THREE.Mesh(torusGeometry, material);\n\t\t\tbox.name = `${handleName}.handle`;\n\t\t\tbox.scale.set(20, 20, 20);\n\t\t\tbox.lookAt(new THREE.Vector3(...handle.alignment));\n\t\t\tnode.add(box);\n\t\t\thandle.translateNode = box;\n\n\t\t\tlet outline = new THREE.Mesh(outlineGeometry, outlineMaterial);\n\t\t\toutline.name = `${handleName}.outline`;\n\t\t\toutline.scale.set(1, 1, 1);\n\t\t\toutline.renderOrder = 0;\n\t\t\tbox.add(outline);\n\n\t\t\tlet pickVolume = new THREE.Mesh(pickGeometry, pickMaterial);\n\t\t\tpickVolume.name = `${handleName}.pick_volume`;\n\t\t\tpickVolume.scale.set(1, 1, 1);\n\t\t\tpickVolume.handle = handleName;\n\t\t\tbox.add(pickVolume);\n\t\t\tthis.pickVolumes.push(pickVolume);\n\n\t\t\tnode.setOpacity = (target) => {\n\t\t\t\tlet opacity = {x: material.opacity};\n\t\t\t\tlet t = new TWEEN.Tween(opacity).to({x: target}, 100);\n\t\t\t\tt.onUpdate(() => {\n\t\t\t\t\tbox.visible = opacity.x > 0;\n\t\t\t\t\tpickVolume.visible = opacity.x > 0;\n\t\t\t\t\tmaterial.opacity = opacity.x;\n\t\t\t\t\toutlineMaterial.opacity = opacity.x;\n\t\t\t\t\tpickMaterial.opacity = opacity.x * 0.5;\n\t\t\t\t});\n\t\t\t\tt.start();\n\t\t\t};\n\n\n\t\t\t//pickVolume.addEventListener(\"mouseover\", (e) => {\n\t\t\t//\t//let a = this.viewer.scene.getActiveCamera().getWorldDirection(new THREE.Vector3()).dot(pickVolume.getWorldDirection(new THREE.Vector3()));\n\t\t\t//\tconsole.log(pickVolume.getWorldDirection(new THREE.Vector3()));\n\t\t\t//});\n\t\t\t\n\t\t\tpickVolume.addEventListener(\"drag\", (e) => {this.dragRotationHandle(e)});\n\t\t\tpickVolume.addEventListener(\"drop\", (e) => {this.dropRotationHandle(e)});\n\t\t}\n\t}\n\n\tdragRotationHandle(e){\n\t\tlet drag = e.drag;\n\t\tlet handle = this.activeHandle;\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\n\t\tif(!handle){\n\t\t\treturn\n\t\t};\n\n\t\tlet localNormal = new THREE.Vector3(...handle.alignment);\n\t\tlet n = new THREE.Vector3();\n\t\tn.copy(new THREE.Vector4(...localNormal.toArray(), 0).applyMatrix4(handle.node.matrixWorld));\n\t\tn.normalize();\n\n\t\tif (!drag.intersectionStart){\n\n\t\t\t//this.viewer.scene.scene.remove(this.debug);\n\t\t\t//this.debug = new THREE.Object3D();\n\t\t\t//this.viewer.scene.scene.add(this.debug);\n\t\t\t//Utils.debugSphere(this.debug, drag.location, 3, 0xaaaaaa);\n\t\t\t//let debugEnd = drag.location.clone().add(n.clone().multiplyScalar(20));\n\t\t\t//Utils.debugLine(this.debug, drag.location, debugEnd, 0xff0000);\n\n\t\t\tdrag.intersectionStart = drag.location;\n\t\t\tdrag.objectStart = drag.object.getWorldPosition(new THREE.Vector3());\n\t\t\tdrag.handle = handle;\n\n\t\t\tlet plane = new THREE.Plane().setFromNormalAndCoplanarPoint(n, drag.intersectionStart);\n\n\t\t\tdrag.dragPlane = plane;\n\t\t\tdrag.pivot = drag.intersectionStart;\n\t\t}else{\n\t\t\thandle = drag.handle;\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tlet mouse = drag.end;\n\t\tlet domElement = this.viewer.renderer.domElement;\n\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\t\t\n\t\tlet I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());\n\n\t\tif (I) {\n\t\t\tlet center = this.scene.getWorldPosition(new THREE.Vector3());\n\t\t\tlet from = drag.pivot;\n\t\t\tlet to = I;\n\n\t\t\tlet v1 = from.clone().sub(center).normalize();\n\t\t\tlet v2 = to.clone().sub(center).normalize();\n\n\t\t\tlet angle = Math.acos(v1.dot(v2));\n\t\t\tlet sign = Math.sign(v1.cross(v2).dot(n));\n\t\t\tangle = angle * sign;\n\t\t\tif (Number.isNaN(angle)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet normal = new THREE.Vector3(...handle.alignment);\n\t\t\tfor (let selection of this.selection) {\n\t\t\t\tselection.rotateOnAxis(normal, angle);\n\t\t\t\tselection.dispatchEvent({\n\t\t\t\t\ttype: \"orientation_changed\",\n\t\t\t\t\tobject: selection\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tdrag.pivot = I;\n\t\t}\n\t}\n\n\tdropRotationHandle(e){\n\t\tthis.dragging = false;\n\t\tthis.setActiveHandle(null);\n\t}\n\n\tdragTranslationHandle(e){\n\t\tlet drag = e.drag;\n\t\tlet handle = this.activeHandle;\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\t\t\n\t\tif(!drag.intersectionStart && handle){\n\t\t\tdrag.intersectionStart = drag.location;\n\t\t\tdrag.objectStart = drag.object.getWorldPosition(new THREE.Vector3());\n\n\t\t\tlet start = drag.intersectionStart;\n\t\t\tlet dir = new THREE.Vector4(...handle.alignment, 0).applyMatrix4(this.scene.matrixWorld);\n\t\t\tlet end = new THREE.Vector3().addVectors(start, dir);\n\t\t\tlet line = new THREE.Line3(start.clone(), end.clone());\n\t\t\tdrag.line = line;\n\n\t\t\tlet camOnLine = line.closestPointToPoint(camera.position, false, new THREE.Vector3());\n\t\t\tlet normal = new THREE.Vector3().subVectors(camera.position, camOnLine);\n\t\t\tlet plane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, drag.intersectionStart);\n\t\t\tdrag.dragPlane = plane;\n\t\t\tdrag.pivot = drag.intersectionStart;\n\t\t}else{\n\t\t\thandle = drag.handle;\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\t{\n\t\t\tlet mouse = drag.end;\n\t\t\tlet domElement = this.viewer.renderer.domElement;\n\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\t\t\tlet I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());\n\n\t\t\tif (I) {\n\t\t\t\tlet iOnLine = drag.line.closestPointToPoint(I, false, new THREE.Vector3());\n\n\t\t\t\tlet diff = new THREE.Vector3().subVectors(iOnLine, drag.pivot);\n\n\t\t\t\tfor (let selection of this.selection) {\n\t\t\t\t\tselection.position.add(diff);\n\t\t\t\t\tselection.dispatchEvent({\n\t\t\t\t\t\ttype: \"position_changed\",\n\t\t\t\t\t\tobject: selection\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdrag.pivot = drag.pivot.add(diff);\n\t\t\t}\n\t\t}\n\t}\n\n\tdropTranslationHandle(e){\n\t\tthis.dragging = false;\n\t\tthis.setActiveHandle(null);\n\t}\n\n\tdropScaleHandle(e){\n\t\tthis.dragging = false;\n\t\tthis.setActiveHandle(null);\n\t}\n\n\tdragScaleHandle(e){\n\t\tlet drag = e.drag;\n\t\tlet handle = this.activeHandle;\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\n\t\tif(!drag.intersectionStart){\n\t\t\tdrag.intersectionStart = drag.location;\n\t\t\tdrag.objectStart = drag.object.getWorldPosition(new THREE.Vector3());\n\t\t\tdrag.handle = handle;\n\n\t\t\tlet start = drag.intersectionStart;\n\t\t\tlet dir = new THREE.Vector4(...handle.alignment, 0).applyMatrix4(this.scene.matrixWorld);\n\t\t\tlet end = new THREE.Vector3().addVectors(start, dir);\n\t\t\tlet line = new THREE.Line3(start.clone(), end.clone());\n\t\t\tdrag.line = line;\n\n\t\t\tlet camOnLine = line.closestPointToPoint(camera.position, false, new THREE.Vector3());\n\t\t\tlet normal = new THREE.Vector3().subVectors(camera.position, camOnLine);\n\t\t\tlet plane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, drag.intersectionStart);\n\t\t\tdrag.dragPlane = plane;\n\t\t\tdrag.pivot = drag.intersectionStart;\n\n\t\t\t//Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05);\n\t\t}else{\n\t\t\thandle = drag.handle;\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\t{\n\t\t\tlet mouse = drag.end;\n\t\t\tlet domElement = this.viewer.renderer.domElement;\n\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\t\t\tlet I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());\n\n\t\t\tif (I) {\n\t\t\t\tlet iOnLine = drag.line.closestPointToPoint(I, false, new THREE.Vector3());\n\t\t\t\tlet direction = handle.alignment.reduce( (a, v) => a + v, 0);\n\n\t\t\t\tlet toObjectSpace = new THREE.Matrix4().getInverse( this.selection[0].matrixWorld);\n\t\t\t\tlet iOnLineOS = iOnLine.clone().applyMatrix4(toObjectSpace);\n\t\t\t\tlet pivotOS = drag.pivot.clone().applyMatrix4(toObjectSpace);\n\t\t\t\tlet diffOS = new THREE.Vector3().subVectors(iOnLineOS, pivotOS);\n\t\t\t\tlet dragDirectionOS = diffOS.clone().normalize();\n\t\t\t\tif(iOnLine.distanceTo(drag.pivot) === 0){\n\t\t\t\t\tdragDirectionOS.set(0, 0, 0);\n\t\t\t\t}\n\t\t\t\tlet dragDirection = dragDirectionOS.dot(new THREE.Vector3(...handle.alignment));\n\n\t\t\t\tlet diff = new THREE.Vector3().subVectors(iOnLine, drag.pivot);\n\t\t\t\tlet diffScale = new THREE.Vector3(...handle.alignment).multiplyScalar(diff.length() * direction * dragDirection);\n\t\t\t\tlet diffPosition = diff.clone().multiplyScalar(0.5);\n\n\t\t\t\tfor (let selection of this.selection) {\n\t\t\t\t\tselection.scale.add(diffScale);\n\t\t\t\t\tselection.scale.x = Math.max(0.1, selection.scale.x);\n\t\t\t\t\tselection.scale.y = Math.max(0.1, selection.scale.y);\n\t\t\t\t\tselection.scale.z = Math.max(0.1, selection.scale.z);\n\t\t\t\t\tselection.position.add(diffPosition);\n\t\t\t\t\tselection.dispatchEvent({\n\t\t\t\t\t\ttype: \"position_changed\",\n\t\t\t\t\t\tobject: selection\n\t\t\t\t\t});\n\t\t\t\t\tselection.dispatchEvent({\n\t\t\t\t\t\ttype: \"scale_changed\",\n\t\t\t\t\t\tobject: selection\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdrag.pivot.copy(iOnLine);\n\t\t\t\t//Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05);\n\t\t\t}\n\t\t}\n\t}\n\n\tsetActiveHandle(handle){\n\t\tif(this.dragging){\n\t\t\treturn;\n\t\t}\n\n\t\tif(this.activeHandle === handle){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.activeHandle = handle;\n\n\t\tif(handle === null){\n\t\t\tfor(let handleName of Object.keys(this.handles)){\n\t\t\t\tlet handle = this.handles[handleName];\n\t\t\t\thandle.node.setOpacity(0);\n\t\t\t}\n\t\t}\n\n\t\tfor(let handleName of Object.keys(this.focusHandles)){\n\t\t\tlet handle = this.focusHandles[handleName];\n\n\t\t\tif(this.activeHandle === handle){\n\t\t\t\thandle.node.setOpacity(1.0);\n\t\t\t}else{\n\t\t\t\thandle.node.setOpacity(0.4)\n\t\t\t}\n\t\t}\n\n\t\tfor(let handleName of Object.keys(this.translationHandles)){\n\t\t\tlet handle = this.translationHandles[handleName];\n\n\t\t\tif(this.activeHandle === handle){\n\t\t\t\thandle.node.setOpacity(1.0);\n\t\t\t}else{\n\t\t\t\thandle.node.setOpacity(0.4)\n\t\t\t}\n\t\t}\n\n\t\tfor(let handleName of Object.keys(this.rotationHandles)){\n\t\t\tlet handle = this.rotationHandles[handleName];\n\n\t\t\t//if(this.activeHandle === handle){\n\t\t\t//\thandle.node.setOpacity(1.0);\n\t\t\t//}else{\n\t\t\t//\thandle.node.setOpacity(0.4)\n\t\t\t//}\n\n\t\t\thandle.node.setOpacity(0.4);\n\t\t}\n\n\t\tfor(let handleName of Object.keys(this.scaleHandles)){\n\t\t\tlet handle = this.scaleHandles[handleName];\n\n\t\t\tif(this.activeHandle === handle){\n\t\t\t\thandle.node.setOpacity(1.0);\n\n\t\t\t\tlet relatedFocusHandle = this.focusHandles[handle.name.replace(\"scale\", \"focus\")];\n\t\t\t\tlet relatedFocusNode = relatedFocusHandle.node;\n\t\t\t\trelatedFocusNode.setOpacity(0.4);\n\n\t\t\t\tfor(let translationHandleName of Object.keys(this.translationHandles)){\n\t\t\t\t\tlet translationHandle = this.translationHandles[translationHandleName];\n\t\t\t\t\ttranslationHandle.node.setOpacity(0.4);\n\t\t\t\t}\n\n\t\t\t\t//let relatedTranslationHandle = this.translationHandles[\n\t\t\t\t//\thandle.name.replace(\"scale\", \"translation\").replace(/[+-]/g, \"\")];\n\t\t\t\t//let relatedTranslationNode = relatedTranslationHandle.node;\n\t\t\t\t//relatedTranslationNode.setOpacity(0.4);\n\n\n\t\t\t}else{\n\t\t\t\thandle.node.setOpacity(0.4)\n\t\t\t}\n\t\t}\n\n\t\t\n\n\n\n\t\tif(handle){\n\t\t\thandle.node.setOpacity(1.0);\n\t\t}\n\n\t\t\n\t}\n\n\tupdate () {\n\n\t\tif(this.selection.length === 1){\n\n\t\t\tthis.scene.visible = true;\n\n\t\t\tthis.scene.updateMatrix();\n\t\t\tthis.scene.updateMatrixWorld();\n\n\t\t\tlet selected = this.selection[0];\n\t\t\tlet world = selected.matrixWorld;\n\t\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\t\tlet domElement = this.viewer.renderer.domElement;\n\t\t\tlet mouse = this.viewer.inputHandler.mouse;\n\n\t\t\tlet center = selected.boundingBox.getCenter(new THREE.Vector3()).clone().applyMatrix4(selected.matrixWorld);\n\n\t\t\tthis.scene.scale.copy(selected.boundingBox.getSize(new THREE.Vector3()).multiply(selected.scale));\n\t\t\tthis.scene.position.copy(center);\n\t\t\tthis.scene.rotation.copy(selected.rotation);\n\n\t\t\tthis.scene.updateMatrixWorld();\n\n\t\t\t{\n\t\t\t\t// adjust scale of components\n\t\t\t\tfor(let handleName of Object.keys(this.handles)){\n\t\t\t\t\tlet handle = this.handles[handleName];\n\t\t\t\t\tlet node = handle.node;\n\n\t\t\t\t\tlet handlePos = node.getWorldPosition(new THREE.Vector3());\n\t\t\t\t\tlet distance = handlePos.distanceTo(camera.position);\n\t\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, domElement.clientWidth, domElement.clientHeight);\n\n\t\t\t\t\tlet ws = node.parent.getWorldScale(new THREE.Vector3());\n\n\t\t\t\t\tlet s = (7 / pr);\n\t\t\t\t\tlet scale = new THREE.Vector3(s, s, s).divide(ws);\n\n\t\t\t\t\tlet rot = new THREE.Matrix4().makeRotationFromEuler(node.rotation);\n\t\t\t\t\tlet rotInv = new THREE.Matrix4().getInverse(rot);\n\n\t\t\t\t\tscale.applyMatrix4(rotInv);\n\t\t\t\t\tscale.x = Math.abs(scale.x);\n\t\t\t\t\tscale.y = Math.abs(scale.y);\n\t\t\t\t\tscale.z = Math.abs(scale.z);\n\n\t\t\t\t\tnode.scale.copy(scale);\n\t\t\t\t}\n\n\t\t\t\t// adjust rotation handles\n\t\t\t\tif(!this.dragging){\n\t\t\t\t\tlet tWorld = this.scene.matrixWorld;\n\t\t\t\t\tlet tObject = new THREE.Matrix4().getInverse(tWorld)\n\t\t\t\t\tlet camObjectPos = camera.getWorldPosition(new THREE.Vector3()).applyMatrix4(tObject);\n\n\t\t\t\t\tlet x = this.rotationHandles[\"rotation.x\"].node.rotation;\n\t\t\t\t\tlet y = this.rotationHandles[\"rotation.y\"].node.rotation;\n\t\t\t\t\tlet z = this.rotationHandles[\"rotation.z\"].node.rotation;\n\n\t\t\t\t\tx.order = \"ZYX\";\n\t\t\t\t\ty.order = \"ZYX\";\n\n\t\t\t\t\tlet above = camObjectPos.z > 0;\n\t\t\t\t\tlet below = !above;\n\t\t\t\t\tlet PI_HALF = Math.PI / 2;\n\n\t\t\t\t\tif(above){\n\t\t\t\t\t\tif(camObjectPos.x > 0 && camObjectPos.y > 0){\n\t\t\t\t\t\t\tx.x = 1 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 3 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 0 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x < 0 && camObjectPos.y > 0){\n\t\t\t\t\t\t\tx.x = 1 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 2 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 1 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x < 0 && camObjectPos.y < 0){\n\t\t\t\t\t\t\tx.x = 2 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 2 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 2 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x > 0 && camObjectPos.y < 0){\n\t\t\t\t\t\t\tx.x = 2 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 3 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 3 * PI_HALF;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if(below){\n\t\t\t\t\t\tif(camObjectPos.x > 0 && camObjectPos.y > 0){\n\t\t\t\t\t\t\tx.x = 0 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 0 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 0 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x < 0 && camObjectPos.y > 0){\n\t\t\t\t\t\t\tx.x = 0 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 1 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 1 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x < 0 && camObjectPos.y < 0){\n\t\t\t\t\t\t\tx.x = 3 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 1 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 2 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x > 0 && camObjectPos.y < 0){\n\t\t\t\t\t\t\tx.x = 3 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 0 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 3 * PI_HALF;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\t\t\t\t\tlet raycaster = new THREE.Raycaster(ray.origin, ray.direction);\n\t\t\t\t\tlet intersects = raycaster.intersectObjects(this.pickVolumes.filter(v => v.visible), true);\n\n\t\t\t\t\tif(intersects.length > 0){\n\t\t\t\t\t\tlet I = intersects[0];\n\t\t\t\t\t\tlet handleName = I.object.handle;\n\t\t\t\t\t\tthis.setActiveHandle(this.handles[handleName]);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tthis.setActiveHandle(null);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// \n\t\t\t\tfor(let handleName of Object.keys(this.scaleHandles)){\n\t\t\t\t\tlet handle = this.handles[handleName];\n\t\t\t\t\tlet node = handle.node;\n\t\t\t\t\tlet alignment = handle.alignment;\n\n\t\t\t\t\t\n\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\t{\n\t\t\t\tlet axisScale = (alignment) => {\n\t\t\t\t\tlet transformed = new THREE.Vector3(...alignment).applyMatrix4(selected.matrixWorld);\n\t\t\t\t\tlet distance = transformed.distanceTo(selected.getWorldPosition(new THREE.Vector3()));\n\n\t\t\t\t\treturn distance;\n\t\t\t\t};\n\n\t\t\t\tlet scale = new THREE.Vector3(\n\t\t\t\t\taxisScale([1, 0, 0]),\n\t\t\t\t\taxisScale([0, 1, 0]),\n\t\t\t\t\taxisScale([0, 0, 1]),\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}else{\n\t\t\tthis.scene.visible = false;\n\t\t}\n\t\t\n\t}\n\n};\n","\n\nimport {Volume, BoxVolume} from \"./Volume.js\";\nimport {Utils} from \"../utils.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\n\nexport class VolumeTool extends EventDispatcher{\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.addEventListener('start_inserting_volume', e => {\n\t\t\tthis.viewer.dispatchEvent({\n\t\t\t\ttype: 'cancel_insertions'\n\t\t\t});\n\t\t});\n\n\t\tthis.scene = new THREE.Scene();\n\t\tthis.scene.name = 'scene_volume';\n\n\t\tthis.viewer.inputHandler.registerInteractiveScene(this.scene);\n\n\t\tthis.onRemove = e => {\n\t\t\tthis.scene.remove(e.volume);\n\t\t};\n\n\t\tthis.onAdd = e => {\n\t\t\tthis.scene.add(e.volume);\n\t\t};\n\n\t\tfor(let volume of viewer.scene.volumes){\n\t\t\tthis.onAdd({volume: volume});\n\t\t}\n\n\t\tthis.viewer.inputHandler.addEventListener('delete', e => {\n\t\t\tlet volumes = e.selection.filter(e => (e instanceof Volume));\n\t\t\tvolumes.forEach(e => this.viewer.scene.removeVolume(e));\n\t\t});\n\n\t\tviewer.addEventListener(\"update\", this.update.bind(this));\n\t\tviewer.addEventListener(\"render.pass.scene\", e => this.render(e));\n\t\tviewer.addEventListener(\"scene_changed\", this.onSceneChange.bind(this));\n\n\t\tviewer.scene.addEventListener('volume_added', this.onAdd);\n\t\tviewer.scene.addEventListener('volume_removed', this.onRemove);\n\t}\n\n\tonSceneChange(e){\n\t\tif(e.oldScene){\n\t\t\te.oldScene.removeEventListeners('volume_added', this.onAdd);\n\t\t\te.oldScene.removeEventListeners('volume_removed', this.onRemove);\n\t\t}\n\n\t\te.scene.addEventListener('volume_added', this.onAdd);\n\t\te.scene.addEventListener('volume_removed', this.onRemove);\n\t}\n\n\tstartInsertion (args = {}) {\n\t\tlet volume;\n\t\tif(args.type){\n\t\t\tvolume = new args.type();\n\t\t}else{\n\t\t\tvolume = new BoxVolume();\n\t\t}\n\t\t\n\t\tvolume.clip = args.clip || false;\n\t\tvolume.name = args.name || 'Volume';\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'start_inserting_volume',\n\t\t\tvolume: volume\n\t\t});\n\n\t\tthis.viewer.scene.addVolume(volume);\n\t\tthis.scene.add(volume);\n\n\t\tlet cancel = {\n\t\t\tcallback: null\n\t\t};\n\n\t\tlet drag = e => {\n\t\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\t\t\n\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\te.drag.end, \n\t\t\t\tthis.viewer.scene.getActiveCamera(), \n\t\t\t\tthis.viewer, \n\t\t\t\tthis.viewer.scene.pointclouds, \n\t\t\t\t{pickClipped: false});\n\n\t\t\tif (I) {\n\t\t\t\tvolume.position.copy(I.location);\n\n\t\t\t\tlet wp = volume.getWorldPosition(new THREE.Vector3()).applyMatrix4(camera.matrixWorldInverse);\n\t\t\t\t// let pp = new THREE.Vector4(wp.x, wp.y, wp.z).applyMatrix4(camera.projectionMatrix);\n\t\t\t\tlet w = Math.abs((wp.z / 5));\n\t\t\t\tvolume.scale.set(w, w, w);\n\t\t\t}\n\t\t};\n\n\t\tlet drop = e => {\n\t\t\tvolume.removeEventListener('drag', drag);\n\t\t\tvolume.removeEventListener('drop', drop);\n\n\t\t\tcancel.callback();\n\t\t};\n\n\t\tcancel.callback = e => {\n\t\t\tvolume.removeEventListener('drag', drag);\n\t\t\tvolume.removeEventListener('drop', drop);\n\t\t\tthis.viewer.removeEventListener('cancel_insertions', cancel.callback);\n\t\t};\n\n\t\tvolume.addEventListener('drag', drag);\n\t\tvolume.addEventListener('drop', drop);\n\t\tthis.viewer.addEventListener('cancel_insertions', cancel.callback);\n\n\t\tthis.viewer.inputHandler.startDragging(volume);\n\n\t\treturn volume;\n\t}\n\n\tupdate(){\n\t\tif (!this.viewer.scene) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\tlet renderAreaSize = this.viewer.renderer.getSize(new THREE.Vector2());\n\t\tlet clientWidth = renderAreaSize.width;\n\t\tlet clientHeight = renderAreaSize.height;\n\n\t\tlet volumes = this.viewer.scene.volumes;\n\t\tfor (let volume of volumes) {\n\t\t\tlet label = volume.label;\n\t\t\t\n\t\t\t{\n\n\t\t\t\tlet distance = label.position.distanceTo(camera.position);\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\n\t\t\t\tlet scale = (70 / pr);\n\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\tlet calculatedVolume = volume.getVolume();\n\t\t\tcalculatedVolume = calculatedVolume / Math.pow(this.viewer.lengthUnit.unitspermeter, 3) * Math.pow(this.viewer.lengthUnitDisplay.unitspermeter, 3); //convert to cubic meters then to the cubic display unit\n\t\t\tlet text = Utils.addCommas(calculatedVolume.toFixed(3)) + ' ' + this.viewer.lengthUnitDisplay.code + '\\u00B3';\n\t\t\tlabel.setText(text);\n\t\t}\n\t}\n\n\trender(params){\n\t\tconst renderer = this.viewer.renderer;\n\n\t\tconst oldTarget = renderer.getRenderTarget();\n\t\t\n\t\tif(params.renderTarget){\n\t\t\trenderer.setRenderTarget(params.renderTarget);\n\t\t}\n\t\trenderer.render(this.scene, this.viewer.scene.getActiveCamera());\n\t\trenderer.setRenderTarget(oldTarget);\n\t}\n\n}\n","\r\nimport {Utils} from \"../utils.js\";\r\n\r\nexport class Compass{\r\n\r\n\tconstructor(viewer){\r\n\t\tthis.viewer = viewer;\r\n\r\n\t\tthis.visible = false;\r\n\t\tthis.dom = this.createElement();\r\n\r\n\t\tviewer.addEventListener(\"update\", () => {\r\n\t\t\tconst direction = viewer.scene.view.direction.clone();\r\n\t\t\tdirection.z = 0;\r\n\t\t\tdirection.normalize();\r\n\r\n\t\t\tconst camera = viewer.scene.getActiveCamera();\r\n\r\n\t\t\tconst p1 = camera.getWorldPosition(new THREE.Vector3());\r\n\t\t\tconst p2 = p1.clone().add(direction);\r\n\r\n\t\t\tconst projection = viewer.getProjection();\r\n\t\t\tconst azimuth = Utils.computeAzimuth(p1, p2, projection);\r\n\t\t\t\r\n\t\t\tthis.dom.css(\"transform\", `rotateZ(${-azimuth}rad)`);\r\n\t\t});\r\n\r\n\t\tthis.dom.click( () => {\r\n\t\t\tviewer.setTopView();\r\n\t\t});\r\n\r\n\t\tconst renderArea = $(viewer.renderArea);\r\n\t\trenderArea.append(this.dom);\r\n\r\n\t\tthis.setVisible(this.visible);\r\n\t}\r\n\r\n\tsetVisible(visible){\r\n\t\tthis.visible = visible;\r\n\r\n\t\tconst value = visible ? \"\" : \"none\";\r\n\t\tthis.dom.css(\"display\", value);\r\n\t}\r\n\r\n\tisVisible(){\r\n\t\treturn this.visible;\r\n\t}\r\n\r\n\tcreateElement(){\r\n\t\tconst style = `style=\"position: absolute; top: 10px; right: 10px; z-index: 10000; width: 64px;\"`;\r\n\t\tconst img = $(``);\r\n\r\n\t\treturn img;\r\n\t}\r\n\r\n};","\nexport class PotreeRenderer {\n\n\tconstructor (viewer) {\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\t}\n\n\tclearTargets(){\n\n\t}\n\n\tclear(){\n\t\tlet {viewer, renderer} = this;\n\n\t\t// render skybox\n\t\tif(viewer.background === \"skybox\"){\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t\trenderer.clear(true, true, false);\n\t\t}else if(viewer.background === \"gradient\"){\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t\trenderer.clear(true, true, false);\n\t\t}else if(viewer.background === \"black\"){\n\t\t\trenderer.setClearColor(0x000000, 1);\n\t\t\trenderer.clear(true, true, false);\n\t\t}else if(viewer.background === \"white\"){\n\t\t\trenderer.setClearColor(0xFFFFFF, 1);\n\t\t\trenderer.clear(true, true, false);\n\t\t}else{\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t\trenderer.clear(true, true, false);\n\t\t}\n\t}\n \n\trender(params){\n\t\tlet {viewer, renderer} = this;\n\n\t\tconst camera = params.camera ? params.camera : viewer.scene.getActiveCamera();\n\n\t\tviewer.dispatchEvent({type: \"render.pass.begin\",viewer: viewer});\n\n\t\tconst renderAreaSize = renderer.getSize(new THREE.Vector2());\n\t\tconst width = params.viewport ? params.viewport[2] : renderAreaSize.x;\n\t\tconst height = params.viewport ? params.viewport[3] : renderAreaSize.y;\n\n\n\t\t// render skybox\n\t\tif(viewer.background === \"skybox\"){\n\t\t\tviewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation);\n\t\t\tviewer.skybox.camera.fov = viewer.scene.cameraP.fov;\n\t\t\tviewer.skybox.camera.aspect = viewer.scene.cameraP.aspect;\n\t\t\tviewer.skybox.camera.updateProjectionMatrix();\n\t\t\trenderer.render(viewer.skybox.scene, viewer.skybox.camera);\n\t\t}else if(viewer.background === \"gradient\"){\n\t\t\trenderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG);\n\t\t}\n\t\t\n\t\tfor(let pointcloud of this.viewer.scene.pointclouds){\n\t\t\tconst {material} = pointcloud;\n\t\t\tmaterial.useEDL = false;\n\t\t\t//material.updateShaderSource();\n\t\t}\n\t\t\n\t\tviewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null, {\n\t\t\tclipSpheres: viewer.scene.volumes.filter(v => (v instanceof Potree.SphereVolume)),\n\t\t});\n\t\t\n\t\t// render scene\n\t\trenderer.render(viewer.scene.scene, camera);\n\n\t\tviewer.dispatchEvent({type: \"render.pass.scene\",viewer: viewer});\n\t\t\n\t\tviewer.clippingTool.update();\n\t\trenderer.render(viewer.clippingTool.sceneMarker, viewer.scene.cameraScreenSpace); //viewer.scene.cameraScreenSpace);\n\t\trenderer.render(viewer.clippingTool.sceneVolume, camera);\n\n\t\trenderer.render(viewer.controls.sceneControls, camera);\n\t\t\n\t\trenderer.clearDepth();\n\t\t\n\t\tviewer.transformationTool.update();\n\t\t\n\t\tviewer.dispatchEvent({type: \"render.pass.perspective_overlay\",viewer: viewer});\n\n\t\trenderer.render(viewer.controls.sceneControls, camera);\n\t\trenderer.render(viewer.clippingTool.sceneVolume, camera);\n\t\trenderer.render(viewer.transformationTool.scene, camera);\n\t\t\n\t\trenderer.setViewport(width - viewer.navigationCube.width, \n\t\t\t\t\t\t\t\t\theight - viewer.navigationCube.width, \n\t\t\t\t\t\t\t\t\tviewer.navigationCube.width, viewer.navigationCube.width);\n\t\trenderer.render(viewer.navigationCube, viewer.navigationCube.camera);\t\t\n\t\trenderer.setViewport(0, 0, width, height);\n\t\t\n\t\t// renderer.render(viewer.transformationTool.scene, camera);\n\n\t\t// renderer.setViewport(renderer.domElement.clientWidth - viewer.navigationCube.width, \n\t\t// \t\t\t\t\t\t\trenderer.domElement.clientHeight - viewer.navigationCube.width, \n\t\t// \t\t\t\t\t\t\tviewer.navigationCube.width, viewer.navigationCube.width);\n\t\t// renderer.render(viewer.navigationCube, viewer.navigationCube.camera);\t\t\n\t\t// renderer.setViewport(0, 0, renderer.domElement.clientWidth, renderer.domElement.clientHeight);\n\n\t\tviewer.dispatchEvent({type: \"render.pass.end\",viewer: viewer});\n\t}\n\n}\n","\nimport {PointCloudSM} from \"../utils/PointCloudSM.js\";\nimport {EyeDomeLightingMaterial} from \"../materials/EyeDomeLightingMaterial.js\";\nimport {SphereVolume} from \"../utils/Volume.js\";\nimport {Utils} from \"../utils.js\";\n\nexport class EDLRenderer{\n\tconstructor(viewer){\n\t\tthis.viewer = viewer;\n\n\t\tthis.edlMaterial = null;\n\n\t\tthis.rtRegular;\n\t\tthis.rtEDL;\n\n\t\tthis.gl = viewer.renderer.getContext();\n\n\t\tthis.shadowMap = new PointCloudSM(this.viewer.pRenderer);\n\t}\n\n\tinitEDL(){\n\t\tif (this.edlMaterial != null) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.edlMaterial = new EyeDomeLightingMaterial();\n\t\tthis.edlMaterial.depthTest = true;\n\t\tthis.edlMaterial.depthWrite = true;\n\t\tthis.edlMaterial.transparent = true;\n\n\t\tthis.rtEDL = new THREE.WebGLRenderTarget(1024, 1024, {\n\t\t\tminFilter: THREE.NearestFilter,\n\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\ttype: THREE.FloatType,\n\t\t\tdepthTexture: new THREE.DepthTexture(undefined, undefined, THREE.UnsignedIntType)\n\t\t});\n\n\t\tthis.rtRegular = new THREE.WebGLRenderTarget(1024, 1024, {\n\t\t\tminFilter: THREE.NearestFilter,\n\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\tdepthTexture: new THREE.DepthTexture(undefined, undefined, THREE.UnsignedIntType)\n\t\t});\n\t};\n\n\tresize(width, height){\n\t\tif(this.screenshot){\n\t\t\twidth = this.screenshot.target.width;\n\t\t\theight = this.screenshot.target.height;\n\t\t}\n\n\t\tthis.rtEDL.setSize(width , height);\n\t\tthis.rtRegular.setSize(width , height);\n\t}\n\n\tmakeScreenshot(camera, size, callback){\n\n\t\tif(camera === undefined || camera === null){\n\t\t\tcamera = this.viewer.scene.getActiveCamera();\n\t\t}\n\n\t\tif(size === undefined || size === null){\n\t\t\tsize = this.viewer.renderer.getSize(new THREE.Vector2());\n\t\t}\n\n\t\tlet {width, height} = size;\n\n\t\t//let maxTextureSize = viewer.renderer.capabilities.maxTextureSize;\n\t\t//if(width * 4 < \n\t\twidth = 2 * width;\n\t\theight = 2 * height;\n\n\t\tlet target = new THREE.WebGLRenderTarget(width, height, {\n\t\t\tformat: THREE.RGBAFormat,\n\t\t});\n\n\t\tthis.screenshot = {\n\t\t\ttarget: target\n\t\t};\n\n\t\t// HACK? removed because of error, was this important?\n\t\t//this.viewer.renderer.clearTarget(target, true, true, true);\n\n\t\tthis.render();\n\n\t\tlet pixelCount = width * height;\n\t\tlet buffer = new Uint8Array(4 * pixelCount);\n\n\t\tthis.viewer.renderer.readRenderTargetPixels(target, 0, 0, width, height, buffer);\n\n\t\t// flip vertically\n\t\tlet bytesPerLine = width * 4;\n\t\tfor(let i = 0; i < parseInt(height / 2); i++){\n\t\t\tlet j = height - i - 1;\n\n\t\t\tlet lineI = buffer.slice(i * bytesPerLine, i * bytesPerLine + bytesPerLine);\n\t\t\tlet lineJ = buffer.slice(j * bytesPerLine, j * bytesPerLine + bytesPerLine);\n\t\t\tbuffer.set(lineJ, i * bytesPerLine);\n\t\t\tbuffer.set(lineI, j * bytesPerLine);\n\t\t}\n\n\t\tthis.screenshot.target.dispose();\n\t\tdelete this.screenshot;\n\n\t\treturn {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tbuffer: buffer\n\t\t};\n\t}\n\n\tclearTargets(){\n\t\tconst viewer = this.viewer;\n\t\tconst {renderer} = viewer;\n\n\t\tconst oldTarget = renderer.getRenderTarget();\n\n\t\trenderer.setRenderTarget( this.rtEDL );\n\t\trenderer.clear( true, true, true );\n\n\t\trenderer.setRenderTarget( this.rtRegular );\n\t\trenderer.clear( true, true, false );\n\n\t\trenderer.setRenderTarget(oldTarget);\n\t}\n\n\tclear(){\n\t\tthis.initEDL();\n\t\tconst viewer = this.viewer;\n\n\t\tconst {renderer, background} = viewer;\n\n\t\tif(background === \"skybox\"){\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t} else if (background === 'gradient') {\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t} else if (background === 'black') {\n\t\t\trenderer.setClearColor(0x000000, 1);\n\t\t} else if (background === 'white') {\n\t\t\trenderer.setClearColor(0xFFFFFF, 1);\n\t\t} else {\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t}\n\t\t\n\t\trenderer.clear();\n\n\t\tthis.clearTargets();\n\t}\n\n\trenderShadowMap(visiblePointClouds, camera, lights){\n\n\t\tconst {viewer} = this;\n\n\t\tconst doShadows = lights.length > 0 && !(lights[0].disableShadowUpdates);\n\t\tif(doShadows){\n\t\t\tlet light = lights[0];\n\n\t\t\tthis.shadowMap.setLight(light);\n\n\t\t\tlet originalAttributes = new Map();\n\t\t\tfor(let pointcloud of viewer.scene.pointclouds){\n\t\t\t\t// TODO IMPORTANT !!! check\n\t\t\t\toriginalAttributes.set(pointcloud, pointcloud.material.activeAttributeName);\n\t\t\t\tpointcloud.material.disableEvents();\n\t\t\t\tpointcloud.material.activeAttributeName = \"depth\";\n\t\t\t\t//pointcloud.material.pointColorType = PointColorType.DEPTH;\n\t\t\t}\n\n\t\t\tthis.shadowMap.render(viewer.scene.scenePointCloud, camera);\n\n\t\t\tfor(let pointcloud of visiblePointClouds){\n\t\t\t\tlet originalAttribute = originalAttributes.get(pointcloud);\n\t\t\t\t// TODO IMPORTANT !!! check\n\t\t\t\tpointcloud.material.activeAttributeName = originalAttribute;\n\t\t\t\tpointcloud.material.enableEvents();\n\t\t\t}\n\n\t\t\tviewer.shadowTestCam.updateMatrixWorld();\n\t\t\tviewer.shadowTestCam.matrixWorldInverse.getInverse(viewer.shadowTestCam.matrixWorld);\n\t\t\tviewer.shadowTestCam.updateProjectionMatrix();\n\t\t}\n\n\t}\n\n\trender(params){\n\t\tthis.initEDL();\n\n\t\tconst viewer = this.viewer;\n\t\tconst camera = params.camera ? params.camera : viewer.scene.getActiveCamera();\n\t\tconst {width, height} = this.viewer.renderer.getSize(new THREE.Vector2());\n\n\t\tviewer.dispatchEvent({type: \"render.pass.begin\",viewer: viewer});\n\t\t\n\t\tthis.resize(width, height);\n\n\t\tconst visiblePointClouds = viewer.scene.pointclouds.filter(pc => pc.visible);\n\n\t\tif(this.screenshot){\n\t\t\tlet oldBudget = Potree.pointBudget;\n\t\t\tPotree.pointBudget = Math.max(10 * 1000 * 1000, 2 * oldBudget);\n\t\t\tlet result = Potree.updatePointClouds(\n\t\t\t\tviewer.scene.pointclouds, \n\t\t\t\tcamera, \n\t\t\t\tviewer.renderer);\n\t\t\tPotree.pointBudget = oldBudget;\n\t\t}\n\n\t\tlet lights = [];\n\t\tviewer.scene.scene.traverse(node => {\n\t\t\tif(node instanceof THREE.SpotLight){\n\t\t\t\tlights.push(node);\n\t\t\t}\n\t\t});\n\n\t\tif(viewer.background === \"skybox\"){\n\t\t\tviewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation);\n\t\t\tviewer.skybox.camera.fov = viewer.scene.cameraP.fov;\n\t\t\tviewer.skybox.camera.aspect = viewer.scene.cameraP.aspect;\n\t\t\tviewer.skybox.camera.updateProjectionMatrix();\n\t\t\tviewer.renderer.render(viewer.skybox.scene, viewer.skybox.camera);\n\t\t} else if (viewer.background === 'gradient') {\n\t\t\tviewer.renderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG);\n\t\t} \n\n\t\t//TODO adapt to multiple lights\n\t\tthis.renderShadowMap(visiblePointClouds, camera, lights);\n\n\t\t{ // COLOR & DEPTH PASS\n\t\t\tfor (let pointcloud of visiblePointClouds) {\n\t\t\t\tlet octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x;\n\n\t\t\t\tlet material = pointcloud.material;\n\t\t\t\tmaterial.weighted = false;\n\t\t\t\tmaterial.useLogarithmicDepthBuffer = false;\n\t\t\t\tmaterial.useEDL = true;\n\n\t\t\t\tmaterial.screenWidth = width;\n\t\t\t\tmaterial.screenHeight = height;\n\t\t\t\tmaterial.uniforms.visibleNodes.value = pointcloud.material.visibleNodesTexture;\n\t\t\t\tmaterial.uniforms.octreeSize.value = octreeSize;\n\t\t\t\tmaterial.spacing = pointcloud.pcoGeometry.spacing * Math.max(pointcloud.scale.x, pointcloud.scale.y, pointcloud.scale.z);\n\t\t\t}\n\t\t\t\n\t\t\t// TODO adapt to multiple lights\n\t\t\tviewer.renderer.setRenderTarget(this.rtEDL);\n\t\t\t\n\t\t\tif(lights.length > 0){\n\t\t\t\tviewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtEDL, {\n\t\t\t\t\tclipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)),\n\t\t\t\t\tshadowMaps: [this.shadowMap],\n\t\t\t\t\ttransparent: false,\n\t\t\t\t});\n\t\t\t}else{\n\t\t\t\tviewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtEDL, {\n\t\t\t\t\tclipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)),\n\t\t\t\t\ttransparent: false,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t\n\t\t}\n\n\t\tviewer.dispatchEvent({type: \"render.pass.scene\", viewer: viewer, renderTarget: this.rtRegular});\n\t\tviewer.renderer.setRenderTarget(null);\n\t\tviewer.renderer.render(viewer.scene.scene, camera);\n\n\t\t{ // EDL PASS\n\n\t\t\tconst uniforms = this.edlMaterial.uniforms;\n\n\t\t\tuniforms.screenWidth.value = width;\n\t\t\tuniforms.screenHeight.value = height;\n\n\t\t\tlet proj = camera.projectionMatrix;\n\t\t\tlet projArray = new Float32Array(16);\n\t\t\tprojArray.set(proj.elements);\n\n\t\t\tuniforms.uNear.value = camera.near;\n\t\t\tuniforms.uFar.value = camera.far;\n\t\t\tuniforms.uEDLColor.value = this.rtEDL.texture;\n\t\t\tuniforms.uEDLDepth.value = this.rtEDL.depthTexture;\n\t\t\tuniforms.uProj.value = projArray;\n\n\t\t\tuniforms.edlStrength.value = viewer.edlStrength;\n\t\t\tuniforms.radius.value = viewer.edlRadius;\n\t\t\tuniforms.opacity.value = viewer.edlOpacity; // HACK\n\t\t\t\n\t\t\tUtils.screenPass.render(viewer.renderer, this.edlMaterial);\n\n\t\t\tif(this.screenshot){\n\t\t\t\tUtils.screenPass.render(viewer.renderer, this.edlMaterial, this.screenshot.target);\n\t\t\t}\n\n\t\t}\n\n\t\tviewer.dispatchEvent({type: \"render.pass.scene\", viewer: viewer});\n\n\t\tviewer.renderer.clearDepth();\n\n\t\tviewer.transformationTool.update();\n\n\t\tviewer.dispatchEvent({type: \"render.pass.perspective_overlay\",viewer: viewer});\n\n\t\tviewer.renderer.render(viewer.controls.sceneControls, camera);\n\t\tviewer.renderer.render(viewer.clippingTool.sceneVolume, camera);\n\t\tviewer.renderer.render(viewer.transformationTool.scene, camera);\n\t\t\n\t\tviewer.dispatchEvent({type: \"render.pass.end\",viewer: viewer});\n\n\t}\n}\n\n","\n\nimport {NormalizationMaterial} from \"../materials/NormalizationMaterial.js\";\nimport {NormalizationEDLMaterial} from \"../materials/NormalizationEDLMaterial.js\";\nimport {PointCloudMaterial} from \"../materials/PointCloudMaterial.js\";\nimport {PointShape} from \"../defines.js\";\nimport {SphereVolume} from \"../utils/Volume.js\";\nimport {Utils} from \"../utils.js\";\n\n\nexport class HQSplatRenderer{\n\t\n\tconstructor(viewer){\n\t\tthis.viewer = viewer;\n\n\t\tthis.depthMaterials = new Map();\n\t\tthis.attributeMaterials = new Map();\n\t\tthis.normalizationMaterial = null;\n\n\t\tthis.rtDepth = null;\n\t\tthis.rtAttribute = null;\n\t\tthis.gl = viewer.renderer.getContext();\n\n\t\tthis.initialized = false;\n\t}\n\n\tinit(){\n\t\tif (this.initialized) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.normalizationMaterial = new NormalizationMaterial();\n\t\tthis.normalizationMaterial.depthTest = true;\n\t\tthis.normalizationMaterial.depthWrite = true;\n\t\tthis.normalizationMaterial.transparent = true;\n\n\t\tthis.normalizationEDLMaterial = new NormalizationEDLMaterial();\n\t\tthis.normalizationEDLMaterial.depthTest = true;\n\t\tthis.normalizationEDLMaterial.depthWrite = true;\n\t\tthis.normalizationEDLMaterial.transparent = true;\n\n\t\tthis.rtDepth = new THREE.WebGLRenderTarget(1024, 1024, {\n\t\t\tminFilter: THREE.NearestFilter,\n\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\ttype: THREE.FloatType,\n\t\t\tdepthTexture: new THREE.DepthTexture(undefined, undefined, THREE.UnsignedIntType)\n\t\t});\n\n\t\tthis.rtAttribute = new THREE.WebGLRenderTarget(1024, 1024, {\n\t\t\tminFilter: THREE.NearestFilter,\n\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\ttype: THREE.FloatType,\n\t\t\tdepthTexture: this.rtDepth.depthTexture,\n\t\t});\n\n\t\tthis.initialized = true;\n\t};\n\n\tresize(width, height){\n\t\tthis.rtDepth.setSize(width, height);\n\t\tthis.rtAttribute.setSize(width, height);\n\t}\n\n\tclearTargets(){\n\t\tconst viewer = this.viewer;\n\t\tconst {renderer} = viewer;\n\n\t\tconst oldTarget = renderer.getRenderTarget();\n\n\t\trenderer.setClearColor(0x000000, 0);\n\n\t\trenderer.setRenderTarget( this.rtDepth );\n\t\trenderer.clear( true, true, true );\n\n\t\trenderer.setRenderTarget( this.rtAttribute );\n\t\trenderer.clear( true, true, true );\n\n\t\trenderer.setRenderTarget(oldTarget);\n\t}\n\n\n\tclear(){\n\t\tthis.init();\n\n\t\tconst {renderer, background} = this.viewer;\n\n\t\tif(background === \"skybox\"){\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t} else if (background === 'gradient') {\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t} else if (background === 'black') {\n\t\t\trenderer.setClearColor(0x000000, 1);\n\t\t} else if (background === 'white') {\n\t\t\trenderer.setClearColor(0xFFFFFF, 1);\n\t\t} else {\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t}\n\n\t\trenderer.clear();\n\n\t\tthis.clearTargets();\n\t}\n\n\trender (params) {\n\t\tthis.init();\n\n\t\tconst viewer = this.viewer;\n\t\tconst camera = params.camera ? params.camera : viewer.scene.getActiveCamera();\n\t\tconst {width, height} = this.viewer.renderer.getSize(new THREE.Vector2());\n\n\t\tviewer.dispatchEvent({type: \"render.pass.begin\",viewer: viewer});\n\n\t\tthis.resize(width, height);\n\n\t\tconst visiblePointClouds = viewer.scene.pointclouds.filter(pc => pc.visible);\n\t\tconst originalMaterials = new Map();\n\n\t\tfor(let pointcloud of visiblePointClouds){\n\t\t\toriginalMaterials.set(pointcloud, pointcloud.material);\n\n\t\t\tif(!this.attributeMaterials.has(pointcloud)){\n\t\t\t\tlet attributeMaterial = new PointCloudMaterial();\n\t\t\t\tthis.attributeMaterials.set(pointcloud, attributeMaterial);\n\t\t\t}\n\n\t\t\tif(!this.depthMaterials.has(pointcloud)){\n\t\t\t\tlet depthMaterial = new PointCloudMaterial();\n\n\t\t\t\tdepthMaterial.setDefine(\"depth_pass\", \"#define hq_depth_pass\");\n\t\t\t\tdepthMaterial.setDefine(\"use_edl\", \"#define use_edl\");\n\n\t\t\t\tthis.depthMaterials.set(pointcloud, depthMaterial);\n\t\t\t}\n\t\t}\n\n\t\t{ // DEPTH PASS\n\t\t\tfor (let pointcloud of visiblePointClouds) {\n\t\t\t\tlet octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x;\n\n\t\t\t\tlet material = originalMaterials.get(pointcloud);\n\t\t\t\tlet depthMaterial = this.depthMaterials.get(pointcloud);\n\n\t\t\t\tdepthMaterial.size = material.size;\n\t\t\t\tdepthMaterial.minSize = material.minSize;\n\t\t\t\tdepthMaterial.maxSize = material.maxSize;\n\n\t\t\t\tdepthMaterial.pointSizeType = material.pointSizeType;\n\t\t\t\tdepthMaterial.visibleNodesTexture = material.visibleNodesTexture;\n\t\t\t\tdepthMaterial.weighted = false;\n\t\t\t\tdepthMaterial.screenWidth = width;\n\t\t\t\tdepthMaterial.shape = PointShape.CIRCLE;\n\t\t\t\tdepthMaterial.screenHeight = height;\n\t\t\t\tdepthMaterial.uniforms.visibleNodes.value = material.visibleNodesTexture;\n\t\t\t\tdepthMaterial.uniforms.octreeSize.value = octreeSize;\n\t\t\t\tdepthMaterial.spacing = pointcloud.pcoGeometry.spacing * Math.max(...pointcloud.scale.toArray());\n\t\t\t\tdepthMaterial.classification = material.classification;\n\t\t\t\tdepthMaterial.uniforms.classificationLUT.value.image.data = material.uniforms.classificationLUT.value.image.data;\n\t\t\t\tdepthMaterial.classificationTexture.needsUpdate = true;\n\n\t\t\t\tdepthMaterial.uniforms.uFilterReturnNumberRange.value = material.uniforms.uFilterReturnNumberRange.value;\n\t\t\t\tdepthMaterial.uniforms.uFilterNumberOfReturnsRange.value = material.uniforms.uFilterNumberOfReturnsRange.value;\n\t\t\t\tdepthMaterial.uniforms.uFilterGPSTimeClipRange.value = material.uniforms.uFilterGPSTimeClipRange.value;\n\t\t\t\tdepthMaterial.uniforms.uFilterPointSourceIDClipRange.value = material.uniforms.uFilterPointSourceIDClipRange.value;\n\n\t\t\t\tdepthMaterial.clipTask = material.clipTask;\n\t\t\t\tdepthMaterial.clipMethod = material.clipMethod;\n\t\t\t\tdepthMaterial.setClipBoxes(material.clipBoxes);\n\t\t\t\tdepthMaterial.setClipPolygons(material.clipPolygons);\n\n\t\t\t\tpointcloud.material = depthMaterial;\n\t\t\t}\n\t\t\t\n\t\t\tviewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtDepth, {\n\t\t\t\tclipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)),\n\t\t\t});\n\t\t}\n\n\t\t{ // ATTRIBUTE PASS\n\t\t\tfor (let pointcloud of visiblePointClouds) {\n\t\t\t\tlet octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x;\n\n\t\t\t\tlet material = originalMaterials.get(pointcloud);\n\t\t\t\tlet attributeMaterial = this.attributeMaterials.get(pointcloud);\n\n\t\t\t\tattributeMaterial.size = material.size;\n\t\t\t\tattributeMaterial.minSize = material.minSize;\n\t\t\t\tattributeMaterial.maxSize = material.maxSize;\n\n\t\t\t\tattributeMaterial.pointSizeType = material.pointSizeType;\n\t\t\t\tattributeMaterial.activeAttributeName = material.activeAttributeName;\n\t\t\t\tattributeMaterial.visibleNodesTexture = material.visibleNodesTexture;\n\t\t\t\tattributeMaterial.weighted = true;\n\t\t\t\tattributeMaterial.screenWidth = width;\n\t\t\t\tattributeMaterial.screenHeight = height;\n\t\t\t\tattributeMaterial.shape = PointShape.CIRCLE;\n\t\t\t\tattributeMaterial.uniforms.visibleNodes.value = material.visibleNodesTexture;\n\t\t\t\tattributeMaterial.uniforms.octreeSize.value = octreeSize;\n\t\t\t\tattributeMaterial.spacing = pointcloud.pcoGeometry.spacing * Math.max(...pointcloud.scale.toArray());\n\t\t\t\tattributeMaterial.classification = material.classification;\n\t\t\t\tattributeMaterial.uniforms.classificationLUT.value.image.data = material.uniforms.classificationLUT.value.image.data;\n\t\t\t\tattributeMaterial.classificationTexture.needsUpdate = true;\n\n\t\t\t\tattributeMaterial.uniforms.uFilterReturnNumberRange.value = material.uniforms.uFilterReturnNumberRange.value;\n\t\t\t\tattributeMaterial.uniforms.uFilterNumberOfReturnsRange.value = material.uniforms.uFilterNumberOfReturnsRange.value;\n\t\t\t\tattributeMaterial.uniforms.uFilterGPSTimeClipRange.value = material.uniforms.uFilterGPSTimeClipRange.value;\n\t\t\t\tattributeMaterial.uniforms.uFilterPointSourceIDClipRange.value = material.uniforms.uFilterPointSourceIDClipRange.value;\n\n\t\t\t\tattributeMaterial.elevationGradientRepeat = material.elevationGradientRepeat;\n\t\t\t\tattributeMaterial.elevationRange = material.elevationRange;\n\t\t\t\tattributeMaterial.gradient = material.gradient;\n\t\t\t\tattributeMaterial.matcap = material.matcap;\n\n\t\t\t\tattributeMaterial.intensityRange = material.intensityRange;\n\t\t\t\tattributeMaterial.intensityGamma = material.intensityGamma;\n\t\t\t\tattributeMaterial.intensityContrast = material.intensityContrast;\n\t\t\t\tattributeMaterial.intensityBrightness = material.intensityBrightness;\n\n\t\t\t\tattributeMaterial.rgbGamma = material.rgbGamma;\n\t\t\t\tattributeMaterial.rgbContrast = material.rgbContrast;\n\t\t\t\tattributeMaterial.rgbBrightness = material.rgbBrightness;\n\n\t\t\t\tattributeMaterial.weightRGB = material.weightRGB;\n\t\t\t\tattributeMaterial.weightIntensity = material.weightIntensity;\n\t\t\t\tattributeMaterial.weightElevation = material.weightElevation;\n\t\t\t\tattributeMaterial.weightRGB = material.weightRGB;\n\t\t\t\tattributeMaterial.weightClassification = material.weightClassification;\n\t\t\t\tattributeMaterial.weightReturnNumber = material.weightReturnNumber;\n\t\t\t\tattributeMaterial.weightSourceID = material.weightSourceID;\n\n\t\t\t\tattributeMaterial.color = material.color;\n\n\t\t\t\tattributeMaterial.clipTask = material.clipTask;\n\t\t\t\tattributeMaterial.clipMethod = material.clipMethod;\n\t\t\t\tattributeMaterial.setClipBoxes(material.clipBoxes);\n\t\t\t\tattributeMaterial.setClipPolygons(material.clipPolygons);\n\n\t\t\t\tpointcloud.material = attributeMaterial;\n\t\t\t}\n\t\t\t\n\t\t\tlet gl = this.gl;\n\n\t\t\tviewer.renderer.setRenderTarget(null);\n\t\t\tviewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtAttribute, {\n\t\t\t\tclipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)),\n\t\t\t\t//material: this.attributeMaterial,\n\t\t\t\tblendFunc: [gl.SRC_ALPHA, gl.ONE],\n\t\t\t\t//depthTest: false,\n\t\t\t\tdepthWrite: false\n\t\t\t});\n\t\t}\n\n\t\tfor(let [pointcloud, material] of originalMaterials){\n\t\t\tpointcloud.material = material;\n\t\t}\n\n\t\tviewer.renderer.setRenderTarget(null);\n\t\tif(viewer.background === \"skybox\"){\n\t\t\tviewer.renderer.setClearColor(0x000000, 0);\n\t\t\tviewer.renderer.clear();\n\t\t\tviewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation);\n\t\t\tviewer.skybox.camera.fov = viewer.scene.cameraP.fov;\n\t\t\tviewer.skybox.camera.aspect = viewer.scene.cameraP.aspect;\n\t\t\tviewer.skybox.camera.updateProjectionMatrix();\n\t\t\tviewer.renderer.render(viewer.skybox.scene, viewer.skybox.camera);\n\t\t} else if (viewer.background === 'gradient') {\n\t\t\tviewer.renderer.setClearColor(0x000000, 0);\n\t\t\tviewer.renderer.clear();\n\t\t\tviewer.renderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG);\n\t\t} else if (viewer.background === 'black') {\n\t\t\tviewer.renderer.setClearColor(0x000000, 1);\n\t\t\tviewer.renderer.clear();\n\t\t} else if (viewer.background === 'white') {\n\t\t\tviewer.renderer.setClearColor(0xFFFFFF, 1);\n\t\t\tviewer.renderer.clear();\n\t\t} else {\n\t\t\tviewer.renderer.setClearColor(0x000000, 0);\n\t\t\tviewer.renderer.clear();\n\t\t}\n\n\t\t{ // NORMALIZATION PASS\n\t\t\tlet normalizationMaterial = this.useEDL ? this.normalizationEDLMaterial : this.normalizationMaterial;\n\n\t\t\tif(this.useEDL){\n\t\t\t\tnormalizationMaterial.uniforms.edlStrength.value = viewer.edlStrength;\n\t\t\t\tnormalizationMaterial.uniforms.radius.value = viewer.edlRadius;\n\t\t\t\tnormalizationMaterial.uniforms.screenWidth.value = width;\n\t\t\t\tnormalizationMaterial.uniforms.screenHeight.value = height;\n\t\t\t\tnormalizationMaterial.uniforms.uEDLMap.value = this.rtDepth.texture;\n\t\t\t}\n\n\t\t\tnormalizationMaterial.uniforms.uWeightMap.value = this.rtAttribute.texture;\n\t\t\tnormalizationMaterial.uniforms.uDepthMap.value = this.rtAttribute.depthTexture;\n\t\t\t\n\t\t\tUtils.screenPass.render(viewer.renderer, normalizationMaterial);\n\t\t}\n\n\t\tviewer.renderer.render(viewer.scene.scene, camera);\n\n\t\tviewer.dispatchEvent({type: \"render.pass.scene\", viewer: viewer});\n\n\t\tviewer.renderer.clearDepth();\n\n\t\tviewer.transformationTool.update();\n\n\t\tviewer.dispatchEvent({type: \"render.pass.perspective_overlay\",viewer: viewer});\n\n\t\tviewer.renderer.render(viewer.controls.sceneControls, camera);\n\t\tviewer.renderer.render(viewer.clippingTool.sceneVolume, camera);\n\t\tviewer.renderer.render(viewer.transformationTool.scene, camera);\n\n\t\tviewer.renderer.setViewport(width - viewer.navigationCube.width, \n\t\t\t\t\t\t\t\t\theight - viewer.navigationCube.width, \n\t\t\t\t\t\t\t\t\tviewer.navigationCube.width, viewer.navigationCube.width);\n\t\tviewer.renderer.render(viewer.navigationCube, viewer.navigationCube.camera);\t\t\n\t\tviewer.renderer.setViewport(0, 0, width, height);\n\t\t\n\t\tviewer.dispatchEvent({type: \"render.pass.end\",viewer: viewer});\n\n\t}\n\n}\n\n","\nexport class View{\n\tconstructor () {\n\t\tthis.position = new THREE.Vector3(0, 0, 0);\n\n\t\tthis.yaw = Math.PI / 4;\n\t\tthis._pitch = -Math.PI / 4;\n\t\tthis.radius = 1;\n\n\t\tthis.maxPitch = Math.PI / 2;\n\t\tthis.minPitch = -Math.PI / 2;\n\t}\n\n\tclone () {\n\t\tlet c = new View();\n\t\tc.yaw = this.yaw;\n\t\tc._pitch = this.pitch;\n\t\tc.radius = this.radius;\n\t\tc.maxPitch = this.maxPitch;\n\t\tc.minPitch = this.minPitch;\n\n\t\treturn c;\n\t}\n\n\tget pitch () {\n\t\treturn this._pitch;\n\t}\n\n\tset pitch (angle) {\n\t\tthis._pitch = Math.max(Math.min(angle, this.maxPitch), this.minPitch);\n\t}\n\n\tget direction () {\n\t\tlet dir = new THREE.Vector3(0, 1, 0);\n\n\t\tdir.applyAxisAngle(new THREE.Vector3(1, 0, 0), this.pitch);\n\t\tdir.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\treturn dir;\n\t}\n\n\tset direction (dir) {\n\n\t\t//if(dir.x === dir.y){\n\t\tif(dir.x === 0 && dir.y === 0){\n\t\t\tthis.pitch = Math.PI / 2 * Math.sign(dir.z);\n\t\t}else{\n\t\t\tlet yaw = Math.atan2(dir.y, dir.x) - Math.PI / 2;\n\t\t\tlet pitch = Math.atan2(dir.z, Math.sqrt(dir.x * dir.x + dir.y * dir.y));\n\n\t\t\tthis.yaw = yaw;\n\t\t\tthis.pitch = pitch;\n\t\t}\n\t\t\n\t}\n\n\tlookAt(t){\n\t\tlet V;\n\t\tif(arguments.length === 1){\n\t\t\tV = new THREE.Vector3().subVectors(t, this.position);\n\t\t}else if(arguments.length === 3){\n\t\t\tV = new THREE.Vector3().subVectors(new THREE.Vector3(...arguments), this.position);\n\t\t}\n\n\t\tlet radius = V.length();\n\t\tlet dir = V.normalize();\n\n\t\tthis.radius = radius;\n\t\tthis.direction = dir;\n\t}\n\n\tgetPivot () {\n\t\treturn new THREE.Vector3().addVectors(this.position, this.direction.multiplyScalar(this.radius));\n\t}\n\n\tgetSide () {\n\t\tlet side = new THREE.Vector3(1, 0, 0);\n\t\tside.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\treturn side;\n\t}\n\n\tpan (x, y) {\n\t\tlet dir = new THREE.Vector3(0, 1, 0);\n\t\tdir.applyAxisAngle(new THREE.Vector3(1, 0, 0), this.pitch);\n\t\tdir.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\t// let side = new THREE.Vector3(1, 0, 0);\n\t\t// side.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\tlet side = this.getSide();\n\n\t\tlet up = side.clone().cross(dir);\n\n\t\tlet pan = side.multiplyScalar(x).add(up.multiplyScalar(y));\n\n\t\tthis.position = this.position.add(pan);\n\t\t// this.target = this.target.add(pan);\n\t}\n\n\ttranslate (x, y, z) {\n\t\tlet dir = new THREE.Vector3(0, 1, 0);\n\t\tdir.applyAxisAngle(new THREE.Vector3(1, 0, 0), this.pitch);\n\t\tdir.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\tlet side = new THREE.Vector3(1, 0, 0);\n\t\tside.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\tlet up = side.clone().cross(dir);\n\n\t\tlet t = side.multiplyScalar(x)\n\t\t\t.add(dir.multiplyScalar(y))\n\t\t\t.add(up.multiplyScalar(z));\n\n\t\tthis.position = this.position.add(t);\n\t}\n\n\ttranslateWorld (x, y, z) {\n\t\tthis.position.x += x;\n\t\tthis.position.y += y;\n\t\tthis.position.z += z;\n\t}\n\n\tsetView(position, target, duration = 0, callback = null){\n\n\t\tlet endPosition = null;\n\t\tif(position instanceof Array){\n\t\t\tendPosition = new THREE.Vector3(...position);\n\t\t}else if(position instanceof THREE.Vector3){\n\t\t\tendPosition = position.clone();\n\t\t}\n\n\t\tlet endTarget = null;\n\t\tif(target instanceof Array){\n\t\t\tendTarget = new THREE.Vector3(...target);\n\t\t}else if(target instanceof THREE.Vector3){\n\t\t\tendTarget = target.clone();\n\t\t}\n\t\t\n\t\tconst startPosition = this.position.clone();\n\t\tconst startTarget = this.getPivot();\n\n\t\t//const endPosition = position.clone();\n\t\t//const endTarget = target.clone();\n\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\tif(duration === 0){\n\t\t\tthis.position.copy(endPosition);\n\t\t\tthis.lookAt(endTarget);\n\t\t}else{\n\t\t\tlet value = {x: 0};\n\t\t\tlet tween = new TWEEN.Tween(value).to({x: 1}, duration);\n\t\t\ttween.easing(easing);\n\t\t\t//this.tweens.push(tween);\n\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tlet t = value.x;\n\n\t\t\t\t//console.log(t);\n\n\t\t\t\tconst pos = new THREE.Vector3(\n\t\t\t\t\t(1 - t) * startPosition.x + t * endPosition.x,\n\t\t\t\t\t(1 - t) * startPosition.y + t * endPosition.y,\n\t\t\t\t\t(1 - t) * startPosition.z + t * endPosition.z,\n\t\t\t\t);\n\n\t\t\t\tconst target = new THREE.Vector3(\n\t\t\t\t\t(1 - t) * startTarget.x + t * endTarget.x,\n\t\t\t\t\t(1 - t) * startTarget.y + t * endTarget.y,\n\t\t\t\t\t(1 - t) * startTarget.z + t * endTarget.z,\n\t\t\t\t);\n\n\t\t\t\tthis.position.copy(pos);\n\t\t\t\tthis.lookAt(target);\n\n\t\t\t});\n\n\t\t\ttween.start();\n\n\t\t\ttween.onComplete(() => {\n\t\t\t\tif(callback){\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t}\n\n};\n","\n\nimport {Annotation} from \"../Annotation.js\";\nimport {CameraMode} from \"../defines.js\";\nimport {View} from \"./View.js\";\nimport {Utils} from \"../utils.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\n\nexport class Scene extends EventDispatcher{\n\n\tconstructor(){\n\t\tsuper();\n\n\t\tthis.annotations = new Annotation();\n\t\t\n\t\tthis.scene = new THREE.Scene();\n\t\tthis.sceneBG = new THREE.Scene();\n\t\tthis.scenePointCloud = new THREE.Scene();\n\n\t\tthis.cameraP = new THREE.PerspectiveCamera(this.fov, 1, 0.1, 1000*1000);\n\t\tthis.cameraO = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.1, 1000*1000);\n\t\tthis.cameraVR = new THREE.PerspectiveCamera();\n\t\tthis.cameraBG = new THREE.Camera();\n\t\tthis.cameraScreenSpace = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.1, 10);\n\t\tthis.cameraMode = CameraMode.PERSPECTIVE;\n\t\tthis.overrideCamera = null;\n\t\tthis.pointclouds = [];\n\n\t\tthis.measurements = [];\n\t\tthis.profiles = [];\n\t\tthis.volumes = [];\n\t\tthis.polygonClipVolumes = [];\n\t\tthis.cameraAnimations = [];\n\t\tthis.orientedImages = [];\n\t\tthis.images360 = [];\n\t\tthis.geopackages = [];\n\t\t\n\t\tthis.fpControls = null;\n\t\tthis.orbitControls = null;\n\t\tthis.earthControls = null;\n\t\tthis.geoControls = null;\n\t\tthis.deviceControls = null;\n\t\tthis.inputHandler = null;\n\n\t\tthis.view = new View();\n\n\t\tthis.directionalLight = null;\n\n\t\tthis.initialize();\n\t}\n\n\testimateHeightAt (position) {\n\t\tlet height = null;\n\t\tlet fromSpacing = Infinity;\n\n\t\tfor (let pointcloud of this.pointclouds) {\n\t\t\tif (pointcloud.root.geometryNode === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet pHeight = null;\n\t\t\tlet pFromSpacing = Infinity;\n\n\t\t\tlet lpos = position.clone().sub(pointcloud.position);\n\t\t\tlpos.z = 0;\n\t\t\tlet ray = new THREE.Ray(lpos, new THREE.Vector3(0, 0, 1));\n\n\t\t\tlet stack = [pointcloud.root];\n\t\t\twhile (stack.length > 0) {\n\t\t\t\tlet node = stack.pop();\n\t\t\t\tlet box = node.getBoundingBox();\n\n\t\t\t\tlet inside = ray.intersectBox(box);\n\n\t\t\t\tif (!inside) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet h = node.geometryNode.mean.z +\n\t\t\t\t\tpointcloud.position.z +\n\t\t\t\t\tnode.geometryNode.boundingBox.min.z;\n\n\t\t\t\tif (node.geometryNode.spacing <= pFromSpacing) {\n\t\t\t\t\tpHeight = h;\n\t\t\t\t\tpFromSpacing = node.geometryNode.spacing;\n\t\t\t\t}\n\n\t\t\t\tfor (let index of Object.keys(node.children)) {\n\t\t\t\t\tlet child = node.children[index];\n\t\t\t\t\tif (child.geometryNode) {\n\t\t\t\t\t\tstack.push(node.children[index]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (height === null || pFromSpacing < fromSpacing) {\n\t\t\t\theight = pHeight;\n\t\t\t\tfromSpacing = pFromSpacing;\n\t\t\t}\n\t\t}\n\n\t\treturn height;\n\t}\n\t\n\tgetBoundingBox(pointclouds = this.pointclouds){\n\t\tlet box = new THREE.Box3();\n\n\t\tthis.scenePointCloud.updateMatrixWorld(true);\n\t\tthis.referenceFrame.updateMatrixWorld(true);\n\n\t\tfor (let pointcloud of pointclouds) {\n\t\t\tpointcloud.updateMatrixWorld(true);\n\n\t\t\tlet pointcloudBox = pointcloud.pcoGeometry.tightBoundingBox ? pointcloud.pcoGeometry.tightBoundingBox : pointcloud.boundingBox;\n\t\t\tlet boxWorld = Utils.computeTransformedBoundingBox(pointcloudBox, pointcloud.matrixWorld);\n\t\t\tbox.union(boxWorld);\n\t\t}\n\n\t\treturn box;\n\t}\n\n\taddPointCloud (pointcloud) {\n\t\tthis.pointclouds.push(pointcloud);\n\t\tthis.scenePointCloud.add(pointcloud);\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'pointcloud_added',\n\t\t\tpointcloud: pointcloud\n\t\t});\n\t}\n\n\taddVolume (volume) {\n\t\tthis.volumes.push(volume);\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'volume_added',\n\t\t\t'scene': this,\n\t\t\t'volume': volume\n\t\t});\n\t}\n\n\taddOrientedImages(images){\n\t\tthis.orientedImages.push(images);\n\t\tthis.scene.add(images.node);\n\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'oriented_images_added',\n\t\t\t'scene': this,\n\t\t\t'images': images\n\t\t});\n\t};\n\n\tremoveOrientedImages(images){\n\t\tlet index = this.orientedImages.indexOf(images);\n\t\tif (index > -1) {\n\t\t\tthis.orientedImages.splice(index, 1);\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'oriented_images_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'images': images\n\t\t\t});\n\t\t}\n\t};\n\n\tadd360Images(images){\n\t\tthis.images360.push(images);\n\t\tthis.scene.add(images.node);\n\n\t\tthis.dispatchEvent({\n\t\t\t'type': '360_images_added',\n\t\t\t'scene': this,\n\t\t\t'images': images\n\t\t});\n\t}\n\n\tremove360Images(images){\n\t\tlet index = this.images360.indexOf(images);\n\t\tif (index > -1) {\n\t\t\tthis.images360.splice(index, 1);\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': '360_images_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'images': images\n\t\t\t});\n\t\t}\n\t}\n\n\taddGeopackage(geopackage){\n\t\tthis.geopackages.push(geopackage);\n\t\tthis.scene.add(geopackage.node);\n\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'geopackage_added',\n\t\t\t'scene': this,\n\t\t\t'geopackage': geopackage\n\t\t});\n\t};\n\n\tremoveGeopackage(geopackage){\n\t\tlet index = this.geopackages.indexOf(geopackage);\n\t\tif (index > -1) {\n\t\t\tthis.geopackages.splice(index, 1);\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'geopackage_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'geopackage': geopackage\n\t\t\t});\n\t\t}\n\t};\n\n\tremoveVolume (volume) {\n\t\tlet index = this.volumes.indexOf(volume);\n\t\tif (index > -1) {\n\t\t\tthis.volumes.splice(index, 1);\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'volume_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'volume': volume\n\t\t\t});\n\t\t}\n\t};\n\n\taddCameraAnimation(animation) {\n\t\tthis.cameraAnimations.push(animation);\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'camera_animation_added',\n\t\t\t'scene': this,\n\t\t\t'animation': animation\n\t\t});\n\t};\n\n\tremoveCameraAnimation(animation){\n\t\tlet index = this.cameraAnimations.indexOf(volume);\n\t\tif (index > -1) {\n\t\t\tthis.cameraAnimations.splice(index, 1);\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'camera_animation_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'animation': animation\n\t\t\t});\n\t\t}\n\t};\n\n\taddPolygonClipVolume(volume){\n\t\tthis.polygonClipVolumes.push(volume);\n\t\tthis.dispatchEvent({\n\t\t\t\"type\": \"polygon_clip_volume_added\",\n\t\t\t\"scene\": this,\n\t\t\t\"volume\": volume\n\t\t});\n\t};\n\t\n\tremovePolygonClipVolume(volume){\n\t\tlet index = this.polygonClipVolumes.indexOf(volume);\n\t\tif (index > -1) {\n\t\t\tthis.polygonClipVolumes.splice(index, 1);\n\t\t\tthis.dispatchEvent({\n\t\t\t\t\"type\": \"polygon_clip_volume_removed\",\n\t\t\t\t\"scene\": this,\n\t\t\t\t\"volume\": volume\n\t\t\t});\n\t\t}\n\t};\n\t\n\taddMeasurement(measurement){\n\t\tmeasurement.lengthUnit = this.lengthUnit;\n\t\tmeasurement.lengthUnitDisplay = this.lengthUnitDisplay;\n\t\tthis.measurements.push(measurement);\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'measurement_added',\n\t\t\t'scene': this,\n\t\t\t'measurement': measurement\n\t\t});\n\t};\n\n\tremoveMeasurement (measurement) {\n\t\tlet index = this.measurements.indexOf(measurement);\n\t\tif (index > -1) {\n\t\t\tthis.measurements.splice(index, 1);\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'measurement_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'measurement': measurement\n\t\t\t});\n\t\t}\n\t}\n\n\taddProfile (profile) {\n\t\tthis.profiles.push(profile);\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'profile_added',\n\t\t\t'scene': this,\n\t\t\t'profile': profile\n\t\t});\n\t}\n\n\tremoveProfile (profile) {\n\t\tlet index = this.profiles.indexOf(profile);\n\t\tif (index > -1) {\n\t\t\tthis.profiles.splice(index, 1);\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'profile_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'profile': profile\n\t\t\t});\n\t\t}\n\t}\n\n\tremoveAllMeasurements () {\n\t\twhile (this.measurements.length > 0) {\n\t\t\tthis.removeMeasurement(this.measurements[0]);\n\t\t}\n\n\t\twhile (this.profiles.length > 0) {\n\t\t\tthis.removeProfile(this.profiles[0]);\n\t\t}\n\n\t\twhile (this.volumes.length > 0) {\n\t\t\tthis.removeVolume(this.volumes[0]);\n\t\t}\n\t}\n\n\tremoveAllClipVolumes(){\n\t\tlet clipVolumes = this.volumes.filter(volume => volume.clip === true);\n\t\tfor(let clipVolume of clipVolumes){\n\t\t\tthis.removeVolume(clipVolume);\n\t\t}\n\n\t\twhile(this.polygonClipVolumes.length > 0){\n\t\t\tthis.removePolygonClipVolume(this.polygonClipVolumes[0]);\n\t\t}\n\t}\n\n\tgetActiveCamera() {\n\n\t\tif(this.overrideCamera){\n\t\t\treturn this.overrideCamera;\n\t\t}\n\n\t\tif(this.cameraMode === CameraMode.PERSPECTIVE){\n\t\t\treturn this.cameraP;\n\t\t}else if(this.cameraMode === CameraMode.ORTHOGRAPHIC){\n\t\t\treturn this.cameraO;\n\t\t}else if(this.cameraMode === CameraMode.VR){\n\t\t\treturn this.cameraVR;\n\t\t}\n\n\t\treturn null;\n\t}\n\t\n\tinitialize(){\n\t\t\n\t\tthis.referenceFrame = new THREE.Object3D();\n\t\tthis.referenceFrame.matrixAutoUpdate = false;\n\t\tthis.scenePointCloud.add(this.referenceFrame);\n\n\t\tthis.cameraP.up.set(0, 0, 1);\n\t\tthis.cameraP.position.set(1000, 1000, 1000);\n\t\tthis.cameraO.up.set(0, 0, 1);\n\t\tthis.cameraO.position.set(1000, 1000, 1000);\n\t\t//this.camera.rotation.y = -Math.PI / 4;\n\t\t//this.camera.rotation.x = -Math.PI / 6;\n\t\tthis.cameraScreenSpace.lookAt(new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, -1), new THREE.Vector3(0, 1, 0));\n\t\t\n\t\tthis.directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );\n\t\tthis.directionalLight.position.set( 10, 10, 10 );\n\t\tthis.directionalLight.lookAt( new THREE.Vector3(0, 0, 0));\n\t\tthis.scenePointCloud.add( this.directionalLight );\n\t\t\n\t\tlet light = new THREE.AmbientLight( 0x555555 ); // soft white light\n\t\tthis.scenePointCloud.add( light );\n\n\t\t{ // background\n\t\t\tlet texture = Utils.createBackgroundTexture(512, 512);\n\n\t\t\ttexture.minFilter = texture.magFilter = THREE.NearestFilter;\n\t\t\ttexture.minFilter = texture.magFilter = THREE.LinearFilter;\n\t\t\tlet bg = new THREE.Mesh(\n\t\t\t\tnew THREE.PlaneBufferGeometry(2, 2, 0),\n\t\t\t\tnew THREE.MeshBasicMaterial({\n\t\t\t\t\tmap: texture\n\t\t\t\t})\n\t\t\t);\n\t\t\tbg.material.depthTest = false;\n\t\t\tbg.material.depthWrite = false;\n\t\t\tthis.sceneBG.add(bg);\n\t\t}\n\n\t\t// { // lights\n\t\t// \t{\n\t\t// \t\tlet light = new THREE.DirectionalLight(0xffffff);\n\t\t// \t\tlight.position.set(10, 10, 1);\n\t\t// \t\tlight.target.position.set(0, 0, 0);\n\t\t// \t\tthis.scene.add(light);\n\t\t// \t}\n\n\t\t// \t{\n\t\t// \t\tlet light = new THREE.DirectionalLight(0xffffff);\n\t\t// \t\tlight.position.set(-10, 10, 1);\n\t\t// \t\tlight.target.position.set(0, 0, 0);\n\t\t// \t\tthis.scene.add(light);\n\t\t// \t}\n\n\t\t// \t{\n\t\t// \t\tlet light = new THREE.DirectionalLight(0xffffff);\n\t\t// \t\tlight.position.set(0, -10, 20);\n\t\t// \t\tlight.target.position.set(0, 0, 0);\n\t\t// \t\tthis.scene.add(light);\n\t\t// \t}\n\t\t// }\n\t}\n\t\n\taddAnnotation(position, args = {}){\t\t\n\t\tif(position instanceof Array){\n\t\t\targs.position = new THREE.Vector3().fromArray(position);\n\t\t} else if (position instanceof THREE.Vector3) {\n\t\t\targs.position = position;\n\t\t}\n\t\tlet annotation = new Annotation(args);\n\t\tthis.annotations.add(annotation);\n\n\t\treturn annotation;\n\t}\n\n\tgetAnnotations () {\n\t\treturn this.annotations;\n\t};\n\n\tremoveAnnotation(annotationToRemove) {\n\t\tthis.annotations.remove(annotationToRemove);\n\t}\n};\n","\n// http://epsg.io/\nproj4.defs([\n\t['UTM10N', '+proj=utm +zone=10 +ellps=GRS80 +datum=NAD83 +units=m +no_defs'],\n\t['EPSG:6339', '+proj=utm +zone=10 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6340', '+proj=utm +zone=11 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6341', '+proj=utm +zone=12 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6342', '+proj=utm +zone=13 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6343', '+proj=utm +zone=14 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6344', '+proj=utm +zone=15 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6345', '+proj=utm +zone=16 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6346', '+proj=utm +zone=17 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6347', '+proj=utm +zone=18 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6348', '+proj=utm +zone=19 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:26910', '+proj=utm +zone=10 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26911', '+proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26912', '+proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26913', '+proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26914', '+proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26915', '+proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26916', '+proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26917', '+proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26918', '+proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26919', '+proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n]);\n\nexport class MapView{\n\n\tconstructor (viewer) {\n\t\tthis.viewer = viewer;\n\n\t\tthis.webMapService = 'WMTS';\n\t\tthis.mapProjectionName = 'EPSG:3857';\n\t\tthis.mapProjection = proj4.defs(this.mapProjectionName);\n\t\tthis.sceneProjection = null;\n\n\t\tthis.extentsLayer = null;\n\t\tthis.cameraLayer = null;\n\t\tthis.toolLayer = null;\n\t\tthis.sourcesLayer = null;\n\t\tthis.sourcesLabelLayer = null;\n\t\tthis.images360Layer = null;\n\t\tthis.enabled = false;\n\n\t\tthis.createAnnotationStyle = (text) => {\n\t\t\treturn [\n\t\t\t\tnew ol.style.Style({\n\t\t\t\t\timage: new ol.style.Circle({\n\t\t\t\t\t\tradius: 10,\n\t\t\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\t\t\tcolor: [255, 255, 255, 0.5],\n\t\t\t\t\t\t\twidth: 2\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\t\t\tcolor: [0, 0, 0, 0.5]\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t];\n\t\t};\n\n\t\tthis.createLabelStyle = (text) => {\n\t\t\tlet style = new ol.style.Style({\n\t\t\t\timage: new ol.style.Circle({\n\t\t\t\t\tradius: 6,\n\t\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\t\tcolor: 'white',\n\t\t\t\t\t\twidth: 2\n\t\t\t\t\t}),\n\t\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\t\tcolor: 'green'\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t\ttext: new ol.style.Text({\n\t\t\t\t\tfont: '12px helvetica,sans-serif',\n\t\t\t\t\ttext: text,\n\t\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\t\tcolor: '#000'\n\t\t\t\t\t}),\n\t\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\twidth: 2\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t});\n\n\t\t\treturn style;\n\t\t};\n\t}\n\n\tshowSources (show) {\n\t\tthis.sourcesLayer.setVisible(show);\n\t\tthis.sourcesLabelLayer.setVisible(show);\n\t}\n\n\tinit () {\n\n\t\tif(typeof ol === \"undefined\"){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.elMap = $('#potree_map');\n\t\tthis.elMap.draggable({ handle: $('#potree_map_header') });\n\t\tthis.elMap.resizable();\n\n\t\tthis.elTooltip = $(`
    `);\n\t\tthis.elMap.append(this.elTooltip);\n\n\t\tlet extentsLayer = this.getExtentsLayer();\n\t\tlet cameraLayer = this.getCameraLayer();\n\t\tthis.getToolLayer();\n\t\tlet sourcesLayer = this.getSourcesLayer();\n\t\tthis.images360Layer = this.getImages360Layer();\n\t\tthis.getSourcesLabelLayer();\n\t\tthis.getAnnotationsLayer();\n\n\t\tlet mousePositionControl = new ol.control.MousePosition({\n\t\t\tcoordinateFormat: ol.coordinate.createStringXY(5),\n\t\t\tprojection: 'EPSG:4326',\n\t\t\tundefinedHTML: ' '\n\t\t});\n\n\t\tlet _this = this;\n\t\tlet DownloadSelectionControl = function (optOptions) {\n\t\t\tlet options = optOptions || {};\n\n\t\t\t// TOGGLE TILES\n\t\t\tlet btToggleTiles = document.createElement('button');\n\t\t\tbtToggleTiles.innerHTML = 'T';\n\t\t\tbtToggleTiles.addEventListener('click', () => {\n\t\t\t\tlet visible = sourcesLayer.getVisible();\n\t\t\t\t_this.showSources(!visible);\n\t\t\t}, false);\n\t\t\tbtToggleTiles.style.float = 'left';\n\t\t\tbtToggleTiles.title = 'show / hide tiles';\n\n\t\t\t// DOWNLOAD SELECTED TILES\n\t\t\tlet link = document.createElement('a');\n\t\t\tlink.href = '#';\n\t\t\tlink.download = 'list.txt';\n\t\t\tlink.style.float = 'left';\n\n\t\t\tlet button = document.createElement('button');\n\t\t\tbutton.innerHTML = 'D';\n\t\t\tlink.appendChild(button);\n\n\t\t\tlet handleDownload = (e) => {\n\t\t\t\tlet features = selectedFeatures.getArray();\n\n\t\t\t\tlet url = [document.location.protocol, '//', document.location.host, document.location.pathname].join('');\n\n\t\t\t\tif (features.length === 0) {\n\t\t\t\t\talert('No tiles were selected. Select area with ctrl + left mouse button!');\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t} else if (features.length === 1) {\n\t\t\t\t\tlet feature = features[0];\n\n\t\t\t\t\tif (feature.source) {\n\t\t\t\t\t\tlet cloudjsurl = feature.pointcloud.pcoGeometry.url;\n\t\t\t\t\t\tlet sourceurl = new URL(url + '/../' + cloudjsurl + '/../source/' + feature.source.name);\n\t\t\t\t\t\tlink.href = sourceurl.href;\n\t\t\t\t\t\tlink.download = feature.source.name;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlet content = '';\n\t\t\t\t\tfor (let i = 0; i < features.length; i++) {\n\t\t\t\t\t\tlet feature = features[i];\n\n\t\t\t\t\t\tif (feature.source) {\n\t\t\t\t\t\t\tlet cloudjsurl = feature.pointcloud.pcoGeometry.url;\n\t\t\t\t\t\t\tlet sourceurl = new URL(url + '/../' + cloudjsurl + '/../source/' + feature.source.name);\n\t\t\t\t\t\t\tcontent += sourceurl.href + '\\n';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet uri = 'data:application/octet-stream;base64,' + btoa(content);\n\t\t\t\t\tlink.href = uri;\n\t\t\t\t\tlink.download = 'list_of_files.txt';\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tbutton.addEventListener('click', handleDownload, false);\n\n\t\t\t// assemble container\n\t\t\tlet element = document.createElement('div');\n\t\t\telement.className = 'ol-unselectable ol-control';\n\t\t\telement.appendChild(link);\n\t\t\telement.appendChild(btToggleTiles);\n\t\t\telement.style.bottom = '0.5em';\n\t\t\telement.style.left = '0.5em';\n\t\t\telement.title = 'Download file or list of selected tiles. Select tile with left mouse button or area using ctrl + left mouse.';\n\n\t\t\tol.control.Control.call(this, {\n\t\t\t\telement: element,\n\t\t\t\ttarget: options.target\n\t\t\t});\n\t\t};\n\t\tol.inherits(DownloadSelectionControl, ol.control.Control);\n\n\t\tthis.map = new ol.Map({\n\t\t\tcontrols: ol.control.defaults({\n\t\t\t\tattributionOptions: ({\n\t\t\t\t\tcollapsible: false\n\t\t\t\t})\n\t\t\t}).extend([\n\t\t\t\t// this.controls.zoomToExtent,\n\t\t\t\tnew DownloadSelectionControl(),\n\t\t\t\tmousePositionControl\n\t\t\t]),\n\t\t\tlayers: [\n\t\t\t\tnew ol.layer.Tile({source: new ol.source.OSM()}),\n\t\t\t\tthis.toolLayer,\n\t\t\t\tthis.annotationsLayer,\n\t\t\t\tthis.sourcesLayer,\n\t\t\t\tthis.sourcesLabelLayer,\n\t\t\t\tthis.images360Layer,\n\t\t\t\textentsLayer,\n\t\t\t\tcameraLayer\n\t\t\t],\n\t\t\ttarget: 'potree_map_content',\n\t\t\tview: new ol.View({\n\t\t\t\tcenter: this.olCenter,\n\t\t\t\tzoom: 9\n\t\t\t})\n\t\t});\n\n\t\t// DRAGBOX / SELECTION\n\t\tthis.dragBoxLayer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({}),\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: 'rgba(0, 0, 255, 1)',\n\t\t\t\t\twidth: 2\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\t\tthis.map.addLayer(this.dragBoxLayer);\n\n\t\tlet select = new ol.interaction.Select();\n\t\tthis.map.addInteraction(select);\n\n\t\tlet selectedFeatures = select.getFeatures();\n\n\t\tlet dragBox = new ol.interaction.DragBox({\n\t\t\tcondition: ol.events.condition.platformModifierKeyOnly\n\t\t});\n\n\t\tthis.map.addInteraction(dragBox);\n\n\t\t// this.map.on('pointermove', evt => {\n\t\t// \tlet pixel = evt.pixel;\n\t\t// \tlet feature = this.map.forEachFeatureAtPixel(pixel, function (feature) {\n\t\t// \t\treturn feature;\n\t\t// \t});\n\n\t\t// \t// console.log(feature);\n\t\t// \t// this.elTooltip.css(\"display\", feature ? '' : 'none');\n\t\t// \tthis.elTooltip.css('display', 'none');\n\t\t// \tif (feature && feature.onHover) {\n\t\t// \t\tfeature.onHover(evt);\n\t\t// \t\t// overlay.setPosition(evt.coordinate);\n\t\t// \t\t// tooltip.innerHTML = feature.get('name');\n\t\t// \t}\n\t\t// });\n\n\t\tthis.map.on('click', evt => {\n\t\t\tlet pixel = evt.pixel;\n\t\t\tlet feature = this.map.forEachFeatureAtPixel(pixel, function (feature) {\n\t\t\t\treturn feature;\n\t\t\t});\n\n\t\t\tif (feature && feature.onClick) {\n\t\t\t\tfeature.onClick(evt);\n\t\t\t}\n\t\t});\n\n\t\tdragBox.on('boxend', (e) => {\n\t\t\t// features that intersect the box are added to the collection of\n\t\t\t// selected features, and their names are displayed in the \"info\"\n\t\t\t// div\n\t\t\tlet extent = dragBox.getGeometry().getExtent();\n\t\t\tthis.getSourcesLayer().getSource().forEachFeatureIntersectingExtent(extent, (feature) => {\n\t\t\t\tselectedFeatures.push(feature);\n\t\t\t});\n\t\t});\n\n\t\t// clear selection when drawing a new box and when clicking on the map\n\t\tdragBox.on('boxstart', (e) => {\n\t\t\tselectedFeatures.clear();\n\t\t});\n\t\tthis.map.on('click', () => {\n\t\t\tselectedFeatures.clear();\n\t\t});\n\n\t\tthis.viewer.addEventListener('scene_changed', e => {\n\t\t\tthis.setScene(e.scene);\n\t\t});\n\n\t\tthis.onPointcloudAdded = e => {\n\t\t\tthis.load(e.pointcloud);\n\t\t};\n\n\t\tthis.on360ImagesAdded = e => {\n\t\t\tthis.addImages360(e.images);\n\t\t};\n\n\t\tthis.onAnnotationAdded = e => {\n\t\t\tif (!this.sceneProjection) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet annotation = e.annotation;\n\t\t\tlet position = annotation.position;\n\t\t\tlet mapPos = this.toMap.forward([position.x, position.y]);\n\t\t\tlet feature = new ol.Feature({\n\t\t\t\tgeometry: new ol.geom.Point(mapPos),\n\t\t\t\tname: annotation.title\n\t\t\t});\n\t\t\tfeature.setStyle(this.createAnnotationStyle(annotation.title));\n\n\t\t\tfeature.onHover = evt => {\n\t\t\t\tlet coordinates = feature.getGeometry().getCoordinates();\n\t\t\t\tlet p = this.map.getPixelFromCoordinate(coordinates);\n\n\t\t\t\tthis.elTooltip.html(annotation.title);\n\t\t\t\tthis.elTooltip.css('display', '');\n\t\t\t\tthis.elTooltip.css('left', `${p[0]}px`);\n\t\t\t\tthis.elTooltip.css('top', `${p[1]}px`);\n\t\t\t};\n\n\t\t\tfeature.onClick = evt => {\n\t\t\t\tannotation.clickTitle();\n\t\t\t};\n\n\t\t\tthis.getAnnotationsLayer().getSource().addFeature(feature);\n\t\t};\n\n\t\tthis.setScene(this.viewer.scene);\n\t}\n\n\tsetScene (scene) {\n\t\tif (this.scene === scene) {\n\t\t\treturn;\n\t\t};\n\n\t\tif (this.scene) {\n\t\t\tthis.scene.removeEventListener('pointcloud_added', this.onPointcloudAdded);\n\t\t\tthis.scene.removeEventListener('360_images_added', this.on360ImagesAdded);\n\t\t\tthis.scene.annotations.removeEventListener('annotation_added', this.onAnnotationAdded);\n\t\t}\n\n\t\tthis.scene = scene;\n\n\t\tthis.scene.addEventListener('pointcloud_added', this.onPointcloudAdded);\n\t\tthis.scene.addEventListener('360_images_added', this.on360ImagesAdded);\n\t\tthis.scene.annotations.addEventListener('annotation_added', this.onAnnotationAdded);\n\n\t\tfor (let pointcloud of this.viewer.scene.pointclouds) {\n\t\t\tthis.load(pointcloud);\n\t\t}\n\n\t\tthis.viewer.scene.annotations.traverseDescendants(annotation => {\n\t\t\tthis.onAnnotationAdded({annotation: annotation});\n\t\t});\n\n\t\tfor(let images of this.viewer.scene.images360){\n\t\t\tthis.on360ImagesAdded({images: images});\n\t\t}\n\t}\n\n\tgetExtentsLayer () {\n\t\tif (this.extentsLayer) {\n\t\t\treturn this.extentsLayer;\n\t\t}\n\n\t\tthis.gExtent = new ol.geom.LineString([[0, 0], [0, 0]]);\n\n\t\tlet feature = new ol.Feature(this.gExtent);\n\t\tlet featureVector = new ol.source.Vector({\n\t\t\tfeatures: [feature]\n\t\t});\n\n\t\tthis.extentsLayer = new ol.layer.Vector({\n\t\t\tsource: featureVector,\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: 'rgba(255, 255, 255, 0.2)'\n\t\t\t\t}),\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: '#0000ff',\n\t\t\t\t\twidth: 2\n\t\t\t\t}),\n\t\t\t\timage: new ol.style.Circle({\n\t\t\t\t\tradius: 3,\n\t\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\t\tcolor: '#0000ff'\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\n\t\treturn this.extentsLayer;\n\t}\n\n\tgetAnnotationsLayer () {\n\t\tif (this.annotationsLayer) {\n\t\t\treturn this.annotationsLayer;\n\t\t}\n\n\t\tthis.annotationsLayer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({\n\t\t\t}),\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 1)'\n\t\t\t\t}),\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 1)',\n\t\t\t\t\twidth: 2\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\n\t\treturn this.annotationsLayer;\n\t}\n\n\tgetCameraLayer () {\n\t\tif (this.cameraLayer) {\n\t\t\treturn this.cameraLayer;\n\t\t}\n\n\t\t// CAMERA LAYER\n\t\tthis.gCamera = new ol.geom.LineString([[0, 0], [0, 0], [0, 0], [0, 0]]);\n\t\tlet feature = new ol.Feature(this.gCamera);\n\t\tlet featureVector = new ol.source.Vector({\n\t\t\tfeatures: [feature]\n\t\t});\n\n\t\tthis.cameraLayer = new ol.layer.Vector({\n\t\t\tsource: featureVector,\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: '#0000ff',\n\t\t\t\t\twidth: 2\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\n\t\treturn this.cameraLayer;\n\t}\n\n\tgetToolLayer () {\n\t\tif (this.toolLayer) {\n\t\t\treturn this.toolLayer;\n\t\t}\n\n\t\tthis.toolLayer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({\n\t\t\t}),\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 1)'\n\t\t\t\t}),\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 1)',\n\t\t\t\t\twidth: 2\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\n\t\treturn this.toolLayer;\n\t}\n\n\tgetImages360Layer(){\n\t\tif(this.images360Layer){\n\t\t\treturn this.images360Layer;\n\t\t}\n\n\t\tlet style = new ol.style.Style({\n\t\t\timage: new ol.style.Circle({\n\t\t\t\tradius: 4,\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: [255, 0, 0, 1],\n\t\t\t\t\twidth: 2\n\t\t\t\t}),\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: [255, 100, 100, 1]\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\t\t\n\t\tlet layer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({}),\n\t\t\tstyle: style,\n\t\t});\n\n\t\tthis.images360Layer = layer;\n\n\t\treturn this.images360Layer;\n\t}\n\n\tgetSourcesLayer () {\n\t\tif (this.sourcesLayer) {\n\t\t\treturn this.sourcesLayer;\n\t\t}\n\n\t\tthis.sourcesLayer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({}),\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: 'rgba(0, 0, 150, 0.1)'\n\t\t\t\t}),\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: 'rgba(0, 0, 150, 1)',\n\t\t\t\t\twidth: 1\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\n\t\treturn this.sourcesLayer;\n\t}\n\n\tgetSourcesLabelLayer () {\n\t\tif (this.sourcesLabelLayer) {\n\t\t\treturn this.sourcesLabelLayer;\n\t\t}\n\n\t\tthis.sourcesLabelLayer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({\n\t\t\t}),\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 0.1)'\n\t\t\t\t}),\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 1)',\n\t\t\t\t\twidth: 2\n\t\t\t\t})\n\t\t\t}),\n\t\t\tminResolution: 0.01,\n\t\t\tmaxResolution: 20\n\t\t});\n\n\t\treturn this.sourcesLabelLayer;\n\t}\n\n\tsetSceneProjection (sceneProjection) {\n\t\tthis.sceneProjection = sceneProjection;\n\t\tthis.toMap = proj4(this.sceneProjection, this.mapProjection);\n\t\tthis.toScene = proj4(this.mapProjection, this.sceneProjection);\n\t};\n\n\tgetMapExtent () {\n\t\tlet bb = this.viewer.getBoundingBox();\n\n\t\tlet bottomLeft = this.toMap.forward([bb.min.x, bb.min.y]);\n\t\tlet bottomRight = this.toMap.forward([bb.max.x, bb.min.y]);\n\t\tlet topRight = this.toMap.forward([bb.max.x, bb.max.y]);\n\t\tlet topLeft = this.toMap.forward([bb.min.x, bb.max.y]);\n\n\t\tlet extent = {\n\t\t\tbottomLeft: bottomLeft,\n\t\t\tbottomRight: bottomRight,\n\t\t\ttopRight: topRight,\n\t\t\ttopLeft: topLeft\n\t\t};\n\n\t\treturn extent;\n\t};\n\n\tgetMapCenter () {\n\t\tlet mapExtent = this.getMapExtent();\n\n\t\tlet mapCenter = [\n\t\t\t(mapExtent.bottomLeft[0] + mapExtent.topRight[0]) / 2,\n\t\t\t(mapExtent.bottomLeft[1] + mapExtent.topRight[1]) / 2\n\t\t];\n\n\t\treturn mapCenter;\n\t};\n\n\tupdateToolDrawings () {\n\t\tthis.toolLayer.getSource().clear();\n\n\t\tlet profiles = this.viewer.profileTool.profiles;\n\t\tfor (let i = 0; i < profiles.length; i++) {\n\t\t\tlet profile = profiles[i];\n\t\t\tlet coordinates = [];\n\n\t\t\tfor (let j = 0; j < profile.points.length; j++) {\n\t\t\t\tlet point = profile.points[j];\n\t\t\t\tlet pointMap = this.toMap.forward([point.x, point.y]);\n\t\t\t\tcoordinates.push(pointMap);\n\t\t\t}\n\n\t\t\tlet line = new ol.geom.LineString(coordinates);\n\t\t\tlet feature = new ol.Feature(line);\n\t\t\tthis.toolLayer.getSource().addFeature(feature);\n\t\t}\n\n\t\tlet measurements = this.viewer.measuringTool.measurements;\n\t\tfor (let i = 0; i < measurements.length; i++) {\n\t\t\tlet measurement = measurements[i];\n\t\t\tlet coordinates = [];\n\n\t\t\tfor (let j = 0; j < measurement.points.length; j++) {\n\t\t\t\tlet point = measurement.points[j].position;\n\t\t\t\tlet pointMap = this.toMap.forward([point.x, point.y]);\n\t\t\t\tcoordinates.push(pointMap);\n\t\t\t}\n\n\t\t\tif (measurement.closed && measurement.points.length > 0) {\n\t\t\t\tcoordinates.push(coordinates[0]);\n\t\t\t}\n\n\t\t\tlet line = new ol.geom.LineString(coordinates);\n\t\t\tlet feature = new ol.Feature(line);\n\t\t\tthis.toolLayer.getSource().addFeature(feature);\n\t\t}\n\t}\n\n\taddImages360(images){\n\t\tlet transform = this.toMap.forward;\n\t\tlet layer = this.getImages360Layer();\n\n\t\tfor(let image of images.images){\n\n\t\t\tlet p = transform([image.position[0], image.position[1]]);\n\n\t\t\tlet feature = new ol.Feature({\n\t\t\t\t'geometry': new ol.geom.Point(p),\n\t\t\t});\n\n\t\t\tfeature.onClick = () => {\n\t\t\t\timages.focus(image);\n\t\t\t};\n\n\t\t\tlayer.getSource().addFeature(feature);\n\t\t}\n\t}\n\n\tasync load (pointcloud) {\n\t\tif (!pointcloud) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!pointcloud.projection) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.sceneProjection) {\n\t\t\ttry {\n\t\t\t\tthis.setSceneProjection(pointcloud.projection);\n\t\t\t}catch (e) {\n\t\t\t\tconsole.log('Failed projection:', e);\n\n\t\t\t\tif (pointcloud.fallbackProjection) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconsole.log('Trying fallback projection...');\n\t\t\t\t\t\tthis.setSceneProjection(pointcloud.fallbackProjection);\n\t\t\t\t\t\tconsole.log('Set projection from fallback');\n\t\t\t\t\t}catch (e) {\n\t\t\t\t\t\tconsole.log('Failed fallback projection:', e);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\treturn;\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tlet mapExtent = this.getMapExtent();\n\t\tlet mapCenter = this.getMapCenter();\n\n\t\tlet view = this.map.getView();\n\t\tview.setCenter(mapCenter);\n\n\t\tthis.gExtent.setCoordinates([\n\t\t\tmapExtent.bottomLeft,\n\t\t\tmapExtent.bottomRight,\n\t\t\tmapExtent.topRight,\n\t\t\tmapExtent.topLeft,\n\t\t\tmapExtent.bottomLeft\n\t\t]);\n\n\t\tview.fit(this.gExtent, [300, 300], {\n\t\t\tconstrainResolution: false\n\t\t});\n\n\t\tif (pointcloud.pcoGeometry.type == 'ept'){ \n\t\t\treturn;\n\t\t}\n\n\t\tlet url = `${pointcloud.pcoGeometry.url}/../sources.json`;\n\t\t//let response = await fetch(url);\n\n\t\tfetch(url).then(async (response) => {\n\t\t\tlet data = await response.json();\n\t\t\n\t\t\tlet sources = data.sources;\n\n\t\t\tfor (let i = 0; i < sources.length; i++) {\n\t\t\t\tlet source = sources[i];\n\t\t\t\tlet name = source.name;\n\t\t\t\tlet bounds = source.bounds;\n\n\t\t\t\tlet mapBounds = {\n\t\t\t\t\tmin: this.toMap.forward([bounds.min[0], bounds.min[1]]),\n\t\t\t\t\tmax: this.toMap.forward([bounds.max[0], bounds.max[1]])\n\t\t\t\t};\n\t\t\t\tlet mapCenter = [\n\t\t\t\t\t(mapBounds.min[0] + mapBounds.max[0]) / 2,\n\t\t\t\t\t(mapBounds.min[1] + mapBounds.max[1]) / 2\n\t\t\t\t];\n\n\t\t\t\tlet p1 = this.toMap.forward([bounds.min[0], bounds.min[1]]);\n\t\t\t\tlet p2 = this.toMap.forward([bounds.max[0], bounds.min[1]]);\n\t\t\t\tlet p3 = this.toMap.forward([bounds.max[0], bounds.max[1]]);\n\t\t\t\tlet p4 = this.toMap.forward([bounds.min[0], bounds.max[1]]);\n\n\t\t\t\t// let feature = new ol.Feature({\n\t\t\t\t//\t'geometry': new ol.geom.LineString([p1, p2, p3, p4, p1])\n\t\t\t\t// });\n\t\t\t\tlet feature = new ol.Feature({\n\t\t\t\t\t'geometry': new ol.geom.Polygon([[p1, p2, p3, p4, p1]])\n\t\t\t\t});\n\t\t\t\tfeature.source = source;\n\t\t\t\tfeature.pointcloud = pointcloud;\n\t\t\t\tthis.getSourcesLayer().getSource().addFeature(feature);\n\n\t\t\t\tfeature = new ol.Feature({\n\t\t\t\t\tgeometry: new ol.geom.Point(mapCenter),\n\t\t\t\t\tname: name\n\t\t\t\t});\n\t\t\t\tfeature.setStyle(this.createLabelStyle(name));\n\t\t\t\tthis.sourcesLabelLayer.getSource().addFeature(feature);\n\t\t\t}\n\t\t}).catch(() => {\n\t\t\t\n\t\t});\n\n\t}\n\n\ttoggle () {\n\t\tif (this.elMap.is(':visible')) {\n\t\t\tthis.elMap.css('display', 'none');\n\t\t\tthis.enabled = false;\n\t\t} else {\n\t\t\tthis.elMap.css('display', 'block');\n\t\t\tthis.enabled = true;\n\t\t}\n\t}\n\n\tupdate (delta) {\n\t\tif (!this.sceneProjection) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet pm = $('#potree_map');\n\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// resize\n\t\tlet mapSize = this.map.getSize();\n\t\tlet resized = (pm.width() !== mapSize[0] || pm.height() !== mapSize[1]);\n\t\tif (resized) {\n\t\t\tthis.map.updateSize();\n\t\t}\n\n\t\t//\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\n\t\tlet scale = this.map.getView().getResolution();\n\t\tlet campos = camera.position;\n\t\tlet camdir = camera.getWorldDirection(new THREE.Vector3());\n\t\tlet sceneLookAt = camdir.clone().multiplyScalar(30 * scale).add(campos);\n\t\tlet geoPos = camera.position;\n\t\tlet geoLookAt = sceneLookAt;\n\t\tlet mapPos = new THREE.Vector2().fromArray(this.toMap.forward([geoPos.x, geoPos.y]));\n\t\tlet mapLookAt = new THREE.Vector2().fromArray(this.toMap.forward([geoLookAt.x, geoLookAt.y]));\n\t\tlet mapDir = new THREE.Vector2().subVectors(mapLookAt, mapPos).normalize();\n\n\t\tmapLookAt = mapPos.clone().add(mapDir.clone().multiplyScalar(30 * scale));\n\t\tlet mapLength = mapPos.distanceTo(mapLookAt);\n\t\tlet mapSide = new THREE.Vector2(-mapDir.y, mapDir.x);\n\n\t\tlet p1 = mapPos.toArray();\n\t\tlet p2 = mapLookAt.clone().sub(mapSide.clone().multiplyScalar(0.3 * mapLength)).toArray();\n\t\tlet p3 = mapLookAt.clone().add(mapSide.clone().multiplyScalar(0.3 * mapLength)).toArray();\n\n\t\tthis.gCamera.setCoordinates([p1, p2, p3, p1]);\n\t}\n\n\tget sourcesVisible () {\n\t\treturn this.getSourcesLayer().getVisible();\n\t}\n\n\tset sourcesVisible (value) {\n\t\tthis.getSourcesLayer().setVisible(value);\n\t}\n\n}\n","\nexport class CSVExporter {\n\tstatic toString (points) {\n\t\tlet string = '';\n\n\t\tlet attributes = Object.keys(points.data)\n\t\t\t.filter(a => a !== 'normal')\n\t\t\t.sort((a, b) => {\n\t\t\t\tif (a === 'position') return -1;\n\t\t\t\tif (b === 'position') return 1;\n\t\t\t\tif (a === 'rgba') return -1;\n\t\t\t\tif (b === 'rgba') return 1;\n\t\t\t});\n\n\t\tlet headerValues = [];\n\t\tfor (let attribute of attributes) {\n\t\t\tlet itemSize = points.data[attribute].length / points.numPoints;\n\n\t\t\tif (attribute === 'position') {\n\t\t\t\theaderValues = headerValues.concat(['x', 'y', 'z']);\n\t\t\t} else if (attribute === 'rgba') {\n\t\t\t\theaderValues = headerValues.concat(['r', 'g', 'b', 'a']);\n\t\t\t} else if (itemSize > 1) {\n\t\t\t\tfor (let i = 0; i < itemSize; i++) {\n\t\t\t\t\theaderValues.push(`${attribute}_${i}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\theaderValues.push(attribute);\n\t\t\t}\n\t\t}\n\t\tstring = headerValues.join(', ') + '\\n';\n\n\t\tfor (let i = 0; i < points.numPoints; i++) {\n\t\t\tlet values = [];\n\n\t\t\tfor (let attribute of attributes) {\n\t\t\t\tlet itemSize = points.data[attribute].length / points.numPoints;\n\t\t\t\tlet value = points.data[attribute]\n\t\t\t\t\t.subarray(itemSize * i, itemSize * i + itemSize)\n\t\t\t\t\t.join(', ');\n\t\t\t\tvalues.push(value);\n\t\t\t}\n\n\t\t\tstring += values.join(', ') + '\\n';\n\t\t}\n\n\t\treturn string;\n\t}\n};\n","\nexport class LASExporter {\n\tstatic toLAS (points) {\n\t\t// TODO Unused: let string = '';\n\n\t\tlet boundingBox = points.boundingBox;\n\t\tlet offset = boundingBox.min.clone();\n\t\tlet diagonal = boundingBox.min.distanceTo(boundingBox.max);\n\t\tlet scale = new THREE.Vector3(0.001, 0.001, 0.001);\n\t\tif (diagonal > 1000 * 1000) {\n\t\t\tscale = new THREE.Vector3(0.01, 0.01, 0.01);\n\t\t} else {\n\t\t\tscale = new THREE.Vector3(0.001, 0.001, 0.001);\n\t\t}\n\n\t\tlet setString = function (string, offset, buffer) {\n\t\t\tlet view = new Uint8Array(buffer);\n\n\t\t\tfor (let i = 0; i < string.length; i++) {\n\t\t\t\tlet charCode = string.charCodeAt(i);\n\t\t\t\tview[offset + i] = charCode;\n\t\t\t}\n\t\t};\n\n\t\tlet buffer = new ArrayBuffer(227 + 28 * points.numPoints);\n\t\tlet view = new DataView(buffer);\n\t\tlet u8View = new Uint8Array(buffer);\n\t\t// let u16View = new Uint16Array(buffer);\n\n\t\tsetString('LASF', 0, buffer);\n\t\tu8View[24] = 1;\n\t\tu8View[25] = 2;\n\n\t\t// system identifier o:26 l:32\n\n\t\t// generating software o:58 l:32\n\t\tsetString('Potree 1.7', 58, buffer);\n\n\t\t// file creation day of year o:90 l:2\n\t\t// file creation year o:92 l:2\n\n\t\t// header size o:94 l:2\n\t\tview.setUint16(94, 227, true);\n\n\t\t// offset to point data o:96 l:4\n\t\tview.setUint32(96, 227, true);\n\n\t\t// number of letiable length records o:100 l:4\n\n\t\t// point data record format 104 1\n\t\tu8View[104] = 2;\n\n\t\t// point data record length 105 2\n\t\tview.setUint16(105, 28, true);\n\n\t\t// number of point records 107 4\n\t\tview.setUint32(107, points.numPoints, true);\n\n\t\t// number of points by return 111 20\n\n\t\t// x scale factor 131 8\n\t\tview.setFloat64(131, scale.x, true);\n\n\t\t// y scale factor 139 8\n\t\tview.setFloat64(139, scale.y, true);\n\n\t\t// z scale factor 147 8\n\t\tview.setFloat64(147, scale.z, true);\n\n\t\t// x offset 155 8\n\t\tview.setFloat64(155, offset.x, true);\n\n\t\t// y offset 163 8\n\t\tview.setFloat64(163, offset.y, true);\n\n\t\t// z offset 171 8\n\t\tview.setFloat64(171, offset.z, true);\n\n\t\t// max x 179 8\n\t\tview.setFloat64(179, boundingBox.max.x, true);\n\n\t\t// min x 187 8\n\t\tview.setFloat64(187, boundingBox.min.x, true);\n\n\t\t// max y 195 8\n\t\tview.setFloat64(195, boundingBox.max.y, true);\n\n\t\t// min y 203 8\n\t\tview.setFloat64(203, boundingBox.min.y, true);\n\n\t\t// max z 211 8\n\t\tview.setFloat64(211, boundingBox.max.z, true);\n\n\t\t// min z 219 8\n\t\tview.setFloat64(219, boundingBox.min.z, true);\n\n\t\tlet boffset = 227;\n\t\tfor (let i = 0; i < points.numPoints; i++) {\n\n\t\t\tlet px = points.data.position[3 * i + 0];\n\t\t\tlet py = points.data.position[3 * i + 1];\n\t\t\tlet pz = points.data.position[3 * i + 2];\n\n\t\t\tlet ux = parseInt((px - offset.x) / scale.x);\n\t\t\tlet uy = parseInt((py - offset.y) / scale.y);\n\t\t\tlet uz = parseInt((pz - offset.z) / scale.z);\n\n\t\t\tview.setUint32(boffset + 0, ux, true);\n\t\t\tview.setUint32(boffset + 4, uy, true);\n\t\t\tview.setUint32(boffset + 8, uz, true);\n\n\t\t\tif (points.data.intensity) {\n\t\t\t\tview.setUint16(boffset + 12, (points.data.intensity[i]), true);\n\t\t\t}\n\n\t\t\tlet rt = 0;\n\t\t\tif (points.data.returnNumber) {\n\t\t\t\trt += points.data.returnNumber[i];\n\t\t\t}\n\t\t\tif (points.data.numberOfReturns) {\n\t\t\t\trt += (points.data.numberOfReturns[i] << 3);\n\t\t\t}\n\t\t\tview.setUint8(boffset + 14, rt);\n\n\t\t\tif (points.data.classification) {\n\t\t\t\tview.setUint8(boffset + 15, points.data.classification[i]);\n\t\t\t}\n\t\t\t// scan angle rank\n\t\t\t// user data\n\t\t\t// point source id\n\t\t\tif (points.data.pointSourceID) {\n\t\t\t\tview.setUint16(boffset + 18, points.data.pointSourceID[i]);\n\t\t\t}\n\n\t\t\tif (points.data.rgba) {\n\t\t\t\tlet rgba = points.data.rgba;\n\t\t\t\tview.setUint16(boffset + 20, (rgba[4 * i + 0] * 255), true);\n\t\t\t\tview.setUint16(boffset + 22, (rgba[4 * i + 1] * 255), true);\n\t\t\t\tview.setUint16(boffset + 24, (rgba[4 * i + 2] * 255), true);\n\t\t\t}\n\n\t\t\tboffset += 28;\n\t\t}\n\n\t\treturn buffer;\n\t}\n\t\n}\n","\n\nimport {Utils} from \"../utils.js\";\nimport {Points} from \"../Points.js\";\nimport {CSVExporter} from \"../exporter/CSVExporter.js\";\nimport {LASExporter} from \"../exporter/LASExporter.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\nimport {PointCloudTree} from \"../PointCloudTree.js\";\nimport {Renderer} from \"../PotreeRenderer.js\";\nimport {PointCloudMaterial} from \"../materials/PointCloudMaterial.js\";\nimport {PointSizeType} from \"../defines.js\";\n\n\nfunction copyMaterial(source, target){\n\n\tfor(let name of Object.keys(target.uniforms)){\n\t\ttarget.uniforms[name].value = source.uniforms[name].value;\n\t}\n\n\ttarget.gradientTexture = source.gradientTexture;\n\ttarget.visibleNodesTexture = source.visibleNodesTexture;\n\ttarget.classificationTexture = source.classificationTexture;\n\ttarget.matcapTexture = source.matcapTexture;\n\n\ttarget.activeAttributeName = source.activeAttributeName;\n\ttarget.ranges = source.ranges;\n\n\t//target.updateShaderSource();\n}\n\n\nclass Batch{\n\n\tconstructor(geometry, material){\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.sceneNode = new THREE.Points(geometry, material);\n\n\t\tthis.geometryNode = {\n\t\t\testimatedSpacing: 1.0,\n\t\t\tgeometry: geometry,\n\t\t};\n\t}\n\n\tgetLevel(){\n\t\treturn 0;\n\t}\n\n}\n\nclass ProfileFakeOctree extends PointCloudTree{\n\n\tconstructor(octree){\n\t\tsuper();\n\n\t\tthis.trueOctree = octree;\n\t\tthis.pcoGeometry = octree.pcoGeometry;\n\t\tthis.points = [];\n\t\tthis.visibleNodes = [];\n\t\t\n\t\t//this.material = this.trueOctree.material;\n\t\tthis.material = new PointCloudMaterial();\n\t\t//this.material.copy(this.trueOctree.material);\n\t\tcopyMaterial(this.trueOctree.material, this.material);\n\t\tthis.material.pointSizeType = PointSizeType.FIXED;\n\n\t\tthis.batchSize = 100 * 1000;\n\t\tthis.currentBatch = null\n\t}\n\n\tgetAttribute(name){\n\t\treturn this.trueOctree.getAttribute(name);\n\t}\n\n\tdispose(){\n\t\tfor(let node of this.visibleNodes){\n\t\t\tnode.geometry.dispose();\n\t\t}\n\n\t\tthis.visibleNodes = [];\n\t\tthis.currentBatch = null;\n\t\tthis.points = [];\n\t}\n\n\taddPoints(data){\n\t\t// since each call to addPoints can deliver very very few points,\n\t\t// we're going to batch them into larger buffers for efficiency.\n\n\t\tif(this.currentBatch === null){\n\t\t\tthis.currentBatch = this.createNewBatch(data);\n\t\t}\n\n\t\tthis.points.push(data);\n\n\n\t\tlet updateRange = {\n\t\t\tstart: this.currentBatch.geometry.drawRange.count,\n\t\t\tcount: 0\n\t\t};\n\t\tlet projectedBox = new THREE.Box3();\n\n\t\tlet truePos = new THREE.Vector3();\n\n\t\tfor(let i = 0; i < data.numPoints; i++){\n\n\t\t\tif(updateRange.start + updateRange.count >= this.batchSize){\n\t\t\t\t// current batch full, start new batch\n\n\t\t\t\tfor(let key of Object.keys(this.currentBatch.geometry.attributes)){\n\t\t\t\t\tlet attribute = this.currentBatch.geometry.attributes[key];\n\t\t\t\t\tattribute.updateRange.offset = updateRange.start;\n\t\t\t\t\tattribute.updateRange.count = updateRange.count;\n\t\t\t\t\tattribute.needsUpdate = true;\n\t\t\t\t}\n\n\t\t\t\tthis.currentBatch.geometry.computeBoundingBox();\n\t\t\t\tthis.currentBatch.geometry.computeBoundingSphere();\n\n\t\t\t\tthis.currentBatch = this.createNewBatch();\n\t\t\t\tupdateRange = {\n\t\t\t\t\tstart: 0,\n\t\t\t\t\tcount: 0\n\t\t\t\t};\n\t\t\t}\n\n\t\t\ttruePos.set(\n\t\t\t\tdata.data.position[3 * i + 0] + this.trueOctree.position.x,\n\t\t\t\tdata.data.position[3 * i + 1] + this.trueOctree.position.y,\n\t\t\t\tdata.data.position[3 * i + 2] + this.trueOctree.position.z,\n\t\t\t);\n\n\t\t\tlet x = data.data.mileage[i];\n\t\t\tlet y = 0;\n\t\t\tlet z = truePos.z;\n\n\t\t\tprojectedBox.expandByPoint(new THREE.Vector3(x, y, z));\n\n\t\t\tlet index = updateRange.start + updateRange.count;\n\t\t\tlet geometry = this.currentBatch.geometry;\n\n\t\t\tfor(let attributeName of Object.keys(data.data)){\n\t\t\t\tlet source = data.data[attributeName];\n\t\t\t\tlet target = geometry.attributes[attributeName];\n\t\t\t\tlet numElements = target.itemSize;\n\t\t\t\t\n\t\t\t\tfor(let item = 0; item < numElements; item++){\n\t\t\t\t\ttarget.array[numElements * index + item] = source[numElements * i + item];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tlet position = geometry.attributes.position;\n\n\t\t\t\tposition.array[3 * index + 0] = x;\n\t\t\t\tposition.array[3 * index + 1] = y;\n\t\t\t\tposition.array[3 * index + 2] = z;\n\t\t\t}\n\n\t\t\tupdateRange.count++;\n\t\t\tthis.currentBatch.geometry.drawRange.count++;\n\t\t}\n\n\t\tfor(let key of Object.keys(this.currentBatch.geometry.attributes)){\n\t\t\tlet attribute = this.currentBatch.geometry.attributes[key];\n\t\t\tattribute.updateRange.offset = updateRange.start;\n\t\t\tattribute.updateRange.count = updateRange.count;\n\t\t\tattribute.needsUpdate = true;\n\t\t}\n\n\t\tdata.projectedBox = projectedBox;\n\n\t\tthis.projectedBox = this.points.reduce( (a, i) => a.union(i.projectedBox), new THREE.Box3());\n\t}\n\n\tcreateNewBatch(data){\n\t\tlet geometry = new THREE.BufferGeometry();\n\n\t\t// create new batches with batch_size elements of the same type as the attribute\n\t\tfor(let attributeName of Object.keys(data.data)){\n\t\t\tlet buffer = data.data[attributeName];\n\t\t\tlet numElements = buffer.length / data.numPoints; // 3 for pos, 4 for col, 1 for scalars\n\t\t\tlet constructor = buffer.constructor;\n\t\t\tlet normalized = false;\n\t\t\t\n\t\t\tif(this.trueOctree.root.sceneNode){\n\t\t\t\tif(this.trueOctree.root.sceneNode.geometry.attributes[attributeName]){\n\t\t\t\t\tnormalized = this.trueOctree.root.sceneNode.geometry.attributes[attributeName].normalized;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\t\t\tlet batchBuffer = new constructor(numElements * this.batchSize);\n\n\t\t\tlet bufferAttribute = new THREE.BufferAttribute(batchBuffer, numElements, normalized);\n\t\t\tbufferAttribute.potree = {\n\t\t\t\trange: [0, 1],\n\t\t\t};\n\n\t\t\tgeometry.addAttribute(attributeName, bufferAttribute);\n\t\t}\n\n\t\tgeometry.drawRange.start = 0;\n\t\tgeometry.drawRange.count = 0;\n\n\t\tlet batch = new Batch(geometry, this.material);\n\n\t\tthis.visibleNodes.push(batch);\n\n\t\treturn batch;\n\t}\n\t\n\tcomputeVisibilityTextureData(){\n\t\tlet data = new Uint8Array(this.visibleNodes.length * 4);\n\t\tlet offsets = new Map();\n\n\t\tfor(let i = 0; i < this.visibleNodes.length; i++){\n\t\t\tlet node = this.visibleNodes[i];\n\n\t\t\toffsets[node] = i;\n\t\t}\n\n\n\t\treturn {\n\t\t\tdata: data,\n\t\t\toffsets: offsets,\n\t\t};\n\t}\n\n}\n\nexport class ProfileWindow extends EventDispatcher {\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.elRoot = $('#profile_window');\n\t\tthis.renderArea = this.elRoot.find('#profileCanvasContainer');\n\t\tthis.svg = d3.select('svg#profileSVG');\n\t\tthis.mouseIsDown = false;\n\n\t\tthis.projectedBox = new THREE.Box3();\n\t\tthis.pointclouds = new Map();\n\t\tthis.numPoints = 0;\n\t\tthis.lastAddPointsTimestamp = undefined;\n\n\t\tthis.mouse = new THREE.Vector2(0, 0);\n\t\tthis.scale = new THREE.Vector3(1, 1, 1);\n\n\t\tthis.autoFitEnabled = true; // completely disable/enable\n\t\tthis.autoFit = false; // internal\n\n\t\tlet cwIcon = `${exports.resourcePath}/icons/arrow_cw.svg`;\n\t\t$('#potree_profile_rotate_cw').attr('src', cwIcon);\n\n\t\tlet ccwIcon = `${exports.resourcePath}/icons/arrow_ccw.svg`;\n\t\t$('#potree_profile_rotate_ccw').attr('src', ccwIcon);\n\t\t\n\t\tlet forwardIcon = `${exports.resourcePath}/icons/arrow_up.svg`;\n\t\t$('#potree_profile_move_forward').attr('src', forwardIcon);\n\n\t\tlet backwardIcon = `${exports.resourcePath}/icons/arrow_down.svg`;\n\t\t$('#potree_profile_move_backward').attr('src', backwardIcon);\n\n\t\tlet csvIcon = `${exports.resourcePath}/icons/file_csv_2d.svg`;\n\t\t$('#potree_download_csv_icon').attr('src', csvIcon);\n\n\t\tlet lasIcon = `${exports.resourcePath}/icons/file_las_3d.svg`;\n\t\t$('#potree_download_las_icon').attr('src', lasIcon);\n\n\t\tlet closeIcon = `${exports.resourcePath}/icons/close.svg`;\n\t\t$('#closeProfileContainer').attr(\"src\", closeIcon);\n\n\t\tthis.initTHREE();\n\t\tthis.initSVG();\n\t\tthis.initListeners();\n\n\t\tthis.pRenderer = new Renderer(this.renderer);\n\n\t\tthis.elRoot.i18n();\n\t}\n\n\tinitListeners () {\n\t\t$(window).resize(() => {\n\t\t\tif (this.enabled) {\n\t\t\tthis.render();\n\t\t\t}\n\t\t});\n\n\t\tthis.renderArea.mousedown(e => {\n\t\t\tthis.mouseIsDown = true;\n\t\t});\n\n\t\tthis.renderArea.mouseup(e => {\n\t\t\tthis.mouseIsDown = false;\n\t\t});\n\n\t\tlet viewerPickSphereSizeHandler = () => {\n\t\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\t\tlet domElement = this.viewer.renderer.domElement;\n\t\t\tlet distance = this.viewerPickSphere.position.distanceTo(camera.position);\n\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, domElement.clientWidth, domElement.clientHeight);\n\t\t\tlet scale = (10 / pr);\n\t\t\tthis.viewerPickSphere.scale.set(scale, scale, scale);\n\t\t};\n\n\t\tthis.renderArea.mousemove(e => {\n\t\t\tif (this.pointclouds.size === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet rect = this.renderArea[0].getBoundingClientRect();\n\t\t\tlet x = e.clientX - rect.left;\n\t\t\tlet y = e.clientY - rect.top;\n\n\t\t\tlet newMouse = new THREE.Vector2(x, y);\n\n\t\t\tif (this.mouseIsDown) {\n\t\t\t\t// DRAG\n\t\t\t\tthis.autoFit = false;\n\t\t\t\tthis.lastDrag = new Date().getTime();\n\n\t\t\t\tlet cPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)];\n\t\t\t\tlet ncPos = [this.scaleX.invert(newMouse.x), this.scaleY.invert(newMouse.y)];\n\n\t\t\t\tthis.camera.position.x -= ncPos[0] - cPos[0];\n\t\t\t\tthis.camera.position.z -= ncPos[1] - cPos[1];\n\n\t\t\t\tthis.render();\n\t\t\t} else if (this.pointclouds.size > 0) {\n\t\t\t\t// FIND HOVERED POINT\n\t\t\t\tlet radius = Math.abs(this.scaleX.invert(0) - this.scaleX.invert(40));\n\t\t\t\tlet mileage = this.scaleX.invert(newMouse.x);\n\t\t\t\tlet elevation = this.scaleY.invert(newMouse.y);\n\n\t\t\t\tlet closest = this.selectPoint(mileage, elevation, radius);\n\n\t\t\t\tif (closest) {\n\t\t\t\t\tlet point = closest.point;\n\n\t\t\t\t\tlet position = new Float64Array([\n\t\t\t\t\t\tpoint.position[0] + closest.pointcloud.position.x,\n\t\t\t\t\t\tpoint.position[1] + closest.pointcloud.position.y,\n\t\t\t\t\t\tpoint.position[2] + closest.pointcloud.position.z\n\t\t\t\t\t]);\n\n\t\t\t\t\tthis.elRoot.find('#profileSelectionProperties').fadeIn(200);\n\t\t\t\t\tthis.pickSphere.visible = true;\n\t\t\t\t\tthis.pickSphere.scale.set(0.5 * radius, 0.5 * radius, 0.5 * radius);\n\t\t\t\t\tthis.pickSphere.position.set(point.mileage, 0, position[2]);\n\n\t\t\t\t\tthis.viewerPickSphere.position.set(...position);\n\t\t\t\t\t\n\t\t\t\t\tif(!this.viewer.scene.scene.children.includes(this.viewerPickSphere)){\n\t\t\t\t\t\tthis.viewer.scene.scene.add(this.viewerPickSphere);\n\t\t\t\t\t\tif(!this.viewer.hasEventListener(\"update\", viewerPickSphereSizeHandler)){\n\t\t\t\t\t\t\tthis.viewer.addEventListener(\"update\", viewerPickSphereSizeHandler);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\n\t\t\t\t\tlet info = this.elRoot.find('#profileSelectionProperties');\n\t\t\t\t\tlet html = '';\n\n\t\t\t\t\tfor (let attributeName of Object.keys(point)) {\n\n\t\t\t\t\t\tlet value = point[attributeName];\n\t\t\t\t\t\tlet attribute = closest.pointcloud.getAttribute(attributeName);\n\n\t\t\t\t\t\tlet transform = value => value;\n\t\t\t\t\t\tif(attribute && attribute.type.size > 4){\n\t\t\t\t\t\t\tlet range = attribute.initialRange;\n\t\t\t\t\t\t\tlet scale = 1 / (range[1] - range[0]);\n\t\t\t\t\t\t\tlet offset = range[0];\n\t\t\t\t\t\t\ttransform = value => value / scale + offset;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t\tif (attributeName === 'position') {\n\t\t\t\t\t\t\tlet values = [...position].map(v => Utils.addCommas(v.toFixed(3)));\n\t\t\t\t\t\t\thtml += `\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t} else if (attributeName === 'rgba') {\n\t\t\t\t\t\t\thtml += `\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t} else if (attributeName === 'normal') {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t} else if (attributeName === 'mileage') {\n\t\t\t\t\t\t\thtml += `\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thtml += `\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\thtml += '
    x${values[0]}
    y${values[1]}
    z${values[2]}
    ${attributeName}${value.join(', ')}
    ${attributeName}${value.toFixed(3)}
    ${attributeName}${transform(value)}
    ';\n\t\t\t\t\tinfo.html(html);\n\n\t\t\t\t\tthis.selectedPoint = point;\n\t\t\t\t} else {\n\t\t\t\t\t// this.pickSphere.visible = false;\n\t\t\t\t\t// this.selectedPoint = null;\n\n\t\t\t\t\tthis.viewer.scene.scene.add(this.viewerPickSphere);\n\n\t\t\t\t\tlet index = this.viewer.scene.scene.children.indexOf(this.viewerPickSphere);\n\t\t\t\t\tif(index >= 0){\n\t\t\t\t\t\tthis.viewer.scene.scene.children.splice(index, 1);\n\t\t\t\t\t}\n\t\t\t\t\tthis.viewer.removeEventListener(\"update\", viewerPickSphereSizeHandler);\n\t\t\t\t\t\n\n\t\t\t\t}\n\t\t\t\tthis.render();\n\t\t\t}\n\n\t\t\tthis.mouse.copy(newMouse);\n\t\t});\n\n\t\tlet onWheel = e => {\n\t\t\tthis.autoFit = false;\n\n\t\t\tlet delta = 0;\n\t\t\tif (e.wheelDelta !== undefined) { // WebKit / Opera / Explorer 9\n\t\t\t\tdelta = e.wheelDelta;\n\t\t\t} else if (e.detail !== undefined) { // Firefox\n\t\t\t\tdelta = -e.detail;\n\t\t\t}\n\n\t\t\tlet ndelta = Math.sign(delta);\n\n\t\t\tlet cPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)];\n\n\t\t\tif (ndelta > 0) {\n\t\t\t\t// + 10%\n\t\t\t\tthis.scale.multiplyScalar(1.1);\n\t\t\t} else {\n\t\t\t\t// - 10%\n\t\t\t\tthis.scale.multiplyScalar(100 / 110);\n\t\t\t}\n\n\t\t\tthis.updateScales();\n\t\t\tlet ncPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)];\n\n\t\t\tthis.camera.position.x -= ncPos[0] - cPos[0];\n\t\t\tthis.camera.position.z -= ncPos[1] - cPos[1];\n\n\t\t\tthis.render();\n\t\t\tthis.updateScales();\n\t\t};\n\t\t$(this.renderArea)[0].addEventListener('mousewheel', onWheel, false);\n\t\t$(this.renderArea)[0].addEventListener('DOMMouseScroll', onWheel, false); // Firefox\n\n\t\t$('#closeProfileContainer').click(() => {\n\t\t\tthis.hide();\n\t\t});\n\n\t\tlet getProfilePoints = () => {\n\t\t\tlet points = new Points();\n\t\t\t\n\t\t\tfor(let [pointcloud, entry] of this.pointclouds){\n\t\t\t\tfor(let pointSet of entry.points){\n\n\t\t\t\t\tlet originPos = pointSet.data.position;\n\t\t\t\t\tlet trueElevationPosition = new Float32Array(originPos);\n\t\t\t\t\tfor(let i = 0; i < pointSet.numPoints; i++){\n\t\t\t\t\t\ttrueElevationPosition[3 * i + 2] += pointcloud.position.z;\n\t\t\t\t\t}\n\n\t\t\t\t\tpointSet.data.position = trueElevationPosition;\n\t\t\t\t\tpoints.add(pointSet);\n\t\t\t\t\tpointSet.data.position = originPos;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn points;\n\t\t};\n\n\t\t$('#potree_download_csv_icon').click(() => {\n\t\t\t\n\t\t\tlet points = getProfilePoints();\n\n\t\t\tlet string = CSVExporter.toString(points);\n\n\t\t\tlet blob = new Blob([string], {type: \"text/string\"});\n\t\t\t$('#potree_download_profile_ortho_link').attr('href', URL.createObjectURL(blob));\n\t\t});\n\n\t\t$('#potree_download_las_icon').click(() => {\n\n\t\t\tlet points = getProfilePoints();\n\n\t\t\tlet buffer = LASExporter.toLAS(points);\n\n\t\t\tlet blob = new Blob([buffer], {type: \"application/octet-binary\"});\n\t\t\t$('#potree_download_profile_link').attr('href', URL.createObjectURL(blob));\n\t\t});\n\t}\n\n\tselectPoint (mileage, elevation, radius) {\n\t\tlet closest = {\n\t\t\tdistance: Infinity,\n\t\t\tpointcloud: null,\n\t\t\tpoints: null,\n\t\t\tindex: null\n\t\t};\n\n\t\tlet pointBox = new THREE.Box2(\n\t\t\tnew THREE.Vector2(mileage - radius, elevation - radius),\n\t\t\tnew THREE.Vector2(mileage + radius, elevation + radius));\n\n\t\tlet numTested = 0;\n\t\tlet numSkipped = 0;\n\t\tlet numTestedPoints = 0;\n\t\tlet numSkippedPoints = 0;\n\n\t\tfor (let [pointcloud, entry] of this.pointclouds) {\n\t\t\tfor(let points of entry.points){\n\n\t\t\t\tlet collisionBox = new THREE.Box2(\n\t\t\t\t\tnew THREE.Vector2(points.projectedBox.min.x, points.projectedBox.min.z),\n\t\t\t\t\tnew THREE.Vector2(points.projectedBox.max.x, points.projectedBox.max.z)\n\t\t\t\t);\n\n\t\t\t\tlet intersects = collisionBox.intersectsBox(pointBox);\n\n\t\t\t\tif(!intersects){\n\t\t\t\t\tnumSkipped++;\n\t\t\t\t\tnumSkippedPoints += points.numPoints;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tnumTested++;\n\t\t\t\tnumTestedPoints += points.numPoints\n\n\t\t\t\tfor (let i = 0; i < points.numPoints; i++) {\n\n\t\t\t\t\tlet m = points.data.mileage[i] - mileage;\n\t\t\t\t\tlet e = points.data.position[3 * i + 2] - elevation + pointcloud.position.z;\n\t\t\t\t\tlet r = Math.sqrt(m * m + e * e);\n\n\t\t\t\t\tconst withinDistance = r < radius && r < closest.distance;\n\t\t\t\t\tlet unfilteredClass = true;\n\n\t\t\t\t\tif(points.data.classification){\n\t\t\t\t\t\tconst classification = pointcloud.material.classification;\n\n\t\t\t\t\t\tconst pointClassID = points.data.classification[i];\n\t\t\t\t\t\tconst pointClassValue = classification[pointClassID];\n\n\t\t\t\t\t\tif(pointClassValue && (!pointClassValue.visible || pointClassValue.color.w === 0)){\n\t\t\t\t\t\t\tunfilteredClass = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (withinDistance && unfilteredClass) {\n\t\t\t\t\t\tclosest = {\n\t\t\t\t\t\t\tdistance: r,\n\t\t\t\t\t\t\tpointcloud: pointcloud,\n\t\t\t\t\t\t\tpoints: points,\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\t//console.log(`nodes: ${numTested}, ${numSkipped} || points: ${numTestedPoints}, ${numSkippedPoints}`);\n\n\t\tif (closest.distance < Infinity) {\n\t\t\tlet points = closest.points;\n\n\t\t\tlet point = {};\n\n\t\t\tlet attributes = Object.keys(points.data);\n\t\t\tfor (let attribute of attributes) {\n\t\t\t\tlet attributeData = points.data[attribute];\n\t\t\t\tlet itemSize = attributeData.length / points.numPoints;\n\t\t\t\tlet value = attributeData.subarray(itemSize * closest.index, itemSize * closest.index + itemSize);\n\n\t\t\t\tif (value.length === 1) {\n\t\t\t\t\tpoint[attribute] = value[0];\n\t\t\t\t} else {\n\t\t\t\t\tpoint[attribute] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tclosest.point = point;\n\n\t\t\treturn closest;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tinitTHREE () {\n\t\tthis.renderer = new THREE.WebGLRenderer({alpha: true, premultipliedAlpha: false});\n\t\tthis.renderer.setClearColor(0x000000, 0);\n\t\tthis.renderer.setSize(10, 10);\n\t\tthis.renderer.autoClear = false;\n\t\tthis.renderArea.append($(this.renderer.domElement));\n\t\tthis.renderer.domElement.tabIndex = '2222';\n\t\t$(this.renderer.domElement).css('width', '100%');\n\t\t$(this.renderer.domElement).css('height', '100%');\n\n\n\t\t{\n\t\t\tlet gl = this.renderer.getContext();\n\n\t\t\tlet extVAO = gl.getExtension('OES_vertex_array_object');\n\n\t\t\tif(!extVAO){\n\t\t\t\tthrow new Error(\"OES_vertex_array_object extension not supported\");\n\t\t\t}\n\n\t\t\tgl.createVertexArray = extVAO.createVertexArrayOES.bind(extVAO);\n\t\t\tgl.bindVertexArray = extVAO.bindVertexArrayOES.bind(extVAO);\n\t\t}\n\n\t\tthis.camera = new THREE.OrthographicCamera(-1000, 1000, 1000, -1000, -1000, 1000);\n\t\tthis.camera.up.set(0, 0, 1);\n\t\tthis.camera.rotation.order = \"ZXY\";\n\t\tthis.camera.rotation.x = Math.PI / 2.0;\n\t\n\n\t\tthis.scene = new THREE.Scene();\n\t\tthis.profileScene = new THREE.Scene();\n\n\t\tlet sg = new THREE.SphereGeometry(1, 16, 16);\n\t\tlet sm = new THREE.MeshNormalMaterial();\n\t\tthis.pickSphere = new THREE.Mesh(sg, sm);\n\t\tthis.scene.add(this.pickSphere);\n\n\t\t{\n\t\t\tconst sg = new THREE.SphereGeometry(2);\n\t\t\tconst sm = new THREE.MeshNormalMaterial();\n\t\t\tconst s = new THREE.Mesh(sg, sm);\n\n\t\t\ts.position.set(589530.450, 231398.860, 769.735);\n\n\t\t\tthis.scene.add(s);\n\t\t}\n\n\t\tthis.viewerPickSphere = new THREE.Mesh(sg, sm);\n\t}\n\n\tinitSVG () {\n\t\tlet width = this.renderArea[0].clientWidth;\n\t\tlet height = this.renderArea[0].clientHeight;\n\t\tlet marginLeft = this.renderArea[0].offsetLeft;\n\n\t\tthis.svg.selectAll('*').remove();\n\n\t\tthis.scaleX = d3.scale.linear()\n\t\t\t.domain([this.camera.left + this.camera.position.x, this.camera.right + this.camera.position.x])\n\t\t\t.range([0, width]);\n\t\tthis.scaleY = d3.scale.linear()\n\t\t\t.domain([this.camera.bottom + this.camera.position.z, this.camera.top + this.camera.position.z])\n\t\t\t.range([height, 0]);\n\n\t\tthis.xAxis = d3.svg.axis()\n\t\t\t.scale(this.scaleX)\n\t\t\t.orient('bottom')\n\t\t\t.innerTickSize(-height)\n\t\t\t.outerTickSize(1)\n\t\t\t.tickPadding(10)\n\t\t\t.ticks(width / 50);\n\n\t\tthis.yAxis = d3.svg.axis()\n\t\t\t.scale(this.scaleY)\n\t\t\t.orient('left')\n\t\t\t.innerTickSize(-width)\n\t\t\t.outerTickSize(1)\n\t\t\t.tickPadding(10)\n\t\t\t.ticks(height / 20);\n\n\t\tthis.elXAxis = this.svg.append('g')\n\t\t\t.attr('class', 'x axis')\n\t\t\t.attr('transform', `translate(${marginLeft}, ${height})`)\n\t\t\t.call(this.xAxis);\n\n\t\tthis.elYAxis = this.svg.append('g')\n\t\t\t.attr('class', 'y axis')\n\t\t\t.attr('transform', `translate(${marginLeft}, 0)`)\n\t\t\t.call(this.yAxis);\n\t}\n\n\taddPoints (pointcloud, points) {\n\n\t\tif(points.numPoints === 0){\n\t\t\treturn;\n\t\t}\n\n\t\tlet entry = this.pointclouds.get(pointcloud);\n\t\tif(!entry){\n\t\t\tentry = new ProfileFakeOctree(pointcloud);\n\t\t\tthis.pointclouds.set(pointcloud, entry);\n\t\t\tthis.profileScene.add(entry);\n\n\t\t\tlet materialChanged = () => {\n\t\t\t\tthis.render();\n\t\t\t};\n\n\t\t\tmaterialChanged();\n\n\t\t\tpointcloud.material.addEventListener('material_property_changed', materialChanged);\n\t\t\tthis.addEventListener(\"on_reset_once\", () => {\n\t\t\t\tpointcloud.material.removeEventListener('material_property_changed', materialChanged);\n\t\t\t});\n\t\t}\n\n\t\tentry.addPoints(points);\n\t\tthis.projectedBox.union(entry.projectedBox);\n\n\t\tif (this.autoFit && this.autoFitEnabled) { \n\t\t\tlet width = this.renderArea[0].clientWidth;\n\t\t\tlet height = this.renderArea[0].clientHeight;\n\n\t\t\tlet size = this.projectedBox.getSize(new THREE.Vector3());\n\n\t\t\tlet sx = width / size.x;\n\t\t\tlet sy = height / size.z;\n\t\t\tlet scale = Math.min(sx, sy);\n\n\t\t\tlet center = this.projectedBox.getCenter(new THREE.Vector3());\n\t\t\tthis.scale.set(scale, scale, 1);\n\t\t\tthis.camera.position.copy(center);\n\n\t\t\t//console.log(\"camera: \", this.camera.position.toArray().join(\", \"));\n\t\t}\n\n\t\t//console.log(entry);\n\n\t\tthis.render();\n\n\t\tlet numPoints = 0;\n\t\tfor (let [key, value] of this.pointclouds.entries()) {\n\t\t\tnumPoints += value.points.reduce( (a, i) => a + i.numPoints, 0);\n\t\t}\n\t\t$(`#profile_num_points`).html(Utils.addCommas(numPoints));\n\n\t}\n\n\treset () {\n\t\tthis.lastReset = new Date().getTime();\n\n\t\tthis.dispatchEvent({type: \"on_reset_once\"});\n\t\tthis.removeEventListeners(\"on_reset_once\");\n\n\t\tthis.autoFit = true;\n\t\tthis.projectedBox = new THREE.Box3();\n\n\t\tfor(let [key, entry] of this.pointclouds){\n\t\t\tentry.dispose();\n\t\t}\n\n\t\tthis.pointclouds.clear();\n\t\tthis.mouseIsDown = false;\n\t\tthis.mouse.set(0, 0);\n\n\t\tif(this.autoFitEnabled){\n\t\t\tthis.scale.set(1, 1, 1);\n\t\t}\n\t\tthis.pickSphere.visible = false;\n\n\t\tthis.elRoot.find('#profileSelectionProperties').hide();\n\n\t\tthis.render();\n\t}\n\n\tshow () {\n\t\tthis.elRoot.fadeIn();\n\t\tthis.enabled = true;\n\t}\n\n\thide () {\n\t\tthis.elRoot.fadeOut();\n\t\tthis.enabled = false;\n\t}\n\n\tupdateScales () {\n\n\t\tlet width = this.renderArea[0].clientWidth;\n\t\tlet height = this.renderArea[0].clientHeight;\n\n\t\tlet left = (-width / 2) / this.scale.x;\n\t\tlet right = (+width / 2) / this.scale.x;\n\t\tlet top = (+height / 2) / this.scale.y;\n\t\tlet bottom = (-height / 2) / this.scale.y;\n\n\t\tthis.camera.left = left;\n\t\tthis.camera.right = right;\n\t\tthis.camera.top = top;\n\t\tthis.camera.bottom = bottom;\n\t\tthis.camera.updateProjectionMatrix();\n\n\t\tthis.scaleX.domain([this.camera.left + this.camera.position.x, this.camera.right + this.camera.position.x])\n\t\t\t.range([0, width]);\n\t\tthis.scaleY.domain([this.camera.bottom + this.camera.position.z, this.camera.top + this.camera.position.z])\n\t\t\t.range([height, 0]);\n\n\t\tlet marginLeft = this.renderArea[0].offsetLeft;\n\n\t\tthis.xAxis.scale(this.scaleX)\n\t\t\t.orient('bottom')\n\t\t\t.innerTickSize(-height)\n\t\t\t.outerTickSize(1)\n\t\t\t.tickPadding(10)\n\t\t\t.ticks(width / 50);\n\t\tthis.yAxis.scale(this.scaleY)\n\t\t\t.orient('left')\n\t\t\t.innerTickSize(-width)\n\t\t\t.outerTickSize(1)\n\t\t\t.tickPadding(10)\n\t\t\t.ticks(height / 20);\n\n\n\t\tthis.elXAxis\n\t\t\t.attr('transform', `translate(${marginLeft}, ${height})`)\n\t\t\t.call(this.xAxis);\n\t\tthis.elYAxis\n\t\t\t.attr('transform', `translate(${marginLeft}, 0)`)\n\t\t\t.call(this.yAxis);\n\t}\n\n\trequestScaleUpdate(){\n\n\t\tlet threshold = 100;\n\t\tlet allowUpdate = ((this.lastReset === undefined) || (this.lastScaleUpdate === undefined)) \n\t\t\t|| ((new Date().getTime() - this.lastReset) > threshold && (new Date().getTime() - this.lastScaleUpdate) > threshold);\n\n\t\tif(allowUpdate){\n\n\t\t\tthis.updateScales();\n\n\t\t\tthis.lastScaleUpdate = new Date().getTime();\n\n\t\t\t\n\n\t\t\tthis.scaleUpdatePending = false;\n\t\t}else if(!this.scaleUpdatePending) {\n\t\t\tsetTimeout(this.requestScaleUpdate.bind(this), 100);\n\t\t\tthis.scaleUpdatePending = true;\n\t\t}\n\t\t\n\t}\n\n\trender () {\n\t\tlet width = this.renderArea[0].clientWidth;\n\t\tlet height = this.renderArea[0].clientHeight;\n\n\t\tlet {renderer, pRenderer, camera, profileScene, scene} = this;\n\t\tlet {scaleX, pickSphere} = this;\n\n\t\trenderer.setSize(width, height);\n\n\t\trenderer.setClearColor(0x000000, 0);\n\t\trenderer.clear(true, true, false);\n\n\t\tfor(let pointcloud of this.pointclouds.keys()){\n\t\t\tlet source = pointcloud.material;\n\t\t\tlet target = this.pointclouds.get(pointcloud).material;\n\t\t\t\n\t\t\tcopyMaterial(source, target);\n\t\t\ttarget.size = 2;\n\t\t}\n\t\t\n\t\tpRenderer.render(profileScene, camera, null);\n\n\t\tlet radius = Math.abs(scaleX.invert(0) - scaleX.invert(5));\n\n\t\tif (radius === 0) {\n\t\t\tpickSphere.visible = false;\n\t\t} else {\n\t\t\tpickSphere.scale.set(radius, radius, radius);\n\t\t\tpickSphere.visible = true;\n\t\t}\n\t\t\n\t\trenderer.render(scene, camera);\n\n\t\tthis.requestScaleUpdate();\n\t}\n};\n\nexport class ProfileWindowController {\n\tconstructor (viewer) {\n\t\tthis.viewer = viewer;\n\t\tthis.profileWindow = viewer.profileWindow;\n\t\tthis.profile = null;\n\t\tthis.numPoints = 0;\n\t\tthis.threshold = 60 * 1000;\n\t\tthis.rotateAmount = 10;\n\n\t\tthis.scheduledRecomputeTime = null;\n\n\t\tthis.enabled = true;\n\n\t\tthis.requests = [];\n\n\t\tthis._recompute = () => { this.recompute(); };\n\n\t\tthis.viewer.addEventListener(\"scene_changed\", e => {\n\t\t\te.oldScene.removeEventListener(\"pointcloud_added\", this._recompute);\n\t\t\te.scene.addEventListener(\"pointcloud_added\", this._recompute);\n\t\t});\n\t\tthis.viewer.scene.addEventListener(\"pointcloud_added\", this._recompute);\n\n\t\t$(\"#potree_profile_rotate_amount\").val(parseInt(this.rotateAmount));\n\t\t$(\"#potree_profile_rotate_amount\").on(\"input\", (e) => {\n\t\t\tconst str = $(\"#potree_profile_rotate_amount\").val();\n\n\t\t\tif(!isNaN(str)){\n\t\t\t\tconst value = parseFloat(str);\n\t\t\t\tthis.rotateAmount = value;\n\t\t\t\t$(\"#potree_profile_rotate_amount\").css(\"background-color\", \"\")\n\t\t\t}else{\n\t\t\t\t$(\"#potree_profile_rotate_amount\").css(\"background-color\", \"#ff9999\")\n\t\t\t}\n\n\t\t});\n\n\t\tconst rotate = (radians) => {\n\t\t\tconst profile = this.profile;\n\t\t\tconst points = profile.points;\n\t\t\tconst start = points[0];\n\t\t\tconst end = points[points.length - 1];\n\t\t\tconst center = start.clone().add(end).multiplyScalar(0.5);\n\n\t\t\tconst mMoveOrigin = new THREE.Matrix4().makeTranslation(-center.x, -center.y, -center.z);\n\t\t\tconst mRotate = new THREE.Matrix4().makeRotationZ(radians);\n\t\t\tconst mMoveBack = new THREE.Matrix4().makeTranslation(center.x, center.y, center.z);\n\t\t\t//const transform = mMoveOrigin.multiply(mRotate).multiply(mMoveBack);\n\t\t\tconst transform = mMoveBack.multiply(mRotate).multiply(mMoveOrigin);\n\n\t\t\tconst rotatedPoints = points.map( point => point.clone().applyMatrix4(transform) );\n\n\t\t\tthis.profileWindow.autoFitEnabled = false;\n\n\t\t\tfor(let i = 0; i < points.length; i++){\n\t\t\t\tprofile.setPosition(i, rotatedPoints[i]);\n\t\t\t}\n\t\t}\n\n\t\t$(\"#potree_profile_rotate_cw\").click( () => {\n\t\t\tconst radians = THREE.Math.degToRad(this.rotateAmount);\n\t\t\trotate(-radians);\n\t\t});\n\n\t\t$(\"#potree_profile_rotate_ccw\").click( () => {\n\t\t\tconst radians = THREE.Math.degToRad(this.rotateAmount);\n\t\t\trotate(radians);\n\t\t});\n\n\t\t$(\"#potree_profile_move_forward\").click( () => {\n\t\t\tconst profile = this.profile;\n\t\t\tconst points = profile.points;\n\t\t\tconst start = points[0];\n\t\t\tconst end = points[points.length - 1];\n\n\t\t\tconst dir = end.clone().sub(start).normalize();\n\t\t\tconst up = new THREE.Vector3(0, 0, 1);\n\t\t\tconst forward = up.cross(dir);\n\t\t\tconst move = forward.clone().multiplyScalar(profile.width / 2);\n\n\t\t\tthis.profileWindow.autoFitEnabled = false;\n\n\t\t\tfor(let i = 0; i < points.length; i++){\n\t\t\t\tprofile.setPosition(i, points[i].clone().add(move));\n\t\t\t}\n\t\t});\n\n\t\t$(\"#potree_profile_move_backward\").click( () => {\n\t\t\tconst profile = this.profile;\n\t\t\tconst points = profile.points;\n\t\t\tconst start = points[0];\n\t\t\tconst end = points[points.length - 1];\n\n\t\t\tconst dir = end.clone().sub(start).normalize();\n\t\t\tconst up = new THREE.Vector3(0, 0, 1);\n\t\t\tconst forward = up.cross(dir);\n\t\t\tconst move = forward.clone().multiplyScalar(-profile.width / 2);\n\n\t\t\tthis.profileWindow.autoFitEnabled = false;\n\n\t\t\tfor(let i = 0; i < points.length; i++){\n\t\t\t\tprofile.setPosition(i, points[i].clone().add(move));\n\t\t\t}\n\t\t});\n\t}\n\n\tsetProfile (profile) {\n\t\tif (this.profile !== null && this.profile !== profile) {\n\t\t\tthis.profile.removeEventListener('marker_moved', this._recompute);\n\t\t\tthis.profile.removeEventListener('marker_added', this._recompute);\n\t\t\tthis.profile.removeEventListener('marker_removed', this._recompute);\n\t\t\tthis.profile.removeEventListener('width_changed', this._recompute);\n\t\t}\n\n\t\tthis.profile = profile;\n\n\t\t{\n\t\t\tthis.profile.addEventListener('marker_moved', this._recompute);\n\t\t\tthis.profile.addEventListener('marker_added', this._recompute);\n\t\t\tthis.profile.addEventListener('marker_removed', this._recompute);\n\t\t\tthis.profile.addEventListener('width_changed', this._recompute);\n\t\t}\n\n\t\tthis.recompute();\n\t}\n\n\treset () {\n\t\tthis.profileWindow.reset();\n\n\t\tthis.numPoints = 0;\n\n\t\tif (this.profile) {\n\t\t\tfor (let request of this.requests) {\n\t\t\t\trequest.cancel();\n\t\t\t}\n\t\t}\n\t}\n\n\tprogressHandler (pointcloud, progress) {\n\t\tfor (let segment of progress.segments) {\n\t\t\tthis.profileWindow.addPoints(pointcloud, segment.points);\n\t\t\tthis.numPoints += segment.points.numPoints;\n\t\t}\n\t}\n\n\tcancel () {\n\t\tfor (let request of this.requests) {\n\t\t\trequest.cancel();\n\t\t\t// request.finishLevelThenCancel();\n\t\t}\n\n\t\tthis.requests = [];\n\t};\n\n\tfinishLevelThenCancel(){\n\t\tfor (let request of this.requests) {\n\t\t\trequest.finishLevelThenCancel();\n\t\t}\n\n\t\tthis.requests = [];\n\t}\n\n\trecompute () {\n\t\tif (!this.profile) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.scheduledRecomputeTime !== null && this.scheduledRecomputeTime > new Date().getTime()) {\n\t\t\treturn;\n\t\t} else {\n\t\t\tthis.scheduledRecomputeTime = new Date().getTime() + 100;\n\t\t}\n\t\tthis.scheduledRecomputeTime = null;\n\n\t\tthis.reset();\n\n\t\tfor (let pointcloud of this.viewer.scene.pointclouds.filter(p => p.visible)) {\n\t\t\tlet request = pointcloud.getPointsInProfile(this.profile, null, {\n\t\t\t\t'onProgress': (event) => {\n\t\t\t\t\tif (!this.enabled) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.progressHandler(pointcloud, event.points);\n\n\t\t\t\t\tif (this.numPoints > this.threshold) {\n\t\t\t\t\t\tthis.finishLevelThenCancel();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'onFinish': (event) => {\n\t\t\t\t\tif (!this.enabled) {\n\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'onCancel': () => {\n\t\t\t\t\tif (!this.enabled) {\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.requests.push(request);\n\t\t}\n\t}\n};\n","/**\n *\n * @author sigeom sa / http://sigeom.ch\n * @author Ioda-Net Sàrl / https://www.ioda-net.ch/\n * @author Markus Schütz / http://potree.org\n *\n */\n\nimport {Measure} from \"../utils/Measure.js\";\n\nexport class GeoJSONExporter{\n\n\tstatic measurementToFeatures (measurement) {\n\t\tlet coords = measurement.points.map(e => e.position.toArray());\n\n\t\tlet features = [];\n\n\t\tif (coords.length === 1) {\n\t\t\tlet feature = {\n\t\t\t\ttype: 'Feature',\n\t\t\t\tgeometry: {\n\t\t\t\t\ttype: 'Point',\n\t\t\t\t\tcoordinates: coords[0]\n\t\t\t\t},\n\t\t\t\tproperties: {\n\t\t\t\t\tname: measurement.name\n\t\t\t\t}\n\t\t\t};\n\t\t\tfeatures.push(feature);\n\t\t} else if (coords.length > 1 && !measurement.closed) {\n\t\t\tlet object = {\n\t\t\t\t'type': 'Feature',\n\t\t\t\t'geometry': {\n\t\t\t\t\t'type': 'LineString',\n\t\t\t\t\t'coordinates': coords\n\t\t\t\t},\n\t\t\t\t'properties': {\n\t\t\t\t\tname: measurement.name\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tfeatures.push(object);\n\t\t} else if (coords.length > 1 && measurement.closed) {\n\t\t\tlet object = {\n\t\t\t\t'type': 'Feature',\n\t\t\t\t'geometry': {\n\t\t\t\t\t'type': 'Polygon',\n\t\t\t\t\t'coordinates': [[...coords, coords[0]]]\n\t\t\t\t},\n\t\t\t\t'properties': {\n\t\t\t\t\tname: measurement.name\n\t\t\t\t}\n\t\t\t};\n\t\t\tfeatures.push(object);\n\t\t}\n\n\t\tif (measurement.showDistances) {\n\t\t\tmeasurement.edgeLabels.forEach((label) => {\n\t\t\t\tlet labelPoint = {\n\t\t\t\t\ttype: 'Feature',\n\t\t\t\t\tgeometry: {\n\t\t\t\t\t\ttype: 'Point',\n\t\t\t\t\t\tcoordinates: label.position.toArray()\n\t\t\t\t\t},\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdistance: label.text\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tfeatures.push(labelPoint);\n\t\t\t});\n\t\t}\n\n\t\tif (measurement.showArea) {\n\t\t\tlet point = measurement.areaLabel.position;\n\t\t\tlet labelArea = {\n\t\t\t\ttype: 'Feature',\n\t\t\t\tgeometry: {\n\t\t\t\t\ttype: 'Point',\n\t\t\t\t\tcoordinates: point.toArray()\n\t\t\t\t},\n\t\t\t\tproperties: {\n\t\t\t\t\tarea: measurement.areaLabel.text\n\t\t\t\t}\n\t\t\t};\n\t\t\tfeatures.push(labelArea);\n\t\t}\n\n\t\treturn features;\n\t}\n\n\tstatic toString (measurements) {\n\t\tif (!(measurements instanceof Array)) {\n\t\t\tmeasurements = [measurements];\n\t\t}\n\n\t\tmeasurements = measurements.filter(m => m instanceof Measure);\n\n\t\tlet features = [];\n\t\tfor (let measure of measurements) {\n\t\t\tlet f = GeoJSONExporter.measurementToFeatures(measure);\n\n\t\t\tfeatures = features.concat(f);\n\t\t}\n\n\t\tlet geojson = {\n\t\t\t'type': 'FeatureCollection',\n\t\t\t'features': features\n\t\t};\n\n\t\treturn JSON.stringify(geojson, null, '\\t');\n\t}\n\n}\n","/**\n *\n * @author sigeom sa / http://sigeom.ch\n * @author Ioda-Net Sàrl / https://www.ioda-net.ch/\n * @author Markus Schuetz / http://potree.org\n *\n */\n\nimport {Measure} from \"../utils/Measure.js\";\n\nexport class DXFExporter {\n\n\tstatic measurementPointSection (measurement) {\n\t\tlet position = measurement.points[0].position;\n\n\t\tif (!position) {\n\t\t\treturn '';\n\t\t}\n\n\t\tlet dxfSection = `0\nCIRCLE\n8\nlayer_point\n10\n${position.x}\n20\n${position.y}\n30\n${position.z}\n40\n1.0\n`;\n\n\t\treturn dxfSection;\n\t}\n\n\tstatic measurementPolylineSection (measurement) {\n\t\t// bit code for polygons/polylines:\n\t\t// https://www.autodesk.com/techpubs/autocad/acad2000/dxf/polyline_dxf_06.htm\n\t\tlet geomCode = 8;\n\t\tif (measurement.closed) {\n\t\t\tgeomCode += 1;\n\t\t}\n\n\t\tlet dxfSection = `0\nPOLYLINE\n8\nlayer_polyline\n62\n1\n66\n1\n10\n0.0\n20\n0.0\n30\n0.0\n70\n${geomCode}\n`;\n\n\t\tlet xMax = 0.0;\n\t\tlet yMax = 0.0;\n\t\tlet zMax = 0.0;\n\t\tfor (let point of measurement.points) {\n\t\t\tpoint = point.position;\n\t\t\txMax = Math.max(xMax, point.x);\n\t\t\tyMax = Math.max(yMax, point.y);\n\t\t\tzMax = Math.max(zMax, point.z);\n\n\t\t\tdxfSection += `0\nVERTEX\n8\n0\n10\n${point.x}\n20\n${point.y}\n30\n${point.z}\n70\n32\n`;\n\t\t}\n\t\tdxfSection += `0\nSEQEND\n`;\n\n\t\treturn dxfSection;\n\t}\n\n\tstatic measurementSection (measurement) {\n\t\t// if(measurement.points.length <= 1){\n\t\t//\treturn \"\";\n\t\t// }\n\n\t\tif (measurement.points.length === 0) {\n\t\t\treturn '';\n\t\t} else if (measurement.points.length === 1) {\n\t\t\treturn DXFExporter.measurementPointSection(measurement);\n\t\t} else if (measurement.points.length >= 2) {\n\t\t\treturn DXFExporter.measurementPolylineSection(measurement);\n\t\t}\n\t}\n\n\tstatic toString(measurements){\n\t\tif (!(measurements instanceof Array)) {\n\t\t\tmeasurements = [measurements];\n\t\t}\n\t\tmeasurements = measurements.filter(m => m instanceof Measure);\n\n\t\tlet points = measurements.filter(m => (m instanceof Measure))\n\t\t\t.map(m => m.points)\n\t\t\t.reduce((a, v) => a.concat(v))\n\t\t\t.map(p => p.position);\n\n\t\tlet min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\tlet max = new THREE.Vector3(-Infinity, -Infinity, -Infinity);\n\t\tfor (let point of points) {\n\t\t\tmin.min(point);\n\t\t\tmax.max(point);\n\t\t}\n\n\t\tlet dxfHeader = `999\nDXF created from potree\n0\nSECTION\n2\nHEADER\n9\n$ACADVER\n1\nAC1006\n9\n$INSBASE\n10\n0.0\n20\n0.0\n30\n0.0\n9\n$EXTMIN\n10\n${min.x}\n20\n${min.y}\n30\n${min.z}\n9\n$EXTMAX\n10\n${max.x}\n20\n${max.y}\n30\n${max.z}\n0\nENDSEC\n`;\n\n\t\tlet dxfBody = `0\nSECTION\n2\nENTITIES\n`;\n\n\t\tfor (let measurement of measurements) {\n\t\t\tdxfBody += DXFExporter.measurementSection(measurement);\n\t\t}\n\n\t\tdxfBody += `0\nENDSEC\n`;\n\n\t\tlet dxf = dxfHeader + dxfBody + '0\\nEOF';\n\n\t\treturn dxf;\n\t}\n\n}\n","\n\nimport {Utils} from \"../../utils.js\";\n\nexport class MeasurePanel{\n\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tthis.viewer = viewer;\n\t\tthis.measurement = measurement;\n\t\tthis.propertiesPanel = propertiesPanel;\n\n\t\tthis._update = () => { this.update(); };\n\t}\n\n\tcreateCoordinatesTable(points){\n\t\tlet table = $(`\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    xyz
    \n\t\t`);\n\n\t\tlet copyIconPath = Potree.resourcePath + '/icons/copy.svg';\n\n\t\tfor (let point of points) {\n\t\t\tlet x = Utils.addCommas(point.x.toFixed(3));\n\t\t\tlet y = Utils.addCommas(point.y.toFixed(3));\n\t\t\tlet z = Utils.addCommas(point.z.toFixed(3));\n\n\t\t\tlet row = $(`\n\t\t\t\t\n\t\t\t\t\t${x}\n\t\t\t\t\t${y}\n\t\t\t\t\t${z}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t`);\n\n\t\t\tthis.elCopy = row.find(\"img[name=copy]\");\n\t\t\tthis.elCopy.click( () => {\n\t\t\t\tlet msg = point.toArray().map(c => c.toFixed(3)).join(\", \");\n\t\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t\t});\n\n\t\t\ttable.append(row);\n\t\t}\n\n\t\treturn table;\n\t};\n\n\tcreateAttributesTable(){\n\t\tlet elTable = $('
    ');\n\n\t\tlet point = this.measurement.points[0];\n\t\t\n\t\tfor(let attributeName of Object.keys(point)){\n\t\t\tif(attributeName === \"position\"){\n\t\t\t\n\t\t\t}else if(attributeName === \"rgba\"){\n\t\t\t\tlet color = point.rgba;\n\t\t\t\tlet text = color.join(', ');\n\n\t\t\t\telTable.append($(`\n\t\t\t\t\t\n\t\t\t\t\t\trgb\n\t\t\t\t\t\t${text}\n\t\t\t\t\t\n\t\t\t\t`));\n\t\t\t}else{\n\t\t\t\tlet value = point[attributeName];\n\t\t\t\tlet text = value.join(', ');\n\n\t\t\t\telTable.append($(`\n\t\t\t\t\t\n\t\t\t\t\t\t${attributeName}\n\t\t\t\t\t\t${text}\n\t\t\t\t\t\n\t\t\t\t`));\n\t\t\t}\n\t\t}\n\n\t\treturn elTable;\n\t}\n\n\tupdate(){\n\n\t}\n};","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\nimport {Profile} from \"./../../utils/Profile.js\";\n\nexport class DistancePanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\t\t\n\t\tthis.elMakeProfile = this.elContent.find(\"input[name=make_profile]\");\n\t\tthis.elMakeProfile.click( () => {\n\t\t\t//measurement.points;\n\t\t\tconst profile = new Profile();\n\n\t\t\tprofile.name = measurement.name;\n\t\t\tprofile.width = measurement.getTotalDistance() / 50;\n\n\t\t\tfor(const point of measurement.points){\n\t\t\t\tprofile.addMarker(point.position.clone());\n\t\t\t}\n\n\t\t\tthis.viewer.scene.addProfile(profile);\n\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\tlet positions = this.measurement.points.map(p => p.position);\n\t\tlet distances = [];\n\t\tfor (let i = 0; i < positions.length - 1; i++) {\n\t\t\tlet d = positions[i].distanceTo(positions[i + 1]);\n\t\t\tdistances.push(d.toFixed(3));\n\t\t}\n\n\t\tlet totalDistance = this.measurement.getTotalDistance().toFixed(3);\n\t\tlet elDistanceTable = this.elContent.find(`#distances_table`);\n\t\telDistanceTable.empty();\n\n\t\tfor (let i = 0; i < distances.length; i++) {\n\t\t\tlet label = (i === 0) ? 'Distances: ' : '';\n\t\t\tlet distance = distances[i];\n\t\t\tlet elDistance = $(`\n\t\t\t\t\n\t\t\t\t\t${label}\n\t\t\t\t\t${distance}\n\t\t\t\t`);\n\t\t\telDistanceTable.append(elDistance);\n\t\t}\n\n\t\tlet elTotal = $(`\n\t\t\t\n\t\t\t\tTotal: ${totalDistance}\n\t\t\t`);\n\t\telDistanceTable.append(elTotal);\n\t}\n};\n","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class PointPanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\tlet elAttributesContainer = this.elContent.find('.attributes_table_container');\n\t\telAttributesContainer.empty();\n\t\telAttributesContainer.append(this.createAttributesTable());\n\t}\n};","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class AreaPanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\tArea: \n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\tlet elArea = this.elContent.find(`#measurement_area`);\n\t\telArea.html(this.measurement.getArea().toFixed(3));\n\t}\n};","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class AnglePanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \\u03b1\\u03b2\\u03b3
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\tlet angles = [];\n\t\tfor(let i = 0; i < this.measurement.points.length; i++){\n\t\t\tangles.push(this.measurement.getAngle(i) * (180.0 / Math.PI));\n\t\t}\n\t\tangles = angles.map(a => a.toFixed(1) + '\\u00B0');\n\n\t\tlet elAlpha = this.elContent.find(`#angle_cell_alpha`);\n\t\tlet elBetta = this.elContent.find(`#angle_cell_betta`);\n\t\tlet elGamma = this.elContent.find(`#angle_cell_gamma`);\n\n\t\telAlpha.html(angles[0]);\n\t\telBetta.html(angles[1]);\n\t\telGamma.html(angles[2]);\n\t}\n};","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class CirclePanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\tconst elInfos = this.elContent.find(`#infos_table`);\n\n\t\tif(this.measurement.points.length !== 3){\n\t\t\telInfos.empty();\n\t\t\t\n\t\t\treturn;\n\t\t}\n\n\t\tconst A = this.measurement.points[0].position;\n\t\tconst B = this.measurement.points[1].position;\n\t\tconst C = this.measurement.points[2].position;\n\n\t\tconst center = Potree.Utils.computeCircleCenter(A, B, C);\n\t\tconst radius = center.distanceTo(A);\n\t\tconst circumference = 2 * Math.PI * radius;\n\t\t\n\t\tconst format = (number) => {\n\t\t\treturn Potree.Utils.addCommas(number.toFixed(3));\n\t\t};\n\n\t\t\n\t\tconst txtCenter = `${format(center.x)} ${format(center.y)} ${format(center.z)}`;\n\t\tconst txtRadius = format(radius);\n\t\tconst txtCircumference = format(circumference);\n\n\t\tconst thStyle = `style=\"text-align: left\"`;\n\t\tconst tdStyle = `style=\"width: 100%; padding: 5px;\"`;\n\t\t\n\t\telInfos.html(`\n\t\t\t\n\t\t\t\tCenter: \n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t${txtCenter}\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\tRadius: \n\t\t\t\t${txtRadius}\n\t\t\t\n\t\t\t\n\t\t\t\tCircumference: \n\t\t\t\t${txtCircumference}\n\t\t\t\n\t\t`);\n\t}\n};\n","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class HeightPanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\tHeight:
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\t{\n\t\t\tlet points = this.measurement.points;\n\n\t\t\tlet sorted = points.slice().sort((a, b) => a.position.z - b.position.z);\n\t\t\tlet lowPoint = sorted[0].position.clone();\n\t\t\tlet highPoint = sorted[sorted.length - 1].position.clone();\n\t\t\tlet min = lowPoint.z;\n\t\t\tlet max = highPoint.z;\n\t\t\tlet height = max - min;\n\t\t\theight = height.toFixed(3);\n\n\t\t\tthis.elHeightLabel = this.elContent.find(`#height_label`);\n\t\t\tthis.elHeightLabel.html(`Height: ${height}`);\n\t\t}\n\t}\n};","\nimport {Utils} from \"../../utils.js\";\nimport {Volume, BoxVolume, SphereVolume} from \"../../utils/Volume.js\";\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class VolumePanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet copyIconPath = Potree.resourcePath + '/icons/copy.svg';\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\n\t\tlet lblLengthText = new Map([\n\t\t\t[BoxVolume, \"length\"],\n\t\t\t[SphereVolume, \"rx\"],\n\t\t]).get(measurement.constructor);\n\n\t\tlet lblWidthText = new Map([\n\t\t\t[BoxVolume, \"width\"],\n\t\t\t[SphereVolume, \"ry\"],\n\t\t]).get(measurement.constructor);\n\n\t\tlet lblHeightText = new Map([\n\t\t\t[BoxVolume, \"height\"],\n\t\t\t[SphereVolume, \"rz\"],\n\t\t]).get(measurement.constructor);\n\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \\u03b1\\u03b2\\u03b3
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    ${lblLengthText}${lblWidthText}${lblHeightText}
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t
    \n\t\t\t\tVolume: \n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
  • \n\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
  • \n\n\n\t\t\t\t\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
  • \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\t{ // download\n\t\t\tthis.elDownloadButton = this.elContent.find(\"input[name=download_volume]\");\n\n\t\t\tif(this.propertiesPanel.viewer.server){\n\t\t\t\tthis.elDownloadButton.click(() => this.download());\n\t\t\t} else {\n\t\t\t\tthis.elDownloadButton.hide();\n\t\t\t}\n\t\t}\n\n\t\tthis.elCopyRotation = this.elContent.find(\"img[name=copyRotation]\");\n\t\tthis.elCopyRotation.click( () => {\n\t\t\tlet rotation = this.measurement.rotation.toArray().slice(0, 3);\n\t\t\tlet msg = rotation.map(c => c.toFixed(3)).join(\", \");\n\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t});\n\n\t\tthis.elCopyScale = this.elContent.find(\"img[name=copyScale]\");\n\t\tthis.elCopyScale.click( () => {\n\t\t\tlet scale = this.measurement.scale.toArray();\n\t\t\tlet msg = scale.map(c => c.toFixed(3)).join(\", \");\n\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t});\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeVolume(measurement);\n\t\t});\n\n\t\tthis.elContent.find(\"#volume_reset_orientation\").click(() => {\n\t\t\tmeasurement.rotation.set(0, 0, 0);\n\t\t});\n\n\t\tthis.elContent.find(\"#volume_make_uniform\").click(() => {\n\t\t\tlet mean = (measurement.scale.x + measurement.scale.y + measurement.scale.z) / 3;\n\t\t\tmeasurement.scale.set(mean, mean, mean);\n\t\t});\n\n\t\tthis.elCheckClip = this.elContent.find('#volume_clip');\n\t\tthis.elCheckClip.click(event => {\n\t\t\tthis.measurement.clip = event.target.checked;\n\t\t});\n\n\t\tthis.elCheckShow = this.elContent.find('#volume_show');\n\t\tthis.elCheckShow.click(event => {\n\t\t\tthis.measurement.visible = event.target.checked;\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"position_changed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"orientation_changed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"scale_changed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"clip_changed\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tasync download(){\n\n\t\tlet clipBox = this.measurement;\n\n\t\tlet regions = [];\n\t\t//for(let clipBox of boxes){\n\t\t{\n\t\t\tlet toClip = clipBox.matrixWorld;\n\n\t\t\tlet px = new THREE.Vector3(+0.5, 0, 0).applyMatrix4(toClip);\n\t\t\tlet nx = new THREE.Vector3(-0.5, 0, 0).applyMatrix4(toClip);\n\t\t\tlet py = new THREE.Vector3(0, +0.5, 0).applyMatrix4(toClip);\n\t\t\tlet ny = new THREE.Vector3(0, -0.5, 0).applyMatrix4(toClip);\n\t\t\tlet pz = new THREE.Vector3(0, 0, +0.5).applyMatrix4(toClip);\n\t\t\tlet nz = new THREE.Vector3(0, 0, -0.5).applyMatrix4(toClip);\n\n\t\t\tlet pxN = new THREE.Vector3().subVectors(nx, px).normalize();\n\t\t\tlet nxN = pxN.clone().multiplyScalar(-1);\n\t\t\tlet pyN = new THREE.Vector3().subVectors(ny, py).normalize();\n\t\t\tlet nyN = pyN.clone().multiplyScalar(-1);\n\t\t\tlet pzN = new THREE.Vector3().subVectors(nz, pz).normalize();\n\t\t\tlet nzN = pzN.clone().multiplyScalar(-1);\n\n\t\t\tlet planes = [\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(pxN, px),\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(nxN, nx),\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(pyN, py),\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(nyN, ny),\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(pzN, pz),\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(nzN, nz),\n\t\t\t];\n\n\t\t\tlet planeQueryParts = [];\n\t\t\tfor(let plane of planes){\n\t\t\t\tlet part = [plane.normal.toArray(), plane.constant].join(\",\");\n\t\t\t\tpart = `[${part}]`;\n\t\t\t\tplaneQueryParts.push(part);\n\t\t\t}\n\t\t\tlet region = \"[\" + planeQueryParts.join(\",\") + \"]\";\n\t\t\tregions.push(region);\n\t\t}\n\n\t\tlet regionsArg = regions.join(\",\");\n\n\t\tlet pointcloudArgs = [];\n\t\tfor(let pointcloud of this.viewer.scene.pointclouds){\n\t\t\tif(!pointcloud.visible){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet offset = pointcloud.pcoGeometry.offset.clone();\n\t\t\tlet negateOffset = new THREE.Matrix4().makeTranslation(...offset.multiplyScalar(-1).toArray());\n\t\t\tlet matrixWorld = pointcloud.matrixWorld;\n\n\t\t\tlet transform = new THREE.Matrix4().multiplyMatrices(matrixWorld, negateOffset);\n\n\t\t\tlet path = `${window.location.pathname}/../${pointcloud.pcoGeometry.url}`;\n\n\t\t\tlet arg = {\n\t\t\t\tpath: path,\n\t\t\t\ttransform: transform.elements,\n\t\t\t};\n\t\t\tlet argString = JSON.stringify(arg);\n\n\t\t\tpointcloudArgs.push(argString);\n\t\t}\n\t\tlet pointcloudsArg = pointcloudArgs.join(\",\");\n\n\t\tlet elMessage = this.elContent.find(\"div[name=download_message]\");\n\n\t\tlet error = (message) => {\n\t\t\telMessage.html(`
    ERROR: ${message}
    `);\n\t\t};\n\n\t\tlet info = (message) => {\n\t\t\telMessage.html(`${message}`);\n\t\t};\n\n\t\tlet handle = null;\n\t\t{ // START FILTER\n\t\t\tlet url = `${viewer.server}/create_regions_filter?pointclouds=[${pointcloudsArg}]®ions=[${regionsArg}]`;\n\t\t\t\n\t\t\t//console.log(url);\n\n\t\t\tinfo(\"estimating results ...\");\n\n\t\t\tlet response = await fetch(url);\n\t\t\tlet jsResponse = await response.json();\n\t\t\t//console.log(jsResponse);\n\n\t\t\tif(!jsResponse.handle){\n\t\t\t\terror(jsResponse.message);\n\t\t\t\treturn;\n\t\t\t}else{\n\t\t\t\thandle = jsResponse.handle;\n\t\t\t}\n\t\t}\n\n\t\t{ // WAIT, CHECK PROGRESS, HANDLE FINISH\n\t\t\tlet url = `${viewer.server}/check_regions_filter?handle=${handle}`;\n\n\t\t\tlet sleep = (function(duration){\n\t\t\t\treturn new Promise( (res, rej) => {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tres();\n\t\t\t\t\t}, duration);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tlet handleFiltering = (jsResponse) => {\n\t\t\t\tlet {progress, estimate} = jsResponse;\n\n\t\t\t\tlet progressFract = progress[\"processed points\"] / estimate.points;\n\t\t\t\tlet progressPercents = parseInt(progressFract * 100);\n\n\t\t\t\tinfo(`progress: ${progressPercents}%`);\n\t\t\t};\n\n\t\t\tlet handleFinish = (jsResponse) => {\n\t\t\t\tlet message = \"downloads ready:
    \";\n\t\t\t\tmessage += \"
      \";\n\n\t\t\t\tfor(let i = 0; i < jsResponse.pointclouds.length; i++){\n\t\t\t\t\tlet url = `${viewer.server}/download_regions_filter_result?handle=${handle}&index=${i}`;\n\n\t\t\t\t\tmessage += `
    • result_${i}.las
    • \\n`;\n\t\t\t\t}\n\n\t\t\t\tlet reportURL = `${viewer.server}/download_regions_filter_report?handle=${handle}`;\n\t\t\t\tmessage += `
    • report.json
    • \\n`;\n\t\t\t\tmessage += \"
    \";\n\n\t\t\t\tinfo(message);\n\t\t\t};\n\n\t\t\tlet handleUnexpected = (jsResponse) => {\n\t\t\t\tlet message = `Unexpected Response.
    status: ${jsResponse.status}
    message: ${jsResponse.message}`;\n\t\t\t\tinfo(message);\n\t\t\t};\n\n\t\t\tlet handleError = (jsResponse) => {\n\t\t\t\tlet message = `ERROR: ${jsResponse.message}`;\n\t\t\t\terror(message);\n\n\t\t\t\tthrow new Error(message);\n\t\t\t};\n\n\t\t\tlet start = Date.now();\n\n\t\t\twhile(true){\n\t\t\t\tlet response = await fetch(url);\n\t\t\t\tlet jsResponse = await response.json();\n\n\t\t\t\tif(jsResponse.status === \"ERROR\"){\n\t\t\t\t\thandleError(jsResponse);\n\t\t\t\t}else if(jsResponse.status === \"FILTERING\"){\n\t\t\t\t\thandleFiltering(jsResponse);\n\t\t\t\t}else if(jsResponse.status === \"FINISHED\"){\n\t\t\t\t\thandleFinish(jsResponse);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}else{\n\t\t\t\t\thandleUnexpected(jsResponse);\n\t\t\t\t}\n\n\t\t\t\tlet durationS = (Date.now() - start) / 1000;\n\t\t\t\tlet sleepAmountMS = durationS < 10 ? 100 : 1000;\n\n\t\t\t\tawait sleep(sleepAmountMS);\n\t\t\t}\n\t\t}\n\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable([this.measurement.position]));\n\n\t\t{\n\t\t\tlet angles = this.measurement.rotation.toVector3();\n\t\t\tangles = angles.toArray();\n\t\t\t//angles = [angles.z, angles.x, angles.y];\n\t\t\tangles = angles.map(v => 180 * v / Math.PI);\n\t\t\tangles = angles.map(a => a.toFixed(1) + '\\u00B0');\n\n\t\t\tlet elAlpha = this.elContent.find(`#angle_cell_alpha`);\n\t\t\tlet elBetta = this.elContent.find(`#angle_cell_betta`);\n\t\t\tlet elGamma = this.elContent.find(`#angle_cell_gamma`);\n\n\t\t\telAlpha.html(angles[0]);\n\t\t\telBetta.html(angles[1]);\n\t\t\telGamma.html(angles[2]);\n\t\t}\n\n\t\t{\n\t\t\tlet dimensions = this.measurement.scale.toArray();\n\t\t\tdimensions = dimensions.map(v => Utils.addCommas(v.toFixed(2)));\n\n\t\t\tlet elLength = this.elContent.find(`#cell_length`);\n\t\t\tlet elWidth = this.elContent.find(`#cell_width`);\n\t\t\tlet elHeight = this.elContent.find(`#cell_height`);\n\n\t\t\telLength.html(dimensions[0]);\n\t\t\telWidth.html(dimensions[1]);\n\t\t\telHeight.html(dimensions[2]);\n\t\t}\n\n\t\t{\n\t\t\tlet elVolume = this.elContent.find(`#measurement_volume`);\n\t\t\tlet volume = this.measurement.getVolume();\n\t\t\telVolume.html(Utils.addCommas(volume.toFixed(2)));\n\t\t}\n\n\t\tthis.elCheckClip.prop(\"checked\", this.measurement.clip);\n\t\tthis.elCheckShow.prop(\"checked\", this.measurement.visible);\n\n\t}\n};","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class ProfilePanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\tWidth: \n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
  • \n\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeProfile(measurement);\n\t\t});\n\n\t\t{ // download\n\t\t\tthis.elDownloadButton = this.elContent.find(`input[name=download_profile]`);\n\n\t\t\tif(this.propertiesPanel.viewer.server){\n\t\t\t\tthis.elDownloadButton.click(() => this.download());\n\t\t\t} else {\n\t\t\t\tthis.elDownloadButton.hide();\n\t\t\t}\n\t\t}\n\n\t\t{ // width spinner\n\t\t\tlet elWidthSlider = this.elContent.find(`#sldProfileWidth`);\n\n\t\t\telWidthSlider.spinner({\n\t\t\t\tmin: 0, max: 10 * 1000 * 1000, step: 0.01,\n\t\t\t\tnumberFormat: 'n',\n\t\t\t\tstart: () => {},\n\t\t\t\tspin: (event, ui) => {\n\t\t\t\t\tlet value = elWidthSlider.spinner('value');\n\t\t\t\t\tmeasurement.setWidth(value);\n\t\t\t\t},\n\t\t\t\tchange: (event, ui) => {\n\t\t\t\t\tlet value = elWidthSlider.spinner('value');\n\t\t\t\t\tmeasurement.setWidth(value);\n\t\t\t\t},\n\t\t\t\tstop: (event, ui) => {\n\t\t\t\t\tlet value = elWidthSlider.spinner('value');\n\t\t\t\t\tmeasurement.setWidth(value);\n\t\t\t\t},\n\t\t\t\tincremental: (count) => {\n\t\t\t\t\tlet value = elWidthSlider.spinner('value');\n\t\t\t\t\tlet step = elWidthSlider.spinner('option', 'step');\n\n\t\t\t\t\tlet delta = value * 0.05;\n\t\t\t\t\tlet increments = Math.max(1, parseInt(delta / step));\n\n\t\t\t\t\treturn increments;\n\t\t\t\t}\n\t\t\t});\n\t\t\telWidthSlider.spinner('value', measurement.getWidth());\n\t\t\telWidthSlider.spinner('widget').css('width', '100%');\n\n\t\t\tlet widthListener = (event) => {\n\t\t\t\tlet value = elWidthSlider.spinner('value');\n\t\t\t\tif (value !== measurement.getWidth()) {\n\t\t\t\t\telWidthSlider.spinner('value', measurement.getWidth());\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.propertiesPanel.addVolatileListener(measurement, \"width_changed\", widthListener);\n\t\t}\n\n\t\tlet elShow2DProfile = this.elContent.find(`#show_2d_profile`);\n\t\telShow2DProfile.click(() => {\n\t\t\tthis.propertiesPanel.viewer.profileWindow.show();\n\t\t\tthis.propertiesPanel.viewer.profileWindowController.setProfile(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points));\n\t}\n\n\tasync download(){\n\n\t\tlet profile = this.measurement;\n\n\t\tlet regions = [];\n\t\t{\n\t\t\tlet segments = profile.getSegments();\n\t\t\tlet width = profile.width;\n\t\t\t\n\t\t\tfor(let segment of segments){\n\t\t\t\tlet start = segment.start.clone().multiply(new THREE.Vector3(1, 1, 0));\n\t\t\t\tlet end = segment.end.clone().multiply(new THREE.Vector3(1, 1, 0));\n\t\t\t\tlet center = new THREE.Vector3().addVectors(start, end).multiplyScalar(0.5);\n\t\t\t\t\n\t\t\t\tlet startEndDir = new THREE.Vector3().subVectors(end, start).normalize();\n\t\t\t\tlet endStartDir = new THREE.Vector3().subVectors(start, end).normalize();\n\t\t\t\tlet upDir = new THREE.Vector3(0, 0, 1);\n\t\t\t\tlet rightDir = new THREE.Vector3().crossVectors(startEndDir, upDir);\n\t\t\t\tlet leftDir = new THREE.Vector3().crossVectors(endStartDir, upDir);\n\t\t\t\t\n\t\t\t\tconsole.log(leftDir);\n\t\t\t\t\n\t\t\t\tlet right = rightDir.clone().multiplyScalar(width * 0.5).add(center);\n\t\t\t\tlet left = leftDir.clone().multiplyScalar(width * 0.5).add(center);\n\t\t\t\t\n\t\t\t\tlet planes = [\n\t\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(startEndDir, start),\n\t\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(endStartDir, end),\n\t\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(leftDir, right),\n\t\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(rightDir, left),\n\t\t\t\t];\n\t\t\t\t\n\t\t\t\tlet planeQueryParts = [];\n\t\t\t\tfor(let plane of planes){\n\t\t\t\t\tlet part = [plane.normal.toArray(), plane.constant].join(\",\");\n\t\t\t\t\tpart = `[${part}]`;\n\t\t\t\t\tplaneQueryParts.push(part);\n\t\t\t\t}\n\t\t\t\tlet region = \"[\" + planeQueryParts.join(\",\") + \"]\";\n\t\t\t\tregions.push(region);\n\t\t\t}\n\t\t}\n\n\t\tlet regionsArg = regions.join(\",\");\n\n\t\tlet pointcloudArgs = [];\n\t\tfor(let pointcloud of this.viewer.scene.pointclouds){\n\t\t\tif(!pointcloud.visible){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet offset = pointcloud.pcoGeometry.offset.clone();\n\t\t\tlet negateOffset = new THREE.Matrix4().makeTranslation(...offset.multiplyScalar(-1).toArray());\n\t\t\tlet matrixWorld = pointcloud.matrixWorld;\n\n\t\t\tlet transform = new THREE.Matrix4().multiplyMatrices(matrixWorld, negateOffset);\n\n\t\t\tlet path = `${window.location.pathname}/../${pointcloud.pcoGeometry.url}`;\n\n\t\t\tlet arg = {\n\t\t\t\tpath: path,\n\t\t\t\ttransform: transform.elements,\n\t\t\t};\n\t\t\tlet argString = JSON.stringify(arg);\n\n\t\t\tpointcloudArgs.push(argString);\n\t\t}\n\t\tlet pointcloudsArg = pointcloudArgs.join(\",\");\n\n\t\tlet elMessage = this.elContent.find(\"div[name=download_message]\");\n\n\t\tlet error = (message) => {\n\t\t\telMessage.html(`
    ERROR: ${message}
    `);\n\t\t};\n\n\t\tlet info = (message) => {\n\t\t\telMessage.html(`${message}`);\n\t\t};\n\n\t\tlet handle = null;\n\t\t{ // START FILTER\n\t\t\tlet url = `${viewer.server}/create_regions_filter?pointclouds=[${pointcloudsArg}]®ions=[${regionsArg}]`;\n\t\t\t\n\t\t\t//console.log(url);\n\n\t\t\tinfo(\"estimating results ...\");\n\n\t\t\tlet response = await fetch(url);\n\t\t\tlet jsResponse = await response.json();\n\t\t\t//console.log(jsResponse);\n\n\t\t\tif(!jsResponse.handle){\n\t\t\t\terror(jsResponse.message);\n\t\t\t\treturn;\n\t\t\t}else{\n\t\t\t\thandle = jsResponse.handle;\n\t\t\t}\n\t\t}\n\n\t\t{ // WAIT, CHECK PROGRESS, HANDLE FINISH\n\t\t\tlet url = `${viewer.server}/check_regions_filter?handle=${handle}`;\n\n\t\t\tlet sleep = (function(duration){\n\t\t\t\treturn new Promise( (res, rej) => {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tres();\n\t\t\t\t\t}, duration);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tlet handleFiltering = (jsResponse) => {\n\t\t\t\tlet {progress, estimate} = jsResponse;\n\n\t\t\t\tlet progressFract = progress[\"processed points\"] / estimate.points;\n\t\t\t\tlet progressPercents = parseInt(progressFract * 100);\n\n\t\t\t\tinfo(`progress: ${progressPercents}%`);\n\t\t\t};\n\n\t\t\tlet handleFinish = (jsResponse) => {\n\t\t\t\tlet message = \"downloads ready:
    \";\n\t\t\t\tmessage += \"
      \";\n\n\t\t\t\tfor(let i = 0; i < jsResponse.pointclouds.length; i++){\n\t\t\t\t\tlet url = `${viewer.server}/download_regions_filter_result?handle=${handle}&index=${i}`;\n\n\t\t\t\t\tmessage += `
    • result_${i}.las
    • \\n`;\n\t\t\t\t}\n\n\t\t\t\tlet reportURL = `${viewer.server}/download_regions_filter_report?handle=${handle}`;\n\t\t\t\tmessage += `
    • report.json
    • \\n`;\n\t\t\t\tmessage += \"
    \";\n\n\t\t\t\tinfo(message);\n\t\t\t};\n\n\t\t\tlet handleUnexpected = (jsResponse) => {\n\t\t\t\tlet message = `Unexpected Response.
    status: ${jsResponse.status}
    message: ${jsResponse.message}`;\n\t\t\t\tinfo(message);\n\t\t\t};\n\n\t\t\tlet handleError = (jsResponse) => {\n\t\t\t\tlet message = `ERROR: ${jsResponse.message}`;\n\t\t\t\terror(message);\n\n\t\t\t\tthrow new Error(message);\n\t\t\t};\n\n\t\t\tlet start = Date.now();\n\n\t\t\twhile(true){\n\t\t\t\tlet response = await fetch(url);\n\t\t\t\tlet jsResponse = await response.json();\n\n\t\t\t\tif(jsResponse.status === \"ERROR\"){\n\t\t\t\t\thandleError(jsResponse);\n\t\t\t\t}else if(jsResponse.status === \"FILTERING\"){\n\t\t\t\t\thandleFiltering(jsResponse);\n\t\t\t\t}else if(jsResponse.status === \"FINISHED\"){\n\t\t\t\t\thandleFinish(jsResponse);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}else{\n\t\t\t\t\thandleUnexpected(jsResponse);\n\t\t\t\t}\n\n\t\t\t\tlet durationS = (Date.now() - start) / 1000;\n\t\t\t\tlet sleepAmountMS = durationS < 10 ? 100 : 1000;\n\n\t\t\t\tawait sleep(sleepAmountMS);\n\t\t\t}\n\t\t}\n\n\t}\n};","\nimport {Utils} from \"../../utils.js\";\n\nexport class CameraPanel{\n\tconstructor(viewer, propertiesPanel){\n\t\tthis.viewer = viewer;\n\t\tthis.propertiesPanel = propertiesPanel;\n\n\t\tthis._update = () => { this.update(); };\n\n\t\tlet copyIconPath = Potree.resourcePath + '/icons/copy.svg';\n\t\tthis.elContent = $(`\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    position
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    target
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t
    \n\t\t`);\n\n\t\tthis.elCopyPosition = this.elContent.find(\"img[name=copyPosition]\");\n\t\tthis.elCopyPosition.click( () => {\n\t\t\tlet pos = this.viewer.scene.getActiveCamera().position.toArray();\n\t\t\tlet msg = pos.map(c => c.toFixed(3)).join(\", \");\n\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t});\n\n\t\tthis.elCopyTarget = this.elContent.find(\"img[name=copyTarget]\");\n\t\tthis.elCopyTarget.click( () => {\n\t\t\tlet pos = this.viewer.scene.view.getPivot().toArray();\n\t\t\tlet msg = pos.map(c => c.toFixed(3)).join(\", \");\n\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(viewer, \"camera_changed\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\t//console.log(\"updating camera panel\");\n\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\tlet view = this.viewer.scene.view;\n\n\t\tlet pos = camera.position.toArray().map(c => Utils.addCommas(c.toFixed(3)));\n\t\tthis.elContent.find(\"#camera_position_x\").html(pos[0]);\n\t\tthis.elContent.find(\"#camera_position_y\").html(pos[1]);\n\t\tthis.elContent.find(\"#camera_position_z\").html(pos[2]);\n\n\t\tlet target = view.getPivot().toArray().map(c => Utils.addCommas(c.toFixed(3)));\n\t\tthis.elContent.find(\"#camera_target_x\").html(target[0]);\n\t\tthis.elContent.find(\"#camera_target_y\").html(target[1]);\n\t\tthis.elContent.find(\"#camera_target_z\").html(target[2]);\n\t}\n};","\nimport {Utils} from \"../../utils.js\";\n\nexport class AnnotationPanel{\n\tconstructor(viewer, propertiesPanel, annotation){\n\t\tthis.viewer = viewer;\n\t\tthis.propertiesPanel = propertiesPanel;\n\t\tthis.annotation = annotation;\n\n\t\tthis._update = () => { this.update(); };\n\n\t\tlet copyIconPath = `${Potree.resourcePath}/icons/copy.svg`;\n\t\tthis.elContent = $(`\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t
    position
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t
    \n\n\t\t\t\t
    Title
    \n\t\t\t\t
    \n\t\t\t\t\tAnnotation Title\n\t\t\t\t
    \n\n\t\t\t\t
    Description
    \n\t\t\t\t
    \n\t\t\t\t\tA longer description of this annotation. \n\t\t\t\t\t\tCan be multiple lines long. TODO: the user should be able\n\t\t\t\t\t\tto modify title and description. \n\t\t\t\t
    \n\n\t\t\t
    \n\n\t\t
    \n\t\t`);\n\n\t\tthis.elCopyPosition = this.elContent.find(\"img[name=copyPosition]\");\n\t\tthis.elCopyPosition.click( () => {\n\t\t\tlet pos = this.annotation.position.toArray();\n\t\t\tlet msg = pos.map(c => c.toFixed(3)).join(\", \");\n\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t});\n\n\t\tthis.elTitle = this.elContent.find(\"#annotation_title\").html(annotation.title);\n\t\tthis.elDescription = this.elContent.find(\"#annotation_description\").html(annotation.description);\n\n\t\tthis.elTitle[0].addEventListener(\"input\", () => {\n\t\t\tconst title = this.elTitle.html();\n\t\t\tannotation.title = title;\n\n\t\t}, false);\n\n\t\tthis.elDescription[0].addEventListener(\"input\", () => {\n\t\t\tconst description = this.elDescription.html();\n\t\t\tannotation.description = description;\n\t\t}, false);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tconst {annotation, elContent, elTitle, elDescription} = this;\n\n\t\tlet pos = annotation.position.toArray().map(c => Utils.addCommas(c.toFixed(3)));\n\t\telContent.find(\"#annotation_position_x\").html(pos[0]);\n\t\telContent.find(\"#annotation_position_y\").html(pos[1]);\n\t\telContent.find(\"#annotation_position_z\").html(pos[2]);\n\n\t\telTitle.html(annotation.title);\n\t\telDescription.html(annotation.description);\n\n\n\t}\n};","\nimport {Utils} from \"../../utils.js\";\n\nexport class CameraAnimationPanel{\n\tconstructor(viewer, propertiesPanel, animation){\n\t\tthis.viewer = viewer;\n\t\tthis.propertiesPanel = propertiesPanel;\n\t\tthis.animation = animation;\n\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\tDuration: \n\t\t\t\t\t\t\n\t\t\t\t\t\n\n\t\t\t\t\tTime:
    \n\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tconst elPlay = this.elContent.find(\"input[name=play]\");\n\t\telPlay.click( () => {\n\t\t\tanimation.play();\n\t\t});\n\n\t\tconst elSlider = this.elContent.find('#sldTime');\n\t\telSlider.slider({\n\t\t\tvalue: 0,\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\tstep: 0.001,\n\t\t\tslide: (event, ui) => { \n\t\t\t\tanimation.set(ui.value);\n\t\t\t}\n\t\t});\n\n\t\tlet elDuration = this.elContent.find(`input[name=spnDuration]`);\n\t\telDuration.spinner({\n\t\t\tmin: 0, max: 300, step: 0.01,\n\t\t\tnumberFormat: 'n',\n\t\t\tstart: () => {},\n\t\t\tspin: (event, ui) => {\n\t\t\t\tlet value = elDuration.spinner('value');\n\t\t\t\tanimation.setDuration(value);\n\t\t\t},\n\t\t\tchange: (event, ui) => {\n\t\t\t\tlet value = elDuration.spinner('value');\n\t\t\t\tanimation.setDuration(value);\n\t\t\t},\n\t\t\tstop: (event, ui) => {\n\t\t\t\tlet value = elDuration.spinner('value');\n\t\t\t\tanimation.setDuration(value);\n\t\t\t},\n\t\t\tincremental: (count) => {\n\t\t\t\tlet value = elDuration.spinner('value');\n\t\t\t\tlet step = elDuration.spinner('option', 'step');\n\n\t\t\t\tlet delta = value * 0.05;\n\t\t\t\tlet increments = Math.max(1, parseInt(delta / step));\n\n\t\t\t\treturn increments;\n\t\t\t}\n\t\t});\n\t\telDuration.spinner('value', animation.getDuration());\n\t\telDuration.spinner('widget').css('width', '100%');\n\n\t\tconst elKeyframes = this.elContent.find(\"#animation_keyframes\");\n\n\t\tconst updateKeyframes = () => {\n\t\t\telKeyframes.empty();\n\n\t\t\t//let index = 0;\n\n\t\t\t// \n\t\t\t// \t\t\t\t\n\t\t\t// \t\t\t\n\n\t\t\tconst addNewKeyframeItem = (index) => {\n\t\t\t\tlet elNewKeyframe = $(`\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t`);\n\n\t\t\t\tconst elAdd = elNewKeyframe.find(\"input[name=add]\");\n\t\t\t\telAdd.click( () => {\n\t\t\t\t\tanimation.createControlPoint(index);\n\t\t\t\t});\n\n\t\t\t\telKeyframes.append(elNewKeyframe);\n\t\t\t};\n\n\t\t\tconst addKeyframeItem = (index) => {\n\t\t\t\tlet elKeyframe = $(`\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tkeyframe\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t`);\n\n\t\t\t\tconst elAssign = elKeyframe.find(\"img[name=assign]\");\n\t\t\t\tconst elMove = elKeyframe.find(\"img[name=move]\");\n\t\t\t\tconst elDelete = elKeyframe.find(\"img[name=delete]\");\n\n\t\t\t\telAssign.click( () => {\n\t\t\t\t\tconst cp = animation.controlPoints[index];\n\n\t\t\t\t\tcp.position.copy(viewer.scene.view.position);\n\t\t\t\t\tcp.target.copy(viewer.scene.view.getPivot());\n\t\t\t\t});\n\n\t\t\t\telMove.click( () => {\n\t\t\t\t\tconst cp = animation.controlPoints[index];\n\n\t\t\t\t\tviewer.scene.view.position.copy(cp.position);\n\t\t\t\t\tviewer.scene.view.lookAt(cp.target);\n\t\t\t\t});\n\n\t\t\t\telDelete.click( () => {\n\t\t\t\t\tconst cp = animation.controlPoints[index];\n\t\t\t\t\tanimation.removeControlPoint(cp);\n\t\t\t\t});\n\n\t\t\t\telKeyframes.append(elKeyframe);\n\t\t\t};\n\n\t\t\tlet index = 0;\n\n\t\t\taddNewKeyframeItem(index);\n\n\t\t\tfor(const cp of animation.controlPoints){\n\t\t\t\t\n\t\t\t\taddKeyframeItem(index);\n\t\t\t\tindex++;\n\t\t\t\taddNewKeyframeItem(index);\n\n\t\t\t}\n\t\t};\n\n\t\tupdateKeyframes();\n\n\t\tanimation.addEventListener(\"controlpoint_added\", updateKeyframes);\n\t\tanimation.addEventListener(\"controlpoint_removed\", updateKeyframes);\n\n\n\n\n\t\t// this._update = () => { this.update(); };\n\n\t\t// this.update();\n\t}\n\n\tupdate(){\n\t\t\n\t}\n};","\n\nimport {Utils} from \"../../utils.js\";\nimport {PointCloudTree} from \"../../PointCloudTree.js\";\nimport {Annotation} from \"../../Annotation.js\";\nimport {Measure} from \"../../utils/Measure.js\";\nimport {Profile} from \"../../utils/Profile.js\";\nimport {Volume, BoxVolume, SphereVolume} from \"../../utils/Volume.js\";\nimport {CameraAnimation} from \"../../modules/CameraAnimation/CameraAnimation.js\";\nimport {PointSizeType, PointShape, ElevationGradientRepeat} from \"../../defines.js\";\nimport {Gradients} from \"../../materials/Gradients.js\";\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\nimport {DistancePanel} from \"./DistancePanel.js\";\nimport {PointPanel} from \"./PointPanel.js\";\nimport {AreaPanel} from \"./AreaPanel.js\";\nimport {AnglePanel} from \"./AnglePanel.js\";\nimport {CirclePanel} from \"./CirclePanel.js\";\nimport {HeightPanel} from \"./HeightPanel.js\";\nimport {VolumePanel} from \"./VolumePanel.js\";\nimport {ProfilePanel} from \"./ProfilePanel.js\";\nimport {CameraPanel} from \"./CameraPanel.js\";\nimport {AnnotationPanel} from \"./AnnotationPanel.js\";\nimport { CameraAnimationPanel } from \"./CameraAnimationPanel.js\";\n\nexport class PropertiesPanel{\n\n\tconstructor(container, viewer){\n\t\tthis.container = container;\n\t\tthis.viewer = viewer;\n\t\tthis.object = null;\n\t\tthis.cleanupTasks = [];\n\t\tthis.scene = null;\n\t}\n\n\tsetScene(scene){\n\t\tthis.scene = scene;\n\t}\n\n\tset(object){\n\t\tif(this.object === object){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.object = object;\n\t\t\n\t\tfor(let task of this.cleanupTasks){\n\t\t\ttask();\n\t\t}\n\t\tthis.cleanupTasks = [];\n\t\tthis.container.empty();\n\n\t\tif(object instanceof PointCloudTree){\n\t\t\tthis.setPointCloud(object);\n\t\t}else if(object instanceof Measure || object instanceof Profile || object instanceof Volume){\n\t\t\tthis.setMeasurement(object);\n\t\t}else if(object instanceof THREE.Camera){\n\t\t\tthis.setCamera(object);\n\t\t}else if(object instanceof Annotation){\n\t\t\tthis.setAnnotation(object);\n\t\t}else if(object instanceof CameraAnimation){\n\t\t\tthis.setCameraAnimation(object);\n\t\t}\n\t\t\n\t}\n\n\t//\n\t// Used for events that should be removed when the property object changes.\n\t// This is for listening to materials, scene, point clouds, etc.\n\t// not required for DOM listeners, since they are automatically cleared by removing the DOM subtree.\n\t//\n\taddVolatileListener(target, type, callback){\n\t\ttarget.addEventListener(type, callback);\n\t\tthis.cleanupTasks.push(() => {\n\t\t\ttarget.removeEventListener(type, callback);\n\t\t});\n\t}\n\n\tsetPointCloud(pointcloud){\n\n\t\tlet material = pointcloud.material;\n\n\t\tlet panel = $(`\n\t\t\t
    \n\t\t\t\t
      \n\n\t\t\t\t
    • \n\t\t\t\t
      \n\t\t\t\t
    • \n\t\t\t\t
    • \n\t\t\t\t
      \n\t\t\t\t
    • \n\n\t\t\t\t\n\t\t\t\t
    • \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    • \n\n\t\t\t\t\n\t\t\t\t
    • \n\t\t\t\t\t
      \n\t\t\t\t\t\n\t\t\t\t
    • \n\n\t\t\t\t
    • \n\t\t\t\t\n\t\t\t\t
    • \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t
    • :
    • \n\n\t\t\t\t
      \n\t\t\t\t\tAttribute\n\t\t\t\t
      \n\n\t\t\t\t
    • \n\t\t\t\t\t\n\t\t\t\t
    • \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tAttribute Weights\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • RGB:
      \t
    • \n\t\t\t\t\t
    • Intensity:
      \t
    • \n\t\t\t\t\t
    • Elevation:
      \t
    • \n\t\t\t\t\t
    • Classification:
      \t
    • \n\t\t\t\t\t
    • Return Number:
      \t
    • \n\t\t\t\t\t
    • Source ID:
      \t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tRGB\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • Gamma:
      \t
    • \n\t\t\t\t\t
    • Brightness:
      \t
    • \n\t\t\t\t\t
    • Contrast:
      \t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tExtra Attribute\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • :
    • \n\n\t\t\t\t\t
    • Gamma:
    • \n\t\t\t\t\t
    • Brightness:
    • \n\t\t\t\t\t
    • Contrast:
    • \n\t\t\t\t
      \n\t\t\t\t\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tMATCAP\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • \n\t\t\t\t\t\t
      \n\t\t\t\t\t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tColor\n\t\t\t\t\t
      \n\n\t\t\t\t\t\n\t\t\t\t
      \n\n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tElevation\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • :
      \t
    • \n\n\t\t\t\t\t
    • \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    • \n\n\t\t\t\t\t
    • \n\t\t\t\t\t\tGradient Scheme:\n\t\t\t\t\t\t
      \n\t\t\t\t\t\t
      \n\t\t\t\t\t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tTransition\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • transition:
      \t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tIntensity\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • Range:
      \t
    • \n\t\t\t\t\t
    • Gamma:
      \t
    • \n\t\t\t\t\t
    • Brightness:
      \t
    • \n\t\t\t\t\t
    • Contrast:
      \t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tGPS Time\n\t\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tIndices\n\t\t\t\t\t
      \n\t\t\t\t
      \n\n\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tpanel.i18n();\n\t\tthis.container.append(panel);\n\n\t\t{ // POINT SIZE\n\t\t\tlet sldPointSize = panel.find(`#sldPointSize`);\n\t\t\tlet lblPointSize = panel.find(`#lblPointSize`);\n\n\t\t\tsldPointSize.slider({\n\t\t\t\tvalue: material.size,\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 3,\n\t\t\t\tstep: 0.01,\n\t\t\t\tslide: function (event, ui) { material.size = ui.value; }\n\t\t\t});\n\n\t\t\tlet update = (e) => {\n\t\t\t\tlblPointSize.html(material.size.toFixed(2));\n\t\t\t\tsldPointSize.slider({value: material.size});\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"point_size_changed\", update);\n\t\t\t\n\t\t\tupdate();\n\t\t}\n\n\t\t{ // MINIMUM POINT SIZE\n\t\t\tlet sldMinPointSize = panel.find(`#sldMinPointSize`);\n\t\t\tlet lblMinPointSize = panel.find(`#lblMinPointSize`);\n\n\t\t\tsldMinPointSize.slider({\n\t\t\t\tvalue: material.size,\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 3,\n\t\t\t\tstep: 0.01,\n\t\t\t\tslide: function (event, ui) { material.minSize = ui.value; }\n\t\t\t});\n\n\t\t\tlet update = (e) => {\n\t\t\t\tlblMinPointSize.html(material.minSize.toFixed(2));\n\t\t\t\tsldMinPointSize.slider({value: material.minSize});\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"point_size_changed\", update);\n\t\t\t\n\t\t\tupdate();\n\t\t}\n\n\t\t{ // POINT SIZING\n\t\t\tlet strSizeType = Object.keys(PointSizeType)[material.pointSizeType];\n\n\t\t\tlet opt = panel.find(`#optPointSizing`);\n\t\t\topt.selectmenu();\n\t\t\topt.val(strSizeType).selectmenu('refresh');\n\n\t\t\topt.selectmenu({\n\t\t\t\tchange: (event, ui) => {\n\t\t\t\t\tmaterial.pointSizeType = PointSizeType[ui.item.value];\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t{ // SHAPE\n\t\t\tlet opt = panel.find(`#optShape`);\n\n\t\t\topt.selectmenu({\n\t\t\t\tchange: (event, ui) => {\n\t\t\t\t\tlet value = ui.item.value;\n\n\t\t\t\t\tmaterial.shape = PointShape[value];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet update = () => {\n\t\t\t\tlet typename = Object.keys(PointShape)[material.shape];\n\n\t\t\t\topt.selectmenu().val(typename).selectmenu('refresh');\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"point_shape_changed\", update);\n\n\t\t\tupdate();\n\t\t}\n\n\t\t{ // BACKFACE CULLING\n\t\t\t\n\t\t\tlet opt = panel.find(`#set_backface_culling`);\n\t\t\topt.click(() => {\n\t\t\t\tmaterial.backfaceCulling = opt.prop(\"checked\");\n\t\t\t});\n\t\t\tlet update = () => {\n\t\t\t\tlet value = material.backfaceCulling;\n\t\t\t\topt.prop(\"checked\", value);\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"backface_changed\", update);\n\t\t\tupdate();\n\n\t\t\tlet blockBackface = $('#materials_backface_container');\n\t\t\tblockBackface.css('display', 'none');\n\n\t\t\tconst pointAttributes = pointcloud.pcoGeometry.pointAttributes;\n\t\t\tconst hasNormals = pointAttributes.hasNormals ? pointAttributes.hasNormals() : false;\n\t\t\tif(hasNormals) {\n\t\t\t\tblockBackface.css('display', 'block');\n\t\t\t}\n\t\t\t/*\n\t\t\topt.checkboxradio({\n\t\t\t\tclicked: (event, ui) => {\n\t\t\t\t\t// let value = ui.item.value;\n\t\t\t\t\tlet value = ui.item.checked;\n\t\t\t\t\tconsole.log(value);\n\t\t\t\t\tmaterial.backfaceCulling = value; // $('#set_freeze').prop(\"checked\");\n\t\t\t\t}\n\t\t\t});\n\t\t\t*/\n\t\t}\n\n\t\t{ // OPACITY\n\t\t\tlet sldOpacity = panel.find(`#sldOpacity`);\n\t\t\tlet lblOpacity = panel.find(`#lblOpacity`);\n\n\t\t\tsldOpacity.slider({\n\t\t\t\tvalue: material.opacity,\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 1,\n\t\t\t\tstep: 0.001,\n\t\t\t\tslide: function (event, ui) { \n\t\t\t\t\tmaterial.opacity = ui.value;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet update = (e) => {\n\t\t\t\tlblOpacity.html(material.opacity.toFixed(2));\n\t\t\t\tsldOpacity.slider({value: material.opacity});\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"opacity_changed\", update);\n\n\t\t\tupdate();\n\t\t}\n\n\t\t{\n\n\t\t\tconst attributes = pointcloud.pcoGeometry.pointAttributes.attributes;\n\n\t\t\tlet options = [];\n\n\t\t\toptions.push(...attributes.map(a => a.name));\n\n\t\t\tconst intensityIndex = options.indexOf(\"intensity\");\n\t\t\tif(intensityIndex >= 0){\n\t\t\t\toptions.splice(intensityIndex + 1, 0, \"intensity gradient\");\n\t\t\t}\n\n\t\t\toptions.push(\n\t\t\t\t\"elevation\",\n\t\t\t\t\"color\",\n\t\t\t\t'matcap',\n\t\t\t\t'indices',\n\t\t\t\t'level of detail',\n\t\t\t\t'composite'\n\t\t\t);\n\n\t\t\tconst blacklist = [\n\t\t\t\t\"POSITION_CARTESIAN\",\n\t\t\t\t\"position\",\n\t\t\t];\n\n\t\t\toptions = options.filter(o => !blacklist.includes(o));\n\n\t\t\tlet attributeSelection = panel.find('#optMaterial');\n\t\t\tfor(let option of options){\n\t\t\t\tlet elOption = $(``);\n\t\t\t\tattributeSelection.append(elOption);\n\t\t\t}\n\n\t\t\tlet updateMaterialPanel = (event, ui) => {\n\t\t\t\tlet selectedValue = attributeSelection.selectmenu().val();\n\t\t\t\tmaterial.activeAttributeName = selectedValue;\n\n\t\t\t\tlet attribute = pointcloud.getAttribute(selectedValue);\n\n\t\t\t\tif(selectedValue === \"intensity gradient\"){\n\t\t\t\t\tattribute = pointcloud.getAttribute(\"intensity\");\n\t\t\t\t}\n\n\t\t\t\tconst isIntensity = attribute ? [\"intensity\", \"intensity gradient\"].includes(attribute.name) : false;\n\n\t\t\t\tif(isIntensity){\n\t\t\t\t\tif(pointcloud.material.intensityRange[0] === Infinity){\n\t\t\t\t\t\tpointcloud.material.intensityRange = attribute.range;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst [min, max] = attribute.range;\n\n\t\t\t\t\tpanel.find('#sldIntensityRange').slider({\n\t\t\t\t\t\trange: true,\n\t\t\t\t\t\tmin: min, max: max, step: 0.01,\n\t\t\t\t\t\tvalues: [min, max],\n\t\t\t\t\t\tslide: (event, ui) => {\n\t\t\t\t\t\t\tlet min = ui.values[0];\n\t\t\t\t\t\t\tlet max = ui.values[1];\n\t\t\t\t\t\t\tmaterial.intensityRange = [min, max];\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else if(attribute){\n\t\t\t\t\tconst [min, max] = attribute.range;\n\n\t\t\t\t\tlet selectedRange = material.getRange(attribute.name);\n\n\t\t\t\t\tif(!selectedRange){\n\t\t\t\t\t\tselectedRange = [...attribute.range];\n\t\t\t\t\t}\n\n\t\t\t\t\tlet minMaxAreNumbers = typeof min === \"number\" && typeof max === \"number\";\n\n\t\t\t\t\tif(minMaxAreNumbers){\n\t\t\t\t\t\tpanel.find('#sldExtraRange').slider({\n\t\t\t\t\t\t\trange: true,\n\t\t\t\t\t\t\tmin: min, \n\t\t\t\t\t\t\tmax: max, \n\t\t\t\t\t\t\tstep: 0.01,\n\t\t\t\t\t\t\tvalues: selectedRange,\n\t\t\t\t\t\t\tslide: (event, ui) => {\n\t\t\t\t\t\t\t\tlet [a, b] = ui.values;\n\n\t\t\t\t\t\t\t\tmaterial.setRange(attribute.name, [a, b]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tlet blockWeights = $('#materials\\\\.composite_weight_container');\n\t\t\t\tlet blockElevation = $('#materials\\\\.elevation_container');\n\t\t\t\tlet blockRGB = $('#materials\\\\.rgb_container');\n\t\t\t\tlet blockExtra = $('#materials\\\\.extra_container');\n\t\t\t\tlet blockColor = $('#materials\\\\.color_container');\n\t\t\t\tlet blockIntensity = $('#materials\\\\.intensity_container');\n\t\t\t\tlet blockIndex = $('#materials\\\\.index_container');\n\t\t\t\tlet blockTransition = $('#materials\\\\.transition_container');\n\t\t\t\tlet blockGps = $('#materials\\\\.gpstime_container');\n\t\t\t\tlet blockMatcap = $('#materials\\\\.matcap_container');\n\n\t\t\t\tblockIndex.css('display', 'none');\n\t\t\t\tblockIntensity.css('display', 'none');\n\t\t\t\tblockElevation.css('display', 'none');\n\t\t\t\tblockRGB.css('display', 'none');\n\t\t\t\tblockExtra.css('display', 'none');\n\t\t\t\tblockColor.css('display', 'none');\n\t\t\t\tblockWeights.css('display', 'none');\n\t\t\t\tblockTransition.css('display', 'none');\n\t\t\t\tblockMatcap.css('display', 'none');\n\t\t\t\tblockGps.css('display', 'none');\n\n\t\t\t\tif (selectedValue === 'composite') {\n\t\t\t\t\tblockWeights.css('display', 'block');\n\t\t\t\t\tblockElevation.css('display', 'block');\n\t\t\t\t\tblockRGB.css('display', 'block');\n\t\t\t\t\tblockIntensity.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'elevation') {\n\t\t\t\t\tblockElevation.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'RGB and Elevation') {\n\t\t\t\t\tblockRGB.css('display', 'block');\n\t\t\t\t\tblockElevation.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'rgba') {\n\t\t\t\t\tblockRGB.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'color') {\n\t\t\t\t\tblockColor.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'intensity') {\n\t\t\t\t\tblockIntensity.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'intensity gradient') {\n\t\t\t\t\tblockIntensity.css('display', 'block');\n\t\t\t\t} else if (selectedValue === \"indices\" ){\n\t\t\t\t\tblockIndex.css('display', 'block');\n\t\t\t\t} else if (selectedValue === \"matcap\" ){\n\t\t\t\t\tblockMatcap.css('display', 'block');\n\t\t\t\t} else if (selectedValue === \"classification\" ){\n\t\t\t\t\t// add classification color selctor?\n\t\t\t\t} else if (selectedValue === \"gps-time\" ){\n\t\t\t\t\tblockGps.css('display', 'block');\n\t\t\t\t} else if(selectedValue === \"number of returns\"){\n\t\t\t\t\t\n\t\t\t\t} else if(selectedValue === \"return number\"){\n\t\t\t\t\t\n\t\t\t\t} else if([\"source id\", \"point source id\"].includes(selectedValue)){\n\t\t\t\t\t\n\t\t\t\t} else{\n\t\t\t\t\tblockExtra.css('display', 'block');\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tattributeSelection.selectmenu({change: updateMaterialPanel});\n\n\t\t\tlet update = () => {\n\t\t\t\tattributeSelection.val(material.activeAttributeName).selectmenu('refresh');\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"point_color_type_changed\", update);\n\t\t\tthis.addVolatileListener(material, \"active_attribute_changed\", update);\n\n\t\t\tupdate();\n\t\t\tupdateMaterialPanel();\n\t\t}\n\n\t\t{\n\t\t\tconst schemes = Object.keys(Potree.Gradients).map(name => ({name: name, values: Gradients[name]}));\n\n\t\t\tlet elSchemeContainer = panel.find(\"#elevation_gradient_scheme_selection\");\n\n\t\t\tfor(let scheme of schemes){\n\t\t\t\tlet elScheme = $(`\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t`);\n\n\t\t\t\tconst svg = Potree.Utils.createSvgGradient(scheme.values);\n\t\t\t\tsvg.setAttributeNS(null, \"class\", `button-icon`);\n\n\t\t\t\telScheme.append($(svg));\n\n\t\t\t\telScheme.click( () => {\n\t\t\t\t\tmaterial.gradient = Gradients[scheme.name];\n\t\t\t\t});\n\n\t\t\t\telSchemeContainer.append(elScheme);\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tlet matcaps = [\n\t\t\t\t{name: \"Normals\", icon: `${Potree.resourcePath}/icons/matcap/check_normal+y.jpg`}, \n\t\t\t\t{name: \"Basic 1\", icon: `${Potree.resourcePath}/icons/matcap/basic_1.jpg`}, \n\t\t\t\t{name: \"Basic 2\", icon: `${Potree.resourcePath}/icons/matcap/basic_2.jpg`}, \n\t\t\t\t{name: \"Basic Dark\", icon: `${Potree.resourcePath}/icons/matcap/basic_dark.jpg`}, \n\t\t\t\t{name: \"Basic Side\", icon: `${Potree.resourcePath}/icons/matcap/basic_side.jpg`}, \n\t\t\t\t{name: \"Ceramic Dark\", icon: `${Potree.resourcePath}/icons/matcap/ceramic_dark.jpg`}, \n\t\t\t\t{name: \"Ceramic Lightbulb\", icon: `${Potree.resourcePath}/icons/matcap/ceramic_lightbulb.jpg`}, \n\t\t\t\t{name: \"Clay Brown\", icon: `${Potree.resourcePath}/icons/matcap/clay_brown.jpg`}, \n\t\t\t\t{name: \"Clay Muddy\", icon: `${Potree.resourcePath}/icons/matcap/clay_muddy.jpg`}, \n\t\t\t\t{name: \"Clay Studio\", icon: `${Potree.resourcePath}/icons/matcap/clay_studio.jpg`}, \n\t\t\t\t{name: \"Resin\", icon: `${Potree.resourcePath}/icons/matcap/resin.jpg`}, \n\t\t\t\t{name: \"Skin\", icon: `${Potree.resourcePath}/icons/matcap/skin.jpg`}, \n\t\t\t\t{name: \"Jade\", icon: `${Potree.resourcePath}/icons/matcap/jade.jpg`}, \n\t\t\t\t{name: \"Metal_ Anisotropic\", icon: `${Potree.resourcePath}/icons/matcap/metal_anisotropic.jpg`}, \n\t\t\t\t{name: \"Metal Carpaint\", icon: `${Potree.resourcePath}/icons/matcap/metal_carpaint.jpg`}, \n\t\t\t\t{name: \"Metal Lead\", icon: `${Potree.resourcePath}/icons/matcap/metal_lead.jpg`}, \n\t\t\t\t{name: \"Metal Shiny\", icon: `${Potree.resourcePath}/icons/matcap/metal_shiny.jpg`}, \n\t\t\t\t{name: \"Pearl\", icon: `${Potree.resourcePath}/icons/matcap/pearl.jpg`}, \n\t\t\t\t{name: \"Toon\", icon: `${Potree.resourcePath}/icons/matcap/toon.jpg`},\n\t\t\t\t{name: \"Check Rim Light\", icon: `${Potree.resourcePath}/icons/matcap/check_rim_light.jpg`}, \n\t\t\t\t{name: \"Check Rim Dark\", icon: `${Potree.resourcePath}/icons/matcap/check_rim_dark.jpg`}, \n\t\t\t\t{name: \"Contours 1\", icon: `${Potree.resourcePath}/icons/matcap/contours_1.jpg`}, \n\t\t\t\t{name: \"Contours 2\", icon: `${Potree.resourcePath}/icons/matcap/contours_2.jpg`}, \n\t\t\t\t{name: \"Contours 3\", icon: `${Potree.resourcePath}/icons/matcap/contours_3.jpg`}, \n\t\t\t\t{name: \"Reflection Check Horizontal\", icon: `${Potree.resourcePath}/icons/matcap/reflection_check_horizontal.jpg`}, \n\t\t\t\t{name: \"Reflection Check Vertical\", icon: `${Potree.resourcePath}/icons/matcap/reflection_check_vertical.jpg`}, \n\t\t\t];\n\n\t\t\tlet elMatcapContainer = panel.find(\"#matcap_scheme_selection\");\n\n\t\t\tfor(let matcap of matcaps){\n\t\t\t\tlet elMatcap = $(`\n\t\t\t\t\t\t\n\t\t\t\t`);\n\n\t\t\t\telMatcap.click( () => {\n\t\t\t\t\tmaterial.matcap = matcap.icon.substring(matcap.icon.lastIndexOf('/'));\n\t\t\t\t});\n\n\t\t\t\telMatcapContainer.append(elMatcap);\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tpanel.find('#sldRGBGamma').slider({\n\t\t\t\tvalue: material.rgbGamma,\n\t\t\t\tmin: 0, max: 4, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.rgbGamma = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldRGBContrast').slider({\n\t\t\t\tvalue: material.rgbContrast,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.rgbContrast = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldRGBBrightness').slider({\n\t\t\t\tvalue: material.rgbBrightness,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.rgbBrightness = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldExtraGamma').slider({\n\t\t\t\tvalue: material.extraGamma,\n\t\t\t\tmin: 0, max: 4, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.extraGamma = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldExtraBrightness').slider({\n\t\t\t\tvalue: material.extraBrightness,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.extraBrightness = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldExtraContrast').slider({\n\t\t\t\tvalue: material.extraContrast,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.extraContrast = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldHeightRange').slider({\n\t\t\t\trange: true,\n\t\t\t\tmin: 0, max: 1000, step: 0.01,\n\t\t\t\tvalues: [0, 1000],\n\t\t\t\tslide: (event, ui) => {\n\t\t\t\t\tmaterial.heightMin = ui.values[0];\n\t\t\t\t\tmaterial.heightMax = ui.values[1];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpanel.find('#sldIntensityGamma').slider({\n\t\t\t\tvalue: material.intensityGamma,\n\t\t\t\tmin: 0, max: 4, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.intensityGamma = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldIntensityContrast').slider({\n\t\t\t\tvalue: material.intensityContrast,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.intensityContrast = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldIntensityBrightness').slider({\n\t\t\t\tvalue: material.intensityBrightness,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.intensityBrightness = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightRGB').slider({\n\t\t\t\tvalue: material.weightRGB,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightRGB = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightIntensity').slider({\n\t\t\t\tvalue: material.weightIntensity,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightIntensity = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightElevation').slider({\n\t\t\t\tvalue: material.weightElevation,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightElevation = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightClassification').slider({\n\t\t\t\tvalue: material.weightClassification,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightClassification = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightReturnNumber').slider({\n\t\t\t\tvalue: material.weightReturnNumber,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightReturnNumber = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightSourceID').slider({\n\t\t\t\tvalue: material.weightSourceID,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightSourceID = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find(`#materials\\\\.color\\\\.picker`).spectrum({\n\t\t\t\tflat: true,\n\t\t\t\tshowInput: true,\n\t\t\t\tpreferredFormat: 'rgb',\n\t\t\t\tcancelText: '',\n\t\t\t\tchooseText: 'Apply',\n\t\t\t\tcolor: `#${material.color.getHexString()}`,\n\t\t\t\tmove: color => {\n\t\t\t\t\tlet cRGB = color.toRgb();\n\t\t\t\t\tlet tc = new THREE.Color().setRGB(cRGB.r / 255, cRGB.g / 255, cRGB.b / 255);\n\t\t\t\t\tmaterial.color = tc;\n\t\t\t\t},\n\t\t\t\tchange: color => {\n\t\t\t\t\tlet cRGB = color.toRgb();\n\t\t\t\t\tlet tc = new THREE.Color().setRGB(cRGB.r / 255, cRGB.g / 255, cRGB.b / 255);\n\t\t\t\t\tmaterial.color = tc;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.addVolatileListener(material, \"color_changed\", () => {\n\t\t\t\tpanel.find(`#materials\\\\.color\\\\.picker`)\n\t\t\t\t\t.spectrum('set', `#${material.color.getHexString()}`);\n\t\t\t});\n\n\t\t\tlet updateHeightRange = function () {\n\t\t\t\t\n\n\t\t\t\tlet aPosition = pointcloud.getAttribute(\"position\");\n\n\t\t\t\tlet bMin, bMax;\n\n\t\t\t\tif(aPosition){\n\t\t\t\t\t// for new format 2.0 and loader that contain precomputed min/max of attributes\n\t\t\t\t\tlet min = aPosition.range[0][2];\n\t\t\t\t\tlet max = aPosition.range[1][2];\n\t\t\t\t\tlet width = max - min;\n\n\t\t\t\t\tbMin = min - 0.2 * width;\n\t\t\t\t\tbMax = max + 0.2 * width;\n\t\t\t\t}else{\n\t\t\t\t\t// for format up until exlusive 2.0\n\t\t\t\t\tlet box = [pointcloud.pcoGeometry.tightBoundingBox, pointcloud.getBoundingBoxWorld()]\n\t\t\t\t\t\t.find(v => v !== undefined);\n\n\t\t\t\t\tpointcloud.updateMatrixWorld(true);\n\t\t\t\t\tbox = Utils.computeTransformedBoundingBox(box, pointcloud.matrixWorld);\n\n\t\t\t\t\tlet bWidth = box.max.z - box.min.z;\n\t\t\t\t\tbMin = box.min.z - 0.2 * bWidth;\n\t\t\t\t\tbMax = box.max.z + 0.2 * bWidth;\n\t\t\t\t}\n\n\t\t\t\tlet range = material.elevationRange;\n\n\t\t\t\tpanel.find('#lblHeightRange').html(`${range[0].toFixed(2)} to ${range[1].toFixed(2)}`);\n\t\t\t\tpanel.find('#sldHeightRange').slider({min: bMin, max: bMax, values: range});\n\t\t\t};\n\n\t\t\tlet updateExtraRange = function () {\n\n\t\t\t\tlet attributeName = material.activeAttributeName;\n\t\t\t\tlet attribute = pointcloud.getAttribute(attributeName);\n\n\t\t\t\tif(attribute == null){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlet range = material.getRange(attributeName);\n\n\t\t\t\tif(range == null){\n\t\t\t\t\trange = attribute.range;\n\t\t\t\t}\n\n\t\t\t\t// currently only supporting scalar ranges.\n\t\t\t\t// rgba, normals, positions, etc have vector ranges, however\n\t\t\t\tlet isValidRange = (typeof range[0] === \"number\") && (typeof range[1] === \"number\");\n\t\t\t\tif(!isValidRange){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif(range){\n\t\t\t\t\tlet msg = `${range[0].toFixed(2)} to ${range[1].toFixed(2)}`;\n\t\t\t\t\tpanel.find('#lblExtraRange').html(msg);\n\t\t\t\t}else{\n\t\t\t\t\tpanel.find(\"could not deduce range\");\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet updateIntensityRange = function () {\n\t\t\t\tlet range = material.intensityRange;\n\n\t\t\t\tpanel.find('#lblIntensityRange').html(`${parseInt(range[0])} to ${parseInt(range[1])}`);\n\t\t\t};\n\n\t\t\t{\n\t\t\t\tupdateHeightRange();\n\t\t\t\tpanel.find(`#sldHeightRange`).slider('option', 'min');\n\t\t\t\tpanel.find(`#sldHeightRange`).slider('option', 'max');\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tlet elGradientRepeat = panel.find(\"#gradient_repeat_option\");\n\t\t\t\telGradientRepeat.selectgroup({title: \"Gradient\"});\n\n\t\t\t\telGradientRepeat.find(\"input\").click( (e) => {\n\t\t\t\t\tthis.viewer.setElevationGradientRepeat(ElevationGradientRepeat[e.target.value]);\n\t\t\t\t});\n\n\t\t\t\tlet current = Object.keys(ElevationGradientRepeat)\n\t\t\t\t\t.filter(key => ElevationGradientRepeat[key] === this.viewer.elevationGradientRepeat);\n\t\t\t\telGradientRepeat.find(`input[value=${current}]`).trigger(\"click\");\n\t\t\t}\n\n\t\t\tlet onIntensityChange = () => {\n\t\t\t\tlet gamma = material.intensityGamma;\n\t\t\t\tlet contrast = material.intensityContrast;\n\t\t\t\tlet brightness = material.intensityBrightness;\n\n\t\t\t\tupdateIntensityRange();\n\n\t\t\t\tpanel.find('#lblIntensityGamma').html(gamma.toFixed(2));\n\t\t\t\tpanel.find('#lblIntensityContrast').html(contrast.toFixed(2));\n\t\t\t\tpanel.find('#lblIntensityBrightness').html(brightness.toFixed(2));\n\n\t\t\t\tpanel.find('#sldIntensityGamma').slider({value: gamma});\n\t\t\t\tpanel.find('#sldIntensityContrast').slider({value: contrast});\n\t\t\t\tpanel.find('#sldIntensityBrightness').slider({value: brightness});\n\t\t\t};\n\n\t\t\tlet onRGBChange = () => {\n\t\t\t\tlet gamma = material.rgbGamma;\n\t\t\t\tlet contrast = material.rgbContrast;\n\t\t\t\tlet brightness = material.rgbBrightness;\n\n\t\t\t\tpanel.find('#lblRGBGamma').html(gamma.toFixed(2));\n\t\t\t\tpanel.find('#lblRGBContrast').html(contrast.toFixed(2));\n\t\t\t\tpanel.find('#lblRGBBrightness').html(brightness.toFixed(2));\n\n\t\t\t\tpanel.find('#sldRGBGamma').slider({value: gamma});\n\t\t\t\tpanel.find('#sldRGBContrast').slider({value: contrast});\n\t\t\t\tpanel.find('#sldRGBBrightness').slider({value: brightness});\n\t\t\t};\n\n\t\t\tthis.addVolatileListener(material, \"material_property_changed\", updateExtraRange);\n\t\t\tthis.addVolatileListener(material, \"material_property_changed\", updateHeightRange);\n\t\t\tthis.addVolatileListener(material, \"material_property_changed\", onIntensityChange);\n\t\t\tthis.addVolatileListener(material, \"material_property_changed\", onRGBChange);\n\n\t\t\tupdateExtraRange();\n\t\t\tupdateHeightRange();\n\t\t\tonIntensityChange();\n\t\t\tonRGBChange();\n\t\t}\n\n\t}\n\n\t\n\n\tsetMeasurement(object){\n\n\t\tlet TYPE = {\n\t\t\tDISTANCE: {panel: DistancePanel},\n\t\t\tAREA: {panel: AreaPanel},\n\t\t\tPOINT: {panel: PointPanel},\n\t\t\tANGLE: {panel: AnglePanel},\n\t\t\tHEIGHT: {panel: HeightPanel},\n\t\t\tPROFILE: {panel: ProfilePanel},\n\t\t\tVOLUME: {panel: VolumePanel},\n\t\t\tCIRCLE: {panel: CirclePanel},\n\t\t\tOTHER: {panel: PointPanel},\n\t\t};\n\n\t\tlet getType = (measurement) => {\n\t\t\tif (measurement instanceof Measure) {\n\t\t\t\tif (measurement.showDistances && !measurement.showArea && !measurement.showAngles) {\n\t\t\t\t\treturn TYPE.DISTANCE;\n\t\t\t\t} else if (measurement.showDistances && measurement.showArea && !measurement.showAngles) {\n\t\t\t\t\treturn TYPE.AREA;\n\t\t\t\t} else if (measurement.maxMarkers === 1) {\n\t\t\t\t\treturn TYPE.POINT;\n\t\t\t\t} else if (!measurement.showDistances && !measurement.showArea && measurement.showAngles) {\n\t\t\t\t\treturn TYPE.ANGLE;\n\t\t\t\t} else if (measurement.showHeight) {\n\t\t\t\t\treturn TYPE.HEIGHT;\n\t\t\t\t} else if (measurement.showCircle) {\n\t\t\t\t\treturn TYPE.CIRCLE;\n\t\t\t\t} else {\n\t\t\t\t\treturn TYPE.OTHER;\n\t\t\t\t}\n\t\t\t} else if (measurement instanceof Profile) {\n\t\t\t\treturn TYPE.PROFILE;\n\t\t\t} else if (measurement instanceof Volume) {\n\t\t\t\treturn TYPE.VOLUME;\n\t\t\t}\n\t\t};\n\n\t\t//this.container.html(\"measurement\");\n\n\t\tlet type = getType(object);\n\t\tlet Panel = type.panel;\n\n\t\tlet panel = new Panel(this.viewer, object, this);\n\t\tthis.container.append(panel.elContent);\n\t}\n\n\tsetCamera(camera){\n\t\tlet panel = new CameraPanel(this.viewer, this);\n\t\tthis.container.append(panel.elContent);\n\t}\n\n\tsetAnnotation(annotation){\n\t\tlet panel = new AnnotationPanel(this.viewer, this, annotation);\n\t\tthis.container.append(panel.elContent);\n\t}\n\n\tsetCameraAnimation(animation){\n\t\tlet panel = new CameraAnimationPanel(this.viewer, this, animation)\n\t\tthis.container.append(panel.elContent);\n\t}\n\n}\n","\r\nfunction addCommas(nStr){\r\n\tnStr += '';\r\n\tlet x = nStr.split('.');\r\n\tlet x1 = x[0];\r\n\tlet x2 = x.length > 1 ? '.' + x[1] : '';\r\n\tlet rgx = /(\\d+)(\\d{3})/;\r\n\twhile (rgx.test(x1)) {\r\n\t\tx1 = x1.replace(rgx, '$1' + ',' + '$2');\r\n\t}\r\n\treturn x1 + x2;\r\n};\r\n\r\nfunction format(value){\r\n\treturn addCommas(value.toFixed(3));\r\n};\r\n\r\nexport class HierarchicalSlider{\r\n\r\n\tconstructor(params = {}){\r\n\t\t\r\n\t\tthis.element = document.createElement(\"div\");\r\n\r\n\t\tthis.labels = [];\r\n\t\tthis.sliders = [];\r\n\t\tthis.range = params.range != null ? params.range : [0, 1];\r\n\t\tthis.slide = params.slide != null ? params.slide : null;\r\n\t\tthis.step = params.step != null ? params.step : 0.0001;\r\n\r\n\t\tlet levels = params.levels != null ? params.levels : 1;\r\n\r\n\t\tfor(let level = 0; level < levels; level++){\r\n\t\t\tthis.addLevel();\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tsetRange(range){\r\n\t\tthis.range = [...range];\r\n\r\n\t\t{ // root slider\r\n\t\t\tlet slider = this.sliders[0];\r\n\r\n\t\t\t$(slider).slider({\r\n\t\t\t\tmin: range[0],\r\n\t\t\t\tmax: range[1],\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfor(let i = 1; i < this.sliders.length; i++){\r\n\t\t\tlet parentSlider = this.sliders[i - 1];\r\n\t\t\tlet slider = this.sliders[i];\r\n\r\n\t\t\tlet parentValues = $(parentSlider).slider(\"option\", \"values\");\r\n\t\t\tlet childRange = [...parentValues];\r\n\r\n\t\t\t$(slider).slider({\r\n\t\t\t\tmin: childRange[0],\r\n\t\t\t\tmax: childRange[1],\r\n\t\t\t});\r\n\t\t}\r\n\t\t\r\n\t\tthis.updateLabels();\r\n\t}\r\n\r\n\tsetValues(values){\r\n\t\tfor(let slider of this.sliders){\r\n\t\t\t$(slider).slider({\r\n\t\t\t\tvalues: [...values],\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis.updateLabels();\r\n\t}\r\n\r\n\taddLevel(){\r\n\t\tconst elLevel = document.createElement(\"li\");\r\n\t\tconst elRange = document.createTextNode(\"Range: \");\r\n\t\tconst label = document.createElement(\"span\");\r\n\t\tconst slider = document.createElement(\"div\");\r\n\r\n\t\tlet level = this.sliders.length;\r\n\t\tlet [min, max] = [0, 0];\r\n\r\n\t\tif(this.sliders.length === 0){\r\n\t\t\t[min, max] = this.range;\r\n\t\t}else{\r\n\t\t\tlet parentSlider = this.sliders[this.sliders.length - 1];\r\n\t\t\t[min, max] = $(parentSlider).slider(\"option\", \"values\");\r\n\t\t}\r\n\t\t\r\n\t\t$(slider).slider({\r\n\t\t\trange: true, \r\n\t\t\tmin: min, \r\n\t\t\tmax: max,\r\n\t\t\tstep: this.step,\r\n\t\t\tvalues: [min, max],\r\n\t\t\tslide: (event, ui) => {\r\n\t\t\t\t\r\n\t\t\t\t// set all descendants to same range\r\n\t\t\t\tlet levels = this.sliders.length;\r\n\t\t\t\tfor(let i = level + 1; i < levels; i++){\r\n\t\t\t\t\tlet descendant = this.sliders[i];\r\n\r\n\t\t\t\t\t$(descendant).slider({\r\n\t\t\t\t\t\trange: true,\r\n\t\t\t\t\t\tmin: ui.values[0],\r\n\t\t\t\t\t\tmax: ui.values[1],\r\n\t\t\t\t\t\tvalues: [...ui.values],\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(this.slide){\r\n\t\t\t\t\tlet values = [...ui.values];\r\n\r\n\t\t\t\t\tthis.slide({\r\n\t\t\t\t\t\ttarget: this, \r\n\t\t\t\t\t\trange: this.range,\r\n\t\t\t\t\t\tvalues: values,\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.updateLabels();\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\telLevel.append(elRange, label, slider);\r\n\r\n\t\tthis.sliders.push(slider);\r\n\t\tthis.labels.push(label);\r\n\t\tthis.element.append(elLevel);\r\n\r\n\t\tthis.updateLabels();\r\n\t}\r\n\r\n\tremoveLevel(){\r\n\r\n\t}\r\n\r\n\tupdateSliders(){\r\n\r\n\t}\r\n\r\n\tupdateLabels(){\r\n\r\n\t\tlet levels = this.sliders.length;\r\n\r\n\t\tfor(let i = 0; i < levels; i++){\r\n\r\n\t\t\tlet slider = this.sliders[i];\r\n\t\t\tlet label = this.labels[i];\r\n\r\n\t\t\tlet [min, max] = $(slider).slider(\"option\", \"values\");\r\n\t\t\tlet strMin = format(min);\r\n\t\t\tlet strMax = format(max);\r\n\t\t\tlet strLabel = `${strMin} to ${strMax}`;\r\n\r\n\t\t\tlabel.innerHTML = strLabel;\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n}\r\n\r\n","\nimport {EventDispatcher} from \"../../EventDispatcher.js\";\n\n \nexport class OrientedImageControls extends EventDispatcher{\n\t\n\tconstructor(viewer){\n\t\tsuper();\n\t\t\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.originalCam = viewer.scene.getActiveCamera();\n\t\tthis.shearCam = viewer.scene.getActiveCamera().clone();\n\t\tthis.shearCam.rotation.set(this.originalCam.rotation.toArray());\n\t\tthis.shearCam.updateProjectionMatrix();\n\t\tthis.shearCam.updateProjectionMatrix = () => {\n\t\t\treturn this.shearCam.projectionMatrix;\n\t\t};\n\n\t\tthis.image = null;\n\n\t\tthis.fadeFactor = 20;\n\t\tthis.fovDelta = 0;\n\n\t\tthis.fovMin = 0.1;\n\t\tthis.fovMax = 120;\n\n\t\tthis.shear = [0, 0];\n\n\t\t// const style = ``;\n\t\tthis.elUp = $(``);\n\t\tthis.elRight = $(``);\n\t\tthis.elDown = $(``);\n\t\tthis.elLeft = $(``);\n\t\tthis.elExit = $(``);\n\n\t\tthis.elExit.click( () => {\n\t\t\tthis.release();\n\t\t});\n\n\t\tthis.elUp.click(() => {\n\t\t\tconst fovY = viewer.getFOV();\n\t\t\tconst top = Math.tan(THREE.Math.degToRad(fovY / 2));\n\t\t\tthis.shear[1] += 0.1 * top;\n\t\t});\n\n\t\tthis.elRight.click(() => {\n\t\t\tconst fovY = viewer.getFOV();\n\t\t\tconst top = Math.tan(THREE.Math.degToRad(fovY / 2));\n\t\t\tthis.shear[0] += 0.1 * top;\n\t\t});\n\n\t\tthis.elDown.click(() => {\n\t\t\tconst fovY = viewer.getFOV();\n\t\t\tconst top = Math.tan(THREE.Math.degToRad(fovY / 2));\n\t\t\tthis.shear[1] -= 0.1 * top;\n\t\t});\n\n\t\tthis.elLeft.click(() => {\n\t\t\tconst fovY = viewer.getFOV();\n\t\t\tconst top = Math.tan(THREE.Math.degToRad(fovY / 2));\n\t\t\tthis.shear[0] -= 0.1 * top;\n\t\t});\n\n\t\tthis.scene = null;\n\t\tthis.sceneControls = new THREE.Scene();\n\n\t\tlet scroll = (e) => {\n\t\t\tthis.fovDelta += -e.delta * 1.0;\n\t\t};\n\n\t\tthis.addEventListener('mousewheel', scroll);\n\t\t//this.addEventListener(\"mousemove\", onMove);\n\t}\n\n\thasSomethingCaptured(){\n\t\treturn this.image !== null;\n\t}\n\n\tcapture(image){\n\t\tif(this.hasSomethingCaptured()){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.image = image;\n\n\t\tthis.originalFOV = this.viewer.getFOV();\n\t\tthis.originalControls = this.viewer.getControls();\n\n\t\tthis.viewer.setControls(this);\n\t\tthis.viewer.scene.overrideCamera = this.shearCam;\n\n\t\tconst elCanvas = this.viewer.renderer.domElement;\n\t\tconst elRoot = $(elCanvas.parentElement);\n\n\t\tthis.shear = [0, 0];\n\n\n\t\telRoot.append(this.elUp);\n\t\telRoot.append(this.elRight);\n\t\telRoot.append(this.elDown);\n\t\telRoot.append(this.elLeft);\n\t\telRoot.append(this.elExit);\n\t}\n\n\trelease(){\n\t\tthis.image = null;\n\n\t\tthis.viewer.scene.overrideCamera = null;\n\n\t\tthis.elUp.detach();\n\t\tthis.elRight.detach();\n\t\tthis.elDown.detach();\n\t\tthis.elLeft.detach();\n\t\tthis.elExit.detach();\n\n\t\tthis.viewer.setFOV(this.originalFOV);\n\t\tthis.viewer.setControls(this.originalControls);\n\t}\n\n\tsetScene (scene) {\n\t\tthis.scene = scene;\n\t}\n\n\tupdate (delta) {\n\t\t// const view = this.scene.view;\n\n\t\t// let prevTotal = this.shearCam.projectionMatrix.elements.reduce( (a, i) => a + i, 0);\n\n\t\t//const progression = Math.min(1, this.fadeFactor * delta);\n\t\t//const attenuation = Math.max(0, 1 - this.fadeFactor * delta);\n\t\tconst progression = 1;\n\t\tconst attenuation = 0;\n\n\t\tconst oldFov = this.viewer.getFOV();\n\t\tlet fovProgression = progression * this.fovDelta;\n\t\tlet newFov = oldFov * ((1 + fovProgression / 10));\n\n\t\tnewFov = Math.max(this.fovMin, newFov);\n\t\tnewFov = Math.min(this.fovMax, newFov);\n\n\t\tlet diff = newFov / oldFov;\n\n\t\tconst mouse = this.viewer.inputHandler.mouse;\n\t\tconst canvasSize = this.viewer.renderer.getSize(new THREE.Vector2());\n\t\tconst uv = [\n\t\t\t(mouse.x / canvasSize.x),\n\t\t\t((canvasSize.y - mouse.y) / canvasSize.y)\n\t\t];\n\n\t\tconst fovY = newFov;\n\t\tconst aspect = canvasSize.x / canvasSize.y;\n\t\tconst top = Math.tan(THREE.Math.degToRad(fovY / 2));\n\t\tconst height = 2 * top;\n\t\tconst width = aspect * height;\n\n\t\tconst shearRangeX = [\n\t\t\tthis.shear[0] - 0.5 * width,\n\t\t\tthis.shear[0] + 0.5 * width,\n\t\t];\n\n\t\tconst shearRangeY = [\n\t\t\tthis.shear[1] - 0.5 * height,\n\t\t\tthis.shear[1] + 0.5 * height,\n\t\t];\n\n\t\tconst shx = (1 - uv[0]) * shearRangeX[0] + uv[0] * shearRangeX[1];\n\t\tconst shy = (1 - uv[1]) * shearRangeY[0] + uv[1] * shearRangeY[1];\n\n\t\tconst shu = (1 - diff);\n\n\t\tconst newShear = [\n\t\t\t(1 - shu) * this.shear[0] + shu * shx,\n\t\t\t(1 - shu) * this.shear[1] + shu * shy,\n\t\t];\n\t\t\n\t\tthis.shear = newShear;\n\t\tthis.viewer.setFOV(newFov);\n\t\t\n\t\tconst {originalCam, shearCam} = this;\n\n\t\toriginalCam.fov = newFov;\n\t\toriginalCam.updateMatrixWorld()\n\t\toriginalCam.updateProjectionMatrix();\n\t\tshearCam.copy(originalCam);\n\t\tshearCam.rotation.set(...originalCam.rotation.toArray());\n\n\t\tshearCam.updateMatrixWorld();\n\t\tshearCam.projectionMatrix.copy(originalCam.projectionMatrix);\n\n\t\tconst [sx, sy] = this.shear;\n\t\tconst mShear = new THREE.Matrix4().set(\n\t\t\t1, 0, sx, 0,\n\t\t\t0, 1, sy, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1,\n\t\t);\n\n\t\tconst proj = shearCam.projectionMatrix;\n\t\tproj.multiply(mShear);\n\t\tshearCam.projectionMatrixInverse.getInverse( proj );\n\n\t\tlet total = shearCam.projectionMatrix.elements.reduce( (a, i) => a + i, 0);\n\n\t\tthis.fovDelta *= attenuation;\n\t}\n};\n","\r\n\r\nimport {OrientedImageControls} from \"./OrientedImageControls.js\";\r\nimport { EventDispatcher } from \"../../EventDispatcher.js\";\r\n\r\n// https://support.pix4d.com/hc/en-us/articles/205675256-How-are-yaw-pitch-roll-defined\r\n// https://support.pix4d.com/hc/en-us/articles/202558969-How-are-omega-phi-kappa-defined\r\n\r\nfunction createMaterial(){\r\n\r\n\tlet vertexShader = `\r\n\tuniform float uNear;\r\n\tvarying vec2 vUV;\r\n\tvarying vec4 vDebug;\r\n\t\r\n\tvoid main(){\r\n\t\tvDebug = vec4(0.0, 1.0, 0.0, 1.0);\r\n\t\tvec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0);\r\n\t\t// make sure that this mesh is at least in front of the near plane\r\n\t\tmodelViewPosition.xyz += normalize(modelViewPosition.xyz) * uNear;\r\n\t\tgl_Position = projectionMatrix * modelViewPosition;\r\n\t\tvUV = uv;\r\n\t}\r\n\t`;\r\n\r\n\tlet fragmentShader = `\r\n\tuniform sampler2D tColor;\r\n\tuniform float uOpacity;\r\n\tvarying vec2 vUV;\r\n\tvarying vec4 vDebug;\r\n\tvoid main(){\r\n\t\tvec4 color = texture2D(tColor, vUV);\r\n\t\tgl_FragColor = color;\r\n\t\tgl_FragColor.a = uOpacity;\r\n\t}\r\n\t`;\r\n\tconst material = new THREE.ShaderMaterial( {\r\n\t\tuniforms: {\r\n\t\t\t// time: { value: 1.0 },\r\n\t\t\t// resolution: { value: new THREE.Vector2() }\r\n\t\t\ttColor: {value: new THREE.Texture() },\r\n\t\t\tuNear: {value: 0.0},\r\n\t\t\tuOpacity: {value: 1.0},\r\n\t\t},\r\n\t\tvertexShader: vertexShader,\r\n\t\tfragmentShader: fragmentShader,\r\n\t\tside: THREE.DoubleSide,\r\n\t} );\r\n\r\n\tmaterial.side = THREE.DoubleSide;\r\n\r\n\treturn material;\r\n}\r\n\r\nconst planeGeometry = new THREE.PlaneGeometry(1, 1);\r\nconst lineGeometry = new THREE.Geometry();\r\n\r\nlineGeometry.vertices.push(\r\n\tnew THREE.Vector3(-0.5, -0.5, 0),\r\n\tnew THREE.Vector3( 0.5, -0.5, 0),\r\n\tnew THREE.Vector3( 0.5, 0.5, 0),\r\n\tnew THREE.Vector3(-0.5, 0.5, 0),\r\n\tnew THREE.Vector3(-0.5, -0.5, 0),\r\n);\r\n\r\nexport class OrientedImage{\r\n\r\n\tconstructor(id){\r\n\r\n\t\tthis.id = id;\r\n\t\tthis.fov = 1.0;\r\n\t\tthis.position = new THREE.Vector3();\r\n\t\tthis.rotation = new THREE.Vector3();\r\n\t\tthis.width = 0;\r\n\t\tthis.height = 0;\r\n\t\tthis.fov = 1.0;\r\n\r\n\t\tconst material = createMaterial();\r\n\t\tconst lineMaterial = new THREE.LineBasicMaterial( { color: 0x00ff00 } );\r\n\t\tthis.mesh = new THREE.Mesh(planeGeometry, material);\r\n\t\tthis.line = new THREE.Line(lineGeometry, lineMaterial);\r\n\t\tthis.texture = null;\r\n\r\n\t\tthis.mesh.orientedImage = this;\r\n\t}\r\n\r\n\tset(position, rotation, dimension, fov){\r\n\r\n\t\tlet radians = rotation.map(THREE.Math.degToRad);\r\n\r\n\t\tthis.position.set(...position);\r\n\t\tthis.mesh.position.set(...position);\r\n\r\n\t\tthis.rotation.set(...radians);\r\n\t\tthis.mesh.rotation.set(...radians);\r\n\r\n\t\t[this.width, this.height] = dimension;\r\n\t\tthis.mesh.scale.set(this.width / this.height, 1, 1);\r\n\r\n\t\tthis.fov = fov;\r\n\r\n\t\tthis.updateTransform();\r\n\t}\r\n\r\n\tupdateTransform(){\r\n\t\tlet {mesh, line, fov} = this;\r\n\r\n\t\tmesh.updateMatrixWorld();\r\n\t\tconst dir = mesh.getWorldDirection();\r\n\t\tconst alpha = THREE.Math.degToRad(fov / 2);\r\n\t\tconst d = -0.5 / Math.tan(alpha);\r\n\t\tconst move = dir.clone().multiplyScalar(d);\r\n\t\tmesh.position.add(move);\r\n\r\n\t\tline.position.copy(mesh.position);\r\n\t\tline.scale.copy(mesh.scale);\r\n\t\tline.rotation.copy(mesh.rotation);\r\n\t}\r\n\r\n};\r\n\r\nexport class OrientedImages extends EventDispatcher{\r\n\r\n\tconstructor(){\r\n\t\tsuper();\r\n\r\n\t\tthis.node = null;\r\n\t\tthis.cameraParams = null;\r\n\t\tthis.imageParams = null;\r\n\t\tthis.images = null;\r\n\t\tthis._visible = true;\r\n\t}\r\n\r\n\tset visible(visible){\r\n\t\tif(this._visible === visible){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor(const image of this.images){\r\n\t\t\timage.mesh.visible = visible;\r\n\t\t\timage.line.visible = visible;\r\n\t\t}\r\n\r\n\t\tthis._visible = visible;\r\n\t\tthis.dispatchEvent({\r\n\t\t\ttype: \"visibility_changed\",\r\n\t\t\timages: this,\r\n\t\t});\r\n\t}\r\n\r\n\tget visible(){\r\n\t\treturn this._visible;\r\n\t}\r\n\r\n\r\n};\r\n\r\nexport class OrientedImageLoader{\r\n\r\n\tstatic async loadCameraParams(path){\r\n\t\tconst res = await fetch(path);\r\n\t\tconst text = await res.text();\r\n\r\n\t\tconst parser = new DOMParser();\r\n\t\tconst doc = parser.parseFromString(text, \"application/xml\");\r\n\r\n\t\tconst width = parseInt(doc.getElementsByTagName(\"width\")[0].textContent);\r\n\t\tconst height = parseInt(doc.getElementsByTagName(\"height\")[0].textContent);\r\n\t\tconst f = parseFloat(doc.getElementsByTagName(\"f\")[0].textContent);\r\n\r\n\t\tlet a = (height / 2) / f;\r\n\t\tlet fov = 2 * THREE.Math.radToDeg(Math.atan(a));\r\n\r\n\t\tconst params = {\r\n\t\t\tpath: path,\r\n\t\t\twidth: width,\r\n\t\t\theight: height,\r\n\t\t\tf: f,\r\n\t\t\tfov: fov,\r\n\t\t};\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\tstatic async loadImageParams(path){\r\n\r\n\t\tconst response = await fetch(path);\r\n\t\tif(!response.ok){\r\n\t\t\tconsole.error(`failed to load ${path}`);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst content = await response.text();\r\n\t\tconst lines = content.split(/\\r?\\n/);\r\n\t\tconst imageParams = [];\r\n\r\n\t\tfor(let i = 1; i < lines.length; i++){\r\n\t\t\tconst line = lines[i];\r\n\r\n\t\t\tif(line.startsWith(\"#\")){\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst tokens = line.split(/\\s+/);\r\n\r\n\t\t\tif(tokens.length < 6){\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst params = {\r\n\t\t\t\tid: tokens[0],\r\n\t\t\t\tx: Number.parseFloat(tokens[1]),\r\n\t\t\t\ty: Number.parseFloat(tokens[2]),\r\n\t\t\t\tz: Number.parseFloat(tokens[3]),\r\n\t\t\t\tomega: Number.parseFloat(tokens[4]),\r\n\t\t\t\tphi: Number.parseFloat(tokens[5]),\r\n\t\t\t\tkappa: Number.parseFloat(tokens[6]),\r\n\t\t\t};\r\n\r\n\t\t\t// const whitelist = [\"47518.jpg\"];\r\n\t\t\t// if(whitelist.includes(params.id)){\r\n\t\t\t// \timageParams.push(params);\r\n\t\t\t// }\r\n\t\t\timageParams.push(params);\r\n\t\t}\r\n\r\n\t\t// debug\r\n\t\t//return [imageParams[50]];\r\n\r\n\t\treturn imageParams;\r\n\t}\r\n\r\n\tstatic async load(cameraParamsPath, imageParamsPath, viewer){\r\n\r\n\t\tconst tStart = performance.now();\r\n\r\n\t\tconst [cameraParams, imageParams] = await Promise.all([\r\n\t\t\tOrientedImageLoader.loadCameraParams(cameraParamsPath),\r\n\t\t\tOrientedImageLoader.loadImageParams(imageParamsPath),\r\n\t\t]);\r\n\r\n\t\tconst orientedImageControls = new OrientedImageControls(viewer);\r\n\t\tconst raycaster = new THREE.Raycaster();\r\n\r\n\t\tconst tEnd = performance.now();\r\n\t\tconsole.log(tEnd - tStart);\r\n\r\n\t\t// const sp = new THREE.PlaneGeometry(1, 1);\r\n\t\t// const lg = new THREE.Geometry();\r\n\r\n\t\t// lg.vertices.push(\r\n\t\t// \tnew THREE.Vector3(-0.5, -0.5, 0),\r\n\t\t// \tnew THREE.Vector3( 0.5, -0.5, 0),\r\n\t\t// \tnew THREE.Vector3( 0.5, 0.5, 0),\r\n\t\t// \tnew THREE.Vector3(-0.5, 0.5, 0),\r\n\t\t// \tnew THREE.Vector3(-0.5, -0.5, 0),\r\n\t\t// );\r\n\r\n\t\tconst {width, height} = cameraParams;\r\n\t\tconst orientedImages = [];\r\n\t\tconst sceneNode = new THREE.Object3D();\r\n\t\tsceneNode.name = \"oriented_images\";\r\n\r\n\t\tfor(const params of imageParams){\r\n\r\n\t\t\t// const material = createMaterial();\r\n\t\t\t// const lm = new THREE.LineBasicMaterial( { color: 0x00ff00 } );\r\n\t\t\t// const mesh = new THREE.Mesh(sp, material);\r\n\r\n\t\t\tconst {x, y, z, omega, phi, kappa} = params;\r\n\t\t\t// const [rx, ry, rz] = [omega, phi, kappa]\r\n\t\t\t// \t.map(THREE.Math.degToRad);\r\n\t\t\t\r\n\t\t\t// mesh.position.set(x, y, z);\r\n\t\t\t// mesh.scale.set(width / height, 1, 1);\r\n\t\t\t// mesh.rotation.set(rx, ry, rz);\r\n\t\t\t// {\r\n\t\t\t// \tmesh.updateMatrixWorld();\r\n\t\t\t// \tconst dir = mesh.getWorldDirection();\r\n\t\t\t// \tconst alpha = THREE.Math.degToRad(cameraParams.fov / 2);\r\n\t\t\t// \tconst d = -0.5 / Math.tan(alpha);\r\n\t\t\t// \tconst move = dir.clone().multiplyScalar(d);\r\n\t\t\t// \tmesh.position.add(move);\r\n\t\t\t// }\r\n\t\t\t// sceneNode.add(mesh);\r\n\r\n\t\t\t// const line = new THREE.Line(lg, lm);\r\n\t\t\t// line.position.copy(mesh.position);\r\n\t\t\t// line.scale.copy(mesh.scale);\r\n\t\t\t// line.rotation.copy(mesh.rotation);\r\n\t\t\t// sceneNode.add(line);\r\n\r\n\t\t\tlet orientedImage = new OrientedImage(params.id);\r\n\t\t\t// orientedImage.setPosition(x, y, z);\r\n\t\t\t// orientedImage.setRotation(omega, phi, kappa);\r\n\t\t\t// orientedImage.setDimension(width, height);\r\n\t\t\tlet position = [x, y, z];\r\n\t\t\tlet rotation = [omega, phi, kappa];\r\n\t\t\tlet dimension = [width, height];\r\n\t\t\torientedImage.set(position, rotation, dimension, cameraParams.fov);\r\n\r\n\t\t\tsceneNode.add(orientedImage.mesh);\r\n\t\t\tsceneNode.add(orientedImage.line);\r\n\t\t\t\r\n\t\t\torientedImages.push(orientedImage);\r\n\t\t}\r\n\r\n\t\tlet hoveredElement = null;\r\n\t\tlet clipVolume = null;\r\n\r\n\t\tconst onMouseMove = (evt) => {\r\n\t\t\tconst tStart = performance.now();\r\n\t\t\tif(hoveredElement){\r\n\t\t\t\thoveredElement.line.material.color.setRGB(0, 1, 0);\r\n\t\t\t}\r\n\t\t\tevt.preventDefault();\r\n\r\n\t\t\t//var array = getMousePosition( container, evt.clientX, evt.clientY );\r\n\t\t\tconst rect = viewer.renderer.domElement.getBoundingClientRect();\r\n\t\t\tconst [x, y] = [evt.clientX, evt.clientY];\r\n\t\t\tconst array = [ \r\n\t\t\t\t( x - rect.left ) / rect.width, \r\n\t\t\t\t( y - rect.top ) / rect.height \r\n\t\t\t];\r\n\t\t\tconst onClickPosition = new THREE.Vector2(...array);\r\n\t\t\t//const intersects = getIntersects(onClickPosition, scene.children);\r\n\t\t\tconst camera = viewer.scene.getActiveCamera();\r\n\t\t\tconst mouse = new THREE.Vector3(\r\n\t\t\t\t+ ( onClickPosition.x * 2 ) - 1, \r\n\t\t\t\t- ( onClickPosition.y * 2 ) + 1 );\r\n\t\t\tconst objects = orientedImages.map(i => i.mesh);\r\n\t\t\traycaster.setFromCamera( mouse, camera );\r\n\t\t\tconst intersects = raycaster.intersectObjects( objects );\r\n\t\t\tlet selectionChanged = false;\r\n\r\n\t\t\tif ( intersects.length > 0){\r\n\t\t\t\t//console.log(intersects);\r\n\t\t\t\tconst intersection = intersects[0];\r\n\t\t\t\tconst orientedImage = intersection.object.orientedImage;\r\n\t\t\t\torientedImage.line.material.color.setRGB(1, 0, 0);\r\n\t\t\t\tselectionChanged = hoveredElement !== orientedImage;\r\n\t\t\t\thoveredElement = orientedImage;\r\n\t\t\t}else{\r\n\t\t\t\thoveredElement = null;\r\n\t\t\t}\r\n\r\n\t\t\tlet shouldRemoveClipVolume = clipVolume !== null && hoveredElement === null;\r\n\t\t\tlet shouldAddClipVolume = clipVolume === null && hoveredElement !== null;\r\n\r\n\t\t\tif(clipVolume !== null && (hoveredElement === null || selectionChanged)){\r\n\t\t\t\t// remove existing\r\n\t\t\t\tviewer.scene.removePolygonClipVolume(clipVolume);\r\n\t\t\t\tclipVolume = null;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(shouldAddClipVolume || selectionChanged){\r\n\t\t\t\tconst img = hoveredElement;\r\n\t\t\t\tconst fov = cameraParams.fov;\r\n\t\t\t\tconst aspect = cameraParams.width / cameraParams.height;\r\n\t\t\t\tconst near = 1.0;\r\n\t\t\t\tconst far = 1000 * 1000;\r\n\t\t\t\tconst camera = new THREE.PerspectiveCamera(fov, aspect, near, far);\r\n\t\t\t\tcamera.rotation.order = viewer.scene.getActiveCamera().rotation.order;\r\n\t\t\t\tcamera.rotation.copy(img.mesh.rotation);\r\n\t\t\t\t{\r\n\t\t\t\t\tconst mesh = img.mesh;\r\n\t\t\t\t\tconst dir = mesh.getWorldDirection();\r\n\t\t\t\t\tconst pos = mesh.position;\r\n\t\t\t\t\tconst alpha = THREE.Math.degToRad(fov / 2);\r\n\t\t\t\t\tconst d = 0.5 / Math.tan(alpha);\r\n\t\t\t\t\tconst newCamPos = pos.clone().add(dir.clone().multiplyScalar(d));\r\n\t\t\t\t\tconst newCamDir = pos.clone().sub(newCamPos);\r\n\t\t\t\t\tconst newCamTarget = new THREE.Vector3().addVectors(\r\n\t\t\t\t\t\tnewCamPos,\r\n\t\t\t\t\t\tnewCamDir.clone().multiplyScalar(viewer.getMoveSpeed()));\r\n\t\t\t\t\tcamera.position.copy(newCamPos);\r\n\t\t\t\t}\r\n\t\t\t\tlet volume = new Potree.PolygonClipVolume(camera);\r\n\t\t\t\tlet m0 = new THREE.Mesh();\r\n\t\t\t\tlet m1 = new THREE.Mesh();\r\n\t\t\t\tlet m2 = new THREE.Mesh();\r\n\t\t\t\tlet m3 = new THREE.Mesh();\r\n\t\t\t\tm0.position.set(-1, -1, 0);\r\n\t\t\t\tm1.position.set( 1, -1, 0);\r\n\t\t\t\tm2.position.set( 1, 1, 0);\r\n\t\t\t\tm3.position.set(-1, 1, 0);\r\n\t\t\t\tvolume.markers.push(m0, m1, m2, m3);\r\n\t\t\t\tvolume.initialized = true;\r\n\t\t\t\t\r\n\t\t\t\tviewer.scene.addPolygonClipVolume(volume);\r\n\t\t\t\tclipVolume = volume;\r\n\t\t\t}\r\n\t\t\tconst tEnd = performance.now();\r\n\t\t\t//console.log(tEnd - tStart);\r\n\t\t};\r\n\r\n\t\tconst moveToImage = (image) => {\r\n\t\t\tconsole.log(\"move to image \" + image.id);\r\n\r\n\t\t\tconst mesh = image.mesh;\r\n\t\t\tconst newCamPos = image.position.clone();\r\n\t\t\tconst newCamTarget = mesh.position.clone();\r\n\r\n\t\t\tviewer.scene.view.setView(newCamPos, newCamTarget, 500, () => {\r\n\t\t\t\torientedImageControls.capture(image);\r\n\t\t\t});\r\n\r\n\t\t\tif(image.texture === null){\r\n\r\n\t\t\t\tconst target = image;\r\n\r\n\t\t\t\tconst tmpImagePath = `${Potree.resourcePath}/images/loading.jpg`;\r\n\t\t\t\tnew THREE.TextureLoader().load(tmpImagePath,\r\n\t\t\t\t\t(texture) => {\r\n\t\t\t\t\t\tif(target.texture === null){\r\n\t\t\t\t\t\t\ttarget.texture = texture;\r\n\t\t\t\t\t\t\ttarget.mesh.material.uniforms.tColor.value = texture;\r\n\t\t\t\t\t\t\tmesh.material.needsUpdate = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\r\n\t\t\t\tconst imagePath = `${imageParamsPath}/../${target.id}`;\r\n\t\t\t\tnew THREE.TextureLoader().load(imagePath,\r\n\t\t\t\t\t(texture) => {\r\n\t\t\t\t\t\ttarget.texture = texture;\r\n\t\t\t\t\t\ttarget.mesh.material.uniforms.tColor.value = texture;\r\n\t\t\t\t\t\tmesh.material.needsUpdate = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t\t\r\n\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst onMouseClick = (evt) => {\r\n\r\n\t\t\tif(orientedImageControls.hasSomethingCaptured()){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif(hoveredElement){\r\n\t\t\t\tmoveToImage(hoveredElement);\r\n\t\t\t}\r\n\t\t};\r\n\t\tviewer.renderer.domElement.addEventListener( 'mousemove', onMouseMove, false );\r\n\t\tviewer.renderer.domElement.addEventListener( 'mousedown', onMouseClick, false );\r\n\r\n\t\tviewer.addEventListener(\"update\", () => {\r\n\r\n\t\t\tfor(const image of orientedImages){\r\n\t\t\t\tconst world = image.mesh.matrixWorld;\r\n\t\t\t\tconst {width, height} = image;\r\n\t\t\t\tconst aspect = width / height;\r\n\r\n\t\t\t\tconst camera = viewer.scene.getActiveCamera();\r\n\r\n\t\t\t\tconst imgPos = image.mesh.getWorldPosition(new THREE.Vector3());\r\n\t\t\t\tconst camPos = camera.position;\r\n\t\t\t\tconst d = camPos.distanceTo(imgPos);\r\n\r\n\t\t\t\tconst minSize = 1; // in degrees of fov\r\n\t\t\t\tconst a = THREE.Math.degToRad(minSize);\r\n\t\t\t\tlet r = d * Math.tan(a);\r\n\t\t\t\tr = Math.max(r, 1);\r\n\r\n\r\n\t\t\t\timage.mesh.scale.set(r * aspect, r, 1);\r\n\t\t\t\timage.line.scale.set(r * aspect, r, 1);\r\n\r\n\t\t\t\timage.mesh.material.uniforms.uNear.value = camera.near;\r\n\r\n\t\t\t}\r\n\r\n\t\t});\r\n\r\n\t\tconst images = new OrientedImages();\r\n\t\timages.node = sceneNode;\r\n\t\timages.cameraParamsPath = cameraParamsPath;\r\n\t\timages.imageParamsPath = imageParamsPath;\r\n\t\timages.cameraParams = cameraParams;\r\n\t\timages.imageParams = imageParams;\r\n\t\timages.images = orientedImages;\r\n\r\n\t\tPotree.debug.moveToImage = moveToImage;\r\n\r\n\t\treturn images;\r\n\t}\r\n}\r\n\r\n","\r\nimport { EventDispatcher } from \"../../EventDispatcher.js\";\r\nimport {TextSprite} from \"../../TextSprite.js\";\r\n\r\nlet sg = new THREE.SphereGeometry(1, 8, 8);\r\nlet sgHigh = new THREE.SphereGeometry(1, 128, 128);\r\n\r\nlet sm = new THREE.MeshBasicMaterial({side: THREE.BackSide});\r\nlet smHovered = new THREE.MeshBasicMaterial({side: THREE.BackSide, color: 0xff0000});\r\n\r\nlet raycaster = new THREE.Raycaster();\r\nlet currentlyHovered = null;\r\n\r\nlet previousView = {\r\n\tcontrols: null,\r\n\tposition: null,\r\n\ttarget: null,\r\n};\r\n\r\nclass Image360{\r\n\r\n\tconstructor(file, time, longitude, latitude, altitude, course, pitch, roll){\r\n\t\tthis.file = file;\r\n\t\tthis.time = time;\r\n\t\tthis.longitude = longitude;\r\n\t\tthis.latitude = latitude;\r\n\t\tthis.altitude = altitude;\r\n\t\tthis.course = course;\r\n\t\tthis.pitch = pitch;\r\n\t\tthis.roll = roll;\r\n\t\tthis.mesh = null;\r\n\t}\r\n};\r\n\r\nexport class Images360 extends EventDispatcher{\r\n\r\n\tconstructor(viewer){\r\n\t\tsuper();\r\n\r\n\t\tthis.viewer = viewer;\r\n\r\n\t\tthis.selectingEnabled = true;\r\n\r\n\t\tthis.images = [];\r\n\t\tthis.node = new THREE.Object3D();\r\n\r\n\t\tthis.sphere = new THREE.Mesh(sgHigh, sm);\r\n\t\tthis.sphere.visible = false;\r\n\t\tthis.sphere.scale.set(1000, 1000, 1000);\r\n\t\tthis.node.add(this.sphere);\r\n\t\tthis._visible = true;\r\n\t\t// this.node.add(label);\r\n\r\n\t\tthis.focusedImage = null;\r\n\r\n\t\tlet elUnfocus = document.createElement(\"input\");\r\n\t\telUnfocus.type = \"button\";\r\n\t\telUnfocus.value = \"unfocus\";\r\n\t\telUnfocus.style.position = \"absolute\";\r\n\t\telUnfocus.style.right = \"10px\";\r\n\t\telUnfocus.style.bottom = \"10px\";\r\n\t\telUnfocus.style.zIndex = \"10000\";\r\n\t\telUnfocus.style.fontSize = \"2em\";\r\n\t\telUnfocus.addEventListener(\"click\", () => this.unfocus());\r\n\t\tthis.elUnfocus = elUnfocus;\r\n\r\n\t\tthis.domRoot = viewer.renderer.domElement.parentElement;\r\n\t\tthis.domRoot.appendChild(elUnfocus);\r\n\t\tthis.elUnfocus.style.display = \"none\";\r\n\r\n\t\tviewer.addEventListener(\"update\", () => {\r\n\t\t\tthis.update(viewer);\r\n\t\t});\r\n\t\tviewer.inputHandler.addInputListener(this);\r\n\r\n\t\tthis.addEventListener(\"mousedown\", () => {\r\n\t\t\tif(currentlyHovered){\r\n\t\t\t\tthis.focus(currentlyHovered.image360);\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t};\r\n\r\n\tset visible(visible){\r\n\t\tif(this._visible === visible){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\r\n\t\tfor(const image of this.images){\r\n\t\t\timage.mesh.visible = visible && (this.focusedImage == null);\r\n\t\t}\r\n\r\n\t\tthis.sphere.visible = visible && (this.focusedImage != null);\r\n\t\tthis._visible = visible;\r\n\t\tthis.dispatchEvent({\r\n\t\t\ttype: \"visibility_changed\",\r\n\t\t\timages: this,\r\n\t\t});\r\n\t}\r\n\r\n\tget visible(){\r\n\t\treturn this._visible;\r\n\t}\r\n\r\n\tfocus(image360){\r\n\t\tif(this.focusedImage !== null){\r\n\t\t\tthis.unfocus();\r\n\t\t}\r\n\r\n\t\tpreviousView = {\r\n\t\t\tcontrols: this.viewer.controls,\r\n\t\t\tposition: this.viewer.scene.view.position.clone(),\r\n\t\t\ttarget: viewer.scene.view.getPivot(),\r\n\t\t};\r\n\r\n\t\tthis.viewer.setControls(this.viewer.orbitControls);\r\n\t\tthis.viewer.orbitControls.doubleClockZoomEnabled = false;\r\n\r\n\t\tfor(let image of this.images){\r\n\t\t\timage.mesh.visible = false;\r\n\t\t}\r\n\r\n\t\tthis.selectingEnabled = false;\r\n\r\n\t\tthis.sphere.visible = false;\r\n\r\n\t\tthis.load(image360).then( () => {\r\n\t\t\tthis.sphere.visible = true;\r\n\t\t\tthis.sphere.material.map = image360.texture;\r\n\t\t\tthis.sphere.material.needsUpdate = true;\r\n\t\t});\r\n\r\n\t\t{ // orientation\r\n\t\t\tlet {course, pitch, roll} = image360;\r\n\t\t\tthis.sphere.rotation.set(\r\n\t\t\t\tTHREE.Math.degToRad(+roll + 90),\r\n\t\t\t\tTHREE.Math.degToRad(-pitch),\r\n\t\t\t\tTHREE.Math.degToRad(-course + 90),\r\n\t\t\t\t\"ZYX\"\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tthis.sphere.position.set(...image360.position);\r\n\r\n\t\tlet target = new THREE.Vector3(...image360.position);\r\n\t\tlet dir = target.clone().sub(viewer.scene.view.position).normalize();\r\n\t\tlet move = dir.multiplyScalar(0.000001);\r\n\t\tlet newCamPos = target.clone().sub(move);\r\n\r\n\t\tviewer.scene.view.setView(\r\n\t\t\tnewCamPos, \r\n\t\t\ttarget,\r\n\t\t\t500\r\n\t\t);\r\n\r\n\t\tthis.focusedImage = image360;\r\n\r\n\t\tthis.elUnfocus.style.display = \"\";\r\n\t}\r\n\r\n\tunfocus(){\r\n\t\tthis.selectingEnabled = true;\r\n\r\n\t\tfor(let image of this.images){\r\n\t\t\timage.mesh.visible = true;\r\n\t\t}\r\n\r\n\t\tlet image = this.focusedImage;\r\n\r\n\t\tif(image === null){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\r\n\t\tthis.sphere.material.map = null;\r\n\t\tthis.sphere.material.needsUpdate = true;\r\n\t\tthis.sphere.visible = false;\r\n\r\n\t\tlet pos = viewer.scene.view.position;\r\n\t\tlet target = viewer.scene.view.getPivot();\r\n\t\tlet dir = target.clone().sub(pos).normalize();\r\n\t\tlet move = dir.multiplyScalar(10);\r\n\t\tlet newCamPos = target.clone().sub(move);\r\n\r\n\t\tviewer.orbitControls.doubleClockZoomEnabled = true;\r\n\t\tviewer.setControls(previousView.controls);\r\n\r\n\t\tviewer.scene.view.setView(\r\n\t\t\tpreviousView.position, \r\n\t\t\tpreviousView.target,\r\n\t\t\t500\r\n\t\t);\r\n\r\n\r\n\t\tthis.focusedImage = null;\r\n\r\n\t\tthis.elUnfocus.style.display = \"none\";\r\n\t}\r\n\r\n\tload(image360){\r\n\r\n\t\treturn new Promise(resolve => {\r\n\t\t\tlet texture = new THREE.TextureLoader().load(image360.file, resolve);\r\n\t\t\ttexture.wrapS = THREE.RepeatWrapping;\r\n\t\t\ttexture.repeat.x = -1;\r\n\r\n\t\t\timage360.texture = texture;\r\n\t\t});\r\n\r\n\t}\r\n\r\n\thandleHovering(){\r\n\t\tlet mouse = viewer.inputHandler.mouse;\r\n\t\tlet camera = viewer.scene.getActiveCamera();\r\n\t\tlet domElement = viewer.renderer.domElement;\r\n\r\n\t\tlet ray = Potree.Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\r\n\r\n\t\t// let tStart = performance.now();\r\n\t\traycaster.ray.copy(ray);\r\n\t\tlet intersections = raycaster.intersectObjects(this.node.children);\r\n\r\n\t\tif(intersections.length === 0){\r\n\t\t\t// label.visible = false;\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet intersection = intersections[0];\r\n\t\tcurrentlyHovered = intersection.object;\r\n\t\tcurrentlyHovered.material = smHovered;\r\n\r\n\t\t//label.visible = true;\r\n\t\t//label.setText(currentlyHovered.image360.file);\r\n\t\t//currentlyHovered.getWorldPosition(label.position);\r\n\t}\r\n\r\n\tupdate(){\r\n\r\n\t\tlet {viewer} = this;\r\n\r\n\t\tif(currentlyHovered){\r\n\t\t\tcurrentlyHovered.material = sm;\r\n\t\t\tcurrentlyHovered = null;\r\n\t\t}\r\n\r\n\t\tif(this.selectingEnabled){\r\n\t\t\tthis.handleHovering();\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\nexport class Images360Loader{\r\n\r\n\tstatic async load(url, viewer, params = {}){\r\n\r\n\t\tif(!params.transform){\r\n\t\t\tparams.transform = {\r\n\t\t\t\tforward: a => a,\r\n\t\t\t};\r\n\t\t}\r\n\t\t\r\n\t\tlet response = await fetch(`${url}/coordinates.txt`);\r\n\t\tlet text = await response.text();\r\n\r\n\t\tlet lines = text.split(/\\r?\\n/);\r\n\t\tlet coordinateLines = lines.slice(1);\r\n\r\n\t\tlet images360 = new Images360(viewer);\r\n\r\n\t\tfor(let line of coordinateLines){\r\n\r\n\t\t\tif(line.trim().length === 0){\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tlet tokens = line.split(/\\t/);\r\n\r\n\t\t\tlet [filename, time, long, lat, alt, course, pitch, roll] = tokens;\r\n\t\t\ttime = parseFloat(time);\r\n\t\t\tlong = parseFloat(long);\r\n\t\t\tlat = parseFloat(lat);\r\n\t\t\talt = parseFloat(alt);\r\n\t\t\tcourse = parseFloat(course);\r\n\t\t\tpitch = parseFloat(pitch);\r\n\t\t\troll = parseFloat(roll);\r\n\r\n\t\t\tfilename = filename.replace(/\"/g, \"\");\r\n\t\t\tlet file = `${url}/${filename}`;\r\n\r\n\t\t\tlet image360 = new Image360(file, time, long, lat, alt, course, pitch, roll);\r\n\r\n\t\t\tlet xy = params.transform.forward([long, lat]);\r\n\t\t\tlet position = [...xy, alt];\r\n\t\t\timage360.position = position;\r\n\r\n\t\t\timages360.images.push(image360);\r\n\t\t}\r\n\r\n\t\tImages360Loader.createSceneNodes(images360, params.transform);\r\n\r\n\t\treturn images360;\r\n\r\n\t}\r\n\r\n\tstatic createSceneNodes(images360, transform){\r\n\r\n\t\tfor(let image360 of images360.images){\r\n\t\t\tlet {longitude, latitude, altitude} = image360;\r\n\t\t\tlet xy = transform.forward([longitude, latitude]);\r\n\r\n\t\t\tlet mesh = new THREE.Mesh(sg, sm);\r\n\t\t\tmesh.position.set(...xy, altitude);\r\n\t\t\tmesh.scale.set(1, 1, 1);\r\n\t\t\tmesh.material.transparent = true;\r\n\t\t\tmesh.material.opacity = 0.75;\r\n\t\t\tmesh.image360 = image360;\r\n\r\n\t\t\t{ // orientation\r\n\t\t\t\tvar {course, pitch, roll} = image360;\r\n\t\t\t\tmesh.rotation.set(\r\n\t\t\t\t\tTHREE.Math.degToRad(+roll + 90),\r\n\t\t\t\t\tTHREE.Math.degToRad(-pitch),\r\n\t\t\t\t\tTHREE.Math.degToRad(-course + 90),\r\n\t\t\t\t\t\"ZYX\"\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\timages360.node.add(mesh);\r\n\r\n\t\t\timage360.mesh = mesh;\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n\r\n};\r\n\r\n\r\n","// This is a generated file. Do not edit.\nvar Space_Separator = /[\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/;\nvar ID_Start = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE83\\uDE86-\\uDE89\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]/;\nvar ID_Continue = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u09FC\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9-\\u0AFF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D00-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1C80-\\u1C88\\u1CD0-\\u1CD2\\u1CD4-\\u1CF9\\u1D00-\\u1DF9\\u1DFB-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C5\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC00-\\uDC4A\\uDC50-\\uDC59\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDE00-\\uDE3E\\uDE47\\uDE50-\\uDE83\\uDE86-\\uDE99\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC40\\uDC50-\\uDC59\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD47\\uDD50-\\uDD59]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6\\uDD00-\\uDD4A\\uDD50-\\uDD59]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/;\n\nvar unicode = {\n\tSpace_Separator: Space_Separator,\n\tID_Start: ID_Start,\n\tID_Continue: ID_Continue\n};\n\nvar util = {\n isSpaceSeparator (c) {\n return typeof c === 'string' && unicode.Space_Separator.test(c)\n },\n\n isIdStartChar (c) {\n return typeof c === 'string' && (\n (c >= 'a' && c <= 'z') ||\n (c >= 'A' && c <= 'Z') ||\n (c === '$') || (c === '_') ||\n unicode.ID_Start.test(c)\n )\n },\n\n isIdContinueChar (c) {\n return typeof c === 'string' && (\n (c >= 'a' && c <= 'z') ||\n (c >= 'A' && c <= 'Z') ||\n (c >= '0' && c <= '9') ||\n (c === '$') || (c === '_') ||\n (c === '\\u200C') || (c === '\\u200D') ||\n unicode.ID_Continue.test(c)\n )\n },\n\n isDigit (c) {\n return typeof c === 'string' && /[0-9]/.test(c)\n },\n\n isHexDigit (c) {\n return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)\n },\n};\n\nlet source;\nlet parseState;\nlet stack;\nlet pos;\nlet line;\nlet column;\nlet token;\nlet key;\nlet root;\n\nvar parse = function parse (text, reviver) {\n source = String(text);\n parseState = 'start';\n stack = [];\n pos = 0;\n line = 1;\n column = 0;\n token = undefined;\n key = undefined;\n root = undefined;\n\n do {\n token = lex();\n\n // This code is unreachable.\n // if (!parseStates[parseState]) {\n // throw invalidParseState()\n // }\n\n parseStates[parseState]();\n } while (token.type !== 'eof')\n\n if (typeof reviver === 'function') {\n return internalize({'': root}, '', reviver)\n }\n\n return root\n};\n\nfunction internalize (holder, name, reviver) {\n const value = holder[name];\n if (value != null && typeof value === 'object') {\n for (const key in value) {\n const replacement = internalize(value, key, reviver);\n if (replacement === undefined) {\n delete value[key];\n } else {\n value[key] = replacement;\n }\n }\n }\n\n return reviver.call(holder, name, value)\n}\n\nlet lexState;\nlet buffer;\nlet doubleQuote;\nlet sign;\nlet c;\n\nfunction lex () {\n lexState = 'default';\n buffer = '';\n doubleQuote = false;\n sign = 1;\n\n for (;;) {\n c = peek();\n\n // This code is unreachable.\n // if (!lexStates[lexState]) {\n // throw invalidLexState(lexState)\n // }\n\n const token = lexStates[lexState]();\n if (token) {\n return token\n }\n }\n}\n\nfunction peek () {\n if (source[pos]) {\n return String.fromCodePoint(source.codePointAt(pos))\n }\n}\n\nfunction read () {\n const c = peek();\n\n if (c === '\\n') {\n line++;\n column = 0;\n } else if (c) {\n column += c.length;\n } else {\n column++;\n }\n\n if (c) {\n pos += c.length;\n }\n\n return c\n}\n\nconst lexStates = {\n default () {\n switch (c) {\n case '\\t':\n case '\\v':\n case '\\f':\n case ' ':\n case '\\u00A0':\n case '\\uFEFF':\n case '\\n':\n case '\\r':\n case '\\u2028':\n case '\\u2029':\n read();\n return\n\n case '/':\n read();\n lexState = 'comment';\n return\n\n case undefined:\n read();\n return newToken('eof')\n }\n\n if (util.isSpaceSeparator(c)) {\n read();\n return\n }\n\n // This code is unreachable.\n // if (!lexStates[parseState]) {\n // throw invalidLexState(parseState)\n // }\n\n return lexStates[parseState]()\n },\n\n comment () {\n switch (c) {\n case '*':\n read();\n lexState = 'multiLineComment';\n return\n\n case '/':\n read();\n lexState = 'singleLineComment';\n return\n }\n\n throw invalidChar(read())\n },\n\n multiLineComment () {\n switch (c) {\n case '*':\n read();\n lexState = 'multiLineCommentAsterisk';\n return\n\n case undefined:\n throw invalidChar(read())\n }\n\n read();\n },\n\n multiLineCommentAsterisk () {\n switch (c) {\n case '*':\n read();\n return\n\n case '/':\n read();\n lexState = 'default';\n return\n\n case undefined:\n throw invalidChar(read())\n }\n\n read();\n lexState = 'multiLineComment';\n },\n\n singleLineComment () {\n switch (c) {\n case '\\n':\n case '\\r':\n case '\\u2028':\n case '\\u2029':\n read();\n lexState = 'default';\n return\n\n case undefined:\n read();\n return newToken('eof')\n }\n\n read();\n },\n\n value () {\n switch (c) {\n case '{':\n case '[':\n return newToken('punctuator', read())\n\n case 'n':\n read();\n literal('ull');\n return newToken('null', null)\n\n case 't':\n read();\n literal('rue');\n return newToken('boolean', true)\n\n case 'f':\n read();\n literal('alse');\n return newToken('boolean', false)\n\n case '-':\n case '+':\n if (read() === '-') {\n sign = -1;\n }\n\n lexState = 'sign';\n return\n\n case '.':\n buffer = read();\n lexState = 'decimalPointLeading';\n return\n\n case '0':\n buffer = read();\n lexState = 'zero';\n return\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n buffer = read();\n lexState = 'decimalInteger';\n return\n\n case 'I':\n read();\n literal('nfinity');\n return newToken('numeric', Infinity)\n\n case 'N':\n read();\n literal('aN');\n return newToken('numeric', NaN)\n\n case '\"':\n case \"'\":\n doubleQuote = (read() === '\"');\n buffer = '';\n lexState = 'string';\n return\n }\n\n throw invalidChar(read())\n },\n\n identifierNameStartEscape () {\n if (c !== 'u') {\n throw invalidChar(read())\n }\n\n read();\n const u = unicodeEscape();\n switch (u) {\n case '$':\n case '_':\n break\n\n default:\n if (!util.isIdStartChar(u)) {\n throw invalidIdentifier()\n }\n\n break\n }\n\n buffer += u;\n lexState = 'identifierName';\n },\n\n identifierName () {\n switch (c) {\n case '$':\n case '_':\n case '\\u200C':\n case '\\u200D':\n buffer += read();\n return\n\n case '\\\\':\n read();\n lexState = 'identifierNameEscape';\n return\n }\n\n if (util.isIdContinueChar(c)) {\n buffer += read();\n return\n }\n\n return newToken('identifier', buffer)\n },\n\n identifierNameEscape () {\n if (c !== 'u') {\n throw invalidChar(read())\n }\n\n read();\n const u = unicodeEscape();\n switch (u) {\n case '$':\n case '_':\n case '\\u200C':\n case '\\u200D':\n break\n\n default:\n if (!util.isIdContinueChar(u)) {\n throw invalidIdentifier()\n }\n\n break\n }\n\n buffer += u;\n lexState = 'identifierName';\n },\n\n sign () {\n switch (c) {\n case '.':\n buffer = read();\n lexState = 'decimalPointLeading';\n return\n\n case '0':\n buffer = read();\n lexState = 'zero';\n return\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n buffer = read();\n lexState = 'decimalInteger';\n return\n\n case 'I':\n read();\n literal('nfinity');\n return newToken('numeric', sign * Infinity)\n\n case 'N':\n read();\n literal('aN');\n return newToken('numeric', NaN)\n }\n\n throw invalidChar(read())\n },\n\n zero () {\n switch (c) {\n case '.':\n buffer += read();\n lexState = 'decimalPoint';\n return\n\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n\n case 'x':\n case 'X':\n buffer += read();\n lexState = 'hexadecimal';\n return\n }\n\n return newToken('numeric', sign * 0)\n },\n\n decimalInteger () {\n switch (c) {\n case '.':\n buffer += read();\n lexState = 'decimalPoint';\n return\n\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalPointLeading () {\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalFraction';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalPoint () {\n switch (c) {\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalFraction';\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalFraction () {\n switch (c) {\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalExponent () {\n switch (c) {\n case '+':\n case '-':\n buffer += read();\n lexState = 'decimalExponentSign';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalExponentInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalExponentSign () {\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalExponentInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalExponentInteger () {\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n hexadecimal () {\n if (util.isHexDigit(c)) {\n buffer += read();\n lexState = 'hexadecimalInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n hexadecimalInteger () {\n if (util.isHexDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n string () {\n switch (c) {\n case '\\\\':\n read();\n buffer += escape();\n return\n\n case '\"':\n if (doubleQuote) {\n read();\n return newToken('string', buffer)\n }\n\n buffer += read();\n return\n\n case \"'\":\n if (!doubleQuote) {\n read();\n return newToken('string', buffer)\n }\n\n buffer += read();\n return\n\n case '\\n':\n case '\\r':\n throw invalidChar(read())\n\n case '\\u2028':\n case '\\u2029':\n separatorChar(c);\n break\n\n case undefined:\n throw invalidChar(read())\n }\n\n buffer += read();\n },\n\n start () {\n switch (c) {\n case '{':\n case '[':\n return newToken('punctuator', read())\n\n // This code is unreachable since the default lexState handles eof.\n // case undefined:\n // return newToken('eof')\n }\n\n lexState = 'value';\n },\n\n beforePropertyName () {\n switch (c) {\n case '$':\n case '_':\n buffer = read();\n lexState = 'identifierName';\n return\n\n case '\\\\':\n read();\n lexState = 'identifierNameStartEscape';\n return\n\n case '}':\n return newToken('punctuator', read())\n\n case '\"':\n case \"'\":\n doubleQuote = (read() === '\"');\n lexState = 'string';\n return\n }\n\n if (util.isIdStartChar(c)) {\n buffer += read();\n lexState = 'identifierName';\n return\n }\n\n throw invalidChar(read())\n },\n\n afterPropertyName () {\n if (c === ':') {\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n beforePropertyValue () {\n lexState = 'value';\n },\n\n afterPropertyValue () {\n switch (c) {\n case ',':\n case '}':\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n beforeArrayValue () {\n if (c === ']') {\n return newToken('punctuator', read())\n }\n\n lexState = 'value';\n },\n\n afterArrayValue () {\n switch (c) {\n case ',':\n case ']':\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n end () {\n // This code is unreachable since it's handled by the default lexState.\n // if (c === undefined) {\n // read()\n // return newToken('eof')\n // }\n\n throw invalidChar(read())\n },\n};\n\nfunction newToken (type, value) {\n return {\n type,\n value,\n line,\n column,\n }\n}\n\nfunction literal (s) {\n for (const c of s) {\n const p = peek();\n\n if (p !== c) {\n throw invalidChar(read())\n }\n\n read();\n }\n}\n\nfunction escape () {\n const c = peek();\n switch (c) {\n case 'b':\n read();\n return '\\b'\n\n case 'f':\n read();\n return '\\f'\n\n case 'n':\n read();\n return '\\n'\n\n case 'r':\n read();\n return '\\r'\n\n case 't':\n read();\n return '\\t'\n\n case 'v':\n read();\n return '\\v'\n\n case '0':\n read();\n if (util.isDigit(peek())) {\n throw invalidChar(read())\n }\n\n return '\\0'\n\n case 'x':\n read();\n return hexEscape()\n\n case 'u':\n read();\n return unicodeEscape()\n\n case '\\n':\n case '\\u2028':\n case '\\u2029':\n read();\n return ''\n\n case '\\r':\n read();\n if (peek() === '\\n') {\n read();\n }\n\n return ''\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n throw invalidChar(read())\n\n case undefined:\n throw invalidChar(read())\n }\n\n return read()\n}\n\nfunction hexEscape () {\n let buffer = '';\n let c = peek();\n\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n\n c = peek();\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n\n return String.fromCodePoint(parseInt(buffer, 16))\n}\n\nfunction unicodeEscape () {\n let buffer = '';\n let count = 4;\n\n while (count-- > 0) {\n const c = peek();\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n }\n\n return String.fromCodePoint(parseInt(buffer, 16))\n}\n\nconst parseStates = {\n start () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n push();\n },\n\n beforePropertyName () {\n switch (token.type) {\n case 'identifier':\n case 'string':\n key = token.value;\n parseState = 'afterPropertyName';\n return\n\n case 'punctuator':\n // This code is unreachable since it's handled by the lexState.\n // if (token.value !== '}') {\n // throw invalidToken()\n // }\n\n pop();\n return\n\n case 'eof':\n throw invalidEOF()\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n afterPropertyName () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator' || token.value !== ':') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n parseState = 'beforePropertyValue';\n },\n\n beforePropertyValue () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n push();\n },\n\n beforeArrayValue () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n if (token.type === 'punctuator' && token.value === ']') {\n pop();\n return\n }\n\n push();\n },\n\n afterPropertyValue () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n switch (token.value) {\n case ',':\n parseState = 'beforePropertyName';\n return\n\n case '}':\n pop();\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n afterArrayValue () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n switch (token.value) {\n case ',':\n parseState = 'beforeArrayValue';\n return\n\n case ']':\n pop();\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n end () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'eof') {\n // throw invalidToken()\n // }\n },\n};\n\nfunction push () {\n let value;\n\n switch (token.type) {\n case 'punctuator':\n switch (token.value) {\n case '{':\n value = {};\n break\n\n case '[':\n value = [];\n break\n }\n\n break\n\n case 'null':\n case 'boolean':\n case 'numeric':\n case 'string':\n value = token.value;\n break\n\n // This code is unreachable.\n // default:\n // throw invalidToken()\n }\n\n if (root === undefined) {\n root = value;\n } else {\n const parent = stack[stack.length - 1];\n if (Array.isArray(parent)) {\n parent.push(value);\n } else {\n parent[key] = value;\n }\n }\n\n if (value !== null && typeof value === 'object') {\n stack.push(value);\n\n if (Array.isArray(value)) {\n parseState = 'beforeArrayValue';\n } else {\n parseState = 'beforePropertyName';\n }\n } else {\n const current = stack[stack.length - 1];\n if (current == null) {\n parseState = 'end';\n } else if (Array.isArray(current)) {\n parseState = 'afterArrayValue';\n } else {\n parseState = 'afterPropertyValue';\n }\n }\n}\n\nfunction pop () {\n stack.pop();\n\n const current = stack[stack.length - 1];\n if (current == null) {\n parseState = 'end';\n } else if (Array.isArray(current)) {\n parseState = 'afterArrayValue';\n } else {\n parseState = 'afterPropertyValue';\n }\n}\n\n// This code is unreachable.\n// function invalidParseState () {\n// return new Error(`JSON5: invalid parse state '${parseState}'`)\n// }\n\n// This code is unreachable.\n// function invalidLexState (state) {\n// return new Error(`JSON5: invalid lex state '${state}'`)\n// }\n\nfunction invalidChar (c) {\n if (c === undefined) {\n return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n }\n\n return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)\n}\n\nfunction invalidEOF () {\n return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n}\n\n// This code is unreachable.\n// function invalidToken () {\n// if (token.type === 'eof') {\n// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n// }\n\n// const c = String.fromCodePoint(token.value.codePointAt(0))\n// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)\n// }\n\nfunction invalidIdentifier () {\n column -= 5;\n return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`)\n}\n\nfunction separatorChar (c) {\n console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`);\n}\n\nfunction formatChar (c) {\n const replacements = {\n \"'\": \"\\\\'\",\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\',\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n '\\v': '\\\\v',\n '\\0': '\\\\0',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n };\n\n if (replacements[c]) {\n return replacements[c]\n }\n\n if (c < ' ') {\n const hexString = c.charCodeAt(0).toString(16);\n return '\\\\x' + ('00' + hexString).substring(hexString.length)\n }\n\n return c\n}\n\nfunction syntaxError (message) {\n const err = new SyntaxError(message);\n err.lineNumber = line;\n err.columnNumber = column;\n return err\n}\n\nvar stringify = function stringify (value, replacer, space) {\n const stack = [];\n let indent = '';\n let propertyList;\n let replacerFunc;\n let gap = '';\n let quote;\n\n if (\n replacer != null &&\n typeof replacer === 'object' &&\n !Array.isArray(replacer)\n ) {\n space = replacer.space;\n quote = replacer.quote;\n replacer = replacer.replacer;\n }\n\n if (typeof replacer === 'function') {\n replacerFunc = replacer;\n } else if (Array.isArray(replacer)) {\n propertyList = [];\n for (const v of replacer) {\n let item;\n\n if (typeof v === 'string') {\n item = v;\n } else if (\n typeof v === 'number' ||\n v instanceof String ||\n v instanceof Number\n ) {\n item = String(v);\n }\n\n if (item !== undefined && propertyList.indexOf(item) < 0) {\n propertyList.push(item);\n }\n }\n }\n\n if (space instanceof Number) {\n space = Number(space);\n } else if (space instanceof String) {\n space = String(space);\n }\n\n if (typeof space === 'number') {\n if (space > 0) {\n space = Math.min(10, Math.floor(space));\n gap = ' '.substr(0, space);\n }\n } else if (typeof space === 'string') {\n gap = space.substr(0, 10);\n }\n\n return serializeProperty('', {'': value})\n\n function serializeProperty (key, holder) {\n let value = holder[key];\n if (value != null) {\n if (typeof value.toJSON5 === 'function') {\n value = value.toJSON5(key);\n } else if (typeof value.toJSON === 'function') {\n value = value.toJSON(key);\n }\n }\n\n if (replacerFunc) {\n value = replacerFunc.call(holder, key, value);\n }\n\n if (value instanceof Number) {\n value = Number(value);\n } else if (value instanceof String) {\n value = String(value);\n } else if (value instanceof Boolean) {\n value = value.valueOf();\n }\n\n switch (value) {\n case null: return 'null'\n case true: return 'true'\n case false: return 'false'\n }\n\n if (typeof value === 'string') {\n return quoteString(value, false)\n }\n\n if (typeof value === 'number') {\n return String(value)\n }\n\n if (typeof value === 'object') {\n return Array.isArray(value) ? serializeArray(value) : serializeObject(value)\n }\n\n return undefined\n }\n\n function quoteString (value) {\n const quotes = {\n \"'\": 0.1,\n '\"': 0.2,\n };\n\n const replacements = {\n \"'\": \"\\\\'\",\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\',\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n '\\v': '\\\\v',\n '\\0': '\\\\0',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n };\n\n let product = '';\n\n for (let i = 0; i < value.length; i++) {\n const c = value[i];\n switch (c) {\n case \"'\":\n case '\"':\n quotes[c]++;\n product += c;\n continue\n\n case '\\0':\n if (util.isDigit(value[i + 1])) {\n product += '\\\\x00';\n continue\n }\n }\n\n if (replacements[c]) {\n product += replacements[c];\n continue\n }\n\n if (c < ' ') {\n let hexString = c.charCodeAt(0).toString(16);\n product += '\\\\x' + ('00' + hexString).substring(hexString.length);\n continue\n }\n\n product += c;\n }\n\n const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b);\n\n product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);\n\n return quoteChar + product + quoteChar\n }\n\n function serializeObject (value) {\n if (stack.indexOf(value) >= 0) {\n throw TypeError('Converting circular structure to JSON5')\n }\n\n stack.push(value);\n\n let stepback = indent;\n indent = indent + gap;\n\n let keys = propertyList || Object.keys(value);\n let partial = [];\n for (const key of keys) {\n const propertyString = serializeProperty(key, value);\n if (propertyString !== undefined) {\n let member = serializeKey(key) + ':';\n if (gap !== '') {\n member += ' ';\n }\n member += propertyString;\n partial.push(member);\n }\n }\n\n let final;\n if (partial.length === 0) {\n final = '{}';\n } else {\n let properties;\n if (gap === '') {\n properties = partial.join(',');\n final = '{' + properties + '}';\n } else {\n let separator = ',\\n' + indent;\n properties = partial.join(separator);\n final = '{\\n' + indent + properties + ',\\n' + stepback + '}';\n }\n }\n\n stack.pop();\n indent = stepback;\n return final\n }\n\n function serializeKey (key) {\n if (key.length === 0) {\n return quoteString(key, true)\n }\n\n const firstChar = String.fromCodePoint(key.codePointAt(0));\n if (!util.isIdStartChar(firstChar)) {\n return quoteString(key, true)\n }\n\n for (let i = firstChar.length; i < key.length; i++) {\n if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {\n return quoteString(key, true)\n }\n }\n\n return key\n }\n\n function serializeArray (value) {\n if (stack.indexOf(value) >= 0) {\n throw TypeError('Converting circular structure to JSON5')\n }\n\n stack.push(value);\n\n let stepback = indent;\n indent = indent + gap;\n\n let partial = [];\n for (let i = 0; i < value.length; i++) {\n const propertyString = serializeProperty(String(i), value);\n partial.push((propertyString !== undefined) ? propertyString : 'null');\n }\n\n let final;\n if (partial.length === 0) {\n final = '[]';\n } else {\n if (gap === '') {\n let properties = partial.join(',');\n final = '[' + properties + ']';\n } else {\n let separator = ',\\n' + indent;\n let properties = partial.join(separator);\n final = '[\\n' + indent + properties + ',\\n' + stepback + ']';\n }\n }\n\n stack.pop();\n indent = stepback;\n return final\n }\n};\n\nconst JSON5 = {\n parse,\n stringify,\n};\n\nvar lib = JSON5;\n\nexport default lib;\n","\nimport {GeoJSONExporter} from \"../exporter/GeoJSONExporter.js\"\nimport {DXFExporter} from \"../exporter/DXFExporter.js\"\nimport {Volume, SphereVolume} from \"../utils/Volume.js\"\nimport {PolygonClipVolume} from \"../utils/PolygonClipVolume.js\"\nimport {PropertiesPanel} from \"./PropertyPanels/PropertiesPanel.js\"\nimport {PointCloudTree} from \"../PointCloudTree.js\"\nimport {Profile} from \"../utils/Profile.js\"\nimport {Measure} from \"../utils/Measure.js\"\nimport {Annotation} from \"../Annotation.js\"\nimport {CameraMode, ClipTask, ClipMethod} from \"../defines.js\"\nimport {ScreenBoxSelectTool} from \"../utils/ScreenBoxSelectTool.js\"\nimport {Utils} from \"../utils.js\"\nimport {CameraAnimation} from \"../modules/CameraAnimation/CameraAnimation.js\"\nimport {HierarchicalSlider} from \"./HierarchicalSlider.js\"\nimport {OrientedImage} from \"../modules/OrientedImages/OrientedImages.js\";\nimport {Images360} from \"../modules/Images360/Images360.js\";\n\nimport JSON5 from \"../../libs/json5-2.1.3/json5.mjs\";\n\nexport class Sidebar{\n\n\tconstructor(viewer){\n\t\tthis.viewer = viewer;\n\n\t\tthis.measuringTool = viewer.measuringTool;\n\t\tthis.profileTool = viewer.profileTool;\n\t\tthis.volumeTool = viewer.volumeTool;\n\n\t\tthis.dom = $(\"#sidebar_root\");\n\t}\n\n\tcreateToolIcon(icon, title, callback){\n\t\tlet element = $(`\n\t\t\t\n\t\t`);\n\n\t\telement.click(callback);\n\n\t\treturn element;\n\t}\n\n\tinit(){\n\n\t\tthis.initAccordion();\n\t\tthis.initAppearance();\n\t\tthis.initToolbar();\n\t\tthis.initScene();\n\t\tthis.initNavigation();\n\t\tthis.initFilters();\n\t\tthis.initClippingTool();\n\t\tthis.initSettings();\n\t\t\n\t\t$('#potree_version_number').html(Potree.version.major + \".\" + Potree.version.minor + Potree.version.suffix);\n\t}\n\n\t\t\n\n\tinitToolbar(){\n\n\t\t// ANGLE\n\t\tlet elToolbar = $('#tools');\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/angle.png',\n\t\t\t'[title]tt.angle_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: false,\n\t\t\t\t\tshowAngles: true,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tclosed: true,\n\t\t\t\t\tmaxMarkers: 3,\n\t\t\t\t\tname: 'Angle'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// POINT\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/point.svg',\n\t\t\t'[title]tt.point_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: false,\n\t\t\t\t\tshowAngles: false,\n\t\t\t\t\tshowCoordinates: true,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tclosed: true,\n\t\t\t\t\tmaxMarkers: 1,\n\t\t\t\t\tname: 'Point'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// DISTANCE\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/distance.svg',\n\t\t\t'[title]tt.distance_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: true,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tclosed: false,\n\t\t\t\t\tname: 'Distance'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// HEIGHT\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/height.svg',\n\t\t\t'[title]tt.height_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: false,\n\t\t\t\t\tshowHeight: true,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tclosed: false,\n\t\t\t\t\tmaxMarkers: 2,\n\t\t\t\t\tname: 'Height'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// CIRCLE\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/circle.svg',\n\t\t\t'[title]tt.circle_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: false,\n\t\t\t\t\tshowHeight: false,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tshowCircle: true,\n\t\t\t\t\tshowEdges: false,\n\t\t\t\t\tclosed: false,\n\t\t\t\t\tmaxMarkers: 3,\n\t\t\t\t\tname: 'Circle'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// AZIMUTH\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/azimuth.svg',\n\t\t\t'Azimuth',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: false,\n\t\t\t\t\tshowHeight: false,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tshowCircle: false,\n\t\t\t\t\tshowEdges: false,\n\t\t\t\t\tshowAzimuth: true,\n\t\t\t\t\tclosed: false,\n\t\t\t\t\tmaxMarkers: 2,\n\t\t\t\t\tname: 'Azimuth'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// AREA\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/area.svg',\n\t\t\t'[title]tt.area_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: true,\n\t\t\t\t\tshowArea: true,\n\t\t\t\t\tclosed: true,\n\t\t\t\t\tname: 'Area'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// VOLUME\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/volume.svg',\n\t\t\t'[title]tt.volume_measurement',\n\t\t\t() => {\n\t\t\t\tlet volume = this.volumeTool.startInsertion(); \n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === volume.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// SPHERE VOLUME\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/sphere_distances.svg',\n\t\t\t'[title]tt.volume_measurement',\n\t\t\t() => { \n\t\t\t\tlet volume = this.volumeTool.startInsertion({type: SphereVolume}); \n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === volume.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// PROFILE\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/profile.svg',\n\t\t\t'[title]tt.height_profile',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown(); ;\n\t\t\t\tlet profile = this.profileTool.startInsertion();\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === profile.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// ANNOTATION\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/annotation.svg',\n\t\t\t'[title]tt.annotation',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown(); ;\n\t\t\t\tlet annotation = this.viewer.annotationTool.startInsertion();\n\n\t\t\t\tlet annotationsRoot = $(\"#jstree_scene\").jstree().get_json(\"annotations\");\n\t\t\t\tlet jsonNode = annotationsRoot.children.find(child => child.data.uuid === annotation.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// REMOVE ALL\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/reset_tools.svg',\n\t\t\t'[title]tt.remove_all_measurement',\n\t\t\t() => {\n\t\t\t\tthis.viewer.scene.removeAllMeasurements();\n\t\t\t}\n\t\t));\n\n\n\t\t{ // SHOW / HIDE Measurements\n\t\t\tlet elShow = $(\"#measurement_options_show\");\n\t\t\telShow.selectgroup({title: \"Show/Hide labels\"});\n\n\t\t\telShow.find(\"input\").click( (e) => {\n\t\t\t\tconst show = e.target.value === \"SHOW\";\n\t\t\t\tthis.measuringTool.showLabels = show;\n\t\t\t});\n\n\t\t\tlet currentShow = this.measuringTool.showLabels ? \"SHOW\" : \"HIDE\";\n\t\t\telShow.find(`input[value=${currentShow}]`).trigger(\"click\");\n\t\t}\n\t}\n\n\tinitScene(){\n\n\t\tlet elScene = $(\"#menu_scene\");\n\t\tlet elObjects = elScene.next().find(\"#scene_objects\");\n\t\tlet elProperties = elScene.next().find(\"#scene_object_properties\");\n\t\t\n\n\t\t{\n\t\t\tlet elExport = elScene.next().find(\"#scene_export\");\n\n\t\t\tlet geoJSONIcon = `${Potree.resourcePath}/icons/file_geojson.svg`;\n\t\t\tlet dxfIcon = `${Potree.resourcePath}/icons/file_dxf.svg`;\n\t\t\tlet potreeIcon = `${Potree.resourcePath}/icons/file_potree.svg`;\n\n\t\t\telExport.append(`\n\t\t\t\tExport:
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t`);\n\n\t\t\tlet elDownloadJSON = elExport.find(\"img[name=geojson_export_button]\").parent();\n\t\t\telDownloadJSON.click( (event) => {\n\t\t\t\tlet scene = this.viewer.scene;\n\t\t\t\tlet measurements = [...scene.measurements, ...scene.profiles, ...scene.volumes];\n\n\t\t\t\tif(measurements.length > 0){\n\t\t\t\t\tlet geoJson = GeoJSONExporter.toString(measurements);\n\n\t\t\t\t\tlet url = window.URL.createObjectURL(new Blob([geoJson], {type: 'data:application/octet-stream'}));\n\t\t\t\t\telDownloadJSON.attr('href', url);\n\t\t\t\t}else{\n\t\t\t\t\tthis.viewer.postError(\"no measurements to export\");\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet elDownloadDXF = elExport.find(\"img[name=dxf_export_button]\").parent();\n\t\t\telDownloadDXF.click( (event) => {\n\t\t\t\tlet scene = this.viewer.scene;\n\t\t\t\tlet measurements = [...scene.measurements, ...scene.profiles, ...scene.volumes];\n\n\t\t\t\tif(measurements.length > 0){\n\t\t\t\t\tlet dxf = DXFExporter.toString(measurements);\n\n\t\t\t\t\tlet url = window.URL.createObjectURL(new Blob([dxf], {type: 'data:application/octet-stream'}));\n\t\t\t\t\telDownloadDXF.attr('href', url);\n\t\t\t\t}else{\n\t\t\t\t\tthis.viewer.postError(\"no measurements to export\");\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet elDownloadPotree = elExport.find(\"img[name=potree_export_button]\").parent();\n\t\t\telDownloadPotree.click( (event) => {\n\n\t\t\t\tlet data = Potree.saveProject(this.viewer);\n\t\t\t\tlet dataString = JSON5.stringify(data, null, \"\\t\")\n\n\t\t\t\tlet url = window.URL.createObjectURL(new Blob([dataString], {type: 'data:application/octet-stream'}));\n\t\t\t\telDownloadPotree.attr('href', url);\n\t\t\t});\n\t\t}\n\n\t\tlet propertiesPanel = new PropertiesPanel(elProperties, this.viewer);\n\t\tpropertiesPanel.setScene(this.viewer.scene);\n\t\t\n\t\tlocalStorage.removeItem('jstree');\n\n\t\tlet tree = $(`
    `);\n\t\telObjects.append(tree);\n\n\t\ttree.jstree({\n\t\t\t'plugins': [\"checkbox\", \"state\"],\n\t\t\t'core': {\n\t\t\t\t\"dblclick_toggle\": false,\n\t\t\t\t\"state\": {\n\t\t\t\t\t\"checked\" : true\n\t\t\t\t},\n\t\t\t\t'check_callback': true,\n\t\t\t\t\"expand_selected_onload\": true\n\t\t\t},\n\t\t\t\"checkbox\" : {\n\t\t\t\t\"keep_selected_style\": true,\n\t\t\t\t\"three_state\": false,\n\t\t\t\t\"whole_node\": false,\n\t\t\t\t\"tie_selection\": false,\n\t\t\t},\n\t\t});\n\n\t\tlet createNode = (parent, text, icon, object) => {\n\t\t\tlet nodeID = tree.jstree('create_node', parent, { \n\t\t\t\t\t\"text\": text, \n\t\t\t\t\t\"icon\": icon,\n\t\t\t\t\t\"data\": object\n\t\t\t\t}, \n\t\t\t\t\"last\", false, false);\n\t\t\t\n\t\t\tif(object.visible){\n\t\t\t\ttree.jstree('check_node', nodeID);\n\t\t\t}else{\n\t\t\t\ttree.jstree('uncheck_node', nodeID);\n\t\t\t}\n\n\t\t\treturn nodeID;\n\t\t}\n\n\t\tlet pcID = tree.jstree('create_node', \"#\", { \"text\": \"Point Clouds\", \"id\": \"pointclouds\"}, \"last\", false, false);\n\t\tlet measurementID = tree.jstree('create_node', \"#\", { \"text\": \"Measurements\", \"id\": \"measurements\" }, \"last\", false, false);\n\t\tlet annotationsID = tree.jstree('create_node', \"#\", { \"text\": \"Annotations\", \"id\": \"annotations\" }, \"last\", false, false);\n\t\tlet otherID = tree.jstree('create_node', \"#\", { \"text\": \"Other\", \"id\": \"other\" }, \"last\", false, false);\n\t\tlet vectorsID = tree.jstree('create_node', \"#\", { \"text\": \"Vectors\", \"id\": \"vectors\" }, \"last\", false, false);\n\t\tlet imagesID = tree.jstree('create_node', \"#\", { \"text\": \" Images\", \"id\": \"images\" }, \"last\", false, false);\n\n\t\ttree.jstree(\"check_node\", pcID);\n\t\ttree.jstree(\"check_node\", measurementID);\n\t\ttree.jstree(\"check_node\", annotationsID);\n\t\ttree.jstree(\"check_node\", otherID);\n\t\ttree.jstree(\"check_node\", vectorsID);\n\t\ttree.jstree(\"check_node\", imagesID);\n\n\t\ttree.on('create_node.jstree', (e, data) => {\n\t\t\ttree.jstree(\"open_all\");\n\t\t});\n\n\t\ttree.on(\"select_node.jstree\", (e, data) => {\n\t\t\tlet object = data.node.data;\n\t\t\tpropertiesPanel.set(object);\n\n\t\t\tthis.viewer.inputHandler.deselectAll();\n\n\t\t\tif(object instanceof Volume){\n\t\t\t\tthis.viewer.inputHandler.toggleSelection(object);\n\t\t\t}\n\n\t\t\t$(this.viewer.renderer.domElement).focus();\n\t\t});\n\n\t\ttree.on(\"deselect_node.jstree\", (e, data) => {\n\t\t\tpropertiesPanel.set(null);\n\t\t});\n\n\t\ttree.on(\"delete_node.jstree\", (e, data) => {\n\t\t\tpropertiesPanel.set(null);\n\t\t});\n\n\t\ttree.on('dblclick','.jstree-anchor', (e) => {\n\n\t\t\tlet instance = $.jstree.reference(e.target);\n\t\t\tlet node = instance.get_node(e.target);\n\t\t\tlet object = node.data;\n\n\t\t\t// ignore double click on checkbox\n\t\t\tif(e.target.classList.contains(\"jstree-checkbox\")){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(object instanceof PointCloudTree){\n\t\t\t\tlet box = this.viewer.getBoundingBox([object]);\n\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\tnode.boundingBox = box;\n\t\t\t\tthis.viewer.zoomTo(node, 1, 500);\n\t\t\t}else if(object instanceof Measure){\n\t\t\t\tlet points = object.points.map(p => p.position);\n\t\t\t\tlet box = new THREE.Box3().setFromPoints(points);\n\t\t\t\tif(box.getSize(new THREE.Vector3()).length() > 0){\n\t\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\t\tnode.boundingBox = box;\n\t\t\t\t\tthis.viewer.zoomTo(node, 2, 500);\n\t\t\t\t}\n\t\t\t}else if(object instanceof Profile){\n\t\t\t\tlet points = object.points;\n\t\t\t\tlet box = new THREE.Box3().setFromPoints(points);\n\t\t\t\tif(box.getSize(new THREE.Vector3()).length() > 0){\n\t\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\t\tnode.boundingBox = box;\n\t\t\t\t\tthis.viewer.zoomTo(node, 1, 500);\n\t\t\t\t}\n\t\t\t}else if(object instanceof Volume){\n\t\t\t\t\n\t\t\t\tlet box = object.boundingBox.clone().applyMatrix4(object.matrixWorld);\n\n\t\t\t\tif(box.getSize(new THREE.Vector3()).length() > 0){\n\t\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\t\tnode.boundingBox = box;\n\t\t\t\t\tthis.viewer.zoomTo(node, 1, 500);\n\t\t\t\t}\n\t\t\t}else if(object instanceof Annotation){\n\t\t\t\tobject.moveHere(this.viewer.scene.getActiveCamera());\n\t\t\t}else if(object instanceof PolygonClipVolume){\n\t\t\t\tlet dir = object.camera.getWorldDirection(new THREE.Vector3());\n\t\t\t\tlet target;\n\n\t\t\t\tif(object.camera instanceof THREE.OrthographicCamera){\n\t\t\t\t\tdir.multiplyScalar(object.camera.right)\n\t\t\t\t\ttarget = new THREE.Vector3().addVectors(object.camera.position, dir);\n\t\t\t\t\tthis.viewer.setCameraMode(CameraMode.ORTHOGRAPHIC);\n\t\t\t\t}else if(object.camera instanceof THREE.PerspectiveCamera){\n\t\t\t\t\tdir.multiplyScalar(this.viewer.scene.view.radius);\n\t\t\t\t\ttarget = new THREE.Vector3().addVectors(object.camera.position, dir);\n\t\t\t\t\tthis.viewer.setCameraMode(CameraMode.PERSPECTIVE);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.viewer.scene.view.position.copy(object.camera.position);\n\t\t\t\tthis.viewer.scene.view.lookAt(target);\n\t\t\t}else if(object instanceof THREE.SpotLight){\n\t\t\t\tlet distance = (object.distance > 0) ? object.distance / 4 : 5 * 1000;\n\t\t\t\tlet position = object.position;\n\t\t\t\tlet target = new THREE.Vector3().addVectors(\n\t\t\t\t\tposition, \n\t\t\t\t\tobject.getWorldDirection(new THREE.Vector3()).multiplyScalar(distance));\n\n\t\t\t\tthis.viewer.scene.view.position.copy(object.position);\n\t\t\t\tthis.viewer.scene.view.lookAt(target);\n\t\t\t}else if(object instanceof THREE.Object3D){\n\t\t\t\tlet box = new THREE.Box3().setFromObject(object);\n\n\t\t\t\tif(box.getSize(new THREE.Vector3()).length() > 0){\n\t\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\t\tnode.boundingBox = box;\n\t\t\t\t\tthis.viewer.zoomTo(node, 1, 500);\n\t\t\t\t}\n\t\t\t}else if(object instanceof OrientedImage){\n\t\t\t\t// TODO zoom to images\n\n\t\t\t\t// let box = new THREE.Box3().setFromObject(object);\n\n\t\t\t\t// if(box.getSize(new THREE.Vector3()).length() > 0){\n\t\t\t\t// \tlet node = new THREE.Object3D();\n\t\t\t\t// \tnode.boundingBox = box;\n\t\t\t\t// \tthis.viewer.zoomTo(node, 1, 500);\n\t\t\t\t// }\n\t\t\t}else if(object instanceof Images360){\n\t\t\t\t// TODO\n\t\t\t}else if(object instanceof Geopackage){\n\t\t\t\t// TODO\n\t\t\t}\n\t\t});\n\n\t\ttree.on(\"uncheck_node.jstree\", (e, data) => {\n\t\t\tlet object = data.node.data;\n\n\t\t\tif(object){\n\t\t\t\tobject.visible = false;\n\t\t\t}\n\t\t});\n\n\t\ttree.on(\"check_node.jstree\", (e, data) => {\n\t\t\tlet object = data.node.data;\n\n\t\t\tif(object){\n\t\t\t\tobject.visible = true;\n\t\t\t}\n\t\t});\n\n\n\t\tlet onPointCloudAdded = (e) => {\n\t\t\tlet pointcloud = e.pointcloud;\n\t\t\tlet cloudIcon = `${Potree.resourcePath}/icons/cloud.svg`;\n\t\t\tlet node = createNode(pcID, pointcloud.name, cloudIcon, pointcloud);\n\n\t\t\tpointcloud.addEventListener(\"visibility_changed\", () => {\n\t\t\t\tif(pointcloud.visible){\n\t\t\t\t\ttree.jstree('check_node', node);\n\t\t\t\t}else{\n\t\t\t\t\ttree.jstree('uncheck_node', node);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tlet onMeasurementAdded = (e) => {\n\t\t\tlet measurement = e.measurement;\n\t\t\tlet icon = Utils.getMeasurementIcon(measurement);\n\t\t\tcreateNode(measurementID, measurement.name, icon, measurement);\n\t\t};\n\n\t\tlet onVolumeAdded = (e) => {\n\t\t\tlet volume = e.volume;\n\t\t\tlet icon = Utils.getMeasurementIcon(volume);\n\t\t\tlet node = createNode(measurementID, volume.name, icon, volume);\n\n\t\t\tvolume.addEventListener(\"visibility_changed\", () => {\n\t\t\t\tif(volume.visible){\n\t\t\t\t\ttree.jstree('check_node', node);\n\t\t\t\t}else{\n\t\t\t\t\ttree.jstree('uncheck_node', node);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tlet onProfileAdded = (e) => {\n\t\t\tlet profile = e.profile;\n\t\t\tlet icon = Utils.getMeasurementIcon(profile);\n\t\t\tcreateNode(measurementID, profile.name, icon, profile);\n\t\t};\n\n\t\tlet onAnnotationAdded = (e) => {\n\t\t\tlet annotation = e.annotation;\n\n\t\t\tlet annotationIcon = `${Potree.resourcePath}/icons/annotation.svg`;\n\t\t\tlet parentID = this.annotationMapping.get(annotation.parent);\n\t\t\tlet annotationID = createNode(parentID, annotation.title, annotationIcon, annotation);\n\t\t\tthis.annotationMapping.set(annotation, annotationID);\n\n\t\t\tannotation.addEventListener(\"annotation_changed\", (e) => {\n\t\t\t\tlet annotationsRoot = $(\"#jstree_scene\").jstree().get_json(\"annotations\");\n\t\t\t\tlet jsonNode = annotationsRoot.children.find(child => child.data.uuid === annotation.uuid);\n\t\t\t\t\n\t\t\t\t$.jstree.reference(jsonNode.id).rename_node(jsonNode.id, annotation.title);\n\t\t\t});\n\t\t};\n\n\t\tlet onCameraAnimationAdded = (e) => {\n\t\t\tconst animation = e.animation;\n\n\t\t\tconst animationIcon = `${Potree.resourcePath}/icons/camera_animation.svg`;\n\t\t\tcreateNode(otherID, \"animation\", animationIcon, animation);\n\t\t};\n\n\t\tlet onOrientedImagesAdded = (e) => {\n\t\t\tconst images = e.images;\n\n\t\t\tconst imagesIcon = `${Potree.resourcePath}/icons/picture.svg`;\n\t\t\tconst node = createNode(imagesID, \"images\", imagesIcon, images);\n\n\t\t\timages.addEventListener(\"visibility_changed\", () => {\n\t\t\t\tif(images.visible){\n\t\t\t\t\ttree.jstree('check_node', node);\n\t\t\t\t}else{\n\t\t\t\t\ttree.jstree('uncheck_node', node);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tlet onImages360Added = (e) => {\n\t\t\tconst images = e.images;\n\n\t\t\tconst imagesIcon = `${Potree.resourcePath}/icons/picture.svg`;\n\t\t\tconst node = createNode(imagesID, \"360° images\", imagesIcon, images);\n\n\t\t\timages.addEventListener(\"visibility_changed\", () => {\n\t\t\t\tif(images.visible){\n\t\t\t\t\ttree.jstree('check_node', node);\n\t\t\t\t}else{\n\t\t\t\t\ttree.jstree('uncheck_node', node);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst onGeopackageAdded = (e) => {\n\t\t\tconst geopackage = e.geopackage;\n\n\t\t\tconst geopackageIcon = `${Potree.resourcePath}/icons/triangle.svg`;\n\t\t\tconst tree = $(`#jstree_scene`);\n\t\t\tconst parentNode = \"vectors\";\n\n\t\t\tfor(const layer of geopackage.node.children){\n\t\t\t\tconst name = layer.name;\n\n\t\t\t\tlet shpPointsID = tree.jstree('create_node', parentNode, { \n\t\t\t\t\t\t\"text\": name, \n\t\t\t\t\t\t\"icon\": geopackageIcon,\n\t\t\t\t\t\t\"object\": layer,\n\t\t\t\t\t\t\"data\": layer,\n\t\t\t\t\t}, \n\t\t\t\t\t\"last\", false, false);\n\t\t\t\ttree.jstree(layer.visible ? \"check_node\" : \"uncheck_node\", shpPointsID);\n\t\t\t}\n\n\t\t};\n\n\t\tthis.viewer.scene.addEventListener(\"pointcloud_added\", onPointCloudAdded);\n\t\tthis.viewer.scene.addEventListener(\"measurement_added\", onMeasurementAdded);\n\t\tthis.viewer.scene.addEventListener(\"profile_added\", onProfileAdded);\n\t\tthis.viewer.scene.addEventListener(\"volume_added\", onVolumeAdded);\n\t\tthis.viewer.scene.addEventListener(\"camera_animation_added\", onCameraAnimationAdded);\n\t\tthis.viewer.scene.addEventListener(\"oriented_images_added\", onOrientedImagesAdded);\n\t\tthis.viewer.scene.addEventListener(\"360_images_added\", onImages360Added);\n\t\tthis.viewer.scene.addEventListener(\"geopackage_added\", onGeopackageAdded);\n\t\tthis.viewer.scene.addEventListener(\"polygon_clip_volume_added\", onVolumeAdded);\n\t\tthis.viewer.scene.annotations.addEventListener(\"annotation_added\", onAnnotationAdded);\n\n\t\tlet onMeasurementRemoved = (e) => {\n\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.measurement.uuid);\n\t\t\t\n\t\t\ttree.jstree(\"delete_node\", jsonNode.id);\n\t\t};\n\n\t\tlet onVolumeRemoved = (e) => {\n\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.volume.uuid);\n\t\t\t\n\t\t\ttree.jstree(\"delete_node\", jsonNode.id);\n\t\t};\n\n\t\tlet onPolygonClipVolumeRemoved = (e) => {\n\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.volume.uuid);\n\t\t\t\n\t\t\ttree.jstree(\"delete_node\", jsonNode.id);\n\t\t};\n\n\t\tlet onProfileRemoved = (e) => {\n\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.profile.uuid);\n\t\t\t\n\t\t\ttree.jstree(\"delete_node\", jsonNode.id);\n\t\t};\n\n\t\tthis.viewer.scene.addEventListener(\"measurement_removed\", onMeasurementRemoved);\n\t\tthis.viewer.scene.addEventListener(\"volume_removed\", onVolumeRemoved);\n\t\tthis.viewer.scene.addEventListener(\"polygon_clip_volume_removed\", onPolygonClipVolumeRemoved);\n\t\tthis.viewer.scene.addEventListener(\"profile_removed\", onProfileRemoved);\n\n\t\t{\n\t\t\tlet annotationIcon = `${Potree.resourcePath}/icons/annotation.svg`;\n\t\t\tthis.annotationMapping = new Map(); \n\t\t\tthis.annotationMapping.set(this.viewer.scene.annotations, annotationsID);\n\t\t\tthis.viewer.scene.annotations.traverseDescendants(annotation => {\n\t\t\t\tlet parentID = this.annotationMapping.get(annotation.parent);\n\t\t\t\tlet annotationID = createNode(parentID, annotation.title, annotationIcon, annotation);\n\t\t\t\tthis.annotationMapping.set(annotation, annotationID);\n\t\t\t});\n\t\t}\n\n\t\tconst scene = this.viewer.scene;\n\t\tfor(let pointcloud of scene.pointclouds){\n\t\t\tonPointCloudAdded({pointcloud: pointcloud});\n\t\t}\n\n\t\tfor(let measurement of scene.measurements){\n\t\t\tonMeasurementAdded({measurement: measurement});\n\t\t}\n\n\t\tfor(let volume of [...scene.volumes, ...scene.polygonClipVolumes]){\n\t\t\tonVolumeAdded({volume: volume});\n\t\t}\n\n\t\tfor(let animation of scene.cameraAnimations){\n\t\t\tonCameraAnimationAdded({animation: animation});\n\t\t}\n\n\t\tfor(let images of scene.orientedImages){\n\t\t\tonOrientedImagesAdded({images: images});\n\t\t}\n\n\t\tfor(let images of scene.images360){\n\t\t\tonImages360Added({images: images});\n\t\t}\n\n\t\tfor(const geopackage of scene.geopackages){\n\t\t\tonGeopackageAdded({geopackage: geopackage});\n\t\t}\n\n\t\tfor(let profile of scene.profiles){\n\t\t\tonProfileAdded({profile: profile});\n\t\t}\n\n\t\t{\n\t\t\tcreateNode(otherID, \"Camera\", null, new THREE.Camera());\n\t\t}\n\n\t\tthis.viewer.addEventListener(\"scene_changed\", (e) => {\n\t\t\tpropertiesPanel.setScene(e.scene);\n\n\t\t\te.oldScene.removeEventListener(\"pointcloud_added\", onPointCloudAdded);\n\t\t\te.oldScene.removeEventListener(\"measurement_added\", onMeasurementAdded);\n\t\t\te.oldScene.removeEventListener(\"profile_added\", onProfileAdded);\n\t\t\te.oldScene.removeEventListener(\"volume_added\", onVolumeAdded);\n\t\t\te.oldScene.removeEventListener(\"polygon_clip_volume_added\", onVolumeAdded);\n\t\t\te.oldScene.removeEventListener(\"measurement_removed\", onMeasurementRemoved);\n\n\t\t\te.scene.addEventListener(\"pointcloud_added\", onPointCloudAdded);\n\t\t\te.scene.addEventListener(\"measurement_added\", onMeasurementAdded);\n\t\t\te.scene.addEventListener(\"profile_added\", onProfileAdded);\n\t\t\te.scene.addEventListener(\"volume_added\", onVolumeAdded);\n\t\t\te.scene.addEventListener(\"polygon_clip_volume_added\", onVolumeAdded);\n\t\t\te.scene.addEventListener(\"measurement_removed\", onMeasurementRemoved);\n\t\t});\n\n\t}\n\n\tinitClippingTool(){\n\n\n\t\tthis.viewer.addEventListener(\"cliptask_changed\", (event) => {\n\t\t\tconsole.log(\"TODO\");\n\t\t});\n\n\t\tthis.viewer.addEventListener(\"clipmethod_changed\", (event) => {\n\t\t\tconsole.log(\"TODO\");\n\t\t});\n\n\t\t{\n\t\t\tlet elClipTask = $(\"#cliptask_options\");\n\t\t\telClipTask.selectgroup({title: \"Clip Task\"});\n\n\t\t\telClipTask.find(\"input\").click( (e) => {\n\t\t\t\tthis.viewer.setClipTask(ClipTask[e.target.value]);\n\t\t\t});\n\n\t\t\tlet currentClipTask = Object.keys(ClipTask)\n\t\t\t\t.filter(key => ClipTask[key] === this.viewer.clipTask);\n\t\t\telClipTask.find(`input[value=${currentClipTask}]`).trigger(\"click\");\n\t\t}\n\n\t\t{\n\t\t\tlet elClipMethod = $(\"#clipmethod_options\");\n\t\t\telClipMethod.selectgroup({title: \"Clip Method\"});\n\n\t\t\telClipMethod.find(\"input\").click( (e) => {\n\t\t\t\tthis.viewer.setClipMethod(ClipMethod[e.target.value]);\n\t\t\t});\n\n\t\t\tlet currentClipMethod = Object.keys(ClipMethod)\n\t\t\t\t.filter(key => ClipMethod[key] === this.viewer.clipMethod);\n\t\t\telClipMethod.find(`input[value=${currentClipMethod}]`).trigger(\"click\");\n\t\t}\n\n\t\tlet clippingToolBar = $(\"#clipping_tools\");\n\n\t\t// CLIP VOLUME\n\t\tclippingToolBar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/clip_volume.svg',\n\t\t\t'[title]tt.clip_volume',\n\t\t\t() => {\n\t\t\t\tlet item = this.volumeTool.startInsertion({clip: true}); \n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// CLIP POLYGON\n\t\tclippingToolBar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/clip-polygon.svg\",\n\t\t\t\"[title]tt.clip_polygon\",\n\t\t\t() => {\n\t\t\t\tlet item = this.viewer.clippingTool.startInsertion({type: \"polygon\"});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t{// SCREEN BOX SELECT\n\t\t\tlet boxSelectTool = new ScreenBoxSelectTool(this.viewer);\n\n\t\t\tclippingToolBar.append(this.createToolIcon(\n\t\t\t\tPotree.resourcePath + \"/icons/clip-screen.svg\",\n\t\t\t\t\"[title]tt.screen_clip_box\",\n\t\t\t\t() => {\n\t\t\t\t\tif(!(this.viewer.scene.getActiveCamera() instanceof THREE.OrthographicCamera)){\n\t\t\t\t\t\tthis.viewer.postMessage(`Switch to Orthographic Camera Mode before using the Screen-Box-Select tool.`, \n\t\t\t\t\t\t\t{duration: 2000});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet item = boxSelectTool.startInsertion();\n\n\t\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid);\n\t\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\n\t\t{ // REMOVE CLIPPING TOOLS\n\t\t\tclippingToolBar.append(this.createToolIcon(\n\t\t\t\tPotree.resourcePath + \"/icons/remove.svg\",\n\t\t\t\t\"[title]tt.remove_all_measurement\",\n\t\t\t\t() => {\n\n\t\t\t\t\tthis.viewer.scene.removeAllClipVolumes();\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\n\t}\n\n\tinitFilters(){\n\t\tthis.initClassificationList();\n\t\tthis.initReturnFilters();\n\t\tthis.initGPSTimeFilters();\n\t\tthis.initPointSourceIDFilters();\n\n\t}\n\n\tinitReturnFilters(){\n\t\tlet elReturnFilterPanel = $('#return_filter_panel');\n\n\t\t{ // RETURN NUMBER\n\t\t\tlet sldReturnNumber = elReturnFilterPanel.find('#sldReturnNumber');\n\t\t\tlet lblReturnNumber = elReturnFilterPanel.find('#lblReturnNumber');\n\n\t\t\tsldReturnNumber.slider({\n\t\t\t\trange: true,\n\t\t\t\tmin: 0, max: 7, step: 1,\n\t\t\t\tvalues: [0, 7],\n\t\t\t\tslide: (event, ui) => {\n\t\t\t\t\tthis.viewer.setFilterReturnNumberRange(ui.values[0], ui.values[1])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet onReturnNumberChanged = (event) => {\n\t\t\t\tlet [from, to] = this.viewer.filterReturnNumberRange;\n\n\t\t\t\tlblReturnNumber[0].innerHTML = `${from} to ${to}`;\n\t\t\t\tsldReturnNumber.slider({values: [from, to]});\n\t\t\t};\n\n\t\t\tthis.viewer.addEventListener('filter_return_number_range_changed', onReturnNumberChanged);\n\n\t\t\tonReturnNumberChanged();\n\t\t}\n\n\t\t{ // NUMBER OF RETURNS\n\t\t\tlet sldNumberOfReturns = elReturnFilterPanel.find('#sldNumberOfReturns');\n\t\t\tlet lblNumberOfReturns = elReturnFilterPanel.find('#lblNumberOfReturns');\n\n\t\t\tsldNumberOfReturns.slider({\n\t\t\t\trange: true,\n\t\t\t\tmin: 0, max: 7, step: 1,\n\t\t\t\tvalues: [0, 7],\n\t\t\t\tslide: (event, ui) => {\n\t\t\t\t\tthis.viewer.setFilterNumberOfReturnsRange(ui.values[0], ui.values[1])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet onNumberOfReturnsChanged = (event) => {\n\t\t\t\tlet [from, to] = this.viewer.filterNumberOfReturnsRange;\n\n\t\t\t\tlblNumberOfReturns[0].innerHTML = `${from} to ${to}`;\n\t\t\t\tsldNumberOfReturns.slider({values: [from, to]});\n\t\t\t};\n\n\t\t\tthis.viewer.addEventListener('filter_number_of_returns_range_changed', onNumberOfReturnsChanged);\n\n\t\t\tonNumberOfReturnsChanged();\n\t\t}\n\t}\n\n\tinitGPSTimeFilters(){\n\n\t\tlet elGPSTimeFilterPanel = $('#gpstime_filter_panel');\n\n\t\t{\n\t\t\tlet slider = new HierarchicalSlider({\n\t\t\t\tlevels: 4,\n\t\t\t\tslide: (event) => {\n\t\t\t\t\tthis.viewer.setFilterGPSTimeRange(...event.values);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tlet initialized = false;\n\n\t\t\tlet initialize = () => {\n\t\t\t\t\n\t\t\t\tlet elRangeContainer = $(\"#gpstime_multilevel_range_container\");\n\t\t\t\telRangeContainer[0].prepend(slider.element);\n\n\t\t\t\tlet extent = this.viewer.getGpsTimeExtent();\n\n\t\t\t\tslider.setRange(extent);\n\t\t\t\tslider.setValues(extent);\n\n\n\t\t\t\tinitialized = true;\n\t\t\t};\n\n\t\t\tthis.viewer.addEventListener(\"update\", (e) => {\n\t\t\t\tlet extent = this.viewer.getGpsTimeExtent();\n\t\t\t\tlet gpsTimeAvailable = extent[0] !== Infinity;\n\n\t\t\t\tif(!initialized && gpsTimeAvailable){\n\t\t\t\t\tinitialize();\n\t\t\t\t}\n\n\t\t\t\tslider.setRange(extent);\n\t\t\t});\n\t\t}\n\n\n\t\t{\n\t\t\t\n\t\t\tconst txtGpsTime = elGPSTimeFilterPanel.find(\"#txtGpsTime\");\n\t\t\tconst btnFindGpsTime = elGPSTimeFilterPanel.find(\"#btnFindGpsTime\");\n\n\t\t\tlet targetTime = null;\n\n\t\t\ttxtGpsTime.on(\"input\", (e) => {\n\t\t\t\tconst str = txtGpsTime.val();\n\n\t\t\t\tif(!isNaN(str)){\n\t\t\t\t\tconst value = parseFloat(str);\n\t\t\t\t\ttargetTime = value;\n\n\t\t\t\t\ttxtGpsTime.css(\"background-color\", \"\")\n\t\t\t\t}else{\n\t\t\t\t\ttargetTime = null;\n\n\t\t\t\t\ttxtGpsTime.css(\"background-color\", \"#ff9999\")\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t\tbtnFindGpsTime.click( () => {\n\t\t\t\t\n\t\t\t\tif(targetTime !== null){\n\t\t\t\t\tviewer.moveToGpsTimeVicinity(targetTime);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t}\n\n\tinitPointSourceIDFilters() {\n\t\tlet elPointSourceIDFilterPanel = $('#pointsourceid_filter_panel');\n\n\t\t{\n\t\t\tlet slider = new HierarchicalSlider({\n\t\t\t\tlevels: 4,\n\t\t\t\trange: [0, 65535],\n\t\t\t\tprecision: 1,\n\t\t\t\tslide: (event) => {\n\t\t\t\t\tlet values = event.values;\n\t\t\t\t\tthis.viewer.setFilterPointSourceIDRange(values[0], values[1]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet initialized = false;\n\n\t\t\tlet initialize = () => {\n\t\t\t\telPointSourceIDFilterPanel[0].prepend(slider.element);\n\n\t\t\t\tinitialized = true;\n\t\t\t};\n\n\t\t\tthis.viewer.addEventListener(\"update\", (e) => {\n\t\t\t\tlet extent = this.viewer.filterPointSourceIDRange;\n\n\t\t\t\tif(!initialized){\n\t\t\t\t\tinitialize();\n\n\t\t\t\t\tslider.setValues(extent);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t}\n\n\t\t// let lblPointSourceID = elPointSourceIDFilterPanel.find(\"#lblPointSourceID\");\n\t\t// let elPointSourceID = elPointSourceIDFilterPanel.find(\"#spnPointSourceID\");\n\n\t\t// let slider = new ZoomableSlider();\n\t\t// elPointSourceID[0].appendChild(slider.element);\n\t\t// slider.update();\n\n\t\t// slider.change( () => {\n\t\t// \tlet range = slider.chosenRange;\n\t\t// \tthis.viewer.setFilterPointSourceIDRange(range[0], range[1]);\n\t\t// });\n\n\t\t// let onPointSourceIDExtentChanged = (event) => {\n\t\t// \tlet range = this.viewer.filterPointSourceIDExtent;\n\t\t// \tslider.setVisibleRange(range);\n\t\t// };\n\n\t\t// let onPointSourceIDChanged = (event) => {\n\t\t// \tlet range = this.viewer.filterPointSourceIDRange;\n\n\t\t// \tlet precision = 1;\n\t\t// \tlet from = `${Utils.addCommas(range[0].toFixed(precision))}`;\n\t\t// \tlet to = `${Utils.addCommas(range[1].toFixed(precision))}`;\n\t\t// \tlblPointSourceID[0].innerHTML = `${from} to ${to}`;\n\n\t\t// \tslider.setRange(range);\n\t\t// };\n\n\t\t// this.viewer.addEventListener('filter_point_source_id_range_changed', onPointSourceIDChanged);\n\t\t// this.viewer.addEventListener('filter_point_source_id_extent_changed', onPointSourceIDExtentChanged);\n\n\t}\n\n\tinitClassificationList(){\n\t\tlet elClassificationList = $('#classificationList');\n\n\t\tlet addClassificationItem = (code, name) => {\n\t\t\tconst classification = this.viewer.classifications[code];\n\t\t\tconst inputID = 'chkClassification_' + code;\n\t\t\tconst colorPickerID = 'colorPickerClassification_' + code;\n\n\t\t\tconst checked = classification.visible ? \"checked\" : \"\";\n\n\t\t\tlet element = $(`\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
  • \n\t\t\t`);\n\n\t\t\tconst elInput = element.find('input');\n\t\t\tconst elColorPicker = element.find(`#${colorPickerID}`);\n\n\t\t\telInput.click(event => {\n\t\t\t\tthis.viewer.setClassificationVisibility(code, event.target.checked);\n\t\t\t});\n\n\t\t\tlet defaultColor = classification.color.map(c => c * 255).join(\", \");\n\t\t\tdefaultColor = `rgb(${defaultColor})`;\n\n\n\t\t\telColorPicker.spectrum({\n\t\t\t\t// flat: true,\n\t\t\t\tcolor: defaultColor,\n\t\t\t\tshowInput: true,\n\t\t\t\tpreferredFormat: 'rgb',\n\t\t\t\tcancelText: '',\n\t\t\t\tchooseText: 'Apply',\n\t\t\t\tmove: color => {\n\t\t\t\t\tlet rgb = color.toRgb();\n\t\t\t\t\tconst c = [rgb.r / 255, rgb.g / 255, rgb.b / 255, 1];\n\t\t\t\t\tclassification.color = c;\n\t\t\t\t},\n\t\t\t\tchange: color => {\n\t\t\t\t\tlet rgb = color.toRgb();\n\t\t\t\t\tconst c = [rgb.r / 255, rgb.g / 255, rgb.b / 255, 1];\n\t\t\t\t\tclassification.color = c;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\telClassificationList.append(element);\n\t\t};\n\n\t\tconst addToggleAllButton = () => { // toggle all button\n\t\t\tconst element = $(`\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
  • \n\t\t\t`);\n\n\t\t\tlet elInput = element.find('input');\n\n\t\t\telInput.click(event => {\n\t\t\t\tthis.viewer.toggleAllClassificationsVisibility();\n\t\t\t});\n\n\t\t\telClassificationList.append(element);\n\t\t}\n\n\t\tconst addInvertButton = () => { \n\t\t\tconst element = $(`\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
  • \n\t\t\t`);\n\n\t\t\tlet elInput = element.find('input');\n\n\t\t\telInput.click( () => {\n\t\t\t\tconst classifications = this.viewer.classifications;\n\t\n\t\t\t\tfor(let key of Object.keys(classifications)){\n\t\t\t\t\tlet value = classifications[key];\n\t\t\t\t\tthis.viewer.setClassificationVisibility(key, !value.visible);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\telClassificationList.append(element);\n\t\t};\n\n\t\tconst populate = () => {\n\t\t\taddToggleAllButton();\n\t\t\tfor (let classID in this.viewer.classifications) {\n\t\t\t\taddClassificationItem(classID, this.viewer.classifications[classID].name);\n\t\t\t}\n\t\t\taddInvertButton();\n\t\t};\n\n\t\tpopulate();\n\n\t\tthis.viewer.addEventListener(\"classifications_changed\", () => {\n\t\t\telClassificationList.empty();\n\t\t\tpopulate();\n\t\t});\n\n\t\tthis.viewer.addEventListener(\"classification_visibility_changed\", () => {\n\n\t\t\t{ // set checked state of classification buttons\n\t\t\t\tfor(const classID of Object.keys(this.viewer.classifications)){\n\t\t\t\t\tconst classValue = this.viewer.classifications[classID];\n\n\t\t\t\t\tlet elItem = elClassificationList.find(`#chkClassification_${classID}`);\n\t\t\t\t\telItem.prop(\"checked\", classValue.visible);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t{ // set checked state of toggle button based on state of all other buttons\n\t\t\t\tlet numVisible = 0;\n\t\t\t\tlet numItems = 0;\n\t\t\t\tfor(const key of Object.keys(this.viewer.classifications)){\n\t\t\t\t\tif(this.viewer.classifications[key].visible){\n\t\t\t\t\t\tnumVisible++;\n\t\t\t\t\t}\n\t\t\t\t\tnumItems++;\n\t\t\t\t}\n\t\t\t\tconst allVisible = numVisible === numItems;\n\n\t\t\t\tlet elToggle = elClassificationList.find(\"#toggleClassificationFilters\");\n\t\t\t\telToggle.prop(\"checked\", allVisible);\n\t\t\t}\n\t\t});\n\t}\n\n\tinitAccordion(){\n\t\t$('.accordion > h3').each(function(){\n\t\t\tlet header = $(this);\n\t\t\tlet content = $(this).next();\n\n\t\t\t//header.addClass('accordion-header ui-widget');\n\t\t\t//content.addClass('accordion-content ui-widget');\n\n\t\t\tcontent.hide();\n\n\t\t\theader.click(() => {\n\t\t\t\tcontent.slideToggle();\n\t\t\t});\n\t\t});\n\n\t\tlet languages = [\n\t\t\t[\"EN\", \"en\"],\n\t\t\t[\"FR\", \"fr\"],\n\t\t\t[\"DE\", \"de\"],\n\t\t\t[\"JP\", \"jp\"],\n\t\t\t[\"ES\", \"es\"],\n\t\t\t[\"SE\", \"se\"]\n\t\t];\n\n\t\tlet elLanguages = $('#potree_languages');\n\t\tfor(let i = 0; i < languages.length; i++){\n\t\t\tlet [key, value] = languages[i];\n\t\t\tlet element = $(`${key}`);\n\t\t\telement.click(() => this.viewer.setLanguage(value));\n\n\t\t\tif(i === 0){\n\t\t\t\telement.css(\"margin-left\", \"30px\");\n\t\t\t}\n\t\t\t\n\t\t\telLanguages.append(element);\n\n\t\t\tif(i < languages.length - 1){\n\t\t\t\telLanguages.append($(document.createTextNode(' - ')));\t\n\t\t\t}\n\t\t}\n\n\n\t\t// to close all, call\n\t\t// $(\".accordion > div\").hide()\n\n\t\t// to open the, for example, tool menu, call:\n\t\t// $(\"#menu_tools\").next().show()\n\t}\n\n\tinitAppearance(){\n\n\t\tconst sldPointBudget = this.dom.find('#sldPointBudget');\n\n\t\tsldPointBudget.slider({\n\t\t\tvalue: this.viewer.getPointBudget(),\n\t\t\tmin: 100 * 1000,\n\t\t\tmax: 10 * 1000 * 1000,\n\t\t\tstep: 1000,\n\t\t\tslide: (event, ui) => { this.viewer.setPointBudget(ui.value); }\n\t\t});\n\n\t\tthis.dom.find('#sldFOV').slider({\n\t\t\tvalue: this.viewer.getFOV(),\n\t\t\tmin: 20,\n\t\t\tmax: 100,\n\t\t\tstep: 1,\n\t\t\tslide: (event, ui) => { this.viewer.setFOV(ui.value); }\n\t\t});\n\n\t\t$('#sldEDLRadius').slider({\n\t\t\tvalue: this.viewer.getEDLRadius(),\n\t\t\tmin: 1,\n\t\t\tmax: 4,\n\t\t\tstep: 0.01,\n\t\t\tslide: (event, ui) => { this.viewer.setEDLRadius(ui.value); }\n\t\t});\n\n\t\t$('#sldEDLStrength').slider({\n\t\t\tvalue: this.viewer.getEDLStrength(),\n\t\t\tmin: 0,\n\t\t\tmax: 5,\n\t\t\tstep: 0.01,\n\t\t\tslide: (event, ui) => { this.viewer.setEDLStrength(ui.value); }\n\t\t});\n\n\t\t$('#sldEDLOpacity').slider({\n\t\t\tvalue: this.viewer.getEDLOpacity(),\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\tstep: 0.01,\n\t\t\tslide: (event, ui) => { this.viewer.setEDLOpacity(ui.value); }\n\t\t});\n\n\t\tthis.viewer.addEventListener('point_budget_changed', (event) => {\n\t\t\t$('#lblPointBudget')[0].innerHTML = Utils.addCommas(this.viewer.getPointBudget());\n\t\t\tsldPointBudget.slider({value: this.viewer.getPointBudget()});\n\t\t});\n\n\t\tthis.viewer.addEventListener('fov_changed', (event) => {\n\t\t\t$('#lblFOV')[0].innerHTML = parseInt(this.viewer.getFOV());\n\t\t\t$('#sldFOV').slider({value: this.viewer.getFOV()});\n\t\t});\n\n\t\tthis.viewer.addEventListener('use_edl_changed', (event) => {\n\t\t\t$('#chkEDLEnabled')[0].checked = this.viewer.getEDLEnabled();\n\t\t});\n\n\t\tthis.viewer.addEventListener('edl_radius_changed', (event) => {\n\t\t\t$('#lblEDLRadius')[0].innerHTML = this.viewer.getEDLRadius().toFixed(1);\n\t\t\t$('#sldEDLRadius').slider({value: this.viewer.getEDLRadius()});\n\t\t});\n\n\t\tthis.viewer.addEventListener('edl_strength_changed', (event) => {\n\t\t\t$('#lblEDLStrength')[0].innerHTML = this.viewer.getEDLStrength().toFixed(1);\n\t\t\t$('#sldEDLStrength').slider({value: this.viewer.getEDLStrength()});\n\t\t});\n\n\t\tthis.viewer.addEventListener('background_changed', (event) => {\n\t\t\t$(\"input[name=background][value='\" + this.viewer.getBackground() + \"']\").prop('checked', true);\n\t\t});\n\n\t\t$('#lblPointBudget')[0].innerHTML = Utils.addCommas(this.viewer.getPointBudget());\n\t\t$('#lblFOV')[0].innerHTML = parseInt(this.viewer.getFOV());\n\t\t$('#lblEDLRadius')[0].innerHTML = this.viewer.getEDLRadius().toFixed(1);\n\t\t$('#lblEDLStrength')[0].innerHTML = this.viewer.getEDLStrength().toFixed(1);\n\t\t$('#chkEDLEnabled')[0].checked = this.viewer.getEDLEnabled();\n\t\t\n\t\t{\n\t\t\tlet elBackground = $(`#background_options`);\n\t\t\telBackground.selectgroup();\n\n\t\t\telBackground.find(\"input\").click( (e) => {\n\t\t\t\tthis.viewer.setBackground(e.target.value);\n\t\t\t});\n\n\t\t\tlet currentBackground = this.viewer.getBackground();\n\t\t\t$(`input[name=background_options][value=${currentBackground}]`).trigger(\"click\");\n\t\t}\n\n\t\t$('#chkEDLEnabled').click( () => {\n\t\t\tthis.viewer.setEDLEnabled($('#chkEDLEnabled').prop(\"checked\"));\n\t\t});\n\t}\n\n\tinitNavigation(){\n\t\tlet elNavigation = $('#navigation');\n\t\tlet sldMoveSpeed = $('#sldMoveSpeed');\n\t\tlet lblMoveSpeed = $('#lblMoveSpeed');\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/earth_controls_1.png',\n\t\t\t'[title]tt.earth_control',\n\t\t\t() => { this.viewer.setControls(this.viewer.earthControls); }\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/fps_controls.svg',\n\t\t\t'[title]tt.flight_control',\n\t\t\t() => {\n\t\t\t\tthis.viewer.setControls(this.viewer.fpControls);\n\t\t\t\tthis.viewer.fpControls.lockElevation = false;\n\t\t\t}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/helicopter_controls.svg',\n\t\t\t'[title]tt.heli_control',\n\t\t\t() => { \n\t\t\t\tthis.viewer.setControls(this.viewer.fpControls);\n\t\t\t\tthis.viewer.fpControls.lockElevation = true;\n\t\t\t}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/orbit_controls.svg',\n\t\t\t'[title]tt.orbit_control',\n\t\t\t() => { this.viewer.setControls(this.viewer.orbitControls); }\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/focus.svg',\n\t\t\t'[title]tt.focus_control',\n\t\t\t() => { this.viewer.fitToScreen(); }\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/navigation_cube.svg\",\n\t\t\t\"[title]tt.navigation_cube_control\",\n\t\t\t() => {this.viewer.toggleNavigationCube()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/images/compas.svg\",\n\t\t\t\"[title]tt.compass\",\n\t\t\t() => {\n\t\t\t\tconst visible = !this.viewer.compass.isVisible();\n\t\t\t\tthis.viewer.compass.setVisible(visible);\n\t\t\t}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/camera_animation.svg\",\n\t\t\t\"[title]tt.camera_animation\",\n\t\t\t() => {\n\t\t\t\tconst animation = CameraAnimation.defaultFromView(this.viewer);\n\n\t\t\t\tviewer.scene.addCameraAnimation(animation);\n\t\t\t}\n\t\t));\n\n\n\t\telNavigation.append(\"
    \");\n\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/left.svg\",\n\t\t\t\"[title]tt.left_view_control\",\n\t\t\t() => {this.viewer.setLeftView()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/right.svg\",\n\t\t\t\"[title]tt.right_view_control\",\n\t\t\t() => {this.viewer.setRightView()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/front.svg\",\n\t\t\t\"[title]tt.front_view_control\",\n\t\t\t() => {this.viewer.setFrontView()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/back.svg\",\n\t\t\t\"[title]tt.back_view_control\",\n\t\t\t() => {this.viewer.setBackView()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/top.svg\",\n\t\t\t\"[title]tt.top_view_control\",\n\t\t\t() => {this.viewer.setTopView()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/bottom.svg\",\n\t\t\t\"[title]tt.bottom_view_control\",\n\t\t\t() => {this.viewer.setBottomView()}\n\t\t));\n\n\n\n\n\n\t\tlet elCameraProjection = $(`\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t`);\n\t\telNavigation.append(elCameraProjection);\n\t\telCameraProjection.selectgroup({title: \"Camera Projection\"});\n\t\telCameraProjection.find(\"input\").click( (e) => {\n\t\t\tthis.viewer.setCameraMode(CameraMode[e.target.value]);\n\t\t});\n\t\tlet cameraMode = Object.keys(CameraMode)\n\t\t\t.filter(key => CameraMode[key] === this.viewer.scene.cameraMode);\n\t\telCameraProjection.find(`input[value=${cameraMode}]`).trigger(\"click\");\n\n\t\tlet speedRange = new THREE.Vector2(1, 10 * 1000);\n\n\t\tlet toLinearSpeed = (value) => {\n\t\t\treturn Math.pow(value, 4) * speedRange.y + speedRange.x;\n\t\t};\n\n\t\tlet toExpSpeed = (value) => {\n\t\t\treturn Math.pow((value - speedRange.x) / speedRange.y, 1 / 4);\n\t\t};\n\n\t\tsldMoveSpeed.slider({\n\t\t\tvalue: toExpSpeed(this.viewer.getMoveSpeed()),\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\tstep: 0.01,\n\t\t\tslide: (event, ui) => { this.viewer.setMoveSpeed(toLinearSpeed(ui.value)); }\n\t\t});\n\n\t\tthis.viewer.addEventListener('move_speed_changed', (event) => {\n\t\t\tlblMoveSpeed.html(this.viewer.getMoveSpeed().toFixed(1));\n\t\t\tsldMoveSpeed.slider({value: toExpSpeed(this.viewer.getMoveSpeed())});\n\t\t});\n\n\t\tlblMoveSpeed.html(this.viewer.getMoveSpeed().toFixed(1));\n\t}\n\n\n\tinitSettings(){\n\n\t\t{\n\t\t\t$('#sldMinNodeSize').slider({\n\t\t\t\tvalue: this.viewer.getMinNodeSize(),\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 1000,\n\t\t\t\tstep: 0.01,\n\t\t\t\tslide: (event, ui) => { this.viewer.setMinNodeSize(ui.value); }\n\t\t\t});\n\n\t\t\tthis.viewer.addEventListener('minnodesize_changed', (event) => {\n\t\t\t\t$('#lblMinNodeSize').html(parseInt(this.viewer.getMinNodeSize()));\n\t\t\t\t$('#sldMinNodeSize').slider({value: this.viewer.getMinNodeSize()});\n\t\t\t});\n\t\t\t$('#lblMinNodeSize').html(parseInt(this.viewer.getMinNodeSize()));\n\t\t}\n\n\t\t{\n\t\t\tlet elSplatQuality = $(\"#splat_quality_options\");\n\t\t\telSplatQuality.selectgroup({title: \"Splat Quality\"});\n\n\t\t\telSplatQuality.find(\"input\").click( (e) => {\n\t\t\t\tif(e.target.value === \"standard\"){\n\t\t\t\t\tthis.viewer.useHQ = false;\n\t\t\t\t}else if(e.target.value === \"hq\"){\n\t\t\t\t\tthis.viewer.useHQ = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet currentQuality = this.viewer.useHQ ? \"hq\" : \"standard\";\n\t\t\telSplatQuality.find(`input[value=${currentQuality}]`).trigger(\"click\");\n\t\t}\n\n\t\t$('#show_bounding_box').click(() => {\n\t\t\tthis.viewer.setShowBoundingBox($('#show_bounding_box').prop(\"checked\"));\n\t\t});\n\n\t\t$('#set_freeze').click(() => {\n\t\t\tthis.viewer.setFreeze($('#set_freeze').prop(\"checked\"));\n\t\t});\n\t}\n\n}\n","\nimport {Annotation} from \"../Annotation.js\";\nimport {Utils} from \"../utils.js\";\nimport {CameraMode} from \"../defines.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\nexport class AnnotationTool extends EventDispatcher{\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.sg = new THREE.SphereGeometry(0.1);\n\t\tthis.sm = new THREE.MeshNormalMaterial();\n\t\tthis.s = new THREE.Mesh(this.sg, this.sm);\n\t}\n\n\tstartInsertion (args = {}) {\n\t\tlet domElement = this.viewer.renderer.domElement;\n\n\t\tlet annotation = new Annotation({\n\t\t\tposition: [589748.270, 231444.540, 753.675],\n\t\t\ttitle: \"Annotation Title\",\n\t\t\tdescription: `Annotation Description`\n\t\t});\n\t\tthis.dispatchEvent({type: 'start_inserting_annotation', annotation: annotation});\n\n\t\tconst annotations = this.viewer.scene.annotations;\n\t\tannotations.add(annotation);\n\n\t\tlet callbacks = {\n\t\t\tcancel: null,\n\t\t\tfinish: null,\n\t\t};\n\n\t\tlet insertionCallback = (e) => {\n\t\t\tif (e.button === THREE.MOUSE.LEFT) {\n\t\t\t\tcallbacks.finish();\n\t\t\t} else if (e.button === THREE.MOUSE.RIGHT) {\n\t\t\t\tcallbacks.cancel();\n\t\t\t}\n\t\t};\n\n\t\tcallbacks.cancel = e => {\n\t\t\tannotations.remove(annotation);\n\n\t\t\tdomElement.removeEventListener('mouseup', insertionCallback, true);\n\t\t};\n\n\t\tcallbacks.finish = e => {\n\t\t\tdomElement.removeEventListener('mouseup', insertionCallback, true);\n\t\t};\n\n\t\tdomElement.addEventListener('mouseup', insertionCallback, true);\n\n\t\tlet drag = (e) => {\n\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\te.drag.end, \n\t\t\t\te.viewer.scene.getActiveCamera(), \n\t\t\t\te.viewer, \n\t\t\t\te.viewer.scene.pointclouds,\n\t\t\t\t{pickClipped: true});\n\n\t\t\tif (I) {\n\t\t\t\tthis.s.position.copy(I.location);\n\n\t\t\t\tannotation.position.copy(I.location);\n\t\t\t}\n\t\t};\n\n\t\tlet drop = (e) => {\n\t\t\tviewer.scene.scene.remove(this.s);\n\t\t\tthis.s.removeEventListener(\"drag\", drag);\n\t\t\tthis.s.removeEventListener(\"drop\", drop);\n\t\t};\n\n\t\tthis.s.addEventListener('drag', drag);\n\t\tthis.s.addEventListener('drop', drop);\n\n\t\tthis.viewer.scene.scene.add(this.s);\n\t\tthis.viewer.inputHandler.startDragging(this.s);\n\n\t\treturn annotation;\n\t}\n\t\n\tupdate(){\n\t\t// let camera = this.viewer.scene.getActiveCamera();\n\t\t// let domElement = this.renderer.domElement;\n\t\t// let measurements = this.viewer.scene.measurements;\n\n\t\t// const renderAreaSize = this.renderer.getSize(new THREE.Vector2());\n\t\t// let clientWidth = renderAreaSize.width;\n\t\t// let clientHeight = renderAreaSize.height;\n\n\t}\n\n\trender(){\n\t\t//this.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera());\n\t}\n};\n","/**\n * @author mschuetz / http://mschuetz.at\n *\n *\n */\n\n\nimport {KeyCodes} from \"../KeyCodes.js\";\nimport {Utils} from \"../utils.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\nexport class InputHandler extends EventDispatcher {\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\t\tthis.domElement = this.renderer.domElement;\n\t\tthis.enabled = true;\n\t\t\n\t\tthis.scene = null;\n\t\tthis.interactiveScenes = [];\n\t\tthis.interactiveObjects = new Set();\n\t\tthis.inputListeners = [];\n\t\tthis.blacklist = new Set();\n\n\t\tthis.drag = null;\n\t\tthis.mouse = new THREE.Vector2(0, 0);\n\n\t\tthis.selection = [];\n\n\t\tthis.hoveredElements = [];\n\t\tthis.pressedKeys = {};\n\n\t\tthis.wheelDelta = 0;\n\n\t\tthis.speed = 1;\n\n\t\tthis.logMessages = false;\n\n\t\tif (this.domElement.tabIndex === -1) {\n\t\t\tthis.domElement.tabIndex = 2222;\n\t\t}\n\n\t\tthis.domElement.addEventListener('contextmenu', (event) => { event.preventDefault(); }, false);\n\t\tthis.domElement.addEventListener('click', this.onMouseClick.bind(this), false);\n\t\tthis.domElement.addEventListener('mousedown', this.onMouseDown.bind(this), false);\n\t\tthis.domElement.addEventListener('mouseup', this.onMouseUp.bind(this), false);\n\t\tthis.domElement.addEventListener('mousemove', this.onMouseMove.bind(this), false);\n\t\tthis.domElement.addEventListener('mousewheel', this.onMouseWheel.bind(this), false);\n\t\tthis.domElement.addEventListener('DOMMouseScroll', this.onMouseWheel.bind(this), false); // Firefox\n\t\tthis.domElement.addEventListener('dblclick', this.onDoubleClick.bind(this));\n\t\tthis.domElement.addEventListener('keydown', this.onKeyDown.bind(this));\n\t\tthis.domElement.addEventListener('keyup', this.onKeyUp.bind(this));\n\t\tthis.domElement.addEventListener('touchstart', this.onTouchStart.bind(this));\n\t\tthis.domElement.addEventListener('touchend', this.onTouchEnd.bind(this));\n\t\tthis.domElement.addEventListener('touchmove', this.onTouchMove.bind(this));\n\t}\n\n\taddInputListener (listener) {\n\t\tthis.inputListeners.push(listener);\n\t}\n\n\tremoveInputListener (listener) {\n\t\tthis.inputListeners = this.inputListeners.filter(e => e !== listener);\n\t}\n\n\tgetSortedListeners(){\n\t\treturn this.inputListeners.sort( (a, b) => {\n\t\t\tlet ia = (a.importance !== undefined) ? a.importance : 0;\n\t\t\tlet ib = (b.importance !== undefined) ? b.importance : 0;\n\n\t\t\treturn ib - ia;\n\t\t});\n\t}\n\n\tonTouchStart (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onTouchStart');\n\n\t\te.preventDefault();\n\n\t\tif (e.touches.length === 1) {\n\t\t\tlet rect = this.domElement.getBoundingClientRect();\n\t\t\tlet x = e.touches[0].pageX - rect.left;\n\t\t\tlet y = e.touches[0].pageY - rect.top;\n\t\t\tthis.mouse.set(x, y);\n\n\t\t\tthis.startDragging(null);\n\t\t}\n\n\t\t\n\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\tinputListener.dispatchEvent({\n\t\t\t\ttype: e.type,\n\t\t\t\ttouches: e.touches,\n\t\t\t\tchangedTouches: e.changedTouches\n\t\t\t});\n\t\t}\n\t}\n\n\tonTouchEnd (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onTouchEnd');\n\n\t\te.preventDefault();\n\n\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\tinputListener.dispatchEvent({\n\t\t\t\ttype: 'drop',\n\t\t\t\tdrag: this.drag,\n\t\t\t\tviewer: this.viewer\n\t\t\t});\n\t\t}\n\n\t\tthis.drag = null;\n\n\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\tinputListener.dispatchEvent({\n\t\t\t\ttype: e.type,\n\t\t\t\ttouches: e.touches,\n\t\t\t\tchangedTouches: e.changedTouches\n\t\t\t});\n\t\t}\n\t}\n\n\tonTouchMove (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onTouchMove');\n\n\t\te.preventDefault();\n\n\t\tif (e.touches.length === 1) {\n\t\t\tlet rect = this.domElement.getBoundingClientRect();\n\t\t\tlet x = e.touches[0].pageX - rect.left;\n\t\t\tlet y = e.touches[0].pageY - rect.top;\n\t\t\tthis.mouse.set(x, y);\n\n\t\t\tif (this.drag) {\n\t\t\t\tthis.drag.mouse = 1;\n\n\t\t\t\tthis.drag.lastDrag.x = x - this.drag.end.x;\n\t\t\t\tthis.drag.lastDrag.y = y - this.drag.end.y;\n\n\t\t\t\tthis.drag.end.set(x, y);\n\n\t\t\t\tif (this.logMessages) console.log(this.constructor.name + ': drag: ');\n\t\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\t\ttype: 'drag',\n\t\t\t\t\t\tdrag: this.drag,\n\t\t\t\t\t\tviewer: this.viewer\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\tinputListener.dispatchEvent({\n\t\t\t\ttype: e.type,\n\t\t\t\ttouches: e.touches,\n\t\t\t\tchangedTouches: e.changedTouches\n\t\t\t});\n\t\t}\n\n\t\t// DEBUG CODE\n\t\t// let debugTouches = [...e.touches, {\n\t\t//\tpageX: this.domElement.clientWidth / 2,\n\t\t//\tpageY: this.domElement.clientHeight / 2}];\n\t\t// for(let inputListener of this.getSortedListeners()){\n\t\t//\tinputListener.dispatchEvent({\n\t\t//\t\ttype: e.type,\n\t\t//\t\ttouches: debugTouches,\n\t\t//\t\tchangedTouches: e.changedTouches\n\t\t//\t});\n\t\t// }\n\t}\n\n\tonKeyDown (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onKeyDown');\n\n\t\t// DELETE\n\t\tif (e.keyCode === KeyCodes.DELETE && this.selection.length > 0) {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'delete',\n\t\t\t\tselection: this.selection\n\t\t\t});\n\n\t\t\tthis.deselectAll();\n\t\t}\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'keydown',\n\t\t\tkeyCode: e.keyCode,\n\t\t\tevent: e\n\t\t});\n\n\t\t// for(let l of this.getSortedListeners()){\n\t\t//\tl.dispatchEvent({\n\t\t//\t\ttype: \"keydown\",\n\t\t//\t\tkeyCode: e.keyCode,\n\t\t//\t\tevent: e\n\t\t//\t});\n\t\t// }\n\n\t\tthis.pressedKeys[e.keyCode] = true;\n\n\t\t// e.preventDefault();\n\t}\n\n\tonKeyUp (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onKeyUp');\n\n\t\tdelete this.pressedKeys[e.keyCode];\n\n\t\te.preventDefault();\n\t}\n\n\tonDoubleClick (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onDoubleClick');\n\n\t\tlet consumed = false;\n\t\tfor (let hovered of this.hoveredElements) {\n\t\t\tif (hovered._listeners && hovered._listeners['dblclick']) {\n\t\t\t\thovered.object.dispatchEvent({\n\t\t\t\t\ttype: 'dblclick',\n\t\t\t\t\tmouse: this.mouse,\n\t\t\t\t\tobject: hovered.object\n\t\t\t\t});\n\t\t\t\tconsumed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!consumed) {\n\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\ttype: 'dblclick',\n\t\t\t\t\tmouse: this.mouse,\n\t\t\t\t\tobject: null\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\te.preventDefault();\n\t}\n\n\tonMouseClick (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onMouseClick');\n\n\t\te.preventDefault();\n\t}\n\n\tonMouseDown (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onMouseDown');\n\n\t\te.preventDefault();\n\n\t\tlet consumed = false;\n\t\tlet consume = () => { return consumed = true; };\n\t\tif (this.hoveredElements.length === 0) {\n\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\ttype: 'mousedown',\n\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\tmouse: this.mouse\n\t\t\t\t});\n\t\t\t}\n\t\t}else{\n\t\t\tfor(let hovered of this.hoveredElements){\n\t\t\t\tlet object = hovered.object;\n\t\t\t\tobject.dispatchEvent({\n\t\t\t\t\ttype: 'mousedown',\n\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\tconsume: consume\n\t\t\t\t});\n\n\t\t\t\tif(consumed){\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!this.drag) {\n\t\t\tlet target = this.hoveredElements\n\t\t\t\t.find(el => (\n\t\t\t\t\tel.object._listeners &&\n\t\t\t\t\tel.object._listeners['drag'] &&\n\t\t\t\t\tel.object._listeners['drag'].length > 0));\n\n\t\t\tif (target) {\n\t\t\t\tthis.startDragging(target.object, {location: target.point});\n\t\t\t} else {\n\t\t\t\tthis.startDragging(null);\n\t\t\t}\n\t\t}\n\n\t\tif (this.scene) {\n\t\t\tthis.viewStart = this.scene.view.clone();\n\t\t}\n\t}\n\n\tonMouseUp (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onMouseUp');\n\n\t\te.preventDefault();\n\n\t\tlet noMovement = this.getNormalizedDrag().length() === 0;\n\n\t\t\n\t\tlet consumed = false;\n\t\tlet consume = () => { return consumed = true; };\n\t\tif (this.hoveredElements.length === 0) {\n\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\ttype: 'mouseup',\n\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\tmouse: this.mouse,\n\t\t\t\t\tconsume: consume\n\t\t\t\t});\n\n\t\t\t\tif(consumed){\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}else{\n\t\t\tlet hovered = this.hoveredElements\n\t\t\t\t.map(e => e.object)\n\t\t\t\t.find(e => (e._listeners && e._listeners['mouseup']));\n\t\t\tif(hovered){\n\t\t\t\thovered.dispatchEvent({\n\t\t\t\t\ttype: 'mouseup',\n\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\tconsume: consume\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (this.drag) {\n\t\t\tif (this.drag.object) {\n\t\t\t\tif (this.logMessages) console.log(`${this.constructor.name}: drop ${this.drag.object.name}`);\n\t\t\t\tthis.drag.object.dispatchEvent({\n\t\t\t\t\ttype: 'drop',\n\t\t\t\t\tdrag: this.drag,\n\t\t\t\t\tviewer: this.viewer\n\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\t\ttype: 'drop',\n\t\t\t\t\t\tdrag: this.drag,\n\t\t\t\t\t\tviewer: this.viewer\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// check for a click\n\t\t\tlet clicked = this.hoveredElements.map(h => h.object).find(v => v === this.drag.object) !== undefined;\n\t\t\tif(clicked){\n\t\t\t\tif (this.logMessages) console.log(`${this.constructor.name}: click ${this.drag.object.name}`);\n\t\t\t\tthis.drag.object.dispatchEvent({\n\t\t\t\t\ttype: 'click',\n\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\tconsume: consume,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.drag = null;\n\t\t}\n\n\t\tif(!consumed){\n\t\t\tif (e.button === THREE.MOUSE.LEFT) {\n\t\t\t\tif (noMovement) {\n\t\t\t\t\tlet selectable = this.hoveredElements\n\t\t\t\t\t\t.find(el => el.object._listeners && el.object._listeners['select']);\n\n\t\t\t\t\tif (selectable) {\n\t\t\t\t\t\tselectable = selectable.object;\n\n\t\t\t\t\t\tif (this.isSelected(selectable)) {\n\t\t\t\t\t\t\tthis.selection\n\t\t\t\t\t\t\t\t.filter(e => e !== selectable)\n\t\t\t\t\t\t\t\t.forEach(e => this.toggleSelection(e));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.deselectAll();\n\t\t\t\t\t\t\tthis.toggleSelection(selectable);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.deselectAll();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if ((e.button === THREE.MOUSE.RIGHT) && noMovement) {\n\t\t\t\tthis.deselectAll();\n\t\t\t}\n\t\t}\n\t}\n\n\tonMouseMove (e) {\n\t\te.preventDefault();\n\n\t\tlet rect = this.domElement.getBoundingClientRect();\n\t\tlet x = e.clientX - rect.left;\n\t\tlet y = e.clientY - rect.top;\n\t\tthis.mouse.set(x, y);\n\n\t\tlet hoveredElements = this.getHoveredElements();\n\t\tif(hoveredElements.length > 0){\n\t\t\tlet names = hoveredElements.map(h => h.object.name).join(\", \");\n\t\t\tif (this.logMessages) console.log(`${this.constructor.name}: onMouseMove; hovered: '${names}'`);\n\t\t}\n\n\t\tif (this.drag) {\n\t\t\tthis.drag.mouse = e.buttons;\n\n\t\t\tthis.drag.lastDrag.x = x - this.drag.end.x;\n\t\t\tthis.drag.lastDrag.y = y - this.drag.end.y;\n\n\t\t\tthis.drag.end.set(x, y);\n\n\t\t\tif (this.drag.object) {\n\t\t\t\tif (this.logMessages) console.log(this.constructor.name + ': drag: ' + this.drag.object.name);\n\t\t\t\tthis.drag.object.dispatchEvent({\n\t\t\t\t\ttype: 'drag',\n\t\t\t\t\tdrag: this.drag,\n\t\t\t\t\tviewer: this.viewer\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (this.logMessages) console.log(this.constructor.name + ': drag: ');\n\n\t\t\t\tlet dragConsumed = false;\n\t\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\t\ttype: 'drag',\n\t\t\t\t\t\tdrag: this.drag,\n\t\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\t\tconsume: () => {dragConsumed = true;}\n\t\t\t\t\t});\n\n\t\t\t\t\tif(dragConsumed){\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}else{\n\t\t\tlet curr = hoveredElements.map(a => a.object).find(a => true);\n\t\t\tlet prev = this.hoveredElements.map(a => a.object).find(a => true);\n\n\t\t\tif(curr !== prev){\n\t\t\t\tif(curr){\n\t\t\t\t\tif (this.logMessages) console.log(`${this.constructor.name}: mouseover: ${curr.name}`);\n\t\t\t\t\tcurr.dispatchEvent({\n\t\t\t\t\t\ttype: 'mouseover',\n\t\t\t\t\t\tobject: curr,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(prev){\n\t\t\t\t\tif (this.logMessages) console.log(`${this.constructor.name}: mouseleave: ${prev.name}`);\n\t\t\t\t\tprev.dispatchEvent({\n\t\t\t\t\t\ttype: 'mouseleave',\n\t\t\t\t\t\tobject: prev,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(hoveredElements.length > 0){\n\t\t\t\tlet object = hoveredElements\n\t\t\t\t\t.map(e => e.object)\n\t\t\t\t\t.find(e => (e._listeners && e._listeners['mousemove']));\n\t\t\t\t\n\t\t\t\tif(object){\n\t\t\t\t\tobject.dispatchEvent({\n\t\t\t\t\t\ttype: 'mousemove',\n\t\t\t\t\t\tobject: object\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\t\n\t\t// for (let inputListener of this.getSortedListeners()) {\n\t\t// \tinputListener.dispatchEvent({\n\t\t// \t\ttype: 'mousemove',\n\t\t// \t\tobject: null\n\t\t// \t});\n\t\t// }\n\t\t\n\n\t\tthis.hoveredElements = hoveredElements;\n\t}\n\t\n\tonMouseWheel(e){\n\t\tif(!this.enabled) return;\n\n\t\tif(this.logMessages) console.log(this.constructor.name + \": onMouseWheel\");\n\t\t\n\t\te.preventDefault();\n\n\t\tlet delta = 0;\n\t\tif (e.wheelDelta !== undefined) { // WebKit / Opera / Explorer 9\n\t\t\tdelta = e.wheelDelta;\n\t\t} else if (e.detail !== undefined) { // Firefox\n\t\t\tdelta = -e.detail;\n\t\t}\n\n\t\tlet ndelta = Math.sign(delta);\n\n\t\t// this.wheelDelta += Math.sign(delta);\n\n\t\tif (this.hoveredElement) {\n\t\t\tthis.hoveredElement.object.dispatchEvent({\n\t\t\t\ttype: 'mousewheel',\n\t\t\t\tdelta: ndelta,\n\t\t\t\tobject: this.hoveredElement.object\n\t\t\t});\n\t\t} else {\n\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\ttype: 'mousewheel',\n\t\t\t\t\tdelta: ndelta,\n\t\t\t\t\tobject: null\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tstartDragging (object, args = null) {\n\n\t\tlet name = object ? object.name : \"no name\";\n\t\tif (this.logMessages) console.log(`${this.constructor.name}: startDragging: '${name}'`);\n\n\t\tthis.drag = {\n\t\t\tstart: this.mouse.clone(),\n\t\t\tend: this.mouse.clone(),\n\t\t\tlastDrag: new THREE.Vector2(0, 0),\n\t\t\tstartView: this.scene.view.clone(),\n\t\t\tobject: object\n\t\t};\n\n\t\tif (args) {\n\t\t\tfor (let key of Object.keys(args)) {\n\t\t\t\tthis.drag[key] = args[key];\n\t\t\t}\n\t\t}\n\t}\n\n\tgetMousePointCloudIntersection (mouse) {\n\t\treturn Utils.getMousePointCloudIntersection(\n\t\t\tthis.mouse, \n\t\t\tthis.scene.getActiveCamera(), \n\t\t\tthis.viewer, \n\t\t\tthis.scene.pointclouds);\n\t}\n\n\ttoggleSelection (object) {\n\t\tlet oldSelection = this.selection;\n\n\t\tlet index = this.selection.indexOf(object);\n\n\t\tif (index === -1) {\n\t\t\tthis.selection.push(object);\n\t\t\tobject.dispatchEvent({\n\t\t\t\ttype: 'select'\n\t\t\t});\n\t\t} else {\n\t\t\tthis.selection.splice(index, 1);\n\t\t\tobject.dispatchEvent({\n\t\t\t\ttype: 'deselect'\n\t\t\t});\n\t\t}\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'selection_changed',\n\t\t\toldSelection: oldSelection,\n\t\t\tselection: this.selection\n\t\t});\n\t}\n\n\tdeselect(object){\n\n\t\tlet oldSelection = this.selection;\n\n\t\tlet index = this.selection.indexOf(object);\n\n\t\tif(index >= 0){\n\t\t\tthis.selection.splice(index, 1);\n\t\t\tobject.dispatchEvent({\n\t\t\t\ttype: 'deselect'\n\t\t\t});\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'selection_changed',\n\t\t\t\toldSelection: oldSelection,\n\t\t\t\tselection: this.selection\n\t\t\t});\n\t\t}\n\t}\n\n\tdeselectAll () {\n\t\tfor (let object of this.selection) {\n\t\t\tobject.dispatchEvent({\n\t\t\t\ttype: 'deselect'\n\t\t\t});\n\t\t}\n\n\t\tlet oldSelection = this.selection;\n\n\t\tif (this.selection.length > 0) {\n\t\t\tthis.selection = [];\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'selection_changed',\n\t\t\t\toldSelection: oldSelection,\n\t\t\t\tselection: this.selection\n\t\t\t});\n\t\t}\n\t}\n\n\tisSelected (object) {\n\t\tlet index = this.selection.indexOf(object);\n\n\t\treturn index !== -1;\n\t}\n\n\tregisterInteractiveObject(object){\n\t\tthis.interactiveObjects.add(object);\n\t}\n\n\tremoveInteractiveObject(object){\n\t\tthis.interactiveObjects.delete(object);\n\t}\n\n\tregisterInteractiveScene (scene) {\n\t\tlet index = this.interactiveScenes.indexOf(scene);\n\t\tif (index === -1) {\n\t\t\tthis.interactiveScenes.push(scene);\n\t\t}\n\t}\n\n\tunregisterInteractiveScene (scene) {\n\t\tlet index = this.interactiveScenes.indexOf(scene);\n\t\tif (index > -1) {\n\t\t\tthis.interactiveScenes.splice(index, 1);\n\t\t}\n\t}\n\n\tgetHoveredElement () {\n\t\tlet hoveredElements = this.getHoveredElements();\n\t\tif (hoveredElements.length > 0) {\n\t\t\treturn hoveredElements[0];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tgetHoveredElements () {\n\t\tlet scenes = this.interactiveScenes.concat(this.scene.scene);\n\n\t\tlet interactableListeners = ['mouseup', 'mousemove', 'mouseover', 'mouseleave', 'drag', 'drop', 'click', 'select', 'deselect'];\n\t\tlet interactables = [];\n\t\tfor (let scene of scenes) {\n\t\t\tscene.traverseVisible(node => {\n\t\t\t\tif (node._listeners && node.visible && !this.blacklist.has(node)) {\n\t\t\t\t\tlet hasInteractableListener = interactableListeners.filter((e) => {\n\t\t\t\t\t\treturn node._listeners[e] !== undefined;\n\t\t\t\t\t}).length > 0;\n\n\t\t\t\t\tif (hasInteractableListener) {\n\t\t\t\t\t\tinteractables.push(node);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tlet camera = this.scene.getActiveCamera();\n\t\tlet ray = Utils.mouseToRay(this.mouse, camera, this.domElement.clientWidth, this.domElement.clientHeight);\n\t\t\n\t\tlet raycaster = new THREE.Raycaster();\n\t\traycaster.ray.set(ray.origin, ray.direction);\n\t\traycaster.linePrecision = 0.2;\n\n\t\tlet intersections = raycaster.intersectObjects(interactables.filter(o => o.visible), false);\n\n\t\treturn intersections;\n\n\t\t// if(intersections.length > 0){\n\t\t//\treturn intersections[0];\n\t\t// }else{\n\t\t//\treturn null;\n\t\t// }\n\t}\n\n\tsetScene (scene) {\n\t\tthis.deselectAll();\n\n\t\tthis.scene = scene;\n\t}\n\n\tupdate (delta) {\n\n\t}\n\n\tgetNormalizedDrag () {\n\t\tif (!this.drag) {\n\t\t\treturn new THREE.Vector2(0, 0);\n\t\t}\n\n\t\tlet diff = new THREE.Vector2().subVectors(this.drag.end, this.drag.start);\n\n\t\tdiff.x = diff.x / this.domElement.clientWidth;\n\t\tdiff.y = diff.y / this.domElement.clientHeight;\n\n\t\treturn diff;\n\t}\n\n\tgetNormalizedLastDrag () {\n\t\tif (!this.drag) {\n\t\t\treturn new THREE.Vector2(0, 0);\n\t\t}\n\n\t\tlet lastDrag = this.drag.lastDrag.clone();\n\n\t\tlastDrag.x = lastDrag.x / this.domElement.clientWidth;\n\t\tlastDrag.y = lastDrag.y / this.domElement.clientHeight;\n\n\t\treturn lastDrag;\n\t}\n}\n","\nexport class NavigationCube extends THREE.Object3D {\n\n\tconstructor(viewer){\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\n\t\tlet createPlaneMaterial = (img) => {\n\t\t\tlet material = new THREE.MeshBasicMaterial( {\n\t\t\t\tdepthTest: true, \n\t\t\t\tdepthWrite: true,\n\t\t\t\tside: THREE.DoubleSide\n\t\t\t});\n\t\t\tnew THREE.TextureLoader().load(\n\t\t\t\texports.resourcePath + '/textures/navigation/' + img,\n\t\t\t\tfunction(texture) {\n\t\t\t\t\ttexture.anisotropy = viewer.renderer.capabilities.getMaxAnisotropy();\n\t\t\t\t\tmaterial.map = texture;\n\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t});\n\t\t\treturn material;\n\t\t};\n\n\t\tlet planeGeometry = new THREE.PlaneGeometry(1, 1);\n\n\t\tthis.front = new THREE.Mesh(planeGeometry, createPlaneMaterial('F.png'));\n\t\tthis.front.position.y = -0.5;\n\t\tthis.front.rotation.x = Math.PI / 2.0;\n\t\tthis.front.updateMatrixWorld();\n\t\tthis.front.name = \"F\";\n\t\tthis.add(this.front);\n\n\t\tthis.back = new THREE.Mesh(planeGeometry, createPlaneMaterial('B.png'));\n\t\tthis.back.position.y = 0.5;\n\t\tthis.back.rotation.x = Math.PI / 2.0;\n\t\tthis.back.updateMatrixWorld();\n\t\tthis.back.name = \"B\";\n\t\tthis.add(this.back);\n\n\t\tthis.left = new THREE.Mesh(planeGeometry, createPlaneMaterial('L.png'));\n\t\tthis.left.position.x = -0.5;\n\t\tthis.left.rotation.y = Math.PI / 2.0;\n\t\tthis.left.updateMatrixWorld();\n\t\tthis.left.name = \"L\";\n\t\tthis.add(this.left);\n\n\t\tthis.right = new THREE.Mesh(planeGeometry, createPlaneMaterial('R.png'));\n\t\tthis.right.position.x = 0.5;\n\t\tthis.right.rotation.y = Math.PI / 2.0;\n\t\tthis.right.updateMatrixWorld();\n\t\tthis.right.name = \"R\";\n\t\tthis.add(this.right);\n\n\t\tthis.bottom = new THREE.Mesh(planeGeometry, createPlaneMaterial('D.png'));\n\t\tthis.bottom.position.z = -0.5;\n\t\tthis.bottom.updateMatrixWorld();\n\t\tthis.bottom.name = \"D\";\n\t\tthis.add(this.bottom);\n\n\t\tthis.top = new THREE.Mesh(planeGeometry, createPlaneMaterial('U.png'));\n\t\tthis.top.position.z = 0.5;\n\t\tthis.top.updateMatrixWorld();\n\t\tthis.top.name = \"U\";\n\t\tthis.add(this.top);\n\n\t\tthis.width = 150; // in px\n\n\t\tthis.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, -1, 1);\n\t\tthis.camera.position.copy(new THREE.Vector3(0, 0, 0));\n\t\tthis.camera.lookAt(new THREE.Vector3(0, 1, 0));\n\t\tthis.camera.updateMatrixWorld();\n\t\tthis.camera.rotation.order = \"ZXY\";\n\n\t\tlet onMouseDown = (event) => {\n\t\t\tif (!this.visible) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tthis.pickedFace = null;\n\t\t\tlet mouse = new THREE.Vector2();\n\t\t\tmouse.x = event.clientX - (window.innerWidth - this.width);\n\t\t\tmouse.y = event.clientY;\n\n\t\t\tif(mouse.x < 0 || mouse.y > this.width) return;\n\n\t\t\tmouse.x = (mouse.x / this.width) * 2 - 1;\n\t\t\tmouse.y = -(mouse.y / this.width) * 2 + 1;\n\n\t\t\tlet raycaster = new THREE.Raycaster();\n\t\t\traycaster.setFromCamera(mouse, this.camera);\n\t\t\traycaster.ray.origin.sub(this.camera.getWorldDirection(new THREE.Vector3()));\n\n\t\t\tlet intersects = raycaster.intersectObjects(this.children);\n\n\t\t\tlet minDistance = 1000;\n\t\t\tfor (let i = 0; i < intersects.length; i++) {\n\t\t\t\tif(intersects[i].distance < minDistance) {\n\t\t\t\t\tthis.pickedFace = intersects[i].object.name;\n\t\t\t\t\tminDistance = intersects[i].distance;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(this.pickedFace) {\n\t\t\t\tthis.viewer.setView(this.pickedFace);\n\t\t\t}\n\t\t};\n\n\t\tthis.viewer.renderer.domElement.addEventListener('mousedown', onMouseDown, false);\n\t}\n\n\tupdate(rotation) {\n\t\tthis.camera.rotation.copy(rotation);\n\t\tthis.camera.updateMatrixWorld();\n\t}\n\n}\n","/**\n * @author mschuetz / http://mschuetz.at\n *\n * adapted from THREE.OrbitControls by\n *\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n *\n *\n *\n */\n\n\nimport {MOUSE} from \"../defines.js\";\nimport {Utils} from \"../utils.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\n \nexport class OrbitControls extends EventDispatcher{\n\t\n\tconstructor(viewer){\n\t\tsuper();\n\t\t\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.scene = null;\n\t\tthis.sceneControls = new THREE.Scene();\n\n\t\tthis.rotationSpeed = 5;\n\n\t\tthis.fadeFactor = 20;\n\t\tthis.yawDelta = 0;\n\t\tthis.pitchDelta = 0;\n\t\tthis.panDelta = new THREE.Vector2(0, 0);\n\t\tthis.radiusDelta = 0;\n\n\t\tthis.doubleClockZoomEnabled = true;\n\n\t\tthis.tweens = [];\n\n\t\tlet drag = (e) => {\n\t\t\tif (e.drag.object !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.drag.startHandled === undefined) {\n\t\t\t\te.drag.startHandled = true;\n\n\t\t\t\tthis.dispatchEvent({type: 'start'});\n\t\t\t}\n\n\t\t\tlet ndrag = {\n\t\t\t\tx: e.drag.lastDrag.x / this.renderer.domElement.clientWidth,\n\t\t\t\ty: e.drag.lastDrag.y / this.renderer.domElement.clientHeight\n\t\t\t};\n\n\t\t\tif (e.drag.mouse === MOUSE.LEFT) {\n\t\t\t\tthis.yawDelta += ndrag.x * this.rotationSpeed;\n\t\t\t\tthis.pitchDelta += ndrag.y * this.rotationSpeed;\n\n\t\t\t\tthis.stopTweens();\n\t\t\t} else if (e.drag.mouse === MOUSE.RIGHT) {\n\t\t\t\tthis.panDelta.x += ndrag.x;\n\t\t\t\tthis.panDelta.y += ndrag.y;\n\n\t\t\t\tthis.stopTweens();\n\t\t\t}\n\t\t};\n\n\t\tlet drop = e => {\n\t\t\tthis.dispatchEvent({type: 'end'});\n\t\t};\n\n\t\tlet scroll = (e) => {\n\t\t\tlet resolvedRadius = this.scene.view.radius + this.radiusDelta;\n\n\t\t\tthis.radiusDelta += -e.delta * resolvedRadius * 0.1;\n\n\t\t\tthis.stopTweens();\n\t\t};\n\n\t\tlet dblclick = (e) => {\n\t\t\tif(this.doubleClockZoomEnabled){\n\t\t\t\tthis.zoomToLocation(e.mouse);\n\t\t\t}\n\t\t};\n\n\t\tlet previousTouch = null;\n\t\tlet touchStart = e => {\n\t\t\tpreviousTouch = e;\n\t\t};\n\n\t\tlet touchEnd = e => {\n\t\t\tpreviousTouch = e;\n\t\t};\n\n\t\tlet touchMove = e => {\n\t\t\tif (e.touches.length === 2 && previousTouch.touches.length === 2){\n\t\t\t\tlet prev = previousTouch;\n\t\t\t\tlet curr = e;\n\n\t\t\t\tlet prevDX = prev.touches[0].pageX - prev.touches[1].pageX;\n\t\t\t\tlet prevDY = prev.touches[0].pageY - prev.touches[1].pageY;\n\t\t\t\tlet prevDist = Math.sqrt(prevDX * prevDX + prevDY * prevDY);\n\n\t\t\t\tlet currDX = curr.touches[0].pageX - curr.touches[1].pageX;\n\t\t\t\tlet currDY = curr.touches[0].pageY - curr.touches[1].pageY;\n\t\t\t\tlet currDist = Math.sqrt(currDX * currDX + currDY * currDY);\n\n\t\t\t\tlet delta = currDist / prevDist;\n\t\t\t\tlet resolvedRadius = this.scene.view.radius + this.radiusDelta;\n\t\t\t\tlet newRadius = resolvedRadius / delta;\n\t\t\t\tthis.radiusDelta = newRadius - resolvedRadius;\n\n\t\t\t\tthis.stopTweens();\n\t\t\t}else if(e.touches.length === 3 && previousTouch.touches.length === 3){\n\t\t\t\tlet prev = previousTouch;\n\t\t\t\tlet curr = e;\n\n\t\t\t\tlet prevMeanX = (prev.touches[0].pageX + prev.touches[1].pageX + prev.touches[2].pageX) / 3;\n\t\t\t\tlet prevMeanY = (prev.touches[0].pageY + prev.touches[1].pageY + prev.touches[2].pageY) / 3;\n\n\t\t\t\tlet currMeanX = (curr.touches[0].pageX + curr.touches[1].pageX + curr.touches[2].pageX) / 3;\n\t\t\t\tlet currMeanY = (curr.touches[0].pageY + curr.touches[1].pageY + curr.touches[2].pageY) / 3;\n\n\t\t\t\tlet delta = {\n\t\t\t\t\tx: (currMeanX - prevMeanX) / this.renderer.domElement.clientWidth,\n\t\t\t\t\ty: (currMeanY - prevMeanY) / this.renderer.domElement.clientHeight\n\t\t\t\t};\n\n\t\t\t\tthis.panDelta.x += delta.x;\n\t\t\t\tthis.panDelta.y += delta.y;\n\n\t\t\t\tthis.stopTweens();\n\t\t\t}\n\n\t\t\tpreviousTouch = e;\n\t\t};\n\n\t\tthis.addEventListener('touchstart', touchStart);\n\t\tthis.addEventListener('touchend', touchEnd);\n\t\tthis.addEventListener('touchmove', touchMove);\n\t\tthis.addEventListener('drag', drag);\n\t\tthis.addEventListener('drop', drop);\n\t\tthis.addEventListener('mousewheel', scroll);\n\t\tthis.addEventListener('dblclick', dblclick);\n\t}\n\n\tsetScene (scene) {\n\t\tthis.scene = scene;\n\t}\n\n\tstop(){\n\t\tthis.yawDelta = 0;\n\t\tthis.pitchDelta = 0;\n\t\tthis.radiusDelta = 0;\n\t\tthis.panDelta.set(0, 0);\n\t}\n\t\n\tzoomToLocation(mouse){\n\t\tlet camera = this.scene.getActiveCamera();\n\t\t\n\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\tmouse,\n\t\t\tcamera,\n\t\t\tthis.viewer,\n\t\t\tthis.scene.pointclouds,\n\t\t\t{pickClipped: true});\n\n\t\tif (I === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet targetRadius = 0;\n\t\t{\n\t\t\tlet minimumJumpDistance = 0.2;\n\n\t\t\tlet domElement = this.renderer.domElement;\n\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\n\t\t\tlet nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray);\n\t\t\tlet lastNode = nodes[nodes.length - 1];\n\t\t\tlet radius = lastNode.getBoundingSphere(new THREE.Sphere()).radius;\n\t\t\ttargetRadius = Math.min(this.scene.view.radius, radius);\n\t\t\ttargetRadius = Math.max(minimumJumpDistance, targetRadius);\n\t\t}\n\n\t\tlet d = this.scene.view.direction.multiplyScalar(-1);\n\t\tlet cameraTargetPosition = new THREE.Vector3().addVectors(I.location, d.multiplyScalar(targetRadius));\n\t\t// TODO Unused: let controlsTargetPosition = I.location;\n\n\t\tlet animationDuration = 600;\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\t{ // animate\n\t\t\tlet value = {x: 0};\n\t\t\tlet tween = new TWEEN.Tween(value).to({x: 1}, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\tthis.tweens.push(tween);\n\n\t\t\tlet startPos = this.scene.view.position.clone();\n\t\t\tlet targetPos = cameraTargetPosition.clone();\n\t\t\tlet startRadius = this.scene.view.radius;\n\t\t\tlet targetRadius = cameraTargetPosition.distanceTo(I.location);\n\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tlet t = value.x;\n\t\t\t\tthis.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x;\n\t\t\t\tthis.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y;\n\t\t\t\tthis.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z;\n\n\t\t\t\tthis.scene.view.radius = (1 - t) * startRadius + t * targetRadius;\n\t\t\t\tthis.viewer.setMoveSpeed(this.scene.view.radius / 2.5);\n\t\t\t});\n\n\t\t\ttween.onComplete(() => {\n\t\t\t\tthis.tweens = this.tweens.filter(e => e !== tween);\n\t\t\t});\n\n\t\t\ttween.start();\n\t\t}\n\t}\n\n\tstopTweens () {\n\t\tthis.tweens.forEach(e => e.stop());\n\t\tthis.tweens = [];\n\t}\n\n\tupdate (delta) {\n\t\tlet view = this.scene.view;\n\n\t\t{ // apply rotation\n\t\t\tlet progression = Math.min(1, this.fadeFactor * delta);\n\n\t\t\tlet yaw = view.yaw;\n\t\t\tlet pitch = view.pitch;\n\t\t\tlet pivot = view.getPivot();\n\n\t\t\tyaw -= progression * this.yawDelta;\n\t\t\tpitch -= progression * this.pitchDelta;\n\n\t\t\tview.yaw = yaw;\n\t\t\tview.pitch = pitch;\n\n\t\t\tlet V = this.scene.view.direction.multiplyScalar(-view.radius);\n\t\t\tlet position = new THREE.Vector3().addVectors(pivot, V);\n\n\t\t\tview.position.copy(position);\n\t\t}\n\n\t\t{ // apply pan\n\t\t\tlet progression = Math.min(1, this.fadeFactor * delta);\n\t\t\tlet panDistance = progression * view.radius * 3;\n\n\t\t\tlet px = -this.panDelta.x * panDistance;\n\t\t\tlet py = this.panDelta.y * panDistance;\n\n\t\t\tview.pan(px, py);\n\t\t}\n\n\t\t{ // apply zoom\n\t\t\tlet progression = Math.min(1, this.fadeFactor * delta);\n\n\t\t\t// let radius = view.radius + progression * this.radiusDelta * view.radius * 0.1;\n\t\t\tlet radius = view.radius + progression * this.radiusDelta;\n\n\t\t\tlet V = view.direction.multiplyScalar(-radius);\n\t\t\tlet position = new THREE.Vector3().addVectors(view.getPivot(), V);\n\t\t\tview.radius = radius;\n\n\t\t\tview.position.copy(position);\n\t\t}\n\n\t\t{\n\t\t\tlet speed = view.radius / 2.5;\n\t\t\tthis.viewer.setMoveSpeed(speed);\n\t\t}\n\n\t\t{ // decelerate over time\n\t\t\tlet progression = Math.min(1, this.fadeFactor * delta);\n\t\t\tlet attenuation = Math.max(0, 1 - this.fadeFactor * delta);\n\n\t\t\tthis.yawDelta *= attenuation;\n\t\t\tthis.pitchDelta *= attenuation;\n\t\t\tthis.panDelta.multiplyScalar(attenuation);\n\t\t\t// this.radiusDelta *= attenuation;\n\t\t\tthis.radiusDelta -= progression * this.radiusDelta;\n\t\t}\n\t}\n};\n","/**\n * @author mschuetz / http://mschuetz.at\n *\n * adapted from THREE.OrbitControls by\n *\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n *\n *\n *\n */\n\n\nimport {MOUSE} from \"../defines.js\";\nimport {Utils} from \"../utils.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\n\nexport class FirstPersonControls extends EventDispatcher {\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.scene = null;\n\t\tthis.sceneControls = new THREE.Scene();\n\n\t\tthis.rotationSpeed = 200;\n\t\tthis.moveSpeed = 10;\n\t\tthis.lockElevation = false;\n\n\t\tthis.keys = {\n\t\t\tFORWARD: ['W'.charCodeAt(0), 38],\n\t\t\tBACKWARD: ['S'.charCodeAt(0), 40],\n\t\t\tLEFT: ['A'.charCodeAt(0), 37],\n\t\t\tRIGHT: ['D'.charCodeAt(0), 39],\n\t\t\tUP: ['R'.charCodeAt(0), 33],\n\t\t\tDOWN: ['F'.charCodeAt(0), 34]\n\t\t};\n\n\t\tthis.fadeFactor = 50;\n\t\tthis.yawDelta = 0;\n\t\tthis.pitchDelta = 0;\n\t\tthis.translationDelta = new THREE.Vector3(0, 0, 0);\n\t\tthis.translationWorldDelta = new THREE.Vector3(0, 0, 0);\n\n\t\tthis.tweens = [];\n\n\t\tlet drag = (e) => {\n\t\t\tif (e.drag.object !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.drag.startHandled === undefined) {\n\t\t\t\te.drag.startHandled = true;\n\n\t\t\t\tthis.dispatchEvent({type: 'start'});\n\t\t\t}\n\n\t\t\tlet moveSpeed = this.viewer.getMoveSpeed();\n\n\t\t\tlet ndrag = {\n\t\t\t\tx: e.drag.lastDrag.x / this.renderer.domElement.clientWidth,\n\t\t\t\ty: e.drag.lastDrag.y / this.renderer.domElement.clientHeight\n\t\t\t};\n\n\t\t\tif (e.drag.mouse === MOUSE.LEFT) {\n\t\t\t\tthis.yawDelta += ndrag.x * this.rotationSpeed;\n\t\t\t\tthis.pitchDelta += ndrag.y * this.rotationSpeed;\n\t\t\t} else if (e.drag.mouse === MOUSE.RIGHT) {\n\t\t\t\tthis.translationDelta.x -= ndrag.x * moveSpeed * 100;\n\t\t\t\tthis.translationDelta.z += ndrag.y * moveSpeed * 100;\n\t\t\t}\n\t\t};\n\n\t\tlet drop = e => {\n\t\t\tthis.dispatchEvent({type: 'end'});\n\t\t};\n\n\t\tlet scroll = (e) => {\n\t\t\tlet speed = this.viewer.getMoveSpeed();\n\n\t\t\tif (e.delta < 0) {\n\t\t\t\tspeed = speed * 0.9;\n\t\t\t} else if (e.delta > 0) {\n\t\t\t\tspeed = speed / 0.9;\n\t\t\t}\n\n\t\t\tspeed = Math.max(speed, 0.1);\n\n\t\t\tthis.viewer.setMoveSpeed(speed);\n\t\t};\n\n\t\tlet dblclick = (e) => {\n\t\t\tthis.zoomToLocation(e.mouse);\n\t\t};\n\n\t\tthis.addEventListener('drag', drag);\n\t\tthis.addEventListener('drop', drop);\n\t\tthis.addEventListener('mousewheel', scroll);\n\t\tthis.addEventListener('dblclick', dblclick);\n\t}\n\n\tsetScene (scene) {\n\t\tthis.scene = scene;\n\t}\n\n\tstop(){\n\t\tthis.yawDelta = 0;\n\t\tthis.pitchDelta = 0;\n\t\tthis.translationDelta.set(0, 0, 0);\n\t}\n\t\n\tzoomToLocation(mouse){\n\t\tlet camera = this.scene.getActiveCamera();\n\t\t\n\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\tmouse,\n\t\t\tcamera,\n\t\t\tthis.viewer,\n\t\t\tthis.scene.pointclouds);\n\n\t\tif (I === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet targetRadius = 0;\n\t\t{\n\t\t\tlet minimumJumpDistance = 0.2;\n\n\t\t\tlet domElement = this.renderer.domElement;\n\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\n\t\t\tlet nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray);\n\t\t\tlet lastNode = nodes[nodes.length - 1];\n\t\t\tlet radius = lastNode.getBoundingSphere(new THREE.Sphere()).radius;\n\t\t\ttargetRadius = Math.min(this.scene.view.radius, radius);\n\t\t\ttargetRadius = Math.max(minimumJumpDistance, targetRadius);\n\t\t}\n\n\t\tlet d = this.scene.view.direction.multiplyScalar(-1);\n\t\tlet cameraTargetPosition = new THREE.Vector3().addVectors(I.location, d.multiplyScalar(targetRadius));\n\t\t// TODO Unused: let controlsTargetPosition = I.location;\n\n\t\tlet animationDuration = 600;\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\t{ // animate\n\t\t\tlet value = {x: 0};\n\t\t\tlet tween = new TWEEN.Tween(value).to({x: 1}, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\tthis.tweens.push(tween);\n\n\t\t\tlet startPos = this.scene.view.position.clone();\n\t\t\tlet targetPos = cameraTargetPosition.clone();\n\t\t\tlet startRadius = this.scene.view.radius;\n\t\t\tlet targetRadius = cameraTargetPosition.distanceTo(I.location);\n\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tlet t = value.x;\n\t\t\t\tthis.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x;\n\t\t\t\tthis.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y;\n\t\t\t\tthis.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z;\n\n\t\t\t\tthis.scene.view.radius = (1 - t) * startRadius + t * targetRadius;\n\t\t\t\tthis.viewer.setMoveSpeed(this.scene.view.radius / 2.5);\n\t\t\t});\n\n\t\t\ttween.onComplete(() => {\n\t\t\t\tthis.tweens = this.tweens.filter(e => e !== tween);\n\t\t\t});\n\n\t\t\ttween.start();\n\t\t}\n\t}\n\n\tupdate (delta) {\n\t\tlet view = this.scene.view;\n\n\t\t{ // cancel move animations on user input\n\t\t\tlet changes = [ this.yawDelta,\n\t\t\t\tthis.pitchDelta,\n\t\t\t\tthis.translationDelta.length(),\n\t\t\t\tthis.translationWorldDelta.length() ];\n\t\t\tlet changeHappens = changes.some(e => Math.abs(e) > 0.001);\n\t\t\tif (changeHappens && this.tweens.length > 0) {\n\t\t\t\tthis.tweens.forEach(e => e.stop());\n\t\t\t\tthis.tweens = [];\n\t\t\t}\n\t\t}\n\n\t\t{ // accelerate while input is given\n\t\t\tlet ih = this.viewer.inputHandler;\n\n\t\t\tlet moveForward = this.keys.FORWARD.some(e => ih.pressedKeys[e]);\n\t\t\tlet moveBackward = this.keys.BACKWARD.some(e => ih.pressedKeys[e]);\n\t\t\tlet moveLeft = this.keys.LEFT.some(e => ih.pressedKeys[e]);\n\t\t\tlet moveRight = this.keys.RIGHT.some(e => ih.pressedKeys[e]);\n\t\t\tlet moveUp = this.keys.UP.some(e => ih.pressedKeys[e]);\n\t\t\tlet moveDown = this.keys.DOWN.some(e => ih.pressedKeys[e]);\n\n\t\t\tif(this.lockElevation){\n\t\t\t\tlet dir = view.direction;\n\t\t\t\tdir.z = 0;\n\t\t\t\tdir.normalize();\n\n\t\t\t\tif (moveForward && moveBackward) {\n\t\t\t\t\tthis.translationWorldDelta.set(0, 0, 0);\n\t\t\t\t} else if (moveForward) {\n\t\t\t\t\tthis.translationWorldDelta.copy(dir.multiplyScalar(this.viewer.getMoveSpeed()));\n\t\t\t\t} else if (moveBackward) {\n\t\t\t\t\tthis.translationWorldDelta.copy(dir.multiplyScalar(-this.viewer.getMoveSpeed()));\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tif (moveForward && moveBackward) {\n\t\t\t\t\tthis.translationDelta.y = 0;\n\t\t\t\t} else if (moveForward) {\n\t\t\t\t\tthis.translationDelta.y = this.viewer.getMoveSpeed();\n\t\t\t\t} else if (moveBackward) {\n\t\t\t\t\tthis.translationDelta.y = -this.viewer.getMoveSpeed();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (moveLeft && moveRight) {\n\t\t\t\tthis.translationDelta.x = 0;\n\t\t\t} else if (moveLeft) {\n\t\t\t\tthis.translationDelta.x = -this.viewer.getMoveSpeed();\n\t\t\t} else if (moveRight) {\n\t\t\t\tthis.translationDelta.x = this.viewer.getMoveSpeed();\n\t\t\t}\n\n\t\t\tif (moveUp && moveDown) {\n\t\t\t\tthis.translationWorldDelta.z = 0;\n\t\t\t} else if (moveUp) {\n\t\t\t\tthis.translationWorldDelta.z = this.viewer.getMoveSpeed();\n\t\t\t} else if (moveDown) {\n\t\t\t\tthis.translationWorldDelta.z = -this.viewer.getMoveSpeed();\n\t\t\t}\n\t\t}\n\n\t\t{ // apply rotation\n\t\t\tlet yaw = view.yaw;\n\t\t\tlet pitch = view.pitch;\n\n\t\t\tyaw -= this.yawDelta * delta;\n\t\t\tpitch -= this.pitchDelta * delta;\n\n\t\t\tview.yaw = yaw;\n\t\t\tview.pitch = pitch;\n\t\t}\n\n\t\t{ // apply translation\n\t\t\tview.translate(\n\t\t\t\tthis.translationDelta.x * delta,\n\t\t\t\tthis.translationDelta.y * delta,\n\t\t\t\tthis.translationDelta.z * delta\n\t\t\t);\n\n\t\t\tview.translateWorld(\n\t\t\t\tthis.translationWorldDelta.x * delta,\n\t\t\t\tthis.translationWorldDelta.y * delta,\n\t\t\t\tthis.translationWorldDelta.z * delta\n\t\t\t);\n\t\t}\n\n\t\t{ // set view target according to speed\n\t\t\tview.radius = 3 * this.viewer.getMoveSpeed();\n\t\t}\n\n\t\t{ // decelerate over time\n\t\t\tlet attenuation = Math.max(0, 1 - this.fadeFactor * delta);\n\t\t\tthis.yawDelta *= attenuation;\n\t\t\tthis.pitchDelta *= attenuation;\n\t\t\tthis.translationDelta.multiplyScalar(attenuation);\n\t\t\tthis.translationWorldDelta.multiplyScalar(attenuation);\n\t\t}\n\t}\n};\n","\n\nimport {MOUSE} from \"../defines.js\";\nimport {Utils} from \"../utils.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\nexport class EarthControls extends EventDispatcher {\n\tconstructor (viewer) {\n\t\tsuper(viewer);\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.scene = null;\n\t\tthis.sceneControls = new THREE.Scene();\n\n\t\tthis.rotationSpeed = 10;\n\n\t\tthis.fadeFactor = 20;\n\t\tthis.wheelDelta = 0;\n\t\tthis.zoomDelta = new THREE.Vector3();\n\t\tthis.camStart = null;\n\n\t\tthis.tweens = [];\n\n\t\t{\n\t\t\tlet sg = new THREE.SphereGeometry(1, 16, 16);\n\t\t\tlet sm = new THREE.MeshNormalMaterial();\n\t\t\tthis.pivotIndicator = new THREE.Mesh(sg, sm);\n\t\t\tthis.pivotIndicator.visible = false;\n\t\t\tthis.sceneControls.add(this.pivotIndicator);\n\t\t}\n\n\t\tlet drag = (e) => {\n\t\t\tif (e.drag.object !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.pivot) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.drag.startHandled === undefined) {\n\t\t\t\te.drag.startHandled = true;\n\n\t\t\t\tthis.dispatchEvent({type: 'start'});\n\t\t\t}\n\n\t\t\tlet camStart = this.camStart;\n\t\t\tlet camera = this.scene.getActiveCamera();\n\t\t\tlet view = this.viewer.scene.view;\n\n\t\t\t// let camera = this.viewer.scene.camera;\n\t\t\tlet mouse = e.drag.end;\n\t\t\tlet domElement = this.viewer.renderer.domElement;\n\n\t\t\tif (e.drag.mouse === MOUSE.LEFT) {\n\n\t\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\t\t\t\tlet plane = new THREE.Plane().setFromNormalAndCoplanarPoint(\n\t\t\t\t\tnew THREE.Vector3(0, 0, 1),\n\t\t\t\t\tthis.pivot);\n\n\t\t\t\tlet distanceToPlane = ray.distanceToPlane(plane);\n\n\t\t\t\tif (distanceToPlane > 0) {\n\t\t\t\t\tlet I = new THREE.Vector3().addVectors(\n\t\t\t\t\t\tcamStart.position,\n\t\t\t\t\t\tray.direction.clone().multiplyScalar(distanceToPlane));\n\n\t\t\t\t\tlet movedBy = new THREE.Vector3().subVectors(\n\t\t\t\t\t\tI, this.pivot);\n\n\t\t\t\t\tlet newCamPos = camStart.position.clone().sub(movedBy);\n\n\t\t\t\t\tview.position.copy(newCamPos);\n\n\t\t\t\t\t{\n\t\t\t\t\t\tlet distance = newCamPos.distanceTo(this.pivot);\n\t\t\t\t\t\tview.radius = distance;\n\t\t\t\t\t\tlet speed = view.radius / 2.5;\n\t\t\t\t\t\tthis.viewer.setMoveSpeed(speed);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (e.drag.mouse === MOUSE.RIGHT) {\n\t\t\t\tlet ndrag = {\n\t\t\t\t\tx: e.drag.lastDrag.x / this.renderer.domElement.clientWidth,\n\t\t\t\t\ty: e.drag.lastDrag.y / this.renderer.domElement.clientHeight\n\t\t\t\t};\n\n\t\t\t\tlet yawDelta = -ndrag.x * this.rotationSpeed * 0.5;\n\t\t\t\tlet pitchDelta = -ndrag.y * this.rotationSpeed * 0.2;\n\n\t\t\t\tlet originalPitch = view.pitch;\n\t\t\t\tlet tmpView = view.clone();\n\t\t\t\ttmpView.pitch = tmpView.pitch + pitchDelta;\n\t\t\t\tpitchDelta = tmpView.pitch - originalPitch;\n\n\t\t\t\tlet pivotToCam = new THREE.Vector3().subVectors(view.position, this.pivot);\n\t\t\t\tlet pivotToCamTarget = new THREE.Vector3().subVectors(view.getPivot(), this.pivot);\n\t\t\t\tlet side = view.getSide();\n\n\t\t\t\tpivotToCam.applyAxisAngle(side, pitchDelta);\n\t\t\t\tpivotToCamTarget.applyAxisAngle(side, pitchDelta);\n\n\t\t\t\tpivotToCam.applyAxisAngle(new THREE.Vector3(0, 0, 1), yawDelta);\n\t\t\t\tpivotToCamTarget.applyAxisAngle(new THREE.Vector3(0, 0, 1), yawDelta);\n\n\t\t\t\tlet newCam = new THREE.Vector3().addVectors(this.pivot, pivotToCam);\n\t\t\t\t// TODO: Unused: let newCamTarget = new THREE.Vector3().addVectors(this.pivot, pivotToCamTarget);\n\n\t\t\t\tview.position.copy(newCam);\n\t\t\t\tview.yaw += yawDelta;\n\t\t\t\tview.pitch += pitchDelta;\n\t\t\t}\n\t\t};\n\n\t\tlet onMouseDown = e => {\n\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\te.mouse, \n\t\t\t\tthis.scene.getActiveCamera(), \n\t\t\t\tthis.viewer, \n\t\t\t\tthis.scene.pointclouds, \n\t\t\t\t{pickClipped: false});\n\n\t\t\tif (I) {\n\t\t\t\tthis.pivot = I.location;\n\t\t\t\tthis.camStart = this.scene.getActiveCamera().clone();\n\t\t\t\tthis.pivotIndicator.visible = true;\n\t\t\t\tthis.pivotIndicator.position.copy(I.location);\n\t\t\t}\n\t\t};\n\n\t\tlet drop = e => {\n\t\t\tthis.dispatchEvent({type: 'end'});\n\t\t};\n\n\t\tlet onMouseUp = e => {\n\t\t\tthis.camStart = null;\n\t\t\tthis.pivot = null;\n\t\t\tthis.pivotIndicator.visible = false;\n\t\t};\n\n\t\tlet scroll = (e) => {\n\t\t\tthis.wheelDelta += e.delta;\n\t\t};\n\n\t\tlet dblclick = (e) => {\n\t\t\tthis.zoomToLocation(e.mouse);\n\t\t};\n\n\t\tthis.addEventListener('drag', drag);\n\t\tthis.addEventListener('drop', drop);\n\t\tthis.addEventListener('mousewheel', scroll);\n\t\tthis.addEventListener('mousedown', onMouseDown);\n\t\tthis.addEventListener('mouseup', onMouseUp);\n\t\tthis.addEventListener('dblclick', dblclick);\n\t}\n\n\tsetScene (scene) {\n\t\tthis.scene = scene;\n\t}\n\n\tstop(){\n\t\tthis.wheelDelta = 0;\n\t\tthis.zoomDelta.set(0, 0, 0);\n\t}\n\t\n\tzoomToLocation(mouse){\n\t\tlet camera = this.scene.getActiveCamera();\n\t\t\n\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\tmouse,\n\t\t\tcamera,\n\t\t\tthis.viewer,\n\t\t\tthis.scene.pointclouds);\n\n\t\tif (I === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet targetRadius = 0;\n\t\t{\n\t\t\tlet minimumJumpDistance = 0.2;\n\n\t\t\tlet domElement = this.renderer.domElement;\n\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\n\t\t\tlet nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray);\n\t\t\tlet lastNode = nodes[nodes.length - 1];\n\t\t\tlet radius = lastNode.getBoundingSphere(new THREE.Sphere()).radius;\n\t\t\ttargetRadius = Math.min(this.scene.view.radius, radius);\n\t\t\ttargetRadius = Math.max(minimumJumpDistance, targetRadius);\n\t\t}\n\n\t\tlet d = this.scene.view.direction.multiplyScalar(-1);\n\t\tlet cameraTargetPosition = new THREE.Vector3().addVectors(I.location, d.multiplyScalar(targetRadius));\n\t\t// TODO Unused: let controlsTargetPosition = I.location;\n\n\t\tlet animationDuration = 600;\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\t{ // animate\n\t\t\tlet value = {x: 0};\n\t\t\tlet tween = new TWEEN.Tween(value).to({x: 1}, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\tthis.tweens.push(tween);\n\n\t\t\tlet startPos = this.scene.view.position.clone();\n\t\t\tlet targetPos = cameraTargetPosition.clone();\n\t\t\tlet startRadius = this.scene.view.radius;\n\t\t\tlet targetRadius = cameraTargetPosition.distanceTo(I.location);\n\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tlet t = value.x;\n\t\t\t\tthis.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x;\n\t\t\t\tthis.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y;\n\t\t\t\tthis.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z;\n\n\t\t\t\tthis.scene.view.radius = (1 - t) * startRadius + t * targetRadius;\n\t\t\t\tthis.viewer.setMoveSpeed(this.scene.view.radius / 2.5);\n\t\t\t});\n\n\t\t\ttween.onComplete(() => {\n\t\t\t\tthis.tweens = this.tweens.filter(e => e !== tween);\n\t\t\t});\n\n\t\t\ttween.start();\n\t\t}\n\t}\n\n\tupdate (delta) {\n\t\tlet view = this.scene.view;\n\t\tlet fade = Math.pow(0.5, this.fadeFactor * delta);\n\t\tlet progression = 1 - fade;\n\t\tlet camera = this.scene.getActiveCamera();\n\t\t\n\t\t// compute zoom\n\t\tif (this.wheelDelta !== 0) {\n\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\tthis.viewer.inputHandler.mouse, \n\t\t\t\tthis.scene.getActiveCamera(), \n\t\t\t\tthis.viewer, \n\t\t\t\tthis.scene.pointclouds);\n\n\t\t\tif (I) {\n\t\t\t\tlet resolvedPos = new THREE.Vector3().addVectors(view.position, this.zoomDelta);\n\t\t\t\tlet distance = I.location.distanceTo(resolvedPos);\n\t\t\t\tlet jumpDistance = distance * 0.2 * this.wheelDelta;\n\t\t\t\tlet targetDir = new THREE.Vector3().subVectors(I.location, view.position);\n\t\t\t\ttargetDir.normalize();\n\n\t\t\t\tresolvedPos.add(targetDir.multiplyScalar(jumpDistance));\n\t\t\t\tthis.zoomDelta.subVectors(resolvedPos, view.position);\n\n\t\t\t\t{\n\t\t\t\t\tlet distance = resolvedPos.distanceTo(I.location);\n\t\t\t\t\tview.radius = distance;\n\t\t\t\t\tlet speed = view.radius / 2.5;\n\t\t\t\t\tthis.viewer.setMoveSpeed(speed);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// apply zoom\n\t\tif (this.zoomDelta.length() !== 0) {\n\t\t\tlet p = this.zoomDelta.clone().multiplyScalar(progression);\n\n\t\t\tlet newPos = new THREE.Vector3().addVectors(view.position, p);\n\t\t\tview.position.copy(newPos);\n\t\t}\n\n\t\tif (this.pivotIndicator.visible) {\n\t\t\tlet distance = this.pivotIndicator.position.distanceTo(view.position);\n\t\t\tlet pixelwidth = this.renderer.domElement.clientwidth;\n\t\t\tlet pixelHeight = this.renderer.domElement.clientHeight;\n\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, pixelwidth, pixelHeight);\n\t\t\tlet scale = (10 / pr);\n\t\t\tthis.pivotIndicator.scale.set(scale, scale, scale);\n\t\t}\n\n\t\t// decelerate over time\n\t\t{\n\t\t\tthis.zoomDelta.multiplyScalar(fade);\n\t\t\tthis.wheelDelta = 0;\n\t\t}\n\t}\n};\n","/**\n * @author chrisl / Geodan\n *\n * adapted from Potree.FirstPersonControls by\n *\n * @author mschuetz / http://mschuetz.at\n *\n * and THREE.DeviceOrientationControls by\n *\n * @author richt / http://richt.me\n * @author WestLangley / http://github.com/WestLangley\n *\n *\n *\n */\n\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\nexport class DeviceOrientationControls extends EventDispatcher{\n\tconstructor(viewer){\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.scene = null;\n\t\tthis.sceneControls = new THREE.Scene();\n\n\t\tthis.screenOrientation = window.orientation || 0;\n\n\t\tlet deviceOrientationChange = e => {\n\t\t\tthis.deviceOrientation = e;\n\t\t};\n\n\t\tlet screenOrientationChange = e => {\n\t\t\tthis.screenOrientation = window.orientation || 0;\n\t\t};\n\n\t\tif ('ondeviceorientationabsolute' in window) {\n\t\t\twindow.addEventListener('deviceorientationabsolute', deviceOrientationChange);\n\t\t} else if ('ondeviceorientation' in window) {\n\t\t\twindow.addEventListener('deviceorientation', deviceOrientationChange);\n\t\t} else {\n\t\t\tconsole.warn(\"No device orientation found.\");\n\t\t}\n\t\t// window.addEventListener('deviceorientation', deviceOrientationChange);\n\t\twindow.addEventListener('orientationchange', screenOrientationChange);\n\t}\n\n\tsetScene (scene) {\n\t\tthis.scene = scene;\n\t}\n\n\tupdate (delta) {\n\t\tlet computeQuaternion = function (alpha, beta, gamma, orient) {\n\t\t\tlet quaternion = new THREE.Quaternion();\n\n\t\t\tlet zee = new THREE.Vector3(0, 0, 1);\n\t\t\tlet euler = new THREE.Euler();\n\t\t\tlet q0 = new THREE.Quaternion();\n\n\t\t\teuler.set(beta, gamma, alpha, 'ZXY');\n\t\t\tquaternion.setFromEuler(euler);\n\t\t\tquaternion.multiply(q0.setFromAxisAngle(zee, -orient));\n\n\t\t\treturn quaternion;\n\t\t};\n\n\t\tif (typeof this.deviceOrientation !== 'undefined') {\n\t\t\tlet alpha = this.deviceOrientation.alpha ? THREE.Math.degToRad(this.deviceOrientation.alpha) : 0;\n\t\t\tlet beta = this.deviceOrientation.beta ? THREE.Math.degToRad(this.deviceOrientation.beta) : 0;\n\t\t\tlet gamma = this.deviceOrientation.gamma ? THREE.Math.degToRad(this.deviceOrientation.gamma) : 0;\n\t\t\tlet orient = this.screenOrientation ? THREE.Math.degToRad(this.screenOrientation) : 0;\n\n\t\t\tlet quaternion = computeQuaternion(alpha, beta, gamma, orient);\n\t\t\tviewer.scene.cameraP.quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w);\n\t\t}\n\t}\n};\n","\nimport {ClipTask, ClipMethod, CameraMode, LengthUnits, ElevationGradientRepeat} from \"../defines.js\";\nimport {Renderer} from \"../PotreeRenderer.js\";\nimport {PotreeRenderer} from \"./PotreeRenderer.js\";\nimport {EDLRenderer} from \"./EDLRenderer.js\";\nimport {HQSplatRenderer} from \"./HQSplatRenderer.js\";\nimport {Scene} from \"./Scene.js\";\nimport {ClippingTool} from \"../utils/ClippingTool.js\";\nimport {TransformationTool} from \"../utils/TransformationTool.js\";\nimport {Utils} from \"../utils.js\";\nimport {MapView} from \"./map.js\";\nimport {ProfileWindow, ProfileWindowController} from \"./profile.js\";\nimport {BoxVolume} from \"../utils/Volume.js\";\nimport {Features} from \"../Features.js\";\nimport {Message} from \"../utils/Message.js\";\nimport {Sidebar} from \"./sidebar.js\";\n\nimport {AnnotationTool} from \"../utils/AnnotationTool.js\";\nimport {MeasuringTool} from \"../utils/MeasuringTool.js\";\nimport {ProfileTool} from \"../utils/ProfileTool.js\";\nimport {VolumeTool} from \"../utils/VolumeTool.js\";\n\nimport {InputHandler} from \"../navigation/InputHandler.js\";\nimport {NavigationCube} from \"./NavigationCube.js\";\nimport {Compass} from \"../utils/Compass.js\";\nimport {OrbitControls} from \"../navigation/OrbitControls.js\";\nimport {FirstPersonControls} from \"../navigation/FirstPersonControls.js\";\nimport {EarthControls} from \"../navigation/EarthControls.js\";\nimport {DeviceOrientationControls} from \"../navigation/DeviceOrientationControls.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\nimport { ClassificationScheme } from \"../materials/ClassificationScheme.js\";\n\nimport JSON5 from \"../../libs/json5-2.1.3/json5.mjs\";\n\n\nexport class Viewer extends EventDispatcher{\n\t\n\tconstructor(domElement, args = {}){\n\t\tsuper();\n\n\t\tthis.renderArea = domElement;\n\t\tthis.guiLoaded = false;\n\t\tthis.guiLoadTasks = [];\n\n\t\tthis.vr = null;\n\t\tthis.onVrListeners = [];\n\n\t\tthis.messages = [];\n\t\tthis.elMessages = $(`\n\t\t
    \n\t\t
    `);\n\t\t$(domElement).append(this.elMessages);\n\t\t\n\t\ttry{\n\n\t\t{ // generate missing dom hierarchy\n\t\t\tif ($(domElement).find('#potree_map').length === 0) {\n\t\t\t\tlet potreeMap = $(`\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t`);\n\t\t\t\t$(domElement).append(potreeMap);\n\t\t\t}\n\n\t\t\tif ($(domElement).find('#potree_description').length === 0) {\n\t\t\t\tlet potreeDescription = $(`
    `);\n\t\t\t\t$(domElement).append(potreeDescription);\n\t\t\t}\n\n\t\t\tif ($(domElement).find('#potree_annotations').length === 0) {\n\t\t\t\tlet potreeAnnotationContainer = $(`\n\t\t\t\t\t
    `);\n\t\t\t\t$(domElement).append(potreeAnnotationContainer);\n\t\t\t}\n\t\t}\n\n\t\tthis.pointCloudLoadedCallback = args.onPointCloudLoaded || function () {};\n\n\t\t// if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {\n\t\t//\tdefaultSettings.navigation = \"Orbit\";\n\t\t// }\n\n\t\tthis.server = null;\n\n\t\tthis.fov = 60;\n\t\tthis.isFlipYZ = false;\n\t\tthis.useDEMCollisions = false;\n\t\tthis.generateDEM = false;\n\t\tthis.minNodeSize = 30;\n\t\tthis.edlStrength = 1.0;\n\t\tthis.edlRadius = 1.4;\n\t\tthis.edlOpacity = 1.0;\n\t\tthis.useEDL = false;\n\t\tthis.description = \"\";\n\n\t\tthis.classifications = ClassificationScheme.DEFAULT;\n\n\t\tthis.moveSpeed = 10;\n\n\t\tthis.lengthUnit = LengthUnits.METER;\n\t\tthis.lengthUnitDisplay = LengthUnits.METER;\n\n\t\tthis.showBoundingBox = false;\n\t\tthis.showAnnotations = true;\n\t\tthis.freeze = false;\n\t\tthis.clipTask = ClipTask.HIGHLIGHT;\n\t\tthis.clipMethod = ClipMethod.INSIDE_ANY;\n\n\t\tthis.elevationGradientRepeat = ElevationGradientRepeat.CLAMP;\n\n\t\tthis.filterReturnNumberRange = [0, 7];\n\t\tthis.filterNumberOfReturnsRange = [0, 7];\n\t\tthis.filterGPSTimeRange = [-Infinity, Infinity];\n\t\tthis.filterPointSourceIDRange = [0, 65535];\n\n\t\tthis.potreeRenderer = null;\n\t\tthis.edlRenderer = null;\n\t\tthis.renderer = null;\n\t\tthis.pRenderer = null;\n\n\t\tthis.scene = null;\n\t\tthis.overlay = null;\n\t\tthis.overlayCamera = null;\n\n\t\tthis.inputHandler = null;\n\t\tthis.controls = null;\n\n\t\tthis.clippingTool = null;\n\t\tthis.transformationTool = null;\n\t\tthis.navigationCube = null;\n\t\tthis.compass = null;\n\t\t\n\t\tthis.skybox = null;\n\t\tthis.clock = new THREE.Clock();\n\t\tthis.background = null;\n\n\t\tthis.initThree();\n\t\tthis.prepareVR();\n\n\t\tif(args.noDragAndDrop){\n\t\t\t\n\t\t}else{\n\t\t\tthis.initDragAndDrop();\n\t\t}\n\n\t\tif(typeof Stats !== \"undefined\"){\n\t\t\tthis.stats = new Stats();\n\t\t\tthis.stats.showPanel( 0 ); // 0: fps, 1: ms, 2: mb, 3+: custom\n\t\t\tdocument.body.appendChild( this.stats.dom );\n\t\t}\n\n\t\t{\n\t\t\tlet canvas = this.renderer.domElement;\n\t\t\tcanvas.addEventListener(\"webglcontextlost\", (e) => {\n\t\t\t\tconsole.log(e);\n\t\t\t\tthis.postMessage(\"WebGL context lost. \\u2639\");\n\n\t\t\t\tlet gl = this.renderer.getContext();\n\t\t\t\tlet error = gl.getError();\n\t\t\t\tconsole.log(error);\n\t\t\t}, false);\n\t\t}\n\n\t\t{\n\t\t\tthis.overlay = new THREE.Scene();\n\t\t\tthis.overlayCamera = new THREE.OrthographicCamera(\n\t\t\t\t0, 1,\n\t\t\t\t1, 0,\n\t\t\t\t-1000, 1000\n\t\t\t);\n\t\t}\n\t\t\n\t\tthis.pRenderer = new Renderer(this.renderer);\n\t\t\n\t\t{\n\t\t\tlet near = 2.5;\n\t\t\tlet far = 10.0;\n\t\t\tlet fov = 90;\n\t\t\t\n\t\t\tthis.shadowTestCam = new THREE.PerspectiveCamera(90, 1, near, far);\n\t\t\tthis.shadowTestCam.position.set(3.50, -2.80, 8.561);\n\t\t\tthis.shadowTestCam.lookAt(new THREE.Vector3(0, 0, 4.87));\n\t\t}\n\t\t\n\n\t\tlet scene = new Scene(this.renderer);\n\t\tthis.setScene(scene);\n\n\t\t{\n\t\t\tthis.inputHandler = new InputHandler(this);\n\t\t\tthis.inputHandler.setScene(this.scene);\n\n\t\t\tthis.clippingTool = new ClippingTool(this);\n\t\t\tthis.transformationTool = new TransformationTool(this);\n\t\t\tthis.navigationCube = new NavigationCube(this);\n\t\t\tthis.navigationCube.visible = false;\n\n\t\t\tthis.compass = new Compass(this);\n\t\t\t\n\t\t\tthis.createControls();\n\n\t\t\tthis.clippingTool.setScene(this.scene);\n\t\t\t\n\t\t\tlet onPointcloudAdded = (e) => {\n\t\t\t\tif (this.scene.pointclouds.length === 1) {\n\t\t\t\t\tlet speed = e.pointcloud.boundingBox.getSize(new THREE.Vector3()).length();\n\t\t\t\t\tspeed = speed / 5;\n\t\t\t\t\tthis.setMoveSpeed(speed);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet onVolumeRemoved = (e) => {\n\t\t\t\tthis.inputHandler.deselect(e.volume);\n\t\t\t};\n\n\t\t\tthis.addEventListener('scene_changed', (e) => {\n\t\t\t\tthis.inputHandler.setScene(e.scene);\n\t\t\t\tthis.clippingTool.setScene(this.scene);\n\t\t\t\t\n\t\t\t\tif(!e.scene.hasEventListener(\"pointcloud_added\", onPointcloudAdded)){\n\t\t\t\t\te.scene.addEventListener(\"pointcloud_added\", onPointcloudAdded);\n\t\t\t\t}\n\n\t\t\t\tif(!e.scene.hasEventListener(\"volume_removed\", onPointcloudAdded)){\n\t\t\t\t\te.scene.addEventListener(\"volume_removed\", onVolumeRemoved);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\n\t\t\tthis.scene.addEventListener(\"volume_removed\", onVolumeRemoved);\n\t\t\tthis.scene.addEventListener('pointcloud_added', onPointcloudAdded);\n\t\t}\n\n\t\t{ // set defaults\n\t\t\tthis.setFOV(60);\n\t\t\tthis.setEDLEnabled(false);\n\t\t\tthis.setEDLRadius(1.4);\n\t\t\tthis.setEDLStrength(0.4);\n\t\t\tthis.setEDLOpacity(1.0);\n\t\t\tthis.setClipTask(ClipTask.HIGHLIGHT);\n\t\t\tthis.setClipMethod(ClipMethod.INSIDE_ANY);\n\t\t\tthis.setPointBudget(1*1000*1000);\n\t\t\tthis.setShowBoundingBox(false);\n\t\t\tthis.setFreeze(false);\n\t\t\tthis.setControls(this.orbitControls);\n\t\t\tthis.setBackground('gradient');\n\n\t\t\tthis.scaleFactor = 1;\n\n\t\t\tthis.loadSettingsFromURL();\n\t\t}\n\n\t\t// start rendering!\n\t\tif(args.useDefaultRenderLoop === undefined || args.useDefaultRenderLoop === true){\n\t\t\trequestAnimationFrame(this.loop.bind(this));\n\t\t}\n\n\t\tthis.loadGUI = this.loadGUI.bind(this);\n\n\t\tthis.annotationTool = new AnnotationTool(this);\n\t\tthis.measuringTool = new MeasuringTool(this);\n\t\tthis.profileTool = new ProfileTool(this);\n\t\tthis.volumeTool = new VolumeTool(this);\n\n\t\t}catch(e){\n\t\t\tthis.onCrash(e);\n\t\t}\n\t}\n\n\tonCrash(error){\n\n\t\t$(this.renderArea).empty();\n\n\t\tif ($(this.renderArea).find('#potree_failpage').length === 0) {\n\t\t\tlet elFailPage = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t

    Potree Encountered An Error

    \n\n\t\t\t\t

    \n\t\t\t\tThis may happen if your browser or graphics card is not supported.\n\t\t\t\t
    \n\t\t\t\tWe recommend to use \n\t\t\t\tChrome\n\t\t\t\tor \n\t\t\t\tFirefox.\n\t\t\t\t

    \n\n\t\t\t\t

    \n\t\t\t\tPlease also visit webglreport.com and \n\t\t\t\tcheck whether your system supports WebGL.\n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\tIf you are already using one of the recommended browsers and WebGL is enabled, \n\t\t\t\tconsider filing an issue report at github,
    \n\t\t\t\tincluding your operating system, graphics card, browser and browser version, as well as the \n\t\t\t\terror message below.
    \n\t\t\t\tPlease do not report errors on unsupported browsers.\n\t\t\t\t

    \n\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t
    `);\n\n\t\t\tlet elErrorMessage = elFailPage.find('#potree_error_console');\n\t\t\telErrorMessage.html(error.stack);\n\n\t\t\t$(this.renderArea).append(elFailPage);\n\t\t}\n\n\t\tthrow error;\n\t}\n\n\t// ------------------------------------------------------------------------------------\n\t// Viewer API\n\t// ------------------------------------------------------------------------------------\n\n\tsetScene (scene) {\n\t\tif (scene === this.scene) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet oldScene = this.scene;\n\t\tthis.scene = scene;\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'scene_changed',\n\t\t\toldScene: oldScene,\n\t\t\tscene: scene\n\t\t});\n\n\t\t{ // Annotations\n\t\t\t$('.annotation').detach();\n\n\t\t\t// for(let annotation of this.scene.annotations){\n\t\t\t//\tthis.renderArea.appendChild(annotation.domElement[0]);\n\t\t\t// }\n\n\t\t\tthis.scene.annotations.traverse(annotation => {\n\t\t\t\tthis.renderArea.appendChild(annotation.domElement[0]);\n\t\t\t});\n\n\t\t\tif (!this.onAnnotationAdded) {\n\t\t\t\tthis.onAnnotationAdded = e => {\n\t\t\t\t// console.log(\"annotation added: \" + e.annotation.title);\n\n\t\t\t\t\te.annotation.traverse(node => {\n\n\t\t\t\t\t\t$(\"#potree_annotation_container\").append(node.domElement);\n\t\t\t\t\t\t//this.renderArea.appendChild(node.domElement[0]);\n\t\t\t\t\t\tnode.scene = this.scene;\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (oldScene) {\n\t\t\t\toldScene.annotations.removeEventListener('annotation_added', this.onAnnotationAdded);\n\t\t\t}\n\t\t\tthis.scene.annotations.addEventListener('annotation_added', this.onAnnotationAdded);\n\t\t}\n\t};\n\n\tsetControls(controls){\n\t\tif (controls !== this.controls) {\n\t\t\tif (this.controls) {\n\t\t\t\tthis.controls.enabled = false;\n\t\t\t\tthis.inputHandler.removeInputListener(this.controls);\n\t\t\t}\n\n\t\t\tthis.controls = controls;\n\t\t\tthis.controls.enabled = true;\n\t\t\tthis.inputHandler.addInputListener(this.controls);\n\t\t}\n\t}\n\n\tgetControls () {\n\t\treturn this.controls;\n\t}\n\n\tgetMinNodeSize () {\n\t\treturn this.minNodeSize;\n\t};\n\n\tsetMinNodeSize (value) {\n\t\tif (this.minNodeSize !== value) {\n\t\t\tthis.minNodeSize = value;\n\t\t\tthis.dispatchEvent({'type': 'minnodesize_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetBackground () {\n\t\treturn this.background;\n\t}\n\n\tsetBackground(bg){\n\t\tif (this.background === bg) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(bg === \"skybox\"){\n\t\t\tthis.skybox = Utils.loadSkybox(new URL(Potree.resourcePath + '/textures/skybox2/').href);\n\t\t}\n\n\t\tthis.background = bg;\n\t\tthis.dispatchEvent({'type': 'background_changed', 'viewer': this});\n\t}\n\n\tsetDescription (value) {\n\t\tthis.description = value;\n\t\t\n\t\t$('#potree_description').html(value);\n\t\t//$('#potree_description').text(value);\n\t}\n\n\tgetDescription(){\n\t\treturn this.description;\n\t}\n\n\tsetShowBoundingBox (value) {\n\t\tif (this.showBoundingBox !== value) {\n\t\t\tthis.showBoundingBox = value;\n\t\t\tthis.dispatchEvent({'type': 'show_boundingbox_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetShowBoundingBox () {\n\t\treturn this.showBoundingBox;\n\t};\n\n\tsetMoveSpeed (value) {\n\t\tif (this.moveSpeed !== value) {\n\t\t\tthis.moveSpeed = value;\n\t\t\tthis.dispatchEvent({'type': 'move_speed_changed', 'viewer': this, 'speed': value});\n\t\t}\n\t};\n\n\tgetMoveSpeed () {\n\t\treturn this.moveSpeed;\n\t};\n\n\tsetWeightClassification (w) {\n\t\tfor (let i = 0; i < this.scene.pointclouds.length; i++) {\n\t\t\tthis.scene.pointclouds[i].material.weightClassification = w;\n\t\t\tthis.dispatchEvent({'type': 'attribute_weights_changed' + i, 'viewer': this});\n\t\t}\n\t};\n\n\tsetFreeze (value) {\n\t\tvalue = Boolean(value);\n\t\tif (this.freeze !== value) {\n\t\t\tthis.freeze = value;\n\t\t\tthis.dispatchEvent({'type': 'freeze_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetFreeze () {\n\t\treturn this.freeze;\n\t};\n\n\tgetClipTask(){\n\t\treturn this.clipTask;\n\t}\n\n\tgetClipMethod(){\n\t\treturn this.clipMethod;\n\t}\n\n\tsetClipTask(value){\n\t\tif(this.clipTask !== value){\n\n\t\t\tthis.clipTask = value;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: \"cliptask_changed\", \n\t\t\t\tviewer: this});\t\t\n\t\t}\n\t}\n\n\tsetClipMethod(value){\n\t\tif(this.clipMethod !== value){\n\n\t\t\tthis.clipMethod = value;\n\t\t\t\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: \"clipmethod_changed\",\n\t\t\t\tviewer: this});\n\t\t}\n\t}\n\n\tsetElevationGradientRepeat(value){\n\t\tif(this.elevationGradientRepeat !== value){\n\n\t\t\tthis.elevationGradientRepeat = value;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: \"elevation_gradient_repeat_changed\", \n\t\t\t\tviewer: this});\n\t\t}\n\t}\n\n\tsetPointBudget (value) {\n\t\tif (Potree.pointBudget !== value) {\n\t\t\tPotree.pointBudget = parseInt(value);\n\t\t\tthis.dispatchEvent({'type': 'point_budget_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetPointBudget () {\n\t\treturn Potree.pointBudget;\n\t};\n\n\tsetShowAnnotations (value) {\n\t\tif (this.showAnnotations !== value) {\n\t\t\tthis.showAnnotations = value;\n\t\t\tthis.dispatchEvent({'type': 'show_annotations_changed', 'viewer': this});\n\t\t}\n\t}\n\n\tgetShowAnnotations () {\n\t\treturn this.showAnnotations;\n\t}\n\t\n\tsetDEMCollisionsEnabled(value){\n\t\tif(this.useDEMCollisions !== value){\n\t\t\tthis.useDEMCollisions = value;\n\t\t\tthis.dispatchEvent({'type': 'use_demcollisions_changed', 'viewer': this});\n\t\t};\n\t};\n\n\tgetDEMCollisionsEnabled () {\n\t\treturn this.useDEMCollisions;\n\t};\n\n\tsetEDLEnabled (value) {\n\t\tvalue = Boolean(value);\n\t\tif (this.useEDL !== value) {\n\t\t\tthis.useEDL = value;\n\t\t\tthis.dispatchEvent({'type': 'use_edl_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetEDLEnabled () {\n\t\treturn this.useEDL;\n\t};\n\n\tsetEDLRadius (value) {\n\t\tif (this.edlRadius !== value) {\n\t\t\tthis.edlRadius = value;\n\t\t\tthis.dispatchEvent({'type': 'edl_radius_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetEDLRadius () {\n\t\treturn this.edlRadius;\n\t};\n\n\tsetEDLStrength (value) {\n\t\tif (this.edlStrength !== value) {\n\t\t\tthis.edlStrength = value;\n\t\t\tthis.dispatchEvent({'type': 'edl_strength_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetEDLStrength () {\n\t\treturn this.edlStrength;\n\t};\n\n\tsetEDLOpacity (value) {\n\t\tif (this.edlOpacity !== value) {\n\t\t\tthis.edlOpacity = value;\n\t\t\tthis.dispatchEvent({'type': 'edl_opacity_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetEDLOpacity () {\n\t\treturn this.edlOpacity;\n\t};\n\n\tsetFOV (value) {\n\t\tif (this.fov !== value) {\n\t\t\tthis.fov = value;\n\t\t\tthis.dispatchEvent({'type': 'fov_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetFOV () {\n\t\treturn this.fov;\n\t};\n\n\tdisableAnnotations () {\n\t\tthis.scene.annotations.traverse(annotation => {\n\t\t\tannotation.domElement.css('pointer-events', 'none');\n\n\t\t\t// return annotation.visible;\n\t\t});\n\t};\n\n\tenableAnnotations () {\n\t\tthis.scene.annotations.traverse(annotation => {\n\t\t\tannotation.domElement.css('pointer-events', 'auto');\n\n\t\t\t// return annotation.visible;\n\t\t});\n\t}\n\n\tsetClassifications(classifications){\n\t\tthis.classifications = classifications;\n\n\t\tthis.dispatchEvent({'type': 'classifications_changed', 'viewer': this});\n\t}\n\n\tsetClassificationVisibility (key, value) {\n\t\tif (!this.classifications[key]) {\n\t\t\tthis.classifications[key] = {visible: value, name: 'no name'};\n\t\t\tthis.dispatchEvent({'type': 'classification_visibility_changed', 'viewer': this});\n\t\t} else if (this.classifications[key].visible !== value) {\n\t\t\tthis.classifications[key].visible = value;\n\t\t\tthis.dispatchEvent({'type': 'classification_visibility_changed', 'viewer': this});\n\t\t}\n\t}\n\n\ttoggleAllClassificationsVisibility(){\n\n\t\tlet numVisible = 0;\n\t\tlet numItems = 0;\n\t\tfor(const key of Object.keys(this.classifications)){\n\t\t\tif(this.classifications[key].visible){\n\t\t\t\tnumVisible++;\n\t\t\t}\n\t\t\tnumItems++;\n\t\t}\n\n\t\tlet visible = true;\n\t\tif(numVisible === numItems){\n\t\t\tvisible = false;\n\t\t}\n\n\t\tlet somethingChanged = false;\n\n\t\tfor(const key of Object.keys(this.classifications)){\n\t\t\tif(this.classifications[key].visible !== visible){\n\t\t\t\tthis.classifications[key].visible = visible;\n\t\t\t\tsomethingChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif(somethingChanged){\n\t\t\tthis.dispatchEvent({'type': 'classification_visibility_changed', 'viewer': this});\n\t\t}\n\t}\n\n\tsetFilterReturnNumberRange(from, to){\n\t\tthis.filterReturnNumberRange = [from, to];\n\t\tthis.dispatchEvent({'type': 'filter_return_number_range_changed', 'viewer': this});\n\t}\n\n\tsetFilterNumberOfReturnsRange(from, to){\n\t\tthis.filterNumberOfReturnsRange = [from, to];\n\t\tthis.dispatchEvent({'type': 'filter_number_of_returns_range_changed', 'viewer': this});\n\t}\n\n\tsetFilterGPSTimeRange(from, to){\n\t\tthis.filterGPSTimeRange = [from, to];\n\t\tthis.dispatchEvent({'type': 'filter_gps_time_range_changed', 'viewer': this});\n\t}\n\n\tsetFilterPointSourceIDRange(from, to){\n\t\tthis.filterPointSourceIDRange = [from, to]\n\t\tthis.dispatchEvent({'type': 'filter_point_source_id_range_changed', 'viewer': this});\n\t}\n\n\tsetLengthUnit (value) {\n\t\tswitch (value) {\n\t\t\tcase 'm':\n\t\t\t\tthis.lengthUnit = LengthUnits.METER;\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.METER;\n\t\t\t\tbreak;\n\t\t\tcase 'ft':\n\t\t\t\tthis.lengthUnit = LengthUnits.FEET;\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.FEET;\n\t\t\t\tbreak;\n\t\t\tcase 'in':\n\t\t\t\tthis.lengthUnit = LengthUnits.INCH;\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.INCH;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.dispatchEvent({ 'type': 'length_unit_changed', 'viewer': this, value: value});\n\t};\n\n\tsetLengthUnitAndDisplayUnit(lengthUnitValue, lengthUnitDisplayValue) {\n\t\tswitch (lengthUnitValue) {\n\t\t\tcase 'm':\n\t\t\t\tthis.lengthUnit = LengthUnits.METER;\n\t\t\t\tbreak;\n\t\t\tcase 'ft':\n\t\t\t\tthis.lengthUnit = LengthUnits.FEET;\n\t\t\t\tbreak;\n\t\t\tcase 'in':\n\t\t\t\tthis.lengthUnit = LengthUnits.INCH;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tswitch (lengthUnitDisplayValue) {\n\t\t\tcase 'm':\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.METER;\n\t\t\t\tbreak;\n\t\t\tcase 'ft':\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.FEET;\n\t\t\t\tbreak;\n\t\t\tcase 'in':\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.INCH;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.dispatchEvent({ 'type': 'length_unit_changed', 'viewer': this, value: lengthUnitValue });\n\t};\n\n\tzoomTo(node, factor, animationDuration = 0){\n\t\tlet view = this.scene.view;\n\n\t\tlet camera = this.scene.cameraP.clone();\n\t\tcamera.rotation.copy(this.scene.cameraP.rotation);\n\t\tcamera.rotation.order = \"ZXY\";\n\t\tcamera.rotation.x = Math.PI / 2 + view.pitch;\n\t\tcamera.rotation.z = view.yaw;\n\t\tcamera.updateMatrix();\n\t\tcamera.updateMatrixWorld();\n\t\tcamera.zoomTo(node, factor);\n\n\t\tlet bs;\n\t\tif (node.boundingSphere) {\n\t\t\tbs = node.boundingSphere;\n\t\t} else if (node.geometry && node.geometry.boundingSphere) {\n\t\t\tbs = node.geometry.boundingSphere;\n\t\t} else {\n\t\t\tbs = node.boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\t}\n\t\tbs = bs.clone().applyMatrix4(node.matrixWorld); \n\n\t\tlet startPosition = view.position.clone();\n\t\tlet endPosition = camera.position.clone();\n\t\tlet startTarget = view.getPivot();\n\t\tlet endTarget = bs.center;\n\t\tlet startRadius = view.radius;\n\t\tlet endRadius = endPosition.distanceTo(endTarget);\n\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\t{ // animate camera position\n\t\t\tlet pos = startPosition.clone();\n\t\t\tlet tween = new TWEEN.Tween(pos).to(endPosition, animationDuration);\n\t\t\ttween.easing(easing);\n\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tview.position.copy(pos);\n\t\t\t});\n\n\t\t\ttween.start();\n\t\t}\n\n\t\t{ // animate camera target\n\t\t\tlet target = startTarget.clone();\n\t\t\tlet tween = new TWEEN.Tween(target).to(endTarget, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tview.lookAt(target);\n\t\t\t});\n\t\t\ttween.onComplete(() => {\n\t\t\t\tview.lookAt(target);\n\t\t\t\tthis.dispatchEvent({type: 'focusing_finished', target: this});\n\t\t\t});\n\n\t\t\tthis.dispatchEvent({type: 'focusing_started', target: this});\n\t\t\ttween.start();\n\t\t}\n\t};\n\n\tmoveToGpsTimeVicinity(time){\n\t\tconst result = Potree.Utils.findClosestGpsTime(time, viewer);\n\n\t\tconst box = result.node.pointcloud.deepestNodeAt(result.position).getBoundingBox();\n\t\tconst diameter = box.min.distanceTo(box.max);\n\n\t\tconst camera = this.scene.getActiveCamera();\n\t\tconst offset = camera.getWorldDirection(new THREE.Vector3()).multiplyScalar(diameter);\n\t\tconst newCamPos = result.position.clone().sub(offset);\n\n\t\tthis.scene.view.position.copy(newCamPos);\n\t\tthis.scene.view.lookAt(result.position);\n\t}\n\n\tshowAbout () {\n\t\t$(function () {\n\t\t\t$('#about-panel').dialog();\n\t\t});\n\t};\n\n\tgetBoundingBox (pointclouds) {\n\t\treturn this.scene.getBoundingBox(pointclouds);\n\t};\n\n\tgetGpsTimeExtent(){\n\t\tconst range = [Infinity, -Infinity];\n\n\t\tfor(const pointcloud of this.scene.pointclouds){\n\t\t\tconst attributes = pointcloud.pcoGeometry.pointAttributes.attributes;\n\t\t\tconst aGpsTime = attributes.find(a => a.name === \"gps-time\");\n\n\t\t\tif(aGpsTime){\n\t\t\t\trange[0] = Math.min(range[0], aGpsTime.range[0]);\n\t\t\t\trange[1] = Math.max(range[1], aGpsTime.range[1]);\n\t\t\t}\n\t\t}\n\n\t\treturn range;\n\t}\n\n\tfitToScreen (factor = 1, animationDuration = 0) {\n\t\tlet box = this.getBoundingBox(this.scene.pointclouds);\n\n\t\tlet node = new THREE.Object3D();\n\t\tnode.boundingBox = box;\n\n\t\tthis.zoomTo(node, factor, animationDuration);\n\t\tthis.controls.stop();\n\t};\n\n\ttoggleNavigationCube() {\n\t\tthis.navigationCube.visible = !this.navigationCube.visible;\n\t}\n\n\tsetView(view) {\n\t\tif(!view) return;\n\n\t\tswitch(view) {\n\t\t\tcase \"F\":\n\t\t\t\tthis.setFrontView();\n\t\t\t\tbreak;\n\t\t\tcase \"B\":\n\t\t\t\tthis.setBackView();\n\t\t\t\tbreak;\n\t\t\tcase \"L\":\n\t\t\t\tthis.setLeftView();\n\t\t\t\tbreak;\n\t\t\tcase \"R\":\n\t\t\t\tthis.setRightView();\n\t\t\t\tbreak;\n\t\t\tcase \"U\":\n\t\t\t\tthis.setTopView();\n\t\t\t\tbreak;\n\t\t\tcase \"D\":\n\t\t\t\tthis.setBottomView();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tsetTopView(){\n\t\tthis.scene.view.yaw = 0;\n\t\tthis.scene.view.pitch = -Math.PI / 2;\n\n\t\tthis.fitToScreen();\n\t};\n\t\n\tsetBottomView(){\n\t\tthis.scene.view.yaw = -Math.PI;\n\t\tthis.scene.view.pitch = Math.PI / 2;\n\t\t\n\t\tthis.fitToScreen();\n\t};\n\n\tsetFrontView(){\n\t\tthis.scene.view.yaw = 0;\n\t\tthis.scene.view.pitch = 0;\n\n\t\tthis.fitToScreen();\n\t};\n\t\n\tsetBackView(){\n\t\tthis.scene.view.yaw = Math.PI;\n\t\tthis.scene.view.pitch = 0;\n\t\t\n\t\tthis.fitToScreen();\n\t};\n\n\tsetLeftView(){\n\t\tthis.scene.view.yaw = -Math.PI / 2;\n\t\tthis.scene.view.pitch = 0;\n\n\t\tthis.fitToScreen();\n\t};\n\n\tsetRightView () {\n\t\tthis.scene.view.yaw = Math.PI / 2;\n\t\tthis.scene.view.pitch = 0;\n\n\t\tthis.fitToScreen();\n\t};\n\n\tflipYZ () {\n\t\tthis.isFlipYZ = !this.isFlipYZ;\n\n\t\t// TODO flipyz\n\t\tconsole.log('TODO');\n\t}\n\t\n\tsetCameraMode(mode){\n\t\tthis.scene.cameraMode = mode;\n\n\t\tfor(let pointcloud of this.scene.pointclouds) {\n\t\t\tpointcloud.material.useOrthographicCamera = mode == CameraMode.ORTHOGRAPHIC;\n\t\t}\n\t}\n\n\tgetProjection(){\n\t\tconst pointcloud = this.scene.pointclouds[0];\n\n\t\tif(pointcloud){\n\t\t\treturn pointcloud.projection;\n\t\t}else{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync loadProject(url){\n\n\t\tconst response = await fetch(url);\n\t\n\t\tconst text = await response.text();\n\t\tconst json = JSON5.parse(text);\n\t\t// const json = JSON.parse(text);\n\n\t\tif(json.type === \"Potree\"){\n\t\t\tPotree.loadProject(viewer, json);\n\t\t}\n\n\t\t//Potree.loadProject(this, url);\n\t}\n\n\tsaveProject(){\n\t\treturn Potree.saveProject(this);\n\t}\n\t\n\tloadSettingsFromURL(){\n\t\tif(Utils.getParameterByName(\"pointSize\")){\n\t\t\tthis.setPointSize(parseFloat(Utils.getParameterByName(\"pointSize\")));\n\t\t}\n\t\t\n\t\tif(Utils.getParameterByName(\"FOV\")){\n\t\t\tthis.setFOV(parseFloat(Utils.getParameterByName(\"FOV\")));\n\t\t}\n\t\t\n\t\tif(Utils.getParameterByName(\"opacity\")){\n\t\t\tthis.setOpacity(parseFloat(Utils.getParameterByName(\"opacity\")));\n\t\t}\n\t\t\n\t\tif(Utils.getParameterByName(\"edlEnabled\")){\n\t\t\tlet enabled = Utils.getParameterByName(\"edlEnabled\") === \"true\";\n\t\t\tthis.setEDLEnabled(enabled);\n\t\t}\n\n\t\tif (Utils.getParameterByName('edlRadius')) {\n\t\t\tthis.setEDLRadius(parseFloat(Utils.getParameterByName('edlRadius')));\n\t\t}\n\n\t\tif (Utils.getParameterByName('edlStrength')) {\n\t\t\tthis.setEDLStrength(parseFloat(Utils.getParameterByName('edlStrength')));\n\t\t}\n\n\t\tif (Utils.getParameterByName('pointBudget')) {\n\t\t\tthis.setPointBudget(parseFloat(Utils.getParameterByName('pointBudget')));\n\t\t}\n\n\t\tif (Utils.getParameterByName('showBoundingBox')) {\n\t\t\tlet enabled = Utils.getParameterByName('showBoundingBox') === 'true';\n\t\t\tif (enabled) {\n\t\t\t\tthis.setShowBoundingBox(true);\n\t\t\t} else {\n\t\t\t\tthis.setShowBoundingBox(false);\n\t\t\t}\n\t\t}\n\n\t\tif (Utils.getParameterByName('material')) {\n\t\t\tlet material = Utils.getParameterByName('material');\n\t\t\tthis.setMaterial(material);\n\t\t}\n\n\t\tif (Utils.getParameterByName('pointSizing')) {\n\t\t\tlet sizing = Utils.getParameterByName('pointSizing');\n\t\t\tthis.setPointSizing(sizing);\n\t\t}\n\n\t\tif (Utils.getParameterByName('quality')) {\n\t\t\tlet quality = Utils.getParameterByName('quality');\n\t\t\tthis.setQuality(quality);\n\t\t}\n\n\t\tif (Utils.getParameterByName('position')) {\n\t\t\tlet value = Utils.getParameterByName('position');\n\t\t\tvalue = value.replace('[', '').replace(']', '');\n\t\t\tlet tokens = value.split(';');\n\t\t\tlet x = parseFloat(tokens[0]);\n\t\t\tlet y = parseFloat(tokens[1]);\n\t\t\tlet z = parseFloat(tokens[2]);\n\n\t\t\tthis.scene.view.position.set(x, y, z);\n\t\t}\n\n\t\tif (Utils.getParameterByName('target')) {\n\t\t\tlet value = Utils.getParameterByName('target');\n\t\t\tvalue = value.replace('[', '').replace(']', '');\n\t\t\tlet tokens = value.split(';');\n\t\t\tlet x = parseFloat(tokens[0]);\n\t\t\tlet y = parseFloat(tokens[1]);\n\t\t\tlet z = parseFloat(tokens[2]);\n\n\t\t\tthis.scene.view.lookAt(new THREE.Vector3(x, y, z));\n\t\t}\n\n\t\tif (Utils.getParameterByName('background')) {\n\t\t\tlet value = Utils.getParameterByName('background');\n\t\t\tthis.setBackground(value);\n\t\t}\n\n\t\t// if(Utils.getParameterByName(\"elevationRange\")){\n\t\t//\tlet value = Utils.getParameterByName(\"elevationRange\");\n\t\t//\tvalue = value.replace(\"[\", \"\").replace(\"]\", \"\");\n\t\t//\tlet tokens = value.split(\";\");\n\t\t//\tlet x = parseFloat(tokens[0]);\n\t\t//\tlet y = parseFloat(tokens[1]);\n\t\t//\n\t\t//\tthis.setElevationRange(x, y);\n\t\t//\t//this.scene.view.target.set(x, y, z);\n\t\t// }\n\t};\n\n\t// ------------------------------------------------------------------------------------\n\t// Viewer Internals\n\t// ------------------------------------------------------------------------------------\n\n\tcreateControls () {\n\t\t{ // create FIRST PERSON CONTROLS\n\t\t\tthis.fpControls = new FirstPersonControls(this);\n\t\t\tthis.fpControls.enabled = false;\n\t\t\tthis.fpControls.addEventListener('start', this.disableAnnotations.bind(this));\n\t\t\tthis.fpControls.addEventListener('end', this.enableAnnotations.bind(this));\n\t\t}\n\n\t\t// { // create GEO CONTROLS\n\t\t//\tthis.geoControls = new GeoControls(this.scene.camera, this.renderer.domElement);\n\t\t//\tthis.geoControls.enabled = false;\n\t\t//\tthis.geoControls.addEventListener(\"start\", this.disableAnnotations.bind(this));\n\t\t//\tthis.geoControls.addEventListener(\"end\", this.enableAnnotations.bind(this));\n\t\t//\tthis.geoControls.addEventListener(\"move_speed_changed\", (event) => {\n\t\t//\t\tthis.setMoveSpeed(this.geoControls.moveSpeed);\n\t\t//\t});\n\t\t// }\n\n\t\t{ // create ORBIT CONTROLS\n\t\t\tthis.orbitControls = new OrbitControls(this);\n\t\t\tthis.orbitControls.enabled = false;\n\t\t\tthis.orbitControls.addEventListener('start', this.disableAnnotations.bind(this));\n\t\t\tthis.orbitControls.addEventListener('end', this.enableAnnotations.bind(this));\n\t\t}\n\n\t\t{ // create EARTH CONTROLS\n\t\t\tthis.earthControls = new EarthControls(this);\n\t\t\tthis.earthControls.enabled = false;\n\t\t\tthis.earthControls.addEventListener('start', this.disableAnnotations.bind(this));\n\t\t\tthis.earthControls.addEventListener('end', this.enableAnnotations.bind(this));\n\t\t}\n\n\t\t{ // create DEVICE ORIENTATION CONTROLS\n\t\t\tthis.deviceControls = new DeviceOrientationControls(this);\n\t\t\tthis.deviceControls.enabled = false;\n\t\t\tthis.deviceControls.addEventListener('start', this.disableAnnotations.bind(this));\n\t\t\tthis.deviceControls.addEventListener('end', this.enableAnnotations.bind(this));\n\t\t}\n\t};\n\n\ttoggleSidebar () {\n\t\tlet renderArea = $('#potree_render_area');\n\t\tlet isVisible = renderArea.css('left') !== '0px';\n\n\t\tif (isVisible) {\n\t\t\trenderArea.css('left', '0px');\n\t\t} else {\n\t\t\trenderArea.css('left', '300px');\n\t\t}\n\t};\n\n\ttoggleMap () {\n\t\t// let map = $('#potree_map');\n\t\t// map.toggle(100);\n\n\t\tif (this.mapView) {\n\t\t\tthis.mapView.toggle();\n\t\t}\n\t};\n\n\tonGUILoaded(callback){\n\t\tif(this.guiLoaded){\n\t\t\tcallback();\n\t\t}else{\n\t\t\tthis.guiLoadTasks.push(callback);\n\t\t}\n\t}\n\n\tpromiseGuiLoaded(){\n\t\treturn new Promise( resolve => {\n\n\t\t\tif(this.guiLoaded){\n\t\t\t\tresolve();\n\t\t\t}else{\n\t\t\t\tthis.guiLoadTasks.push(resolve);\n\t\t\t}\n\t\t\n\t\t});\n\t}\n\n\tloadGUI(callback){\n\n\t\tif(callback){\n\t\t\tthis.onGUILoaded(callback);\n\t\t}\n\n\t\tlet viewer = this;\n\t\tlet sidebarContainer = $('#potree_sidebar_container');\n\t\tsidebarContainer.load(new URL(Potree.scriptPath + '/sidebar.html').href, () => {\n\t\t\tsidebarContainer.css('width', '300px');\n\t\t\tsidebarContainer.css('height', '100%');\n\n\t\t\tlet imgMenuToggle = document.createElement('img');\n\t\t\timgMenuToggle.src = new URL(Potree.resourcePath + '/icons/menu_button.svg').href;\n\t\t\timgMenuToggle.onclick = this.toggleSidebar;\n\t\t\timgMenuToggle.classList.add('potree_menu_toggle');\n\n\t\t\tlet imgMapToggle = document.createElement('img');\n\t\t\timgMapToggle.src = new URL(Potree.resourcePath + '/icons/map_icon.png').href;\n\t\t\timgMapToggle.style.display = 'none';\n\t\t\timgMapToggle.onclick = e => { this.toggleMap(); };\n\t\t\timgMapToggle.id = 'potree_map_toggle';\n\n\t\t\tviewer.renderArea.insertBefore(imgMapToggle, viewer.renderArea.children[0]);\n\t\t\tviewer.renderArea.insertBefore(imgMenuToggle, viewer.renderArea.children[0]);\n\n\t\t\tthis.mapView = new MapView(this);\n\t\t\tthis.mapView.init();\n\n\t\t\ti18n.init({\n\t\t\t\tlng: 'en',\n\t\t\t\tresGetPath: Potree.resourcePath + '/lang/__lng__/__ns__.json',\n\t\t\t\tpreload: ['en', 'fr', 'de', 'jp', 'se', 'es'],\n\t\t\t\tgetAsync: true,\n\t\t\t\tdebug: false\n\t\t\t}, function (t) {\n\t\t\t\t// Start translation once everything is loaded\n\t\t\t\t$('body').i18n();\n\t\t\t});\n\n\t\t\t$(() => {\n\t\t\t\t//initSidebar(this);\n\t\t\t\tlet sidebar = new Sidebar(this);\n\t\t\t\tsidebar.init();\n\n\t\t\t\tthis.sidebar = sidebar;\n\n\t\t\t\t//if (callback) {\n\t\t\t\t//\t$(callback);\n\t\t\t\t//}\n\n\t\t\t\tlet elProfile = $('
    ').load(new URL(Potree.scriptPath + '/profile.html').href, () => {\n\t\t\t\t\t$(document.body).append(elProfile.children());\n\t\t\t\t\tthis.profileWindow = new ProfileWindow(this);\n\t\t\t\t\tthis.profileWindowController = new ProfileWindowController(this);\n\n\t\t\t\t\t$('#profile_window').draggable({\n\t\t\t\t\t\thandle: $('#profile_titlebar'),\n\t\t\t\t\t\tcontainment: $(document.body)\n\t\t\t\t\t});\n\t\t\t\t\t$('#profile_window').resizable({\n\t\t\t\t\t\tcontainment: $(document.body),\n\t\t\t\t\t\thandles: 'n, e, s, w'\n\t\t\t\t\t});\n\n\t\t\t\t\t$(() => {\n\t\t\t\t\t\tthis.guiLoaded = true;\n\t\t\t\t\t\tfor(let task of this.guiLoadTasks){\n\t\t\t\t\t\t\ttask();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\t\n\n\t\t\t});\n\n\t\t\t\n\t\t});\n\n\t\treturn this.promiseGuiLoaded();\n\t}\n\n\tsetLanguage (lang) {\n\t\ti18n.setLng(lang);\n\t\t$('body').i18n();\n\t}\n\n\tsetServer (server) {\n\t\tthis.server = server;\n\t}\n\n\tinitDragAndDrop(){\n\t\tfunction allowDrag(e) {\n\t\t\te.dataTransfer.dropEffect = 'copy';\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tlet dropHandler = async (event) => {\n\t\t\tconsole.log(event);\n\t\t\tevent.preventDefault();\n\n\t\t\tfor(const item of event.dataTransfer.items){\n\t\t\t\tconsole.log(item);\n\n\t\t\t\tif(item.kind !== \"file\"){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst file = item.getAsFile();\n\n\t\t\t\tconst isJson = file.name.toLowerCase().endsWith(\".json\");\n\t\t\t\tconst isGeoPackage = file.name.toLowerCase().endsWith(\".gpkg\");\n\n\t\t\t\tif(isJson){\n\t\t\t\t\ttry{\n\n\t\t\t\t\t\tconst text = await file.text();\n\t\t\t\t\t\tconst json = JSON.parse(text);\n\n\t\t\t\t\t\tif(json.type === \"Potree\"){\n\t\t\t\t\t\t\tPotree.loadProject(viewer, json);\n\t\t\t\t\t\t}\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\tconsole.error(\"failed to parse the dropped file as JSON\");\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t}\n\t\t\t\t}else if(isGeoPackage){\n\t\t\t\t\tconst hasPointcloud = viewer.scene.pointclouds.length > 0;\n\n\t\t\t\t\tif(!hasPointcloud){\n\t\t\t\t\t\tlet msg = \"At least one point cloud is needed that specifies the \";\n\t\t\t\t\t\tmsg += \"coordinate reference system before loading vector data.\";\n\t\t\t\t\t\tconsole.error(msg);\n\t\t\t\t\t}else{\n\n\t\t\t\t\t\tproj4.defs(\"WGS84\", \"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs\");\n\t\t\t\t\t\tproj4.defs(\"pointcloud\", this.getProjection());\n\t\t\t\t\t\tlet transform = proj4(\"WGS84\", \"pointcloud\");\n\n\t\t\t\t\t\tconst buffer = await file.arrayBuffer();\n\n\t\t\t\t\t\tconst params = {\n\t\t\t\t\t\t\ttransform: transform,\n\t\t\t\t\t\t\tsource: file.name,\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\tconst geo = await Potree.GeoPackageLoader.loadBuffer(buffer, params);\n\t\t\t\t\t\tviewer.scene.addGeopackage(geo);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t};\n\n\n\t\t$(\"body\")[0].addEventListener(\"dragenter\", allowDrag);\n\t\t$(\"body\")[0].addEventListener(\"dragover\", allowDrag);\n\t\t$(\"body\")[0].addEventListener(\"drop\", dropHandler);\n\t}\n\n\tinitThree () {\n\n\t\tconsole.log(`initializing three.js ${THREE.REVISION}`);\n\n\t\tlet width = this.renderArea.clientWidth;\n\t\tlet height = this.renderArea.clientHeight;\n\n\t\tlet contextAttributes = {\n\t\t\talpha: true,\n\t\t\tdepth: true,\n\t\t\tstencil: false,\n\t\t\tantialias: false,\n\t\t\t//premultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: true,\n\t\t\tpowerPreference: \"high-performance\",\n\t\t};\n\n\t\t// let contextAttributes = {\n\t\t// \talpha: false,\n\t\t// \tpreserveDrawingBuffer: true,\n\t\t// };\n\n\t\t// let contextAttributes = {\n\t\t// \talpha: false,\n\t\t// \tpreserveDrawingBuffer: true,\n\t\t// };\n\n\t\tlet canvas = document.createElement(\"canvas\");\n\n\t\tlet context = canvas.getContext('webgl', contextAttributes );\n\n\t\tthis.renderer = new THREE.WebGLRenderer({\n\t\t\talpha: true, \n\t\t\tpremultipliedAlpha: false,\n\t\t\tcanvas: canvas,\n\t\t\tcontext: context});\n\t\tthis.renderer.sortObjects = false;\n\t\tthis.renderer.setSize(width, height);\n\t\tthis.renderer.autoClear = false;\n\t\tthis.renderArea.appendChild(this.renderer.domElement);\n\t\tthis.renderer.domElement.tabIndex = '2222';\n\t\tthis.renderer.domElement.style.position = 'absolute';\n\t\tthis.renderer.domElement.addEventListener('mousedown', () => {\n\t\t\tthis.renderer.domElement.focus();\n\t\t});\n\t\t//this.renderer.domElement.focus();\n\n\t\t// NOTE: If extension errors occur, pass the string into this.renderer.extensions.get(x) before enabling\n\t\t// enable frag_depth extension for the interpolation shader, if available\n\t\tlet gl = this.renderer.getContext();\n\t\tgl.getExtension('EXT_frag_depth');\n\t\tgl.getExtension('WEBGL_depth_texture');\n\t\tgl.getExtension('WEBGL_color_buffer_float'); \t// Enable explicitly for more portability, EXT_color_buffer_float is the proper name in WebGL 2\n\t\t\n\t\t//if(gl instanceof WebGLRenderingContext){\n\t\t\tlet extVAO = gl.getExtension('OES_vertex_array_object');\n\n\t\t\tif(!extVAO){\n\t\t\t\tthrow new Error(\"OES_vertex_array_object extension not supported\");\n\t\t\t}\n\n\t\t\tgl.createVertexArray = extVAO.createVertexArrayOES.bind(extVAO);\n\t\t\tgl.bindVertexArray = extVAO.bindVertexArrayOES.bind(extVAO);\n\t\t//}else if(gl instanceof WebGL2RenderingContext){\n\t\t//\tgl.getExtension(\"EXT_color_buffer_float\");\n\t\t//}\n\t\t\n\t}\n\n\tonVr(callback){\n\n\t\tif(this.vr){\n\t\t\tcallback();\n\t\t}else{\n\t\t\tthis.onVrListeners.push(callback);\n\t\t}\n\n\t}\n\n\tasync prepareVR(){\n\n\t\tif(!navigator.getVRDisplays){\n\t\t\tconsole.info(\"browser does not support WebVR\");\n\n\t\t\treturn false;\n\t\t}\n\n\t\ttry{\n\t\t\tlet frameData = new VRFrameData();\n\t\t\tlet displays = await navigator.getVRDisplays();\n\n\t\t\tif(displays.length == 0){\n\t\t\t\tconsole.info(\"no VR display found\");\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tlet display = displays[displays.length - 1];\n\t\t\tdisplay.depthNear = 0.1;\n\t\t\tdisplay.depthFar = 10000.0;\n\n\t\t\tif(!display.capabilities.canPresent){\n\t\t\t\t// Not sure why canPresent would ever be false?\n\t\t\t\tconsole.error(\"VR display canPresent === false\");\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.vr = {\n\t\t\t\tframeData: frameData,\n\t\t\t\tdisplay: display,\n\t\t\t\tnode: new THREE.Object3D(),\n\t\t\t};\n\n\t\t\tfor(const listener of this.onVrListeners){\n\t\t\t\tlistener();\n\t\t\t}\n\t\t}catch(err){\n\t\t\tconsole.error(err);\n\n\t\t\treturn false;\n\t\t}\n\t\t\n\t}\n\n\tupdateAnnotations () {\n\n\t\tif(!this.visibleAnnotations){\n\t\t\tthis.visibleAnnotations = new Set();\n\t\t}\n\n\t\tthis.scene.annotations.updateBounds();\n\t\tthis.scene.cameraP.updateMatrixWorld();\n\t\tthis.scene.cameraO.updateMatrixWorld();\n\t\t\n\t\tlet distances = [];\n\n\t\tlet renderAreaSize = this.renderer.getSize(new THREE.Vector2());\n\n\t\tlet viewer = this;\n\n\t\tlet visibleNow = [];\n\t\tthis.scene.annotations.traverse(annotation => {\n\n\t\t\tif (annotation === this.scene.annotations) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!annotation.visible) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tannotation.scene = this.scene;\n\n\t\t\tlet element = annotation.domElement;\n\n\t\t\tlet position = annotation.position.clone();\n\t\t\tposition.add(annotation.offset);\n\t\t\tif (!position) {\n\t\t\t\tposition = annotation.boundingBox.getCenter(new THREE.Vector3());\n\t\t\t}\n\n\t\t\tlet distance = viewer.scene.cameraP.position.distanceTo(position);\n\t\t\tlet radius = annotation.boundingBox.getBoundingSphere(new THREE.Sphere()).radius;\n\n\t\t\tlet screenPos = new THREE.Vector3();\n\t\t\tlet screenSize = 0;\n\n\t\t\t{\n\t\t\t\t// SCREEN POS\n\t\t\t\tscreenPos.copy(position).project(this.scene.getActiveCamera());\n\t\t\t\tscreenPos.x = renderAreaSize.x * (screenPos.x + 1) / 2;\n\t\t\t\tscreenPos.y = renderAreaSize.y * (1 - (screenPos.y + 1) / 2);\n\n\n\t\t\t\t// SCREEN SIZE\n\t\t\t\tif(viewer.scene.cameraMode == CameraMode.PERSPECTIVE) {\n\t\t\t\t\tlet fov = Math.PI * viewer.scene.cameraP.fov / 180;\n\t\t\t\t\tlet slope = Math.tan(fov / 2.0);\n\t\t\t\t\tlet projFactor = 0.5 * renderAreaSize.y / (slope * distance);\n\t\t\t\t\tscreenSize = radius * projFactor;\n\t\t\t\t} else {\n\t\t\t\t\tscreenSize = Utils.projectedRadiusOrtho(radius, viewer.scene.cameraO.projectionMatrix, renderAreaSize.x, renderAreaSize.y);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telement.css(\"left\", screenPos.x + \"px\");\n\t\t\telement.css(\"top\", screenPos.y + \"px\");\n\t\t\t//element.css(\"display\", \"block\");\n\n\t\t\tlet zIndex = 10000000 - distance * (10000000 / this.scene.cameraP.far);\n\t\t\tif(annotation.descriptionVisible){\n\t\t\t\tzIndex += 10000000;\n\t\t\t}\n\t\t\telement.css(\"z-index\", parseInt(zIndex));\n\n\t\t\tif(annotation.children.length > 0){\n\t\t\t\tlet expand = screenSize > annotation.collapseThreshold || annotation.boundingBox.containsPoint(this.scene.getActiveCamera().position);\n\t\t\t\tannotation.expand = expand;\n\n\t\t\t\tif (!expand) {\n\t\t\t\t\t//annotation.display = (screenPos.z >= -1 && screenPos.z <= 1);\n\t\t\t\t\tlet inFrustum = (screenPos.z >= -1 && screenPos.z <= 1);\n\t\t\t\t\tif(inFrustum){\n\t\t\t\t\t\tvisibleNow.push(annotation);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn expand;\n\t\t\t} else {\n\t\t\t\t//annotation.display = (screenPos.z >= -1 && screenPos.z <= 1);\n\t\t\t\tlet inFrustum = (screenPos.z >= -1 && screenPos.z <= 1);\n\t\t\t\tif(inFrustum){\n\t\t\t\t\tvisibleNow.push(annotation);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t});\n\n\t\tlet notVisibleAnymore = new Set(this.visibleAnnotations);\n\t\tfor(let annotation of visibleNow){\n\t\t\tannotation.display = true;\n\t\t\t\n\t\t\tnotVisibleAnymore.delete(annotation);\n\t\t}\n\t\tthis.visibleAnnotations = visibleNow;\n\n\t\tfor(let annotation of notVisibleAnymore){\n\t\t\tannotation.display = false;\n\t\t}\n\n\t}\n\n\tupdateMaterialDefaults(pointcloud){\n\t\t// PROBLEM STATEMENT:\n\t\t// * [min, max] of intensity, source id, etc. are computed as point clouds are loaded\n\t\t// * the point cloud material won't know the range it should use until some data is loaded\n\t\t// * users can modify the range at runtime, but sensible default ranges should be \n\t\t// applied even if no GUI is present\n\t\t// * display ranges shouldn't suddenly change even if the actual range changes over time.\n\t\t// e.g. the root node has intensity range [1, 478]. One of the descendants increases range to \n\t\t// [0, 2047]. We should not automatically change to the new range because that would result\n\t\t// in sudden and drastic changes of brightness. We should adjust the min/max of the sidebar slider.\n\n\t\tconst material = pointcloud.material;\n\n\t\t// const attIntensity = pointcloud.getAttribute(\"intensity\");\n\t\t// if(attIntensity && material.intensityRange[0] === Infinity){\n\t\t// \tmaterial.intensityRange = [...attIntensity.range];\n\t\t// }\n\n\t\t// let attributes = pointcloud.getAttributes();\n\n\t\t// for(let attribute of attributes.attributes){\n\t\t// \tif(attribute.range){\n\t\t// \t\tlet range = [...attribute.range];\n\t\t// \t\tmaterial.computedRange.set(attribute.name, range);\n\t\t// \t\t//material.setRange(attribute.name, range);\n\t\t// \t}\n\t\t// }\n\n\n\t}\n\n\tupdate(delta, timestamp){\n\n\t\tif(Potree.measureTimings) performance.mark(\"update-start\");\n\n\t\t\n\t\tconst scene = this.scene;\n\t\tconst camera = scene.getActiveCamera();\n\t\tconst visiblePointClouds = this.scene.pointclouds.filter(pc => pc.visible)\n\t\t\n\t\tPotree.pointLoadLimit = Potree.pointBudget * 2;\n\n\t\tconst lTarget = camera.position.clone().add(camera.getWorldDirection(new THREE.Vector3()).multiplyScalar(1000));\n\t\tthis.scene.directionalLight.position.copy(camera.position);\n\t\tthis.scene.directionalLight.lookAt(lTarget);\n\n\n\t\tfor (let pointcloud of visiblePointClouds) {\n\n\t\t\tpointcloud.showBoundingBox = this.showBoundingBox;\n\t\t\tpointcloud.generateDEM = this.generateDEM;\n\t\t\tpointcloud.minimumNodePixelSize = this.minNodeSize;\n\n\t\t\tlet material = pointcloud.material;\n\n\t\t\tmaterial.uniforms.uFilterReturnNumberRange.value = this.filterReturnNumberRange;\n\t\t\tmaterial.uniforms.uFilterNumberOfReturnsRange.value = this.filterNumberOfReturnsRange;\n\t\t\tmaterial.uniforms.uFilterGPSTimeClipRange.value = this.filterGPSTimeRange;\n\t\t\tmaterial.uniforms.uFilterPointSourceIDClipRange.value = this.filterPointSourceIDRange;\n\n\t\t\tmaterial.classification = this.classifications;\n\t\t\tmaterial.recomputeClassification();\n\n\t\t\tthis.updateMaterialDefaults(pointcloud);\n\t\t}\n\n\t\t{\n\t\t\tif(this.showBoundingBox){\n\t\t\t\tlet bbRoot = this.scene.scene.getObjectByName(\"potree_bounding_box_root\");\n\t\t\t\tif(!bbRoot){\n\t\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\t\tnode.name = \"potree_bounding_box_root\";\n\t\t\t\t\tthis.scene.scene.add(node);\n\t\t\t\t\tbbRoot = node;\n\t\t\t\t}\n\n\t\t\t\tlet visibleBoxes = [];\n\t\t\t\tfor(let pointcloud of this.scene.pointclouds){\n\t\t\t\t\tfor(let node of pointcloud.visibleNodes.filter(vn => vn.boundingBoxNode !== undefined)){\n\t\t\t\t\t\tlet box = node.boundingBoxNode;\n\t\t\t\t\t\tvisibleBoxes.push(box);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbbRoot.children = visibleBoxes;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.freeze) {\n\t\t\tlet result = Potree.updatePointClouds(scene.pointclouds, camera, this.renderer);\n\n\n\t\t\t// DEBUG - ONLY DISPLAY NODES THAT INTERSECT MOUSE\n\t\t\t//if(false){ \n\n\t\t\t//\tlet renderer = viewer.renderer;\n\t\t\t//\tlet mouse = viewer.inputHandler.mouse;\n\n\t\t\t//\tlet nmouse = {\n\t\t\t//\t\tx: (mouse.x / renderer.domElement.clientWidth) * 2 - 1,\n\t\t\t//\t\ty: -(mouse.y / renderer.domElement.clientHeight) * 2 + 1\n\t\t\t//\t};\n\n\t\t\t//\tlet pickParams = {};\n\n\t\t\t//\t//if(params.pickClipped){\n\t\t\t//\t//\tpickParams.pickClipped = params.pickClipped;\n\t\t\t//\t//}\n\n\t\t\t//\tpickParams.x = mouse.x;\n\t\t\t//\tpickParams.y = renderer.domElement.clientHeight - mouse.y;\n\n\t\t\t//\tlet raycaster = new THREE.Raycaster();\n\t\t\t//\traycaster.setFromCamera(nmouse, camera);\n\t\t\t//\tlet ray = raycaster.ray;\n\n\t\t\t//\tfor(let pointcloud of scene.pointclouds){\n\t\t\t//\t\tlet nodes = pointcloud.nodesOnRay(pointcloud.visibleNodes, ray);\n\t\t\t//\t\tpointcloud.visibleNodes = nodes;\n\n\t\t\t//\t}\n\t\t\t//}\n\n\t\t\t// const tStart = performance.now();\n\t\t\t// const worldPos = new THREE.Vector3();\n\t\t\t// const camPos = viewer.scene.getActiveCamera().getWorldPosition(new THREE.Vector3());\n\t\t\t// let lowestDistance = Infinity;\n\t\t\t// let numNodes = 0;\n\n\t\t\t// viewer.scene.scene.traverse(node => {\n\t\t\t// \tnode.getWorldPosition(worldPos);\n\n\t\t\t// \tconst distance = worldPos.distanceTo(camPos);\n\n\t\t\t// \tlowestDistance = Math.min(lowestDistance, distance);\n\n\t\t\t// \tnumNodes++;\n\n\t\t\t// \tif(Number.isNaN(distance)){\n\t\t\t// \t\tconsole.error(\":(\");\n\t\t\t// \t}\n\t\t\t// });\n\t\t\t// const duration = (performance.now() - tStart).toFixed(2);\n\n\t\t\t// Potree.debug.computeNearDuration = duration;\n\t\t\t// Potree.debug.numNodes = numNodes;\n\n\t\t\t//console.log(lowestDistance.toString(2), duration);\n\n\t\t\tconst tStart = performance.now();\n\t\t\tconst campos = camera.position;\n\t\t\tlet closestImage = Infinity;\n\t\t\tfor(const images of this.scene.orientedImages){\n\t\t\t\tfor(const image of images.images){\n\t\t\t\t\tconst distance = image.mesh.position.distanceTo(campos);\n\n\t\t\t\t\tclosestImage = Math.min(closestImage, distance);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst tEnd = performance.now();\n\n\t\t\tif(result.lowestSpacing !== Infinity){\n\t\t\t\tlet near = result.lowestSpacing * 10.0;\n\t\t\t\tlet far = -this.getBoundingBox().applyMatrix4(camera.matrixWorldInverse).min.z;\n\n\t\t\t\tfar = Math.max(far * 1.5, 10000);\n\t\t\t\tnear = Math.min(100.0, Math.max(0.01, near));\n\t\t\t\tnear = Math.min(near, closestImage);\n\t\t\t\tfar = Math.max(far, near + 10000);\n\n\t\t\t\tif(near === Infinity){\n\t\t\t\t\tnear = 0.1;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcamera.near = near;\n\t\t\t\tcamera.far = far;\n\t\t\t}else{\n\t\t\t\t// don't change near and far in this case\n\t\t\t}\n\n\t\t\tif(this.scene.cameraMode == CameraMode.ORTHOGRAPHIC) {\n\t\t\t\tcamera.near = -camera.far;\n\t\t\t}\n\t\t} \n\t\t\n\t\tthis.scene.cameraP.fov = this.fov;\n\t\t\n\t\tif (this.getControls() === this.deviceControls) {\n\t\t\tthis.controls.setScene(scene);\n\t\t\tthis.controls.update(delta);\n\n\t\t\tthis.scene.cameraP.position.copy(scene.view.position);\n\t\t\tthis.scene.cameraO.position.copy(scene.view.position);\n\t\t} else if (this.controls !== null) {\n\t\t\tthis.controls.setScene(scene);\n\t\t\tthis.controls.update(delta);\n\n\t\t\tif(typeof debugDisabled === \"undefined\" ){\n\t\t\t\tthis.scene.cameraP.position.copy(scene.view.position);\n\t\t\t\tthis.scene.cameraP.rotation.order = \"ZXY\";\n\t\t\t\tthis.scene.cameraP.rotation.x = Math.PI / 2 + this.scene.view.pitch;\n\t\t\t\tthis.scene.cameraP.rotation.z = this.scene.view.yaw;\n\t\t\t}\n\n\t\t\tthis.scene.cameraO.position.copy(scene.view.position);\n\t\t\tthis.scene.cameraO.rotation.order = \"ZXY\";\n\t\t\tthis.scene.cameraO.rotation.x = Math.PI / 2 + this.scene.view.pitch;\n\t\t\tthis.scene.cameraO.rotation.z = this.scene.view.yaw;\n\t\t}\n\t\t\n\t\tcamera.updateMatrix();\n\t\tcamera.updateMatrixWorld();\n\t\tcamera.matrixWorldInverse.getInverse(camera.matrixWorld);\n\n\t\t{\n\t\t\tif(this._previousCamera === undefined){\n\t\t\t\tthis._previousCamera = this.scene.getActiveCamera().clone();\n\t\t\t\tthis._previousCamera.rotation.copy(this.scene.getActiveCamera());\n\t\t\t}\n\n\t\t\tif(!this._previousCamera.matrixWorld.equals(camera.matrixWorld)){\n\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\ttype: \"camera_changed\",\n\t\t\t\t\tprevious: this._previousCamera,\n\t\t\t\t\tcamera: camera\n\t\t\t\t});\n\t\t\t}else if(!this._previousCamera.projectionMatrix.equals(camera.projectionMatrix)){\n\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\ttype: \"camera_changed\",\n\t\t\t\t\tprevious: this._previousCamera,\n\t\t\t\t\tcamera: camera\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._previousCamera = this.scene.getActiveCamera().clone();\n\t\t\tthis._previousCamera.rotation.copy(this.scene.getActiveCamera());\n\n\t\t}\n\n\t\t{ // update clip boxes\n\t\t\tlet boxes = [];\n\t\t\t\n\t\t\t// volumes with clipping enabled\n\t\t\t//boxes.push(...this.scene.volumes.filter(v => (v.clip)));\n\t\t\tboxes.push(...this.scene.volumes.filter(v => (v.clip && v instanceof BoxVolume)));\n\n\t\t\t// profile segments\n\t\t\tfor(let profile of this.scene.profiles){\n\t\t\t\tboxes.push(...profile.boxes);\n\t\t\t}\n\t\t\t\n\t\t\t// Needed for .getInverse(), pre-empt a determinant of 0, see #815 / #816\n\t\t\tlet degenerate = (box) => box.matrixWorld.determinant() !== 0;\n\t\t\t\n\t\t\tlet clipBoxes = boxes.filter(degenerate).map( box => {\n\t\t\t\tbox.updateMatrixWorld();\n\t\t\t\t\n\t\t\t\tlet boxInverse = new THREE.Matrix4().getInverse(box.matrixWorld);\n\t\t\t\tlet boxPosition = box.getWorldPosition(new THREE.Vector3());\n\n\t\t\t\treturn {box: box, inverse: boxInverse, position: boxPosition};\n\t\t\t});\n\n\t\t\tlet clipPolygons = this.scene.polygonClipVolumes.filter(vol => vol.initialized);\n\t\t\t\n\t\t\t// set clip volumes in material\n\t\t\tfor(let pointcloud of visiblePointClouds){\n\t\t\t\tpointcloud.material.setClipBoxes(clipBoxes);\n\t\t\t\tpointcloud.material.setClipPolygons(clipPolygons, this.clippingTool.maxPolygonVertices);\n\t\t\t\tpointcloud.material.clipTask = this.clipTask;\n\t\t\t\tpointcloud.material.clipMethod = this.clipMethod;\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tfor(let pointcloud of visiblePointClouds){\n\t\t\t\tpointcloud.material.elevationGradientRepeat = this.elevationGradientRepeat;\n\t\t\t}\n\t\t}\n\t\t\n\t\t{ // update navigation cube\n\t\t\tthis.navigationCube.update(camera.rotation);\n\t\t}\n\n\t\tthis.updateAnnotations();\n\t\t\n\t\tif(this.mapView){\n\t\t\tthis.mapView.update(delta);\n\t\t\tif(this.mapView.sceneProjection){\n\t\t\t\t$( \"#potree_map_toggle\" ).css(\"display\", \"block\");\n\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t\tTWEEN.update(timestamp);\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'update',\n\t\t\tdelta: delta,\n\t\t\ttimestamp: timestamp});\n\t\t\t\n\t\tif(Potree.measureTimings) {\n\t\t\tperformance.mark(\"update-end\");\n\t\t\tperformance.measure(\"update\", \"update-start\", \"update-end\");\n\t\t}\n\t}\n\t\n\trender(){\n\t\tif(Potree.measureTimings) performance.mark(\"render-start\");\n\n\t\ttry{\n\n\t\t\tlet pRenderer = null;\n\n\t\t\tif(this.useHQ){\n\t\t\t\tif (!this.hqRenderer) {\n\t\t\t\t\tthis.hqRenderer = new HQSplatRenderer(this);\n\t\t\t\t}\n\t\t\t\tthis.hqRenderer.useEDL = this.useEDL;\n\t\t\t\t//this.hqRenderer.render(this.renderer);\n\n\t\t\t\tpRenderer = this.hqRenderer;\n\t\t\t}else{\n\t\t\t\tif (this.useEDL && Features.SHADER_EDL.isSupported()) {\n\t\t\t\t\tif (!this.edlRenderer) {\n\t\t\t\t\t\tthis.edlRenderer = new EDLRenderer(this);\n\t\t\t\t\t}\n\t\t\t\t\t//this.edlRenderer.render(this.renderer);\n\t\t\t\t\tpRenderer = this.edlRenderer;\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.potreeRenderer) {\n\t\t\t\t\t\tthis.potreeRenderer = new PotreeRenderer(this);\n\t\t\t\t\t}\n\t\t\t\t\t//this.potreeRenderer.render();\n\t\t\t\t\tpRenderer = this.potreeRenderer;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tconst vr = this.vr;\n\t\t\tconst vrActive = (vr && vr.display.isPresenting);\n\n\t\t\tif(vrActive){\n\n\t\t\t\tconst {display, frameData} = vr;\n\n\t\t\t\tconst leftEye = display.getEyeParameters(\"left\");\n\t\t\t\tconst rightEye = display.getEyeParameters(\"right\");\n\n\t\t\t\tlet width = Math.max(leftEye.renderWidth, rightEye.renderWidth) * 2;\n\t\t\t\tlet height = Math.max(leftEye.renderHeight, rightEye.renderHeight);\n\n\t\t\t\t// width *= 0.5;\n\t\t\t\t// height *= 0.5;\n\n\t\t\t\tthis.renderer.setSize(width, height);\n\n\t\t\t\tpRenderer.clear();\n\n\t\t\t\t//const camera = new THREE.Camera();\n\t\t\t\tviewer.scene.cameraMode = CameraMode.VR;\n\t\t\t\tconst camera = viewer.scene.getActiveCamera();\n\t\t\t\t{\n\t\t\t\t\tcamera.near = display.depthNear;\n\t\t\t\t\tcamera.far = display.depthFar;\n\t\t\t\t\tcamera.projectionMatrix = new THREE.Matrix4();\n\t\t\t\t\tcamera.matrixWorldInverse = new THREE.Matrix4();\n\t\t\t\t\tcamera.matrixWorld = new THREE.Matrix4();\n\t\t\t\t\tcamera.updateProjectionMatrix = () => {};\n\t\t\t\t\tcamera.updateMatrixWorld = () => {};\n\t\t\t\t\tcamera.fov = 60;\n\t\t\t\t};\n\n\t\t\t\tconst flipWorld = new THREE.Matrix4().fromArray([\n\t\t\t\t\t1, 0, 0, 0, \n\t\t\t\t\t0, 0, 1, 0, \n\t\t\t\t\t0, -1, 0, 0,\n\t\t\t\t\t0, 0, 0, 1\n\t\t\t\t]);\n\t\t\t\tconst flipView = new THREE.Matrix4().getInverse(flipWorld);\n\n\t\t\t\tvr.node.updateMatrixWorld();\n\n\t\t\t\t{// LEFT\n\t\t\t\t\tcamera.projectionMatrix.fromArray(frameData.leftProjectionMatrix);\n\n\t\t\t\t\tconst leftView = new THREE.Matrix4().fromArray(frameData.leftViewMatrix);\n\t\t\t\t\tconst view = new THREE.Matrix4().multiplyMatrices(leftView, flipView);\n\t\t\t\t\tconst world = new THREE.Matrix4().getInverse(view);\n\n\t\t\t\t\t{\n\t\t\t\t\t\tconst tmp = new THREE.Matrix4().multiplyMatrices(vr.node.matrixWorld, world);\n\t\t\t\t\t\tworld.copy(tmp);\n\t\t\t\t\t\tview.getInverse(world);\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrixWorldInverse.copy(view);\n\t\t\t\t\tcamera.matrixWorld.copy(world);\n\n\t\t\t\t\tconst viewport = [0, 0, width / 2, height];\n\n\t\t\t\t\tthis.renderer.setViewport(...viewport);\n\t\t\t\t\tpRenderer.render({camera: camera, viewport: viewport});\n\t\t\t\t\t//this.renderer.render(this.overlay, this.overlayCamera);\n\t\t\t\t}\n\n\t\t\t\t{// RIGHT\n\t\t\t\t\n\t\t\t\t\tcamera.projectionMatrix.fromArray(frameData.rightProjectionMatrix);\n\n\t\t\t\t\tconst rightView = new THREE.Matrix4().fromArray(frameData.rightViewMatrix);\n\t\t\t\t\tconst view = new THREE.Matrix4().multiplyMatrices(rightView, flipView);\n\t\t\t\t\tconst world = new THREE.Matrix4().getInverse(view);\n\n\t\t\t\t\t{\n\t\t\t\t\t\tconst tmp = new THREE.Matrix4().multiplyMatrices(vr.node.matrixWorld, world);\n\t\t\t\t\t\tworld.copy(tmp);\n\t\t\t\t\t\tview.getInverse(world);\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrixWorldInverse.copy(view);\n\t\t\t\t\tcamera.matrixWorld.copy(world);\n\n\t\t\t\t\tconst viewport = [width / 2, 0, width / 2, height];\n\n\t\t\t\t\tthis.renderer.setViewport(...viewport);\n\t\t\t\t\tpRenderer.clearTargets();\n\t\t\t\t\tpRenderer.render({camera: camera, viewport: viewport, debug: 2});\n\t\t\t\t\t//this.renderer.render(this.overlay, this.overlayCamera);\n\t\t\t\t}\n\n\t\t\t\t{ // CENTER\n\n\t\t\t\t\t{ // central view matrix\n\t\t\t\t\t\t// TODO this can't be right...can it?\n\n\t\t\t\t\t\tconst left = frameData.leftViewMatrix;\n\t\t\t\t\t\tconst right = frameData.rightViewMatrix\n\n\t\t\t\t\t\tconst centerView = new THREE.Matrix4();\n\n\t\t\t\t\t\tfor(let i = 0; i < centerView.elements.length; i++){\n\t\t\t\t\t\t\tcenterView.elements[i] = (left[i] + right[i]) / 2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst view = new THREE.Matrix4().multiplyMatrices(centerView, flipView);\n\t\t\t\t\t\tconst world = new THREE.Matrix4().getInverse(view);\n\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst tmp = new THREE.Matrix4().multiplyMatrices(vr.node.matrixWorld, world);\n\t\t\t\t\t\t\tworld.copy(tmp);\n\t\t\t\t\t\t\tview.getInverse(world);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcamera.matrixWorldInverse.copy(view);\n\t\t\t\t\t\tcamera.matrixWorld.copy(world);\n\t\t\t\t\t}\n\n\n\t\t\t\t\tcamera.fov = leftEye.fieldOfView.upDegrees;\n\t\t\t\t}\n\n\t\t\t}else{\n\n\t\t\t\t{ // resize\n\t\t\t\t\tconst width = this.scaleFactor * this.renderArea.clientWidth;\n\t\t\t\t\tconst height = this.scaleFactor * this.renderArea.clientHeight;\n\n\t\t\t\t\tthis.renderer.setSize(width, height);\n\t\t\t\t\tconst pixelRatio = this.renderer.getPixelRatio();\n\t\t\t\t\tconst aspect = width / height;\n\n\t\t\t\t\tconst scene = this.scene;\n\n\t\t\t\t\tscene.cameraP.aspect = aspect;\n\t\t\t\t\tscene.cameraP.updateProjectionMatrix();\n\n\t\t\t\t\tlet frustumScale = this.scene.view.radius;\n\t\t\t\t\tscene.cameraO.left = -frustumScale;\n\t\t\t\t\tscene.cameraO.right = frustumScale;\n\t\t\t\t\tscene.cameraO.top = frustumScale * 1 / aspect;\n\t\t\t\t\tscene.cameraO.bottom = -frustumScale * 1 / aspect;\n\t\t\t\t\tscene.cameraO.updateProjectionMatrix();\n\n\t\t\t\t\tscene.cameraScreenSpace.top = 1/aspect;\n\t\t\t\t\tscene.cameraScreenSpace.bottom = -1/aspect;\n\t\t\t\t\tscene.cameraScreenSpace.updateProjectionMatrix();\n\t\t\t\t}\n\n\t\t\t\tpRenderer.clear();\n\n\t\t\t\tpRenderer.render(this.renderer);\n\t\t\t\tthis.renderer.render(this.overlay, this.overlayCamera);\n\t\t\t}\n\n\t\t}catch(e){\n\t\t\tthis.onCrash(e);\n\t\t}\n\t\t\n\t\tif(Potree.measureTimings){\n\t\t\tperformance.mark(\"render-end\");\n\t\t\tperformance.measure(\"render\", \"render-start\", \"render-end\");\n\t\t}\n\t}\n\n\tresolveTimings(timestamp){\n\t\tif(Potree.measureTimings){\n\t\t\tif(!this.toggle){\n\t\t\t\tthis.toggle = timestamp;\n\t\t\t}\n\t\t\tlet duration = timestamp - this.toggle;\n\t\t\tif(duration > 1000.0){\n\t\t\t\n\t\t\t\tlet measures = performance.getEntriesByType(\"measure\");\n\t\t\t\t\n\t\t\t\tlet names = new Set();\n\t\t\t\tfor(let measure of measures){\n\t\t\t\t\tnames.add(measure.name);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlet groups = new Map();\n\t\t\t\tfor(let name of names){\n\t\t\t\t\tgroups.set(name, {\n\t\t\t\t\t\tmeasures: [],\n\t\t\t\t\t\tsum: 0,\n\t\t\t\t\t\tn: 0,\n\t\t\t\t\t\tmin: Infinity,\n\t\t\t\t\t\tmax: -Infinity\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor(let measure of measures){\n\t\t\t\t\tlet group = groups.get(measure.name);\n\t\t\t\t\tgroup.measures.push(measure);\n\t\t\t\t\tgroup.sum += measure.duration;\n\t\t\t\t\tgroup.n++;\n\t\t\t\t\tgroup.min = Math.min(group.min, measure.duration);\n\t\t\t\t\tgroup.max = Math.max(group.max, measure.duration);\n\t\t\t\t}\n\n\t\t\t\tlet glQueries = Potree.resolveQueries(this.renderer.getContext());\n\t\t\t\tfor(let [key, value] of glQueries){\n\n\t\t\t\t\tlet group = {\n\t\t\t\t\t\tmeasures: value.map(v => {return {duration: v}}),\n\t\t\t\t\t\tsum: value.reduce( (a, i) => a + i, 0),\n\t\t\t\t\t\tn: value.length,\n\t\t\t\t\t\tmin: Math.min(...value),\n\t\t\t\t\t\tmax: Math.max(...value)\n\t\t\t\t\t};\n\n\t\t\t\t\tlet groupname = `[tq] ${key}`;\n\t\t\t\t\tgroups.set(groupname, group);\n\t\t\t\t\tnames.add(groupname);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor(let [name, group] of groups){\n\t\t\t\t\tgroup.mean = group.sum / group.n;\n\t\t\t\t\tgroup.measures.sort( (a, b) => a.duration - b.duration );\n\t\t\t\t\t\n\t\t\t\t\tif(group.n === 1){\n\t\t\t\t\t\tgroup.median = group.measures[0].duration;\n\t\t\t\t\t}else if(group.n > 1){\n\t\t\t\t\t\tgroup.median = group.measures[parseInt(group.n / 2)].duration;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlet cn = Array.from(names).reduce( (a, i) => Math.max(a, i.length), 0) + 5;\n\t\t\t\tlet cmin = 10;\n\t\t\t\tlet cmed = 10;\n\t\t\t\tlet cmax = 10;\n\t\t\t\tlet csam = 6;\n\t\t\t\t\n\t\t\t\tlet message = ` ${\"NAME\".padEnd(cn)} |` \n\t\t\t\t\t+ ` ${\"MIN\".padStart(cmin)} |`\n\t\t\t\t\t+ ` ${\"MEDIAN\".padStart(cmed)} |`\n\t\t\t\t\t+ ` ${\"MAX\".padStart(cmax)} |`\n\t\t\t\t\t+ ` ${\"SAMPLES\".padStart(csam)} \\n`;\n\t\t\t\tmessage += ` ${\"-\".repeat(message.length) }\\n`;\n\t\t\t\t\n\t\t\t\tnames = Array.from(names).sort();\n\t\t\t\tfor(let name of names){\n\t\t\t\t\tlet group = groups.get(name);\n\t\t\t\t\tlet min = group.min.toFixed(3);\n\t\t\t\t\tlet median = group.median.toFixed(3);\n\t\t\t\t\tlet max = group.max.toFixed(3);\n\t\t\t\t\tlet n = group.n;\n\t\t\t\t\t\n\t\t\t\t\tmessage += ` ${name.padEnd(cn)} |`\n\t\t\t\t\t\t+ ` ${min.padStart(cmin)} |`\n\t\t\t\t\t\t+ ` ${median.padStart(cmed)} |`\n\t\t\t\t\t\t+ ` ${max.padStart(cmax)} |`\n\t\t\t\t\t\t+ ` ${n.toString().padStart(csam)}\\n`;\n\t\t\t\t}\n\t\t\t\tmessage += `\\n`;\n\t\t\t\tconsole.log(message);\n\t\t\t\t\n\t\t\t\tperformance.clearMarks();\n\t\t\t\tperformance.clearMeasures();\n\t\t\t\tthis.toggle = timestamp;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync toggleVR(){\n\t\tconst vrActive = (this.vr && this.vr.display.isPresenting);\n\n\t\tif(vrActive){\n\t\t\tthis.stopVR();\n\t\t}else{\n\t\t\tthis.startVR();\n\t\t}\n\t}\n\n\tasync startVR(){\n\n\t\tif(this.vr === null){\n\t\t\treturn;\n\t\t}\n\n\t\tlet canvas = this.renderer.domElement;\n\t\tlet display = this.vr.display;\n\n\t\ttry{\n\t\t\tawait display.requestPresent([{ source: canvas }]);\n\t\t}catch(e){\n\t\t\tconsole.error(e);\n\t\t\tthis.postError(\"requestPresent failed\");\n\t\t\treturn;\n\t\t}\n\n\t\t//window.addEventListener('vrdisplaypresentchange', onVRPresentChange, false);\n\t\t//window.addEventListener('vrdisplayactivate', onVRRequestPresent, false);\n\t\t//window.addEventListener('vrdisplaydeactivate', onVRExitPresent, false);\n\n\t}\n\n\tasync stopVR(){\n\t\t// TODO shutdown VR\n\t}\n\n\tloop(timestamp){\n\n\t\tif(this.stats){\n\t\t\tthis.stats.begin();\n\t\t}\n\n\t\tlet queryAll;\n\t\tif(Potree.measureTimings){\n\t\t\tperformance.mark(\"loop-start\");\n\t\t}\n\n\n\t\tconst vrActive = (this.vr && this.vr.display.isPresenting);\n\n\t\tif(vrActive){\n\t\t\tconst {display, frameData} = this.vr;\n\n\t\t\tdisplay.requestAnimationFrame(this.loop.bind(this));\n\n\t\t\tdisplay.getFrameData(frameData);\n\n\t\t\tthis.update(this.clock.getDelta(), timestamp);\n\n\t\t\tthis.render();\n\n\t\t\tthis.vr.display.submitFrame();\n\t\t}else{\n\t\t\trequestAnimationFrame(this.loop.bind(this));\n\n\t\t\tthis.update(this.clock.getDelta(), timestamp);\n\n\t\t\tthis.render();\n\t\t}\n\n\n\t\tif(Potree.measureTimings){\n\t\t\tperformance.mark(\"loop-end\");\n\t\t\tperformance.measure(\"loop\", \"loop-start\", \"loop-end\");\n\t\t}\n\t\t\n\t\tthis.resolveTimings(timestamp);\n\n\t\tPotree.framenumber++;\n\n\t\tif(this.stats){\n\t\t\tthis.stats.end();\n\t\t}\n\t}\n\n\tpostError(content, params = {}){\n\t\tlet message = this.postMessage(content, params);\n\n\t\tmessage.element.addClass(\"potree_message_error\");\n\n\t\treturn message;\n\t}\n\n\tpostMessage(content, params = {}){\n\t\tlet message = new Message(content);\n\n\t\tlet animationDuration = 100;\n\n\t\tmessage.element.css(\"display\", \"none\");\n\t\tmessage.elClose.click( () => {\n\t\t\tmessage.element.slideToggle(animationDuration);\n\n\t\t\tlet index = this.messages.indexOf(message);\n\t\t\tif(index >= 0){\n\t\t\t\tthis.messages.splice(index, 1);\n\t\t\t}\n\t\t});\n\n\t\tthis.elMessages.prepend(message.element);\n\n\t\tmessage.element.slideToggle(animationDuration);\n\n\t\tthis.messages.push(message);\n\n\t\tif(params.duration !== undefined){\n\t\t\tlet fadeDuration = 500;\n\t\t\tlet slideOutDuration = 200;\n\t\t\tsetTimeout(() => {\n\t\t\t\tmessage.element.animate({\n\t\t\t\t\topacity: 0\t\n\t\t\t\t}, fadeDuration);\n\t\t\t\tmessage.element.slideToggle(slideOutDuration);\n\t\t\t}, params.duration)\n\t\t}\n\n\t\treturn message;\n\t}\n};\n","export class VRControlls{\r\n\r\n\tconstructor(viewer){\r\n\r\n\t\tthis.viewer = viewer;\r\n\r\n\t\tthis.previousPads = [];\r\n\r\n\t\tthis.selection = [];\r\n\r\n\t\tthis.triggerStarts = [];\r\n\r\n\t\tthis.scaleState = null;\r\n\r\n\t\tthis.selectionBox = this.createBox();\r\n\t\tthis.viewer.scene.scene.add(this.selectionBox);\r\n\r\n\t\tthis.speed = 1;\r\n\t\tthis.speedModificationFactor = 50;\r\n\r\n\t\tthis.snLeft = this.createControllerModel();\r\n\t\tthis.snRight = this.createControllerModel();\r\n\t\t\r\n\t\tthis.viewer.scene.scene.add(this.snLeft.node);\r\n\t\tthis.viewer.scene.scene.add(this.snRight.node);\r\n\t\t//this.viewer.scene.scene.add(this.snLeft.debug);\r\n\t\t//this.viewer.scene.scene.add(this.snRight.debug);\r\n\r\n\t}\r\n\r\n\tcreateControllerModel(){\r\n\t\tconst geometry = new THREE.SphereGeometry(1, 32, 32);\r\n\t\tconst material = new THREE.MeshLambertMaterial( { color: 0xff0000, side: THREE.DoubleSide, flatShading: true } );\r\n\t\tconst node = new THREE.Mesh(geometry, material);\r\n\r\n\t\tnode.position.set(0, 0, 0.5);\r\n\t\tnode.scale.set(0.02, 0.02, 0.02);\r\n\t\tnode.visible = false;\r\n\r\n\t\tviewer.scene.scene.add(node);\r\n\r\n\t\tconst debug = new THREE.Mesh(geometry, new THREE.MeshNormalMaterial());\r\n\t\tdebug.position.set(0, 0, 0.5);\r\n\t\tdebug.scale.set(0.01, 0.01, 0.01);\r\n\t\tdebug.visible = false;\r\n\r\n\r\n\t\tconst controller = {\r\n\t\t\tnode: node,\r\n\t\t\tdebug: debug,\r\n\t\t};\r\n\t\t//viewer.scene.scene.add(node);\r\n\r\n\t\treturn controller;\r\n\t}\r\n\r\n\tcreateBox(){\r\n\t\tconst color = 0xffff00;\r\n\r\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\r\n\t\tconst positions = [ \r\n\t\t\t1, 1, 1,\r\n\t\t\t0, 1, 1,\r\n\t\t\t0, 0, 1,\r\n\t\t\t1, 0, 1,\r\n\t\t\t1, 1, 0,\r\n\t\t\t0, 1, 0,\r\n\t\t\t0, 0, 0,\r\n\t\t\t1, 0, 0\r\n\t\t];\r\n\t\tconst geometry = new THREE.BufferGeometry();\r\n\r\n\t\tgeometry.setIndex( new THREE.BufferAttribute( indices, 1 ) );\r\n\t\tgeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) );\r\n\r\n\t\tgeometry.computeBoundingSphere();\r\n\r\n\t\tconst mesh = new THREE.LineSegments(geometry, new THREE.LineBasicMaterial( { color: color } ) );\r\n\t\tmesh.visible = false;\r\n\r\n\t\treturn mesh;\r\n\t}\r\n\r\n\tdebugLine(start, end, index, color){\r\n\r\n\t\tif(typeof this.debugLines === \"undefined\"){\r\n\r\n\t\t\tconst geometry = new THREE.SphereGeometry(1, 8, 8);\r\n\r\n\t\t\tthis.debugLines = {\r\n\t\t\t\tgeometry: geometry,\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst n = 100;\r\n\r\n\t\tif(!this.debugLines[index]){\r\n\t\t\tconst geometry = this.debugLines.geometry;\r\n\t\t\tconst material = new THREE.MeshBasicMaterial({color: color});\r\n\t\t\tconst nodes = [];\r\n\r\n\t\t\tfor(let i = 0; i <= n; i++){\r\n\t\t\t\tconst u = i / n;\r\n\r\n\t\t\t\tconst node = new THREE.Mesh(geometry, material);\r\n\r\n\t\t\t\tconst position = new THREE.Vector3().addVectors(\r\n\t\t\t\t\tstart.clone().multiplyScalar(1-u),\r\n\t\t\t\t\tend.clone().multiplyScalar(u)\r\n\t\t\t\t);\r\n\r\n\t\t\t\tnode.position.copy(position);\r\n\t\t\t\tnode.scale.set(0.002, 0.002, 0.002);\r\n\t\t\t\tthis.viewer.scene.scene.add(node);\r\n\t\t\t\tnodes.push(node);\r\n\t\t\t}\r\n\r\n\t\t\tconst debugLine = {\r\n\t\t\t\tmaterial: material,\r\n\t\t\t\tnodes: nodes,\r\n\t\t\t};\r\n\r\n\t\t\tthis.debugLines[index] = debugLine;\r\n\t\t}else{\r\n\t\t\tconst debugLine = this.debugLines[index];\r\n\r\n\t\t\tfor(let i = 0; i <= n; i++){\r\n\t\t\t\tconst node = debugLine.nodes[i];\r\n\t\t\t\tconst u = i / n;\r\n\r\n\t\t\t\tconst position = new THREE.Vector3().addVectors(\r\n\t\t\t\t\tstart.clone().multiplyScalar(1-u),\r\n\t\t\t\t\tend.clone().multiplyScalar(u)\r\n\t\t\t\t);\r\n\r\n\t\t\t\tnode.position.copy(position);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t}\r\n\r\n\tgetPointcloudsAt(pointclouds, position){\r\n\r\n\t\tconst I = [];\r\n\t\tfor(const pointcloud of pointclouds){\r\n\t\t\t\r\n\t\t\tconst intersects = pointcloud.intersectsPoint(position);\r\n\r\n\t\t\tif(intersects){\r\n\t\t\t\tI.push(pointcloud);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn I;\r\n\t}\r\n\r\n\tcopyPad(pad){\r\n\t\tconst axes = pad.axes.map(a => a);\r\n\t\tconst buttons = pad.buttons.map(b => {return {pressed: b.pressed}});\r\n\r\n\t\tconst pose = {\r\n\t\t\tposition: new Float32Array(pad.pose.position),\r\n\t\t\torientation: new Float32Array(pad.pose.orientation),\r\n\t\t};\r\n\r\n\t\tconst copy = {\r\n\t\t\taxes: axes,\r\n\t\t\tbuttons: buttons,\r\n\t\t\tpose: pose, \r\n\t\t\thand: pad.hand,\r\n\t\t\tindex: pad.index,\r\n\t\t};\r\n\r\n\t\treturn copy;\r\n\t}\r\n\r\n\tpreviousPad(gamepad){\r\n\t\treturn this.previousPads.find(c => c.index === gamepad.index);\r\n\t}\r\n\r\n\ttoScene(position){\r\n\r\n\t\tconst vr = viewer.vr;\r\n\r\n\t\tvr.node.updateMatrixWorld();\r\n\t\tconst world = vr.node.matrixWorld;\r\n\r\n\t\tconst scenePos = new THREE.Vector3(position.x, -position.z, position.y);\r\n\t\tscenePos.applyMatrix4(world);\r\n\r\n\t\treturn scenePos;\r\n\t}\r\n\r\n\tupdate(delta){\r\n\r\n\t\tconst {selection, viewer, snLeft, snRight} = this;\r\n\t\tconst toScene = this.toScene.bind(this);\r\n\t\tconst vr = viewer.vr;\r\n\r\n\t\tconst vrActive = vr && vr.display.isPresenting;\r\n\r\n\t\tsnLeft.node.visible = vrActive;\r\n\t\tsnRight.node.visible = vrActive;\r\n\r\n\t\tif(!vrActive){\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst pointclouds = viewer.scene.pointclouds;\r\n\r\n\t\tconst gamepads = Array.from(navigator.getGamepads()).filter(p => p !== null).map(this.copyPad);\r\n\r\n\t\tconst getPad = (list, pattern) => list.find(pad => pad.index === pattern.index);\r\n\t\t\r\n\t\tif(this.previousPads.length !== gamepads.length){\r\n\t\t\tthis.previousPads = gamepads;\r\n\t\t}\r\n\r\n\t\tconst left = gamepads.find(gp => gp.hand && gp.hand === \"left\");\r\n\t\tconst right = gamepads.find(gp => gp.hand && gp.hand === \"right\");\r\n\r\n\t\tconst triggered = gamepads.filter(gamepad => {\r\n\t\t\treturn gamepad.buttons[1].pressed;\r\n\t\t});\r\n\r\n\t\tconst justTriggered = triggered.filter(gamepad => {\r\n\t\t\tconst prev = this.previousPad(gamepad);\r\n\t\t\tconst previouslyTriggered = prev.buttons[1].pressed;\r\n\t\t\tconst currentlyTriggered = gamepad.buttons[1].pressed;\r\n\r\n\t\t\treturn !previouslyTriggered && currentlyTriggered;\r\n\t\t});\r\n\r\n\t\tconst justUntriggered = gamepads.filter(gamepad => {\r\n\t\t\tconst prev = this.previousPad(gamepad);\r\n\t\t\tconst previouslyTriggered = prev.buttons[1].pressed;\r\n\t\t\tconst currentlyTriggered = gamepad.buttons[1].pressed;\r\n\r\n\t\t\treturn previouslyTriggered && !currentlyTriggered;\r\n\t\t});\r\n\r\n\t\tif(triggered.length === 0){\r\n\r\n\t\t\tfor(const pad of gamepads){\r\n\t\t\t\tconst position = new THREE.Vector3(...pad.pose.position);\r\n\r\n\t\t\t\tconst I = this.getPointcloudsAt(pointclouds, position);\r\n\r\n\t\t\t\tlet controler = {\r\n\t\t\t\t\t\"left\": snLeft,\r\n\t\t\t\t\t\"right\": snRight,\r\n\t\t\t\t}[pad.hand];\r\n\r\n\t\t\t\tif(I.length > 0){\r\n\t\t\t\t\tcontroler.node.material.color.setRGB(0, 1, 0);\r\n\t\t\t\t\tconsole.log(pad.hand);\r\n\t\t\t\t}else{\r\n\t\t\t\t\tcontroler.node.material.color.setRGB(1, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}else{\r\n\t\t\tif(selection.length > 0){\r\n\t\t\t\tconst pointcloud = selection[0];\r\n\t\t\t\tthis.selectionBox.scale.copy(pointcloud.boundingBox.max).multiply(pointcloud.scale);\r\n\t\t\t\tthis.selectionBox.position.copy(pointcloud.position);\r\n\t\t\t\tthis.selectionBox.rotation.copy(pointcloud.rotation);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(justTriggered.length > 0){\r\n\r\n\t\t\tconst pad = justTriggered[0];\r\n\t\t\tconst position = toScene(new THREE.Vector3(...pad.pose.position));\r\n\t\t\tconst I = this.getPointcloudsAt(pointclouds, position);\r\n\r\n\t\t\tconst pcs = I.map(p => {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tnode: p,\r\n\t\t\t\t\tposition: p.position.clone(),\r\n\t\t\t\t\trotation: p.rotation.clone(),\r\n\t\t\t\t\tscale: p.scale.clone(),\r\n\t\t\t\t};\r\n\t\t\t});\r\n\r\n\t\t\tconst event = {\r\n\t\t\t\tpad: pad,\r\n\t\t\t\tpointclouds: pcs,\r\n\t\t\t};\r\n\r\n\t\t\tthis.triggerStarts.push(event);\r\n\t\t}\r\n\r\n\t\tif(justUntriggered.length > 0){\r\n\t\t\tfor(let untriggeredPad of justUntriggered){\r\n\t\t\t\tconst p = getPad(this.triggerStarts.map(t => t.pad), untriggeredPad);\r\n\t\t\t\tthis.triggerStarts = this.triggerStarts.filter(e => e.pad !== p);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(triggered.length === 0){\r\n\t\t\tselection.length = 0;\r\n\t\t\tthis.triggerStarts = [];\r\n\t\t}\r\n\r\n\t\tif(justTriggered.length === 1 && triggered.length === 1){\r\n\t\t\t// one controller was triggered this frame\r\n\t\t\tconst pad = justTriggered[0];\r\n\t\t\tconst position = toScene(new THREE.Vector3(...pad.pose.position));\r\n\t\t\tconst I = this.getPointcloudsAt(pointclouds, position);\r\n\t\t\t\r\n\t\t\tif(I.length > 0){\r\n\t\t\t\tselection.length = 0;\r\n\t\t\t\tselection.push(I[0]);\r\n\t\t\t}\r\n\t\t}else if(justTriggered.length === 2 && triggered.length === 2){\r\n\t\t\t// two controllers were triggered this frame\r\n\t\t\tconst pad = justTriggered[0];\r\n\t\t\tconst position = toScene(new THREE.Vector3(...pad.pose.position));\r\n\t\t\tconst I = this.getPointcloudsAt(pointclouds, position);\r\n\t\t\t\r\n\t\t\tif(I.length > 0){\r\n\t\t\t\tselection.length = 0;\r\n\t\t\t\tselection.push(I[0]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(justTriggered.length > 0 && triggered.length === 2){\r\n\t\t\t// START SCALE/ROTATE\r\n\r\n\t\t\tconst pcs = selection.map(p => ({\r\n\t\t\t\tnode: p,\r\n\t\t\t\tposition: p.position.clone(),\r\n\t\t\t\trotation: p.rotation.clone(),\r\n\t\t\t\tscale: p.scale.clone(),\r\n\t\t\t}));\r\n\r\n\t\t\tthis.scaleState = {\r\n\t\t\t\tfirst: triggered[0],\r\n\t\t\t\tsecond: triggered[1],\r\n\t\t\t\tpointclouds: pcs,\r\n\t\t\t};\r\n\t\t}else if(triggered.length < 2){\r\n\t\t\t// STOP SCALE/ROTATE\r\n\t\t\tthis.scaleState = null;\r\n\t\t}\r\n\t\t\r\n\t\tif(this.scaleState){\r\n\t\t\t// SCALE/ROTATE\r\n\r\n\t\t\tconst {first, second, pointclouds} = this.scaleState;\r\n\r\n\t\t\tif(pointclouds.length > 0){\r\n\t\t\t\t\r\n\t\t\t\tconst pointcloud = pointclouds[0];\r\n\t\t\t\t\r\n\t\t\t\tconst p1Start = toScene(new THREE.Vector3(...first.pose.position));\r\n\t\t\t\tconst p2Start = toScene(new THREE.Vector3(...second.pose.position));\r\n\r\n\t\t\t\tconst p1End = toScene(new THREE.Vector3(...getPad(gamepads, first).pose.position));\r\n\t\t\t\tconst p2End = toScene(new THREE.Vector3(...getPad(gamepads, second).pose.position));\r\n\r\n\t\t\t\tconst diffStart = new THREE.Vector3().subVectors(p2Start, p1Start);\r\n\t\t\t\tconst diffEnd = new THREE.Vector3().subVectors(p2End, p1End);\r\n\r\n\t\t\t\t// this.debugLine(p1Start, p2Start, 0, 0xFF0000);\r\n\t\t\t\t// this.debugLine(p1End, p2End, 1, 0x00FF00);\r\n\r\n\t\t\t\t// ROTATION\r\n\t\t\t\tconst diffStartG = new THREE.Vector3(diffStart.x, diffStart.y, 0);\r\n\t\t\t\tconst diffEndG = new THREE.Vector3(diffEnd.x, diffEnd.y, 0);\r\n\t\t\t\tlet sign = Math.sign(diffStartG.clone().cross(diffEndG).z);\r\n\t\t\t\tsign = sign === 0 ? 1 : sign;\r\n\t\t\t\tconst angle = sign * diffStartG.angleTo(diffEndG);\r\n\t\t\t\tconst newAngle = pointcloud.rotation.z + angle;\r\n\t\t\t\t\r\n\t\t\t\t// SCALE\r\n\t\t\t\tconst scale = diffEnd.length() / diffStart.length();\r\n\t\t\t\tconst newScale = pointcloud.scale.clone().multiplyScalar(scale);\r\n\r\n\t\t\t\t// POSITION\r\n\t\t\t\tconst p1ToP = new THREE.Vector3().subVectors(pointcloud.position, p1Start);\r\n\t\t\t\tp1ToP.multiplyScalar(scale);\r\n\t\t\t\tp1ToP.applyAxisAngle(new THREE.Vector3(0, 0, 1), angle);\r\n\t\t\t\tconst newPosition = p1End.clone().add(p1ToP);\r\n\t\t\t\t\r\n\t\t\t\t//this.debugLine(pointcloud.position, newPosition, 0, 0xFF0000);\r\n\r\n\t\t\t\t//console.log(newScale, p1ToP, angle);\r\n\r\n\t\t\t\tpointcloud.node.rotation.z = newAngle;\r\n\t\t\t\tpointcloud.node.scale.copy(newScale);\r\n\t\t\t\tpointcloud.node.position.copy(newPosition);\r\n\r\n\t\t\t\tpointcloud.node.updateMatrix();\r\n\t\t\t\tpointcloud.node.updateMatrixWorld();\r\n\r\n\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\t\r\n\t\tif(triggered.length === 1){\r\n\t\t\t// TRANSLATE POINT CLOUDS\r\n\t\t\tconst pad = triggered[0];\r\n\t\t\tconst prev = this.previousPad(pad);\r\n\r\n\t\t\tconst flipWorld = new THREE.Matrix4().fromArray([\r\n\t\t\t\t\t1, 0, 0, 0, \r\n\t\t\t\t\t0, 0, 1, 0, \r\n\t\t\t\t\t0, -1, 0, 0,\r\n\t\t\t\t\t0, 0, 0, 1\r\n\t\t\t\t]);\r\n\t\t\tconst flipView = new THREE.Matrix4().getInverse(flipWorld);\r\n\r\n\t\t\tconst p1 = new THREE.Vector3(...pad.pose.position).applyMatrix4(flipWorld);\r\n\t\t\tconst p2 = new THREE.Vector3(...prev.pose.position).applyMatrix4(flipWorld);\r\n\r\n\t\t\tp1.applyMatrix4(vr.node.matrixWorld);\r\n\t\t\tp2.applyMatrix4(vr.node.matrixWorld);\r\n\r\n\t\t\tconst diff = new THREE.Vector3().subVectors(p1, p2);\r\n\r\n\t\t\t//const diff = toScene(new THREE.Vector3(\r\n\t\t\t//\tpad.pose.position[0] - prev.pose.position[0],\r\n\t\t\t//\tpad.pose.position[1] - prev.pose.position[1],\r\n\t\t\t//\tpad.pose.position[2] - prev.pose.position[2],\r\n\t\t\t//));\r\n\r\n\t\t\tfor(const pc of selection){\r\n\t\t\t\tpc.position.add(diff);\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\t{ // MOVE WITH JOYSTICK\r\n\r\n\t\t\tconst flipWorld = new THREE.Matrix4().fromArray([\r\n\t\t\t\t1, 0, 0, 0, \r\n\t\t\t\t0, 0, 1, 0, \r\n\t\t\t\t0, -1, 0, 0,\r\n\t\t\t\t0, 0, 0, 1\r\n\t\t\t]);\r\n\t\t\tconst flipView = new THREE.Matrix4().getInverse(flipWorld);\r\n\t\t\tconst {display, frameData} = vr;\r\n\r\n\t\t\tconst computeMove = (pad) => {\r\n\t\t\t\tconst axes = pad.axes;\r\n\r\n\t\t\t\tconst opos = new THREE.Vector3(...pad.pose.position);\r\n\t\t\t\tconst rotation = new THREE.Quaternion(...pad.pose.orientation);\r\n\t\t\t\tconst d = new THREE.Vector3(0, 0, -1);\r\n\t\t\t\td.applyQuaternion(rotation);\r\n\t\t\t\t\r\n\t\t\t\tconst worldPos = toScene(opos);\r\n\t\t\t\tconst worldTarget = toScene(new THREE.Vector3().addVectors(opos, d));\r\n\t\t\t\tconst dir = new THREE.Vector3().subVectors(worldTarget, worldPos).normalize();\r\n\r\n\t\t\t\tconst amount = axes[1] * this.speed;\r\n\r\n\t\t\t\tconst move = dir.clone().multiplyScalar(amount);\r\n\r\n\t\t\t\treturn move;\r\n\t\t\t};\r\n\r\n\t\t\tlet flip = 1;\r\n\t\t\tif(display.displayName.includes(\"Oculus\")){\r\n\t\t\t\tflip = -1;\r\n\t\t\t}\r\n\r\n\t\t\tlet move = null;\r\n\r\n\t\t\tif(left && right){\r\n\t\t\t\tmove = computeMove(right);\r\n\r\n\t\t\t\tconst leftAdjustAxe = flip * left.axes[1];\r\n\t\t\t\tconst adjust = this.speedModificationFactor ** leftAdjustAxe;\r\n\r\n\t\t\t\tmove = move.multiplyScalar(adjust);\r\n\r\n\r\n\t\t\t}else if(right){\r\n\t\t\t\tmove = computeMove(right);\r\n\t\t\t}else if(left){\r\n\t\t\t\tmove = computeMove(left);\r\n\t\t\t}\r\n\r\n\t\t\tif(move){\r\n\t\t\t\tmove.multiplyScalar(delta * flip);\r\n\r\n\t\t\t\tvr.node.position.add(move);\r\n\t\t\t}\r\n\r\n\t\t\t// for(const pad of [left, right].filter(pad => pad)){\r\n\r\n\t\t\t\t\r\n\r\n\t\t\t// \tmoves.push(move);\r\n\r\n\t\t\t// \t// vr.node.position.add(move);\r\n\t\t\t// }\r\n\r\n\t\t\t// if(moves.length === 1){\r\n\t\t\t// \tvr.node.position.add(moves[0]);\r\n\t\t\t// }else if(moves.length > 1){\r\n\r\n\t\t\t// \tconst factor = 10;\r\n\t\t\t// \tconst [adjust, main] = moves;\r\n\t\t\t// \t// main gives direction, adjust modifies speed between [0, factor]\r\n\r\n\t\t\t// \tconst mMain = main.length();\r\n\r\n\r\n\t\t\t// \tlet mAdjust = \r\n\r\n\r\n\r\n\t\t\t// \tconst move = mMain.multiplyScalar(adjust);\r\n\r\n\r\n\t\t\t// \t// const move = moves[0].clone().add(moves[1]);\r\n\r\n\t\t\t// \t// const amount = (move.length() ** 3) * delta;\r\n\t\t\t// \t// move.multiplyScalar(amount);\r\n\r\n\t\t\t// \t// vr.node.position.add(move);\r\n\t\t\t// }\r\n\r\n\r\n\t\t\t// let pad = [right, left].find(pad => pad !== undefined);\r\n\r\n\t\t\t// if(pad){\r\n\r\n\t\t\t// \tconst axes = pad.axes;\r\n\r\n\r\n\t\t\t// \t// const leftView = new THREE.Matrix4().fromArray(frameData.leftViewMatrix);\r\n\t\t\t// \t// const view = new THREE.Matrix4().multiplyMatrices(leftView, flipView);\r\n\t\t\t// \t// const world = new THREE.Matrix4().getInverse(view);\r\n\r\n\t\t\t// \t{ // move to where the controller points\r\n\t\t\t// \t\tconst opos = new THREE.Vector3(...right.pose.position);\r\n\t\t\t// \t\tconst rotation = new THREE.Quaternion(...pad.pose.orientation);\r\n\t\t\t// \t\tconst d = new THREE.Vector3(0, 0, -1);\r\n\t\t\t// \t\td.applyQuaternion(rotation);\r\n\t\t\t\t\t\r\n\t\t\t// \t\tconst worldPos = toScene(opos);\r\n\t\t\t// \t\tconst worldTarget = toScene(new THREE.Vector3().addVectors(opos, d));\r\n\t\t\t// \t\tconst dir = new THREE.Vector3().subVectors(worldTarget, worldPos).normalize();\r\n\r\n\t\t\t// \t\tconst amount = axes[1];\r\n\r\n\t\t\t// \t\tconst move = dir.clone().multiplyScalar(delta * amount);\r\n\r\n\t\t\t// \t\t//const d = dir.clone().multiplyScalar(delta);\r\n\t\t\t// \t\tvr.node.position.add(move);\r\n\t\t\t// \t}\r\n\r\n\t\t\t// \t{ // move to trigger direction\r\n\t\t\t// \t\t// const pos = new THREE.Vector3(0, 0, 0).applyMatrix4(world);\r\n\t\t\t// \t\t// const pForward = new THREE.Vector3(0, 0, -1).applyMatrix4(world);\r\n\t\t\t// \t\t// const pRight = new THREE.Vector3(1, 0, 0).applyMatrix4(world);\r\n\t\t\t// \t\t// const pUp = new THREE.Vector3(0, 1, 0).applyMatrix4(world);\r\n\r\n\t\t\t// \t\t// const dForward = new THREE.Vector3().subVectors(pForward, pos).normalize();\r\n\t\t\t// \t\t// const dRight = new THREE.Vector3().subVectors(pRight, pos).normalize();\r\n\t\t\t// \t\t// const dUp = new THREE.Vector3().subVectors(pUp, pos).normalize();\r\n\r\n\t\t\t// \t\t// const dir = new THREE.Vector3().addVectors(\r\n\t\t\t// \t\t// \tdRight.clone().multiplyScalar(axes[0]),\r\n\t\t\t// \t\t// \tdForward.clone().multiplyScalar(axes[1])\r\n\t\t\t// \t\t// );\r\n\r\n\t\t\t// \t\t// const d = dir.clone().multiplyScalar(delta);\r\n\t\t\t// \t\t// vr.node.position.add(d);\r\n\t\t\t// \t}\r\n\r\n\t\t\t// }\r\n\r\n\t\t}\r\n\r\n\t\t{ // MOVE CONTROLLER SCENE NODE\r\n\t\t\tif(right){\r\n\t\t\t\tconst {node, debug} = snRight;\r\n\t\t\t\tconst opos = new THREE.Vector3(...right.pose.position);\r\n\t\t\t\tconst position = toScene(opos);\r\n\t\t\t\t\r\n\t\t\t\tconst rotation = new THREE.Quaternion(...right.pose.orientation);\r\n\t\t\t\tconst d = new THREE.Vector3(0, 0, -1);\r\n\t\t\t\td.applyQuaternion(rotation);\r\n\t\t\t\t// const target = toScene(new THREE.Vector3().addVectors(opos, d));\r\n\r\n\t\t\t\tnode.position.copy(position);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(left){\r\n\t\t\t\tconst {node, debug} = snLeft;\r\n\t\t\t\t\r\n\t\t\t\tconst position = toScene(new THREE.Vector3(...left.pose.position));\r\n\t\t\t\tnode.position.copy(position);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.previousPads = gamepads;\r\n\t}\r\n};","\nTHREE.OrthographicCamera.prototype.zoomTo = function( node, factor = 1){\n\n\tif ( !node.geometry && !node.boundingBox) {\n\t\treturn;\n\t}\n\n\t// TODO\n\n\t//let minWS = new THREE.Vector4(node.boundingBox.min.x, node.boundingBox.min.y, node.boundingBox.min.z, 1);\n\t//let minVS = minWS.applyMatrix4(this.matrixWorldInverse);\n\n\t//let right = node.boundingBox.max.x;\n\t//let bottom\t= node.boundingBox.min.y;\n\t//let top = node.boundingBox.max.y;\n\n\tthis.updateProjectionMatrix();\t\n};","\nTHREE.PerspectiveCamera.prototype.zoomTo = function (node, factor) {\n\tif (!node.geometry && !node.boundingSphere && !node.boundingBox) {\n\t\treturn;\n\t}\n\n\tif (node.geometry && node.geometry.boundingSphere === null) {\n\t\tnode.geometry.computeBoundingSphere();\n\t}\n\n\tnode.updateMatrixWorld();\n\n\tlet bs;\n\n\tif (node.boundingSphere) {\n\t\tbs = node.boundingSphere;\n\t} else if (node.geometry && node.geometry.boundingSphere) {\n\t\tbs = node.geometry.boundingSphere;\n\t} else {\n\t\tbs = node.boundingBox.getBoundingSphere(new THREE.Sphere());\n\t}\n\n\tlet _factor = factor || 1;\n\n\tbs = bs.clone().applyMatrix4(node.matrixWorld);\n\tlet radius = bs.radius;\n\tlet fovr = this.fov * Math.PI / 180;\n\n\tif (this.aspect < 1) {\n\t\tfovr = fovr * this.aspect;\n\t}\n\n\tlet distanceFactor = Math.abs(radius / Math.sin(fovr / 2)) * _factor;\n\n\tlet offset = this.getWorldDirection(new THREE.Vector3()).multiplyScalar(-distanceFactor);\n\tthis.position.copy(bs.center.clone().add(offset));\n};\n","THREE.Ray.prototype.distanceToPlaneWithNegative = function (plane) {\n\tlet denominator = plane.normal.dot(this.direction);\n\tif (denominator === 0) {\n\t\t// line is coplanar, return origin\n\t\tif (plane.distanceToPoint(this.origin) === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\t\treturn null;\n\t}\n\tlet t = -(this.origin.dot(plane.normal) + plane.constant) / denominator;\n\n\treturn t;\n};\n","\nexport * from \"./Actions.js\";\nexport * from \"./AnimationPath.js\";\nexport * from \"./Annotation.js\";\nexport * from \"./defines.js\";\nexport * from \"./Enum.js\";\nexport * from \"./EventDispatcher.js\";\nexport * from \"./Features.js\";\nexport * from \"./KeyCodes.js\";\nexport * from \"./LRU.js\";\nexport * from \"./PointCloudEptGeometry.js\";\nexport * from \"./PointCloudOctree.js\";\nexport * from \"./PointCloudOctreeGeometry.js\";\nexport * from \"./PointCloudTree.js\";\nexport * from \"./Points.js\";\nexport * from \"./Potree_update_visibility.js\";\nexport * from \"./PotreeRenderer.js\";\nexport * from \"./ProfileRequest.js\";\nexport * from \"./TextSprite.js\";\nexport * from \"./utils.js\";\nexport * from \"./Version.js\";\nexport * from \"./WorkerPool.js\";\nexport * from \"./XHRFactory.js\";\nexport * from \"./viewer/SaveProject.js\";\nexport * from \"./viewer/LoadProject.js\";\n\nexport * from \"./materials/ClassificationScheme.js\";\nexport * from \"./materials/EyeDomeLightingMaterial.js\";\nexport * from \"./materials/Gradients.js\";\nexport * from \"./materials/NormalizationEDLMaterial.js\";\nexport * from \"./materials/NormalizationMaterial.js\";\nexport * from \"./materials/PointCloudMaterial.js\";\n\nexport * from \"./loader/POCLoader.js\";\nexport * from \"./modules/Loader_1.8/OctreeLoader_1_8.js\";\nexport * from \"./loader/EptLoader.js\";\nexport * from \"./loader/ept/BinaryLoader.js\";\nexport * from \"./loader/ept/LaszipLoader.js\";\nexport * from \"./loader/ept/ZstandardLoader.js\";\nexport * from \"./loader/PointAttributes.js\";\nexport * from \"./loader/ShapefileLoader.js\";\nexport * from \"./loader/GeoPackageLoader.js\";\n\nexport * from \"./utils/Box3Helper.js\";\nexport * from \"./utils/ClippingTool.js\";\nexport * from \"./utils/ClipVolume.js\";\nexport * from \"./utils/GeoTIFF.js\";\nexport * from \"./utils/Measure.js\";\nexport * from \"./utils/MeasuringTool.js\";\nexport * from \"./utils/Message.js\";\nexport * from \"./utils/PointCloudSM.js\";\nexport * from \"./utils/PolygonClipVolume.js\";\nexport * from \"./utils/Profile.js\";\nexport * from \"./utils/ProfileTool.js\";\nexport * from \"./utils/ScreenBoxSelectTool.js\";\nexport * from \"./utils/SpotLightHelper.js\";\nexport * from \"./utils/TransformationTool.js\";\nexport * from \"./utils/Volume.js\";\nexport * from \"./utils/VolumeTool.js\";\nexport * from \"./utils/Compass.js\";\n\nexport * from \"./viewer/viewer.js\";\nexport * from \"./viewer/Scene.js\";\nexport * from \"./viewer/HierarchicalSlider.js\";\n\nexport * from \"./modules/OrientedImages/OrientedImages.js\";\nexport * from \"./modules/Images360/Images360.js\";\nexport * from \"./modules/CameraAnimation/CameraAnimation.js\";\n\nexport * from \"./modules/Loader_1.8/OctreeLoader_1_8.js\";\n\nexport {OrbitControls} from \"./navigation/OrbitControls.js\";\nexport {FirstPersonControls} from \"./navigation/FirstPersonControls.js\";\nexport {EarthControls} from \"./navigation/EarthControls.js\";\nexport {DeviceOrientationControls} from \"./navigation/DeviceOrientationControls.js\";\nexport {VRControlls} from \"./navigation/VRControlls.js\";\n\nimport \"./extensions/OrthographicCamera.js\";\nimport \"./extensions/PerspectiveCamera.js\";\nimport \"./extensions/Ray.js\";\n\nimport {LRU} from \"./LRU.js\";\nimport {OctreeLoader_1_8} from \"./modules/Loader_1.8/OctreeLoader_1_8.js\";\nimport {POCLoader} from \"./loader/POCLoader.js\";\nimport {EptLoader} from \"./loader/EptLoader.js\";\nimport {PointCloudOctree} from \"./PointCloudOctree.js\";\nimport {WorkerPool} from \"./WorkerPool.js\";\n\nexport const workerPool = new WorkerPool();\n\nexport const version = {\n\tmajor: 1,\n\tminor: 7,\n\tsuffix: '.1'\n};\n\nexport let lru = new LRU();\n\nconsole.log('Potree ' + version.major + '.' + version.minor + version.suffix);\n\nexport let pointBudget = 1 * 1000 * 1000;\nexport let framenumber = 0;\nexport let numNodesLoading = 0;\nexport let maxNodesLoading = 4;\n\nexport const debug = {};\n\nlet scriptPath = \"\";\n\nif (document.currentScript && document.currentScript.src) {\n\tscriptPath = new URL(document.currentScript.src + '/..').href;\n\tif (scriptPath.slice(-1) === '/') {\n\t\tscriptPath = scriptPath.slice(0, -1);\n\t}\n} else if(import.meta){\n\tscriptPath = new URL(import.meta.url + \"/..\").href;\n\tif (scriptPath.slice(-1) === '/') {\n\t\tscriptPath = scriptPath.slice(0, -1);\n\t}\n}else {\n\tconsole.error('Potree was unable to find its script path using document.currentScript. Is Potree included with a script tag? Does your browser support this function?');\n}\n\nlet resourcePath = scriptPath + '/resources';\n\n// scriptPath: build/potree\n// resourcePath:build/potree/resources\nexport {scriptPath, resourcePath};\n\n\nexport function loadPointCloud(path, name, callback){\n\tlet loaded = function(e){\n\t\te.pointcloud.name = name;\n\t\tcallback(e);\n\t};\n\n\tlet promise = new Promise( resolve => {\n\n\t\t// load pointcloud\n\t\tif (!path){\n\t\t\t// TODO: callback? comment? Hello? Bueller? Anyone?\n\t\t} else if (path.indexOf('ept.json') > 0) {\n\t\t\tEptLoader.load(path, function(geometry) {\n\t\t\t\tif (!geometry) {\n\t\t\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet pointcloud = new PointCloudOctree(geometry);\n\t\t\t\t\t//loaded(pointcloud);\n\t\t\t\t\tresolve({type: 'pointcloud_loaded', pointcloud: pointcloud});\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (path.indexOf('cloud.js') > 0) {\n\t\t\tPOCLoader.load(path, function (geometry) {\n\t\t\t\tif (!geometry) {\n\t\t\t\t\t//callback({type: 'loading_failed'});\n\t\t\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t\t\t} else {\n\t\t\t\t\tlet pointcloud = new PointCloudOctree(geometry);\n\t\t\t\t\t// loaded(pointcloud);\n\t\t\t\t\tresolve({type: 'pointcloud_loaded', pointcloud: pointcloud});\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (path.indexOf('metadata.json') > 0) {\n\t\t\tPotree.OctreeLoader_1_8.load(path).then(e => {\n\t\t\t\tlet geometry = e.geometry;\n\n\t\t\t\tif(!geometry){\n\t\t\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t\t\t}else{\n\t\t\t\t\tlet pointcloud = new PointCloudOctree(geometry);\n\n\t\t\t\t\tlet aPosition = pointcloud.getAttribute(\"position\");\n\n\t\t\t\t\tlet material = pointcloud.material;\n\t\t\t\t\tmaterial.elevationRange = [\n\t\t\t\t\t\taPosition.range[0][2],\n\t\t\t\t\t\taPosition.range[1][2],\n\t\t\t\t\t];\n\n\t\t\t\t\t// loaded(pointcloud);\n\t\t\t\t\tresolve({type: 'pointcloud_loaded', pointcloud: pointcloud});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tOctreeLoader_1_8.load(path, function (geometry) {\n\t\t\t\tif (!geometry) {\n\t\t\t\t\t//callback({type: 'loading_failed'});\n\t\t\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t\t\t} else {\n\t\t\t\t\tlet pointcloud = new PointCloudOctree(geometry);\n\t\t\t\t\t// loaded(pointcloud);\n\t\t\t\t\tresolve({type: 'pointcloud_loaded', pointcloud: pointcloud});\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (path.indexOf('.vpc') > 0) {\n\t\t\tPointCloudArena4DGeometry.load(path, function (geometry) {\n\t\t\t\tif (!geometry) {\n\t\t\t\t\t//callback({type: 'loading_failed'});\n\t\t\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t\t\t} else {\n\t\t\t\t\tlet pointcloud = new PointCloudArena4D(geometry);\n\t\t\t\t\t// loaded(pointcloud);\n\t\t\t\t\tresolve({type: 'pointcloud_loaded', pointcloud: pointcloud});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t//callback({'type': 'loading_failed'});\n\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t}\n\t});\n\n\tif(callback){\n\t\tpromise.then(pointcloud => {\n\t\t\tloaded(pointcloud);\n\t\t});\n\t}else{\n\t\treturn promise;\n\t}\n};\n\n\n// add selectgroup\n(function($){\n\t$.fn.extend({\n\t\tselectgroup: function(args = {}){\n\n\t\t\tlet elGroup = $(this);\n\t\t\tlet rootID = elGroup.prop(\"id\");\n\t\t\tlet groupID = `${rootID}`;\n\t\t\tlet groupTitle = (args.title !== undefined) ? args.title : \"\";\n\n\t\t\tlet elButtons = [];\n\t\t\telGroup.find(\"option\").each((index, value) => {\n\t\t\t\tlet buttonID = $(value).prop(\"id\");\n\t\t\t\tlet label = $(value).html();\n\t\t\t\tlet optionValue = $(value).prop(\"value\");\n\n\t\t\t\tlet elButton = $(`\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t`);\n\t\t\t\tlet elLabel = elButton.find(\"label\");\n\t\t\t\tlet elInput = elButton.find(\"input\");\n\n\t\t\t\telInput.change( () => {\n\t\t\t\t\telGroup.find(\"label\").removeClass(\"ui-state-active\");\n\t\t\t\t\telGroup.find(\"label\").addClass(\"ui-state-default\");\n\t\t\t\t\tif(elInput.is(\":checked\")){\n\t\t\t\t\t\telLabel.addClass(\"ui-state-active\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\t//elLabel.addClass(\"ui-state-default\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\telButtons.push(elButton);\n\t\t\t});\n\n\t\t\tlet elFieldset = $(`\n\t\t\t\t
    \n\t\t\t\t\t${groupTitle}\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t`);\n\n\t\t\tlet elButtonContainer = elFieldset.find(\"span\");\n\t\t\tfor(let elButton of elButtons){\n\t\t\t\telButtonContainer.append(elButton);\n\t\t\t}\n\n\t\t\telButtonContainer.find(\"label\").each( (index, value) => {\n\t\t\t\t$(value).css(\"margin\", \"0px\");\n\t\t\t\t$(value).css(\"border-radius\", \"0px\");\n\t\t\t\t$(value).css(\"border\", \"1px solid black\");\n\t\t\t\t$(value).css(\"border-left\", \"none\");\n\t\t\t});\n\t\t\telButtonContainer.find(\"label:first\").each( (index, value) => {\n\t\t\t\t$(value).css(\"border-radius\", \"4px 0px 0px 4px\");\n\n\t\t\t});\n\t\t\telButtonContainer.find(\"label:last\").each( (index, value) => {\n\t\t\t\t$(value).css(\"border-radius\", \"0px 4px 4px 0px\");\n\t\t\t\t$(value).css(\"border-left\", \"none\");\n\t\t\t});\n\n\t\t\telGroup.empty();\n\t\t\telGroup.append(elFieldset);\n\n\n\n\t\t}\n\t});\n})(jQuery);\n"],"names":["PointCloudArena4D","Geopackage","JSON5","scriptPath","loadPointCloud"],"mappings":"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CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE;CACF,CAAC,OAAO,EAAE;CACV,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,K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EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAClC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAClC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAClC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAClC,EAAE;CACF,CAAC;;CChJD,IAAI,OAAO,GAAG,EAAE,CAAC;AACjB;CACA,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;CACA,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;CACA,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;CACA,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;CACA,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;AACF;CACA,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;AACF;CACA,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;AACF;CACA,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;AACF;CACA,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;CACA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;AACF;CACA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC;;AC/9CU,OAAC,oBAAoB,GAAG;AACpC;CACA,CAAC,OAAO,EAAE;CACV,EAAE,CAAC,QAAQ,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C;CACxC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;CAC9B,GAAG,KAAK,GAAG,MAAM,YAAY,eAAe,CAAC;CAC7C,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;CACnC,GAAG;CACH;CACA,EAAE;AACF;CACA;CACA;CACA;CACA;CACA;CACA,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;CAC5C,EAAE,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;CAC1C,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM;CAC/B,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;CAC9C,GAAG,CAAC,CAAC;CACL,EAAE;AACF;CACA,CAAC,aAAa,CAAC,UAAU,CAAC;AAC1B;CACA,EAAE,IAAI,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;AACrC;CACA,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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"} \ No newline at end of file +{"version":3,"file":"potree.js","sources":["../../src/EventDispatcher.js","../../src/Actions.js","../../libs/three.js/build/three.module.js","../../src/AnimationPath.js","../../src/XHRFactory.js","../../src/TextSprite.js","../../src/utils/Volume.js","../../src/utils/Profile.js","../../libs/three.js/lines/LineSegmentsGeometry.js","../../libs/three.js/lines/LineMaterial.js","../../libs/three.js/lines/LineSegments2.js","../../libs/three.js/lines/LineGeometry.js","../../libs/three.js/lines/Line2.js","../../src/utils/Measure.js","../../src/utils/PolygonClipVolume.js","../../src/utils.js","../../src/Annotation.js","../../src/Enum.js","../../src/defines.js","../../src/Features.js","../../src/KeyCodes.js","../../src/LRU.js","../../src/PointCloudTree.js","../../src/loader/PointAttributes.js","../../src/PointCloudEptGeometry.js","../../src/PointCloudOctreeGeometry.js","../../src/materials/Gradients.js","../shaders/shaders.js","../../src/materials/ClassificationScheme.js","../../src/materials/PointCloudMaterial.js","../../src/PointCloudOctree.js","../../src/Points.js","../../src/utils/Box3Helper.js","../../src/Potree_update_visibility.js","../../src/arena4d/PointCloudArena4D.js","../../src/PotreeRenderer.js","../../src/ProfileRequest.js","../../src/Version.js","../../src/WorkerPool.js","../../src/viewer/SaveProject.js","../../src/modules/CameraAnimation/CameraAnimation.js","../../src/viewer/LoadProject.js","../../src/materials/EyeDomeLightingMaterial.js","../../src/materials/NormalizationEDLMaterial.js","../../src/materials/NormalizationMaterial.js","../../src/loader/LasLazLoader.js","../../src/loader/BinaryLoader.js","../../src/loader/POCLoader.js","../../src/modules/loader/2.0/OctreeGeometry.js","../../src/modules/loader/2.0/OctreeLoader.js","../../src/loader/EptLoader.js","../../src/loader/ept/BinaryLoader.js","../../src/loader/ept/LaszipLoader.js","../../src/loader/ept/ZstandardLoader.js","../../src/loader/ShapefileLoader.js","../../src/loader/GeoPackageLoader.js","../../src/utils/ClipVolume.js","../../src/utils/ClippingTool.js","../../src/utils/GeoTIFF.js","../../src/utils/MeasuringTool.js","../../src/utils/Message.js","../../src/utils/PointCloudSM.js","../../src/utils/ProfileTool.js","../../src/utils/ScreenBoxSelectTool.js","../../src/utils/SpotLightHelper.js","../../src/utils/TransformationTool.js","../../src/utils/VolumeTool.js","../../src/utils/Compass.js","../../src/viewer/PotreeRenderer.js","../../src/viewer/EDLRenderer.js","../../src/viewer/HQSplatRenderer.js","../../src/viewer/View.js","../../src/viewer/Scene.js","../../src/viewer/map.js","../../src/exporter/CSVExporter.js","../../src/exporter/LASExporter.js","../../src/viewer/profile.js","../../src/exporter/GeoJSONExporter.js","../../src/exporter/DXFExporter.js","../../src/viewer/PropertyPanels/MeasurePanel.js","../../src/viewer/PropertyPanels/DistancePanel.js","../../src/viewer/PropertyPanels/PointPanel.js","../../src/viewer/PropertyPanels/AreaPanel.js","../../src/viewer/PropertyPanels/AnglePanel.js","../../src/viewer/PropertyPanels/CirclePanel.js","../../src/viewer/PropertyPanels/HeightPanel.js","../../src/viewer/PropertyPanels/VolumePanel.js","../../src/viewer/PropertyPanels/ProfilePanel.js","../../src/viewer/PropertyPanels/CameraPanel.js","../../src/viewer/PropertyPanels/AnnotationPanel.js","../../src/viewer/PropertyPanels/CameraAnimationPanel.js","../../src/viewer/PropertyPanels/PropertiesPanel.js","../../src/viewer/HierarchicalSlider.js","../../src/modules/OrientedImages/OrientedImageControls.js","../../src/modules/OrientedImages/OrientedImages.js","../../src/modules/Images360/Images360.js","../../libs/json5-2.1.3/json5.mjs","../../src/viewer/sidebar.js","../../src/utils/AnnotationTool.js","../../src/navigation/InputHandler.js","../../src/viewer/NavigationCube.js","../../src/navigation/OrbitControls.js","../../src/navigation/FirstPersonControls.js","../../src/navigation/EarthControls.js","../../src/navigation/DeviceOrientationControls.js","../../libs/three.js/loaders/GLTFLoader.js","../../libs/three.js/libs/motion-controllers.module.js","../../libs/three.js/webxr/XRControllerModelFactory.js","../../src/navigation/VRControls.js","../../libs/three.js/extra/VRButton.js","../../src/viewer/viewer.js","../../src/extensions/OrthographicCamera.js","../../src/extensions/PerspectiveCamera.js","../../src/extensions/Ray.js","../../src/Potree.js"],"sourcesContent":["\n/**\n * @author mrdoob / http://mrdoob.com/ https://github.com/mrdoob/eventdispatcher.js\n * \n * with slight modifications by mschuetz, http://potree.org\n * \n */\n\n// The MIT License\n// \n// Copyright (c) 2011 Mr.doob\n// \n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n// \n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n\n\n\nexport class EventDispatcher{\n\n\tconstructor(){\n\t\tthis._listeners = {};\n\t}\n\n\taddEventListener(type, listener){\n\n\t\tconst listeners = this._listeners;\n\n\t\tif(listeners[type] === undefined){\n\t\t\tlisteners[type] = [];\n\t\t}\n\n\t\tif(listeners[type].indexOf(listener) === - 1){\n\t\t\tlisteners[type].push( listener );\n\t\t}\n\n\t}\n\n\thasEventListener(type, listener){\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[type] !== undefined && listeners[type].indexOf(listener) !== - 1;\n\t}\n\n\tremoveEventListener(type, listener){\n\n\t\tlet listeners = this._listeners;\n\t\tlet listenerArray = listeners[type];\n\n\t\tif (listenerArray !== undefined){\n\n\t\t\tlet index = listenerArray.indexOf(listener);\n\n\t\t\tif(index !== - 1){\n\t\t\t\tlistenerArray.splice(index, 1);\n\t\t\t}\n\t\t}\n\n\t}\n\n\tremoveEventListeners(type){\n\t\tif(this._listeners[type] !== undefined){\n\t\t\tdelete this._listeners[type];\n\t\t}\n\t};\n\n\tdispatchEvent(event){\n\n\t\tlet listeners = this._listeners;\n\t\tlet listenerArray = listeners[event.type];\n\n\t\tif ( listenerArray !== undefined ) {\n\t\t\tevent.target = this;\n\n\t\t\tfor(let listener of listenerArray.slice(0)){\n\t\t\t\tlistener.call(this, event);\n\t\t\t}\n\t\t}\n\n\t}\n\n}","\n\nimport {EventDispatcher} from \"./EventDispatcher.js\";\n\nexport class Action extends EventDispatcher {\n\tconstructor (args = {}) {\n\t\tsuper();\n\n\t\tthis.icon = args.icon || '';\n\t\tthis.tooltip = args.tooltip;\n\n\t\tif (args.onclick !== undefined) {\n\t\t\tthis.onclick = args.onclick;\n\t\t}\n\t}\n\n\tonclick (event) {\n\n\t}\n\n\tpairWith (object) {\n\n\t}\n\n\tsetIcon (newIcon) {\n\t\tlet oldIcon = this.icon;\n\n\t\tif (newIcon === oldIcon) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.icon = newIcon;\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'icon_changed',\n\t\t\taction: this,\n\t\t\ticon: newIcon,\n\t\t\toldIcon: oldIcon\n\t\t});\n\t}\n};\n\n//Potree.Actions = {};\n//\n//Potree.Actions.ToggleAnnotationVisibility = class ToggleAnnotationVisibility extends Potree.Action {\n//\tconstructor (args = {}) {\n//\t\tsuper(args);\n//\n//\t\tthis.icon = Potree.resourcePath + '/icons/eye.svg';\n//\t\tthis.showIn = 'sidebar';\n//\t\tthis.tooltip = 'toggle visibility';\n//\t}\n//\n//\tpairWith (annotation) {\n//\t\tif (annotation.visible) {\n//\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye.svg');\n//\t\t} else {\n//\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye_crossed.svg');\n//\t\t}\n//\n//\t\tannotation.addEventListener('visibility_changed', e => {\n//\t\t\tlet annotation = e.annotation;\n//\n//\t\t\tif (annotation.visible) {\n//\t\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye.svg');\n//\t\t\t} else {\n//\t\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye_crossed.svg');\n//\t\t\t}\n//\t\t});\n//\t}\n//\n//\tonclick (event) {\n//\t\tlet annotation = event.annotation;\n//\n//\t\tannotation.visible = !annotation.visible;\n//\n//\t\tif (annotation.visible) {\n//\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye.svg');\n//\t\t} else {\n//\t\t\tthis.setIcon(Potree.resourcePath + '/icons/eye_crossed.svg');\n//\t\t}\n//\t}\n//};\n","// threejs.org/license\nconst REVISION = '124';\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nconst CullFaceNone = 0;\nconst CullFaceBack = 1;\nconst CullFaceFront = 2;\nconst CullFaceFrontBack = 3;\nconst BasicShadowMap = 0;\nconst PCFShadowMap = 1;\nconst PCFSoftShadowMap = 2;\nconst VSMShadowMap = 3;\nconst FrontSide = 0;\nconst BackSide = 1;\nconst DoubleSide = 2;\nconst FlatShading = 1;\nconst SmoothShading = 2;\nconst NoBlending = 0;\nconst NormalBlending = 1;\nconst AdditiveBlending = 2;\nconst SubtractiveBlending = 3;\nconst MultiplyBlending = 4;\nconst CustomBlending = 5;\nconst AddEquation = 100;\nconst SubtractEquation = 101;\nconst ReverseSubtractEquation = 102;\nconst MinEquation = 103;\nconst MaxEquation = 104;\nconst ZeroFactor = 200;\nconst OneFactor = 201;\nconst SrcColorFactor = 202;\nconst OneMinusSrcColorFactor = 203;\nconst SrcAlphaFactor = 204;\nconst OneMinusSrcAlphaFactor = 205;\nconst DstAlphaFactor = 206;\nconst OneMinusDstAlphaFactor = 207;\nconst DstColorFactor = 208;\nconst OneMinusDstColorFactor = 209;\nconst SrcAlphaSaturateFactor = 210;\nconst NeverDepth = 0;\nconst AlwaysDepth = 1;\nconst LessDepth = 2;\nconst LessEqualDepth = 3;\nconst EqualDepth = 4;\nconst GreaterEqualDepth = 5;\nconst GreaterDepth = 6;\nconst NotEqualDepth = 7;\nconst MultiplyOperation = 0;\nconst MixOperation = 1;\nconst AddOperation = 2;\nconst NoToneMapping = 0;\nconst LinearToneMapping = 1;\nconst ReinhardToneMapping = 2;\nconst CineonToneMapping = 3;\nconst ACESFilmicToneMapping = 4;\nconst CustomToneMapping = 5;\n\nconst UVMapping = 300;\nconst CubeReflectionMapping = 301;\nconst CubeRefractionMapping = 302;\nconst EquirectangularReflectionMapping = 303;\nconst EquirectangularRefractionMapping = 304;\nconst CubeUVReflectionMapping = 306;\nconst CubeUVRefractionMapping = 307;\nconst RepeatWrapping = 1000;\nconst ClampToEdgeWrapping = 1001;\nconst MirroredRepeatWrapping = 1002;\nconst NearestFilter = 1003;\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004;\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005;\nconst LinearFilter = 1006;\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007;\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008;\nconst UnsignedByteType = 1009;\nconst ByteType = 1010;\nconst ShortType = 1011;\nconst UnsignedShortType = 1012;\nconst IntType = 1013;\nconst UnsignedIntType = 1014;\nconst FloatType = 1015;\nconst HalfFloatType = 1016;\nconst UnsignedShort4444Type = 1017;\nconst UnsignedShort5551Type = 1018;\nconst UnsignedShort565Type = 1019;\nconst UnsignedInt248Type = 1020;\nconst AlphaFormat = 1021;\nconst RGBFormat = 1022;\nconst RGBAFormat = 1023;\nconst LuminanceFormat = 1024;\nconst LuminanceAlphaFormat = 1025;\nconst RGBEFormat = RGBAFormat;\nconst DepthFormat = 1026;\nconst DepthStencilFormat = 1027;\nconst RedFormat = 1028;\nconst RedIntegerFormat = 1029;\nconst RGFormat = 1030;\nconst RGIntegerFormat = 1031;\nconst RGBIntegerFormat = 1032;\nconst RGBAIntegerFormat = 1033;\n\nconst RGB_S3TC_DXT1_Format = 33776;\nconst RGBA_S3TC_DXT1_Format = 33777;\nconst RGBA_S3TC_DXT3_Format = 33778;\nconst RGBA_S3TC_DXT5_Format = 33779;\nconst RGB_PVRTC_4BPPV1_Format = 35840;\nconst RGB_PVRTC_2BPPV1_Format = 35841;\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\nconst RGB_ETC1_Format = 36196;\nconst RGB_ETC2_Format = 37492;\nconst RGBA_ETC2_EAC_Format = 37496;\nconst RGBA_ASTC_4x4_Format = 37808;\nconst RGBA_ASTC_5x4_Format = 37809;\nconst RGBA_ASTC_5x5_Format = 37810;\nconst RGBA_ASTC_6x5_Format = 37811;\nconst RGBA_ASTC_6x6_Format = 37812;\nconst RGBA_ASTC_8x5_Format = 37813;\nconst RGBA_ASTC_8x6_Format = 37814;\nconst RGBA_ASTC_8x8_Format = 37815;\nconst RGBA_ASTC_10x5_Format = 37816;\nconst RGBA_ASTC_10x6_Format = 37817;\nconst RGBA_ASTC_10x8_Format = 37818;\nconst RGBA_ASTC_10x10_Format = 37819;\nconst RGBA_ASTC_12x10_Format = 37820;\nconst RGBA_ASTC_12x12_Format = 37821;\nconst RGBA_BPTC_Format = 36492;\nconst SRGB8_ALPHA8_ASTC_4x4_Format = 37840;\nconst SRGB8_ALPHA8_ASTC_5x4_Format = 37841;\nconst SRGB8_ALPHA8_ASTC_5x5_Format = 37842;\nconst SRGB8_ALPHA8_ASTC_6x5_Format = 37843;\nconst SRGB8_ALPHA8_ASTC_6x6_Format = 37844;\nconst SRGB8_ALPHA8_ASTC_8x5_Format = 37845;\nconst SRGB8_ALPHA8_ASTC_8x6_Format = 37846;\nconst SRGB8_ALPHA8_ASTC_8x8_Format = 37847;\nconst SRGB8_ALPHA8_ASTC_10x5_Format = 37848;\nconst SRGB8_ALPHA8_ASTC_10x6_Format = 37849;\nconst SRGB8_ALPHA8_ASTC_10x8_Format = 37850;\nconst SRGB8_ALPHA8_ASTC_10x10_Format = 37851;\nconst SRGB8_ALPHA8_ASTC_12x10_Format = 37852;\nconst SRGB8_ALPHA8_ASTC_12x12_Format = 37853;\nconst LoopOnce = 2200;\nconst LoopRepeat = 2201;\nconst LoopPingPong = 2202;\nconst InterpolateDiscrete = 2300;\nconst InterpolateLinear = 2301;\nconst InterpolateSmooth = 2302;\nconst ZeroCurvatureEnding = 2400;\nconst ZeroSlopeEnding = 2401;\nconst WrapAroundEnding = 2402;\nconst NormalAnimationBlendMode = 2500;\nconst AdditiveAnimationBlendMode = 2501;\nconst TrianglesDrawMode = 0;\nconst TriangleStripDrawMode = 1;\nconst TriangleFanDrawMode = 2;\nconst LinearEncoding = 3000;\nconst sRGBEncoding = 3001;\nconst GammaEncoding = 3007;\nconst RGBEEncoding = 3002;\nconst LogLuvEncoding = 3003;\nconst RGBM7Encoding = 3004;\nconst RGBM16Encoding = 3005;\nconst RGBDEncoding = 3006;\nconst BasicDepthPacking = 3200;\nconst RGBADepthPacking = 3201;\nconst TangentSpaceNormalMap = 0;\nconst ObjectSpaceNormalMap = 1;\n\nconst ZeroStencilOp = 0;\nconst KeepStencilOp = 7680;\nconst ReplaceStencilOp = 7681;\nconst IncrementStencilOp = 7682;\nconst DecrementStencilOp = 7683;\nconst IncrementWrapStencilOp = 34055;\nconst DecrementWrapStencilOp = 34056;\nconst InvertStencilOp = 5386;\n\nconst NeverStencilFunc = 512;\nconst LessStencilFunc = 513;\nconst EqualStencilFunc = 514;\nconst LessEqualStencilFunc = 515;\nconst GreaterStencilFunc = 516;\nconst NotEqualStencilFunc = 517;\nconst GreaterEqualStencilFunc = 518;\nconst AlwaysStencilFunc = 519;\n\nconst StaticDrawUsage = 35044;\nconst DynamicDrawUsage = 35048;\nconst StreamDrawUsage = 35040;\nconst StaticReadUsage = 35045;\nconst DynamicReadUsage = 35049;\nconst StreamReadUsage = 35041;\nconst StaticCopyUsage = 35046;\nconst DynamicCopyUsage = 35050;\nconst StreamCopyUsage = 35042;\n\nconst GLSL1 = '100';\nconst GLSL3 = '300 es';\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nfunction EventDispatcher() {}\n\nObject.assign( EventDispatcher.prototype, {\n\n\taddEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t},\n\n\thasEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t},\n\n\tremoveEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tdispatchEvent: function ( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n} );\n\nconst _lut = [];\n\nfor ( let i = 0; i < 256; i ++ ) {\n\n\t_lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );\n\n}\n\nlet _seed = 1234567;\n\nconst MathUtils = {\n\n\tDEG2RAD: Math.PI / 180,\n\tRAD2DEG: 180 / Math.PI,\n\n\tgenerateUUID: function () {\n\n\t\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\t\tconst d0 = Math.random() * 0xffffffff | 0;\n\t\tconst d1 = Math.random() * 0xffffffff | 0;\n\t\tconst d2 = Math.random() * 0xffffffff | 0;\n\t\tconst d3 = Math.random() * 0xffffffff | 0;\n\t\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t\t// .toUpperCase() here flattens concatenated strings to save heap memory space.\n\t\treturn uuid.toUpperCase();\n\n\t},\n\n\tclamp: function ( value, min, max ) {\n\n\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t},\n\n\t// compute euclidian modulo of m % n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\teuclideanModulo: function ( n, m ) {\n\n\t\treturn ( ( n % m ) + m ) % m;\n\n\t},\n\n\t// Linear mapping from range to range \n\n\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t},\n\n\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\tlerp: function ( x, y, t ) {\n\n\t\treturn ( 1 - t ) * x + t * y;\n\n\t},\n\n\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\tsmoothstep: function ( x, min, max ) {\n\n\t\tif ( x <= min ) return 0;\n\t\tif ( x >= max ) return 1;\n\n\t\tx = ( x - min ) / ( max - min );\n\n\t\treturn x * x * ( 3 - 2 * x );\n\n\t},\n\n\tsmootherstep: function ( x, min, max ) {\n\n\t\tif ( x <= min ) return 0;\n\t\tif ( x >= max ) return 1;\n\n\t\tx = ( x - min ) / ( max - min );\n\n\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t},\n\n\t// Random integer from interval\n\n\trandInt: function ( low, high ) {\n\n\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t},\n\n\t// Random float from interval\n\n\trandFloat: function ( low, high ) {\n\n\t\treturn low + Math.random() * ( high - low );\n\n\t},\n\n\t// Random float from <-range/2, range/2> interval\n\n\trandFloatSpread: function ( range ) {\n\n\t\treturn range * ( 0.5 - Math.random() );\n\n\t},\n\n\t// Deterministic pseudo-random float in the interval [ 0, 1 ]\n\n\tseededRandom: function ( s ) {\n\n\t\tif ( s !== undefined ) _seed = s % 2147483647;\n\n\t\t// Park-Miller algorithm\n\n\t\t_seed = _seed * 16807 % 2147483647;\n\n\t\treturn ( _seed - 1 ) / 2147483646;\n\n\t},\n\n\tdegToRad: function ( degrees ) {\n\n\t\treturn degrees * MathUtils.DEG2RAD;\n\n\t},\n\n\tradToDeg: function ( radians ) {\n\n\t\treturn radians * MathUtils.RAD2DEG;\n\n\t},\n\n\tisPowerOfTwo: function ( value ) {\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t},\n\n\tceilPowerOfTwo: function ( value ) {\n\n\t\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n\t},\n\n\tfloorPowerOfTwo: function ( value ) {\n\n\t\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n\t},\n\n\tsetQuaternionFromProperEuler: function ( q, a, b, c, order ) {\n\n\t\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t\t// rotations are applied to the axes in the order specified by 'order'\n\t\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t\t// angles are in radians\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c2 = cos( b / 2 );\n\t\tconst s2 = sin( b / 2 );\n\n\t\tconst c13 = cos( ( a + c ) / 2 );\n\t\tconst s13 = sin( ( a + c ) / 2 );\n\n\t\tconst c1_3 = cos( ( a - c ) / 2 );\n\t\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\t\tconst c3_1 = cos( ( c - a ) / 2 );\n\t\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYX':\n\t\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZY':\n\t\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXZ':\n\t\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZX':\n\t\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXY':\n\t\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYZ':\n\t\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t}\n\n};\n\nclass Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tObject.defineProperty( this, 'isVector2', { value: true } );\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Matrix3 {\n\n\tconstructor() {\n\n\t\tObject.defineProperty( this, 'isMatrix3', { value: true } );\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).copy( this ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tscale( sx, sy ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;\n\t\tte[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tconst te = this.elements;\n\n\t\tconst a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];\n\t\tconst a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];\n\n\t\tte[ 0 ] = c * a11 + s * a21;\n\t\tte[ 3 ] = c * a12 + s * a22;\n\t\tte[ 6 ] = c * a13 + s * a23;\n\n\t\tte[ 1 ] = - s * a11 + c * a21;\n\t\tte[ 4 ] = - s * a12 + c * a22;\n\t\tte[ 7 ] = - s * a13 + c * a23;\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];\n\t\tte[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nlet _canvas;\n\nconst ImageUtils = {\n\n\tgetDataURL: function ( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement == 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n};\n\nlet textureId = 0;\n\nfunction Texture( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = 1, encoding = LinearEncoding ) {\n\n\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.name = '';\n\n\tthis.image = image;\n\tthis.mipmaps = [];\n\n\tthis.mapping = mapping;\n\n\tthis.wrapS = wrapS;\n\tthis.wrapT = wrapT;\n\n\tthis.magFilter = magFilter;\n\tthis.minFilter = minFilter;\n\n\tthis.anisotropy = anisotropy;\n\n\tthis.format = format;\n\tthis.internalFormat = null;\n\tthis.type = type;\n\n\tthis.offset = new Vector2( 0, 0 );\n\tthis.repeat = new Vector2( 1, 1 );\n\tthis.center = new Vector2( 0, 0 );\n\tthis.rotation = 0;\n\n\tthis.matrixAutoUpdate = true;\n\tthis.matrix = new Matrix3();\n\n\tthis.generateMipmaps = true;\n\tthis.premultiplyAlpha = false;\n\tthis.flipY = true;\n\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t//\n\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\tthis.encoding = encoding;\n\n\tthis.version = 0;\n\tthis.onUpdate = null;\n\n}\n\nTexture.DEFAULT_IMAGE = undefined;\nTexture.DEFAULT_MAPPING = UVMapping;\n\nTexture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Texture,\n\n\tisTexture: true,\n\n\tupdateMatrix: function () {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.image = source.image;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\ttype: this.type,\n\t\t\tencoding: this.encoding,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( this.image !== undefined ) {\n\n\t\t\t// TODO: Move to THREE.Image\n\n\t\t\tconst image = this.image;\n\n\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\timage.uuid = MathUtils.generateUUID(); // UGH\n\n\t\t\t}\n\n\t\t\tif ( ! isRootObject && meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\tlet url;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\t// process array of images e.g. CubeTexture\n\n\t\t\t\t\turl = [];\n\n\t\t\t\t\tfor ( let i = 0, l = image.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t// check cube texture with data textures\n\n\t\t\t\t\t\tif ( image[ i ].isDataTexture ) {\n\n\t\t\t\t\t\t\turl.push( serializeImage( image[ i ].image ) );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\turl.push( serializeImage( image[ i ] ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// process single image\n\n\t\t\t\t\turl = serializeImage( image );\n\n\t\t\t\t}\n\n\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\turl: url\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\toutput.image = image.uuid;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t},\n\n\ttransformUv: function ( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n} );\n\nObject.defineProperty( Texture.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.prototype.slice.call( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nclass Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tObject.defineProperty( this, 'isVector4', { value: true } );\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nfunction WebGLRenderTarget( width, height, options ) {\n\n\tthis.width = width;\n\tthis.height = height;\n\n\tthis.scissor = new Vector4( 0, 0, width, height );\n\tthis.scissorTest = false;\n\n\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\toptions = options || {};\n\n\tthis.texture = new Texture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\tthis.texture.image = {};\n\tthis.texture.image.width = width;\n\tthis.texture.image.height = height;\n\n\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false;\n\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n}\n\nWebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: WebGLRenderTarget,\n\n\tisWebGLRenderTarget: true,\n\n\tsetSize: function ( width, height ) {\n\n\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\n\t\t\tthis.texture.image.width = width;\n\t\t\tthis.texture.image.height = height;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\tthis.depthTexture = source.depthTexture;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\nfunction WebGLMultisampleRenderTarget( width, height, options ) {\n\n\tWebGLRenderTarget.call( this, width, height, options );\n\n\tthis.samples = 4;\n\n}\n\nWebGLMultisampleRenderTarget.prototype = Object.assign( Object.create( WebGLRenderTarget.prototype ), {\n\n\tconstructor: WebGLMultisampleRenderTarget,\n\n\tisWebGLMultisampleRenderTarget: true,\n\n\tcopy: function ( source ) {\n\n\t\tWebGLRenderTarget.prototype.copy.call( this, source );\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n} );\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tObject.defineProperty( this, 'isQuaternion', { value: true } );\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerp( qa, qb, qm, t ) {\n\n\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tconst EPS = 0.000001;\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < EPS ) {\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( MathUtils.clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q, p ) {\n\n\t\tif ( p !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t}\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize();\n\t\t\tthis._onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n}\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tObject.defineProperty( this, 'isVector3', { value: true } );\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t}\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\treturn this.applyQuaternion( _quaternion.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tconst ix = qw * x + qy * z - qz * y;\n\t\tconst iy = qw * y + qz * x - qx * z;\n\t\tconst iz = qw * z + qx * y - qy * x;\n\t\tconst iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\treturn this.crossVectors( v, w );\n\n\t\t}\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( MathUtils.clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nclass Box3 {\n\n\tconstructor( min, max ) {\n\n\t\tObject.defineProperty( this, 'isBox3', { value: true } );\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromArray( array ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tconst x = array[ i ];\n\t\t\tconst y = array[ i + 1 ];\n\t\t\tconst z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tconst x = attribute.getX( i );\n\t\t\tconst y = attribute.getY( i );\n\t\t\tconst z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$1.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getCenter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getSize() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\texpandByObject( object ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\t_box.copy( geometry.boundingBox );\n\t\t\t_box.applyMatrix4( object.matrixWorld );\n\n\t\t\tthis.union( _box );\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getParameter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$1 );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$1.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0.subVectors( triangle.a, _center );\n\t\t_v1.subVectors( triangle.b, _center );\n\t\t_v2.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1, _v0 );\n\t\t_f1.subVectors( _v2, _v1 );\n\t\t_f2.subVectors( _v0, _v2 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0, _v1, _v2, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector$1.copy( point ).clamp( this.min, this.max );\n\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.error( 'THREE.Box3: .getBoundingSphere() target is now required' );\n\t\t\t//target = new Sphere(); // removed to avoid cyclic dependency\n\n\t\t}\n\n\t\tthis.getCenter( target.center );\n\n\t\ttarget.radius = this.getSize( _vector$1 ).length() * 0.5;\n\n\t\treturn target;\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the seperating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the seperating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is seperating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\n\nconst _box = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nconst _box$1 = /*@__PURE__*/ new Box3();\n\nclass Sphere {\n\n\tconstructor( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : - 1;\n\n\t}\n\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$1.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Sphere: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Sphere: .getBoundingBox() target is now required' );\n\t\t\ttarget = new Box3();\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\n\nclass Ray {\n\n\tconstructor( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3( 0, 0, - 1 );\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\tat( t, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .at() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t}\n\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$2 ) );\n\n\t\treturn this;\n\n\t}\n\n\tclosestPointToPoint( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$2.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$2.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\treturn _vector$2.distanceToSquared( point );\n\n\t}\n\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$2.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$2.dot( this.direction );\n\t\tconst d2 = _vector$2.dot( _vector$2 ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$2 ) !== null;\n\n\t}\n\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = - 1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n}\n\nclass Matrix4 {\n\n\tconstructor() {\n\n\t\tObject.defineProperty( this, 'isMatrix4', { value: true } );\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$1.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$1.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$1.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m, n ) {\n\n\t\tif ( n !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t}\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, y, z, 0,\n\t\t\tx, 1, z, 0,\n\t\t\tx, y, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$1.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$1.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1.elements[ 0 ] *= invSX;\n\t\t_m1.elements[ 1 ] *= invSX;\n\t\t_m1.elements[ 2 ] *= invSX;\n\n\t\t_m1.elements[ 4 ] *= invSY;\n\t\t_m1.elements[ 5 ] *= invSY;\n\t\t_m1.elements[ 6 ] *= invSY;\n\n\t\t_m1.elements[ 8 ] *= invSZ;\n\t\t_m1.elements[ 9 ] *= invSZ;\n\t\t_m1.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far ) {\n\n\t\tif ( far === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\t\tconst c = - ( far + near ) / ( far - near );\n\t\tconst d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\t\tconst z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DefaultOrder ) {\n\n\t\tObject.defineProperty( this, 'isEuler', { value: true } );\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order || this._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order, update ) {\n\n\t\tconst clamp = MathUtils.clamp;\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\torder = order || this._order;\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix, order, update );\n\n\t}\n\n\tsetFromVector3( v, order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion$1.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$1, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\ttoVector3( optionalResult ) {\n\n\t\tif ( optionalResult ) {\n\n\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t} else {\n\n\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t}\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n}\n\nEuler.DefaultOrder = 'XYZ';\nEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\n\nclass Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = 1 << channel | 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$2 = new Vector3();\nconst _q1 = new Quaternion();\nconst _m1$1 = new Matrix4();\nconst _target = new Vector3();\n\nconst _position = new Vector3();\nconst _scale = new Vector3();\nconst _quaternion$2 = new Quaternion();\n\nconst _xAxis = new Vector3( 1, 0, 0 );\nconst _yAxis = new Vector3( 0, 1, 0 );\nconst _zAxis = new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nfunction Object3D() {\n\n\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Object3D';\n\n\tthis.parent = null;\n\tthis.children = [];\n\n\tthis.up = Object3D.DefaultUp.clone();\n\n\tconst position = new Vector3();\n\tconst rotation = new Euler();\n\tconst quaternion = new Quaternion();\n\tconst scale = new Vector3( 1, 1, 1 );\n\n\tfunction onRotationChange() {\n\n\t\tquaternion.setFromEuler( rotation, false );\n\n\t}\n\n\tfunction onQuaternionChange() {\n\n\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t}\n\n\trotation._onChange( onRotationChange );\n\tquaternion._onChange( onQuaternionChange );\n\n\tObject.defineProperties( this, {\n\t\tposition: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: position\n\t\t},\n\t\trotation: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: rotation\n\t\t},\n\t\tquaternion: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: quaternion\n\t\t},\n\t\tscale: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: scale\n\t\t},\n\t\tmodelViewMatrix: {\n\t\t\tvalue: new Matrix4()\n\t\t},\n\t\tnormalMatrix: {\n\t\t\tvalue: new Matrix3()\n\t\t}\n\t} );\n\n\tthis.matrix = new Matrix4();\n\tthis.matrixWorld = new Matrix4();\n\n\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\tthis.matrixWorldNeedsUpdate = false;\n\n\tthis.layers = new Layers();\n\tthis.visible = true;\n\n\tthis.castShadow = false;\n\tthis.receiveShadow = false;\n\n\tthis.frustumCulled = true;\n\tthis.renderOrder = 0;\n\n\tthis.animations = [];\n\n\tthis.userData = {};\n\n}\n\nObject3D.DefaultUp = new Vector3( 0, 1, 0 );\nObject3D.DefaultMatrixAutoUpdate = true;\n\nObject3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Object3D,\n\n\tisObject3D: true,\n\n\tonBeforeRender: function () {},\n\tonAfterRender: function () {},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t},\n\n\tapplyQuaternion: function ( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t},\n\n\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t},\n\n\tsetRotationFromEuler: function ( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t},\n\n\tsetRotationFromMatrix: function ( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t},\n\n\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t},\n\n\trotateOnAxis: function ( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t},\n\n\trotateOnWorldAxis: function ( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function ( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t},\n\n\trotateY: function ( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t},\n\n\trotateZ: function ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t},\n\n\ttranslateOnAxis: function ( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$2.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$2.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t},\n\n\ttranslateX: function ( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t},\n\n\ttranslateY: function ( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t},\n\n\ttranslateZ: function ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t},\n\n\tlocalToWorld: function ( vector ) {\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t},\n\n\tworldToLocal: function ( vector ) {\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t},\n\n\tlookAt: function ( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t},\n\n\tadd: function ( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tremove: function ( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tclear: function () {\n\n\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\tconst object = this.children[ i ];\n\n\t\t\tobject.parent = null;\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\tthis.children.length = 0;\n\n\t\treturn this;\n\n\n\t},\n\n\tattach: function ( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t},\n\n\tgetObjectById: function ( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t},\n\n\tgetObjectByName: function ( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t},\n\n\tgetObjectByProperty: function ( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t},\n\n\tgetWorldPosition: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldPosition() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t},\n\n\tgetWorldQuaternion: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' );\n\t\t\ttarget = new Quaternion();\n\n\t\t}\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position, target, _scale );\n\n\t\treturn target;\n\n\t},\n\n\tgetWorldScale: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldScale() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion$2, target );\n\n\t\treturn target;\n\n\t},\n\n\tgetWorldDirection: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldDirection() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t},\n\n\traycast: function () {},\n\n\ttraverse: function ( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t},\n\n\ttraverseVisible: function ( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t},\n\n\ttraverseAncestors: function ( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t},\n\n\tupdateMatrix: function () {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t},\n\n\tupdateWorldMatrix: function ( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t},\n\n\tclone: function ( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t},\n\n\tcopy: function ( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal, constant ) {\n\n\t\tObject.defineProperty( this, 'isPlane', { value: true } );\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .projectPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .intersectLine() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn undefined;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn undefined;\n\n\t\t}\n\n\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t}\n\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .coplanarPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n}\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nclass Triangle {\n\n\tconstructor( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getNormal() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$1.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$1 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$1 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getBarycoord() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\tthis.getBarycoord( point, a, b, c, _v3 );\n\n\t\treturn ( _v3.x >= 0 ) && ( _v3.y >= 0 ) && ( ( _v3.x + _v3.y ) <= 1 );\n\n\t}\n\n\tstatic getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) {\n\n\t\tthis.getBarycoord( point, p1, p2, p3, _v3 );\n\n\t\ttarget.set( 0, 0 );\n\t\ttarget.addScaledVector( uv1, _v3.x );\n\t\ttarget.addScaledVector( uv2, _v3.y );\n\t\ttarget.addScaledVector( uv3, _v3.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getMidpoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getPlane() target is now required' );\n\t\t\ttarget = new Plane();\n\n\t\t}\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetUV( point, uv1, uv2, uv3, target ) {\n\n\t\treturn Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nclass Color {\n\n\tconstructor( r, g, b ) {\n\n\t\tObject.defineProperty( this, 'isColor', { value: true } );\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tset( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetHex( hex ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\treturn this;\n\n\t}\n\n\tsetRGB( r, g, b ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\n\t}\n\n\tsetHSL( h, s, l ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = MathUtils.euclideanModulo( h, 1 );\n\t\ts = MathUtils.clamp( s, 0, 1 );\n\t\tl = MathUtils.clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetStyle( style ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^(\\d*\\.?\\d+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tconst h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tconst s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\tconst l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetColorName( style ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\tcopyGammaToLinear( color, gammaFactor = 2.0 ) {\n\n\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToGamma( color, gammaFactor = 2.0 ) {\n\n\t\tconst safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\treturn this;\n\n\t}\n\n\tconvertGammaToLinear( gammaFactor ) {\n\n\t\tthis.copyGammaToLinear( this, gammaFactor );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToGamma( gammaFactor ) {\n\n\t\tthis.copyLinearToGamma( this, gammaFactor );\n\n\t\treturn this;\n\n\t}\n\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\tgetHex() {\n\n\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t}\n\n\tgetHexString() {\n\n\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t}\n\n\tgetHSL( target ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Color: .getHSL() target is now required' );\n\t\t\ttarget = { h: 0, s: 0, l: 0 };\n\n\t\t}\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\tgetStyle() {\n\n\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t}\n\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\t_hslA.h += h; _hslA.s += s; _hslA.l += l;\n\n\t\tthis.setHSL( _hslA.h, _hslA.s, _hslA.l );\n\n\t\treturn this;\n\n\t}\n\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = MathUtils.lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = MathUtils.lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = MathUtils.lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\tif ( attribute.normalized === true ) {\n\n\t\t\t// assuming Uint8Array\n\n\t\t\tthis.r /= 255;\n\t\t\tthis.g /= 255;\n\t\t\tthis.b /= 255;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n}\n\nColor.NAMES = _colorKeywords;\nColor.prototype.r = 1;\nColor.prototype.g = 1;\nColor.prototype.b = 1;\n\nclass Face3 {\n\n\tconstructor( a, b, c, normal, color, materialIndex = 0 ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = ( normal && normal.isVector3 ) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = ( color && color.isColor ) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.a = source.a;\n\t\tthis.b = source.b;\n\t\tthis.c = source.c;\n\n\t\tthis.normal.copy( source.normal );\n\t\tthis.color.copy( source.color );\n\n\t\tthis.materialIndex = source.materialIndex;\n\n\t\tfor ( let i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t}\n\n\t\tfor ( let i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet materialId = 0;\n\nfunction Material() {\n\n\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Material';\n\n\tthis.fog = true;\n\n\tthis.blending = NormalBlending;\n\tthis.side = FrontSide;\n\tthis.flatShading = false;\n\tthis.vertexColors = false;\n\n\tthis.opacity = 1;\n\tthis.transparent = false;\n\n\tthis.blendSrc = SrcAlphaFactor;\n\tthis.blendDst = OneMinusSrcAlphaFactor;\n\tthis.blendEquation = AddEquation;\n\tthis.blendSrcAlpha = null;\n\tthis.blendDstAlpha = null;\n\tthis.blendEquationAlpha = null;\n\n\tthis.depthFunc = LessEqualDepth;\n\tthis.depthTest = true;\n\tthis.depthWrite = true;\n\n\tthis.stencilWriteMask = 0xff;\n\tthis.stencilFunc = AlwaysStencilFunc;\n\tthis.stencilRef = 0;\n\tthis.stencilFuncMask = 0xff;\n\tthis.stencilFail = KeepStencilOp;\n\tthis.stencilZFail = KeepStencilOp;\n\tthis.stencilZPass = KeepStencilOp;\n\tthis.stencilWrite = false;\n\n\tthis.clippingPlanes = null;\n\tthis.clipIntersection = false;\n\tthis.clipShadows = false;\n\n\tthis.shadowSide = null;\n\n\tthis.colorWrite = true;\n\n\tthis.precision = null; // override the renderer's default precision for this material\n\n\tthis.polygonOffset = false;\n\tthis.polygonOffsetFactor = 0;\n\tthis.polygonOffsetUnits = 0;\n\n\tthis.dithering = false;\n\n\tthis.alphaTest = 0;\n\tthis.premultipliedAlpha = false;\n\n\tthis.visible = true;\n\n\tthis.toneMapped = true;\n\n\tthis.userData = {};\n\n\tthis.version = 0;\n\n}\n\nMaterial.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Material,\n\n\tisMaterial: true,\n\n\tonBeforeCompile: function ( /* shaderobject, renderer */ ) {},\n\n\tcustomProgramCacheKey: function () {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t},\n\n\tsetValues: function ( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Material: \\'' + key + '\\' parameter is undefined.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// for backward compatability if shading is set in the constructor\n\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': \\'' + key + '\\' is not a property of this material.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst isRoot = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRoot ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen && this.sheen.isColor ) data.sheen = this.sheen.getHex();\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\t\t\tdata.refractionRatio = this.refractionRatio;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\t\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\n\t\t}\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\n\t\tdata.stencilWrite = this.stencilWrite;\n\t\tdata.stencilWriteMask = this.stencilWriteMask;\n\t\tdata.stencilFunc = this.stencilFunc;\n\t\tdata.stencilRef = this.stencilRef;\n\t\tdata.stencilFuncMask = this.stencilFuncMask;\n\t\tdata.stencilFail = this.stencilFail;\n\t\tdata.stencilZFail = this.stencilZFail;\n\t\tdata.stencilZPass = this.stencilZPass;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.morphTargets === true ) data.morphTargets = true;\n\t\tif ( this.morphNormals === true ) data.morphNormals = true;\n\t\tif ( this.skinning === true ) data.skinning = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRoot ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.fog = source.fog;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.flatShading = source.flatShading;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\nObject.defineProperty( Material.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * depthTest: ,\n * depthWrite: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: \n * }\n */\n\nfunction MeshBasicMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshBasicMaterial';\n\n\tthis.color = new Color( 0xffffff ); // emissive\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshBasicMaterial.prototype = Object.create( Material.prototype );\nMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\nMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\nMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\treturn this;\n\n};\n\nconst _vector$3 = new Vector3();\nconst _vector2$1 = new Vector2();\n\nfunction BufferAttribute( array, itemSize, normalized ) {\n\n\tif ( Array.isArray( array ) ) {\n\n\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t}\n\n\tthis.name = '';\n\n\tthis.array = array;\n\tthis.itemSize = itemSize;\n\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\tthis.normalized = normalized === true;\n\n\tthis.usage = StaticDrawUsage;\n\tthis.updateRange = { offset: 0, count: - 1 };\n\n\tthis.version = 0;\n\n}\n\nObject.defineProperty( BufferAttribute.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nObject.assign( BufferAttribute.prototype, {\n\n\tisBufferAttribute: true,\n\n\tonUploadCallback: function () {},\n\n\tsetUsage: function ( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t},\n\n\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyArray: function ( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t},\n\n\tcopyColorsArray: function ( colors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\tlet color = colors[ i ];\n\n\t\t\tif ( color === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\tcolor = new Color();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = color.r;\n\t\t\tarray[ offset ++ ] = color.g;\n\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector2sArray: function ( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector2();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector3sArray: function ( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector3();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector4sArray: function ( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector4();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix3: function ( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$3.fromBufferAttribute( this, i );\n\t\t\t\t_vector$3.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$3.x = this.getX( i );\n\t\t\t_vector$3.y = this.getY( i );\n\t\t\t_vector$3.z = this.getZ( i );\n\n\t\t\t_vector$3.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tapplyNormalMatrix: function ( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$3.x = this.getX( i );\n\t\t\t_vector$3.y = this.getY( i );\n\t\t\t_vector$3.z = this.getZ( i );\n\n\t\t\t_vector$3.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttransformDirection: function ( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$3.x = this.getX( i );\n\t\t\t_vector$3.y = this.getY( i );\n\t\t\t_vector$3.z = this.getZ( i );\n\n\t\t\t_vector$3.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tset: function ( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t},\n\n\tgetX: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize ];\n\n\t},\n\n\tsetX: function ( index, x ) {\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t},\n\n\tgetY: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t},\n\n\tsetY: function ( index, y ) {\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tgetZ: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t},\n\n\tsetZ: function ( index, z ) {\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tgetW: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t},\n\n\tsetW: function ( index, w ) {\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetXY: function ( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZ: function ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tonUpload: function ( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\treturn {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.prototype.slice.call( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t}\n\n} );\n\n//\n\nfunction Int8BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int8Array( array ), itemSize, normalized );\n\n}\n\nInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\nfunction Uint8BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized );\n\n}\n\nUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\nfunction Uint8ClampedBufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized );\n\n}\n\nUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\nfunction Int16BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int16Array( array ), itemSize, normalized );\n\n}\n\nInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\nfunction Uint16BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized );\n\n}\n\nUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\nfunction Int32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int32Array( array ), itemSize, normalized );\n\n}\n\nInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\nfunction Uint32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized );\n\n}\n\nUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\nfunction Float16BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized );\n\n}\n\nFloat16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nFloat16BufferAttribute.prototype.constructor = Float16BufferAttribute;\nFloat16BufferAttribute.prototype.isFloat16BufferAttribute = true;\n\nfunction Float32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Float32Array( array ), itemSize, normalized );\n\n}\n\nFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\nfunction Float64BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Float64Array( array ), itemSize, normalized );\n\n}\n\nFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\nclass DirectGeometry {\n\n\tconstructor() {\n\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tcomputeGroups( geometry ) {\n\n\t\tconst groups = [];\n\n\t\tlet group, i;\n\t\tlet materialIndex = undefined;\n\n\t\tconst faces = geometry.faces;\n\n\t\tfor ( i = 0; i < faces.length; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\n\t\t\t// materials\n\n\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t}\n\n\t\t\t\tgroup = {\n\t\t\t\t\tstart: i * 3,\n\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( group !== undefined ) {\n\n\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\tgroups.push( group );\n\n\t\t}\n\n\t\tthis.groups = groups;\n\n\t}\n\n\tfromGeometry( geometry ) {\n\n\t\tconst faces = geometry.faces;\n\t\tconst vertices = geometry.vertices;\n\t\tconst faceVertexUvs = geometry.faceVertexUvs;\n\n\t\tconst hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\tconst hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t// morphs\n\n\t\tconst morphTargets = geometry.morphTargets;\n\t\tconst morphTargetsLength = morphTargets.length;\n\n\t\tlet morphTargetsPosition;\n\n\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\tmorphTargetsPosition = [];\n\n\t\t\tfor ( let i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\tmorphTargetsPosition[ i ] = {\n\t\t\t\t\tname: morphTargets[ i ].name,\n\t\t\t\t \tdata: []\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t}\n\n\t\tconst morphNormals = geometry.morphNormals;\n\t\tconst morphNormalsLength = morphNormals.length;\n\n\t\tlet morphTargetsNormal;\n\n\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\tmorphTargetsNormal = [];\n\n\t\t\tfor ( let i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\tmorphTargetsNormal[ i ] = {\n\t\t\t\t\tname: morphNormals[ i ].name,\n\t\t\t\t \tdata: []\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t}\n\n\t\t// skins\n\n\t\tconst skinIndices = geometry.skinIndices;\n\t\tconst skinWeights = geometry.skinWeights;\n\n\t\tconst hasSkinIndices = skinIndices.length === vertices.length;\n\t\tconst hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t//\n\n\t\tif ( vertices.length > 0 && faces.length === 0 ) {\n\n\t\t\tconsole.error( 'THREE.DirectGeometry: Faceless geometries are not supported.' );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < faces.length; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\n\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\tconst vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t} else {\n\n\t\t\t\tconst normal = face.normal;\n\n\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t}\n\n\t\t\tconst vertexColors = face.vertexColors;\n\n\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t} else {\n\n\t\t\t\tconst color = face.color;\n\n\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\tconst vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\tconst vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morphs\n\n\t\t\tfor ( let j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\tmorphTargetsPosition[ j ].data.push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t}\n\n\t\t\tfor ( let j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\tconst morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\tmorphTargetsNormal[ j ].data.push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t}\n\n\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.computeGroups( geometry );\n\n\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction arrayMax( array ) {\n\n\tif ( array.length === 0 ) return - Infinity;\n\n\tlet max = array[ 0 ];\n\n\tfor ( let i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] > max ) max = array[ i ];\n\n\t}\n\n\treturn max;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\t// Workaround for IE11 pre KB2929437. See #11440\n\tUint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nlet _bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id\n\nconst _m1$2 = new Matrix4();\nconst _obj = new Object3D();\nconst _offset = new Vector3();\nconst _box$2 = new Box3();\nconst _boxMorphTargets = new Box3();\nconst _vector$4 = new Vector3();\n\nfunction BufferGeometry() {\n\n\tObject.defineProperty( this, 'id', { value: _bufferGeometryId += 2 } );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'BufferGeometry';\n\n\tthis.index = null;\n\tthis.attributes = {};\n\n\tthis.morphAttributes = {};\n\tthis.morphTargetsRelative = false;\n\n\tthis.groups = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\tthis.drawRange = { start: 0, count: Infinity };\n\n\tthis.userData = {};\n\n}\n\nBufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: BufferGeometry,\n\n\tisBufferGeometry: true,\n\n\tgetIndex: function () {\n\n\t\treturn this.index;\n\n\t},\n\n\tsetIndex: function ( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetAttribute: function ( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t},\n\n\tsetAttribute: function ( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t},\n\n\tdeleteAttribute: function ( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t},\n\n\thasAttribute: function ( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t},\n\n\taddGroup: function ( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t},\n\n\tclearGroups: function () {\n\n\t\tthis.groups = [];\n\n\t},\n\n\tsetDrawRange: function ( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function ( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1$2.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t},\n\n\trotateY: function ( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1$2.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t},\n\n\trotateZ: function ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1$2.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1$2.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t},\n\n\tscale: function ( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1$2.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t},\n\n\tlookAt: function ( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t},\n\n\tcenter: function () {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromObject: function ( object ) {\n\n\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\tconst positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\tconst colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\tthis.setAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\tthis.setAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\tconst lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\tthis.setAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t} else if ( object.isMesh ) {\n\n\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t},\n\n\tupdateFromObject: function ( object ) {\n\n\t\tlet geometry = object.geometry;\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tlet direct = geometry.__directGeometry;\n\n\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\tdirect = undefined;\n\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( direct === undefined ) {\n\n\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t}\n\n\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\tgeometry = direct;\n\n\t\t}\n\n\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\tconst attribute = this.attributes.position;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\tconst attribute = this.attributes.normal;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\tconst attribute = this.attributes.color;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\tconst attribute = this.attributes.uv;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\tconst attribute = this.attributes.lineDistance;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tfromGeometry: function ( geometry ) {\n\n\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t},\n\n\tfromDirectGeometry: function ( geometry ) {\n\n\t\tconst positions = new Float32Array( geometry.vertices.length * 3 );\n\t\tthis.setAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\tconst normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\tthis.setAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t}\n\n\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\tconst colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\tthis.setAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t}\n\n\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\tconst uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\tthis.setAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t}\n\n\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\tconst uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\tthis.setAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t}\n\n\t\t// groups\n\n\t\tthis.groups = geometry.groups;\n\n\t\t// morphs\n\n\t\tfor ( const name in geometry.morphTargets ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphTargets = geometry.morphTargets[ name ];\n\n\t\t\tfor ( let i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\n\t\t\t\tconst attribute = new Float32BufferAttribute( morphTarget.data.length * 3, 3 );\n\t\t\t\tattribute.name = morphTarget.name;\n\n\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget.data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\t// skinning\n\n\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\tconst skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\tthis.setAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t}\n\n\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\tconst skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\tthis.setAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$4.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$4 );\n\n\t\t\t\t\t\t_vector$4.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$4 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t},\n\n\tcomputeBoundingSphere: function () {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$4.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$4 );\n\n\t\t\t\t\t\t_vector$4.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$4 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$4.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$4 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$4.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$4.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$4 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tcomputeFaceNormals: function () {\n\n\t\t// backwards compatibility\n\n\t},\n\n\tcomputeVertexNormals: function () {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t},\n\n\tmerge: function ( geometry, offset ) {\n\n\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( offset === undefined ) {\n\n\t\t\toffset = 0;\n\n\t\t\tconsole.warn(\n\t\t\t\t'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '\n\t\t\t\t+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'\n\t\t\t);\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\tconst attribute1 = attributes[ key ];\n\t\t\tconst attributeArray1 = attribute1.array;\n\n\t\t\tconst attribute2 = geometry.attributes[ key ];\n\t\t\tconst attributeArray2 = attribute2.array;\n\n\t\t\tconst attributeOffset = attribute2.itemSize * offset;\n\t\t\tconst length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset );\n\n\t\t\tfor ( let i = 0, j = attributeOffset; i < length; i ++, j ++ ) {\n\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tnormalizeNormals: function () {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$4.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$4.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$4.x, _vector$4.y, _vector$4.z );\n\n\t\t}\n\n\t},\n\n\ttoNonIndexed: function () {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tconst attributeData = attribute.toJSON( data.data );\n\n\t\t\tif ( attribute.name !== '' ) attributeData.name = attribute.name;\n\n\t\t\tdata.data.attributes[ key ] = attributeData;\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tconst attributeData = attribute.toJSON( data.data );\n\n\t\t\t\tif ( attribute.name !== '' ) attributeData.name = attribute.name;\n\n\t\t\t\tarray.push( attributeData );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\t/*\n\t\t // Handle primitives\n\n\t\t const parameters = this.parameters;\n\n\t\t if ( parameters !== undefined ) {\n\n\t\t const values = [];\n\n\t\t for ( const key in parameters ) {\n\n\t\t values.push( parameters[ key ] );\n\n\t\t }\n\n\t\t const geometry = Object.create( this.constructor.prototype );\n\t\t this.constructor.apply( geometry, values );\n\t\t return geometry;\n\n\t\t }\n\n\t\t return new this.constructor().copy( this );\n\t\t */\n\n\t\treturn new BufferGeometry().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\nconst _inverseMatrix = new Matrix4();\nconst _ray = new Ray();\nconst _sphere = new Sphere();\n\nconst _vA = new Vector3();\nconst _vB = new Vector3();\nconst _vC = new Vector3();\n\nconst _tempA = new Vector3();\nconst _tempB = new Vector3();\nconst _tempC = new Vector3();\n\nconst _morphA = new Vector3();\nconst _morphB = new Vector3();\nconst _morphC = new Vector3();\n\nconst _uvA = new Vector2();\nconst _uvB = new Vector2();\nconst _uvC = new Vector2();\n\nconst _intersectionPoint = new Vector3();\nconst _intersectionPointWorld = new Vector3();\n\nfunction Mesh( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Mesh';\n\n\tthis.geometry = geometry;\n\tthis.material = material;\n\n\tthis.updateMorphTargets();\n\n}\n\nMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Mesh,\n\n\tisMesh: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t},\n\n\tupdateMorphTargets: function () {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\t// Check boundingBox before continuing\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\tlet intersection;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\t\t\tconst uv = geometry.attributes.uv;\n\t\t\tconst uv2 = geometry.attributes.uv2;\n\t\t\tconst groups = geometry.groups;\n\t\t\tconst drawRange = geometry.drawRange;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t// indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = i;\n\t\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconst isMultiMaterial = Array.isArray( material );\n\n\t\t\tconst vertices = geometry.vertices;\n\t\t\tconst faces = geometry.faces;\n\t\t\tlet uvs;\n\n\t\t\tconst faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\tfor ( let f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\tconst face = faces[ f ];\n\t\t\t\tconst faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material;\n\n\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\tconst fvA = vertices[ face.a ];\n\t\t\t\tconst fvB = vertices[ face.b ];\n\t\t\t\tconst fvC = vertices[ face.c ];\n\n\t\t\t\tintersection = checkIntersection( this, faceMaterial, raycaster, _ray, fvA, fvB, fvC, _intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uvs && uvs[ f ] ) {\n\n\t\t\t\t\t\tconst uvs_f = uvs[ f ];\n\t\t\t\t\t\t_uvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t_uvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t_uvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\tintersection.uv = Triangle.getUV( _intersectionPoint, fvA, fvB, fvC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = face;\n\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n} );\n\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) {\n\n\t_vA.fromBufferAttribute( position, a );\n\t_vB.fromBufferAttribute( position, b );\n\t_vC.fromBufferAttribute( position, c );\n\n\tconst morphInfluences = object.morphTargetInfluences;\n\n\tif ( material.morphTargets && morphPosition && morphInfluences ) {\n\n\t\t_morphA.set( 0, 0, 0 );\n\t\t_morphB.set( 0, 0, 0 );\n\t\t_morphC.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\tconst influence = morphInfluences[ i ];\n\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t_tempA.fromBufferAttribute( morphAttribute, a );\n\t\t\t_tempB.fromBufferAttribute( morphAttribute, b );\n\t\t\t_tempC.fromBufferAttribute( morphAttribute, c );\n\n\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t} else {\n\n\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_vA.add( _morphA );\n\t\t_vB.add( _morphB );\n\t\t_vC.add( _morphC );\n\n\t}\n\n\tif ( object.isSkinnedMesh ) {\n\n\t\tobject.boneTransform( a, _vA );\n\t\tobject.boneTransform( b, _vB );\n\t\tobject.boneTransform( c, _vC );\n\n\t}\n\n\tconst intersection = checkIntersection( object, material, raycaster, ray, _vA, _vB, _vC, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv, a );\n\t\t\t_uvB.fromBufferAttribute( uv, b );\n\t\t\t_uvC.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv2 ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv2, a );\n\t\t\t_uvB.fromBufferAttribute( uv2, b );\n\t\t\t_uvC.fromBufferAttribute( uv2, c );\n\n\t\t\tintersection.uv2 = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tconst face = new Face3( a, b, c );\n\t\tTriangle.getNormal( _vA, _vB, _vC, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nclass BoxBufferGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Uniform Utilities\n */\n\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\n/**\n * parameters = {\n * defines: { \"label\" : \"value\" },\n * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n *\n * fragmentShader: ,\n * vertexShader: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * lights: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction ShaderMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'ShaderMaterial';\n\n\tthis.defines = {};\n\tthis.uniforms = {};\n\n\tthis.vertexShader = default_vertex;\n\tthis.fragmentShader = default_fragment;\n\n\tthis.linewidth = 1;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false; // set to use scene fog\n\tthis.lights = false; // set to use scene lights\n\tthis.clipping = false; // set to use user-defined clipping planes\n\n\tthis.skinning = false; // set to use skinning attribute streams\n\tthis.morphTargets = false; // set to use morph targets\n\tthis.morphNormals = false; // set to use morph normals\n\n\tthis.extensions = {\n\t\tderivatives: false, // set to use derivatives\n\t\tfragDepth: false, // set to use fragment depth values\n\t\tdrawBuffers: false, // set to use draw buffers\n\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t};\n\n\t// When rendered geometry doesn't include these attributes but the material does,\n\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\tthis.defaultAttributeValues = {\n\t\t'color': [ 1, 1, 1 ],\n\t\t'uv': [ 0, 0 ],\n\t\t'uv2': [ 0, 0 ]\n\t};\n\n\tthis.index0AttributeName = undefined;\n\tthis.uniformsNeedUpdate = false;\n\n\tthis.glslVersion = null;\n\n\tif ( parameters !== undefined ) {\n\n\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n}\n\nShaderMaterial.prototype = Object.create( Material.prototype );\nShaderMaterial.prototype.constructor = ShaderMaterial;\n\nShaderMaterial.prototype.isShaderMaterial = true;\n\nShaderMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.fragmentShader = source.fragmentShader;\n\tthis.vertexShader = source.vertexShader;\n\n\tthis.uniforms = cloneUniforms( source.uniforms );\n\n\tthis.defines = Object.assign( {}, source.defines );\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\tthis.lights = source.lights;\n\tthis.clipping = source.clipping;\n\n\tthis.skinning = source.skinning;\n\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\tthis.extensions = Object.assign( {}, source.extensions );\n\n\tthis.glslVersion = source.glslVersion;\n\n\treturn this;\n\n};\n\nShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\tconst data = Material.prototype.toJSON.call( this, meta );\n\n\tdata.glslVersion = this.glslVersion;\n\tdata.uniforms = {};\n\n\tfor ( const name in this.uniforms ) {\n\n\t\tconst uniform = this.uniforms[ name ];\n\t\tconst value = uniform.value;\n\n\t\tif ( value && value.isTexture ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 't',\n\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t};\n\n\t\t} else if ( value && value.isColor ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'c',\n\t\t\t\tvalue: value.getHex()\n\t\t\t};\n\n\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'v2',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'v3',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'v4',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'm3',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'm4',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\tvalue: value\n\t\t\t};\n\n\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t}\n\n\t}\n\n\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\tdata.vertexShader = this.vertexShader;\n\tdata.fragmentShader = this.fragmentShader;\n\n\tconst extensions = {};\n\n\tfor ( const key in this.extensions ) {\n\n\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t}\n\n\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\treturn data;\n\n};\n\nfunction Camera() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Camera';\n\n\tthis.matrixWorldInverse = new Matrix4();\n\n\tthis.projectionMatrix = new Matrix4();\n\tthis.projectionMatrixInverse = new Matrix4();\n\n}\n\nCamera.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Camera,\n\n\tisCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\treturn this;\n\n\t},\n\n\tgetWorldDirection: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Camera: .getWorldDirection() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize();\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t},\n\n\tupdateWorldMatrix: function ( updateParents, updateChildren ) {\n\n\t\tObject3D.prototype.updateWorldMatrix.call( this, updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n} );\n\nfunction PerspectiveCamera( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\tCamera.call( this );\n\n\tthis.type = 'PerspectiveCamera';\n\n\tthis.fov = fov;\n\tthis.zoom = 1;\n\n\tthis.near = near;\n\tthis.far = far;\n\tthis.focus = 10;\n\n\tthis.aspect = aspect;\n\tthis.view = null;\n\n\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\tthis.updateProjectionMatrix();\n\n}\n\nPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\tconstructor: PerspectiveCamera,\n\n\tisPerspectiveCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t},\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength: function ( focalLength ) {\n\n\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = MathUtils.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength: function () {\n\n\t\tconst vExtentSlope = Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t},\n\n\tgetEffectiveFOV: function () {\n\n\t\treturn MathUtils.RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t},\n\n\tgetFilmWidth: function () {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t},\n\n\tgetFilmHeight: function () {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t},\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tclearViewOffset: function () {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tupdateProjectionMatrix: function () {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = - 0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n} );\n\nconst fov = 90, aspect = 1;\n\nfunction CubeCamera( near, far, renderTarget ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'CubeCamera';\n\n\tif ( renderTarget.isWebGLCubeRenderTarget !== true ) {\n\n\t\tconsole.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' );\n\t\treturn;\n\n\t}\n\n\tthis.renderTarget = renderTarget;\n\n\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPX.layers = this.layers;\n\tcameraPX.up.set( 0, - 1, 0 );\n\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\tthis.add( cameraPX );\n\n\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNX.layers = this.layers;\n\tcameraNX.up.set( 0, - 1, 0 );\n\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\tthis.add( cameraNX );\n\n\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPY.layers = this.layers;\n\tcameraPY.up.set( 0, 0, 1 );\n\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\tthis.add( cameraPY );\n\n\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNY.layers = this.layers;\n\tcameraNY.up.set( 0, 0, - 1 );\n\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\tthis.add( cameraNY );\n\n\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPZ.layers = this.layers;\n\tcameraPZ.up.set( 0, - 1, 0 );\n\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\tthis.add( cameraPZ );\n\n\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNZ.layers = this.layers;\n\tcameraNZ.up.set( 0, - 1, 0 );\n\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\tthis.add( cameraNZ );\n\n\tthis.update = function ( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0 );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1 );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2 );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3 );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4 );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5 );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t};\n\n}\n\nCubeCamera.prototype = Object.create( Object3D.prototype );\nCubeCamera.prototype.constructor = CubeCamera;\n\nfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\timages = images !== undefined ? images : [];\n\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\tformat = format !== undefined ? format : RGBFormat;\n\n\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.flipY = false;\n\n\t// Why CubeTexture._needsFlipEnvMap is necessary:\n\t//\n\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t// and the flag _needsFlipEnvMap controls this conversion. The flip is not required (and thus _needsFlipEnvMap is set to false)\n\t// when using WebGLCubeRenderTarget.texture as a cube texture.\n\n\tthis._needsFlipEnvMap = true;\n\n}\n\nCubeTexture.prototype = Object.create( Texture.prototype );\nCubeTexture.prototype.constructor = CubeTexture;\n\nCubeTexture.prototype.isCubeTexture = true;\n\nObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\tget: function () {\n\n\t\treturn this.image;\n\n\t},\n\n\tset: function ( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n} );\n\nfunction WebGLCubeRenderTarget( size, options, dummy ) {\n\n\tif ( Number.isInteger( options ) ) {\n\n\t\tconsole.warn( 'THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )' );\n\n\t\toptions = dummy;\n\n\t}\n\n\tWebGLRenderTarget.call( this, size, size, options );\n\n\toptions = options || {};\n\n\tthis.texture = new CubeTexture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\tthis.texture._needsFlipEnvMap = false;\n\n}\n\nWebGLCubeRenderTarget.prototype = Object.create( WebGLRenderTarget.prototype );\nWebGLCubeRenderTarget.prototype.constructor = WebGLCubeRenderTarget;\n\nWebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true;\n\nWebGLCubeRenderTarget.prototype.fromEquirectangularTexture = function ( renderer, texture ) {\n\n\tthis.texture.type = texture.type;\n\tthis.texture.format = RGBAFormat; // see #18859\n\tthis.texture.encoding = texture.encoding;\n\n\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\tthis.texture.minFilter = texture.minFilter;\n\tthis.texture.magFilter = texture.magFilter;\n\n\tconst shader = {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: /* glsl */`\n\n\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t#include \n\t\t\t\t#include \n\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tuniform sampler2D tEquirect;\n\n\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t}\n\t\t`\n\t};\n\n\tconst geometry = new BoxBufferGeometry( 5, 5, 5 );\n\n\tconst material = new ShaderMaterial( {\n\n\t\tname: 'CubemapFromEquirect',\n\n\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader,\n\t\tside: BackSide,\n\t\tblending: NoBlending\n\n\t} );\n\n\tmaterial.uniforms.tEquirect.value = texture;\n\n\tconst mesh = new Mesh( geometry, material );\n\n\tconst currentMinFilter = texture.minFilter;\n\n\t// Avoid blurred poles\n\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\tconst camera = new CubeCamera( 1, 10, this );\n\tcamera.update( renderer, mesh );\n\n\ttexture.minFilter = currentMinFilter;\n\n\tmesh.geometry.dispose();\n\tmesh.material.dispose();\n\n\treturn this;\n\n};\n\nWebGLCubeRenderTarget.prototype.clear = function ( renderer, color, depth, stencil ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\trenderer.setRenderTarget( this, i );\n\n\t\trenderer.clear( color, depth, stencil );\n\n\t}\n\n\trenderer.setRenderTarget( currentRenderTarget );\n\n};\n\nfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.image = { data: data || null, width: width || 1, height: height || 1 };\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\tthis.generateMipmaps = false;\n\tthis.flipY = false;\n\tthis.unpackAlignment = 1;\n\n\tthis.needsUpdate = true;\n\n}\n\nDataTexture.prototype = Object.create( Texture.prototype );\nDataTexture.prototype.constructor = DataTexture;\n\nDataTexture.prototype.isDataTexture = true;\n\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromProjectionMatrix( m ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$1 );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$1.center.set( 0, 0, 0 );\n\t\t_sphere$1.radius = 0.7071067811865476;\n\t\t_sphere$1.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$1 );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$5.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$5.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$5.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$5 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n}\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type = 5126;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = 5126;\n\n\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\ttype = 5131;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttype = 5123;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = 5122;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = 5125;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = 5124;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = 5120;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = 5121;\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\t}\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nclass PlaneBufferGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\t\tthis.type = 'PlaneBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n}\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\\n}\\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n#else\\n\\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\\n\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n\\t}\\n\\treturn 1.0;\\n#endif\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\\n\\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\\n\\treturn Fr * fresnel + F0;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\\n\\treturn specularColor * brdf.x + brdf.y;\\n}\\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\\n\\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\\n\\tvec3 FssEss = F * brdf.x + brdf.y;\\n\\tfloat Ess = brdf.x + brdf.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie(float roughness, float NoH) {\\n\\tfloat invAlpha = 1.0 / roughness;\\n\\tfloat cos2h = NoH * NoH;\\n\\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\\n}\\nfloat V_Neubelt(float NoV, float NoL) {\\n\\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\\n}\\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 H = normalize( V + L );\\n\\tfloat dotNH = saturate( dot( N, H ) );\\n\\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\\n}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\\n\\t\\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\tplane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\tif ( clipped ) discard;\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor.xyz *= color.xyz;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n#ifdef CLEARCOAT\\n\\tvec3 clearcoatNormal;\\n#endif\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nfloat linearToRelativeLuminance( const in vec3 color ) {\\n\\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\\n\\treturn dot( weights, color.rgb );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_maxMipLevel 8.0\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_maxTileSize 256.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\\n\\t\\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\\n\\t\\tvec2 f = fract( uv );\\n\\t\\tuv += 0.5 - f;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tif ( mipInt < cubeUV_maxMipLevel ) {\\n\\t\\t\\tuv.y += 2.0 * cubeUV_maxTileSize;\\n\\t\\t}\\n\\t\\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\\n\\t\\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\\n\\t\\tuv *= texelSize;\\n\\t\\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\\n\\t\\tuv.x += texelSize;\\n\\t\\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\\n\\t\\tuv.y += texelSize;\\n\\t\\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\\n\\t\\tuv.x -= texelSize;\\n\\t\\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\\n\\t\\tvec3 tm = mix( tl, tr, f.x );\\n\\t\\tvec3 bm = mix( bl, br, f.x );\\n\\t\\treturn mix( tm, bm, f.y );\\n\\t}\\n\\t#define r0 1.0\\n\\t#define v0 0.339\\n\\t#define m0 - 2.0\\n\\t#define r1 0.8\\n\\t#define v1 0.276\\n\\t#define m1 - 1.0\\n\\t#define r4 0.4\\n\\t#define v4 0.046\\n\\t#define m4 2.0\\n\\t#define r5 0.305\\n\\t#define v5 0.016\\n\\t#define m5 3.0\\n\\t#define r6 0.21\\n\\t#define v6 0.0038\\n\\t#define m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= r1 ) {\\n\\t\\t\\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\\n\\t\\t} else if ( roughness >= r4 ) {\\n\\t\\t\\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\\n\\t\\t} else if ( roughness >= r5 ) {\\n\\t\\t\\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\\n\\t\\t} else if ( roughness >= r6 ) {\\n\\t\\t\\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_INSTANCING\\n\\tmat3 m = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\\n\\ttransformedNormal = m * transformedNormal;\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar encodings_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\\n\\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract( Le );\\n\\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\\n\\treturn vec4( max( vRGB, 0.0 ), 1.0 );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifndef ENVMAP_TYPE_CUBE_UV\\n\\t\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform int maxMipLevel;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\t\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tfogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float fogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t#else\\n\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t#endif\\n}\";\n\nvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\\n\\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\\n#endif\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\nvIndirectFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n\\tvIndirectBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\\n#ifdef DOUBLE_SIDED\\n\\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\\n\\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\nuniform vec3 lightProbe[ 9 ];\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\\n\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#if defined( USE_ENVMAP )\\n\\t#ifdef ENVMAP_MODE_REFRACTION\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\\n#define Material_LightProbeLOD( material )\\t(0)\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\\n#ifdef REFLECTIVITY\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#endif\\n#ifdef CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheen;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularRoughness;\\n\\tvec3 specularColor;\\n#ifdef CLEARCOAT\\n\\tfloat clearcoat;\\n\\tfloat clearcoatRoughness;\\n#endif\\n#ifdef USE_SHEEN\\n\\tvec3 sheenColor;\\n#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifdef CLEARCOAT\\n\\t\\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = ccDotNL * directLight.color;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tccIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\\n\\t\\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\\n\\t#else\\n\\t\\tfloat clearcoatDHR = 0.0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\\n\\t\\t\\tmaterial.specularRoughness,\\n\\t\\t\\tdirectLight.direction,\\n\\t\\t\\tgeometry,\\n\\t\\t\\tmaterial.sheenColor\\n\\t\\t);\\n\\t#else\\n\\t\\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\\n\\t#endif\\n\\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef CLEARCOAT\\n\\t\\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\\n\\t\\tfloat ccDotNL = ccDotNV;\\n\\t\\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\\n\\t#else\\n\\t\\tfloat clearcoatDHR = 0.0;\\n\\t#endif\\n\\tfloat clearcoatInv = 1.0 - clearcoatDHR;\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\\n\\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\n#ifdef CLEARCOAT\\n\\tgeometry.clearcoatNormal = clearcoatNormal;\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\\n\\t#ifdef CLEARCOAT\\n\\t\\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t\\tvarying float vIsPerspective;\\n\\t#else\\n\\t\\tuniform float logDepthBufFC;\\n\\t#endif\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n\\t#else\\n\\t\\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\\n\\t\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\t\\tgl_Position.z *= gl_Position.w;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvec4 mapTexel = texture2D( map, uv );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tuniform mat3 uvTransform;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\tuniform float morphTargetBaseInfluence;\\n\\t#ifndef USE_MORPHNORMALS\\n\\t\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\t\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\\n\\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\\n\\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\\n\\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\t\\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\\n\\t\\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\\n\\t\\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\\n\\t\\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\";\n\nvar normal_fragment_begin = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t#endif\\n\\t#ifdef USE_TANGENT\\n\\t\\tvec3 tangent = normalize( vTangent );\\n\\t\\tvec3 bitangent = normalize( vBitangent );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\t\\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\t#endif\\n\\t\\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tmat3 vTBN = mat3( tangent, bitangent, normal );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\nvec3 geometryNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef OBJECTSPACE_NORMALMAP\\n\\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( TANGENTSPACE_NORMALMAP )\\n\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tnormal = normalize( vTBN * mapN );\\n\\t#else\\n\\t\\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\\n\\t#endif\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef OBJECTSPACE_NORMALMAP\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\\n\\t\\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\\n\\t\\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\\n\\t\\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\\n\\t\\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef CLEARCOAT\\n\\tvec3 clearcoatNormal = geometryNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\\n\\t#else\\n\\t\\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\\n\\t#endif\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nvec4 pack2HalfToRGBA( vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\\n}\\nvec2 unpackRGBATo2Half( vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\tfloat hard_shadow = step( compare , distribution.x );\\n\\t\\tif (hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x ;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\tdp += shadowBias;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\tvec4 shadowWorldPosition;\\n\\t#endif\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform highp sampler2D boneTexture;\\n\\t\\tuniform int boneTextureSize;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmissionmap_fragment = \"#ifdef USE_TRANSMISSIONMAP\\n\\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\\n#endif\";\n\nvar transmissionmap_pars_fragment = \"#ifdef USE_TRANSMISSIONMAP\\n\\tuniform sampler2D transmissionMap;\\n#endif\";\n\nvar uv_pars_fragment = \"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\\n\\tvarying vec2 vUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#ifdef USE_UV\\n\\t#ifdef UVS_VERTEX_ONLY\\n\\t\\tvec2 vUv;\\n\\t#else\\n\\t\\tvarying vec2 vUv;\\n\\t#endif\\n\\tuniform mat3 uvTransform;\\n#endif\";\n\nvar uv_vertex = \"#ifdef USE_UV\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n#endif\";\n\nvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n\\tuniform mat3 uv2Transform;\\n#endif\";\n\nvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nvar background_frag = \"uniform sampler2D t2D;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\tgl_FragColor = mapTexelToLinear( texColor );\\n\\t#include \\n\\t#include \\n}\";\n\nvar background_vert = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nvar cube_frag = \"#include \\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 vReflect = vWorldDirection;\\n\\t#include \\n\\tgl_FragColor = envColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nvar cube_vert = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#endif\\n}\";\n\nvar depth_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nvar distanceRGBA_frag = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nvar distanceRGBA_vert = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nvar equirect_frag = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tvec4 texColor = texture2D( tEquirect, sampleUV );\\n\\tgl_FragColor = mapTexelToLinear( texColor );\\n\\t#include \\n\\t#include \\n}\";\n\nvar equirect_vert = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\n\\t\\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vIndirectFront;\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshmatcap_frag = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t\\tmatcapColor = matcapTexelToLinear( matcapColor );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshmatcap_vert = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifndef FLAT_SHADED\\n\\t\\tvNormal = normalize( transformedNormal );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nvar meshtoon_frag = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshtoon_vert = \"#define TOON\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshphysical_frag = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define REFLECTIVITY\\n\\t#define CLEARCOAT\\n\\t#define TRANSMISSION\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef TRANSMISSION\\n\\tuniform float transmission;\\n#endif\\n#ifdef REFLECTIVITY\\n\\tuniform float reflectivity;\\n#endif\\n#ifdef CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheen;\\n#endif\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#ifdef TRANSMISSION\\n\\t\\tfloat totalTransmission = transmission;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#ifdef TRANSMISSION\\n\\t\\tdiffuseColor.a *= mix( saturate( 1. - totalTransmission + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) ), 1.0, metalness );\\n\\t#endif\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshphysical_vert = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\";\n\nvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar shadow_frag = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar shadow_vert = \"#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar sprite_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar sprite_vert = \"uniform float rotation;\\nuniform vec2 center;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\tvec2 scale;\\n\\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\\n\\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_vertex: lights_lambert_vertex,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmissionmap_fragment: transmissionmap_fragment,\n\ttransmissionmap_pars_fragment: transmissionmap_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_frag: background_frag,\n\tbackground_vert: background_vert,\n\tcube_frag: cube_frag,\n\tcube_vert: cube_vert,\n\tdepth_frag: depth_frag,\n\tdepth_vert: depth_vert,\n\tdistanceRGBA_frag: distanceRGBA_frag,\n\tdistanceRGBA_vert: distanceRGBA_vert,\n\tequirect_frag: equirect_frag,\n\tequirect_vert: equirect_vert,\n\tlinedashed_frag: linedashed_frag,\n\tlinedashed_vert: linedashed_vert,\n\tmeshbasic_frag: meshbasic_frag,\n\tmeshbasic_vert: meshbasic_vert,\n\tmeshlambert_frag: meshlambert_frag,\n\tmeshlambert_vert: meshlambert_vert,\n\tmeshmatcap_frag: meshmatcap_frag,\n\tmeshmatcap_vert: meshmatcap_vert,\n\tmeshtoon_frag: meshtoon_frag,\n\tmeshtoon_vert: meshtoon_vert,\n\tmeshphong_frag: meshphong_frag,\n\tmeshphong_vert: meshphong_vert,\n\tmeshphysical_frag: meshphysical_frag,\n\tmeshphysical_vert: meshphysical_vert,\n\tnormal_frag: normal_frag,\n\tnormal_vert: normal_vert,\n\tpoints_frag: points_frag,\n\tpoints_vert: points_vert,\n\tshadow_frag: shadow_frag,\n\tshadow_vert: shadow_vert,\n\tsprite_frag: sprite_frag,\n\tsprite_vert: sprite_vert\n};\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() },\n\t\tuv2Transform: { value: new Matrix3() },\n\n\t\talphaMap: { value: null },\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 },\n\t\trefractionRatio: { value: 0.98 },\n\t\tmaxMipLevel: { value: 0 }\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotShadowMap: { value: [] },\n\t\tspotShadowMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.normal_vert,\n\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\t/* -------------------------------------------------------------------------\n\t//\tCube map shader\n\t ------------------------------------------------------------------------- */\n\n\tcube: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.envmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatNormalScale: { value: new Vector2( 1, 1 ) },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tsheen: { value: new Color( 0x000000 ) },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nfunction WebGLBackground( renderer, cubemaps, state, objects, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = 0;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction render( renderList, scene, camera, forceClear ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tbackground = cubemaps.get( background );\n\n\t\t}\n\n\t\t// Ignore background in AR\n\t\t// TODO: Reconsider this.\n\n\t\tconst xr = renderer.xr;\n\t\tconst session = xr.getSession && xr.getSession();\n\n\t\tif ( session && session.environmentBlendMode === 'additive' ) {\n\n\t\t\tbackground = null;\n\n\t\t}\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && ( background.isCubeTexture || background.isWebGLCubeRenderTarget || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxBufferGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.cube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tif ( background.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t// TODO Deprecate\n\n\t\t\t\tbackground = background.texture;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background._needsFlipEnvMap ) ? - 1 : 1;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, extensions, attributes, capabilities ) {\n\n\tconst maxVertexAttributes = gl.getParameter( 34921 );\n\n\tconst extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' );\n\tconst vaoAvailable = capabilities.isWebGL2 || extension !== null;\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tif ( vaoAvailable ) {\n\n\t\t\tconst state = getBindingState( geometry, program, material );\n\n\t\t\tif ( currentState !== state ) {\n\n\t\t\t\tcurrentState = state;\n\t\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t\t}\n\n\t\t\tupdateBuffers = needsUpdate( geometry, index );\n\n\t\t\tif ( updateBuffers ) saveCache( geometry, index );\n\n\t\t} else {\n\n\t\t\tconst wireframe = ( material.wireframe === true );\n\n\t\t\tif ( currentState.geometry !== geometry.id ||\n\t\t\t\tcurrentState.program !== program.id ||\n\t\t\t\tcurrentState.wireframe !== wireframe ) {\n\n\t\t\t\tcurrentState.geometry = geometry.id;\n\t\t\t\tcurrentState.program = program.id;\n\t\t\t\tcurrentState.wireframe = wireframe;\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh === true ) {\n\n\t\t\tupdateBuffers = true;\n\n\t\t}\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, 34963 );\n\n\t\t}\n\n\t\tif ( updateBuffers ) {\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( 34963, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.createVertexArray();\n\n\t\treturn extension.createVertexArrayOES();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao );\n\n\t\treturn extension.bindVertexArrayOES( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao );\n\n\t\treturn extension.deleteVertexArrayOES( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( geometry, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tfor ( const key in geometryAttributes ) {\n\n\t\t\tconst cachedAttribute = cachedAttributes[ key ];\n\t\t\tconst geometryAttribute = geometryAttributes[ key ];\n\n\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\tif ( cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\tattributesNum ++;\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( geometry, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tconst data = {};\n\t\t\tdata.attribute = attribute;\n\n\t\t\tif ( attribute.data ) {\n\n\t\t\t\tdata.data = attribute.data;\n\n\t\t\t}\n\n\t\t\tcache[ key ] = data;\n\n\t\t\tattributesNum ++;\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tconst extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset ) {\n\n\t\tif ( capabilities.isWebGL2 === true && ( type === 5124 || type === 5125 ) ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tif ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return;\n\n\t\t}\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\tconst geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute, data.meshPerAttribute );\n\n\t\t\t\t\t\t\tif ( geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tenableAttribute( programAttribute );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\t\t\t\t\t\tvertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\tif ( geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tenableAttribute( programAttribute );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\t\t\t\t\t\tvertexAttribPointer( programAttribute, size, type, normalized, 0, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( name === 'instanceMatrix' ) {\n\n\t\t\t\t\tconst attribute = attributes.get( object.instanceMatrix );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\n\t\t\t\t\tenableAttributeAndDivisor( programAttribute + 0, 1 );\n\t\t\t\t\tenableAttributeAndDivisor( programAttribute + 1, 1 );\n\t\t\t\t\tenableAttributeAndDivisor( programAttribute + 2, 1 );\n\t\t\t\t\tenableAttributeAndDivisor( programAttribute + 3, 1 );\n\n\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\n\t\t\t\t\tgl.vertexAttribPointer( programAttribute + 0, 4, type, false, 64, 0 );\n\t\t\t\t\tgl.vertexAttribPointer( programAttribute + 1, 4, type, false, 64, 16 );\n\t\t\t\t\tgl.vertexAttribPointer( programAttribute + 2, 4, type, false, 64, 32 );\n\t\t\t\t\tgl.vertexAttribPointer( programAttribute + 3, 4, type, false, 64, 48 );\n\n\t\t\t\t} else if ( name === 'instanceColor' ) {\n\n\t\t\t\t\tconst attribute = attributes.get( object.instanceColor );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\n\t\t\t\t\tenableAttributeAndDivisor( programAttribute, 1 );\n\n\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\n\t\t\t\t\tgl.vertexAttribPointer( programAttribute, 3, type, false, 12, 0 );\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatilibity\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawArraysInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawArraysInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36338 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36338 ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36337 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36337 ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\t/* eslint-disable no-undef */\n\tconst isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) ||\n\t\t( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext );\n\t/* eslint-enable no-undef */\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( 34930 );\n\tconst maxVertexTextures = gl.getParameter( 35660 );\n\tconst maxTextureSize = gl.getParameter( 3379 );\n\tconst maxCubemapSize = gl.getParameter( 34076 );\n\n\tconst maxAttributes = gl.getParameter( 34921 );\n\tconst maxVertexUniforms = gl.getParameter( 36347 );\n\tconst maxVaryings = gl.getParameter( 36348 );\n\tconst maxFragmentUniforms = gl.getParameter( 36349 );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\tconst floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' );\n\tconst floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\tconst maxSamples = isWebGL2 ? gl.getParameter( 36183 ) : 0;\n\n\treturn {\n\n\t\tisWebGL2: isWebGL2,\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping, camera ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\t\tresetGlobalState();\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst currentRenderList = renderer.getRenderList();\n\t\t\t\t\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height / 2 );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\trenderer.setRenderTarget( currentRenderTarget );\n\t\t\t\t\t\trenderer.setRenderList( currentRenderList );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\treturn extensions[ name ] !== null;\n\n\t\t\t}\n\n\t\t\tlet extension;\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t}\n\n\t\t\textensions[ name ] = extension;\n\n\t\t\treturn extension !== null;\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tif ( ! this.has( name ) ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = new WeakMap();\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\t\tconst buffergeometry = geometries.get( geometry );\n\n\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\tattributes.remove( buffergeometry.index );\n\n\t\t}\n\n\t\tfor ( const name in buffergeometry.attributes ) {\n\n\t\t\tattributes.remove( buffergeometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries.delete( geometry );\n\n\t\tconst attribute = wireframeAttributes.get( buffergeometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( buffergeometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( buffergeometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tlet buffergeometry = geometries.get( geometry );\n\n\t\tif ( buffergeometry ) return buffergeometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tbuffergeometry = geometry;\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t}\n\n\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t}\n\n\t\tgeometries.set( geometry, buffergeometry );\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], 34962 );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawElementsInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawElementsInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 4:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase 0:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction numericalSort( a, b ) {\n\n\treturn a[ 0 ] - b[ 0 ];\n\n}\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction WebGLMorphtargets( gl ) {\n\n\tconst influencesList = {};\n\tconst morphInfluences = new Float32Array( 8 );\n\n\tconst workInfluences = [];\n\n\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\tworkInfluences[ i ] = [ i, 0 ];\n\n\t}\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// When object doesn't have morph target influences defined, we treat it as a 0-length array\n\t\t// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences\n\n\t\tconst length = objectInfluences === undefined ? 0 : objectInfluences.length;\n\n\t\tlet influences = influencesList[ geometry.id ];\n\n\t\tif ( influences === undefined ) {\n\n\t\t\t// initialise list\n\n\t\t\tinfluences = [];\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t}\n\n\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t}\n\n\t\t// Collect influences\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tconst influence = influences[ i ];\n\n\t\t\tinfluence[ 0 ] = i;\n\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t}\n\n\t\tinfluences.sort( absNumericalSort );\n\n\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\tif ( i < length && influences[ i ][ 1 ] ) {\n\n\t\t\t\tworkInfluences[ i ][ 0 ] = influences[ i ][ 0 ];\n\t\t\t\tworkInfluences[ i ][ 1 ] = influences[ i ][ 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tworkInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;\n\t\t\t\tworkInfluences[ i ][ 1 ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tworkInfluences.sort( numericalSort );\n\n\t\tconst morphTargets = material.morphTargets && geometry.morphAttributes.position;\n\t\tconst morphNormals = material.morphNormals && geometry.morphAttributes.normal;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\tconst influence = workInfluences[ i ];\n\t\t\tconst index = influence[ 0 ];\n\t\t\tconst value = influence[ 1 ];\n\n\t\t\tif ( index !== Number.MAX_SAFE_INTEGER && value ) {\n\n\t\t\t\tif ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {\n\n\t\t\t\t\tgeometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {\n\n\t\t\t\t\tgeometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t}\n\n\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\tmorphInfluencesSum += value;\n\n\t\t\t} else {\n\n\t\t\t\tif ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {\n\n\t\t\t\t\tgeometry.deleteAttribute( 'morphTarget' + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {\n\n\t\t\t\t\tgeometry.deleteAttribute( 'morphNormal' + i );\n\n\t\t\t\t}\n\n\t\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// GLSL shader uses formula baseinfluence * base + sum(target * influence)\n\t\t// This allows us to switch between absolute morphs and relative morphs without changing shader code\n\t\t// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)\n\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\tbuffergeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tattributes.update( object.instanceMatrix, 34962 );\n\n\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\tattributes.update( object.instanceColor, 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction DataTexture2DArray( data = null, width = 1, height = 1, depth = 1 ) {\n\n\tTexture.call( this, null );\n\n\tthis.image = { data, width, height, depth };\n\n\tthis.magFilter = NearestFilter;\n\tthis.minFilter = NearestFilter;\n\n\tthis.wrapR = ClampToEdgeWrapping;\n\n\tthis.generateMipmaps = false;\n\tthis.flipY = false;\n\n\tthis.needsUpdate = true;\n\n}\n\nDataTexture2DArray.prototype = Object.create( Texture.prototype );\nDataTexture2DArray.prototype.constructor = DataTexture2DArray;\nDataTexture2DArray.prototype.isDataTexture2DArray = true;\n\nfunction DataTexture3D( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t// We're going to add .setXXX() methods for setting properties later.\n\t// Users can still set in DataTexture3D directly.\n\t//\n\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t// \ttexture.anisotropy = 16;\n\t//\n\t// See #14839\n\n\tTexture.call( this, null );\n\n\tthis.image = { data, width, height, depth };\n\n\tthis.magFilter = NearestFilter;\n\tthis.minFilter = NearestFilter;\n\n\tthis.wrapR = ClampToEdgeWrapping;\n\n\tthis.generateMipmaps = false;\n\tthis.flipY = false;\n\n\tthis.needsUpdate = true;\n\n\n}\n\nDataTexture3D.prototype = Object.create( Texture.prototype );\nDataTexture3D.prototype.constructor = DataTexture3D;\nDataTexture3D.prototype.isDataTexture3D = true;\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nconst emptyTexture = new Texture();\nconst emptyTexture2dArray = new DataTexture2DArray();\nconst emptyTexture3d = new DataTexture3D();\nconst emptyCubeTexture = new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyTexture2dArray, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || emptyTexture3d, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTextureCube( v || emptyCubeTexture, unit );\n\n}\n\n// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n// uint\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n// Array of scalars\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Integer / Boolean vectors or arrays thereof (always flat arrays)\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n\n// Array of vectors (flat or from THREE classes)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (flat or from THREE clases)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of textures (2D / Cube)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nfunction SingleUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.size = activeInfo.size;\n\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nPureArrayUniform.prototype.updateCache = function ( data ) {\n\n\tconst cache = this.cache;\n\n\tif ( data instanceof Float32Array && cache.length !== data.length ) {\n\n\t\tthis.cache = new Float32Array( data.length );\n\n\t}\n\n\tcopyArray( cache, data );\n\n};\n\nfunction StructuredUniform( id ) {\n\n\tthis.id = id;\n\n\tthis.seq = [];\n\tthis.map = {};\n\n}\n\nStructuredUniform.prototype.setValue = function ( gl, value, textures ) {\n\n\tconst seq = this.seq;\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t}\n\n};\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nfunction WebGLUniforms( gl, program ) {\n\n\tthis.seq = [];\n\tthis.map = {};\n\n\tconst n = gl.getProgramParameter( program, 35718 );\n\n\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\tparseUniform( info, addr, this );\n\n\t}\n\n}\n\nWebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) {\n\n\tconst u = this.map[ name ];\n\n\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n};\n\nWebGLUniforms.prototype.setOptional = function ( gl, object, name ) {\n\n\tconst v = object[ name ];\n\n\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n};\n\n\n// Static interface\n\nWebGLUniforms.upload = function ( gl, seq, values, textures ) {\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ],\n\t\t\tv = values[ u.id ];\n\n\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t}\n\n\t}\n\n};\n\nWebGLUniforms.seqWithValue = function ( seq, values ) {\n\n\tconst r = [];\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tif ( u.id in values ) r.push( u );\n\n\t}\n\n\treturn r;\n\n};\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\nlet programIdCount = 0;\n\nfunction addLineNumbers( string ) {\n\n\tconst lines = string.split( '\\n' );\n\n\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t}\n\n\treturn lines.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tcase RGBEEncoding:\n\t\t\treturn [ 'RGBE', '( value )' ];\n\t\tcase RGBM7Encoding:\n\t\t\treturn [ 'RGBM', '( value, 7.0 )' ];\n\t\tcase RGBM16Encoding:\n\t\t\treturn [ 'RGBM', '( value, 16.0 )' ];\n\t\tcase RGBDEncoding:\n\t\t\treturn [ 'RGBD', '( value, 256.0 )' ];\n\t\tcase GammaEncoding:\n\t\t\treturn [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ];\n\t\tcase LogLuvEncoding:\n\t\t\treturn [ 'LogLuv', '( value )' ];\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding );\n\t\t\treturn [ 'Linear', '( value )' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, 35713 );\n\tconst log = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && log === '' ) return '';\n\n\t// --enable-privileged-webgl-extension\n\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\tconst source = gl.getShaderSource( shader );\n\n\treturn 'THREE.WebGLShader: gl.getShaderInfoLog() ' + type + '\\n' + log + addLineNumbers( source );\n\n}\n\nfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\tconst components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }';\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tconst components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( parameters ) {\n\n\tconst chunks = [\n\t\t( parameters.extensionDerivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, 35721 );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nfunction includeReplacer( match, include ) {\n\n\tconst string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst deprecatedUnrollLoopPattern = /#pragma unroll_loop[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string\n\t\t.replace( unrollLoopPattern, loopReplacer )\n\t\t.replace( deprecatedUnrollLoopPattern, deprecatedLoopReplacer );\n\n}\n\nfunction deprecatedLoopReplacer( match, start, end, snippet ) {\n\n\tconsole.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' );\n\treturn loopReplacer( match, start, end, snippet );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = 'precision ' + parameters.precision + ' float;\\nprecision ' + parameters.precision + ' int;';\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\n\n\tconst gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\tconst customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest + ( parameters.alphaTest % 1 ? '' : '.0' ) : '', // add '.0' if integer\n\n\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t( ( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\n\t\t\tShaderChunk[ 'encodings_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tparameters.map ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\tparameters.matcap ? getTexelDecodingFunction( 'matcapTexelToLinear', parameters.matcapEncoding ) : '',\n\t\t\tparameters.envMap ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\tparameters.emissiveMap ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\tparameters.lightMap ? getTexelDecodingFunction( 'lightMapTexelToLinear', parameters.lightMapEncoding ) : '',\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ),\n\n\t\t\tparameters.depthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, 35633, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, 35632, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\t// check for link errors\n\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\tlet runnable = true;\n\t\tlet haveDiagnostics = true;\n\n\t\tif ( gl.getProgramParameter( program, 35714 ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), '35715', gl.getProgramParameter( program, 35715 ), 'gl.getProgramInfoLog', programLog, vertexErrors, fragmentErrors );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t}\n\n\t// Clean up\n\n\t// Crashes in iOS9 and iOS10. #18402\n\t// gl.detachShader( program, glVertexShader );\n\t// gl.detachShader( program, glFragmentShader );\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst programs = [];\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst floatVertexTextures = capabilities.floatVertexTextures;\n\tconst maxVertexUniforms = capabilities.maxVertexUniforms;\n\tconst vertexTextures = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tconst parameterNames = [\n\t\t'precision', 'isWebGL2', 'supportsVertexTextures', 'outputEncoding', 'instancing', 'instancingColor',\n\t\t'map', 'mapEncoding', 'matcap', 'matcapEncoding', 'envMap', 'envMapMode', 'envMapEncoding', 'envMapCubeUV',\n\t\t'lightMap', 'lightMapEncoding', 'aoMap', 'emissiveMap', 'emissiveMapEncoding', 'bumpMap', 'normalMap', 'objectSpaceNormalMap', 'tangentSpaceNormalMap', 'clearcoatMap', 'clearcoatRoughnessMap', 'clearcoatNormalMap', 'displacementMap', 'specularMap',\n\t\t'roughnessMap', 'metalnessMap', 'gradientMap',\n\t\t'alphaMap', 'combine', 'vertexColors', 'vertexTangents', 'vertexUvs', 'uvsVertexOnly', 'fog', 'useFog', 'fogExp2',\n\t\t'flatShading', 'sizeAttenuation', 'logarithmicDepthBuffer', 'skinning',\n\t\t'maxBones', 'useVertexTexture', 'morphTargets', 'morphNormals',\n\t\t'maxMorphTargets', 'maxMorphNormals', 'premultipliedAlpha',\n\t\t'numDirLights', 'numPointLights', 'numSpotLights', 'numHemiLights', 'numRectAreaLights',\n\t\t'numDirLightShadows', 'numPointLightShadows', 'numSpotLightShadows',\n\t\t'shadowMapEnabled', 'shadowMapType', 'toneMapping', 'physicallyCorrectLights',\n\t\t'alphaTest', 'doubleSided', 'flipSided', 'numClippingPlanes', 'numClipIntersection', 'depthPacking', 'dithering',\n\t\t'sheen', 'transmissionMap'\n\t];\n\n\tfunction getMaxBones( object ) {\n\n\t\tconst skeleton = object.skeleton;\n\t\tconst bones = skeleton.bones;\n\n\t\tif ( floatVertexTextures ) {\n\n\t\t\treturn 1024;\n\n\t\t} else {\n\n\t\t\t// default for when object is not specified\n\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t//\n\t\t\t// - leave some extra space for other uniforms\n\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t// (up to 54 should be safe)\n\n\t\t\tconst nVertexUniforms = maxVertexUniforms;\n\t\t\tconst nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\tconst maxBones = Math.min( nVertexMatrices, bones.length );\n\n\t\t\tif ( maxBones < bones.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\treturn maxBones;\n\n\t\t}\n\n\t}\n\n\tfunction getTextureEncodingFromMap( map ) {\n\n\t\tlet encoding;\n\n\t\tif ( map && map.isTexture ) {\n\n\t\t\tencoding = map.encoding;\n\n\t\t} else if ( map && map.isWebGLRenderTarget ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLPrograms.getTextureEncodingFromMap: don\\'t use render targets as textures. Use their .texture property instead.' );\n\t\t\tencoding = map.texture.encoding;\n\n\t\t} else {\n\n\t\t\tencoding = LinearEncoding;\n\n\t\t}\n\n\t\treturn encoding;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = cubemaps.get( material.envMap || environment );\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tconst maxBones = object.isSkinnedMesh ? getMaxBones( object ) : 0;\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet vertexShader, fragmentShader;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst parameters = {\n\n\t\t\tisWebGL2: isWebGL2,\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderName: material.type,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tinstancing: object.isInstancedMesh === true,\n\t\t\tinstancingColor: object.isInstancedMesh === true && object.instanceColor !== null,\n\n\t\t\tsupportsVertexTextures: vertexTextures,\n\t\t\toutputEncoding: ( currentRenderTarget !== null ) ? getTextureEncodingFromMap( currentRenderTarget.texture ) : renderer.outputEncoding,\n\t\t\tmap: !! material.map,\n\t\t\tmapEncoding: getTextureEncodingFromMap( material.map ),\n\t\t\tmatcap: !! material.matcap,\n\t\t\tmatcapEncoding: getTextureEncodingFromMap( material.matcap ),\n\t\t\tenvMap: !! envMap,\n\t\t\tenvMapMode: envMap && envMap.mapping,\n\t\t\tenvMapEncoding: getTextureEncodingFromMap( envMap ),\n\t\t\tenvMapCubeUV: ( !! envMap ) && ( ( envMap.mapping === CubeUVReflectionMapping ) || ( envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\tlightMap: !! material.lightMap,\n\t\t\tlightMapEncoding: getTextureEncodingFromMap( material.lightMap ),\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap ),\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tobjectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,\n\t\t\ttangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,\n\t\t\tclearcoatMap: !! material.clearcoatMap,\n\t\t\tclearcoatRoughnessMap: !! material.clearcoatRoughnessMap,\n\t\t\tclearcoatNormalMap: !! material.clearcoatNormalMap,\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tsheen: !! material.sheen,\n\n\t\t\ttransmissionMap: !! material.transmissionMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexTangents: ( material.normalMap && material.vertexTangents ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap,\n\t\t\tuvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || !! material.transmissionMap ) && !! material.displacementMap,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog,\n\t\t\tfogExp2: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: material.skinning && maxBones > 0,\n\t\t\tmaxBones: maxBones,\n\t\t\tuseVertexTexture: floatVertexTextures,\n\n\t\t\tmorphTargets: material.morphTargets,\n\t\t\tmorphNormals: material.morphNormals,\n\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\talphaTest: material.alphaTest,\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionDerivatives: material.extensions && material.extensions.derivatives,\n\t\t\textensionFragDepth: material.extensions && material.extensions.fragDepth,\n\t\t\textensionDrawBuffers: material.extensions && material.extensions.drawBuffers,\n\t\t\textensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,\n\n\t\t\trendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ),\n\t\t\trendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ),\n\t\t\trendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.fragmentShader );\n\t\t\tarray.push( parameters.vertexShader );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tfor ( let i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\tarray.push( renderer.outputEncoding );\n\t\t\tarray.push( renderer.gammaFactor );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.program !== b.program ) {\n\n\t\treturn a.program.id - b.program.id;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList( properties ) {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transparent = [];\n\n\tconst defaultProgram = { id: - 1 };\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tprogram: materialProperties.program || defaultProgram,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.program = materialProperties.program || defaultProgram;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\t( material.transparent === true ? transparent : opaque ).push( renderItem );\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\t( material.transparent === true ? transparent : opaque ).unshift( renderItem );\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.program = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists( properties ) {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, camera ) {\n\n\t\tconst cameras = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( cameras === undefined ) {\n\n\t\t\tlist = new WebGLRenderList( properties );\n\t\t\tlists.set( scene, new WeakMap() );\n\t\t\tlists.get( scene ).set( camera, list );\n\n\t\t} else {\n\n\t\t\tlist = cameras.get( camera );\n\t\t\tif ( list === undefined ) {\n\n\t\t\t\tlist = new WebGLRenderList( properties );\n\t\t\t\tcameras.set( camera, list );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 1 : 0 ) - ( lightA.castShadow ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions, capabilities ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\n\t\t\tnumDirectionalShadows: - 1,\n\t\t\tnumPointShadows: - 1,\n\t\t\tnumSpotShadows: - 1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotShadowMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: []\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\n\t\tlights.sort( shadowCastingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\t// (a) intensity is the total visible light emitted\n\t\t\t\t//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );\n\n\t\t\t\t// (b) intensity is the brightness of the light\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t// WebGL 2\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\t// WebGL 1\n\n\t\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t\t} else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotShadowMatrix.length = numSpotShadows;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions, capabilities ) {\n\n\tconst lights = new WebGLLights( extensions, capabilities );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights() {\n\n\t\tlights.setup( lightsArray );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions, capabilities ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tlet renderState;\n\n\t\tif ( renderStates.has( scene ) === false ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\trenderStates.set( scene, [] );\n\t\t\trenderStates.get( scene ).push( renderState );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStates.get( scene ).length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\t\trenderStates.get( scene ).push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStates.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n/**\n * parameters = {\n *\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * wireframe: ,\n * wireframeLinewidth: \n * }\n */\n\nfunction MeshDepthMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshDepthMaterial';\n\n\tthis.depthPacking = BasicDepthPacking;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshDepthMaterial.prototype = Object.create( Material.prototype );\nMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\nMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\nMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.depthPacking = source.depthPacking;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n *\n * referencePosition: ,\n * nearDistance: ,\n * farDistance: ,\n *\n * skinning: ,\n * morphTargets: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: \n *\n * }\n */\n\nfunction MeshDistanceMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshDistanceMaterial';\n\n\tthis.referencePosition = new Vector3();\n\tthis.nearDistance = 1;\n\tthis.farDistance = 1000;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.fog = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshDistanceMaterial.prototype = Object.create( Material.prototype );\nMeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial;\n\nMeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;\n\nMeshDistanceMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.referencePosition.copy( source.referencePosition );\n\tthis.nearDistance = source.nearDistance;\n\tthis.farDistance = source.farDistance;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\treturn this;\n\n};\n\nvar vsm_frag = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include \\nvoid main() {\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\\n\\tfor ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean * HALF_SAMPLE_RATE;\\n\\tsquared_mean = squared_mean * HALF_SAMPLE_RATE;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nvar vsm_vert = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nfunction WebGLShadowMap( _renderer, _objects, maxTextureSize ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterials = [],\n\t\t_distanceMaterials = [],\n\n\t\t_materialCache = {};\n\n\tconst shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\n\t\tdefines: {\n\t\t\tSAMPLE_RATE: 2.0 / 8.0,\n\t\t\tHALF_SAMPLE_RATE: 1.0 / 8.0\n\t\t},\n\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vsm_vert,\n\n\t\tfragmentShader: vsm_frag\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = _renderer.getRenderTarget();\n\t\tconst activeCubeFace = _renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = _renderer.getActiveMipmapLevel();\n\n\t\tconst _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > maxTextureSize || _shadowMapSize.y > maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null && ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tconst pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tconst pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadow.map );\n\t\t\t_renderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = _objects.update( fullScreenMesh );\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.mapPass );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.map );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterialVariant( useMorphing, useSkinning, useInstancing ) {\n\n\t\tconst index = useMorphing << 0 | useSkinning << 1 | useInstancing << 2;\n\n\t\tlet material = _depthMaterials[ index ];\n\n\t\tif ( material === undefined ) {\n\n\t\t\tmaterial = new MeshDepthMaterial( {\n\n\t\t\t\tdepthPacking: RGBADepthPacking,\n\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning\n\n\t\t\t} );\n\n\t\t\t_depthMaterials[ index ] = material;\n\n\t\t}\n\n\t\treturn material;\n\n\t}\n\n\tfunction getDistanceMaterialVariant( useMorphing, useSkinning, useInstancing ) {\n\n\t\tconst index = useMorphing << 0 | useSkinning << 1 | useInstancing << 2;\n\n\t\tlet material = _distanceMaterials[ index ];\n\n\t\tif ( material === undefined ) {\n\n\t\t\tmaterial = new MeshDistanceMaterial( {\n\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning\n\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ index ] = material;\n\n\t\t}\n\n\t\treturn material;\n\n\t}\n\n\tfunction getDepthMaterial( object, geometry, material, light, shadowCameraNear, shadowCameraFar, type ) {\n\n\t\tlet result = null;\n\n\t\tlet getMaterialVariant = getDepthMaterialVariant;\n\t\tlet customMaterial = object.customDepthMaterial;\n\n\t\tif ( light.isPointLight === true ) {\n\n\t\t\tgetMaterialVariant = getDistanceMaterialVariant;\n\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t}\n\n\t\tif ( customMaterial === undefined ) {\n\n\t\t\tlet useMorphing = false;\n\n\t\t\tif ( material.morphTargets === true ) {\n\n\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t}\n\n\t\t\tlet useSkinning = false;\n\n\t\t\tif ( object.isSkinnedMesh === true ) {\n\n\t\t\t\tif ( material.skinning === true ) {\n\n\t\t\t\t\tuseSkinning = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst useInstancing = object.isInstancedMesh === true;\n\n\t\t\tresult = getMaterialVariant( useMorphing, useSkinning, useInstancing );\n\n\t\t} else {\n\n\t\t\tresult = customMaterial;\n\n\t\t}\n\n\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\tmaterial.clipShadows === true &&\n\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t// appropriate state\n\n\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t}\n\n\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult = cachedMaterial;\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tresult.referencePosition.setFromMatrixPosition( light.matrixWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = _objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, geometry, groupMaterial, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, geometry, material, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n}\n\nfunction WebGLState( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( 2929 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( 2929 );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 512 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 519 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 513 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 514 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 518 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 516 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 517 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( 2960 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( 2960 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = null;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( 35661 );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( 7938 );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst currentScissor = new Vector4();\n\tconst currentViewport = new Vector4();\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, 10241, 9728 );\n\t\tgl.texParameteri( type, 10240, 9728 );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, 6408, 1, 1, 0, 6408, 5121, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ 3553 ] = createTexture( 3553, 3553, 1 );\n\temptyTextures[ 34067 ] = createTexture( 34067, 34069, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( 2929 );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( 2884 );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: 32774,\n\t\t[ SubtractEquation ]: 32778,\n\t\t[ ReverseSubtractEquation ]: 32779\n\t};\n\n\tif ( isWebGL2 ) {\n\n\t\tequationToGL[ MinEquation ] = 32775;\n\t\tequationToGL[ MaxEquation ] = 32776;\n\n\t} else {\n\n\t\tconst extension = extensions.get( 'EXT_blend_minmax' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tequationToGL[ MinEquation ] = extension.MIN_EXT;\n\t\t\tequationToGL[ MaxEquation ] = extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: 0,\n\t\t[ OneFactor ]: 1,\n\t\t[ SrcColorFactor ]: 768,\n\t\t[ SrcAlphaFactor ]: 770,\n\t\t[ SrcAlphaSaturateFactor ]: 776,\n\t\t[ DstColorFactor ]: 774,\n\t\t[ DstAlphaFactor ]: 772,\n\t\t[ OneMinusSrcColorFactor ]: 769,\n\t\t[ OneMinusSrcAlphaFactor ]: 771,\n\t\t[ OneMinusDstColorFactor ]: 775,\n\t\t[ OneMinusDstAlphaFactor ]: 773\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled ) {\n\n\t\t\t\tdisable( 3042 );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( ! currentBlendingEnabled ) {\n\n\t\t\tenable( 3042 );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( 32774 );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 1, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 1, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 0, 769, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 768, 0, 770 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 770, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 770, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 0, 769 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 0, 768 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = null;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( 2884 )\n\t\t\t: enable( 2884 );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( 2304 );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( 2305 );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( 2884 );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( 1029 );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( 1028 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( 1032 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 2884 );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( 32823 );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 32823 );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( 3089 );\n\n\t\t} else {\n\n\t\t\tdisable( 3089 );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = 33984 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\tif ( currentTextureSlot === null ) {\n\n\t\t\tactiveTexture();\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = null;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst maxTextures = capabilities.maxTextures;\n\tconst maxCubemapSize = capabilities.maxCubemapSize;\n\tconst maxTextureSize = capabilities.maxTextureSize;\n\tconst maxSamples = capabilities.maxSamples;\n\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\tnew OffscreenCanvas( width, height ) :\n\t\t\tdocument.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( image.width, image.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 || needsPowerOfTwo === true ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tconst floor = needsPowerOfTwo ? MathUtils.floorPowerOfTwo : Math.floor;\n\n\t\t\t\tconst width = floor( scale * image.width );\n\t\t\t\tconst height = floor( scale * image.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo( image ) {\n\n\t\treturn MathUtils.isPowerOfTwo( image.width ) && MathUtils.isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\tif ( isWebGL2 ) return false;\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, supportsMips ) {\n\n\t\treturn texture.generateMipmaps && supportsMips &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target, texture, width, height ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\t// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11\n\t\ttextureProperties.__maxMipLevel = Math.log( Math.max( width, height ) ) * Math.LOG2E;\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType ) {\n\n\t\tif ( isWebGL2 === false ) return glFormat;\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === 6403 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 33326;\n\t\t\tif ( glType === 5131 ) internalFormat = 33325;\n\t\t\tif ( glType === 5121 ) internalFormat = 33321;\n\n\t\t}\n\n\t\tif ( glFormat === 6407 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 34837;\n\t\t\tif ( glType === 5131 ) internalFormat = 34843;\n\t\t\tif ( glType === 5121 ) internalFormat = 32849;\n\n\t\t}\n\n\t\tif ( glFormat === 6408 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 34836;\n\t\t\tif ( glType === 5131 ) internalFormat = 34842;\n\t\t\tif ( glType === 5121 ) internalFormat = 32856;\n\n\t\t}\n\n\t\tif ( internalFormat === 33325 || internalFormat === 33326 ||\n\t\t\tinternalFormat === 34842 || internalFormat === 34836 ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) {\n\n\t\t\treturn 9728;\n\n\t\t}\n\n\t\treturn 9729;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( renderTarget.texture );\n\n\t\tif ( ! renderTarget ) return;\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget.texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 3553, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 35866, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 32879, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: 10497,\n\t\t[ ClampToEdgeWrapping ]: 33071,\n\t\t[ MirroredRepeatWrapping ]: 33648\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: 9728,\n\t\t[ NearestMipmapNearestFilter ]: 9984,\n\t\t[ NearestMipmapLinearFilter ]: 9986,\n\n\t\t[ LinearFilter ]: 9729,\n\t\t[ LinearMipmapNearestFilter ]: 9985,\n\t\t[ LinearMipmapLinearFilter ]: 9987\n\t};\n\n\tfunction setTextureParameters( textureType, texture, supportsMips ) {\n\n\t\tif ( supportsMips ) {\n\n\t\t\t_gl.texParameteri( textureType, 10242, wrappingToGL[ texture.wrapS ] );\n\t\t\t_gl.texParameteri( textureType, 10243, wrappingToGL[ texture.wrapT ] );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, wrappingToGL[ texture.wrapR ] );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterToGL[ texture.magFilter ] );\n\t\t\t_gl.texParameteri( textureType, 10241, filterToGL[ texture.minFilter ] );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, 10242, 33071 );\n\t\t\t_gl.texParameteri( textureType, 10243, 33071 );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, 33071 );\n\n\t\t\t}\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, 10241, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\tif ( extension ) {\n\n\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\tif ( texture.type === HalfFloatType && ( isWebGL2 || extensions.get( 'OES_texture_half_float_linear' ) ) === null ) return;\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = 3553;\n\n\t\tif ( texture.isDataTexture2DArray ) textureType = 35866;\n\t\tif ( texture.isDataTexture3D ) textureType = 32879;\n\n\t\tinitTexture( textureProperties, texture );\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( 37440, texture.flipY );\n\t\t_gl.pixelStorei( 37441, texture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, texture.unpackAlignment );\n\n\t\tconst needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false;\n\t\tconst image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );\n\n\t\tconst supportsMips = isPowerOfTwo( image ) || isWebGL2,\n\t\t\tglFormat = utils.convert( texture.format );\n\n\t\tlet glType = utils.convert( texture.type ),\n\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType );\n\n\t\tsetTextureParameters( textureType, texture, supportsMips );\n\n\t\tlet mipmap;\n\t\tconst mipmaps = texture.mipmaps;\n\n\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t// populate depth texture with dummy data\n\n\t\t\tglInternalFormat = 6402;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t} else if ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t} else if ( texture.type === UnsignedInt248Type ) {\n\n\t\t\t\t\tglInternalFormat = 35056;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tglInternalFormat = 33189; // WebGL2 requires sized internalformat for glTexImage2D\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tconsole.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// validation checks for WebGL 1\n\n\t\t\tif ( texture.format === DepthFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.format === DepthStencilFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tglInternalFormat = 34041;\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t}\n\n\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\tstate.compressedTexImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t} else if ( texture.isDataTexture2DArray ) {\n\n\t\t\tstate.texImage3D( 35866, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t} else if ( texture.isDataTexture3D ) {\n\n\t\t\tstate.texImage3D( 32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t} else {\n\n\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, glFormat, glType, image );\n\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\tgenerateMipmap( textureType, texture, image.width, image.height );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tinitTexture( textureProperties, texture );\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( 37440, texture.flipY );\n\n\t\tconst isCompressed = ( texture && ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture ) );\n\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\tconst cubeImage = [];\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );\n\n\t\t\t} else {\n\n\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst image = cubeImage[ 0 ],\n\t\t\tsupportsMips = isPowerOfTwo( image ) || isWebGL2,\n\t\t\tglFormat = utils.convert( texture.format ),\n\t\t\tglType = utils.convert( texture.type ),\n\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType );\n\n\t\tsetTextureParameters( 34067, texture, supportsMips );\n\n\t\tlet mipmaps;\n\n\t\tif ( isCompressed ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t} else {\n\n\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttextureProperties.__maxMipLevel = mipmaps.length;\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t// We assume images for cube map have the same size.\n\t\t\tgenerateMipmap( 34067, texture, image.width, image.height );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\tconst glFormat = utils.convert( renderTarget.texture.format );\n\t\tconst glType = utils.convert( renderTarget.texture.type );\n\t\tconst glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType );\n\t\tstate.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\t\t_gl.framebufferTexture2D( 36160, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t_gl.bindFramebuffer( 36160, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( 36161, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = 33189;\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t\t} else if ( depthTexture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 36096, 36161, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, 35056, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, 34041, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 33306, 36161, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst glFormat = utils.convert( renderTarget.texture.format );\n\t\t\tconst glType = utils.convert( renderTarget.texture.type );\n\t\t\tconst glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType );\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t_gl.framebufferTexture2D( 36160, 36096, 3553, webglDepthTexture, 0 );\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t_gl.framebufferTexture2D( 36160, 33306, 3553, webglDepthTexture, 0 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindFramebuffer( 36160, null );\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( renderTarget.texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\tinfo.memory.textures ++;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultisample = ( renderTarget.isWebGLMultisampleRenderTarget === true );\n\t\tconst supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;\n\n\t\t// Handles WebGL2 RGBFormat fallback - #18858\n\n\t\tif ( isWebGL2 && renderTarget.texture.format === RGBFormat && ( renderTarget.texture.type === FloatType || renderTarget.texture.type === HalfFloatType ) ) {\n\n\t\t\trenderTarget.texture.format = RGBAFormat;\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.' );\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( 36161, renderTargetProperties.__webglColorRenderbuffer );\n\n\t\t\t\t\tconst glFormat = utils.convert( renderTarget.texture.format );\n\t\t\t\t\tconst glType = utils.convert( renderTarget.texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( 36160, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer );\n\t\t\t\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, null );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( 34067, renderTarget.texture, supportsMips );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, 36064, 34069 + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( 34067, renderTarget.texture, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( 34067, null );\n\n\t\t} else {\n\n\t\t\tstate.bindTexture( 3553, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( 3553, renderTarget.texture, supportsMips );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, 36064, 3553 );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( 3553, renderTarget.texture, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( 3553, null );\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\t\tconst supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? 34067 : 3553;\n\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\tgenerateMipmap( target, texture, renderTarget.width, renderTarget.height );\n\t\t\tstate.bindTexture( target, null );\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.isWebGLMultisampleRenderTarget ) {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\t_gl.bindFramebuffer( 36008, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t_gl.bindFramebuffer( 36009, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = 16384;\n\n\t\t\t\tif ( renderTarget.depthBuffer ) mask |= 256;\n\t\t\t\tif ( renderTarget.stencilBuffer ) mask |= 1024;\n\n\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, 9728 );\n\n\t\t\t\t_gl.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer ); // see #18905\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn ( isWebGL2 && renderTarget.isWebGLMultisampleRenderTarget ) ?\n\t\t\tMath.min( maxSamples, renderTarget.samples ) : 0;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\t// backwards compatibility\n\n\tlet warnedTexture2D = false;\n\tlet warnedTextureCube = false;\n\n\tfunction safeSetTexture2D( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\tif ( warnedTexture2D === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLTextures.safeSetTexture2D: don\\'t use render targets as textures. Use their .texture property instead.' );\n\t\t\t\twarnedTexture2D = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\t\tsetTexture2D( texture, slot );\n\n\t}\n\n\tfunction safeSetTextureCube( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLCubeRenderTarget ) {\n\n\t\t\tif ( warnedTextureCube === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLTextures.safeSetTextureCube: don\\'t use cube render targets as textures. Use their .texture property instead.' );\n\t\t\t\twarnedTextureCube = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\n\t\tsetTextureCube( texture, slot );\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\n\tthis.safeSetTexture2D = safeSetTexture2D;\n\tthis.safeSetTextureCube = safeSetTextureCube;\n\n}\n\nfunction WebGLUtils( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction convert( p ) {\n\n\t\tlet extension;\n\n\t\tif ( p === UnsignedByteType ) return 5121;\n\t\tif ( p === UnsignedShort4444Type ) return 32819;\n\t\tif ( p === UnsignedShort5551Type ) return 32820;\n\t\tif ( p === UnsignedShort565Type ) return 33635;\n\n\t\tif ( p === ByteType ) return 5120;\n\t\tif ( p === ShortType ) return 5122;\n\t\tif ( p === UnsignedShortType ) return 5123;\n\t\tif ( p === IntType ) return 5124;\n\t\tif ( p === UnsignedIntType ) return 5125;\n\t\tif ( p === FloatType ) return 5126;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\tif ( isWebGL2 ) return 5131;\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.HALF_FLOAT_OES;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return 6406;\n\t\tif ( p === RGBFormat ) return 6407;\n\t\tif ( p === RGBAFormat ) return 6408;\n\t\tif ( p === LuminanceFormat ) return 6409;\n\t\tif ( p === LuminanceAlphaFormat ) return 6410;\n\t\tif ( p === DepthFormat ) return 6402;\n\t\tif ( p === DepthStencilFormat ) return 34041;\n\t\tif ( p === RedFormat ) return 6403;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedIntegerFormat ) return 36244;\n\t\tif ( p === RGFormat ) return 33319;\n\t\tif ( p === RGIntegerFormat ) return 33320;\n\t\tif ( p === RGBIntegerFormat ) return 36248;\n\t\tif ( p === RGBAIntegerFormat ) return 36249;\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC2_Format ) return extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ||\n\t\t\tp === SRGB8_ALPHA8_ASTC_4x4_Format || p === SRGB8_ALPHA8_ASTC_5x4_Format || p === SRGB8_ALPHA8_ASTC_5x5_Format ||\n\t\t\tp === SRGB8_ALPHA8_ASTC_6x5_Format || p === SRGB8_ALPHA8_ASTC_6x6_Format || p === SRGB8_ALPHA8_ASTC_8x5_Format ||\n\t\t\tp === SRGB8_ALPHA8_ASTC_8x6_Format || p === SRGB8_ALPHA8_ASTC_8x8_Format || p === SRGB8_ALPHA8_ASTC_10x5_Format ||\n\t\t\tp === SRGB8_ALPHA8_ASTC_10x6_Format || p === SRGB8_ALPHA8_ASTC_10x8_Format || p === SRGB8_ALPHA8_ASTC_10x10_Format ||\n\t\t\tp === SRGB8_ALPHA8_ASTC_12x10_Format || p === SRGB8_ALPHA8_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\t// TODO Complete?\n\n\t\t\t\treturn p;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGBA_BPTC_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\t// TODO Complete?\n\n\t\t\t\treturn p;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\tif ( isWebGL2 ) return 34042;\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nfunction ArrayCamera( array = [] ) {\n\n\tPerspectiveCamera.call( this );\n\n\tthis.cameras = array;\n\n}\n\nArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), {\n\n\tconstructor: ArrayCamera,\n\n\tisArrayCamera: true\n\n} );\n\nfunction Group() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Group';\n\n}\n\nGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Group,\n\n\tisGroup: true\n\n} );\n\nfunction WebXRController() {\n\n\tthis._targetRay = null;\n\tthis._grip = null;\n\tthis._hand = null;\n\n}\n\nObject.assign( WebXRController.prototype, {\n\n\tconstructor: WebXRController,\n\n\tgetHandSpace: function () {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = [];\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t\tif ( window.XRHand ) {\n\n\t\t\t\tfor ( let i = 0; i <= window.XRHand.LITTLE_PHALANX_TIP; i ++ ) {\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = new Group();\n\t\t\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\t\t\tjoint.visible = false;\n\t\t\t\t\tthis._hand.joints.push( joint );\n\t\t\t\t\t// ??\n\t\t\t\t\tthis._hand.add( joint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t},\n\n\tgetTargetRaySpace: function () {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t},\n\n\tgetGripSpace: function () {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t},\n\n\tdispatchEvent: function ( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tdisconnect: function ( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tupdate: function ( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( let i = 0; i <= window.XRHand.LITTLE_PHALANX_TIP; i ++ ) {\n\n\t\t\t\t\tif ( inputSource.hand[ i ] ) {\n\n\t\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\t\tconst jointPose = frame.getJointPose( inputSource.hand[ i ], referenceSpace );\n\t\t\t\t\t\tconst joint = hand.joints[ i ];\n\n\t\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t\t\t// Custom events\n\n\t\t\t\t\t\t// Check pinch\n\t\t\t\t\t\tconst indexTip = hand.joints[ window.XRHand.INDEX_PHALANX_TIP ];\n\t\t\t\t\t\tconst thumbTip = hand.joints[ window.XRHand.THUMB_PHALANX_TIP ];\n\t\t\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\t\t\ttarget: this\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\t\t\ttarget: this\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction WebXRManager( renderer, gl ) {\n\n\tconst scope = this;\n\n\tlet session = null;\n\n\tlet framebufferScaleFactor = 1.0;\n\n\tlet referenceSpace = null;\n\tlet referenceSpaceType = 'local-floor';\n\n\tlet pose = null;\n\n\tconst controllers = [];\n\tconst inputSourcesMap = new Map();\n\n\t//\n\n\tconst cameraL = new PerspectiveCamera();\n\tcameraL.layers.enable( 1 );\n\tcameraL.viewport = new Vector4();\n\n\tconst cameraR = new PerspectiveCamera();\n\tcameraR.layers.enable( 2 );\n\tcameraR.viewport = new Vector4();\n\n\tconst cameras = [ cameraL, cameraR ];\n\n\tconst cameraVR = new ArrayCamera();\n\tcameraVR.layers.enable( 1 );\n\tcameraVR.layers.enable( 2 );\n\n\tlet _currentDepthNear = null;\n\tlet _currentDepthFar = null;\n\n\t//\n\n\tthis.enabled = false;\n\n\tthis.isPresenting = false;\n\n\tthis.getController = function ( index ) {\n\n\t\tlet controller = controllers[ index ];\n\n\t\tif ( controller === undefined ) {\n\n\t\t\tcontroller = new WebXRController();\n\t\t\tcontrollers[ index ] = controller;\n\n\t\t}\n\n\t\treturn controller.getTargetRaySpace();\n\n\t};\n\n\tthis.getControllerGrip = function ( index ) {\n\n\t\tlet controller = controllers[ index ];\n\n\t\tif ( controller === undefined ) {\n\n\t\t\tcontroller = new WebXRController();\n\t\t\tcontrollers[ index ] = controller;\n\n\t\t}\n\n\t\treturn controller.getGripSpace();\n\n\t};\n\n\tthis.getHand = function ( index ) {\n\n\t\tlet controller = controllers[ index ];\n\n\t\tif ( controller === undefined ) {\n\n\t\t\tcontroller = new WebXRController();\n\t\t\tcontrollers[ index ] = controller;\n\n\t\t}\n\n\t\treturn controller.getHandSpace();\n\n\t};\n\n\t//\n\n\tfunction onSessionEvent( event ) {\n\n\t\tconst controller = inputSourcesMap.get( event.inputSource );\n\n\t\tif ( controller ) {\n\n\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t}\n\n\t}\n\n\tfunction onSessionEnd() {\n\n\t\tinputSourcesMap.forEach( function ( controller, inputSource ) {\n\n\t\t\tcontroller.disconnect( inputSource );\n\n\t\t} );\n\n\t\tinputSourcesMap.clear();\n\n\t\t//\n\n\t\trenderer.setFramebuffer( null );\n\t\trenderer.setRenderTarget( renderer.getRenderTarget() ); // Hack #15830\n\t\tanimation.stop();\n\n\t\tscope.isPresenting = false;\n\n\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t}\n\n\tfunction onRequestReferenceSpace( value ) {\n\n\t\treferenceSpace = value;\n\n\t\tanimation.setContext( session );\n\t\tanimation.start();\n\n\t\tscope.isPresenting = true;\n\n\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t}\n\n\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\tframebufferScaleFactor = value;\n\n\t\tif ( scope.isPresenting === true ) {\n\n\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t}\n\n\t};\n\n\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\treferenceSpaceType = value;\n\n\t\tif ( scope.isPresenting === true ) {\n\n\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t}\n\n\t};\n\n\tthis.getReferenceSpace = function () {\n\n\t\treturn referenceSpace;\n\n\t};\n\n\tthis.getSession = function () {\n\n\t\treturn session;\n\n\t};\n\n\tthis.setSession = function ( value ) {\n\n\t\tsession = value;\n\n\t\tif ( session !== null ) {\n\n\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\n\t\t\tconst attributes = gl.getContextAttributes();\n\n\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\tgl.makeXRCompatible();\n\n\t\t\t}\n\n\t\t\tconst layerInit = {\n\t\t\t\tantialias: attributes.antialias,\n\t\t\t\talpha: attributes.alpha,\n\t\t\t\tdepth: attributes.depth,\n\t\t\t\tstencil: attributes.stencil,\n\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t};\n\n\t\t\t// eslint-disable-next-line no-undef\n\t\t\tconst baseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\tsession.updateRenderState( { baseLayer: baseLayer } );\n\n\t\t\tsession.requestReferenceSpace( referenceSpaceType ).then( onRequestReferenceSpace );\n\n\t\t\t//\n\n\t\t\tsession.addEventListener( 'inputsourceschange', updateInputSources );\n\n\t\t}\n\n\t};\n\n\tfunction updateInputSources( event ) {\n\n\t\tconst inputSources = session.inputSources;\n\n\t\t// Assign inputSources to available controllers\n\n\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\tinputSourcesMap.set( inputSources[ i ], controllers[ i ] );\n\n\t\t}\n\n\t\t// Notify disconnected\n\n\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\tconst inputSource = event.removed[ i ];\n\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\tif ( controller ) {\n\n\t\t\t\tcontroller.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\t\t\t\tinputSourcesMap.delete( inputSource );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Notify connected\n\n\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\tconst inputSource = event.added[ i ];\n\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\tif ( controller ) {\n\n\t\t\t\tcontroller.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tconst cameraLPos = new Vector3();\n\tconst cameraRPos = new Vector3();\n\n\t/**\n\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t * the cameras' projection and world matrices have already been set.\n\t * And that near and far planes are identical for both cameras.\n\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t */\n\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t// VR systems will have identical far and near planes, and\n\t\t// most likely identical top and bottom frustum extents.\n\t\t// Use the left camera for these values.\n\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\tconst left = near * leftFov;\n\t\tconst right = near * rightFov;\n\n\t\t// Calculate the new camera's position offset from the\n\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t// TODO: Better way to apply this offset?\n\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\tcamera.translateX( xOffset );\n\t\tcamera.translateZ( zOffset );\n\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t// Find the union of the frustum values of the cameras and scale\n\t\t// the values so that the near plane's position does not change in world space,\n\t\t// although must now be relative to the new union camera.\n\t\tconst near2 = near + zOffset;\n\t\tconst far2 = far + zOffset;\n\t\tconst left2 = left - xOffset;\n\t\tconst right2 = right + ( ipd - xOffset );\n\t\tconst top2 = topFov * far / far2 * near2;\n\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\n\t}\n\n\tfunction updateCamera( camera, parent ) {\n\n\t\tif ( parent === null ) {\n\n\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t} else {\n\n\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t}\n\n\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t}\n\n\tthis.getCamera = function ( camera ) {\n\n\t\tcameraVR.near = cameraR.near = cameraL.near = camera.near;\n\t\tcameraVR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\tif ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) {\n\n\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\tsession.updateRenderState( {\n\t\t\t\tdepthNear: cameraVR.near,\n\t\t\t\tdepthFar: cameraVR.far\n\t\t\t} );\n\n\t\t\t_currentDepthNear = cameraVR.near;\n\t\t\t_currentDepthFar = cameraVR.far;\n\n\t\t}\n\n\t\tconst parent = camera.parent;\n\t\tconst cameras = cameraVR.cameras;\n\n\t\tupdateCamera( cameraVR, parent );\n\n\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t}\n\n\t\t// update camera and its children\n\n\t\tcamera.matrixWorld.copy( cameraVR.matrixWorld );\n\n\t\tconst children = camera.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( true );\n\n\t\t}\n\n\t\t// update projection matrix for proper view frustum culling\n\n\t\tif ( cameras.length === 2 ) {\n\n\t\t\tsetProjectionFromUnion( cameraVR, cameraL, cameraR );\n\n\t\t} else {\n\n\t\t\t// assume single camera setup (AR)\n\n\t\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t}\n\n\t\treturn cameraVR;\n\n\t};\n\n\t// Animation Loop\n\n\tlet onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tpose = frame.getViewerPose( referenceSpace );\n\n\t\tif ( pose !== null ) {\n\n\t\t\tconst views = pose.views;\n\t\t\tconst baseLayer = session.renderState.baseLayer;\n\n\t\t\trenderer.setFramebuffer( baseLayer.framebuffer );\n\n\t\t\tlet cameraVRNeedsUpdate = false;\n\n\t\t\t// check if it's necessary to rebuild cameraVR's camera list\n\n\t\t\tif ( views.length !== cameraVR.cameras.length ) {\n\n\t\t\t\tcameraVR.cameras.length = 0;\n\t\t\t\tcameraVRNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\tconst view = views[ i ];\n\t\t\t\tconst viewport = baseLayer.getViewport( view );\n\n\t\t\t\tconst camera = cameras[ i ];\n\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\tcameraVR.matrix.copy( camera.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tif ( cameraVRNeedsUpdate === true ) {\n\n\t\t\t\t\tcameraVR.cameras.push( camera );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst inputSources = session.inputSources;\n\n\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\tconst controller = controllers[ i ];\n\t\t\tconst inputSource = inputSources[ i ];\n\n\t\t\tcontroller.update( inputSource, frame, referenceSpace );\n\n\t\t}\n\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t}\n\n\tconst animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\n\t};\n\n\tthis.dispose = function () {};\n\n}\n\nObject.assign( WebXRManager.prototype, EventDispatcher.prototype );\n\nfunction WebGLMaterials( properties ) {\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tuniforms.fogColor.value.copy( fog.color );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsLambert( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material );\n\n\t\t\t} else {\n\n\t\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDepth( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsNormal( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap._needsFlipEnvMap ) ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t\tconst maxMipLevel = properties.get( envMap ).__maxMipLevel;\n\n\t\t\tif ( maxMipLevel !== undefined ) {\n\n\t\t\t\tuniforms.maxMipLevel.value = maxMipLevel;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. displacementMap map\n\t\t// 4. normal map\n\t\t// 5. bump map\n\t\t// 6. roughnessMap map\n\t\t// 7. metalnessMap map\n\t\t// 8. alphaMap map\n\t\t// 9. emissiveMap map\n\t\t// 10. clearcoat map\n\t\t// 11. clearcoat normal map\n\t\t// 12. clearcoat roughnessMap map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t} else if ( material.clearcoatMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatMap;\n\n\t\t} else if ( material.clearcoatNormalMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatNormalMap;\n\n\t\t} else if ( material.clearcoatRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatRoughnessMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities for uv2\n\t\t// 1. ao map\n\t\t// 2. light map\n\n\t\tlet uv2ScaleMap;\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuv2ScaleMap = material.aoMap;\n\n\t\t} else if ( material.lightMap ) {\n\n\t\t\tuv2ScaleMap = material.lightMap;\n\n\t\t}\n\n\t\tif ( uv2ScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uv2ScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuv2ScaleMap = uv2ScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uv2ScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuv2ScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\trefreshUniformsStandard( uniforms, material );\n\n\t\tuniforms.reflectivity.value = material.reflectivity; // also part of uniforms common\n\n\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\t\tif ( material.sheen ) uniforms.sheen.value.copy( material.sheen );\n\n\t\tif ( material.clearcoatMap ) {\n\n\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t}\n\n\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t}\n\n\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.transmission.value = material.transmission;\n\n\t\tif ( material.transmissionMap ) {\n\n\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDepth( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nfunction WebGLRenderer( parameters ) {\n\n\tparameters = parameters || {};\n\n\tconst _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\n\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',\n\t\t_failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;\n\n\tlet currentRenderList = null;\n\tlet currentRenderState = null;\n\n\t// render() can be called from within a callback triggered by another render.\n\t// We track this so that the nested render call gets its state isolated from the parent render call.\n\n\tconst renderStateStack = [];\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\n\t// Debug configuration container\n\tthis.debug = {\n\n\t\t/**\n\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t * @type {boolean}\n\t\t */\n\t\tcheckShaderErrors: true\n\t};\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\tthis.outputEncoding = LinearEncoding;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = NoToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\n\t// morphs\n\n\tthis.maxMorphTargets = 8;\n\tthis.maxMorphNormals = 4;\n\n\t// internal properties\n\n\tconst _this = this;\n\n\tlet _isContextLost = false;\n\n\t// internal state cache\n\n\tlet _framebuffer = null;\n\n\tlet _currentActiveCubeFace = 0;\n\tlet _currentActiveMipmapLevel = 0;\n\tlet _currentRenderTarget = null;\n\tlet _currentFramebuffer = null;\n\tlet _currentMaterialId = - 1;\n\n\tlet _currentCamera = null;\n\n\tconst _currentViewport = new Vector4();\n\tconst _currentScissor = new Vector4();\n\tlet _currentScissorTest = null;\n\n\t//\n\n\tlet _width = _canvas.width;\n\tlet _height = _canvas.height;\n\n\tlet _pixelRatio = 1;\n\tlet _opaqueSort = null;\n\tlet _transparentSort = null;\n\n\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\tlet _scissorTest = false;\n\n\t// frustum\n\n\tconst _frustum = new Frustum();\n\n\t// clipping\n\n\tlet _clippingEnabled = false;\n\tlet _localClippingEnabled = false;\n\n\t// camera matrices cache\n\n\tconst _projScreenMatrix = new Matrix4();\n\n\tconst _vector3 = new Vector3();\n\n\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tlet _gl = _context;\n\n\tfunction getContext( contextNames, contextAttributes ) {\n\n\t\tfor ( let i = 0; i < contextNames.length; i ++ ) {\n\n\t\t\tconst contextName = contextNames[ i ];\n\t\t\tconst context = _canvas.getContext( contextName, contextAttributes );\n\t\t\tif ( context !== null ) return context;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\ttry {\n\n\t\tconst contextAttributes = {\n\t\t\talpha: _alpha,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference,\n\t\t\tfailIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat\n\t\t};\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tconst contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];\n\n\t\t\tif ( _this.isWebGL1Renderer === true ) {\n\n\t\t\t\tcontextNames.shift();\n\n\t\t\t}\n\n\t\t\t_gl = getContext( contextNames, contextAttributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( getContext( contextNames ) ) {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\tthrow error;\n\n\t}\n\n\tlet extensions, capabilities, state, info;\n\tlet properties, textures, cubemaps, attributes, geometries, objects;\n\tlet programCache, materials, renderLists, renderStates, clipping;\n\n\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\tlet utils, bindingStates;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tif ( capabilities.isWebGL2 === false ) {\n\n\t\t\textensions.get( 'WEBGL_depth_texture' );\n\t\t\textensions.get( 'OES_texture_float' );\n\t\t\textensions.get( 'OES_texture_half_float' );\n\t\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\t\textensions.get( 'OES_standard_derivatives' );\n\t\t\textensions.get( 'OES_element_index_uint' );\n\t\t\textensions.get( 'OES_vertex_array_object' );\n\t\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t}\n\n\t\textensions.get( 'OES_texture_float_linear' );\n\n\t\tutils = new WebGLUtils( _gl, extensions, capabilities );\n\n\t\tstate = new WebGLState( _gl, extensions, capabilities );\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t\tinfo = new WebGLInfo( _gl );\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\tattributes = new WebGLAttributes( _gl, capabilities );\n\t\tbindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl );\n\t\tclipping = new WebGLClipping( properties );\n\t\tprogramCache = new WebGLPrograms( _this, cubemaps, extensions, capabilities, bindingStates, clipping );\n\t\tmaterials = new WebGLMaterials( properties );\n\t\trenderLists = new WebGLRenderLists( properties );\n\t\trenderStates = new WebGLRenderStates( extensions, capabilities );\n\t\tbackground = new WebGLBackground( _this, cubemaps, state, objects, _premultipliedAlpha );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// xr\n\n\tconst xr = new WebXRManager( _this, _gl );\n\n\tthis.xr = xr;\n\n\t// shadow map\n\n\tconst shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize );\n\n\tthis.shadowMap = shadowMap;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'WebGLRenderer: .getsize() now requires a Vector2 as an argument' );\n\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.set( _width, _height );\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tif ( xr.isPresenting ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = Math.floor( width * _pixelRatio );\n\t\t_canvas.height = Math.floor( height * _pixelRatio );\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument' );\n\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = Math.floor( width * pixelRatio );\n\t\t_canvas.height = Math.floor( height * pixelRatio );\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument' );\n\n\t\t\ttarget = new Vector4();\n\n\t\t}\n\n\t\treturn target.copy( _currentViewport );\n\n\t};\n\n\tthis.getViewport = function ( target ) {\n\n\t\treturn target.copy( _viewport );\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_viewport.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissor = function ( target ) {\n\n\t\treturn target.copy( _scissor );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_scissor.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissorTest = function () {\n\n\t\treturn _scissorTest;\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\tthis.setOpaqueSort = function ( method ) {\n\n\t\t_opaqueSort = method;\n\n\t};\n\n\tthis.setTransparentSort = function ( method ) {\n\n\t\t_transparentSort = method;\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'WebGLRenderer: .getClearColor() now requires a Color as an argument' );\n\n\t\t\ttarget = new Color();\n\n\t\t}\n\n\t\treturn target.copy( background.getClearColor() );\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color, depth, stencil ) {\n\n\t\tlet bits = 0;\n\n\t\tif ( color === undefined || color ) bits |= 16384;\n\t\tif ( depth === undefined || depth ) bits |= 256;\n\t\tif ( stencil === undefined || stencil ) bits |= 1024;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tcubemaps.dispose();\n\t\tobjects.dispose();\n\t\tbindingStates.dispose();\n\n\t\txr.dispose();\n\n\t\tanimation.stop();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tinitGLContext();\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReference( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReference( material ) {\n\n\t\tconst programInfo = properties.get( material ).program;\n\n\t\tif ( programInfo !== undefined ) {\n\n\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tfunction renderObjectImmediate( object, program ) {\n\n\t\tobject.render( function ( object ) {\n\n\t\t\t_this.renderBufferImmediate( object, program );\n\n\t\t} );\n\n\t}\n\n\tthis.renderBufferImmediate = function ( object, program ) {\n\n\t\tbindingStates.initAttributes();\n\n\t\tconst buffers = properties.get( object );\n\n\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tif ( object.hasPositions ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.position );\n\t\t\t_gl.bufferData( 34962, object.positionArray, 35048 );\n\n\t\t\tbindingStates.enableAttribute( programAttributes.position );\n\t\t\t_gl.vertexAttribPointer( programAttributes.position, 3, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasNormals ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.normal );\n\t\t\t_gl.bufferData( 34962, object.normalArray, 35048 );\n\n\t\t\tbindingStates.enableAttribute( programAttributes.normal );\n\t\t\t_gl.vertexAttribPointer( programAttributes.normal, 3, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasUvs ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.uv );\n\t\t\t_gl.bufferData( 34962, object.uvArray, 35048 );\n\n\t\t\tbindingStates.enableAttribute( programAttributes.uv );\n\t\t\t_gl.vertexAttribPointer( programAttributes.uv, 2, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasColors ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.color );\n\t\t\t_gl.bufferData( 34962, object.colorArray, 35048 );\n\n\t\t\tbindingStates.enableAttribute( programAttributes.color );\n\t\t\t_gl.vertexAttribPointer( programAttributes.color, 3, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tbindingStates.disableUnusedAttributes();\n\n\t\t_gl.drawArrays( 4, 0, object.count );\n\n\t\tobject.count = 0;\n\n\t};\n\n\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tconst program = setProgram( camera, scene, material, object );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t//\n\n\t\tlet index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\n\t\t//\n\n\t\tif ( index === null ) {\n\n\t\t\tif ( position === undefined || position.count === 0 ) return;\n\n\t\t} else if ( index.count === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\tlet rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tif ( material.morphTargets || material.morphNormals ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t}\n\n\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\tlet attribute;\n\t\tlet renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\t//\n\n\t\tconst dataCount = ( index !== null ) ? index.count : position.count;\n\n\t\tconst rangeStart = geometry.drawRange.start * rangeFactor;\n\t\tconst rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\tconst groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\tconst groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\tconst drawStart = Math.max( rangeStart, groupStart );\n\t\tconst drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\tconst drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 4 );\n\n\t\t\t}\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( 2 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 3 );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( 0 );\n\n\t\t} else if ( object.isSprite ) {\n\n\t\t\trenderer.setMode( 4 );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\tconst instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount );\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tcurrentRenderState = renderStates.get( scene );\n\t\tcurrentRenderState.init();\n\n\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights();\n\n\t\tconst compiled = new WeakMap();\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tconst material = object.material;\n\n\t\t\tif ( material ) {\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\tif ( compiled.has( material2 ) === false ) {\n\n\t\t\t\t\t\t\tinitMaterial( material2, scene, object );\n\t\t\t\t\t\t\tcompiled.set( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( compiled.has( material ) === false ) {\n\n\t\t\t\t\tinitMaterial( material, scene, object );\n\t\t\t\t\tcompiled.set( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t};\n\n\t// Animation Loop\n\n\tlet onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time ) {\n\n\t\tif ( xr.isPresenting ) return;\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t}\n\n\tconst animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tif ( typeof window !== 'undefined' ) animation.setContext( window );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\t\txr.setAnimationLoop( callback );\n\n\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t};\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tlet renderTarget, forceClear;\n\n\t\tif ( arguments[ 2 ] !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.' );\n\t\t\trenderTarget = arguments[ 2 ];\n\n\t\t}\n\n\t\tif ( arguments[ 3 ] !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.' );\n\t\t\tforceClear = arguments[ 3 ];\n\n\t\t}\n\n\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost === true ) return;\n\n\t\t// reset caching for this frame\n\n\t\tbindingStates.resetDefaultState();\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\tcamera = xr.getCamera( camera );\n\n\t\t}\n\n\t\t//\n\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, renderTarget || _currentRenderTarget );\n\n\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\tcurrentRenderList = renderLists.get( scene, camera );\n\t\tcurrentRenderList.init();\n\n\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\tcurrentRenderList.finish();\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tcurrentRenderState.setupLights();\n\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\tif ( renderTarget !== undefined ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene, camera, forceClear );\n\n\t\t// render scene\n\n\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t//\n\n\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t//\n\n\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t}\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t\t// _gl.finish();\n\n\t\trenderStateStack.pop();\n\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderState = null;\n\n\t\t}\n\n\t\tcurrentRenderList = null;\n\n\t};\n\n\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isGroup ) {\n\n\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentRenderList.push( object, null, object.material, groupOrder, _vector3.z, null );\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t// update skeleton only once in a frame\n\n\t\t\t\t\tif ( object.skeleton.frame !== info.render.frame ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\t\t\t\t\t\tobject.skeleton.frame = info.render.frame;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\tconst object = renderItem.object;\n\t\t\tconst geometry = renderItem.geometry;\n\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\tconst group = renderItem.group;\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\tfor ( let j = 0, jl = cameras.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst camera2 = cameras[ j ];\n\n\t\t\t\t\tif ( object.layers.test( camera2.layers ) ) {\n\n\t\t\t\t\t\tstate.viewport( _currentViewport.copy( camera2.viewport ) );\n\n\t\t\t\t\t\tcurrentRenderState.setupLightsView( camera2 );\n\n\t\t\t\t\t\trenderObject( object, scene, camera2, geometry, material, group );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\tconst program = setProgram( camera, scene, material, object );\n\n\t\t\tstate.setMaterial( material );\n\n\t\t\tbindingStates.reset();\n\n\t\t\trenderObjectImmediate( object, program );\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t}\n\n\tfunction initMaterial( material, scene, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst lights = currentRenderState.state.lights;\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tconst lightsStateVersion = lights.state.version;\n\n\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\tlet program = materialProperties.program;\n\t\tlet programChange = true;\n\n\t\tif ( program === undefined ) {\n\n\t\t\t// new material\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t} else if ( program.cacheKey !== programCacheKey ) {\n\n\t\t\t// changed glsl or parameters\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t} else if ( materialProperties.lightsStateVersion !== lightsStateVersion ) {\n\n\t\t\tprogramChange = false;\n\n\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t// same glsl and uniform list, envMap still needs the update here to avoid a frame-late effect\n\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.envMap = cubemaps.get( material.envMap || environment );\n\n\t\t\treturn;\n\n\t\t} else {\n\n\t\t\t// only rebuild uniform list\n\t\t\tprogramChange = false;\n\n\t\t}\n\n\t\tif ( programChange ) {\n\n\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\n\t\t\tmaterialProperties.program = program;\n\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\t\t\tmaterialProperties.outputEncoding = parameters.outputEncoding;\n\n\t\t}\n\n\t\tconst uniforms = materialProperties.uniforms;\n\n\t\tif ( ! material.isShaderMaterial &&\n\t\t\t! material.isRawShaderMaterial ||\n\t\t\tmaterial.clipping === true ) {\n\n\t\t\tmaterialProperties.numClippingPlanes = clipping.numPlanes;\n\t\t\tmaterialProperties.numIntersection = clipping.numIntersection;\n\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t}\n\n\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tmaterialProperties.fog = scene.fog;\n\t\tmaterialProperties.envMap = cubemaps.get( material.envMap || materialProperties.environment );\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tconst progUniforms = materialProperties.program.getUniforms();\n\t\tconst uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t}\n\n\tfunction setProgram( camera, scene, material, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\ttextures.resetTextureUnits();\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tconst encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : _currentRenderTarget.texture.encoding;\n\t\tconst envMap = cubemaps.get( material.envMap || environment );\n\n\t\tconst materialProperties = properties.get( material );\n\t\tconst lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled === true ) {\n\n\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\tconst useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\tif ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t} else if ( materialProperties.environment !== environment ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t} else if ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t} else if ( materialProperties.outputEncoding !== encoding ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tinitMaterial( material, scene, object );\n\t\t\tmaterialProperties.__version = material.version;\n\n\t\t}\n\n\t\tlet refreshProgram = false;\n\t\tlet refreshMaterial = false;\n\t\tlet refreshLights = false;\n\n\t\tconst program = materialProperties.program,\n\t\t\tp_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.isShadowMaterial ||\n\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t// otherwise textures used for skinning can take over texture units reserved for other material textures\n\n\t\tif ( material.skinning ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tconst bones = skeleton.bones;\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) {\n\n\t\t\t\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\t\t\t\tlet size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\t\t\t\tsize = MathUtils.ceilPowerOfTwo( size );\n\t\t\t\t\t\tsize = Math.max( size, 4 );\n\n\t\t\t\t\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\t\t\t\t\tboneMatrices.set( skeleton.boneMatrices ); // copy current values\n\n\t\t\t\t\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\n\t\t\t\t\t\tskeleton.boneMatrices = boneMatrices;\n\t\t\t\t\t\tskeleton.boneTexture = boneTexture;\n\t\t\t\t\t\tskeleton.boneTextureSize = size;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height );\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\treturn program;\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\tfunction materialNeedsLights( material ) {\n\n\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t}\n\n\t//\n\tthis.setFramebuffer = function ( value ) {\n\n\t\tif ( _framebuffer !== value && _currentRenderTarget === null ) _gl.bindFramebuffer( 36160, value );\n\n\t\t_framebuffer = value;\n\n\t};\n\n\tthis.getActiveCubeFace = function () {\n\n\t\treturn _currentActiveCubeFace;\n\n\t};\n\n\tthis.getActiveMipmapLevel = function () {\n\n\t\treturn _currentActiveMipmapLevel;\n\n\t};\n\n\tthis.getRenderList = function () {\n\n\t\treturn currentRenderList;\n\n\t};\n\n\tthis.setRenderList = function ( renderList ) {\n\n\t\tcurrentRenderList = renderList;\n\n\t};\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t}\n\n\t\tlet framebuffer = _framebuffer;\n\t\tlet isCube = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else if ( renderTarget.isWebGLMultisampleRenderTarget ) {\n\n\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( 36160, 36064, 34069 + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t}\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t}\n\n\t\tif ( framebuffer ) {\n\n\t\t\tlet restore = false;\n\n\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\n\t\t\t\trestore = true;\n\n\t\t\t}\n\n\t\t\ttry {\n\n\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( 35739 ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( 35738 ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! ( textureType === HalfFloatType && ( capabilities.isWebGL2 ? extensions.get( 'EXT_color_buffer_float' ) : extensions.get( 'EXT_color_buffer_half_float' ) ) ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _gl.checkFramebufferStatus( 36160 ) === 36053 ) {\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, _currentFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level = 0 ) {\n\n\t\tconst levelScale = Math.pow( 2, - level );\n\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\tconst height = Math.floor( texture.image.height * levelScale );\n\t\tconst glFormat = utils.convert( texture.format );\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexImage2D( 3553, level, glFormat, position.x, position.y, width, height, 0 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tconst width = srcTexture.image.width;\n\t\tconst height = srcTexture.image.height;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t// As another texture upload may have changed pixelStorei\n\t\t// parameters, make sure they are correct for the dstTexture\n\t\t_gl.pixelStorei( 37440, dstTexture.flipY );\n\t\t_gl.pixelStorei( 37441, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, dstTexture.unpackAlignment );\n\n\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t_gl.compressedTexSubImage2D( 3553, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( 3553 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.initTexture = function ( texture ) {\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.resetState = function () {\n\n\t\tstate.reset();\n\t\tbindingStates.reset();\n\n\t};\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); // eslint-disable-line no-undef\n\n\t}\n\n}\n\nfunction WebGL1Renderer( parameters ) {\n\n\tWebGLRenderer.call( this, parameters );\n\n}\n\nWebGL1Renderer.prototype = Object.assign( Object.create( WebGLRenderer.prototype ), {\n\n\tconstructor: WebGL1Renderer,\n\n\tisWebGL1Renderer: true\n\n} );\n\nclass FogExp2 {\n\n\tconstructor( color, density ) {\n\n\t\tObject.defineProperty( this, 'isFogExp2', { value: true } );\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\nclass Fog {\n\n\tconstructor( color, near, far ) {\n\n\t\tObject.defineProperty( this, 'isFog', { value: true } );\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\nclass Scene extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'isScene', { value: true } );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.environment = null;\n\t\tthis.fog = null;\n\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); // eslint-disable-line no-undef\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.environment !== null ) data.object.environment = this.environment.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\nfunction InterleavedBuffer( array, stride ) {\n\n\tthis.array = array;\n\tthis.stride = stride;\n\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\tthis.usage = StaticDrawUsage;\n\tthis.updateRange = { offset: 0, count: - 1 };\n\n\tthis.version = 0;\n\n\tthis.uuid = MathUtils.generateUUID();\n\n}\n\nObject.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nObject.assign( InterleavedBuffer.prototype, {\n\n\tisInterleavedBuffer: true,\n\n\tonUploadCallback: function () {},\n\n\tsetUsage: function ( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t},\n\n\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tset: function ( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function ( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = MathUtils.generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new InterleavedBuffer( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t},\n\n\tonUpload: function ( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = MathUtils.generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.prototype.slice.call( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n} );\n\nconst _vector$6 = new Vector3();\n\nfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\tthis.name = '';\n\n\tthis.data = interleavedBuffer;\n\tthis.itemSize = itemSize;\n\tthis.offset = offset;\n\n\tthis.normalized = normalized === true;\n\n}\n\nObject.defineProperties( InterleavedBufferAttribute.prototype, {\n\n\tcount: {\n\n\t\tget: function () {\n\n\t\t\treturn this.data.count;\n\n\t\t}\n\n\t},\n\n\tarray: {\n\n\t\tget: function () {\n\n\t\t\treturn this.data.array;\n\n\t\t}\n\n\t},\n\n\tneedsUpdate: {\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.data.needsUpdate = value;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( InterleavedBufferAttribute.prototype, {\n\n\tisInterleavedBufferAttribute: true,\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.x = this.getX( i );\n\t\t\t_vector$6.y = this.getY( i );\n\t\t\t_vector$6.z = this.getZ( i );\n\n\t\t\t_vector$6.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( index, x ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( index, y ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( index, z ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetW: function ( index, w ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tgetX: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t},\n\n\tgetY: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t},\n\n\tgetZ: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t},\n\n\tgetW: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t},\n\n\tsetXY: function ( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZ: function ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function ( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// deinterleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interlaved attribtue\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n * parameters = {\n * color: ,\n * map: new THREE.Texture( ),\n * alphaMap: new THREE.Texture( ),\n * rotation: ,\n * sizeAttenuation: \n * }\n */\n\nfunction SpriteMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'SpriteMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.rotation = 0;\n\n\tthis.sizeAttenuation = true;\n\n\tthis.transparent = true;\n\n\tthis.setValues( parameters );\n\n}\n\nSpriteMaterial.prototype = Object.create( Material.prototype );\nSpriteMaterial.prototype.constructor = SpriteMaterial;\nSpriteMaterial.prototype.isSpriteMaterial = true;\n\nSpriteMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.rotation = source.rotation;\n\n\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\treturn this;\n\n};\n\nlet _geometry;\n\nconst _intersectPoint = new Vector3();\nconst _worldScale = new Vector3();\nconst _mvPosition = new Vector3();\n\nconst _alignedPosition = new Vector2();\nconst _rotatedPosition = new Vector2();\nconst _viewWorldMatrix = new Matrix4();\n\nconst _vA$1 = new Vector3();\nconst _vB$1 = new Vector3();\nconst _vC$1 = new Vector3();\n\nconst _uvA$1 = new Vector2();\nconst _uvB$1 = new Vector2();\nconst _uvC$1 = new Vector2();\n\nfunction Sprite( material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Sprite';\n\n\tif ( _geometry === undefined ) {\n\n\t\t_geometry = new BufferGeometry();\n\n\t\tconst float32Array = new Float32Array( [\n\t\t\t- 0.5, - 0.5, 0, 0, 0,\n\t\t\t0.5, - 0.5, 0, 1, 0,\n\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t- 0.5, 0.5, 0, 0, 1\n\t\t] );\n\n\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t}\n\n\tthis.geometry = _geometry;\n\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\tthis.center = new Vector2( 0.5, 0.5 );\n\n}\n\nSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Sprite,\n\n\tisSprite: true,\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'THREE.Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA$1.set( - 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB$1.set( 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC$1.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA$1.set( 0, 0 );\n\t\t_uvB$1.set( 1, 0 );\n\t\t_uvC$1.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA$1, _vB$1, _vC$1, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB$1.set( - 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB$1.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA$1, _vC$1, _vB$1, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getUV( _intersectPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$4 = new Vector3();\nconst _v2$2 = new Vector3();\n\nfunction LOD() {\n\n\tObject3D.call( this );\n\n\tthis._currentLevel = 0;\n\n\tthis.type = 'LOD';\n\n\tObject.defineProperties( this, {\n\t\tlevels: {\n\t\t\tenumerable: true,\n\t\t\tvalue: []\n\t\t}\n\t} );\n\n\tthis.autoUpdate = true;\n\n}\n\nLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: LOD,\n\n\tisLOD: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t},\n\n\taddLevel: function ( object, distance = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t},\n\n\tgetCurrentLevel: function () {\n\n\t\treturn this._currentLevel;\n\n\t},\n\n\tgetObjectForDistance: function ( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$4.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$4 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t},\n\n\tupdate: function ( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$4.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$4.distanceTo( _v2$2 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n} );\n\nconst _basePosition = new Vector3();\n\nconst _skinIndex = new Vector4();\nconst _skinWeight = new Vector4();\n\nconst _vector$7 = new Vector3();\nconst _matrix$1 = new Matrix4();\n\nfunction SkinnedMesh( geometry, material ) {\n\n\tif ( geometry && geometry.isGeometry ) {\n\n\t\tconsole.error( 'THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t}\n\n\tMesh.call( this, geometry, material );\n\n\tthis.type = 'SkinnedMesh';\n\n\tthis.bindMode = 'attached';\n\tthis.bindMatrix = new Matrix4();\n\tthis.bindMatrixInverse = new Matrix4();\n\n}\n\nSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\tconstructor: SkinnedMesh,\n\n\tisSkinnedMesh: true,\n\n\tcopy: function ( source ) {\n\n\t\tMesh.prototype.copy.call( this, source );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\treturn this;\n\n\t},\n\n\tbind: function ( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t},\n\n\tpose: function () {\n\n\t\tthis.skeleton.pose();\n\n\t},\n\n\tnormalizeSkinWeights: function () {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.x = skinWeight.getX( i );\n\t\t\tvector.y = skinWeight.getY( i );\n\t\t\tvector.z = skinWeight.getZ( i );\n\t\t\tvector.w = skinWeight.getW( i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tMesh.prototype.updateMatrixWorld.call( this, force );\n\n\t\tif ( this.bindMode === 'attached' ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === 'detached' ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t},\n\n\tboneTransform: function ( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.fromBufferAttribute( geometry.attributes.position, index ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix$1.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector$7.copy( _basePosition ).applyMatrix4( _matrix$1 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n} );\n\nfunction Bone() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Bone';\n\n}\n\nBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Bone,\n\n\tisBone: true\n\n} );\n\nconst _offsetMatrix = new Matrix4();\nconst _identityMatrix = new Matrix4();\n\nfunction Skeleton( bones = [], boneInverses = [] ) {\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.bones = bones.slice( 0 );\n\tthis.boneInverses = boneInverses;\n\tthis.boneMatrices = null;\n\n\tthis.boneTexture = null;\n\tthis.boneTextureSize = 0;\n\n\tthis.frame = - 1;\n\n\tthis.init();\n\n}\n\nObject.assign( Skeleton.prototype, {\n\n\tinit: function () {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tcalculateInverses: function () {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t},\n\n\tpose: function () {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tupdate: function () {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t},\n\n\tgetBoneByName: function ( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t},\n\n\tdispose: function ( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t},\n\n\tfromJSON: function ( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n} );\n\nconst _instanceLocalMatrix = new Matrix4();\nconst _instanceWorldMatrix = new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _mesh = new Mesh();\n\nfunction InstancedMesh( geometry, material, count ) {\n\n\tMesh.call( this, geometry, material );\n\n\tthis.instanceMatrix = new BufferAttribute( new Float32Array( count * 16 ), 16 );\n\tthis.instanceColor = null;\n\n\tthis.count = count;\n\n\tthis.frustumCulled = false;\n\n}\n\nInstancedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\tconstructor: InstancedMesh,\n\n\tisInstancedMesh: true,\n\n\tcopy: function ( source ) {\n\n\t\tMesh.prototype.copy.call( this, source );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\t\tthis.count = source.count;\n\n\t\treturn this;\n\n\t},\n\n\tgetColorAt: function ( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t},\n\n\tgetMatrixAt: function ( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t},\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh.geometry = this.geometry;\n\t\t_mesh.material = this.material;\n\n\t\tif ( _mesh.material === undefined ) return;\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t},\n\n\tsetColorAt: function ( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new BufferAttribute( new Float32Array( this.count * 3 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t},\n\n\tsetMatrixAt: function ( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t},\n\n\tupdateMorphTargets: function () {\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * linewidth: ,\n * linecap: \"round\",\n * linejoin: \"round\"\n * }\n */\n\nfunction LineBasicMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'LineBasicMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.linewidth = 1;\n\tthis.linecap = 'round';\n\tthis.linejoin = 'round';\n\n\tthis.morphTargets = false;\n\n\tthis.setValues( parameters );\n\n}\n\nLineBasicMaterial.prototype = Object.create( Material.prototype );\nLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\nLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\nLineBasicMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.linewidth = source.linewidth;\n\tthis.linecap = source.linecap;\n\tthis.linejoin = source.linejoin;\n\n\tthis.morphTargets = source.morphTargets;\n\n\treturn this;\n\n};\n\nconst _start = new Vector3();\nconst _end = new Vector3();\nconst _inverseMatrix$1 = new Matrix4();\nconst _ray$1 = new Ray();\nconst _sphere$2 = new Sphere();\n\nfunction Line( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Line';\n\n\tthis.geometry = geometry;\n\tthis.material = material;\n\n\tthis.updateMorphTargets();\n\n}\n\nLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Line,\n\n\tisLine: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t},\n\n\tcomputeLineDistances: function () {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t// we assume non-indexed geometry\n\n\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t_start.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t\t_end.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i ] += _start.distanceTo( _end );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconst vertices = geometry.vertices;\n\t\t\tconst lineDistances = geometry.lineDistances;\n\n\t\t\tlineDistances[ 0 ] = 0;\n\n\t\t\tfor ( let i = 1, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$2.copy( geometry.boundingSphere );\n\t\t_sphere$2.applyMatrix4( matrixWorld );\n\t\t_sphere$2.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$2 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst vStart = new Vector3();\n\t\tconst vEnd = new Vector3();\n\t\tconst interSegment = new Vector3();\n\t\tconst interRay = new Vector3();\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst attributes = geometry.attributes;\n\t\t\tconst positionAttribute = attributes.position;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tconst indices = index.array;\n\n\t\t\t\tfor ( let i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\tconst a = indices[ i ];\n\t\t\t\t\tconst b = indices[ i + 1 ];\n\n\t\t\t\t\tvStart.fromBufferAttribute( positionAttribute, a );\n\t\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, b );\n\n\t\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count - 1; i < l; i += step ) {\n\n\t\t\t\t\tvStart.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconst vertices = geometry.vertices;\n\t\t\tconst nbVertices = vertices.length;\n\n\t\t\tfor ( let i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tupdateMorphTargets: function () {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n} );\n\nconst _start$1 = new Vector3();\nconst _end$1 = new Vector3();\n\nfunction LineSegments( geometry, material ) {\n\n\tLine.call( this, geometry, material );\n\n\tthis.type = 'LineSegments';\n\n}\n\nLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\tconstructor: LineSegments,\n\n\tisLineSegments: true,\n\n\tcomputeLineDistances: function () {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t// we assume non-indexed geometry\n\n\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\t\tconst lineDistances = [];\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t\t_start$1.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\t_end$1.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start$1.distanceTo( _end$1 );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconst vertices = geometry.vertices;\n\t\t\tconst lineDistances = geometry.lineDistances;\n\n\t\t\tfor ( let i = 0, l = vertices.length; i < l; i += 2 ) {\n\n\t\t\t\t_start$1.copy( vertices[ i ] );\n\t\t\t\t_end$1.copy( vertices[ i + 1 ] );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start$1.distanceTo( _end$1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction LineLoop( geometry, material ) {\n\n\tLine.call( this, geometry, material );\n\n\tthis.type = 'LineLoop';\n\n}\n\nLineLoop.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\tconstructor: LineLoop,\n\n\tisLineLoop: true,\n\n} );\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n * alphaMap: new THREE.Texture( ),\n *\n * size: ,\n * sizeAttenuation: \n *\n * morphTargets: \n * }\n */\n\nfunction PointsMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'PointsMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.size = 1;\n\tthis.sizeAttenuation = true;\n\n\tthis.morphTargets = false;\n\n\tthis.setValues( parameters );\n\n}\n\nPointsMaterial.prototype = Object.create( Material.prototype );\nPointsMaterial.prototype.constructor = PointsMaterial;\n\nPointsMaterial.prototype.isPointsMaterial = true;\n\nPointsMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.size = source.size;\n\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\tthis.morphTargets = source.morphTargets;\n\n\treturn this;\n\n};\n\nconst _inverseMatrix$2 = new Matrix4();\nconst _ray$2 = new Ray();\nconst _sphere$3 = new Sphere();\nconst _position$1 = new Vector3();\n\nfunction Points( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Points';\n\n\tthis.geometry = geometry;\n\tthis.material = material;\n\n\tthis.updateMorphTargets();\n\n}\n\nPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Points,\n\n\tisPoints: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t},\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$3.copy( geometry.boundingSphere );\n\t\t_sphere$3.applyMatrix4( matrixWorld );\n\t\t_sphere$3.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst attributes = geometry.attributes;\n\t\t\tconst positionAttribute = attributes.position;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tconst indices = index.array;\n\n\t\t\t\tfor ( let i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst a = indices[ i ];\n\n\t\t\t\t\t_position$1.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\t\ttestPoint( _position$1, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t_position$1.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\ttestPoint( _position$1, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst vertices = geometry.vertices;\n\n\t\t\tfor ( let i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\ttestPoint( vertices[ i ], i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tupdateMorphTargets: function () {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n} );\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray$2.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray$2.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\nfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.format = format !== undefined ? format : RGBFormat;\n\n\tthis.minFilter = minFilter !== undefined ? minFilter : LinearFilter;\n\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\n\tthis.generateMipmaps = false;\n\n\tconst scope = this;\n\n\tfunction updateVideo() {\n\n\t\tscope.needsUpdate = true;\n\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t}\n\n\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t}\n\n}\n\nVideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), {\n\n\tconstructor: VideoTexture,\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t},\n\n\tisVideoTexture: true,\n\n\tupdate: function () {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n} );\n\nfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.image = { width: width, height: height };\n\tthis.mipmaps = mipmaps;\n\n\t// no flipping for cube textures\n\t// (also flipping doesn't work for compressed textures )\n\n\tthis.flipY = false;\n\n\t// can't generate mipmaps for compressed textures\n\t// mips must be embedded in DDS files\n\n\tthis.generateMipmaps = false;\n\n}\n\nCompressedTexture.prototype = Object.create( Texture.prototype );\nCompressedTexture.prototype.constructor = CompressedTexture;\n\nCompressedTexture.prototype.isCompressedTexture = true;\n\nfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.needsUpdate = true;\n\n}\n\nCanvasTexture.prototype = Object.create( Texture.prototype );\nCanvasTexture.prototype.constructor = CanvasTexture;\nCanvasTexture.prototype.isCanvasTexture = true;\n\nfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\tformat = format !== undefined ? format : DepthFormat;\n\n\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t}\n\n\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.image = { width: width, height: height };\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\tthis.flipY = false;\n\tthis.generateMipmaps = false;\n\n}\n\nDepthTexture.prototype = Object.create( Texture.prototype );\nDepthTexture.prototype.constructor = DepthTexture;\nDepthTexture.prototype.isDepthTexture = true;\n\nlet _geometryId = 0; // Geometry uses even numbers as Id\nconst _m1$3 = new Matrix4();\nconst _obj$1 = new Object3D();\nconst _offset$1 = new Vector3();\n\nfunction Geometry() {\n\n\tObject.defineProperty( this, 'id', { value: _geometryId += 2 } );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Geometry';\n\n\tthis.vertices = [];\n\tthis.colors = [];\n\tthis.faces = [];\n\tthis.faceVertexUvs = [[]];\n\n\tthis.morphTargets = [];\n\tthis.morphNormals = [];\n\n\tthis.skinWeights = [];\n\tthis.skinIndices = [];\n\n\tthis.lineDistances = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\t// update flags\n\n\tthis.elementsNeedUpdate = false;\n\tthis.verticesNeedUpdate = false;\n\tthis.uvsNeedUpdate = false;\n\tthis.normalsNeedUpdate = false;\n\tthis.colorsNeedUpdate = false;\n\tthis.lineDistancesNeedUpdate = false;\n\tthis.groupsNeedUpdate = false;\n\n}\n\nGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Geometry,\n\n\tisGeometry: true,\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\tfor ( let i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\tconst vertex = this.vertices[ i ];\n\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\tconst face = this.faces[ i ];\n\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\tfor ( let j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.verticesNeedUpdate = true;\n\t\tthis.normalsNeedUpdate = true;\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function ( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1$3.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1$3 );\n\n\t\treturn this;\n\n\t},\n\n\trotateY: function ( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1$3.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1$3 );\n\n\t\treturn this;\n\n\t},\n\n\trotateZ: function ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1$3.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1$3 );\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1$3.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$3 );\n\n\t\treturn this;\n\n\t},\n\n\tscale: function ( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1$3.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$3 );\n\n\t\treturn this;\n\n\t},\n\n\tlookAt: function ( vector ) {\n\n\t\t_obj$1.lookAt( vector );\n\n\t\t_obj$1.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj$1.matrix );\n\n\t\treturn this;\n\n\t},\n\n\tfromBufferGeometry: function ( geometry ) {\n\n\t\tconst scope = this;\n\n\t\tconst index = geometry.index !== null ? geometry.index : undefined;\n\t\tconst attributes = geometry.attributes;\n\n\t\tif ( attributes.position === undefined ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst position = attributes.position;\n\t\tconst normal = attributes.normal;\n\t\tconst color = attributes.color;\n\t\tconst uv = attributes.uv;\n\t\tconst uv2 = attributes.uv2;\n\n\t\tif ( uv2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\tscope.vertices.push( new Vector3().fromBufferAttribute( position, i ) );\n\n\t\t\tif ( color !== undefined ) {\n\n\t\t\t\tscope.colors.push( new Color().fromBufferAttribute( color, i ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\tconst vertexColors = ( color === undefined ) ? [] : [\n\t\t\t\tscope.colors[ a ].clone(),\n\t\t\t\tscope.colors[ b ].clone(),\n\t\t\t\tscope.colors[ c ].clone()\n\t\t\t];\n\n\t\t\tconst vertexNormals = ( normal === undefined ) ? [] : [\n\t\t\t\tnew Vector3().fromBufferAttribute( normal, a ),\n\t\t\t\tnew Vector3().fromBufferAttribute( normal, b ),\n\t\t\t\tnew Vector3().fromBufferAttribute( normal, c )\n\t\t\t];\n\n\t\t\tconst face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\tscope.faces.push( face );\n\n\t\t\tif ( uv !== undefined ) {\n\n\t\t\t\tscope.faceVertexUvs[ 0 ].push( [\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv, a ),\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv, b ),\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv, c )\n\t\t\t\t] );\n\n\t\t\t}\n\n\t\t\tif ( uv2 !== undefined ) {\n\n\t\t\t\tscope.faceVertexUvs[ 1 ].push( [\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv2, a ),\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv2, b ),\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv2, c )\n\t\t\t\t] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst groups = geometry.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tconst start = group.start;\n\t\t\t\tconst count = group.count;\n\n\t\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\taddFace( index.getX( j ), index.getX( j + 1 ), index.getX( j + 2 ), group.materialIndex );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\taddFace( j, j + 1, j + 2, group.materialIndex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < index.count; i += 3 ) {\n\n\t\t\t\t\taddFace( index.getX( i ), index.getX( i + 1 ), index.getX( i + 2 ) );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.computeFaceNormals();\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcenter: function () {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset$1 ).negate();\n\n\t\tthis.translate( _offset$1.x, _offset$1.y, _offset$1.z );\n\n\t\treturn this;\n\n\t},\n\n\tnormalize: function () {\n\n\t\tthis.computeBoundingSphere();\n\n\t\tconst center = this.boundingSphere.center;\n\t\tconst radius = this.boundingSphere.radius;\n\n\t\tconst s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\tconst matrix = new Matrix4();\n\t\tmatrix.set(\n\t\t\ts, 0, 0, - s * center.x,\n\t\t\t0, s, 0, - s * center.y,\n\t\t\t0, 0, s, - s * center.z,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\tthis.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t},\n\n\tcomputeFaceNormals: function () {\n\n\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tconst face = this.faces[ f ];\n\n\t\t\tconst vA = this.vertices[ face.a ];\n\t\t\tconst vB = this.vertices[ face.b ];\n\t\t\tconst vC = this.vertices[ face.c ];\n\n\t\t\tcb.subVectors( vC, vB );\n\t\t\tab.subVectors( vA, vB );\n\t\t\tcb.cross( ab );\n\n\t\t\tcb.normalize();\n\n\t\t\tface.normal.copy( cb );\n\n\t\t}\n\n\t},\n\n\tcomputeVertexNormals: function ( areaWeighted = true ) {\n\n\t\tconst vertices = new Array( this.vertices.length );\n\n\t\tfor ( let v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\tvertices[ v ] = new Vector3();\n\n\t\t}\n\n\t\tif ( areaWeighted ) {\n\n\t\t\t// vertex normals weighted by triangle areas\n\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tconst face = this.faces[ f ];\n\n\t\t\t\tconst vA = this.vertices[ face.a ];\n\t\t\t\tconst vB = this.vertices[ face.b ];\n\t\t\t\tconst vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tconst face = this.faces[ f ];\n\n\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\tvertices[ v ].normalize();\n\n\t\t}\n\n\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tconst face = this.faces[ f ];\n\n\t\t\tconst vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t} else {\n\n\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.faces.length > 0 ) {\n\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t}\n\n\t},\n\n\tcomputeFlatVertexNormals: function () {\n\n\t\tthis.computeFaceNormals();\n\n\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tconst face = this.faces[ f ];\n\n\t\t\tconst vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t} else {\n\n\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.faces.length > 0 ) {\n\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t}\n\n\t},\n\n\tcomputeMorphNormals: function () {\n\n\t\t// save original normals\n\t\t// - create temp variables on first access\n\t\t// otherwise just copy (for faster repeated calls)\n\n\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tconst face = this.faces[ f ];\n\n\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t} else {\n\n\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t}\n\n\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\tfor ( let i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\tconst tmpGeo = new Geometry();\n\t\ttmpGeo.faces = this.faces;\n\n\t\tfor ( let i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t// create on first access\n\n\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\tconst dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\tconst dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tconst faceNormal = new Vector3();\n\t\t\t\t\tconst vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphNormals = this.morphNormals[ i ];\n\n\t\t\t// set vertices to morph target\n\n\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t// compute morph normals\n\n\t\t\ttmpGeo.computeFaceNormals();\n\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t// store morph normals\n\n\t\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tconst face = this.faces[ f ];\n\n\t\t\t\tconst faceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\tconst vertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// restore original normals\n\n\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tconst face = this.faces[ f ];\n\n\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t}\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t},\n\n\tcomputeBoundingSphere: function () {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t},\n\n\tmerge: function ( geometry, matrix, materialIndexOffset = 0 ) {\n\n\t\tif ( ! ( geometry && geometry.isGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet normalMatrix;\n\t\tconst vertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\tif ( matrix !== undefined ) {\n\n\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t}\n\n\t\t// vertices\n\n\t\tfor ( let i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\tconst vertex = vertices2[ i ];\n\n\t\t\tconst vertexCopy = vertex.clone();\n\n\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\tvertices1.push( vertexCopy );\n\n\t\t}\n\n\t\t// colors\n\n\t\tfor ( let i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t}\n\n\t\t// faces\n\n\t\tfor ( let i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\tconst face = faces2[ i ];\n\t\t\tlet normal, color;\n\t\t\tconst faceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\tconst faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t}\n\n\t\t\tfor ( let j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t}\n\n\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\tfor ( let j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t}\n\n\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\tfaces1.push( faceCopy );\n\n\t\t}\n\n\t\t// uvs\n\n\t\tfor ( let i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\tconst faceVertexUvs2 = geometry.faceVertexUvs[ i ];\n\n\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) this.faceVertexUvs[ i ] = [];\n\n\t\t\tfor ( let j = 0, jl = faceVertexUvs2.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uvs2 = faceVertexUvs2[ j ], uvsCopy = [];\n\n\t\t\t\tfor ( let k = 0, kl = uvs2.length; k < kl; k ++ ) {\n\n\t\t\t\t\tuvsCopy.push( uvs2[ k ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tmergeMesh: function ( mesh ) {\n\n\t\tif ( ! ( mesh && mesh.isMesh ) ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( mesh.matrixAutoUpdate ) mesh.updateMatrix();\n\n\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t},\n\n\t/*\n\t * Checks for duplicate vertices with hashmap.\n\t * Duplicated vertices are removed\n\t * and faces' vertices are updated.\n\t */\n\n\tmergeVertices: function ( precisionPoints = 4 ) {\n\n\t\tconst verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\tconst unique = [], changes = [];\n\n\t\tconst precision = Math.pow( 10, precisionPoints );\n\n\t\tfor ( let i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\tconst v = this.vertices[ i ];\n\t\t\tconst key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// if faces are completely degenerate after merging vertices, we\n\t\t// have to remove them from the geometry.\n\t\tconst faceIndicesToRemove = [];\n\n\t\tfor ( let i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\tconst face = this.faces[ i ];\n\n\t\t\tface.a = changes[ face.a ];\n\t\t\tface.b = changes[ face.b ];\n\t\t\tface.c = changes[ face.c ];\n\n\t\t\tconst indices = [ face.a, face.b, face.c ];\n\n\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t// we have to remove the face as nothing can be saved\n\t\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\tconst idx = faceIndicesToRemove[ i ];\n\n\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\tfor ( let j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Use unique set of vertices\n\n\t\tconst diff = this.vertices.length - unique.length;\n\t\tthis.vertices = unique;\n\t\treturn diff;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.vertices = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tthis.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsortFacesByMaterialIndex: function () {\n\n\t\tconst faces = this.faces;\n\t\tconst length = faces.length;\n\n\t\t// tag faces\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tfaces[ i ]._id = i;\n\n\t\t}\n\n\t\t// sort faces\n\n\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t}\n\n\t\tfaces.sort( materialIndexSort );\n\n\t\t// sort uvs\n\n\t\tconst uvs1 = this.faceVertexUvs[ 0 ];\n\t\tconst uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\tlet newUvs1, newUvs2;\n\n\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tconst id = faces[ i ]._id;\n\n\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t}\n\n\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Geometry',\n\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Geometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tconst vertices = [];\n\n\t\tfor ( let i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\tconst vertex = this.vertices[ i ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tconst faces = [];\n\t\tconst normals = [];\n\t\tconst normalsHash = {};\n\t\tconst colors = [];\n\t\tconst colorsHash = {};\n\t\tconst uvs = [];\n\t\tconst uvsHash = {};\n\n\t\tfor ( let i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\tconst face = this.faces[ i ];\n\n\t\t\tconst hasMaterial = true;\n\t\t\tconst hasFaceUv = false; // deprecated\n\t\t\tconst hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\tconst hasFaceNormal = face.normal.length() > 0;\n\t\t\tconst hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\tconst hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\tconst hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\tlet faceType = 0;\n\n\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\tfaces.push( faceType );\n\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\tfaces.push( face.materialIndex );\n\n\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\tconst faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\tconst vertexNormals = face.vertexNormals;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\tconst vertexColors = face.vertexColors;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t}\n\n\t\tfunction getNormalIndex( normal ) {\n\n\t\t\tconst hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\treturn normalsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getColorIndex( color ) {\n\n\t\t\tconst hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\tcolors.push( color.getHex() );\n\n\t\t\treturn colorsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getUvIndex( uv ) {\n\n\t\t\tconst hash = uv.x.toString() + uv.y.toString();\n\n\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\treturn uvsHash[ hash ];\n\n\t\t}\n\n\t\tdata.data = {};\n\n\t\tdata.data.vertices = vertices;\n\t\tdata.data.normals = normals;\n\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\tdata.data.faces = faces;\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\t/*\n\t\t // Handle primitives\n\n\t\t const parameters = this.parameters;\n\n\t\t if ( parameters !== undefined ) {\n\n\t\t const values = [];\n\n\t\t for ( const key in parameters ) {\n\n\t\t values.push( parameters[ key ] );\n\n\t\t }\n\n\t\t const geometry = Object.create( this.constructor.prototype );\n\t\t this.constructor.apply( geometry, values );\n\t\t return geometry;\n\n\t\t }\n\n\t\t return new this.constructor().copy( this );\n\t\t */\n\n\t\treturn new Geometry().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\t// reset\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\t\tthis.lineDistances = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// vertices\n\n\t\tconst vertices = source.vertices;\n\n\t\tfor ( let i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t}\n\n\t\t// colors\n\n\t\tconst colors = source.colors;\n\n\t\tfor ( let i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t}\n\n\t\t// faces\n\n\t\tconst faces = source.faces;\n\n\t\tfor ( let i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t}\n\n\t\t// face vertex uvs\n\n\t\tfor ( let i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\tconst faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\tfor ( let k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst uv = uvs[ k ];\n\n\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphTargets = source.morphTargets;\n\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = {};\n\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t// vertices\n\n\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\tfor ( let j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// normals\n\n\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\tfor ( let j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t}\n\n\t\t// morph normals\n\n\t\tconst morphNormals = source.morphNormals;\n\n\t\tfor ( let i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\tconst morphNormal = {};\n\n\t\t\t// vertex normals\n\n\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\tfor ( let j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\tconst destVertexNormal = {};\n\n\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// face normals\n\n\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\tfor ( let j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t}\n\n\t\t// skin weights\n\n\t\tconst skinWeights = source.skinWeights;\n\n\t\tfor ( let i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t}\n\n\t\t// skin indices\n\n\t\tconst skinIndices = source.skinIndices;\n\n\t\tfor ( let i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t}\n\n\t\t// line distances\n\n\t\tconst lineDistances = source.lineDistances;\n\n\t\tfor ( let i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\nclass BoxGeometry extends Geometry {\n\n\tconstructor( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass CircleBufferGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, segments = 8, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n}\n\nclass CircleGeometry extends Geometry {\n\n\tconstructor( radius, segments, thetaStart, thetaLength ) {\n\n\t\tsuper();\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass CylinderBufferGeometry extends BufferGeometry {\n\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\t\tthis.type = 'CylinderBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n}\n\nclass CylinderGeometry extends Geometry {\n\n\tconstructor( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tsuper();\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass ConeGeometry extends CylinderGeometry {\n\n\tconstructor( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n}\n\nclass ConeBufferGeometry extends CylinderBufferGeometry {\n\n\tconstructor( radius = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n}\n\nclass PolyhedronBufferGeometry extends BufferGeometry {\n\n\tconstructor( vertices, indices, radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n}\n\nclass DodecahedronBufferGeometry extends PolyhedronBufferGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n}\n\nclass DodecahedronGeometry extends Geometry {\n\n\tconstructor( radius, detail ) {\n\n\t\tsuper();\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nconst _v0$2 = new Vector3();\nconst _v1$5 = new Vector3();\nconst _normal$1 = new Vector3();\nconst _triangle = new Triangle();\n\nclass EdgesGeometry extends BufferGeometry {\n\n\tconstructor( geometry, thresholdAngle ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\tif ( geometry.isGeometry ) {\n\n\t\t\tgeometry = new BufferGeometry().fromGeometry( geometry );\n\n\t\t}\n\n\t\tconst precisionPoints = 4;\n\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\tconst thresholdDot = Math.cos( MathUtils.DEG2RAD * thresholdAngle );\n\n\t\tconst indexAttr = geometry.getIndex();\n\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\tconst indexArr = [ 0, 0, 0 ];\n\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\tconst hashes = new Array( 3 );\n\n\t\tconst edgeData = {};\n\t\tconst vertices = [];\n\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\tif ( indexAttr ) {\n\n\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t} else {\n\n\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t}\n\n\t\t\tconst { a, b, c } = _triangle;\n\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t_triangle.getNormal( _normal$1 );\n\n\t\t\t// create hashes for the edge from the vertices\n\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t// skip degenerate triangles\n\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// iterate over every edge\n\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\tif ( _normal$1.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\tnormal: _normal$1.clone(),\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\tfor ( const key in edgeData ) {\n\n\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t_v0$2.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t_v1$5.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\tvertices.push( _v0$2.x, _v0$2.y, _v0$2.z );\n\t\t\t\tvertices.push( _v1$5.x, _v1$5.y, _v1$5.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t}\n\n}\n\n/**\n * Port from https://github.com/mapbox/earcut (v2.2.2)\n */\n\nconst Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim ) {\n\n\t\tdim = dim || 2;\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length;\n\t\tlet outerNode = linkedList( data, 0, outerLen, dim, true );\n\t\tconst triangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( let i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 1 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim );\n\t\t\ttriangles.push( ear.i / dim );\n\t\t\ttriangles.push( next.i / dim );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tlet p = ear.next.next;\n\n\twhile ( p !== ear.prev ) {\n\n\t\tif ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ),\n\t\tminTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ),\n\t\tmaxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ),\n\t\tmaxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y );\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder( minTX, minTY, minX, minY, invSize ),\n\t\tmaxZ = zOrder( maxTX, maxTY, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim );\n\t\t\ttriangles.push( p.i / dim );\n\t\t\ttriangles.push( b.i / dim );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tconst queue = [];\n\tlet i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\teliminateHole( queue[ i ], outerNode );\n\t\touterNode = filterPoints( outerNode, outerNode.next );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\touterNode = findHoleBridge( hole, outerNode );\n\tif ( outerNode ) {\n\n\t\tconst b = splitPolygon( outerNode, hole );\n\n\t\t// filter collinear points around the cuts\n\t\tfilterPoints( outerNode, outerNode.next );\n\t\tfilterPoints( b, b.next );\n\n\t}\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode;\n\tconst hx = hole.x;\n\tconst hy = hole.y;\n\tlet qx = - Infinity, m;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tconst x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tif ( x === hx ) {\n\n\t\t\t\t\tif ( hy === p.y ) return p;\n\t\t\t\t\tif ( hy === p.next.y ) return p.next;\n\n\t\t\t\t}\n\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\tif ( hx === qx ) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = 32767 * ( x - minX ) * invSize;\n\ty = 32767 * ( y - minY ) * invSize;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 &&\n\t\t\t( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 &&\n\t\t\t( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0;\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // dones't intersect other edges\n\t\t( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n\t\t( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n\t\tequals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? - 1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false;\n\tconst px = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tconst a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tconst p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = null;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tlet sum = 0;\n\tfor ( let i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\nconst ShapeUtils = {\n\n\t// calculate area of the contour polygon\n\n\tarea: function ( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t},\n\n\tisClockWise: function ( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t},\n\n\ttriangulateShape: function ( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n};\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: , // number of points on the curves\n * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * depth: , // Depth to extrude the shape\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into the original shape bevel goes\n * bevelSize: , // how far from shape outline (including bevelOffset) is bevel\n * bevelOffset: , // how far from shape outline does bevel start\n * bevelSegments: , // number of bevel layers\n *\n * extrudePath: // curve to extrude shape along\n *\n * UVGenerator: // object that provides UV generator functions\n *\n * }\n */\n\nclass ExtrudeBufferGeometry extends BufferGeometry {\n\n\tconstructor( shapes, options ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tlet depth = options.depth !== undefined ? options.depth : 100;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t// deprecated options\n\n\t\t\tif ( options.amount !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' );\n\t\t\t\tdepth = options.amount;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length, flen = faces.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\n\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = BufferGeometry.prototype.toJSON.call( this );\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON( shapes, options, data );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < 0.01 ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: , // number of points on the curves\n * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * depth: , // Depth to extrude the shape\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into the original shape bevel goes\n * bevelSize: , // how far from shape outline (including bevelOffset) is bevel\n * bevelOffset: , // how far from shape outline does bevel start\n * bevelSegments: , // number of bevel layers\n *\n * extrudePath: // curve to extrude shape along\n *\n * UVGenerator: // object that provides UV generator functions\n *\n * }\n */\n\nclass ExtrudeGeometry extends Geometry {\n\n\tconstructor( shapes, options ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n}\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\nclass IcosahedronBufferGeometry extends PolyhedronBufferGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t\t0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t\tt, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n}\n\nclass IcosahedronGeometry extends Geometry {\n\n\tconstructor( radius, detail ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass LatheBufferGeometry extends BufferGeometry {\n\n\tconstructor( points, segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = MathUtils.clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif ( phiLength === Math.PI * 2 ) {\n\n\t\t\tconst normals = this.attributes.normal.array;\n\t\t\tconst n1 = new Vector3();\n\t\t\tconst n2 = new Vector3();\n\t\t\tconst n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\n\t\t\tconst base = segments * points.length * 3;\n\n\t\t\tfor ( let i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nclass LatheGeometry extends Geometry {\n\n\tconstructor( points, segments, phiStart, phiLength ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass OctahedronBufferGeometry extends PolyhedronBufferGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n}\n\nclass OctahedronGeometry extends Geometry {\n\n\tconstructor( radius, detail ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\n/**\n * Parametric Surfaces Geometry\n * based on the brilliant article by @prideout https://prideout.net/blog/old/blog/index.html@p=44.html\n */\n\nfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ParametricBufferGeometry';\n\n\tthis.parameters = {\n\t\tfunc: func,\n\t\tslices: slices,\n\t\tstacks: stacks\n\t};\n\n\t// buffers\n\n\tconst indices = [];\n\tconst vertices = [];\n\tconst normals = [];\n\tconst uvs = [];\n\n\tconst EPS = 0.00001;\n\n\tconst normal = new Vector3();\n\n\tconst p0 = new Vector3(), p1 = new Vector3();\n\tconst pu = new Vector3(), pv = new Vector3();\n\n\tif ( func.length < 3 ) {\n\n\t\tconsole.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' );\n\n\t}\n\n\t// generate vertices, normals and uvs\n\n\tconst sliceCount = slices + 1;\n\n\tfor ( let i = 0; i <= stacks; i ++ ) {\n\n\t\tconst v = i / stacks;\n\n\t\tfor ( let j = 0; j <= slices; j ++ ) {\n\n\t\t\tconst u = j / slices;\n\n\t\t\t// vertex\n\n\t\t\tfunc( u, v, p0 );\n\t\t\tvertices.push( p0.x, p0.y, p0.z );\n\n\t\t\t// normal\n\n\t\t\t// approximate tangent vectors via finite differences\n\n\t\t\tif ( u - EPS >= 0 ) {\n\n\t\t\t\tfunc( u - EPS, v, p1 );\n\t\t\t\tpu.subVectors( p0, p1 );\n\n\t\t\t} else {\n\n\t\t\t\tfunc( u + EPS, v, p1 );\n\t\t\t\tpu.subVectors( p1, p0 );\n\n\t\t\t}\n\n\t\t\tif ( v - EPS >= 0 ) {\n\n\t\t\t\tfunc( u, v - EPS, p1 );\n\t\t\t\tpv.subVectors( p0, p1 );\n\n\t\t\t} else {\n\n\t\t\t\tfunc( u, v + EPS, p1 );\n\t\t\t\tpv.subVectors( p1, p0 );\n\n\t\t\t}\n\n\t\t\t// cross product of tangent vectors returns surface normal\n\n\t\t\tnormal.crossVectors( pu, pv ).normalize();\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( u, v );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( let i = 0; i < stacks; i ++ ) {\n\n\t\tfor ( let j = 0; j < slices; j ++ ) {\n\n\t\t\tconst a = i * sliceCount + j;\n\t\t\tconst b = i * sliceCount + j + 1;\n\t\t\tconst c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\tconst d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t// faces one and two\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n/**\n * Parametric Surfaces Geometry\n * based on the brilliant article by @prideout https://prideout.net/blog/old/blog/index.html@p=44.html\n */\n\nfunction ParametricGeometry( func, slices, stacks ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ParametricGeometry';\n\n\tthis.parameters = {\n\t\tfunc: func,\n\t\tslices: slices,\n\t\tstacks: stacks\n\t};\n\n\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\tthis.mergeVertices();\n\n}\n\nParametricGeometry.prototype = Object.create( Geometry.prototype );\nParametricGeometry.prototype.constructor = ParametricGeometry;\n\nclass PlaneGeometry extends Geometry {\n\n\tconstructor( width, height, widthSegments, heightSegments ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass PolyhedronGeometry extends Geometry {\n\n\tconstructor( vertices, indices, radius, detail ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass RingBufferGeometry extends BufferGeometry {\n\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 8, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n}\n\nclass RingGeometry extends Geometry {\n\n\tconstructor( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass ShapeBufferGeometry extends BufferGeometry {\n\n\tconstructor( shapes, curveSegments = 12 ) {\n\n\t\tsuper();\n\t\tthis.type = 'ShapeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = BufferGeometry.prototype.toJSON.call( this );\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON$2( shapes, data );\n\n\t}\n\n}\n\nfunction toJSON$2( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\nclass ShapeGeometry extends Geometry {\n\n\tconstructor( shapes, curveSegments ) {\n\n\t\tsuper();\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( typeof curveSegments === 'object' ) {\n\n\t\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\t\tcurveSegments = curveSegments.curveSegments;\n\n\t\t}\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = Geometry.prototype.toJSON.call( this );\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON$3( shapes, data );\n\n\t}\n\n}\n\nfunction toJSON$3( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\nclass SphereBufferGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, widthSegments = 8, heightSegments = 6, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\t\tthis.type = 'SphereBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy == 0 && thetaStart == 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy == heightSegments && thetaEnd == Math.PI ) {\n\n\t\t\t\tuOffset = - 0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n}\n\nclass SphereGeometry extends Geometry {\n\n\tconstructor( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tsuper();\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass TetrahedronBufferGeometry extends PolyhedronBufferGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n}\n\nclass TetrahedronGeometry extends Geometry {\n\n\tconstructor( radius, detail ) {\n\n\t\tsuper();\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\n/**\n * Text = 3D Text\n *\n * parameters = {\n * font: , // font\n *\n * size: , // size of the text\n * height: , // thickness to extrude text\n * curveSegments: , // number of points on the curves\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into text bevel goes\n * bevelSize: , // how far from text outline (including bevelOffset) is bevel\n * bevelOffset: // how far from text outline does bevel start\n * }\n */\n\nclass TextBufferGeometry extends ExtrudeBufferGeometry {\n\n\tconstructor( text, parameters = {} ) {\n\n\t\tconst font = parameters.font;\n\n\t\tif ( ! ( font && font.isFont ) ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new BufferGeometry();\n\n\t\t}\n\n\t\tconst shapes = font.generateShapes( text, parameters.size );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.depth = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tsuper( shapes, parameters );\n\n\t\tthis.type = 'TextBufferGeometry';\n\n\t}\n\n}\n\n/**\n * Text = 3D Text\n *\n * parameters = {\n * font: , // font\n *\n * size: , // size of the text\n * height: , // thickness to extrude text\n * curveSegments: , // number of points on the curves\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into text bevel goes\n * bevelSize: , // how far from text outline (including bevelOffset) is bevel\n * bevelOffset: // how far from text outline does bevel start\n * }\n */\n\nclass TextGeometry extends Geometry {\n\n\tconstructor( text, parameters ) {\n\n\t\tsuper();\n\t\tthis.type = 'TextGeometry';\n\n\t\tthis.parameters = {\n\t\t\ttext: text,\n\t\t\tparameters: parameters\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TextBufferGeometry( text, parameters ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass TorusBufferGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 8, tubularSegments = 6, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\t\tthis.type = 'TorusBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n}\n\nclass TorusGeometry extends Geometry {\n\n\tconstructor( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tsuper();\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass TorusKnotBufferGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\t\tthis.type = 'TorusKnotBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n}\n\nclass TorusKnotGeometry extends Geometry {\n\n\tconstructor( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tsuper();\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass TubeBufferGeometry extends BufferGeometry {\n\n\tconstructor( path, tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\t\tthis.type = 'TubeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\ttoJSON() {\n\n\t\tconst data = BufferGeometry.prototype.toJSON.call( this );\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass TubeGeometry extends Geometry {\n\n\tconstructor( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tsuper();\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tconst bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\nclass WireframeGeometry extends BufferGeometry {\n\n\tconstructor( geometry ) {\n\n\t\tsuper();\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\n\t\t// helper variables\n\n\t\tconst edge = [ 0, 0 ], edges = {};\n\t\tconst keys = [ 'a', 'b', 'c' ];\n\n\t\t// different logic for Geometry and BufferGeometry\n\n\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\tconst faces = geometry.faces;\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tconst edge1 = face[ keys[ j ] ];\n\t\t\t\t\tconst edge2 = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\t\tconst key = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( const key in edges ) {\n\n\t\t\t\tconst e = edges[ key ];\n\n\t\t\t\tlet vertex = geometry.vertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst start = group.start;\n\t\t\t\t\tconst count = group.count;\n\n\t\t\t\t\tfor ( let i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst edge1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst edge2 = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\t\t\t\tconst key = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// generate vertices\n\n\t\t\t\tfor ( const key in edges ) {\n\n\t\t\t\t\tconst e = edges[ key ];\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tBoxBufferGeometry: BoxBufferGeometry,\n\tCircleGeometry: CircleGeometry,\n\tCircleBufferGeometry: CircleBufferGeometry,\n\tConeGeometry: ConeGeometry,\n\tConeBufferGeometry: ConeBufferGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tCylinderBufferGeometry: CylinderBufferGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tExtrudeBufferGeometry: ExtrudeBufferGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\tLatheGeometry: LatheGeometry,\n\tLatheBufferGeometry: LatheBufferGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\tParametricGeometry: ParametricGeometry,\n\tParametricBufferGeometry: ParametricBufferGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPlaneBufferGeometry: PlaneBufferGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\tRingGeometry: RingGeometry,\n\tRingBufferGeometry: RingBufferGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tShapeBufferGeometry: ShapeBufferGeometry,\n\tSphereGeometry: SphereGeometry,\n\tSphereBufferGeometry: SphereBufferGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\tTextGeometry: TextGeometry,\n\tTextBufferGeometry: TextBufferGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusBufferGeometry: TorusBufferGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\tTubeGeometry: TubeGeometry,\n\tTubeBufferGeometry: TubeBufferGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\n/**\n * parameters = {\n * color: \n * }\n */\n\nfunction ShadowMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'ShadowMaterial';\n\n\tthis.color = new Color( 0x000000 );\n\tthis.transparent = true;\n\n\tthis.setValues( parameters );\n\n}\n\nShadowMaterial.prototype = Object.create( Material.prototype );\nShadowMaterial.prototype.constructor = ShadowMaterial;\n\nShadowMaterial.prototype.isShadowMaterial = true;\n\nShadowMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\treturn this;\n\n};\n\nfunction RawShaderMaterial( parameters ) {\n\n\tShaderMaterial.call( this, parameters );\n\n\tthis.type = 'RawShaderMaterial';\n\n}\n\nRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\nRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\nRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n/**\n * parameters = {\n * color: ,\n * roughness: ,\n * metalness: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * roughnessMap: new THREE.Texture( ),\n *\n * metalnessMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * envMapIntensity: \n *\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshStandardMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.defines = { 'STANDARD': '' };\n\n\tthis.type = 'MeshStandardMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\tthis.roughness = 1.0;\n\tthis.metalness = 0.0;\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.roughnessMap = null;\n\n\tthis.metalnessMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.envMapIntensity = 1.0;\n\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.vertexTangents = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshStandardMaterial.prototype = Object.create( Material.prototype );\nMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\nMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\nMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = { 'STANDARD': '' };\n\n\tthis.color.copy( source.color );\n\tthis.roughness = source.roughness;\n\tthis.metalness = source.metalness;\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.roughnessMap = source.roughnessMap;\n\n\tthis.metalnessMap = source.metalnessMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.envMapIntensity = source.envMapIntensity;\n\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\tthis.vertexTangents = source.vertexTangents;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * clearcoat: ,\n * clearcoatMap: new THREE.Texture( ),\n * clearcoatRoughness: ,\n * clearcoatRoughnessMap: new THREE.Texture( ),\n * clearcoatNormalScale: ,\n * clearcoatNormalMap: new THREE.Texture( ),\n *\n * reflectivity: ,\n * ior: ,\n *\n * sheen: ,\n *\n * transmission: ,\n * transmissionMap: new THREE.Texture( )\n * }\n */\n\nfunction MeshPhysicalMaterial( parameters ) {\n\n\tMeshStandardMaterial.call( this );\n\n\tthis.defines = {\n\n\t\t'STANDARD': '',\n\t\t'PHYSICAL': ''\n\n\t};\n\n\tthis.type = 'MeshPhysicalMaterial';\n\n\tthis.clearcoat = 0.0;\n\tthis.clearcoatMap = null;\n\tthis.clearcoatRoughness = 0.0;\n\tthis.clearcoatRoughnessMap = null;\n\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\tthis.clearcoatNormalMap = null;\n\n\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\tObject.defineProperty( this, 'ior', {\n\t\tget: function () {\n\n\t\t\treturn ( 1 + 0.4 * this.reflectivity ) / ( 1 - 0.4 * this.reflectivity );\n\n\t\t},\n\t\tset: function ( ior ) {\n\n\t\t\tthis.reflectivity = MathUtils.clamp( 2.5 * ( ior - 1 ) / ( ior + 1 ), 0, 1 );\n\n\t\t}\n\t} );\n\n\tthis.sheen = null; // null will disable sheen bsdf\n\n\tthis.transmission = 0.0;\n\tthis.transmissionMap = null;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\nMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\nMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\nMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = {\n\n\t\t'STANDARD': '',\n\t\t'PHYSICAL': ''\n\n\t};\n\n\tthis.clearcoat = source.clearcoat;\n\tthis.clearcoatMap = source.clearcoatMap;\n\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\tthis.reflectivity = source.reflectivity;\n\n\tif ( source.sheen ) {\n\n\t\tthis.sheen = ( this.sheen || new Color() ).copy( source.sheen );\n\n\t} else {\n\n\t\tthis.sheen = null;\n\n\t}\n\n\tthis.transmission = source.transmission;\n\tthis.transmissionMap = source.transmissionMap;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * color: ,\n * specular: ,\n * shininess: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.MultiplyOperation,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshPhongMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshPhongMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\tthis.specular = new Color( 0x111111 );\n\tthis.shininess = 30;\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshPhongMaterial.prototype = Object.create( Material.prototype );\nMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\nMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\nMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\tthis.specular.copy( source.specular );\n\tthis.shininess = source.shininess;\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * color: ,\n *\n * map: new THREE.Texture( ),\n * gradientMap: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * alphaMap: new THREE.Texture( ),\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshToonMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.defines = { 'TOON': '' };\n\n\tthis.type = 'MeshToonMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.map = null;\n\tthis.gradientMap = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.alphaMap = null;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshToonMaterial.prototype = Object.create( Material.prototype );\nMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\nMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\nMeshToonMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\tthis.gradientMap = source.gradientMap;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * opacity: ,\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * wireframe: ,\n * wireframeLinewidth: \n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshNormalMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshNormalMaterial';\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshNormalMaterial.prototype = Object.create( Material.prototype );\nMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\nMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\nMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshLambertMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshLambertMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshLambertMaterial.prototype = Object.create( Material.prototype );\nMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\nMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\nMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * matcap: new THREE.Texture( ),\n *\n * map: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * alphaMap: new THREE.Texture( ),\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshMatcapMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.defines = { 'MATCAP': '' };\n\n\tthis.type = 'MeshMatcapMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\n\tthis.matcap = null;\n\n\tthis.map = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.alphaMap = null;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshMatcapMaterial.prototype = Object.create( Material.prototype );\nMeshMatcapMaterial.prototype.constructor = MeshMatcapMaterial;\n\nMeshMatcapMaterial.prototype.isMeshMatcapMaterial = true;\n\nMeshMatcapMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = { 'MATCAP': '' };\n\n\tthis.color.copy( source.color );\n\n\tthis.matcap = source.matcap;\n\n\tthis.map = source.map;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * linewidth: ,\n *\n * scale: ,\n * dashSize: ,\n * gapSize: \n * }\n */\n\nfunction LineDashedMaterial( parameters ) {\n\n\tLineBasicMaterial.call( this );\n\n\tthis.type = 'LineDashedMaterial';\n\n\tthis.scale = 1;\n\tthis.dashSize = 3;\n\tthis.gapSize = 1;\n\n\tthis.setValues( parameters );\n\n}\n\nLineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype );\nLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\nLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\nLineDashedMaterial.prototype.copy = function ( source ) {\n\n\tLineBasicMaterial.prototype.copy.call( this, source );\n\n\tthis.scale = source.scale;\n\tthis.dashSize = source.dashSize;\n\tthis.gapSize = source.gapSize;\n\n\treturn this;\n\n};\n\nvar Materials = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tShadowMaterial: ShadowMaterial,\n\tSpriteMaterial: SpriteMaterial,\n\tRawShaderMaterial: RawShaderMaterial,\n\tShaderMaterial: ShaderMaterial,\n\tPointsMaterial: PointsMaterial,\n\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\tMeshStandardMaterial: MeshStandardMaterial,\n\tMeshPhongMaterial: MeshPhongMaterial,\n\tMeshToonMaterial: MeshToonMaterial,\n\tMeshNormalMaterial: MeshNormalMaterial,\n\tMeshLambertMaterial: MeshLambertMaterial,\n\tMeshDepthMaterial: MeshDepthMaterial,\n\tMeshDistanceMaterial: MeshDistanceMaterial,\n\tMeshBasicMaterial: MeshBasicMaterial,\n\tMeshMatcapMaterial: MeshMatcapMaterial,\n\tLineDashedMaterial: LineDashedMaterial,\n\tLineBasicMaterial: LineBasicMaterial,\n\tMaterial: Material\n});\n\nconst AnimationUtils = {\n\n\t// same as Array.prototype.slice, but also works on typed arrays\n\tarraySlice: function ( array, from, to ) {\n\n\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t// in ios9 array.subarray(from, undefined) will return empty array\n\t\t\t// but array.subarray(from) or array.subarray(from, len) is correct\n\t\t\treturn new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );\n\n\t\t}\n\n\t\treturn array.slice( from, to );\n\n\t},\n\n\t// converts an array to a specific type\n\tconvertArray: function ( array, type, forceClone ) {\n\n\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\treturn new type( array ); // create typed array\n\n\t\t}\n\n\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t},\n\n\tisTypedArray: function ( object ) {\n\n\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t! ( object instanceof DataView );\n\n\t},\n\n\t// returns an array by which times and values can be sorted\n\tgetKeyframeOrder: function ( times ) {\n\n\t\tfunction compareTime( i, j ) {\n\n\t\t\treturn times[ i ] - times[ j ];\n\n\t\t}\n\n\t\tconst n = times.length;\n\t\tconst result = new Array( n );\n\t\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\tresult.sort( compareTime );\n\n\t\treturn result;\n\n\t},\n\n\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\tsortedArray: function ( values, stride, order ) {\n\n\t\tconst nValues = values.length;\n\t\tconst result = new values.constructor( nValues );\n\n\t\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\tconst srcOffset = order[ i ] * stride;\n\n\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// function for parsing AOS keyframe formats\n\tflattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tlet i = 1, key = jsonKeys[ 0 ];\n\n\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t}\n\n\t\tif ( key === undefined ) return; // no data\n\n\t\tlet value = key[ valuePropertyName ];\n\t\tif ( value === undefined ) return; // no data\n\n\t\tif ( Array.isArray( value ) ) {\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else if ( value.toArray !== undefined ) {\n\n\t\t\t// ...assume THREE.Math-ish\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else {\n\n\t\t\t// otherwise push as-is\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t}\n\n\t},\n\n\tsubclip: function ( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\t\tconst clip = sourceClip.clone();\n\n\t\tclip.name = name;\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tconst track = clip.tracks[ i ];\n\t\t\tconst valueSize = track.getValueSize();\n\n\t\t\tconst times = [];\n\t\t\tconst values = [];\n\n\t\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( times.length === 0 ) continue;\n\n\t\t\ttrack.times = AnimationUtils.convertArray( times, track.times.constructor );\n\t\t\ttrack.values = AnimationUtils.convertArray( values, track.values.constructor );\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\tclip.tracks = tracks;\n\n\t\t// find minimum .times value across all tracks in the trimmed clip\n\n\t\tlet minStartTime = Infinity;\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// shift all tracks such that clip begins at t=0\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tclip.tracks[ i ].shift( - 1 * minStartTime );\n\n\t\t}\n\n\t\tclip.resetDuration();\n\n\t\treturn clip;\n\n\t},\n\n\tmakeClipAdditive: function ( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\t\tif ( fps <= 0 ) fps = 30;\n\n\t\tconst numTracks = referenceClip.tracks.length;\n\t\tconst referenceTime = referenceFrame / fps;\n\n\t\t// Make each track's values relative to the values at the reference frame\n\t\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t\t// Skip this track if it's non-numeric\n\t\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t\t} );\n\n\t\t\tif ( targetTrack === undefined ) continue;\n\n\t\t\tlet referenceOffset = 0;\n\t\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t\t}\n\n\t\t\tlet targetOffset = 0;\n\t\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t\t}\n\n\t\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\t\tlet referenceValue;\n\n\t\t\t// Find the value to subtract out of the track\n\t\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\t\tconst startIndex = referenceOffset;\n\t\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\t\treferenceValue = AnimationUtils.arraySlice( referenceTrack.values, startIndex, endIndex );\n\n\t\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\t\treferenceValue = AnimationUtils.arraySlice( referenceTrack.values, startIndex, endIndex );\n\n\t\t\t} else {\n\n\t\t\t\t// Interpolate to the reference value\n\t\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\t\tconst startIndex = referenceOffset;\n\t\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\t\treferenceValue = AnimationUtils.arraySlice( interpolant.resultBuffer, startIndex, endIndex );\n\n\t\t\t}\n\n\t\t\t// Conjugate the quaternion\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t\t}\n\n\t\t\t// Subtract the reference value from all of the track values\n\n\t\t\tconst numTimes = targetTrack.times.length;\n\t\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\t\tvalueStart,\n\t\t\t\t\t\treferenceValue,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\t\tvalueStart\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\t\treturn targetClip;\n\n\t}\n\n};\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References:\n *\n * \t\thttp://www.oodesign.com/template-method-pattern.html\n *\n */\n\nfunction Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tthis.parameterPositions = parameterPositions;\n\tthis._cachedIndex = 0;\n\n\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\tthis.sampleValues = sampleValues;\n\tthis.valueSize = sampleSize;\n\n}\n\nObject.assign( Interpolant.prototype, {\n\n\tevaluate: function ( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t},\n\n\tsettings: null, // optional, subclass-specific settings structure\n\t// Note: The indirection allows central control of many interpolants.\n\n\t// --- Protected interface\n\n\tDefaultSettings_: {},\n\n\tgetSettings_: function () {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t},\n\n\tcopySampleValue_: function ( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// Template methods for derived classes:\n\n\tinterpolate_: function ( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t},\n\n\tintervalChanged_: function ( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n} );\n\n// DECLARE ALIAS AFTER assign prototype\nObject.assign( Interpolant.prototype, {\n\n\t//( 0, t, t0 ), returns this.resultBuffer\n\tbeforeStart_: Interpolant.prototype.copySampleValue_,\n\n\t//( N-1, tN-1, t ), returns this.resultBuffer\n\tafterEnd_: Interpolant.prototype.copySampleValue_,\n\n} );\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n */\n\nfunction CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\tthis._weightPrev = - 0;\n\tthis._offsetPrev = - 0;\n\tthis._weightNext = - 0;\n\tthis._offsetNext = - 0;\n\n}\n\nCubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: CubicInterpolant,\n\n\tDefaultSettings_: {\n\n\t\tendingStart: ZeroCurvatureEnding,\n\t\tendingEnd: ZeroCurvatureEnding\n\n\t},\n\n\tintervalChanged_: function ( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t},\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;\n\t\tconst s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\nfunction LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: LinearInterpolant,\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n *\n * Interpolant that evaluates to the sample value at the position preceeding\n * the parameter.\n */\n\nfunction DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nDiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: DiscreteInterpolant,\n\n\tinterpolate_: function ( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n} );\n\nfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\tthis.name = name;\n\n\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n}\n\n// Static methods\n\nObject.assign( KeyframeTrack, {\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\ttoJSON: function ( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n} );\n\nObject.assign( KeyframeTrack.prototype, {\n\n\tconstructor: KeyframeTrack,\n\n\tTimeBufferType: Float32Array,\n\n\tValueBufferType: Float32Array,\n\n\tDefaultInterpolation: InterpolateLinear,\n\n\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tsetInterpolation: function ( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t},\n\n\tgetInterpolation: function () {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t},\n\n\tgetValueSize: function () {\n\n\t\treturn this.values.length / this.times.length;\n\n\t},\n\n\t// move all keyframes either forwards or backwards in time\n\tshift: function ( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale: function ( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\ttrim: function ( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== - 1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\tthis.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate: function () {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t},\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize: function () {\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = AnimationUtils.arraySlice( this.times ),\n\t\t\tvalues = AnimationUtils.arraySlice( this.values ),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\tconst times = AnimationUtils.arraySlice( this.times, 0 );\n\t\tconst values = AnimationUtils.arraySlice( this.values, 0 );\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n} );\n\n/**\n * A Track of Boolean keyframe values.\n */\n\nfunction BooleanKeyframeTrack( name, times, values ) {\n\n\tKeyframeTrack.call( this, name, times, values );\n\n}\n\nBooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: BooleanKeyframeTrack,\n\n\tValueTypeName: 'bool',\n\tValueBufferType: Array,\n\n\tDefaultInterpolation: InterpolateDiscrete,\n\n\tInterpolantFactoryMethodLinear: undefined,\n\tInterpolantFactoryMethodSmooth: undefined\n\n\t// Note: Actually this track could have a optimized / compressed\n\t// representation of a single value and a custom interpolant that\n\t// computes \"firstValue ^ isOdd( index )\".\n\n} );\n\n/**\n * A Track of keyframe values that represent color.\n */\n\nfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: ColorKeyframeTrack,\n\n\tValueTypeName: 'color'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n\t// Note: Very basic implementation and nothing special yet.\n\t// However, this is the place for color space parameterization.\n\n} );\n\n/**\n * A Track of numeric keyframe values.\n */\n\nfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nNumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: NumberKeyframeTrack,\n\n\tValueTypeName: 'number'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n} );\n\n/**\n * Spherical linear unit quaternion interpolant.\n */\n\nfunction QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nQuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: QuaternionLinearInterpolant,\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n * A Track of quaternion keyframe values.\n */\n\nfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nQuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: QuaternionKeyframeTrack,\n\n\tValueTypeName: 'quaternion',\n\n\t// ValueBufferType is inherited\n\n\tDefaultInterpolation: InterpolateLinear,\n\n\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n} );\n\n/**\n * A Track that interpolates Strings\n */\n\nfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nStringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: StringKeyframeTrack,\n\n\tValueTypeName: 'string',\n\tValueBufferType: Array,\n\n\tDefaultInterpolation: InterpolateDiscrete,\n\n\tInterpolantFactoryMethodLinear: undefined,\n\n\tInterpolantFactoryMethodSmooth: undefined\n\n} );\n\n/**\n * A Track of vectored keyframe values.\n */\n\nfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nVectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: VectorKeyframeTrack,\n\n\tValueTypeName: 'vector'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n} );\n\nfunction AnimationClip( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) {\n\n\tthis.name = name;\n\tthis.tracks = tracks;\n\tthis.duration = duration;\n\tthis.blendMode = blendMode;\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\t// this means it should figure out its duration by scanning the tracks\n\tif ( this.duration < 0 ) {\n\n\t\tthis.resetDuration();\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\nObject.assign( AnimationClip, {\n\n\tparse: function ( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new AnimationClip( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\treturn clip;\n\n\t},\n\n\ttoJSON: function ( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t},\n\n\tCreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = AnimationUtils.getKeyframeOrder( times );\n\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new AnimationClip( name, - 1, tracks );\n\n\t},\n\n\tfindByName: function ( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\tCreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t},\n\n\t// parse the animation.hierarchy format\n\tparseAnimation: function ( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || - 1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new AnimationClip( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n} );\n\nObject.assign( AnimationClip.prototype, {\n\n\tresetDuration: function () {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t},\n\n\ttrim: function () {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tvalidate: function () {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t},\n\n\toptimize: function () {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\treturn new AnimationClip( this.name, this.duration, tracks, this.blendMode );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\treturn AnimationClip.toJSON( this );\n\n\t}\n\n} );\n\nconst Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\nfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\tconst scope = this;\n\n\tlet isLoading = false;\n\tlet itemsLoaded = 0;\n\tlet itemsTotal = 0;\n\tlet urlModifier = undefined;\n\tconst handlers = [];\n\n\t// Refer to #5689 for the reason why we don't set .onStart\n\t// in the constructor\n\n\tthis.onStart = undefined;\n\tthis.onLoad = onLoad;\n\tthis.onProgress = onProgress;\n\tthis.onError = onError;\n\n\tthis.itemStart = function ( url ) {\n\n\t\titemsTotal ++;\n\n\t\tif ( isLoading === false ) {\n\n\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tisLoading = true;\n\n\t};\n\n\tthis.itemEnd = function ( url ) {\n\n\t\titemsLoaded ++;\n\n\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t}\n\n\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\tisLoading = false;\n\n\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\tscope.onLoad();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.itemError = function ( url ) {\n\n\t\tif ( scope.onError !== undefined ) {\n\n\t\t\tscope.onError( url );\n\n\t\t}\n\n\t};\n\n\tthis.resolveURL = function ( url ) {\n\n\t\tif ( urlModifier ) {\n\n\t\t\treturn urlModifier( url );\n\n\t\t}\n\n\t\treturn url;\n\n\t};\n\n\tthis.setURLModifier = function ( transform ) {\n\n\t\turlModifier = transform;\n\n\t\treturn this;\n\n\t};\n\n\tthis.addHandler = function ( regex, loader ) {\n\n\t\thandlers.push( regex, loader );\n\n\t\treturn this;\n\n\t};\n\n\tthis.removeHandler = function ( regex ) {\n\n\t\tconst index = handlers.indexOf( regex );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\thandlers.splice( index, 2 );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tthis.getHandler = function ( file ) {\n\n\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\tconst regex = handlers[ i ];\n\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\treturn loader;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n}\n\nconst DefaultLoadingManager = new LoadingManager();\n\nfunction Loader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\tthis.crossOrigin = 'anonymous';\n\tthis.withCredentials = false;\n\tthis.path = '';\n\tthis.resourcePath = '';\n\tthis.requestHeader = {};\n\n}\n\nObject.assign( Loader.prototype, {\n\n\tload: function ( /* url, onLoad, onProgress, onError */ ) {},\n\n\tloadAsync: function ( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t},\n\n\tparse: function ( /* data */ ) {},\n\n\tsetCrossOrigin: function ( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t},\n\n\tsetWithCredentials: function ( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t},\n\n\tsetResourcePath: function ( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t},\n\n\tsetRequestHeader: function ( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n} );\n\nconst loading = {};\n\nfunction FileLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nFileLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: FileLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Check for data: URI\n\t\tconst dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\tconst dataUriRegexResult = url.match( dataUriRegex );\n\t\tlet request;\n\n\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\tif ( dataUriRegexResult ) {\n\n\t\t\tconst mimeType = dataUriRegexResult[ 1 ];\n\t\t\tconst isBase64 = !! dataUriRegexResult[ 2 ];\n\n\t\t\tlet data = dataUriRegexResult[ 3 ];\n\t\t\tdata = decodeURIComponent( data );\n\n\t\t\tif ( isBase64 ) data = atob( data );\n\n\t\t\ttry {\n\n\t\t\t\tlet response;\n\t\t\t\tconst responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\tconst view = new Uint8Array( data.length );\n\n\t\t\t\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\tresponse = new Blob( [ view.buffer ], { type: mimeType } );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tresponse = view.buffer;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\t// Wait for next browser tick like standard XMLHttpRequest event dispatching does\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\t// Wait for next browser tick like standard XMLHttpRequest event dispatching does\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Initialise array for duplicate requests\n\n\t\t\tloading[ url ] = [];\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\trequest = new XMLHttpRequest();\n\n\t\t\trequest.open( 'GET', url, true );\n\n\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\tconst response = this.response;\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tif ( this.status === 200 || this.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( this.status === 0 ) console.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( response );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t}\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'abort', function ( event ) {\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\tfor ( const header in this.requestHeader ) {\n\n\t\t\t\trequest.setRequestHeader( header, this.requestHeader[ header ] );\n\n\t\t\t}\n\n\t\t\trequest.send( null );\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\treturn request;\n\n\t},\n\n\tsetResponseType: function ( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t},\n\n\tsetMimeType: function ( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction AnimationLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nAnimationLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: AnimationLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n} );\n\n/**\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nfunction CompressedTextureLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nCompressedTextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: CompressedTextureLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n} );\n\nfunction ImageLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nImageLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: ImageLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.substr( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n} );\n\nfunction CubeTextureLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nCubeTextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: CubeTextureLoader,\n\n\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n} );\n\n/**\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nfunction DataTextureLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nDataTextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: DataTextureLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tconst texData = scope.parse( buffer );\n\n\t\t\tif ( ! texData ) return;\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n} );\n\nfunction TextureLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nTextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: TextureLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\n\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\tconst isJPEG = url.search( /\\.jpe?g($|\\?)/i ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n} );\n\n/**\n * Extensible curve object.\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\nfunction Curve() {\n\n\tthis.type = 'Curve';\n\n\tthis.arcLengthDivisions = 200;\n\n}\n\nObject.assign( Curve.prototype, {\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint: function ( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t},\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt: function ( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t},\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints: function ( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints: function ( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\t// Get total curve arc length\n\n\tgetLength: function () {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t},\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = this.arcLengthDivisions;\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t},\n\n\tupdateArcLengths: function () {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t},\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping: function ( u, distance ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t},\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent: function ( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t},\n\n\tgetTangentAt: function ( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t},\n\n\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\t\t\ttangents[ i ].normalize();\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( MathUtils.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( MathUtils.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'EllipseCurve';\n\n\tthis.aX = aX || 0;\n\tthis.aY = aY || 0;\n\n\tthis.xRadius = xRadius || 1;\n\tthis.yRadius = yRadius || 1;\n\n\tthis.aStartAngle = aStartAngle || 0;\n\tthis.aEndAngle = aEndAngle || 2 * Math.PI;\n\n\tthis.aClockwise = aClockwise || false;\n\n\tthis.aRotation = aRotation || 0;\n\n}\n\nEllipseCurve.prototype = Object.create( Curve.prototype );\nEllipseCurve.prototype.constructor = EllipseCurve;\n\nEllipseCurve.prototype.isEllipseCurve = true;\n\nEllipseCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tconst point = optionalTarget || new Vector2();\n\n\tconst twoPi = Math.PI * 2;\n\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t// ensures that deltaAngle is 0 .. 2 PI\n\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\tif ( samePoints ) {\n\n\t\t\tdeltaAngle = 0;\n\n\t\t} else {\n\n\t\t\tdeltaAngle = twoPi;\n\n\t\t}\n\n\t}\n\n\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\tdeltaAngle = - twoPi;\n\n\t\t} else {\n\n\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t}\n\n\t}\n\n\tconst angle = this.aStartAngle + t * deltaAngle;\n\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\tif ( this.aRotation !== 0 ) {\n\n\t\tconst cos = Math.cos( this.aRotation );\n\t\tconst sin = Math.sin( this.aRotation );\n\n\t\tconst tx = x - this.aX;\n\t\tconst ty = y - this.aY;\n\n\t\t// Rotate the point about the center of the ellipse.\n\t\tx = tx * cos - ty * sin + this.aX;\n\t\ty = tx * sin + ty * cos + this.aY;\n\n\t}\n\n\treturn point.set( x, y );\n\n};\n\nEllipseCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.aX = source.aX;\n\tthis.aY = source.aY;\n\n\tthis.xRadius = source.xRadius;\n\tthis.yRadius = source.yRadius;\n\n\tthis.aStartAngle = source.aStartAngle;\n\tthis.aEndAngle = source.aEndAngle;\n\n\tthis.aClockwise = source.aClockwise;\n\n\tthis.aRotation = source.aRotation;\n\n\treturn this;\n\n};\n\n\nEllipseCurve.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.aX = this.aX;\n\tdata.aY = this.aY;\n\n\tdata.xRadius = this.xRadius;\n\tdata.yRadius = this.yRadius;\n\n\tdata.aStartAngle = this.aStartAngle;\n\tdata.aEndAngle = this.aEndAngle;\n\n\tdata.aClockwise = this.aClockwise;\n\n\tdata.aRotation = this.aRotation;\n\n\treturn data;\n\n};\n\nEllipseCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.aX = json.aX;\n\tthis.aY = json.aY;\n\n\tthis.xRadius = json.xRadius;\n\tthis.yRadius = json.yRadius;\n\n\tthis.aStartAngle = json.aStartAngle;\n\tthis.aEndAngle = json.aEndAngle;\n\n\tthis.aClockwise = json.aClockwise;\n\n\tthis.aRotation = json.aRotation;\n\n\treturn this;\n\n};\n\nfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\tthis.type = 'ArcCurve';\n\n}\n\nArcCurve.prototype = Object.create( EllipseCurve.prototype );\nArcCurve.prototype.constructor = ArcCurve;\n\nArcCurve.prototype.isArcCurve = true;\n\n/**\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = new Vector3();\nconst px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly();\n\nfunction CatmullRomCurve3( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CatmullRomCurve3';\n\n\tthis.points = points;\n\tthis.closed = closed;\n\tthis.curveType = curveType;\n\tthis.tension = tension;\n\n}\n\nCatmullRomCurve3.prototype = Object.create( Curve.prototype );\nCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\nCatmullRomCurve3.prototype.isCatmullRomCurve3 = true;\n\nCatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget = new Vector3() ) {\n\n\tconst point = optionalTarget;\n\n\tconst points = this.points;\n\tconst l = points.length;\n\n\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\tlet intPoint = Math.floor( p );\n\tlet weight = p - intPoint;\n\n\tif ( this.closed ) {\n\n\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\tintPoint = l - 2;\n\t\tweight = 1;\n\n\t}\n\n\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\tif ( this.closed || intPoint > 0 ) {\n\n\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t} else {\n\n\t\t// extrapolate first point\n\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\tp0 = tmp;\n\n\t}\n\n\tconst p1 = points[ intPoint % l ];\n\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t} else {\n\n\t\t// extrapolate last point\n\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\tp3 = tmp;\n\n\t}\n\n\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t// init Centripetal / Chordal Catmull-Rom\n\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t// safety check for repeated points\n\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t}\n\n\tpoint.set(\n\t\tpx.calc( weight ),\n\t\tpy.calc( weight ),\n\t\tpz.calc( weight )\n\t);\n\n\treturn point;\n\n};\n\nCatmullRomCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.points = [];\n\n\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\tconst point = source.points[ i ];\n\n\t\tthis.points.push( point.clone() );\n\n\t}\n\n\tthis.closed = source.closed;\n\tthis.curveType = source.curveType;\n\tthis.tension = source.tension;\n\n\treturn this;\n\n};\n\nCatmullRomCurve3.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.points = [];\n\n\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\tconst point = this.points[ i ];\n\t\tdata.points.push( point.toArray() );\n\n\t}\n\n\tdata.closed = this.closed;\n\tdata.curveType = this.curveType;\n\tdata.tension = this.tension;\n\n\treturn data;\n\n};\n\nCatmullRomCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.points = [];\n\n\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\tconst point = json.points[ i ];\n\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t}\n\n\tthis.closed = json.closed;\n\tthis.curveType = json.curveType;\n\tthis.tension = json.tension;\n\n\treturn this;\n\n};\n\n/**\n * Bezier Curves formulas obtained from\n * http://en.wikipedia.org/wiki/Bézier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nfunction CubicBezierCurve( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CubicBezierCurve';\n\n\tthis.v0 = v0;\n\tthis.v1 = v1;\n\tthis.v2 = v2;\n\tthis.v3 = v3;\n\n}\n\nCubicBezierCurve.prototype = Object.create( Curve.prototype );\nCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\nCubicBezierCurve.prototype.isCubicBezierCurve = true;\n\nCubicBezierCurve.prototype.getPoint = function ( t, optionalTarget = new Vector2() ) {\n\n\tconst point = optionalTarget;\n\n\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\tpoint.set(\n\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t);\n\n\treturn point;\n\n};\n\nCubicBezierCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\tthis.v3.copy( source.v3 );\n\n\treturn this;\n\n};\n\nCubicBezierCurve.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\tdata.v3 = this.v3.toArray();\n\n\treturn data;\n\n};\n\nCubicBezierCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\tthis.v3.fromArray( json.v3 );\n\n\treturn this;\n\n};\n\nfunction CubicBezierCurve3( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CubicBezierCurve3';\n\n\tthis.v0 = v0;\n\tthis.v1 = v1;\n\tthis.v2 = v2;\n\tthis.v3 = v3;\n\n}\n\nCubicBezierCurve3.prototype = Object.create( Curve.prototype );\nCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\nCubicBezierCurve3.prototype.isCubicBezierCurve3 = true;\n\nCubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget = new Vector3() ) {\n\n\tconst point = optionalTarget;\n\n\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\tpoint.set(\n\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t);\n\n\treturn point;\n\n};\n\nCubicBezierCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\tthis.v3.copy( source.v3 );\n\n\treturn this;\n\n};\n\nCubicBezierCurve3.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\tdata.v3 = this.v3.toArray();\n\n\treturn data;\n\n};\n\nCubicBezierCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\tthis.v3.fromArray( json.v3 );\n\n\treturn this;\n\n};\n\nfunction LineCurve( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'LineCurve';\n\n\tthis.v1 = v1;\n\tthis.v2 = v2;\n\n}\n\nLineCurve.prototype = Object.create( Curve.prototype );\nLineCurve.prototype.constructor = LineCurve;\n\nLineCurve.prototype.isLineCurve = true;\n\nLineCurve.prototype.getPoint = function ( t, optionalTarget = new Vector2() ) {\n\n\tconst point = optionalTarget;\n\n\tif ( t === 1 ) {\n\n\t\tpoint.copy( this.v2 );\n\n\t} else {\n\n\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t}\n\n\treturn point;\n\n};\n\n// Line curve is linear, so we can overwrite default getPointAt\n\nLineCurve.prototype.getPointAt = function ( u, optionalTarget ) {\n\n\treturn this.getPoint( u, optionalTarget );\n\n};\n\nLineCurve.prototype.getTangent = function ( t, optionalTarget ) {\n\n\tconst tangent = optionalTarget || new Vector2();\n\n\ttangent.copy( this.v2 ).sub( this.v1 ).normalize();\n\n\treturn tangent;\n\n};\n\nLineCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nLineCurve.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nLineCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction LineCurve3( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'LineCurve3';\n\n\tthis.v1 = v1;\n\tthis.v2 = v2;\n\n}\n\nLineCurve3.prototype = Object.create( Curve.prototype );\nLineCurve3.prototype.constructor = LineCurve3;\n\nLineCurve3.prototype.isLineCurve3 = true;\n\nLineCurve3.prototype.getPoint = function ( t, optionalTarget = new Vector3() ) {\n\n\tconst point = optionalTarget;\n\n\tif ( t === 1 ) {\n\n\t\tpoint.copy( this.v2 );\n\n\t} else {\n\n\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t}\n\n\treturn point;\n\n};\n\n// Line curve is linear, so we can overwrite default getPointAt\n\nLineCurve3.prototype.getPointAt = function ( u, optionalTarget ) {\n\n\treturn this.getPoint( u, optionalTarget );\n\n};\n\nLineCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nLineCurve3.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nLineCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction QuadraticBezierCurve( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'QuadraticBezierCurve';\n\n\tthis.v0 = v0;\n\tthis.v1 = v1;\n\tthis.v2 = v2;\n\n}\n\nQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\nQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\nQuadraticBezierCurve.prototype.isQuadraticBezierCurve = true;\n\nQuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget = new Vector2() ) {\n\n\tconst point = optionalTarget;\n\n\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\tpoint.set(\n\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t);\n\n\treturn point;\n\n};\n\nQuadraticBezierCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nQuadraticBezierCurve.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nQuadraticBezierCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction QuadraticBezierCurve3( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'QuadraticBezierCurve3';\n\n\tthis.v0 = v0;\n\tthis.v1 = v1;\n\tthis.v2 = v2;\n\n}\n\nQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\nQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\nQuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true;\n\nQuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget = new Vector3() ) {\n\n\tconst point = optionalTarget;\n\n\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\tpoint.set(\n\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t);\n\n\treturn point;\n\n};\n\nQuadraticBezierCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nQuadraticBezierCurve3.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nQuadraticBezierCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction SplineCurve( points = [] ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'SplineCurve';\n\n\tthis.points = points;\n\n}\n\nSplineCurve.prototype = Object.create( Curve.prototype );\nSplineCurve.prototype.constructor = SplineCurve;\n\nSplineCurve.prototype.isSplineCurve = true;\n\nSplineCurve.prototype.getPoint = function ( t, optionalTarget = new Vector2() ) {\n\n\tconst point = optionalTarget;\n\n\tconst points = this.points;\n\tconst p = ( points.length - 1 ) * t;\n\n\tconst intPoint = Math.floor( p );\n\tconst weight = p - intPoint;\n\n\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\tconst p1 = points[ intPoint ];\n\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\tpoint.set(\n\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t);\n\n\treturn point;\n\n};\n\nSplineCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.points = [];\n\n\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\tconst point = source.points[ i ];\n\n\t\tthis.points.push( point.clone() );\n\n\t}\n\n\treturn this;\n\n};\n\nSplineCurve.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.points = [];\n\n\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\tconst point = this.points[ i ];\n\t\tdata.points.push( point.toArray() );\n\n\t}\n\n\treturn data;\n\n};\n\nSplineCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.points = [];\n\n\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\tconst point = json.points[ i ];\n\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t}\n\n\treturn this;\n\n};\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n * curves, but retains the api of a curve\n **************************************************************/\n\nfunction CurvePath() {\n\n\tCurve.call( this );\n\n\tthis.type = 'CurvePath';\n\n\tthis.curves = [];\n\tthis.autoClose = false; // Automatically closes the path\n\n}\n\nCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\tconstructor: CurvePath,\n\n\tadd: function ( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t},\n\n\tclosePath: function () {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t}\n\n\t},\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint: function ( t ) {\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tCurve.prototype.copy.call( this, source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = Curve.prototype.toJSON.call( this );\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tCurve.prototype.fromJSON.call( this, json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction Path( points ) {\n\n\tCurvePath.call( this );\n\n\tthis.type = 'Path';\n\n\tthis.currentPoint = new Vector2();\n\n\tif ( points ) {\n\n\t\tthis.setFromPoints( points );\n\n\t}\n\n}\n\nPath.prototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\tconstructor: Path,\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tmoveTo: function ( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t},\n\n\tlineTo: function ( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t},\n\n\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t},\n\n\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t},\n\n\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t},\n\n\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t},\n\n\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t},\n\n\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t},\n\n\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tCurvePath.prototype.copy.call( this, source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = CurvePath.prototype.toJSON.call( this );\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tCurvePath.prototype.fromJSON.call( this, json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction Shape( points ) {\n\n\tPath.call( this, points );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.type = 'Shape';\n\n\tthis.holes = [];\n\n}\n\nShape.prototype = Object.assign( Object.create( Path.prototype ), {\n\n\tconstructor: Shape,\n\n\tgetPointsHoles: function ( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t},\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints: function ( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tPath.prototype.copy.call( this, source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = Path.prototype.toJSON.call( this );\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tPath.prototype.fromJSON.call( this, json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction Light( color, intensity = 1 ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Light';\n\n\tthis.color = new Color( color );\n\tthis.intensity = intensity;\n\n}\n\nLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Light,\n\n\tisLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\tLight.call( this, skyColor, intensity );\n\n\tthis.type = 'HemisphereLight';\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.groundColor = new Color( groundColor );\n\n}\n\nHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: HemisphereLight,\n\n\tisHemisphereLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction LightShadow( camera ) {\n\n\tthis.camera = camera;\n\n\tthis.bias = 0;\n\tthis.normalBias = 0;\n\tthis.radius = 1;\n\n\tthis.mapSize = new Vector2( 512, 512 );\n\n\tthis.map = null;\n\tthis.mapPass = null;\n\tthis.matrix = new Matrix4();\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis._frustum = new Frustum();\n\tthis._frameExtents = new Vector2( 1, 1 );\n\n\tthis._viewportCount = 1;\n\n\tthis._viewports = [\n\n\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t];\n\n}\n\nObject.assign( LightShadow.prototype, {\n\n\t_projScreenMatrix: new Matrix4(),\n\n\t_lightPositionWorld: new Vector3(),\n\n\t_lookTarget: new Vector3(),\n\n\tgetViewportCount: function () {\n\n\t\treturn this._viewportCount;\n\n\t},\n\n\tgetFrustum: function () {\n\n\t\treturn this._frustum;\n\n\t},\n\n\tupdateMatrices: function ( light ) {\n\n\t\tconst shadowCamera = this.camera,\n\t\t\tshadowMatrix = this.matrix,\n\t\t\tprojScreenMatrix = this._projScreenMatrix,\n\t\t\tlookTarget = this._lookTarget,\n\t\t\tlightPositionWorld = this._lightPositionWorld;\n\n\t\tlightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( lightPositionWorld );\n\n\t\tlookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( lookTarget );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\tprojScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( projScreenMatrix );\n\n\t\tshadowMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t},\n\n\tgetViewport: function ( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t},\n\n\tgetFrameExtents: function () {\n\n\t\treturn this._frameExtents;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst object = {};\n\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n} );\n\nfunction SpotLightShadow() {\n\n\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\tthis.focus = 1;\n\n}\n\nSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: SpotLightShadow,\n\n\tisSpotLightShadow: true,\n\n\tupdateMatrices: function ( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = MathUtils.RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = this.mapSize.width / this.mapSize.height;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tLightShadow.prototype.updateMatrices.call( this, light );\n\n\t}\n\n} );\n\nfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'SpotLight';\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.target = new Object3D();\n\n\tObject.defineProperty( this, 'power', {\n\t\tget: function () {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\treturn this.intensity * Math.PI;\n\n\t\t},\n\t\tset: function ( power ) {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\tthis.intensity = power / Math.PI;\n\n\t\t}\n\t} );\n\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\tthis.shadow = new SpotLightShadow();\n\n}\n\nSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: SpotLight,\n\n\tisSpotLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction PointLightShadow() {\n\n\tLightShadow.call( this, new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\tthis._frameExtents = new Vector2( 4, 2 );\n\n\tthis._viewportCount = 6;\n\n\tthis._viewports = [\n\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t// following orientation:\n\t\t//\n\t\t// xzXZ\n\t\t// y Y\n\t\t//\n\t\t// X - Positive x direction\n\t\t// x - Negative x direction\n\t\t// Y - Positive y direction\n\t\t// y - Negative y direction\n\t\t// Z - Positive z direction\n\t\t// z - Negative z direction\n\n\t\t// positive X\n\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t// negative X\n\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t// positive Z\n\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t// negative Z\n\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t// positive Y\n\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t// negative Y\n\t\tnew Vector4( 1, 0, 1, 1 )\n\t];\n\n\tthis._cubeDirections = [\n\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t];\n\n\tthis._cubeUps = [\n\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t];\n\n}\n\nPointLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: PointLightShadow,\n\n\tisPointLightShadow: true,\n\n\tupdateMatrices: function ( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera,\n\t\t\tshadowMatrix = this.matrix,\n\t\t\tlightPositionWorld = this._lightPositionWorld,\n\t\t\tlookTarget = this._lookTarget,\n\t\t\tprojScreenMatrix = this._projScreenMatrix;\n\n\t\tlightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( lightPositionWorld );\n\n\t\tlookTarget.copy( camera.position );\n\t\tlookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - lightPositionWorld.x, - lightPositionWorld.y, - lightPositionWorld.z );\n\n\t\tprojScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( projScreenMatrix );\n\n\t}\n\n} );\n\nfunction PointLight( color, intensity, distance, decay ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'PointLight';\n\n\tObject.defineProperty( this, 'power', {\n\t\tget: function () {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t},\n\t\tset: function ( power ) {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t\t}\n\t} );\n\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\tthis.shadow = new PointLightShadow();\n\n}\n\nPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: PointLight,\n\n\tisPointLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction OrthographicCamera( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) {\n\n\tCamera.call( this );\n\n\tthis.type = 'OrthographicCamera';\n\n\tthis.zoom = 1;\n\tthis.view = null;\n\n\tthis.left = left;\n\tthis.right = right;\n\tthis.top = top;\n\tthis.bottom = bottom;\n\n\tthis.near = near;\n\tthis.far = far;\n\n\tthis.updateProjectionMatrix();\n\n}\n\nOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\tconstructor: OrthographicCamera,\n\n\tisOrthographicCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t},\n\n\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tclearViewOffset: function () {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tupdateProjectionMatrix: function () {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction DirectionalLightShadow() {\n\n\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n}\n\nDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: DirectionalLightShadow,\n\n\tisDirectionalLightShadow: true,\n\n\tupdateMatrices: function ( light ) {\n\n\t\tLightShadow.prototype.updateMatrices.call( this, light );\n\n\t}\n\n} );\n\nfunction DirectionalLight( color, intensity ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'DirectionalLight';\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.target = new Object3D();\n\n\tthis.shadow = new DirectionalLightShadow();\n\n}\n\nDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: DirectionalLight,\n\n\tisDirectionalLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction AmbientLight( color, intensity ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'AmbientLight';\n\n}\n\nAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: AmbientLight,\n\n\tisAmbientLight: true\n\n} );\n\nfunction RectAreaLight( color, intensity, width, height ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'RectAreaLight';\n\n\tthis.width = ( width !== undefined ) ? width : 10;\n\tthis.height = ( height !== undefined ) ? height : 10;\n\n}\n\nRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: RectAreaLight,\n\n\tisRectAreaLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Light.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * Primary reference:\n * https://graphics.stanford.edu/papers/envmap/envmap.pdf\n *\n * Secondary reference:\n * https://www.ppsloan.org/publications/StupidSH36.pdf\n */\n\n// 3-band SH defined by 9 coefficients\n\nclass SphericalHarmonics3 {\n\n\tconstructor() {\n\n\t\tObject.defineProperty( this, 'isSphericalHarmonics3', { value: true } );\n\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// get the radiance in the direction of the normal\n\t// target is a Vector3\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t// get the irradiance (radiance convolved with cosine lobe) in the direction of the normal\n\t// target is a Vector3\n\t// https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t// evaluate the basis functions\n\t// shBasis is an Array[ 9 ]\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\nfunction LightProbe( sh, intensity ) {\n\n\tLight.call( this, undefined, intensity );\n\n\tthis.type = 'LightProbe';\n\n\tthis.sh = ( sh !== undefined ) ? sh : new SphericalHarmonics3();\n\n}\n\nLightProbe.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: LightProbe,\n\n\tisLightProbe: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Light.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction MaterialLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n\tthis.textures = {};\n\n}\n\nMaterialLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: MaterialLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = new Materials[ json.type ]();\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = new Color().setHex( json.sheen );\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== 1 ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\t\tif ( json.morphNormals !== undefined ) material.morphNormals = json.morphNormals;\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.vertexTangents !== undefined ) material.vertexTangents = json.vertexTangents;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Deprecated\n\n\t\tif ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\n\t\treturn material;\n\n\t},\n\n\tsetTextures: function ( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n} );\n\nconst LoaderUtils = {\n\n\tdecodeText: function ( array ) {\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tlet s = '';\n\n\t\tfor ( let i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent( escape( s ) );\n\n\t\t} catch ( e ) { // see #16358\n\n\t\t\treturn s;\n\n\t\t}\n\n\t},\n\n\textractUrlBase: function ( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === - 1 ) return './';\n\n\t\treturn url.substr( 0, index + 1 );\n\n\t}\n\n};\n\nfunction InstancedBufferGeometry() {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'InstancedBufferGeometry';\n\tthis.instanceCount = Infinity;\n\n}\n\nInstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), {\n\n\tconstructor: InstancedBufferGeometry,\n\n\tisInstancedBufferGeometry: true,\n\n\tcopy: function ( source ) {\n\n\t\tBufferGeometry.prototype.copy.call( this, source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = BufferGeometry.prototype.toJSON.call( this );\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction InstancedBufferAttribute( array, itemSize, normalized, meshPerAttribute ) {\n\n\tif ( typeof ( normalized ) === 'number' ) {\n\n\t\tmeshPerAttribute = normalized;\n\n\t\tnormalized = false;\n\n\t\tconsole.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' );\n\n\t}\n\n\tBufferAttribute.call( this, array, itemSize, normalized );\n\n\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n}\n\nInstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), {\n\n\tconstructor: InstancedBufferAttribute,\n\n\tisInstancedBufferAttribute: true,\n\n\tcopy: function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ()\t{\n\n\t\tconst data = BufferAttribute.prototype.toJSON.call( this );\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction BufferGeometryLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nBufferGeometryLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: BufferGeometryLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tconst center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n} );\n\nclass ObjectLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ] instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\t\tlet geometryShapes;\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\tcase 'DodecahedronBufferGeometry':\n\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\tcase 'IcosahedronBufferGeometry':\n\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\tcase 'OctahedronBufferGeometry':\n\t\t\t\t\tcase 'TetrahedronGeometry':\n\t\t\t\t\tcase 'TetrahedronBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TubeGeometry':\n\t\t\t\t\tcase 'TubeBufferGeometry':\n\n\t\t\t\t\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t\t\t\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.closed\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PolyhedronGeometry':\n\t\t\t\t\tcase 'PolyhedronBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.vertices,\n\t\t\t\t\t\t\tdata.indices,\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.details\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ShapeGeometry':\n\t\t\t\t\tcase 'ShapeBufferGeometry':\n\n\t\t\t\t\t\tgeometryShapes = [];\n\n\t\t\t\t\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\t\t\t\t\tgeometryShapes.push( shape );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tgeometryShapes,\n\t\t\t\t\t\t\tdata.curveSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t\tcase 'ExtrudeGeometry':\n\t\t\t\t\tcase 'ExtrudeBufferGeometry':\n\n\t\t\t\t\t\tgeometryShapes = [];\n\n\t\t\t\t\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\t\t\t\t\tgeometryShapes.push( shape );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst extrudePath = data.options.extrudePath;\n\n\t\t\t\t\t\tif ( extrudePath !== undefined ) {\n\n\t\t\t\t\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tgeometryShapes,\n\t\t\t\t\t\t\tdata.options\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: Loading \"Geometry\" is not supported anymore.' );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.type === 'MultiMaterial' ) {\n\n\t\t\t\t\t// Deprecated\n\n\t\t\t\t\tconst array = [];\n\n\t\t\t\t\tfor ( let j = 0; j < data.materials.length; j ++ ) {\n\n\t\t\t\t\t\tconst material = data.materials[ j ];\n\n\t\t\t\t\t\tif ( cache[ material.uuid ] === undefined ) {\n\n\t\t\t\t\t\t\tcache[ material.uuid ] = loader.parse( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tarray.push( cache[ material.uuid ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = array;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\timages[ image.uuid ] = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timages[ image.uuid ].push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timages[ image.uuid ].push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\n\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\timages[ image.uuid ] = deserializedImage;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tlet texture;\n\t\t\t\tconst image = images[ data.image ];\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture( image );\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture( image.data, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture( image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.encoding !== undefined ) texture.encoding = data.encoding;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new BufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/* DEPRECATED */\n\n\tsetTexturePath( value ) {\n\n\t\tconsole.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' );\n\t\treturn this.setResourcePath( value );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\tCubeUVRefractionMapping: CubeUVRefractionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nfunction ImageBitmapLoader( manager ) {\n\n\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t}\n\n\tif ( typeof fetch === 'undefined' ) {\n\n\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t}\n\n\tLoader.call( this, manager );\n\n\tthis.options = { premultiplyAlpha: 'none' };\n\n}\n\nImageBitmapLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: ImageBitmapLoader,\n\n\tisImageBitmapLoader: true,\n\n\tsetOptions: function setOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t},\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\n\t\tfetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, scope.options );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n} );\n\nfunction ShapePath() {\n\n\tthis.type = 'ShapePath';\n\n\tthis.color = new Color();\n\n\tthis.subPaths = [];\n\tthis.currentPath = null;\n\n}\n\nObject.assign( ShapePath.prototype, {\n\n\tmoveTo: function ( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t},\n\n\tlineTo: function ( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t},\n\n\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t},\n\n\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t},\n\n\tsplineThru: function ( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t},\n\n\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tconst toChange = [];\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\n\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n} );\n\nfunction Font( data ) {\n\n\tthis.type = 'Font';\n\n\tthis.data = data;\n\n}\n\nObject.assign( Font.prototype, {\n\n\tisFont: true,\n\n\tgenerateShapes: function ( text, size = 100 ) {\n\n\t\tconst shapes = [];\n\t\tconst paths = createPaths( text, size, this.data );\n\n\t\tfor ( let p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n} );\n\nfunction createPaths( text, size, data ) {\n\n\tconst chars = Array.from ? Array.from( text ) : String( text ).split( '' ); // workaround for IE11, see #13988\n\tconst scale = size / data.resolution;\n\tconst line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tconst paths = [];\n\n\tlet offsetX = 0, offsetY = 0;\n\n\tfor ( let i = 0; i < chars.length; i ++ ) {\n\n\t\tconst char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tconst ret = createPath( char, scale, offsetX, offsetY, data );\n\t\t\toffsetX += ret.offsetX;\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, scale, offsetX, offsetY, data ) {\n\n\tconst glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) {\n\n\t\tconsole.error( 'THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.' );\n\n\t\treturn;\n\n\t}\n\n\tconst path = new ShapePath();\n\n\tlet x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tconst outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( let i = 0, l = outline.length; i < l; ) {\n\n\t\t\tconst action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\nfunction FontLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nFontLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: FontLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t}\n\n\t\t\tconst font = scope.parse( json );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\treturn new Font( json );\n\n\t}\n\n} );\n\nlet _context;\n\nconst AudioContext = {\n\n\tgetContext: function () {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t},\n\n\tsetContext: function ( value ) {\n\n\t\t_context = value;\n\n\t}\n\n};\n\nfunction AudioLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nAudioLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: AudioLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n} );\n\nfunction HemisphereLightProbe( skyColor, groundColor, intensity ) {\n\n\tLightProbe.call( this, undefined, intensity );\n\n\tconst color1 = new Color().set( skyColor );\n\tconst color2 = new Color().set( groundColor );\n\n\tconst sky = new Vector3( color1.r, color1.g, color1.b );\n\tconst ground = new Vector3( color2.r, color2.g, color2.b );\n\n\t// without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI );\n\tconst c0 = Math.sqrt( Math.PI );\n\tconst c1 = c0 * Math.sqrt( 0.75 );\n\n\tthis.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 );\n\tthis.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 );\n\n}\n\nHemisphereLightProbe.prototype = Object.assign( Object.create( LightProbe.prototype ), {\n\n\tconstructor: HemisphereLightProbe,\n\n\tisHemisphereLightProbe: true,\n\n\tcopy: function ( source ) { // modifying colors not currently supported\n\n\t\tLightProbe.prototype.copy.call( this, source );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = LightProbe.prototype.toJSON.call( this, meta );\n\n\t\t// data.sh = this.sh.toArray(); // todo\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction AmbientLightProbe( color, intensity ) {\n\n\tLightProbe.call( this, undefined, intensity );\n\n\tconst color1 = new Color().set( color );\n\n\t// without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI );\n\tthis.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) );\n\n}\n\nAmbientLightProbe.prototype = Object.assign( Object.create( LightProbe.prototype ), {\n\n\tconstructor: AmbientLightProbe,\n\n\tisAmbientLightProbe: true,\n\n\tcopy: function ( source ) { // modifying color not currently supported\n\n\t\tLightProbe.prototype.copy.call( this, source );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = LightProbe.prototype.toJSON.call( this, meta );\n\n\t\t// data.sh = this.sh.toArray(); // todo\n\n\t\treturn data;\n\n\t}\n\n} );\n\nconst _eyeRight = new Matrix4();\nconst _eyeLeft = new Matrix4();\n\nfunction StereoCamera() {\n\n\tthis.type = 'StereoCamera';\n\n\tthis.aspect = 1;\n\n\tthis.eyeSep = 0.064;\n\n\tthis.cameraL = new PerspectiveCamera();\n\tthis.cameraL.layers.enable( 1 );\n\tthis.cameraL.matrixAutoUpdate = false;\n\n\tthis.cameraR = new PerspectiveCamera();\n\tthis.cameraR.layers.enable( 2 );\n\tthis.cameraR.matrixAutoUpdate = false;\n\n\tthis._cache = {\n\t\tfocus: null,\n\t\tfov: null,\n\t\taspect: null,\n\t\tnear: null,\n\t\tfar: null,\n\t\tzoom: null,\n\t\teyeSep: null\n\t};\n\n}\n\nObject.assign( StereoCamera.prototype, {\n\n\tupdate: function ( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\tconst projectionMatrix = camera.projectionMatrix.clone();\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( MathUtils.DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\tprojectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\tprojectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n} );\n\nclass Clock {\n\n\tconstructor( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tstart() {\n\n\t\tthis.startTime = now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nfunction now() {\n\n\treturn ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n}\n\nconst _position$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\nclass AudioListener extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\t\tconst up = this.up;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$2, _quaternion$3, _scale$1 );\n\n\t\t_orientation.set( 0, 0, - 1 ).applyQuaternion( _quaternion$3 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$2.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$2.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$2.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _orientation.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$2.x, _position$2.y, _position$2.z );\n\t\t\tlistener.setOrientation( _orientation.x, _orientation.y, _orientation.z, up.x, up.y, up.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass Audio extends Object3D {\n\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.listener = listener;\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.detune = 0;\n\t\tthis.loop = false;\n\t\tthis.loopStart = 0;\n\t\tthis.loopEnd = 0;\n\t\tthis.offset = 0;\n\t\tthis.duration = undefined;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.source = null;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\tthis.filters = [];\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tthis.source.stop();\n\t\tthis.source.onended = null;\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.source.detune === undefined ) return; // only set detune when available\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\n\t}\n\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _orientation$1 = /*@__PURE__*/ new Vector3();\n\nclass PositionalAudio extends Audio {\n\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$4, _scale$2 );\n\n\t\t_orientation$1.set( 0, 0, 1 ).applyQuaternion( _quaternion$4 );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position$3.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position$3.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position$3.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation$1.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation$1.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation$1.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position$3.x, _position$3.y, _position$3.z );\n\t\t\tpanner.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass AudioAnalyser {\n\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\nfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\tthis.binding = binding;\n\tthis.valueSize = valueSize;\n\n\tlet mixFunction,\n\t\tmixFunctionAdditive,\n\t\tsetIdentity;\n\n\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t//\n\t// interpolators can use .buffer as their .result\n\t// the data then goes to 'incoming'\n\t//\n\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t// the cumulative result and are compared to detect\n\t// changes\n\t//\n\t// 'orig' stores the original state of the property\n\t//\n\t// 'add' is used for additive cumulative results\n\t//\n\t// 'work' is optional and is only present for quaternion types. It is used\n\t// to store intermediate quaternion multiplication results\n\n\tswitch ( typeName ) {\n\n\t\tcase 'quaternion':\n\t\t\tmixFunction = this._slerp;\n\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\tthis._workIndex = 5;\n\t\t\tbreak;\n\n\t\tcase 'string':\n\t\tcase 'bool':\n\t\t\tmixFunction = this._select;\n\n\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t// additive is not relevant for non-numeric types\n\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tmixFunction = this._lerp;\n\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t}\n\n\tthis._mixBufferRegion = mixFunction;\n\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\tthis._setIdentity = setIdentity;\n\tthis._origIndex = 3;\n\tthis._addIndex = 4;\n\n\tthis.cumulativeWeight = 0;\n\tthis.cumulativeWeightAdditive = 0;\n\n\tthis.useCount = 0;\n\tthis.referenceCount = 0;\n\n}\n\nObject.assign( PropertyMixer.prototype, {\n\n\t// accumulate data in the 'incoming' region into 'accu'\n\taccumulate: function ( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t},\n\n\t// accumulate data in the 'incoming' region into 'add'\n\taccumulateAdditive: function ( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t},\n\n\t// apply the state of 'accu' to the binding when accus differ\n\tapply: function ( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState: function () {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t},\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState: function () {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t},\n\n\t_setAdditiveIdentityNumeric: function () {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t},\n\n\t_setAdditiveIdentityQuaternion: function () {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t},\n\n\t_setAdditiveIdentityOther: function () {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t},\n\n\n\t// mix functions\n\n\t_select: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_slerp: function ( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t},\n\n\t_slerpAdditive: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t},\n\n\t_lerp: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t},\n\n\t_lerpAdditive: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n} );\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones' ];\n\nfunction Composite( targetGroup, path, optionalParsedPath ) {\n\n\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\tthis._targetGroup = targetGroup;\n\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n}\n\nObject.assign( Composite.prototype, {\n\n\tgetValue: function ( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t},\n\n\tsetValue: function ( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t},\n\n\tbind: function () {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t},\n\n\tunbind: function () {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n} );\n\n\nfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\tthis.path = path;\n\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;\n\n\tthis.rootNode = rootNode;\n\n}\n\nObject.assign( PropertyBinding, {\n\n\tComposite: Composite,\n\n\tcreate: function ( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t},\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tsanitizeNodeName: function ( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t},\n\n\tparseTrackName: function ( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== - 1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t},\n\n\tfindNode: function ( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n} );\n\nObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable: function () {},\n\t_setValue_unavailable: function () {},\n\n\tBindingType: {\n\t\tDirect: 0,\n\t\tEntireArray: 1,\n\t\tArrayElement: 2,\n\t\tHasFromToArray: 3\n\t},\n\n\tVersioning: {\n\t\tNone: 0,\n\t\tNeedsUpdate: 1,\n\t\tMatrixWorldNeedsUpdate: 2\n\t},\n\n\tGetterByBindingType: [\n\n\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t},\n\n\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\tconst source = this.resolvedProperty;\n\n\t\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t}\n\n\t\t},\n\n\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t},\n\n\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t}\n\n\t],\n\n\tSetterByBindingTypeAndVersioning: [\n\n\t\t[\n\t\t\t// Direct\n\n\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t},\n\n\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// EntireArray\n\n\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\tconst dest = this.resolvedProperty;\n\n\t\t\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tconst dest = this.resolvedProperty;\n\n\t\t\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tconst dest = this.resolvedProperty;\n\n\t\t\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// ArrayElement\n\n\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t},\n\n\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// HasToFromArray\n\n\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t},\n\n\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t]\n\n\t],\n\n\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t// prototype version of these methods with one that represents\n\t\t// the bound state. When the property is not found, the methods\n\t\t// become no-ops.\n\n\t},\n\n\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t},\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind: function () {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\\'t found.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.geometry.isBufferGeometry ) {\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t},\n\n\tunbind: function () {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n} );\n\n// DECLARE ALIAS AFTER assign prototype\nObject.assign( PropertyBinding.prototype, {\n\n\t// initial state of these methods that calls 'bind'\n\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n} );\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n *\n * - Instead pass this object as 'root'.\n *\n * - You can also add and remove objects later when the mixer\n * is running.\n *\n * Note:\n *\n * Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done\n * on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the\n * all objects in the group.\n *\n * - A single property can either be controlled through a\n * target group or directly, but not both.\n */\n\nfunction AnimationObjectGroup() {\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\t// cached objects followed by the active ones\n\tthis._objects = Array.prototype.slice.call( arguments );\n\n\tthis.nCachedObjects_ = 0; // threshold\n\t// note: read by PropertyBinding.Composite\n\n\tconst indices = {};\n\tthis._indicesByUUID = indices; // for bookkeeping\n\n\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t}\n\n\tthis._paths = []; // inside: string\n\tthis._parsedPaths = []; // inside: { we don't care, here }\n\tthis._bindings = []; // inside: Array< PropertyBinding >\n\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\tconst scope = this;\n\n\tthis.stats = {\n\n\t\tobjects: {\n\t\t\tget total() {\n\n\t\t\t\treturn scope._objects.length;\n\n\t\t\t},\n\t\t\tget inUse() {\n\n\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t}\n\t\t},\n\t\tget bindingsPerObject() {\n\n\t\t\treturn scope._bindings.length;\n\n\t\t}\n\n\t};\n\n}\n\nObject.assign( AnimationObjectGroup.prototype, {\n\n\tisAnimationObjectGroup: true,\n\n\tadd: function () {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\tremove: function () {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\t// remove & forget\n\tuncache: function () {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_: function ( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t},\n\n\tunsubscribe_: function ( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n} );\n\nclass AnimationAction {\n\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = - 1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; // no. of repetitions when looping\n\n\t\tthis.paused = false; // true -> zero effective time scale\n\t\tthis.enabled = true; // false -> zero effective weight\n\n\t\tthis.clampWhenFinished = false;// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart = true;// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd = true;// clips for start, loop and end\n\n\t}\n\n\t// State & Scheduling\n\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = - 1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t// return true when play has been called\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\tcrossFadeFrom( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcrossFadeTo( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Object Accessors\n\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t}\n\n\t\t\t// start\n\n\t\t\tthis._startTime = null; // unschedule\n\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === - 1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? - 1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : - 1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction AnimationMixer( root ) {\n\n\tthis._root = root;\n\tthis._initMemoryManager();\n\tthis._accuIndex = 0;\n\n\tthis.time = 0;\n\n\tthis.timeScale = 1.0;\n\n}\n\nAnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: AnimationMixer,\n\n\t_bindAction: function ( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t},\n\n\t_activateAction: function ( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t},\n\n\t_deactivateAction: function ( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t},\n\n\t// Memory manager\n\n\t_initMemoryManager: function () {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t},\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction: function ( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t},\n\n\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t},\n\n\t_removeInactiveAction: function ( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t},\n\n\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_lendAction: function ( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t},\n\n\t_takeBackAction: function ( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t},\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t},\n\n\t_removeInactiveBinding: function ( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t},\n\n\t_lendBinding: function ( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t},\n\n\t_takeBackBinding: function ( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t},\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant: function () {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t},\n\n\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t},\n\n\t_controlInterpolantsResultBuffer: new Float32Array( 1 ),\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction: function ( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t},\n\n\t// get an existing action\n\texistingAction: function ( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction: function () {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// advance the time and update apply the animation\n\tupdate: function ( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// Allows you to seek to a specific time in an animation.\n\tsetTime: function ( timeInSeconds ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( timeInSeconds ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t},\n\n\t// return this mixer's root target object\n\tgetRoot: function () {\n\n\t\treturn this._root;\n\n\t},\n\n\t// free all resources specific to a particular clip\n\tuncacheClip: function ( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t},\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot: function ( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t// remove a targeted clip from the cache\n\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n} );\n\nclass Uniform {\n\n\tconstructor( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\tInterleavedBuffer.call( this, array, stride );\n\n\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n}\n\nInstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), {\n\n\tconstructor: InstancedInterleavedBuffer,\n\n\tisInstancedInterleavedBuffer: true,\n\n\tcopy: function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function ( data ) {\n\n\t\tconst ib = InterleavedBuffer.prototype.clone.call( this, data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t},\n\n\ttoJSON: function ( data ) {\n\n\t\tconst json = InterleavedBuffer.prototype.toJSON.call( this, data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n} );\n\nfunction GLBufferAttribute( buffer, type, itemSize, elementSize, count ) {\n\n\tthis.buffer = buffer;\n\tthis.type = type;\n\tthis.itemSize = itemSize;\n\tthis.elementSize = elementSize;\n\tthis.count = count;\n\n\tthis.version = 0;\n\n}\n\nObject.defineProperty( GLBufferAttribute.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nObject.assign( GLBufferAttribute.prototype, {\n\n\tisGLBufferAttribute: true,\n\n\tsetBuffer: function ( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t},\n\n\tsetType: function ( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t},\n\n\tsetItemSize: function ( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t},\n\n\tsetCount: function ( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t},\n\n} );\n\nfunction Raycaster( origin, direction, near, far ) {\n\n\tthis.ray = new Ray( origin, direction );\n\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\tthis.near = near || 0;\n\tthis.far = far || Infinity;\n\tthis.camera = null;\n\tthis.layers = new Layers();\n\n\tthis.params = {\n\t\tMesh: {},\n\t\tLine: { threshold: 1 },\n\t\tLOD: {},\n\t\tPoints: { threshold: 1 },\n\t\tSprite: {}\n\t};\n\n\tObject.defineProperties( this.params, {\n\t\tPointCloud: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\treturn this.Points;\n\n\t\t\t}\n\t\t}\n\t} );\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t}\n\n\tif ( recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\nObject.assign( Raycaster.prototype, {\n\n\tset: function ( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t},\n\n\tsetFromCamera: function ( coords, camera ) {\n\n\t\tif ( camera && camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera && camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t},\n\n\tintersectObject: function ( object, recursive, optionalTarget ) {\n\n\t\tconst intersects = optionalTarget || [];\n\n\t\tintersectObject( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t},\n\n\tintersectObjects: function ( objects, recursive, optionalTarget ) {\n\n\t\tconst intersects = optionalTarget || [];\n\n\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\treturn intersects;\n\n\t\t}\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n} );\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.\n * The azimuthal angle (theta) is measured from the positive z-axis.\n */\n\nclass Spherical {\n\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi; // polar angle\n\t\tthis.theta = theta; // azimuthal angle\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t// restrict phi to be betwee EPS and PI-EPS\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( MathUtils.clamp( y / this.radius, - 1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n */\n\nclass Cylindrical {\n\n\tconstructor( radius, theta, y ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$8 = /*@__PURE__*/ new Vector2();\n\nclass Box2 {\n\n\tconstructor( min, max ) {\n\n\t\tObject.defineProperty( this, 'isBox2', { value: true } );\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$8.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getCenter() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getSize() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getParameter() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector$8.copy( point ).clamp( this.min, this.max );\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nclass Line3 {\n\n\tconstructor( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .getCenter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\tdelta( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .delta() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\tat( t, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .at() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = MathUtils.clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n}\n\nfunction ImmediateRenderObject( material ) {\n\n\tObject3D.call( this );\n\n\tthis.material = material;\n\tthis.render = function ( /* renderCallback */ ) {};\n\n\tthis.hasPositions = false;\n\tthis.hasNormals = false;\n\tthis.hasColors = false;\n\tthis.hasUvs = false;\n\n\tthis.positionArray = null;\n\tthis.normalArray = null;\n\tthis.colorArray = null;\n\tthis.uvArray = null;\n\n\tthis.count = 0;\n\n}\n\nImmediateRenderObject.prototype = Object.create( Object3D.prototype );\nImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\nImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\n\nclass SpotLightHelper extends Object3D {\n\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t- 1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, - 1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateMatrixWorld();\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$9.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$9 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n\nclass SkeletonHelper extends LineSegments {\n\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst color1 = new Color( 0, 0, 1 );\n\t\tconst color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'SkeletonHelper';\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.root = object;\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$a.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$a.x, _vector$a.y, _vector$a.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$a.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$a.x, _vector$a.y, _vector$a.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object && object.isBone ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\nclass PointLightHelper extends Mesh {\n\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronBufferGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\nclass HemisphereLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tconst geometry = new OctahedronBufferGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tmesh.lookAt( _vector$b.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\nclass GridHelper extends LineSegments {\n\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n}\n\nclass PolarGridHelper extends LineSegments {\n\n\tconstructor( radius = 10, radials = 16, circles = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the radials\n\n\t\tfor ( let i = 0; i <= radials; i ++ ) {\n\n\t\t\tconst v = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( let i = 0; i <= circles; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / circles * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n}\n\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\nconst _v3$1 = /*@__PURE__*/ new Vector3();\n\nclass DirectionalLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\t_v1$6.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3$1.subVectors( _v2$3, _v1$6 );\n\n\t\tthis.lightPlane.lookAt( _v2$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2$3 );\n\t\tthis.targetLine.scale.z = _v3$1.length();\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n */\n\nclass CameraHelper extends LineSegments {\n\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2', colorFrustum );\n\t\taddLine( 'n2', 'n4', colorFrustum );\n\t\taddLine( 'n4', 'n3', colorFrustum );\n\t\taddLine( 'n3', 'n1', colorFrustum );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2', colorFrustum );\n\t\taddLine( 'f2', 'f4', colorFrustum );\n\t\taddLine( 'f4', 'f3', colorFrustum );\n\t\taddLine( 'f3', 'f1', colorFrustum );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1', colorFrustum );\n\t\taddLine( 'n2', 'f2', colorFrustum );\n\t\taddLine( 'n3', 'f3', colorFrustum );\n\t\taddLine( 'n4', 'f4', colorFrustum );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1', colorCone );\n\t\taddLine( 'p', 'n2', colorCone );\n\t\taddLine( 'p', 'n3', colorCone );\n\t\taddLine( 'p', 'n4', colorCone );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2', colorUp );\n\t\taddLine( 'u2', 'u3', colorUp );\n\t\taddLine( 'u3', 'u1', colorUp );\n\n\t\t// target\n\n\t\taddLine( 'c', 't', colorTarget );\n\t\taddLine( 'p', 'c', colorCross );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2', colorCross );\n\t\taddLine( 'cn3', 'cn4', colorCross );\n\n\t\taddLine( 'cf1', 'cf2', colorCross );\n\t\taddLine( 'cf3', 'cf4', colorCross );\n\n\t\tfunction addLine( a, b, color ) {\n\n\t\t\taddPoint( a, color );\n\t\t\taddPoint( b, color );\n\n\t\t}\n\n\t\tfunction addPoint( id, color ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// center / target\n\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector$c.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector$c.x, _vector$c.y, _vector$c.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\n\nclass BoxHelper extends LineSegments {\n\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate( object ) {\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t\t}\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box$3.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box$3.isEmpty() ) return;\n\n\t\tconst min = _box$3.min;\n\t\tconst max = _box$3.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\n\t}\n\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tLineSegments.prototype.copy.call( this, source );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Box3Helper extends LineSegments {\n\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nclass PlaneHelper extends Line {\n\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\tthis.plane = plane;\n\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tlet scale = - this.plane.constant;\n\n\t\tif ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, scale );\n\n\t\tthis.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\nclass ArrowHelper extends Object3D {\n\n\tconstructor( dir, origin, length, color, headLength, headWidth ) {\n\n\t\tsuper();\n\t\t// dir is assumed to be normalized\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( dir === undefined ) dir = new Vector3( 0, 0, 1 );\n\t\tif ( origin === undefined ) origin = new Vector3( 0, 0, 0 );\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\tsetLength( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass AxesHelper extends LineSegments {\n\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n}\n\nconst _floatView = new Float32Array( 1 );\nconst _int32View = new Int32Array( _floatView.buffer );\n\nconst DataUtils = {\n\n\t// Converts float32 to float16 (stored as uint16 value).\n\n\ttoHalfFloat: function ( val ) {\n\n\t\t// Source: http://gamedev.stackexchange.com/questions/17326/conversion-of-a-number-from-single-precision-floating-point-representation-to-a/17410#17410\n\n\t\t/* This method is faster than the OpenEXR implementation (very often\n\t\t* used, eg. in Ogre), with the additional benefit of rounding, inspired\n\t\t* by James Tursa?s half-precision code. */\n\n\t\t_floatView[ 0 ] = val;\n\t\tconst x = _int32View[ 0 ];\n\n\t\tlet bits = ( x >> 16 ) & 0x8000; /* Get the sign */\n\t\tlet m = ( x >> 12 ) & 0x07ff; /* Keep one extra bit for rounding */\n\t\tconst e = ( x >> 23 ) & 0xff; /* Using int is faster here */\n\n\t\t/* If zero, or denormal, or exponent underflows too much for a denormal\n\t\t\t* half, return signed zero. */\n\t\tif ( e < 103 ) return bits;\n\n\t\t/* If NaN, return NaN. If Inf or exponent overflow, return Inf. */\n\t\tif ( e > 142 ) {\n\n\t\t\tbits |= 0x7c00;\n\t\t\t/* If exponent was 0xff and one mantissa bit was set, it means NaN,\n\t\t\t\t\t\t* not Inf, so make sure we set one mantissa bit too. */\n\t\t\tbits |= ( ( e == 255 ) ? 0 : 1 ) && ( x & 0x007fffff );\n\t\t\treturn bits;\n\n\t\t}\n\n\t\t/* If exponent underflows but not too much, return a denormal */\n\t\tif ( e < 113 ) {\n\n\t\t\tm |= 0x0800;\n\t\t\t/* Extra rounding may overflow and set mantissa to 0 and exponent\n\t\t\t\t* to 1, which is OK. */\n\t\t\tbits |= ( m >> ( 114 - e ) ) + ( ( m >> ( 113 - e ) ) & 1 );\n\t\t\treturn bits;\n\n\t\t}\n\n\t\tbits |= ( ( e - 112 ) << 10 ) | ( m >> 1 );\n\t\t/* Extra rounding. An overflow will set mantissa to 0 and increment\n\t\t\t* the exponent, which is OK. */\n\t\tbits += m & 1;\n\t\treturn bits;\n\n\t}\n\n};\n\nconst LOD_MIN = 4;\nconst LOD_MAX = 8;\nconst SIZE_MAX = Math.pow( 2, LOD_MAX );\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\nconst TOTAL_LODS = LOD_MAX - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst ENCODINGS = {\n\t[ LinearEncoding ]: 0,\n\t[ sRGBEncoding ]: 1,\n\t[ RGBEEncoding ]: 2,\n\t[ RGBM7Encoding ]: 3,\n\t[ RGBM16Encoding ]: 4,\n\t[ RGBDEncoding ]: 5,\n\t[ GammaEncoding ]: 6\n};\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst { _lodPlanes, _sizeLods, _sigmas } = /*@__PURE__*/ _createPlanes();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n */\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._blurMaterial = _getBlurShader( MAX_SAMPLES );\n\t\tthis._equirectShader = null;\n\t\tthis._cubemapShader = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * (RGBFormat) or HDR (RGBEFormat). The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromEquirectangular( equirectangular ) {\n\n\t\treturn this._fromTexture( equirectangular );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * (RGBFormat) or HDR (RGBEFormat). The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromCubemap( cubemap ) {\n\n\t\treturn this._fromTexture( cubemap );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapShader === null ) {\n\n\t\t\tthis._cubemapShader = _getCubemapShader();\n\t\t\tthis._compileMaterial( this._cubemapShader );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectShader === null ) {\n\n\t\t\tthis._equirectShader = _getEquirectShader();\n\t\t\tthis._compileMaterial( this._equirectShader );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._blurMaterial.dispose();\n\n\t\tif ( this._cubemapShader !== null ) this._cubemapShader.dispose();\n\t\tif ( this._equirectShader !== null ) this._equirectShader.dispose();\n\n\t\tfor ( let i = 0; i < _lodPlanes.length; i ++ ) {\n\n\t\t\t_lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._pingPongRenderTarget.dispose();\n\t\tthis._renderer.setRenderTarget( _oldTarget );\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\tconst cubeUVRenderTarget = this._allocateTargets( texture );\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets( texture ) { // warning: null texture is valid\n\n\t\tconst params = {\n\t\t\tmagFilter: NearestFilter,\n\t\t\tminFilter: NearestFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: UnsignedByteType,\n\t\t\tformat: RGBEFormat,\n\t\t\tencoding: _isLDR( texture ) ? texture.encoding : RGBEEncoding,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( params );\n\t\tcubeUVRenderTarget.depthBuffer = texture ? false : true;\n\t\tthis._pingPongRenderTarget = _createRenderTarget( params );\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( _lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, - 1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst outputEncoding = renderer.outputEncoding;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\t\tconst clearAlpha = renderer.getClearAlpha();\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.outputEncoding = LinearEncoding;\n\n\t\tlet background = scene.background;\n\t\tif ( background && background.isColor ) {\n\n\t\t\tbackground.convertSRGBToLinear();\n\t\t\t// Convert linear to RGBE\n\t\t\tconst maxComponent = Math.max( background.r, background.g, background.b );\n\t\t\tconst fExp = Math.min( Math.max( Math.ceil( Math.log2( maxComponent ) ), - 128.0 ), 127.0 );\n\t\t\tbackground = background.multiplyScalar( Math.pow( 2.0, - fExp ) );\n\t\t\tconst alpha = ( fExp + 128.0 ) / 255.0;\n\t\t\trenderer.setClearColor( background, alpha );\n\t\t\tscene.background = null;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\t\t\tif ( col == 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col == 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\t_setViewport( cubeUVRenderTarget,\n\t\t\t\tcol * SIZE_MAX, i > 2 ? SIZE_MAX : 0, SIZE_MAX, SIZE_MAX );\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.outputEncoding = outputEncoding;\n\t\trenderer.setClearColor( _clearColor, clearAlpha );\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tif ( texture.isCubeTexture ) {\n\n\t\t\tif ( this._cubemapShader == null ) {\n\n\t\t\t\tthis._cubemapShader = _getCubemapShader();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( this._equirectShader == null ) {\n\n\t\t\t\tthis._equirectShader = _getEquirectShader();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = texture.isCubeTexture ? this._cubemapShader : this._equirectShader;\n\t\tconst mesh = new Mesh( _lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tif ( ! texture.isCubeTexture ) {\n\n\t\t\tuniforms[ 'texelSize' ].value.set( 1.0 / texture.image.width, 1.0 / texture.image.height );\n\n\t\t}\n\n\t\tuniforms[ 'inputEncoding' ].value = ENCODINGS[ texture.encoding ];\n\t\tuniforms[ 'outputEncoding' ].value = ENCODINGS[ cubeUVRenderTarget.texture.encoding ];\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tfor ( let i = 1; i < TOTAL_LODS; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( _sigmas[ i ] * _sigmas[ i ] - _sigmas[ i - 1 ] * _sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( _lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = _sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i == 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = LOD_MAX - lodIn;\n\t\tblurUniforms[ 'inputEncoding' ].value = ENCODINGS[ targetIn.texture.encoding ];\n\t\tblurUniforms[ 'outputEncoding' ].value = ENCODINGS[ targetIn.texture.encoding ];\n\n\t\tconst outputSize = _sizeLods[ lodOut ];\n\t\tconst x = 3 * Math.max( 0, SIZE_MAX - 2 * outputSize );\n\t\tconst y = ( lodOut === 0 ? 0 : 2 * SIZE_MAX ) + 2 * outputSize * ( lodOut > LOD_MAX - LOD_MIN ? lodOut - LOD_MAX + LOD_MIN : 0 );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\nfunction _isLDR( texture ) {\n\n\tif ( texture === undefined || texture.type !== UnsignedByteType ) return false;\n\n\treturn texture.encoding === LinearEncoding || texture.encoding === sRGBEncoding || texture.encoding === GammaEncoding;\n\n}\n\nfunction _createPlanes() {\n\n\tconst _lodPlanes = [];\n\tconst _sizeLods = [];\n\tconst _sigmas = [];\n\n\tlet lod = LOD_MAX;\n\n\tfor ( let i = 0; i < TOTAL_LODS; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\t_sizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > LOD_MAX - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - LOD_MAX + LOD_MIN - 1 ];\n\n\t\t} else if ( i == 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\t_sigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 1 );\n\t\tconst min = - texelSize / 2;\n\t\tconst max = 1 + texelSize / 2;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : - 1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\t_lodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { _lodPlanes, _sizeLods, _sigmas };\n\n}\n\nfunction _createRenderTarget( params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( 3 * SIZE_MAX, 3 * SIZE_MAX, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( maxSamples ) {\n\n\tconst weights = new Float32Array( maxSamples );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: { 'n': maxSamples },\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis },\n\t\t\t'inputEncoding': { value: ENCODINGS[ LinearEncoding ] },\n\t\t\t'outputEncoding': { value: ENCODINGS[ LinearEncoding ] }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t${ _getEncodings() }\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectShader() {\n\n\tconst texelSize = new Vector2( 1, 1 );\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'texelSize': { value: texelSize },\n\t\t\t'inputEncoding': { value: ENCODINGS[ LinearEncoding ] },\n\t\t\t'outputEncoding': { value: ENCODINGS[ LinearEncoding ] }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t${ _getEncodings() }\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getCubemapShader() {\n\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'inputEncoding': { value: ENCODINGS[ LinearEncoding ] },\n\t\t\t'outputEncoding': { value: ENCODINGS[ LinearEncoding ] }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t${ _getEncodings() }\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction _getEncodings() {\n\n\treturn /* glsl */`\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t`;\n\n}\n\nfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n}\n\nconst LineStrip = 0;\nconst LinePieces = 1;\nconst NoColors = 0;\nconst FaceColors = 1;\nconst VertexColors = 2;\n\nfunction MeshFaceMaterial( materials ) {\n\n\tconsole.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );\n\treturn materials;\n\n}\n\nfunction MultiMaterial( materials = [] ) {\n\n\tconsole.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );\n\tmaterials.isMultiMaterial = true;\n\tmaterials.materials = materials;\n\tmaterials.clone = function () {\n\n\t\treturn materials.slice();\n\n\t};\n\n\treturn materials;\n\n}\n\nfunction PointCloud( geometry, material ) {\n\n\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\treturn new Points( geometry, material );\n\n}\n\nfunction Particle( material ) {\n\n\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\treturn new Sprite( material );\n\n}\n\nfunction ParticleSystem( geometry, material ) {\n\n\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\treturn new Points( geometry, material );\n\n}\n\nfunction PointCloudMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction ParticleBasicMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction ParticleSystemMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction Vertex( x, y, z ) {\n\n\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\treturn new Vector3( x, y, z );\n\n}\n\n//\n\nfunction DynamicBufferAttribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.' );\n\treturn new BufferAttribute( array, itemSize ).setUsage( DynamicDrawUsage );\n\n}\n\nfunction Int8Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\treturn new Int8BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint8Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\treturn new Uint8BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n}\n\nfunction Int16Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\treturn new Int16BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint16Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\treturn new Uint16BufferAttribute( array, itemSize );\n\n}\n\nfunction Int32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\treturn new Int32BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\treturn new Uint32BufferAttribute( array, itemSize );\n\n}\n\nfunction Float32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\treturn new Float32BufferAttribute( array, itemSize );\n\n}\n\nfunction Float64Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\treturn new Float64BufferAttribute( array, itemSize );\n\n}\n\n//\n\nCurve.create = function ( construct, getPoint ) {\n\n\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\tconstruct.prototype = Object.create( Curve.prototype );\n\tconstruct.prototype.constructor = construct;\n\tconstruct.prototype.getPoint = getPoint;\n\n\treturn construct;\n\n};\n\n//\n\nObject.assign( CurvePath.prototype, {\n\n\tcreatePointsGeometry: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\t// generate geometry from path points (for Line or Points objects)\n\n\t\tconst pts = this.getPoints( divisions );\n\t\treturn this.createGeometry( pts );\n\n\t},\n\n\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\t// generate geometry from equidistant sampling along the path\n\n\t\tconst pts = this.getSpacedPoints( divisions );\n\t\treturn this.createGeometry( pts );\n\n\t},\n\n\tcreateGeometry: function ( points ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\tconst geometry = new Geometry();\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n} );\n\n//\n\nObject.assign( Path.prototype, {\n\n\tfromPoints: function ( points ) {\n\n\t\tconsole.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );\n\t\treturn this.setFromPoints( points );\n\n\t}\n\n} );\n\n//\n\nfunction ClosedSplineCurve3( points ) {\n\n\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\tthis.closed = true;\n\n}\n\nClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n//\n\nfunction SplineCurve3( points ) {\n\n\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\n}\n\nSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n//\n\nfunction Spline( points ) {\n\n\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\n}\n\nSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\nObject.assign( Spline.prototype, {\n\n\tinitFromArray: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t},\n\tgetControlPointsArray: function ( /* optionalTarget */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t},\n\treparametrizeByArcLength: function ( /* samplingCoef */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t}\n\n} );\n\n//\n\nfunction AxisHelper( size ) {\n\n\tconsole.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );\n\treturn new AxesHelper( size );\n\n}\n\nfunction BoundingBoxHelper( object, color ) {\n\n\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\treturn new BoxHelper( object, color );\n\n}\n\nfunction EdgesHelper( object, hex ) {\n\n\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n}\n\nGridHelper.prototype.setColors = function () {\n\n\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n};\n\nSkeletonHelper.prototype.update = function () {\n\n\tconsole.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );\n\n};\n\nfunction WireframeHelper( object, hex ) {\n\n\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n}\n\n//\n\nObject.assign( Loader.prototype, {\n\n\textractUrlBase: function ( url ) {\n\n\t\tconsole.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );\n\t\treturn LoaderUtils.extractUrlBase( url );\n\n\t}\n\n} );\n\nLoader.Handlers = {\n\n\tadd: function ( /* regex, loader */ ) {\n\n\t\tconsole.error( 'THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.' );\n\n\t},\n\n\tget: function ( /* file */ ) {\n\n\t\tconsole.error( 'THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.' );\n\n\t}\n\n};\n\nfunction XHRLoader( manager ) {\n\n\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\treturn new FileLoader( manager );\n\n}\n\nfunction BinaryTextureLoader( manager ) {\n\n\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\treturn new DataTextureLoader( manager );\n\n}\n\n//\n\nObject.assign( Box2.prototype, {\n\n\tcenter: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t},\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tsize: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\treturn this.getSize( optionalTarget );\n\n\t}\n} );\n\nObject.assign( Box3.prototype, {\n\n\tcenter: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t},\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tisIntersectionSphere: function ( sphere ) {\n\n\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\treturn this.intersectsSphere( sphere );\n\n\t},\n\tsize: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\treturn this.getSize( optionalTarget );\n\n\t}\n} );\n\nObject.assign( Sphere.prototype, {\n\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Sphere: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\n} );\n\nFrustum.prototype.setFromMatrix = function ( m ) {\n\n\tconsole.warn( 'THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().' );\n\treturn this.setFromProjectionMatrix( m );\n\n};\n\nLine3.prototype.center = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\treturn this.getCenter( optionalTarget );\n\n};\n\nObject.assign( MathUtils, {\n\n\trandom16: function () {\n\n\t\tconsole.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t},\n\n\tnearestPowerOfTwo: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' );\n\t\treturn MathUtils.floorPowerOfTwo( value );\n\n\t},\n\n\tnextPowerOfTwo: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' );\n\t\treturn MathUtils.ceilPowerOfTwo( value );\n\n\t}\n\n} );\n\nObject.assign( Matrix3.prototype, {\n\n\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );\n\t\treturn this.toArray( array, offset );\n\n\t},\n\tmultiplyVector3: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\treturn vector.applyMatrix3( this );\n\n\t},\n\tmultiplyVector3Array: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );\n\n\t},\n\tapplyToBufferAttribute: function ( attribute ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.' );\n\t\treturn attribute.applyMatrix3( this );\n\n\t},\n\tapplyToVector3Array: function ( /* array, offset, length */ ) {\n\n\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t},\n\tgetInverse: function ( matrix ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );\n\t\treturn this.copy( matrix ).invert();\n\n\t}\n\n} );\n\nObject.assign( Matrix4.prototype, {\n\n\textractPosition: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\treturn this.copyPosition( m );\n\n\t},\n\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );\n\t\treturn this.toArray( array, offset );\n\n\t},\n\tgetPosition: function () {\n\n\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\treturn new Vector3().setFromMatrixColumn( this, 3 );\n\n\t},\n\tsetRotationFromQuaternion: function ( q ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\treturn this.makeRotationFromQuaternion( q );\n\n\t},\n\tmultiplyToArray: function () {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );\n\n\t},\n\tmultiplyVector3: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\tmultiplyVector4: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\tmultiplyVector3Array: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );\n\n\t},\n\trotateAxis: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\tv.transformDirection( this );\n\n\t},\n\tcrossVector: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\ttranslate: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t},\n\trotateX: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t},\n\trotateY: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t},\n\trotateZ: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t},\n\trotateByAxis: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t},\n\tapplyToBufferAttribute: function ( attribute ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.' );\n\t\treturn attribute.applyMatrix4( this );\n\n\t},\n\tapplyToVector3Array: function ( /* array, offset, length */ ) {\n\n\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t},\n\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t},\n\tgetInverse: function ( matrix ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );\n\t\treturn this.copy( matrix ).invert();\n\n\t}\n\n} );\n\nPlane.prototype.isIntersectionLine = function ( line ) {\n\n\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\treturn this.intersectsLine( line );\n\n};\n\nObject.assign( Quaternion.prototype, {\n\n\tmultiplyVector3: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\treturn vector.applyQuaternion( this );\n\n\t},\n\tinverse: function ( ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: .inverse() has been renamed to invert().' );\n\t\treturn this.invert();\n\n\t}\n\n} );\n\nObject.assign( Ray.prototype, {\n\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tisIntersectionPlane: function ( plane ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\treturn this.intersectsPlane( plane );\n\n\t},\n\tisIntersectionSphere: function ( sphere ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\treturn this.intersectsSphere( sphere );\n\n\t}\n\n} );\n\nObject.assign( Triangle.prototype, {\n\n\tarea: function () {\n\n\t\tconsole.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );\n\t\treturn this.getArea();\n\n\t},\n\tbarycoordFromPoint: function ( point, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\t\treturn this.getBarycoord( point, target );\n\n\t},\n\tmidpoint: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );\n\t\treturn this.getMidpoint( target );\n\n\t},\n\tnormal: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\t\treturn this.getNormal( target );\n\n\t},\n\tplane: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );\n\t\treturn this.getPlane( target );\n\n\t}\n\n} );\n\nObject.assign( Triangle, {\n\n\tbarycoordFromPoint: function ( point, a, b, c, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\t\treturn Triangle.getBarycoord( point, a, b, c, target );\n\n\t},\n\tnormal: function ( a, b, c, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\t\treturn Triangle.getNormal( a, b, c, target );\n\n\t}\n\n} );\n\nObject.assign( Shape.prototype, {\n\n\textractAllPoints: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );\n\t\treturn this.extractPoints( divisions );\n\n\t},\n\textrude: function ( options ) {\n\n\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\treturn new ExtrudeGeometry( this, options );\n\n\t},\n\tmakeGeometry: function ( options ) {\n\n\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\treturn new ShapeGeometry( this, options );\n\n\t}\n\n} );\n\nObject.assign( Vector2.prototype, {\n\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tdistanceToManhattan: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\t\treturn this.manhattanDistanceTo( v );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\nObject.assign( Vector3.prototype, {\n\n\tsetEulerFromRotationMatrix: function () {\n\n\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t},\n\tsetEulerFromQuaternion: function () {\n\n\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t},\n\tgetPositionFromMatrix: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\treturn this.setFromMatrixPosition( m );\n\n\t},\n\tgetScaleFromMatrix: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\treturn this.setFromMatrixScale( m );\n\n\t},\n\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t},\n\tapplyProjection: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\treturn this.applyMatrix4( m );\n\n\t},\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tdistanceToManhattan: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\t\treturn this.manhattanDistanceTo( v );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\nObject.assign( Vector4.prototype, {\n\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\n//\n\nObject.assign( Geometry.prototype, {\n\n\tcomputeTangents: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t},\n\tcomputeLineDistances: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' );\n\n\t},\n\tapplyMatrix: function ( matrix ) {\n\n\t\tconsole.warn( 'THREE.Geometry: .applyMatrix() has been renamed to .applyMatrix4().' );\n\t\treturn this.applyMatrix4( matrix );\n\n\t}\n\n} );\n\nObject.assign( Object3D.prototype, {\n\n\tgetChildByName: function ( name ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\treturn this.getObjectByName( name );\n\n\t},\n\trenderDepth: function () {\n\n\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t},\n\ttranslate: function ( distance, axis ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\treturn this.translateOnAxis( axis, distance );\n\n\t},\n\tgetWorldRotation: function () {\n\n\t\tconsole.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );\n\n\t},\n\tapplyMatrix: function ( matrix ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().' );\n\t\treturn this.applyMatrix4( matrix );\n\n\t}\n\n} );\n\nObject.defineProperties( Object3D.prototype, {\n\n\teulerOrder: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\treturn this.rotation.order;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\tthis.rotation.order = value;\n\n\t\t}\n\t},\n\tuseQuaternion: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t}\n\t}\n\n} );\n\nObject.assign( Mesh.prototype, {\n\n\tsetDrawMode: function () {\n\n\t\tconsole.error( 'THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );\n\n\t},\n\n} );\n\nObject.defineProperties( Mesh.prototype, {\n\n\tdrawMode: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.' );\n\t\t\treturn TrianglesDrawMode;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( LOD.prototype, {\n\n\tobjects: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\treturn this.levels;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperty( Skeleton.prototype, 'useVertexTexture', {\n\n\tget: function () {\n\n\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t},\n\tset: function () {\n\n\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t}\n\n} );\n\nSkinnedMesh.prototype.initBones = function () {\n\n\tconsole.error( 'THREE.SkinnedMesh: initBones() has been removed.' );\n\n};\n\nObject.defineProperty( Curve.prototype, '__arcLengthDivisions', {\n\n\tget: function () {\n\n\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\treturn this.arcLengthDivisions;\n\n\t},\n\tset: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\tthis.arcLengthDivisions = value;\n\n\t}\n\n} );\n\n//\n\nPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\tconsole.warn( 'THREE.PerspectiveCamera.setLens is deprecated. ' +\n\t\t\t'Use .setFocalLength and .filmGauge for a photographic setup.' );\n\n\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\tthis.setFocalLength( focalLength );\n\n};\n\n//\n\nObject.defineProperties( Light.prototype, {\n\tonlyShadow: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t}\n\t},\n\tshadowCameraFov: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\tthis.shadow.camera.fov = value;\n\n\t\t}\n\t},\n\tshadowCameraLeft: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\tthis.shadow.camera.left = value;\n\n\t\t}\n\t},\n\tshadowCameraRight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\tthis.shadow.camera.right = value;\n\n\t\t}\n\t},\n\tshadowCameraTop: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\tthis.shadow.camera.top = value;\n\n\t\t}\n\t},\n\tshadowCameraBottom: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t}\n\t},\n\tshadowCameraNear: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\tthis.shadow.camera.near = value;\n\n\t\t}\n\t},\n\tshadowCameraFar: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\tthis.shadow.camera.far = value;\n\n\t\t}\n\t},\n\tshadowCameraVisible: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t}\n\t},\n\tshadowBias: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\tthis.shadow.bias = value;\n\n\t\t}\n\t},\n\tshadowDarkness: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t}\n\t},\n\tshadowMapWidth: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t}\n\t},\n\tshadowMapHeight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t}\n\t}\n} );\n\n//\n\nObject.defineProperties( BufferAttribute.prototype, {\n\n\tlength: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\treturn this.array.length;\n\n\t\t}\n\t},\n\tdynamic: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );\n\t\t\treturn this.usage === DynamicDrawUsage;\n\n\t\t},\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );\n\t\t\tthis.setUsage( DynamicDrawUsage );\n\n\t\t}\n\t}\n\n} );\n\nObject.assign( BufferAttribute.prototype, {\n\tsetDynamic: function ( value ) {\n\n\t\tconsole.warn( 'THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.' );\n\t\tthis.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );\n\t\treturn this;\n\n\t},\n\tcopyIndicesArray: function ( /* indices */ ) {\n\n\t\tconsole.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );\n\n\t},\n\tsetArray: function ( /* array */ ) {\n\n\t\tconsole.error( 'THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );\n\n\t}\n} );\n\nObject.assign( BufferGeometry.prototype, {\n\n\taddIndex: function ( index ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\tthis.setIndex( index );\n\n\t},\n\taddAttribute: function ( name, attribute ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().' );\n\n\t\tif ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\treturn this.setAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t}\n\n\t\tif ( name === 'index' ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\tthis.setIndex( attribute );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\treturn this.setAttribute( name, attribute );\n\n\t},\n\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\tif ( indexOffset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t}\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\tthis.addGroup( start, count );\n\n\t},\n\tclearDrawCalls: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\tthis.clearGroups();\n\n\t},\n\tcomputeTangents: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t},\n\tcomputeOffsets: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t},\n\tremoveAttribute: function ( name ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().' );\n\n\t\treturn this.deleteAttribute( name );\n\n\t},\n\tapplyMatrix: function ( matrix ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().' );\n\t\treturn this.applyMatrix4( matrix );\n\n\t}\n\n} );\n\nObject.defineProperties( BufferGeometry.prototype, {\n\n\tdrawcalls: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t},\n\toffsets: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( InstancedBufferGeometry.prototype, {\n\n\tmaxInstancedCount: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.' );\n\t\t\treturn this.instanceCount;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.' );\n\t\t\tthis.instanceCount = value;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( Raycaster.prototype, {\n\n\tlinePrecision: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.' );\n\t\t\treturn this.params.Line.threshold;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.' );\n\t\t\tthis.params.Line.threshold = value;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( InterleavedBuffer.prototype, {\n\n\tdynamic: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.' );\n\t\t\treturn this.usage === DynamicDrawUsage;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.' );\n\t\t\tthis.setUsage( value );\n\n\t\t}\n\t}\n\n} );\n\nObject.assign( InterleavedBuffer.prototype, {\n\tsetDynamic: function ( value ) {\n\n\t\tconsole.warn( 'THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.' );\n\t\tthis.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );\n\t\treturn this;\n\n\t},\n\tsetArray: function ( /* array */ ) {\n\n\t\tconsole.error( 'THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );\n\n\t}\n} );\n\n//\n\nObject.assign( ExtrudeBufferGeometry.prototype, {\n\n\tgetArrays: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' );\n\n\t},\n\n\taddShapeList: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' );\n\n\t},\n\n\taddShape: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' );\n\n\t}\n\n} );\n\n//\n\nObject.assign( Scene.prototype, {\n\n\tdispose: function () {\n\n\t\tconsole.error( 'THREE.Scene: .dispose() has been removed.' );\n\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Uniform.prototype, {\n\n\tdynamic: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t}\n\t},\n\tonUpdate: {\n\t\tvalue: function () {\n\n\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\treturn this;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Material.prototype, {\n\n\twrapAround: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t}\n\t},\n\n\toverdraw: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .overdraw has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .overdraw has been removed.' );\n\n\t\t}\n\t},\n\n\twrapRGB: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapRGB has been removed.' );\n\t\t\treturn new Color();\n\n\t\t}\n\t},\n\n\tshading: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\tthis.flatShading = ( value === FlatShading );\n\n\t\t}\n\t},\n\n\tstencilMask: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );\n\t\t\treturn this.stencilFuncMask;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );\n\t\t\tthis.stencilFuncMask = value;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\tmetal: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( MeshPhysicalMaterial.prototype, {\n\n\ttransparency: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission.' );\n\t\t\treturn this.transmission;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission.' );\n\t\t\tthis.transmission = value;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( ShaderMaterial.prototype, {\n\n\tderivatives: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\treturn this.extensions.derivatives;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\tthis.extensions.derivatives = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.assign( WebGLRenderer.prototype, {\n\n\tclearTarget: function ( renderTarget, color, depth, stencil ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' );\n\t\tthis.setRenderTarget( renderTarget );\n\t\tthis.clear( color, depth, stencil );\n\n\t},\n\tanimate: function ( callback ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' );\n\t\tthis.setAnimationLoop( callback );\n\n\t},\n\tgetCurrentRenderTarget: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );\n\t\treturn this.getRenderTarget();\n\n\t},\n\tgetMaxAnisotropy: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );\n\t\treturn this.capabilities.getMaxAnisotropy();\n\n\t},\n\tgetPrecision: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );\n\t\treturn this.capabilities.precision;\n\n\t},\n\tresetGLState: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );\n\t\treturn this.state.reset();\n\n\t},\n\tsupportsFloatTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t},\n\tsupportsHalfFloatTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t},\n\tsupportsStandardDerivatives: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t},\n\tsupportsCompressedTextureS3TC: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t},\n\tsupportsCompressedTexturePVRTC: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t},\n\tsupportsBlendMinMax: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t},\n\tsupportsVertexTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\treturn this.capabilities.vertexTextures;\n\n\t},\n\tsupportsInstancedArrays: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t},\n\tenableScissorTest: function ( boolean ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\tthis.setScissorTest( boolean );\n\n\t},\n\tinitMaterial: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t},\n\taddPrePlugin: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t},\n\taddPostPlugin: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t},\n\tupdateShadowMap: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t},\n\tsetFaceCulling: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );\n\n\t},\n\tallocTextureUnit: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' );\n\n\t},\n\tsetTexture: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setTexture() has been removed.' );\n\n\t},\n\tsetTexture2D: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setTexture2D() has been removed.' );\n\n\t},\n\tsetTextureCube: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setTextureCube() has been removed.' );\n\n\t},\n\tgetActiveMipMapLevel: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().' );\n\t\treturn this.getActiveMipmapLevel();\n\n\t}\n\n} );\n\nObject.defineProperties( WebGLRenderer.prototype, {\n\n\tshadowMapEnabled: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.enabled;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\tthis.shadowMap.enabled = value;\n\n\t\t}\n\t},\n\tshadowMapType: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\tthis.shadowMap.type = value;\n\n\t\t}\n\t},\n\tshadowMapCullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\tcontext: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.' );\n\t\t\treturn this.getContext();\n\n\t\t}\n\t},\n\tvr: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .vr has been renamed to .xr' );\n\t\t\treturn this.xr;\n\n\t\t}\n\t},\n\tgammaInput: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );\n\n\t\t}\n\t},\n\tgammaOutput: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );\n\t\t\tthis.outputEncoding = ( value === true ) ? sRGBEncoding : LinearEncoding;\n\n\t\t}\n\t},\n\ttoneMappingWhitePoint: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );\n\t\t\treturn 1.0;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );\n\n\t\t}\n\t},\n\n} );\n\nObject.defineProperties( WebGLShadowMap.prototype, {\n\n\tcullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* cullFace */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderReverseSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderSingleSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t}\n\n} );\n\nfunction WebGLRenderTargetCube( width, height, options ) {\n\n\tconsole.warn( 'THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).' );\n\treturn new WebGLCubeRenderTarget( width, options );\n\n}\n\n//\n\nObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\twrapS: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\treturn this.texture.wrapS;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\tthis.texture.wrapS = value;\n\n\t\t}\n\t},\n\twrapT: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\treturn this.texture.wrapT;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\tthis.texture.wrapT = value;\n\n\t\t}\n\t},\n\tmagFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\treturn this.texture.magFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\tthis.texture.magFilter = value;\n\n\t\t}\n\t},\n\tminFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\treturn this.texture.minFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\tthis.texture.minFilter = value;\n\n\t\t}\n\t},\n\tanisotropy: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\treturn this.texture.anisotropy;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\tthis.texture.anisotropy = value;\n\n\t\t}\n\t},\n\toffset: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\treturn this.texture.offset;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\tthis.texture.offset = value;\n\n\t\t}\n\t},\n\trepeat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\treturn this.texture.repeat;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\tthis.texture.repeat = value;\n\n\t\t}\n\t},\n\tformat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\treturn this.texture.format;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\tthis.texture.format = value;\n\n\t\t}\n\t},\n\ttype: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\treturn this.texture.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\tthis.texture.type = value;\n\n\t\t}\n\t},\n\tgenerateMipmaps: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\treturn this.texture.generateMipmaps;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Audio.prototype, {\n\n\tload: {\n\t\tvalue: function ( file ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\t\t\tconst scope = this;\n\t\t\tconst audioLoader = new AudioLoader();\n\t\t\taudioLoader.load( file, function ( buffer ) {\n\n\t\t\t\tscope.setBuffer( buffer );\n\n\t\t\t} );\n\t\t\treturn this;\n\n\t\t}\n\t},\n\tstartTime: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Audio: .startTime is now .play( delay ).' );\n\n\t\t}\n\t}\n\n} );\n\nAudioAnalyser.prototype.getData = function () {\n\n\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\treturn this.getFrequencyData();\n\n};\n\n//\n\nCubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {\n\n\tconsole.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );\n\treturn this.update( renderer, scene );\n\n};\n\nCubeCamera.prototype.clear = function ( renderer, color, depth, stencil ) {\n\n\tconsole.warn( 'THREE.CubeCamera: .clear() is now .renderTarget.clear().' );\n\treturn this.renderTarget.clear( renderer, color, depth, stencil );\n\n};\n\n//\n\nconst GeometryUtils = {\n\n\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\tlet matrix;\n\n\t\tif ( geometry2.isMesh ) {\n\n\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\tmatrix = geometry2.matrix;\n\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t}\n\n\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t},\n\n\tcenter: function ( geometry ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\treturn geometry.center();\n\n\t}\n\n};\n\nImageUtils.crossOrigin = undefined;\n\nImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) {\n\n\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\tconst loader = new TextureLoader();\n\tloader.setCrossOrigin( this.crossOrigin );\n\n\tconst texture = loader.load( url, onLoad, undefined, onError );\n\n\tif ( mapping ) texture.mapping = mapping;\n\n\treturn texture;\n\n};\n\nImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) {\n\n\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\tconst loader = new CubeTextureLoader();\n\tloader.setCrossOrigin( this.crossOrigin );\n\n\tconst texture = loader.load( urls, onLoad, undefined, onError );\n\n\tif ( mapping ) texture.mapping = mapping;\n\n\treturn texture;\n\n};\n\nImageUtils.loadCompressedTexture = function () {\n\n\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n};\n\nImageUtils.loadCompressedTextureCube = function () {\n\n\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n};\n\n//\n\nfunction CanvasRenderer() {\n\n\tconsole.error( 'THREE.CanvasRenderer has been removed' );\n\n}\n\n//\n\nfunction JSONLoader() {\n\n\tconsole.error( 'THREE.JSONLoader has been removed.' );\n\n}\n\n//\n\nconst SceneUtils = {\n\n\tcreateMultiMaterialObject: function ( /* geometry, materials */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t},\n\n\tdetach: function ( /* child, parent, scene */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t},\n\n\tattach: function ( /* child, scene, parent */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t}\n\n};\n\n//\n\nfunction LensFlare() {\n\n\tconsole.error( 'THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js' );\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t/* eslint-disable no-undef */\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\t/* eslint-enable no-undef */\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AlphaFormat, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightProbe, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, AxisHelper, BackSide, BasicDepthPacking, BasicShadowMap, BinaryTextureLoader, Bone, BooleanKeyframeTrack, BoundingBoxHelper, Box2, Box3, Box3Helper, BoxBufferGeometry, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasRenderer, CanvasTexture, CatmullRomCurve3, CineonToneMapping, CircleBufferGeometry, CircleGeometry, ClampToEdgeWrapping, Clock, ClosedSplineCurve3, Color, ColorKeyframeTrack, CompressedTexture, CompressedTextureLoader, ConeBufferGeometry, ConeGeometry, CubeCamera, BoxGeometry as CubeGeometry, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubeUVRefractionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderBufferGeometry, CylinderGeometry, Cylindrical, DataTexture, DataTexture2DArray, DataTexture3D, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronBufferGeometry, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicBufferAttribute, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EdgesHelper, EllipseCurve, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeBufferGeometry, ExtrudeGeometry, Face3, Face4, FaceColors, FileLoader, FlatShading, Float16BufferAttribute, Float32Attribute, Float32BufferAttribute, Float64Attribute, Float64BufferAttribute, FloatType, Fog, FogExp2, Font, FontLoader, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GammaEncoding, Geometry, GeometryUtils, GreaterDepth, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, HemisphereLightProbe, IcosahedronBufferGeometry, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, ImmediateRenderObject, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16Attribute, Int16BufferAttribute, Int32Attribute, Int32BufferAttribute, Int8Attribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, JSONLoader, KeepStencilOp, KeyframeTrack, LOD, LatheBufferGeometry, LatheGeometry, Layers, LensFlare, LessDepth, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LinePieces, LineSegments, LineStrip, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearToneMapping, Loader, LoaderUtils, LoadingManager, LogLuvEncoding, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils as Math, MathUtils, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshFaceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiMaterial, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeverDepth, NeverStencilFunc, NoBlending, NoColors, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronBufferGeometry, OctahedronGeometry, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, ParametricBufferGeometry, ParametricGeometry, Particle, ParticleBasicMaterial, ParticleSystem, ParticleSystemMaterial, Path, PerspectiveCamera, Plane, PlaneBufferGeometry, PlaneGeometry, PlaneHelper, PointCloud, PointCloudMaterial, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronBufferGeometry, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDEncoding, RGBEEncoding, RGBEFormat, RGBFormat, RGBIntegerFormat, RGBM16Encoding, RGBM7Encoding, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingBufferGeometry, RingGeometry, SRGB8_ALPHA8_ASTC_10x10_Format, SRGB8_ALPHA8_ASTC_10x5_Format, SRGB8_ALPHA8_ASTC_10x6_Format, SRGB8_ALPHA8_ASTC_10x8_Format, SRGB8_ALPHA8_ASTC_12x10_Format, SRGB8_ALPHA8_ASTC_12x12_Format, SRGB8_ALPHA8_ASTC_4x4_Format, SRGB8_ALPHA8_ASTC_5x4_Format, SRGB8_ALPHA8_ASTC_5x5_Format, SRGB8_ALPHA8_ASTC_6x5_Format, SRGB8_ALPHA8_ASTC_6x6_Format, SRGB8_ALPHA8_ASTC_8x5_Format, SRGB8_ALPHA8_ASTC_8x6_Format, SRGB8_ALPHA8_ASTC_8x8_Format, Scene, SceneUtils, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeBufferGeometry, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, SmoothShading, Sphere, SphereBufferGeometry, SphereGeometry, Spherical, SphericalHarmonics3, Spline, SplineCurve, SplineCurve3, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronBufferGeometry, TetrahedronGeometry, TextBufferGeometry, TextGeometry, Texture, TextureLoader, TorusBufferGeometry, TorusGeometry, TorusKnotBufferGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeBufferGeometry, TubeGeometry, UVMapping, Uint16Attribute, Uint16BufferAttribute, Uint32Attribute, Uint32BufferAttribute, Uint8Attribute, Uint8BufferAttribute, Uint8ClampedAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShort565Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, Vertex, VertexColors, VideoTexture, WebGL1Renderer, WebGLCubeRenderTarget, WebGLMultisampleRenderTarget, WebGLRenderTarget, WebGLRenderTargetCube, WebGLRenderer, WebGLUtils, WireframeGeometry, WireframeHelper, WrapAroundEnding, XHRLoader, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, sRGBEncoding };\n","\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\n\nexport class PathAnimation{\n\t\n\tconstructor(path, start, end, speed, callback){\n\t\t\tthis.path = path;\n\t\t\tthis.length = this.path.spline.getLength();\n\t\t\tthis.speed = speed;\n\t\t\tthis.callback = callback;\n\t\t\tthis.tween = null;\n\t\t\tthis.startPoint = Math.max(start, 0);\n\t\t\tthis.endPoint = Math.min(end, this.length);\n\t\t\tthis.t = 0.0;\n\t}\n\n\tstart(resume = false){\n\t\tif(this.tween){\n\t\t\tthis.tween.stop();\n\t\t\tthis.tween = null;\n\t\t}\n\t\n\t\tlet tStart;\n\t\tif(resume){\n\t\t\ttStart = this.t;\n\t\t}else{\n\t\t\ttStart = this.startPoint / this.length;\n\t\t}\n\t\tlet tEnd = this.endPoint / this.length;\n\t\tlet animationDuration = (tEnd - tStart) * this.length * 1000 / this.speed;\n\t\n\t\tlet progress = {t: tStart};\n\t\tthis.tween = new TWEEN.Tween(progress).to({t: tEnd}, animationDuration);\n\t\tthis.tween.easing(TWEEN.Easing.Linear.None);\n\t\tthis.tween.onUpdate((e) => {\n\t\t\tthis.t = progress.t;\n\t\t\tthis.callback(progress.t);\n\t\t});\n\t\tthis.tween.onComplete(() => {\n\t\t\tif(this.repeat){\n\t\t\t\tthis.start();\n\t\t\t}\n\t\t});\n\n\t\tsetTimeout(() => {\n\t\t\tthis.tween.start();\n\t\t}, 0);\n\t}\n\n\tstop(){\n\t\tif(!this.tween){\n\t\t\treturn;\n\t\t}\n\t\tthis.tween.stop();\n\t\tthis.tween = null;\n\t\tthis.t = 0;\n\t}\n\n\tpause(){\n\t\tif(!this.tween){\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.tween.stop();\n\t\tTWEEN.remove(this.tween);\n\t\tthis.tween = null;\n\t}\n\n\tresume(){\n\t\tthis.start(true);\n\t}\n\n\tgetPoint(t){\n\t\treturn this.path.spline.getPoint(t);\n\t}\n\n}\n\nexport class AnimationPath{\n\tconstructor (points = []) {\n\t\tthis.points = points;\n\t\tthis.spline = new THREE.CatmullRomCurve3(points);\n\t\t//this.spline.reparametrizeByArcLength(1 / this.spline.getLength().total);\n\t}\n\n\tget (t) {\n\t\treturn this.spline.getPoint(t);\n\t}\n\n\tgetLength () {\n\t\treturn this.spline.getLength();\n\t}\n\n\tanimate (start, end, speed, callback) {\n\t\tlet animation = new PathAnimation(this, start, end, speed, callback);\n\t\tanimation.start();\n\n\t\treturn animation;\n\t}\n\n\tpause () {\n\t\tif (this.tween) {\n\t\t\tthis.tween.stop();\n\t\t}\n\t}\n\n\tresume () {\n\t\tif (this.tween) {\n\t\t\tthis.tween.start();\n\t\t}\n\t}\n\n\tgetGeometry () {\n\t\tlet geometry = new THREE.Geometry();\n\n\t\tlet samples = 500;\n\t\tlet i = 0;\n\t\tfor (let u = 0; u <= 1; u += 1 / samples) {\n\t\t\tlet position = this.spline.getPoint(u);\n\t\t\tgeometry.vertices[i] = new THREE.Vector3(position.x, position.y, position.z);\n\n\t\t\ti++;\n\t\t}\n\n\t\tif(this.closed){\n\t\t\tlet position = this.spline.getPoint(0);\n\t\t\tgeometry.vertices[i] = new THREE.Vector3(position.x, position.y, position.z);\n\t\t}\n\n\t\treturn geometry;\n\t}\n\n\tget closed(){\n\t\treturn this.spline.closed;\n\t}\n\n\tset closed(value){\n\t\tthis.spline.closed = value;\n\t}\n\n}","\nconst XHRFactory = {\n\tconfig: {\n\t\twithCredentials: false,\n\t\tcustomHeaders: [\n\t\t\t{ header: null, value: null }\n\t\t]\n\t},\n\n\tcreateXMLHttpRequest: function () {\n\t\tlet xhr = new XMLHttpRequest();\n\n\t\tif (this.config.customHeaders &&\n\t\t\tArray.isArray(this.config.customHeaders) &&\n\t\t\tthis.config.customHeaders.length > 0) {\n\t\t\tlet baseOpen = xhr.open;\n\t\t\tlet customHeaders = this.config.customHeaders;\n\t\t\txhr.open = function () {\n\t\t\t\tbaseOpen.apply(this, [].slice.call(arguments));\n\t\t\t\tcustomHeaders.forEach(function (customHeader) {\n\t\t\t\t\tif (!!customHeader.header && !!customHeader.value) {\n\t\t\t\t\t\txhr.setRequestHeader(customHeader.header, customHeader.value);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\treturn xhr;\n\t}\n};\n\nexport {XHRFactory};","\n\n// /**\n// * adapted from http://stemkoski.github.io/Three.js/Sprite-Text-Labels.html\n// */\n\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\n\nexport class TextSprite extends THREE.Object3D{\n\t\n\tconstructor(text){\n\t\tsuper();\n\n\t\tlet texture = new THREE.Texture();\n\t\ttexture.minFilter = THREE.LinearFilter;\n\t\ttexture.magFilter = THREE.LinearFilter;\n\t\tlet spriteMaterial = new THREE.SpriteMaterial({\n\t\t\tmap: texture,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false});\n\n\t\tthis.texture = texture;\n\n\t\tthis.material = spriteMaterial;\n\t\t//this.material = getRawMaterial(texture);\n\t\tthis.sprite = new THREE.Sprite(this.material);\n\t\tthis.add(this.sprite);\n\n\t\tthis.borderThickness = 4;\n\t\tthis.fontface = 'Arial';\n\t\tthis.fontsize = 28;\n\t\tthis.borderColor = { r: 0, g: 0, b: 0, a: 1.0 };\n\t\tthis.backgroundColor = { r: 255, g: 255, b: 255, a: 1.0 };\n\t\tthis.textColor = {r: 255, g: 255, b: 255, a: 1.0};\n\t\tthis.text = '';\n\n\t\tthis.setText(text);\n\t}\n\n\tsetText(text){\n\t\tif (this.text !== text){\n\t\t\tthis.text = text;\n\n\t\t\tthis.update();\n\t\t}\n\t}\n\n\tsetTextColor(color){\n\t\tthis.textColor = color;\n\n\t\tthis.update();\n\t}\n\n\tsetBorderColor(color){\n\t\tthis.borderColor = color;\n\n\t\tthis.update();\n\t}\n\n\tsetBackgroundColor(color){\n\t\tthis.backgroundColor = color;\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet canvas = document.createElement('canvas');\n\t\tlet context = canvas.getContext('2d');\n\t\tcontext.font = 'Bold ' + this.fontsize + 'px ' + this.fontface;\n\n\t\t// get size data (height depends only on font size)\n\t\tlet metrics = context.measureText(this.text);\n\t\tlet textWidth = metrics.width;\n\t\tlet margin = 5;\n\t\tlet spriteWidth = 2 * margin + textWidth + 2 * this.borderThickness;\n\t\tlet spriteHeight = this.fontsize * 1.4 + 2 * this.borderThickness;\n\n\t\tcontext.canvas.width = spriteWidth;\n\t\tcontext.canvas.height = spriteHeight;\n\t\tcontext.font = 'Bold ' + this.fontsize + 'px ' + this.fontface;\n\n\t\t// background color\n\t\tcontext.fillStyle = 'rgba(' + this.backgroundColor.r + ',' + this.backgroundColor.g + ',' +\n\t\t\tthis.backgroundColor.b + ',' + this.backgroundColor.a + ')';\n\t\t// border color\n\t\tcontext.strokeStyle = 'rgba(' + this.borderColor.r + ',' + this.borderColor.g + ',' +\n\t\t\tthis.borderColor.b + ',' + this.borderColor.a + ')';\n\n\t\tcontext.lineWidth = this.borderThickness;\n\t\tthis.roundRect(context, this.borderThickness / 2, this.borderThickness / 2,\n\t\t\ttextWidth + this.borderThickness + 2 * margin, this.fontsize * 1.4 + this.borderThickness, 6);\n\n\t\t// text color\n\t\tcontext.strokeStyle = 'rgba(0, 0, 0, 1.0)';\n\t\tcontext.strokeText(this.text, this.borderThickness + margin, this.fontsize + this.borderThickness);\n\n\t\tcontext.fillStyle = 'rgba(' + this.textColor.r + ',' + this.textColor.g + ',' +\n\t\t\tthis.textColor.b + ',' + this.textColor.a + ')';\n\t\tcontext.fillText(this.text, this.borderThickness + margin, this.fontsize + this.borderThickness);\n\n\t\tlet texture = new THREE.Texture(canvas);\n\t\ttexture.minFilter = THREE.LinearFilter;\n\t\ttexture.magFilter = THREE.LinearFilter;\n\t\ttexture.needsUpdate = true;\n\t\t//this.material.needsUpdate = true;\n\n\t\t// { // screen-space sprite\n\t\t// \tlet [screenWidth, screenHeight] = [1620, 937];\n\n\t\t// \tlet uniforms = this.sprite.material.uniforms;\n\t\t// \tlet aspect = spriteHeight / spriteWidth;\n\t\t// \tlet factor = 0.5;\n\n\t\t// \tlet w = spriteWidth / screenWidth;\n\t\t// \tlet h = spriteHeight / screenHeight;\n\n\t\t// \tuniforms.uScale.value = [2 * w, 2 * h];\n\t\t// \t//uniforms.uScale.value = [factor * 1, factor * aspect];\n\t\t//\tthis.sprite.material.uniforms.map.value = texture;\n\t\t// }\n\n\t\tthis.sprite.material.map = texture;\n\t\tthis.texture = texture;\n\n\t\tthis.sprite.scale.set(spriteWidth * 0.01, spriteHeight * 0.01, 1.0);\n\t}\n\n\troundRect(ctx, x, y, w, h, r){\n\t\tctx.beginPath();\n\t\tctx.moveTo(x + r, y);\n\t\tctx.lineTo(x + w - r, y);\n\t\tctx.quadraticCurveTo(x + w, y, x + w, y + r);\n\t\tctx.lineTo(x + w, y + h - r);\n\t\tctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n\t\tctx.lineTo(x + r, y + h);\n\t\tctx.quadraticCurveTo(x, y + h, x, y + h - r);\n\t\tctx.lineTo(x, y + r);\n\t\tctx.quadraticCurveTo(x, y, x + r, y);\n\t\tctx.closePath();\n\t\tctx.fill();\n\t\tctx.stroke();\n\t}\n\n}\n\n\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {TextSprite} from \"../TextSprite.js\";\n\nexport class Volume extends THREE.Object3D {\n\tconstructor (args = {}) {\n\t\tsuper();\n\n\t\tif(this.constructor.name === \"Volume\"){\n\t\t\tconsole.warn(\"Can't create object of class Volume directly. Use classes BoxVolume or SphereVolume instead.\");\n\t\t}\n\n\t\t//console.log(this);\n\t\t//console.log(this.constructor);\n\t\t//console.log(this.constructor.name);\n\n\t\tthis._clip = args.clip || false;\n\t\tthis._visible = true;\n\t\tthis.showVolumeLabel = true;\n\t\tthis._modifiable = args.modifiable || true;\n\n\t\tthis.label = new TextSprite('0');\n\t\tthis.label.setBorderColor({r: 0, g: 255, b: 0, a: 0.0});\n\t\tthis.label.setBackgroundColor({r: 0, g: 255, b: 0, a: 0.0});\n\t\tthis.label.material.depthTest = false;\n\t\tthis.label.material.depthWrite = false;\n\t\tthis.label.material.transparent = true;\n\t\tthis.label.position.y -= 0.5;\n\t\tthis.add(this.label);\n\n\t\tthis.label.updateMatrixWorld = () => {\n\t\t\tlet volumeWorldPos = new THREE.Vector3();\n\t\t\tvolumeWorldPos.setFromMatrixPosition(this.matrixWorld);\n\t\t\tthis.label.position.copy(volumeWorldPos);\n\t\t\tthis.label.updateMatrix();\n\t\t\tthis.label.matrixWorld.copy(this.label.matrix);\n\t\t\tthis.label.matrixWorldNeedsUpdate = false;\n\n\t\t\tfor (let i = 0, l = this.label.children.length; i < l; i++) {\n\t\t\t\tthis.label.children[ i ].updateMatrixWorld(true);\n\t\t\t}\n\t\t};\n\n\t\t{ // event listeners\n\t\t\tthis.addEventListener('select', e => {});\n\t\t\tthis.addEventListener('deselect', e => {});\n\t\t}\n\n\t}\n\n\tget visible(){\n\t\treturn this._visible;\n\t}\n\n\tset visible(value){\n\t\tif(this._visible !== value){\n\t\t\tthis._visible = value;\n\n\t\t\tthis.dispatchEvent({type: \"visibility_changed\", object: this});\n\t\t}\n\t}\n\n\tgetVolume () {\n\t\tconsole.warn(\"override this in subclass\");\n\t}\n\n\tupdate () {\n\t\t\n\t};\n\n\traycast (raycaster, intersects) {\n\n\t}\n\n\tget clip () {\n\t\treturn this._clip;\n\t}\n\n\tset clip (value) {\n\n\t\tif(this._clip !== value){\n\t\t\tthis._clip = value;\n\n\t\t\tthis.update();\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: \"clip_changed\",\n\t\t\t\tobject: this\n\t\t\t});\n\t\t}\n\t\t\n\t}\n\n\tget modifieable () {\n\t\treturn this._modifiable;\n\t}\n\n\tset modifieable (value) {\n\t\tthis._modifiable = value;\n\n\t\tthis.update();\n\t}\n};\n\n\nexport class BoxVolume extends Volume{\n\n\tconstructor(args = {}){\n\t\tsuper(args);\n\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\t\tthis.name = 'box_' + this.constructor.counter;\n\n\t\tlet boxGeometry = new THREE.BoxGeometry(1, 1, 1);\n\t\tboxGeometry.computeBoundingBox();\n\n\t\tlet boxFrameGeometry = new THREE.Geometry();\n\t\t{\n\t\t\tlet Vector3 = THREE.Vector3;\n\n\t\t\tboxFrameGeometry.vertices.push(\n\n\t\t\t\t// bottom\n\t\t\t\tnew Vector3(-0.5, -0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, -0.5, 0.5),\n\t\t\t\t// top\n\t\t\t\tnew Vector3(-0.5, 0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, -0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, 0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, 0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, 0.5, 0.5),\n\t\t\t\t// sides\n\t\t\t\tnew Vector3(-0.5, -0.5, 0.5),\n\t\t\t\tnew Vector3(-0.5, 0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, 0.5),\n\t\t\t\tnew Vector3(0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(0.5, 0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, -0.5, -0.5),\n\t\t\t\tnew Vector3(-0.5, 0.5, -0.5),\n\n\t\t\t);\n\n\t\t}\n\n\t\tthis.material = new THREE.MeshBasicMaterial({\n\t\t\tcolor: 0x00ff00,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.3,\n\t\t\tdepthTest: true,\n\t\t\tdepthWrite: false});\n\t\tthis.box = new THREE.Mesh(boxGeometry, this.material);\n\t\tthis.box.geometry.computeBoundingBox();\n\t\tthis.boundingBox = this.box.geometry.boundingBox;\n\t\tthis.add(this.box);\n\n\t\tthis.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: 0x000000}));\n\t\t// this.frame.mode = THREE.Lines;\n\t\tthis.add(this.frame);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tthis.boundingBox = this.box.geometry.boundingBox;\n\t\tthis.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere());\n\n\t\tif (this._clip) {\n\t\t\tthis.box.visible = false;\n\t\t\tthis.label.visible = false;\n\t\t} else {\n\t\t\tthis.box.visible = true;\n\t\t\tthis.label.visible = this.showVolumeLabel;\n\t\t}\n\t}\n\n\traycast (raycaster, intersects) {\n\t\tlet is = [];\n\t\tthis.box.raycast(raycaster, is);\n\n\t\tif (is.length > 0) {\n\t\t\tlet I = is[0];\n\t\t\tintersects.push({\n\t\t\t\tdistance: I.distance,\n\t\t\t\tobject: this,\n\t\t\t\tpoint: I.point.clone()\n\t\t\t});\n\t\t}\n\t}\n\n\tgetVolume(){\n\t\treturn Math.abs(this.scale.x * this.scale.y * this.scale.z);\n\t}\n\n};\n\nexport class SphereVolume extends Volume{\n\n\tconstructor(args = {}){\n\t\tsuper(args);\n\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\t\tthis.name = 'sphere_' + this.constructor.counter;\n\n\t\tlet sphereGeometry = new THREE.SphereGeometry(1, 32, 32);\n\t\tsphereGeometry.computeBoundingBox();\n\n\t\tthis.material = new THREE.MeshBasicMaterial({\n\t\t\tcolor: 0x00ff00,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.3,\n\t\t\tdepthTest: true,\n\t\t\tdepthWrite: false});\n\t\tthis.sphere = new THREE.Mesh(sphereGeometry, this.material);\n\t\tthis.sphere.visible = false;\n\t\tthis.sphere.geometry.computeBoundingBox();\n\t\tthis.boundingBox = this.sphere.geometry.boundingBox;\n\t\tthis.add(this.sphere);\n\n\t\tthis.label.visible = false;\n\n\n\t\tlet frameGeometry = new THREE.Geometry();\n\t\t{\n\t\t\tlet steps = 64;\n\t\t\tlet uSegments = 8;\n\t\t\tlet vSegments = 5;\n\t\t\tlet r = 1;\n\n\t\t\tfor(let uSegment = 0; uSegment < uSegments; uSegment++){\n\n\t\t\t\tlet alpha = (uSegment / uSegments) * Math.PI * 2;\n\t\t\t\tlet dirx = Math.cos(alpha);\n\t\t\t\tlet diry = Math.sin(alpha);\n\n\t\t\t\tfor(let i = 0; i <= steps; i++){\n\t\t\t\t\tlet v = (i / steps) * Math.PI * 2;\n\t\t\t\t\tlet vNext = v + 2 * Math.PI / steps;\n\n\t\t\t\t\tlet height = Math.sin(v);\n\t\t\t\t\tlet xyAmount = Math.cos(v);\n\n\t\t\t\t\tlet heightNext = Math.sin(vNext);\n\t\t\t\t\tlet xyAmountNext = Math.cos(vNext);\n\n\t\t\t\t\tlet vertex = new THREE.Vector3(dirx * xyAmount, diry * xyAmount, height);\n\t\t\t\t\tframeGeometry.vertices.push(vertex);\n\n\t\t\t\t\tlet vertexNext = new THREE.Vector3(dirx * xyAmountNext, diry * xyAmountNext, heightNext);\n\t\t\t\t\tframeGeometry.vertices.push(vertexNext);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// creates rings at poles, just because it's easier to implement\n\t\t\tfor(let vSegment = 0; vSegment <= vSegments + 1; vSegment++){\n\n\t\t\t\t//let height = (vSegment / (vSegments + 1)) * 2 - 1; // -1 to 1\n\t\t\t\tlet uh = (vSegment / (vSegments + 1)); // -1 to 1\n\t\t\t\tuh = (1 - uh) * (-Math.PI / 2) + uh *(Math.PI / 2);\n\t\t\t\tlet height = Math.sin(uh);\n\n\t\t\t\tconsole.log(uh, height);\n\n\t\t\t\tfor(let i = 0; i <= steps; i++){\n\t\t\t\t\tlet u = (i / steps) * Math.PI * 2;\n\t\t\t\t\tlet uNext = u + 2 * Math.PI / steps;\n\n\t\t\t\t\tlet dirx = Math.cos(u);\n\t\t\t\t\tlet diry = Math.sin(u);\n\n\t\t\t\t\tlet dirxNext = Math.cos(uNext);\n\t\t\t\t\tlet diryNext = Math.sin(uNext);\n\n\t\t\t\t\tlet xyAmount = Math.sqrt(1 - height * height);\n\n\t\t\t\t\tlet vertex = new THREE.Vector3(dirx * xyAmount, diry * xyAmount, height);\n\t\t\t\t\tframeGeometry.vertices.push(vertex);\n\n\t\t\t\t\tlet vertexNext = new THREE.Vector3(dirxNext * xyAmount, diryNext * xyAmount, height);\n\t\t\t\t\tframeGeometry.vertices.push(vertexNext);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.frame = new THREE.LineSegments(frameGeometry, new THREE.LineBasicMaterial({color: 0x000000}));\n\t\tthis.add(this.frame);\n\n\t\tlet frameMaterial = new THREE.MeshBasicMaterial({wireframe: true, color: 0x000000});\n\t\tthis.frame = new THREE.Mesh(sphereGeometry, frameMaterial);\n\t\t//this.add(this.frame);\n\n\t\t//this.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: 0x000000}));\n\t\t// this.frame.mode = THREE.Lines;\n\t\t//this.add(this.frame);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tthis.boundingBox = this.sphere.geometry.boundingBox;\n\t\tthis.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere());\n\n\t\t//if (this._clip) {\n\t\t//\tthis.sphere.visible = false;\n\t\t//\tthis.label.visible = false;\n\t\t//} else {\n\t\t//\tthis.sphere.visible = true;\n\t\t//\tthis.label.visible = this.showVolumeLabel;\n\t\t//}\n\t}\n\n\traycast (raycaster, intersects) {\n\t\tlet is = [];\n\t\tthis.sphere.raycast(raycaster, is);\n\n\t\tif (is.length > 0) {\n\t\t\tlet I = is[0];\n\t\t\tintersects.push({\n\t\t\t\tdistance: I.distance,\n\t\t\t\tobject: this,\n\t\t\t\tpoint: I.point.clone()\n\t\t\t});\n\t\t}\n\t}\n\t\n\t// see https://en.wikipedia.org/wiki/Ellipsoid#Volume\n\tgetVolume(){\n\t\treturn (4 / 3) * Math.PI * this.scale.x * this.scale.y * this.scale.z;\n\t}\n\n};","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Utils} from \"../utils.js\";\n\nexport class Profile extends THREE.Object3D{\n\n\tconstructor () {\n\t\tsuper();\n\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\n\t\tthis.name = 'Profile_' + this.constructor.counter;\n\t\tthis.points = [];\n\t\tthis.spheres = [];\n\t\tthis.edges = [];\n\t\tthis.boxes = [];\n\t\tthis.width = 1;\n\t\tthis.height = 20;\n\t\tthis._modifiable = true;\n\n\t\tthis.sphereGeometry = new THREE.SphereGeometry(0.4, 10, 10);\n\t\tthis.color = new THREE.Color(0xff0000);\n\t\tthis.lineColor = new THREE.Color(0xff0000);\n\t}\n\n\tcreateSphereMaterial () {\n\t\tlet sphereMaterial = new THREE.MeshLambertMaterial({\n\t\t\t//shading: THREE.SmoothShading,\n\t\t\tcolor: 0xff0000,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false}\n\t\t);\n\n\t\treturn sphereMaterial;\n\t};\n\n\tgetSegments () {\n\t\tlet segments = [];\n\n\t\tfor (let i = 0; i < this.points.length - 1; i++) {\n\t\t\tlet start = this.points[i].clone();\n\t\t\tlet end = this.points[i + 1].clone();\n\t\t\tsegments.push({start: start, end: end});\n\t\t}\n\n\t\treturn segments;\n\t}\n\n\tgetSegmentMatrices () {\n\t\tlet segments = this.getSegments();\n\t\tlet matrices = [];\n\n\t\tfor (let segment of segments) {\n\t\t\tlet {start, end} = segment;\n\n\t\t\tlet box = new THREE.Object3D();\n\n\t\t\tlet length = start.clone().setZ(0).distanceTo(end.clone().setZ(0));\n\t\t\tbox.scale.set(length, 10000, this.width);\n\t\t\tbox.up.set(0, 0, 1);\n\n\t\t\tlet center = new THREE.Vector3().addVectors(start, end).multiplyScalar(0.5);\n\t\t\tlet diff = new THREE.Vector3().subVectors(end, start);\n\t\t\tlet target = new THREE.Vector3(diff.y, -diff.x, 0);\n\n\t\t\tbox.position.set(0, 0, 0);\n\t\t\tbox.lookAt(target);\n\t\t\tbox.position.copy(center);\n\n\t\t\tbox.updateMatrixWorld();\n\t\t\tmatrices.push(box.matrixWorld);\n\t\t}\n\n\t\treturn matrices;\n\t}\n\n\taddMarker (point) {\n\t\tthis.points.push(point);\n\n\t\tlet sphere = new THREE.Mesh(this.sphereGeometry, this.createSphereMaterial());\n\n\t\tthis.add(sphere);\n\t\tthis.spheres.push(sphere);\n\n\t\t// edges & boxes\n\t\tif (this.points.length > 1) {\n\t\t\tlet lineGeometry = new THREE.Geometry();\n\t\t\tlineGeometry.vertices.push(new THREE.Vector3(), new THREE.Vector3());\n\t\t\tlineGeometry.colors.push(this.lineColor, this.lineColor, this.lineColor);\n\t\t\tlet lineMaterial = new THREE.LineBasicMaterial({\n\t\t\t\tvertexColors: THREE.VertexColors,\n\t\t\t\tlinewidth: 2,\n\t\t\t\ttransparent: true,\n\t\t\t\topacity: 0.4\n\t\t\t});\n\t\t\tlineMaterial.depthTest = false;\n\t\t\tlet edge = new THREE.Line(lineGeometry, lineMaterial);\n\t\t\tedge.visible = false;\n\n\t\t\tthis.add(edge);\n\t\t\tthis.edges.push(edge);\n\n\t\t\tlet boxGeometry = new THREE.BoxGeometry(1, 1, 1);\n\t\t\tlet boxMaterial = new THREE.MeshBasicMaterial({color: 0xff0000, transparent: true, opacity: 0.2});\n\t\t\tlet box = new THREE.Mesh(boxGeometry, boxMaterial);\n\t\t\tbox.visible = false;\n\n\t\t\tthis.add(box);\n\t\t\tthis.boxes.push(box);\n\t\t}\n\n\t\t{ // event listeners\n\t\t\tlet drag = (e) => {\n\t\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\t\te.drag.end, \n\t\t\t\t\te.viewer.scene.getActiveCamera(), \n\t\t\t\t\te.viewer, \n\t\t\t\t\te.viewer.scene.pointclouds);\n\n\t\t\t\tif (I) {\n\t\t\t\t\tlet i = this.spheres.indexOf(e.drag.object);\n\t\t\t\t\tif (i !== -1) {\n\t\t\t\t\t\tthis.setPosition(i, I.location);\n\t\t\t\t\t\t//this.dispatchEvent({\n\t\t\t\t\t\t//\t'type': 'marker_moved',\n\t\t\t\t\t\t//\t'profile': this,\n\t\t\t\t\t\t//\t'index': i\n\t\t\t\t\t\t//});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet drop = e => {\n\t\t\t\tlet i = this.spheres.indexOf(e.drag.object);\n\t\t\t\tif (i !== -1) {\n\t\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\t\t'type': 'marker_dropped',\n\t\t\t\t\t\t'profile': this,\n\t\t\t\t\t\t'index': i\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet mouseover = (e) => e.object.material.emissive.setHex(0x888888);\n\t\t\tlet mouseleave = (e) => e.object.material.emissive.setHex(0x000000);\n\n\t\t\tsphere.addEventListener('drag', drag);\n\t\t\tsphere.addEventListener('drop', drop);\n\t\t\tsphere.addEventListener('mouseover', mouseover);\n\t\t\tsphere.addEventListener('mouseleave', mouseleave);\n\t\t}\n\n\t\tlet event = {\n\t\t\ttype: 'marker_added',\n\t\t\tprofile: this,\n\t\t\tsphere: sphere\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.setPosition(this.points.length - 1, point);\n\t}\n\n\tremoveMarker (index) {\n\t\tthis.points.splice(index, 1);\n\n\t\tthis.remove(this.spheres[index]);\n\n\t\tlet edgeIndex = (index === 0) ? 0 : (index - 1);\n\t\tthis.remove(this.edges[edgeIndex]);\n\t\tthis.edges.splice(edgeIndex, 1);\n\t\tthis.remove(this.boxes[edgeIndex]);\n\t\tthis.boxes.splice(edgeIndex, 1);\n\n\t\tthis.spheres.splice(index, 1);\n\n\t\tthis.update();\n\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'marker_removed',\n\t\t\t'profile': this\n\t\t});\n\t}\n\n\tsetPosition (index, position) {\n\t\tlet point = this.points[index];\n\t\tpoint.copy(position);\n\n\t\tlet event = {\n\t\t\ttype: 'marker_moved',\n\t\t\tprofile:\tthis,\n\t\t\tindex:\tindex,\n\t\t\tposition: point.clone()\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.update();\n\t}\n\n\tsetWidth (width) {\n\t\tthis.width = width;\n\n\t\tlet event = {\n\t\t\ttype: 'width_changed',\n\t\t\tprofile:\tthis,\n\t\t\twidth:\twidth\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.update();\n\t}\n\n\tgetWidth () {\n\t\treturn this.width;\n\t}\n\n\tupdate () {\n\t\tif (this.points.length === 0) {\n\t\t\treturn;\n\t\t} else if (this.points.length === 1) {\n\t\t\tlet point = this.points[0];\n\t\t\tthis.spheres[0].position.copy(point);\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet min = this.points[0].clone();\n\t\tlet max = this.points[0].clone();\n\t\tlet centroid = new THREE.Vector3();\n\t\tlet lastIndex = this.points.length - 1;\n\t\tfor (let i = 0; i <= lastIndex; i++) {\n\t\t\tlet point = this.points[i];\n\t\t\tlet sphere = this.spheres[i];\n\t\t\tlet leftIndex = (i === 0) ? lastIndex : i - 1;\n\t\t\t// let rightIndex = (i === lastIndex) ? 0 : i + 1;\n\t\t\tlet leftVertex = this.points[leftIndex];\n\t\t\t// let rightVertex = this.points[rightIndex];\n\t\t\tlet leftEdge = this.edges[leftIndex];\n\t\t\tlet rightEdge = this.edges[i];\n\t\t\tlet leftBox = this.boxes[leftIndex];\n\t\t\t// rightBox = this.boxes[i];\n\n\t\t\t// let leftEdgeLength = point.distanceTo(leftVertex);\n\t\t\t// let rightEdgeLength = point.distanceTo(rightVertex);\n\t\t\t// let leftEdgeCenter = new THREE.Vector3().addVectors(leftVertex, point).multiplyScalar(0.5);\n\t\t\t// let rightEdgeCenter = new THREE.Vector3().addVectors(point, rightVertex).multiplyScalar(0.5);\n\n\t\t\tsphere.position.copy(point);\n\n\t\t\tif (this._modifiable) {\n\t\t\t\tsphere.visible = true;\n\t\t\t} else {\n\t\t\t\tsphere.visible = false;\n\t\t\t}\n\n\t\t\tif (leftEdge) {\n\t\t\t\tleftEdge.geometry.vertices[1].copy(point);\n\t\t\t\tleftEdge.geometry.verticesNeedUpdate = true;\n\t\t\t\tleftEdge.geometry.computeBoundingSphere();\n\t\t\t}\n\n\t\t\tif (rightEdge) {\n\t\t\t\trightEdge.geometry.vertices[0].copy(point);\n\t\t\t\trightEdge.geometry.verticesNeedUpdate = true;\n\t\t\t\trightEdge.geometry.computeBoundingSphere();\n\t\t\t}\n\n\t\t\tif (leftBox) {\n\t\t\t\tlet start = leftVertex;\n\t\t\t\tlet end = point;\n\t\t\t\tlet length = start.clone().setZ(0).distanceTo(end.clone().setZ(0));\n\t\t\t\tleftBox.scale.set(length, 1000000, this.width);\n\t\t\t\tleftBox.up.set(0, 0, 1);\n\n\t\t\t\tlet center = new THREE.Vector3().addVectors(start, end).multiplyScalar(0.5);\n\t\t\t\tlet diff = new THREE.Vector3().subVectors(end, start);\n\t\t\t\tlet target = new THREE.Vector3(diff.y, -diff.x, 0);\n\n\t\t\t\tleftBox.position.set(0, 0, 0);\n\t\t\t\tleftBox.lookAt(target);\n\t\t\t\tleftBox.position.copy(center);\n\t\t\t}\n\n\t\t\tcentroid.add(point);\n\t\t\tmin.min(point);\n\t\t\tmax.max(point);\n\t\t}\n\t\tcentroid.multiplyScalar(1 / this.points.length);\n\n\t\tfor (let i = 0; i < this.boxes.length; i++) {\n\t\t\tlet box = this.boxes[i];\n\n\t\t\tbox.position.z = min.z + (max.z - min.z) / 2;\n\t\t}\n\t}\n\n\traycast (raycaster, intersects) {\n\t\tfor (let i = 0; i < this.points.length; i++) {\n\t\t\tlet sphere = this.spheres[i];\n\n\t\t\tsphere.raycast(raycaster, intersects);\n\t\t}\n\n\t\t// recalculate distances because they are not necessarely correct\n\t\t// for scaled objects.\n\t\t// see https://github.com/mrdoob/three.js/issues/5827\n\t\t// TODO: remove this once the bug has been fixed\n\t\tfor (let i = 0; i < intersects.length; i++) {\n\t\t\tlet I = intersects[i];\n\t\t\tI.distance = raycaster.ray.origin.distanceTo(I.point);\n\t\t}\n\t\tintersects.sort(function (a, b) { return a.distance - b.distance; });\n\t};\n\n\tget modifiable () {\n\t\treturn this._modifiable;\n\t}\n\n\tset modifiable (value) {\n\t\tthis._modifiable = value;\n\t\tthis.update();\n\t}\n\n}\n","import {\n\tBox3,\n\tFloat32BufferAttribute,\n\tInstancedBufferGeometry,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tSphere,\n\tVector3,\n\tWireframeGeometry\n} from '../build/three.module.js';\n\nvar LineSegmentsGeometry = function () {\n\n\tInstancedBufferGeometry.call( this );\n\n\tthis.type = 'LineSegmentsGeometry';\n\n\tvar positions = [ - 1, 2, 0, 1, 2, 0, - 1, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\tvar uvs = [ - 1, 2, 1, 2, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 2, 1, - 2 ];\n\tvar index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ];\n\n\tthis.setIndex( index );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n};\n\nLineSegmentsGeometry.prototype = Object.assign( Object.create( InstancedBufferGeometry.prototype ), {\n\n\tconstructor: LineSegmentsGeometry,\n\n\tisLineSegmentsGeometry: true,\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tvar start = this.attributes.instanceStart;\n\t\tvar end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined ) {\n\n\t\t\tstart.applyMatrix4( matrix );\n\n\t\t\tend.applyMatrix4( matrix );\n\n\t\t\tstart.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetPositions: function ( array ) {\n\n\t\tvar lineSegments;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tlineSegments = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tlineSegments = new Float32Array( array );\n\n\t\t}\n\n\t\tvar instanceBuffer = new InstancedInterleavedBuffer( lineSegments, 6, 1 ); // xyz, xyz\n\n\t\tthis.setAttribute( 'instanceStart', new InterleavedBufferAttribute( instanceBuffer, 3, 0 ) ); // xyz\n\t\tthis.setAttribute( 'instanceEnd', new InterleavedBufferAttribute( instanceBuffer, 3, 3 ) ); // xyz\n\n\t\t//\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\n\t\treturn this;\n\n\t},\n\n\tsetColors: function ( array ) {\n\n\t\tvar colors;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tcolors = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tcolors = new Float32Array( array );\n\n\t\t}\n\n\t\tvar instanceColorBuffer = new InstancedInterleavedBuffer( colors, 6, 1 ); // rgb, rgb\n\n\t\tthis.setAttribute( 'instanceColorStart', new InterleavedBufferAttribute( instanceColorBuffer, 3, 0 ) ); // rgb\n\t\tthis.setAttribute( 'instanceColorEnd', new InterleavedBufferAttribute( instanceColorBuffer, 3, 3 ) ); // rgb\n\n\t\treturn this;\n\n\t},\n\n\tfromWireframeGeometry: function ( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t},\n\n\tfromEdgesGeometry: function ( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t},\n\n\tfromMesh: function ( mesh ) {\n\n\t\tthis.fromWireframeGeometry( new WireframeGeometry( mesh.geometry ) );\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t},\n\n\tfromLineSegments: function ( lineSegments ) {\n\n\t\tvar geometry = lineSegments.geometry;\n\n\t\tif ( geometry.isGeometry ) {\n\n\t\t\tthis.setPositions( geometry.vertices );\n\n\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t}\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function computeBoundingBox() {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar start = this.attributes.instanceStart;\n\t\t\tvar end = this.attributes.instanceEnd;\n\n\t\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( start );\n\n\t\t\t\tbox.setFromBufferAttribute( end );\n\n\t\t\t\tthis.boundingBox.union( box );\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\tcomputeBoundingSphere: function () {\n\n\t\tvar vector = new Vector3();\n\n\t\treturn function computeBoundingSphere() {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tvar start = this.attributes.instanceStart;\n\t\t\tvar end = this.attributes.instanceEnd;\n\n\t\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\tthis.boundingBox.getCenter( center );\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = start.count; i < il; i ++ ) {\n\n\t\t\t\t\tvector.fromBufferAttribute( start, i );\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\tvector.fromBufferAttribute( end, i );\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\ttoJSON: function () {\n\n\t\t// todo\n\n\t},\n\n\tapplyMatrix: function ( matrix ) {\n\n\t\tconsole.warn( 'THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().' );\n\n\t\treturn this.applyMatrix4( matrix );\n\n\t}\n\n} );\n\nexport { LineSegmentsGeometry };\n","import {\n\tShaderLib,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils,\n\tVector2\n} from '../build/three.module.js';\n\n/**\n * parameters = {\n * color: ,\n * linewidth: ,\n * dashed: ,\n * dashScale: ,\n * dashSize: ,\n * dashOffset: ,\n * gapSize: ,\n * resolution: , // to be set by renderer\n * }\n */\n\nUniformsLib.line = {\n\n\tlinewidth: { value: 1 },\n\tresolution: { value: new Vector2( 1, 1 ) },\n\tdashScale: { value: 1 },\n\tdashSize: { value: 1 },\n\tdashOffset: { value: 0 },\n\tgapSize: { value: 1 }, // todo FIX - maybe change to totalSize\n\topacity: { value: 1 }\n\n};\n\nShaderLib[ 'line' ] = {\n\n\tuniforms: UniformsUtils.merge( [\n\t\tUniformsLib.common,\n\t\tUniformsLib.fog,\n\t\tUniformsLib.line\n\t] ),\n\n\tvertexShader:\n\t\t`\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\n\t\tuniform float linewidth;\n\t\tuniform vec2 resolution;\n\n\t\tattribute vec3 instanceStart;\n\t\tattribute vec3 instanceEnd;\n\n\t\tattribute vec3 instanceColorStart;\n\t\tattribute vec3 instanceColorEnd;\n\n\t\tvarying vec2 vUv;\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashScale;\n\t\t\tattribute float instanceDistanceStart;\n\t\t\tattribute float instanceDistanceEnd;\n\t\t\tvarying float vLineDistance;\n\n\t\t#endif\n\n\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t// conservative estimate of the near plane\n\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#ifdef USE_COLOR\n\n\t\t\t\tvColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t#endif\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\n\t\t\t#endif\n\n\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\tvUv = uv;\n\n\t\t\t// camera space\n\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\tif ( perspective ) {\n\n\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// clip space\n\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t// ndc space\n\t\t\tvec2 ndcStart = clipStart.xy / clipStart.w;\n\t\t\tvec2 ndcEnd = clipEnd.xy / clipEnd.w;\n\n\t\t\t// direction\n\t\t\tvec2 dir = ndcEnd - ndcStart;\n\n\t\t\t// account for clip-space aspect ratio\n\t\t\tdir.x *= aspect;\n\t\t\tdir = normalize( dir );\n\n\t\t\t// perpendicular to dir\n\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\n\t\t\t// undo aspect ratio adjustment\n\t\t\tdir.x /= aspect;\n\t\t\toffset.x /= aspect;\n\n\t\t\t// sign flip\n\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t// endcaps\n\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\toffset += - dir;\n\n\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\toffset += dir;\n\n\t\t\t}\n\n\t\t\t// adjust for linewidth\n\t\t\toffset *= linewidth;\n\n\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\toffset /= resolution.y;\n\n\t\t\t// select end\n\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t// back to clip space\n\t\t\toffset *= clip.w;\n\n\t\t\tclip.xy += offset;\n\n\t\t\tgl_Position = clip;\n\n\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\n\t\t}\n\t\t`,\n\n\tfragmentShader:\n\t\t`\n\t\tuniform vec3 diffuse;\n\t\tuniform float opacity;\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashSize;\n\t\t\tuniform float dashOffset;\n\t\t\tuniform float gapSize;\n\n\t\t#endif\n\n\t\tvarying float vLineDistance;\n\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\t#include \n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t#endif\n\n\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\tfloat a = vUv.x;\n\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t}\n\n\t\t\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t\t\t#include \n\t\t\t#include \n\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, diffuseColor.a );\n\n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\n\t\t}\n\t\t`\n};\n\nvar LineMaterial = function ( parameters ) {\n\n\tShaderMaterial.call( this, {\n\n\t\ttype: 'LineMaterial',\n\n\t\tuniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ),\n\n\t\tvertexShader: ShaderLib[ 'line' ].vertexShader,\n\t\tfragmentShader: ShaderLib[ 'line' ].fragmentShader,\n\n\t\tclipping: true // required for clipping support\n\n\t} );\n\n\tthis.dashed = false;\n\n\tObject.defineProperties( this, {\n\n\t\tcolor: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.diffuse.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.diffuse.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tlinewidth: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.linewidth.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.linewidth.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdashScale: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.dashScale.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.dashScale.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdashSize: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.dashSize.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.dashSize.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdashOffset: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.dashOffset.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.dashOffset.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgapSize: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.gapSize.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.gapSize.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\topacity: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.opacity.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.opacity.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tresolution: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.resolution.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.resolution.value.copy( value );\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tthis.setValues( parameters );\n\n};\n\nLineMaterial.prototype = Object.create( ShaderMaterial.prototype );\nLineMaterial.prototype.constructor = LineMaterial;\n\nLineMaterial.prototype.isLineMaterial = true;\n\nexport { LineMaterial };\n","import {\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tLine3,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tVector3,\n\tVector4\n} from '../build/three.module.js';\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry.js';\nimport { LineMaterial } from '../lines/LineMaterial.js';\n\nvar LineSegments2 = function ( geometry, material ) {\n\n\tif ( geometry === undefined ) geometry = new LineSegmentsGeometry();\n\tif ( material === undefined ) material = new LineMaterial( { color: Math.random() * 0xffffff } );\n\n\tMesh.call( this, geometry, material );\n\n\tthis.type = 'LineSegments2';\n\n};\n\nLineSegments2.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\tconstructor: LineSegments2,\n\n\tisLineSegments2: true,\n\n\tcomputeLineDistances: ( function () { // for backwards-compatability, but could be a method of LineSegmentsGeometry...\n\n\t\tvar start = new Vector3();\n\t\tvar end = new Vector3();\n\n\t\treturn function computeLineDistances() {\n\n\t\t\tvar geometry = this.geometry;\n\n\t\t\tvar instanceStart = geometry.attributes.instanceStart;\n\t\t\tvar instanceEnd = geometry.attributes.instanceEnd;\n\t\t\tvar lineDistances = new Float32Array( 2 * instanceStart.data.count );\n\n\t\t\tfor ( var i = 0, j = 0, l = instanceStart.data.count; i < l; i ++, j += 2 ) {\n\n\t\t\t\tstart.fromBufferAttribute( instanceStart, i );\n\t\t\t\tend.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\n\t\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + start.distanceTo( end );\n\n\t\t\t}\n\n\t\t\tvar instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\n\n\t\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\n\t\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() ),\n\n\traycast: ( function () {\n\n\t\tvar start = new Vector4();\n\t\tvar end = new Vector4();\n\n\t\tvar ssOrigin = new Vector4();\n\t\tvar ssOrigin3 = new Vector3();\n\t\tvar mvMatrix = new Matrix4();\n\t\tvar line = new Line3();\n\t\tvar closestPoint = new Vector3();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tif ( raycaster.camera === null ) {\n\n\t\t\t\tconsole.error( 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2.' );\n\n\t\t\t}\n\n\t\t\tvar threshold = ( raycaster.params.Line2 !== undefined ) ? raycaster.params.Line2.threshold || 0 : 0;\n\n\t\t\tvar ray = raycaster.ray;\n\t\t\tvar camera = raycaster.camera;\n\t\t\tvar projectionMatrix = camera.projectionMatrix;\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar material = this.material;\n\t\t\tvar resolution = material.resolution;\n\t\t\tvar lineWidth = material.linewidth + threshold;\n\n\t\t\tvar instanceStart = geometry.attributes.instanceStart;\n\t\t\tvar instanceEnd = geometry.attributes.instanceEnd;\n\n\t\t\t// pick a point 1 unit out along the ray to avoid the ray origin\n\t\t\t// sitting at the camera origin which will cause \"w\" to be 0 when\n\t\t\t// applying the projection matrix.\n\t\t\tray.at( 1, ssOrigin );\n\n\t\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t\tssOrigin.w = 1;\n\t\t\tssOrigin.applyMatrix4( camera.matrixWorldInverse );\n\t\t\tssOrigin.applyMatrix4( projectionMatrix );\n\t\t\tssOrigin.multiplyScalar( 1 / ssOrigin.w );\n\n\t\t\t// screen space\n\t\t\tssOrigin.x *= resolution.x / 2;\n\t\t\tssOrigin.y *= resolution.y / 2;\n\t\t\tssOrigin.z = 0;\n\n\t\t\tssOrigin3.copy( ssOrigin );\n\n\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\tmvMatrix.multiplyMatrices( camera.matrixWorldInverse, matrixWorld );\n\n\t\t\tfor ( var i = 0, l = instanceStart.count; i < l; i ++ ) {\n\n\t\t\t\tstart.fromBufferAttribute( instanceStart, i );\n\t\t\t\tend.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t\tstart.w = 1;\n\t\t\t\tend.w = 1;\n\n\t\t\t\t// camera space\n\t\t\t\tstart.applyMatrix4( mvMatrix );\n\t\t\t\tend.applyMatrix4( mvMatrix );\n\n\t\t\t\t// clip space\n\t\t\t\tstart.applyMatrix4( projectionMatrix );\n\t\t\t\tend.applyMatrix4( projectionMatrix );\n\n\t\t\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t\t\tstart.multiplyScalar( 1 / start.w );\n\t\t\t\tend.multiplyScalar( 1 / end.w );\n\n\t\t\t\t// skip the segment if it's outside the camera near and far planes\n\t\t\t\tvar isBehindCameraNear = start.z < - 1 && end.z < - 1;\n\t\t\t\tvar isPastCameraFar = start.z > 1 && end.z > 1;\n\t\t\t\tif ( isBehindCameraNear || isPastCameraFar ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// screen space\n\t\t\t\tstart.x *= resolution.x / 2;\n\t\t\t\tstart.y *= resolution.y / 2;\n\n\t\t\t\tend.x *= resolution.x / 2;\n\t\t\t\tend.y *= resolution.y / 2;\n\n\t\t\t\t// create 2d segment\n\t\t\t\tline.start.copy( start );\n\t\t\t\tline.start.z = 0;\n\n\t\t\t\tline.end.copy( end );\n\t\t\t\tline.end.z = 0;\n\n\t\t\t\t// get closest point on ray to segment\n\t\t\t\tvar param = line.closestPointToPointParameter( ssOrigin3, true );\n\t\t\t\tline.at( param, closestPoint );\n\n\t\t\t\t// check if the intersection point is within clip space\n\t\t\t\tvar zPos = MathUtils.lerp( start.z, end.z, param );\n\t\t\t\tvar isInClipSpace = zPos >= - 1 && zPos <= 1;\n\n\t\t\t\tvar isInside = ssOrigin3.distanceTo( closestPoint ) < lineWidth * 0.5;\n\n\t\t\t\tif ( isInClipSpace && isInside ) {\n\n\t\t\t\t\tline.start.fromBufferAttribute( instanceStart, i );\n\t\t\t\t\tline.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t\t\tline.start.applyMatrix4( matrixWorld );\n\t\t\t\t\tline.end.applyMatrix4( matrixWorld );\n\n\t\t\t\t\tvar pointOnLine = new Vector3();\n\t\t\t\t\tvar point = new Vector3();\n\n\t\t\t\t\tray.distanceSqToSegment( line.start, line.end, point, pointOnLine );\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tpoint: point,\n\t\t\t\t\t\tpointOnLine: pointOnLine,\n\t\t\t\t\t\tdistance: ray.origin.distanceTo( point ),\n\n\t\t\t\t\t\tobject: this,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: i,\n\t\t\t\t\t\tuv: null,\n\t\t\t\t\t\tuv2: null,\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}() )\n\n} );\n\nexport { LineSegments2 };\n","import { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry.js';\n\nvar LineGeometry = function () {\n\n\tLineSegmentsGeometry.call( this );\n\n\tthis.type = 'LineGeometry';\n\n};\n\nLineGeometry.prototype = Object.assign( Object.create( LineSegmentsGeometry.prototype ), {\n\n\tconstructor: LineGeometry,\n\n\tisLineGeometry: true,\n\n\tsetPositions: function ( array ) {\n\n\t\t// converts [ x1, y1, z1, x2, y2, z2, ... ] to pairs format\n\n\t\tvar length = array.length - 3;\n\t\tvar points = new Float32Array( 2 * length );\n\n\t\tfor ( var i = 0; i < length; i += 3 ) {\n\n\t\t\tpoints[ 2 * i ] = array[ i ];\n\t\t\tpoints[ 2 * i + 1 ] = array[ i + 1 ];\n\t\t\tpoints[ 2 * i + 2 ] = array[ i + 2 ];\n\n\t\t\tpoints[ 2 * i + 3 ] = array[ i + 3 ];\n\t\t\tpoints[ 2 * i + 4 ] = array[ i + 4 ];\n\t\t\tpoints[ 2 * i + 5 ] = array[ i + 5 ];\n\n\t\t}\n\n\t\tLineSegmentsGeometry.prototype.setPositions.call( this, points );\n\n\t\treturn this;\n\n\t},\n\n\tsetColors: function ( array ) {\n\n\t\t// converts [ r1, g1, b1, r2, g2, b2, ... ] to pairs format\n\n\t\tvar length = array.length - 3;\n\t\tvar colors = new Float32Array( 2 * length );\n\n\t\tfor ( var i = 0; i < length; i += 3 ) {\n\n\t\t\tcolors[ 2 * i ] = array[ i ];\n\t\t\tcolors[ 2 * i + 1 ] = array[ i + 1 ];\n\t\t\tcolors[ 2 * i + 2 ] = array[ i + 2 ];\n\n\t\t\tcolors[ 2 * i + 3 ] = array[ i + 3 ];\n\t\t\tcolors[ 2 * i + 4 ] = array[ i + 4 ];\n\t\t\tcolors[ 2 * i + 5 ] = array[ i + 5 ];\n\n\t\t}\n\n\t\tLineSegmentsGeometry.prototype.setColors.call( this, colors );\n\n\t\treturn this;\n\n\t},\n\n\tfromLine: function ( line ) {\n\n\t\tvar geometry = line.geometry;\n\n\t\tif ( geometry.isGeometry ) {\n\n\t\t\tthis.setPositions( geometry.vertices );\n\n\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t}\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( /* source */ ) {\n\n\t\t// todo\n\n\t\treturn this;\n\n\t}\n\n} );\n\nexport { LineGeometry };\n","import { LineSegments2 } from '../lines/LineSegments2.js';\nimport { LineGeometry } from '../lines/LineGeometry.js';\nimport { LineMaterial } from '../lines/LineMaterial.js';\n\nvar Line2 = function ( geometry, material ) {\n\n\tif ( geometry === undefined ) geometry = new LineGeometry();\n\tif ( material === undefined ) material = new LineMaterial( { color: Math.random() * 0xffffff } );\n\n\tLineSegments2.call( this, geometry, material );\n\n\tthis.type = 'Line2';\n\n};\n\nLine2.prototype = Object.assign( Object.create( LineSegments2.prototype ), {\n\n\tconstructor: Line2,\n\n\tisLine2: true\n\n} );\n\nexport { Line2 };\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {TextSprite} from \"../TextSprite.js\";\nimport {Utils} from \"../utils.js\";\nimport {Line2} from \"../../libs/three.js/lines/Line2.js\";\nimport {LineGeometry} from \"../../libs/three.js/lines/LineGeometry.js\";\nimport {LineMaterial} from \"../../libs/three.js/lines/LineMaterial.js\";\n\nfunction createHeightLine(){\n\tlet lineGeometry = new LineGeometry();\n\n\tlineGeometry.setPositions([\n\t\t0, 0, 0,\n\t\t0, 0, 0,\n\t]);\n\n\tlet lineMaterial = new LineMaterial({ \n\t\tcolor: 0x00ff00, \n\t\tdashSize: 5, \n\t\tgapSize: 2,\n\t\tlinewidth: 2, \n\t\tresolution: new THREE.Vector2(1000, 1000),\n\t});\n\n\tlineMaterial.depthTest = false;\n\tconst heightEdge = new Line2(lineGeometry, lineMaterial);\n\theightEdge.visible = false;\n\n\t//this.add(this.heightEdge);\n\t\n\treturn heightEdge;\n}\n\nfunction createHeightLabel(){\n\tconst heightLabel = new TextSprite('');\n\n\theightLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0});\n\theightLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\theightLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\theightLabel.fontsize = 16;\n\theightLabel.material.depthTest = false;\n\theightLabel.material.opacity = 1;\n\theightLabel.visible = false;\n\n\treturn heightLabel;\n}\n\nfunction createAreaLabel(){\n\tconst areaLabel = new TextSprite('');\n\n\tareaLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0});\n\tareaLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\tareaLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\tareaLabel.fontsize = 16;\n\tareaLabel.material.depthTest = false;\n\tareaLabel.material.opacity = 1;\n\tareaLabel.visible = false;\n\t\n\treturn areaLabel;\n}\n\nfunction createCircleRadiusLabel(){\n\tconst circleRadiusLabel = new TextSprite(\"\");\n\n\tcircleRadiusLabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0});\n\tcircleRadiusLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\tcircleRadiusLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\tcircleRadiusLabel.fontsize = 16;\n\tcircleRadiusLabel.material.depthTest = false;\n\tcircleRadiusLabel.material.opacity = 1;\n\tcircleRadiusLabel.visible = false;\n\t\n\treturn circleRadiusLabel;\n}\n\nfunction createCircleRadiusLine(){\n\tconst lineGeometry = new LineGeometry();\n\n\tlineGeometry.setPositions([\n\t\t0, 0, 0,\n\t\t0, 0, 0,\n\t]);\n\n\tconst lineMaterial = new LineMaterial({ \n\t\tcolor: 0xff0000, \n\t\tlinewidth: 2, \n\t\tresolution: new THREE.Vector2(1000, 1000),\n\t\tgapSize: 1,\n\t\tdashed: true,\n\t});\n\n\tlineMaterial.depthTest = false;\n\n\tconst circleRadiusLine = new Line2(lineGeometry, lineMaterial);\n\tcircleRadiusLine.visible = false;\n\n\treturn circleRadiusLine;\n}\n\nfunction createCircleLine(){\n\tconst coordinates = [];\n\n\tlet n = 128;\n\tfor(let i = 0; i <= n; i++){\n\t\tlet u0 = 2 * Math.PI * (i / n);\n\t\tlet u1 = 2 * Math.PI * (i + 1) / n;\n\n\t\tlet p0 = new THREE.Vector3(\n\t\t\tMath.cos(u0), \n\t\t\tMath.sin(u0), \n\t\t\t0\n\t\t);\n\n\t\tlet p1 = new THREE.Vector3(\n\t\t\tMath.cos(u1), \n\t\t\tMath.sin(u1), \n\t\t\t0\n\t\t);\n\n\t\tcoordinates.push(\n\t\t\t...p0.toArray(),\n\t\t\t...p1.toArray(),\n\t\t);\n\t}\n\n\tconst geometry = new LineGeometry();\n\tgeometry.setPositions(coordinates);\n\n\tconst material = new LineMaterial({ \n\t\tcolor: 0xff0000, \n\t\tdashSize: 5, \n\t\tgapSize: 2,\n\t\tlinewidth: 2, \n\t\tresolution: new THREE.Vector2(1000, 1000),\n\t});\n\n\tmaterial.depthTest = false;\n\n\tconst circleLine = new Line2(geometry, material);\n\tcircleLine.visible = false;\n\tcircleLine.computeLineDistances();\n\n\treturn circleLine;\n}\n\nfunction createCircleCenter(){\n\tconst sg = new THREE.SphereGeometry(1, 32, 32);\n\tconst sm = new THREE.MeshNormalMaterial();\n\t\n\tconst circleCenter = new THREE.Mesh(sg, sm);\n\tcircleCenter.visible = false;\n\n\treturn circleCenter;\n}\n\nfunction createLine(){\n\tconst geometry = new LineGeometry();\n\n\tgeometry.setPositions([\n\t\t0, 0, 0,\n\t\t0, 0, 0,\n\t]);\n\n\tconst material = new LineMaterial({ \n\t\tcolor: 0xff0000, \n\t\tlinewidth: 2, \n\t\tresolution: new THREE.Vector2(1000, 1000),\n\t\tgapSize: 1,\n\t\tdashed: true,\n\t});\n\n\tmaterial.depthTest = false;\n\n\tconst line = new Line2(geometry, material);\n\n\treturn line;\n}\n\nfunction createCircle(){\n\n\tconst coordinates = [];\n\n\tlet n = 128;\n\tfor(let i = 0; i <= n; i++){\n\t\tlet u0 = 2 * Math.PI * (i / n);\n\t\tlet u1 = 2 * Math.PI * (i + 1) / n;\n\n\t\tlet p0 = new THREE.Vector3(\n\t\t\tMath.cos(u0), \n\t\t\tMath.sin(u0), \n\t\t\t0\n\t\t);\n\n\t\tlet p1 = new THREE.Vector3(\n\t\t\tMath.cos(u1), \n\t\t\tMath.sin(u1), \n\t\t\t0\n\t\t);\n\n\t\tcoordinates.push(\n\t\t\t...p0.toArray(),\n\t\t\t...p1.toArray(),\n\t\t);\n\t}\n\n\tconst geometry = new LineGeometry();\n\tgeometry.setPositions(coordinates);\n\n\tconst material = new LineMaterial({ \n\t\tcolor: 0xff0000, \n\t\tdashSize: 5, \n\t\tgapSize: 2,\n\t\tlinewidth: 2, \n\t\tresolution: new THREE.Vector2(1000, 1000),\n\t});\n\n\tmaterial.depthTest = false;\n\n\tconst line = new Line2(geometry, material);\n\tline.computeLineDistances();\n\n\treturn line;\n\n}\n\nfunction createAzimuth(){\n\n\tconst azimuth = {\n\t\tlabel: null,\n\t\tcenter: null,\n\t\ttarget: null,\n\t\tnorth: null,\n\t\tcenterToNorth: null,\n\t\tcenterToTarget: null,\n\t\tcenterToTargetground: null,\n\t\ttargetgroundToTarget: null,\n\t\tcircle: null,\n\n\t\tnode: null,\n\t};\n\n\tconst sg = new THREE.SphereGeometry(1, 32, 32);\n\tconst sm = new THREE.MeshNormalMaterial();\n\n\t{\n\t\tconst label = new TextSprite(\"\");\n\n\t\tlabel.setTextColor({r: 140, g: 250, b: 140, a: 1.0});\n\t\tlabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\tlabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\tlabel.fontsize = 16;\n\t\tlabel.material.depthTest = false;\n\t\tlabel.material.opacity = 1;\n\n\t\tazimuth.label = label;\n\t}\n\n\tazimuth.center = new THREE.Mesh(sg, sm);\n\tazimuth.target = new THREE.Mesh(sg, sm);\n\tazimuth.north = new THREE.Mesh(sg, sm);\n\tazimuth.centerToNorth = createLine();\n\tazimuth.centerToTarget = createLine();\n\tazimuth.centerToTargetground = createLine();\n\tazimuth.targetgroundToTarget = createLine();\n\tazimuth.circle = createCircle();\n\n\tazimuth.node = new THREE.Object3D();\n\tazimuth.node.add(\n\t\tazimuth.centerToNorth,\n\t\tazimuth.centerToTarget,\n\t\tazimuth.centerToTargetground,\n\t\tazimuth.targetgroundToTarget,\n\t\tazimuth.circle,\n\t\tazimuth.label,\n\t\tazimuth.center,\n\t\tazimuth.target,\n\t\tazimuth.north,\n\t);\n\n\treturn azimuth;\n}\n\nexport class Measure extends THREE.Object3D {\n\tconstructor () {\n\t\tsuper();\n\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\n\t\tthis.name = 'Measure_' + this.constructor.counter;\n\t\tthis.points = [];\n\t\tthis._showDistances = true;\n\t\tthis._showCoordinates = false;\n\t\tthis._showArea = false;\n\t\tthis._closed = true;\n\t\tthis._showAngles = false;\n\t\tthis._showCircle = false;\n\t\tthis._showHeight = false;\n\t\tthis._showEdges = true;\n\t\tthis._showAzimuth = false;\n\t\tthis.maxMarkers = Number.MAX_SAFE_INTEGER;\n\n\t\tthis.sphereGeometry = new THREE.SphereGeometry(0.4, 10, 10);\n\t\tthis.color = new THREE.Color(0xff0000);\n\n\t\tthis.spheres = [];\n\t\tthis.edges = [];\n\t\tthis.sphereLabels = [];\n\t\tthis.edgeLabels = [];\n\t\tthis.angleLabels = [];\n\t\tthis.coordinateLabels = [];\n\n\t\tthis.heightEdge = createHeightLine();\n\t\tthis.heightLabel = createHeightLabel();\n\t\tthis.areaLabel = createAreaLabel();\n\t\tthis.circleRadiusLabel = createCircleRadiusLabel();\n\t\tthis.circleRadiusLine = createCircleRadiusLine();\n\t\tthis.circleLine = createCircleLine();\n\t\tthis.circleCenter = createCircleCenter();\n\n\t\tthis.azimuth = createAzimuth();\n\n\t\tthis.add(this.heightEdge);\n\t\tthis.add(this.heightLabel);\n\t\tthis.add(this.areaLabel);\n\t\tthis.add(this.circleRadiusLabel);\n\t\tthis.add(this.circleRadiusLine);\n\t\tthis.add(this.circleLine);\n\t\tthis.add(this.circleCenter);\n\n\t\tthis.add(this.azimuth.node);\n\n\t}\n\n\tcreateSphereMaterial () {\n\t\tlet sphereMaterial = new THREE.MeshLambertMaterial({\n\t\t\t//shading: THREE.SmoothShading,\n\t\t\tcolor: this.color,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false}\n\t\t);\n\n\t\treturn sphereMaterial;\n\t};\n\n\taddMarker (point) {\n\t\tif (point.x != null) {\n\t\t\tpoint = {position: point};\n\t\t}else if(point instanceof Array){\n\t\t\tpoint = {position: new THREE.Vector3(...point)};\n\t\t}\n\t\tthis.points.push(point);\n\n\t\t// sphere\n\t\tlet sphere = new THREE.Mesh(this.sphereGeometry, this.createSphereMaterial());\n\n\t\tthis.add(sphere);\n\t\tthis.spheres.push(sphere);\n\n\t\t{ // edges\n\t\t\tlet lineGeometry = new LineGeometry();\n\t\t\tlineGeometry.setPositions( [\n\t\t\t\t\t0, 0, 0,\n\t\t\t\t\t0, 0, 0,\n\t\t\t]);\n\n\t\t\tlet lineMaterial = new LineMaterial({\n\t\t\t\tcolor: 0xff0000, \n\t\t\t\tlinewidth: 2, \n\t\t\t\tresolution: new THREE.Vector2(1000, 1000),\n\t\t\t});\n\n\t\t\tlineMaterial.depthTest = false;\n\n\t\t\tlet edge = new Line2(lineGeometry, lineMaterial);\n\t\t\tedge.visible = true;\n\n\t\t\tthis.add(edge);\n\t\t\tthis.edges.push(edge);\n\t\t}\n\n\t\t{ // edge labels\n\t\t\tlet edgeLabel = new TextSprite();\n\t\t\tedgeLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tedgeLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tedgeLabel.material.depthTest = false;\n\t\t\tedgeLabel.visible = false;\n\t\t\tedgeLabel.fontsize = 16;\n\t\t\tthis.edgeLabels.push(edgeLabel);\n\t\t\tthis.add(edgeLabel);\n\t\t}\n\n\t\t{ // angle labels\n\t\t\tlet angleLabel = new TextSprite();\n\t\t\tangleLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tangleLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tangleLabel.fontsize = 16;\n\t\t\tangleLabel.material.depthTest = false;\n\t\t\tangleLabel.material.opacity = 1;\n\t\t\tangleLabel.visible = false;\n\t\t\tthis.angleLabels.push(angleLabel);\n\t\t\tthis.add(angleLabel);\n\t\t}\n\n\t\t{ // coordinate labels\n\t\t\tlet coordinateLabel = new TextSprite();\n\t\t\tcoordinateLabel.setBorderColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tcoordinateLabel.setBackgroundColor({r: 0, g: 0, b: 0, a: 1.0});\n\t\t\tcoordinateLabel.fontsize = 16;\n\t\t\tcoordinateLabel.material.depthTest = false;\n\t\t\tcoordinateLabel.material.opacity = 1;\n\t\t\tcoordinateLabel.visible = false;\n\t\t\tthis.coordinateLabels.push(coordinateLabel);\n\t\t\tthis.add(coordinateLabel);\n\t\t}\n\n\t\t{ // Event Listeners\n\t\t\tlet drag = (e) => {\n\t\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\t\te.drag.end, \n\t\t\t\t\te.viewer.scene.getActiveCamera(), \n\t\t\t\t\te.viewer, \n\t\t\t\t\te.viewer.scene.pointclouds,\n\t\t\t\t\t{pickClipped: true});\n\n\t\t\t\tif (I) {\n\t\t\t\t\tlet i = this.spheres.indexOf(e.drag.object);\n\t\t\t\t\tif (i !== -1) {\n\t\t\t\t\t\tlet point = this.points[i];\n\t\t\t\t\t\t\n\t\t\t\t\t\t// loop through current keys and cleanup ones that will be orphaned\n\t\t\t\t\t\tfor (let key of Object.keys(point)) {\n\t\t\t\t\t\t\tif (!I.point[key]) {\n\t\t\t\t\t\t\t\tdelete point[key];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (let key of Object.keys(I.point).filter(e => e !== 'position')) {\n\t\t\t\t\t\t\tpoint[key] = I.point[key];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.setPosition(i, I.location);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet drop = e => {\n\t\t\t\tlet i = this.spheres.indexOf(e.drag.object);\n\t\t\t\tif (i !== -1) {\n\t\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\t\t'type': 'marker_dropped',\n\t\t\t\t\t\t'measurement': this,\n\t\t\t\t\t\t'index': i\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet mouseover = (e) => e.object.material.emissive.setHex(0x888888);\n\t\t\tlet mouseleave = (e) => e.object.material.emissive.setHex(0x000000);\n\n\t\t\tsphere.addEventListener('drag', drag);\n\t\t\tsphere.addEventListener('drop', drop);\n\t\t\tsphere.addEventListener('mouseover', mouseover);\n\t\t\tsphere.addEventListener('mouseleave', mouseleave);\n\t\t}\n\n\t\tlet event = {\n\t\t\ttype: 'marker_added',\n\t\t\tmeasurement: this,\n\t\t\tsphere: sphere\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.setMarker(this.points.length - 1, point);\n\t};\n\n\tremoveMarker (index) {\n\t\tthis.points.splice(index, 1);\n\n\t\tthis.remove(this.spheres[index]);\n\n\t\tlet edgeIndex = (index === 0) ? 0 : (index - 1);\n\t\tthis.remove(this.edges[edgeIndex]);\n\t\tthis.edges.splice(edgeIndex, 1);\n\n\t\tthis.remove(this.edgeLabels[edgeIndex]);\n\t\tthis.edgeLabels.splice(edgeIndex, 1);\n\t\tthis.coordinateLabels.splice(index, 1);\n\n\t\tthis.remove(this.angleLabels[index]);\n\t\tthis.angleLabels.splice(index, 1);\n\n\t\tthis.spheres.splice(index, 1);\n\n\t\tthis.update();\n\n\t\tthis.dispatchEvent({type: 'marker_removed', measurement: this});\n\t};\n\n\tsetMarker (index, point) {\n\t\tthis.points[index] = point;\n\n\t\tlet event = {\n\t\t\ttype: 'marker_moved',\n\t\t\tmeasure:\tthis,\n\t\t\tindex:\tindex,\n\t\t\tposition: point.position.clone()\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.update();\n\t}\n\n\tsetPosition (index, position) {\n\t\tlet point = this.points[index];\n\t\tpoint.position.copy(position);\n\n\t\tlet event = {\n\t\t\ttype: 'marker_moved',\n\t\t\tmeasure:\tthis,\n\t\t\tindex:\tindex,\n\t\t\tposition: position.clone()\n\t\t};\n\t\tthis.dispatchEvent(event);\n\n\t\tthis.update();\n\t};\n\n\tgetArea () {\n\t\tlet area = 0;\n\t\tlet j = this.points.length - 1;\n\n\t\tfor (let i = 0; i < this.points.length; i++) {\n\t\t\tlet p1 = this.points[i].position;\n\t\t\tlet p2 = this.points[j].position;\n\t\t\tarea += (p2.x + p1.x) * (p1.y - p2.y);\n\t\t\tj = i;\n\t\t}\n\n\t\treturn Math.abs(area / 2);\n\t};\n\n\tgetTotalDistance () {\n\t\tif (this.points.length === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet distance = 0;\n\n\t\tfor (let i = 1; i < this.points.length; i++) {\n\t\t\tlet prev = this.points[i - 1].position;\n\t\t\tlet curr = this.points[i].position;\n\t\t\tlet d = prev.distanceTo(curr);\n\n\t\t\tdistance += d;\n\t\t}\n\n\t\tif (this.closed && this.points.length > 1) {\n\t\t\tlet first = this.points[0].position;\n\t\t\tlet last = this.points[this.points.length - 1].position;\n\t\t\tlet d = last.distanceTo(first);\n\n\t\t\tdistance += d;\n\t\t}\n\n\t\treturn distance;\n\t}\n\n\tgetAngleBetweenLines (cornerPoint, point1, point2) {\n\t\tlet v1 = new THREE.Vector3().subVectors(point1.position, cornerPoint.position);\n\t\tlet v2 = new THREE.Vector3().subVectors(point2.position, cornerPoint.position);\n\n\t\t// avoid the error printed by threejs if denominator is 0\n\t\tconst denominator = Math.sqrt( v1.lengthSq() * v2.lengthSq() );\n\t\tif(denominator === 0){\n\t\t\treturn 0;\n\t\t}else{\n\t\t\treturn v1.angleTo(v2);\n\t\t}\n\t};\n\n\tgetAngle (index) {\n\t\tif (this.points.length < 3 || index >= this.points.length) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet previous = (index === 0) ? this.points[this.points.length - 1] : this.points[index - 1];\n\t\tlet point = this.points[index];\n\t\tlet next = this.points[(index + 1) % (this.points.length)];\n\n\t\treturn this.getAngleBetweenLines(point, previous, next);\n\t}\n\n\t// updateAzimuth(){\n\t// \t// if(this.points.length !== 2){\n\t// \t// \treturn;\n\t// \t// }\n\n\t// \t// const azimuth = this.azimuth;\n\n\t// \t// const [p0, p1] = this.points;\n\n\t// \t// const r = p0.position.distanceTo(p1.position);\n\t\t\n\t// }\n\n\tupdate () {\n\t\tif (this.points.length === 0) {\n\t\t\treturn;\n\t\t} else if (this.points.length === 1) {\n\t\t\tlet point = this.points[0];\n\t\t\tlet position = point.position;\n\t\t\tthis.spheres[0].position.copy(position);\n\n\t\t\t{ // coordinate labels\n\t\t\t\tlet coordinateLabel = this.coordinateLabels[0];\n\t\t\t\t\n\t\t\t\tlet msg = position.toArray().map(p => Utils.addCommas(p.toFixed(2))).join(\" / \");\n\t\t\t\tcoordinateLabel.setText(msg);\n\n\t\t\t\tcoordinateLabel.visible = this.showCoordinates;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet lastIndex = this.points.length - 1;\n\n\t\tlet centroid = new THREE.Vector3();\n\t\tfor (let i = 0; i <= lastIndex; i++) {\n\t\t\tlet point = this.points[i];\n\t\t\tcentroid.add(point.position);\n\t\t}\n\t\tcentroid.divideScalar(this.points.length);\n\n\t\tfor (let i = 0; i <= lastIndex; i++) {\n\t\t\tlet index = i;\n\t\t\tlet nextIndex = (i + 1 > lastIndex) ? 0 : i + 1;\n\t\t\tlet previousIndex = (i === 0) ? lastIndex : i - 1;\n\n\t\t\tlet point = this.points[index];\n\t\t\tlet nextPoint = this.points[nextIndex];\n\t\t\tlet previousPoint = this.points[previousIndex];\n\n\t\t\tlet sphere = this.spheres[index];\n\n\t\t\t// spheres\n\t\t\tsphere.position.copy(point.position);\n\t\t\tsphere.material.color = this.color;\n\n\t\t\t{ // edges\n\t\t\t\tlet edge = this.edges[index];\n\n\t\t\t\tedge.material.color = this.color;\n\n\t\t\t\tedge.position.copy(point.position);\n\n\t\t\t\tedge.geometry.setPositions([\n\t\t\t\t\t0, 0, 0,\n\t\t\t\t\t...nextPoint.position.clone().sub(point.position).toArray(),\n\t\t\t\t]);\n\n\t\t\t\tedge.geometry.verticesNeedUpdate = true;\n\t\t\t\tedge.geometry.computeBoundingSphere();\n\t\t\t\tedge.computeLineDistances();\n\t\t\t\tedge.visible = index < lastIndex || this.closed;\n\t\t\t\t\n\t\t\t\tif(!this.showEdges){\n\t\t\t\t\tedge.visible = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t{ // edge labels\n\t\t\t\tlet edgeLabel = this.edgeLabels[i];\n\n\t\t\t\tlet center = new THREE.Vector3().add(point.position);\n\t\t\t\tcenter.add(nextPoint.position);\n\t\t\t\tcenter = center.multiplyScalar(0.5);\n\t\t\t\tlet distance = point.position.distanceTo(nextPoint.position);\n\n\t\t\t\tedgeLabel.position.copy(center);\n\n\t\t\t\tlet suffix = \"\";\n\t\t\t\tif(this.lengthUnit != null && this.lengthUnitDisplay != null){\n\t\t\t\t\tdistance = distance / this.lengthUnit.unitspermeter * this.lengthUnitDisplay.unitspermeter; //convert to meters then to the display unit\n\t\t\t\t\tsuffix = this.lengthUnitDisplay.code;\n\t\t\t\t}\n\n\t\t\t\tlet txtLength = Utils.addCommas(distance.toFixed(2));\n\t\t\t\tedgeLabel.setText(`${txtLength} ${suffix}`);\n\t\t\t\tedgeLabel.visible = this.showDistances && (index < lastIndex || this.closed) && this.points.length >= 2 && distance > 0;\n\t\t\t}\n\n\t\t\t{ // angle labels\n\t\t\t\tlet angleLabel = this.angleLabels[i];\n\t\t\t\tlet angle = this.getAngleBetweenLines(point, previousPoint, nextPoint);\n\n\t\t\t\tlet dir = nextPoint.position.clone().sub(previousPoint.position);\n\t\t\t\tdir.multiplyScalar(0.5);\n\t\t\t\tdir = previousPoint.position.clone().add(dir).sub(point.position).normalize();\n\n\t\t\t\tlet dist = Math.min(point.position.distanceTo(previousPoint.position), point.position.distanceTo(nextPoint.position));\n\t\t\t\tdist = dist / 9;\n\n\t\t\t\tlet labelPos = point.position.clone().add(dir.multiplyScalar(dist));\n\t\t\t\tangleLabel.position.copy(labelPos);\n\n\t\t\t\tlet msg = Utils.addCommas((angle * (180.0 / Math.PI)).toFixed(1)) + '\\u00B0';\n\t\t\t\tangleLabel.setText(msg);\n\n\t\t\t\tangleLabel.visible = this.showAngles && (index < lastIndex || this.closed) && this.points.length >= 3 && angle > 0;\n\t\t\t}\n\t\t}\n\n\t\t{ // update height stuff\n\t\t\tlet heightEdge = this.heightEdge;\n\t\t\theightEdge.visible = this.showHeight;\n\t\t\tthis.heightLabel.visible = this.showHeight;\n\n\t\t\tif (this.showHeight) {\n\t\t\t\tlet sorted = this.points.slice().sort((a, b) => a.position.z - b.position.z);\n\t\t\t\tlet lowPoint = sorted[0].position.clone();\n\t\t\t\tlet highPoint = sorted[sorted.length - 1].position.clone();\n\t\t\t\tlet min = lowPoint.z;\n\t\t\t\tlet max = highPoint.z;\n\t\t\t\tlet height = max - min;\n\n\t\t\t\tlet start = new THREE.Vector3(highPoint.x, highPoint.y, min);\n\t\t\t\tlet end = new THREE.Vector3(highPoint.x, highPoint.y, max);\n\n\t\t\t\theightEdge.position.copy(lowPoint);\n\n\t\t\t\theightEdge.geometry.setPositions([\n\t\t\t\t\t0, 0, 0,\n\t\t\t\t\t...start.clone().sub(lowPoint).toArray(),\n\t\t\t\t\t...start.clone().sub(lowPoint).toArray(),\n\t\t\t\t\t...end.clone().sub(lowPoint).toArray(),\n\t\t\t\t]);\n\n\t\t\t\theightEdge.geometry.verticesNeedUpdate = true;\n\t\t\t\t// heightEdge.geometry.computeLineDistances();\n\t\t\t\t// heightEdge.geometry.lineDistancesNeedUpdate = true;\n\t\t\t\theightEdge.geometry.computeBoundingSphere();\n\t\t\t\theightEdge.computeLineDistances();\n\n\t\t\t\t// heightEdge.material.dashSize = height / 40;\n\t\t\t\t// heightEdge.material.gapSize = height / 40;\n\n\t\t\t\tlet heightLabelPosition = start.clone().add(end).multiplyScalar(0.5);\n\t\t\t\tthis.heightLabel.position.copy(heightLabelPosition);\n\n\t\t\t\tlet suffix = \"\";\n\t\t\t\tif(this.lengthUnit != null && this.lengthUnitDisplay != null){\n\t\t\t\t\theight = height / this.lengthUnit.unitspermeter * this.lengthUnitDisplay.unitspermeter; //convert to meters then to the display unit\n\t\t\t\t\tsuffix = this.lengthUnitDisplay.code;\n\t\t\t\t}\n\n\t\t\t\tlet txtHeight = Utils.addCommas(height.toFixed(2));\n\t\t\t\tlet msg = `${txtHeight} ${suffix}`;\n\t\t\t\tthis.heightLabel.setText(msg);\n\t\t\t}\n\t\t}\n\n\t\t{ // update circle stuff\n\t\t\tconst circleRadiusLabel = this.circleRadiusLabel;\n\t\t\tconst circleRadiusLine = this.circleRadiusLine;\n\t\t\tconst circleLine = this.circleLine;\n\t\t\tconst circleCenter = this.circleCenter;\n\n\t\t\tconst circleOkay = this.points.length === 3;\n\n\t\t\tcircleRadiusLabel.visible = this.showCircle && circleOkay;\n\t\t\tcircleRadiusLine.visible = this.showCircle && circleOkay;\n\t\t\tcircleLine.visible = this.showCircle && circleOkay;\n\t\t\tcircleCenter.visible = this.showCircle && circleOkay;\n\n\t\t\tif(this.showCircle && circleOkay){\n\n\t\t\t\tconst A = this.points[0].position;\n\t\t\t\tconst B = this.points[1].position;\n\t\t\t\tconst C = this.points[2].position;\n\t\t\t\tconst AB = B.clone().sub(A);\n\t\t\t\tconst AC = C.clone().sub(A);\n\t\t\t\tconst N = AC.clone().cross(AB).normalize();\n\n\t\t\t\tconst center = Potree.Utils.computeCircleCenter(A, B, C);\n\t\t\t\tconst radius = center.distanceTo(A);\n\n\n\t\t\t\tconst scale = radius / 20;\n\t\t\t\tcircleCenter.position.copy(center);\n\t\t\t\tcircleCenter.scale.set(scale, scale, scale);\n\n\t\t\t\t//circleRadiusLine.geometry.vertices[0].set(0, 0, 0);\n\t\t\t\t//circleRadiusLine.geometry.vertices[1].copy(B.clone().sub(center));\n\n\t\t\t\tcircleRadiusLine.geometry.setPositions( [\n\t\t\t\t\t0, 0, 0,\n\t\t\t\t\t...B.clone().sub(center).toArray()\n\t\t\t\t] );\n\n\t\t\t\tcircleRadiusLine.geometry.verticesNeedUpdate = true;\n\t\t\t\tcircleRadiusLine.geometry.computeBoundingSphere();\n\t\t\t\tcircleRadiusLine.position.copy(center);\n\t\t\t\tcircleRadiusLine.computeLineDistances();\n\n\t\t\t\tconst target = center.clone().add(N);\n\t\t\t\tcircleLine.position.copy(center);\n\t\t\t\tcircleLine.scale.set(radius, radius, radius);\n\t\t\t\tcircleLine.lookAt(target);\n\t\t\t\t\n\t\t\t\tcircleRadiusLabel.visible = true;\n\t\t\t\tcircleRadiusLabel.position.copy(center.clone().add(B).multiplyScalar(0.5));\n\t\t\t\tcircleRadiusLabel.setText(`${radius.toFixed(3)}`);\n\n\t\t\t}\n\t\t}\n\n\t\t{ // update area label\n\t\t\tthis.areaLabel.position.copy(centroid);\n\t\t\tthis.areaLabel.visible = this.showArea && this.points.length >= 3;\n\t\t\tlet area = this.getArea();\n\n\t\t\tlet suffix = \"\";\n\t\t\tif(this.lengthUnit != null && this.lengthUnitDisplay != null){\n\t\t\t\tarea = area / Math.pow(this.lengthUnit.unitspermeter, 2) * Math.pow(this.lengthUnitDisplay.unitspermeter, 2); //convert to square meters then to the square display unit\n\t\t\t\tsuffix = this.lengthUnitDisplay.code;\n\t\t\t}\n\n\t\t\tlet txtArea = Utils.addCommas(area.toFixed(1));\n\t\t\tlet msg = `${txtArea} ${suffix}\\u00B2`;\n\t\t\tthis.areaLabel.setText(msg);\n\t\t}\n\n\t\t// this.updateAzimuth();\n\t};\n\n\traycast (raycaster, intersects) {\n\t\tfor (let i = 0; i < this.points.length; i++) {\n\t\t\tlet sphere = this.spheres[i];\n\n\t\t\tsphere.raycast(raycaster, intersects);\n\t\t}\n\n\t\t// recalculate distances because they are not necessarely correct\n\t\t// for scaled objects.\n\t\t// see https://github.com/mrdoob/three.js/issues/5827\n\t\t// TODO: remove this once the bug has been fixed\n\t\tfor (let i = 0; i < intersects.length; i++) {\n\t\t\tlet I = intersects[i];\n\t\t\tI.distance = raycaster.ray.origin.distanceTo(I.point);\n\t\t}\n\t\tintersects.sort(function (a, b) { return a.distance - b.distance; });\n\t};\n\n\tget showCoordinates () {\n\t\treturn this._showCoordinates;\n\t}\n\n\tset showCoordinates (value) {\n\t\tthis._showCoordinates = value;\n\t\tthis.update();\n\t}\n\n\tget showAngles () {\n\t\treturn this._showAngles;\n\t}\n\n\tset showAngles (value) {\n\t\tthis._showAngles = value;\n\t\tthis.update();\n\t}\n\n\tget showCircle () {\n\t\treturn this._showCircle;\n\t}\n\n\tset showCircle (value) {\n\t\tthis._showCircle = value;\n\t\tthis.update();\n\t}\n\n\tget showAzimuth(){\n\t\treturn this._showAzimuth;\n\t}\n\n\tset showAzimuth(value){\n\t\tthis._showAzimuth = value;\n\t\tthis.update();\n\t}\n\n\tget showEdges () {\n\t\treturn this._showEdges;\n\t}\n\n\tset showEdges (value) {\n\t\tthis._showEdges = value;\n\t\tthis.update();\n\t}\n\n\tget showHeight () {\n\t\treturn this._showHeight;\n\t}\n\n\tset showHeight (value) {\n\t\tthis._showHeight = value;\n\t\tthis.update();\n\t}\n\n\tget showArea () {\n\t\treturn this._showArea;\n\t}\n\n\tset showArea (value) {\n\t\tthis._showArea = value;\n\t\tthis.update();\n\t}\n\n\tget closed () {\n\t\treturn this._closed;\n\t}\n\n\tset closed (value) {\n\t\tthis._closed = value;\n\t\tthis.update();\n\t}\n\n\tget showDistances () {\n\t\treturn this._showDistances;\n\t}\n\n\tset showDistances (value) {\n\t\tthis._showDistances = value;\n\t\tthis.update();\n\t}\n\n}\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nexport class PolygonClipVolume extends THREE.Object3D{\n\t\n\tconstructor(camera){\n\t\tsuper();\n\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\t\tthis.name = \"polygon_clip_volume_\" + this.constructor.counter;\n\n\t\tthis.camera = camera.clone();\n\t\tthis.camera.rotation.set(...camera.rotation.toArray()); // [r85] workaround because camera.clone() doesn't work on rotation\n\t\tthis.camera.rotation.order = camera.rotation.order;\n\t\tthis.camera.updateMatrixWorld();\n\t\tthis.camera.updateProjectionMatrix();\n\t\tthis.camera.matrixWorldInverse.copy(this.camera.matrixWorld).invert();\n\n\t\tthis.viewMatrix = this.camera.matrixWorldInverse.clone();\n\t\tthis.projMatrix = this.camera.projectionMatrix.clone();\n\n\t\t// projected markers\n\t\tthis.markers = [];\n\t\tthis.initialized = false;\n\t}\n\n\taddMarker() {\n\n\t\tlet marker = new THREE.Mesh();\n\n\t\tlet cancel;\n\n\t\tlet drag = e => {\n\t\t\tlet size = e.viewer.renderer.getSize(new THREE.Vector2());\n\t\t\tlet projectedPos = new THREE.Vector3(\n\t\t\t\t2.0 * (e.drag.end.x / size.width) - 1.0,\n\t\t\t\t-2.0 * (e.drag.end.y / size.height) + 1.0,\n\t\t\t\t0\n\t\t\t);\n\n\t\t\tmarker.position.copy(projectedPos);\n\t\t};\n\t\t\n\t\tlet drop = e => {\t\n\t\t\tcancel();\n\t\t};\n\t\t\n\t\tcancel = e => {\n\t\t\tmarker.removeEventListener(\"drag\", drag);\n\t\t\tmarker.removeEventListener(\"drop\", drop);\n\t\t};\n\t\t\n\t\tmarker.addEventListener(\"drag\", drag);\n\t\tmarker.addEventListener(\"drop\", drop);\n\n\n\t\tthis.markers.push(marker);\n\t}\n\n\tremoveLastMarker() {\n\t\tif(this.markers.length > 0) {\n\t\t\tthis.markers.splice(this.markers.length - 1, 1);\n\t\t}\n\t}\n\n};","\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\nimport {XHRFactory} from \"./XHRFactory.js\";\nimport {Volume} from \"./utils/Volume.js\";\nimport {Profile} from \"./utils/Profile.js\";\nimport {Measure} from \"./utils/Measure.js\";\nimport {PolygonClipVolume} from \"./utils/PolygonClipVolume.js\";\n\nexport class Utils {\n\tstatic async loadShapefileFeatures (file, callback) {\n\t\tlet features = [];\n\n\t\tlet handleFinish = () => {\n\t\t\tcallback(features);\n\t\t};\n\n\t\tlet source = await shapefile.open(file);\n\n\t\twhile(true){\n\t\t\tlet result = await source.read();\n\n\t\t\tif (result.done) {\n\t\t\t\thandleFinish();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (result.value && result.value.type === 'Feature' && result.value.geometry !== undefined) {\n\t\t\t\tfeatures.push(result.value);\n\t\t\t}\n\t\t}\n\n\t}\n\n\tstatic toString (value) {\n\t\tif (value.x != null) {\n\t\t\treturn value.x.toFixed(2) + ', ' + value.y.toFixed(2) + ', ' + value.z.toFixed(2);\n\t\t} else {\n\t\t\treturn '' + value + '';\n\t\t}\n\t}\n\n\tstatic normalizeURL (url) {\n\t\tlet u = new URL(url);\n\n\t\treturn u.protocol + '//' + u.hostname + u.pathname.replace(/\\/+/g, '/');\n\t};\n\n\tstatic pathExists (url) {\n\t\tlet req = XHRFactory.createXMLHttpRequest();\n\t\treq.open('GET', url, false);\n\t\treq.send(null);\n\t\tif (req.status !== 200) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tstatic debugSphere(parent, position, scale, color){\n\t\tlet geometry = new THREE.SphereGeometry(1, 8, 8);\n\t\tlet material;\n\n\t\tif(color !== undefined){\n\t\t\tmaterial = new THREE.MeshBasicMaterial({color: color});\n\t\t}else{\n\t\t\tmaterial = new THREE.MeshNormalMaterial();\n\t\t}\n\t\tlet sphere = new THREE.Mesh(geometry, material);\n\t\tsphere.position.copy(position);\n\t\tsphere.scale.set(scale, scale, scale);\n\t\tparent.add(sphere);\n\n\t\treturn sphere;\n\t}\n\n\tstatic debugLine(parent, start, end, color){\n\n\t\tlet material = new THREE.LineBasicMaterial({ color: color }); \n\t\tlet geometry = new THREE.Geometry();\n\n\t\tconst p1 = new THREE.Vector3(0, 0, 0);\n\t\tconst p2 = end.clone().sub(start);\n\n\t\tgeometry.vertices.push(p1, p2);\n\n\t\tlet tl = new THREE.Line( geometry, material );\n\t\ttl.position.copy(start);\n\n\t\tparent.add(tl);\n\n\t\tlet line = {\n\t\t\tnode: tl,\n\t\t\tset: (start, end) => {\n\t\t\t\tgeometry.vertices[0].copy(start);\n\t\t\t\tgeometry.vertices[1].copy(end);\n\t\t\t\tgeometry.verticesNeedUpdate = true;\n\t\t\t},\n\t\t};\n\n\t\treturn line;\n\t}\n\n\tstatic debugCircle(parent, center, radius, normal, color){\n\t\tlet material = new THREE.LineBasicMaterial({ color: color });\n\n\t\tlet geometry = new THREE.Geometry();\n\n\t\tlet n = 32;\n\t\tfor(let i = 0; i <= n; i++){\n\t\t\tlet u0 = 2 * Math.PI * (i / n);\n\t\t\tlet u1 = 2 * Math.PI * (i + 1) / n;\n\n\t\t\tlet p0 = new THREE.Vector3(\n\t\t\t\tMath.cos(u0), \n\t\t\t\tMath.sin(u0), \n\t\t\t\t0\n\t\t\t);\n\n\t\t\tlet p1 = new THREE.Vector3(\n\t\t\t\tMath.cos(u1), \n\t\t\t\tMath.sin(u1), \n\t\t\t\t0\n\t\t\t);\n\n\t\t\tgeometry.vertices.push(p0, p1); \n\t\t}\n\n\t\tlet tl = new THREE.Line( geometry, material ); \n\t\ttl.position.copy(center);\n\t\ttl.scale.set(radius, radius, radius);\n\n\t\tparent.add(tl);\n\t}\n\n\tstatic debugBox(parent, box, transform = new THREE.Matrix4(), color = 0xFFFF00){\n\t\t\n\t\tlet vertices = [\n\t\t\t[box.min.x, box.min.y, box.min.z],\n\t\t\t[box.min.x, box.min.y, box.max.z],\n\t\t\t[box.min.x, box.max.y, box.min.z],\n\t\t\t[box.min.x, box.max.y, box.max.z],\n\n\t\t\t[box.max.x, box.min.y, box.min.z],\n\t\t\t[box.max.x, box.min.y, box.max.z],\n\t\t\t[box.max.x, box.max.y, box.min.z],\n\t\t\t[box.max.x, box.max.y, box.max.z],\n\t\t].map(v => new THREE.Vector3(...v));\n\n\t\tlet edges = [\n\t\t\t[0, 4], [4, 5], [5, 1], [1, 0],\n\t\t\t[2, 6], [6, 7], [7, 3], [3, 2],\n\t\t\t[0, 2], [4, 6], [5, 7], [1, 3]\n\t\t];\n\n\t\tlet center = box.getCenter(new THREE.Vector3());\n\n\t\tlet centroids = [\n\t\t\t{position: [box.min.x, center.y, center.z], color: 0xFF0000},\n\t\t\t{position: [box.max.x, center.y, center.z], color: 0x880000},\n\n\t\t\t{position: [center.x, box.min.y, center.z], color: 0x00FF00},\n\t\t\t{position: [center.x, box.max.y, center.z], color: 0x008800},\n\n\t\t\t{position: [center.x, center.y, box.min.z], color: 0x0000FF},\n\t\t\t{position: [center.x, center.y, box.max.z], color: 0x000088},\n\t\t];\n\n\t\tfor(let vertex of vertices){\n\t\t\tlet pos = vertex.clone().applyMatrix4(transform);\n\n\t\t\tUtils.debugSphere(parent, pos, 0.1, 0xFF0000);\n\t\t}\n\n\t\tfor(let edge of edges){\n\t\t\tlet start = vertices[edge[0]].clone().applyMatrix4(transform);\n\t\t\tlet end = vertices[edge[1]].clone().applyMatrix4(transform);\n\n\t\t\tUtils.debugLine(parent, start, end, color);\n\t\t}\n\n\t\tfor(let centroid of centroids){\n\t\t\tlet pos = new THREE.Vector3(...centroid.position).applyMatrix4(transform);\n\n\t\t\tUtils.debugSphere(parent, pos, 0.1, centroid.color);\n\t\t}\n\t}\n\n\tstatic debugPlane(parent, plane, size = 1, color = 0x0000FF){\n\n\t\tlet planehelper = new THREE.PlaneHelper(plane, size, color);\n\n\t\tparent.add(planehelper);\n\n\t}\n\n\t/**\n\t * adapted from mhluska at https://github.com/mrdoob/three.js/issues/1561\n\t */\n\tstatic computeTransformedBoundingBox (box, transform) {\n\t\tlet vertices = [\n\t\t\tnew THREE.Vector3(box.min.x, box.min.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.min.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.min.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.max.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.min.y, box.max.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.max.y, box.max.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.max.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.min.y, box.max.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.max.y, box.max.z).applyMatrix4(transform)\n\t\t];\n\n\t\tlet boundingBox = new THREE.Box3();\n\t\tboundingBox.setFromPoints(vertices);\n\n\t\treturn boundingBox;\n\t};\n\n\t/**\n\t * add separators to large numbers\n\t *\n\t * @param nStr\n\t * @returns\n\t */\n\tstatic addCommas (nStr) {\n\t\tnStr += '';\n\t\tlet x = nStr.split('.');\n\t\tlet x1 = x[0];\n\t\tlet x2 = x.length > 1 ? '.' + x[1] : '';\n\t\tlet rgx = /(\\d+)(\\d{3})/;\n\t\twhile (rgx.test(x1)) {\n\t\t\tx1 = x1.replace(rgx, '$1' + ',' + '$2');\n\t\t}\n\t\treturn x1 + x2;\n\t};\n\n\tstatic removeCommas (str) {\n\t\treturn str.replace(/,/g, '');\n\t}\n\n\t/**\n\t * create worker from a string\n\t *\n\t * code from http://stackoverflow.com/questions/10343913/how-to-create-a-web-worker-from-a-string\n\t */\n\tstatic createWorker (code) {\n\t\tlet blob = new Blob([code], {type: 'application/javascript'});\n\t\tlet worker = new Worker(URL.createObjectURL(blob));\n\n\t\treturn worker;\n\t};\n\n\tstatic moveTo(scene, endPosition, endTarget){\n\n\t\tlet view = scene.view;\n\t\tlet camera = scene.getActiveCamera();\n\t\tlet animationDuration = 500;\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\t{ // animate camera position\n\t\t\tlet tween = new TWEEN.Tween(view.position).to(endPosition, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\ttween.start();\n\t\t}\n\n\t\t{ // animate camera target\n\t\t\tlet camTargetDistance = camera.position.distanceTo(endTarget);\n\t\t\tlet target = new THREE.Vector3().addVectors(\n\t\t\t\tcamera.position,\n\t\t\t\tcamera.getWorldDirection(new THREE.Vector3()).clone().multiplyScalar(camTargetDistance)\n\t\t\t);\n\t\t\tlet tween = new TWEEN.Tween(target).to(endTarget, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tview.lookAt(target);\n\t\t\t});\n\t\t\ttween.onComplete(() => {\n\t\t\t\tview.lookAt(target);\n\t\t\t});\n\t\t\ttween.start();\n\t\t}\n\n\t}\n\n\tstatic loadSkybox (path) {\n\t\tlet parent = new THREE.Object3D(\"skybox_root\");\n\n\t\tlet camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 100000);\n\t\tcamera.up.set(0, 0, 1);\n\t\tlet scene = new THREE.Scene();\n\n\t\tlet format = '.jpg';\n\t\tlet urls = [\n\t\t\tpath + 'px' + format, path + 'nx' + format,\n\t\t\tpath + 'py' + format, path + 'ny' + format,\n\t\t\tpath + 'pz' + format, path + 'nz' + format\n\t\t];\n\n\t\tlet materialArray = [];\n\t\t{\n\t\t\tfor (let i = 0; i < 6; i++) {\n\t\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\t\tmap: null,\n\t\t\t\t\tside: THREE.BackSide,\n\t\t\t\t\tdepthTest: false,\n\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\tcolor: 0x424556\n\t\t\t\t});\n\n\t\t\t\tmaterialArray.push(material);\n\n\t\t\t\tlet loader = new THREE.TextureLoader();\n\t\t\t\tloader.load(urls[i],\n\t\t\t\t\tfunction loaded (texture) {\n\t\t\t\t\t\tmaterial.map = texture;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t\t\tmaterial.color.setHex(0xffffff);\n\t\t\t\t\t}, function progress (xhr) {\n\t\t\t\t\t\t// console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );\n\t\t\t\t\t}, function error (xhr) {\n\t\t\t\t\t\tconsole.log('An error happened', xhr);\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tlet skyGeometry = new THREE.CubeGeometry(700, 700, 700);\n\t\tlet skybox = new THREE.Mesh(skyGeometry, materialArray);\n\n\t\tscene.add(skybox);\n\n\t\tscene.traverse(n => n.frustumCulled = false);\n\n\t\t// z up\n\t\tscene.rotation.x = Math.PI / 2;\n\n\t\tparent.children.push(camera);\n\t\tcamera.parent = parent;\n\n\t\treturn {camera, scene, parent};\n\t};\n\n\tstatic createGrid (width, length, spacing, color) {\n\t\tlet material = new THREE.LineBasicMaterial({\n\t\t\tcolor: color || 0x888888\n\t\t});\n\n\t\tlet geometry = new THREE.Geometry();\n\t\tfor (let i = 0; i <= length; i++) {\n\t\t\tgeometry.vertices.push(new THREE.Vector3(-(spacing * width) / 2, i * spacing - (spacing * length) / 2, 0));\n\t\t\tgeometry.vertices.push(new THREE.Vector3(+(spacing * width) / 2, i * spacing - (spacing * length) / 2, 0));\n\t\t}\n\n\t\tfor (let i = 0; i <= width; i++) {\n\t\t\tgeometry.vertices.push(new THREE.Vector3(i * spacing - (spacing * width) / 2, -(spacing * length) / 2, 0));\n\t\t\tgeometry.vertices.push(new THREE.Vector3(i * spacing - (spacing * width) / 2, +(spacing * length) / 2, 0));\n\t\t}\n\n\t\tlet line = new THREE.LineSegments(geometry, material, THREE.LinePieces);\n\t\tline.receiveShadow = true;\n\t\treturn line;\n\t}\n\n\tstatic createBackgroundTexture (width, height) {\n\t\tfunction gauss (x, y) {\n\t\t\treturn (1 / (2 * Math.PI)) * Math.exp(-(x * x + y * y) / 2);\n\t\t};\n\n\t\t// map.magFilter = THREE.NearestFilter;\n\t\tlet size = width * height;\n\t\tlet data = new Uint8Array(3 * size);\n\n\t\tlet chroma = [1, 1.5, 1.7];\n\t\tlet max = gauss(0, 0);\n\n\t\tfor (let x = 0; x < width; x++) {\n\t\t\tfor (let y = 0; y < height; y++) {\n\t\t\t\tlet u = 2 * (x / width) - 1;\n\t\t\t\tlet v = 2 * (y / height) - 1;\n\n\t\t\t\tlet i = x + width * y;\n\t\t\t\tlet d = gauss(2 * u, 2 * v) / max;\n\t\t\t\tlet r = (Math.random() + Math.random() + Math.random()) / 3;\n\t\t\t\tr = (d * 0.5 + 0.5) * r * 0.03;\n\t\t\t\tr = r * 0.4;\n\n\t\t\t\t// d = Math.pow(d, 0.6);\n\n\t\t\t\tdata[3 * i + 0] = 255 * (d / 15 + 0.05 + r) * chroma[0];\n\t\t\t\tdata[3 * i + 1] = 255 * (d / 15 + 0.05 + r) * chroma[1];\n\t\t\t\tdata[3 * i + 2] = 255 * (d / 15 + 0.05 + r) * chroma[2];\n\t\t\t}\n\t\t}\n\n\t\tlet texture = new THREE.DataTexture(data, width, height, THREE.RGBFormat);\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\t}\n\n\tstatic getMousePointCloudIntersection (mouse, camera, viewer, pointclouds, params = {}) {\n\t\t\n\t\tlet renderer = viewer.renderer;\n\t\t\n\t\tlet nmouse = {\n\t\t\tx: (mouse.x / renderer.domElement.clientWidth) * 2 - 1,\n\t\t\ty: -(mouse.y / renderer.domElement.clientHeight) * 2 + 1\n\t\t};\n\n\t\tlet pickParams = {};\n\n\t\tif(params.pickClipped){\n\t\t\tpickParams.pickClipped = params.pickClipped;\n\t\t}\n\n\t\tpickParams.x = mouse.x;\n\t\tpickParams.y = renderer.domElement.clientHeight - mouse.y;\n\n\t\tlet raycaster = new THREE.Raycaster();\n\t\traycaster.setFromCamera(nmouse, camera);\n\t\tlet ray = raycaster.ray;\n\n\t\tlet selectedPointcloud = null;\n\t\tlet closestDistance = Infinity;\n\t\tlet closestIntersection = null;\n\t\tlet closestPoint = null;\n\t\t\n\t\tfor(let pointcloud of pointclouds){\n\t\t\tlet point = pointcloud.pick(viewer, camera, ray, pickParams);\n\t\t\t\n\t\t\tif(!point){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet distance = camera.position.distanceTo(point.position);\n\n\t\t\tif (distance < closestDistance) {\n\t\t\t\tclosestDistance = distance;\n\t\t\t\tselectedPointcloud = pointcloud;\n\t\t\t\tclosestIntersection = point.position;\n\t\t\t\tclosestPoint = point;\n\t\t\t}\n\t\t}\n\n\t\tif (selectedPointcloud) {\n\t\t\treturn {\n\t\t\t\tlocation: closestIntersection,\n\t\t\t\tdistance: closestDistance,\n\t\t\t\tpointcloud: selectedPointcloud,\n\t\t\t\tpoint: closestPoint\n\t\t\t};\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tstatic pixelsArrayToImage (pixels, width, height) {\n\t\tlet canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tlet context = canvas.getContext('2d');\n\n\t\tpixels = new pixels.constructor(pixels);\n\n\t\tfor (let i = 0; i < pixels.length; i++) {\n\t\t\tpixels[i * 4 + 3] = 255;\n\t\t}\n\n\t\tlet imageData = context.createImageData(width, height);\n\t\timageData.data.set(pixels);\n\t\tcontext.putImageData(imageData, 0, 0);\n\n\t\tlet img = new Image();\n\t\timg.src = canvas.toDataURL();\n\t\t// img.style.transform = \"scaleY(-1)\";\n\n\t\treturn img;\n\t}\n\n\tstatic pixelsArrayToDataUrl(pixels, width, height) {\n\t\tlet canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tlet context = canvas.getContext('2d');\n\n\t\tpixels = new pixels.constructor(pixels);\n\n\t\tfor (let i = 0; i < pixels.length; i++) {\n\t\t\tpixels[i * 4 + 3] = 255;\n\t\t}\n\n\t\tlet imageData = context.createImageData(width, height);\n\t\timageData.data.set(pixels);\n\t\tcontext.putImageData(imageData, 0, 0);\n\n\t\tlet dataURL = canvas.toDataURL();\n\n\t\treturn dataURL;\n\t}\n\n\tstatic pixelsArrayToCanvas(pixels, width, height){\n\t\tlet canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tlet context = canvas.getContext('2d');\n\n\t\tpixels = new pixels.constructor(pixels);\n\n\t\t//for (let i = 0; i < pixels.length; i++) {\n\t\t//\tpixels[i * 4 + 3] = 255;\n\t\t//}\n\n\t\t// flip vertically\n\t\tlet bytesPerLine = width * 4;\n\t\tfor(let i = 0; i < parseInt(height / 2); i++){\n\t\t\tlet j = height - i - 1;\n\n\t\t\tlet lineI = pixels.slice(i * bytesPerLine, i * bytesPerLine + bytesPerLine);\n\t\t\tlet lineJ = pixels.slice(j * bytesPerLine, j * bytesPerLine + bytesPerLine);\n\t\t\tpixels.set(lineJ, i * bytesPerLine);\n\t\t\tpixels.set(lineI, j * bytesPerLine);\n\t\t}\n\n\t\tlet imageData = context.createImageData(width, height);\n\t\timageData.data.set(pixels);\n\t\tcontext.putImageData(imageData, 0, 0);\n\n\t\treturn canvas;\n\t}\n\n\tstatic removeListeners(dispatcher, type){\n\t\tif (dispatcher._listeners === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (dispatcher._listeners[ type ]) {\n\t\t\tdelete dispatcher._listeners[ type ];\n\t\t}\n\t}\n\n\tstatic mouseToRay(mouse, camera, width, height){\n\n\t\tlet normalizedMouse = {\n\t\t\tx: (mouse.x / width) * 2 - 1,\n\t\t\ty: -(mouse.y / height) * 2 + 1\n\t\t};\n\n\t\tlet vector = new THREE.Vector3(normalizedMouse.x, normalizedMouse.y, 0.5);\n\t\tlet origin = camera.position.clone();\n\t\tvector.unproject(camera);\n\t\tlet direction = new THREE.Vector3().subVectors(vector, origin).normalize();\n\n\t\tlet ray = new THREE.Ray(origin, direction);\n\n\t\treturn ray;\n\t}\n\n\tstatic projectedRadius(radius, camera, distance, screenWidth, screenHeight){\n\t\tif(camera instanceof THREE.OrthographicCamera){\n\t\t\treturn Utils.projectedRadiusOrtho(radius, camera.projectionMatrix, screenWidth, screenHeight);\n\t\t}else if(camera instanceof THREE.PerspectiveCamera){\n\t\t\treturn Utils.projectedRadiusPerspective(radius, camera.fov * Math.PI / 180, distance, screenHeight);\n\t\t}else{\n\t\t\tthrow new Error(\"invalid parameters\");\n\t\t}\n\t}\n\n\tstatic projectedRadiusPerspective(radius, fov, distance, screenHeight) {\n\t\tlet projFactor = (1 / Math.tan(fov / 2)) / distance;\n\t\tprojFactor = projFactor * screenHeight / 2;\n\n\t\treturn radius * projFactor;\n\t}\n\n\tstatic projectedRadiusOrtho(radius, proj, screenWidth, screenHeight) {\n\t\tlet p1 = new THREE.Vector4(0);\n\t\tlet p2 = new THREE.Vector4(radius);\n\n\t\tp1.applyMatrix4(proj);\n\t\tp2.applyMatrix4(proj);\n\t\tp1 = new THREE.Vector3(p1.x, p1.y, p1.z);\n\t\tp2 = new THREE.Vector3(p2.x, p2.y, p2.z);\n\t\tp1.x = (p1.x + 1.0) * 0.5 * screenWidth;\n\t\tp1.y = (p1.y + 1.0) * 0.5 * screenHeight;\n\t\tp2.x = (p2.x + 1.0) * 0.5 * screenWidth;\n\t\tp2.y = (p2.y + 1.0) * 0.5 * screenHeight;\n\t\treturn p1.distanceTo(p2);\n\t}\n\t\t\n\t\t\n\tstatic topView(camera, node){\n\t\tcamera.position.set(0, 1, 0);\n\t\tcamera.rotation.set(-Math.PI / 2, 0, 0);\n\t\tcamera.zoomTo(node, 1);\n\t}\n\n\tstatic frontView (camera, node) {\n\t\tcamera.position.set(0, 0, 1);\n\t\tcamera.rotation.set(0, 0, 0);\n\t\tcamera.zoomTo(node, 1);\n\t}\n\n\tstatic leftView (camera, node) {\n\t\tcamera.position.set(-1, 0, 0);\n\t\tcamera.rotation.set(0, -Math.PI / 2, 0);\n\t\tcamera.zoomTo(node, 1);\n\t}\n\n\tstatic rightView (camera, node) {\n\t\tcamera.position.set(1, 0, 0);\n\t\tcamera.rotation.set(0, Math.PI / 2, 0);\n\t\tcamera.zoomTo(node, 1);\n\t}\n\n\t\n\tstatic findClosestGpsTime(target, viewer){\n\t\tconst start = performance.now();\n\n\t\tconst nodes = [];\n\t\tfor(const pc of viewer.scene.pointclouds){\n\t\t\tnodes.push(pc.root);\n\n\t\t\tfor(const child of pc.root.children){\n\t\t\t\tif(child){\n\t\t\t\t\tnodes.push(child);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet closestNode = null;\n\t\tlet closestIndex = Infinity;\n\t\tlet closestDistance = Infinity;\n\t\tlet closestValue = 0;\n\n\t\tfor(const node of nodes){\n\n\t\t\tconst isOkay = node.geometryNode != null \n\t\t\t\t&& node.geometryNode.geometry != null\n\t\t\t\t&& node.sceneNode != null;\n\n\t\t\tif(!isOkay){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet geometry = node.geometryNode.geometry;\n\t\t\tlet gpsTime = geometry.attributes[\"gps-time\"];\n\t\t\tlet range = gpsTime.potree.range;\n\n\t\t\tfor(let i = 0; i < gpsTime.array.length; i++){\n\t\t\t\tlet value = gpsTime.array[i];\n\t\t\t\tvalue = value * (range[1] - range[0]) + range[0];\n\t\t\t\tconst distance = Math.abs(target - value);\n\n\t\t\t\tif(distance < closestDistance){\n\t\t\t\t\tclosestIndex = i;\n\t\t\t\t\tclosestDistance = distance;\n\t\t\t\t\tclosestValue = value;\n\t\t\t\t\tclosestNode = node;\n\t\t\t\t\t//console.log(\"found a closer one: \" + value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst geometry = closestNode.geometryNode.geometry;\n\t\tconst position = new THREE.Vector3(\n\t\t\tgeometry.attributes.position.array[3 * closestIndex + 0],\n\t\t\tgeometry.attributes.position.array[3 * closestIndex + 1],\n\t\t\tgeometry.attributes.position.array[3 * closestIndex + 2],\n\t\t);\n\n\t\tposition.applyMatrix4(closestNode.sceneNode.matrixWorld);\n\n\t\tconst end = performance.now();\n\t\tconst duration = (end - start);\n\t\tconsole.log(`duration: ${duration.toFixed(3)}ms`);\n\n\t\treturn {\n\t\t\tnode: closestNode,\n\t\t\tindex: closestIndex,\n\t\t\tposition: position,\n\t\t};\n\t}\n\n\t/**\n\t *\n\t * 0: no intersection\n\t * 1: intersection\n\t * 2: fully inside\n\t */\n\tstatic frustumSphereIntersection (frustum, sphere) {\n\t\tlet planes = frustum.planes;\n\t\tlet center = sphere.center;\n\t\tlet negRadius = -sphere.radius;\n\n\t\tlet minDistance = Number.MAX_VALUE;\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tlet distance = planes[ i ].distanceToPoint(center);\n\n\t\t\tif (distance < negRadius) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tminDistance = Math.min(minDistance, distance);\n\t\t}\n\n\t\treturn (minDistance >= sphere.radius) ? 2 : 1;\n\t}\n\n\t// code taken from three.js\n\t// ImageUtils - generateDataTexture()\n\tstatic generateDataTexture (width, height, color) {\n\t\tlet size = width * height;\n\t\tlet data = new Uint8Array(4 * width * height);\n\n\t\tlet r = Math.floor(color.r * 255);\n\t\tlet g = Math.floor(color.g * 255);\n\t\tlet b = Math.floor(color.b * 255);\n\n\t\tfor (let i = 0; i < size; i++) {\n\t\t\tdata[ i * 3 ] = r;\n\t\t\tdata[ i * 3 + 1 ] = g;\n\t\t\tdata[ i * 3 + 2 ] = b;\n\t\t}\n\n\t\tlet texture = new THREE.DataTexture(data, width, height, THREE.RGBAFormat);\n\t\ttexture.needsUpdate = true;\n\t\ttexture.magFilter = THREE.NearestFilter;\n\n\t\treturn texture;\n\t}\n\n\t// from http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript\n\tstatic getParameterByName (name) {\n\t\tname = name.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n\t\tlet regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)');\n\t\tlet results = regex.exec(document.location.search);\n\t\treturn results === null ? null : decodeURIComponent(results[1].replace(/\\+/g, ' '));\n\t}\n\n\tstatic setParameter (name, value) {\n\t\t// value = encodeURIComponent(value);\n\n\t\tname = name.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n\t\tlet regex = new RegExp('([\\\\?&])(' + name + '=([^&#]*))');\n\t\tlet results = regex.exec(document.location.search);\n\n\t\tlet url = window.location.href;\n\t\tif (results === null) {\n\t\t\tif (window.location.search.length === 0) {\n\t\t\t\turl = url + '?';\n\t\t\t} else {\n\t\t\t\turl = url + '&';\n\t\t\t}\n\n\t\t\turl = url + name + '=' + value;\n\t\t} else {\n\t\t\tlet newValue = name + '=' + value;\n\t\t\turl = url.replace(results[2], newValue);\n\t\t}\n\t\twindow.history.replaceState({}, '', url);\n\t}\n\n\tstatic createChildAABB(aabb, index){\n\t\tlet min = aabb.min.clone();\n\t\tlet max = aabb.max.clone();\n\t\tlet size = new THREE.Vector3().subVectors(max, min);\n\n\t\tif ((index & 0b0001) > 0) {\n\t\t\tmin.z += size.z / 2;\n\t\t} else {\n\t\t\tmax.z -= size.z / 2;\n\t\t}\n\n\t\tif ((index & 0b0010) > 0) {\n\t\t\tmin.y += size.y / 2;\n\t\t} else {\n\t\t\tmax.y -= size.y / 2;\n\t\t}\n\n\t\tif ((index & 0b0100) > 0) {\n\t\t\tmin.x += size.x / 2;\n\t\t} else {\n\t\t\tmax.x -= size.x / 2;\n\t\t}\n\n\t\treturn new THREE.Box3(min, max);\n\t}\n\n\t// see https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript\n\tstatic clipboardCopy(text){\n\t\tlet textArea = document.createElement(\"textarea\");\n\n\t\ttextArea.style.position = 'fixed';\n\t\ttextArea.style.top = 0;\n\t\ttextArea.style.left = 0;\n\n\t\ttextArea.style.width = '2em';\n\t\ttextArea.style.height = '2em';\n\n\t\ttextArea.style.padding = 0;\n\n\t\ttextArea.style.border = 'none';\n\t\ttextArea.style.outline = 'none';\n\t\ttextArea.style.boxShadow = 'none';\n\n\t\ttextArea.style.background = 'transparent';\n\n\t\ttextArea.value = text;\n\n\t\tdocument.body.appendChild(textArea);\n\n\t\ttextArea.select();\n\n\t\t try {\n\t\t\tlet success = document.execCommand('copy');\n\t\t\tif(success){\n\t\t\t\tconsole.log(\"copied text to clipboard\");\n\t\t\t}else{\n\t\t\t\tconsole.log(\"copy to clipboard failed\");\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.log(\"error while trying to copy to clipboard\");\n\t\t}\n\n\t\tdocument.body.removeChild(textArea);\n\n\t}\n\n\tstatic getMeasurementIcon(measurement){\n\t\tif (measurement instanceof Measure) {\n\t\t\tif (measurement.showDistances && !measurement.showArea && !measurement.showAngles) {\n\t\t\t\treturn `${Potree.resourcePath}/icons/distance.svg`;\n\t\t\t} else if (measurement.showDistances && measurement.showArea && !measurement.showAngles) {\n\t\t\t\treturn `${Potree.resourcePath}/icons/area.svg`;\n\t\t\t} else if (measurement.maxMarkers === 1) {\n\t\t\t\treturn `${Potree.resourcePath}/icons/point.svg`;\n\t\t\t} else if (!measurement.showDistances && !measurement.showArea && measurement.showAngles) {\n\t\t\t\treturn `${Potree.resourcePath}/icons/angle.png`;\n\t\t\t} else if (measurement.showHeight) {\n\t\t\t\treturn `${Potree.resourcePath}/icons/height.svg`;\n\t\t\t} else {\n\t\t\t\treturn `${Potree.resourcePath}/icons/distance.svg`;\n\t\t\t}\n\t\t} else if (measurement instanceof Profile) {\n\t\t\treturn `${Potree.resourcePath}/icons/profile.svg`;\n\t\t} else if (measurement instanceof Volume) {\n\t\t\treturn `${Potree.resourcePath}/icons/volume.svg`;\n\t\t} else if (measurement instanceof PolygonClipVolume) {\n\t\t\treturn `${Potree.resourcePath}/icons/clip-polygon.svg`;\n\t\t}\n\t}\n\n\tstatic lineToLineIntersection(P0, P1, P2, P3){\n\n\t\tconst P = [P0, P1, P2, P3];\n\n\t\tconst d = (m, n, o, p) => {\n\t\t\tlet result = \n\t\t\t\t (P[m].x - P[n].x) * (P[o].x - P[p].x)\n\t\t\t\t+ (P[m].y - P[n].y) * (P[o].y - P[p].y)\n\t\t\t\t+ (P[m].z - P[n].z) * (P[o].z - P[p].z);\n\n\t\t\treturn result;\n\t\t};\n\n\n\t\tconst mua = (d(0, 2, 3, 2) * d(3, 2, 1, 0) - d(0, 2, 1, 0) * d(3, 2, 3, 2))\n\t\t /**-----------------------------------------------------------------**/ /\n\t\t (d(1, 0, 1, 0) * d(3, 2, 3, 2) - d(3, 2, 1, 0) * d(3, 2, 1, 0));\n\n\n\t\tconst mub = (d(0, 2, 3, 2) + mua * d(3, 2, 1, 0))\n\t\t /**--------------------------------------**/ /\n\t\t d(3, 2, 3, 2);\n\n\n\t\tconst P01 = P1.clone().sub(P0);\n\t\tconst P23 = P3.clone().sub(P2);\n\t\t\n\t\tconst Pa = P0.clone().add(P01.multiplyScalar(mua));\n\t\tconst Pb = P2.clone().add(P23.multiplyScalar(mub));\n\n\t\tconst center = Pa.clone().add(Pb).multiplyScalar(0.5);\n\n\t\treturn center;\n\t}\n\n\tstatic computeCircleCenter(A, B, C){\n\t\tconst AB = B.clone().sub(A);\n\t\tconst AC = C.clone().sub(A);\n\n\t\tconst N = AC.clone().cross(AB).normalize();\n\n\t\tconst ab_dir = AB.clone().cross(N).normalize();\n\t\tconst ac_dir = AC.clone().cross(N).normalize();\n\n\t\tconst ab_origin = A.clone().add(B).multiplyScalar(0.5);\n\t\tconst ac_origin = A.clone().add(C).multiplyScalar(0.5);\n\n\t\tconst P0 = ab_origin;\n\t\tconst P1 = ab_origin.clone().add(ab_dir);\n\n\t\tconst P2 = ac_origin;\n\t\tconst P3 = ac_origin.clone().add(ac_dir);\n\n\t\tconst center = Utils.lineToLineIntersection(P0, P1, P2, P3);\n\n\t\treturn center;\n\n\t\t// Potree.Utils.debugLine(viewer.scene.scene, P0, P1, 0x00ff00);\n\t\t// Potree.Utils.debugLine(viewer.scene.scene, P2, P3, 0x0000ff);\n\n\t\t// Potree.Utils.debugSphere(viewer.scene.scene, center, 0.03, 0xff00ff);\n\n\t\t// const radius = center.distanceTo(A);\n\t\t// Potree.Utils.debugCircle(viewer.scene.scene, center, radius, new THREE.Vector3(0, 0, 1), 0xff00ff);\n\t}\n\n\tstatic getNorthVec(p1, distance, projection){\n\t\tif(projection){\n\t\t\t// if there is a projection, transform coordinates to WGS84\n\t\t\t// and compute angle to north there\n\n\t\t\tproj4.defs(\"pointcloud\", projection);\n\t\t\tconst transform = proj4(\"pointcloud\", \"WGS84\");\n\n\t\t\tconst llP1 = transform.forward(p1.toArray());\n\t\t\tlet llP2 = transform.forward([p1.x, p1.y + distance]);\n\t\t\tconst polarRadius = Math.sqrt((llP2[0] - llP1[0]) ** 2 + (llP2[1] - llP1[1]) ** 2);\n\t\t\tllP2 = [llP1[0], llP1[1] + polarRadius];\n\n\t\t\tconst northVec = transform.inverse(llP2);\n\t\t\t\n\t\t\treturn new THREE.Vector3(...northVec, p1.z).sub(p1);\n\t\t}else{\n\t\t\t// if there is no projection, assume [0, 1, 0] as north direction\n\n\t\t\tconst vec = new THREE.Vector3(0, 1, 0).multiplyScalar(distance);\n\t\t\t\n\t\t\treturn vec;\n\t\t}\n\t}\n\n\tstatic computeAzimuth(p1, p2, projection){\n\n\t\tlet azimuth = 0;\n\n\t\tif(projection){\n\t\t\t// if there is a projection, transform coordinates to WGS84\n\t\t\t// and compute angle to north there\n\n\t\t\tlet transform;\n\n\t\t\tif (projection.includes('EPSG')) {\n\t\t\t\ttransform = proj4(projection, \"WGS84\");\n\t\t\t} else {\n\t\t\t\tproj4.defs(\"pointcloud\", projection);\n\t\t\t\ttransform = proj4(\"pointcloud\", \"WGS84\");\n\t\t\t}\n\n\t\t\tconst llP1 = transform.forward(p1.toArray());\n\t\t\tconst llP2 = transform.forward(p2.toArray());\n\t\t\tconst dir = [\n\t\t\t\tllP2[0] - llP1[0],\n\t\t\t\tllP2[1] - llP1[1],\n\t\t\t];\n\t\t\tazimuth = Math.atan2(dir[1], dir[0]) - Math.PI / 2;\n\t\t}else{\n\t\t\t// if there is no projection, assume [0, 1, 0] as north direction\n\n\t\t\tconst dir = [p2.x - p1.x, p2.y - p1.y];\n\t\t\tazimuth = Math.atan2(dir[1], dir[0]) - Math.PI / 2;\n\t\t}\n\n\t\t// make clockwise\n\t\tazimuth = -azimuth;\n\n\t\treturn azimuth;\n\t}\n\n\tstatic async loadScript(url){\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tconst element = document.getElementById(url);\n\n\t\t\tif(element){\n\t\t\t\tresolve();\n\t\t\t}else{\n\t\t\t\tconst script = document.createElement(\"script\");\n\n\t\t\t\tscript.id = url;\n\n\t\t\t\tscript.onload = () => {\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\t\t\t\tscript.src = url;\n\n\t\t\t\tdocument.body.appendChild(script);\n\t\t\t}\n\t\t});\n\t}\n\n\tstatic createSvgGradient(scheme){\n\n\t\t// this is what we are creating:\n\t\t//\n\t\t//\n\t\t//\t\n\t\t//\t\t\n\t\t//\t\t\n\t\t//\t\t...\n\t\t//\t\t\n\t\t//\t\t\n\t\t//\t\n\t\t//\t\n\t\t//\t\n\t\t//\n\n\n\t\tconst gradientId = `${Math.random()}_${Date.now()}`;\n\t\t\n\t\tconst svgn = \"http://www.w3.org/2000/svg\";\n\t\tconst svg = document.createElementNS(svgn, \"svg\");\n\t\tsvg.setAttributeNS(null, \"width\", \"2em\");\n\t\tsvg.setAttributeNS(null, \"height\", \"3em\");\n\t\t\n\t\t{ // \n\t\t\tconst defs = document.createElementNS(svgn, \"defs\");\n\t\t\t\n\t\t\tconst linearGradient = document.createElementNS(svgn, \"linearGradient\");\n\t\t\tlinearGradient.setAttributeNS(null, \"id\", gradientId);\n\t\t\tlinearGradient.setAttributeNS(null, \"gradientTransform\", \"rotate(90)\");\n\n\t\t\tfor(let i = scheme.length - 1; i >= 0; i--){\n\t\t\t\tconst stopVal = scheme[i];\n\t\t\t\tconst percent = parseInt(100 - stopVal[0] * 100);\n\t\t\t\tconst [r, g, b] = stopVal[1].toArray().map(v => parseInt(v * 255));\n\n\t\t\t\tconst stop = document.createElementNS(svgn, \"stop\");\n\t\t\t\tstop.setAttributeNS(null, \"offset\", `${percent}%`);\n\t\t\t\tstop.setAttributeNS(null, \"stop-color\", `rgb(${r}, ${g}, ${b})`);\n\n\t\t\t\tlinearGradient.appendChild(stop);\n\t\t\t}\n\n\t\t\tdefs.appendChild(linearGradient);\n\t\t\tsvg.appendChild(defs);\n\t\t}\n\n\t\tconst rect = document.createElementNS(svgn, \"rect\");\n\t\trect.setAttributeNS(null, \"width\", `100%`);\n\t\trect.setAttributeNS(null, \"height\", `100%`);\n\t\trect.setAttributeNS(null, \"fill\", `url(\"#${gradientId}\")`);\n\t\trect.setAttributeNS(null, \"stroke\", `black`);\n\t\trect.setAttributeNS(null, \"stroke-width\", `0.1em`);\n\n\t\tsvg.appendChild(rect);\n\t\t\n\t\treturn svg;\n\t}\n\n\tstatic async waitAny(promises){\n\t\t\n\t\treturn new Promise( (resolve) => {\n\n\t\t\tpromises.map( promise => {\n\t\t\t\tpromise.then( () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t});\n\n\t}\n\n}\n\nUtils.screenPass = new function () {\n\tthis.screenScene = new THREE.Scene();\n\tthis.screenQuad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2, 1));\n\tthis.screenQuad.material.depthTest = true;\n\tthis.screenQuad.material.depthWrite = true;\n\tthis.screenQuad.material.transparent = true;\n\tthis.screenScene.add(this.screenQuad);\n\tthis.camera = new THREE.Camera();\n\n\tthis.render = function (renderer, material, target) {\n\t\tthis.screenQuad.material = material;\n\n\t\tif (typeof target === 'undefined') {\n\t\t\trenderer.render(this.screenScene, this.camera);\n\t\t} else {\n\t\t\trenderer.render(this.screenScene, this.camera, target);\n\t\t}\n\t};\n}();\n","\n\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\nimport {Action} from \"./Actions.js\";\nimport {Utils} from \"./utils.js\";\nimport {EventDispatcher} from \"./EventDispatcher.js\";\n\nexport class Annotation extends EventDispatcher {\n\tconstructor (args = {}) {\n\t\tsuper();\n\n\t\tthis.scene = null;\n\t\tthis._title = args.title || 'No Title';\n\t\tthis._description = args.description || '';\n\t\tthis.offset = new THREE.Vector3();\n\t\tthis.uuid = THREE.Math.generateUUID();\n\n\t\tif (!args.position) {\n\t\t\tthis.position = null;\n\t\t} else if (args.position.x != null) {\n\t\t\tthis.position = args.position;\n\t\t} else {\n\t\t\tthis.position = new THREE.Vector3(...args.position);\n\t\t}\n\n\t\tthis.cameraPosition = (args.cameraPosition instanceof Array)\n\t\t\t? new THREE.Vector3().fromArray(args.cameraPosition) : args.cameraPosition;\n\t\tthis.cameraTarget = (args.cameraTarget instanceof Array)\n\t\t\t? new THREE.Vector3().fromArray(args.cameraTarget) : args.cameraTarget;\n\t\tthis.radius = args.radius;\n\t\tthis.view = args.view || null;\n\t\tthis.keepOpen = false;\n\t\tthis.descriptionVisible = false;\n\t\tthis.showDescription = true;\n\t\tthis.actions = args.actions || [];\n\t\tthis.isHighlighted = false;\n\t\tthis._visible = true;\n\t\tthis.__visible = true;\n\t\tthis._display = true;\n\t\tthis._expand = false;\n\t\tthis.collapseThreshold = [args.collapseThreshold, 100].find(e => e !== undefined);\n\n\t\tthis.children = [];\n\t\tthis.parent = null;\n\t\tthis.boundingBox = new THREE.Box3();\n\n\t\tlet iconClose = exports.resourcePath + '/icons/close.svg';\n\n\t\tthis.domElement = $(`\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t${this._description}\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elTitlebar = this.domElement.find('.annotation-titlebar');\n\t\tthis.elTitle = this.elTitlebar.find('.annotation-label');\n\t\tthis.elTitle.append(this._title);\n\t\tthis.elDescription = this.domElement.find('.annotation-description');\n\t\tthis.elDescriptionClose = this.elDescription.find('.annotation-description-close');\n\t\t// this.elDescriptionContent = this.elDescription.find(\".annotation-description-content\");\n\n\t\tthis.clickTitle = () => {\n\t\t\tif(this.hasView()){\n\t\t\t\tthis.moveHere(this.scene.getActiveCamera());\n\t\t\t}\n\t\t\tthis.dispatchEvent({type: 'click', target: this});\n\t\t};\n\n\t\tthis.elTitle.click(this.clickTitle);\n\n\t\tthis.actions = this.actions.map(a => {\n\t\t\tif (a instanceof Action) {\n\t\t\t\treturn a;\n\t\t\t} else {\n\t\t\t\treturn new Action(a);\n\t\t\t}\n\t\t});\n\n\t\tfor (let action of this.actions) {\n\t\t\taction.pairWith(this);\n\t\t}\n\n\t\tlet actions = this.actions.filter(\n\t\t\ta => a.showIn === undefined || a.showIn.includes('scene'));\n\n\t\tfor (let action of actions) {\n\t\t\tlet elButton = $(``);\n\t\t\tthis.elTitlebar.append(elButton);\n\t\t\telButton.click(() => action.onclick({annotation: this}));\n\t\t}\n\n\t\tthis.elDescriptionClose.hover(\n\t\t\te => this.elDescriptionClose.css('opacity', '1'),\n\t\t\te => this.elDescriptionClose.css('opacity', '0.5')\n\t\t);\n\t\tthis.elDescriptionClose.click(e => this.setHighlighted(false));\n\t\t// this.elDescriptionContent.html(this._description);\n\n\t\tthis.domElement.mouseenter(e => this.setHighlighted(true));\n\t\tthis.domElement.mouseleave(e => this.setHighlighted(false));\n\n\t\tthis.domElement.on('touchstart', e => {\n\t\t\tthis.setHighlighted(!this.isHighlighted);\n\t\t});\n\n\t\tthis.display = false;\n\t\t//this.display = true;\n\n\t}\n\n\tinstallHandles(viewer){\n\t\tif(this.handles !== undefined){\n\t\t\treturn;\n\t\t}\n\n\t\tlet domElement = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t`);\n\t\t\n\t\tlet svg = domElement.find(\"svg\")[0];\n\t\tlet elLine = domElement.find(\"line\")[0];\n\t\tlet elStart = domElement.find(\"circle\")[0];\n\t\tlet elEnd = domElement.find(\"circle\")[1];\n\n\t\tlet setCoordinates = (start, end) => {\n\t\t\telStart.setAttribute(\"cx\", `${start.x}`);\n\t\t\telStart.setAttribute(\"cy\", `${start.y}`);\n\n\t\t\telEnd.setAttribute(\"cx\", `${end.x}`);\n\t\t\telEnd.setAttribute(\"cy\", `${end.y}`);\n\n\t\t\telLine.setAttribute(\"x1\", start.x);\n\t\t\telLine.setAttribute(\"y1\", start.y);\n\t\t\telLine.setAttribute(\"x2\", end.x);\n\t\t\telLine.setAttribute(\"y2\", end.y);\n\n\t\t\tlet box = svg.getBBox();\n\t\t\tsvg.setAttribute(\"width\", `${box.width}`);\n\t\t\tsvg.setAttribute(\"height\", `${box.height}`);\n\t\t\tsvg.setAttribute(\"viewBox\", `${box.x} ${box.y} ${box.width} ${box.height}`);\n\n\t\t\tlet ya = start.y - end.y;\n\t\t\tlet xa = start.x - end.x;\n\n\t\t\tif(ya > 0){\n\t\t\t\tstart.y = start.y - ya;\n\t\t\t}\n\t\t\tif(xa > 0){\n\t\t\t\tstart.x = start.x - xa;\n\t\t\t}\n\n\t\t\tdomElement.css(\"left\", `${start.x}px`);\n\t\t\tdomElement.css(\"top\", `${start.y}px`);\n\n\t\t};\n\n\t\t$(viewer.renderArea).append(domElement);\n\n\n\t\tlet annotationStartPos = this.position.clone();\n\t\tlet annotationStartOffset = this.offset.clone();\n\n\t\t$(this.domElement).draggable({\n\t\t\tstart: (event, ui) => {\n\t\t\t\tannotationStartPos = this.position.clone();\n\t\t\t\tannotationStartOffset = this.offset.clone();\n\t\t\t\t$(this.domElement).find(\".annotation-titlebar\").css(\"pointer-events\", \"none\");\n\n\t\t\t\tconsole.log($(this.domElement).find(\".annotation-titlebar\"));\n\t\t\t},\n\t\t\tstop: () => {\n\t\t\t\t$(this.domElement).find(\".annotation-titlebar\").css(\"pointer-events\", \"\");\n\t\t\t},\n\t\t\tdrag: (event, ui ) => {\n\t\t\t\tlet renderAreaWidth = viewer.renderer.getSize(new THREE.Vector2()).width;\n\t\t\t\t//let renderAreaHeight = viewer.renderer.getSize().height;\n\n\t\t\t\tlet diff = {\n\t\t\t\t\tx: ui.originalPosition.left - ui.position.left, \n\t\t\t\t\ty: ui.originalPosition.top - ui.position.top\n\t\t\t\t};\n\n\t\t\t\tlet nDiff = {\n\t\t\t\t\tx: -(diff.x / renderAreaWidth) * 2,\n\t\t\t\t\ty: (diff.y / renderAreaWidth) * 2\n\t\t\t\t};\n\n\t\t\t\tlet camera = viewer.scene.getActiveCamera();\n\t\t\t\tlet oldScreenPos = new THREE.Vector3()\n\t\t\t\t\t.addVectors(annotationStartPos, annotationStartOffset)\n\t\t\t\t\t.project(camera);\n\n\t\t\t\tlet newScreenPos = oldScreenPos.clone();\n\t\t\t\tnewScreenPos.x += nDiff.x;\n\t\t\t\tnewScreenPos.y += nDiff.y;\n\n\t\t\t\tlet newPos = newScreenPos.clone();\n\t\t\t\tnewPos.unproject(camera);\n\n\t\t\t\tlet newOffset = new THREE.Vector3().subVectors(newPos, this.position);\n\t\t\t\tthis.offset.copy(newOffset);\n\t\t\t}\n\t\t});\n\n\t\tlet updateCallback = () => {\n\t\t\tlet position = this.position;\n\t\t\tlet scene = viewer.scene;\n\n\t\t\tconst renderAreaSize = viewer.renderer.getSize(new THREE.Vector2());\n\t\t\tlet renderAreaWidth = renderAreaSize.width;\n\t\t\tlet renderAreaHeight = renderAreaSize.height;\n\n\t\t\tlet start = this.position.clone();\n\t\t\tlet end = new THREE.Vector3().addVectors(this.position, this.offset);\n\n\t\t\tlet toScreen = (position) => {\n\t\t\t\tlet camera = scene.getActiveCamera();\n\t\t\t\tlet screenPos = new THREE.Vector3();\n\n\t\t\t\tlet worldView = new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\t\t\t\tlet ndc = new THREE.Vector4(position.x, position.y, position.z, 1.0).applyMatrix4(worldView);\n\t\t\t\t// limit w to small positive value, in case position is behind the camera\n\t\t\t\tndc.w = Math.max(ndc.w, 0.1);\n\t\t\t\tndc.divideScalar(ndc.w);\n\n\t\t\t\tscreenPos.copy(ndc);\n\t\t\t\tscreenPos.x = renderAreaWidth * (screenPos.x + 1) / 2;\n\t\t\t\tscreenPos.y = renderAreaHeight * (1 - (screenPos.y + 1) / 2);\n\n\t\t\t\treturn screenPos;\n\t\t\t};\n\t\t\t\n\t\t\tstart = toScreen(start);\n\t\t\tend = toScreen(end);\n\n\t\t\tsetCoordinates(start, end);\n\n\t\t};\n\n\t\tviewer.addEventListener(\"update\", updateCallback);\n\n\t\tthis.handles = {\n\t\t\tdomElement: domElement,\n\t\t\tsetCoordinates: setCoordinates,\n\t\t\tupdateCallback: updateCallback\n\t\t};\n\t}\n\n\tremoveHandles(viewer){\n\t\tif(this.handles === undefined){\n\t\t\treturn;\n\t\t}\n\n\t\t//$(viewer.renderArea).remove(this.handles.domElement);\n\t\tthis.handles.domElement.remove();\n\t\tviewer.removeEventListener(\"update\", this.handles.updateCallback);\n\n\t\tdelete this.handles;\n\t}\n\n\tget visible () {\n\t\treturn this._visible;\n\t}\n\n\tset visible (value) {\n\t\tif (this._visible === value) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._visible = value;\n\n\t\t//this.traverse(node => {\n\t\t//\tnode.display = value;\n\t\t//});\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'visibility_changed',\n\t\t\tannotation: this\n\t\t});\n\t}\n\n\tget display () {\n\t\treturn this._display;\n\t}\n\n\tset display (display) {\n\t\tif (this._display === display) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._display = display;\n\n\t\tif (display) {\n\t\t\t// this.domElement.fadeIn(200);\n\t\t\tthis.domElement.show();\n\t\t} else {\n\t\t\t// this.domElement.fadeOut(200);\n\t\t\tthis.domElement.hide();\n\t\t}\n\t}\n\n\tget expand () {\n\t\treturn this._expand;\n\t}\n\n\tset expand (expand) {\n\t\tif (this._expand === expand) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (expand) {\n\t\t\tthis.display = false;\n\t\t} else {\n\t\t\tthis.display = true;\n\t\t\tthis.traverseDescendants(node => {\n\t\t\t\tnode.display = false;\n\t\t\t});\n\t\t}\n\n\t\tthis._expand = expand;\n\t}\n\n\tget title () {\n\t\treturn this._title;\n\t}\n\n\tset title (title) {\n\t\tif (this._title === title) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._title = title;\n\t\tthis.elTitle.empty();\n\t\tthis.elTitle.append(this._title);\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: \"annotation_changed\",\n\t\t\tannotation: this,\n\t\t});\n\t}\n\n\tget description () {\n\t\treturn this._description;\n\t}\n\n\tset description (description) {\n\t\tif (this._description === description) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._description = description;\n\n\t\tconst elDescriptionContent = this.elDescription.find(\".annotation-description-content\");\n\t\telDescriptionContent.empty();\n\t\telDescriptionContent.append(this._description);\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: \"annotation_changed\",\n\t\t\tannotation: this,\n\t\t});\n\t}\n\n\tadd (annotation) {\n\t\tif (!this.children.includes(annotation)) {\n\t\t\tthis.children.push(annotation);\n\t\t\tannotation.parent = this;\n\n\t\t\tlet descendants = [];\n\t\t\tannotation.traverse(a => { descendants.push(a); });\n\n\t\t\tfor (let descendant of descendants) {\n\t\t\t\tlet c = this;\n\t\t\t\twhile (c !== null) {\n\t\t\t\t\tc.dispatchEvent({\n\t\t\t\t\t\t'type': 'annotation_added',\n\t\t\t\t\t\t'annotation': descendant\n\t\t\t\t\t});\n\t\t\t\t\tc = c.parent;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlevel () {\n\t\tif (this.parent === null) {\n\t\t\treturn 0;\n\t\t} else {\n\t\t\treturn this.parent.level() + 1;\n\t\t}\n\t}\n\n\thasChild(annotation) {\n\t\treturn this.children.includes(annotation);\n\t}\n\n\tremove (annotation) {\n\t\tif (this.hasChild(annotation)) {\n\t\t\tannotation.removeAllChildren();\n\t\t\tannotation.dispose();\n\t\t\tthis.children = this.children.filter(e => e !== annotation);\n\t\t\tannotation.parent = null;\n\t\t}\n\t}\n\n\tremoveAllChildren() {\n\t\tthis.children.forEach((child) => {\n\t\t\tif (child.children.length > 0) {\n\t\t\t\tchild.removeAllChildren();\n\t\t\t}\n\n\t\t\tthis.remove(child);\n\t\t});\n\t}\n\n\tupdateBounds () {\n\t\tlet box = new THREE.Box3();\n\n\t\tif (this.position) {\n\t\t\tbox.expandByPoint(this.position);\n\t\t}\n\n\t\tfor (let child of this.children) {\n\t\t\tchild.updateBounds();\n\n\t\t\tbox.union(child.boundingBox);\n\t\t}\n\n\t\tthis.boundingBox.copy(box);\n\t}\n\n\ttraverse (handler) {\n\t\tlet expand = handler(this);\n\n\t\tif (expand === undefined || expand === true) {\n\t\t\tfor (let child of this.children) {\n\t\t\t\tchild.traverse(handler);\n\t\t\t}\n\t\t}\n\t}\n\n\ttraverseDescendants (handler) {\n\t\tfor (let child of this.children) {\n\t\t\tchild.traverse(handler);\n\t\t}\n\t}\n\n\tflatten () {\n\t\tlet annotations = [];\n\n\t\tthis.traverse(annotation => {\n\t\t\tannotations.push(annotation);\n\t\t});\n\n\t\treturn annotations;\n\t}\n\n\tdescendants () {\n\t\tlet annotations = [];\n\n\t\tthis.traverse(annotation => {\n\t\t\tif (annotation !== this) {\n\t\t\t\tannotations.push(annotation);\n\t\t\t}\n\t\t});\n\n\t\treturn annotations;\n\t}\n\n\tsetHighlighted (highlighted) {\n\t\tif (highlighted) {\n\t\t\tthis.domElement.css('opacity', '0.8');\n\t\t\tthis.elTitlebar.css('box-shadow', '0 0 5px #fff');\n\t\t\tthis.domElement.css('z-index', '1000');\n\n\t\t\tif (this._description) {\n\t\t\t\tthis.descriptionVisible = true;\n\t\t\t\tthis.elDescription.fadeIn(200);\n\t\t\t\tthis.elDescription.css('position', 'relative');\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domElement.css('opacity', '0.5');\n\t\t\tthis.elTitlebar.css('box-shadow', '');\n\t\t\tthis.domElement.css('z-index', '100');\n\t\t\tthis.descriptionVisible = false;\n\t\t\tthis.elDescription.css('display', 'none');\n\t\t}\n\n\t\tthis.isHighlighted = highlighted;\n\t}\n\n\thasView () {\n\t\tlet hasPosTargetView = this.cameraTarget.x != null;\n\t\thasPosTargetView = hasPosTargetView && this.cameraPosition.x != null;\n\n\t\tlet hasRadiusView = this.radius !== undefined;\n\n\t\tlet hasView = hasPosTargetView || hasRadiusView;\n\n\t\treturn hasView;\n\t};\n\n\tmoveHere (camera) {\n\t\tif (!this.hasView()) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet view = this.scene.view;\n\t\tlet animationDuration = 500;\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\tlet endTarget;\n\t\tif (this.cameraTarget) {\n\t\t\tendTarget = this.cameraTarget;\n\t\t} else if (this.position) {\n\t\t\tendTarget = this.position;\n\t\t} else {\n\t\t\tendTarget = this.boundingBox.getCenter(new THREE.Vector3());\n\t\t}\n\n\t\tif (this.cameraPosition) {\n\t\t\tlet endPosition = this.cameraPosition;\n\n\t\t\tUtils.moveTo(this.scene, endPosition, endTarget);\n\t\t} else if (this.radius) {\n\t\t\tlet direction = view.direction;\n\t\t\tlet endPosition = endTarget.clone().add(direction.multiplyScalar(-this.radius));\n\t\t\tlet startRadius = view.radius;\n\t\t\tlet endRadius = this.radius;\n\n\t\t\t{ // animate camera position\n\t\t\t\tlet tween = new TWEEN.Tween(view.position).to(endPosition, animationDuration);\n\t\t\t\ttween.easing(easing);\n\t\t\t\ttween.start();\n\t\t\t}\n\n\t\t\t{ // animate radius\n\t\t\t\tlet t = {x: 0};\n\n\t\t\t\tlet tween = new TWEEN.Tween(t)\n\t\t\t\t\t.to({x: 1}, animationDuration)\n\t\t\t\t\t.onUpdate(function () {\n\t\t\t\t\t\tview.radius = this.x * endRadius + (1 - this.x) * startRadius;\n\t\t\t\t\t});\n\t\t\t\ttween.easing(easing);\n\t\t\t\ttween.start();\n\t\t\t}\n\t\t}\n\t};\n\n\tdispose () {\n\t\tif (this.domElement.parentElement) {\n\t\t\tthis.domElement.parentElement.removeChild(this.domElement);\n\t\t}\n\t};\n\n\ttoString () {\n\t\treturn 'Annotation: ' + this._title;\n\t}\n};\n","\nclass EnumItem{\n\tconstructor(object){\n\t\tfor(let key of Object.keys(object)){\n\t\t\tthis[key] = object[key];\n\t\t}\n\t}\n\n\tinspect(){\n\t\treturn `Enum(${this.name}: ${this.value})`;\n\t}\n};\n\nclass Enum{\n\n\tconstructor(object){\n\t\tthis.object = object;\n\n\t\tfor(let key of Object.keys(object)){\n\t\t\tlet value = object[key];\n\n\t\t\tif(typeof value === \"object\"){\n\t\t\t\tvalue.name = key;\n\t\t\t}else{\n\t\t\t\tvalue = {name: key, value: value};\n\t\t\t}\n\t\t\t\n\t\t\tthis[key] = new EnumItem(value);\n\t\t}\n\t}\n\n\tfromValue(value){\n\t\tfor(let key of Object.keys(this.object)){\n\t\t\tif(this[key].value === value){\n\t\t\t\treturn this[key];\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(`No enum for value: ${value}`);\n\t}\n\t\n};\n\nexport {Enum, EnumItem};","\nimport {Enum} from \"./Enum.js\";\n\n\nexport const CameraMode = {\n\tORTHOGRAPHIC: 0,\n\tPERSPECTIVE: 1,\n\tVR: 2,\n};\n\nexport const ClipTask = {\n\tNONE: 0,\n\tHIGHLIGHT: 1,\n\tSHOW_INSIDE: 2,\n\tSHOW_OUTSIDE: 3\n};\n\nexport const ClipMethod = {\n\tINSIDE_ANY: 0,\n\tINSIDE_ALL: 1\n};\n\nexport const ElevationGradientRepeat = {\n\tCLAMP: 0,\n\tREPEAT: 1,\n\tMIRRORED_REPEAT: 2,\n};\n\nexport const MOUSE = {\n\tLEFT: 0b0001,\n\tRIGHT: 0b0010,\n\tMIDDLE: 0b0100\n};\n\nexport const PointSizeType = {\n\tFIXED: 0,\n\tATTENUATED: 1,\n\tADAPTIVE: 2\n};\n\nexport const PointShape = {\n\tSQUARE: 0,\n\tCIRCLE: 1,\n\tPARABOLOID: 2\n};\n\nexport const TreeType = {\n\tOCTREE:\t0,\n\tKDTREE:\t1\n};\n\nexport const LengthUnits = {\n\tMETER: {code: 'm', unitspermeter: 1.0},\n\tFEET: {code: 'ft', unitspermeter: 3.28084},\n\tINCH: {code: '\\u2033', unitspermeter: 39.3701}\n};","\nlet ftCanvas = document.createElement('canvas');\n\nexport const Features = (function () {\n\n\tlet gl = ftCanvas.getContext('webgl') || ftCanvas.getContext('experimental-webgl');\n\tif (gl === null){ \n\t\treturn null; \n\t}\n\n\t// -- code taken from THREE.WebGLRenderer --\n\tlet _vertexShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT);\n\tlet _vertexShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT);\n\t// Unused: let _vertexShaderPrecisionLowpFloat = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT);\n\n\tlet _fragmentShaderPrecisionHighpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT);\n\tlet _fragmentShaderPrecisionMediumpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT);\n\t// Unused: let _fragmentShaderPrecisionLowpFloat = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT);\n\n\tlet highpAvailable = _vertexShaderPrecisionHighpFloat.precision > 0 && _fragmentShaderPrecisionHighpFloat.precision > 0;\n\tlet mediumpAvailable = _vertexShaderPrecisionMediumpFloat.precision > 0 && _fragmentShaderPrecisionMediumpFloat.precision > 0;\n\t// -----------------------------------------\n\n\tlet precision;\n\tif (highpAvailable) {\n\t\tprecision = 'highp';\n\t} else if (mediumpAvailable) {\n\t\tprecision = 'mediump';\n\t} else {\n\t\tprecision = 'lowp';\n\t}\n\n\treturn {\n\t\tSHADER_INTERPOLATION: {\n\t\t\tisSupported: function () {\n\t\t\t\tlet supported = true;\n\n\t\t\t\tsupported = supported && gl.getExtension('EXT_frag_depth');\n\t\t\t\tsupported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8;\n\n\t\t\t\treturn supported;\n\t\t\t}\n\t\t},\n\t\tSHADER_SPLATS: {\n\t\t\tisSupported: function () {\n\t\t\t\tlet supported = true;\n\n\t\t\t\tsupported = supported && gl.getExtension('EXT_frag_depth');\n\t\t\t\tsupported = supported && gl.getExtension('OES_texture_float');\n\t\t\t\tsupported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8;\n\n\t\t\t\treturn supported;\n\t\t\t}\n\n\t\t},\n\t\tSHADER_EDL: {\n\t\t\tisSupported: function () {\n\t\t\t\tlet supported = true;\n\n\t\t\t\tsupported = supported && gl.getExtension('EXT_frag_depth');\n\t\t\t\tsupported = supported && gl.getExtension('OES_texture_float');\n\t\t\t\tsupported = supported && gl.getParameter(gl.MAX_VARYING_VECTORS) >= 8;\n\n\t\t\t\t//supported = supported || (gl instanceof WebGL2RenderingContext);\n\n\t\t\t\treturn supported;\n\t\t\t}\n\n\t\t},\n\t\t//WEBGL2: {\n\t\t//\tisSupported: function(){\n\t\t//\t\treturn gl instanceof WebGL2RenderingContext;\n\t\t//\t}\n\t\t//},\n\t\tprecision: precision\n\t};\n}());\n\n","\n\nexport const KeyCodes = {\n\n\tLEFT: 37,\n\tUP: 38,\n\tRIGHT: 39,\n\tBOTTOM: 40,\n\tDELETE: 46,\n\n\tA: 'A'.charCodeAt(0),\n\tS: 'S'.charCodeAt(0),\n\tD: 'D'.charCodeAt(0),\n\tW: 'W'.charCodeAt(0),\n\tQ: 'Q'.charCodeAt(0),\n\tE: 'E'.charCodeAt(0),\n\tR: 'R'.charCodeAt(0),\n\tF: 'F'.charCodeAt(0)\n\t\n};","\n\nclass LRUItem{\n\n\tconstructor(node){\n\t\tthis.previous = null;\n\t\tthis.next = null;\n\t\tthis.node = node;\n\t}\n\n}\n\n/**\n *\n * @class A doubly-linked-list of the least recently used elements.\n */\nclass LRU{\n\n\tconstructor(){\n\t\t// the least recently used item\n\t\tthis.first = null;\n\t\t// the most recently used item\n\t\tthis.last = null;\n\t\t// a list of all items in the lru list\n\t\tthis.items = {};\n\t\tthis.elements = 0;\n\t\tthis.numPoints = 0;\n\t}\n\n\tsize(){\n\t\treturn this.elements;\n\t}\n\n\tcontains(node){\n\t\treturn this.items[node.id] == null;\n\t}\n\n\ttouch(node){\n\t\tif (!node.loaded) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet item;\n\t\tif (this.items[node.id] == null) {\n\t\t\t// add to list\n\t\t\titem = new LRUItem(node);\n\t\t\titem.previous = this.last;\n\t\t\tthis.last = item;\n\t\t\tif (item.previous !== null) {\n\t\t\t\titem.previous.next = item;\n\t\t\t}\n\n\t\t\tthis.items[node.id] = item;\n\t\t\tthis.elements++;\n\n\t\t\tif (this.first === null) {\n\t\t\t\tthis.first = item;\n\t\t\t}\n\t\t\tthis.numPoints += node.numPoints;\n\t\t} else {\n\t\t\t// update in list\n\t\t\titem = this.items[node.id];\n\t\t\tif (item.previous === null) {\n\t\t\t\t// handle touch on first element\n\t\t\t\tif (item.next !== null) {\n\t\t\t\t\tthis.first = item.next;\n\t\t\t\t\tthis.first.previous = null;\n\t\t\t\t\titem.previous = this.last;\n\t\t\t\t\titem.next = null;\n\t\t\t\t\tthis.last = item;\n\t\t\t\t\titem.previous.next = item;\n\t\t\t\t}\n\t\t\t} else if (item.next === null) {\n\t\t\t\t// handle touch on last element\n\t\t\t} else {\n\t\t\t\t// handle touch on any other element\n\t\t\t\titem.previous.next = item.next;\n\t\t\t\titem.next.previous = item.previous;\n\t\t\t\titem.previous = this.last;\n\t\t\t\titem.next = null;\n\t\t\t\tthis.last = item;\n\t\t\t\titem.previous.next = item;\n\t\t\t}\n\t\t}\n\t}\n\n\tremove(node){\n\t\tlet lruItem = this.items[node.id];\n\t\tif (lruItem) {\n\t\t\tif (this.elements === 1) {\n\t\t\t\tthis.first = null;\n\t\t\t\tthis.last = null;\n\t\t\t} else {\n\t\t\t\tif (!lruItem.previous) {\n\t\t\t\t\tthis.first = lruItem.next;\n\t\t\t\t\tthis.first.previous = null;\n\t\t\t\t}\n\t\t\t\tif (!lruItem.next) {\n\t\t\t\t\tthis.last = lruItem.previous;\n\t\t\t\t\tthis.last.next = null;\n\t\t\t\t}\n\t\t\t\tif (lruItem.previous && lruItem.next) {\n\t\t\t\t\tlruItem.previous.next = lruItem.next;\n\t\t\t\t\tlruItem.next.previous = lruItem.previous;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdelete this.items[node.id];\n\t\t\tthis.elements--;\n\t\t\tthis.numPoints -= node.numPoints;\n\t\t}\n\t}\n\n\tgetLRUItem(){\n\t\tif (this.first === null) {\n\t\t\treturn null;\n\t\t}\n\t\tlet lru = this.first;\n\n\t\treturn lru.node;\n\t}\n\n\ttoString(){\n\t\tlet string = '{ ';\n\t\tlet curr = this.first;\n\t\twhile (curr !== null) {\n\t\t\tstring += curr.node.id;\n\t\t\tif (curr.next !== null) {\n\t\t\t\tstring += ', ';\n\t\t\t}\n\t\t\tcurr = curr.next;\n\t\t}\n\t\tstring += '}';\n\t\tstring += '(' + this.size() + ')';\n\t\treturn string;\n\t}\n\n\tfreeMemory(){\n\t\tif (this.elements <= 1) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this.numPoints > Potree.pointLoadLimit) {\n\t\t\tlet element = this.first;\n\t\t\tlet node = element.node;\n\t\t\tthis.disposeDescendants(node);\n\t\t}\n\t}\n\n\tdisposeDescendants(node){\n\t\tlet stack = [];\n\t\tstack.push(node);\n\t\twhile (stack.length > 0) {\n\t\t\tlet current = stack.pop();\n\n\t\t\t// console.log(current);\n\n\t\t\tcurrent.dispose();\n\t\t\tthis.remove(current);\n\n\t\t\tfor (let key in current.children) {\n\t\t\t\tif (current.children.hasOwnProperty(key)) {\n\t\t\t\t\tlet child = current.children[key];\n\t\t\t\t\tif (child.loaded) {\n\t\t\t\t\t\tstack.push(current.children[key]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nexport {LRU, LRUItem};","\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\nimport { EventDispatcher } from \"./EventDispatcher.js\";\n\n\nexport class PointCloudTreeNode extends EventDispatcher{\n\n\tconstructor(){\n\t\tsuper();\n\t\tthis.needsTransformUpdate = true;\n\t}\n\n\tgetChildren () {\n\t\tthrow new Error('override function');\n\t}\n\n\tgetBoundingBox () {\n\t\tthrow new Error('override function');\n\t}\n\n\tisLoaded () {\n\t\tthrow new Error('override function');\n\t}\n\n\tisGeometryNode () {\n\t\tthrow new Error('override function');\n\t}\n\n\tisTreeNode () {\n\t\tthrow new Error('override function');\n\t}\n\n\tgetLevel () {\n\t\tthrow new Error('override function');\n\t}\n\n\tgetBoundingSphere () {\n\t\tthrow new Error('override function');\n\t}\n};\n\nexport class PointCloudTree extends THREE.Object3D {\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tinitialized () {\n\t\treturn this.root !== null;\n\t}\n};\n","\n/**\n * Some types of possible point attribute data formats\n *\n * @class\n */\nconst PointAttributeTypes = {\n\tDATA_TYPE_DOUBLE: {ordinal: 0, name: \"double\", size: 8},\n\tDATA_TYPE_FLOAT: {ordinal: 1, name: \"float\", size: 4},\n\tDATA_TYPE_INT8: {ordinal: 2, name: \"int8\", size: 1},\n\tDATA_TYPE_UINT8: {ordinal: 3, name: \"uint8\", size: 1},\n\tDATA_TYPE_INT16: {ordinal: 4, name: \"int16\", size: 2},\n\tDATA_TYPE_UINT16: {ordinal: 5, name: \"uint16\", size: 2},\n\tDATA_TYPE_INT32: {ordinal: 6, name: \"int32\", size: 4},\n\tDATA_TYPE_UINT32: {ordinal: 7, name: \"uint32\", size: 4},\n\tDATA_TYPE_INT64: {ordinal: 8, name: \"int64\", size: 8},\n\tDATA_TYPE_UINT64: {ordinal: 9, name: \"uint64\", size: 8}\n};\n\nlet i = 0;\nfor (let obj in PointAttributeTypes) {\n\tPointAttributeTypes[i] = PointAttributeTypes[obj];\n\ti++;\n}\n\nexport {PointAttributeTypes};\n\n\nclass PointAttribute{\n\t\n\tconstructor(name, type, numElements){\n\t\tthis.name = name;\n\t\tthis.type = type;\n\t\tthis.numElements = numElements;\n\t\tthis.byteSize = this.numElements * this.type.size;\n\t\tthis.description = \"\";\n\t\tthis.range = [Infinity, -Infinity];\n\t}\n\n};\n\nPointAttribute.POSITION_CARTESIAN = new PointAttribute(\n\t\"POSITION_CARTESIAN\", PointAttributeTypes.DATA_TYPE_FLOAT, 3);\n\nPointAttribute.RGBA_PACKED = new PointAttribute(\n\t\"COLOR_PACKED\", PointAttributeTypes.DATA_TYPE_INT8, 4);\n\nPointAttribute.COLOR_PACKED = PointAttribute.RGBA_PACKED;\n\nPointAttribute.RGB_PACKED = new PointAttribute(\n\t\"COLOR_PACKED\", PointAttributeTypes.DATA_TYPE_INT8, 3);\n\nPointAttribute.NORMAL_FLOATS = new PointAttribute(\n\t\"NORMAL_FLOATS\", PointAttributeTypes.DATA_TYPE_FLOAT, 3);\n\nPointAttribute.INTENSITY = new PointAttribute(\n\t\"INTENSITY\", PointAttributeTypes.DATA_TYPE_UINT16, 1);\n\nPointAttribute.CLASSIFICATION = new PointAttribute(\n\t\"CLASSIFICATION\", PointAttributeTypes.DATA_TYPE_UINT8, 1);\n\nPointAttribute.NORMAL_SPHEREMAPPED = new PointAttribute(\n\t\"NORMAL_SPHEREMAPPED\", PointAttributeTypes.DATA_TYPE_UINT8, 2);\n\nPointAttribute.NORMAL_OCT16 = new PointAttribute(\n\t\"NORMAL_OCT16\", PointAttributeTypes.DATA_TYPE_UINT8, 2);\n\nPointAttribute.NORMAL = new PointAttribute(\n\t\"NORMAL\", PointAttributeTypes.DATA_TYPE_FLOAT, 3);\n\t\nPointAttribute.RETURN_NUMBER = new PointAttribute(\n\t\"RETURN_NUMBER\", PointAttributeTypes.DATA_TYPE_UINT8, 1);\n\t\nPointAttribute.NUMBER_OF_RETURNS = new PointAttribute(\n\t\"NUMBER_OF_RETURNS\", PointAttributeTypes.DATA_TYPE_UINT8, 1);\n\t\nPointAttribute.SOURCE_ID = new PointAttribute(\n\t\"SOURCE_ID\", PointAttributeTypes.DATA_TYPE_UINT16, 1);\n\nPointAttribute.INDICES = new PointAttribute(\n\t\"INDICES\", PointAttributeTypes.DATA_TYPE_UINT32, 1);\n\nPointAttribute.SPACING = new PointAttribute(\n\t\"SPACING\", PointAttributeTypes.DATA_TYPE_FLOAT, 1);\n\nPointAttribute.GPS_TIME = new PointAttribute(\n\t\"GPS_TIME\", PointAttributeTypes.DATA_TYPE_DOUBLE, 1);\n\nexport {PointAttribute};\n\nexport class PointAttributes{\n\n\tconstructor(pointAttributes){\n\t\tthis.attributes = [];\n\t\tthis.byteSize = 0;\n\t\tthis.size = 0;\n\t\tthis.vectors = [];\n\n\t\tif (pointAttributes != null) {\n\t\t\tfor (let i = 0; i < pointAttributes.length; i++) {\n\t\t\t\tlet pointAttributeName = pointAttributes[i];\n\t\t\t\tlet pointAttribute = PointAttribute[pointAttributeName];\n\t\t\t\tthis.attributes.push(pointAttribute);\n\t\t\t\tthis.byteSize += pointAttribute.byteSize;\n\t\t\t\tthis.size++;\n\t\t\t}\n\t\t}\n\t}\n\n\n\tadd(pointAttribute){\n\t\tthis.attributes.push(pointAttribute);\n\t\tthis.byteSize += pointAttribute.byteSize;\n\t\tthis.size++;\n\t};\n\n\taddVector(vector){\n\t\tthis.vectors.push(vector);\n\t}\n\n\thasColors(){\n\t\tfor (let name in this.attributes) {\n\t\t\tlet pointAttribute = this.attributes[name];\n\t\t\tif (pointAttribute.name === PointAttributeNames.COLOR_PACKED) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\thasNormals(){\n\t\tfor (let name in this.attributes) {\n\t\t\tlet pointAttribute = this.attributes[name];\n\t\t\tif (\n\t\t\t\tpointAttribute === PointAttribute.NORMAL_SPHEREMAPPED ||\n\t\t\t\tpointAttribute === PointAttribute.NORMAL_FLOATS ||\n\t\t\t\tpointAttribute === PointAttribute.NORMAL ||\n\t\t\t\tpointAttribute === PointAttribute.NORMAL_OCT16) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n}\n","import {PointCloudTreeNode} from \"./PointCloudTree.js\";\nimport {PointAttributes, PointAttribute, PointAttributeTypes} from \"./loader/PointAttributes.js\";\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\n\nclass U {\n\tstatic toVector3(v, offset) {\n\t\treturn new THREE.Vector3().fromArray(v, offset || 0);\n\t}\n\n\tstatic toBox3(b) {\n\t\treturn new THREE.Box3(U.toVector3(b), U.toVector3(b, 3));\n\t};\n\n\tstatic findDim(schema, name) {\n\t\tvar dim = schema.find((dim) => dim.name == name);\n\t\tif (!dim) throw new Error('Failed to find ' + name + ' in schema');\n\t\treturn dim;\n\t}\n\n\tstatic sphereFrom(b) {\n\t\treturn b.getBoundingSphere(new THREE.Sphere());\n\t}\n};\n\nexport class PointCloudEptGeometry {\n\tconstructor(url, info) {\n\t\tlet version = info.version;\n\t\tlet schema = info.schema;\n\t\tlet bounds = info.bounds;\n\t\tlet boundsConforming = info.boundsConforming;\n\n\t\tlet xyz = [\n\t\t\tU.findDim(schema, 'X'),\n\t\t\tU.findDim(schema, 'Y'),\n\t\t\tU.findDim(schema, 'Z')\n\t\t];\n\t\tlet scale = xyz.map((d) => d.scale || 1);\n\t\tlet offset = xyz.map((d) => d.offset || 0);\n\t\tthis.eptScale = U.toVector3(scale);\n\t\tthis.eptOffset = U.toVector3(offset);\n\n\t\tthis.url = url;\n\t\tthis.info = info;\n\t\tthis.type = 'ept';\n\n\t\tthis.schema = schema;\n\t\tthis.span = info.span || info.ticks;\n\t\tthis.boundingBox = U.toBox3(bounds);\n\t\tthis.tightBoundingBox = U.toBox3(boundsConforming);\n\t\tthis.offset = U.toVector3([0, 0, 0]);\n\t\tthis.boundingSphere = U.sphereFrom(this.boundingBox);\n\t\tthis.tightBoundingSphere = U.sphereFrom(this.tightBoundingBox);\n\t\tthis.version = new Potree.Version('1.7');\n\n\t\tthis.projection = null;\n\t\tthis.fallbackProjection = null;\n\n\t\tif (info.srs && info.srs.horizontal) {\n\t\t\tthis.projection = info.srs.authority + ':' + info.srs.horizontal;\n\t\t}\n\n\t\tif (info.srs.wkt) {\n\t\t\tif (!this.projection) this.projection = info.srs.wkt;\n\t\t\telse this.fallbackProjection = info.srs.wkt;\n\t\t}\n\n\t\t{ \n\t\t\t// TODO [mschuetz]: named projections that proj4 can't handle seem to cause problems.\n\t\t\t// remove them for now\n\n\t\t\ttry{\n\t\t\t\tproj4(this.projection);\n\t\t\t}catch(e){\n\t\t\t\tthis.projection = null;\n\t\t\t}\n\n\t\t\n\n\t\t}\n\n\t\t\n\t\t{\n\t\t\tconst attributes = new PointAttributes();\n\n\t\t\tattributes.add(PointAttribute.POSITION_CARTESIAN);\n\t\t\tattributes.add(new PointAttribute(\"rgba\", PointAttributeTypes.DATA_TYPE_UINT8, 4));\n\t\t\tattributes.add(new PointAttribute(\"intensity\", PointAttributeTypes.DATA_TYPE_UINT16, 1));\n\t\t\tattributes.add(new PointAttribute(\"classification\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\t\t\tattributes.add(new PointAttribute(\"gps-time\", PointAttributeTypes.DATA_TYPE_DOUBLE, 1));\n\t\t\tattributes.add(new PointAttribute(\"returnNumber\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\t\t\tattributes.add(new PointAttribute(\"number of returns\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\t\t\tattributes.add(new PointAttribute(\"return number\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\t\t\tattributes.add(new PointAttribute(\"source id\", PointAttributeTypes.DATA_TYPE_UINT16, 1));\n\n\t\t\tthis.pointAttributes = attributes;\n\t\t}\n\n\n\n\t\tthis.spacing =\n\t\t\t(this.boundingBox.max.x - this.boundingBox.min.x) / this.span;\n\n\t\tlet hierarchyType = info.hierarchyType || 'json';\n\n\t\tconst dataType = info.dataType;\n\t\tif (dataType == 'laszip') {\n\t\t\tthis.loader = new Potree.EptLaszipLoader();\n\t\t}\n\t\telse if (dataType == 'binary') {\n\t\t\tthis.loader = new Potree.EptBinaryLoader();\n\t\t}\n\t\telse if (dataType == 'zstandard') {\n\t\t\tthis.loader = new Potree.EptZstandardLoader();\n\t\t}\n\t\telse {\n\t\t\tthrow new Error('Could not read data type: ' + dataType);\n\t\t}\n\t}\n};\n\nexport class EptKey {\n\tconstructor(ept, b, d, x, y, z) {\n\t\tthis.ept = ept;\n\t\tthis.b = b;\n\t\tthis.d = d;\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t}\n\n\tname() {\n\t\treturn this.d + '-' + this.x + '-' + this.y + '-' + this.z;\n\t}\n\n\tstep(a, b, c) {\n\t\tlet min = this.b.min.clone();\n\t\tlet max = this.b.max.clone();\n\t\tlet dst = new THREE.Vector3().subVectors(max, min);\n\n\t\tif (a)\tmin.x += dst.x / 2;\n\t\telse\tmax.x -= dst.x / 2;\n\n\t\tif (b)\tmin.y += dst.y / 2;\n\t\telse\tmax.y -= dst.y / 2;\n\n\t\tif (c)\tmin.z += dst.z / 2;\n\t\telse\tmax.z -= dst.z / 2;\n\n\t\treturn new Potree.EptKey(\n\t\t\t\tthis.ept,\n\t\t\t\tnew THREE.Box3(min, max),\n\t\t\t\tthis.d + 1,\n\t\t\t\tthis.x * 2 + a,\n\t\t\t\tthis.y * 2 + b,\n\t\t\t\tthis.z * 2 + c);\n\t}\n\n\tchildren() {\n\t\tvar result = [];\n\t\tfor (var a = 0; a < 2; ++a) {\n\t\t\tfor (var b = 0; b < 2; ++b) {\n\t\t\t\tfor (var c = 0; c < 2; ++c) {\n\t\t\t\t\tvar add = this.step(a, b, c).name();\n\t\t\t\t\tif (!result.includes(add)) result = result.concat(add);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n\nexport class PointCloudEptGeometryNode extends PointCloudTreeNode {\n\tconstructor(ept, b, d, x, y, z) {\n\t\tsuper();\n\n\t\tthis.ept = ept;\n\t\tthis.key = new Potree.EptKey(\n\t\t\t\tthis.ept,\n\t\t\t\tb || this.ept.boundingBox,\n\t\t\t\td || 0,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\tz);\n\n\t\tthis.id = PointCloudEptGeometryNode.IDCount++;\n\t\tthis.geometry = null;\n\t\tthis.boundingBox = this.key.b;\n\t\tthis.tightBoundingBox = this.boundingBox;\n\t\tthis.spacing = this.ept.spacing / Math.pow(2, this.key.d);\n\t\tthis.boundingSphere = U.sphereFrom(this.boundingBox);\n\n\t\t// These are set during hierarchy loading.\n\t\tthis.hasChildren = false;\n\t\tthis.children = { };\n\t\tthis.numPoints = -1;\n\n\t\tthis.level = this.key.d;\n\t\tthis.loaded = false;\n\t\tthis.loading = false;\n\t\tthis.oneTimeDisposeHandlers = [];\n\n\t\tlet k = this.key;\n\t\tthis.name = this.toPotreeName(k.d, k.x, k.y, k.z);\n\t\tthis.index = parseInt(this.name.charAt(this.name.length - 1));\n\t}\n\n\tisGeometryNode() { return true; }\n\tgetLevel() { return this.level; }\n\tisTreeNode() { return false; }\n\tisLoaded() { return this.loaded; }\n\tgetBoundingSphere() { return this.boundingSphere; }\n\tgetBoundingBox() { return this.boundingBox; }\n\turl() { return this.ept.url + 'ept-data/' + this.filename(); }\n\tgetNumPoints() { return this.numPoints; }\n\n\tfilename() { return this.key.name(); }\n\n\tgetChildren() {\n\t\tlet children = [];\n\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tif (this.children[i]) {\n\t\t\t\tchildren.push(this.children[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn children;\n\t}\n\n\taddChild(child) {\n\t\tthis.children[child.index] = child;\n\t\tchild.parent = this;\n\t}\n\n\tload() {\n\t\tif (this.loaded || this.loading) return;\n\t\tif (Potree.numNodesLoading >= Potree.maxNodesLoading) return;\n\n\t\tthis.loading = true;\n\t\t++Potree.numNodesLoading;\n\n\t\tif (this.numPoints == -1) this.loadHierarchy();\n\t\tthis.loadPoints();\n\t}\n\n\tloadPoints(){\n\t\tthis.ept.loader.load(this);\n\t}\n\n\tasync loadHierarchy() {\n\t\tlet nodes = { };\n\t\tnodes[this.filename()] = this;\n\t\tthis.hasChildren = false;\n\n\t\tlet eptHierarchyFile =\n\t\t\t`${this.ept.url}ept-hierarchy/${this.filename()}.json`;\n\n\t\tlet response = await fetch(eptHierarchyFile);\n\t\tlet hier = await response.json();\n\n\t\t// Since we want to traverse top-down, and 10 comes\n\t\t// lexicographically before 9 (for example), do a deep sort.\n\t\tvar keys = Object.keys(hier).sort((a, b) => {\n\t\t\tlet [da, xa, ya, za] = a.split('-').map((n) => parseInt(n, 10));\n\t\t\tlet [db, xb, yb, zb] = b.split('-').map((n) => parseInt(n, 10));\n\t\t\tif (da < db) return -1; if (da > db) return 1;\n\t\t\tif (xa < xb) return -1; if (xa > xb) return 1;\n\t\t\tif (ya < yb) return -1; if (ya > yb) return 1;\n\t\t\tif (za < zb) return -1; if (za > zb) return 1;\n\t\t\treturn 0;\n\t\t});\n\n\t\tkeys.forEach((v) => {\n\t\t\tlet [d, x, y, z] = v.split('-').map((n) => parseInt(n, 10));\n\t\t\tlet a = x & 1, b = y & 1, c = z & 1;\n\t\t\tlet parentName =\n\t\t\t\t(d - 1) + '-' + (x >> 1) + '-' + (y >> 1) + '-' + (z >> 1);\n\n\t\t\tlet parentNode = nodes[parentName];\n\t\t\tif (!parentNode) return;\n\t\t\tparentNode.hasChildren = true;\n\n\t\t\tlet key = parentNode.key.step(a, b, c);\n\n\t\t\tlet node = new Potree.PointCloudEptGeometryNode(\n\t\t\t\t\tthis.ept,\n\t\t\t\t\tkey.b,\n\t\t\t\t\tkey.d,\n\t\t\t\t\tkey.x,\n\t\t\t\t\tkey.y,\n\t\t\t\t\tkey.z);\n\n\t\t\tnode.level = d;\n\t\t\tnode.numPoints = hier[v];\n\n\t\t\tparentNode.addChild(node);\n\t\t\tnodes[key.name()] = node;\n\t\t});\n\t}\n\n\tdoneLoading(bufferGeometry, tightBoundingBox, np, mean) {\n\t\tbufferGeometry.boundingBox = this.boundingBox;\n\t\tthis.geometry = bufferGeometry;\n\t\tthis.tightBoundingBox = tightBoundingBox;\n\t\tthis.numPoints = np;\n\t\tthis.mean = mean;\n\t\tthis.loaded = true;\n\t\tthis.loading = false;\n\t\t--Potree.numNodesLoading;\n\t}\n\n\ttoPotreeName(d, x, y, z) {\n\t\tvar name = 'r';\n\n\t\tfor (var i = 0; i < d; ++i) {\n\t\t\tvar shift = d - i - 1;\n\t\t\tvar mask = 1 << shift;\n\t\t\tvar step = 0;\n\n\t\t\tif (x & mask) step += 4;\n\t\t\tif (y & mask) step += 2;\n\t\t\tif (z & mask) step += 1;\n\n\t\t\tname += step;\n\t\t}\n\n\t\treturn name;\n\t}\n\n\tdispose() {\n\t\tif (this.geometry && this.parent != null) {\n\t\t\tthis.geometry.dispose();\n\t\t\tthis.geometry = null;\n\t\t\tthis.loaded = false;\n\n\t\t\t// this.dispatchEvent( { type: 'dispose' } );\n\t\t\tfor (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) {\n\t\t\t\tlet handler = this.oneTimeDisposeHandlers[i];\n\t\t\t\thandler();\n\t\t\t}\n\t\t\tthis.oneTimeDisposeHandlers = [];\n\t\t}\n\t}\n}\n\nPointCloudEptGeometryNode.IDCount = 0;\n\n","\n\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\nimport {PointCloudTreeNode} from \"./PointCloudTree.js\";\nimport {XHRFactory} from \"./XHRFactory.js\";\nimport {Utils} from \"./utils.js\";\n\nexport class PointCloudOctreeGeometry{\n\n\tconstructor(){\n\t\tthis.url = null;\n\t\tthis.octreeDir = null;\n\t\tthis.spacing = 0;\n\t\tthis.boundingBox = null;\n\t\tthis.root = null;\n\t\tthis.nodes = null;\n\t\tthis.pointAttributes = null;\n\t\tthis.hierarchyStepSize = -1;\n\t\tthis.loader = null;\n\t}\n\t\n}\n\nexport class PointCloudOctreeGeometryNode extends PointCloudTreeNode{\n\n\tconstructor(name, pcoGeometry, boundingBox){\n\t\tsuper();\n\n\t\tthis.id = PointCloudOctreeGeometryNode.IDCount++;\n\t\tthis.name = name;\n\t\tthis.index = parseInt(name.charAt(name.length - 1));\n\t\tthis.pcoGeometry = pcoGeometry;\n\t\tthis.geometry = null;\n\t\tthis.boundingBox = boundingBox;\n\t\tthis.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\tthis.children = {};\n\t\tthis.numPoints = 0;\n\t\tthis.level = null;\n\t\tthis.loaded = false;\n\t\tthis.oneTimeDisposeHandlers = [];\n\t}\n\n\tisGeometryNode(){\n\t\treturn true;\n\t}\n\n\tgetLevel(){\n\t\treturn this.level;\n\t}\n\n\tisTreeNode(){\n\t\treturn false;\n\t}\n\n\tisLoaded(){\n\t\treturn this.loaded;\n\t}\n\n\tgetBoundingSphere(){\n\t\treturn this.boundingSphere;\n\t}\n\n\tgetBoundingBox(){\n\t\treturn this.boundingBox;\n\t}\n\n\tgetChildren(){\n\t\tlet children = [];\n\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tif (this.children[i]) {\n\t\t\t\tchildren.push(this.children[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn children;\n\t}\n\n\tgetBoundingBox(){\n\t\treturn this.boundingBox;\n\t}\n\n\tgetURL(){\n\t\tlet url = '';\n\n\t\tlet version = this.pcoGeometry.loader.version;\n\n\t\tif (version.equalOrHigher('1.5')) {\n\t\t\turl = this.pcoGeometry.octreeDir + '/' + this.getHierarchyPath() + '/' + this.name;\n\t\t} else if (version.equalOrHigher('1.4')) {\n\t\t\turl = this.pcoGeometry.octreeDir + '/' + this.name;\n\t\t} else if (version.upTo('1.3')) {\n\t\t\turl = this.pcoGeometry.octreeDir + '/' + this.name;\n\t\t}\n\n\t\treturn url;\n\t}\n\n\tgetHierarchyPath(){\n\t\tlet path = 'r/';\n\n\t\tlet hierarchyStepSize = this.pcoGeometry.hierarchyStepSize;\n\t\tlet indices = this.name.substr(1);\n\n\t\tlet numParts = Math.floor(indices.length / hierarchyStepSize);\n\t\tfor (let i = 0; i < numParts; i++) {\n\t\t\tpath += indices.substr(i * hierarchyStepSize, hierarchyStepSize) + '/';\n\t\t}\n\n\t\tpath = path.slice(0, -1);\n\n\t\treturn path;\n\t}\n\n\taddChild(child) {\n\t\tthis.children[child.index] = child;\n\t\tchild.parent = this;\n\t}\n\n\tload(){\n\t\tif (this.loading === true || this.loaded === true || Potree.numNodesLoading >= Potree.maxNodesLoading) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.loading = true;\n\n\t\tPotree.numNodesLoading++;\n\n\t\tif (this.pcoGeometry.loader.version.equalOrHigher('1.5')) {\n\t\t\tif ((this.level % this.pcoGeometry.hierarchyStepSize) === 0 && this.hasChildren) {\n\t\t\t\tthis.loadHierachyThenPoints();\n\t\t\t} else {\n\t\t\t\tthis.loadPoints();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.loadPoints();\n\t\t}\n\t}\n\n\tloadPoints(){\n\t\tthis.pcoGeometry.loader.load(this);\n\t}\n\n\tloadHierachyThenPoints(){\n\t\tlet node = this;\n\n\t\t// load hierarchy\n\t\tlet callback = function (node, hbuffer) {\n\n\t\t\tlet tStart = performance.now();\n\n\t\t\tlet view = new DataView(hbuffer);\n\n\t\t\tlet stack = [];\n\t\t\tlet children = view.getUint8(0);\n\t\t\tlet numPoints = view.getUint32(1, true);\n\t\t\tnode.numPoints = numPoints;\n\t\t\tstack.push({children: children, numPoints: numPoints, name: node.name});\n\n\t\t\tlet decoded = [];\n\n\t\t\tlet offset = 5;\n\t\t\twhile (stack.length > 0) {\n\t\t\t\tlet snode = stack.shift();\n\t\t\t\tlet mask = 1;\n\t\t\t\tfor (let i = 0; i < 8; i++) {\n\t\t\t\t\tif ((snode.children & mask) !== 0) {\n\t\t\t\t\t\tlet childName = snode.name + i;\n\n\t\t\t\t\t\tlet childChildren = view.getUint8(offset);\n\t\t\t\t\t\tlet childNumPoints = view.getUint32(offset + 1, true);\n\n\t\t\t\t\t\tstack.push({children: childChildren, numPoints: childNumPoints, name: childName});\n\n\t\t\t\t\t\tdecoded.push({children: childChildren, numPoints: childNumPoints, name: childName});\n\n\t\t\t\t\t\toffset += 5;\n\t\t\t\t\t}\n\n\t\t\t\t\tmask = mask * 2;\n\t\t\t\t}\n\n\t\t\t\tif (offset === hbuffer.byteLength) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// console.log(decoded);\n\n\t\t\tlet nodes = {};\n\t\t\tnodes[node.name] = node;\n\t\t\tlet pco = node.pcoGeometry;\n\n\t\t\tfor (let i = 0; i < decoded.length; i++) {\n\t\t\t\tlet name = decoded[i].name;\n\t\t\t\tlet decodedNumPoints = decoded[i].numPoints;\n\t\t\t\tlet index = parseInt(name.charAt(name.length - 1));\n\t\t\t\tlet parentName = name.substring(0, name.length - 1);\n\t\t\t\tlet parentNode = nodes[parentName];\n\t\t\t\tlet level = name.length - 1;\n\t\t\t\tlet boundingBox = Utils.createChildAABB(parentNode.boundingBox, index);\n\n\t\t\t\tlet currentNode = new PointCloudOctreeGeometryNode(name, pco, boundingBox);\n\t\t\t\tcurrentNode.level = level;\n\t\t\t\tcurrentNode.numPoints = decodedNumPoints;\n\t\t\t\tcurrentNode.hasChildren = decoded[i].children > 0;\n\t\t\t\tcurrentNode.spacing = pco.spacing / Math.pow(2, level);\n\t\t\t\tparentNode.addChild(currentNode);\n\t\t\t\tnodes[name] = currentNode;\n\t\t\t}\n\n\t\t\tlet duration = performance.now() - tStart;\n\t\t\tif(duration > 5){\n\t\t\t\tlet msg = `duration: ${duration}ms, numNodes: ${decoded.length}`;\n\t\t\t\tconsole.log(msg);\n\t\t\t}\n\n\t\t\tnode.loadPoints();\n\t\t};\n\t\tif ((node.level % node.pcoGeometry.hierarchyStepSize) === 0) {\n\t\t\t// let hurl = node.pcoGeometry.octreeDir + \"/../hierarchy/\" + node.name + \".hrc\";\n\t\t\tlet hurl = node.pcoGeometry.octreeDir + '/' + node.getHierarchyPath() + '/' + node.name + '.hrc';\n\n\t\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\t\txhr.open('GET', hurl, true);\n\t\t\txhr.responseType = 'arraybuffer';\n\t\t\txhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t\t\txhr.onreadystatechange = () => {\n\t\t\t\tif (xhr.readyState === 4) {\n\t\t\t\t\tif (xhr.status === 200 || xhr.status === 0) {\n\t\t\t\t\t\tlet hbuffer = xhr.response;\n\t\t\t\t\t\tcallback(node, hbuffer);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.log('Failed to load file! HTTP status: ' + xhr.status + ', file: ' + hurl);\n\t\t\t\t\t\tPotree.numNodesLoading--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\ttry {\n\t\t\t\txhr.send(null);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log('fehler beim laden der punktwolke: ' + e);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetNumPoints(){\n\t\treturn this.numPoints;\n\t}\n\n\tdispose(){\n\t\tif (this.geometry && this.parent != null) {\n\t\t\tthis.geometry.dispose();\n\t\t\tthis.geometry = null;\n\t\t\tthis.loaded = false;\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\t\t\t\n\t\t\tfor (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) {\n\t\t\t\tlet handler = this.oneTimeDisposeHandlers[i];\n\t\t\t\thandler();\n\t\t\t}\n\t\t\tthis.oneTimeDisposeHandlers = [];\n\t\t}\n\t}\n\t\n}\n\nPointCloudOctreeGeometryNode.IDCount = 0;\n","import * as THREE from \"../../libs/three.js/build/three.module.js\";\n\n// -------------------------------------------\n// to get a ready to use gradient array from a chroma.js gradient:\n// http://gka.github.io/chroma.js/\n// -------------------------------------------\n//\n// let stops = [];\n// for(let i = 0; i <= 10; i++){\n//\tlet range = chroma.scale(['yellow', 'navy']).mode('lch').domain([10,0])(i)._rgb\n//\t\t.slice(0, 3)\n//\t\t.map(v => (v / 255).toFixed(4))\n//\t\t.join(\", \");\n//\n//\tlet line = `[${i / 10}, new THREE.Color(${range})],`;\n//\n//\tstops.push(line);\n// }\n// stops.join(\"\\n\");\n//\n//\n//\n// -------------------------------------------\n// to get a ready to use gradient array from matplotlib:\n// -------------------------------------------\n// import matplotlib.pyplot as plt\n// import matplotlib.colors as colors\n//\n// norm = colors.Normalize(vmin=0,vmax=1)\n// cmap = plt.cm.viridis\n//\n// for i in range(0,11):\n//\tu = i / 10\n//\trgb = cmap(norm(u))[0:3]\n//\trgb = [\"{0:.3f}\".format(v) for v in rgb]\n//\trgb = \"[\" + str(u) + \", new THREE.Color(\" + \", \".join(rgb) + \")],\"\n//\tprint(rgb)\n\nlet Gradients = {\n\t// From chroma spectral http://gka.github.io/chroma.js/\n\tSPECTRAL: [\n\t\t[0, new THREE.Color(0.3686, 0.3098, 0.6353)],\n\t\t[0.1, new THREE.Color(0.1961, 0.5333, 0.7412)],\n\t\t[0.2, new THREE.Color(0.4000, 0.7608, 0.6471)],\n\t\t[0.3, new THREE.Color(0.6706, 0.8667, 0.6431)],\n\t\t[0.4, new THREE.Color(0.9020, 0.9608, 0.5961)],\n\t\t[0.5, new THREE.Color(1.0000, 1.0000, 0.7490)],\n\t\t[0.6, new THREE.Color(0.9961, 0.8784, 0.5451)],\n\t\t[0.7, new THREE.Color(0.9922, 0.6824, 0.3804)],\n\t\t[0.8, new THREE.Color(0.9569, 0.4275, 0.2627)],\n\t\t[0.9, new THREE.Color(0.8353, 0.2431, 0.3098)],\n\t\t[1, new THREE.Color(0.6196, 0.0039, 0.2588)]\n\t],\n\tPLASMA: [\n\t\t[0.0, new THREE.Color(0.241, 0.015, 0.610)],\n\t\t[0.1, new THREE.Color(0.387, 0.001, 0.654)],\n\t\t[0.2, new THREE.Color(0.524, 0.025, 0.653)],\n\t\t[0.3, new THREE.Color(0.651, 0.125, 0.596)],\n\t\t[0.4, new THREE.Color(0.752, 0.227, 0.513)],\n\t\t[0.5, new THREE.Color(0.837, 0.329, 0.431)],\n\t\t[0.6, new THREE.Color(0.907, 0.435, 0.353)],\n\t\t[0.7, new THREE.Color(0.963, 0.554, 0.272)],\n\t\t[0.8, new THREE.Color(0.992, 0.681, 0.195)],\n\t\t[0.9, new THREE.Color(0.987, 0.822, 0.144)],\n\t\t[1.0, new THREE.Color(0.940, 0.975, 0.131)]\n\t],\n\tYELLOW_GREEN: [\n\t\t[0, new THREE.Color(0.1647, 0.2824, 0.3451)],\n\t\t[0.1, new THREE.Color(0.1338, 0.3555, 0.4227)],\n\t\t[0.2, new THREE.Color(0.0610, 0.4319, 0.4864)],\n\t\t[0.3, new THREE.Color(0.0000, 0.5099, 0.5319)],\n\t\t[0.4, new THREE.Color(0.0000, 0.5881, 0.5569)],\n\t\t[0.5, new THREE.Color(0.1370, 0.6650, 0.5614)],\n\t\t[0.6, new THREE.Color(0.2906, 0.7395, 0.5477)],\n\t\t[0.7, new THREE.Color(0.4453, 0.8099, 0.5201)],\n\t\t[0.8, new THREE.Color(0.6102, 0.8748, 0.4850)],\n\t\t[0.9, new THREE.Color(0.7883, 0.9323, 0.4514)],\n\t\t[1, new THREE.Color(0.9804, 0.9804, 0.4314)]\n\t],\n\tVIRIDIS: [\n\t\t[0.0, new THREE.Color(0.267, 0.005, 0.329)],\n\t\t[0.1, new THREE.Color(0.283, 0.141, 0.458)],\n\t\t[0.2, new THREE.Color(0.254, 0.265, 0.530)],\n\t\t[0.3, new THREE.Color(0.207, 0.372, 0.553)],\n\t\t[0.4, new THREE.Color(0.164, 0.471, 0.558)],\n\t\t[0.5, new THREE.Color(0.128, 0.567, 0.551)],\n\t\t[0.6, new THREE.Color(0.135, 0.659, 0.518)],\n\t\t[0.7, new THREE.Color(0.267, 0.749, 0.441)],\n\t\t[0.8, new THREE.Color(0.478, 0.821, 0.318)],\n\t\t[0.9, new THREE.Color(0.741, 0.873, 0.150)],\n\t\t[1.0, new THREE.Color(0.993, 0.906, 0.144)]\n\t],\n\tINFERNO: [\n\t\t[0.0, new THREE.Color(0.077, 0.042, 0.206)],\n\t\t[0.1, new THREE.Color(0.225, 0.036, 0.388)],\n\t\t[0.2, new THREE.Color(0.373, 0.074, 0.432)],\n\t\t[0.3, new THREE.Color(0.522, 0.128, 0.420)],\n\t\t[0.4, new THREE.Color(0.665, 0.182, 0.370)],\n\t\t[0.5, new THREE.Color(0.797, 0.255, 0.287)],\n\t\t[0.6, new THREE.Color(0.902, 0.364, 0.184)],\n\t\t[0.7, new THREE.Color(0.969, 0.516, 0.063)],\n\t\t[0.8, new THREE.Color(0.988, 0.683, 0.072)],\n\t\t[0.9, new THREE.Color(0.961, 0.859, 0.298)],\n\t\t[1.0, new THREE.Color(0.988, 0.998, 0.645)]\n\t],\n\tGRAYSCALE: [\n\t\t[0, new THREE.Color(0, 0, 0)],\n\t\t[1, new THREE.Color(1, 1, 1)]\n\t],\n\t// 16 samples of the TURBU color scheme\n\t// values taken from: https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f\n\t// original file licensed under Apache-2.0\n\tTURBO: [\n\t\t[0.00, new THREE.Color(0.18995, 0.07176, 0.23217)],\n\t\t[0.07, new THREE.Color(0.25107, 0.25237, 0.63374)],\n\t\t[0.13, new THREE.Color(0.27628, 0.42118, 0.89123)],\n\t\t[0.20, new THREE.Color(0.25862, 0.57958, 0.99876)],\n\t\t[0.27, new THREE.Color(0.15844, 0.73551, 0.92305)],\n\t\t[0.33, new THREE.Color(0.09267, 0.86554, 0.7623)],\n\t\t[0.40, new THREE.Color(0.19659, 0.94901, 0.59466)],\n\t\t[0.47, new THREE.Color(0.42778, 0.99419, 0.38575)],\n\t\t[0.53, new THREE.Color(0.64362, 0.98999, 0.23356)],\n\t\t[0.60, new THREE.Color(0.80473, 0.92452, 0.20459)],\n\t\t[0.67, new THREE.Color(0.93301, 0.81236, 0.22667)],\n\t\t[0.73, new THREE.Color(0.99314, 0.67408, 0.20348)],\n\t\t[0.80, new THREE.Color(0.9836, 0.49291, 0.12849)],\n\t\t[0.87, new THREE.Color(0.92105, 0.31489, 0.05475)],\n\t\t[0.93, new THREE.Color(0.81608, 0.18462, 0.01809)],\n\t\t[1.00, new THREE.Color(0.66449, 0.08436, 0.00424)],\n\t],\n\tRAINBOW: [\n\t\t[0, new THREE.Color(0.278, 0, 0.714)],\n\t\t[1 / 6, new THREE.Color(0, 0, 1)],\n\t\t[2 / 6, new THREE.Color(0, 1, 1)],\n\t\t[3 / 6, new THREE.Color(0, 1, 0)],\n\t\t[4 / 6, new THREE.Color(1, 1, 0)],\n\t\t[5 / 6, new THREE.Color(1, 0.64, 0)],\n\t\t[1, new THREE.Color(1, 0, 0)]\n\t],\n\tCONTOUR: [\n\t\t[0.00, new THREE.Color(0, 0, 0)],\n\t\t[0.03, new THREE.Color(0, 0, 0)],\n\t\t[0.04, new THREE.Color(1, 1, 1)],\n\t\t[1.00, new THREE.Color(1, 1, 1)]\n\t],\n};\n\n\nexport {Gradients};\n","let Shaders = {};\n\nShaders[\"pointcloud.vs\"] = `\nprecision highp float;\nprecision highp int;\n\n#define max_clip_polygons 8\n#define PI 3.141592653589793\n\nattribute vec3 position;\nattribute vec3 color;\nattribute float intensity;\nattribute float classification;\nattribute float returnNumber;\nattribute float numberOfReturns;\nattribute float pointSourceID;\nattribute vec4 indices;\nattribute float spacing;\nattribute float gpsTime;\nattribute vec3 normal;\nattribute float aExtra;\n\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 uViewInv;\n\nuniform float uScreenWidth;\nuniform float uScreenHeight;\nuniform float fov;\nuniform float near;\nuniform float far;\n\nuniform bool uDebug;\n\nuniform bool uUseOrthographicCamera;\nuniform float uOrthoWidth;\nuniform float uOrthoHeight;\n\n#define CLIPTASK_NONE 0\n#define CLIPTASK_HIGHLIGHT 1\n#define CLIPTASK_SHOW_INSIDE 2\n#define CLIPTASK_SHOW_OUTSIDE 3\n\n#define CLIPMETHOD_INSIDE_ANY 0\n#define CLIPMETHOD_INSIDE_ALL 1\n\nuniform int clipTask;\nuniform int clipMethod;\n#if defined(num_clipboxes) && num_clipboxes > 0\n\tuniform mat4 clipBoxes[num_clipboxes];\n#endif\n\n#if defined(num_clipspheres) && num_clipspheres > 0\n\tuniform mat4 uClipSpheres[num_clipspheres];\n#endif\n\n#if defined(num_clippolygons) && num_clippolygons > 0\n\tuniform int uClipPolygonVCount[num_clippolygons];\n\tuniform vec3 uClipPolygonVertices[num_clippolygons * 8];\n\tuniform mat4 uClipPolygonWVP[num_clippolygons];\n#endif\n\n\nuniform float size;\nuniform float minSize;\nuniform float maxSize;\n\nuniform float uPCIndex;\nuniform float uOctreeSpacing;\nuniform float uNodeSpacing;\nuniform float uOctreeSize;\nuniform vec3 uBBSize;\nuniform float uLevel;\nuniform float uVNStart;\nuniform bool uIsLeafNode;\n\nuniform vec3 uColor;\nuniform float uOpacity;\n\nuniform vec2 elevationRange;\nuniform vec2 intensityRange;\n\nuniform vec2 uFilterReturnNumberRange;\nuniform vec2 uFilterNumberOfReturnsRange;\nuniform vec2 uFilterPointSourceIDClipRange;\nuniform vec2 uFilterGPSTimeClipRange;\nuniform float uGpsScale;\nuniform float uGpsOffset;\n\nuniform vec2 uNormalizedGpsBufferRange;\n\nuniform vec3 uIntensity_gbc;\nuniform vec3 uRGB_gbc;\nuniform vec3 uExtra_gbc;\n\nuniform float uTransition;\nuniform float wRGB;\nuniform float wIntensity;\nuniform float wElevation;\nuniform float wClassification;\nuniform float wReturnNumber;\nuniform float wSourceID;\n\nuniform vec2 uExtraNormalizedRange;\nuniform vec2 uExtraRange;\nuniform float uExtraScale;\nuniform float uExtraOffset;\n\nuniform vec3 uShadowColor;\n\nuniform sampler2D visibleNodes;\nuniform sampler2D gradient;\nuniform sampler2D classificationLUT;\n\n#if defined(color_type_matcap)\nuniform sampler2D matcapTextureUniform;\n#endif\nuniform bool backfaceCulling;\n\n#if defined(num_shadowmaps) && num_shadowmaps > 0\nuniform sampler2D uShadowMap[num_shadowmaps];\nuniform mat4 uShadowWorldView[num_shadowmaps];\nuniform mat4 uShadowProj[num_shadowmaps];\n#endif\n\nvarying vec3\tvColor;\nvarying float\tvLogDepth;\nvarying vec3\tvViewPosition;\nvarying float \tvRadius;\nvarying float \tvPointSize;\n\n\nfloat round(float number){\n\treturn floor(number + 0.5);\n}\n\n// \n// ### ######## ### ######## ######## #### ## ## ######## ###### #### ######## ######## ###### \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## ######## ## ## ## ## ###### ###### ## ## ###### ###### \n// ######### ## ## ######### ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ######## ## ## ## ## #### ### ######## ###### #### ######## ######## ###### \n// \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n// ---------------------\n// OCTREE\n// ---------------------\n\n#if (defined(adaptive_point_size) || defined(color_type_level_of_detail)) && defined(tree_type_octree)\n/**\n * number of 1-bits up to inclusive index position\n * number is treated as if it were an integer in the range 0-255\n *\n */\nint numberOfOnes(int number, int index){\n\tint numOnes = 0;\n\tint tmp = 128;\n\tfor(int i = 7; i >= 0; i--){\n\t\t\n\t\tif(number >= tmp){\n\t\t\tnumber = number - tmp;\n\n\t\t\tif(i <= index){\n\t\t\t\tnumOnes++;\n\t\t\t}\n\t\t}\n\t\t\n\t\ttmp = tmp / 2;\n\t}\n\n\treturn numOnes;\n}\n\n\n/**\n * checks whether the bit at index is 1\n * number is treated as if it were an integer in the range 0-255\n *\n */\nbool isBitSet(int number, int index){\n\n\t// weird multi else if due to lack of proper array, int and bitwise support in WebGL 1.0\n\tint powi = 1;\n\tif(index == 0){\n\t\tpowi = 1;\n\t}else if(index == 1){\n\t\tpowi = 2;\n\t}else if(index == 2){\n\t\tpowi = 4;\n\t}else if(index == 3){\n\t\tpowi = 8;\n\t}else if(index == 4){\n\t\tpowi = 16;\n\t}else if(index == 5){\n\t\tpowi = 32;\n\t}else if(index == 6){\n\t\tpowi = 64;\n\t}else if(index == 7){\n\t\tpowi = 128;\n\t}else{\n\t\treturn false;\n\t}\n\n\tint ndp = number / powi;\n\n\treturn mod(float(ndp), 2.0) != 0.0;\n}\n\n\n/**\n * find the LOD at the point position\n */\nfloat getLOD(){\n\t\n\tvec3 offset = vec3(0.0, 0.0, 0.0);\n\tint iOffset = int(uVNStart);\n\tfloat depth = uLevel;\n\tfor(float i = 0.0; i <= 30.0; i++){\n\t\tfloat nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0);\n\t\t\n\t\tvec3 index3d = (position-offset) / nodeSizeAtLevel;\n\t\tindex3d = floor(index3d + 0.5);\n\t\tint index = int(round(4.0 * index3d.x + 2.0 * index3d.y + index3d.z));\n\t\t\n\t\tvec4 value = texture2D(visibleNodes, vec2(float(iOffset) / 2048.0, 0.0));\n\t\tint mask = int(round(value.r * 255.0));\n\n\t\tif(isBitSet(mask, index)){\n\t\t\t// there are more visible child nodes at this position\n\t\t\tint advanceG = int(round(value.g * 255.0)) * 256;\n\t\t\tint advanceB = int(round(value.b * 255.0));\n\t\t\tint advanceChild = numberOfOnes(mask, index - 1);\n\t\t\tint advance = advanceG + advanceB + advanceChild;\n\n\t\t\tiOffset = iOffset + advance;\n\t\t\t\n\t\t\tdepth++;\n\t\t}else{\n\t\t\t// no more visible child nodes at this position\n\t\t\t//return value.a * 255.0;\n\n\t\t\tfloat lodOffset = (255.0 * value.a) / 10.0 - 10.0;\n\n\t\t\treturn depth + lodOffset;\n\t\t}\n\t\t\n\t\toffset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d;\n\t}\n\t\t\n\treturn depth;\n}\n\nfloat getSpacing(){\n\tvec3 offset = vec3(0.0, 0.0, 0.0);\n\tint iOffset = int(uVNStart);\n\tfloat depth = uLevel;\n\tfloat spacing = uNodeSpacing;\n\tfor(float i = 0.0; i <= 30.0; i++){\n\t\tfloat nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0);\n\t\t\n\t\tvec3 index3d = (position-offset) / nodeSizeAtLevel;\n\t\tindex3d = floor(index3d + 0.5);\n\t\tint index = int(round(4.0 * index3d.x + 2.0 * index3d.y + index3d.z));\n\t\t\n\t\tvec4 value = texture2D(visibleNodes, vec2(float(iOffset) / 2048.0, 0.0));\n\t\tint mask = int(round(value.r * 255.0));\n\t\tfloat spacingFactor = value.a;\n\n\t\tif(i > 0.0){\n\t\t\tspacing = spacing / (255.0 * spacingFactor);\n\t\t}\n\t\t\n\n\t\tif(isBitSet(mask, index)){\n\t\t\t// there are more visible child nodes at this position\n\t\t\tint advanceG = int(round(value.g * 255.0)) * 256;\n\t\t\tint advanceB = int(round(value.b * 255.0));\n\t\t\tint advanceChild = numberOfOnes(mask, index - 1);\n\t\t\tint advance = advanceG + advanceB + advanceChild;\n\n\t\t\tiOffset = iOffset + advance;\n\n\t\t\t//spacing = spacing / (255.0 * spacingFactor);\n\t\t\t//spacing = spacing / 3.0;\n\t\t\t\n\t\t\tdepth++;\n\t\t}else{\n\t\t\t// no more visible child nodes at this position\n\t\t\treturn spacing;\n\t\t}\n\t\t\n\t\toffset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d;\n\t}\n\t\t\n\treturn spacing;\n}\n\nfloat getPointSizeAttenuation(){\n\treturn pow(2.0, getLOD());\n}\n\n\n#endif\n\n\n// ---------------------\n// KD-TREE\n// ---------------------\n\n#if (defined(adaptive_point_size) || defined(color_type_level_of_detail)) && defined(tree_type_kdtree)\n\nfloat getLOD(){\n\tvec3 offset = vec3(0.0, 0.0, 0.0);\n\tfloat iOffset = 0.0;\n\tfloat depth = 0.0;\n\t\t\n\t\t\n\tvec3 size = uBBSize;\t\n\tvec3 pos = position;\n\t\t\n\tfor(float i = 0.0; i <= 1000.0; i++){\n\t\t\n\t\tvec4 value = texture2D(visibleNodes, vec2(iOffset / 2048.0, 0.0));\n\t\t\n\t\tint children = int(value.r * 255.0);\n\t\tfloat next = value.g * 255.0;\n\t\tint split = int(value.b * 255.0);\n\t\t\n\t\tif(next == 0.0){\n\t\t \treturn depth;\n\t\t}\n\t\t\n\t\tvec3 splitv = vec3(0.0, 0.0, 0.0);\n\t\tif(split == 1){\n\t\t\tsplitv.x = 1.0;\n\t\t}else if(split == 2){\n\t\t \tsplitv.y = 1.0;\n\t\t}else if(split == 4){\n\t\t \tsplitv.z = 1.0;\n\t\t}\n\t\t\n\t\tiOffset = iOffset + next;\n\t\t\n\t\tfloat factor = length(pos * splitv / size);\n\t\tif(factor < 0.5){\n\t\t\t// left\n\t\tif(children == 0 || children == 2){\n\t\t\t\treturn depth;\n\t\t\t}\n\t\t}else{\n\t\t\t// right\n\t\t\tpos = pos - size * splitv * 0.5;\n\t\t\tif(children == 0 || children == 1){\n\t\t\t\treturn depth;\n\t\t\t}\n\t\t\tif(children == 3){\n\t\t\t\tiOffset = iOffset + 1.0;\n\t\t\t}\n\t\t}\n\t\tsize = size * ((1.0 - (splitv + 1.0) / 2.0) + 0.5);\n\t\t\n\t\tdepth++;\n\t}\n\t\t\n\t\t\n\treturn depth;\t\n}\n\nfloat getPointSizeAttenuation(){\n\treturn 0.5 * pow(1.3, getLOD());\n}\n\n#endif\n\n\n\n// \n// ### ######## ######## ######## #### ######## ## ## ######## ######## ###### \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ######## ## ######## ## ## ## ###### ###### \n// ######### ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## \n// ## ## ## ## ## ## #### ######## ####### ## ######## ###### \n// \n\n\n\n// formula adapted from: http://www.dfstudios.co.uk/articles/programming/image-programming-algorithms/image-processing-algorithms-part-5-contrast-adjustment/\nfloat getContrastFactor(float contrast){\n\treturn (1.0158730158730156 * (contrast + 1.0)) / (1.0158730158730156 - contrast);\n}\n\nvec3 getRGB(){\n\tvec3 rgb = color;\n\t\n\trgb = pow(rgb, vec3(uRGB_gbc.x));\n\trgb = rgb + uRGB_gbc.y;\n\trgb = (rgb - 0.5) * getContrastFactor(uRGB_gbc.z) + 0.5;\n\trgb = clamp(rgb, 0.0, 1.0);\n\n\treturn rgb;\n}\n\nfloat getIntensity(){\n\tfloat w = (intensity - intensityRange.x) / (intensityRange.y - intensityRange.x);\n\tw = pow(w, uIntensity_gbc.x);\n\tw = w + uIntensity_gbc.y;\n\tw = (w - 0.5) * getContrastFactor(uIntensity_gbc.z) + 0.5;\n\tw = clamp(w, 0.0, 1.0);\n\n\treturn w;\n}\n\nvec3 getGpsTime(){\n\n\tfloat w = (gpsTime + uGpsOffset) * uGpsScale;\n\n\n\tvec3 c = texture2D(gradient, vec2(w, 1.0 - w)).rgb;\n\n\n\t// vec2 r = uNormalizedGpsBufferRange;\n\t// float w = gpsTime * (r.y - r.x) + r.x;\n\t// w = clamp(w, 0.0, 1.0);\n\t// vec3 c = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\t\n\treturn c;\n}\n\nvec3 getElevation(){\n\tvec4 world = modelMatrix * vec4( position, 1.0 );\n\tfloat w = (world.z - elevationRange.x) / (elevationRange.y - elevationRange.x);\n\tvec3 cElevation = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\t\n\treturn cElevation;\n}\n\nvec4 getClassification(){\n\tvec2 uv = vec2(classification / 255.0, 0.5);\n\tvec4 classColor = texture2D(classificationLUT, uv);\n\t\n\treturn classColor;\n}\n\nvec3 getReturns(){\n\n\t// 0b 00_000_111\n\tfloat rn = mod(returnNumber, 8.0);\n\t// 0b 00_111_000\n\tfloat nr = mod(returnNumber / 8.0, 8.0);\n\n\tif(nr <= 1.0){\n\t\treturn vec3(1.0, 0.0, 0.0);\n\t}else{\n\t\treturn vec3(0.0, 1.0, 0.0);\n\t}\n\n\t// return vec3(nr / 4.0, 0.0, 0.0);\n\n\t// if(nr == 1.0){\n\t// \treturn vec3(1.0, 1.0, 0.0);\n\t// }else{\n\t// \tif(rn == 1.0){\n\t// \t\treturn vec3(1.0, 0.0, 0.0);\n\t// \t}else if(rn == nr){\n\t// \t\treturn vec3(0.0, 0.0, 1.0);\n\t// \t}else{\n\t// \t\treturn vec3(0.0, 1.0, 0.0);\n\t// \t}\n\t// }\n\n\t// if(numberOfReturns == 1.0){\n\t// \treturn vec3(1.0, 1.0, 0.0);\n\t// }else{\n\t// \tif(returnNumber == 1.0){\n\t// \t\treturn vec3(1.0, 0.0, 0.0);\n\t// \t}else if(returnNumber == numberOfReturns){\n\t// \t\treturn vec3(0.0, 0.0, 1.0);\n\t// \t}else{\n\t// \t\treturn vec3(0.0, 1.0, 0.0);\n\t// \t}\n\t// }\n}\n\nvec3 getReturnNumber(){\n\tif(numberOfReturns == 1.0){\n\t\treturn vec3(1.0, 1.0, 0.0);\n\t}else{\n\t\tif(returnNumber == 1.0){\n\t\t\treturn vec3(1.0, 0.0, 0.0);\n\t\t}else if(returnNumber == numberOfReturns){\n\t\t\treturn vec3(0.0, 0.0, 1.0);\n\t\t}else{\n\t\t\treturn vec3(0.0, 1.0, 0.0);\n\t\t}\n\t}\n}\n\nvec3 getNumberOfReturns(){\n\tfloat value = numberOfReturns;\n\n\tfloat w = value / 6.0;\n\n\tvec3 color = texture2D(gradient, vec2(w, 1.0 - w)).rgb;\n\n\treturn color;\n}\n\nvec3 getSourceID(){\n\tfloat w = mod(pointSourceID, 10.0) / 10.0;\n\treturn texture2D(gradient, vec2(w,1.0 - w)).rgb;\n}\n\nvec3 getCompositeColor(){\n\tvec3 c;\n\tfloat w;\n\n\tc += wRGB * getRGB();\n\tw += wRGB;\n\t\n\tc += wIntensity * getIntensity() * vec3(1.0, 1.0, 1.0);\n\tw += wIntensity;\n\t\n\tc += wElevation * getElevation();\n\tw += wElevation;\n\t\n\tc += wReturnNumber * getReturnNumber();\n\tw += wReturnNumber;\n\t\n\tc += wSourceID * getSourceID();\n\tw += wSourceID;\n\t\n\tvec4 cl = wClassification * getClassification();\n\tc += cl.a * cl.rgb;\n\tw += wClassification * cl.a;\n\n\tc = c / w;\n\t\n\tif(w == 0.0){\n\t\t//c = color;\n\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t}\n\t\n\treturn c;\n}\n\n\nvec3 getNormal(){\n\t//vec3 n_hsv = vec3( modelMatrix * vec4( normal, 0.0 )) * 0.5 + 0.5; // (n_world.xyz + vec3(1.,1.,1.)) / 2.;\n\tvec3 n_view = normalize( vec3(modelViewMatrix * vec4( normal, 0.0 )) );\n\treturn n_view;\n}\nbool applyBackfaceCulling() {\n\t// Black not facing vertices / Backface culling\n\tvec3 e = normalize(vec3(modelViewMatrix * vec4( position, 1. )));\n\tvec3 n = getNormal(); // normalize( vec3(modelViewMatrix * vec4( normal, 0.0 )) );\n\n\tif((uUseOrthographicCamera && n.z <= 0.) || (!uUseOrthographicCamera && dot( n, e ) >= 0.)) { \n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\n#if defined(color_type_matcap)\n// Matcap Material\nvec3 getMatcap(){ \n\tvec3 eye = normalize( vec3( modelViewMatrix * vec4( position, 1. ) ) ); \n\tif(uUseOrthographicCamera) { \n\t\teye = vec3(0., 0., -1.);\n\t}\n\tvec3 r_en = reflect( eye, getNormal() ); // or r_en = e - 2. * dot( n, e ) * n;\n\tfloat m = 2. * sqrt(pow( r_en.x, 2. ) + pow( r_en.y, 2. ) + pow( r_en.z + 1., 2. ));\n\tvec2 vN = r_en.xy / m + .5;\n\treturn texture2D(matcapTextureUniform, vN).rgb; \n}\n#endif\n\nvec3 getExtra(){\n\n\tfloat w = (aExtra + uExtraOffset) * uExtraScale;\n\tw = clamp(w, 0.0, 1.0);\n\n\tvec3 color = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\n\t// vec2 r = uExtraNormalizedRange;\n\n\t// float w = aExtra * (r.y - r.x) + r.x;\n\n\t// w = (w - uExtraRange.x) / (uExtraRange.y - uExtraRange.x);\n\n\t// w = clamp(w, 0.0, 1.0);\n\n\t// vec3 color = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\n\treturn color;\n}\n\nvec3 getColor(){\n\tvec3 color;\n\t\n\t#ifdef color_type_rgba\n\t\tcolor = getRGB();\n\t#elif defined color_type_height || defined color_type_elevation\n\t\tcolor = getElevation();\n\t#elif defined color_type_rgb_height\n\t\tvec3 cHeight = getElevation();\n\t\tcolor = (1.0 - uTransition) * getRGB() + uTransition * cHeight;\n\t#elif defined color_type_depth\n\t\tfloat linearDepth = gl_Position.w;\n\t\tfloat expDepth = (gl_Position.z / gl_Position.w) * 0.5 + 0.5;\n\t\tcolor = vec3(linearDepth, expDepth, 0.0);\n\t\t//color = vec3(1.0, 0.5, 0.3);\n\t#elif defined color_type_intensity\n\t\tfloat w = getIntensity();\n\t\tcolor = vec3(w, w, w);\n\t#elif defined color_type_gps_time\n\t\tcolor = getGpsTime();\n\t#elif defined color_type_intensity_gradient\n\t\tfloat w = getIntensity();\n\t\tcolor = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\t#elif defined color_type_color\n\t\tcolor = uColor;\n\t#elif defined color_type_level_of_detail\n\t\tfloat depth = getLOD();\n\t\tfloat w = depth / 10.0;\n\t\tcolor = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\t#elif defined color_type_indices\n\t\tcolor = indices.rgb;\n\t#elif defined color_type_classification\n\t\tvec4 cl = getClassification(); \n\t\tcolor = cl.rgb;\n\t#elif defined color_type_return_number\n\t\tcolor = getReturnNumber();\n\t#elif defined color_type_returns\n\t\tcolor = getReturns();\n\t#elif defined color_type_number_of_returns\n\t\tcolor = getNumberOfReturns();\n\t#elif defined color_type_source_id\n\t\tcolor = getSourceID();\n\t#elif defined color_type_point_source_id\n\t\tcolor = getSourceID();\n\t#elif defined color_type_normal\n\t\tcolor = (modelMatrix * vec4(normal, 0.0)).xyz;\n\t#elif defined color_type_phong\n\t\tcolor = color;\n\t#elif defined color_type_composite\n\t\tcolor = getCompositeColor();\n\t#elif defined color_type_matcap\n\t\tcolor = getMatcap();\n\t#else \n\t\tcolor = getExtra();\n\t#endif\n\t\n\tif (backfaceCulling && applyBackfaceCulling()) {\n\t\tcolor = vec3(0.);\n\t}\n\n\treturn color;\n}\n\nfloat getPointSize(){\n\tfloat pointSize = 1.0;\n\t\n\tfloat slope = tan(fov / 2.0);\n\tfloat projFactor = -0.5 * uScreenHeight / (slope * vViewPosition.z);\n\n\tfloat scale = length(\n\t\tmodelViewMatrix * vec4(0, 0, 0, 1) - \n\t\tmodelViewMatrix * vec4(uOctreeSpacing, 0, 0, 1)\n\t) / uOctreeSpacing;\n\tprojFactor = projFactor * scale;\n\t\n\tfloat r = uOctreeSpacing * 1.7;\n\tvRadius = r;\n\t#if defined fixed_point_size\n\t\tpointSize = size;\n\t#elif defined attenuated_point_size\n\t\tif(uUseOrthographicCamera){\n\t\t\tpointSize = size;\n\t\t}else{\n\t\t\tpointSize = size * spacing * projFactor;\n\t\t\t//pointSize = pointSize * projFactor;\n\t\t}\n\t#elif defined adaptive_point_size\n\t\tif(uUseOrthographicCamera) {\n\t\t\tfloat worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation();\n\t\t\tpointSize = (worldSpaceSize / uOrthoWidth) * uScreenWidth;\n\t\t} else {\n\t\t\tfloat worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation();\n\t\t\tpointSize = worldSpaceSize * projFactor;\n\t\t}\n\t#endif\n\n\tpointSize = max(minSize, pointSize);\n\tpointSize = min(maxSize, pointSize);\n\t\n\tvRadius = pointSize / projFactor;\n\n\treturn pointSize;\n}\n\n#if defined(num_clippolygons) && num_clippolygons > 0\nbool pointInClipPolygon(vec3 point, int polyIdx) {\n\n\tmat4 wvp = uClipPolygonWVP[polyIdx];\n\t//vec4 screenClipPos = uClipPolygonVP[polyIdx] * modelMatrix * vec4(point, 1.0);\n\t//screenClipPos.xy = screenClipPos.xy / screenClipPos.w * 0.5 + 0.5;\n\n\tvec4 pointNDC = wvp * vec4(point, 1.0);\n\tpointNDC.xy = pointNDC.xy / pointNDC.w;\n\n\tint j = uClipPolygonVCount[polyIdx] - 1;\n\tbool c = false;\n\tfor(int i = 0; i < 8; i++) {\n\t\tif(i == uClipPolygonVCount[polyIdx]) {\n\t\t\tbreak;\n\t\t}\n\n\t\t//vec4 verti = wvp * vec4(uClipPolygonVertices[polyIdx * 8 + i], 1);\n\t\t//vec4 vertj = wvp * vec4(uClipPolygonVertices[polyIdx * 8 + j], 1);\n\n\t\t//verti.xy = verti.xy / verti.w;\n\t\t//vertj.xy = vertj.xy / vertj.w;\n\n\t\t//verti.xy = verti.xy / verti.w * 0.5 + 0.5;\n\t\t//vertj.xy = vertj.xy / vertj.w * 0.5 + 0.5;\n\n\t\tvec3 verti = uClipPolygonVertices[polyIdx * 8 + i];\n\t\tvec3 vertj = uClipPolygonVertices[polyIdx * 8 + j];\n\n\t\tif( ((verti.y > pointNDC.y) != (vertj.y > pointNDC.y)) && \n\t\t\t(pointNDC.x < (vertj.x-verti.x) * (pointNDC.y-verti.y) / (vertj.y-verti.y) + verti.x) ) {\n\t\t\tc = !c;\n\t\t}\n\t\tj = i;\n\t}\n\n\treturn c;\n}\n#endif\n\nvoid doClipping(){\n\n\t{\n\t\tvec4 cl = getClassification(); \n\t\tif(cl.a == 0.0){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\n\t#if defined(clip_return_number_enabled)\n\t{ // return number filter\n\t\tvec2 range = uFilterReturnNumberRange;\n\t\tif(returnNumber < range.x || returnNumber > range.y){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\t#endif\n\n\t#if defined(clip_number_of_returns_enabled)\n\t{ // number of return filter\n\t\tvec2 range = uFilterNumberOfReturnsRange;\n\t\tif(numberOfReturns < range.x || numberOfReturns > range.y){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\t#endif\n\n\t#if defined(clip_gps_enabled)\n\t{ // GPS time filter\n\t\tfloat time = (gpsTime + uGpsOffset) * uGpsScale;\n\t\tvec2 range = uFilterGPSTimeClipRange;\n\n\t\tif(time < range.x || time > range.y){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\t#endif\n\n\t#if defined(clip_point_source_id_enabled)\n\t{ // point source id filter\n\t\tvec2 range = uFilterPointSourceIDClipRange;\n\t\tif(pointSourceID < range.x || pointSourceID > range.y){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\t#endif\n\n\tint clipVolumesCount = 0;\n\tint insideCount = 0;\n\n\t#if defined(num_clipboxes) && num_clipboxes > 0\n\t\tfor(int i = 0; i < num_clipboxes; i++){\n\t\t\tvec4 clipPosition = clipBoxes[i] * modelMatrix * vec4( position, 1.0 );\n\t\t\tbool inside = -0.5 <= clipPosition.x && clipPosition.x <= 0.5;\n\t\t\tinside = inside && -0.5 <= clipPosition.y && clipPosition.y <= 0.5;\n\t\t\tinside = inside && -0.5 <= clipPosition.z && clipPosition.z <= 0.5;\n\n\t\t\tinsideCount = insideCount + (inside ? 1 : 0);\n\t\t\tclipVolumesCount++;\n\t\t}\t\n\t#endif\n\n\t#if defined(num_clippolygons) && num_clippolygons > 0\n\t\tfor(int i = 0; i < num_clippolygons; i++) {\n\t\t\tbool inside = pointInClipPolygon(position, i);\n\n\t\t\tinsideCount = insideCount + (inside ? 1 : 0);\n\t\t\tclipVolumesCount++;\n\t\t}\n\t#endif\n\n\tbool insideAny = insideCount > 0;\n\tbool insideAll = (clipVolumesCount > 0) && (clipVolumesCount == insideCount);\n\n\tif(clipMethod == CLIPMETHOD_INSIDE_ANY){\n\t\tif(insideAny && clipTask == CLIPTASK_HIGHLIGHT){\n\t\t\tvColor.r += 0.5;\n\t\t}else if(!insideAny && clipTask == CLIPTASK_SHOW_INSIDE){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 1.0);\n\t\t}else if(insideAny && clipTask == CLIPTASK_SHOW_OUTSIDE){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 1.0);\n\t\t}\n\t}else if(clipMethod == CLIPMETHOD_INSIDE_ALL){\n\t\tif(insideAll && clipTask == CLIPTASK_HIGHLIGHT){\n\t\t\tvColor.r += 0.5;\n\t\t}else if(!insideAll && clipTask == CLIPTASK_SHOW_INSIDE){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 1.0);\n\t\t}else if(insideAll && clipTask == CLIPTASK_SHOW_OUTSIDE){\n\t\t\tgl_Position = vec4(100.0, 100.0, 100.0, 1.0);\n\t\t}\n\t}\n}\n\n\n\n// \n// ## ## ### #### ## ## \n// ### ### ## ## ## ### ## \n// #### #### ## ## ## #### ## \n// ## ### ## ## ## ## ## ## ## \n// ## ## ######### ## ## #### \n// ## ## ## ## ## ## ### \n// ## ## ## ## #### ## ## \n//\n\nvoid main() {\n\tvec4 mvPosition = modelViewMatrix * vec4(position, 1.0 );\n\tvViewPosition = mvPosition.xyz;\n\tgl_Position = projectionMatrix * mvPosition;\n\tvLogDepth = log2(-mvPosition.z);\n\n\t//gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n\t//gl_PointSize = 5.0;\n\n\t// POINT SIZE\n\tfloat pointSize = getPointSize();\n\t//float pointSize = 2.0;\n\tgl_PointSize = pointSize;\n\tvPointSize = pointSize;\n\n\t// COLOR\n\tvColor = getColor();\n\t// vColor = vec3(1.0, 0.0, 0.0);\n\n\t//gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n\t//gl_Position = vec4(position.xzy / 1000.0, 1.0 );\n\n\t//gl_PointSize = 5.0;\n\t//vColor = vec3(1.0, 1.0, 1.0);\n\n\t// only for \"replacing\" approaches\n\t// if(getLOD() != uLevel){\n\t// \tgl_Position = vec4(10.0, 10.0, 10.0, 1.0);\n\t// }\n\n\n\t#if defined hq_depth_pass\n\t\tfloat originalDepth = gl_Position.w;\n\t\tfloat adjustedDepth = originalDepth + 2.0 * vRadius;\n\t\tfloat adjust = adjustedDepth / originalDepth;\n\n\t\tmvPosition.xyz = mvPosition.xyz * adjust;\n\t\tgl_Position = projectionMatrix * mvPosition;\n\t#endif\n\n\n\t// CLIPPING\n\tdoClipping();\n\n\t#if defined(num_clipspheres) && num_clipspheres > 0\n\t\tfor(int i = 0; i < num_clipspheres; i++){\n\t\t\tvec4 sphereLocal = uClipSpheres[i] * mvPosition;\n\n\t\t\tfloat distance = length(sphereLocal.xyz);\n\n\t\t\tif(distance < 1.0){\n\t\t\t\tfloat w = distance;\n\t\t\t\tvec3 cGradient = texture2D(gradient, vec2(w, 1.0 - w)).rgb;\n\t\t\t\t\n\t\t\t\tvColor = cGradient;\n\t\t\t\t//vColor = cGradient * 0.7 + vColor * 0.3;\n\t\t\t}\n\t\t}\n\t#endif\n\n\t#if defined(num_shadowmaps) && num_shadowmaps > 0\n\n\t\tconst float sm_near = 0.1;\n\t\tconst float sm_far = 10000.0;\n\n\t\tfor(int i = 0; i < num_shadowmaps; i++){\n\t\t\tvec3 viewPos = (uShadowWorldView[i] * vec4(position, 1.0)).xyz;\n\t\t\tfloat distanceToLight = abs(viewPos.z);\n\t\t\t\n\t\t\tvec4 projPos = uShadowProj[i] * uShadowWorldView[i] * vec4(position, 1);\n\t\t\tvec3 nc = projPos.xyz / projPos.w;\n\t\t\t\n\t\t\tfloat u = nc.x * 0.5 + 0.5;\n\t\t\tfloat v = nc.y * 0.5 + 0.5;\n\n\t\t\tvec2 sampleStep = vec2(1.0 / (2.0*1024.0), 1.0 / (2.0*1024.0)) * 1.5;\n\t\t\tvec2 sampleLocations[9];\n\t\t\tsampleLocations[0] = vec2(0.0, 0.0);\n\t\t\tsampleLocations[1] = sampleStep;\n\t\t\tsampleLocations[2] = -sampleStep;\n\t\t\tsampleLocations[3] = vec2(sampleStep.x, -sampleStep.y);\n\t\t\tsampleLocations[4] = vec2(-sampleStep.x, sampleStep.y);\n\n\t\t\tsampleLocations[5] = vec2(0.0, sampleStep.y);\n\t\t\tsampleLocations[6] = vec2(0.0, -sampleStep.y);\n\t\t\tsampleLocations[7] = vec2(sampleStep.x, 0.0);\n\t\t\tsampleLocations[8] = vec2(-sampleStep.x, 0.0);\n\n\t\t\tfloat visibleSamples = 0.0;\n\t\t\tfloat numSamples = 0.0;\n\n\t\t\tfloat bias = vRadius * 2.0;\n\n\t\t\tfor(int j = 0; j < 9; j++){\n\t\t\t\tvec4 depthMapValue = texture2D(uShadowMap[i], vec2(u, v) + sampleLocations[j]);\n\n\t\t\t\tfloat linearDepthFromSM = depthMapValue.x + bias;\n\t\t\t\tfloat linearDepthFromViewer = distanceToLight;\n\n\t\t\t\tif(linearDepthFromSM > linearDepthFromViewer){\n\t\t\t\t\tvisibleSamples += 1.0;\n\t\t\t\t}\n\n\t\t\t\tnumSamples += 1.0;\n\t\t\t}\n\n\t\t\tfloat visibility = visibleSamples / numSamples;\n\n\t\t\tif(u < 0.0 || u > 1.0 || v < 0.0 || v > 1.0 || nc.x < -1.0 || nc.x > 1.0 || nc.y < -1.0 || nc.y > 1.0 || nc.z < -1.0 || nc.z > 1.0){\n\t\t\t\t//vColor = vec3(0.0, 0.0, 0.2);\n\t\t\t}else{\n\t\t\t\t//vColor = vec3(1.0, 1.0, 1.0) * visibility + vec3(1.0, 1.0, 1.0) * vec3(0.5, 0.0, 0.0) * (1.0 - visibility);\n\t\t\t\tvColor = vColor * visibility + vColor * uShadowColor * (1.0 - visibility);\n\t\t\t}\n\n\n\t\t}\n\n\t#endif\n}\n`\n\nShaders[\"pointcloud.fs\"] = `\n#if defined paraboloid_point_shape\n\t#extension GL_EXT_frag_depth : enable\n#endif\n\nprecision highp float;\nprecision highp int;\n\nuniform mat4 viewMatrix;\nuniform mat4 uViewInv;\nuniform mat4 uProjInv;\nuniform vec3 cameraPosition;\n\n\nuniform mat4 projectionMatrix;\nuniform float uOpacity;\n\nuniform float blendHardness;\nuniform float blendDepthSupplement;\nuniform float fov;\nuniform float uSpacing;\nuniform float near;\nuniform float far;\nuniform float uPCIndex;\nuniform float uScreenWidth;\nuniform float uScreenHeight;\n\nvarying vec3\tvColor;\nvarying float\tvLogDepth;\nvarying vec3\tvViewPosition;\nvarying float\tvRadius;\nvarying float \tvPointSize;\nvarying vec3 \tvPosition;\n\n\nfloat specularStrength = 1.0;\n\nvoid main() {\n\n\t// gl_FragColor = vec4(vColor, 1.0);\n\n\tvec3 color = vColor;\n\tfloat depth = gl_FragCoord.z;\n\n\t#if defined(circle_point_shape) || defined(paraboloid_point_shape) \n\t\tfloat u = 2.0 * gl_PointCoord.x - 1.0;\n\t\tfloat v = 2.0 * gl_PointCoord.y - 1.0;\n\t#endif\n\t\n\t#if defined(circle_point_shape) \n\t\tfloat cc = u*u + v*v;\n\t\tif(cc > 1.0){\n\t\t\tdiscard;\n\t\t}\n\t#endif\n\t\t\n\t#if defined color_type_indices\n\t\tgl_FragColor = vec4(color, uPCIndex / 255.0);\n\t#else\n\t\tgl_FragColor = vec4(color, uOpacity);\n\t#endif\n\n\t#if defined paraboloid_point_shape\n\t\tfloat wi = 0.0 - ( u*u + v*v);\n\t\tvec4 pos = vec4(vViewPosition, 1.0);\n\t\tpos.z += wi * vRadius;\n\t\tfloat linearDepth = -pos.z;\n\t\tpos = projectionMatrix * pos;\n\t\tpos = pos / pos.w;\n\t\tfloat expDepth = pos.z;\n\t\tdepth = (pos.z + 1.0) / 2.0;\n\t\tgl_FragDepthEXT = depth;\n\t\t\n\t\t#if defined(color_type_depth)\n\t\t\tcolor.r = linearDepth;\n\t\t\tcolor.g = expDepth;\n\t\t#endif\n\t\t\n\t\t#if defined(use_edl)\n\t\t\tgl_FragColor.a = log2(linearDepth);\n\t\t#endif\n\t\t\n\t#else\n\t\t#if defined(use_edl)\n\t\t\tgl_FragColor.a = vLogDepth;\n\t\t#endif\n\t#endif\n\n\t#if defined(weighted_splats)\n\t\tfloat distance = 2.0 * length(gl_PointCoord.xy - 0.5);\n\t\tfloat weight = max(0.0, 1.0 - distance);\n\t\tweight = pow(weight, 1.5);\n\n\t\tgl_FragColor.a = weight;\n\t\tgl_FragColor.xyz = gl_FragColor.xyz * weight;\n\t#endif\n\n\t//gl_FragColor = vec4(0.0, 0.7, 0.0, 1.0);\n\t\n}\n\n\n`\n\nShaders[\"pointcloud_sm.vs\"] = `\nprecision mediump float;\nprecision mediump int;\n\nattribute vec3 position;\nattribute vec3 color;\n\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\n\nuniform float uScreenWidth;\nuniform float uScreenHeight;\nuniform float near;\nuniform float far;\n\nuniform float uSpacing;\nuniform float uOctreeSize;\nuniform float uLevel;\nuniform float uVNStart;\n\nuniform sampler2D visibleNodes;\n\nvarying float vLinearDepth;\nvarying vec3 vColor;\n\n#define PI 3.141592653589793\n\n\n\n// ---------------------\n// OCTREE\n// ---------------------\n\n#if defined(adaptive_point_size)\n/**\n * number of 1-bits up to inclusive index position\n * number is treated as if it were an integer in the range 0-255\n *\n */\nfloat numberOfOnes(float number, float index){\n\tfloat tmp = mod(number, pow(2.0, index + 1.0));\n\tfloat numOnes = 0.0;\n\tfor(float i = 0.0; i < 8.0; i++){\n\t\tif(mod(tmp, 2.0) != 0.0){\n\t\t\tnumOnes++;\n\t\t}\n\t\ttmp = floor(tmp / 2.0);\n\t}\n\treturn numOnes;\n}\n\n\n/**\n * checks whether the bit at index is 1\n * number is treated as if it were an integer in the range 0-255\n *\n */\nbool isBitSet(float number, float index){\n\treturn mod(floor(number / pow(2.0, index)), 2.0) != 0.0;\n}\n\n\n/**\n * find the LOD at the point position\n */\nfloat getLOD(){\n\t\n\tvec3 offset = vec3(0.0, 0.0, 0.0);\n\tfloat iOffset = uVNStart;\n\tfloat depth = uLevel;\n\tfor(float i = 0.0; i <= 30.0; i++){\n\t\tfloat nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0);\n\t\t\n\t\tvec3 index3d = (position-offset) / nodeSizeAtLevel;\n\t\tindex3d = floor(index3d + 0.5);\n\t\tfloat index = 4.0 * index3d.x + 2.0 * index3d.y + index3d.z;\n\t\t\n\t\tvec4 value = texture2D(visibleNodes, vec2(iOffset / 2048.0, 0.0));\n\t\tfloat mask = value.r * 255.0;\n\t\tif(isBitSet(mask, index)){\n\t\t\t// there are more visible child nodes at this position\n\t\t\tiOffset = iOffset + value.g * 255.0 * 256.0 + value.b * 255.0 + numberOfOnes(mask, index - 1.0);\n\t\t\tdepth++;\n\t\t}else{\n\t\t\t// no more visible child nodes at this position\n\t\t\treturn depth;\n\t\t}\n\t\t\n\t\toffset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d;\n\t}\n\t\t\n\treturn depth;\n}\n\n#endif\n\nfloat getPointSize(){\n\tfloat pointSize = 1.0;\n\t\n\tfloat slope = tan(fov / 2.0);\n\tfloat projFactor = -0.5 * uScreenHeight / (slope * vViewPosition.z);\n\t\n\tfloat r = uOctreeSpacing * 1.5;\n\tvRadius = r;\n\t#if defined fixed_point_size\n\t\tpointSize = size;\n\t#elif defined attenuated_point_size\n\t\tif(uUseOrthographicCamera){\n\t\t\tpointSize = size;\t\t\t\n\t\t}else{\n\t\t\tpointSize = pointSize * projFactor;\n\t\t}\n\t#elif defined adaptive_point_size\n\t\tif(uUseOrthographicCamera) {\n\t\t\tfloat worldSpaceSize = 1.5 * size * r / getPointSizeAttenuation();\n\t\t\tpointSize = (worldSpaceSize / uOrthoWidth) * uScreenWidth;\n\t\t} else {\n\t\t\tfloat worldSpaceSize = 1.5 * size * r / getPointSizeAttenuation();\n\t\t\tpointSize = worldSpaceSize * projFactor;\n\t\t}\n\t#endif\n\n\tpointSize = max(minSize, pointSize);\n\tpointSize = min(maxSize, pointSize);\n\t\n\tvRadius = pointSize / projFactor;\n\n\treturn pointSize;\n}\n\n\nvoid main() {\n\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tvLinearDepth = gl_Position.w;\n\n\tfloat pointSize = getPointSize();\n\tgl_PointSize = pointSize;\n\n}\n`\n\nShaders[\"pointcloud_sm.fs\"] = `\nprecision mediump float;\nprecision mediump int;\n\nvarying vec3 vColor;\nvarying float vLinearDepth;\n\nvoid main() {\n\n\t//gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n\t//gl_FragColor = vec4(vColor, 1.0);\n\t//gl_FragColor = vec4(vLinearDepth, pow(vLinearDepth, 2.0), 0.0, 1.0);\n\tgl_FragColor = vec4(vLinearDepth, vLinearDepth / 30.0, vLinearDepth / 30.0, 1.0);\n\t\n}\n\n\n`\n\nShaders[\"normalize.vs\"] = `\nprecision mediump float;\nprecision mediump int;\n\nattribute vec3 position;\nattribute vec2 uv;\n\nuniform mat4 projectionMatrix;\nuniform mat4 modelViewMatrix;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\n}`\n\nShaders[\"normalize.fs\"] = `\n#extension GL_EXT_frag_depth : enable\n\nprecision mediump float;\nprecision mediump int;\n\nuniform sampler2D uWeightMap;\nuniform sampler2D uDepthMap;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tfloat depth = texture2D(uDepthMap, vUv).r;\n\t\n\tif(depth >= 1.0){\n\t\tdiscard;\n\t}\n\n\tgl_FragColor = vec4(depth, 1.0, 0.0, 1.0);\n\n\tvec4 color = texture2D(uWeightMap, vUv); \n\tcolor = color / color.w;\n\t\n\tgl_FragColor = vec4(color.xyz, 1.0); \n\t\n\tgl_FragDepthEXT = depth;\n\n\n}`\n\nShaders[\"normalize_and_edl.fs\"] = `\n#extension GL_EXT_frag_depth : enable\n\n// \n// adapted from the EDL shader code from Christian Boucheny in cloud compare:\n// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL\n//\n\nprecision mediump float;\nprecision mediump int;\n\nuniform sampler2D uWeightMap;\nuniform sampler2D uEDLMap;\nuniform sampler2D uDepthMap;\n\nuniform float screenWidth;\nuniform float screenHeight;\nuniform vec2 neighbours[NEIGHBOUR_COUNT];\nuniform float edlStrength;\nuniform float radius;\n\nvarying vec2 vUv;\n\nfloat response(float depth){\n\tvec2 uvRadius = radius / vec2(screenWidth, screenHeight);\n\t\n\tfloat sum = 0.0;\n\t\n\tfor(int i = 0; i < NEIGHBOUR_COUNT; i++){\n\t\tvec2 uvNeighbor = vUv + uvRadius * neighbours[i];\n\t\t\n\t\tfloat neighbourDepth = texture2D(uEDLMap, uvNeighbor).a;\n\n\t\tif(neighbourDepth != 0.0){\n\t\t\tif(depth == 0.0){\n\t\t\t\tsum += 100.0;\n\t\t\t}else{\n\t\t\t\tsum += max(0.0, depth - neighbourDepth);\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn sum / float(NEIGHBOUR_COUNT);\n}\n\nvoid main() {\n\n\tfloat edlDepth = texture2D(uEDLMap, vUv).a;\n\tfloat res = response(edlDepth);\n\tfloat shade = exp(-res * 300.0 * edlStrength);\n\n\tfloat depth = texture2D(uDepthMap, vUv).r;\n\tif(depth >= 1.0 && res == 0.0){\n\t\tdiscard;\n\t}\n\t\n\tvec4 color = texture2D(uWeightMap, vUv); \n\tcolor = color / color.w;\n\tcolor = color * shade;\n\n\tgl_FragColor = vec4(color.xyz, 1.0); \n\n\tgl_FragDepthEXT = depth;\n}`\n\nShaders[\"edl.vs\"] = `\nprecision mediump float;\nprecision mediump int;\n\nattribute vec3 position;\nattribute vec2 uv;\n\nuniform mat4 projectionMatrix;\nuniform mat4 modelViewMatrix;\n\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\t\n\tvec4 mvPosition = modelViewMatrix * vec4(position,1.0);\n\n\tgl_Position = projectionMatrix * mvPosition;\n}`\n\nShaders[\"edl.fs\"] = `\n#extension GL_EXT_frag_depth : enable\n\n// \n// adapted from the EDL shader code from Christian Boucheny in cloud compare:\n// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL\n//\n\nprecision mediump float;\nprecision mediump int;\n\nuniform float screenWidth;\nuniform float screenHeight;\nuniform vec2 neighbours[NEIGHBOUR_COUNT];\nuniform float edlStrength;\nuniform float radius;\nuniform float opacity;\n\nuniform float uNear;\nuniform float uFar;\n\nuniform mat4 uProj;\n\nuniform sampler2D uEDLColor;\nuniform sampler2D uEDLDepth;\n\nvarying vec2 vUv;\n\nfloat response(float depth){\n\tvec2 uvRadius = radius / vec2(screenWidth, screenHeight);\n\t\n\tfloat sum = 0.0;\n\t\n\tfor(int i = 0; i < NEIGHBOUR_COUNT; i++){\n\t\tvec2 uvNeighbor = vUv + uvRadius * neighbours[i];\n\t\t\n\t\tfloat neighbourDepth = texture2D(uEDLColor, uvNeighbor).a;\n\t\tneighbourDepth = (neighbourDepth == 1.0) ? 0.0 : neighbourDepth;\n\n\t\tif(neighbourDepth != 0.0){\n\t\t\tif(depth == 0.0){\n\t\t\t\tsum += 100.0;\n\t\t\t}else{\n\t\t\t\tsum += max(0.0, depth - neighbourDepth);\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn sum / float(NEIGHBOUR_COUNT);\n}\n\nvoid main(){\n\tvec4 cEDL = texture2D(uEDLColor, vUv);\n\t\n\tfloat depth = cEDL.a;\n\tdepth = (depth == 1.0) ? 0.0 : depth;\n\tfloat res = response(depth);\n\tfloat shade = exp(-res * 300.0 * edlStrength);\n\n\tgl_FragColor = vec4(cEDL.rgb * shade, opacity);\n\n\t{ // write regular hyperbolic depth values to depth buffer\n\t\tfloat dl = pow(2.0, depth);\n\n\t\tvec4 dp = uProj * vec4(0.0, 0.0, -dl, 1.0);\n\t\tfloat pz = dp.z / dp.w;\n\t\tfloat fragDepth = (pz + 1.0) / 2.0;\n\n\t\tgl_FragDepthEXT = fragDepth;\n\t}\n\n\tif(depth == 0.0){\n\t\tdiscard;\n\t}\n\n}\n`\n\nShaders[\"blur.vs\"] = `\nvarying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\n}`\n\nShaders[\"blur.fs\"] = `\nuniform mat4 projectionMatrix;\n\nuniform float screenWidth;\nuniform float screenHeight;\nuniform float near;\nuniform float far;\n\nuniform sampler2D map;\n\nvarying vec2 vUv;\n\nvoid main() {\n\n\tfloat dx = 1.0 / screenWidth;\n\tfloat dy = 1.0 / screenHeight;\n\n\tvec3 color = vec3(0.0, 0.0, 0.0);\n\tcolor += texture2D(map, vUv + vec2(-dx, -dy)).rgb;\n\tcolor += texture2D(map, vUv + vec2( 0, -dy)).rgb;\n\tcolor += texture2D(map, vUv + vec2(+dx, -dy)).rgb;\n\tcolor += texture2D(map, vUv + vec2(-dx, 0)).rgb;\n\tcolor += texture2D(map, vUv + vec2( 0, 0)).rgb;\n\tcolor += texture2D(map, vUv + vec2(+dx, 0)).rgb;\n\tcolor += texture2D(map, vUv + vec2(-dx, dy)).rgb;\n\tcolor += texture2D(map, vUv + vec2( 0, dy)).rgb;\n\tcolor += texture2D(map, vUv + vec2(+dx, dy)).rgb;\n\n\tcolor = color / 9.0;\n\t\n\tgl_FragColor = vec4(color, 1.0);\n}`\n\nexport {Shaders};","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nexport const ClassificationScheme = {\n\n\tDEFAULT: {\n\t\t0: { visible: true, name: 'never classified' , color: [0.5, 0.5, 0.5, 1.0] },\n\t\t1: { visible: true, name: 'unclassified' , color: [0.5, 0.5, 0.5, 1.0] },\n\t\t2: { visible: true, name: 'ground' , color: [0.63, 0.32, 0.18, 1.0] },\n\t\t3: { visible: true, name: 'low vegetation' , color: [0.0, 1.0, 0.0, 1.0] },\n\t\t4: { visible: true, name: 'medium vegetation' , color: [0.0, 0.8, 0.0, 1.0] },\n\t\t5: { visible: true, name: 'high vegetation' , color: [0.0, 0.6, 0.0, 1.0] },\n\t\t6: { visible: true, name: 'building' , color: [1.0, 0.66, 0.0, 1.0] },\n\t\t7: { visible: true, name: 'low point(noise)' , color: [1.0, 0.0, 1.0, 1.0] },\n\t\t8: { visible: true, name: 'key-point' , color: [1.0, 0.0, 0.0, 1.0] },\n\t\t9: { visible: true, name: 'water' , color: [0.0, 0.0, 1.0, 1.0] },\n\t\t12: { visible: true, name: 'overlap' , color: [1.0, 1.0, 0.0, 1.0] },\n\t\tDEFAULT: { visible: true, name: 'default' , color: [0.3, 0.6, 0.6, 0.5] },\n\t}\n};\n\nObject.defineProperty(ClassificationScheme, 'RANDOM', {\n\tget: function() { \n\n\t\tlet scheme = {};\n\n\t\tfor(let i = 0; i <= 255; i++){\n\t\t\tscheme[i] = new THREE.Vector4(Math.random(), Math.random(), Math.random());\n\t\t}\n\n\t\tscheme[\"DEFAULT\"] = new THREE.Vector4(Math.random(), Math.random(), Math.random());\n\n\t\treturn scheme;\n\t}\n});","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Utils} from \"../utils.js\";\nimport {Gradients} from \"./Gradients.js\";\nimport {Shaders} from \"../../build/shaders/shaders.js\";\nimport {ClassificationScheme} from \"./ClassificationScheme.js\";\nimport {PointSizeType, PointShape, TreeType, ElevationGradientRepeat} from \"../defines.js\";\n\n//\n// how to calculate the radius of a projected sphere in screen space\n// http://stackoverflow.com/questions/21648630/radius-of-projected-sphere-in-screen-space\n// http://stackoverflow.com/questions/3717226/radius-of-projected-sphere\n//\n\n\nexport class PointCloudMaterial extends THREE.RawShaderMaterial {\n\tconstructor (parameters = {}) {\n\t\tsuper();\n\n\t\tthis.visibleNodesTexture = Utils.generateDataTexture(2048, 1, new THREE.Color(0xffffff));\n\t\tthis.visibleNodesTexture.minFilter = THREE.NearestFilter;\n\t\tthis.visibleNodesTexture.magFilter = THREE.NearestFilter;\n\n\t\tlet getValid = (a, b) => {\n\t\t\tif(a !== undefined){\n\t\t\t\treturn a;\n\t\t\t}else{\n\t\t\t\treturn b;\n\t\t\t}\n\t\t}\n\n\t\tlet pointSize = getValid(parameters.size, 1.0);\n\t\tlet minSize = getValid(parameters.minSize, 2.0);\n\t\tlet maxSize = getValid(parameters.maxSize, 50.0);\n\t\tlet treeType = getValid(parameters.treeType, TreeType.OCTREE);\n\n\t\tthis._pointSizeType = PointSizeType.FIXED;\n\t\tthis._shape = PointShape.SQUARE;\n\t\tthis._useClipBox = false;\n\t\tthis.clipBoxes = [];\n\t\tthis.clipPolygons = [];\n\t\tthis._weighted = false;\n\t\tthis._gradient = Gradients.SPECTRAL;\n\t\tthis.gradientTexture = PointCloudMaterial.generateGradientTexture(this._gradient);\n\t\tthis._matcap = \"matcap.jpg\";\n\t\tthis.matcapTexture = Potree.PointCloudMaterial.generateMatcapTexture(this._matcap);\n\t\tthis.lights = false;\n\t\tthis.fog = false;\n\t\tthis._treeType = treeType;\n\t\tthis._useEDL = false;\n\t\tthis.defines = new Map();\n\n\t\tthis.ranges = new Map();\n\n\t\tthis._activeAttributeName = null;\n\n\t\tthis._defaultIntensityRangeChanged = false;\n\t\tthis._defaultElevationRangeChanged = false;\n\n\t\t{\n\t\t\tconst [width, height] = [256, 1];\n\t\t\tlet data = new Uint8Array(width * 4);\n\t\t\tlet texture = new THREE.DataTexture(data, width, height, THREE.RGBAFormat);\n\t\t\ttexture.magFilter = THREE.NearestFilter;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tthis.classificationTexture = texture;\n\t\t}\n\n\t\tthis.attributes = {\n\t\t\tposition: { type: 'fv', value: [] },\n\t\t\tcolor: { type: 'fv', value: [] },\n\t\t\tnormal: { type: 'fv', value: [] },\n\t\t\tintensity: { type: 'f', value: [] },\n\t\t\tclassification: { type: 'f', value: [] },\n\t\t\treturnNumber: { type: 'f', value: [] },\n\t\t\tnumberOfReturns: { type: 'f', value: [] },\n\t\t\tpointSourceID: { type: 'f', value: [] },\n\t\t\tindices: { type: 'fv', value: [] }\n\t\t};\n\n\t\tthis.uniforms = {\n\t\t\tlevel:\t\t\t\t{ type: \"f\", value: 0.0 },\n\t\t\tvnStart:\t\t\t{ type: \"f\", value: 0.0 },\n\t\t\tspacing:\t\t\t{ type: \"f\", value: 1.0 },\n\t\t\tblendHardness:\t\t{ type: \"f\", value: 2.0 },\n\t\t\tblendDepthSupplement:\t{ type: \"f\", value: 0.0 },\n\t\t\tfov:\t\t\t\t{ type: \"f\", value: 1.0 },\n\t\t\tscreenWidth:\t\t{ type: \"f\", value: 1.0 },\n\t\t\tscreenHeight:\t\t{ type: \"f\", value: 1.0 },\n\t\t\tnear:\t\t\t\t{ type: \"f\", value: 0.1 },\n\t\t\tfar:\t\t\t\t{ type: \"f\", value: 1.0 },\n\t\t\tuColor:\t\t\t\t{ type: \"c\", value: new THREE.Color( 0xffffff ) },\n\t\t\tuOpacity:\t\t\t{ type: \"f\", value: 1.0 },\n\t\t\tsize:\t\t\t\t{ type: \"f\", value: pointSize },\n\t\t\tminSize:\t\t\t{ type: \"f\", value: minSize },\n\t\t\tmaxSize:\t\t\t{ type: \"f\", value: maxSize },\n\t\t\toctreeSize:\t\t\t{ type: \"f\", value: 0 },\n\t\t\tbbSize:\t\t\t\t{ type: \"fv\", value: [0, 0, 0] },\n\t\t\televationRange:\t\t{ type: \"2fv\", value: [0, 0] },\n\n\t\t\tclipBoxCount:\t\t{ type: \"f\", value: 0 },\n\t\t\t//clipSphereCount:\t{ type: \"f\", value: 0 },\n\t\t\tclipPolygonCount:\t{ type: \"i\", value: 0 },\n\t\t\tclipBoxes:\t\t\t{ type: \"Matrix4fv\", value: [] },\n\t\t\t//clipSpheres:\t\t{ type: \"Matrix4fv\", value: [] },\n\t\t\tclipPolygons:\t\t{ type: \"3fv\", value: [] },\n\t\t\tclipPolygonVCount:\t{ type: \"iv\", value: [] },\n\t\t\tclipPolygonVP:\t\t{ type: \"Matrix4fv\", value: [] },\n\n\t\t\tvisibleNodes:\t\t{ type: \"t\", value: this.visibleNodesTexture },\n\t\t\tpcIndex:\t\t\t{ type: \"f\", value: 0 },\n\t\t\tgradient:\t\t\t{ type: \"t\", value: this.gradientTexture },\n\t\t\tclassificationLUT:\t{ type: \"t\", value: this.classificationTexture },\n\t\t\tuHQDepthMap:\t\t{ type: \"t\", value: null },\n\t\t\ttoModel:\t\t\t{ type: \"Matrix4f\", value: [] },\n\t\t\tdiffuse:\t\t\t{ type: \"fv\", value: [1, 1, 1] },\n\t\t\ttransition:\t\t\t{ type: \"f\", value: 0.5 },\n\n\t\t\t intensityRange:\t\t{ type: \"fv\", value: [Infinity, -Infinity] },\n\n\t\t\tintensity_gbc: \t\t{ type: \"fv\", value: [1, 0, 0]},\n\t\t\tuRGB_gbc:\t \t\t{ type: \"fv\", value: [1, 0, 0]},\n\t\t\t// intensityGamma:\t\t{ type: \"f\", value: 1 },\n\t\t\t// intensityContrast:\t{ type: \"f\", value: 0 },\n\t\t\t// intensityBrightness:{ type: \"f\", value: 0 },\n\t\t\t// rgbGamma:\t\t\t{ type: \"f\", value: 1 },\n\t\t\t// rgbContrast:\t\t{ type: \"f\", value: 0 },\n\t\t\t// rgbBrightness:\t\t{ type: \"f\", value: 0 },\n\t\t\twRGB:\t\t\t\t{ type: \"f\", value: 1 },\n\t\t\twIntensity:\t\t\t{ type: \"f\", value: 0 },\n\t\t\twElevation:\t\t\t{ type: \"f\", value: 0 },\n\t\t\twClassification:\t{ type: \"f\", value: 0 },\n\t\t\twReturnNumber:\t\t{ type: \"f\", value: 0 },\n\t\t\twSourceID:\t\t\t{ type: \"f\", value: 0 },\n\t\t\tuseOrthographicCamera: { type: \"b\", value: false },\n\t\t\televationGradientRepat: { type: \"i\", value: ElevationGradientRepeat.CLAMP },\n\t\t\tclipTask:\t\t\t{ type: \"i\", value: 1 },\n\t\t\tclipMethod:\t\t\t{ type: \"i\", value: 1 },\n\t\t\tuShadowColor:\t\t{ type: \"3fv\", value: [0, 0, 0] },\n\n\t\t\tuExtraScale:\t\t{ type: \"f\", value: 1},\n\t\t\tuExtraOffset:\t\t{ type: \"f\", value: 0},\n\t\t\tuExtraRange:\t\t{ type: \"2fv\", value: [0, 1] },\n\t\t\tuExtraGammaBrightContr:\t{ type: \"3fv\", value: [1, 0, 0] },\n\n\t\t\tuFilterReturnNumberRange:\t\t{ type: \"fv\", value: [0, 7]},\n\t\t\tuFilterNumberOfReturnsRange:\t{ type: \"fv\", value: [0, 7]},\n\t\t\tuFilterGPSTimeClipRange:\t\t{ type: \"fv\", value: [0, 7]},\n\t\t\tuFilterPointSourceIDClipRange:\t\t{ type: \"fv\", value: [0, 65535]},\n\t\t\tmatcapTextureUniform: \t{ type: \"t\", value: this.matcapTexture },\n\t\t\tbackfaceCulling: { type: \"b\", value: false },\n\t\t};\n\n\t\tthis.classification = ClassificationScheme.DEFAULT;\n\n\t\tthis.defaultAttributeValues.normal = [0, 0, 0];\n\t\tthis.defaultAttributeValues.classification = [0, 0, 0];\n\t\tthis.defaultAttributeValues.indices = [0, 0, 0, 0];\n\n\t\tthis.vertexShader = Shaders['pointcloud.vs'];\n\t\tthis.fragmentShader = Shaders['pointcloud.fs'];\n\t\t\n\t\tthis.vertexColors = THREE.VertexColors;\n\n\t\tthis.updateShaderSource();\n\t}\n\n\tsetDefine(key, value){\n\t\tif(value !== undefined && value !== null){\n\t\t\tif(this.defines.get(key) !== value){\n\t\t\t\tthis.defines.set(key, value);\n\t\t\t\tthis.updateShaderSource();\n\t\t\t}\n\t\t}else{\n\t\t\tthis.removeDefine(key);\n\t\t}\n\t}\n\n\tremoveDefine(key){\n\t\tthis.defines.delete(key);\n\t}\n\n\tupdateShaderSource () {\n\n\t\tlet vs = Shaders['pointcloud.vs'];\n\t\tlet fs = Shaders['pointcloud.fs'];\n\t\tlet definesString = this.getDefines();\n\n\t\tlet vsVersionIndex = vs.indexOf(\"#version \");\n\t\tlet fsVersionIndex = fs.indexOf(\"#version \");\n\n\t\tif(vsVersionIndex >= 0){\n\t\t\tvs = vs.replace(/(#version .*)/, `$1\\n${definesString}`)\n\t\t}else{\n\t\t\tvs = `${definesString}\\n${vs}`;\n\t\t}\n\n\t\tif(fsVersionIndex >= 0){\n\t\t\tfs = fs.replace(/(#version .*)/, `$1\\n${definesString}`)\n\t\t}else{\n\t\t\tfs = `${definesString}\\n${fs}`;\n\t\t}\n\n\t\tthis.vertexShader = vs;\n\t\tthis.fragmentShader = fs;\n\n\t\tif (this.opacity === 1.0) {\n\t\t\tthis.blending = THREE.NoBlending;\n\t\t\tthis.transparent = false;\n\t\t\tthis.depthTest = true;\n\t\t\tthis.depthWrite = true;\n\t\t\tthis.depthFunc = THREE.LessEqualDepth;\n\t\t} else if (this.opacity < 1.0 && !this.useEDL) {\n\t\t\tthis.blending = THREE.AdditiveBlending;\n\t\t\tthis.transparent = true;\n\t\t\tthis.depthTest = false;\n\t\t\tthis.depthWrite = true;\n\t\t\tthis.depthFunc = THREE.AlwaysDepth;\n\t\t}\n\n\t\tif (this.weighted) {\n\t\t\tthis.blending = THREE.AdditiveBlending;\n\t\t\tthis.transparent = true;\n\t\t\tthis.depthTest = true;\n\t\t\tthis.depthWrite = false;\n\t\t}\n\n\t\tthis.needsUpdate = true;\n\t}\n\n\tgetDefines () {\n\t\tlet defines = [];\n\n\t\tif (this.pointSizeType === PointSizeType.FIXED) {\n\t\t\tdefines.push('#define fixed_point_size');\n\t\t} else if (this.pointSizeType === PointSizeType.ATTENUATED) {\n\t\t\tdefines.push('#define attenuated_point_size');\n\t\t} else if (this.pointSizeType === PointSizeType.ADAPTIVE) {\n\t\t\tdefines.push('#define adaptive_point_size');\n\t\t}\n\n\t\tif (this.shape === PointShape.SQUARE) {\n\t\t\tdefines.push('#define square_point_shape');\n\t\t} else if (this.shape === PointShape.CIRCLE) {\n\t\t\tdefines.push('#define circle_point_shape');\n\t\t} else if (this.shape === PointShape.PARABOLOID) {\n\t\t\tdefines.push('#define paraboloid_point_shape');\n\t\t}\n\n\t\tif (this._useEDL) {\n\t\t\tdefines.push('#define use_edl');\n\t\t}\n\n\t\tif(this.activeAttributeName){\n\t\t\tlet attributeName = this.activeAttributeName.replace(/[^a-zA-Z0-9]/g, '_');\n\n\t\t\tdefines.push(`#define color_type_${attributeName}`);\n\t\t}\n\t\t\n\t\tif(this._treeType === TreeType.OCTREE){\n\t\t\tdefines.push('#define tree_type_octree');\n\t\t}else if(this._treeType === TreeType.KDTREE){\n\t\t\tdefines.push('#define tree_type_kdtree');\n\t\t}\n\n\t\tif (this.weighted) {\n\t\t\tdefines.push('#define weighted_splats');\n\t\t}\n\n\t\tfor(let [key, value] of this.defines){\n\t\t\tdefines.push(value);\n\t\t}\n\n\t\treturn defines.join(\"\\n\");\n\t}\n\n\tsetClipBoxes (clipBoxes) {\n\t\tif (!clipBoxes) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet doUpdate = (this.clipBoxes.length !== clipBoxes.length) && (clipBoxes.length === 0 || this.clipBoxes.length === 0);\n\n\t\tthis.uniforms.clipBoxCount.value = this.clipBoxes.length;\n\t\tthis.clipBoxes = clipBoxes;\n\n\t\tif (doUpdate) {\n\t\t\tthis.updateShaderSource();\n\t\t}\n\n\t\tthis.uniforms.clipBoxes.value = new Float32Array(this.clipBoxes.length * 16);\n\n\t\tfor (let i = 0; i < this.clipBoxes.length; i++) {\n\t\t\tlet box = clipBoxes[i];\n\n\t\t\tthis.uniforms.clipBoxes.value.set(box.inverse.elements, 16 * i);\n\t\t}\n\n\t\tfor (let i = 0; i < this.uniforms.clipBoxes.value.length; i++) {\n\t\t\tif (Number.isNaN(this.uniforms.clipBoxes.value[i])) {\n\t\t\t\tthis.uniforms.clipBoxes.value[i] = Infinity;\n\t\t\t}\n\t\t}\n\t}\n\n\tsetClipPolygons(clipPolygons, maxPolygonVertices) {\n\t\tif(!clipPolygons){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clipPolygons = clipPolygons;\n\n\t\tlet doUpdate = (this.clipPolygons.length !== clipPolygons.length);\n\n\t\tif(doUpdate){\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\t\n\tget gradient(){\n\t\treturn this._gradient;\n\t}\n\n\tset gradient (value) {\n\t\tif (this._gradient !== value) {\n\t\t\tthis._gradient = value;\n\t\t\tthis.gradientTexture = PointCloudMaterial.generateGradientTexture(this._gradient);\n\t\t\tthis.uniforms.gradient.value = this.gradientTexture;\n\t\t}\n\t}\n\n\tget matcap(){\n\t\treturn this._matcap;\n\t}\n\n\tset matcap (value) {\n\t\tif (this._matcap !== value) {\n\t\t\tthis._matcap = value;\n\t\t\tthis.matcapTexture = Potree.PointCloudMaterial.generateMatcapTexture(this._matcap);\n\t\t\tthis.uniforms.matcapTextureUniform.value = this.matcapTexture;\n\t\t}\n\t}\n\tget useOrthographicCamera() {\n\t\treturn this.uniforms.useOrthographicCamera.value;\n\t}\n\n\tset useOrthographicCamera(value) {\n\t\tif(this.uniforms.useOrthographicCamera.value !== value){\n\t\t\tthis.uniforms.useOrthographicCamera.value = value;\n\t\t}\n\t}\n\tget backfaceCulling() {\n\t\treturn this.uniforms.backfaceCulling.value;\n\t}\n\n\tset backfaceCulling(value) {\n\t\tif(this.uniforms.backfaceCulling.value !== value){\n\t\t\tthis.uniforms.backfaceCulling.value = value;\n\t\t\tthis.dispatchEvent({type: 'backface_changed', target: this});\n\t\t}\n\t}\n\n\trecomputeClassification () {\n\t\tconst classification = this.classification;\n\t\tconst data = this.classificationTexture.image.data;\n\n\t\tlet width = 256;\n\t\tconst black = [1, 1, 1, 1];\n\n\t\tlet valuesChanged = false;\n\n\t\tfor (let i = 0; i < width; i++) {\n\n\t\t\tlet color;\n\t\t\tlet visible = true;\n\n\t\t\tif (classification[i]) {\n\t\t\t\tcolor = classification[i].color;\n\t\t\t\tvisible = classification[i].visible;\n\t\t\t} else if (classification[i % 32]) {\n\t\t\t\tcolor = classification[i % 32].color;\n\t\t\t\tvisible = classification[i % 32].visible;\n\t\t\t} else if(classification.DEFAULT) {\n\t\t\t\tcolor = classification.DEFAULT.color;\n\t\t\t\tvisible = classification.DEFAULT.visible;\n\t\t\t}else{\n\t\t\t\tcolor = black;\n\t\t\t}\n\n\t\t\tconst r = parseInt(255 * color[0]);\n\t\t\tconst g = parseInt(255 * color[1]);\n\t\t\tconst b = parseInt(255 * color[2]);\n\t\t\tconst a = visible ? parseInt(255 * color[3]) : 0;\n\n\n\t\t\tif(data[4 * i + 0] !== r){\n\t\t\t\tdata[4 * i + 0] = r;\n\t\t\t\tvaluesChanged = true;\n\t\t\t}\n\n\t\t\tif(data[4 * i + 1] !== g){\n\t\t\t\tdata[4 * i + 1] = g;\n\t\t\t\tvaluesChanged = true;\n\t\t\t}\n\n\t\t\tif(data[4 * i + 2] !== b){\n\t\t\t\tdata[4 * i + 2] = b;\n\t\t\t\tvaluesChanged = true;\n\t\t\t}\n\n\t\t\tif(data[4 * i + 3] !== a){\n\t\t\t\tdata[4 * i + 3] = a;\n\t\t\t\tvaluesChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif(valuesChanged){\n\t\t\tthis.classificationTexture.needsUpdate = true;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget spacing () {\n\t\treturn this.uniforms.spacing.value;\n\t}\n\n\tset spacing (value) {\n\t\tif (this.uniforms.spacing.value !== value) {\n\t\t\tthis.uniforms.spacing.value = value;\n\t\t}\n\t}\n\n\tget useClipBox () {\n\t\treturn this._useClipBox;\n\t}\n\n\tset useClipBox (value) {\n\t\tif (this._useClipBox !== value) {\n\t\t\tthis._useClipBox = value;\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\n\tget clipTask(){\n\t\treturn this.uniforms.clipTask.value;\n\t}\n\n\tset clipTask(mode){\n\t\tthis.uniforms.clipTask.value = mode;\n\t}\n\n\tget elevationGradientRepat(){\n\t\treturn this.uniforms.elevationGradientRepat.value;\n\t}\n\n\tset elevationGradientRepat(mode){\n\t\tthis.uniforms.elevationGradientRepat.value = mode;\n\t}\n\n\tget clipMethod(){\n\t\treturn this.uniforms.clipMethod.value;\n\t}\n\n\tset clipMethod(mode){\n\t\tthis.uniforms.clipMethod.value = mode;\n\t}\n\n\tget weighted(){\n\t\treturn this._weighted;\n\t}\n\n\tset weighted (value) {\n\t\tif (this._weighted !== value) {\n\t\t\tthis._weighted = value;\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\n\tget fov () {\n\t\treturn this.uniforms.fov.value;\n\t}\n\n\tset fov (value) {\n\t\tif (this.uniforms.fov.value !== value) {\n\t\t\tthis.uniforms.fov.value = value;\n\t\t\t// this.updateShaderSource();\n\t\t}\n\t}\n\n\tget screenWidth () {\n\t\treturn this.uniforms.screenWidth.value;\n\t}\n\n\tset screenWidth (value) {\n\t\tif (this.uniforms.screenWidth.value !== value) {\n\t\t\tthis.uniforms.screenWidth.value = value;\n\t\t\t// this.updateShaderSource();\n\t\t}\n\t}\n\n\tget screenHeight () {\n\t\treturn this.uniforms.screenHeight.value;\n\t}\n\n\tset screenHeight (value) {\n\t\tif (this.uniforms.screenHeight.value !== value) {\n\t\t\tthis.uniforms.screenHeight.value = value;\n\t\t\t// this.updateShaderSource();\n\t\t}\n\t}\n\n\tget near () {\n\t\treturn this.uniforms.near.value;\n\t}\n\n\tset near (value) {\n\t\tif (this.uniforms.near.value !== value) {\n\t\t\tthis.uniforms.near.value = value;\n\t\t}\n\t}\n\n\tget far () {\n\t\treturn this.uniforms.far.value;\n\t}\n\n\tset far (value) {\n\t\tif (this.uniforms.far.value !== value) {\n\t\t\tthis.uniforms.far.value = value;\n\t\t}\n\t}\n\t\n\tget opacity(){\n\t\treturn this.uniforms.uOpacity.value;\n\t}\n\n\tset opacity (value) {\n\t\tif (this.uniforms && this.uniforms.uOpacity) {\n\t\t\tif (this.uniforms.uOpacity.value !== value) {\n\t\t\t\tthis.uniforms.uOpacity.value = value;\n\t\t\t\tthis.updateShaderSource();\n\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\ttype: 'opacity_changed',\n\t\t\t\t\ttarget: this\n\t\t\t\t});\n\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\ttype: 'material_property_changed',\n\t\t\t\t\ttarget: this\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tget activeAttributeName(){\n\t\treturn this._activeAttributeName;\n\t}\n\n\tset activeAttributeName(value){\n\t\tif (this._activeAttributeName !== value) {\n\t\t\tthis._activeAttributeName = value;\n\n\t\t\tthis.updateShaderSource();\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'active_attribute_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget pointSizeType () {\n\t\treturn this._pointSizeType;\n\t}\n\n\tset pointSizeType (value) {\n\t\tif (this._pointSizeType !== value) {\n\t\t\tthis._pointSizeType = value;\n\t\t\tthis.updateShaderSource();\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'point_size_type_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget useEDL(){\n\t\treturn this._useEDL;\n\t}\n\n\tset useEDL (value) {\n\t\tif (this._useEDL !== value) {\n\t\t\tthis._useEDL = value;\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\n\tget color () {\n\t\treturn this.uniforms.uColor.value;\n\t}\n\n\tset color (value) {\n\t\tif (!this.uniforms.uColor.value.equals(value)) {\n\t\t\tthis.uniforms.uColor.value.copy(value);\n\t\t\t\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'color_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget shape () {\n\t\treturn this._shape;\n\t}\n\n\tset shape (value) {\n\t\tif (this._shape !== value) {\n\t\t\tthis._shape = value;\n\t\t\tthis.updateShaderSource();\n\t\t\tthis.dispatchEvent({type: 'point_shape_changed', target: this});\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget treeType () {\n\t\treturn this._treeType;\n\t}\n\n\tset treeType (value) {\n\t\tif (this._treeType !== value) {\n\t\t\tthis._treeType = value;\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\n\tget bbSize () {\n\t\treturn this.uniforms.bbSize.value;\n\t}\n\n\tset bbSize (value) {\n\t\tthis.uniforms.bbSize.value = value;\n\t}\n\n\tget size () {\n\t\treturn this.uniforms.size.value;\n\t}\n\n\tset size (value) {\n\t\tif (this.uniforms.size.value !== value) {\n\t\t\tthis.uniforms.size.value = value;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'point_size_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget minSize(){\n\t\treturn this.uniforms.minSize.value;\n\t}\n\n\tset minSize(value){\n\t\tif (this.uniforms.minSize.value !== value) {\n\t\t\tthis.uniforms.minSize.value = value;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'point_size_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget elevationRange () {\n\t\treturn this.uniforms.elevationRange.value;\n\t}\n\n\tset elevationRange (value) {\n\t\tlet changed = this.uniforms.elevationRange.value[0] !== value[0]\n\t\t\t|| this.uniforms.elevationRange.value[1] !== value[1];\n\n\t\tif(changed){\n\t\t\tthis.uniforms.elevationRange.value = value;\n\n\t\t\tthis._defaultElevationRangeChanged = true;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget heightMin () {\n\t\treturn this.uniforms.elevationRange.value[0];\n\t}\n\n\tset heightMin (value) {\n\t\tthis.elevationRange = [value, this.elevationRange[1]];\n\t}\n\n\tget heightMax () {\n\t\treturn this.uniforms.elevationRange.value[1];\n\t}\n\n\tset heightMax (value) {\n\t\tthis.elevationRange = [this.elevationRange[0], value];\n\t}\n\n\tget transition () {\n\t\treturn this.uniforms.transition.value;\n\t}\n\n\tset transition (value) {\n\t\tthis.uniforms.transition.value = value;\n\t}\n\n\tget intensityRange () {\n\t\treturn this.uniforms.intensityRange.value;\n\t}\n\n\tset intensityRange (value) {\n\t\tif (!(value instanceof Array && value.length === 2)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (value[0] === this.uniforms.intensityRange.value[0] &&\n\t\t\tvalue[1] === this.uniforms.intensityRange.value[1]) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.uniforms.intensityRange.value = value;\n\n\t\tthis._defaultIntensityRangeChanged = true;\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'material_property_changed',\n\t\t\ttarget: this\n\t\t});\n\t}\n\n\tget intensityGamma () {\n\t\treturn this.uniforms.intensity_gbc.value[0];\n\t}\n\n\tset intensityGamma (value) {\n\t\tif (this.uniforms.intensity_gbc.value[0] !== value) {\n\t\t\tthis.uniforms.intensity_gbc.value[0] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget intensityContrast () {\n\t\treturn this.uniforms.intensity_gbc.value[2];\n\t}\n\n\tset intensityContrast (value) {\n\t\tif (this.uniforms.intensity_gbc.value[2] !== value) {\n\t\t\tthis.uniforms.intensity_gbc.value[2] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget intensityBrightness () {\n\t\treturn this.uniforms.intensity_gbc.value[1];\n\t}\n\n\tset intensityBrightness (value) {\n\t\tif (this.uniforms.intensity_gbc.value[1] !== value) {\n\t\t\tthis.uniforms.intensity_gbc.value[1] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget rgbGamma () {\n\t\treturn this.uniforms.uRGB_gbc.value[0];\n\t}\n\n\tset rgbGamma (value) {\n\t\tif (this.uniforms.uRGB_gbc.value[0] !== value) {\n\t\t\tthis.uniforms.uRGB_gbc.value[0] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget rgbContrast () {\n\t\treturn this.uniforms.uRGB_gbc.value[2];\n\t}\n\n\tset rgbContrast (value) {\n\t\tif (this.uniforms.uRGB_gbc.value[2] !== value) {\n\t\t\tthis.uniforms.uRGB_gbc.value[2] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget rgbBrightness () {\n\t\treturn this.uniforms.uRGB_gbc.value[1];\n\t}\n\n\tset rgbBrightness (value) {\n\t\tif (this.uniforms.uRGB_gbc.value[1] !== value) {\n\t\t\tthis.uniforms.uRGB_gbc.value[1] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\t\n\tget extraGamma () {\n\t\treturn this.uniforms.uExtraGammaBrightContr.value[0];\n\t}\n\n\tset extraGamma (value) {\n\t\tif (this.uniforms.uExtraGammaBrightContr.value[0] !== value) {\n\t\t\tthis.uniforms.uExtraGammaBrightContr.value[0] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget extraBrightness () {\n\t\treturn this.uniforms.uExtraGammaBrightContr.value[1];\n\t}\n\n\tset extraBrightness (value) {\n\t\tif (this.uniforms.uExtraGammaBrightContr.value[1] !== value) {\n\t\t\tthis.uniforms.uExtraGammaBrightContr.value[1] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget extraContrast () {\n\t\treturn this.uniforms.uExtraGammaBrightContr.value[2];\n\t}\n\n\tset extraContrast (value) {\n\t\tif (this.uniforms.uExtraGammaBrightContr.value[2] !== value) {\n\t\t\tthis.uniforms.uExtraGammaBrightContr.value[2] = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tgetRange(attributeName){\n\t\treturn this.ranges.get(attributeName);\n\t}\n\n\tsetRange(attributeName, newRange){\n\n\t\tlet rangeChanged = false;\n\n\t\tlet oldRange = this.ranges.get(attributeName);\n\n\t\tif(oldRange != null && newRange != null){\n\t\t\trangeChanged = oldRange[0] !== newRange[0] || oldRange[1] !== newRange[1];\n\t\t}else{\n\t\t\trangeChanged = true;\n\t\t}\n\n\t\tthis.ranges.set(attributeName, newRange);\n\n\t\tif(rangeChanged){\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget extraRange () {\n\t\treturn this.uniforms.uExtraRange.value;\n\t}\n\n\tset extraRange (value) {\n\t\tif (!(value instanceof Array && value.length === 2)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (value[0] === this.uniforms.uExtraRange.value[0] &&\n\t\t\tvalue[1] === this.uniforms.uExtraRange.value[1]) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.uniforms.uExtraRange.value = value;\n\n\t\tthis._defaultExtraRangeChanged = true;\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'material_property_changed',\n\t\t\ttarget: this\n\t\t});\n\t}\n\n\tget weightRGB () {\n\t\treturn this.uniforms.wRGB.value;\n\t}\n\n\tset weightRGB (value) {\n\t\tif(this.uniforms.wRGB.value !== value){\n\t\t\tthis.uniforms.wRGB.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightIntensity () {\n\t\treturn this.uniforms.wIntensity.value;\n\t}\n\n\tset weightIntensity (value) {\n\t\tif(this.uniforms.wIntensity.value !== value){\n\t\t\tthis.uniforms.wIntensity.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightElevation () {\n\t\treturn this.uniforms.wElevation.value;\n\t}\n\n\tset weightElevation (value) {\n\t\tif(this.uniforms.wElevation.value !== value){\n\t\t\tthis.uniforms.wElevation.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightClassification () {\n\t\treturn this.uniforms.wClassification.value;\n\t}\n\n\tset weightClassification (value) {\n\t\tif(this.uniforms.wClassification.value !== value){\n\t\t\tthis.uniforms.wClassification.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightReturnNumber () {\n\t\treturn this.uniforms.wReturnNumber.value;\n\t}\n\n\tset weightReturnNumber (value) {\n\t\tif(this.uniforms.wReturnNumber.value !== value){\n\t\t\tthis.uniforms.wReturnNumber.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightSourceID () {\n\t\treturn this.uniforms.wSourceID.value;\n\t}\n\n\tset weightSourceID (value) {\n\t\tif(this.uniforms.wSourceID.value !== value){\n\t\t\tthis.uniforms.wSourceID.value = value;\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'material_property_changed',\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tstatic generateGradientTexture (gradient) {\n\t\tlet size = 64;\n\n\t\t// create canvas\n\t\tlet canvas = document.createElement('canvas');\n\t\tcanvas.width = size;\n\t\tcanvas.height = size;\n\n\t\t// get context\n\t\tlet context = canvas.getContext('2d');\n\n\t\t// draw gradient\n\t\tcontext.rect(0, 0, size, size);\n\t\tlet ctxGradient = context.createLinearGradient(0, 0, size, size);\n\n\t\tfor (let i = 0; i < gradient.length; i++) {\n\t\t\tlet step = gradient[i];\n\n\t\t\tctxGradient.addColorStop(step[0], '#' + step[1].getHexString());\n\t\t}\n\n\t\tcontext.fillStyle = ctxGradient;\n\t\tcontext.fill();\n\t\t\n\t\t//let texture = new THREE.Texture(canvas);\n\t\tlet texture = new THREE.CanvasTexture(canvas);\n\t\ttexture.needsUpdate = true;\n\t\t\n\t\ttexture.minFilter = THREE.LinearFilter;\n\t\ttexture.wrap = THREE.RepeatWrapping;\n\t\ttexture.repeat = 2;\n\t\t// textureImage = texture.image;\n\n\t\treturn texture;\n\t}\n\t\n\tstatic generateMatcapTexture (matcap) {\n\tvar url = new URL(Potree.resourcePath + \"/textures/matcap/\" + matcap).href;\n\tlet texture = new THREE.TextureLoader().load( url );\n\t\ttexture.magFilter = texture.minFilter = THREE.LinearFilter; \n\t\ttexture.needsUpdate = true;\n\t\t// PotreeConverter_1.6_2018_07_29_windows_x64\\PotreeConverter.exe autzen_xyzrgbXYZ_ascii.xyz -f xyzrgbXYZ -a RGB NORMAL -o autzen_xyzrgbXYZ_ascii_a -p index --overwrite\n\t\t// Switch matcap texture on the fly : viewer.scene.pointclouds[0].material.matcap = 'matcap1.jpg'; \n\t\t// For non power of 2, use LinearFilter and dont generate mipmaps, For power of 2, use NearestFilter and generate mipmaps : matcap2.jpg 1 2 8 11 12 13\n\t\treturn texture; \n\t}\n\n\tstatic generateMatcapTexture (matcap) {\n\tvar url = new URL(Potree.resourcePath + \"/textures/matcap/\" + matcap).href;\n\tlet texture = new THREE.TextureLoader().load( url );\n\t\ttexture.magFilter = texture.minFilter = THREE.LinearFilter; \n\t\ttexture.needsUpdate = true;\n\t\t// PotreeConverter_1.6_2018_07_29_windows_x64\\PotreeConverter.exe autzen_xyzrgbXYZ_ascii.xyz -f xyzrgbXYZ -a RGB NORMAL -o autzen_xyzrgbXYZ_ascii_a -p index --overwrite\n\t\t// Switch matcap texture on the fly : viewer.scene.pointclouds[0].material.matcap = 'matcap1.jpg'; \n\t\t// For non power of 2, use LinearFilter and dont generate mipmaps, For power of 2, use NearestFilter and generate mipmaps : matcap2.jpg 1 2 8 11 12 13\n\t\treturn texture; \n\t}\n\n\tdisableEvents(){\n\t\tif(this._hiddenListeners === undefined){\n\t\t\tthis._hiddenListeners = this._listeners;\n\t\t\tthis._listeners = {};\n\t\t}\n\t};\n\n\tenableEvents(){\n\t\tthis._listeners = this._hiddenListeners;\n\t\tthis._hiddenListeners = undefined;\n\t};\n\n\t// copyFrom(from){\n\n\t// \tvar a = 10;\n\n\t// \tfor(let name of Object.keys(this.uniforms)){\n\t// \t\tthis.uniforms[name].value = from.uniforms[name].value;\n\t// \t}\n\t// }\n\n\t// copy(from){\n\t// \tthis.copyFrom(from);\n\t// }\n\n}\n","\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\nimport {PointCloudTree, PointCloudTreeNode} from \"./PointCloudTree.js\";\nimport {PointCloudOctreeGeometryNode} from \"./PointCloudOctreeGeometry.js\";\nimport {Utils} from \"./utils.js\";\nimport {PointCloudMaterial} from \"./materials/PointCloudMaterial.js\";\n\n\nexport class PointCloudOctreeNode extends PointCloudTreeNode {\n\tconstructor () {\n\t\tsuper();\n\n\t\t//this.children = {};\n\t\tthis.children = [];\n\t\tthis.sceneNode = null;\n\t\tthis.octree = null;\n\t}\n\n\tgetNumPoints () {\n\t\treturn this.geometryNode.numPoints;\n\t}\n\n\tisLoaded () {\n\t\treturn true;\n\t}\n\n\tisTreeNode () {\n\t\treturn true;\n\t}\n\n\tisGeometryNode () {\n\t\treturn false;\n\t}\n\n\tgetLevel () {\n\t\treturn this.geometryNode.level;\n\t}\n\n\tgetBoundingSphere () {\n\t\treturn this.geometryNode.boundingSphere;\n\t}\n\n\tgetBoundingBox () {\n\t\treturn this.geometryNode.boundingBox;\n\t}\n\n\tgetChildren () {\n\t\tlet children = [];\n\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tif (this.children[i]) {\n\t\t\t\tchildren.push(this.children[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn children;\n\t}\n\n\tgetPointsInBox(boxNode){\n\n\t\tif(!this.sceneNode){\n\t\t\treturn null;\n\t\t}\n\n\t\tlet buffer = this.geometryNode.buffer;\n\n\t\tlet posOffset = buffer.offset(\"position\");\n\t\tlet stride = buffer.stride;\n\t\tlet view = new DataView(buffer.data);\n\n\t\tlet worldToBox = boxNode.matrixWorld.clone().invert();\n\t\tlet objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, this.sceneNode.matrixWorld);\n\n\t\tlet inBox = [];\n\n\t\tlet pos = new THREE.Vector4();\n\t\tfor(let i = 0; i < buffer.numElements; i++){\n\t\t\tlet x = view.getFloat32(i * stride + posOffset + 0, true);\n\t\t\tlet y = view.getFloat32(i * stride + posOffset + 4, true);\n\t\t\tlet z = view.getFloat32(i * stride + posOffset + 8, true);\n\n\t\t\tpos.set(x, y, z, 1);\n\t\t\tpos.applyMatrix4(objectToBox);\n\n\t\t\tif(-0.5 < pos.x && pos.x < 0.5){\n\t\t\t\tif(-0.5 < pos.y && pos.y < 0.5){\n\t\t\t\t\tif(-0.5 < pos.z && pos.z < 0.5){\n\t\t\t\t\t\tpos.set(x, y, z, 1).applyMatrix4(this.sceneNode.matrixWorld);\n\t\t\t\t\t\tinBox.push(new THREE.Vector3(pos.x, pos.y, pos.z));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn inBox;\n\t}\n\n\tget name () {\n\t\treturn this.geometryNode.name;\n\t}\n};\n\nexport class PointCloudOctree extends PointCloudTree {\n\tconstructor (geometry, material) {\n\t\tsuper();\n\n\t\tthis.pointBudget = Infinity;\n\t\tthis.pcoGeometry = geometry;\n\t\tthis.boundingBox = this.pcoGeometry.boundingBox;\n\t\tthis.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\tthis.material = material || new PointCloudMaterial();\n\t\tthis.visiblePointsTarget = 2 * 1000 * 1000;\n\t\tthis.minimumNodePixelSize = 150;\n\t\tthis.level = 0;\n\t\tthis.position.copy(geometry.offset);\n\t\tthis.updateMatrix();\n\n\t\t{\n\n\t\t\tlet priorityQueue = [\"rgba\", \"rgb\", \"intensity\", \"classification\"];\n\t\t\tlet selected = \"rgba\";\n\n\t\t\tfor(let attributeName of priorityQueue){\n\t\t\t\tlet attribute = this.pcoGeometry.pointAttributes.attributes.find(a => a.name === attributeName);\n\n\t\t\t\tif(!attribute){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet min = attribute.range[0].constructor.name === \"Array\" ? attribute.range[0] : [attribute.range[0]];\n\t\t\t\tlet max = attribute.range[1].constructor.name === \"Array\" ? attribute.range[1] : [attribute.range[1]];\n\n\t\t\t\tlet range_min = new THREE.Vector3(...min);\n\t\t\t\tlet range_max = new THREE.Vector3(...max);\n\t\t\t\tlet range = range_min.distanceTo(range_max);\n\n\t\t\t\tif(range === 0){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tselected = attributeName;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.material.activeAttributeName = selected;\n\t\t}\n\n\t\tthis.showBoundingBox = false;\n\t\tthis.boundingBoxNodes = [];\n\t\tthis.loadQueue = [];\n\t\tthis.visibleBounds = new THREE.Box3();\n\t\tthis.visibleNodes = [];\n\t\tthis.visibleGeometry = [];\n\t\tthis.generateDEM = false;\n\t\tthis.profileRequests = [];\n\t\tthis.name = '';\n\t\tthis._visible = true;\n\n\t\t{\n\t\t\tlet box = [this.pcoGeometry.tightBoundingBox, this.getBoundingBoxWorld()]\n\t\t\t\t.find(v => v !== undefined);\n\n\t\t\tthis.updateMatrixWorld(true);\n\t\t\tbox = Utils.computeTransformedBoundingBox(box, this.matrixWorld);\n\n\t\t\tlet bMin = box.min.z;\n\t\t\tlet bMax = box.max.z;\n\t\t\tthis.material.heightMin = bMin;\n\t\t\tthis.material.heightMax = bMax;\n\t\t}\n\n\t\t// TODO read projection from file instead\n\t\tthis.projection = geometry.projection;\n\t\tthis.fallbackProjection = geometry.fallbackProjection;\n\n\t\tthis.root = this.pcoGeometry.root;\n\t}\n\n\tsetName (name) {\n\t\tif (this.name !== name) {\n\t\t\tthis.name = name;\n\t\t\tthis.dispatchEvent({type: 'name_changed', name: name, pointcloud: this});\n\t\t}\n\t}\n\n\tgetName () {\n\t\treturn this.name;\n\t}\n\n\tgetAttribute(name){\n\n\t\tconst attribute = this.pcoGeometry.pointAttributes.attributes.find(a => a.name === name);\n\n\t\tif(attribute){\n\t\t\treturn attribute;\n\t\t}else{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tgetAttributes(){\n\t\treturn this.pcoGeometry.pointAttributes;\n\t}\n\n\ttoTreeNode (geometryNode, parent) {\n\t\tlet node = new PointCloudOctreeNode();\n\n\t\t// if(geometryNode.name === \"r40206\"){\n\t\t//\tconsole.log(\"creating node for r40206\");\n\t\t// }\n\t\tlet sceneNode = new THREE.Points(geometryNode.geometry, this.material);\n\t\tsceneNode.name = geometryNode.name;\n\t\tsceneNode.position.copy(geometryNode.boundingBox.min);\n\t\tsceneNode.frustumCulled = false;\n\t\tsceneNode.onBeforeRender = (_this, scene, camera, geometry, material, group) => {\n\t\t\tif (material.program) {\n\t\t\t\t_this.getContext().useProgram(material.program.program);\n\n\t\t\t\tif (material.program.getUniforms().map.level) {\n\t\t\t\t\tlet level = geometryNode.getLevel();\n\t\t\t\t\tmaterial.uniforms.level.value = level;\n\t\t\t\t\tmaterial.program.getUniforms().map.level.setValue(_this.getContext(), level);\n\t\t\t\t}\n\n\t\t\t\tif (this.visibleNodeTextureOffsets && material.program.getUniforms().map.vnStart) {\n\t\t\t\t\tlet vnStart = this.visibleNodeTextureOffsets.get(node);\n\t\t\t\t\tmaterial.uniforms.vnStart.value = vnStart;\n\t\t\t\t\tmaterial.program.getUniforms().map.vnStart.setValue(_this.getContext(), vnStart);\n\t\t\t\t}\n\n\t\t\t\tif (material.program.getUniforms().map.pcIndex) {\n\t\t\t\t\tlet i = node.pcIndex ? node.pcIndex : this.visibleNodes.indexOf(node);\n\t\t\t\t\tmaterial.uniforms.pcIndex.value = i;\n\t\t\t\t\tmaterial.program.getUniforms().map.pcIndex.setValue(_this.getContext(), i);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// { // DEBUG\n\t\t//\tlet sg = new THREE.SphereGeometry(1, 16, 16);\n\t\t//\tlet sm = new THREE.MeshNormalMaterial();\n\t\t//\tlet s = new THREE.Mesh(sg, sm);\n\t\t//\ts.scale.set(5, 5, 5);\n\t\t//\ts.position.copy(geometryNode.mean)\n\t\t//\t\t.add(this.position)\n\t\t//\t\t.add(geometryNode.boundingBox.min);\n\t\t//\n\t\t//\tviewer.scene.scene.add(s);\n\t\t// }\n\n\t\tnode.geometryNode = geometryNode;\n\t\tnode.sceneNode = sceneNode;\n\t\tnode.pointcloud = this;\n\t\tnode.children = [];\n\t\t//for (let key in geometryNode.children) {\n\t\t//\tnode.children[key] = geometryNode.children[key];\n\t\t//}\n\t\tfor(let i = 0; i < 8; i++){\n\t\t\tnode.children[i] = geometryNode.children[i];\n\t\t}\n\n\t\tif (!parent) {\n\t\t\tthis.root = node;\n\t\t\tthis.add(sceneNode);\n\t\t} else {\n\t\t\tlet childIndex = parseInt(geometryNode.name[geometryNode.name.length - 1]);\n\t\t\tparent.sceneNode.add(sceneNode);\n\t\t\tparent.children[childIndex] = node;\n\t\t}\n\n\t\tlet disposeListener = function () {\n\t\t\tlet childIndex = parseInt(geometryNode.name[geometryNode.name.length - 1]);\n\t\t\tparent.sceneNode.remove(node.sceneNode);\n\t\t\tparent.children[childIndex] = geometryNode;\n\t\t};\n\t\tgeometryNode.oneTimeDisposeHandlers.push(disposeListener);\n\n\t\treturn node;\n\t}\n\n\tupdateVisibleBounds () {\n\t\tlet leafNodes = [];\n\t\tfor (let i = 0; i < this.visibleNodes.length; i++) {\n\t\t\tlet node = this.visibleNodes[i];\n\t\t\tlet isLeaf = true;\n\n\t\t\tfor (let j = 0; j < node.children.length; j++) {\n\t\t\t\tlet child = node.children[j];\n\t\t\t\tif (child instanceof PointCloudOctreeNode) {\n\t\t\t\t\tisLeaf = isLeaf && !child.sceneNode.visible;\n\t\t\t\t} else if (child instanceof PointCloudOctreeGeometryNode) {\n\t\t\t\t\tisLeaf = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isLeaf) {\n\t\t\t\tleafNodes.push(node);\n\t\t\t}\n\t\t}\n\n\t\tthis.visibleBounds.min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\tthis.visibleBounds.max = new THREE.Vector3(-Infinity, -Infinity, -Infinity);\n\t\tfor (let i = 0; i < leafNodes.length; i++) {\n\t\t\tlet node = leafNodes[i];\n\n\t\t\tthis.visibleBounds.expandByPoint(node.getBoundingBox().min);\n\t\t\tthis.visibleBounds.expandByPoint(node.getBoundingBox().max);\n\t\t}\n\t}\n\n\tupdateMaterial (material, visibleNodes, camera, renderer) {\n\t\tmaterial.fov = camera.fov * (Math.PI / 180);\n\t\tmaterial.screenWidth = renderer.domElement.clientWidth;\n\t\tmaterial.screenHeight = renderer.domElement.clientHeight;\n\t\tmaterial.spacing = this.pcoGeometry.spacing; // * Math.max(this.scale.x, this.scale.y, this.scale.z);\n\t\tmaterial.near = camera.near;\n\t\tmaterial.far = camera.far;\n\t\tmaterial.uniforms.octreeSize.value = this.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x;\n\t}\n\n\tcomputeVisibilityTextureData(nodes, camera){\n\n\t\tif(Potree.measureTimings) performance.mark(\"computeVisibilityTextureData-start\");\n\n\t\tlet data = new Uint8Array(nodes.length * 4);\n\t\tlet visibleNodeTextureOffsets = new Map();\n\n\t\t// copy array\n\t\tnodes = nodes.slice();\n\n\t\t// sort by level and index, e.g. r, r0, r3, r4, r01, r07, r30, ...\n\t\tlet sort = function (a, b) {\n\t\t\tlet na = a.geometryNode.name;\n\t\t\tlet nb = b.geometryNode.name;\n\t\t\tif (na.length !== nb.length) return na.length - nb.length;\n\t\t\tif (na < nb) return -1;\n\t\t\tif (na > nb) return 1;\n\t\t\treturn 0;\n\t\t};\n\t\tnodes.sort(sort);\n\n\t\tlet worldDir = new THREE.Vector3();\n\n\t\tlet nodeMap = new Map();\n\t\tlet offsetsToChild = new Array(nodes.length).fill(Infinity);\n\n\t\tfor(let i = 0; i < nodes.length; i++){\n\t\t\tlet node = nodes[i];\n\n\t\t\tnodeMap.set(node.name, node);\n\t\t\tvisibleNodeTextureOffsets.set(node, i);\n\n\t\t\tif(i > 0){\n\t\t\t\tlet index = parseInt(node.name.slice(-1));\n\t\t\t\tlet parentName = node.name.slice(0, -1);\n\t\t\t\tlet parent = nodeMap.get(parentName);\n\t\t\t\tlet parentOffset = visibleNodeTextureOffsets.get(parent);\n\n\t\t\t\tlet parentOffsetToChild = (i - parentOffset);\n\n\t\t\t\toffsetsToChild[parentOffset] = Math.min(offsetsToChild[parentOffset], parentOffsetToChild);\n\n\t\t\t\tdata[parentOffset * 4 + 0] = data[parentOffset * 4 + 0] | (1 << index);\n\t\t\t\tdata[parentOffset * 4 + 1] = (offsetsToChild[parentOffset] >> 8);\n\t\t\t\tdata[parentOffset * 4 + 2] = (offsetsToChild[parentOffset] % 256);\n\t\t\t}\n\n\t\t\tlet density = node.geometryNode.density;\n\t\t\t\n\t\t\tif(typeof density === \"number\"){\n\t\t\t\tlet lodOffset = Math.log2(density) / 2 - 1.5;\n\n\t\t\t\tlet offsetUint8 = (lodOffset + 10) * 10;\n\n\t\t\t\tdata[i * 4 + 3] = offsetUint8;\n\t\t\t}else{\n\t\t\t\tdata[i * 4 + 3] = 100;\n\t\t\t}\n\n\t\t}\n\n\t\tif(Potree.measureTimings){\n\t\t\tperformance.mark(\"computeVisibilityTextureData-end\");\n\t\t\tperformance.measure(\"render.computeVisibilityTextureData\", \"computeVisibilityTextureData-start\", \"computeVisibilityTextureData-end\");\n\t\t}\n\n\t\treturn {\n\t\t\tdata: data,\n\t\t\toffsets: visibleNodeTextureOffsets\n\t\t};\n\t}\n\n\tnodeIntersectsProfile (node, profile) {\n\t\tlet bbWorld = node.boundingBox.clone().applyMatrix4(this.matrixWorld);\n\t\tlet bsWorld = bbWorld.getBoundingSphere(new THREE.Sphere());\n\n\t\tlet intersects = false;\n\n\t\tfor (let i = 0; i < profile.points.length - 1; i++) {\n\n\t\t\tlet start = new THREE.Vector3(profile.points[i + 0].x, profile.points[i + 0].y, bsWorld.center.z);\n\t\t\tlet end = new THREE.Vector3(profile.points[i + 1].x, profile.points[i + 1].y, bsWorld.center.z);\n\n\t\t\tlet closest = new THREE.Line3(start, end).closestPointToPoint(bsWorld.center, true, new THREE.Vector3());\n\t\t\tlet distance = closest.distanceTo(bsWorld.center);\n\n\t\t\tintersects = intersects || (distance < (bsWorld.radius + profile.width));\n\t\t}\n\n\t\t//console.log(`${node.name}: ${intersects}`);\n\n\t\treturn intersects;\n\t}\n\n\tdeepestNodeAt(position){\n\t\t\n\t\tconst toObjectSpace = this.matrixWorld.clone().invert();\n\n\t\tconst objPos = position.clone().applyMatrix4(toObjectSpace);\n\n\t\tlet current = this.root;\n\t\twhile(true){\n\n\t\t\tlet containingChild = null;\n\n\t\t\tfor(const child of current.children){\n\n\t\t\t\tif(child !== undefined){\n\t\t\t\t\tif(child.getBoundingBox().containsPoint(objPos)){\n\t\t\t\t\t\tcontainingChild = child;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(containingChild !== null && containingChild instanceof PointCloudOctreeNode){\n\t\t\t\tcurrent = containingChild;\n\t\t\t}else{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst deepest = current;\n\n\t\treturn deepest;\n\t}\n\n\tnodesOnRay (nodes, ray) {\n\t\tlet nodesOnRay = [];\n\n\t\tlet _ray = ray.clone();\n\t\tfor (let i = 0; i < nodes.length; i++) {\n\t\t\tlet node = nodes[i];\n\t\t\tlet sphere = node.getBoundingSphere().clone().applyMatrix4(this.matrixWorld);\n\n\t\t\tif (_ray.intersectsSphere(sphere)) {\n\t\t\t\tnodesOnRay.push(node);\n\t\t\t}\n\t\t}\n\n\t\treturn nodesOnRay;\n\t}\n\n\tupdateMatrixWorld (force) {\n\t\tif (this.matrixAutoUpdate === true) this.updateMatrix();\n\n\t\tif (this.matrixWorldNeedsUpdate === true || force === true) {\n\t\t\tif (!this.parent) {\n\t\t\t\tthis.matrixWorld.copy(this.matrix);\n\t\t\t} else {\n\t\t\t\tthis.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix);\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\t\t}\n\t}\n\n\thideDescendants (object) {\n\t\tlet stack = [];\n\t\tfor (let i = 0; i < object.children.length; i++) {\n\t\t\tlet child = object.children[i];\n\t\t\tif (child.visible) {\n\t\t\t\tstack.push(child);\n\t\t\t}\n\t\t}\n\n\t\twhile (stack.length > 0) {\n\t\t\tlet object = stack.shift();\n\n\t\t\tobject.visible = false;\n\n\t\t\tfor (let i = 0; i < object.children.length; i++) {\n\t\t\t\tlet child = object.children[i];\n\t\t\t\tif (child.visible) {\n\t\t\t\t\tstack.push(child);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tmoveToOrigin () {\n\t\tthis.position.set(0, 0, 0);\n\t\tthis.updateMatrixWorld(true);\n\t\tlet box = this.boundingBox;\n\t\tlet transform = this.matrixWorld;\n\t\tlet tBox = Utils.computeTransformedBoundingBox(box, transform);\n\t\tthis.position.set(0, 0, 0).sub(tBox.getCenter(new THREE.Vector3()));\n\t};\n\n\tmoveToGroundPlane () {\n\t\tthis.updateMatrixWorld(true);\n\t\tlet box = this.boundingBox;\n\t\tlet transform = this.matrixWorld;\n\t\tlet tBox = Utils.computeTransformedBoundingBox(box, transform);\n\t\tthis.position.y += -tBox.min.y;\n\t};\n\n\tgetBoundingBoxWorld () {\n\t\tthis.updateMatrixWorld(true);\n\t\tlet box = this.boundingBox;\n\t\tlet transform = this.matrixWorld;\n\t\tlet tBox = Utils.computeTransformedBoundingBox(box, transform);\n\n\t\treturn tBox;\n\t};\n\n\t/**\n\t * returns points inside the profile points\n\t *\n\t * maxDepth:\t\tsearch points up to the given octree depth\n\t *\n\t *\n\t * The return value is an array with all segments of the profile path\n\t *\tlet segment = {\n\t *\t\tstart:\tTHREE.Vector3,\n\t *\t\tend:\tTHREE.Vector3,\n\t *\t\tpoints: {}\n\t *\t\tproject: function()\n\t *\t};\n\t *\n\t * The project() function inside each segment can be used to transform\n\t * that segments point coordinates to line up along the x-axis.\n\t *\n\t *\n\t */\n\tgetPointsInProfile (profile, maxDepth, callback) {\n\t\tif (callback) {\n\t\t\tlet request = new Potree.ProfileRequest(this, profile, maxDepth, callback);\n\t\t\tthis.profileRequests.push(request);\n\n\t\t\treturn request;\n\t\t}\n\n\t\tlet points = {\n\t\t\tsegments: [],\n\t\t\tboundingBox: new THREE.Box3(),\n\t\t\tprojectedBoundingBox: new THREE.Box2()\n\t\t};\n\n\t\t// evaluate segments\n\t\tfor (let i = 0; i < profile.points.length - 1; i++) {\n\t\t\tlet start = profile.points[i];\n\t\t\tlet end = profile.points[i + 1];\n\t\t\tlet ps = this.getProfile(start, end, profile.width, maxDepth);\n\n\t\t\tlet segment = {\n\t\t\t\tstart: start,\n\t\t\t\tend: end,\n\t\t\t\tpoints: ps,\n\t\t\t\tproject: null\n\t\t\t};\n\n\t\t\tpoints.segments.push(segment);\n\n\t\t\tpoints.boundingBox.expandByPoint(ps.boundingBox.min);\n\t\t\tpoints.boundingBox.expandByPoint(ps.boundingBox.max);\n\t\t}\n\n\t\t// add projection functions to the segments\n\t\tlet mileage = new THREE.Vector3();\n\t\tfor (let i = 0; i < points.segments.length; i++) {\n\t\t\tlet segment = points.segments[i];\n\t\t\tlet start = segment.start;\n\t\t\tlet end = segment.end;\n\n\t\t\tlet project = (function (_start, _end, _mileage, _boundingBox) {\n\t\t\t\tlet start = _start;\n\t\t\t\tlet end = _end;\n\t\t\t\tlet mileage = _mileage;\n\t\t\t\tlet boundingBox = _boundingBox;\n\n\t\t\t\tlet xAxis = new THREE.Vector3(1, 0, 0);\n\t\t\t\tlet dir = new THREE.Vector3().subVectors(end, start);\n\t\t\t\tdir.y = 0;\n\t\t\t\tdir.normalize();\n\t\t\t\tlet alpha = Math.acos(xAxis.dot(dir));\n\t\t\t\tif (dir.z > 0) {\n\t\t\t\t\talpha = -alpha;\n\t\t\t\t}\n\n\t\t\t\treturn function (position) {\n\t\t\t\t\tlet toOrigin = new THREE.Matrix4().makeTranslation(-start.x, -boundingBox.min.y, -start.z);\n\t\t\t\t\tlet alignWithX = new THREE.Matrix4().makeRotationY(-alpha);\n\t\t\t\t\tlet applyMileage = new THREE.Matrix4().makeTranslation(mileage.x, 0, 0);\n\n\t\t\t\t\tlet pos = position.clone();\n\t\t\t\t\tpos.applyMatrix4(toOrigin);\n\t\t\t\t\tpos.applyMatrix4(alignWithX);\n\t\t\t\t\tpos.applyMatrix4(applyMileage);\n\n\t\t\t\t\treturn pos;\n\t\t\t\t};\n\t\t\t}(start, end, mileage.clone(), points.boundingBox.clone()));\n\n\t\t\tsegment.project = project;\n\n\t\t\tmileage.x += new THREE.Vector3(start.x, 0, start.z).distanceTo(new THREE.Vector3(end.x, 0, end.z));\n\t\t\tmileage.y += end.y - start.y;\n\t\t}\n\n\t\tpoints.projectedBoundingBox.min.x = 0;\n\t\tpoints.projectedBoundingBox.min.y = points.boundingBox.min.y;\n\t\tpoints.projectedBoundingBox.max.x = mileage.x;\n\t\tpoints.projectedBoundingBox.max.y = points.boundingBox.max.y;\n\n\t\treturn points;\n\t}\n\n\t/**\n\t * returns points inside the given profile bounds.\n\t *\n\t * start:\n\t * end:\n\t * width:\n\t * depth:\t\tsearch points up to the given octree depth\n\t * callback:\tif specified, points are loaded before searching\n\t *\n\t *\n\t */\n\tgetProfile (start, end, width, depth, callback) {\n\t\tlet request = new Potree.ProfileRequest(start, end, width, depth, callback);\n\t\tthis.profileRequests.push(request);\n\t};\n\n\tgetVisibleExtent () {\n\t\treturn this.visibleBounds.applyMatrix4(this.matrixWorld);\n\t};\n\n\tintersectsPoint(position){\n\n\t\tlet rootAvailable = this.pcoGeometry.root && this.pcoGeometry.root.geometry;\n\n\t\tif(!rootAvailable){\n\t\t\treturn false;\n\t\t}\n\n\t\tif(typeof this.signedDistanceField === \"undefined\"){\n\n\t\t\tconst resolution = 32;\n\t\t\tconst field = new Float32Array(resolution ** 3).fill(Infinity);\n\n\t\t\tconst positions = this.pcoGeometry.root.geometry.attributes.position;\n\t\t\tconst boundingBox = this.boundingBox;\n\n\t\t\tconst n = positions.count;\n\n\t\t\tfor(let i = 0; i < n; i = i + 3){\n\t\t\t\tconst x = positions.array[3 * i + 0];\n\t\t\t\tconst y = positions.array[3 * i + 1];\n\t\t\t\tconst z = positions.array[3 * i + 2];\n\n\t\t\t\tconst ix = parseInt(Math.min(resolution * (x / boundingBox.max.x), resolution - 1));\n\t\t\t\tconst iy = parseInt(Math.min(resolution * (y / boundingBox.max.y), resolution - 1));\n\t\t\t\tconst iz = parseInt(Math.min(resolution * (z / boundingBox.max.z), resolution - 1));\n\n\t\t\t\tconst index = ix + iy * resolution + iz * resolution * resolution;\n\n\t\t\t\tfield[index] = 0;\n\t\t\t}\n\n\t\t\tconst sdf = {\n\t\t\t\tresolution: resolution,\n\t\t\t\tfield: field,\n\t\t\t};\n\n\t\t\tthis.signedDistanceField = sdf;\n\t\t}\n\n\n\t\t{\n\t\t\tconst sdf = this.signedDistanceField;\n\t\t\tconst boundingBox = this.boundingBox;\n\n\t\t\tconst toObjectSpace = this.matrixWorld.clone().invert();\n\n\t\t\tconst objPos = position.clone().applyMatrix4(toObjectSpace);\n\n\t\t\tconst resolution = sdf.resolution;\n\t\t\tconst ix = parseInt(resolution * (objPos.x / boundingBox.max.x));\n\t\t\tconst iy = parseInt(resolution * (objPos.y / boundingBox.max.y));\n\t\t\tconst iz = parseInt(resolution * (objPos.z / boundingBox.max.z));\n\n\t\t\tif(ix < 0 || iy < 0 || iz < 0){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif(ix >= resolution || iy >= resolution || iz >= resolution){\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst index = ix + iy * resolution + iz * resolution * resolution;\n\n\t\t\tconst value = sdf.field[index];\n\n\t\t\tif(value === 0){\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t *\n\t *\n\t *\n\t * params.pickWindowSize:\tLook for points inside a pixel window of this size.\n\t *\t\t\t\t\t\t\tUse odd values: 1, 3, 5, ...\n\t *\n\t *\n\t * TODO: only draw pixels that are actually read with readPixels().\n\t *\n\t */\n\tpick(viewer, camera, ray, params = {}){\n\n\t\tlet renderer = viewer.renderer;\n\t\tlet pRenderer = viewer.pRenderer;\n\n\t\tperformance.mark(\"pick-start\");\n\n\t\tlet getVal = (a, b) => a !== undefined ? a : b;\n\n\t\tlet pickWindowSize = getVal(params.pickWindowSize, 65);\n\t\tlet pickOutsideClipRegion = getVal(params.pickOutsideClipRegion, false);\n\n\t\tlet size = renderer.getSize(new THREE.Vector2());\n\n\t\tlet width = Math.ceil(getVal(params.width, size.width));\n\t\tlet height = Math.ceil(getVal(params.height, size.height));\n\n\t\tlet pointSizeType = getVal(params.pointSizeType, this.material.pointSizeType);\n\t\tlet pointSize = getVal(params.pointSize, this.material.size);\n\n\t\tlet nodes = this.nodesOnRay(this.visibleNodes, ray);\n\n\t\tif (nodes.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (!this.pickState) {\n\t\t\tlet scene = new THREE.Scene();\n\n\t\t\tlet material = new Potree.PointCloudMaterial();\n\t\t\tmaterial.activeAttributeName = \"indices\";\n\n\t\t\tlet renderTarget = new THREE.WebGLRenderTarget(\n\t\t\t\t1, 1,\n\t\t\t\t{ minFilter: THREE.LinearFilter,\n\t\t\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\t\t\tformat: THREE.RGBAFormat }\n\t\t\t);\n\n\t\t\tthis.pickState = {\n\t\t\t\trenderTarget: renderTarget,\n\t\t\t\tmaterial: material,\n\t\t\t\tscene: scene\n\t\t\t};\n\t\t};\n\n\t\tlet pickState = this.pickState;\n\t\tlet pickMaterial = pickState.material;\n\n\t\t{ // update pick material\n\t\t\tpickMaterial.pointSizeType = pointSizeType;\n\t\t\t//pickMaterial.shape = this.material.shape;\n\t\t\tpickMaterial.shape = Potree.PointShape.PARABOLOID;\n\n\t\t\tpickMaterial.uniforms.uFilterReturnNumberRange.value = this.material.uniforms.uFilterReturnNumberRange.value;\n\t\t\tpickMaterial.uniforms.uFilterNumberOfReturnsRange.value = this.material.uniforms.uFilterNumberOfReturnsRange.value;\n\t\t\tpickMaterial.uniforms.uFilterGPSTimeClipRange.value = this.material.uniforms.uFilterGPSTimeClipRange.value;\n\t\t\tpickMaterial.uniforms.uFilterPointSourceIDClipRange.value = this.material.uniforms.uFilterPointSourceIDClipRange.value;\n\n\t\t\tpickMaterial.activeAttributeName = \"indices\";\n\n\t\t\tpickMaterial.size = pointSize;\n\t\t\tpickMaterial.uniforms.minSize.value = this.material.uniforms.minSize.value;\n\t\t\tpickMaterial.uniforms.maxSize.value = this.material.uniforms.maxSize.value;\n\t\t\tpickMaterial.classification = this.material.classification;\n\t\t\tpickMaterial.recomputeClassification();\n\n\t\t\tif(params.pickClipped){\n\t\t\t\tpickMaterial.clipBoxes = this.material.clipBoxes;\n\t\t\t\tpickMaterial.uniforms.clipBoxes = this.material.uniforms.clipBoxes;\n\t\t\t\tif(this.material.clipTask === Potree.ClipTask.HIGHLIGHT){\n\t\t\t\t\tpickMaterial.clipTask = Potree.ClipTask.NONE;\n\t\t\t\t}else{\n\t\t\t\t\tpickMaterial.clipTask = this.material.clipTask;\n\t\t\t\t}\n\t\t\t\tpickMaterial.clipMethod = this.material.clipMethod;\n\t\t\t}else{\n\t\t\t\tpickMaterial.clipBoxes = [];\n\t\t\t}\n\n\t\t\tthis.updateMaterial(pickMaterial, nodes, camera, renderer);\n\t\t}\n\n\t\tpickState.renderTarget.setSize(width, height);\n\n\t\tlet pixelPos = new THREE.Vector2(params.x, params.y);\n\n\t\tlet gl = renderer.getContext();\n\t\tgl.enable(gl.SCISSOR_TEST);\n\t\tgl.scissor(\n\t\t\tparseInt(pixelPos.x - (pickWindowSize - 1) / 2),\n\t\t\tparseInt(pixelPos.y - (pickWindowSize - 1) / 2),\n\t\t\tparseInt(pickWindowSize), parseInt(pickWindowSize));\n\n\n\t\trenderer.state.buffers.depth.setTest(pickMaterial.depthTest);\n\t\trenderer.state.buffers.depth.setMask(pickMaterial.depthWrite);\n\t\trenderer.state.setBlending(THREE.NoBlending);\n\n\t\t{ // RENDER\n\t\t\trenderer.setRenderTarget(pickState.renderTarget);\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\trenderer.clear(true, true, true);\n\n\t\t\tlet tmp = this.material;\n\t\t\tthis.material = pickMaterial;\n\n\t\t\tpRenderer.renderOctree(this, nodes, camera, pickState.renderTarget);\n\n\t\t\tthis.material = tmp;\n\t\t}\n\n\t\tlet clamp = (number, min, max) => Math.min(Math.max(min, number), max);\n\n\t\tlet x = parseInt(clamp(pixelPos.x - (pickWindowSize - 1) / 2, 0, width));\n\t\tlet y = parseInt(clamp(pixelPos.y - (pickWindowSize - 1) / 2, 0, height));\n\t\tlet w = parseInt(Math.min(x + pickWindowSize, width) - x);\n\t\tlet h = parseInt(Math.min(y + pickWindowSize, height) - y);\n\n\t\tlet pixelCount = w * h;\n\t\tlet buffer = new Uint8Array(4 * pixelCount);\n\n\t\tgl.readPixels(x, y, pickWindowSize, pickWindowSize, gl.RGBA, gl.UNSIGNED_BYTE, buffer);\n\n\t\trenderer.setRenderTarget(null);\n\t\trenderer.state.reset();\n\t\trenderer.setScissorTest(false);\n\t\tgl.disable(gl.SCISSOR_TEST);\n\n\t\tlet pixels = buffer;\n\t\tlet ibuffer = new Uint32Array(buffer.buffer);\n\n\t\t// find closest hit inside pixelWindow boundaries\n\t\tlet min = Number.MAX_VALUE;\n\t\tlet hits = [];\n\t\tfor (let u = 0; u < pickWindowSize; u++) {\n\t\t\tfor (let v = 0; v < pickWindowSize; v++) {\n\t\t\t\tlet offset = (u + v * pickWindowSize);\n\t\t\t\tlet distance = Math.pow(u - (pickWindowSize - 1) / 2, 2) + Math.pow(v - (pickWindowSize - 1) / 2, 2);\n\n\t\t\t\tlet pcIndex = pixels[4 * offset + 3];\n\t\t\t\tpixels[4 * offset + 3] = 0;\n\t\t\t\tlet pIndex = ibuffer[offset];\n\n\t\t\t\tif(!(pcIndex === 0 && pIndex === 0) && (pcIndex !== undefined) && (pIndex !== undefined)){\n\t\t\t\t\tlet hit = {\n\t\t\t\t\t\tpIndex: pIndex,\n\t\t\t\t\t\tpcIndex: pcIndex,\n\t\t\t\t\t\tdistanceToCenter: distance\n\t\t\t\t\t};\n\n\t\t\t\t\tif(params.all){\n\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tif(hits.length > 0){\n\t\t\t\t\t\t\tif(distance < hits[0].distanceToCenter){\n\t\t\t\t\t\t\t\thits[0] = hit;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t\n\t\t// { // DEBUG: show panel with pick image\n\t\t// \tlet img = Utils.pixelsArrayToImage(buffer, w, h);\n\t\t// \tlet screenshot = img.src;\n\t\t\n\t\t// \tif(!this.debugDIV){\n\t\t// \t\tthis.debugDIV = $(`\n\t\t// \t\t\t
    `);\n\t\t// \t\t$(document.body).append(this.debugDIV);\n\t\t// \t}\n\t\t\n\t\t// \tthis.debugDIV.empty();\n\t\t// \tthis.debugDIV.append($(``));\n\t\t// \t//$(this.debugWindow.document).append($(``));\n\t\t// \t//this.debugWindow.document.write('');\n\t\t// }\n\n\n\t\tfor(let hit of hits){\n\t\t\tlet point = {};\n\n\t\t\tif (!nodes[hit.pcIndex]) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlet node = nodes[hit.pcIndex];\n\t\t\tlet pc = node.sceneNode;\n\t\t\tlet geometry = node.geometryNode.geometry;\n\n\t\t\tfor(let attributeName in geometry.attributes){\n\t\t\t\tlet attribute = geometry.attributes[attributeName];\n\n\t\t\t\tif (attributeName === 'position') {\n\t\t\t\t\tlet x = attribute.array[3 * hit.pIndex + 0];\n\t\t\t\t\tlet y = attribute.array[3 * hit.pIndex + 1];\n\t\t\t\t\tlet z = attribute.array[3 * hit.pIndex + 2];\n\n\t\t\t\t\tlet position = new THREE.Vector3(x, y, z);\n\t\t\t\t\tposition.applyMatrix4(pc.matrixWorld);\n\n\t\t\t\t\tpoint[attributeName] = position;\n\t\t\t\t} else if (attributeName === 'indices') {\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet values = attribute.array.slice(attribute.itemSize * hit.pIndex, attribute.itemSize * (hit.pIndex + 1)) ;\n\n\t\t\t\t\tif(attribute.potree){\n\t\t\t\t\t\tconst {scale, offset} = attribute.potree;\n\t\t\t\t\t\tvalues = values.map(v => v / scale + offset);\n\t\t\t\t\t}\n\n\t\t\t\t\tpoint[attributeName] = values;\n\n\t\t\t\t\t//debugger;\n\t\t\t\t\t//if (values.itemSize === 1) {\n\t\t\t\t\t//\tpoint[attribute.name] = values.array[hit.pIndex];\n\t\t\t\t\t//} else {\n\t\t\t\t\t//\tlet value = [];\n\t\t\t\t\t//\tfor (let j = 0; j < values.itemSize; j++) {\n\t\t\t\t\t//\t\tvalue.push(values.array[values.itemSize * hit.pIndex + j]);\n\t\t\t\t\t//\t}\n\t\t\t\t\t//\tpoint[attribute.name] = value;\n\t\t\t\t\t//}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thit.point = point;\n\t\t}\n\n\t\tperformance.mark(\"pick-end\");\n\t\tperformance.measure(\"pick\", \"pick-start\", \"pick-end\");\n\n\t\tif(params.all){\n\t\t\treturn hits.map(hit => hit.point);\n\t\t}else{\n\t\t\tif(hits.length === 0){\n\t\t\t\treturn null;\n\t\t\t}else{\n\t\t\t\treturn hits[0].point;\n\t\t\t\t//let sorted = hits.sort( (a, b) => a.distanceToCenter - b.distanceToCenter);\n\n\t\t\t\t//return sorted[0].point;\n\t\t\t}\n\t\t}\n\n\t};\n\n\t* getFittedBoxGen(boxNode){\n\t\tlet start = performance.now();\n\n\t\tlet shrinkedLocalBounds = new THREE.Box3();\n\t\tlet worldToBox = boxNode.matrixWorld.clone().invert();\n\n\t\tfor(let node of this.visibleNodes){\n\t\t\tif(!node.sceneNode){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet buffer = node.geometryNode.buffer;\n\n\t\t\tlet posOffset = buffer.offset(\"position\");\n\t\t\tlet stride = buffer.stride;\n\t\t\tlet view = new DataView(buffer.data);\n\n\t\t\tlet objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, node.sceneNode.matrixWorld);\n\n\t\t\tlet pos = new THREE.Vector4();\n\t\t\tfor(let i = 0; i < buffer.numElements; i++){\n\t\t\t\tlet x = view.getFloat32(i * stride + posOffset + 0, true);\n\t\t\t\tlet y = view.getFloat32(i * stride + posOffset + 4, true);\n\t\t\t\tlet z = view.getFloat32(i * stride + posOffset + 8, true);\n\n\t\t\t\tpos.set(x, y, z, 1);\n\t\t\t\tpos.applyMatrix4(objectToBox);\n\n\t\t\t\tif(-0.5 < pos.x && pos.x < 0.5){\n\t\t\t\t\tif(-0.5 < pos.y && pos.y < 0.5){\n\t\t\t\t\t\tif(-0.5 < pos.z && pos.z < 0.5){\n\t\t\t\t\t\t\tshrinkedLocalBounds.expandByPoint(pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tyield;\n\t\t}\n\n\t\tlet fittedPosition = shrinkedLocalBounds.getCenter(new THREE.Vector3()).applyMatrix4(boxNode.matrixWorld);\n\n\t\tlet fitted = new THREE.Object3D();\n\t\tfitted.position.copy(fittedPosition);\n\t\tfitted.scale.copy(boxNode.scale);\n\t\tfitted.rotation.copy(boxNode.rotation);\n\n\t\tlet ds = new THREE.Vector3().subVectors(shrinkedLocalBounds.max, shrinkedLocalBounds.min);\n\t\tfitted.scale.multiply(ds);\n\n\t\tlet duration = performance.now() - start;\n\t\tconsole.log(\"duration: \", duration);\n\n\t\tyield fitted;\n\t}\n\n\tgetFittedBox(boxNode, maxLevel = Infinity){\n\n\t\tmaxLevel = Infinity;\n\n\t\tlet start = performance.now();\n\n\t\tlet shrinkedLocalBounds = new THREE.Box3();\n\t\tlet worldToBox = boxNode.matrixWorld.clone().invert();\n\n\t\tfor(let node of this.visibleNodes){\n\t\t\tif(!node.sceneNode || node.getLevel() > maxLevel){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet buffer = node.geometryNode.buffer;\n\n\t\t\tlet posOffset = buffer.offset(\"position\");\n\t\t\tlet stride = buffer.stride;\n\t\t\tlet view = new DataView(buffer.data);\n\n\t\t\tlet objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, node.sceneNode.matrixWorld);\n\n\t\t\tlet pos = new THREE.Vector4();\n\t\t\tfor(let i = 0; i < buffer.numElements; i++){\n\t\t\t\tlet x = view.getFloat32(i * stride + posOffset + 0, true);\n\t\t\t\tlet y = view.getFloat32(i * stride + posOffset + 4, true);\n\t\t\t\tlet z = view.getFloat32(i * stride + posOffset + 8, true);\n\n\t\t\t\tpos.set(x, y, z, 1);\n\t\t\t\tpos.applyMatrix4(objectToBox);\n\n\t\t\t\tif(-0.5 < pos.x && pos.x < 0.5){\n\t\t\t\t\tif(-0.5 < pos.y && pos.y < 0.5){\n\t\t\t\t\t\tif(-0.5 < pos.z && pos.z < 0.5){\n\t\t\t\t\t\t\tshrinkedLocalBounds.expandByPoint(pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet fittedPosition = shrinkedLocalBounds.getCenter(new THREE.Vector3()).applyMatrix4(boxNode.matrixWorld);\n\n\t\tlet fitted = new THREE.Object3D();\n\t\tfitted.position.copy(fittedPosition);\n\t\tfitted.scale.copy(boxNode.scale);\n\t\tfitted.rotation.copy(boxNode.rotation);\n\n\t\tlet ds = new THREE.Vector3().subVectors(shrinkedLocalBounds.max, shrinkedLocalBounds.min);\n\t\tfitted.scale.multiply(ds);\n\n\t\tlet duration = performance.now() - start;\n\t\tconsole.log(\"duration: \", duration);\n\n\t\treturn fitted;\n\t}\n\n\tget progress () {\n\t\treturn this.visibleNodes.length / this.visibleGeometry.length;\n\t}\n\n\tfind(name){\n\t\tlet node = null;\n\t\tfor(let char of name){\n\t\t\tif(char === \"r\"){\n\t\t\t\tnode = this.root;\n\t\t\t}else{\n\t\t\t\tnode = node.children[char];\n\t\t\t}\n\t\t}\n\n\t\treturn node;\n\t}\n\n\tget visible(){\n\t\treturn this._visible;\n\t}\n\n\tset visible(value){\n\n\t\tif(value !== this._visible){\n\t\t\tthis._visible = value;\n\n\t\t\tthis.dispatchEvent({type: 'visibility_changed', pointcloud: this});\n\t\t}\n\n\t}\n\n}\n\n\n\n\n\n\n\n\n\n\n","\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\n\nexport class Points {\n\t\n\tconstructor () {\n\t\tthis.boundingBox = new THREE.Box3();\n\t\tthis.numPoints = 0;\n\t\tthis.data = {};\n\t}\n\n\tadd (points) {\n\t\tlet currentSize = this.numPoints;\n\t\tlet additionalSize = points.numPoints;\n\t\tlet newSize = currentSize + additionalSize;\n\n\t\tlet thisAttributes = Object.keys(this.data);\n\t\tlet otherAttributes = Object.keys(points.data);\n\t\tlet attributes = new Set([...thisAttributes, ...otherAttributes]);\n\n\t\tfor (let attribute of attributes) {\n\t\t\tif (thisAttributes.includes(attribute) && otherAttributes.includes(attribute)) {\n\t\t\t\t// attribute in both, merge\n\t\t\t\tlet Type = this.data[attribute].constructor;\n\t\t\t\tlet merged = new Type(this.data[attribute].length + points.data[attribute].length);\n\t\t\t\tmerged.set(this.data[attribute], 0);\n\t\t\t\tmerged.set(points.data[attribute], this.data[attribute].length);\n\t\t\t\tthis.data[attribute] = merged;\n\t\t\t} else if (thisAttributes.includes(attribute) && !otherAttributes.includes(attribute)) {\n\t\t\t\t// attribute only in this; take over this and expand to new size\n\t\t\t\tlet elementsPerPoint = this.data[attribute].length / this.numPoints;\n\t\t\t\tlet Type = this.data[attribute].constructor;\n\t\t\t\tlet expanded = new Type(elementsPerPoint * newSize);\n\t\t\t\texpanded.set(this.data[attribute], 0);\n\t\t\t\tthis.data[attribute] = expanded;\n\t\t\t} else if (!thisAttributes.includes(attribute) && otherAttributes.includes(attribute)) {\n\t\t\t\t// attribute only in points to be added; take over new points and expand to new size\n\t\t\t\tlet elementsPerPoint = points.data[attribute].length / points.numPoints;\n\t\t\t\tlet Type = points.data[attribute].constructor;\n\t\t\t\tlet expanded = new Type(elementsPerPoint * newSize);\n\t\t\t\texpanded.set(points.data[attribute], elementsPerPoint * currentSize);\n\t\t\t\tthis.data[attribute] = expanded;\n\t\t\t}\n\t\t}\n\n\t\tthis.numPoints = newSize;\n\n\t\tthis.boundingBox.union(points.boundingBox);\n\t}\n}","/**\n *\n * code adapted from three.js BoxHelper.js\n * https://github.com/mrdoob/three.js/blob/dev/src/helpers/BoxHelper.js\n *\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / http://github.com/Mugen87\n * @author mschuetz / http://potree.org\n */\n\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nexport class Box3Helper extends THREE.LineSegments {\n\tconstructor (box, color) {\n\t\tif (color === undefined) color = 0xffff00;\n\n\t\tlet indices = new Uint16Array([ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ]);\n\t\tlet positions = new Float32Array([\n\t\t\tbox.min.x, box.min.y, box.min.z,\n\t\t\tbox.max.x, box.min.y, box.min.z,\n\t\t\tbox.max.x, box.min.y, box.max.z,\n\t\t\tbox.min.x, box.min.y, box.max.z,\n\t\t\tbox.min.x, box.max.y, box.min.z,\n\t\t\tbox.max.x, box.max.y, box.min.z,\n\t\t\tbox.max.x, box.max.y, box.max.z,\n\t\t\tbox.min.x, box.max.y, box.max.z\n\t\t]);\n\n\t\tlet geometry = new THREE.BufferGeometry();\n\t\tgeometry.setIndex(new THREE.BufferAttribute(indices, 1));\n\t\tgeometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n\n\t\tlet material = new THREE.LineBasicMaterial({ color: color });\n\n\t\tsuper(geometry, material);\n\t}\n}\n","\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\nimport {ClipTask, ClipMethod} from \"./defines.js\";\nimport {Box3Helper} from \"./utils/Box3Helper.js\";\n\nexport function updatePointClouds(pointclouds, camera, renderer){\n\n\tfor (let pointcloud of pointclouds) {\n\t\tlet start = performance.now();\n\n\t\tfor (let profileRequest of pointcloud.profileRequests) {\n\t\t\tprofileRequest.update();\n\n\t\t\tlet duration = performance.now() - start;\n\t\t\tif(duration > 5){\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tlet duration = performance.now() - start;\n\t}\n\n\tlet result = updateVisibility(pointclouds, camera, renderer);\n\n\tfor (let pointcloud of pointclouds) {\n\t\tpointcloud.updateMaterial(pointcloud.material, pointcloud.visibleNodes, camera, renderer);\n\t\tpointcloud.updateVisibleBounds();\n\t}\n\n\texports.lru.freeMemory();\n\n\treturn result;\n};\n\n\n\nexport function updateVisibilityStructures(pointclouds, camera, renderer) {\n\tlet frustums = [];\n\tlet camObjPositions = [];\n\tlet priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; });\n\n\tfor (let i = 0; i < pointclouds.length; i++) {\n\t\tlet pointcloud = pointclouds[i];\n\n\t\tif (!pointcloud.initialized()) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tpointcloud.numVisibleNodes = 0;\n\t\tpointcloud.numVisiblePoints = 0;\n\t\tpointcloud.deepestVisibleLevel = 0;\n\t\tpointcloud.visibleNodes = [];\n\t\tpointcloud.visibleGeometry = [];\n\n\t\t// frustum in object space\n\t\tcamera.updateMatrixWorld();\n\t\tlet frustum = new THREE.Frustum();\n\t\tlet viewI = camera.matrixWorldInverse;\n\t\tlet world = pointcloud.matrixWorld;\n\t\t\n\t\t// use close near plane for frustum intersection\n\t\tlet frustumCam = camera.clone();\n\t\tfrustumCam.near = Math.min(camera.near, 0.1);\n\t\tfrustumCam.updateProjectionMatrix();\n\t\tlet proj = camera.projectionMatrix;\n\n\t\tlet fm = new THREE.Matrix4().multiply(proj).multiply(viewI).multiply(world);\n\t\tfrustum.setFromProjectionMatrix(fm);\n\t\tfrustums.push(frustum);\n\n\t\t// camera position in object space\n\t\tlet view = camera.matrixWorld;\n\t\tlet worldI = world.clone().invert();\n\t\tlet camMatrixObject = new THREE.Matrix4().multiply(worldI).multiply(view);\n\t\tlet camObjPos = new THREE.Vector3().setFromMatrixPosition(camMatrixObject);\n\t\tcamObjPositions.push(camObjPos);\n\n\t\tif (pointcloud.visible && pointcloud.root !== null) {\n\t\t\tpriorityQueue.push({pointcloud: i, node: pointcloud.root, weight: Number.MAX_VALUE});\n\t\t}\n\n\t\t// hide all previously visible nodes\n\t\t// if(pointcloud.root instanceof PointCloudOctreeNode){\n\t\t//\tpointcloud.hideDescendants(pointcloud.root.sceneNode);\n\t\t// }\n\t\tif (pointcloud.root.isTreeNode()) {\n\t\t\tpointcloud.hideDescendants(pointcloud.root.sceneNode);\n\t\t}\n\n\t\tfor (let j = 0; j < pointcloud.boundingBoxNodes.length; j++) {\n\t\t\tpointcloud.boundingBoxNodes[j].visible = false;\n\t\t}\n\t}\n\n\treturn {\n\t\t'frustums': frustums,\n\t\t'camObjPositions': camObjPositions,\n\t\t'priorityQueue': priorityQueue\n\t};\n};\n\n\nexport function updateVisibility(pointclouds, camera, renderer){\n\n\tlet numVisibleNodes = 0;\n\tlet numVisiblePoints = 0;\n\n\tlet numVisiblePointsInPointclouds = new Map(pointclouds.map(pc => [pc, 0]));\n\n\tlet visibleNodes = [];\n\tlet visibleGeometry = [];\n\tlet unloadedGeometry = [];\n\n\tlet lowestSpacing = Infinity;\n\n\t// calculate object space frustum and cam pos and setup priority queue\n\tlet s = updateVisibilityStructures(pointclouds, camera, renderer);\n\tlet frustums = s.frustums;\n\tlet camObjPositions = s.camObjPositions;\n\tlet priorityQueue = s.priorityQueue;\n\n\tlet loadedToGPUThisFrame = 0;\n\t\n\tlet domWidth = renderer.domElement.clientWidth;\n\tlet domHeight = renderer.domElement.clientHeight;\n\n\t// check if pointcloud has been transformed\n\t// some code will only be executed if changes have been detected\n\tif(!Potree._pointcloudTransformVersion){\n\t\tPotree._pointcloudTransformVersion = new Map();\n\t}\n\tlet pointcloudTransformVersion = Potree._pointcloudTransformVersion;\n\tfor(let pointcloud of pointclouds){\n\n\t\tif(!pointcloud.visible){\n\t\t\tcontinue;\n\t\t}\n\n\t\tpointcloud.updateMatrixWorld();\n\n\t\tif(!pointcloudTransformVersion.has(pointcloud)){\n\t\t\tpointcloudTransformVersion.set(pointcloud, {number: 0, transform: pointcloud.matrixWorld.clone()});\n\t\t}else{\n\t\t\tlet version = pointcloudTransformVersion.get(pointcloud);\n\n\t\t\tif(!version.transform.equals(pointcloud.matrixWorld)){\n\t\t\t\tversion.number++;\n\t\t\t\tversion.transform.copy(pointcloud.matrixWorld);\n\n\t\t\t\tpointcloud.dispatchEvent({\n\t\t\t\t\ttype: \"transformation_changed\",\n\t\t\t\t\ttarget: pointcloud\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\twhile (priorityQueue.size() > 0) {\n\t\tlet element = priorityQueue.pop();\n\t\tlet node = element.node;\n\t\tlet parent = element.parent;\n\t\tlet pointcloud = pointclouds[element.pointcloud];\n\n\t\t// { // restrict to certain nodes for debugging\n\t\t//\tlet allowedNodes = [\"r\", \"r0\", \"r4\"];\n\t\t//\tif(!allowedNodes.includes(node.name)){\n\t\t//\t\tcontinue;\n\t\t//\t}\n\t\t// }\n\n\t\tlet box = node.getBoundingBox();\n\t\tlet frustum = frustums[element.pointcloud];\n\t\tlet camObjPos = camObjPositions[element.pointcloud];\n\n\t\tlet insideFrustum = frustum.intersectsBox(box);\n\t\tlet maxLevel = pointcloud.maxLevel || Infinity;\n\t\tlet level = node.getLevel();\n\t\tlet visible = insideFrustum;\n\t\tvisible = visible && !(numVisiblePoints + node.getNumPoints() > Potree.pointBudget);\n\t\tvisible = visible && !(numVisiblePointsInPointclouds.get(pointcloud) + node.getNumPoints() > pointcloud.pointBudget);\n\t\tvisible = visible && level < maxLevel;\n\t\tvisible = visible || node.getLevel() <= 2;\n\n\t\tlet clipBoxes = pointcloud.material.clipBoxes;\n\t\tif(true && clipBoxes.length > 0){\n\n\t\t\t//node.debug = false;\n\n\t\t\tlet numIntersecting = 0;\n\t\t\tlet numIntersectionVolumes = 0;\n\n\t\t\t//if(node.name === \"r60\"){\n\t\t\t//\tvar a = 10;\n\t\t\t//}\n\n\t\t\tfor(let clipBox of clipBoxes){\n\n\t\t\t\tlet pcWorldInverse = pointcloud.matrixWorld.clone().invert();\n\t\t\t\tlet toPCObject = pcWorldInverse.multiply(clipBox.box.matrixWorld);\n\n\t\t\t\tlet px = new THREE.Vector3(+0.5, 0, 0).applyMatrix4(pcWorldInverse);\n\t\t\t\tlet nx = new THREE.Vector3(-0.5, 0, 0).applyMatrix4(pcWorldInverse);\n\t\t\t\tlet py = new THREE.Vector3(0, +0.5, 0).applyMatrix4(pcWorldInverse);\n\t\t\t\tlet ny = new THREE.Vector3(0, -0.5, 0).applyMatrix4(pcWorldInverse);\n\t\t\t\tlet pz = new THREE.Vector3(0, 0, +0.5).applyMatrix4(pcWorldInverse);\n\t\t\t\tlet nz = new THREE.Vector3(0, 0, -0.5).applyMatrix4(pcWorldInverse);\n\n\t\t\t\tlet pxN = new THREE.Vector3().subVectors(nx, px).normalize();\n\t\t\t\tlet nxN = pxN.clone().multiplyScalar(-1);\n\t\t\t\tlet pyN = new THREE.Vector3().subVectors(ny, py).normalize();\n\t\t\t\tlet nyN = pyN.clone().multiplyScalar(-1);\n\t\t\t\tlet pzN = new THREE.Vector3().subVectors(nz, pz).normalize();\n\t\t\t\tlet nzN = pzN.clone().multiplyScalar(-1);\n\n\t\t\t\tlet pxPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(pxN, px);\n\t\t\t\tlet nxPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(nxN, nx);\n\t\t\t\tlet pyPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(pyN, py);\n\t\t\t\tlet nyPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(nyN, ny);\n\t\t\t\tlet pzPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(pzN, pz);\n\t\t\t\tlet nzPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(nzN, nz);\n\n\t\t\t\t//if(window.debugdraw !== undefined && window.debugdraw === true && node.name === \"r60\"){\n\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, pxPlane, 1, 0xFF0000);\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, nxPlane, 1, 0x990000);\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, pyPlane, 1, 0x00FF00);\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, nyPlane, 1, 0x009900);\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, pzPlane, 1, 0x0000FF);\n\t\t\t\t//\tPotree.utils.debugPlane(viewer.scene.scene, nzPlane, 1, 0x000099);\n\n\t\t\t\t//\tPotree.utils.debugBox(viewer.scene.scene, box, new THREE.Matrix4(), 0x00FF00);\n\t\t\t\t//\tPotree.utils.debugBox(viewer.scene.scene, box, pointcloud.matrixWorld, 0xFF0000);\n\t\t\t\t//\tPotree.utils.debugBox(viewer.scene.scene, clipBox.box.boundingBox, clipBox.box.matrixWorld, 0xFF0000);\n\n\t\t\t\t//\twindow.debugdraw = false;\n\t\t\t\t//}\n\n\t\t\t\tlet frustum = new THREE.Frustum(pxPlane, nxPlane, pyPlane, nyPlane, pzPlane, nzPlane);\n\t\t\t\tlet intersects = frustum.intersectsBox(box);\n\n\t\t\t\tif(intersects){\n\t\t\t\t\tnumIntersecting++;\n\t\t\t\t}\n\t\t\t\tnumIntersectionVolumes++;\n\t\t\t}\n\n\t\t\tlet insideAny = numIntersecting > 0;\n\t\t\tlet insideAll = numIntersecting === numIntersectionVolumes;\n\n\t\t\tif(pointcloud.material.clipTask === ClipTask.SHOW_INSIDE){\n\t\t\t\tif(pointcloud.material.clipMethod === ClipMethod.INSIDE_ANY && insideAny){\n\t\t\t\t\t//node.debug = true\n\t\t\t\t}else if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ALL && insideAll){\n\t\t\t\t\t//node.debug = true;\n\t\t\t\t}else{\n\t\t\t\t\tvisible = false;\n\t\t\t\t}\n\t\t\t} else if(pointcloud.material.clipTask === ClipTask.SHOW_OUTSIDE){\n\t\t\t\t//if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ANY && !insideAny){\n\t\t\t\t//\t//visible = true;\n\t\t\t\t//\tlet a = 10;\n\t\t\t\t//}else if(pointcloud.material.clipMethod === ClipMethod.INSIDE_ALL && !insideAll){\n\t\t\t\t//\t//visible = true;\n\t\t\t\t//\tlet a = 20;\n\t\t\t\t//}else{\n\t\t\t\t//\tvisible = false;\n\t\t\t\t//}\n\t\t\t}\n\t\t\t\n\n\t\t}\n\n\t\t// visible = [\"r\", \"r0\", \"r06\", \"r060\"].includes(node.name);\n\t\t// visible = [\"r\"].includes(node.name);\n\n\t\tif (node.spacing) {\n\t\t\tlowestSpacing = Math.min(lowestSpacing, node.spacing);\n\t\t} else if (node.geometryNode && node.geometryNode.spacing) {\n\t\t\tlowestSpacing = Math.min(lowestSpacing, node.geometryNode.spacing);\n\t\t}\n\n\t\tif (numVisiblePoints + node.getNumPoints() > Potree.pointBudget) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (!visible) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TODO: not used, same as the declaration?\n\t\t// numVisibleNodes++;\n\t\tnumVisiblePoints += node.getNumPoints();\n\t\tlet numVisiblePointsInPointcloud = numVisiblePointsInPointclouds.get(pointcloud);\n\t\tnumVisiblePointsInPointclouds.set(pointcloud, numVisiblePointsInPointcloud + node.getNumPoints());\n\n\t\tpointcloud.numVisibleNodes++;\n\t\tpointcloud.numVisiblePoints += node.getNumPoints();\n\n\t\tif (node.isGeometryNode() && (!parent || parent.isTreeNode())) {\n\t\t\tif (node.isLoaded() && loadedToGPUThisFrame < 2) {\n\t\t\t\tnode = pointcloud.toTreeNode(node, parent);\n\t\t\t\tloadedToGPUThisFrame++;\n\t\t\t} else {\n\t\t\t\tunloadedGeometry.push(node);\n\t\t\t\tvisibleGeometry.push(node);\n\t\t\t}\n\t\t}\n\n\t\tif (node.isTreeNode()) {\n\t\t\texports.lru.touch(node.geometryNode);\n\t\t\tnode.sceneNode.visible = true;\n\t\t\tnode.sceneNode.material = pointcloud.material;\n\n\t\t\tvisibleNodes.push(node);\n\t\t\tpointcloud.visibleNodes.push(node);\n\n\t\t\tif(node._transformVersion === undefined){\n\t\t\t\tnode._transformVersion = -1;\n\t\t\t}\n\t\t\tlet transformVersion = pointcloudTransformVersion.get(pointcloud);\n\t\t\tif(node._transformVersion !== transformVersion.number){\n\t\t\t\tnode.sceneNode.updateMatrix();\n\t\t\t\tnode.sceneNode.matrixWorld.multiplyMatrices(pointcloud.matrixWorld, node.sceneNode.matrix);\t\n\t\t\t\tnode._transformVersion = transformVersion.number;\n\t\t\t}\n\n\t\t\tif (pointcloud.showBoundingBox && !node.boundingBoxNode && node.getBoundingBox) {\n\t\t\t\tlet boxHelper = new Box3Helper(node.getBoundingBox());\n\t\t\t\tboxHelper.matrixAutoUpdate = false;\n\t\t\t\tpointcloud.boundingBoxNodes.push(boxHelper);\n\t\t\t\tnode.boundingBoxNode = boxHelper;\n\t\t\t\tnode.boundingBoxNode.matrix.copy(pointcloud.matrixWorld);\n\t\t\t} else if (pointcloud.showBoundingBox) {\n\t\t\t\tnode.boundingBoxNode.visible = true;\n\t\t\t\tnode.boundingBoxNode.matrix.copy(pointcloud.matrixWorld);\n\t\t\t} else if (!pointcloud.showBoundingBox && node.boundingBoxNode) {\n\t\t\t\tnode.boundingBoxNode.visible = false;\n\t\t\t}\n\n\t\t\t// if(node.boundingBoxNode !== undefined && exports.debug.allowedNodes !== undefined){\n\t\t\t// \tif(!exports.debug.allowedNodes.includes(node.name)){\n\t\t\t// \t\tnode.boundingBoxNode.visible = false;\n\t\t\t// \t}\n\t\t\t// }\n\t\t}\n\n\t\t// add child nodes to priorityQueue\n\t\tlet children = node.getChildren();\n\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\tlet child = children[i];\n\n\t\t\tlet weight = 0; \n\t\t\tif(camera.isPerspectiveCamera){\n\t\t\t\tlet sphere = child.getBoundingSphere();\n\t\t\t\tlet center = sphere.center;\n\t\t\t\t//let distance = sphere.center.distanceTo(camObjPos);\n\t\t\t\t\n\t\t\t\tlet dx = camObjPos.x - center.x;\n\t\t\t\tlet dy = camObjPos.y - center.y;\n\t\t\t\tlet dz = camObjPos.z - center.z;\n\t\t\t\t\n\t\t\t\tlet dd = dx * dx + dy * dy + dz * dz;\n\t\t\t\tlet distance = Math.sqrt(dd);\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tlet radius = sphere.radius;\n\t\t\t\t\n\t\t\t\tlet fov = (camera.fov * Math.PI) / 180;\n\t\t\t\tlet slope = Math.tan(fov / 2);\n\t\t\t\tlet projFactor = (0.5 * domHeight) / (slope * distance);\n\t\t\t\tlet screenPixelRadius = radius * projFactor;\n\t\t\t\t\n\t\t\t\tif(screenPixelRadius < pointcloud.minimumNodePixelSize){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\n\t\t\t\tweight = screenPixelRadius;\n\n\t\t\t\tif(distance - radius < 0){\n\t\t\t\t\tweight = Number.MAX_VALUE;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// TODO ortho visibility\n\t\t\t\tlet bb = child.getBoundingBox();\t\t\t\t\n\t\t\t\tlet distance = child.getBoundingSphere().center.distanceTo(camObjPos);\n\t\t\t\tlet diagonal = bb.max.clone().sub(bb.min).length();\n\t\t\t\t//weight = diagonal / distance;\n\n\t\t\t\tweight = diagonal;\n\t\t\t}\n\n\t\t\tpriorityQueue.push({pointcloud: element.pointcloud, node: child, parent: node, weight: weight});\n\t\t}\n\t}// end priority queue loop\n\n\t{ // update DEM\n\t\tlet maxDEMLevel = 4;\n\t\tlet candidates = pointclouds\n\t\t\t.filter(p => (p.generateDEM && p.dem instanceof Potree.DEM));\n\t\tfor (let pointcloud of candidates) {\n\t\t\tlet updatingNodes = pointcloud.visibleNodes.filter(n => n.getLevel() <= maxDEMLevel);\n\t\t\tpointcloud.dem.update(updatingNodes);\n\t\t}\n\t}\n\n\tfor (let i = 0; i < Math.min(Potree.maxNodesLoading, unloadedGeometry.length); i++) {\n\t\tunloadedGeometry[i].load();\n\t}\n\n\treturn {\n\t\tvisibleNodes: visibleNodes,\n\t\tnumVisiblePoints: numVisiblePoints,\n\t\tlowestSpacing: lowestSpacing\n\t};\n};\n\n","\n\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {PointCloudTree, PointCloudTreeNode} from \"../PointCloudTree.js\";\nimport {PointCloudMaterial} from \"../materials/PointCloudMaterial.js\";\nimport {PointSizeType, ClipTask, TreeType} from \"../defines.js\";\nimport {Utils} from \"../utils.js\";\n\n\n\nexport class PointCloudArena4DNode extends PointCloudTreeNode {\n\tconstructor () {\n\t\tsuper();\n\n\t\tthis.left = null;\n\t\tthis.right = null;\n\t\tthis.sceneNode = null;\n\t\tthis.kdtree = null;\n\t}\n\n\tgetNumPoints () {\n\t\treturn this.geometryNode.numPoints;\n\t}\n\n\tisLoaded () {\n\t\treturn true;\n\t}\n\n\tisTreeNode () {\n\t\treturn true;\n\t}\n\n\tisGeometryNode () {\n\t\treturn false;\n\t}\n\n\tgetLevel () {\n\t\treturn this.geometryNode.level;\n\t}\n\n\tgetBoundingSphere () {\n\t\treturn this.geometryNode.boundingSphere;\n\t}\n\n\tgetBoundingBox () {\n\t\treturn this.geometryNode.boundingBox;\n\t}\n\n\ttoTreeNode (child) {\n\t\tlet geometryNode = null;\n\n\t\tif (this.left === child) {\n\t\t\tgeometryNode = this.left;\n\t\t} else if (this.right === child) {\n\t\t\tgeometryNode = this.right;\n\t\t}\n\n\t\tif (!geometryNode.loaded) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet node = new PointCloudArena4DNode();\n\t\tlet sceneNode = THREE.PointCloud(geometryNode.geometry, this.kdtree.material);\n\t\tsceneNode.visible = false;\n\n\t\tnode.kdtree = this.kdtree;\n\t\tnode.geometryNode = geometryNode;\n\t\tnode.sceneNode = sceneNode;\n\t\tnode.parent = this;\n\t\tnode.left = this.geometryNode.left;\n\t\tnode.right = this.geometryNode.right;\n\t}\n\n\tgetChildren () {\n\t\tlet children = [];\n\n\t\tif (this.left) {\n\t\t\tchildren.push(this.left);\n\t\t}\n\n\t\tif (this.right) {\n\t\t\tchildren.push(this.right);\n\t\t}\n\n\t\treturn children;\n\t}\n};\n\nexport class PointCloudArena4D extends PointCloudTree{\n\tconstructor (geometry) {\n\t\tsuper();\n\n\t\tthis.root = null;\n\t\tif (geometry.root) {\n\t\t\tthis.root = geometry.root;\n\t\t} else {\n\t\t\tgeometry.addEventListener('hierarchy_loaded', () => {\n\t\t\t\tthis.root = geometry.root;\n\t\t\t});\n\t\t}\n\n\t\tthis.visiblePointsTarget = 2 * 1000 * 1000;\n\t\tthis.minimumNodePixelSize = 150;\n\n\t\tthis.position.sub(geometry.offset);\n\t\tthis.updateMatrix();\n\n\t\tthis.numVisibleNodes = 0;\n\t\tthis.numVisiblePoints = 0;\n\n\t\tthis.boundingBoxNodes = [];\n\t\tthis.loadQueue = [];\n\t\tthis.visibleNodes = [];\n\n\t\tthis.pcoGeometry = geometry;\n\t\tthis.boundingBox = this.pcoGeometry.boundingBox;\n\t\tthis.boundingSphere = this.pcoGeometry.boundingSphere;\n\t\tthis.material = new PointCloudMaterial({vertexColors: THREE.VertexColors, size: 0.05, treeType: TreeType.KDTREE});\n\t\tthis.material.sizeType = PointSizeType.ATTENUATED;\n\t\tthis.material.size = 0.05;\n\t\tthis.profileRequests = [];\n\t\tthis.name = '';\n\t}\n\n\tgetBoundingBoxWorld () {\n\t\tthis.updateMatrixWorld(true);\n\t\tlet box = this.boundingBox;\n\t\tlet transform = this.matrixWorld;\n\t\tlet tBox = Utils.computeTransformedBoundingBox(box, transform);\n\n\t\treturn tBox;\n\t};\n\n\tsetName (name) {\n\t\tif (this.name !== name) {\n\t\t\tthis.name = name;\n\t\t\tthis.dispatchEvent({type: 'name_changed', name: name, pointcloud: this});\n\t\t}\n\t}\n\n\tgetName () {\n\t\treturn this.name;\n\t}\n\n\tgetLevel () {\n\t\treturn this.level;\n\t}\n\n\ttoTreeNode (geometryNode, parent) {\n\t\tlet node = new PointCloudArena4DNode();\n\t\tlet sceneNode = new THREE.Points(geometryNode.geometry, this.material);\n\n\t\tsceneNode.frustumCulled = false;\n\t\tsceneNode.onBeforeRender = (_this, scene, camera, geometry, material, group) => {\n\t\t\tif (material.program) {\n\t\t\t\t_this.getContext().useProgram(material.program.program);\n\n\t\t\t\tif (material.program.getUniforms().map.level) {\n\t\t\t\t\tlet level = geometryNode.getLevel();\n\t\t\t\t\tmaterial.uniforms.level.value = level;\n\t\t\t\t\tmaterial.program.getUniforms().map.level.setValue(_this.getContext(), level);\n\t\t\t\t}\n\n\t\t\t\tif (this.visibleNodeTextureOffsets && material.program.getUniforms().map.vnStart) {\n\t\t\t\t\tlet vnStart = this.visibleNodeTextureOffsets.get(node);\n\t\t\t\t\tmaterial.uniforms.vnStart.value = vnStart;\n\t\t\t\t\tmaterial.program.getUniforms().map.vnStart.setValue(_this.getContext(), vnStart);\n\t\t\t\t}\n\n\t\t\t\tif (material.program.getUniforms().map.pcIndex) {\n\t\t\t\t\tlet i = node.pcIndex ? node.pcIndex : this.visibleNodes.indexOf(node);\n\t\t\t\t\tmaterial.uniforms.pcIndex.value = i;\n\t\t\t\t\tmaterial.program.getUniforms().map.pcIndex.setValue(_this.getContext(), i);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tnode.geometryNode = geometryNode;\n\t\tnode.sceneNode = sceneNode;\n\t\tnode.pointcloud = this;\n\t\tnode.left = geometryNode.left;\n\t\tnode.right = geometryNode.right;\n\n\t\tif (!parent) {\n\t\t\tthis.root = node;\n\t\t\tthis.add(sceneNode);\n\t\t} else {\n\t\t\tparent.sceneNode.add(sceneNode);\n\n\t\t\tif (parent.left === geometryNode) {\n\t\t\t\tparent.left = node;\n\t\t\t} else if (parent.right === geometryNode) {\n\t\t\t\tparent.right = node;\n\t\t\t}\n\t\t}\n\n\t\tlet disposeListener = function () {\n\t\t\tparent.sceneNode.remove(node.sceneNode);\n\n\t\t\tif (parent.left === node) {\n\t\t\t\tparent.left = geometryNode;\n\t\t\t} else if (parent.right === node) {\n\t\t\t\tparent.right = geometryNode;\n\t\t\t}\n\t\t};\n\t\tgeometryNode.oneTimeDisposeHandlers.push(disposeListener);\n\n\t\treturn node;\n\t}\n\n\tupdateMaterial (material, visibleNodes, camera, renderer) {\n\t\tmaterial.fov = camera.fov * (Math.PI / 180);\n\t\tmaterial.screenWidth = renderer.domElement.clientWidth;\n\t\tmaterial.screenHeight = renderer.domElement.clientHeight;\n\t\tmaterial.spacing = this.pcoGeometry.spacing;\n\t\tmaterial.near = camera.near;\n\t\tmaterial.far = camera.far;\n\n\t\t// reduce shader source updates by setting maxLevel slightly higher than actually necessary\n\t\tif (this.maxLevel > material.levels) {\n\t\t\tmaterial.levels = this.maxLevel + 2;\n\t\t}\n\n\t\t// material.uniforms.octreeSize.value = this.boundingBox.size().x;\n\t\tlet bbSize = this.boundingBox.getSize(new THREE.Vector3());\n\t\tmaterial.bbSize = [bbSize.x, bbSize.y, bbSize.z];\n\t}\n\n\tupdateVisibleBounds () {\n\n\t}\n\n\thideDescendants (object) {\n\t\tlet stack = [];\n\t\tfor (let i = 0; i < object.children.length; i++) {\n\t\t\tlet child = object.children[i];\n\t\t\tif (child.visible) {\n\t\t\t\tstack.push(child);\n\t\t\t}\n\t\t}\n\n\t\twhile (stack.length > 0) {\n\t\t\tlet child = stack.shift();\n\n\t\t\tchild.visible = false;\n\t\t\tif (child.boundingBoxNode) {\n\t\t\t\tchild.boundingBoxNode.visible = false;\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < child.children.length; i++) {\n\t\t\t\tlet childOfChild = child.children[i];\n\t\t\t\tif (childOfChild.visible) {\n\t\t\t\t\tstack.push(childOfChild);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateMatrixWorld (force) {\n\t\t// node.matrixWorld.multiplyMatrices( node.parent.matrixWorld, node.matrix );\n\n\t\tif (this.matrixAutoUpdate === true) this.updateMatrix();\n\n\t\tif (this.matrixWorldNeedsUpdate === true || force === true) {\n\t\t\tif (this.parent === undefined) {\n\t\t\t\tthis.matrixWorld.copy(this.matrix);\n\t\t\t} else {\n\t\t\t\tthis.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix);\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\t\t}\n\t}\n\n\tnodesOnRay (nodes, ray) {\n\t\tlet nodesOnRay = [];\n\n\t\tlet _ray = ray.clone();\n\t\tfor (let i = 0; i < nodes.length; i++) {\n\t\t\tlet node = nodes[i];\n\t\t\tlet sphere = node.getBoundingSphere().clone().applyMatrix4(node.sceneNode.matrixWorld);\n\t\t\t// TODO Unused: let box = node.getBoundingBox().clone().applyMatrix4(node.sceneNode.matrixWorld);\n\n\t\t\tif (_ray.intersectsSphere(sphere)) {\n\t\t\t\tnodesOnRay.push(node);\n\t\t\t}\n\t\t\t// if(_ray.isIntersectionBox(box)){\n\t\t\t//\tnodesOnRay.push(node);\n\t\t\t// }\n\t\t}\n\n\t\treturn nodesOnRay;\n\t}\n\n\tpick(viewer, camera, ray, params = {}){\n\n\t\tlet renderer = viewer.renderer;\n\t\tlet pRenderer = viewer.pRenderer;\n\n\t\tperformance.mark(\"pick-start\");\n\n\t\tlet getVal = (a, b) => a !== undefined ? a : b;\n\n\t\tlet pickWindowSize = getVal(params.pickWindowSize, 17);\n\t\tlet pickOutsideClipRegion = getVal(params.pickOutsideClipRegion, false);\n\n\t\tlet size = renderer.getSize(new THREE.Vector2());\n\n\t\tlet width = Math.ceil(getVal(params.width, size.width));\n\t\tlet height = Math.ceil(getVal(params.height, size.height));\n\n\t\tlet pointSizeType = getVal(params.pointSizeType, this.material.pointSizeType);\n\t\tlet pointSize = getVal(params.pointSize, this.material.size);\n\n\t\tlet nodes = this.nodesOnRay(this.visibleNodes, ray);\n\n\t\tif (nodes.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (!this.pickState) {\n\t\t\tlet scene = new THREE.Scene();\n\n\t\t\tlet material = new PointCloudMaterial();\n\t\t\tmaterial.activeAttributeName = \"indices\";\n\n\t\t\tlet renderTarget = new THREE.WebGLRenderTarget(\n\t\t\t\t1, 1,\n\t\t\t\t{ minFilter: THREE.LinearFilter,\n\t\t\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\t\t\tformat: THREE.RGBAFormat }\n\t\t\t);\n\n\t\t\tthis.pickState = {\n\t\t\t\trenderTarget: renderTarget,\n\t\t\t\tmaterial: material,\n\t\t\t\tscene: scene\n\t\t\t};\n\t\t};\n\n\t\tlet pickState = this.pickState;\n\t\tlet pickMaterial = pickState.material;\n\n\t\t{ // update pick material\n\t\t\tpickMaterial.pointSizeType = pointSizeType;\n\t\t\tpickMaterial.shape = this.material.shape;\n\n\t\t\tpickMaterial.size = pointSize;\n\t\t\tpickMaterial.uniforms.minSize.value = this.material.uniforms.minSize.value;\n\t\t\tpickMaterial.uniforms.maxSize.value = this.material.uniforms.maxSize.value;\n\t\t\tpickMaterial.classification = this.material.classification;\n\t\t\tif(params.pickClipped){\n\t\t\t\tpickMaterial.clipBoxes = this.material.clipBoxes;\n\t\t\t\tif(this.material.clipTask === ClipTask.HIGHLIGHT){\n\t\t\t\t\tpickMaterial.clipTask = ClipTask.NONE;\n\t\t\t\t}else{\n\t\t\t\t\tpickMaterial.clipTask = this.material.clipTask;\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tpickMaterial.clipBoxes = [];\n\t\t\t}\n\t\t\t\n\t\t\tthis.updateMaterial(pickMaterial, nodes, camera, renderer);\n\t\t}\n\n\t\tpickState.renderTarget.setSize(width, height);\n\n\t\tlet pixelPos = new THREE.Vector2(params.x, params.y);\n\t\t\n\t\tlet gl = renderer.getContext();\n\t\tgl.enable(gl.SCISSOR_TEST);\n\t\tgl.scissor(\n\t\t\tparseInt(pixelPos.x - (pickWindowSize - 1) / 2),\n\t\t\tparseInt(pixelPos.y - (pickWindowSize - 1) / 2),\n\t\t\tparseInt(pickWindowSize), parseInt(pickWindowSize));\n\n\n\t\trenderer.state.buffers.depth.setTest(pickMaterial.depthTest);\n\t\trenderer.state.buffers.depth.setMask(pickMaterial.depthWrite);\n\t\trenderer.state.setBlending(THREE.NoBlending);\n\n\t\trenderer.clearTarget(pickState.renderTarget, true, true, true);\n\n\t\t{ // RENDER\n\t\t\trenderer.setRenderTarget(pickState.renderTarget);\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\trenderer.clearTarget( pickState.renderTarget, true, true, true );\n\t\t\t\n\t\t\tlet tmp = this.material;\n\t\t\tthis.material = pickMaterial;\n\t\t\t\n\t\t\tpRenderer.renderOctree(this, nodes, camera, pickState.renderTarget);\n\t\t\t\n\t\t\tthis.material = tmp;\n\t\t}\n\n\t\tlet clamp = (number, min, max) => Math.min(Math.max(min, number), max);\n\n\t\tlet x = parseInt(clamp(pixelPos.x - (pickWindowSize - 1) / 2, 0, width));\n\t\tlet y = parseInt(clamp(pixelPos.y - (pickWindowSize - 1) / 2, 0, height));\n\t\tlet w = parseInt(Math.min(x + pickWindowSize, width) - x);\n\t\tlet h = parseInt(Math.min(y + pickWindowSize, height) - y);\n\n\t\tlet pixelCount = w * h;\n\t\tlet buffer = new Uint8Array(4 * pixelCount);\n\t\t\n\t\tgl.readPixels(x, y, pickWindowSize, pickWindowSize, gl.RGBA, gl.UNSIGNED_BYTE, buffer); \n\t\t\n\t\trenderer.setRenderTarget(null);\n\t\trenderer.state.reset();\n\t\trenderer.setScissorTest(false);\n\t\tgl.disable(gl.SCISSOR_TEST);\n\t\t\n\t\tlet pixels = buffer;\n\t\tlet ibuffer = new Uint32Array(buffer.buffer);\n\n\t\t// find closest hit inside pixelWindow boundaries\n\t\tlet min = Number.MAX_VALUE;\n\t\tlet hits = [];\n\t\tfor (let u = 0; u < pickWindowSize; u++) {\n\t\t\tfor (let v = 0; v < pickWindowSize; v++) {\n\t\t\t\tlet offset = (u + v * pickWindowSize);\n\t\t\t\tlet distance = Math.pow(u - (pickWindowSize - 1) / 2, 2) + Math.pow(v - (pickWindowSize - 1) / 2, 2);\n\n\t\t\t\tlet pcIndex = pixels[4 * offset + 3];\n\t\t\t\tpixels[4 * offset + 3] = 0;\n\t\t\t\tlet pIndex = ibuffer[offset];\n\n\t\t\t\tif(!(pcIndex === 0 && pIndex === 0) && (pcIndex !== undefined) && (pIndex !== undefined)){\n\t\t\t\t\tlet hit = {\n\t\t\t\t\t\tpIndex: pIndex,\n\t\t\t\t\t\tpcIndex: pcIndex,\n\t\t\t\t\t\tdistanceToCenter: distance\n\t\t\t\t\t};\n\n\t\t\t\t\tif(params.all){\n\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tif(hits.length > 0){\n\t\t\t\t\t\t\tif(distance < hits[0].distanceToCenter){\n\t\t\t\t\t\t\t\thits[0] = hit;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\n\t\tfor(let hit of hits){\n\t\t\tlet point = {};\n\t\t\n\t\t\tif (!nodes[hit.pcIndex]) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\n\t\t\tlet node = nodes[hit.pcIndex];\n\t\t\tlet pc = node.sceneNode;\n\t\t\tlet geometry = node.geometryNode.geometry;\n\t\t\t\n\t\t\tfor(let attributeName in geometry.attributes){\n\t\t\t\tlet attribute = geometry.attributes[attributeName];\n\t\t\n\t\t\t\tif (attributeName === 'position') {\n\t\t\t\t\tlet x = attribute.array[3 * hit.pIndex + 0];\n\t\t\t\t\tlet y = attribute.array[3 * hit.pIndex + 1];\n\t\t\t\t\tlet z = attribute.array[3 * hit.pIndex + 2];\n\t\t\t\t\t\n\t\t\t\t\tlet position = new THREE.Vector3(x, y, z);\n\t\t\t\t\tposition.applyMatrix4(pc.matrixWorld);\n\t\t\n\t\t\t\t\tpoint[attributeName] = position;\n\t\t\t\t} else if (attributeName === 'indices') {\n\t\t\n\t\t\t\t} else {\n\t\t\t\t\t//if (values.itemSize === 1) {\n\t\t\t\t\t//\tpoint[attribute.name] = values.array[hit.pIndex];\n\t\t\t\t\t//} else {\n\t\t\t\t\t//\tlet value = [];\n\t\t\t\t\t//\tfor (let j = 0; j < values.itemSize; j++) {\n\t\t\t\t\t//\t\tvalue.push(values.array[values.itemSize * hit.pIndex + j]);\n\t\t\t\t\t//\t}\n\t\t\t\t\t//\tpoint[attribute.name] = value;\n\t\t\t\t\t//}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\n\t\t\thit.point = point;\n\t\t}\n\n\t\tperformance.mark(\"pick-end\");\n\t\tperformance.measure(\"pick\", \"pick-start\", \"pick-end\");\n\n\t\tif(params.all){\n\t\t\treturn hits.map(hit => hit.point);\n\t\t}else{\n\t\t\tif(hits.length === 0){\n\t\t\t\treturn null;\n\t\t\t}else{\n\t\t\t\treturn hits[0].point;\n\t\t\t}\n\t\t}\n\t}\n\n\tcomputeVisibilityTextureData(nodes){\n\n\t\tif(exports.measureTimings) performance.mark(\"computeVisibilityTextureData-start\");\n\n\t\tlet data = new Uint8Array(nodes.length * 3);\n\t\tlet visibleNodeTextureOffsets = new Map();\n\n\t\t// copy array\n\t\tnodes = nodes.slice();\n\n\t\t// sort by level and number\n\t\tlet sort = function (a, b) {\n\t\t\tlet la = a.geometryNode.level;\n\t\t\tlet lb = b.geometryNode.level;\n\t\t\tlet na = a.geometryNode.number;\n\t\t\tlet nb = b.geometryNode.number;\n\t\t\tif (la !== lb) return la - lb;\n\t\t\tif (na < nb) return -1;\n\t\t\tif (na > nb) return 1;\n\t\t\treturn 0;\n\t\t};\n\t\tnodes.sort(sort);\n\n\t\tlet visibleNodeNames = [];\n\t\tfor (let i = 0; i < nodes.length; i++) {\n\t\t\tvisibleNodeNames.push(nodes[i].geometryNode.number);\n\t\t}\n\n\t\tfor (let i = 0; i < nodes.length; i++) {\n\t\t\tlet node = nodes[i];\n\n\t\t\tvisibleNodeTextureOffsets.set(node, i);\n\n\t\t\tlet b1 = 0;\t// children\n\t\t\tlet b2 = 0;\t// offset to first child\n\t\t\tlet b3 = 0;\t// split\n\n\t\t\tif (node.geometryNode.left && visibleNodeNames.indexOf(node.geometryNode.left.number) > 0) {\n\t\t\t\tb1 += 1;\n\t\t\t\tb2 = visibleNodeNames.indexOf(node.geometryNode.left.number) - i;\n\t\t\t}\n\t\t\tif (node.geometryNode.right && visibleNodeNames.indexOf(node.geometryNode.right.number) > 0) {\n\t\t\t\tb1 += 2;\n\t\t\t\tb2 = (b2 === 0) ? visibleNodeNames.indexOf(node.geometryNode.right.number) - i : b2;\n\t\t\t}\n\n\t\t\tif (node.geometryNode.split === 'X') {\n\t\t\t\tb3 = 1;\n\t\t\t} else if (node.geometryNode.split === 'Y') {\n\t\t\t\tb3 = 2;\n\t\t\t} else if (node.geometryNode.split === 'Z') {\n\t\t\t\tb3 = 4;\n\t\t\t}\n\n\t\t\tdata[i * 3 + 0] = b1;\n\t\t\tdata[i * 3 + 1] = b2;\n\t\t\tdata[i * 3 + 2] = b3;\n\t\t}\n\n\t\tif(exports.measureTimings){\n\t\t\tperformance.mark(\"computeVisibilityTextureData-end\");\n\t\t\tperformance.measure(\"render.computeVisibilityTextureData\", \"computeVisibilityTextureData-start\", \"computeVisibilityTextureData-end\");\n\t\t}\n\n\t\treturn {\n\t\t\tdata: data,\n\t\t\toffsets: visibleNodeTextureOffsets\n\t\t};\n\t}\n\n\tget progress () {\n\t\tif (this.pcoGeometry.root) {\n\t\t\treturn exports.numNodesLoading > 0 ? 0 : 1;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n};\n","\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\nimport {PointCloudTree} from \"./PointCloudTree.js\";\nimport {PointCloudOctreeNode} from \"./PointCloudOctree.js\";\nimport {PointCloudArena4DNode} from \"./arena4d/PointCloudArena4D.js\";\nimport {PointSizeType, ClipTask, ElevationGradientRepeat} from \"./defines.js\";\n\n// Copied from three.js: WebGLRenderer.js\nfunction paramThreeToGL(_gl, p) {\n\n\tlet extension;\n\n\tif (p === THREE.RepeatWrapping) return _gl.REPEAT;\n\tif (p === THREE.ClampToEdgeWrapping) return _gl.CLAMP_TO_EDGE;\n\tif (p === THREE.MirroredRepeatWrapping) return _gl.MIRRORED_REPEAT;\n\n\tif (p === THREE.NearestFilter) return _gl.NEAREST;\n\tif (p === THREE.NearestMipMapNearestFilter) return _gl.NEAREST_MIPMAP_NEAREST;\n\tif (p === THREE.NearestMipMapLinearFilter) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\tif (p === THREE.LinearFilter) return _gl.LINEAR;\n\tif (p === THREE.LinearMipMapNearestFilter) return _gl.LINEAR_MIPMAP_NEAREST;\n\tif (p === THREE.LinearMipMapLinearFilter) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\tif (p === THREE.UnsignedByteType) return _gl.UNSIGNED_BYTE;\n\tif (p === THREE.UnsignedShort4444Type) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\tif (p === THREE.UnsignedShort5551Type) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\tif (p === THREE.UnsignedShort565Type) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\tif (p === THREE.ByteType) return _gl.BYTE;\n\tif (p === THREE.ShortType) return _gl.SHORT;\n\tif (p === THREE.UnsignedShortType) return _gl.UNSIGNED_SHORT;\n\tif (p === THREE.IntType) return _gl.INT;\n\tif (p === THREE.UnsignedIntType) return _gl.UNSIGNED_INT;\n\tif (p === THREE.FloatType) return _gl.FLOAT;\n\n\tif (p === THREE.HalfFloatType) {\n\n\t\textension = extensions.get('OES_texture_half_float');\n\n\t\tif (extension !== null) return extension.HALF_FLOAT_OES;\n\n\t}\n\n\tif (p === THREE.AlphaFormat) return _gl.ALPHA;\n\tif (p === THREE.RGBFormat) return _gl.RGB;\n\tif (p === THREE.RGBAFormat) return _gl.RGBA;\n\tif (p === THREE.LuminanceFormat) return _gl.LUMINANCE;\n\tif (p === THREE.LuminanceAlphaFormat) return _gl.LUMINANCE_ALPHA;\n\tif (p === THREE.DepthFormat) return _gl.DEPTH_COMPONENT;\n\tif (p === THREE.DepthStencilFormat) return _gl.DEPTH_STENCIL;\n\n\tif (p === THREE.AddEquation) return _gl.FUNC_ADD;\n\tif (p === THREE.SubtractEquation) return _gl.FUNC_SUBTRACT;\n\tif (p === THREE.ReverseSubtractEquation) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\tif (p === THREE.ZeroFactor) return _gl.ZERO;\n\tif (p === THREE.OneFactor) return _gl.ONE;\n\tif (p === THREE.SrcColorFactor) return _gl.SRC_COLOR;\n\tif (p === THREE.OneMinusSrcColorFactor) return _gl.ONE_MINUS_SRC_COLOR;\n\tif (p === THREE.SrcAlphaFactor) return _gl.SRC_ALPHA;\n\tif (p === THREE.OneMinusSrcAlphaFactor) return _gl.ONE_MINUS_SRC_ALPHA;\n\tif (p === THREE.DstAlphaFactor) return _gl.DST_ALPHA;\n\tif (p === THREE.OneMinusDstAlphaFactor) return _gl.ONE_MINUS_DST_ALPHA;\n\n\tif (p === THREE.DstColorFactor) return _gl.DST_COLOR;\n\tif (p === THREE.OneMinusDstColorFactor) return _gl.ONE_MINUS_DST_COLOR;\n\tif (p === THREE.SrcAlphaSaturateFactor) return _gl.SRC_ALPHA_SATURATE;\n\n\tif (p === THREE.RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\tp === THREE.RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format) {\n\n\t\textension = extensions.get('WEBGL_compressed_texture_s3tc');\n\n\t\tif (extension !== null) {\n\n\t\t\tif (p === THREE.RGB_S3TC_DXT1_Format) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\tif (p === THREE.RGBA_S3TC_DXT1_Format) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\tif (p === THREE.RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\tif (p === THREE.RGBA_S3TC_DXT5_Format) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t}\n\n\t}\n\n\tif (p === THREE.RGB_PVRTC_4BPPV1_Format || p === THREE.RGB_PVRTC_2BPPV1_Format ||\n\t\tp === THREE.RGBA_PVRTC_4BPPV1_Format || p === THREE.RGBA_PVRTC_2BPPV1_Format) {\n\n\t\textension = extensions.get('WEBGL_compressed_texture_pvrtc');\n\n\t\tif (extension !== null) {\n\n\t\t\tif (p === THREE.RGB_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\tif (p === THREE.RGB_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\tif (p === THREE.RGBA_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\tif (p === THREE.RGBA_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t}\n\n\t}\n\n\tif (p === THREE.RGB_ETC1_Format) {\n\n\t\textension = extensions.get('WEBGL_compressed_texture_etc1');\n\n\t\tif (extension !== null) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t}\n\n\tif (p === THREE.MinEquation || p === THREE.MaxEquation) {\n\n\t\textension = extensions.get('EXT_blend_minmax');\n\n\t\tif (extension !== null) {\n\n\t\t\tif (p === THREE.MinEquation) return extension.MIN_EXT;\n\t\t\tif (p === THREE.MaxEquation) return extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tif (p === UnsignedInt248Type) {\n\n\t\textension = extensions.get('WEBGL_depth_texture');\n\n\t\tif (extension !== null) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t}\n\n\treturn 0;\n\n};\n\nlet attributeLocations = {\n\t\"position\": {name: \"position\", location: 0},\n\t\"color\": {name: \"color\", location: 1},\n\t\"rgba\": {name: \"color\", location: 1},\n\t\"intensity\": {name: \"intensity\", location: 2},\n\t\"classification\": {name: \"classification\", location: 3},\n\t\"returnNumber\": {name: \"returnNumber\", location: 4},\n\t\"return number\": {name: \"returnNumber\", location: 4},\n\t\"returns\": {name: \"returnNumber\", location: 4},\n\t\"numberOfReturns\": {name: \"numberOfReturns\", location: 5},\n\t\"number of returns\": {name: \"numberOfReturns\", location: 5},\n\t\"pointSourceID\": {name: \"pointSourceID\", location: 6},\n\t\"source id\": {name: \"pointSourceID\", location: 6},\n\t\"point source id\": {name: \"pointSourceID\", location: 6},\n\t\"indices\": {name: \"indices\", location: 7},\n\t\"normal\": {name: \"normal\", location: 8},\n\t\"spacing\": {name: \"spacing\", location: 9},\n\t\"gps-time\": {name: \"gpsTime\", location: 10},\n\t\"aExtra\": {name: \"aExtra\", location: 11},\n};\n\nclass Shader {\n\n\tconstructor(gl, name, vsSource, fsSource) {\n\t\tthis.gl = gl;\n\t\tthis.name = name;\n\t\tthis.vsSource = vsSource;\n\t\tthis.fsSource = fsSource;\n\n\t\tthis.cache = new Map();\n\n\t\tthis.vs = null;\n\t\tthis.fs = null;\n\t\tthis.program = null;\n\n\t\tthis.uniformLocations = {};\n\t\tthis.attributeLocations = {};\n\t\tthis.uniformBlockIndices = {};\n\t\tthis.uniformBlocks = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.update(vsSource, fsSource);\n\t}\n\n\tupdate(vsSource, fsSource) {\n\t\tthis.vsSource = vsSource;\n\t\tthis.fsSource = fsSource;\n\n\t\tthis.linkProgram();\n\t}\n\n\tcompileShader(shader, source){\n\t\tlet gl = this.gl;\n\n\t\tgl.shaderSource(shader, source);\n\n\t\tgl.compileShader(shader);\n\n\t\tlet success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\t\tif (!success) {\n\t\t\tlet info = gl.getShaderInfoLog(shader);\n\t\t\tlet numberedSource = source.split(\"\\n\").map((a, i) => `${i + 1}`.padEnd(5) + a).join(\"\\n\");\n\t\t\tthrow `could not compile shader ${this.name}: ${info}, \\n${numberedSource}`;\n\t\t}\n\t}\n\n\tlinkProgram() {\n\n\t\tconst tStart = performance.now();\n\n\t\tlet gl = this.gl;\n\n\t\tthis.uniformLocations = {};\n\t\tthis.attributeLocations = {};\n\t\tthis.uniforms = {};\n\n\t\tgl.useProgram(null);\n\n\t\tlet cached = this.cache.get(`${this.vsSource}, ${this.fsSource}`);\n\t\tif (cached) {\n\t\t\tthis.program = cached.program;\n\t\t\tthis.vs = cached.vs;\n\t\t\tthis.fs = cached.fs;\n\t\t\tthis.attributeLocations = cached.attributeLocations;\n\t\t\tthis.uniformLocations = cached.uniformLocations;\n\t\t\tthis.uniformBlocks = cached.uniformBlocks;\n\t\t\tthis.uniforms = cached.uniforms;\n\n\t\t\treturn;\n\t\t} else {\n\n\t\t\tthis.vs = gl.createShader(gl.VERTEX_SHADER);\n\t\t\tthis.fs = gl.createShader(gl.FRAGMENT_SHADER);\n\t\t\tthis.program = gl.createProgram();\n\n\t\t\tfor(let name of Object.keys(attributeLocations)){\n\t\t\t\tlet location = attributeLocations[name].location;\n\t\t\t\tlet glslName = attributeLocations[name].name;\n\t\t\t\tgl.bindAttribLocation(this.program, location, glslName);\n\t\t\t}\n\n\t\t\tthis.compileShader(this.vs, this.vsSource);\n\t\t\tthis.compileShader(this.fs, this.fsSource);\n\n\t\t\tlet program = this.program;\n\n\t\t\tgl.attachShader(program, this.vs);\n\t\t\tgl.attachShader(program, this.fs);\n\n\t\t\tgl.linkProgram(program);\n\n\t\t\tgl.detachShader(program, this.vs);\n\t\t\tgl.detachShader(program, this.fs);\n\n\t\t\tlet success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\t\t\tif (!success) {\n\t\t\t\tlet info = gl.getProgramInfoLog(program);\n\t\t\t\tthrow `could not link program ${this.name}: ${info}`;\n\t\t\t}\n\n\t\t\t{ // attribute locations\n\t\t\t\tlet numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n\n\t\t\t\tfor (let i = 0; i < numAttributes; i++) {\n\t\t\t\t\tlet attribute = gl.getActiveAttrib(program, i);\n\n\t\t\t\t\tlet location = gl.getAttribLocation(program, attribute.name);\n\n\t\t\t\t\tthis.attributeLocations[attribute.name] = location;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t{ // uniform locations\n\t\t\t\tlet numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n\n\t\t\t\tfor (let i = 0; i < numUniforms; i++) {\n\t\t\t\t\tlet uniform = gl.getActiveUniform(program, i);\n\n\t\t\t\t\tlet location = gl.getUniformLocation(program, uniform.name);\n\n\t\t\t\t\tthis.uniformLocations[uniform.name] = location;\n\t\t\t\t\tthis.uniforms[uniform.name] = {\n\t\t\t\t\t\tlocation: location,\n\t\t\t\t\t\tvalue: null,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// uniform blocks\n\t\t\tif(gl instanceof WebGL2RenderingContext){ \n\t\t\t\tlet numBlocks = gl.getProgramParameter(program, gl.ACTIVE_UNIFORM_BLOCKS);\n\n\t\t\t\tfor (let i = 0; i < numBlocks; i++) {\n\t\t\t\t\tlet blockName = gl.getActiveUniformBlockName(program, i);\n\n\t\t\t\t\tlet blockIndex = gl.getUniformBlockIndex(program, blockName);\n\n\t\t\t\t\tthis.uniformBlockIndices[blockName] = blockIndex;\n\n\t\t\t\t\tgl.uniformBlockBinding(program, blockIndex, blockIndex);\n\t\t\t\t\tlet dataSize = gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_DATA_SIZE);\n\n\t\t\t\t\tlet uBuffer = gl.createBuffer();\t\n\t\t\t\t\tgl.bindBuffer(gl.UNIFORM_BUFFER, uBuffer);\n\t\t\t\t\tgl.bufferData(gl.UNIFORM_BUFFER, dataSize, gl.DYNAMIC_READ);\n\n\t\t\t\t\tgl.bindBufferBase(gl.UNIFORM_BUFFER, blockIndex, uBuffer);\n\n\t\t\t\t\tgl.bindBuffer(gl.UNIFORM_BUFFER, null);\n\n\t\t\t\t\tthis.uniformBlocks[blockName] = {\n\t\t\t\t\t\tname: blockName,\n\t\t\t\t\t\tindex: blockIndex,\n\t\t\t\t\t\tdataSize: dataSize,\n\t\t\t\t\t\tbuffer: uBuffer\n\t\t\t\t\t};\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet cached = {\n\t\t\t\tprogram: this.program,\n\t\t\t\tvs: this.vs,\n\t\t\t\tfs: this.fs,\n\t\t\t\tattributeLocations: this.attributeLocations,\n\t\t\t\tuniformLocations: this.uniformLocations,\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tuniformBlocks: this.uniformBlocks,\n\t\t\t};\n\n\t\t\tthis.cache.set(`${this.vsSource}, ${this.fsSource}`, cached);\n\t\t}\n\n\t\tconst tEnd = performance.now();\n\t\tconst duration = tEnd - tStart;\n\n\t\tconsole.log(`shader compile duration: ${duration.toFixed(3)}`);\n\n\n\t}\n\n\tsetUniformMatrix4(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst location = this.uniformLocations[name];\n\n\t\tif (location == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmp = new Float32Array(value.elements);\n\t\tgl.uniformMatrix4fv(location, false, tmp);\n\t}\n\n\tsetUniform1f(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst uniform = this.uniforms[name];\n\n\t\tif (uniform === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(uniform.value === value){\n\t\t\treturn;\n\t\t}\n\n\t\tuniform.value = value;\n\n\t\tgl.uniform1f(uniform.location, value);\n\t}\n\n\tsetUniformBoolean(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst uniform = this.uniforms[name];\n\n\t\tif (uniform === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(uniform.value === value){\n\t\t\treturn;\n\t\t}\n\n\t\tuniform.value = value;\n\n\t\tgl.uniform1i(uniform.location, value);\n\t}\n\n\tsetUniformTexture(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst location = this.uniformLocations[name];\n\n\t\tif (location == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.uniform1i(location, value);\n\t}\n\n\tsetUniform2f(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst location = this.uniformLocations[name];\n\n\t\tif (location == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.uniform2f(location, value[0], value[1]);\n\t}\n\n\tsetUniform3f(name, value) {\n\t\tconst gl = this.gl;\n\t\tconst location = this.uniformLocations[name];\n\n\t\tif (location == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.uniform3f(location, value[0], value[1], value[2]);\n\t}\n\n\tsetUniform(name, value) {\n\n\t\tif (value.constructor === THREE.Matrix4) {\n\t\t\tthis.setUniformMatrix4(name, value);\n\t\t} else if (typeof value === \"number\") {\n\t\t\tthis.setUniform1f(name, value);\n\t\t} else if (typeof value === \"boolean\") {\n\t\t\tthis.setUniformBoolean(name, value);\n\t\t} else if (value instanceof WebGLTexture) {\n\t\t\tthis.setUniformTexture(name, value);\n\t\t} else if (value instanceof Array) {\n\n\t\t\tif (value.length === 2) {\n\t\t\t\tthis.setUniform2f(name, value);\n\t\t\t} else if (value.length === 3) {\n\t\t\t\tthis.setUniform3f(name, value);\n\t\t\t}\n\n\t\t} else {\n\t\t\tconsole.error(\"unhandled uniform type: \", name, value);\n\t\t}\n\n\t}\n\n\n\tsetUniform1i(name, value) {\n\t\tlet gl = this.gl;\n\t\tlet location = this.uniformLocations[name];\n\n\t\tif (location == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.uniform1i(location, value);\n\t}\n\n};\n\nclass WebGLTexture {\n\n\tconstructor(gl, texture) {\n\t\tthis.gl = gl;\n\n\t\tthis.texture = texture;\n\t\tthis.id = gl.createTexture();\n\n\t\tthis.target = gl.TEXTURE_2D;\n\t\tthis.version = -1;\n\n\t\tthis.update(texture);\n\t}\n\n\tupdate() {\n\n\t\tif (!this.texture.image) {\n\t\t\tthis.version = this.texture.version;\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet gl = this.gl;\n\t\tlet texture = this.texture;\n\n\t\tif (this.version === texture.version) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.target = gl.TEXTURE_2D;\n\n\t\tgl.bindTexture(this.target, this.id);\n\n\t\tlet level = 0;\n\t\tlet internalFormat = paramThreeToGL(gl, texture.format);\n\t\tlet width = texture.image.width;\n\t\tlet height = texture.image.height;\n\t\tlet border = 0;\n\t\tlet srcFormat = internalFormat;\n\t\tlet srcType = paramThreeToGL(gl, texture.type);\n\t\tlet data;\n\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, texture.flipY);\n\t\tgl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha);\n\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment);\n\n\t\tif (texture instanceof THREE.DataTexture) {\n\t\t\tdata = texture.image.data;\n\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_MAG_FILTER, paramThreeToGL(gl, texture.magFilter));\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_MIN_FILTER, paramThreeToGL(gl, texture.minFilter));\n\n\t\t\tgl.texImage2D(this.target, level, internalFormat,\n\t\t\t\twidth, height, border, srcFormat, srcType,\n\t\t\t\tdata);\n\t\t} else if ((texture instanceof THREE.CanvasTexture) || (texture instanceof THREE.Texture)) {\n\t\t\tdata = texture.image;\n\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_WRAP_S, paramThreeToGL(gl, texture.wrapS));\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_WRAP_T, paramThreeToGL(gl, texture.wrapT));\n\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_MAG_FILTER, paramThreeToGL(gl, texture.magFilter));\n\t\t\tgl.texParameteri(this.target, gl.TEXTURE_MIN_FILTER, paramThreeToGL(gl, texture.minFilter));\n\n\t\t\tgl.texImage2D(this.target, level, internalFormat,\n\t\t\t\tinternalFormat, srcType, data);\n\n\t\t\tif (texture instanceof THREE.Texture) {gl.generateMipmap(gl.TEXTURE_2D);}\n\t\t}\n\n\t\tgl.bindTexture(this.target, null);\n\n\t\tthis.version = texture.version;\n\t}\n\n};\n\nclass WebGLBuffer {\n\n\tconstructor() {\n\t\tthis.numElements = 0;\n\t\tthis.vao = null;\n\t\tthis.vbos = new Map();\n\t}\n\n};\n\nexport class Renderer {\n\n\tconstructor(threeRenderer) {\n\t\tthis.threeRenderer = threeRenderer;\n\t\tthis.gl = this.threeRenderer.getContext();\n\n\t\tthis.buffers = new Map();\n\t\tthis.shaders = new Map();\n\t\tthis.textures = new Map();\n\n\t\tthis.glTypeMapping = new Map();\n\t\tthis.glTypeMapping.set(Float32Array, this.gl.FLOAT);\n\t\tthis.glTypeMapping.set(Uint8Array, this.gl.UNSIGNED_BYTE);\n\t\tthis.glTypeMapping.set(Uint16Array, this.gl.UNSIGNED_SHORT);\n\n\t\tthis.toggle = 0;\n\t}\n\n\tdeleteBuffer(geometry) {\n\n\t\tlet gl = this.gl;\n\t\tlet webglBuffer = this.buffers.get(geometry);\n\t\tif (webglBuffer != null) {\n\t\t\tfor (let attributeName in geometry.attributes) {\n\t\t\t\tgl.deleteBuffer(webglBuffer.vbos.get(attributeName).handle);\n\t\t\t}\n\t\t\tthis.buffers.delete(geometry);\n\t\t}\n\t}\n\n\tcreateBuffer(geometry){\n\t\tlet gl = this.gl;\n\t\tlet webglBuffer = new WebGLBuffer();\n\t\twebglBuffer.vao = gl.createVertexArray();\n\t\twebglBuffer.numElements = geometry.attributes.position.count;\n\n\t\tgl.bindVertexArray(webglBuffer.vao);\n\n\t\tfor(let attributeName in geometry.attributes){\n\t\t\tlet bufferAttribute = geometry.attributes[attributeName];\n\n\t\t\tlet vbo = gl.createBuffer();\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n\t\t\tgl.bufferData(gl.ARRAY_BUFFER, bufferAttribute.array, gl.STATIC_DRAW);\n\n\t\t\tlet normalized = bufferAttribute.normalized;\n\t\t\tlet type = this.glTypeMapping.get(bufferAttribute.array.constructor);\n\n\t\t\tif(attributeLocations[attributeName] === undefined){\n\t\t\t\t//attributeLocation = attributeLocations[\"aExtra\"];\n\t\t\t}else{\n\t\t\t\tlet attributeLocation = attributeLocations[attributeName].location;\n\n\t\t\t\tgl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0);\n\t\t\t\tgl.enableVertexAttribArray(attributeLocation);\n\t\t\t}\n\n\n\t\t\twebglBuffer.vbos.set(attributeName, {\n\t\t\t\thandle: vbo,\n\t\t\t\tname: attributeName,\n\t\t\t\tcount: bufferAttribute.count,\n\t\t\t\titemSize: bufferAttribute.itemSize,\n\t\t\t\ttype: geometry.attributes.position.array.constructor,\n\t\t\t\tversion: 0\n\t\t\t});\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, null);\n\t\tgl.bindVertexArray(null);\n\n\t\tlet disposeHandler = (event) => {\n\t\t\tthis.deleteBuffer(geometry);\n\t\t\tgeometry.removeEventListener(\"dispose\", disposeHandler);\n\t\t};\n\t\tgeometry.addEventListener(\"dispose\", disposeHandler);\n\n\t\treturn webglBuffer;\n\t}\n\n\tupdateBuffer(geometry){\n\t\tlet gl = this.gl;\n\n\t\tlet webglBuffer = this.buffers.get(geometry);\n\n\t\tgl.bindVertexArray(webglBuffer.vao);\n\n\t\tfor(let attributeName in geometry.attributes){\n\t\t\tlet bufferAttribute = geometry.attributes[attributeName];\n\n\t\t\tlet normalized = bufferAttribute.normalized;\n\t\t\tlet type = this.glTypeMapping.get(bufferAttribute.array.constructor);\n\n\t\t\tlet vbo = null;\n\t\t\tif(!webglBuffer.vbos.has(attributeName)){\n\t\t\t\tvbo = gl.createBuffer();\n\n\t\t\t\twebglBuffer.vbos.set(attributeName, {\n\t\t\t\t\thandle: vbo,\n\t\t\t\t\tname: attributeName,\n\t\t\t\t\tcount: bufferAttribute.count,\n\t\t\t\t\titemSize: bufferAttribute.itemSize,\n\t\t\t\t\ttype: geometry.attributes.position.array.constructor,\n\t\t\t\t\tversion: bufferAttribute.version\n\t\t\t\t});\n\t\t\t}else{\n\t\t\t\tvbo = webglBuffer.vbos.get(attributeName).handle;\n\t\t\t\twebglBuffer.vbos.get(attributeName).version = bufferAttribute.version;\n\t\t\t}\n\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n\t\t\tgl.bufferData(gl.ARRAY_BUFFER, bufferAttribute.array, gl.STATIC_DRAW);\n\n\t\t\tif(attributeLocations[attributeName] === undefined){\n\t\t\t\t//attributeLocation = attributeLocations[\"aExtra\"];\n\t\t\t}else{\n\t\t\t\tlet attributeLocation = attributeLocations[attributeName].location;\n\t\t\t\t\n\t\t\t\tgl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0);\n\t\t\t\tgl.enableVertexAttribArray(attributeLocation);\n\t\t\t}\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, null);\n\t\tgl.bindVertexArray(null);\n\t}\n\n\ttraverse(scene) {\n\n\t\tlet octrees = [];\n\n\t\tlet stack = [scene];\n\t\twhile (stack.length > 0) {\n\n\t\t\tlet node = stack.pop();\n\n\t\t\tif (node instanceof PointCloudTree) {\n\t\t\t\toctrees.push(node);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet visibleChildren = node.children.filter(c => c.visible);\n\t\t\tstack.push(...visibleChildren);\n\n\t\t}\n\n\t\tlet result = {\n\t\t\toctrees: octrees\n\t\t};\n\n\t\treturn result;\n\t}\n\n\n\n\trenderNodes(octree, nodes, visibilityTextureData, camera, target, shader, params) {\n\n\t\tif (exports.measureTimings) performance.mark(\"renderNodes-start\");\n\n\t\tlet gl = this.gl;\n\n\t\tlet material = params.material ? params.material : octree.material;\n\t\tlet shadowMaps = params.shadowMaps == null ? [] : params.shadowMaps;\n\t\tlet view = camera.matrixWorldInverse;\n\n\t\tif(params.viewOverride){\n\t\t\tview = params.viewOverride;\n\t\t}\n\n\t\tlet worldView = new THREE.Matrix4();\n\n\t\tlet mat4holder = new Float32Array(16);\n\n\t\tlet i = 0;\n\t\tfor (let node of nodes) {\n\n\t\t\tif(exports.debug.allowedNodes !== undefined){\n\t\t\t\tif(!exports.debug.allowedNodes.includes(node.name)){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet world = node.sceneNode.matrixWorld;\n\t\t\tworldView.multiplyMatrices(view, world);\n\n\t\t\tif (visibilityTextureData) {\n\t\t\t\tlet vnStart = visibilityTextureData.offsets.get(node);\n\t\t\t\tshader.setUniform1f(\"uVNStart\", vnStart);\n\t\t\t}\n\n\n\t\t\tlet level = node.getLevel();\n\n\t\t\tif(node.debug){\n\t\t\t\tshader.setUniform(\"uDebug\", true);\n\t\t\t}else{\n\t\t\t\tshader.setUniform(\"uDebug\", false);\n\t\t\t}\n\n\t\t\t// let isLeaf = false;\n\t\t\t// if(node instanceof PointCloudOctreeNode){\n\t\t\t// \tisLeaf = Object.keys(node.children).length === 0;\n\t\t\t// }else if(node instanceof PointCloudArena4DNode){\n\t\t\t// \tisLeaf = node.geometryNode.isLeaf;\n\t\t\t// }\n\t\t\t// shader.setUniform(\"uIsLeafNode\", isLeaf);\n\n\t\t\t// let isLeaf = node.children.filter(n => n != null).length === 0;\n\t\t\t// if(!isLeaf){\n\t\t\t// \tcontinue;\n\t\t\t// }\n\n\n\t\t\t// TODO consider passing matrices in an array to avoid uniformMatrix4fv overhead\n\t\t\tconst lModel = shader.uniformLocations[\"modelMatrix\"];\n\t\t\tif (lModel) {\n\t\t\t\tmat4holder.set(world.elements);\n\t\t\t\tgl.uniformMatrix4fv(lModel, false, mat4holder);\n\t\t\t}\n\n\t\t\tconst lModelView = shader.uniformLocations[\"modelViewMatrix\"];\n\t\t\t//mat4holder.set(worldView.elements);\n\t\t\t// faster then set in chrome 63\n\t\t\tfor(let j = 0; j < 16; j++){\n\t\t\t\tmat4holder[j] = worldView.elements[j];\n\t\t\t}\n\t\t\tgl.uniformMatrix4fv(lModelView, false, mat4holder);\n\n\t\t\t{ // Clip Polygons\n\t\t\t\tif(material.clipPolygons && material.clipPolygons.length > 0){\n\n\t\t\t\t\tlet clipPolygonVCount = [];\n\t\t\t\t\tlet worldViewProjMatrices = [];\n\n\t\t\t\t\tfor(let clipPolygon of material.clipPolygons){\n\n\t\t\t\t\t\tlet view = clipPolygon.viewMatrix;\n\t\t\t\t\t\tlet proj = clipPolygon.projMatrix;\n\n\t\t\t\t\t\tlet worldViewProj = proj.clone().multiply(view).multiply(world);\n\n\t\t\t\t\t\tclipPolygonVCount.push(clipPolygon.markers.length);\n\t\t\t\t\t\tworldViewProjMatrices.push(worldViewProj);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet flattenedMatrices = [].concat(...worldViewProjMatrices.map(m => m.elements));\n\n\t\t\t\t\tlet flattenedVertices = new Array(8 * 3 * material.clipPolygons.length);\n\t\t\t\t\tfor(let i = 0; i < material.clipPolygons.length; i++){\n\t\t\t\t\t\tlet clipPolygon = material.clipPolygons[i];\n\t\t\t\t\t\tfor(let j = 0; j < clipPolygon.markers.length; j++){\n\t\t\t\t\t\t\tflattenedVertices[i * 24 + (j * 3 + 0)] = clipPolygon.markers[j].position.x;\n\t\t\t\t\t\t\tflattenedVertices[i * 24 + (j * 3 + 1)] = clipPolygon.markers[j].position.y;\n\t\t\t\t\t\t\tflattenedVertices[i * 24 + (j * 3 + 2)] = clipPolygon.markers[j].position.z;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst lClipPolygonVCount = shader.uniformLocations[\"uClipPolygonVCount[0]\"];\n\t\t\t\t\tgl.uniform1iv(lClipPolygonVCount, clipPolygonVCount);\n\n\t\t\t\t\tconst lClipPolygonVP = shader.uniformLocations[\"uClipPolygonWVP[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lClipPolygonVP, false, flattenedMatrices);\n\n\t\t\t\t\tconst lClipPolygons = shader.uniformLocations[\"uClipPolygonVertices[0]\"];\n\t\t\t\t\tgl.uniform3fv(lClipPolygons, flattenedVertices);\n\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\t//shader.setUniformMatrix4(\"modelMatrix\", world);\n\t\t\t//shader.setUniformMatrix4(\"modelViewMatrix\", worldView);\n\t\t\tshader.setUniform1f(\"uLevel\", level);\n\t\t\tshader.setUniform1f(\"uNodeSpacing\", node.geometryNode.estimatedSpacing);\n\n\t\t\tshader.setUniform1f(\"uPCIndex\", i);\n\t\t\t// uBBSize\n\n\t\t\tif (shadowMaps.length > 0) {\n\n\t\t\t\tconst lShadowMap = shader.uniformLocations[\"uShadowMap[0]\"];\n\n\t\t\t\tshader.setUniform3f(\"uShadowColor\", material.uniforms.uShadowColor.value);\n\n\t\t\t\tlet bindingStart = 5;\n\t\t\t\tlet bindingPoints = new Array(shadowMaps.length).fill(bindingStart).map((a, i) => (a + i));\n\t\t\t\tgl.uniform1iv(lShadowMap, bindingPoints);\n\n\t\t\t\tfor (let i = 0; i < shadowMaps.length; i++) {\n\t\t\t\t\tlet shadowMap = shadowMaps[i];\n\t\t\t\t\tlet bindingPoint = bindingPoints[i];\n\t\t\t\t\tlet glTexture = this.threeRenderer.properties.get(shadowMap.target.texture).__webglTexture;\n\n\t\t\t\t\tgl.activeTexture(gl[`TEXTURE${bindingPoint}`]);\n\t\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, glTexture);\n\t\t\t\t}\n\n\t\t\t\t{\n\n\t\t\t\t\tlet worldViewMatrices = shadowMaps\n\t\t\t\t\t\t.map(sm => sm.camera.matrixWorldInverse)\n\t\t\t\t\t\t.map(view => new THREE.Matrix4().multiplyMatrices(view, world))\n\n\t\t\t\t\tlet flattenedMatrices = [].concat(...worldViewMatrices.map(c => c.elements));\n\t\t\t\t\tconst lWorldView = shader.uniformLocations[\"uShadowWorldView[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lWorldView, false, flattenedMatrices);\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\tlet flattenedMatrices = [].concat(...shadowMaps.map(sm => sm.camera.projectionMatrix.elements));\n\t\t\t\t\tconst lProj = shader.uniformLocations[\"uShadowProj[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lProj, false, flattenedMatrices);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst geometry = node.geometryNode.geometry;\n\n\t\t\tif(geometry.attributes[\"gps-time\"]){\n\t\t\t\tconst bufferAttribute = geometry.attributes[\"gps-time\"];\n\t\t\t\tconst attGPS = octree.getAttribute(\"gps-time\");\n\n\t\t\t\tlet initialRange = attGPS.initialRange;\n\t\t\t\tlet initialRangeSize = initialRange[1] - initialRange[0];\n\n\t\t\t\tlet globalRange = attGPS.range;\n\t\t\t\tlet globalRangeSize = globalRange[1] - globalRange[0];\n\n\t\t\t\tlet scale = initialRangeSize / globalRangeSize;\n\t\t\t\tlet offset = -(globalRange[0] - initialRange[0]) / initialRangeSize;\n\n\t\t\t\tscale = Number.isNaN(scale) ? 1 : scale;\n\t\t\t\toffset = Number.isNaN(offset) ? 0 : offset;\n\n\t\t\t\tshader.setUniform1f(\"uGpsScale\", scale);\n\t\t\t\tshader.setUniform1f(\"uGpsOffset\", offset);\n\t\t\t\t//shader.setUniform2f(\"uFilterGPSTimeClipRange\", [-Infinity, Infinity]);\n\n\t\t\t\tlet uFilterGPSTimeClipRange = material.uniforms.uFilterGPSTimeClipRange.value;\n\t\t\t\t// let gpsCliPRangeMin = uFilterGPSTimeClipRange[0]\n\t\t\t\t// let gpsCliPRangeMax = uFilterGPSTimeClipRange[1]\n\t\t\t\t// shader.setUniform2f(\"uFilterGPSTimeClipRange\", [gpsCliPRangeMin, gpsCliPRangeMax]);\n\n\t\t\t\tlet normalizedClipRange = [\n\t\t\t\t\t(uFilterGPSTimeClipRange[0] - globalRange[0]) / globalRangeSize,\n\t\t\t\t\t(uFilterGPSTimeClipRange[1] - globalRange[0]) / globalRangeSize,\n\t\t\t\t];\n\n\t\t\t\tshader.setUniform2f(\"uFilterGPSTimeClipRange\", normalizedClipRange);\n\n\n\n\t\t\t\t// // ranges in full gps coordinate system\n\t\t\t\t// const globalRange = attGPS.range;\n\t\t\t\t// const bufferRange = bufferAttribute.potree.range;\n\n\t\t\t\t// // ranges in [0, 1]\n\t\t\t\t// // normalizedGlobalRange = [0, 1]\n\t\t\t\t// // normalizedBufferRange: norm buffer within norm global range e.g. [0.2, 0.8]\n\t\t\t\t// const globalWidth = globalRange[1] - globalRange[0];\n\t\t\t\t// const normalizedBufferRange = [\n\t\t\t\t// \t(bufferRange[0] - globalRange[0]) / globalWidth,\n\t\t\t\t// \t(bufferRange[1] - globalRange[0]) / globalWidth,\n\t\t\t\t// ];\n\n\t\t\t\t// shader.setUniform2f(\"uNormalizedGpsBufferRange\", normalizedBufferRange);\n\n\t\t\t\t// let uFilterGPSTimeClipRange = material.uniforms.uFilterGPSTimeClipRange.value;\n\t\t\t\t// let gpsCliPRangeMin = uFilterGPSTimeClipRange[0]\n\t\t\t\t// let gpsCliPRangeMax = uFilterGPSTimeClipRange[1]\n\t\t\t\t// shader.setUniform2f(\"uFilterGPSTimeClipRange\", [gpsCliPRangeMin, gpsCliPRangeMax]);\n\n\t\t\t\t// shader.setUniform1f(\"uGpsScale\", bufferAttribute.potree.scale);\n\t\t\t\t// shader.setUniform1f(\"uGpsOffset\", bufferAttribute.potree.offset);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tlet uFilterReturnNumberRange = material.uniforms.uFilterReturnNumberRange.value;\n\t\t\t\tlet uFilterNumberOfReturnsRange = material.uniforms.uFilterNumberOfReturnsRange.value;\n\t\t\t\tlet uFilterPointSourceIDClipRange = material.uniforms.uFilterPointSourceIDClipRange.value;\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tshader.setUniform2f(\"uFilterReturnNumberRange\", uFilterReturnNumberRange);\n\t\t\t\tshader.setUniform2f(\"uFilterNumberOfReturnsRange\", uFilterNumberOfReturnsRange);\n\t\t\t\tshader.setUniform2f(\"uFilterPointSourceIDClipRange\", uFilterPointSourceIDClipRange);\n\t\t\t}\n\n\t\t\tlet webglBuffer = null;\n\t\t\tif(!this.buffers.has(geometry)){\n\t\t\t\twebglBuffer = this.createBuffer(geometry);\n\t\t\t\tthis.buffers.set(geometry, webglBuffer);\n\t\t\t}else{\n\t\t\t\twebglBuffer = this.buffers.get(geometry);\n\t\t\t\tfor(let attributeName in geometry.attributes){\n\t\t\t\t\tlet attribute = geometry.attributes[attributeName];\n\n\t\t\t\t\tif(attribute.version > webglBuffer.vbos.get(attributeName).version){\n\t\t\t\t\t\tthis.updateBuffer(geometry);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgl.bindVertexArray(webglBuffer.vao);\n\n\t\t\tlet isExtraAttribute =\n\t\t\t\tattributeLocations[material.activeAttributeName] === undefined\n\t\t\t\t&& Object.keys(geometry.attributes).includes(material.activeAttributeName);\n\n\t\t\tif(isExtraAttribute){\n\n\t\t\t\tconst attributeLocation = attributeLocations[\"aExtra\"].location;\n\n\t\t\t\tfor(const attributeName in geometry.attributes){\n\t\t\t\t\tconst bufferAttribute = geometry.attributes[attributeName];\n\t\t\t\t\tconst vbo = webglBuffer.vbos.get(attributeName);\n\t\t\t\t\t\n\t\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle);\n\t\t\t\t\tgl.disableVertexAttribArray(attributeLocation);\n\t\t\t\t}\n\n\t\t\t\tconst attName = material.activeAttributeName;\n\t\t\t\tconst bufferAttribute = geometry.attributes[attName];\n\t\t\t\tconst vbo = webglBuffer.vbos.get(attName);\n\n\t\t\t\tif(bufferAttribute !== undefined && vbo !== undefined){\n\t\t\t\t\tlet type = this.glTypeMapping.get(bufferAttribute.array.constructor);\n\t\t\t\t\tlet normalized = bufferAttribute.normalized;\n\n\t\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle);\n\t\t\t\t\tgl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0);\n\t\t\t\t\tgl.enableVertexAttribArray(attributeLocation);\n\t\t\t\t}\n\n\n\n\n\t\t\t\t{\n\t\t\t\t\tconst attExtra = octree.pcoGeometry.pointAttributes.attributes\n\t\t\t\t\t\t.find(a => a.name === attName);\n\n\t\t\t\t\tlet range = material.getRange(attName);\n\t\t\t\t\tif(!range){\n\t\t\t\t\t\trange = attExtra.range;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(!range){\n\t\t\t\t\t\trange = [0, 1];\n\t\t\t\t\t}\n\n\t\t\t\t\tlet initialRange = attExtra.initialRange;\n\t\t\t\t\tlet initialRangeSize = initialRange[1] - initialRange[0];\n\n\t\t\t\t\tlet globalRange = range;\n\t\t\t\t\tlet globalRangeSize = globalRange[1] - globalRange[0];\n\n\t\t\t\t\tlet scale = initialRangeSize / globalRangeSize;\n\t\t\t\t\tlet offset = -(globalRange[0] - initialRange[0]) / initialRangeSize;\n\n\t\t\t\t\tscale = Number.isNaN(scale) ? 1 : scale;\n\t\t\t\t\toffset = Number.isNaN(offset) ? 0 : offset;\n\n\t\t\t\t\tshader.setUniform1f(\"uExtraScale\", scale);\n\t\t\t\t\tshader.setUniform1f(\"uExtraOffset\", offset);\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t}else{\n\n\t\t\t\tfor(const attributeName in geometry.attributes){\n\t\t\t\t\tconst bufferAttribute = geometry.attributes[attributeName];\n\t\t\t\t\tconst vbo = webglBuffer.vbos.get(attributeName);\n\n\n\t\t\t\t\tif(attributeLocations[attributeName] !== undefined){\n\t\t\t\t\t\tconst attributeLocation = attributeLocations[attributeName].location;\n\n\t\t\t\t\t\tlet type = this.glTypeMapping.get(bufferAttribute.array.constructor);\n\t\t\t\t\t\tlet normalized = bufferAttribute.normalized;\n\t\t\t\t\t\t\n\t\t\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vbo.handle);\n\t\t\t\t\t\tgl.vertexAttribPointer(attributeLocation, bufferAttribute.itemSize, type, normalized, 0, 0);\n\t\t\t\t\t\tgl.enableVertexAttribArray(attributeLocation);\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet numPoints = webglBuffer.numElements;\n\t\t\tgl.drawArrays(gl.POINTS, 0, numPoints);\n\n\t\t\ti++;\n\t\t}\n\n\t\tgl.bindVertexArray(null);\n\n\t\tif (exports.measureTimings) {\n\t\t\tperformance.mark(\"renderNodes-end\");\n\t\t\tperformance.measure(\"render.renderNodes\", \"renderNodes-start\", \"renderNodes-end\");\n\t\t}\n\t}\n\n\trenderOctree(octree, nodes, camera, target, params = {}){\n\n\t\tlet gl = this.gl;\n\n\t\tlet material = params.material ? params.material : octree.material;\n\t\tlet shadowMaps = params.shadowMaps == null ? [] : params.shadowMaps;\n\t\tlet view = camera.matrixWorldInverse;\n\t\tlet viewInv = camera.matrixWorld;\n\n\t\tif(params.viewOverride){\n\t\t\tview = params.viewOverride;\n\t\t\tviewInv = view.clone().invert();\n\t\t}\n\n\t\tlet proj = camera.projectionMatrix;\n\t\tlet projInv = proj.clone().invert();\n\t\t//let worldView = new THREE.Matrix4();\n\n\t\tlet shader = null;\n\t\tlet visibilityTextureData = null;\n\n\t\tlet currentTextureBindingPoint = 0;\n\n\t\tif (material.pointSizeType >= 0) {\n\t\t\tif (material.pointSizeType === PointSizeType.ADAPTIVE ||\n\t\t\t\tmaterial.activeAttributeName === \"level of detail\") {\n\n\t\t\t\tlet vnNodes = (params.vnTextureNodes != null) ? params.vnTextureNodes : nodes;\n\t\t\t\tvisibilityTextureData = octree.computeVisibilityTextureData(vnNodes, camera);\n\n\t\t\t\tconst vnt = material.visibleNodesTexture;\n\t\t\t\tconst data = vnt.image.data;\n\t\t\t\tdata.set(visibilityTextureData.data);\n\t\t\t\tvnt.needsUpdate = true;\n\n\t\t\t}\n\t\t}\n\n\t\t{ // UPDATE SHADER AND TEXTURES\n\t\t\tif (!this.shaders.has(material)) {\n\t\t\t\tlet [vs, fs] = [material.vertexShader, material.fragmentShader];\n\t\t\t\tlet shader = new Shader(gl, \"pointcloud\", vs, fs);\n\n\t\t\t\tthis.shaders.set(material, shader);\n\t\t\t}\n\n\t\t\tshader = this.shaders.get(material);\n\n\t\t\t//if(material.needsUpdate){\n\t\t\t{\n\t\t\t\tlet [vs, fs] = [material.vertexShader, material.fragmentShader];\n\n\t\t\t\tlet numSnapshots = material.snapEnabled ? material.numSnapshots : 0;\n\t\t\t\tlet numClipBoxes = (material.clipBoxes && material.clipBoxes.length) ? material.clipBoxes.length : 0;\n\t\t\t\tlet numClipSpheres = (params.clipSpheres && params.clipSpheres.length) ? params.clipSpheres.length : 0;\n\t\t\t\tlet numClipPolygons = (material.clipPolygons && material.clipPolygons.length) ? material.clipPolygons.length : 0;\n\n\t\t\t\tlet defines = [\n\t\t\t\t\t`#define num_shadowmaps ${shadowMaps.length}`,\n\t\t\t\t\t`#define num_snapshots ${numSnapshots}`,\n\t\t\t\t\t`#define num_clipboxes ${numClipBoxes}`,\n\t\t\t\t\t`#define num_clipspheres ${numClipSpheres}`,\n\t\t\t\t\t`#define num_clippolygons ${numClipPolygons}`,\n\t\t\t\t];\n\n\n\t\t\t\tif(octree.pcoGeometry.root.isLoaded()){\n\t\t\t\t\tlet attributes = octree.pcoGeometry.root.geometry.attributes;\n\n\t\t\t\t\tif(attributes[\"gps-time\"]){\n\t\t\t\t\t\tdefines.push(\"#define clip_gps_enabled\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif(attributes[\"return number\"]){\n\t\t\t\t\t\tdefines.push(\"#define clip_return_number_enabled\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif(attributes[\"number of returns\"]){\n\t\t\t\t\t\tdefines.push(\"#define clip_number_of_returns_enabled\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif(attributes[\"source id\"] || attributes[\"point source id\"]){\n\t\t\t\t\t\tdefines.push(\"#define clip_point_source_id_enabled\");\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tlet definesString = defines.join(\"\\n\");\n\n\t\t\t\tlet vsVersionIndex = vs.indexOf(\"#version \");\n\t\t\t\tlet fsVersionIndex = fs.indexOf(\"#version \");\n\n\t\t\t\tif(vsVersionIndex >= 0){\n\t\t\t\t\tvs = vs.replace(/(#version .*)/, `$1\\n${definesString}`)\n\t\t\t\t}else{\n\t\t\t\t\tvs = `${definesString}\\n${vs}`;\n\t\t\t\t}\n\n\t\t\t\tif(fsVersionIndex >= 0){\n\t\t\t\t\tfs = fs.replace(/(#version .*)/, `$1\\n${definesString}`)\n\t\t\t\t}else{\n\t\t\t\t\tfs = `${definesString}\\n${fs}`;\n\t\t\t\t}\n\n\n\t\t\t\tshader.update(vs, fs);\n\n\t\t\t\tmaterial.needsUpdate = false;\n\t\t\t}\n\n\t\t\tfor (let uniformName of Object.keys(material.uniforms)) {\n\t\t\t\tlet uniform = material.uniforms[uniformName];\n\n\t\t\t\tif (uniform.type == \"t\") {\n\n\t\t\t\t\tlet texture = uniform.value;\n\n\t\t\t\t\tif (!texture) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this.textures.has(texture)) {\n\t\t\t\t\t\tlet webglTexture = new WebGLTexture(gl, texture);\n\n\t\t\t\t\t\tthis.textures.set(texture, webglTexture);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet webGLTexture = this.textures.get(texture);\n\t\t\t\t\twebGLTexture.update();\n\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tgl.useProgram(shader.program);\n\n\t\tlet transparent = false;\n\t\tif(params.transparent !== undefined){\n\t\t\ttransparent = params.transparent && material.opacity < 1;\n\t\t}else{\n\t\t\ttransparent = material.opacity < 1;\n\t\t}\n\n\t\tif (transparent){\n\t\t\tgl.enable(gl.BLEND);\n\t\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE);\n\t\t\tgl.depthMask(false);\n\t\t\tgl.disable(gl.DEPTH_TEST);\n\t\t} else {\n\t\t\tgl.disable(gl.BLEND);\n\t\t\tgl.depthMask(true);\n\t\t\tgl.enable(gl.DEPTH_TEST);\n\t\t}\n\n\t\tif(params.blendFunc !== undefined){\n\t\t\tgl.enable(gl.BLEND);\n\t\t\tgl.blendFunc(...params.blendFunc);\n\t\t}\n\n\t\tif(params.depthTest !== undefined){\n\t\t\tif(params.depthTest === true){\n\t\t\t\tgl.enable(gl.DEPTH_TEST);\n\t\t\t}else{\n\t\t\t\tgl.disable(gl.DEPTH_TEST);\n\t\t\t}\n\t\t}\n\n\t\tif(params.depthWrite !== undefined){\n\t\t\t if(params.depthWrite === true){\n\t\t\t\t gl.depthMask(true);\n\t\t\t }else{\n\t\t\t\t gl.depthMask(false);\n\t\t\t }\n\t\t\t \n\t\t}\n\n\n\t\t{ // UPDATE UNIFORMS\n\t\t\tshader.setUniformMatrix4(\"projectionMatrix\", proj);\n\t\t\tshader.setUniformMatrix4(\"viewMatrix\", view);\n\t\t\tshader.setUniformMatrix4(\"uViewInv\", viewInv);\n\t\t\tshader.setUniformMatrix4(\"uProjInv\", projInv);\n\n\t\t\tlet screenWidth = target ? target.width : material.screenWidth;\n\t\t\tlet screenHeight = target ? target.height : material.screenHeight;\n\n\t\t\tshader.setUniform1f(\"uScreenWidth\", screenWidth);\n\t\t\tshader.setUniform1f(\"uScreenHeight\", screenHeight);\n\t\t\tshader.setUniform1f(\"fov\", Math.PI * camera.fov / 180);\n\t\t\tshader.setUniform1f(\"near\", camera.near);\n\t\t\tshader.setUniform1f(\"far\", camera.far);\n\t\t\t\n\t\t\tif(camera instanceof THREE.OrthographicCamera){\n\t\t\t\tshader.setUniform(\"uUseOrthographicCamera\", true);\n\t\t\t\tshader.setUniform(\"uOrthoWidth\", camera.right - camera.left); \n\t\t\t\tshader.setUniform(\"uOrthoHeight\", camera.top - camera.bottom);\n\t\t\t}else{\n\t\t\t\tshader.setUniform(\"uUseOrthographicCamera\", false);\n\t\t\t}\n\n\t\t\tif(material.clipBoxes.length + material.clipPolygons.length === 0){\n\t\t\t\tshader.setUniform1i(\"clipTask\", ClipTask.NONE);\n\t\t\t}else{\n\t\t\t\tshader.setUniform1i(\"clipTask\", material.clipTask);\n\t\t\t}\n\n\t\t\tshader.setUniform1i(\"clipMethod\", material.clipMethod);\n\n\t\t\tif (material.clipBoxes && material.clipBoxes.length > 0) {\n\t\t\t\t//let flattenedMatrices = [].concat(...material.clipBoxes.map(c => c.inverse.elements));\n\n\t\t\t\t//const lClipBoxes = shader.uniformLocations[\"clipBoxes[0]\"];\n\t\t\t\t//gl.uniformMatrix4fv(lClipBoxes, false, flattenedMatrices);\n\n\t\t\t\tconst lClipBoxes = shader.uniformLocations[\"clipBoxes[0]\"];\n\t\t\t\tgl.uniformMatrix4fv(lClipBoxes, false, material.uniforms.clipBoxes.value);\n\t\t\t}\n\n\t\t\t// TODO CLIPSPHERES\n\t\t\tif(params.clipSpheres && params.clipSpheres.length > 0){\n\n\t\t\t\tlet clipSpheres = params.clipSpheres;\n\n\t\t\t\tlet matrices = [];\n\t\t\t\tfor(let clipSphere of clipSpheres){\n\t\t\t\t\t//let mScale = new THREE.Matrix4().makeScale(...clipSphere.scale.toArray());\n\t\t\t\t\t//let mTranslate = new THREE.Matrix4().makeTranslation(...clipSphere.position.toArray());\n\n\t\t\t\t\t//let clipToWorld = new THREE.Matrix4().multiplyMatrices(mTranslate, mScale);\n\t\t\t\t\tlet clipToWorld = clipSphere.matrixWorld;\n\t\t\t\t\tlet viewToWorld = camera.matrixWorld\n\t\t\t\t\tlet worldToClip = clipToWorld.clone().invert();\n\n\t\t\t\t\tlet viewToClip = new THREE.Matrix4().multiplyMatrices(worldToClip, viewToWorld);\n\n\t\t\t\t\tmatrices.push(viewToClip);\n\t\t\t\t}\n\n\t\t\t\tlet flattenedMatrices = [].concat(...matrices.map(matrix => matrix.elements));\n\n\t\t\t\tconst lClipSpheres = shader.uniformLocations[\"uClipSpheres[0]\"];\n\t\t\t\tgl.uniformMatrix4fv(lClipSpheres, false, flattenedMatrices);\n\t\t\t\t\n\t\t\t\t//const lClipSpheres = shader.uniformLocations[\"uClipSpheres[0]\"];\n\t\t\t\t//gl.uniformMatrix4fv(lClipSpheres, false, material.uniforms.clipSpheres.value);\n\t\t\t}\n\n\n\t\t\tshader.setUniform1f(\"size\", material.size);\n\t\t\tshader.setUniform1f(\"maxSize\", material.uniforms.maxSize.value);\n\t\t\tshader.setUniform1f(\"minSize\", material.uniforms.minSize.value);\n\n\n\t\t\t// uniform float uPCIndex\n\t\t\tshader.setUniform1f(\"uOctreeSpacing\", material.spacing);\n\t\t\tshader.setUniform(\"uOctreeSize\", material.uniforms.octreeSize.value);\n\n\n\t\t\t//uniform vec3 uColor;\n\t\t\tshader.setUniform3f(\"uColor\", material.color.toArray());\n\t\t\t//uniform float opacity;\n\t\t\tshader.setUniform1f(\"uOpacity\", material.opacity);\n\n\t\t\tshader.setUniform2f(\"elevationRange\", material.elevationRange);\n\t\t\tshader.setUniform2f(\"intensityRange\", material.intensityRange);\n\n\n\t\t\tshader.setUniform3f(\"uIntensity_gbc\", [\n\t\t\t\tmaterial.intensityGamma, \n\t\t\t\tmaterial.intensityBrightness, \n\t\t\t\tmaterial.intensityContrast\n\t\t\t]);\n\n\t\t\tshader.setUniform3f(\"uRGB_gbc\", [\n\t\t\t\tmaterial.rgbGamma, \n\t\t\t\tmaterial.rgbBrightness, \n\t\t\t\tmaterial.rgbContrast\n\t\t\t]);\n\n\t\t\tshader.setUniform1f(\"uTransition\", material.transition);\n\t\t\tshader.setUniform1f(\"wRGB\", material.weightRGB);\n\t\t\tshader.setUniform1f(\"wIntensity\", material.weightIntensity);\n\t\t\tshader.setUniform1f(\"wElevation\", material.weightElevation);\n\t\t\tshader.setUniform1f(\"wClassification\", material.weightClassification);\n\t\t\tshader.setUniform1f(\"wReturnNumber\", material.weightReturnNumber);\n\t\t\tshader.setUniform1f(\"wSourceID\", material.weightSourceID);\n\n\t\t\tshader.setUniform(\"backfaceCulling\", material.uniforms.backfaceCulling.value);\n\n\t\t\tlet vnWebGLTexture = this.textures.get(material.visibleNodesTexture);\n\t\t\tif(vnWebGLTexture){\n\t\t\t\tshader.setUniform1i(\"visibleNodesTexture\", currentTextureBindingPoint);\n\t\t\t\tgl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint);\n\t\t\t\tgl.bindTexture(vnWebGLTexture.target, vnWebGLTexture.id);\n\t\t\t\tcurrentTextureBindingPoint++;\n\t\t\t}\n\n\t\t\tlet gradientTexture = this.textures.get(material.gradientTexture);\n\t\t\tshader.setUniform1i(\"gradient\", currentTextureBindingPoint);\n\t\t\tgl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint);\n\t\t\tgl.bindTexture(gradientTexture.target, gradientTexture.id);\n\n\t\t\tconst repeat = material.elevationGradientRepeat;\n\t\t\tif(repeat === ElevationGradientRepeat.REPEAT){\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.REPEAT);\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.REPEAT);\n\t\t\t}else if(repeat === ElevationGradientRepeat.MIRRORED_REPEAT){\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t\t\t}else{\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\t\t\tgl.texParameteri(gradientTexture.target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\t\t}\n\t\t\tcurrentTextureBindingPoint++;\n\n\t\t\tlet classificationTexture = this.textures.get(material.classificationTexture);\n\t\t\tshader.setUniform1i(\"classificationLUT\", currentTextureBindingPoint);\n\t\t\tgl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint);\n\t\t\tgl.bindTexture(classificationTexture.target, classificationTexture.id);\n\t\t\tcurrentTextureBindingPoint++;\n\n\t\t\tlet matcapTexture = this.textures.get(material.matcapTexture);\n\t\t\tshader.setUniform1i(\"matcapTextureUniform\", currentTextureBindingPoint);\n\t\t\tgl.activeTexture(gl.TEXTURE0 + currentTextureBindingPoint);\n\t\t\tgl.bindTexture(matcapTexture.target, matcapTexture.id);\n\t\t\tcurrentTextureBindingPoint++;\n\n\n\t\t\tif (material.snapEnabled === true) {\n\n\t\t\t\t{\n\t\t\t\t\tconst lSnapshot = shader.uniformLocations[\"uSnapshot[0]\"];\n\t\t\t\t\tconst lSnapshotDepth = shader.uniformLocations[\"uSnapshotDepth[0]\"];\n\n\t\t\t\t\tlet bindingStart = currentTextureBindingPoint;\n\t\t\t\t\tlet lSnapshotBindingPoints = new Array(5).fill(bindingStart).map((a, i) => (a + i));\n\t\t\t\t\tlet lSnapshotDepthBindingPoints = new Array(5)\n\t\t\t\t\t\t.fill(1 + Math.max(...lSnapshotBindingPoints))\n\t\t\t\t\t\t.map((a, i) => (a + i));\n\t\t\t\t\tcurrentTextureBindingPoint = 1 + Math.max(...lSnapshotDepthBindingPoints);\n\n\t\t\t\t\tgl.uniform1iv(lSnapshot, lSnapshotBindingPoints);\n\t\t\t\t\tgl.uniform1iv(lSnapshotDepth, lSnapshotDepthBindingPoints);\n\n\t\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\t\tlet texture = material.uniforms[`uSnapshot`].value[i];\n\t\t\t\t\t\tlet textureDepth = material.uniforms[`uSnapshotDepth`].value[i];\n\n\t\t\t\t\t\tif (!texture) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet snapTexture = this.threeRenderer.properties.get(texture).__webglTexture;\n\t\t\t\t\t\tlet snapTextureDepth = this.threeRenderer.properties.get(textureDepth).__webglTexture;\n\n\t\t\t\t\t\tlet bindingPoint = lSnapshotBindingPoints[i];\n\t\t\t\t\t\tlet depthBindingPoint = lSnapshotDepthBindingPoints[i];\n\n\t\t\t\t\t\tgl.activeTexture(gl[`TEXTURE${bindingPoint}`]);\n\t\t\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, snapTexture);\n\n\t\t\t\t\t\tgl.activeTexture(gl[`TEXTURE${depthBindingPoint}`]);\n\t\t\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, snapTextureDepth);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\tlet flattenedMatrices = [].concat(...material.uniforms.uSnapView.value.map(c => c.elements));\n\t\t\t\t\tconst lSnapView = shader.uniformLocations[\"uSnapView[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lSnapView, false, flattenedMatrices);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tlet flattenedMatrices = [].concat(...material.uniforms.uSnapProj.value.map(c => c.elements));\n\t\t\t\t\tconst lSnapProj = shader.uniformLocations[\"uSnapProj[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lSnapProj, false, flattenedMatrices);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tlet flattenedMatrices = [].concat(...material.uniforms.uSnapProjInv.value.map(c => c.elements));\n\t\t\t\t\tconst lSnapProjInv = shader.uniformLocations[\"uSnapProjInv[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lSnapProjInv, false, flattenedMatrices);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tlet flattenedMatrices = [].concat(...material.uniforms.uSnapViewInv.value.map(c => c.elements));\n\t\t\t\t\tconst lSnapViewInv = shader.uniformLocations[\"uSnapViewInv[0]\"];\n\t\t\t\t\tgl.uniformMatrix4fv(lSnapViewInv, false, flattenedMatrices);\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tthis.renderNodes(octree, nodes, visibilityTextureData, camera, target, shader, params);\n\n\t\tgl.activeTexture(gl.TEXTURE2);\n\t\tgl.bindTexture(gl.TEXTURE_2D, null);\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t}\n\n\trender(scene, camera, target = null, params = {}) {\n\n\t\tconst gl = this.gl;\n\n\t\t// PREPARE \n\t\tif (target != null) {\n\t\t\tthis.threeRenderer.setRenderTarget(target);\n\t\t}\n\n\t\t//camera.updateProjectionMatrix();\n\t\t// camera.matrixWorldInverse.invert(camera.matrixWorld);\n\n\t\tconst traversalResult = this.traverse(scene);\n\n\n\t\t// RENDER\n\t\tfor (const octree of traversalResult.octrees) {\n\t\t\tlet nodes = octree.visibleNodes;\n\t\t\tthis.renderOctree(octree, nodes, camera, target, params);\n\t\t}\n\n\n\t\t// CLEANUP\n\t\tgl.activeTexture(gl.TEXTURE1);\n\t\tgl.bindTexture(gl.TEXTURE_2D, null);\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, null);\n\t\tgl.bindVertexArray(null);\n\n\t\tthis.threeRenderer.resetState();\n\t}\n\n\n\n};\n\n\n\n\n\n\n\n\n","\nimport * as THREE from \"../libs/three.js/build/three.module.js\";\nimport {Points} from \"./Points.js\";\n\nexport class ProfileData {\n\tconstructor (profile) {\n\t\tthis.profile = profile;\n\n\t\tthis.segments = [];\n\t\tthis.boundingBox = new THREE.Box3();\n\n\t\tfor (let i = 0; i < profile.points.length - 1; i++) {\n\t\t\tlet start = profile.points[i];\n\t\t\tlet end = profile.points[i + 1];\n\n\t\t\tlet startGround = new THREE.Vector3(start.x, start.y, 0);\n\t\t\tlet endGround = new THREE.Vector3(end.x, end.y, 0);\n\n\t\t\tlet center = new THREE.Vector3().addVectors(endGround, startGround).multiplyScalar(0.5);\n\t\t\tlet length = startGround.distanceTo(endGround);\n\t\t\tlet side = new THREE.Vector3().subVectors(endGround, startGround).normalize();\n\t\t\tlet up = new THREE.Vector3(0, 0, 1);\n\t\t\tlet forward = new THREE.Vector3().crossVectors(side, up).normalize();\n\t\t\tlet N = forward;\n\t\t\tlet cutPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(N, startGround);\n\t\t\tlet halfPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(side, center);\n\n\t\t\tlet segment = {\n\t\t\t\tstart: start,\n\t\t\t\tend: end,\n\t\t\t\tcutPlane: cutPlane,\n\t\t\t\thalfPlane: halfPlane,\n\t\t\t\tlength: length,\n\t\t\t\tpoints: new Points()\n\t\t\t};\n\n\t\t\tthis.segments.push(segment);\n\t\t}\n\t}\n\n\tsize () {\n\t\tlet size = 0;\n\t\tfor (let segment of this.segments) {\n\t\t\tsize += segment.points.numPoints;\n\t\t}\n\n\t\treturn size;\n\t}\n};\n\nexport class ProfileRequest {\n\tconstructor (pointcloud, profile, maxDepth, callback) {\n\t\tthis.pointcloud = pointcloud;\n\t\tthis.profile = profile;\n\t\tthis.maxDepth = maxDepth || Number.MAX_VALUE;\n\t\tthis.callback = callback;\n\t\tthis.temporaryResult = new ProfileData(this.profile);\n\t\tthis.pointsServed = 0;\n\t\tthis.highestLevelServed = 0;\n\n\t\tthis.priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; });\n\n\t\tthis.initialize();\n\t}\n\n\tinitialize () {\n\t\tthis.priorityQueue.push({node: this.pointcloud.pcoGeometry.root, weight: Infinity});\n\t};\n\n\t// traverse the node and add intersecting descendants to queue\n\ttraverse (node) {\n\t\tlet stack = [];\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tlet child = node.children[i];\n\t\t\tif (child && this.pointcloud.nodeIntersectsProfile(child, this.profile)) {\n\t\t\t\tstack.push(child);\n\t\t\t}\n\t\t}\n\n\t\twhile (stack.length > 0) {\n\t\t\tlet node = stack.pop();\n\t\t\tlet weight = node.boundingSphere.radius;\n\n\t\t\tthis.priorityQueue.push({node: node, weight: weight});\n\n\t\t\t// add children that intersect the cutting plane\n\t\t\tif (node.level < this.maxDepth) {\n\t\t\t\tfor (let i = 0; i < 8; i++) {\n\t\t\t\t\tlet child = node.children[i];\n\t\t\t\t\tif (child && this.pointcloud.nodeIntersectsProfile(child, this.profile)) {\n\t\t\t\t\t\tstack.push(child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tupdate(){\n\t\tif(!this.updateGeneratorInstance){\n\t\t\tthis.updateGeneratorInstance = this.updateGenerator();\n\t\t}\n\n\t\tlet result = this.updateGeneratorInstance.next();\n\t\tif(result.done){\n\t\t\tthis.updateGeneratorInstance = null;\n\t\t}\n\t}\n\n\t* updateGenerator(){\n\t\t// load nodes in queue\n\t\t// if hierarchy expands, also load nodes from expanded hierarchy\n\t\t// once loaded, add data to this.points and remove node from queue\n\t\t// only evaluate 1-50 nodes per frame to maintain responsiveness\n\n\t\tlet start = performance.now();\n\n\t\tlet maxNodesPerUpdate = 1;\n\t\tlet intersectedNodes = [];\n\n\t\tfor (let i = 0; i < Math.min(maxNodesPerUpdate, this.priorityQueue.size()); i++) {\n\t\t\tlet element = this.priorityQueue.pop();\n\t\t\tlet node = element.node;\n\n\t\t\tif(node.level > this.maxDepth){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (node.loaded) {\n\t\t\t\t// add points to result\n\t\t\t\tintersectedNodes.push(node);\n\t\t\t\texports.lru.touch(node);\n\t\t\t\tthis.highestLevelServed = Math.max(node.getLevel(), this.highestLevelServed);\n\n\t\t\t\tvar geom = node.pcoGeometry;\n\t\t\t\tvar hierarchyStepSize = geom ? geom.hierarchyStepSize : 1;\n\n\t\t\t\tvar doTraverse = node.getLevel() === 0 ||\n\t\t\t\t\t(node.level % hierarchyStepSize === 0 && node.hasChildren);\n\n\t\t\t\tif (doTraverse) {\n\t\t\t\t\tthis.traverse(node);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode.load();\n\t\t\t\tthis.priorityQueue.push(element);\n\t\t\t}\n\t\t}\n\n\t\tif (intersectedNodes.length > 0) {\n\n\t\t\tfor(let done of this.getPointsInsideProfile(intersectedNodes, this.temporaryResult)){\n\t\t\t\tif(!done){\n\t\t\t\t\t//console.log(\"updateGenerator yields\");\n\t\t\t\t\tyield false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.temporaryResult.size() > 100) {\n\t\t\t\tthis.pointsServed += this.temporaryResult.size();\n\t\t\t\tthis.callback.onProgress({request: this, points: this.temporaryResult});\n\t\t\t\tthis.temporaryResult = new ProfileData(this.profile);\n\t\t\t}\n\t\t}\n\n\t\tif (this.priorityQueue.size() === 0) {\n\t\t\t// we're done! inform callback and remove from pending requests\n\n\t\t\tif (this.temporaryResult.size() > 0) {\n\t\t\t\tthis.pointsServed += this.temporaryResult.size();\n\t\t\t\tthis.callback.onProgress({request: this, points: this.temporaryResult});\n\t\t\t\tthis.temporaryResult = new ProfileData(this.profile);\n\t\t\t}\n\n\t\t\tthis.callback.onFinish({request: this});\n\n\t\t\tlet index = this.pointcloud.profileRequests.indexOf(this);\n\t\t\tif (index >= 0) {\n\t\t\t\tthis.pointcloud.profileRequests.splice(index, 1);\n\t\t\t}\n\t\t}\n\n\t\tyield true;\n\t};\n\n\t* getAccepted(numPoints, node, matrix, segment, segmentDir, points, totalMileage){\n\t\tlet checkpoint = performance.now();\n\n\t\tlet accepted = new Uint32Array(numPoints);\n\t\tlet mileage = new Float64Array(numPoints);\n\t\tlet acceptedPositions = new Float32Array(numPoints * 3);\n\t\tlet numAccepted = 0;\n\n\t\tlet pos = new THREE.Vector3();\n\t\tlet svp = new THREE.Vector3();\n\n\t\tlet view = new Float32Array(node.geometry.attributes.position.array);\n\n\t\tfor (let i = 0; i < numPoints; i++) {\n\n\t\t\tpos.set(\n\t\t\t\tview[i * 3 + 0],\n\t\t\t\tview[i * 3 + 1],\n\t\t\t\tview[i * 3 + 2]);\n\n\t\t\tpos.applyMatrix4(matrix);\n\t\t\tlet distance = Math.abs(segment.cutPlane.distanceToPoint(pos));\n\t\t\tlet centerDistance = Math.abs(segment.halfPlane.distanceToPoint(pos));\n\n\t\t\tif (distance < this.profile.width / 2 && centerDistance < segment.length / 2) {\n\t\t\t\tsvp.subVectors(pos, segment.start);\n\t\t\t\tlet localMileage = segmentDir.dot(svp);\n\n\t\t\t\taccepted[numAccepted] = i;\n\t\t\t\tmileage[numAccepted] = localMileage + totalMileage;\n\t\t\t\tpoints.boundingBox.expandByPoint(pos);\n\n\t\t\t\tpos.sub(this.pointcloud.position);\n\n\t\t\t\tacceptedPositions[3 * numAccepted + 0] = pos.x;\n\t\t\t\tacceptedPositions[3 * numAccepted + 1] = pos.y;\n\t\t\t\tacceptedPositions[3 * numAccepted + 2] = pos.z;\n\n\t\t\t\tnumAccepted++;\n\t\t\t}\n\n\t\t\tif((i % 1000) === 0){\n\t\t\t\tlet duration = performance.now() - checkpoint;\n\t\t\t\tif(duration > 4){\n\t\t\t\t\t//console.log(`getAccepted yield after ${duration}ms`);\n\t\t\t\t\tyield false;\n\t\t\t\t\tcheckpoint = performance.now();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\taccepted = accepted.subarray(0, numAccepted);\n\t\tmileage = mileage.subarray(0, numAccepted);\n\t\tacceptedPositions = acceptedPositions.subarray(0, numAccepted * 3);\n\n\t\t//let end = performance.now();\n\t\t//let duration = end - start;\n\t\t//console.log(\"accepted duration \", duration)\n\n\t\t//console.log(`getAccepted finished`);\n\n\t\tyield [accepted, mileage, acceptedPositions];\n\t}\n\n\t* getPointsInsideProfile(nodes, target){\n\t\tlet checkpoint = performance.now();\n\t\tlet totalMileage = 0;\n\n\t\tlet pointsProcessed = 0;\n\n\t\tfor (let segment of target.segments) {\n\t\t\tfor (let node of nodes) {\n\t\t\t\tlet numPoints = node.numPoints;\n\t\t\t\tlet geometry = node.geometry;\n\n\t\t\t\tif(!numPoints){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t{ // skip if current node doesn't intersect current segment\n\t\t\t\t\tlet bbWorld = node.boundingBox.clone().applyMatrix4(this.pointcloud.matrixWorld);\n\t\t\t\t\tlet bsWorld = bbWorld.getBoundingSphere(new THREE.Sphere());\n\n\t\t\t\t\tlet start = new THREE.Vector3(segment.start.x, segment.start.y, bsWorld.center.z);\n\t\t\t\t\tlet end = new THREE.Vector3(segment.end.x, segment.end.y, bsWorld.center.z);\n\n\t\t\t\t\tlet closest = new THREE.Line3(start, end).closestPointToPoint(bsWorld.center, true, new THREE.Vector3());\n\t\t\t\t\tlet distance = closest.distanceTo(bsWorld.center);\n\n\t\t\t\t\tlet intersects = (distance < (bsWorld.radius + target.profile.width));\n\n\t\t\t\t\tif(!intersects){\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//{// DEBUG\n\t\t\t\t//\tconsole.log(node.name);\n\t\t\t\t//\tlet boxHelper = new Potree.Box3Helper(node.getBoundingBox());\n\t\t\t\t//\tboxHelper.matrixAutoUpdate = false;\n\t\t\t\t//\tboxHelper.matrix.copy(viewer.scene.pointclouds[0].matrixWorld);\n\t\t\t\t//\tviewer.scene.scene.add(boxHelper);\n\t\t\t\t//}\n\n\t\t\t\tlet sv = new THREE.Vector3().subVectors(segment.end, segment.start).setZ(0);\n\t\t\t\tlet segmentDir = sv.clone().normalize();\n\n\t\t\t\tlet points = new Points();\n\n\t\t\t\tlet nodeMatrix = new THREE.Matrix4().makeTranslation(...node.boundingBox.min.toArray());\n\n\t\t\t\tlet matrix = new THREE.Matrix4().multiplyMatrices(\n\t\t\t\t\tthis.pointcloud.matrixWorld, nodeMatrix);\n\n\t\t\t\tpointsProcessed = pointsProcessed + numPoints;\n\n\t\t\t\tlet accepted = null;\n\t\t\t\tlet mileage = null;\n\t\t\t\tlet acceptedPositions = null;\n\t\t\t\tfor(let result of this.getAccepted(numPoints, node, matrix, segment, segmentDir, points,totalMileage)){\n\t\t\t\t\tif(!result){\n\t\t\t\t\t\tlet duration = performance.now() - checkpoint;\n\t\t\t\t\t\t//console.log(`getPointsInsideProfile yield after ${duration}ms`);\n\t\t\t\t\t\tyield false;\n\t\t\t\t\t\tcheckpoint = performance.now();\n\t\t\t\t\t}else{\n\t\t\t\t\t\t[accepted, mileage, acceptedPositions] = result;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet duration = performance.now() - checkpoint;\n\t\t\t\tif(duration > 4){\n\t\t\t\t\t//console.log(`getPointsInsideProfile yield after ${duration}ms`);\n\t\t\t\t\tyield false;\n\t\t\t\t\tcheckpoint = performance.now();\n\t\t\t\t}\n\n\t\t\t\tpoints.data.position = acceptedPositions;\n\n\t\t\t\tlet relevantAttributes = Object.keys(geometry.attributes).filter(a => ![\"position\", \"indices\"].includes(a));\n\t\t\t\tfor(let attributeName of relevantAttributes){\n\n\t\t\t\t\tlet attribute = geometry.attributes[attributeName];\n\t\t\t\t\tlet numElements = attribute.array.length / numPoints;\n\n\t\t\t\t\tif(numElements !== parseInt(numElements)){\n\t\t\t\t\t\tdebugger;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet Type = attribute.array.constructor;\n\n\t\t\t\t\tlet filteredBuffer = new Type(numElements * accepted.length);\n\n\t\t\t\t\tlet source = attribute.array;\n\t\t\t\t\tlet target = filteredBuffer;\n\n\t\t\t\t\tfor(let i = 0; i < accepted.length; i++){\n\n\t\t\t\t\t\tlet index = accepted[i];\n\n\t\t\t\t\t\tlet start = index * numElements;\n\t\t\t\t\t\tlet end = start + numElements;\n\t\t\t\t\t\tlet sub = source.subarray(start, end);\n\n\t\t\t\t\t\ttarget.set(sub, i * numElements);\n\t\t\t\t\t}\n\n\t\t\t\t\tpoints.data[attributeName] = filteredBuffer;\n\t\t\t\t}\n\n\t\t\t\tpoints.data['mileage'] = mileage;\n\t\t\t\tpoints.numPoints = accepted.length;\n\n\t\t\t\tsegment.points.add(points);\n\t\t\t}\n\n\t\t\ttotalMileage += segment.length;\n\t\t}\n\n\t\tfor (let segment of target.segments) {\n\t\t\ttarget.boundingBox.union(segment.points.boundingBox);\n\t\t}\n\n\t\t//console.log(`getPointsInsideProfile finished`);\n\t\tyield true;\n\t};\n\n\tfinishLevelThenCancel () {\n\t\tif (this.cancelRequested) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.maxDepth = this.highestLevelServed;\n\t\tthis.cancelRequested = true;\n\n\t\t//console.log(`maxDepth: ${this.maxDepth}`);\n\t};\n\n\tcancel () {\n\t\tthis.callback.onCancel();\n\n\t\tthis.priorityQueue = new BinaryHeap(function (x) { return 1 / x.weight; });\n\n\t\tlet index = this.pointcloud.profileRequests.indexOf(this);\n\t\tif (index >= 0) {\n\t\t\tthis.pointcloud.profileRequests.splice(index, 1);\n\t\t}\n\t};\n}\n","\nexport class Version{\n\n\tconstructor(version){\n\t\tthis.version = version;\n\t\tlet vmLength = (version.indexOf('.') === -1) ? version.length : version.indexOf('.');\n\t\tthis.versionMajor = parseInt(version.substr(0, vmLength));\n\t\tthis.versionMinor = parseInt(version.substr(vmLength + 1));\n\t\tif (this.versionMinor.length === 0) {\n\t\t\tthis.versionMinor = 0;\n\t\t}\n\t}\n\n\tnewerThan(version){\n\t\tlet v = new Version(version);\n\n\t\tif (this.versionMajor > v.versionMajor) {\n\t\t\treturn true;\n\t\t} else if (this.versionMajor === v.versionMajor && this.versionMinor > v.versionMinor) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tequalOrHigher(version){\n\t\tlet v = new Version(version);\n\n\t\tif (this.versionMajor > v.versionMajor) {\n\t\t\treturn true;\n\t\t} else if (this.versionMajor === v.versionMajor && this.versionMinor >= v.versionMinor) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tupTo(version){\n\t\treturn !this.newerThan(version);\n\t}\n\n}\n\n\n","\nexport class WorkerPool{\n\tconstructor(){\n\t\tthis.workers = {};\n\t}\n\n\tgetWorker(url){\n\t\tif (!this.workers[url]){\n\t\t\tthis.workers[url] = [];\n\t\t}\n\n\t\tif (this.workers[url].length === 0){\n\t\t\tlet worker = new Worker(url);\n\t\t\tthis.workers[url].push(worker);\n\t\t}\n\n\t\tlet worker = this.workers[url].pop();\n\n\t\treturn worker;\n\t}\n\n\treturnWorker(url, worker){\n\t\tthis.workers[url].push(worker);\n\t}\n};\n\n//Potree.workerPool = new Potree.WorkerPool();\n","\r\n\r\nfunction createPointcloudData(pointcloud) {\r\n\r\n\tlet material = pointcloud.material;\r\n\r\n\tlet ranges = [];\r\n\t\r\n\tfor(let [name, value] of material.ranges){\r\n\t\tranges.push({\r\n\t\t\tname: name,\r\n\t\t\tvalue: value,\r\n\t\t});\r\n\t}\r\n\r\n\tif(typeof material.elevationRange[0] === \"number\"){\r\n\t\tranges.push({\r\n\t\t\tname: \"elevationRange\",\r\n\t\t\tvalue: material.elevationRange,\r\n\t\t});\r\n\t}\r\n\tif(typeof material.intensityRange[0] === \"number\"){\r\n\t\tranges.push({\r\n\t\t\tname: \"intensityRange\",\r\n\t\t\tvalue: material.intensityRange,\r\n\t\t});\r\n\t}\r\n\r\n\tlet pointSizeTypeName = Object.entries(Potree.PointSizeType).find(e => e[1] === material.pointSizeType)[0];\r\n\r\n\tlet jsonMaterial = {\r\n\t\tactiveAttributeName: material.activeAttributeName,\r\n\t\tranges: ranges,\r\n\t\tsize: material.size,\r\n\t\tminSize: material.minSize,\r\n\t\tpointSizeType: pointSizeTypeName,\r\n\t\tmatcap: material.matcap,\r\n\t};\r\n\r\n\tconst pcdata = {\r\n\t\tname: pointcloud.name,\r\n\t\turl: pointcloud.pcoGeometry.url,\r\n\t\tposition: pointcloud.position.toArray(),\r\n\t\trotation: pointcloud.rotation.toArray(),\r\n\t\tscale: pointcloud.scale.toArray(),\r\n\t\tmaterial: jsonMaterial,\r\n\t};\r\n\r\n\treturn pcdata;\r\n}\r\n\r\nfunction createProfileData(profile){\r\n\tconst data = {\r\n\t\tuuid: profile.uuid,\r\n\t\tname: profile.name,\r\n\t\tpoints: profile.points.map(p => p.toArray()),\r\n\t\theight: profile.height,\r\n\t\twidth: profile.width,\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createVolumeData(volume){\r\n\tconst data = {\r\n\t\tuuid: volume.uuid,\r\n\t\ttype: volume.constructor.name,\r\n\t\tname: volume.name,\r\n\t\tposition: volume.position.toArray(),\r\n\t\trotation: volume.rotation.toArray(),\r\n\t\tscale: volume.scale.toArray(),\r\n\t\tvisible: volume.visible,\r\n\t\tclip: volume.clip,\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createCameraAnimationData(animation){\r\n\r\n\tconst controlPoints = animation.controlPoints.map( cp => {\r\n\t\tconst cpdata = {\r\n\t\t\tposition: cp.position.toArray(),\r\n\t\t\ttarget: cp.target.toArray(),\r\n\t\t};\r\n\r\n\t\treturn cpdata;\r\n\t});\r\n\r\n\tconst data = {\r\n\t\tuuid: animation.uuid,\r\n\t\tname: animation.name,\r\n\t\tduration: animation.duration,\r\n\t\tt: animation.t,\r\n\t\tcurveType: animation.curveType,\r\n\t\tvisible: animation.visible,\r\n\t\tcontrolPoints: controlPoints,\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createMeasurementData(measurement){\r\n\r\n\tconst data = {\r\n\t\tuuid: measurement.uuid,\r\n\t\tname: measurement.name,\r\n\t\tpoints: measurement.points.map(p => p.position.toArray()),\r\n\t\tshowDistances: measurement.showDistances,\r\n\t\tshowCoordinates: measurement.showCoordinates,\r\n\t\tshowArea: measurement.showArea,\r\n\t\tclosed: measurement.closed,\r\n\t\tshowAngles: measurement.showAngles,\r\n\t\tshowHeight: measurement.showHeight,\r\n\t\tshowCircle: measurement.showCircle,\r\n\t\tshowAzimuth: measurement.showAzimuth,\r\n\t\tshowEdges: measurement.showEdges,\r\n\t\tcolor: measurement.color.toArray(),\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createOrientedImagesData(images){\r\n\tconst data = {\r\n\t\tcameraParamsPath: images.cameraParamsPath,\r\n\t\timageParamsPath: images.imageParamsPath,\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createGeopackageData(geopackage){\r\n\tconst data = {\r\n\t\tpath: geopackage.path,\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createAnnotationData(annotation){\r\n\r\n\tconst data = {\r\n\t\tuuid: annotation.uuid,\r\n\t\ttitle: annotation.title.toString(),\r\n\t\tdescription: annotation.description,\r\n\t\tposition: annotation.position.toArray(),\r\n\t\toffset: annotation.offset.toArray(),\r\n\t\tchildren: [],\r\n\t};\r\n\r\n\tif(annotation.cameraPosition){\r\n\t\tdata.cameraPosition = annotation.cameraPosition.toArray();\r\n\t}\r\n\r\n\tif(annotation.cameraTarget){\r\n\t\tdata.cameraTarget = annotation.cameraTarget.toArray();\r\n\t}\r\n\r\n\tif(typeof annotation.radius !== \"undefined\"){\r\n\t\tdata.radius = annotation.radius;\r\n\t}\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createAnnotationsData(viewer){\r\n\t\r\n\tconst map = new Map();\r\n\r\n\tviewer.scene.annotations.traverseDescendants(a => {\r\n\t\tconst aData = createAnnotationData(a);\r\n\r\n\t\tmap.set(a, aData);\r\n\t});\r\n\r\n\tfor(const [annotation, data] of map){\r\n\t\tfor(const child of annotation.children){\r\n\t\t\tconst childData = map.get(child);\r\n\t\t\tdata.children.push(childData);\r\n\t\t}\r\n\t}\r\n\r\n\tconst annotations = viewer.scene.annotations.children.map(a => map.get(a));\r\n\r\n\treturn annotations;\r\n}\r\n\r\nfunction createSettingsData(viewer){\r\n\treturn {\r\n\t\tpointBudget: viewer.getPointBudget(),\r\n\t\tfov: viewer.getFOV(),\r\n\t\tedlEnabled: viewer.getEDLEnabled(),\r\n\t\tedlRadius: viewer.getEDLRadius(),\r\n\t\tedlStrength: viewer.getEDLStrength(),\r\n\t\tbackground: viewer.getBackground(),\r\n\t\tminNodeSize: viewer.getMinNodeSize(),\r\n\t\tshowBoundingBoxes: viewer.getShowBoundingBox(),\r\n\t};\r\n}\r\n\r\nfunction createSceneContentData(viewer){\r\n\r\n\tconst data = [];\r\n\r\n\tconst potreeObjects = [];\r\n\r\n\tviewer.scene.scene.traverse(node => {\r\n\t\tif(node.potree){\r\n\t\t\tpotreeObjects.push(node);\r\n\t\t}\r\n\t});\r\n\r\n\tfor(const object of potreeObjects){\r\n\t\t\r\n\t\tif(object.potree.file){\r\n\t\t\tconst saveObject = {\r\n\t\t\t\tfile: object.potree.file,\r\n\t\t\t};\r\n\r\n\t\t\tdata.push(saveObject);\r\n\t\t}\r\n\r\n\r\n\t}\r\n\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createViewData(viewer){\r\n\tconst view = viewer.scene.view;\r\n\r\n\tconst data = {\r\n\t\tposition: view.position.toArray(),\r\n\t\ttarget: view.getPivot().toArray(),\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n\r\nfunction createClassificationData(viewer){\r\n\tconst classifications = viewer.classifications;\r\n\r\n\tconst data = classifications;\r\n\r\n\treturn data;\r\n}\r\n\r\nexport function saveProject(viewer) {\r\n\r\n\tconst scene = viewer.scene;\r\n\r\n\tconst data = {\r\n\t\ttype: \"Potree\",\r\n\t\tversion: 1.7,\r\n\t\tsettings: createSettingsData(viewer),\r\n\t\tview: createViewData(viewer),\r\n\t\tclassification: createClassificationData(viewer),\r\n\t\tpointclouds: scene.pointclouds.map(createPointcloudData),\r\n\t\tmeasurements: scene.measurements.map(createMeasurementData),\r\n\t\tvolumes: scene.volumes.map(createVolumeData),\r\n\t\tcameraAnimations: scene.cameraAnimations.map(createCameraAnimationData),\r\n\t\tprofiles: scene.profiles.map(createProfileData),\r\n\t\tannotations: createAnnotationsData(viewer),\r\n\t\torientedImages: scene.orientedImages.map(createOrientedImagesData),\r\n\t\tgeopackages: scene.geopackages.map(createGeopackageData),\r\n\t\t// objects: createSceneContentData(viewer),\r\n\t};\r\n\r\n\treturn data;\r\n}\r\n","\r\nimport * as THREE from \"../../../libs/three.js/build/three.module.js\";\r\nimport { EventDispatcher } from \"../../EventDispatcher.js\";\r\nimport { Utils } from \"../../utils.js\";\r\nimport {Line2} from \"../../../libs/three.js/lines/Line2.js\";\r\nimport {LineGeometry} from \"../../../libs/three.js/lines/LineGeometry.js\";\r\nimport {LineMaterial} from \"../../../libs/three.js/lines/LineMaterial.js\";\r\n\r\n\r\nclass ControlPoint{\r\n\r\n\tconstructor(){\r\n\t\tthis.position = new THREE.Vector3(0, 0, 0);\r\n\t\tthis.target = new THREE.Vector3(0, 0, 0);\r\n\t\tthis.positionHandle = null;\r\n\t\tthis.targetHandle = null;\r\n\t}\r\n\r\n};\r\n\r\n\r\n\r\nexport class CameraAnimation extends EventDispatcher{\r\n\r\n\tconstructor(viewer){\r\n\t\tsuper();\r\n\t\t\r\n\t\tthis.viewer = viewer;\r\n\r\n\t\tthis.selectedElement = null;\r\n\r\n\t\tthis.controlPoints = [];\r\n\r\n\t\tthis.uuid = THREE.Math.generateUUID();\r\n\r\n\t\tthis.node = new THREE.Object3D();\r\n\t\tthis.node.name = \"camera animation\";\r\n\t\tthis.viewer.scene.scene.add(this.node);\r\n\r\n\t\tthis.frustum = this.createFrustum();\r\n\t\tthis.node.add(this.frustum);\r\n\r\n\t\tthis.name = \"Camera Animation\";\r\n\t\tthis.duration = 5;\r\n\t\tthis.t = 0;\r\n\t\t// \"centripetal\", \"chordal\", \"catmullrom\"\r\n\t\tthis.curveType = \"centripetal\" \r\n\t\tthis.visible = true;\r\n\r\n\t\tthis.createUpdateHook();\r\n\t\tthis.createPath();\r\n\t}\r\n\r\n\tstatic defaultFromView(viewer){\r\n\t\tconst animation = new CameraAnimation(viewer);\r\n\r\n\t\tconst camera = viewer.scene.getActiveCamera();\r\n\t\tconst target = viewer.scene.view.getPivot();\r\n\r\n\t\tconst cpCenter = new THREE.Vector3(\r\n\t\t\t0.3 * camera.position.x + 0.7 * target.x,\r\n\t\t\t0.3 * camera.position.y + 0.7 * target.y,\r\n\t\t\t0.3 * camera.position.z + 0.7 * target.z,\r\n\t\t);\r\n\r\n\t\tconst targetCenter = new THREE.Vector3(\r\n\t\t\t0.05 * camera.position.x + 0.95 * target.x,\r\n\t\t\t0.05 * camera.position.y + 0.95 * target.y,\r\n\t\t\t0.05 * camera.position.z + 0.95 * target.z,\r\n\t\t);\r\n\r\n\t\tconst r = camera.position.distanceTo(target) * 0.3;\r\n\r\n\t\t//const dir = target.clone().sub(camera.position).normalize();\r\n\t\tconst angle = Utils.computeAzimuth(camera.position, target);\r\n\r\n\t\tconst n = 5;\r\n\t\tfor(let i = 0; i < n; i++){\r\n\t\t\tlet u = 1.5 * Math.PI * (i / n) + angle;\r\n\r\n\t\t\tconst dx = r * Math.cos(u);\r\n\t\t\tconst dy = r * Math.sin(u);\r\n\r\n\t\t\tconst cpPos = [\r\n\t\t\t\tcpCenter.x + dx,\r\n\t\t\t\tcpCenter.y + dy,\r\n\t\t\t\tcpCenter.z,\r\n\t\t\t];\r\n\r\n\t\t\tconst targetPos = [\r\n\t\t\t\ttargetCenter.x + dx * 0.1,\r\n\t\t\t\ttargetCenter.y + dy * 0.1,\r\n\t\t\t\ttargetCenter.z,\r\n\t\t\t];\r\n\r\n\t\t\tconst cp = animation.createControlPoint();\r\n\t\t\tcp.position.set(...cpPos);\r\n\t\t\tcp.target.set(...targetPos);\r\n\t\t}\r\n\r\n\t\treturn animation;\r\n\t}\r\n\r\n\tcreateUpdateHook(){\r\n\t\tconst viewer = this.viewer;\r\n\r\n\t\tviewer.addEventListener(\"update\", () => {\r\n\r\n\t\t\tconst camera = viewer.scene.getActiveCamera();\r\n\t\t\tconst {width, height} = viewer.renderer.getSize(new THREE.Vector2());\r\n\r\n\t\t\tthis.node.visible = this.visible;\r\n\r\n\t\t\tfor(const cp of this.controlPoints){\r\n\t\t\t\t\r\n\t\t\t\t{ // position\r\n\t\t\t\t\tconst projected = cp.position.clone().project(camera);\r\n\r\n\t\t\t\t\tconst visible = this.visible && (projected.z < 1 && projected.z > -1);\r\n\r\n\t\t\t\t\tif(visible){\r\n\t\t\t\t\t\tconst x = width * (projected.x * 0.5 + 0.5);\r\n\t\t\t\t\t\tconst y = height - height * (projected.y * 0.5 + 0.5);\r\n\r\n\t\t\t\t\t\tcp.positionHandle.svg.style.left = x - cp.positionHandle.svg.clientWidth / 2;\r\n\t\t\t\t\t\tcp.positionHandle.svg.style.top = y - cp.positionHandle.svg.clientHeight / 2;\r\n\t\t\t\t\t\tcp.positionHandle.svg.style.display = \"\";\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tcp.positionHandle.svg.style.display = \"none\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t{ // target\r\n\t\t\t\t\tconst projected = cp.target.clone().project(camera);\r\n\r\n\t\t\t\t\tconst visible = this.visible && (projected.z < 1 && projected.z > -1);\r\n\r\n\t\t\t\t\tif(visible){\r\n\t\t\t\t\t\tconst x = width * (projected.x * 0.5 + 0.5);\r\n\t\t\t\t\t\tconst y = height - height * (projected.y * 0.5 + 0.5);\r\n\r\n\t\t\t\t\t\tcp.targetHandle.svg.style.left = x - cp.targetHandle.svg.clientWidth / 2;\r\n\t\t\t\t\t\tcp.targetHandle.svg.style.top = y - cp.targetHandle.svg.clientHeight / 2;\r\n\t\t\t\t\t\tcp.targetHandle.svg.style.display = \"\";\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tcp.targetHandle.svg.style.display = \"none\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.line.material.resolution.set(width, height);\r\n\r\n\t\t\tthis.updatePath();\r\n\r\n\t\t\t{ // frustum\r\n\t\t\t\tconst frame = this.at(this.t);\r\n\t\t\t\tconst frustum = this.frustum;\r\n\r\n\t\t\t\tfrustum.position.copy(frame.position);\r\n\t\t\t\tfrustum.lookAt(...frame.target.toArray());\r\n\t\t\t\tfrustum.scale.set(20, 20, 20);\r\n\r\n\t\t\t\tfrustum.material.resolution.set(width, height);\r\n\t\t\t}\r\n\r\n\t\t});\r\n\t}\r\n\r\n\tcreateControlPoint(index){\r\n\r\n\t\tif(index === undefined){\r\n\t\t\tindex = this.controlPoints.length;\r\n\t\t}\r\n\r\n\t\tconst cp = new ControlPoint();\r\n\r\n\r\n\t\tif(this.controlPoints.length >= 2 && index === 0){\r\n\t\t\tconst cp1 = this.controlPoints[0];\r\n\t\t\tconst cp2 = this.controlPoints[1];\r\n\r\n\t\t\tconst dir = cp1.position.clone().sub(cp2.position).multiplyScalar(0.5);\r\n\t\t\tcp.position.copy(cp1.position).add(dir);\r\n\r\n\t\t\tconst tDir = cp1.target.clone().sub(cp2.target).multiplyScalar(0.5);\r\n\t\t\tcp.target.copy(cp1.target).add(tDir);\r\n\t\t}else if(this.controlPoints.length >= 2 && index === this.controlPoints.length){\r\n\t\t\tconst cp1 = this.controlPoints[this.controlPoints.length - 2];\r\n\t\t\tconst cp2 = this.controlPoints[this.controlPoints.length - 1];\r\n\r\n\t\t\tconst dir = cp2.position.clone().sub(cp1.position).multiplyScalar(0.5);\r\n\t\t\tcp.position.copy(cp1.position).add(dir);\r\n\r\n\t\t\tconst tDir = cp2.target.clone().sub(cp1.target).multiplyScalar(0.5);\r\n\t\t\tcp.target.copy(cp2.target).add(tDir);\r\n\t\t}else if(this.controlPoints.length >= 2){\r\n\t\t\tconst cp1 = this.controlPoints[index - 1];\r\n\t\t\tconst cp2 = this.controlPoints[index];\r\n\r\n\t\t\tcp.position.copy(cp1.position.clone().add(cp2.position).multiplyScalar(0.5));\r\n\t\t\tcp.target.copy(cp1.target.clone().add(cp2.target).multiplyScalar(0.5));\r\n\t\t}\r\n\r\n\t\t// cp.position.copy(viewer.scene.view.position);\r\n\t\t// cp.target.copy(viewer.scene.view.getPivot());\r\n\r\n\t\tcp.positionHandle = this.createHandle(cp.position);\r\n\t\tcp.targetHandle = this.createHandle(cp.target);\r\n\r\n\t\tthis.controlPoints.splice(index, 0, cp);\r\n\r\n\t\tthis.dispatchEvent({\r\n\t\t\ttype: \"controlpoint_added\",\r\n\t\t\tcontrolpoint: cp,\r\n\t\t});\r\n\r\n\t\treturn cp;\r\n\t}\r\n\r\n\tremoveControlPoint(cp){\r\n\t\tthis.controlPoints = this.controlPoints.filter(_cp => _cp !== cp);\r\n\r\n\t\tthis.dispatchEvent({\r\n\t\t\ttype: \"controlpoint_removed\",\r\n\t\t\tcontrolpoint: cp,\r\n\t\t});\r\n\r\n\t\tcp.positionHandle.svg.remove();\r\n\t\tcp.targetHandle.svg.remove();\r\n\r\n\t\t// TODO destroy cp\r\n\t}\r\n\r\n\tcreatePath(){\r\n\r\n\t\t{ // position\r\n\t\t\tconst geometry = new LineGeometry();\r\n\r\n\t\t\tlet material = new LineMaterial({ \r\n\t\t\t\tcolor: 0x00ff00, \r\n\t\t\t\tdashSize: 5, \r\n\t\t\t\tgapSize: 2,\r\n\t\t\t\tlinewidth: 2, \r\n\t\t\t\tresolution: new THREE.Vector2(1000, 1000),\r\n\t\t\t});\r\n\r\n\t\t\tconst line = new Line2(geometry, material);\r\n\r\n\t\t\tthis.line = line;\r\n\t\t\tthis.node.add(line);\r\n\t\t}\r\n\r\n\t\t{ // target\r\n\t\t\tconst geometry = new LineGeometry();\r\n\r\n\t\t\tlet material = new LineMaterial({ \r\n\t\t\t\tcolor: 0x0000ff, \r\n\t\t\t\tdashSize: 5, \r\n\t\t\t\tgapSize: 2,\r\n\t\t\t\tlinewidth: 2, \r\n\t\t\t\tresolution: new THREE.Vector2(1000, 1000),\r\n\t\t\t});\r\n\r\n\t\t\tconst line = new Line2(geometry, material);\r\n\r\n\t\t\tthis.targetLine = line;\r\n\t\t\tthis.node.add(line);\r\n\t\t}\r\n\t}\r\n\r\n\tcreateFrustum(){\r\n\r\n\t\tconst f = 0.3;\r\n\r\n\t\tconst positions = [\r\n\t\t\t 0, 0, 0,\r\n\t\t\t-f, -f, +1,\r\n\r\n\t\t\t 0, 0, 0,\r\n\t\t\t f, -f, +1,\r\n\r\n\t\t\t 0, 0, 0,\r\n\t\t\t f, f, +1,\r\n\r\n\t\t\t 0, 0, 0,\r\n\t\t\t-f, f, +1,\r\n\r\n\t\t\t-f, -f, +1,\r\n\t\t\t f, -f, +1,\r\n\r\n\t\t\t f, -f, +1,\r\n\t\t\t f, f, +1,\r\n\r\n\t\t\t f, f, +1,\r\n\t\t\t-f, f, +1,\r\n\r\n\t\t\t-f, f, +1,\r\n\t\t\t-f, -f, +1,\r\n\t\t];\r\n\r\n\t\tconst geometry = new LineGeometry();\r\n\r\n\t\tgeometry.setPositions(positions);\r\n\t\tgeometry.verticesNeedUpdate = true;\r\n\t\tgeometry.computeBoundingSphere();\r\n\r\n\t\tlet material = new LineMaterial({ \r\n\t\t\tcolor: 0xff0000, \r\n\t\t\tlinewidth: 2, \r\n\t\t\tresolution: new THREE.Vector2(1000, 1000),\r\n\t\t});\r\n\r\n\t\tconst line = new Line2(geometry, material);\r\n\t\tline.computeLineDistances();\r\n\t\t\r\n\t\treturn line;\r\n\t}\r\n\r\n\tupdatePath(){\r\n\r\n\t\t{ // positions\r\n\t\t\tconst positions = this.controlPoints.map(cp => cp.position);\r\n\t\t\tconst first = positions[0];\r\n\r\n\t\t\tconst curve = new THREE.CatmullRomCurve3(positions);\r\n\t\t\tcurve.curveType = this.curveType;\r\n\r\n\t\t\tconst n = 100;\r\n\r\n\t\t\tconst curvePositions = [];\r\n\t\t\tfor(let k = 0; k <= n; k++){\r\n\t\t\t\tconst t = k / n;\r\n\r\n\t\t\t\tconst position = curve.getPoint(t).sub(first);\r\n\r\n\t\t\t\tcurvePositions.push(position.x, position.y, position.z);\r\n\t\t\t}\r\n\r\n\t\t\tthis.line.geometry.setPositions(curvePositions);\r\n\t\t\tthis.line.geometry.verticesNeedUpdate = true;\r\n\t\t\tthis.line.geometry.computeBoundingSphere();\r\n\t\t\tthis.line.position.copy(first);\r\n\t\t\tthis.line.computeLineDistances();\r\n\r\n\t\t\tthis.cameraCurve = curve;\r\n\t\t}\r\n\r\n\t\t{ // targets\r\n\t\t\tconst positions = this.controlPoints.map(cp => cp.target);\r\n\t\t\tconst first = positions[0];\r\n\r\n\t\t\tconst curve = new THREE.CatmullRomCurve3(positions);\r\n\t\t\tcurve.curveType = this.curveType;\r\n\r\n\t\t\tconst n = 100;\r\n\r\n\t\t\tconst curvePositions = [];\r\n\t\t\tfor(let k = 0; k <= n; k++){\r\n\t\t\t\tconst t = k / n;\r\n\r\n\t\t\t\tconst position = curve.getPoint(t).sub(first);\r\n\r\n\t\t\t\tcurvePositions.push(position.x, position.y, position.z);\r\n\t\t\t}\r\n\r\n\t\t\tthis.targetLine.geometry.setPositions(curvePositions);\r\n\t\t\tthis.targetLine.geometry.verticesNeedUpdate = true;\r\n\t\t\tthis.targetLine.geometry.computeBoundingSphere();\r\n\t\t\tthis.targetLine.position.copy(first);\r\n\t\t\tthis.targetLine.computeLineDistances();\r\n\r\n\t\t\tthis.targetCurve = curve;\r\n\t\t}\r\n\t}\r\n\r\n\tat(t){\r\n\t\t\r\n\t\tif(t > 1){\r\n\t\t\tt = 1;\r\n\t\t}else if(t < 0){\r\n\t\t\tt = 0;\r\n\t\t}\r\n\r\n\t\tconst camPos = this.cameraCurve.getPointAt(t);\r\n\t\tconst target = this.targetCurve.getPointAt(t);\r\n\r\n\t\tconst frame = {\r\n\t\t\tposition: camPos,\r\n\t\t\ttarget: target,\r\n\t\t};\r\n\r\n\t\treturn frame;\r\n\t}\r\n\r\n\tset(t){\r\n\t\tthis.t = t;\r\n\t}\r\n\r\n\tcreateHandle(vector){\r\n\t\t\r\n\t\tconst svgns = \"http://www.w3.org/2000/svg\";\r\n\t\tconst svg = document.createElementNS(svgns, \"svg\");\r\n\r\n\t\tsvg.setAttribute(\"width\", \"2em\");\r\n\t\tsvg.setAttribute(\"height\", \"2em\");\r\n\t\tsvg.setAttribute(\"position\", \"absolute\");\r\n\r\n\t\tsvg.style.left = \"50px\";\r\n\t\tsvg.style.top = \"50px\";\r\n\t\tsvg.style.position = \"absolute\";\r\n\t\tsvg.style.zIndex = \"10000\";\r\n\r\n\t\tconst circle = document.createElementNS(svgns, 'circle');\r\n\t\tcircle.setAttributeNS(null, 'cx', \"1em\");\r\n\t\tcircle.setAttributeNS(null, 'cy', \"1em\");\r\n\t\tcircle.setAttributeNS(null, 'r', \"0.5em\");\r\n\t\tcircle.setAttributeNS(null, 'style', 'fill: red; stroke: black; stroke-width: 0.2em;' );\r\n\t\tsvg.appendChild(circle);\r\n\r\n\r\n\t\tconst element = this.viewer.renderer.domElement.parentElement;\r\n\t\telement.appendChild(svg);\r\n\r\n\r\n\t\tconst startDrag = (evt) => {\r\n\t\t\tthis.selectedElement = svg;\r\n\r\n\t\t\tdocument.addEventListener(\"mousemove\", drag);\r\n\t\t};\r\n\r\n\t\tconst endDrag = (evt) => {\r\n\t\t\tthis.selectedElement = null;\r\n\r\n\t\t\tdocument.removeEventListener(\"mousemove\", drag);\r\n\t\t};\r\n\r\n\t\tconst drag = (evt) => {\r\n\t\t\tif (this.selectedElement) {\r\n\t\t\t\tevt.preventDefault();\r\n\r\n\t\t\t\tconst rect = viewer.renderer.domElement.getBoundingClientRect();\r\n\r\n\t\t\t\tconst x = evt.clientX - rect.x;\r\n\t\t\t\tconst y = evt.clientY - rect.y;\r\n\r\n\t\t\t\tconst {width, height} = this.viewer.renderer.getSize(new THREE.Vector2());\r\n\t\t\t\tconst camera = this.viewer.scene.getActiveCamera();\r\n\t\t\t\t//const cp = this.controlPoints.find(cp => cp.handle.svg === svg);\r\n\t\t\t\tconst projected = vector.clone().project(camera);\r\n\r\n\t\t\t\tprojected.x = ((x / width) - 0.5) / 0.5;\r\n\t\t\t\tprojected.y = (-(y - height) / height - 0.5) / 0.5;\r\n\r\n\t\t\t\tconst unprojected = projected.clone().unproject(camera);\r\n\t\t\t\tvector.set(unprojected.x, unprojected.y, unprojected.z);\r\n\r\n\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tsvg.addEventListener('mousedown', startDrag);\r\n\t\tsvg.addEventListener('mouseup', endDrag);\r\n\r\n\t\tconst handle = {\r\n\t\t\tsvg: svg,\r\n\t\t};\r\n\r\n\t\treturn handle;\r\n\t}\r\n\r\n\tsetVisible(visible){\r\n\t\tthis.node.visible = visible;\r\n\r\n\t\tconst display = visible ? \"\" : \"none\";\r\n\r\n\t\tfor(const cp of this.controlPoints){\r\n\t\t\tcp.positionHandle.svg.style.display = display;\r\n\t\t\tcp.targetHandle.svg.style.display = display;\r\n\t\t}\r\n\r\n\t\tthis.visible = visible;\r\n\t}\r\n\r\n\tsetDuration(duration){\r\n\t\tthis.duration = duration;\r\n\t}\r\n\r\n\tgetDuration(duration){\r\n\t\treturn this.duration;\r\n\t}\r\n\r\n\tplay(){\r\n\r\n\t\tconst tStart = performance.now();\r\n\t\tconst duration = this.duration;\r\n\r\n\t\tconst originalyVisible = this.visible;\r\n\t\tthis.setVisible(false);\r\n\r\n\t\tconst onUpdate = (delta) => {\r\n\r\n\t\t\tlet tNow = performance.now();\r\n\t\t\tlet elapsed = (tNow - tStart) / 1000;\r\n\t\t\tlet t = elapsed / duration;\r\n\r\n\t\t\tthis.set(t);\r\n\r\n\t\t\tconst frame = this.at(t);\r\n\r\n\t\t\tviewer.scene.view.position.copy(frame.position);\r\n\t\t\tviewer.scene.view.lookAt(frame.target);\r\n\r\n\r\n\t\t\tif(t > 1){\r\n\t\t\t\tthis.setVisible(originalyVisible);\r\n\r\n\t\t\t\tthis.viewer.removeEventListener(\"update\", onUpdate);\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t\tthis.viewer.addEventListener(\"update\", onUpdate);\r\n\r\n\t}\r\n\r\n}\r\n\r\n\r\n","\r\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\r\nimport {Annotation} from \"../Annotation.js\";\r\nimport {Measure} from \"../utils/Measure.js\";\r\nimport {CameraAnimation} from \"../modules/CameraAnimation/CameraAnimation.js\";\r\nimport {Utils} from \"../utils.js\";\r\nimport {PointSizeType} from \"../defines.js\";\r\n\r\nfunction loadPointCloud(viewer, data){\r\n\r\n\tlet loadMaterial = (target) => {\r\n\r\n\t\tif(data.material){\r\n\r\n\t\t\tif(data.material.activeAttributeName != null){\r\n\t\t\t\ttarget.activeAttributeName = data.material.activeAttributeName;\r\n\t\t\t}\r\n\r\n\t\t\tif(data.material.ranges != null){\r\n\t\t\t\tfor(let range of data.material.ranges){\r\n\r\n\t\t\t\t\tif(range.name === \"elevationRange\"){\r\n\t\t\t\t\t\ttarget.elevationRange = range.value;\r\n\t\t\t\t\t}else if(range.name === \"intensityRange\"){\r\n\t\t\t\t\t\ttarget.intensityRange = range.value;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\ttarget.setRange(range.name, range.value);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(data.material.size != null){\r\n\t\t\t\ttarget.size = data.material.size;\r\n\t\t\t}\r\n\r\n\t\t\tif(data.material.minSize != null){\r\n\t\t\t\ttarget.minSize = data.material.minSize;\r\n\t\t\t}\r\n\r\n\t\t\tif(data.material.pointSizeType != null){\r\n\t\t\t\ttarget.pointSizeType = PointSizeType[data.material.pointSizeType];\r\n\t\t\t}\r\n\r\n\t\t\tif(data.material.matcap != null){\r\n\t\t\t\ttarget.matcap = data.material.matcap;\r\n\t\t\t}\r\n\r\n\t\t}else if(data.activeAttributeName != null){\r\n\t\t\ttarget.activeAttributeName = data.activeAttributeName;\r\n\t\t}else{\r\n\t\t\t// no material data\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tconst promise = new Promise((resolve) => {\r\n\r\n\t\tconst names = viewer.scene.pointclouds.map(p => p.name);\r\n\t\tconst alreadyExists = names.includes(data.name);\r\n\r\n\t\tif(alreadyExists){\r\n\t\t\tresolve();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tPotree.loadPointCloud(data.url, data.name, (e) => {\r\n\t\t\tconst {pointcloud} = e;\r\n\r\n\t\t\tpointcloud.position.set(...data.position);\r\n\t\t\tpointcloud.rotation.set(...data.rotation);\r\n\t\t\tpointcloud.scale.set(...data.scale);\r\n\r\n\t\t\tloadMaterial(pointcloud.material);\r\n\r\n\t\t\tviewer.scene.addPointCloud(pointcloud);\r\n\r\n\t\t\tresolve(pointcloud);\r\n\t\t});\r\n\t});\r\n\r\n\treturn promise;\r\n}\r\n\r\nfunction loadMeasurement(viewer, data){\r\n\r\n\tconst duplicate = viewer.scene.measurements.find(measure => measure.uuid === data.uuid);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst measure = new Measure();\r\n\r\n\tmeasure.uuid = data.uuid;\r\n\tmeasure.name = data.name;\r\n\tmeasure.showDistances = data.showDistances;\r\n\tmeasure.showCoordinates = data.showCoordinates;\r\n\tmeasure.showArea = data.showArea;\r\n\tmeasure.closed = data.closed;\r\n\tmeasure.showAngles = data.showAngles;\r\n\tmeasure.showHeight = data.showHeight;\r\n\tmeasure.showCircle = data.showCircle;\r\n\tmeasure.showAzimuth = data.showAzimuth;\r\n\tmeasure.showEdges = data.showEdges;\r\n\t// color\r\n\r\n\tfor(const point of data.points){\r\n\t\tconst pos = new THREE.Vector3(...point);\r\n\t\tmeasure.addMarker(pos);\r\n\t}\r\n\r\n\tviewer.scene.addMeasurement(measure);\r\n\r\n}\r\n\r\nfunction loadVolume(viewer, data){\r\n\r\n\tconst duplicate = viewer.scene.volumes.find(volume => volume.uuid === data.uuid);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet volume = new Potree[data.type];\r\n\r\n\tvolume.uuid = data.uuid;\r\n\tvolume.name = data.name;\r\n\tvolume.position.set(...data.position);\r\n\tvolume.rotation.set(...data.rotation);\r\n\tvolume.scale.set(...data.scale);\r\n\tvolume.visible = data.visible;\r\n\tvolume.clip = data.clip;\r\n\r\n\tviewer.scene.addVolume(volume);\r\n}\r\n\r\nfunction loadCameraAnimation(viewer, data){\r\n\r\n\tconst duplicate = viewer.scene.cameraAnimations.find(a => a.uuid === data.uuid);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst animation = new CameraAnimation(viewer);\r\n\r\n\tanimation.uuid = data.uuid;\r\n\tanimation.name = data.name;\r\n\tanimation.duration = data.duration;\r\n\tanimation.t = data.t;\r\n\tanimation.curveType = data.curveType;\r\n\tanimation.visible = data.visible;\r\n\tanimation.controlPoints = [];\r\n\r\n\tfor(const cpdata of data.controlPoints){\r\n\t\tconst cp = animation.createControlPoint();\r\n\r\n\t\tcp.position.set(...cpdata.position);\r\n\t\tcp.target.set(...cpdata.target);\r\n\t}\r\n\r\n\tviewer.scene.addCameraAnimation(animation);\r\n}\r\n\r\nfunction loadOrientedImages(viewer, images){\r\n\r\n\tconst {cameraParamsPath, imageParamsPath} = images;\r\n\r\n\tconst duplicate = viewer.scene.orientedImages.find(i => i.imageParamsPath === imageParamsPath);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tPotree.OrientedImageLoader.load(cameraParamsPath, imageParamsPath, viewer).then( images => {\r\n\t\tviewer.scene.addOrientedImages(images);\r\n\t});\r\n\r\n}\r\n\r\nfunction loadGeopackage(viewer, geopackage){\r\n\r\n\tconst path = geopackage.path;\r\n\r\n\tconst duplicate = viewer.scene.geopackages.find(i => i.path === path);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst projection = viewer.getProjection();\r\n\r\n\tproj4.defs(\"WGS84\", \"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs\");\r\n\tproj4.defs(\"pointcloud\", projection);\r\n\tconst transform = proj4(\"WGS84\", \"pointcloud\");\r\n\tconst params = {\r\n\t\ttransform: transform,\r\n\t};\r\n\r\n\tPotree.GeoPackageLoader.loadUrl(path, params).then(data => {\r\n\t\tviewer.scene.addGeopackage(data);\r\n\t});\r\n\t\r\n\r\n}\r\n\r\nfunction loadSettings(viewer, data){\r\n\tif(!data){\r\n\t\treturn;\r\n\t}\r\n\r\n\tviewer.setPointBudget(data.pointBudget);\r\n\tviewer.setFOV(data.fov);\r\n\tviewer.setEDLEnabled(data.edlEnabled);\r\n\tviewer.setEDLRadius(data.edlRadius);\r\n\tviewer.setEDLStrength(data.edlStrength);\r\n\tviewer.setBackground(data.background);\r\n\tviewer.setMinNodeSize(data.minNodeSize);\r\n\tviewer.setShowBoundingBox(data.showBoundingBoxes);\r\n}\r\n\r\nfunction loadView(viewer, view){\r\n\tviewer.scene.view.position.set(...view.position);\r\n\tviewer.scene.view.lookAt(...view.target);\r\n}\r\n\r\nfunction loadAnnotationItem(item){\r\n\r\n\tconst annotation = new Annotation({\r\n\t\tposition: item.position,\r\n\t\ttitle: item.title,\r\n\t\tcameraPosition: item.cameraPosition,\r\n\t\tcameraTarget: item.cameraTarget,\r\n\t});\r\n\r\n\r\n\tannotation.description = item.description;\r\n\tannotation.uuid = item.uuid;\r\n\r\n\tif(item.offset){\r\n\t\tannotation.offset.set(...item.offset);\r\n\t}\r\n\r\n\treturn annotation;\r\n}\r\n\r\nfunction loadAnnotations(viewer, data){\r\n\r\n\tif(!data){\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst findDuplicate = (item) => {\r\n\r\n\t\tlet duplicate = null;\r\n\r\n\t\tviewer.scene.annotations.traverse( a => {\r\n\t\t\tif(a.uuid === item.uuid){\r\n\t\t\t\tduplicate = a;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn duplicate;\r\n\t};\r\n\r\n\tconst traverse = (item, parent) => {\r\n\r\n\t\tconst duplicate = findDuplicate(item);\r\n\t\tif(duplicate){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst annotation = loadAnnotationItem(item);\r\n\r\n\t\tfor(const childItem of item.children){\r\n\t\t\ttraverse(childItem, annotation);\r\n\t\t}\r\n\r\n\t\tparent.add(annotation);\r\n\r\n\t};\r\n\r\n\tfor(const item of data){\r\n\t\ttraverse(item, viewer.scene.annotations);\r\n\t}\r\n\r\n}\r\n\r\nfunction loadProfile(viewer, data){\r\n\t\r\n\tconst {name, points} = data;\r\n\r\n\tconst duplicate = viewer.scene.profiles.find(profile => profile.uuid === data.uuid);\r\n\tif(duplicate){\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet profile = new Potree.Profile();\r\n\tprofile.name = name;\r\n\tprofile.uuid = data.uuid;\r\n\r\n\tprofile.setWidth(data.width);\r\n\r\n\tfor(const point of points){\r\n\t\tprofile.addMarker(new THREE.Vector3(...point));\r\n\t}\r\n\t\r\n\tviewer.scene.addProfile(profile);\r\n}\r\n\r\nfunction loadClassification(viewer, data){\r\n\tif(!data){\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst classifications = data;\r\n\r\n\tviewer.setClassifications(classifications);\r\n}\r\n\r\nexport async function loadProject(viewer, data){\r\n\r\n\tif(data.type !== \"Potree\"){\r\n\t\tconsole.error(\"not a valid Potree project\");\r\n\t\treturn;\r\n\t}\r\n\r\n\tloadSettings(viewer, data.settings);\r\n\r\n\tloadView(viewer, data.view);\r\n\r\n\tconst pointcloudPromises = [];\r\n\tfor(const pointcloud of data.pointclouds){\r\n\t\tconst promise = loadPointCloud(viewer, pointcloud);\r\n\t\tpointcloudPromises.push(promise);\r\n\t}\r\n\r\n\tfor(const measure of data.measurements){\r\n\t\tloadMeasurement(viewer, measure);\r\n\t}\r\n\r\n\tfor(const volume of data.volumes){\r\n\t\tloadVolume(viewer, volume);\r\n\t}\r\n\r\n\tfor(const animation of data.cameraAnimations){\r\n\t\tloadCameraAnimation(viewer, animation);\r\n\t}\r\n\r\n\tfor(const profile of data.profiles){\r\n\t\tloadProfile(viewer, profile);\r\n\t}\r\n\r\n\tif(data.orientedImages){\r\n\t\tfor(const images of data.orientedImages){\r\n\t\t\tloadOrientedImages(viewer, images);\r\n\t\t}\r\n\t}\r\n\r\n\tloadAnnotations(viewer, data.annotations);\r\n\r\n\tloadClassification(viewer, data.classification);\r\n\r\n\t// need to load at least one point cloud that defines the scene projection,\r\n\t// before we can load stuff in other projections such as geopackages\r\n\t//await Promise.any(pointcloudPromises); // (not yet supported)\r\n\tUtils.waitAny(pointcloudPromises).then( () => {\r\n\t\tif(data.geopackages){\r\n\t\t\tfor(const geopackage of data.geopackages){\r\n\t\t\t\tloadGeopackage(viewer, geopackage);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\tawait Promise.all(pointcloudPromises);\r\n}","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Shaders} from \"../../build/shaders/shaders.js\";\n\n//\n// Algorithm by Christian Boucheny\n// shader code taken and adapted from CloudCompare\n//\n// see\n// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL\n// http://www.kitware.com/source/home/post/9\n// https://tel.archives-ouvertes.fr/tel-00438464/document p. 115+ (french)\n\nexport class EyeDomeLightingMaterial extends THREE.RawShaderMaterial{\n\n\tconstructor(parameters = {}){\n\t\tsuper();\n\n\t\tlet uniforms = {\n\t\t\tscreenWidth: { type: 'f', \tvalue: 0 },\n\t\t\tscreenHeight: { type: 'f', \tvalue: 0 },\n\t\t\tedlStrength: { type: 'f', \tvalue: 1.0 },\n\t\t\tuNear: { type: 'f', \tvalue: 1.0 },\n\t\t\tuFar: { type: 'f', \tvalue: 1.0 },\n\t\t\tradius: { type: 'f', \tvalue: 1.0 },\n\t\t\tneighbours: { type: '2fv', \tvalue: [] },\n\t\t\tdepthMap: { type: 't', \tvalue: null },\n\t\t\tuEDLColor: { type: 't', \tvalue: null },\n\t\t\tuEDLDepth: { type: 't', \tvalue: null },\n\t\t\topacity: { type: 'f',\tvalue: 1.0 },\n\t\t\tuProj: { type: \"Matrix4fv\", value: [] },\n\t\t};\n\n\t\tthis.setValues({\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: this.getDefines() + Shaders['edl.vs'],\n\t\t\tfragmentShader: this.getDefines() + Shaders['edl.fs'],\n\t\t\tlights: false\n\t\t});\n\n\t\tthis.neighbourCount = 8;\n\t}\n\n\tgetDefines() {\n\t\tlet defines = '';\n\n\t\tdefines += '#define NEIGHBOUR_COUNT ' + this.neighbourCount + '\\n';\n\n\t\treturn defines;\n\t}\n\n\tupdateShaderSource() {\n\n\t\tlet vs = this.getDefines() + Shaders['edl.vs'];\n\t\tlet fs = this.getDefines() + Shaders['edl.fs'];\n\n\t\tthis.setValues({\n\t\t\tvertexShader: vs,\n\t\t\tfragmentShader: fs\n\t\t});\n\n\t\tthis.uniforms.neighbours.value = this.neighbours;\n\n\t\tthis.needsUpdate = true;\n\t}\n\n\tget neighbourCount(){\n\t\treturn this._neighbourCount;\n\t}\n\n\tset neighbourCount(value){\n\t\tif (this._neighbourCount !== value) {\n\t\t\tthis._neighbourCount = value;\n\t\t\tthis.neighbours = new Float32Array(this._neighbourCount * 2);\n\t\t\tfor (let c = 0; c < this._neighbourCount; c++) {\n\t\t\t\tthis.neighbours[2 * c + 0] = Math.cos(2 * c * Math.PI / this._neighbourCount);\n\t\t\t\tthis.neighbours[2 * c + 1] = Math.sin(2 * c * Math.PI / this._neighbourCount);\n\t\t\t}\n\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\n\t\n}\n\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Shaders} from \"../../build/shaders/shaders.js\";\n\n\nexport class NormalizationEDLMaterial extends THREE.RawShaderMaterial{\n\n\tconstructor(parameters = {}){\n\t\tsuper();\n\n\t\tlet uniforms = {\n\t\t\tscreenWidth: { type: 'f', value: 0 },\n\t\t\tscreenHeight: { type: 'f', value: 0 },\n\t\t\tedlStrength: { type: 'f', value: 1.0 },\n\t\t\tradius: { type: 'f', value: 1.0 },\n\t\t\tneighbours: { type: '2fv', value: [] },\n\t\t\tuEDLMap: { type: 't', value: null },\n\t\t\tuDepthMap: { type: 't', value: null },\n\t\t\tuWeightMap: { type: 't', value: null },\n\t\t};\n\n\t\tthis.setValues({\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: this.getDefines() + Shaders['normalize.vs'],\n\t\t\tfragmentShader: this.getDefines() + Shaders['normalize_and_edl.fs'],\n\t\t});\n\n\t\tthis.neighbourCount = 8;\n\t}\n\n\tgetDefines() {\n\t\tlet defines = '';\n\n\t\tdefines += '#define NEIGHBOUR_COUNT ' + this.neighbourCount + '\\n';\n\n\t\treturn defines;\n\t}\n\n\tupdateShaderSource() {\n\n\t\tlet vs = this.getDefines() + Shaders['normalize.vs'];\n\t\tlet fs = this.getDefines() + Shaders['normalize_and_edl.fs'];\n\n\t\tthis.setValues({\n\t\t\tvertexShader: vs,\n\t\t\tfragmentShader: fs\n\t\t});\n\n\t\tthis.uniforms.neighbours.value = this.neighbours;\n\n\t\tthis.needsUpdate = true;\n\t}\n\n\tget neighbourCount(){\n\t\treturn this._neighbourCount;\n\t}\n\n\tset neighbourCount(value){\n\t\tif (this._neighbourCount !== value) {\n\t\t\tthis._neighbourCount = value;\n\t\t\tthis.neighbours = new Float32Array(this._neighbourCount * 2);\n\t\t\tfor (let c = 0; c < this._neighbourCount; c++) {\n\t\t\t\tthis.neighbours[2 * c + 0] = Math.cos(2 * c * Math.PI / this._neighbourCount);\n\t\t\t\tthis.neighbours[2 * c + 1] = Math.sin(2 * c * Math.PI / this._neighbourCount);\n\t\t\t}\n\n\t\t\tthis.updateShaderSource();\n\t\t}\n\t}\n\t\n}\n\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Shaders} from \"../../build/shaders/shaders.js\";\n\nexport class NormalizationMaterial extends THREE.RawShaderMaterial{\n\n\tconstructor(parameters = {}){\n\t\tsuper();\n\n\t\tlet uniforms = {\n\t\t\tuDepthMap:\t\t{ type: 't', value: null },\n\t\t\tuWeightMap:\t\t{ type: 't', value: null },\n\t\t};\n\n\t\tthis.setValues({\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: this.getDefines() + Shaders['normalize.vs'],\n\t\t\tfragmentShader: this.getDefines() + Shaders['normalize.fs'],\n\t\t});\n\t}\n\n\tgetDefines() {\n\t\tlet defines = '';\n\n\t\treturn defines;\n\t}\n\n\tupdateShaderSource() {\n\n\t\tlet vs = this.getDefines() + Shaders['normalize.vs'];\n\t\tlet fs = this.getDefines() + Shaders['normalize.fs'];\n\n\t\tthis.setValues({\n\t\t\tvertexShader: vs,\n\t\t\tfragmentShader: fs\n\t\t});\n\n\t\tthis.needsUpdate = true;\n\t}\n\n}\n\n","\n\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Version} from \"../Version.js\";\nimport {XHRFactory} from \"../XHRFactory.js\";\n\n/**\n * laslaz code taken and adapted from plas.io js-laslaz\n *\thttp://plas.io/\n * https://github.com/verma/plasio\n *\n * Thanks to Uday Verma and Howard Butler\n *\n */\n\nexport class LasLazLoader {\n\n\tconstructor (version, extension) {\n\t\tif (typeof (version) === 'string') {\n\t\t\tthis.version = new Version(version);\n\t\t} else {\n\t\t\tthis.version = version;\n\t\t}\n\n\t\tthis.extension = extension;\n\t}\n\n\tstatic progressCB () {\n\n\t}\n\n\tload (node) {\n\t\tif (node.loaded) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet url = node.getURL();\n\n\t\tif (this.version.equalOrHigher('1.4')) {\n\t\t\turl += `.${this.extension}`;\n\t\t}\n\n\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open('GET', url, true);\n\t\txhr.responseType = 'arraybuffer';\n\t\txhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t\txhr.onreadystatechange = () => {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tif (xhr.status === 200 || xhr.status === 0) {\n\t\t\t\t\tlet buffer = xhr.response;\n\t\t\t\t\tthis.parse(node, buffer);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('Failed to load file! HTTP status: ' + xhr.status + ', file: ' + url);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\txhr.send(null);\n\t}\n\n\tasync parse(node, buffer){\n\t\tlet lf = new LASFile(buffer);\n\t\tlet handler = new LasLazBatcher(node);\n\n\t\ttry{\n\t\t\t await lf.open();\n\t\t\t lf.isOpen = true;\n\t\t}catch(e){\n\t\t\tconsole.log(\"failed to open file. :(\");\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet header = await lf.getHeader();\n\n\t\tlet skip = 1;\n\t\tlet totalRead = 0;\n\t\tlet totalToRead = (skip <= 1 ? header.pointsCount : header.pointsCount / skip);\n\n\t\tlet hasMoreData = true;\n\n\t\twhile(hasMoreData){\n\t\t\tlet data = await lf.readData(1000 * 1000, 0, skip);\n\n\t\t\thandler.push(new LASDecoder(data.buffer,\n\t\t\t\theader.pointsFormatId,\n\t\t\t\theader.pointsStructSize,\n\t\t\t\tdata.count,\n\t\t\t\theader.scale,\n\t\t\t\theader.offset,\n\t\t\t\theader.mins, header.maxs));\n\n\t\t\ttotalRead += data.count;\n\t\t\tLasLazLoader.progressCB(totalRead / totalToRead);\n\n\t\t\thasMoreData = data.hasMoreData;\n\t\t}\n\n\t\theader.totalRead = totalRead;\n\t\theader.versionAsString = lf.versionAsString;\n\t\theader.isCompressed = lf.isCompressed;\n\n\t\tLasLazLoader.progressCB(1);\n\n\t\ttry{\n\t\t\tawait lf.close();\n\n\t\t\tlf.isOpen = false;\n\t\t}catch(e){\n\t\t\tconsole.error(\"failed to close las/laz file!!!\");\n\t\t\t\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\thandle (node, url) {\n\n\t}\n};\n\nexport class LasLazBatcher{\n\n\tconstructor (node) {\n\t\tthis.node = node;\n\t}\n\n\tpush (lasBuffer) {\n\t\tconst workerPath = Potree.scriptPath + '/workers/LASDecoderWorker.js';\n\t\tconst worker = Potree.workerPool.getWorker(workerPath);\n\t\tconst node = this.node;\n\t\tconst pointAttributes = node.pcoGeometry.pointAttributes;\n\n\t\tworker.onmessage = (e) => {\n\t\t\tlet geometry = new THREE.BufferGeometry();\n\t\t\tlet numPoints = lasBuffer.pointsCount;\n\n\t\t\tlet positions = new Float32Array(e.data.position);\n\t\t\tlet colors = new Uint8Array(e.data.color);\n\t\t\tlet intensities = new Float32Array(e.data.intensity);\n\t\t\tlet classifications = new Uint8Array(e.data.classification);\n\t\t\tlet returnNumbers = new Uint8Array(e.data.returnNumber);\n\t\t\tlet numberOfReturns = new Uint8Array(e.data.numberOfReturns);\n\t\t\tlet pointSourceIDs = new Uint16Array(e.data.pointSourceID);\n\t\t\tlet indices = new Uint8Array(e.data.indices);\n\n\t\t\tgeometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n\t\t\tgeometry.setAttribute('color', new THREE.BufferAttribute(colors, 4, true));\n\t\t\tgeometry.setAttribute('intensity', new THREE.BufferAttribute(intensities, 1));\n\t\t\tgeometry.setAttribute('classification', new THREE.BufferAttribute(classifications, 1));\n\t\t\tgeometry.setAttribute('return number', new THREE.BufferAttribute(returnNumbers, 1));\n\t\t\tgeometry.setAttribute('number of returns', new THREE.BufferAttribute(numberOfReturns, 1));\n\t\t\tgeometry.setAttribute('source id', new THREE.BufferAttribute(pointSourceIDs, 1));\n\t\t\tgeometry.setAttribute('indices', new THREE.BufferAttribute(indices, 4));\n\t\t\tgeometry.attributes.indices.normalized = true;\n\n\t\t\tfor(const key in e.data.ranges){\n\t\t\t\tconst range = e.data.ranges[key];\n\n\t\t\t\tconst attribute = pointAttributes.attributes.find(a => a.name === key);\n\t\t\t\tattribute.range[0] = Math.min(attribute.range[0], range[0]);\n\t\t\t\tattribute.range[1] = Math.max(attribute.range[1], range[1]);\n\t\t\t}\n\n\t\t\tlet tightBoundingBox = new THREE.Box3(\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tgeometry.boundingBox = this.node.boundingBox;\n\t\t\tthis.node.tightBoundingBox = tightBoundingBox;\n\n\t\t\tthis.node.geometry = geometry;\n\t\t\tthis.node.numPoints = numPoints;\n\t\t\tthis.node.loaded = true;\n\t\t\tthis.node.loading = false;\n\t\t\tPotree.numNodesLoading--;\n\t\t\tthis.node.mean = new THREE.Vector3(...e.data.mean);\n\n\t\t\tPotree.workerPool.returnWorker(workerPath, worker);\n\t\t};\n\n\t\tlet message = {\n\t\t\tbuffer: lasBuffer.arrayb,\n\t\t\tnumPoints: lasBuffer.pointsCount,\n\t\t\tpointSize: lasBuffer.pointSize,\n\t\t\tpointFormatID: 2,\n\t\t\tscale: lasBuffer.scale,\n\t\t\toffset: lasBuffer.offset,\n\t\t\tmins: lasBuffer.mins,\n\t\t\tmaxs: lasBuffer.maxs\n\t\t};\n\t\tworker.postMessage(message, [message.buffer]);\n\t};\n}\n","\n\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Version} from \"../Version.js\";\nimport {XHRFactory} from \"../XHRFactory.js\";\n\n\nexport class BinaryLoader{\n\n\tconstructor(version, boundingBox, scale){\n\t\tif (typeof (version) === 'string') {\n\t\t\tthis.version = new Version(version);\n\t\t} else {\n\t\t\tthis.version = version;\n\t\t}\n\n\t\tthis.boundingBox = boundingBox;\n\t\tthis.scale = scale;\n\t}\n\n\tload(node){\n\t\tif (node.loaded) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet url = node.getURL();\n\n\t\tif (this.version.equalOrHigher('1.4')) {\n\t\t\turl += '.bin';\n\t\t}\n\n\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open('GET', url, true);\n\t\txhr.responseType = 'arraybuffer';\n\t\txhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t\txhr.onreadystatechange = () => {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tif((xhr.status === 200 || xhr.status === 0) && xhr.response !== null){\n\t\t\t\t\tlet buffer = xhr.response;\n\t\t\t\t\tthis.parse(node, buffer);\n\t\t\t\t} else {\n\t\t\t\t\t//console.error(`Failed to load file! HTTP status: ${xhr.status}, file: ${url}`);\n\t\t\t\t\tthrow new Error(`Failed to load file! HTTP status: ${xhr.status}, file: ${url}`);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t\n\t\ttry {\n\t\t\txhr.send(null);\n\t\t} catch (e) {\n\t\t\tconsole.log('fehler beim laden der punktwolke: ' + e);\n\t\t}\n\t};\n\n\tparse(node, buffer){\n\t\tlet pointAttributes = node.pcoGeometry.pointAttributes;\n\t\tlet numPoints = buffer.byteLength / node.pcoGeometry.pointAttributes.byteSize;\n\n\t\tif (this.version.upTo('1.5')) {\n\t\t\tnode.numPoints = numPoints;\n\t\t}\n\n\t\tlet workerPath = Potree.scriptPath + '/workers/BinaryDecoderWorker.js';\n\t\tlet worker = Potree.workerPool.getWorker(workerPath);\n\n\t\tworker.onmessage = function (e) {\n\n\t\t\tlet data = e.data;\n\t\t\tlet buffers = data.attributeBuffers;\n\t\t\tlet tightBoundingBox = new THREE.Box3(\n\t\t\t\tnew THREE.Vector3().fromArray(data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tPotree.workerPool.returnWorker(workerPath, worker);\n\n\t\t\tlet geometry = new THREE.BufferGeometry();\n\n\t\t\tfor(let property in buffers){\n\t\t\t\tlet buffer = buffers[property].buffer;\n\t\t\t\tlet batchAttribute = buffers[property].attribute;\n\n\t\t\t\tif (property === \"POSITION_CARTESIAN\") {\n\t\t\t\t\tgeometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t} else if (property === \"rgba\") {\n\t\t\t\t\tgeometry.setAttribute(\"rgba\", new THREE.BufferAttribute(new Uint8Array(buffer), 4, true));\n\t\t\t\t} else if (property === \"NORMAL_SPHEREMAPPED\") {\n\t\t\t\t\tgeometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t} else if (property === \"NORMAL_OCT16\") {\n\t\t\t\t\tgeometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t} else if (property === \"NORMAL\") {\n\t\t\t\t\tgeometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t} else if (property === \"INDICES\") {\n\t\t\t\t\tlet bufferAttribute = new THREE.BufferAttribute(new Uint8Array(buffer), 4);\n\t\t\t\t\tbufferAttribute.normalized = true;\n\t\t\t\t\tgeometry.setAttribute('indices', bufferAttribute);\n\t\t\t\t} else if (property === \"SPACING\") {\n\t\t\t\t\tlet bufferAttribute = new THREE.BufferAttribute(new Float32Array(buffer), 1);\n\t\t\t\t\tgeometry.setAttribute('spacing', bufferAttribute);\n\t\t\t\t} else {\n\t\t\t\t\tconst bufferAttribute = new THREE.BufferAttribute(new Float32Array(buffer), 1);\n\n\t\t\t\t\tbufferAttribute.potree = {\n\t\t\t\t\t\toffset: buffers[property].offset,\n\t\t\t\t\t\tscale: buffers[property].scale,\n\t\t\t\t\t\tpreciseBuffer: buffers[property].preciseBuffer,\n\t\t\t\t\t\trange: batchAttribute.range,\n\t\t\t\t\t};\n\n\t\t\t\t\tgeometry.setAttribute(property, bufferAttribute);\n\n\t\t\t\t\tconst attribute = pointAttributes.attributes.find(a => a.name === batchAttribute.name);\n\t\t\t\t\tattribute.range[0] = Math.min(attribute.range[0], batchAttribute.range[0]);\n\t\t\t\t\tattribute.range[1] = Math.max(attribute.range[1], batchAttribute.range[1]);\n\n\t\t\t\t\tif(node.getLevel() === 0){\n\t\t\t\t\t\tattribute.initialRange = batchAttribute.range;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttightBoundingBox.max.sub(tightBoundingBox.min);\n\t\t\ttightBoundingBox.min.set(0, 0, 0);\n\n\t\t\tlet numPoints = e.data.buffer.byteLength / pointAttributes.byteSize;\n\t\t\t\n\t\t\tnode.numPoints = numPoints;\n\t\t\tnode.geometry = geometry;\n\t\t\tnode.mean = new THREE.Vector3(...data.mean);\n\t\t\tnode.tightBoundingBox = tightBoundingBox;\n\t\t\tnode.loaded = true;\n\t\t\tnode.loading = false;\n\t\t\tnode.estimatedSpacing = data.estimatedSpacing;\n\t\t\tPotree.numNodesLoading--;\n\t\t};\n\n\t\tlet message = {\n\t\t\tbuffer: buffer,\n\t\t\tpointAttributes: pointAttributes,\n\t\t\tversion: this.version.version,\n\t\t\tmin: [ node.boundingBox.min.x, node.boundingBox.min.y, node.boundingBox.min.z ],\n\t\t\toffset: [node.pcoGeometry.offset.x, node.pcoGeometry.offset.y, node.pcoGeometry.offset.z],\n\t\t\tscale: this.scale,\n\t\t\tspacing: node.spacing,\n\t\t\thasChildren: node.hasChildren,\n\t\t\tname: node.name\n\t\t};\n\t\tworker.postMessage(message, [message.buffer]);\n\t};\n\n\t\n}\n\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {PointCloudOctreeGeometry, PointCloudOctreeGeometryNode} from \"../PointCloudOctreeGeometry.js\";\nimport {Version} from \"../Version.js\";\nimport {XHRFactory} from \"../XHRFactory.js\";\nimport {LasLazLoader} from \"./LasLazLoader.js\";\nimport {BinaryLoader} from \"./BinaryLoader.js\";\nimport {Utils} from \"../utils.js\";\nimport {PointAttribute, PointAttributes, PointAttributeTypes} from \"./PointAttributes.js\";\n\nfunction parseAttributes(cloudjs){\n\n\tlet version = new Version(cloudjs.version);\n\n\tconst replacements = {\n\t\t\"COLOR_PACKED\": \"rgba\",\n\t\t\"RGBA\": \"rgba\",\n\t\t\"INTENSITY\": \"intensity\",\n\t\t\"CLASSIFICATION\": \"classification\",\n\t\t\"GPS_TIME\": \"gps-time\",\n\t};\n\n\tconst replaceOldNames = (old) => {\n\t\tif(replacements[old]){\n\t\t\treturn replacements[old];\n\t\t}else{\n\t\t\treturn old;\n\t\t}\n\t};\n\n\tconst pointAttributes = [];\n\tif(version.upTo('1.7')){\n\t\t\n\t\tfor(let attributeName of cloudjs.pointAttributes){\n\t\t\tconst oldAttribute = PointAttribute[attributeName];\n\n\t\t\tconst attribute = {\n\t\t\t\tname: oldAttribute.name,\n\t\t\t\tsize: oldAttribute.byteSize,\n\t\t\t\telements: oldAttribute.numElements,\n\t\t\t\telementSize: oldAttribute.byteSize / oldAttribute.numElements,\n\t\t\t\ttype: oldAttribute.type.name,\n\t\t\t\tdescription: \"\",\n\t\t\t};\n\n\t\t\tpointAttributes.push(attribute);\n\t\t}\n\n\t}else{\n\t\tpointAttributes.push(...cloudjs.pointAttributes);\n\t}\n\n\n\t{\n\t\tconst attributes = new PointAttributes();\n\n\t\tconst typeConversion = {\n\t\t\tint8: PointAttributeTypes.DATA_TYPE_INT8,\n\t\t\tint16: PointAttributeTypes.DATA_TYPE_INT16,\n\t\t\tint32: PointAttributeTypes.DATA_TYPE_INT32,\n\t\t\tint64: PointAttributeTypes.DATA_TYPE_INT64,\n\t\t\tuint8: PointAttributeTypes.DATA_TYPE_UINT8,\n\t\t\tuint16: PointAttributeTypes.DATA_TYPE_UINT16,\n\t\t\tuint32: PointAttributeTypes.DATA_TYPE_UINT32,\n\t\t\tuint64: PointAttributeTypes.DATA_TYPE_UINT64,\n\t\t\tdouble: PointAttributeTypes.DATA_TYPE_DOUBLE,\n\t\t\tfloat: PointAttributeTypes.DATA_TYPE_FLOAT,\n\t\t};\n\n\t\tfor(const jsAttribute of pointAttributes){\n\t\t\tconst name = replaceOldNames(jsAttribute.name);\n\t\t\tconst type = typeConversion[jsAttribute.type];\n\t\t\tconst numElements = jsAttribute.elements;\n\t\t\tconst description = jsAttribute.description;\n\n\t\t\tconst attribute = new PointAttribute(name, type, numElements);\n\n\t\t\tattributes.add(attribute);\n\t\t}\n\n\t\t{\n\t\t\t// check if it has normals\n\t\t\tlet hasNormals = \n\t\t\t\tpointAttributes.find(a => a.name === \"NormalX\") !== undefined &&\n\t\t\t\tpointAttributes.find(a => a.name === \"NormalY\") !== undefined &&\n\t\t\t\tpointAttributes.find(a => a.name === \"NormalZ\") !== undefined;\n\n\t\t\tif(hasNormals){\n\t\t\t\tlet vector = {\n\t\t\t\t\tname: \"NORMAL\",\n\t\t\t\t\tattributes: [\"NormalX\", \"NormalY\", \"NormalZ\"],\n\t\t\t\t};\n\t\t\t\tattributes.addVector(vector);\n\t\t\t}\n\t\t}\n\n\t\treturn attributes;\n\t}\n\n}\n\nfunction lasLazAttributes(fMno){\n\tconst attributes = new PointAttributes();\n\n\tattributes.add(PointAttribute.POSITION_CARTESIAN);\n\tattributes.add(new PointAttribute(\"rgba\", PointAttributeTypes.DATA_TYPE_UINT8, 4));\n\tattributes.add(new PointAttribute(\"intensity\", PointAttributeTypes.DATA_TYPE_UINT16, 1));\n\tattributes.add(new PointAttribute(\"classification\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\tattributes.add(new PointAttribute(\"gps-time\", PointAttributeTypes.DATA_TYPE_DOUBLE, 1));\n\tattributes.add(new PointAttribute(\"number of returns\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\tattributes.add(new PointAttribute(\"return number\", PointAttributeTypes.DATA_TYPE_UINT8, 1));\n\tattributes.add(new PointAttribute(\"source id\", PointAttributeTypes.DATA_TYPE_UINT16, 1));\n\t//attributes.add(new PointAttribute(\"pointSourceID\", PointAttributeTypes.DATA_TYPE_INT8, 4));\n\n\n\treturn attributes;\n}\n\nexport class POCLoader {\n\n\tstatic load(url, callback){\n\t\ttry {\n\t\t\tlet pco = new PointCloudOctreeGeometry();\n\t\t\tpco.url = url;\n\t\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\t\txhr.open('GET', url, true);\n\n\t\t\txhr.onreadystatechange = function () {\n\t\t\t\tif (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 0)) {\n\t\t\t\t\tlet fMno = JSON.parse(xhr.responseText);\n\n\t\t\t\t\tlet version = new Version(fMno.version);\n\n\t\t\t\t\t// assume octreeDir is absolute if it starts with http\n\t\t\t\t\tif (fMno.octreeDir.indexOf('http') === 0) {\n\t\t\t\t\t\tpco.octreeDir = fMno.octreeDir;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpco.octreeDir = url + '/../' + fMno.octreeDir;\n\t\t\t\t\t}\n\n\t\t\t\t\tpco.spacing = fMno.spacing;\n\t\t\t\t\tpco.hierarchyStepSize = fMno.hierarchyStepSize;\n\n\t\t\t\t\tpco.pointAttributes = fMno.pointAttributes;\n\n\t\t\t\t\tlet min = new THREE.Vector3(fMno.boundingBox.lx, fMno.boundingBox.ly, fMno.boundingBox.lz);\n\t\t\t\t\tlet max = new THREE.Vector3(fMno.boundingBox.ux, fMno.boundingBox.uy, fMno.boundingBox.uz);\n\t\t\t\t\tlet boundingBox = new THREE.Box3(min, max);\n\t\t\t\t\tlet tightBoundingBox = boundingBox.clone();\n\n\t\t\t\t\tif (fMno.tightBoundingBox) {\n\t\t\t\t\t\ttightBoundingBox.min.copy(new THREE.Vector3(fMno.tightBoundingBox.lx, fMno.tightBoundingBox.ly, fMno.tightBoundingBox.lz));\n\t\t\t\t\t\ttightBoundingBox.max.copy(new THREE.Vector3(fMno.tightBoundingBox.ux, fMno.tightBoundingBox.uy, fMno.tightBoundingBox.uz));\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offset = min.clone();\n\n\t\t\t\t\tboundingBox.min.sub(offset);\n\t\t\t\t\tboundingBox.max.sub(offset);\n\n\t\t\t\t\ttightBoundingBox.min.sub(offset);\n\t\t\t\t\ttightBoundingBox.max.sub(offset);\n\n\t\t\t\t\tpco.projection = fMno.projection;\n\t\t\t\t\tpco.boundingBox = boundingBox;\n\t\t\t\t\tpco.tightBoundingBox = tightBoundingBox;\n\t\t\t\t\tpco.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\t\t\t\tpco.tightBoundingSphere = tightBoundingBox.getBoundingSphere(new THREE.Sphere());\n\t\t\t\t\tpco.offset = offset;\n\t\t\t\t\tif (fMno.pointAttributes === 'LAS') {\n\t\t\t\t\t\tpco.loader = new LasLazLoader(fMno.version, \"las\");\n\t\t\t\t\t\tpco.pointAttributes = lasLazAttributes(fMno);\n\t\t\t\t\t} else if (fMno.pointAttributes === 'LAZ') {\n\t\t\t\t\t\tpco.loader = new LasLazLoader(fMno.version, \"laz\");\n\t\t\t\t\t\tpco.pointAttributes = lasLazAttributes(fMno);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpco.loader = new BinaryLoader(fMno.version, boundingBox, fMno.scale);\n\t\t\t\t\t\tpco.pointAttributes = parseAttributes(fMno);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet nodes = {};\n\n\t\t\t\t\t{ // load root\n\t\t\t\t\t\tlet name = 'r';\n\n\t\t\t\t\t\tlet root = new PointCloudOctreeGeometryNode(name, pco, boundingBox);\n\t\t\t\t\t\troot.level = 0;\n\t\t\t\t\t\troot.hasChildren = true;\n\t\t\t\t\t\troot.spacing = pco.spacing;\n\t\t\t\t\t\tif (version.upTo('1.5')) {\n\t\t\t\t\t\t\troot.numPoints = fMno.hierarchy[0][1];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\troot.numPoints = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpco.root = root;\n\t\t\t\t\t\tpco.root.load();\n\t\t\t\t\t\tnodes[name] = root;\n\t\t\t\t\t}\n\n\t\t\t\t\t// load remaining hierarchy\n\t\t\t\t\tif (version.upTo('1.4')) {\n\t\t\t\t\t\tfor (let i = 1; i < fMno.hierarchy.length; i++) {\n\t\t\t\t\t\t\tlet name = fMno.hierarchy[i][0];\n\t\t\t\t\t\t\tlet numPoints = fMno.hierarchy[i][1];\n\t\t\t\t\t\t\tlet index = parseInt(name.charAt(name.length - 1));\n\t\t\t\t\t\t\tlet parentName = name.substring(0, name.length - 1);\n\t\t\t\t\t\t\tlet parentNode = nodes[parentName];\n\t\t\t\t\t\t\tlet level = name.length - 1;\n\t\t\t\t\t\t\t//let boundingBox = POCLoader.createChildAABB(parentNode.boundingBox, index);\n\t\t\t\t\t\t\tlet boundingBox = Utils.createChildAABB(parentNode.boundingBox, index);\n\n\t\t\t\t\t\t\tlet node = new PointCloudOctreeGeometryNode(name, pco, boundingBox);\n\t\t\t\t\t\t\tnode.level = level;\n\t\t\t\t\t\t\tnode.numPoints = numPoints;\n\t\t\t\t\t\t\tnode.spacing = pco.spacing / Math.pow(2, level);\n\t\t\t\t\t\t\tparentNode.addChild(node);\n\t\t\t\t\t\t\tnodes[name] = node;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tpco.nodes = nodes;\n\n\t\t\t\t\tcallback(pco);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\txhr.send(null);\n\t\t} catch (e) {\n\t\t\tconsole.log(\"loading failed: '\" + url + \"'\");\n\t\t\tconsole.log(e);\n\n\t\t\tcallback();\n\t\t}\n\t}\n\n\tloadPointAttributes(mno){\n\t\tlet fpa = mno.pointAttributes;\n\t\tlet pa = new PointAttributes();\n\n\t\tfor (let i = 0; i < fpa.length; i++) {\n\t\t\tlet pointAttribute = PointAttribute[fpa[i]];\n\t\t\tpa.add(pointAttribute);\n\t\t}\n\n\t\treturn pa;\n\t}\n\n\tcreateChildAABB(aabb, index){\n\t\tlet min = aabb.min.clone();\n\t\tlet max = aabb.max.clone();\n\t\tlet size = new THREE.Vector3().subVectors(max, min);\n\n\t\tif ((index & 0b0001) > 0) {\n\t\t\tmin.z += size.z / 2;\n\t\t} else {\n\t\t\tmax.z -= size.z / 2;\n\t\t}\n\n\t\tif ((index & 0b0010) > 0) {\n\t\t\tmin.y += size.y / 2;\n\t\t} else {\n\t\t\tmax.y -= size.y / 2;\n\t\t}\n\n\t\tif ((index & 0b0100) > 0) {\n\t\t\tmin.x += size.x / 2;\n\t\t} else {\n\t\t\tmax.x -= size.x / 2;\n\t\t}\n\n\t\treturn new THREE.Box3(min, max);\n\t}\n}\n\n","\r\nimport * as THREE from \"../../../../libs/three.js/build/three.module.js\";\r\n\r\nexport class OctreeGeometry{\r\n\r\n\tconstructor(){\r\n\t\tthis.url = null;\r\n\t\tthis.spacing = 0;\r\n\t\tthis.boundingBox = null;\r\n\t\tthis.root = null;\r\n\t\tthis.pointAttributes = null;\r\n\t\tthis.loader = null;\r\n\t}\r\n\r\n};\r\n\r\nexport class OctreeGeometryNode{\r\n\r\n\tconstructor(name, octreeGeometry, boundingBox){\r\n\t\tthis.id = OctreeGeometryNode.IDCount++;\r\n\t\tthis.name = name;\r\n\t\tthis.index = parseInt(name.charAt(name.length - 1));\r\n\t\tthis.octreeGeometry = octreeGeometry;\r\n\t\tthis.boundingBox = boundingBox;\r\n\t\tthis.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\r\n\t\tthis.children = {};\r\n\t\tthis.numPoints = 0;\r\n\t\tthis.level = null;\r\n\t\tthis.oneTimeDisposeHandlers = [];\r\n\t}\r\n\r\n\tisGeometryNode(){\r\n\t\treturn true;\r\n\t}\r\n\r\n\tgetLevel(){\r\n\t\treturn this.level;\r\n\t}\r\n\r\n\tisTreeNode(){\r\n\t\treturn false;\r\n\t}\r\n\r\n\tisLoaded(){\r\n\t\treturn this.loaded;\r\n\t}\r\n\r\n\tgetBoundingSphere(){\r\n\t\treturn this.boundingSphere;\r\n\t}\r\n\r\n\tgetBoundingBox(){\r\n\t\treturn this.boundingBox;\r\n\t}\r\n\r\n\tgetChildren(){\r\n\t\tlet children = [];\r\n\r\n\t\tfor (let i = 0; i < 8; i++) {\r\n\t\t\tif (this.children[i]) {\r\n\t\t\t\tchildren.push(this.children[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn children;\r\n\t}\r\n\r\n\tgetBoundingBox(){\r\n\t\treturn this.boundingBox;\r\n\t}\r\n\r\n\tload(){\r\n\r\n\t\tif (Potree.numNodesLoading >= Potree.maxNodesLoading) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.octreeGeometry.loader.load(this);\r\n\t}\r\n\r\n\tgetNumPoints(){\r\n\t\treturn this.numPoints;\r\n\t}\r\n\r\n\tdispose(){\r\n\t\tif (this.geometry && this.parent != null) {\r\n\t\t\tthis.geometry.dispose();\r\n\t\t\tthis.geometry = null;\r\n\t\t\tthis.loaded = false;\r\n\r\n\t\t\t// this.dispatchEvent( { type: 'dispose' } );\r\n\t\t\tfor (let i = 0; i < this.oneTimeDisposeHandlers.length; i++) {\r\n\t\t\t\tlet handler = this.oneTimeDisposeHandlers[i];\r\n\t\t\t\thandler();\r\n\t\t\t}\r\n\t\t\tthis.oneTimeDisposeHandlers = [];\r\n\t\t}\r\n\t}\r\n\r\n};\r\n\r\nOctreeGeometryNode.IDCount = 0;","\nimport * as THREE from \"../../../../libs/three.js/build/three.module.js\";\nimport {PointAttribute, PointAttributes, PointAttributeTypes} from \"../../../loader/PointAttributes.js\";\nimport {OctreeGeometry, OctreeGeometryNode} from \"./OctreeGeometry.js\";\n\n// let loadedNodes = new Set();\n\nexport class NodeLoader{\n\n\tconstructor(url){\n\t\tthis.url = url;\n\t}\n\n\tasync load(node){\n\n\t\tif(node.loaded || node.loading){\n\t\t\treturn;\n\t\t}\n\n\t\tnode.loading = true;\n\t\tPotree.numNodesLoading++;\n\n\t\t// console.log(node.name, node.numPoints);\n\n\t\t// if(loadedNodes.has(node.name)){\n\t\t// \t// debugger;\n\t\t// }\n\t\t// loadedNodes.add(node.name);\n\n\t\ttry{\n\t\t\tif(node.nodeType === 2){\n\t\t\t\tawait this.loadHierarchy(node);\n\t\t\t}\n\n\t\t\tlet {byteOffset, byteSize} = node;\n\n\n\t\t\tlet urlOctree = `${this.url}/../octree.bin`;\n\n\t\t\tlet first = byteOffset;\n\t\t\tlet last = byteOffset + byteSize - 1n;\n\n\t\t\tlet buffer;\n\n\t\t\tif(byteSize === 0n){\n\t\t\t\tbuffer = new ArrayBuffer(0);\n\t\t\t\tconsole.warn(`loaded node with 0 bytes: ${node.name}`);\n\t\t\t}else{\n\t\t\t\tlet response = await fetch(urlOctree, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'content-type': 'multipart/byteranges',\n\t\t\t\t\t\t'Range': `bytes=${first}-${last}`,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tbuffer = await response.arrayBuffer();\n\t\t\t}\n\n\t\t\tlet workerPath;\n\t\t\tif(this.metadata.encoding === \"BROTLI\"){\n\t\t\t\tworkerPath = Potree.scriptPath + '/workers/2.0/DecoderWorker_brotli.js';\n\t\t\t}else{\n\t\t\t\tworkerPath = Potree.scriptPath + '/workers/2.0/DecoderWorker.js';\n\t\t\t}\n\n\t\t\tlet worker = Potree.workerPool.getWorker(workerPath);\n\n\t\t\tworker.onmessage = function (e) {\n\n\t\t\t\tlet data = e.data;\n\t\t\t\tlet buffers = data.attributeBuffers;\n\n\t\t\t\tPotree.workerPool.returnWorker(workerPath, worker);\n\n\t\t\t\tlet geometry = new THREE.BufferGeometry();\n\t\t\t\t\n\t\t\t\tfor(let property in buffers){\n\n\t\t\t\t\tlet buffer = buffers[property].buffer;\n\n\t\t\t\t\tif(property === \"position\"){\n\t\t\t\t\t\tgeometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t\t}else if(property === \"rgba\"){\n\t\t\t\t\t\tgeometry.setAttribute('rgba', new THREE.BufferAttribute(new Uint8Array(buffer), 4, true));\n\t\t\t\t\t}else if(property === \"NORMAL\"){\n\t\t\t\t\t\t//geometry.setAttribute('rgba', new THREE.BufferAttribute(new Uint8Array(buffer), 4, true));\n\t\t\t\t\t\tgeometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t\t}else if (property === \"INDICES\") {\n\t\t\t\t\t\tlet bufferAttribute = new THREE.BufferAttribute(new Uint8Array(buffer), 4);\n\t\t\t\t\t\tbufferAttribute.normalized = true;\n\t\t\t\t\t\tgeometry.setAttribute('indices', bufferAttribute);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tconst bufferAttribute = new THREE.BufferAttribute(new Float32Array(buffer), 1);\n\n\t\t\t\t\t\tlet batchAttribute = buffers[property].attribute;\n\t\t\t\t\t\tbufferAttribute.potree = {\n\t\t\t\t\t\t\toffset: buffers[property].offset,\n\t\t\t\t\t\t\tscale: buffers[property].scale,\n\t\t\t\t\t\t\tpreciseBuffer: buffers[property].preciseBuffer,\n\t\t\t\t\t\t\trange: batchAttribute.range,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tgeometry.setAttribute(property, bufferAttribute);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// indices ??\n\n\t\t\t\tnode.density = data.density;\n\t\t\t\tnode.geometry = geometry;\n\t\t\t\tnode.loaded = true;\n\t\t\t\tnode.loading = false;\n\t\t\t\tPotree.numNodesLoading--;\n\t\t\t};\n\n\t\t\tlet pointAttributes = node.octreeGeometry.pointAttributes;\n\t\t\tlet scale = node.octreeGeometry.scale;\n\n\t\t\tlet box = node.boundingBox;\n\t\t\tlet min = node.octreeGeometry.offset.clone().add(box.min);\n\t\t\tlet size = box.max.clone().sub(box.min);\n\t\t\tlet max = min.clone().add(size);\n\t\t\tlet numPoints = node.numPoints;\n\n\t\t\tlet offset = node.octreeGeometry.loader.offset;\n\n\t\t\tlet message = {\n\t\t\t\tname: node.name,\n\t\t\t\tbuffer: buffer,\n\t\t\t\tpointAttributes: pointAttributes,\n\t\t\t\tscale: scale,\n\t\t\t\tmin: min,\n\t\t\t\tmax: max,\n\t\t\t\tsize: size,\n\t\t\t\toffset: offset,\n\t\t\t\tnumPoints: numPoints\n\t\t\t};\n\n\t\t\tworker.postMessage(message, [message.buffer]);\n\t\t}catch(e){\n\t\t\tnode.loaded = false;\n\t\t\tnode.loading = false;\n\t\t\tPotree.numNodesLoading--;\n\n\t\t\tconsole.log(`failed to load ${node.name}`);\n\t\t\tconsole.log(e);\n\t\t\tconsole.log(`trying again!`);\n\t\t}\n\t}\n\n\tparseHierarchy(node, buffer){\n\n\t\tlet view = new DataView(buffer);\n\t\tlet tStart = performance.now();\n\n\t\tlet bytesPerNode = 22;\n\t\tlet numNodes = buffer.byteLength / bytesPerNode;\n\n\t\tlet octree = node.octreeGeometry;\n\t\t// let nodes = [node];\n\t\tlet nodes = new Array(numNodes);\n\t\tnodes[0] = node;\n\t\tlet nodePos = 1;\n\n\t\tfor(let i = 0; i < numNodes; i++){\n\t\t\tlet current = nodes[i];\n\n\t\t\tlet type = view.getUint8(i * bytesPerNode + 0);\n\t\t\tlet childMask = view.getUint8(i * bytesPerNode + 1);\n\t\t\tlet numPoints = view.getUint32(i * bytesPerNode + 2, true);\n\t\t\tlet byteOffset = view.getBigInt64(i * bytesPerNode + 6, true);\n\t\t\tlet byteSize = view.getBigInt64(i * bytesPerNode + 14, true);\n\n\t\t\t// if(byteSize === 0n){\n\t\t\t// \t// debugger;\n\t\t\t// }\n\n\n\t\t\tif(current.nodeType === 2){\n\t\t\t\t// replace proxy with real node\n\t\t\t\tcurrent.byteOffset = byteOffset;\n\t\t\t\tcurrent.byteSize = byteSize;\n\t\t\t\tcurrent.numPoints = numPoints;\n\t\t\t}else if(type === 2){\n\t\t\t\t// load proxy\n\t\t\t\tcurrent.hierarchyByteOffset = byteOffset;\n\t\t\t\tcurrent.hierarchyByteSize = byteSize;\n\t\t\t\tcurrent.numPoints = numPoints;\n\t\t\t}else{\n\t\t\t\t// load real node \n\t\t\t\tcurrent.byteOffset = byteOffset;\n\t\t\t\tcurrent.byteSize = byteSize;\n\t\t\t\tcurrent.numPoints = numPoints;\n\t\t\t}\n\t\t\t\n\t\t\tcurrent.nodeType = type;\n\n\t\t\tif(current.nodeType === 2){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor(let childIndex = 0; childIndex < 8; childIndex++){\n\t\t\t\tlet childExists = ((1 << childIndex) & childMask) !== 0;\n\n\t\t\t\tif(!childExists){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet childName = current.name + childIndex;\n\n\t\t\t\tlet childAABB = createChildAABB(current.boundingBox, childIndex);\n\t\t\t\tlet child = new OctreeGeometryNode(childName, octree, childAABB);\n\t\t\t\tchild.name = childName;\n\t\t\t\tchild.spacing = current.spacing / 2;\n\t\t\t\tchild.level = current.level + 1;\n\n\t\t\t\tcurrent.children[childIndex] = child;\n\t\t\t\tchild.parent = current;\n\n\t\t\t\t// nodes.push(child);\n\t\t\t\tnodes[nodePos] = child;\n\t\t\t\tnodePos++;\n\t\t\t}\n\n\t\t\t// if((i % 500) === 0){\n\t\t\t// \tyield;\n\t\t\t// }\n\t\t}\n\n\t\tlet duration = (performance.now() - tStart);\n\n\t\t// if(duration > 20){\n\t\t// \tlet msg = `duration: ${duration}ms, numNodes: ${numNodes}`;\n\t\t// \tconsole.log(msg);\n\t\t// }\n\t}\n\n\tasync loadHierarchy(node){\n\n\t\tlet {hierarchyByteOffset, hierarchyByteSize} = node;\n\t\tlet hierarchyPath = `${this.url}/../hierarchy.bin`;\n\t\t\n\t\tlet first = hierarchyByteOffset;\n\t\tlet last = first + hierarchyByteSize - 1n;\n\n\t\tlet response = await fetch(hierarchyPath, {\n\t\t\theaders: {\n\t\t\t\t'content-type': 'multipart/byteranges',\n\t\t\t\t'Range': `bytes=${first}-${last}`,\n\t\t\t},\n\t\t});\n\n\n\n\t\tlet buffer = await response.arrayBuffer();\n\n\t\tthis.parseHierarchy(node, buffer);\n\n\t\t// let promise = new Promise((resolve) => {\n\t\t// \tlet generator = this.parseHierarchy(node, buffer);\n\n\t\t// \tlet repeatUntilDone = () => {\n\t\t// \t\tlet result = generator.next();\n\n\t\t// \t\tif(result.done){\n\t\t// \t\t\tresolve();\n\t\t// \t\t}else{\n\t\t// \t\t\trequestAnimationFrame(repeatUntilDone);\n\t\t// \t\t}\n\t\t// \t};\n\t\t\t\n\t\t// \trepeatUntilDone();\n\t\t// });\n\n\t\t// await promise;\n\n\t\t\n\n\n\n\t}\n\n}\n\nlet tmpVec3 = new THREE.Vector3();\nfunction createChildAABB(aabb, index){\n\tlet min = aabb.min.clone();\n\tlet max = aabb.max.clone();\n\tlet size = tmpVec3.subVectors(max, min);\n\n\tif ((index & 0b0001) > 0) {\n\t\tmin.z += size.z / 2;\n\t} else {\n\t\tmax.z -= size.z / 2;\n\t}\n\n\tif ((index & 0b0010) > 0) {\n\t\tmin.y += size.y / 2;\n\t} else {\n\t\tmax.y -= size.y / 2;\n\t}\n\t\n\tif ((index & 0b0100) > 0) {\n\t\tmin.x += size.x / 2;\n\t} else {\n\t\tmax.x -= size.x / 2;\n\t}\n\n\treturn new THREE.Box3(min, max);\n}\n\nlet typenameTypeattributeMap = {\n\t\"double\": PointAttributeTypes.DATA_TYPE_DOUBLE,\n\t\"float\": PointAttributeTypes.DATA_TYPE_FLOAT,\n\t\"int8\": PointAttributeTypes.DATA_TYPE_INT8,\n\t\"uint8\": PointAttributeTypes.DATA_TYPE_UINT8,\n\t\"int16\": PointAttributeTypes.DATA_TYPE_INT16,\n\t\"uint16\": PointAttributeTypes.DATA_TYPE_UINT16,\n\t\"int32\": PointAttributeTypes.DATA_TYPE_INT32,\n\t\"uint32\": PointAttributeTypes.DATA_TYPE_UINT32,\n\t\"int64\": PointAttributeTypes.DATA_TYPE_INT64,\n\t\"uint64\": PointAttributeTypes.DATA_TYPE_UINT64,\n}\n\nexport class OctreeLoader{\n\n\tstatic parseAttributes(jsonAttributes){\n\n\t\tlet attributes = new PointAttributes();\n\n\t\tlet replacements = {\n\t\t\t\"rgb\": \"rgba\",\n\t\t};\n\n\t\tfor (const jsonAttribute of jsonAttributes) {\n\t\t\tlet {name, description, size, numElements, elementSize, min, max} = jsonAttribute;\n\n\t\t\tlet type = typenameTypeattributeMap[jsonAttribute.type];\n\n\t\t\tlet potreeAttributeName = replacements[name] ? replacements[name] : name;\n\n\t\t\tlet attribute = new PointAttribute(potreeAttributeName, type, numElements);\n\n\t\t\tif(numElements === 1){\n\t\t\t\tattribute.range = [min[0], max[0]];\n\t\t\t}else{\n\t\t\t\tattribute.range = [min, max];\n\t\t\t}\n\n\t\t\tif (name === \"gps-time\") { // HACK: Guard against bad gpsTime range in metadata, see potree/potree#909\n\t\t\t\tif (attribute.range[0] === attribute.range[1]) {\n\t\t\t\t\tattribute.range[1] += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tattribute.initialRange = attribute.range;\n\n\t\t\tattributes.add(attribute);\n\t\t}\n\n\t\t{\n\t\t\t// check if it has normals\n\t\t\tlet hasNormals = \n\t\t\t\tattributes.attributes.find(a => a.name === \"NormalX\") !== undefined &&\n\t\t\t\tattributes.attributes.find(a => a.name === \"NormalY\") !== undefined &&\n\t\t\t\tattributes.attributes.find(a => a.name === \"NormalZ\") !== undefined;\n\n\t\t\tif(hasNormals){\n\t\t\t\tlet vector = {\n\t\t\t\t\tname: \"NORMAL\",\n\t\t\t\t\tattributes: [\"NormalX\", \"NormalY\", \"NormalZ\"],\n\t\t\t\t};\n\t\t\t\tattributes.addVector(vector);\n\t\t\t}\n\t\t}\n\n\t\treturn attributes;\n\t}\n\n\tstatic async load(url){\n\n\t\tlet response = await fetch(url);\n\t\tlet metadata = await response.json();\n\n\t\tlet attributes = OctreeLoader.parseAttributes(metadata.attributes);\n\n\t\tlet loader = new NodeLoader(url);\n\t\tloader.metadata = metadata;\n\t\tloader.attributes = attributes;\n\t\tloader.scale = metadata.scale;\n\t\tloader.offset = metadata.offset;\n\n\t\tlet octree = new OctreeGeometry();\n\t\toctree.url = url;\n\t\toctree.spacing = metadata.spacing;\n\t\toctree.scale = metadata.scale;\n\n\t\t// let aPosition = metadata.attributes.find(a => a.name === \"position\");\n\t\t// octree\n\n\t\tlet min = new THREE.Vector3(...metadata.boundingBox.min);\n\t\tlet max = new THREE.Vector3(...metadata.boundingBox.max);\n\t\tlet boundingBox = new THREE.Box3(min, max);\n\n\t\tlet offset = min.clone();\n\t\tboundingBox.min.sub(offset);\n\t\tboundingBox.max.sub(offset);\n\n\t\toctree.projection = metadata.projection;\n\t\toctree.boundingBox = boundingBox;\n\t\toctree.tightBoundingBox = boundingBox.clone();\n\t\toctree.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\toctree.tightBoundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\toctree.offset = offset;\n\t\toctree.pointAttributes = OctreeLoader.parseAttributes(metadata.attributes);\n\t\toctree.loader = loader;\n\n\t\tlet root = new OctreeGeometryNode(\"r\", octree, boundingBox);\n\t\troot.level = 0;\n\t\troot.nodeType = 2;\n\t\troot.hierarchyByteOffset = 0n;\n\t\troot.hierarchyByteSize = BigInt(metadata.hierarchy.firstChunkSize);\n\t\troot.hasChildren = false;\n\t\troot.spacing = octree.spacing;\n\t\troot.byteOffset = 0;\n\n\t\toctree.root = root;\n\n\t\tloader.load(root);\n\n\t\tlet result = {\n\t\t\tgeometry: octree,\n\t\t};\n\n\t\treturn result;\n\n\t}\n\n};","/**\n * @author Connor Manning\n */\n\nexport class EptLoader {\n\tstatic async load(file, callback) {\n\n\t\tlet response = await fetch(file);\n\t\tlet json = await response.json();\n\n\t\tlet url = file.substr(0, file.lastIndexOf('ept.json'));\n\t\tlet geometry = new Potree.PointCloudEptGeometry(url, json);\n\t\tlet root = new Potree.PointCloudEptGeometryNode(geometry);\n\n\t\tgeometry.root = root;\n\t\tgeometry.root.load();\n\n\t\tcallback(geometry);\n\t}\n};\n\n","\nimport * as THREE from \"../../../libs/three.js/build/three.module.js\";\nimport {XHRFactory} from \"../../XHRFactory.js\";\n\nexport class EptBinaryLoader {\n\textension() {\n\t\treturn '.bin';\n\t}\n\n\tworkerPath() {\n\t\treturn Potree.scriptPath + '/workers/EptBinaryDecoderWorker.js';\n\t}\n\n\tload(node) {\n\t\tif (node.loaded) return;\n\n\t\tlet url = node.url() + this.extension();\n\n\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open('GET', url, true);\n\t\txhr.responseType = 'arraybuffer';\n\t\txhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t\txhr.onreadystatechange = () => {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tif (xhr.status === 200) {\n\t\t\t\t\tlet buffer = xhr.response;\n\t\t\t\t\tthis.parse(node, buffer);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('Failed ' + url + ': ' + xhr.status);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttry {\n\t\t\txhr.send(null);\n\t\t}\n\t\tcatch (e) {\n\t\t\tconsole.log('Failed request: ' + e);\n\t\t}\n\t}\n\n\tparse(node, buffer) {\n\t\tlet workerPath = this.workerPath();\n\t\tlet worker = Potree.workerPool.getWorker(workerPath);\n\n\t\tworker.onmessage = function(e) {\n\t\t\tlet g = new THREE.BufferGeometry();\n\t\t\tlet numPoints = e.data.numPoints;\n\n\t\t\tlet position = new Float32Array(e.data.position);\n\t\t\tg.setAttribute('position', new THREE.BufferAttribute(position, 3));\n\n\t\t\tlet indices = new Uint8Array(e.data.indices);\n\t\t\tg.setAttribute('indices', new THREE.BufferAttribute(indices, 4));\n\n\t\t\tif (e.data.color) {\n\t\t\t\tlet color = new Uint8Array(e.data.color);\n\t\t\t\tg.setAttribute('color', new THREE.BufferAttribute(color, 4, true));\n\t\t\t}\n\t\t\tif (e.data.intensity) {\n\t\t\t\tlet intensity = new Float32Array(e.data.intensity);\n\t\t\t\tg.setAttribute('intensity',\n\t\t\t\t\t\tnew THREE.BufferAttribute(intensity, 1));\n\t\t\t}\n\t\t\tif (e.data.classification) {\n\t\t\t\tlet classification = new Uint8Array(e.data.classification);\n\t\t\t\tg.setAttribute('classification',\n\t\t\t\t\t\tnew THREE.BufferAttribute(classification, 1));\n\t\t\t}\n\t\t\tif (e.data.returnNumber) {\n\t\t\t\tlet returnNumber = new Uint8Array(e.data.returnNumber);\n\t\t\t\tg.setAttribute('return number',\n\t\t\t\t\t\tnew THREE.BufferAttribute(returnNumber, 1));\n\t\t\t}\n\t\t\tif (e.data.numberOfReturns) {\n\t\t\t\tlet numberOfReturns = new Uint8Array(e.data.numberOfReturns);\n\t\t\t\tg.setAttribute('number of returns',\n\t\t\t\t\t\tnew THREE.BufferAttribute(numberOfReturns, 1));\n\t\t\t}\n\t\t\tif (e.data.pointSourceId) {\n\t\t\t\tlet pointSourceId = new Uint16Array(e.data.pointSourceId);\n\t\t\t\tg.setAttribute('source id',\n\t\t\t\t\t\tnew THREE.BufferAttribute(pointSourceId, 1));\n\t\t\t}\n\n\t\t\tg.attributes.indices.normalized = true;\n\n\t\t\tlet tightBoundingBox = new THREE.Box3(\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tnode.doneLoading(\n\t\t\t\t\tg,\n\t\t\t\t\ttightBoundingBox,\n\t\t\t\t\tnumPoints,\n\t\t\t\t\tnew THREE.Vector3(...e.data.mean));\n\n\t\t\tPotree.workerPool.returnWorker(workerPath, worker);\n\t\t};\n\n\t\tlet toArray = (v) => [v.x, v.y, v.z];\n\t\tlet message = {\n\t\t\tbuffer: buffer,\n\t\t\tschema: node.ept.schema,\n\t\t\tscale: node.ept.eptScale,\n\t\t\toffset: node.ept.eptOffset,\n\t\t\tmins: toArray(node.key.b.min)\n\t\t};\n\n\t\tworker.postMessage(message, [message.buffer]);\n\t}\n};\n\n","\nimport * as THREE from \"../../../libs/three.js/build/three.module.js\";\nimport {XHRFactory} from \"../../XHRFactory.js\";\n\n/**\n * laslaz code taken and adapted from plas.io js-laslaz\n *\t http://plas.io/\n *\thttps://github.com/verma/plasio\n *\n * Thanks to Uday Verma and Howard Butler\n *\n */\n\nexport class EptLaszipLoader {\n\tload(node) {\n\t\tif (node.loaded) return;\n\n\t\tlet url = node.url() + '.laz';\n\n\t\tlet xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open('GET', url, true);\n\t\txhr.responseType = 'arraybuffer';\n\t\txhr.overrideMimeType('text/plain; charset=x-user-defined');\n\t\txhr.onreadystatechange = () => {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tif (xhr.status === 200) {\n\t\t\t\t\tlet buffer = xhr.response;\n\t\t\t\t\tthis.parse(node, buffer);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('Failed ' + url + ': ' + xhr.status);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\txhr.send(null);\n\t}\n\n\tasync parse(node, buffer){\n\t\tlet lf = new LASFile(buffer);\n\t\tlet handler = new EptLazBatcher(node);\n\n\t\ttry{\n\t\t\tawait lf.open();\n\n\t\t\tlf.isOpen = true;\n\n\t\t\tconst header = await lf.getHeader();\n\n\t\t\t{\n\t\t\t\tlet i = 0;\n\n\t\t\t\tlet toArray = (v) => [v.x, v.y, v.z];\n\t\t\t\tlet mins = toArray(node.key.b.min);\n\t\t\t\tlet maxs = toArray(node.key.b.max);\n\n\t\t\t\tlet hasMoreData = true;\n\n\t\t\t\twhile(hasMoreData){\n\t\t\t\t\tconst data = await lf.readData(1000000, 0, 1);\n\n\t\t\t\t\tlet d = new LASDecoder(\n\t\t\t\t\t\tdata.buffer,\n\t\t\t\t\t\theader.pointsFormatId,\n\t\t\t\t\t\theader.pointsStructSize,\n\t\t\t\t\t\tdata.count,\n\t\t\t\t\t\theader.scale,\n\t\t\t\t\t\theader.offset,\n\t\t\t\t\t\tmins,\n\t\t\t\t\t\tmaxs);\n\n\t\t\t\t\td.extraBytes = header.extraBytes;\n\t\t\t\t\td.pointsFormatId = header.pointsFormatId;\n\t\t\t\t\thandler.push(d);\n\n\t\t\t\t\ti += data.count;\n\n\t\t\t\t\thasMoreData = data.hasMoreData;\n\t\t\t\t}\n\n\t\t\t\theader.totalRead = i;\n\t\t\t\theader.versionAsString = lf.versionAsString;\n\t\t\t\theader.isCompressed = lf.isCompressed;\n\n\t\t\t\tawait lf.close();\n\n\t\t\t\tlf.isOpen = false;\n\t\t\t}\n\n\t\t}catch(err){\n\t\t\tconsole.error('Error reading LAZ:', err);\n\t\t\t\n\t\t\tif (lf.isOpen) {\n\t\t\t\tawait lf.close();\n\n\t\t\t\tlf.isOpen = false;\n\t\t\t}\n\t\t\t\n\t\t\tthrow err;\n\t\t}\n\t}\n};\n\nexport class EptLazBatcher {\n\tconstructor(node) { this.node = node; }\n\n\tpush(las) {\n\t\tlet workerPath = Potree.scriptPath +\n\t\t\t'/workers/EptLaszipDecoderWorker.js';\n\t\tlet worker = Potree.workerPool.getWorker(workerPath);\n\n\t\tworker.onmessage = (e) => {\n\t\t\tlet g = new THREE.BufferGeometry();\n\t\t\tlet numPoints = las.pointsCount;\n\n\t\t\tlet positions = new Float32Array(e.data.position);\n\t\t\tlet colors = new Uint8Array(e.data.color);\n\n\t\t\tlet intensities = new Float32Array(e.data.intensity);\n\t\t\tlet classifications = new Uint8Array(e.data.classification);\n\t\t\tlet returnNumbers = new Uint8Array(e.data.returnNumber);\n\t\t\tlet numberOfReturns = new Uint8Array(e.data.numberOfReturns);\n\t\t\tlet pointSourceIDs = new Uint16Array(e.data.pointSourceID);\n\t\t\tlet indices = new Uint8Array(e.data.indices);\n\t\t\tlet gpsTime = new Float32Array(e.data.gpsTime);\n\n\t\t\tg.setAttribute('position',\n\t\t\t\t\tnew THREE.BufferAttribute(positions, 3));\n\t\t\tg.setAttribute('rgba',\n\t\t\t\t\tnew THREE.BufferAttribute(colors, 4, true));\n\t\t\tg.setAttribute('intensity',\n\t\t\t\t\tnew THREE.BufferAttribute(intensities, 1));\n\t\t\tg.setAttribute('classification',\n\t\t\t\t\tnew THREE.BufferAttribute(classifications, 1));\n\t\t\tg.setAttribute('return number',\n\t\t\t\t\tnew THREE.BufferAttribute(returnNumbers, 1));\n\t\t\tg.setAttribute('number of returns',\n\t\t\t\t\tnew THREE.BufferAttribute(numberOfReturns, 1));\n\t\t\tg.setAttribute('source id',\n\t\t\t\t\tnew THREE.BufferAttribute(pointSourceIDs, 1));\n\t\t\tg.setAttribute('indices',\n\t\t\t\t\tnew THREE.BufferAttribute(indices, 4));\n\t\t\tg.setAttribute('gpsTime',\n\t\t\t\t\tnew THREE.BufferAttribute(gpsTime, 1));\n\t\t\tthis.node.gpsTime = e.data.gpsMeta;\n\n\t\t\tg.attributes.indices.normalized = true;\n\n\t\t\tlet tightBoundingBox = new THREE.Box3(\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tthis.node.doneLoading(\n\t\t\t\tg,\n\t\t\t\ttightBoundingBox,\n\t\t\t\tnumPoints,\n\t\t\t\tnew THREE.Vector3(...e.data.mean));\n\n\t\t\tPotree.workerPool.returnWorker(workerPath, worker);\n\t\t};\n\n\t\tlet message = {\n\t\t\tbuffer: las.arrayb,\n\t\t\tnumPoints: las.pointsCount,\n\t\t\tpointSize: las.pointSize,\n\t\t\tpointFormatID: las.pointsFormatId,\n\t\t\tscale: las.scale,\n\t\t\toffset: las.offset,\n\t\t\tmins: las.mins,\n\t\t\tmaxs: las.maxs\n\t\t};\n\n\t\tworker.postMessage(message, [message.buffer]);\n\t};\n};\n\n","import {EptBinaryLoader} from \"./BinaryLoader.js\";\n\nexport class EptZstandardLoader extends EptBinaryLoader {\n extension() {\n return '.zst';\n }\n\n workerPath() {\n return Potree.scriptPath + '/workers/EptZstandardDecoderWorker.js';\n }\n};\n\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Line2} from \"../../libs/three.js/lines/Line2.js\";\nimport {LineGeometry} from \"../../libs/three.js/lines/LineGeometry.js\";\nimport {LineMaterial} from \"../../libs/three.js/lines/LineMaterial.js\";\n\nexport class ShapefileLoader{\n\n\tconstructor(){\n\t\tthis.transform = null;\n\t}\n\n\tasync load(path){\n\n\t\tconst matLine = new LineMaterial( {\n\t\t\tcolor: 0xff0000,\n\t\t\tlinewidth: 3, // in pixels\n\t\t\tresolution: new THREE.Vector2(1000, 1000),\n\t\t\tdashed: false\n\t\t} );\n\n\t\tconst features = await this.loadShapefileFeatures(path);\n\t\tconst node = new THREE.Object3D();\n\t\t\n\t\tfor(const feature of features){\n\t\t\tconst fnode = this.featureToSceneNode(feature, matLine);\n\t\t\tnode.add(fnode);\n\t\t}\n\n\t\tlet setResolution = (x, y) => {\n\t\t\tmatLine.resolution.set(x, y);\n\t\t};\n\n\t\tconst result = {\n\t\t\tfeatures: features,\n\t\t\tnode: node,\n\t\t\tsetResolution: setResolution,\n\t\t};\n\n\t\treturn result;\n\t}\n\n\tfeatureToSceneNode(feature, matLine){\n\t\tlet geometry = feature.geometry;\n\t\t\n\t\tlet color = new THREE.Color(1, 1, 1);\n\n\t\tlet transform = this.transform;\n\t\tif(transform === null){\n\t\t\ttransform = {forward: (v) => v};\n\t\t}\n\t\t\n\t\tif(feature.geometry.type === \"Point\"){\n\t\t\tlet sg = new THREE.SphereGeometry(1, 18, 18);\n\t\t\tlet sm = new THREE.MeshNormalMaterial();\n\t\t\tlet s = new THREE.Mesh(sg, sm);\n\t\t\t\n\t\t\tlet [long, lat] = geometry.coordinates;\n\t\t\tlet pos = transform.forward([long, lat]);\n\t\t\t\n\t\t\ts.position.set(...pos, 20);\n\t\t\t\n\t\t\ts.scale.set(10, 10, 10);\n\t\t\t\n\t\t\treturn s;\n\t\t}else if(geometry.type === \"LineString\"){\n\t\t\tlet coordinates = [];\n\t\t\t\n\t\t\tlet min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\t\tfor(let i = 0; i < geometry.coordinates.length; i++){\n\t\t\t\tlet [long, lat] = geometry.coordinates[i];\n\t\t\t\tlet pos = transform.forward([long, lat]);\n\t\t\t\t\n\t\t\t\tmin.x = Math.min(min.x, pos[0]);\n\t\t\t\tmin.y = Math.min(min.y, pos[1]);\n\t\t\t\tmin.z = Math.min(min.z, 20);\n\t\t\t\t\n\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\tif(i > 0 && i < geometry.coordinates.length - 1){\n\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfor(let i = 0; i < coordinates.length; i += 3){\n\t\t\t\tcoordinates[i+0] -= min.x;\n\t\t\t\tcoordinates[i+1] -= min.y;\n\t\t\t\tcoordinates[i+2] -= min.z;\n\t\t\t}\n\t\t\t\n\t\t\tconst lineGeometry = new LineGeometry();\n\t\t\tlineGeometry.setPositions( coordinates );\n\n\t\t\tconst line = new Line2( lineGeometry, matLine );\n\t\t\tline.computeLineDistances();\n\t\t\tline.scale.set( 1, 1, 1 );\n\t\t\tline.position.copy(min);\n\t\t\t\n\t\t\treturn line;\n\t\t}else if(geometry.type === \"Polygon\"){\n\t\t\tfor(let pc of geometry.coordinates){\n\t\t\t\tlet coordinates = [];\n\t\t\t\t\n\t\t\t\tlet min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\t\t\tfor(let i = 0; i < pc.length; i++){\n\t\t\t\t\tlet [long, lat] = pc[i];\n\t\t\t\t\tlet pos = transform.forward([long, lat]);\n\t\t\t\t\t\n\t\t\t\t\tmin.x = Math.min(min.x, pos[0]);\n\t\t\t\t\tmin.y = Math.min(min.y, pos[1]);\n\t\t\t\t\tmin.z = Math.min(min.z, 20);\n\t\t\t\t\t\n\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t\tif(i > 0 && i < pc.length - 1){\n\t\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor(let i = 0; i < coordinates.length; i += 3){\n\t\t\t\t\tcoordinates[i+0] -= min.x;\n\t\t\t\t\tcoordinates[i+1] -= min.y;\n\t\t\t\t\tcoordinates[i+2] -= min.z;\n\t\t\t\t}\n\n\t\t\t\tconst lineGeometry = new LineGeometry();\n\t\t\t\tlineGeometry.setPositions( coordinates );\n\n\t\t\t\tconst line = new Line2( lineGeometry, matLine );\n\t\t\t\tline.computeLineDistances();\n\t\t\t\tline.scale.set( 1, 1, 1 );\n\t\t\t\tline.position.copy(min);\n\t\t\t\t\n\t\t\t\treturn line;\n\t\t\t}\n\t\t}else{\n\t\t\tconsole.log(\"unhandled feature: \", feature);\n\t\t}\n\t}\n\n\tasync loadShapefileFeatures(file){\n\t\tlet features = [];\n\n\t\tlet source = await shapefile.open(file);\n\n\t\twhile(true){\n\t\t\tlet result = await source.read();\n\n\t\t\tif (result.done) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (result.value && result.value.type === 'Feature' && result.value.geometry !== undefined) {\n\t\t\t\tfeatures.push(result.value);\n\t\t\t}\n\t\t}\n\n\t\treturn features;\n\t}\n\n};\n\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Line2} from \"../../libs/three.js/lines/Line2.js\";\nimport {LineGeometry} from \"../../libs/three.js/lines/LineGeometry.js\";\nimport {LineMaterial} from \"../../libs/three.js/lines/LineMaterial.js\";\nimport {Utils} from \"../utils.js\";\n\nconst defaultColors = {\n\t\"landuse\": [0.5, 0.5, 0.5],\n\t\"natural\": [0.0, 1.0, 0.0],\n\t\"places\": [1.0, 0.0, 1.0],\n\t\"points\": [0.0, 1.0, 1.0],\n\t\"roads\": [1.0, 1.0, 0.0],\n\t\"waterways\": [0.0, 0.0, 1.0],\n\t\"default\": [0.9, 0.6, 0.1],\n};\n\nfunction getColor(feature){\n\tlet color = defaultColors[feature];\n\n\tif(!color){\n\t\tcolor = defaultColors[\"default\"];\n\t}\n\n\treturn color;\n}\n\nexport class Geopackage{\n\tconstructor(){\n\t\tthis.path = null;\n\t\tthis.node = null;\n\t}\n};\n\nexport class GeoPackageLoader{\n\n\tconstructor(){\n\n\t}\n\n\tstatic async loadUrl(url, params){\n\n\t\tawait Promise.all([\n\t\t\tUtils.loadScript(`${Potree.scriptPath}/lazylibs/geopackage/geopackage.js`),\n\t\t\tUtils.loadScript(`${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.js`),\n\t\t]);\n\t\t\n\t\tconst result = await fetch(url);\n\t\tconst buffer = await result.arrayBuffer();\n\n\t\tparams = params || {};\n\n\t\tparams.source = url;\n\n\t\treturn GeoPackageLoader.loadBuffer(buffer, params);\n\t}\n\n\tstatic async loadBuffer(buffer, params){\n\n\t\tawait Promise.all([\n\t\t\tUtils.loadScript(`${Potree.scriptPath}/lazylibs/geopackage/geopackage.js`),\n\t\t\tUtils.loadScript(`${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.js`),\n\t\t]);\n\n\t\tparams = params || {};\n\n\t\tconst resolver = async (resolve) => {\n\t\t\t\n\t\t\tlet transform = params.transform;\n\t\t\tif(!transform){\n\t\t\t\ttransform = {forward: (arg) => arg};\n\t\t\t}\n\n\t\t\tconst wasmPath = `${Potree.scriptPath}/lazylibs/sql.js/sql-wasm.wasm`;\n\t\t\tconst SQL = await initSqlJs({ locateFile: filename => wasmPath});\n\n\t\t\tconst u8 = new Uint8Array(buffer);\n\n\t\t\tconst data = await geopackage.open(u8);\n\t\t\twindow.data = data;\n\n\t\t\tconst geopackageNode = new THREE.Object3D();\n\t\t\tgeopackageNode.name = params.source;\n\t\t\tgeopackageNode.potree = {\n\t\t\t\tsource: params.source,\n\t\t\t};\n\n\t\t\tconst geo = new Geopackage();\n\t\t\tgeo.path = params.source;\n\t\t\tgeo.node = geopackageNode;\n\n\t\t\tconst tables = data.getTables();\n\n\t\t\tfor(const table of tables.features){\n\t\t\t\tconst dao = data.getFeatureDao(table);\n\n\t\t\t\tlet boundingBox = dao.getBoundingBox();\n\t\t\t\tboundingBox = boundingBox.projectBoundingBox(dao.projection, 'EPSG:4326');\n\t\t\t\tconst geoJson = data.queryForGeoJSONFeaturesInTable(table, boundingBox);\n\n\t\t\t\tconst matLine = new LineMaterial( {\n\t\t\t\t\tcolor: new THREE.Color().setRGB(...getColor(table)),\n\t\t\t\t\tlinewidth: 2, \n\t\t\t\t\tresolution: new THREE.Vector2(1000, 1000),\n\t\t\t\t\tdashed: false\n\t\t\t\t} );\n\n\t\t\t\tconst node = new THREE.Object3D();\n\t\t\t\tnode.name = table;\n\t\t\t\tgeo.node.add(node);\n\n\t\t\t\tfor(const [index, feature] of Object.entries(geoJson)){\n\t\t\t\t\t//const featureNode = GeoPackageLoader.featureToSceneNode(feature, matLine, transform);\n\t\t\t\t\tconst featureNode = GeoPackageLoader.featureToSceneNode(feature, matLine, dao.projection, transform);\n\t\t\t\t\tnode.add(featureNode);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresolve(geo);\n\t\t}\n\n\t\treturn new Promise(resolver);\n\t}\n\n\tstatic featureToSceneNode(feature, matLine, geopackageProjection, transform){\n\t\tlet geometry = feature.geometry;\n\t\t\n\t\tlet color = new THREE.Color(1, 1, 1);\n\t\t\n\t\tif(feature.geometry.type === \"Point\"){\n\t\t\tlet sg = new THREE.SphereGeometry(1, 18, 18);\n\t\t\tlet sm = new THREE.MeshNormalMaterial();\n\t\t\tlet s = new THREE.Mesh(sg, sm);\n\t\t\t\n\t\t\tlet [long, lat] = geometry.coordinates;\n\t\t\tlet pos = transform.forward(geopackageProjection.forward([long, lat]));\n\t\t\t\n\t\t\ts.position.set(...pos, 20);\n\t\t\t\n\t\t\ts.scale.set(10, 10, 10);\n\t\t\t\n\t\t\treturn s;\n\t\t}else if(geometry.type === \"LineString\"){\n\t\t\tlet coordinates = [];\n\t\t\t\n\t\t\tlet min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\t\tfor(let i = 0; i < geometry.coordinates.length; i++){\n\t\t\t\tlet [long, lat] = geometry.coordinates[i];\n\t\t\t\tlet pos = transform.forward(geopackageProjection.forward([long, lat]));\n\t\t\t\t\n\t\t\t\tmin.x = Math.min(min.x, pos[0]);\n\t\t\t\tmin.y = Math.min(min.y, pos[1]);\n\t\t\t\tmin.z = Math.min(min.z, 20);\n\t\t\t\t\n\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\tif(i > 0 && i < geometry.coordinates.length - 1){\n\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfor(let i = 0; i < coordinates.length; i += 3){\n\t\t\t\tcoordinates[i+0] -= min.x;\n\t\t\t\tcoordinates[i+1] -= min.y;\n\t\t\t\tcoordinates[i+2] -= min.z;\n\t\t\t}\n\t\t\t\n\t\t\tconst lineGeometry = new LineGeometry();\n\t\t\tlineGeometry.setPositions( coordinates );\n\n\t\t\tconst line = new Line2( lineGeometry, matLine );\n\t\t\tline.computeLineDistances();\n\t\t\tline.scale.set( 1, 1, 1 );\n\t\t\tline.position.copy(min);\n\t\t\t\n\t\t\treturn line;\n\t\t}else if(geometry.type === \"Polygon\"){\n\t\t\tfor(let pc of geometry.coordinates){\n\t\t\t\tlet coordinates = [];\n\t\t\t\t\n\t\t\t\tlet min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\t\t\tfor(let i = 0; i < pc.length; i++){\n\t\t\t\t\tlet [long, lat] = pc[i];\n\t\t\t\t\t\n\t\t\t\t\tlet pos = transform.forward(geopackageProjection.forward([long, lat]));\n\t\t\t\t\t\n\t\t\t\t\tmin.x = Math.min(min.x, pos[0]);\n\t\t\t\t\tmin.y = Math.min(min.y, pos[1]);\n\t\t\t\t\tmin.z = Math.min(min.z, 20);\n\t\t\t\t\t\n\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t\tif(i > 0 && i < pc.length - 1){\n\t\t\t\t\t\tcoordinates.push(...pos, 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor(let i = 0; i < coordinates.length; i += 3){\n\t\t\t\t\tcoordinates[i+0] -= min.x;\n\t\t\t\t\tcoordinates[i+1] -= min.y;\n\t\t\t\t\tcoordinates[i+2] -= min.z;\n\t\t\t\t}\n\n\t\t\t\tconst lineGeometry = new LineGeometry();\n\t\t\t\tlineGeometry.setPositions( coordinates );\n\n\t\t\t\tconst line = new Line2( lineGeometry, matLine );\n\t\t\t\tline.computeLineDistances();\n\t\t\t\tline.scale.set( 1, 1, 1 );\n\t\t\t\tline.position.copy(min);\n\t\t\t\t\n\t\t\t\treturn line;\n\t\t\t}\n\t\t}else{\n\t\t\tconsole.log(\"unhandled feature: \", feature);\n\t\t}\n\t}\n\n};","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nexport class ClipVolume extends THREE.Object3D{\n\t\n\tconstructor(args){\n\t\tsuper();\n\t\t\n\t\tthis.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;\n\t\tthis.name = \"clip_volume_\" + this.constructor.counter;\n\n\t\tlet alpha = args.alpha || 0;\n\t\tlet beta = args.beta || 0;\n\t\tlet gamma = args.gamma || 0;\n\n\t\tthis.rotation.x = alpha;\n\t\tthis.rotation.y = beta;\n\t\tthis.rotation.z = gamma;\n\n\t\tthis.clipOffset = 0.001;\n\t\tthis.clipRotOffset = 1;\n\t\t\t\t\n\t\tlet boxGeometry = new THREE.BoxGeometry(1, 1, 1);\n\t\tboxGeometry.computeBoundingBox();\n\t\t\n\t\tlet boxFrameGeometry = new THREE.Geometry();\n\t\t{\t\t\t\n\t\t\t// bottom\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\t// top\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\t// sides\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\n\t\t\tboxFrameGeometry.colors.push(new THREE.Vector3(1, 1, 1));\n\t\t}\n\n\t\tlet planeFrameGeometry = new THREE.Geometry();\n\t\t{\t\t\t\t\t\t\n\t\t\t// middle line\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.0));\n\t\t\tplaneFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.0));\n\t\t}\n\n\t\tthis.dimension = new THREE.Vector3(1, 1, 1);\n\t\tthis.material = new THREE.MeshBasicMaterial( {\n\t\t\tcolor: 0x00ff00, \n\t\t\ttransparent: true, \n\t\t\topacity: 0.3,\n\t\t\tdepthTest: true, \n\t\t\tdepthWrite: false} );\n\t\tthis.box = new THREE.Mesh(boxGeometry, this.material);\n\t\tthis.box.geometry.computeBoundingBox();\n\t\tthis.boundingBox = this.box.geometry.boundingBox;\n\t\tthis.add(this.box);\n\t\t\n\t\tthis.frame = new THREE.LineSegments( boxFrameGeometry, new THREE.LineBasicMaterial({color: 0x000000}));\n\t\tthis.add(this.frame);\n\t\tthis.planeFrame = new THREE.LineSegments( planeFrameGeometry, new THREE.LineBasicMaterial({color: 0xff0000}));\n\t\tthis.add(this.planeFrame);\n\n\t\t// set default thickness\n\t\tthis.setScaleZ(0.1);\n\n\t\t// create local coordinate system\n\t\tlet createArrow = (name, direction, color) => {\n\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: color, \n\t\t\t\tdepthTest: false, \n\t\t\t\tdepthWrite: false});\n\t\t\t\t\n\t\t\tlet shaftGeometry = new THREE.Geometry();\n\t\t\tshaftGeometry.vertices.push(new THREE.Vector3(0, 0, 0));\n\t\t\tshaftGeometry.vertices.push(new THREE.Vector3(0, 1, 0));\n\t\t\t\n\t\t\tlet shaftMaterial = new THREE.LineBasicMaterial({\n\t\t\t\tcolor: color, \n\t\t\t\tdepthTest: false, \n\t\t\t\tdepthWrite: false,\n\t\t\t\ttransparent: true\n\t\t\t\t});\n\t\t\tlet shaft = new THREE.Line(shaftGeometry, shaftMaterial);\n\t\t\tshaft.name = name + \"_shaft\";\n\t\t\t\n\t\t\tlet headGeometry = new THREE.CylinderGeometry(0, 0.04, 0.1, 10, 1, false);\n\t\t\tlet headMaterial = material;\n\t\t\tlet head = new THREE.Mesh(headGeometry, headMaterial);\n\t\t\thead.name = name + \"_head\";\n\t\t\thead.position.y = 1;\n\t\t\t\n\t\t\tlet arrow = new THREE.Object3D();\n\t\t\tarrow.name = name;\n\t\t\tarrow.add(shaft);\n\t\t\tarrow.add(head);\n\n\t\t\treturn arrow;\n\t\t};\n\t\t\n\t\tthis.arrowX = createArrow(\"arrow_x\", new THREE.Vector3(1, 0, 0), 0xFF0000);\n\t\tthis.arrowY = createArrow(\"arrow_y\", new THREE.Vector3(0, 1, 0), 0x00FF00);\n\t\tthis.arrowZ = createArrow(\"arrow_z\", new THREE.Vector3(0, 0, 1), 0x0000FF);\n\t\t\n\t\tthis.arrowX.rotation.z = -Math.PI / 2;\n\t\tthis.arrowZ.rotation.x = Math.PI / 2;\n\n\t\tthis.arrowX.visible = false;\n\t\tthis.arrowY.visible = false;\n\t\tthis.arrowZ.visible = false;\n\n\t\tthis.add(this.arrowX);\n\t\tthis.add(this.arrowY);\n\t\tthis.add(this.arrowZ);\n\t\t\n\t\t{ // event listeners\n\t\t\tthis.addEventListener(\"ui_select\", e => { \n\t\t\t\tthis.arrowX.visible = true;\n\t\t\t\tthis.arrowY.visible = true;\n\t\t\t\tthis.arrowZ.visible = true; \n\t\t\t});\n\t\t\tthis.addEventListener(\"ui_deselect\", e => {\n\t\t\t\tthis.arrowX.visible = false;\n\t\t\t\tthis.arrowY.visible = false;\n\t\t\t\tthis.arrowZ.visible = false; \t\t\t\t\n\t\t\t});\n\t\t\tthis.addEventListener(\"select\", e => { \n\t\t\t\tlet scene_header = $(\"#\" + this.name + \" .scene_header\");\n\t\t\t\tif(!scene_header.next().is(\":visible\")) {\n\t\t\t\t\tscene_header.click();\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.addEventListener(\"deselect\", e => { \n\t\t\t\tlet scene_header = $(\"#\" + this.name + \" .scene_header\");\n\t\t\t\tif(scene_header.next().is(\":visible\")) {\n\t\t\t\t\tscene_header.click();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tthis.update();\n\t};\n\n\tsetClipOffset(offset) {\t\t\n\t\tthis.clipOffset = offset;\t\n\t}\n\n\tsetClipRotOffset(offset) {\t\t\n\t\tthis.clipRotOffset = offset;\t\t\n\t}\n\n\tsetScaleX(x) {\n\t\tthis.box.scale.x = x;\n\t\tthis.frame.scale.x = x;\n\t\tthis.planeFrame.scale.x = x;\t\t\t\n\t}\n\n\tsetScaleY(y) {\n\t\tthis.box.scale.y = y;\n\t\tthis.frame.scale.y = y;\n\t\tthis.planeFrame.scale.y = y;\t\t\n\t}\n\n\tsetScaleZ(z) {\n\t\tthis.box.scale.z = z;\n\t\tthis.frame.scale.z = z;\n\t\tthis.planeFrame.scale.z = z;\t\t\n\t}\n\n\toffset(args) {\n\t\tlet cs = args.cs || null;\n\t\tlet axis = args.axis || null;\n\t\tlet dir = args.dir || null;\n\n\t\tif(!cs || !axis || !dir) return;\n\n\t\tif(axis === \"x\") {\n\t\t\tif(cs === \"local\") {\n\t\t\t\tthis.position.add(this.localX.clone().multiplyScalar(dir * this.clipOffset));\n\t\t\t} else if(cs === \"global\") {\n\t\t\t\tthis.position.x = this.position.x + dir * this.clipOffset;\n\t\t\t}\n\t\t}else if(axis === \"y\") {\n\t\t\tif(cs === \"local\") {\n\t\t\t\tthis.position.add(this.localY.clone().multiplyScalar(dir * this.clipOffset));\n\t\t\t} else if(cs === \"global\") {\n\t\t\t\tthis.position.y = this.position.y + dir * this.clipOffset;\n\t\t\t}\n\t\t}else if(axis === \"z\") {\n\t\t\tif(cs === \"local\") {\n\t\t\t\tthis.position.add(this.localZ.clone().multiplyScalar(dir * this.clipOffset));\n\t\t\t} else if(cs === \"global\") {\n\t\t\t\tthis.position.z = this.position.z + dir * this.clipOffset;\n\t\t\t}\n\t\t}\n\n\t\tthis.dispatchEvent({\"type\": \"clip_volume_changed\", \"viewer\": viewer, \"volume\": this});\n\t}\t\n\n\trotate(args) {\n\t\tlet cs = args.cs || null;\n\t\tlet axis = args.axis || null;\n\t\tlet dir = args.dir || null;\n\n\t\tif(!cs || !axis || !dir) return;\n\n\t\tif(cs === \"local\") {\n\t\t\tif(axis === \"x\") {\n\t\t\t\tthis.rotateOnAxis(new THREE.Vector3(1, 0, 0), dir * this.clipRotOffset * Math.PI / 180);\n\t\t\t} else if(axis === \"y\") {\n\t\t\t\tthis.rotateOnAxis(new THREE.Vector3(0, 1, 0), dir * this.clipRotOffset * Math.PI / 180);\n\t\t\t} else if(axis === \"z\") {\n\t\t\t\tthis.rotateOnAxis(new THREE.Vector3(0, 0, 1), dir * this.clipRotOffset * Math.PI / 180);\n\t\t\t}\n\t\t} else if(cs === \"global\") {\n\t\t\tlet rotaxis = new THREE.Vector4(1, 0, 0, 0);\t\n\t\t\tif(axis === \"y\") {\n\t\t\t\trotaxis = new THREE.Vector4(0, 1, 0, 0);\n\t\t\t} else if(axis === \"z\") {\n\t\t\t\trotaxis = new THREE.Vector4(0, 0, 1, 0);\n\t\t\t}\n\t\t\tthis.updateMatrixWorld();\n\t\t\tlet invM = newthis.matrixWorld.clone().invert();\n\t\t\trotaxis = rotaxis.applyMatrix4(invM).normalize();\n\t\t\trotaxis = new THREE.Vector3(rotaxis.x, rotaxis.y, rotaxis.z);\n\t\t\tthis.rotateOnAxis(rotaxis, dir * this.clipRotOffset * Math.PI / 180);\n\t\t}\n\n\t\tthis.updateLocalSystem();\n\n\t\tthis.dispatchEvent({\"type\": \"clip_volume_changed\", \"viewer\": viewer, \"volume\": this});\n\t}\t\n\n\tupdate(){\n\t\tthis.boundingBox = this.box.geometry.boundingBox;\n\t\tthis.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\t\n\t\tthis.box.visible = false;\n\n\t\tthis.updateLocalSystem();\n\t};\n\n\tupdateLocalSystem() {\t\t\n\t\t// extract local coordinate axes\n\t\tlet rotQuat = this.getWorldQuaternion();\n\t\tthis.localX = new THREE.Vector3(1, 0, 0).applyQuaternion(rotQuat).normalize();\n\t\tthis.localY = new THREE.Vector3(0, 1, 0).applyQuaternion(rotQuat).normalize();\n\t\tthis.localZ = new THREE.Vector3(0, 0, 1).applyQuaternion(rotQuat).normalize();\n\t}\n\t\n\traycast(raycaster, intersects){\n\t\t\n\t\tlet is = [];\n\t\tthis.box.raycast(raycaster, is);\n\t\n\t\tif(is.length > 0){\n\t\t\tlet I = is[0];\n\t\t\tintersects.push({\n\t\t\t\tdistance: I.distance,\n\t\t\t\tobject: this,\n\t\t\t\tpoint: I.point.clone()\n\t\t\t});\n\t\t}\n\t};\n};\n","\n\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {ClipVolume} from \"./ClipVolume.js\";\nimport {PolygonClipVolume} from \"./PolygonClipVolume.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\n\nexport class ClippingTool extends EventDispatcher{\n\n\tconstructor(viewer){\n\t\tsuper(); \n\n\t\tthis.viewer = viewer;\n\n\t\tthis.maxPolygonVertices = 8; \n\t\t\n\t\tthis.addEventListener(\"start_inserting_clipping_volume\", e => {\n\t\t\tthis.viewer.dispatchEvent({\n\t\t\t\ttype: \"cancel_insertions\"\n\t\t\t});\n\t\t});\n\n\t\tthis.sceneMarker = new THREE.Scene();\n\t\tthis.sceneVolume = new THREE.Scene();\n\t\tthis.sceneVolume.name = \"scene_clip_volume\";\n\t\tthis.viewer.inputHandler.registerInteractiveScene(this.sceneVolume);\n\n\t\tthis.onRemove = e => {\n\t\t\tthis.sceneVolume.remove(e.volume);\n\t\t};\n\t\t\n\t\tthis.onAdd = e => {\n\t\t\tthis.sceneVolume.add(e.volume);\n\t\t};\n\t\t\n\t\tthis.viewer.inputHandler.addEventListener(\"delete\", e => {\n\t\t\tlet volumes = e.selection.filter(e => (e instanceof ClipVolume));\n\t\t\tvolumes.forEach(e => this.viewer.scene.removeClipVolume(e));\n\t\t\tlet polyVolumes = e.selection.filter(e => (e instanceof PolygonClipVolume));\n\t\t\tpolyVolumes.forEach(e => this.viewer.scene.removePolygonClipVolume(e));\n\t\t});\n\t}\n\n\tsetScene(scene){\n\t\tif(this.scene === scene){\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(this.scene){\n\t\t\tthis.scene.removeEventListeners(\"clip_volume_added\", this.onAdd);\n\t\t\tthis.scene.removeEventListeners(\"clip_volume_removed\", this.onRemove);\n\t\t\tthis.scene.removeEventListeners(\"polygon_clip_volume_added\", this.onAdd);\n\t\t\tthis.scene.removeEventListeners(\"polygon_clip_volume_removed\", this.onRemove);\n\t\t}\n\t\t\n\t\tthis.scene = scene;\n\t\t\n\t\tthis.scene.addEventListener(\"clip_volume_added\", this.onAdd);\n\t\tthis.scene.addEventListener(\"clip_volume_removed\", this.onRemove);\n\t\tthis.scene.addEventListener(\"polygon_clip_volume_added\", this.onAdd);\n\t\tthis.scene.addEventListener(\"polygon_clip_volume_removed\", this.onRemove);\n\t}\n\n\tstartInsertion(args = {}) {\t\n\t\tlet type = args.type || null;\n\n\t\tif(!type) return null;\n\n\t\tlet domElement = this.viewer.renderer.domElement;\n\t\tlet canvasSize = this.viewer.renderer.getSize(new THREE.Vector2());\n\n\t\tlet svg = $(`\n\t\t\n\n\t\t\t\n\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\n\t\t\t\n\t\t`);\n\t\t$(domElement.parentElement).append(svg);\n\n\t\tlet polyClipVol = new PolygonClipVolume(this.viewer.scene.getActiveCamera().clone());\n\n\t\tthis.dispatchEvent({\"type\": \"start_inserting_clipping_volume\"});\n\n\t\tthis.viewer.scene.addPolygonClipVolume(polyClipVol);\n\t\tthis.sceneMarker.add(polyClipVol);\n\n\t\tlet cancel = {\n\t\t\tcallback: null\n\t\t};\n\n\t\tlet insertionCallback = (e) => {\n\t\t\tif(e.button === THREE.MOUSE.LEFT){\n\t\t\t\t\n\t\t\t\tpolyClipVol.addMarker();\n\n\t\t\t\t// SVC Screen Line\n\t\t\t\tsvg.find(\"polyline\").each((index, target) => {\n\t\t\t\t\tlet newPoint = svg[0].createSVGPoint();\n\t\t\t\t\tnewPoint.x = e.offsetX;\n\t\t\t\t\tnewPoint.y = e.offsetY;\n\t\t\t\t\tlet polyline = target.points.appendItem(newPoint);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tif(polyClipVol.markers.length > this.maxPolygonVertices){\n\t\t\t\t\tcancel.callback();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.viewer.inputHandler.startDragging(\n\t\t\t\t\tpolyClipVol.markers[polyClipVol.markers.length - 1]);\n\t\t\t}else if(e.button === THREE.MOUSE.RIGHT){\n\t\t\t\tcancel.callback(e);\n\t\t\t}\n\t\t};\n\t\t\n\t\tcancel.callback = e => {\n\n\t\t\t//let first = svg.find(\"polyline\")[0].points[0];\n\t\t\t//svg.find(\"polyline\").each((index, target) => {\n\t\t\t//\tlet newPoint = svg[0].createSVGPoint();\n\t\t\t//\tnewPoint.x = first.x;\n\t\t\t//\tnewPoint.y = first.y;\n\t\t\t//\tlet polyline = target.points.appendItem(newPoint);\n\t\t\t//});\n\t\t\tsvg.remove();\n\n\t\t\tif(polyClipVol.markers.length > 3) {\n\t\t\t\tpolyClipVol.removeLastMarker();\n\t\t\t\tpolyClipVol.initialized = true;\t\n\t\t\t} else {\n\t\t\t\tthis.viewer.scene.removePolygonClipVolume(polyClipVol);\n\t\t\t}\n\n\t\t\tthis.viewer.renderer.domElement.removeEventListener(\"mouseup\", insertionCallback, true);\n\t\t\tthis.viewer.removeEventListener(\"cancel_insertions\", cancel.callback);\n\t\t\tthis.viewer.inputHandler.enabled = true;\n\t\t};\n\t\t\n\t\tthis.viewer.addEventListener(\"cancel_insertions\", cancel.callback);\n\t\tthis.viewer.renderer.domElement.addEventListener(\"mouseup\", insertionCallback , true);\n\t\tthis.viewer.inputHandler.enabled = false;\n\t\t\n\t\tpolyClipVol.addMarker();\n\t\tthis.viewer.inputHandler.startDragging(\n\t\t\tpolyClipVol.markers[polyClipVol.markers.length - 1]);\n\n\t\treturn polyClipVol;\n\t}\n\n\tupdate() {\n\n\t}\n};","\nimport {Enum} from \"../Enum.js\";\n\nvar GeoTIFF = (function (exports) {\n'use strict';\n\nconst Endianness = new Enum({\n\tLITTLE: \"II\",\n\tBIG: \"MM\",\n});\n\nconst Type = new Enum({\n\tBYTE: {value: 1, bytes: 1},\n\tASCII: {value: 2, bytes: 1},\n\tSHORT: {value: 3, bytes: 2},\n\tLONG: {value: 4, bytes: 4},\n\tRATIONAL: {value: 5, bytes: 8},\n\tSBYTE: {value: 6, bytes: 1},\n\tUNDEFINED: {value: 7, bytes: 1},\n\tSSHORT: {value: 8, bytes: 2},\n\tSLONG: {value: 9, bytes: 4},\n\tSRATIONAL: {value: 10, bytes: 8},\n\tFLOAT: {value: 11, bytes: 4},\n\tDOUBLE: {value: 12, bytes: 8},\n});\n\nconst Tag = new Enum({\n\tIMAGE_WIDTH: 256,\n\tIMAGE_HEIGHT: 257,\n\tBITS_PER_SAMPLE: 258,\n\tCOMPRESSION: 259,\n\tPHOTOMETRIC_INTERPRETATION: 262,\n\tSTRIP_OFFSETS: 273,\n\tORIENTATION: 274,\n\tSAMPLES_PER_PIXEL: 277,\n\tROWS_PER_STRIP: 278,\n\tSTRIP_BYTE_COUNTS: 279,\n\tX_RESOLUTION: 282,\n\tY_RESOLUTION: 283,\n\tPLANAR_CONFIGURATION: 284,\n\tRESOLUTION_UNIT: 296,\n\tSOFTWARE: 305,\n\tCOLOR_MAP: 320,\n\tSAMPLE_FORMAT: 339,\n\tMODEL_PIXEL_SCALE: 33550, // [GeoTIFF] TYPE: double N: 3\n\tMODEL_TIEPOINT: 33922, // [GeoTIFF] TYPE: double N: 6 * NUM_TIEPOINTS\n\tGEO_KEY_DIRECTORY: 34735, // [GeoTIFF] TYPE: short N: >= 4\n\tGEO_DOUBLE_PARAMS: 34736, // [GeoTIFF] TYPE: short N: variable\n\tGEO_ASCII_PARAMS: 34737, // [GeoTIFF] TYPE: ascii N: variable\n});\n\nconst typeMapping = new Map([\n\t[Type.BYTE, Uint8Array],\n\t[Type.ASCII, Uint8Array],\n\t[Type.SHORT, Uint16Array],\n\t[Type.LONG, Uint32Array],\n\t[Type.RATIONAL, Uint32Array],\n\t[Type.SBYTE, Int8Array],\n\t[Type.UNDEFINED, Uint8Array],\n\t[Type.SSHORT, Int16Array],\n\t[Type.SLONG, Int32Array],\n\t[Type.SRATIONAL, Int32Array],\n\t[Type.FLOAT, Float32Array],\n\t[Type.DOUBLE, Float64Array],\n]);\n\nclass IFDEntry{\n\n\tconstructor(tag, type, count, offset, value){\n\t\tthis.tag = tag;\n\t\tthis.type = type;\n\t\tthis.count = count;\n\t\tthis.offset = offset;\n\t\tthis.value = value;\n\t}\n\n}\n\nclass Image{\n\n\tconstructor(){\n\t\tthis.width = 0;\n\t\tthis.height = 0;\n\t\tthis.buffer = null;\n\t\tthis.metadata = [];\n\t}\n\n}\n\nclass Reader{\n\n\tconstructor(){\n\n\t}\n\n\tstatic read(data){\n\n\t\tlet endiannessTag = String.fromCharCode(...Array.from(data.slice(0, 2)));\n\t\tlet endianness = Endianness.fromValue(endiannessTag);\n\n\t\tlet tiffCheckTag = data.readUInt8(2);\n\n\t\tif(tiffCheckTag !== 42){\n\t\t\tthrow new Error(\"not a valid tiff file\");\n\t\t}\n\n\t\tlet offsetToFirstIFD = data.readUInt32LE(4);\n\n\t\tconsole.log(\"offsetToFirstIFD\", offsetToFirstIFD);\n\n\t\tlet ifds = [];\n\t\tlet IFDsRead = false;\n\t\tlet currentIFDOffset = offsetToFirstIFD;\n\t\tlet i = 0;\n\t\twhile(IFDsRead || i < 100){\n\n\t\t\tconsole.log(\"currentIFDOffset\", currentIFDOffset);\n\t\t\tlet numEntries = data.readUInt16LE(currentIFDOffset);\n\t\t\tlet nextIFDOffset = data.readUInt32LE(currentIFDOffset + 2 + numEntries * 12);\n\n\t\t\tconsole.log(\"next offset: \", currentIFDOffset + 2 + numEntries * 12);\n\n\t\t\tlet entryBuffer = data.slice(currentIFDOffset + 2, currentIFDOffset + 2 + 12 * numEntries);\n\n\t\t\tfor(let i = 0; i < numEntries; i++){\n\t\t\t\tlet tag = Tag.fromValue(entryBuffer.readUInt16LE(i * 12));\n\t\t\t\tlet type = Type.fromValue(entryBuffer.readUInt16LE(i * 12 + 2));\n\t\t\t\tlet count = entryBuffer.readUInt32LE(i * 12 + 4);\n\t\t\t\tlet offsetOrValue = entryBuffer.readUInt32LE(i * 12 + 8);\n\t\t\t\tlet valueBytes = type.bytes * count;\n\n\t\t\t\tlet value;\n\t\t\t\tif(valueBytes <= 4){\n\t\t\t\t\tvalue = offsetOrValue;\n\t\t\t\t}else{\n\t\t\t\t\tlet valueBuffer = new Uint8Array(valueBytes);\n\t\t\t\t\tvalueBuffer.set(data.slice(offsetOrValue, offsetOrValue + valueBytes));\n\t\t\t\t\t\n\t\t\t\t\tlet ArrayType = typeMapping.get(type);\n\n\t\t\t\t\tvalue = new ArrayType(valueBuffer.buffer);\n\n\t\t\t\t\tif(type === Type.ASCII){\n\t\t\t\t\t\tvalue = String.fromCharCode(...value);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet ifd = new IFDEntry(tag, type, count, offsetOrValue, value);\n\n\t\t\t\tifds.push(ifd);\n\t\t\t}\n\n\t\t\tconsole.log(\"nextIFDOffset\", nextIFDOffset);\n\n\t\t\tif(nextIFDOffset === 0){\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcurrentIFDOffset = nextIFDOffset;\n\t\t\ti++;\n\t\t}\n\n\t\tlet ifdForTag = (tag) => {\n\t\t\tfor(let entry of ifds){\n\t\t\t\tif(entry.tag === tag){\n\t\t\t\t\treturn entry;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\tlet width = ifdForTag(Tag.IMAGE_WIDTH, ifds).value;\n\t\tlet height = ifdForTag(Tag.IMAGE_HEIGHT, ifds).value;\n\t\tlet compression = ifdForTag(Tag.COMPRESSION, ifds).value;\n\t\tlet rowsPerStrip = ifdForTag(Tag.ROWS_PER_STRIP, ifds).value; \n\t\tlet ifdStripOffsets = ifdForTag(Tag.STRIP_OFFSETS, ifds);\n\t\tlet ifdStripByteCounts = ifdForTag(Tag.STRIP_BYTE_COUNTS, ifds);\n\n\t\tlet numStrips = Math.ceil(height / rowsPerStrip);\n\n\t\tlet stripByteCounts = [];\n\t\tfor(let i = 0; i < ifdStripByteCounts.count; i++){\n\t\t\tlet type = ifdStripByteCounts.type;\n\t\t\tlet offset = ifdStripByteCounts.offset + i * type.bytes;\n\n\t\t\tlet value;\n\t\t\tif(type === Type.SHORT){\n\t\t\t\tvalue = data.readUInt16LE(offset);\n\t\t\t}else if(type === Type.LONG){\n\t\t\t\tvalue = data.readUInt32LE(offset);\n\t\t\t}\n\n\t\t\tstripByteCounts.push(value);\n\t\t}\n\n\t\tlet stripOffsets = [];\n\t\tfor(let i = 0; i < ifdStripOffsets.count; i++){\n\t\t\tlet type = ifdStripOffsets.type;\n\t\t\tlet offset = ifdStripOffsets.offset + i * type.bytes;\n\n\t\t\tlet value;\n\t\t\tif(type === Type.SHORT){\n\t\t\t\tvalue = data.readUInt16LE(offset);\n\t\t\t}else if(type === Type.LONG){\n\t\t\t\tvalue = data.readUInt32LE(offset);\n\t\t\t}\n\n\t\t\tstripOffsets.push(value);\n\t\t}\n\n\t\tlet imageBuffer = new Uint8Array(width * height * 3);\n\t\t\n\t\tlet linesProcessed = 0;\n\t\tfor(let i = 0; i < numStrips; i++){\n\t\t\tlet stripOffset = stripOffsets[i];\n\t\t\tlet stripBytes = stripByteCounts[i];\n\t\t\tlet stripData = data.slice(stripOffset, stripOffset + stripBytes);\n\t\t\tlet lineBytes = width * 3;\n\t\t\tfor(let y = 0; y < rowsPerStrip; y++){\n\t\t\t\tlet line = stripData.slice(y * lineBytes, y * lineBytes + lineBytes);\n\t\t\t\timageBuffer.set(line, linesProcessed * lineBytes);\n\t\t\n\t\t\t\tif(line.length === lineBytes){\n\t\t\t\t\tlinesProcessed++;\n\t\t\t\t}else{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(`width: ${width}`);\n\t\tconsole.log(`height: ${height}`);\n\t\tconsole.log(`numStrips: ${numStrips}`);\n\t\tconsole.log(\"stripByteCounts\", stripByteCounts.join(\", \"));\n\t\tconsole.log(\"stripOffsets\", stripOffsets.join(\", \"));\n\n\t\tlet image = new Image();\n\t\timage.width = width;\n\t\timage.height = height;\n\t\timage.buffer = imageBuffer;\n\t\timage.metadata = ifds;\n\n\t\treturn image;\n\t}\n\n}\n\n\nclass Exporter{\n\n\tconstructor(){\n\n\t}\n\n\tstatic toTiffBuffer(image, params = {}){\n\n\t\tlet offsetToFirstIFD = 8;\n\t\t\n\t\tlet headerBuffer = new Uint8Array([0x49, 0x49, 42, 0, offsetToFirstIFD, 0, 0, 0]);\n\n\t\tlet [width, height] = [image.width, image.height];\n\n\t\tlet ifds = [\n\t\t\tnew IFDEntry(Tag.IMAGE_WIDTH, Type.SHORT, 1, null, width),\n\t\t\tnew IFDEntry(Tag.IMAGE_HEIGHT, Type.SHORT, 1, null, height),\n\t\t\tnew IFDEntry(Tag.BITS_PER_SAMPLE, Type.SHORT, 4, null, new Uint16Array([8, 8, 8, 8])),\n\t\t\tnew IFDEntry(Tag.COMPRESSION, Type.SHORT, 1, null, 1),\n\t\t\tnew IFDEntry(Tag.PHOTOMETRIC_INTERPRETATION, Type.SHORT, 1, null, 2),\n\t\t\tnew IFDEntry(Tag.ORIENTATION, Type.SHORT, 1, null, 1),\n\t\t\tnew IFDEntry(Tag.SAMPLES_PER_PIXEL, Type.SHORT, 1, null, 4),\n\t\t\tnew IFDEntry(Tag.ROWS_PER_STRIP, Type.LONG, 1, null, height),\n\t\t\tnew IFDEntry(Tag.STRIP_BYTE_COUNTS, Type.LONG, 1, null, width * height * 3),\n\t\t\tnew IFDEntry(Tag.PLANAR_CONFIGURATION, Type.SHORT, 1, null, 1),\n\t\t\tnew IFDEntry(Tag.RESOLUTION_UNIT, Type.SHORT, 1, null, 1),\n\t\t\tnew IFDEntry(Tag.SOFTWARE, Type.ASCII, 6, null, \"......\"),\n\t\t\tnew IFDEntry(Tag.STRIP_OFFSETS, Type.LONG, 1, null, null),\n\t\t\tnew IFDEntry(Tag.X_RESOLUTION, Type.RATIONAL, 1, null, new Uint32Array([1, 1])),\n\t\t\tnew IFDEntry(Tag.Y_RESOLUTION, Type.RATIONAL, 1, null, new Uint32Array([1, 1])),\n\t\t];\n\n\t\tif(params.ifdEntries){\n\t\t\tifds.push(...params.ifdEntries);\n\t\t}\n\n\t\tlet valueOffset = offsetToFirstIFD + 2 + ifds.length * 12 + 4;\n\n\t\t// create 12 byte buffer for each ifd and variable length buffers for ifd values\n\t\tlet ifdEntryBuffers = new Map();\n\t\tlet ifdValueBuffers = new Map();\n\t\tfor(let ifd of ifds){\n\t\t\tlet entryBuffer = new ArrayBuffer(12);\n\t\t\tlet entryView = new DataView(entryBuffer);\n\n\t\t\tlet valueBytes = ifd.type.bytes * ifd.count;\n\n\t\t\tentryView.setUint16(0, ifd.tag.value, true);\n\t\t\tentryView.setUint16(2, ifd.type.value, true);\n\t\t\tentryView.setUint32(4, ifd.count, true);\n\n\t\t\tif(ifd.count === 1 && ifd.type.bytes <= 4){\n\t\t\t\tentryView.setUint32(8, ifd.value, true);\n\t\t\t}else{\n\t\t\t\tentryView.setUint32(8, valueOffset, true);\n\n\t\t\t\tlet valueBuffer = new Uint8Array(ifd.count * ifd.type.bytes);\n\t\t\t\tif(ifd.type === Type.ASCII){\n\t\t\t\t\tvalueBuffer.set(new Uint8Array(ifd.value.split(\"\").map(c => c.charCodeAt(0))));\n\t\t\t\t}else{\n\t\t\t\t\tvalueBuffer.set(new Uint8Array(ifd.value.buffer));\n\t\t\t\t}\n\t\t\t\tifdValueBuffers.set(ifd.tag, valueBuffer);\n\n\t\t\t\tvalueOffset = valueOffset + valueBuffer.byteLength;\n\t\t\t}\n\n\t\t\tifdEntryBuffers.set(ifd.tag, entryBuffer);\n\t\t}\n\n\t\tlet imageBufferOffset = valueOffset;\n\n\t\tnew DataView(ifdEntryBuffers.get(Tag.STRIP_OFFSETS)).setUint32(8, imageBufferOffset, true);\n\n\t\tlet concatBuffers = (buffers) => {\n\n\t\t\tlet totalLength = buffers.reduce( (sum, buffer) => (sum + buffer.byteLength), 0);\n\t\t\tlet merged = new Uint8Array(totalLength);\n\n\t\t\tlet offset = 0;\n\t\t\tfor(let buffer of buffers){\n\t\t\t\tmerged.set(new Uint8Array(buffer), offset);\n\t\t\t\toffset += buffer.byteLength;\n\t\t\t}\n\n\t\t\treturn merged;\n\t\t};\n\t\t\n\t\tlet ifdBuffer = concatBuffers([\n\t\t\tnew Uint16Array([ifds.length]), \n\t\t\t...ifdEntryBuffers.values(), \n\t\t\tnew Uint32Array([0])]);\n\t\tlet ifdValueBuffer = concatBuffers([...ifdValueBuffers.values()]);\n\n\t\tlet tiffBuffer = concatBuffers([\n\t\t\theaderBuffer,\n\t\t\tifdBuffer,\n\t\t\tifdValueBuffer,\n\t\t\timage.buffer\n\t\t]);\n\n\t\treturn {width: width, height: height, buffer: tiffBuffer};\n\t}\n\n}\n\nexports.Tag = Tag;\nexports.Type = Type;\nexports.IFDEntry = IFDEntry;\nexports.Image = Image;\nexports.Reader = Reader;\nexports.Exporter = Exporter;\n\nreturn exports;\n\n}({}));\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Measure} from \"./Measure.js\";\nimport {Utils} from \"../utils.js\";\nimport {CameraMode} from \"../defines.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\n\nfunction updateAzimuth(viewer, measure){\n\n\tconst azimuth = measure.azimuth;\n\n\tconst isOkay = measure.points.length === 2;\n\n\tazimuth.node.visible = isOkay && measure.showAzimuth;\n\n\tif(!azimuth.node.visible){\n\t\treturn;\n\t}\n\n\tconst camera = viewer.scene.getActiveCamera();\n\tconst renderAreaSize = viewer.renderer.getSize(new THREE.Vector2());\n\tconst width = renderAreaSize.width;\n\tconst height = renderAreaSize.height;\n\t\n\tconst [p0, p1] = measure.points;\n\tconst r = p0.position.distanceTo(p1.position);\n\tconst northVec = Utils.getNorthVec(p0.position, r, viewer.getProjection());\n\tconst northPos = p0.position.clone().add(northVec);\n\n\tazimuth.center.position.copy(p0.position);\n\tazimuth.center.scale.set(2, 2, 2);\n\t\n\tazimuth.center.visible = false;\n\t// azimuth.target.visible = false;\n\n\n\t{ // north\n\t\tazimuth.north.position.copy(northPos);\n\t\tazimuth.north.scale.set(2, 2, 2);\n\n\t\tlet distance = azimuth.north.position.distanceTo(camera.position);\n\t\tlet pr = Utils.projectedRadius(1, camera, distance, width, height);\n\n\t\tlet scale = (5 / pr);\n\t\tazimuth.north.scale.set(scale, scale, scale);\n\t}\n\n\t{ // target\n\t\tazimuth.target.position.copy(p1.position);\n\t\tazimuth.target.position.z = azimuth.north.position.z;\n\n\t\tlet distance = azimuth.target.position.distanceTo(camera.position);\n\t\tlet pr = Utils.projectedRadius(1, camera, distance, width, height);\n\n\t\tlet scale = (5 / pr);\n\t\tazimuth.target.scale.set(scale, scale, scale);\n\t}\n\n\n\tazimuth.circle.position.copy(p0.position);\n\tazimuth.circle.scale.set(r, r, r);\n\tazimuth.circle.material.resolution.set(width, height);\n\n\t// to target\n\tazimuth.centerToTarget.geometry.setPositions([\n\t\t0, 0, 0,\n\t\t...p1.position.clone().sub(p0.position).toArray(),\n\t]);\n\tazimuth.centerToTarget.position.copy(p0.position);\n\tazimuth.centerToTarget.geometry.verticesNeedUpdate = true;\n\tazimuth.centerToTarget.geometry.computeBoundingSphere();\n\tazimuth.centerToTarget.computeLineDistances();\n\tazimuth.centerToTarget.material.resolution.set(width, height);\n\n\t// to target ground\n\tazimuth.centerToTargetground.geometry.setPositions([\n\t\t0, 0, 0,\n\t\tp1.position.x - p0.position.x,\n\t\tp1.position.y - p0.position.y,\n\t\t0,\n\t]);\n\tazimuth.centerToTargetground.position.copy(p0.position);\n\tazimuth.centerToTargetground.geometry.verticesNeedUpdate = true;\n\tazimuth.centerToTargetground.geometry.computeBoundingSphere();\n\tazimuth.centerToTargetground.computeLineDistances();\n\tazimuth.centerToTargetground.material.resolution.set(width, height);\n\n\t// to north\n\tazimuth.centerToNorth.geometry.setPositions([\n\t\t0, 0, 0,\n\t\tnorthPos.x - p0.position.x,\n\t\tnorthPos.y - p0.position.y,\n\t\t0,\n\t]);\n\tazimuth.centerToNorth.position.copy(p0.position);\n\tazimuth.centerToNorth.geometry.verticesNeedUpdate = true;\n\tazimuth.centerToNorth.geometry.computeBoundingSphere();\n\tazimuth.centerToNorth.computeLineDistances();\n\tazimuth.centerToNorth.material.resolution.set(width, height);\n\n\t// label\n\tconst radians = Utils.computeAzimuth(p0.position, p1.position, viewer.getProjection());\n\tlet degrees = THREE.Math.radToDeg(radians);\n\tif(degrees < 0){\n\t\tdegrees = 360 + degrees;\n\t}\n\tconst txtDegrees = `${degrees.toFixed(2)}°`;\n\tconst labelDir = northPos.clone().add(p1.position).multiplyScalar(0.5).sub(p0.position);\n\tif(labelDir.length() > 0){\n\t\tlabelDir.z = 0;\n\t\tlabelDir.normalize();\n\t\tconst labelVec = labelDir.clone().multiplyScalar(r);\n\t\tconst labelPos = p0.position.clone().add(labelVec);\n\t\tazimuth.label.position.copy(labelPos);\n\t}\n\tazimuth.label.setText(txtDegrees);\n\tlet distance = azimuth.label.position.distanceTo(camera.position);\n\tlet pr = Utils.projectedRadius(1, camera, distance, width, height);\n\tlet scale = (70 / pr);\n\tazimuth.label.scale.set(scale, scale, scale);\n}\n\nexport class MeasuringTool extends EventDispatcher{\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.addEventListener('start_inserting_measurement', e => {\n\t\t\tthis.viewer.dispatchEvent({\n\t\t\t\ttype: 'cancel_insertions'\n\t\t\t});\n\t\t});\n\n\t\tthis.showLabels = true;\n\t\tthis.scene = new THREE.Scene();\n\t\tthis.scene.name = 'scene_measurement';\n\t\tthis.light = new THREE.PointLight(0xffffff, 1.0);\n\t\tthis.scene.add(this.light);\n\n\t\tthis.viewer.inputHandler.registerInteractiveScene(this.scene);\n\n\t\tthis.onRemove = (e) => { this.scene.remove(e.measurement);};\n\t\tthis.onAdd = e => {this.scene.add(e.measurement);};\n\n\t\tfor(let measurement of viewer.scene.measurements){\n\t\t\tthis.onAdd({measurement: measurement});\n\t\t}\n\n\t\tviewer.addEventListener(\"update\", this.update.bind(this));\n\t\tviewer.addEventListener(\"render.pass.perspective_overlay\", this.render.bind(this));\n\t\tviewer.addEventListener(\"scene_changed\", this.onSceneChange.bind(this));\n\n\t\tviewer.scene.addEventListener('measurement_added', this.onAdd);\n\t\tviewer.scene.addEventListener('measurement_removed', this.onRemove);\n\t}\n\n\tonSceneChange(e){\n\t\tif(e.oldScene){\n\t\t\te.oldScene.removeEventListener('measurement_added', this.onAdd);\n\t\t\te.oldScene.removeEventListener('measurement_removed', this.onRemove);\n\t\t}\n\n\t\te.scene.addEventListener('measurement_added', this.onAdd);\n\t\te.scene.addEventListener('measurement_removed', this.onRemove);\n\t}\n\n\tstartInsertion (args = {}) {\n\t\tlet domElement = this.viewer.renderer.domElement;\n\n\t\tlet measure = new Measure();\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'start_inserting_measurement',\n\t\t\tmeasure: measure\n\t\t});\n\n\t\tconst pick = (defaul, alternative) => {\n\t\t\tif(defaul != null){\n\t\t\t\treturn defaul;\n\t\t\t}else{\n\t\t\t\treturn alternative;\n\t\t\t}\n\t\t};\n\n\t\tmeasure.showDistances = (args.showDistances === null) ? true : args.showDistances;\n\n\t\tmeasure.showArea = pick(args.showArea, false);\n\t\tmeasure.showAngles = pick(args.showAngles, false);\n\t\tmeasure.showCoordinates = pick(args.showCoordinates, false);\n\t\tmeasure.showHeight = pick(args.showHeight, false);\n\t\tmeasure.showCircle = pick(args.showCircle, false);\n\t\tmeasure.showAzimuth = pick(args.showAzimuth, false);\n\t\tmeasure.showEdges = pick(args.showEdges, true);\n\t\tmeasure.closed = pick(args.closed, false);\n\t\tmeasure.maxMarkers = pick(args.maxMarkers, Infinity);\n\n\t\tmeasure.name = args.name || 'Measurement';\n\n\t\tthis.scene.add(measure);\n\n\t\tlet cancel = {\n\t\t\tremoveLastMarker: measure.maxMarkers > 3,\n\t\t\tcallback: null\n\t\t};\n\n\t\tlet insertionCallback = (e) => {\n\t\t\tif (e.button === THREE.MOUSE.LEFT) {\n\t\t\t\tmeasure.addMarker(measure.points[measure.points.length - 1].position.clone());\n\n\t\t\t\tif (measure.points.length >= measure.maxMarkers) {\n\t\t\t\t\tcancel.callback();\n\t\t\t\t}\n\n\t\t\t\tthis.viewer.inputHandler.startDragging(\n\t\t\t\t\tmeasure.spheres[measure.spheres.length - 1]);\n\t\t\t} else if (e.button === THREE.MOUSE.RIGHT) {\n\t\t\t\tcancel.callback();\n\t\t\t}\n\t\t};\n\n\t\tcancel.callback = e => {\n\t\t\tif (cancel.removeLastMarker) {\n\t\t\t\tmeasure.removeMarker(measure.points.length - 1);\n\t\t\t}\n\t\t\tdomElement.removeEventListener('mouseup', insertionCallback, true);\n\t\t\tthis.viewer.removeEventListener('cancel_insertions', cancel.callback);\n\t\t};\n\n\t\tif (measure.maxMarkers > 1) {\n\t\t\tthis.viewer.addEventListener('cancel_insertions', cancel.callback);\n\t\t\tdomElement.addEventListener('mouseup', insertionCallback, true);\n\t\t}\n\n\t\tmeasure.addMarker(new THREE.Vector3(0, 0, 0));\n\t\tthis.viewer.inputHandler.startDragging(\n\t\t\tmeasure.spheres[measure.spheres.length - 1]);\n\n\t\tthis.viewer.scene.addMeasurement(measure);\n\n\t\treturn measure;\n\t}\n\t\n\tupdate(){\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\tlet domElement = this.renderer.domElement;\n\t\tlet measurements = this.viewer.scene.measurements;\n\n\t\tconst renderAreaSize = this.renderer.getSize(new THREE.Vector2());\n\t\tlet clientWidth = renderAreaSize.width;\n\t\tlet clientHeight = renderAreaSize.height;\n\n\t\tthis.light.position.copy(camera.position);\n\n\t\t// make size independant of distance\n\t\tfor (let measure of measurements) {\n\t\t\tmeasure.lengthUnit = this.viewer.lengthUnit;\n\t\t\tmeasure.lengthUnitDisplay = this.viewer.lengthUnitDisplay;\n\t\t\tmeasure.update();\n\n\t\t\tupdateAzimuth(this.viewer, measure);\n\n\t\t\t// spheres\n\t\t\tfor(let sphere of measure.spheres){\n\t\t\t\tlet distance = camera.position.distanceTo(sphere.getWorldPosition(new THREE.Vector3()));\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\t\t\t\tlet scale = (15 / pr);\n\t\t\t\tsphere.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\t// labels\n\t\t\tlet labels = measure.edgeLabels.concat(measure.angleLabels);\n\t\t\tfor(let label of labels){\n\t\t\t\tlet distance = camera.position.distanceTo(label.getWorldPosition(new THREE.Vector3()));\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\t\t\t\tlet scale = (70 / pr);\n\n\t\t\t\tif(Potree.debug.scale){\n\t\t\t\t\tscale = (Potree.debug.scale / pr);\n\t\t\t\t}\n\n\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\t// coordinate labels\n\t\t\tfor (let j = 0; j < measure.coordinateLabels.length; j++) {\n\t\t\t\tlet label = measure.coordinateLabels[j];\n\t\t\t\tlet sphere = measure.spheres[j];\n\n\t\t\t\tlet distance = camera.position.distanceTo(sphere.getWorldPosition(new THREE.Vector3()));\n\n\t\t\t\tlet screenPos = sphere.getWorldPosition(new THREE.Vector3()).clone().project(camera);\n\t\t\t\tscreenPos.x = Math.round((screenPos.x + 1) * clientWidth / 2);\n\t\t\t\tscreenPos.y = Math.round((-screenPos.y + 1) * clientHeight / 2);\n\t\t\t\tscreenPos.z = 0;\n\t\t\t\tscreenPos.y -= 30;\n\n\t\t\t\tlet labelPos = new THREE.Vector3( \n\t\t\t\t\t(screenPos.x / clientWidth) * 2 - 1, \n\t\t\t\t\t-(screenPos.y / clientHeight) * 2 + 1, \n\t\t\t\t\t0.5 );\n\t\t\t\tlabelPos.unproject(camera);\n\t\t\t\tif(this.viewer.scene.cameraMode == CameraMode.PERSPECTIVE) {\n\t\t\t\t\tlet direction = labelPos.sub(camera.position).normalize();\n\t\t\t\t\tlabelPos = new THREE.Vector3().addVectors(\n\t\t\t\t\t\tcamera.position, direction.multiplyScalar(distance));\n\n\t\t\t\t}\n\t\t\t\tlabel.position.copy(labelPos);\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\t\t\t\tlet scale = (70 / pr);\n\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\t// height label\n\t\t\tif (measure.showHeight) {\n\t\t\t\tlet label = measure.heightLabel;\n\n\t\t\t\t{\n\t\t\t\t\tlet distance = label.position.distanceTo(camera.position);\n\t\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\t\t\t\t\tlet scale = (70 / pr);\n\t\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t\t}\n\n\t\t\t\t{ // height edge\n\t\t\t\t\tlet edge = measure.heightEdge;\n\n\t\t\t\t\tlet sorted = measure.points.slice().sort((a, b) => a.position.z - b.position.z);\n\t\t\t\t\tlet lowPoint = sorted[0].position.clone();\n\t\t\t\t\tlet highPoint = sorted[sorted.length - 1].position.clone();\n\t\t\t\t\tlet min = lowPoint.z;\n\t\t\t\t\tlet max = highPoint.z;\n\n\t\t\t\t\tlet start = new THREE.Vector3(highPoint.x, highPoint.y, min);\n\t\t\t\t\tlet end = new THREE.Vector3(highPoint.x, highPoint.y, max);\n\n\t\t\t\t\tlet lowScreen = lowPoint.clone().project(camera);\n\t\t\t\t\tlet startScreen = start.clone().project(camera);\n\t\t\t\t\tlet endScreen = end.clone().project(camera);\n\n\t\t\t\t\tlet toPixelCoordinates = v => {\n\t\t\t\t\t\tlet r = v.clone().addScalar(1).divideScalar(2);\n\t\t\t\t\t\tr.x = r.x * clientWidth;\n\t\t\t\t\t\tr.y = r.y * clientHeight;\n\t\t\t\t\t\tr.z = 0;\n\n\t\t\t\t\t\treturn r;\n\t\t\t\t\t};\n\n\t\t\t\t\tlet lowEL = toPixelCoordinates(lowScreen);\n\t\t\t\t\tlet startEL = toPixelCoordinates(startScreen);\n\t\t\t\t\tlet endEL = toPixelCoordinates(endScreen);\n\n\t\t\t\t\tlet lToS = lowEL.distanceTo(startEL);\n\t\t\t\t\tlet sToE = startEL.distanceTo(endEL);\n\n\t\t\t\t\tedge.geometry.lineDistances = [0, lToS, lToS, lToS + sToE];\n\t\t\t\t\tedge.geometry.lineDistancesNeedUpdate = true;\n\n\t\t\t\t\tedge.material.dashSize = 10;\n\t\t\t\t\tedge.material.gapSize = 10;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t{ // area label\n\t\t\t\tlet label = measure.areaLabel;\n\t\t\t\tlet distance = label.position.distanceTo(camera.position);\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\n\t\t\t\tlet scale = (70 / pr);\n\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\t{ // radius label\n\t\t\t\tlet label = measure.circleRadiusLabel;\n\t\t\t\tlet distance = label.position.distanceTo(camera.position);\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\n\t\t\t\tlet scale = (70 / pr);\n\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\t{ // edges\n\t\t\t\tconst materials = [\n\t\t\t\t\tmeasure.circleRadiusLine.material,\n\t\t\t\t\t...measure.edges.map( (e) => e.material),\n\t\t\t\t\tmeasure.heightEdge.material,\n\t\t\t\t\tmeasure.circleLine.material,\n\t\t\t\t];\n\n\t\t\t\tfor(const material of materials){\n\t\t\t\t\tmaterial.resolution.set(clientWidth, clientHeight);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!this.showLabels){\n\n\t\t\t\tconst labels = [\n\t\t\t\t\t...measure.sphereLabels, \n\t\t\t\t\t...measure.edgeLabels, \n\t\t\t\t\t...measure.angleLabels, \n\t\t\t\t\t...measure.coordinateLabels,\n\t\t\t\t\tmeasure.heightLabel,\n\t\t\t\t\tmeasure.areaLabel,\n\t\t\t\t\tmeasure.circleRadiusLabel,\n\t\t\t\t];\n\n\t\t\t\tfor(const label of labels){\n\t\t\t\t\tlabel.visible = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\trender(){\n\t\tthis.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera());\n\t}\n};\n","\nexport class Message{\n\n\tconstructor(content){\n\t\tthis.content = content;\n\n\t\tlet closeIcon = `${exports.resourcePath}/icons/close.svg`;\n\n\t\tthis.element = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t
    `);\n\n\t\tthis.elClose = this.element.find(\"img[name=close]\");\n\n\t\tthis.elContainer = this.element.find(\"span[name=content_container]\");\n\n\t\tif(typeof content === \"string\"){\n\t\t\tthis.elContainer.append($(`${content}`));\n\t\t}else{\n\t\t\tthis.elContainer.append(content);\n\t\t}\n\n\t}\n\n\tsetMessage(content){\n\t\tthis.elContainer.empty();\n\t\tif(typeof content === \"string\"){\n\t\t\tthis.elContainer.append($(`${content}`));\n\t\t}else{\n\t\t\tthis.elContainer.append(content);\n\t\t}\n\t}\n\n}","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nexport class PointCloudSM{\n\n\tconstructor(potreeRenderer){\n\n\t\tthis.potreeRenderer = potreeRenderer;\n\t\tthis.threeRenderer = this.potreeRenderer.threeRenderer;\n\n\t\tthis.target = new THREE.WebGLRenderTarget(2 * 1024, 2 * 1024, {\n\t\t\tminFilter: THREE.LinearFilter,\n\t\t\tmagFilter: THREE.LinearFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\ttype: THREE.FloatType\n\t\t});\n\t\tthis.target.depthTexture = new THREE.DepthTexture();\n\t\tthis.target.depthTexture.type = THREE.UnsignedIntType;\n\n\t\t//this.threeRenderer.setClearColor(0x000000, 1);\n\t\tthis.threeRenderer.setClearColor(0xff0000, 1);\n\n\t\t//HACK? removed while moving to three.js 109\n\t\t//this.threeRenderer.clearTarget(this.target, true, true, true); \n\t\t{\n\t\t\tconst oldTarget = this.threeRenderer.getRenderTarget();\n\n\t\t\tthis.threeRenderer.setRenderTarget(this.target);\n\t\t\tthis.threeRenderer.clear(true, true, true);\n\n\t\t\tthis.threeRenderer.setRenderTarget(oldTarget);\n\t\t}\n\t}\n\n\tsetLight(light){\n\t\tthis.light = light;\n\n\t\tlet fov = (180 * light.angle) / Math.PI;\n\t\tlet aspect = light.shadow.mapSize.width / light.shadow.mapSize.height;\n\t\tlet near = 0.1;\n\t\tlet far = light.distance === 0 ? 10000 : light.distance;\n\t\tthis.camera = new THREE.PerspectiveCamera(fov, aspect, near, far);\n\t\tthis.camera.up.set(0, 0, 1);\n\t\tthis.camera.position.copy(light.position);\n\n\t\tlet target = new THREE.Vector3().subVectors(light.position, light.getWorldDirection(new THREE.Vector3()));\n\t\tthis.camera.lookAt(target);\n\n\t\tthis.camera.updateProjectionMatrix();\n\t\tthis.camera.updateMatrix();\n\t\tthis.camera.updateMatrixWorld();\n\t\tthis.camera.matrixWorldInverse.copy(this.camera.matrixWorld).invert();\n\t}\n\n\tsetSize(width, height){\n\t\tif(this.target.width !== width || this.target.height !== height){\n\t\t\tthis.target.dispose();\n\t\t}\n\t\tthis.target.setSize(width, height);\n\t}\n\n\trender(scene, camera){\n\n\t\tthis.threeRenderer.setClearColor(0x000000, 1);\n\t\t\n\t\tconst oldTarget = this.threeRenderer.getRenderTarget();\n\n\t\tthis.threeRenderer.setRenderTarget(this.target);\n\t\tthis.threeRenderer.clear(true, true, true);\n\n\t\tthis.potreeRenderer.render(scene, this.camera, this.target, {});\n\n\t\tthis.threeRenderer.setRenderTarget(oldTarget);\n\t}\n\n\n}","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Profile} from \"./Profile.js\";\nimport {Utils} from \"../utils.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\n\n\nexport class ProfileTool extends EventDispatcher {\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.addEventListener('start_inserting_profile', e => {\n\t\t\tthis.viewer.dispatchEvent({\n\t\t\t\ttype: 'cancel_insertions'\n\t\t\t});\n\t\t});\n\n\t\tthis.scene = new THREE.Scene();\n\t\tthis.scene.name = 'scene_profile';\n\t\tthis.light = new THREE.PointLight(0xffffff, 1.0);\n\t\tthis.scene.add(this.light);\n\n\t\tthis.viewer.inputHandler.registerInteractiveScene(this.scene);\n\n\t\tthis.onRemove = e => this.scene.remove(e.profile);\n\t\tthis.onAdd = e => this.scene.add(e.profile);\n\n\t\tfor(let profile of viewer.scene.profiles){\n\t\t\tthis.onAdd({profile: profile});\n\t\t}\n\n\t\tviewer.addEventListener(\"update\", this.update.bind(this));\n\t\tviewer.addEventListener(\"render.pass.perspective_overlay\", this.render.bind(this));\n\t\tviewer.addEventListener(\"scene_changed\", this.onSceneChange.bind(this));\n\n\t\tviewer.scene.addEventListener('profile_added', this.onAdd);\n\t\tviewer.scene.addEventListener('profile_removed', this.onRemove);\n\t}\n\n\tonSceneChange(e){\n\t\tif(e.oldScene){\n\t\t\te.oldScene.removeEventListeners('profile_added', this.onAdd);\n\t\t\te.oldScene.removeEventListeners('profile_removed', this.onRemove);\n\t\t}\n\n\t\te.scene.addEventListener('profile_added', this.onAdd);\n\t\te.scene.addEventListener('profile_removed', this.onRemove);\n\t}\n\n\tstartInsertion (args = {}) {\n\t\tlet domElement = this.viewer.renderer.domElement;\n\n\t\tlet profile = new Profile();\n\t\tprofile.name = args.name || 'Profile';\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'start_inserting_profile',\n\t\t\tprofile: profile\n\t\t});\n\n\t\tthis.scene.add(profile);\n\n\t\tlet cancel = {\n\t\t\tcallback: null\n\t\t};\n\n\t\tlet insertionCallback = (e) => {\n\t\t\tif(e.button === THREE.MOUSE.LEFT){\n\t\t\t\tif(profile.points.length <= 1){\n\t\t\t\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\t\t\t\tlet distance = camera.position.distanceTo(profile.points[0]);\n\t\t\t\t\tlet clientSize = this.viewer.renderer.getSize(new THREE.Vector2());\n\t\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientSize.width, clientSize.height);\n\t\t\t\t\tlet width = (10 / pr);\n\n\t\t\t\t\tprofile.setWidth(width);\n\t\t\t\t}\n\n\t\t\t\tprofile.addMarker(profile.points[profile.points.length - 1].clone());\n\n\t\t\t\tthis.viewer.inputHandler.startDragging(\n\t\t\t\t\tprofile.spheres[profile.spheres.length - 1]);\n\t\t\t} else if (e.button === THREE.MOUSE.RIGHT) {\n\t\t\t\tcancel.callback();\n\t\t\t}\n\t\t};\n\n\t\tcancel.callback = e => {\n\t\t\tprofile.removeMarker(profile.points.length - 1);\n\t\t\tdomElement.removeEventListener('mouseup', insertionCallback, true);\n\t\t\tthis.viewer.removeEventListener('cancel_insertions', cancel.callback);\n\t\t};\n\n\t\tthis.viewer.addEventListener('cancel_insertions', cancel.callback);\n\t\tdomElement.addEventListener('mouseup', insertionCallback, true);\n\n\t\tprofile.addMarker(new THREE.Vector3(0, 0, 0));\n\t\tthis.viewer.inputHandler.startDragging(\n\t\t\tprofile.spheres[profile.spheres.length - 1]);\n\n\t\tthis.viewer.scene.addProfile(profile);\n\n\t\treturn profile;\n\t}\n\t\n\tupdate(){\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\tlet profiles = this.viewer.scene.profiles;\n\t\tlet renderAreaSize = this.viewer.renderer.getSize(new THREE.Vector2());\n\t\tlet clientWidth = renderAreaSize.width;\n\t\tlet clientHeight = renderAreaSize.height;\n\n\t\tthis.light.position.copy(camera.position);\n\n\t\t// make size independant of distance\n\t\tfor(let profile of profiles){\n\t\t\tfor(let sphere of profile.spheres){\t\t\t\t\n\t\t\t\tlet distance = camera.position.distanceTo(sphere.getWorldPosition(new THREE.Vector3()));\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\t\t\t\tlet scale = (15 / pr);\n\t\t\t\tsphere.scale.set(scale, scale, scale);\n\t\t\t}\n\t\t}\n\t}\n\n\trender(){\n\t\tthis.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera());\n\t}\n\n}\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {BoxVolume} from \"./Volume.js\";\nimport {Utils} from \"../utils.js\";\nimport {PointSizeType} from \"../defines.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\n\n\nexport class ScreenBoxSelectTool extends EventDispatcher{\n\n\tconstructor(viewer){\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.scene = new THREE.Scene();\n\n\t\tviewer.addEventListener(\"update\", this.update.bind(this));\n\t\tviewer.addEventListener(\"render.pass.perspective_overlay\", this.render.bind(this));\n\t\tviewer.addEventListener(\"scene_changed\", this.onSceneChange.bind(this));\n\t}\n\n\tonSceneChange(scene){\n\t\tconsole.log(\"scene changed\");\n\t}\n\n\tstartInsertion(){\n\t\tlet domElement = this.viewer.renderer.domElement;\n\n\t\tlet volume = new BoxVolume();\n\t\tvolume.position.set(12345, 12345, 12345);\n\t\tvolume.showVolumeLabel = false;\n\t\tvolume.visible = false;\n\t\tvolume.update();\n\t\tthis.viewer.scene.addVolume(volume);\n\n\t\tthis.importance = 10;\n\n\t\tlet selectionBox = $(`
    `);\n\t\t$(domElement.parentElement).append(selectionBox);\n\t\tselectionBox.css(\"right\", \"10px\");\n\t\tselectionBox.css(\"bottom\", \"10px\");\n\n\t\tlet drag = e =>{\n\n\t\t\tvolume.visible = true;\n\n\t\t\tlet mStart = e.drag.start;\n\t\t\tlet mEnd = e.drag.end;\n\n\t\t\tlet box2D = new THREE.Box2();\n\t\t\tbox2D.expandByPoint(mStart);\n\t\t\tbox2D.expandByPoint(mEnd);\n\n\t\t\tselectionBox.css(\"left\", `${box2D.min.x}px`);\n\t\t\tselectionBox.css(\"top\", `${box2D.min.y}px`);\n\t\t\tselectionBox.css(\"width\", `${box2D.max.x - box2D.min.x}px`);\n\t\t\tselectionBox.css(\"height\", `${box2D.max.y - box2D.min.y}px`);\n\n\t\t\tlet camera = e.viewer.scene.getActiveCamera();\n\t\t\tlet size = e.viewer.renderer.getSize(new THREE.Vector2());\n\t\t\tlet frustumSize = new THREE.Vector2(\n\t\t\t\tcamera.right - camera.left, \n\t\t\t\tcamera.top - camera.bottom);\n\n\t\t\tlet screenCentroid = new THREE.Vector2().addVectors(e.drag.end, e.drag.start).multiplyScalar(0.5);\n\t\t\tlet ray = Utils.mouseToRay(screenCentroid, camera, size.width, size.height);\n\n\t\t\tlet diff = new THREE.Vector2().subVectors(e.drag.end, e.drag.start);\n\t\t\tdiff.divide(size).multiply(frustumSize);\n\t\t\t\n\t\t\tvolume.position.copy(ray.origin);\n\t\t\tvolume.up.copy(camera.up);\n\t\t\tvolume.rotation.copy(camera.rotation);\n\t\t\tvolume.scale.set(diff.x, diff.y, 1000 * 100);\n\n\t\t\te.consume();\n\t\t};\n\n\t\tlet drop = e => {\n\t\t\tthis.importance = 0;\n\n\t\t\t$(selectionBox).remove();\n\n\t\t\tthis.viewer.inputHandler.deselectAll();\n\t\t\tthis.viewer.inputHandler.toggleSelection(volume);\n\n\t\t\tlet camera = e.viewer.scene.getActiveCamera();\n\t\t\tlet size = e.viewer.renderer.getSize(new THREE.Vector2());\n\t\t\tlet screenCentroid = new THREE.Vector2().addVectors(e.drag.end, e.drag.start).multiplyScalar(0.5);\n\t\t\tlet ray = Utils.mouseToRay(screenCentroid, camera, size.width, size.height);\n\n\t\t\tlet line = new THREE.Line3(ray.origin, new THREE.Vector3().addVectors(ray.origin, ray.direction));\n\n\t\t\tthis.removeEventListener(\"drag\", drag);\n\t\t\tthis.removeEventListener(\"drop\", drop);\n\n\t\t\tlet allPointsNear = [];\n\t\t\tlet allPointsFar = [];\n\n\t\t\t// TODO support more than one point cloud\n\t\t\tfor(let pointcloud of this.viewer.scene.pointclouds){\n\n\t\t\t\tif(!pointcloud.visible){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet volCam = camera.clone();\n\t\t\t\tvolCam.left = -volume.scale.x / 2; \n\t\t\t\tvolCam.right = +volume.scale.x / 2;\n\t\t\t\tvolCam.top = +volume.scale.y / 2;\n\t\t\t\tvolCam.bottom = -volume.scale.y / 2;\n\t\t\t\tvolCam.near = -volume.scale.z / 2;\n\t\t\t\tvolCam.far = +volume.scale.z / 2;\n\t\t\t\tvolCam.rotation.copy(volume.rotation);\n\t\t\t\tvolCam.position.copy(volume.position);\n\n\t\t\t\tvolCam.updateMatrix();\n\t\t\t\tvolCam.updateMatrixWorld();\n\t\t\t\tvolCam.updateProjectionMatrix();\n\t\t\t\tvolCam.matrixWorldInverse.copy(volCam.matrixWorld).invert();\n\n\t\t\t\tlet ray = new THREE.Ray(volCam.getWorldPosition(new THREE.Vector3()), volCam.getWorldDirection(new THREE.Vector3()));\n\t\t\t\tlet rayInverse = new THREE.Ray(\n\t\t\t\t\tray.origin.clone().add(ray.direction.clone().multiplyScalar(volume.scale.z)),\n\t\t\t\t\tray.direction.clone().multiplyScalar(-1));\n\n\t\t\t\tlet pickerSettings = {\n\t\t\t\t\twidth: 8, \n\t\t\t\t\theight: 8, \n\t\t\t\t\tpickWindowSize: 8, \n\t\t\t\t\tall: true,\n\t\t\t\t\tpickClipped: true,\n\t\t\t\t\tpointSizeType: PointSizeType.FIXED,\n\t\t\t\t\tpointSize: 1};\n\t\t\t\tlet pointsNear = pointcloud.pick(viewer, volCam, ray, pickerSettings);\n\n\t\t\t\tvolCam.rotateX(Math.PI);\n\t\t\t\tvolCam.updateMatrix();\n\t\t\t\tvolCam.updateMatrixWorld();\n\t\t\t\tvolCam.updateProjectionMatrix();\n\t\t\t\tvolCam.matrixWorldInverse.copy(volCam.matrixWorld).invert();\n\t\t\t\tlet pointsFar = pointcloud.pick(viewer, volCam, rayInverse, pickerSettings);\n\n\t\t\t\tallPointsNear.push(...pointsNear);\n\t\t\t\tallPointsFar.push(...pointsFar);\n\t\t\t}\n\n\t\t\tif(allPointsNear.length > 0 && allPointsFar.length > 0){\n\t\t\t\tlet viewLine = new THREE.Line3(ray.origin, new THREE.Vector3().addVectors(ray.origin, ray.direction));\n\n\t\t\t\tlet closestOnLine = allPointsNear.map(p => viewLine.closestPointToPoint(p.position, false, new THREE.Vector3()));\n\t\t\t\tlet closest = closestOnLine.sort( (a, b) => ray.origin.distanceTo(a) - ray.origin.distanceTo(b))[0];\n\n\t\t\t\tlet farthestOnLine = allPointsFar.map(p => viewLine.closestPointToPoint(p.position, false, new THREE.Vector3()));\n\t\t\t\tlet farthest = farthestOnLine.sort( (a, b) => ray.origin.distanceTo(b) - ray.origin.distanceTo(a))[0];\n\n\t\t\t\tlet distance = closest.distanceTo(farthest);\n\t\t\t\tlet centroid = new THREE.Vector3().addVectors(closest, farthest).multiplyScalar(0.5);\n\t\t\t\tvolume.scale.z = distance * 1.1;\n\t\t\t\tvolume.position.copy(centroid);\n\t\t\t}\n\n\t\t\tvolume.clip = true;\n\t\t};\n\n\t\tthis.addEventListener(\"drag\", drag);\n\t\tthis.addEventListener(\"drop\", drop);\n\n\t\tviewer.inputHandler.addInputListener(this);\n\n\t\treturn volume;\n\t}\n\n\tupdate(e){\n\t\t//console.log(e.delta)\n\t}\n\n\trender(){\n\t\tthis.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera());\n\t}\n\n}","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nexport class SpotLightHelper extends THREE.Object3D{\n\n\tconstructor(light, color){\n\t\tsuper();\n\n\t\tthis.light = light;\n\t\tthis.color = color;\n\n\t\t//this.up.set(0, 0, 1);\n\t\tthis.updateMatrix();\n\t\tthis.updateMatrixWorld();\n\n\t\t{ // SPHERE\n\t\t\tlet sg = new THREE.SphereGeometry(1, 32, 32);\n\t\t\tlet sm = new THREE.MeshNormalMaterial();\n\t\t\tthis.sphere = new THREE.Mesh(sg, sm);\n\t\t\tthis.sphere.scale.set(0.5, 0.5, 0.5);\n\t\t\tthis.add(this.sphere);\n\t\t}\n\n\t\t{ // LINES\n\t\t\t\n\n\t\t\tlet positions = new Float32Array([\n\t\t\t\t+0, +0, +0, +0, +0, -1,\n\n\t\t\t\t+0, +0, +0, -1, -1, -1,\n\t\t\t\t+0, +0, +0, +1, -1, -1,\n\t\t\t\t+0, +0, +0, +1, +1, -1,\n\t\t\t\t+0, +0, +0, -1, +1, -1,\n\n\t\t\t\t-1, -1, -1, +1, -1, -1,\n\t\t\t\t+1, -1, -1, +1, +1, -1,\n\t\t\t\t+1, +1, -1, -1, +1, -1,\n\t\t\t\t-1, +1, -1, -1, -1, -1,\n\t\t\t]);\n\n\t\t\tlet geometry = new THREE.BufferGeometry();\n\t\t\tgeometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n\n\t\t\tlet material = new THREE.LineBasicMaterial();\n\n\t\t\tthis.frustum = new THREE.LineSegments(geometry, material);\n\t\t\tthis.add(this.frustum);\n\n\t\t}\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\n\t\tthis.light.updateMatrix();\n\t\tthis.light.updateMatrixWorld();\n\n\t\tlet position = this.light.position;\n\t\tlet target = new THREE.Vector3().addVectors(\n\t\t\tthis.light.position, this.light.getWorldDirection(new THREE.Vector3()).multiplyScalar(-1));\n\t\t\n\t\tlet quat = new THREE.Quaternion().setFromRotationMatrix(\n\t\t\tnew THREE.Matrix4().lookAt( position, target, new THREE.Vector3( 0, 0, 1 ) )\n\t\t);\n\n\t\tthis.setRotationFromQuaternion(quat);\n\t\tthis.position.copy(position);\n\n\n\t\tlet coneLength = (this.light.distance > 0) ? this.light.distance : 1000;\n\t\tlet coneWidth = coneLength * Math.tan( this.light.angle * 0.5 );\n\n\t\tthis.frustum.scale.set(coneWidth, coneWidth, coneLength);\n\n\t}\n\n}","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Utils} from \"../utils.js\";\n\nexport class TransformationTool {\n\tconstructor(viewer) {\n\t\tthis.viewer = viewer;\n\n\t\tthis.scene = new THREE.Scene();\n\n\t\tthis.selection = [];\n\t\tthis.pivot = new THREE.Vector3();\n\t\tthis.dragging = false;\n\t\tthis.showPickVolumes = false;\n\n\t\tthis.viewer.inputHandler.registerInteractiveScene(this.scene);\n\t\tthis.viewer.inputHandler.addEventListener('selection_changed', (e) => {\n\t\t\tfor(let selected of this.selection){\n\t\t\t\tthis.viewer.inputHandler.blacklist.delete(selected);\n\t\t\t}\n\n\t\t\tthis.selection = e.selection;\n\n\t\t\tfor(let selected of this.selection){\n\t\t\t\tthis.viewer.inputHandler.blacklist.add(selected);\n\t\t\t}\n\n\t\t});\n\n\t\tlet red = 0xE73100;\n\t\tlet green = 0x44A24A;\n\t\tlet blue = 0x2669E7;\n\t\t\n\t\tthis.activeHandle = null;\n\t\tthis.scaleHandles = {\n\t\t\t\"scale.x+\": {name: \"scale.x+\", node: new THREE.Object3D(), color: red, alignment: [+1, +0, +0]},\n\t\t\t\"scale.x-\": {name: \"scale.x-\", node: new THREE.Object3D(), color: red, alignment: [-1, +0, +0]},\n\t\t\t\"scale.y+\": {name: \"scale.y+\", node: new THREE.Object3D(), color: green, alignment: [+0, +1, +0]},\n\t\t\t\"scale.y-\": {name: \"scale.y-\", node: new THREE.Object3D(), color: green, alignment: [+0, -1, +0]},\n\t\t\t\"scale.z+\": {name: \"scale.z+\", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, +1]},\n\t\t\t\"scale.z-\": {name: \"scale.z-\", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, -1]},\n\t\t};\n\t\tthis.focusHandles = {\n\t\t\t\"focus.x+\": {name: \"focus.x+\", node: new THREE.Object3D(), color: red, alignment: [+1, +0, +0]},\n\t\t\t\"focus.x-\": {name: \"focus.x-\", node: new THREE.Object3D(), color: red, alignment: [-1, +0, +0]},\n\t\t\t\"focus.y+\": {name: \"focus.y+\", node: new THREE.Object3D(), color: green, alignment: [+0, +1, +0]},\n\t\t\t\"focus.y-\": {name: \"focus.y-\", node: new THREE.Object3D(), color: green, alignment: [+0, -1, +0]},\n\t\t\t\"focus.z+\": {name: \"focus.z+\", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, +1]},\n\t\t\t\"focus.z-\": {name: \"focus.z-\", node: new THREE.Object3D(), color: blue, alignment: [+0, +0, -1]},\n\t\t};\n\t\tthis.translationHandles = {\n\t\t\t\"translation.x\": {name: \"translation.x\", node: new THREE.Object3D(), color: red, alignment: [1, 0, 0]},\n\t\t\t\"translation.y\": {name: \"translation.y\", node: new THREE.Object3D(), color: green, alignment: [0, 1, 0]},\n\t\t\t\"translation.z\": {name: \"translation.z\", node: new THREE.Object3D(), color: blue, alignment: [0, 0, 1]},\n\t\t};\n\t\tthis.rotationHandles = {\n\t\t\t\"rotation.x\": {name: \"rotation.x\", node: new THREE.Object3D(), color: red, alignment: [1, 0, 0]},\n\t\t\t\"rotation.y\": {name: \"rotation.y\", node: new THREE.Object3D(), color: green, alignment: [0, 1, 0]},\n\t\t\t\"rotation.z\": {name: \"rotation.z\", node: new THREE.Object3D(), color: blue, alignment: [0, 0, 1]},\n\t\t};\n\t\tthis.handles = Object.assign({}, this.scaleHandles, this.focusHandles, this.translationHandles, this.rotationHandles);\n\t\tthis.pickVolumes = [];\n\n\t\tthis.initializeScaleHandles();\n\t\tthis.initializeFocusHandles();\n\t\tthis.initializeTranslationHandles();\n\t\tthis.initializeRotationHandles();\n\n\n\t\tlet boxFrameGeometry = new THREE.Geometry();\n\t\t{\n\t\t\t// bottom\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\t// top\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\t// sides\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));\n\t\t\tboxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));\n\t\t}\n\t\tthis.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: 0xffff00}));\n\t\tthis.scene.add(this.frame);\n\n\t\t\n\t}\n\n\tinitializeScaleHandles(){\n\t\tlet sgSphere = new THREE.SphereGeometry(1, 32, 32);\n\t\tlet sgLowPolySphere = new THREE.SphereGeometry(1, 16, 16);\n\n\t\tfor(let handleName of Object.keys(this.scaleHandles)){\n\t\t\tlet handle = this.scaleHandles[handleName];\n\t\t\tlet node = handle.node;\n\t\t\tthis.scene.add(node);\n\t\t\tnode.position.set(...handle.alignment).multiplyScalar(0.5);\n\n\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: handle.color,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true\n\t\t\t\t});\n\n\t\t\tlet outlineMaterial = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: 0x000000, \n\t\t\t\tside: THREE.BackSide,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true});\n\n\t\t\tlet pickMaterial = new THREE.MeshNormalMaterial({\n\t\t\t\topacity: 0.2,\n\t\t\t\ttransparent: true,\n\t\t\t\tvisible: this.showPickVolumes});\n\n\t\t\tlet sphere = new THREE.Mesh(sgSphere, material);\n\t\t\tsphere.scale.set(1.3, 1.3, 1.3);\n\t\t\tsphere.name = `${handleName}.handle`;\n\t\t\tnode.add(sphere);\n\t\t\t\n\t\t\tlet outline = new THREE.Mesh(sgSphere, outlineMaterial);\n\t\t\toutline.scale.set(1.4, 1.4, 1.4);\n\t\t\toutline.name = `${handleName}.outline`;\n\t\t\tsphere.add(outline);\n\n\t\t\tlet pickSphere = new THREE.Mesh(sgLowPolySphere, pickMaterial);\n\t\t\tpickSphere.name = `${handleName}.pick_volume`;\n\t\t\tpickSphere.scale.set(3, 3, 3);\n\t\t\tsphere.add(pickSphere);\n\t\t\tpickSphere.handle = handleName;\n\t\t\tthis.pickVolumes.push(pickSphere);\n\n\t\t\tnode.setOpacity = (target) => {\n\t\t\t\tlet opacity = {x: material.opacity};\n\t\t\t\tlet t = new TWEEN.Tween(opacity).to({x: target}, 100);\n\t\t\t\tt.onUpdate(() => {\n\t\t\t\t\tsphere.visible = opacity.x > 0;\n\t\t\t\t\tpickSphere.visible = opacity.x > 0;\n\t\t\t\t\tmaterial.opacity = opacity.x;\n\t\t\t\t\toutlineMaterial.opacity = opacity.x;\n\t\t\t\t\tpickSphere.material.opacity = opacity.x * 0.5;\n\t\t\t\t});\n\t\t\t\tt.start();\n\t\t\t};\n\n\t\t\tpickSphere.addEventListener(\"drag\", (e) => this.dragScaleHandle(e));\n\t\t\tpickSphere.addEventListener(\"drop\", (e) => this.dropScaleHandle(e));\n\n\t\t\tpickSphere.addEventListener(\"mouseover\", e => {\n\t\t\t\t//node.setOpacity(1);\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"click\", e => {\n\t\t\t\te.consume();\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"mouseleave\", e => {\n\t\t\t\t//node.setOpacity(0.4);\n\t\t\t});\n\t\t}\n\t}\n\n\tinitializeFocusHandles(){\n\t\t//let sgBox = new THREE.BoxGeometry(1, 1, 1);\n\t\tlet sgPlane = new THREE.PlaneGeometry(4, 4, 1, 1);\n\t\tlet sgLowPolySphere = new THREE.SphereGeometry(1, 16, 16);\n\n\t\tlet texture = new THREE.TextureLoader().load(`${exports.resourcePath}/icons/eye_2.png`);\n\n\t\tfor(let handleName of Object.keys(this.focusHandles)){\n\t\t\tlet handle = this.focusHandles[handleName];\n\t\t\tlet node = handle.node;\n\t\t\tthis.scene.add(node);\n\t\t\tlet align = handle.alignment;\n\n\t\t\t//node.lookAt(new THREE.Vector3().addVectors(node.position, new THREE.Vector3(...align)));\n\t\t\tnode.lookAt(new THREE.Vector3(...align));\n\n\t\t\tlet off = 0.8;\n\t\t\tif(align[0] === 1){\n\t\t\t\tnode.position.set(1, off, -off).multiplyScalar(0.5);\n\t\t\t\tnode.rotation.z = Math.PI / 2;\n\t\t\t}else if(align[0] === -1){\n\t\t\t\tnode.position.set(-1, -off, -off).multiplyScalar(0.5);\n\t\t\t\tnode.rotation.z = Math.PI / 2;\n\t\t\t}else if(align[1] === 1){\n\t\t\t\tnode.position.set(-off, 1, -off).multiplyScalar(0.5);\n\t\t\t\tnode.rotation.set(Math.PI / 2, Math.PI, 0.0);\n\t\t\t}else if(align[1] === -1){\n\t\t\t\tnode.position.set(off, -1, -off).multiplyScalar(0.5);\n\t\t\t\tnode.rotation.set(Math.PI / 2, 0.0, 0.0);\n\t\t\t}else if(align[2] === 1){\n\t\t\t\tnode.position.set(off, off, 1).multiplyScalar(0.5);\n\t\t\t}else if(align[2] === -1){\n\t\t\t\tnode.position.set(-off, off, -1).multiplyScalar(0.5);\n\t\t\t}\n\n\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: handle.color,\n\t\t\t\topacity: 0,\n\t\t\t\ttransparent: true,\n\t\t\t\tmap: texture\n\t\t\t});\n\n\t\t\t//let outlineMaterial = new THREE.MeshBasicMaterial({\n\t\t\t//\tcolor: 0x000000, \n\t\t\t//\tside: THREE.BackSide,\n\t\t\t//\topacity: 0,\n\t\t\t//\ttransparent: true});\n\n\t\t\tlet pickMaterial = new THREE.MeshNormalMaterial({\n\t\t\t\t//opacity: 0,\n\t\t\t\ttransparent: true,\n\t\t\t\tvisible: this.showPickVolumes});\n\n\t\t\tlet box = new THREE.Mesh(sgPlane, material);\n\t\t\tbox.name = `${handleName}.handle`;\n\t\t\tbox.scale.set(1.5, 1.5, 1.5);\n\t\t\tbox.position.set(0, 0, 0);\n\t\t\tbox.visible = false;\n\t\t\tnode.add(box);\n\t\t\t//handle.focusNode = box;\n\t\t\t\n\t\t\t//let outline = new THREE.Mesh(sgPlane, outlineMaterial);\n\t\t\t//outline.scale.set(1.4, 1.4, 1.4);\n\t\t\t//outline.name = `${handleName}.outline`;\n\t\t\t//box.add(outline);\n\n\t\t\tlet pickSphere = new THREE.Mesh(sgLowPolySphere, pickMaterial);\n\t\t\tpickSphere.name = `${handleName}.pick_volume`;\n\t\t\tpickSphere.scale.set(3, 3, 3);\n\t\t\tbox.add(pickSphere);\n\t\t\tpickSphere.handle = handleName;\n\t\t\tthis.pickVolumes.push(pickSphere);\n\n\t\t\tnode.setOpacity = (target) => {\n\t\t\t\tlet opacity = {x: material.opacity};\n\t\t\t\tlet t = new TWEEN.Tween(opacity).to({x: target}, 100);\n\t\t\t\tt.onUpdate(() => {\n\t\t\t\t\tpickSphere.visible = opacity.x > 0;\n\t\t\t\t\tbox.visible = opacity.x > 0;\n\t\t\t\t\tmaterial.opacity = opacity.x;\n\t\t\t\t\t//outlineMaterial.opacity = opacity.x;\n\t\t\t\t\tpickSphere.material.opacity = opacity.x * 0.5;\n\t\t\t\t});\n\t\t\t\tt.start();\n\t\t\t};\n\n\t\t\tpickSphere.addEventListener(\"drag\", e => {});\n\n\t\t\tpickSphere.addEventListener(\"mouseup\", e => {\n\t\t\t\te.consume();\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"mousedown\", e => {\n\t\t\t\te.consume();\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"click\", e => {\n\t\t\t\te.consume();\n\n\t\t\t\tlet selected = this.selection[0];\n\t\t\t\tlet maxScale = Math.max(...selected.scale.toArray());\n\t\t\t\tlet minScale = Math.min(...selected.scale.toArray());\n\t\t\t\tlet handleLength = Math.abs(selected.scale.dot(new THREE.Vector3(...handle.alignment)));\n\t\t\t\tlet alignment = new THREE.Vector3(...handle.alignment).multiplyScalar(2 * maxScale / handleLength);\n\t\t\t\talignment.applyMatrix4(selected.matrixWorld);\n\t\t\t\tlet newCamPos = alignment;\n\t\t\t\tlet newCamTarget = selected.getWorldPosition(new THREE.Vector3());\n\n\t\t\t\tUtils.moveTo(this.viewer.scene, newCamPos, newCamTarget);\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"mouseover\", e => {\n\t\t\t\t//box.setOpacity(1);\n\t\t\t});\n\n\t\t\tpickSphere.addEventListener(\"mouseleave\", e => {\n\t\t\t\t//box.setOpacity(0.4);\n\t\t\t});\n\t\t}\n\t}\n\n\tinitializeTranslationHandles(){\n\t\tlet boxGeometry = new THREE.BoxGeometry(1, 1, 1);\n\n\t\tfor(let handleName of Object.keys(this.translationHandles)){\n\t\t\tlet handle = this.handles[handleName];\n\t\t\tlet node = handle.node;\n\t\t\tthis.scene.add(node);\n\n\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: handle.color,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true});\n\n\t\t\tlet outlineMaterial = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: 0x000000, \n\t\t\t\tside: THREE.BackSide,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true});\n\n\t\t\tlet pickMaterial = new THREE.MeshNormalMaterial({\n\t\t\t\topacity: 0.2,\n\t\t\t\ttransparent: true,\n\t\t\t\tvisible: this.showPickVolumes\n\t\t\t});\n\n\t\t\tlet box = new THREE.Mesh(boxGeometry, material);\n\t\t\tbox.name = `${handleName}.handle`;\n\t\t\tbox.scale.set(0.2, 0.2, 40);\n\t\t\tbox.lookAt(new THREE.Vector3(...handle.alignment));\n\t\t\tbox.renderOrder = 10;\n\t\t\tnode.add(box);\n\t\t\thandle.translateNode = box;\n\n\t\t\tlet outline = new THREE.Mesh(boxGeometry, outlineMaterial);\n\t\t\toutline.name = `${handleName}.outline`;\n\t\t\toutline.scale.set(3, 3, 1.03);\n\t\t\toutline.renderOrder = 0;\n\t\t\tbox.add(outline);\n\n\t\t\tlet pickVolume = new THREE.Mesh(boxGeometry, pickMaterial);\n\t\t\tpickVolume.name = `${handleName}.pick_volume`;\n\t\t\tpickVolume.scale.set(12, 12, 1.1);\n\t\t\tpickVolume.handle = handleName;\n\t\t\tbox.add(pickVolume);\n\t\t\tthis.pickVolumes.push(pickVolume);\n\n\t\t\tnode.setOpacity = (target) => {\n\t\t\t\tlet opacity = {x: material.opacity};\n\t\t\t\tlet t = new TWEEN.Tween(opacity).to({x: target}, 100);\n\t\t\t\tt.onUpdate(() => {\n\t\t\t\t\tbox.visible = opacity.x > 0;\n\t\t\t\t\tpickVolume.visible = opacity.x > 0;\n\t\t\t\t\tmaterial.opacity = opacity.x;\n\t\t\t\t\toutlineMaterial.opacity = opacity.x;\n\t\t\t\t\tpickMaterial.opacity = opacity.x * 0.5;\n\t\t\t\t});\n\t\t\t\tt.start();\n\t\t\t};\n\n\t\t\tpickVolume.addEventListener(\"drag\", (e) => {this.dragTranslationHandle(e)});\n\t\t\tpickVolume.addEventListener(\"drop\", (e) => {this.dropTranslationHandle(e)});\n\t\t}\n\t}\n\n\tinitializeRotationHandles(){\n\t\tlet adjust = 0.5;\n\t\tlet torusGeometry = new THREE.TorusGeometry(1, adjust * 0.015, 8, 64, Math.PI / 2);\n\t\tlet outlineGeometry = new THREE.TorusGeometry(1, adjust * 0.04, 8, 64, Math.PI / 2);\n\t\tlet pickGeometry = new THREE.TorusGeometry(1, adjust * 0.1, 6, 4, Math.PI / 2);\n\n\t\tfor(let handleName of Object.keys(this.rotationHandles)){\n\t\t\tlet handle = this.handles[handleName];\n\t\t\tlet node = handle.node;\n\t\t\tthis.scene.add(node);\n\n\t\t\tlet material = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: handle.color,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true});\n\n\t\t\tlet outlineMaterial = new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: 0x000000, \n\t\t\t\tside: THREE.BackSide,\n\t\t\t\topacity: 0.4,\n\t\t\t\ttransparent: true});\n\n\t\t\tlet pickMaterial = new THREE.MeshNormalMaterial({\n\t\t\t\topacity: 0.2,\n\t\t\t\ttransparent: true,\n\t\t\t\tvisible: this.showPickVolumes\n\t\t\t});\n\n\t\t\tlet box = new THREE.Mesh(torusGeometry, material);\n\t\t\tbox.name = `${handleName}.handle`;\n\t\t\tbox.scale.set(20, 20, 20);\n\t\t\tbox.lookAt(new THREE.Vector3(...handle.alignment));\n\t\t\tnode.add(box);\n\t\t\thandle.translateNode = box;\n\n\t\t\tlet outline = new THREE.Mesh(outlineGeometry, outlineMaterial);\n\t\t\toutline.name = `${handleName}.outline`;\n\t\t\toutline.scale.set(1, 1, 1);\n\t\t\toutline.renderOrder = 0;\n\t\t\tbox.add(outline);\n\n\t\t\tlet pickVolume = new THREE.Mesh(pickGeometry, pickMaterial);\n\t\t\tpickVolume.name = `${handleName}.pick_volume`;\n\t\t\tpickVolume.scale.set(1, 1, 1);\n\t\t\tpickVolume.handle = handleName;\n\t\t\tbox.add(pickVolume);\n\t\t\tthis.pickVolumes.push(pickVolume);\n\n\t\t\tnode.setOpacity = (target) => {\n\t\t\t\tlet opacity = {x: material.opacity};\n\t\t\t\tlet t = new TWEEN.Tween(opacity).to({x: target}, 100);\n\t\t\t\tt.onUpdate(() => {\n\t\t\t\t\tbox.visible = opacity.x > 0;\n\t\t\t\t\tpickVolume.visible = opacity.x > 0;\n\t\t\t\t\tmaterial.opacity = opacity.x;\n\t\t\t\t\toutlineMaterial.opacity = opacity.x;\n\t\t\t\t\tpickMaterial.opacity = opacity.x * 0.5;\n\t\t\t\t});\n\t\t\t\tt.start();\n\t\t\t};\n\n\n\t\t\t//pickVolume.addEventListener(\"mouseover\", (e) => {\n\t\t\t//\t//let a = this.viewer.scene.getActiveCamera().getWorldDirection(new THREE.Vector3()).dot(pickVolume.getWorldDirection(new THREE.Vector3()));\n\t\t\t//\tconsole.log(pickVolume.getWorldDirection(new THREE.Vector3()));\n\t\t\t//});\n\t\t\t\n\t\t\tpickVolume.addEventListener(\"drag\", (e) => {this.dragRotationHandle(e)});\n\t\t\tpickVolume.addEventListener(\"drop\", (e) => {this.dropRotationHandle(e)});\n\t\t}\n\t}\n\n\tdragRotationHandle(e){\n\t\tlet drag = e.drag;\n\t\tlet handle = this.activeHandle;\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\n\t\tif(!handle){\n\t\t\treturn\n\t\t};\n\n\t\tlet localNormal = new THREE.Vector3(...handle.alignment);\n\t\tlet n = new THREE.Vector3();\n\t\tn.copy(new THREE.Vector4(...localNormal.toArray(), 0).applyMatrix4(handle.node.matrixWorld));\n\t\tn.normalize();\n\n\t\tif (!drag.intersectionStart){\n\n\t\t\t//this.viewer.scene.scene.remove(this.debug);\n\t\t\t//this.debug = new THREE.Object3D();\n\t\t\t//this.viewer.scene.scene.add(this.debug);\n\t\t\t//Utils.debugSphere(this.debug, drag.location, 3, 0xaaaaaa);\n\t\t\t//let debugEnd = drag.location.clone().add(n.clone().multiplyScalar(20));\n\t\t\t//Utils.debugLine(this.debug, drag.location, debugEnd, 0xff0000);\n\n\t\t\tdrag.intersectionStart = drag.location;\n\t\t\tdrag.objectStart = drag.object.getWorldPosition(new THREE.Vector3());\n\t\t\tdrag.handle = handle;\n\n\t\t\tlet plane = new THREE.Plane().setFromNormalAndCoplanarPoint(n, drag.intersectionStart);\n\n\t\t\tdrag.dragPlane = plane;\n\t\t\tdrag.pivot = drag.intersectionStart;\n\t\t}else{\n\t\t\thandle = drag.handle;\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tlet mouse = drag.end;\n\t\tlet domElement = this.viewer.renderer.domElement;\n\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\t\t\n\t\tlet I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());\n\n\t\tif (I) {\n\t\t\tlet center = this.scene.getWorldPosition(new THREE.Vector3());\n\t\t\tlet from = drag.pivot;\n\t\t\tlet to = I;\n\n\t\t\tlet v1 = from.clone().sub(center).normalize();\n\t\t\tlet v2 = to.clone().sub(center).normalize();\n\n\t\t\tlet angle = Math.acos(v1.dot(v2));\n\t\t\tlet sign = Math.sign(v1.cross(v2).dot(n));\n\t\t\tangle = angle * sign;\n\t\t\tif (Number.isNaN(angle)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet normal = new THREE.Vector3(...handle.alignment);\n\t\t\tfor (let selection of this.selection) {\n\t\t\t\tselection.rotateOnAxis(normal, angle);\n\t\t\t\tselection.dispatchEvent({\n\t\t\t\t\ttype: \"orientation_changed\",\n\t\t\t\t\tobject: selection\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tdrag.pivot = I;\n\t\t}\n\t}\n\n\tdropRotationHandle(e){\n\t\tthis.dragging = false;\n\t\tthis.setActiveHandle(null);\n\t}\n\n\tdragTranslationHandle(e){\n\t\tlet drag = e.drag;\n\t\tlet handle = this.activeHandle;\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\t\t\n\t\tif(!drag.intersectionStart && handle){\n\t\t\tdrag.intersectionStart = drag.location;\n\t\t\tdrag.objectStart = drag.object.getWorldPosition(new THREE.Vector3());\n\n\t\t\tlet start = drag.intersectionStart;\n\t\t\tlet dir = new THREE.Vector4(...handle.alignment, 0).applyMatrix4(this.scene.matrixWorld);\n\t\t\tlet end = new THREE.Vector3().addVectors(start, dir);\n\t\t\tlet line = new THREE.Line3(start.clone(), end.clone());\n\t\t\tdrag.line = line;\n\n\t\t\tlet camOnLine = line.closestPointToPoint(camera.position, false, new THREE.Vector3());\n\t\t\tlet normal = new THREE.Vector3().subVectors(camera.position, camOnLine);\n\t\t\tlet plane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, drag.intersectionStart);\n\t\t\tdrag.dragPlane = plane;\n\t\t\tdrag.pivot = drag.intersectionStart;\n\t\t}else{\n\t\t\thandle = drag.handle;\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\t{\n\t\t\tlet mouse = drag.end;\n\t\t\tlet domElement = this.viewer.renderer.domElement;\n\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\t\t\tlet I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());\n\n\t\t\tif (I) {\n\t\t\t\tlet iOnLine = drag.line.closestPointToPoint(I, false, new THREE.Vector3());\n\n\t\t\t\tlet diff = new THREE.Vector3().subVectors(iOnLine, drag.pivot);\n\n\t\t\t\tfor (let selection of this.selection) {\n\t\t\t\t\tselection.position.add(diff);\n\t\t\t\t\tselection.dispatchEvent({\n\t\t\t\t\t\ttype: \"position_changed\",\n\t\t\t\t\t\tobject: selection\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdrag.pivot = drag.pivot.add(diff);\n\t\t\t}\n\t\t}\n\t}\n\n\tdropTranslationHandle(e){\n\t\tthis.dragging = false;\n\t\tthis.setActiveHandle(null);\n\t}\n\n\tdropScaleHandle(e){\n\t\tthis.dragging = false;\n\t\tthis.setActiveHandle(null);\n\t}\n\n\tdragScaleHandle(e){\n\t\tlet drag = e.drag;\n\t\tlet handle = this.activeHandle;\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\n\t\tif(!drag.intersectionStart){\n\t\t\tdrag.intersectionStart = drag.location;\n\t\t\tdrag.objectStart = drag.object.getWorldPosition(new THREE.Vector3());\n\t\t\tdrag.handle = handle;\n\n\t\t\tlet start = drag.intersectionStart;\n\t\t\tlet dir = new THREE.Vector4(...handle.alignment, 0).applyMatrix4(this.scene.matrixWorld);\n\t\t\tlet end = new THREE.Vector3().addVectors(start, dir);\n\t\t\tlet line = new THREE.Line3(start.clone(), end.clone());\n\t\t\tdrag.line = line;\n\n\t\t\tlet camOnLine = line.closestPointToPoint(camera.position, false, new THREE.Vector3());\n\t\t\tlet normal = new THREE.Vector3().subVectors(camera.position, camOnLine);\n\t\t\tlet plane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, drag.intersectionStart);\n\t\t\tdrag.dragPlane = plane;\n\t\t\tdrag.pivot = drag.intersectionStart;\n\n\t\t\t//Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05);\n\t\t}else{\n\t\t\thandle = drag.handle;\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\t{\n\t\t\tlet mouse = drag.end;\n\t\t\tlet domElement = this.viewer.renderer.domElement;\n\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\t\t\tlet I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());\n\n\t\t\tif (I) {\n\t\t\t\tlet iOnLine = drag.line.closestPointToPoint(I, false, new THREE.Vector3());\n\t\t\t\tlet direction = handle.alignment.reduce( (a, v) => a + v, 0);\n\n\t\t\t\tlet toObjectSpace = this.selection[0].matrixWorld.clone().invert();\n\t\t\t\tlet iOnLineOS = iOnLine.clone().applyMatrix4(toObjectSpace);\n\t\t\t\tlet pivotOS = drag.pivot.clone().applyMatrix4(toObjectSpace);\n\t\t\t\tlet diffOS = new THREE.Vector3().subVectors(iOnLineOS, pivotOS);\n\t\t\t\tlet dragDirectionOS = diffOS.clone().normalize();\n\t\t\t\tif(iOnLine.distanceTo(drag.pivot) === 0){\n\t\t\t\t\tdragDirectionOS.set(0, 0, 0);\n\t\t\t\t}\n\t\t\t\tlet dragDirection = dragDirectionOS.dot(new THREE.Vector3(...handle.alignment));\n\n\t\t\t\tlet diff = new THREE.Vector3().subVectors(iOnLine, drag.pivot);\n\t\t\t\tlet diffScale = new THREE.Vector3(...handle.alignment).multiplyScalar(diff.length() * direction * dragDirection);\n\t\t\t\tlet diffPosition = diff.clone().multiplyScalar(0.5);\n\n\t\t\t\tfor (let selection of this.selection) {\n\t\t\t\t\tselection.scale.add(diffScale);\n\t\t\t\t\tselection.scale.x = Math.max(0.1, selection.scale.x);\n\t\t\t\t\tselection.scale.y = Math.max(0.1, selection.scale.y);\n\t\t\t\t\tselection.scale.z = Math.max(0.1, selection.scale.z);\n\t\t\t\t\tselection.position.add(diffPosition);\n\t\t\t\t\tselection.dispatchEvent({\n\t\t\t\t\t\ttype: \"position_changed\",\n\t\t\t\t\t\tobject: selection\n\t\t\t\t\t});\n\t\t\t\t\tselection.dispatchEvent({\n\t\t\t\t\t\ttype: \"scale_changed\",\n\t\t\t\t\t\tobject: selection\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdrag.pivot.copy(iOnLine);\n\t\t\t\t//Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05);\n\t\t\t}\n\t\t}\n\t}\n\n\tsetActiveHandle(handle){\n\t\tif(this.dragging){\n\t\t\treturn;\n\t\t}\n\n\t\tif(this.activeHandle === handle){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.activeHandle = handle;\n\n\t\tif(handle === null){\n\t\t\tfor(let handleName of Object.keys(this.handles)){\n\t\t\t\tlet handle = this.handles[handleName];\n\t\t\t\thandle.node.setOpacity(0);\n\t\t\t}\n\t\t}\n\n\t\tfor(let handleName of Object.keys(this.focusHandles)){\n\t\t\tlet handle = this.focusHandles[handleName];\n\n\t\t\tif(this.activeHandle === handle){\n\t\t\t\thandle.node.setOpacity(1.0);\n\t\t\t}else{\n\t\t\t\thandle.node.setOpacity(0.4)\n\t\t\t}\n\t\t}\n\n\t\tfor(let handleName of Object.keys(this.translationHandles)){\n\t\t\tlet handle = this.translationHandles[handleName];\n\n\t\t\tif(this.activeHandle === handle){\n\t\t\t\thandle.node.setOpacity(1.0);\n\t\t\t}else{\n\t\t\t\thandle.node.setOpacity(0.4)\n\t\t\t}\n\t\t}\n\n\t\tfor(let handleName of Object.keys(this.rotationHandles)){\n\t\t\tlet handle = this.rotationHandles[handleName];\n\n\t\t\t//if(this.activeHandle === handle){\n\t\t\t//\thandle.node.setOpacity(1.0);\n\t\t\t//}else{\n\t\t\t//\thandle.node.setOpacity(0.4)\n\t\t\t//}\n\n\t\t\thandle.node.setOpacity(0.4);\n\t\t}\n\n\t\tfor(let handleName of Object.keys(this.scaleHandles)){\n\t\t\tlet handle = this.scaleHandles[handleName];\n\n\t\t\tif(this.activeHandle === handle){\n\t\t\t\thandle.node.setOpacity(1.0);\n\n\t\t\t\tlet relatedFocusHandle = this.focusHandles[handle.name.replace(\"scale\", \"focus\")];\n\t\t\t\tlet relatedFocusNode = relatedFocusHandle.node;\n\t\t\t\trelatedFocusNode.setOpacity(0.4);\n\n\t\t\t\tfor(let translationHandleName of Object.keys(this.translationHandles)){\n\t\t\t\t\tlet translationHandle = this.translationHandles[translationHandleName];\n\t\t\t\t\ttranslationHandle.node.setOpacity(0.4);\n\t\t\t\t}\n\n\t\t\t\t//let relatedTranslationHandle = this.translationHandles[\n\t\t\t\t//\thandle.name.replace(\"scale\", \"translation\").replace(/[+-]/g, \"\")];\n\t\t\t\t//let relatedTranslationNode = relatedTranslationHandle.node;\n\t\t\t\t//relatedTranslationNode.setOpacity(0.4);\n\n\n\t\t\t}else{\n\t\t\t\thandle.node.setOpacity(0.4)\n\t\t\t}\n\t\t}\n\n\t\t\n\n\n\n\t\tif(handle){\n\t\t\thandle.node.setOpacity(1.0);\n\t\t}\n\n\t\t\n\t}\n\n\tupdate () {\n\n\t\tif(this.selection.length === 1){\n\n\t\t\tthis.scene.visible = true;\n\n\t\t\tthis.scene.updateMatrix();\n\t\t\tthis.scene.updateMatrixWorld();\n\n\t\t\tlet selected = this.selection[0];\n\t\t\tlet world = selected.matrixWorld;\n\t\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\t\tlet domElement = this.viewer.renderer.domElement;\n\t\t\tlet mouse = this.viewer.inputHandler.mouse;\n\n\t\t\tlet center = selected.boundingBox.getCenter(new THREE.Vector3()).clone().applyMatrix4(selected.matrixWorld);\n\n\t\t\tthis.scene.scale.copy(selected.boundingBox.getSize(new THREE.Vector3()).multiply(selected.scale));\n\t\t\tthis.scene.position.copy(center);\n\t\t\tthis.scene.rotation.copy(selected.rotation);\n\n\t\t\tthis.scene.updateMatrixWorld();\n\n\t\t\t{\n\t\t\t\t// adjust scale of components\n\t\t\t\tfor(let handleName of Object.keys(this.handles)){\n\t\t\t\t\tlet handle = this.handles[handleName];\n\t\t\t\t\tlet node = handle.node;\n\n\t\t\t\t\tlet handlePos = node.getWorldPosition(new THREE.Vector3());\n\t\t\t\t\tlet distance = handlePos.distanceTo(camera.position);\n\t\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, domElement.clientWidth, domElement.clientHeight);\n\n\t\t\t\t\tlet ws = node.parent.getWorldScale(new THREE.Vector3());\n\n\t\t\t\t\tlet s = (7 / pr);\n\t\t\t\t\tlet scale = new THREE.Vector3(s, s, s).divide(ws);\n\n\t\t\t\t\tlet rot = new THREE.Matrix4().makeRotationFromEuler(node.rotation);\n\t\t\t\t\tlet rotInv = rot.clone().invert();\n\n\t\t\t\t\tscale.applyMatrix4(rotInv);\n\t\t\t\t\tscale.x = Math.abs(scale.x);\n\t\t\t\t\tscale.y = Math.abs(scale.y);\n\t\t\t\t\tscale.z = Math.abs(scale.z);\n\n\t\t\t\t\tnode.scale.copy(scale);\n\t\t\t\t}\n\n\t\t\t\t// adjust rotation handles\n\t\t\t\tif(!this.dragging){\n\t\t\t\t\tlet tWorld = this.scene.matrixWorld;\n\t\t\t\t\tlet tObject = tWorld.clone().invert();\n\t\t\t\t\tlet camObjectPos = camera.getWorldPosition(new THREE.Vector3()).applyMatrix4(tObject);\n\n\t\t\t\t\tlet x = this.rotationHandles[\"rotation.x\"].node.rotation;\n\t\t\t\t\tlet y = this.rotationHandles[\"rotation.y\"].node.rotation;\n\t\t\t\t\tlet z = this.rotationHandles[\"rotation.z\"].node.rotation;\n\n\t\t\t\t\tx.order = \"ZYX\";\n\t\t\t\t\ty.order = \"ZYX\";\n\n\t\t\t\t\tlet above = camObjectPos.z > 0;\n\t\t\t\t\tlet below = !above;\n\t\t\t\t\tlet PI_HALF = Math.PI / 2;\n\n\t\t\t\t\tif(above){\n\t\t\t\t\t\tif(camObjectPos.x > 0 && camObjectPos.y > 0){\n\t\t\t\t\t\t\tx.x = 1 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 3 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 0 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x < 0 && camObjectPos.y > 0){\n\t\t\t\t\t\t\tx.x = 1 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 2 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 1 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x < 0 && camObjectPos.y < 0){\n\t\t\t\t\t\t\tx.x = 2 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 2 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 2 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x > 0 && camObjectPos.y < 0){\n\t\t\t\t\t\t\tx.x = 2 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 3 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 3 * PI_HALF;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if(below){\n\t\t\t\t\t\tif(camObjectPos.x > 0 && camObjectPos.y > 0){\n\t\t\t\t\t\t\tx.x = 0 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 0 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 0 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x < 0 && camObjectPos.y > 0){\n\t\t\t\t\t\t\tx.x = 0 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 1 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 1 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x < 0 && camObjectPos.y < 0){\n\t\t\t\t\t\t\tx.x = 3 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 1 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 2 * PI_HALF;\n\t\t\t\t\t\t}else if(camObjectPos.x > 0 && camObjectPos.y < 0){\n\t\t\t\t\t\t\tx.x = 3 * PI_HALF;\n\t\t\t\t\t\t\ty.y = 0 * PI_HALF;\n\t\t\t\t\t\t\tz.z = 3 * PI_HALF;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\t\t\t\t\tlet raycaster = new THREE.Raycaster(ray.origin, ray.direction);\n\t\t\t\t\tlet intersects = raycaster.intersectObjects(this.pickVolumes.filter(v => v.visible), true);\n\n\t\t\t\t\tif(intersects.length > 0){\n\t\t\t\t\t\tlet I = intersects[0];\n\t\t\t\t\t\tlet handleName = I.object.handle;\n\t\t\t\t\t\tthis.setActiveHandle(this.handles[handleName]);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tthis.setActiveHandle(null);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// \n\t\t\t\tfor(let handleName of Object.keys(this.scaleHandles)){\n\t\t\t\t\tlet handle = this.handles[handleName];\n\t\t\t\t\tlet node = handle.node;\n\t\t\t\t\tlet alignment = handle.alignment;\n\n\t\t\t\t\t\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t}else{\n\t\t\tthis.scene.visible = false;\n\t\t}\n\t\t\n\t}\n\n};\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Volume, BoxVolume} from \"./Volume.js\";\nimport {Utils} from \"../utils.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\n\nexport class VolumeTool extends EventDispatcher{\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.addEventListener('start_inserting_volume', e => {\n\t\t\tthis.viewer.dispatchEvent({\n\t\t\t\ttype: 'cancel_insertions'\n\t\t\t});\n\t\t});\n\n\t\tthis.scene = new THREE.Scene();\n\t\tthis.scene.name = 'scene_volume';\n\n\t\tthis.viewer.inputHandler.registerInteractiveScene(this.scene);\n\n\t\tthis.onRemove = e => {\n\t\t\tthis.scene.remove(e.volume);\n\t\t};\n\n\t\tthis.onAdd = e => {\n\t\t\tthis.scene.add(e.volume);\n\t\t};\n\n\t\tfor(let volume of viewer.scene.volumes){\n\t\t\tthis.onAdd({volume: volume});\n\t\t}\n\n\t\tthis.viewer.inputHandler.addEventListener('delete', e => {\n\t\t\tlet volumes = e.selection.filter(e => (e instanceof Volume));\n\t\t\tvolumes.forEach(e => this.viewer.scene.removeVolume(e));\n\t\t});\n\n\t\tviewer.addEventListener(\"update\", this.update.bind(this));\n\t\tviewer.addEventListener(\"render.pass.scene\", e => this.render(e));\n\t\tviewer.addEventListener(\"scene_changed\", this.onSceneChange.bind(this));\n\n\t\tviewer.scene.addEventListener('volume_added', this.onAdd);\n\t\tviewer.scene.addEventListener('volume_removed', this.onRemove);\n\t}\n\n\tonSceneChange(e){\n\t\tif(e.oldScene){\n\t\t\te.oldScene.removeEventListeners('volume_added', this.onAdd);\n\t\t\te.oldScene.removeEventListeners('volume_removed', this.onRemove);\n\t\t}\n\n\t\te.scene.addEventListener('volume_added', this.onAdd);\n\t\te.scene.addEventListener('volume_removed', this.onRemove);\n\t}\n\n\tstartInsertion (args = {}) {\n\t\tlet volume;\n\t\tif(args.type){\n\t\t\tvolume = new args.type();\n\t\t}else{\n\t\t\tvolume = new BoxVolume();\n\t\t}\n\t\t\n\t\tvolume.clip = args.clip || false;\n\t\tvolume.name = args.name || 'Volume';\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'start_inserting_volume',\n\t\t\tvolume: volume\n\t\t});\n\n\t\tthis.viewer.scene.addVolume(volume);\n\t\tthis.scene.add(volume);\n\n\t\tlet cancel = {\n\t\t\tcallback: null\n\t\t};\n\n\t\tlet drag = e => {\n\t\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\t\t\n\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\te.drag.end, \n\t\t\t\tthis.viewer.scene.getActiveCamera(), \n\t\t\t\tthis.viewer, \n\t\t\t\tthis.viewer.scene.pointclouds, \n\t\t\t\t{pickClipped: false});\n\n\t\t\tif (I) {\n\t\t\t\tvolume.position.copy(I.location);\n\n\t\t\t\tlet wp = volume.getWorldPosition(new THREE.Vector3()).applyMatrix4(camera.matrixWorldInverse);\n\t\t\t\t// let pp = new THREE.Vector4(wp.x, wp.y, wp.z).applyMatrix4(camera.projectionMatrix);\n\t\t\t\tlet w = Math.abs((wp.z / 5));\n\t\t\t\tvolume.scale.set(w, w, w);\n\t\t\t}\n\t\t};\n\n\t\tlet drop = e => {\n\t\t\tvolume.removeEventListener('drag', drag);\n\t\t\tvolume.removeEventListener('drop', drop);\n\n\t\t\tcancel.callback();\n\t\t};\n\n\t\tcancel.callback = e => {\n\t\t\tvolume.removeEventListener('drag', drag);\n\t\t\tvolume.removeEventListener('drop', drop);\n\t\t\tthis.viewer.removeEventListener('cancel_insertions', cancel.callback);\n\t\t};\n\n\t\tvolume.addEventListener('drag', drag);\n\t\tvolume.addEventListener('drop', drop);\n\t\tthis.viewer.addEventListener('cancel_insertions', cancel.callback);\n\n\t\tthis.viewer.inputHandler.startDragging(volume);\n\n\t\treturn volume;\n\t}\n\n\tupdate(){\n\t\tif (!this.viewer.scene) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\tlet renderAreaSize = this.viewer.renderer.getSize(new THREE.Vector2());\n\t\tlet clientWidth = renderAreaSize.width;\n\t\tlet clientHeight = renderAreaSize.height;\n\n\t\tlet volumes = this.viewer.scene.volumes;\n\t\tfor (let volume of volumes) {\n\t\t\tlet label = volume.label;\n\t\t\t\n\t\t\t{\n\n\t\t\t\tlet distance = label.position.distanceTo(camera.position);\n\t\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);\n\n\t\t\t\tlet scale = (70 / pr);\n\t\t\t\tlabel.scale.set(scale, scale, scale);\n\t\t\t}\n\n\t\t\tlet calculatedVolume = volume.getVolume();\n\t\t\tcalculatedVolume = calculatedVolume / Math.pow(this.viewer.lengthUnit.unitspermeter, 3) * Math.pow(this.viewer.lengthUnitDisplay.unitspermeter, 3); //convert to cubic meters then to the cubic display unit\n\t\t\tlet text = Utils.addCommas(calculatedVolume.toFixed(3)) + ' ' + this.viewer.lengthUnitDisplay.code + '\\u00B3';\n\t\t\tlabel.setText(text);\n\t\t}\n\t}\n\n\trender(params){\n\t\tconst renderer = this.viewer.renderer;\n\n\t\tconst oldTarget = renderer.getRenderTarget();\n\t\t\n\t\tif(params.renderTarget){\n\t\t\trenderer.setRenderTarget(params.renderTarget);\n\t\t}\n\t\trenderer.render(this.scene, this.viewer.scene.getActiveCamera());\n\t\trenderer.setRenderTarget(oldTarget);\n\t}\n\n}\n","\r\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\r\n\r\nimport {Utils} from \"../utils.js\";\r\n\r\nexport class Compass{\r\n\r\n\tconstructor(viewer){\r\n\t\tthis.viewer = viewer;\r\n\r\n\t\tthis.visible = false;\r\n\t\tthis.dom = this.createElement();\r\n\r\n\t\tviewer.addEventListener(\"update\", () => {\r\n\t\t\tconst direction = viewer.scene.view.direction.clone();\r\n\t\t\tdirection.z = 0;\r\n\t\t\tdirection.normalize();\r\n\r\n\t\t\tconst camera = viewer.scene.getActiveCamera();\r\n\r\n\t\t\tconst p1 = camera.getWorldPosition(new THREE.Vector3());\r\n\t\t\tconst p2 = p1.clone().add(direction);\r\n\r\n\t\t\tconst projection = viewer.getProjection();\r\n\t\t\tconst azimuth = Utils.computeAzimuth(p1, p2, projection);\r\n\t\t\t\r\n\t\t\tthis.dom.css(\"transform\", `rotateZ(${-azimuth}rad)`);\r\n\t\t});\r\n\r\n\t\tthis.dom.click( () => {\r\n\t\t\tviewer.setTopView();\r\n\t\t});\r\n\r\n\t\tconst renderArea = $(viewer.renderArea);\r\n\t\trenderArea.append(this.dom);\r\n\r\n\t\tthis.setVisible(this.visible);\r\n\t}\r\n\r\n\tsetVisible(visible){\r\n\t\tthis.visible = visible;\r\n\r\n\t\tconst value = visible ? \"\" : \"none\";\r\n\t\tthis.dom.css(\"display\", value);\r\n\t}\r\n\r\n\tisVisible(){\r\n\t\treturn this.visible;\r\n\t}\r\n\r\n\tcreateElement(){\r\n\t\tconst style = `style=\"position: absolute; top: 10px; right: 10px; z-index: 10000; width: 64px;\"`;\r\n\t\tconst img = $(``);\r\n\r\n\t\treturn img;\r\n\t}\r\n\r\n};","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\n\nexport class PotreeRenderer {\n\n\tconstructor (viewer) {\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\t{\n\t\t\tlet dummyScene = new THREE.Scene();\n\t\t\tlet geometry = new THREE.SphereGeometry(0.001, 2, 2);\n\t\t\tlet mesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial());\n\t\t\tmesh.position.set(36453, 35163, 764712);\n\t\t\tdummyScene.add(mesh);\n\n\t\t\tthis.dummyMesh = mesh;\n\t\t\tthis.dummyScene = dummyScene;\n\t\t}\n\t}\n\n\tclearTargets(){\n\n\t}\n\n\tclear(){\n\t\tlet {viewer, renderer} = this;\n\n\n\t\t// render skybox\n\t\tif(viewer.background === \"skybox\"){\n\t\t\trenderer.setClearColor(0xff0000, 1);\n\t\t}else if(viewer.background === \"gradient\"){\n\t\t\trenderer.setClearColor(0x00ff00, 1);\n\t\t}else if(viewer.background === \"black\"){\n\t\t\trenderer.setClearColor(0x000000, 1);\n\t\t}else if(viewer.background === \"white\"){\n\t\t\trenderer.setClearColor(0xFFFFFF, 1);\n\t\t}else{\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t}\n\n\t\trenderer.clear();\n\t}\n \n\trender(params){\n\t\tlet {viewer, renderer} = this;\n\n\t\tconst camera = params.camera ? params.camera : viewer.scene.getActiveCamera();\n\n\t\tviewer.dispatchEvent({type: \"render.pass.begin\",viewer: viewer});\n\n\t\tconst renderAreaSize = renderer.getSize(new THREE.Vector2());\n\t\tconst width = params.viewport ? params.viewport[2] : renderAreaSize.x;\n\t\tconst height = params.viewport ? params.viewport[3] : renderAreaSize.y;\n\n\t\t// render skybox\n\t\tif(viewer.background === \"skybox\"){\n\t\t\tviewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation);\n\t\t\tviewer.skybox.camera.fov = viewer.scene.cameraP.fov;\n\t\t\tviewer.skybox.camera.aspect = viewer.scene.cameraP.aspect;\n\t\t\t\n\t\t\tviewer.skybox.parent.rotation.x = 0;\n\t\t\tviewer.skybox.parent.updateMatrixWorld();\n\n\t\t\tviewer.skybox.camera.updateProjectionMatrix();\n\t\t\trenderer.render(viewer.skybox.scene, viewer.skybox.camera);\n\t\t}else if(viewer.background === \"gradient\"){\n\t\t\trenderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG);\n\t\t}\n\t\t\n\t\tfor(let pointcloud of this.viewer.scene.pointclouds){\n\t\t\tconst {material} = pointcloud;\n\t\t\tmaterial.useEDL = false;\n\t\t}\n\t\t\n\t\tviewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null, {\n\t\t\tclipSpheres: viewer.scene.volumes.filter(v => (v instanceof Potree.SphereVolume)),\n\t\t});\n\t\t\n\t\t// render scene\n\t\trenderer.render(viewer.scene.scene, camera);\n\n\t\tviewer.dispatchEvent({type: \"render.pass.scene\",viewer: viewer});\n\t\t\n\t\tviewer.clippingTool.update();\n\t\trenderer.render(viewer.clippingTool.sceneMarker, viewer.scene.cameraScreenSpace); //viewer.scene.cameraScreenSpace);\n\t\trenderer.render(viewer.clippingTool.sceneVolume, camera);\n\n\t\trenderer.render(viewer.controls.sceneControls, camera);\n\t\t\n\t\trenderer.clearDepth();\n\t\t\n\t\tviewer.transformationTool.update();\n\t\t\n\t\tviewer.dispatchEvent({type: \"render.pass.perspective_overlay\",viewer: viewer});\n\n\t\t// renderer.render(viewer.controls.sceneControls, camera);\n\t\t// renderer.render(viewer.clippingTool.sceneVolume, camera);\n\t\t// renderer.render(viewer.transformationTool.scene, camera);\n\t\t\n\t\t// renderer.setViewport(width - viewer.navigationCube.width, \n\t\t// \t\t\t\t\t\t\theight - viewer.navigationCube.width, \n\t\t// \t\t\t\t\t\t\tviewer.navigationCube.width, viewer.navigationCube.width);\n\t\t// renderer.render(viewer.navigationCube, viewer.navigationCube.camera);\t\t\n\t\t// renderer.setViewport(0, 0, width, height);\n\t\t\n\t\tviewer.dispatchEvent({type: \"render.pass.end\",viewer: viewer});\n\t}\n\n}\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {PointCloudSM} from \"../utils/PointCloudSM.js\";\nimport {EyeDomeLightingMaterial} from \"../materials/EyeDomeLightingMaterial.js\";\nimport {SphereVolume} from \"../utils/Volume.js\";\nimport {Utils} from \"../utils.js\";\n\nexport class EDLRenderer{\n\tconstructor(viewer){\n\t\tthis.viewer = viewer;\n\n\t\tthis.edlMaterial = null;\n\n\t\tthis.rtRegular;\n\t\tthis.rtEDL;\n\n\t\tthis.gl = viewer.renderer.getContext();\n\n\t\tthis.shadowMap = new PointCloudSM(this.viewer.pRenderer);\n\t}\n\n\tinitEDL(){\n\t\tif (this.edlMaterial != null) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.edlMaterial = new EyeDomeLightingMaterial();\n\t\tthis.edlMaterial.depthTest = true;\n\t\tthis.edlMaterial.depthWrite = true;\n\t\tthis.edlMaterial.transparent = true;\n\n\t\tthis.rtEDL = new THREE.WebGLRenderTarget(1024, 1024, {\n\t\t\tminFilter: THREE.NearestFilter,\n\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\ttype: THREE.FloatType,\n\t\t\tdepthTexture: new THREE.DepthTexture(undefined, undefined, THREE.UnsignedIntType)\n\t\t});\n\n\t\tthis.rtRegular = new THREE.WebGLRenderTarget(1024, 1024, {\n\t\t\tminFilter: THREE.NearestFilter,\n\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\tdepthTexture: new THREE.DepthTexture(undefined, undefined, THREE.UnsignedIntType)\n\t\t});\n\t};\n\n\tresize(width, height){\n\t\tif(this.screenshot){\n\t\t\twidth = this.screenshot.target.width;\n\t\t\theight = this.screenshot.target.height;\n\t\t}\n\n\t\tthis.rtEDL.setSize(width , height);\n\t\tthis.rtRegular.setSize(width , height);\n\t}\n\n\tmakeScreenshot(camera, size, callback){\n\n\t\tif(camera === undefined || camera === null){\n\t\t\tcamera = this.viewer.scene.getActiveCamera();\n\t\t}\n\n\t\tif(size === undefined || size === null){\n\t\t\tsize = this.viewer.renderer.getSize(new THREE.Vector2());\n\t\t}\n\n\t\tlet {width, height} = size;\n\n\t\t//let maxTextureSize = viewer.renderer.capabilities.maxTextureSize;\n\t\t//if(width * 4 < \n\t\twidth = 2 * width;\n\t\theight = 2 * height;\n\n\t\tlet target = new THREE.WebGLRenderTarget(width, height, {\n\t\t\tformat: THREE.RGBAFormat,\n\t\t});\n\n\t\tthis.screenshot = {\n\t\t\ttarget: target\n\t\t};\n\n\t\t// HACK? removed because of error, was this important?\n\t\t//this.viewer.renderer.clearTarget(target, true, true, true);\n\n\t\tthis.render();\n\n\t\tlet pixelCount = width * height;\n\t\tlet buffer = new Uint8Array(4 * pixelCount);\n\n\t\tthis.viewer.renderer.readRenderTargetPixels(target, 0, 0, width, height, buffer);\n\n\t\t// flip vertically\n\t\tlet bytesPerLine = width * 4;\n\t\tfor(let i = 0; i < parseInt(height / 2); i++){\n\t\t\tlet j = height - i - 1;\n\n\t\t\tlet lineI = buffer.slice(i * bytesPerLine, i * bytesPerLine + bytesPerLine);\n\t\t\tlet lineJ = buffer.slice(j * bytesPerLine, j * bytesPerLine + bytesPerLine);\n\t\t\tbuffer.set(lineJ, i * bytesPerLine);\n\t\t\tbuffer.set(lineI, j * bytesPerLine);\n\t\t}\n\n\t\tthis.screenshot.target.dispose();\n\t\tdelete this.screenshot;\n\n\t\treturn {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tbuffer: buffer\n\t\t};\n\t}\n\n\tclearTargets(){\n\t\tconst viewer = this.viewer;\n\t\tconst {renderer} = viewer;\n\n\t\tconst oldTarget = renderer.getRenderTarget();\n\n\t\trenderer.setRenderTarget( this.rtEDL );\n\t\trenderer.clear( true, true, true );\n\n\t\trenderer.setRenderTarget( this.rtRegular );\n\t\trenderer.clear( true, true, false );\n\n\t\trenderer.setRenderTarget(oldTarget);\n\t}\n\n\tclear(){\n\t\tthis.initEDL();\n\t\tconst viewer = this.viewer;\n\n\t\tconst {renderer, background} = viewer;\n\n\t\tif(background === \"skybox\"){\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t} else if (background === 'gradient') {\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t} else if (background === 'black') {\n\t\t\trenderer.setClearColor(0x000000, 1);\n\t\t} else if (background === 'white') {\n\t\t\trenderer.setClearColor(0xFFFFFF, 1);\n\t\t} else {\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t}\n\t\t\n\t\trenderer.clear();\n\n\t\tthis.clearTargets();\n\t}\n\n\trenderShadowMap(visiblePointClouds, camera, lights){\n\n\t\tconst {viewer} = this;\n\n\t\tconst doShadows = lights.length > 0 && !(lights[0].disableShadowUpdates);\n\t\tif(doShadows){\n\t\t\tlet light = lights[0];\n\n\t\t\tthis.shadowMap.setLight(light);\n\n\t\t\tlet originalAttributes = new Map();\n\t\t\tfor(let pointcloud of viewer.scene.pointclouds){\n\t\t\t\t// TODO IMPORTANT !!! check\n\t\t\t\toriginalAttributes.set(pointcloud, pointcloud.material.activeAttributeName);\n\t\t\t\tpointcloud.material.disableEvents();\n\t\t\t\tpointcloud.material.activeAttributeName = \"depth\";\n\t\t\t\t//pointcloud.material.pointColorType = PointColorType.DEPTH;\n\t\t\t}\n\n\t\t\tthis.shadowMap.render(viewer.scene.scenePointCloud, camera);\n\n\t\t\tfor(let pointcloud of visiblePointClouds){\n\t\t\t\tlet originalAttribute = originalAttributes.get(pointcloud);\n\t\t\t\t// TODO IMPORTANT !!! check\n\t\t\t\tpointcloud.material.activeAttributeName = originalAttribute;\n\t\t\t\tpointcloud.material.enableEvents();\n\t\t\t}\n\n\t\t\tviewer.shadowTestCam.updateMatrixWorld();\n\t\t\tviewer.shadowTestCam.matrixWorldInverse.copy(viewer.shadowTestCam.matrixWorld).invert();\n\t\t\tviewer.shadowTestCam.updateProjectionMatrix();\n\t\t}\n\n\t}\n\n\trender(params){\n\t\tthis.initEDL();\n\n\t\tconst viewer = this.viewer;\n\t\tlet camera = params.camera ? params.camera : viewer.scene.getActiveCamera();\n\t\tconst {width, height} = this.viewer.renderer.getSize(new THREE.Vector2());\n\n\n\t\tviewer.dispatchEvent({type: \"render.pass.begin\",viewer: viewer});\n\t\t\n\t\tthis.resize(width, height);\n\n\t\tconst visiblePointClouds = viewer.scene.pointclouds.filter(pc => pc.visible);\n\n\t\tif(this.screenshot){\n\t\t\tlet oldBudget = Potree.pointBudget;\n\t\t\tPotree.pointBudget = Math.max(10 * 1000 * 1000, 2 * oldBudget);\n\t\t\tlet result = Potree.updatePointClouds(\n\t\t\t\tviewer.scene.pointclouds, \n\t\t\t\tcamera, \n\t\t\t\tviewer.renderer);\n\t\t\tPotree.pointBudget = oldBudget;\n\t\t}\n\n\t\tlet lights = [];\n\t\tviewer.scene.scene.traverse(node => {\n\t\t\tif(node.type === \"SpotLight\"){\n\t\t\t\tlights.push(node);\n\t\t\t}\n\t\t});\n\n\t\tif(viewer.background === \"skybox\"){\n\t\t\tviewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation);\n\t\t\tviewer.skybox.camera.fov = viewer.scene.cameraP.fov;\n\t\t\tviewer.skybox.camera.aspect = viewer.scene.cameraP.aspect;\n\n\t\t\tviewer.skybox.parent.rotation.x = 0;\n\t\t\tviewer.skybox.parent.updateMatrixWorld();\n\n\t\t\tviewer.skybox.camera.updateProjectionMatrix();\n\t\t\tviewer.renderer.render(viewer.skybox.scene, viewer.skybox.camera);\n\t\t} else if (viewer.background === 'gradient') {\n\t\t\tviewer.renderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG);\n\t\t} \n\n\t\t//TODO adapt to multiple lights\n\t\tthis.renderShadowMap(visiblePointClouds, camera, lights);\n\n\t\t{ // COLOR & DEPTH PASS\n\t\t\tfor (let pointcloud of visiblePointClouds) {\n\t\t\t\tlet octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x;\n\n\t\t\t\tlet material = pointcloud.material;\n\t\t\t\tmaterial.weighted = false;\n\t\t\t\tmaterial.useLogarithmicDepthBuffer = false;\n\t\t\t\tmaterial.useEDL = true;\n\n\t\t\t\tmaterial.screenWidth = width;\n\t\t\t\tmaterial.screenHeight = height;\n\t\t\t\tmaterial.uniforms.visibleNodes.value = pointcloud.material.visibleNodesTexture;\n\t\t\t\tmaterial.uniforms.octreeSize.value = octreeSize;\n\t\t\t\tmaterial.spacing = pointcloud.pcoGeometry.spacing; // * Math.max(pointcloud.scale.x, pointcloud.scale.y, pointcloud.scale.z);\n\t\t\t}\n\t\t\t\n\t\t\t// TODO adapt to multiple lights\n\t\t\tviewer.renderer.setRenderTarget(this.rtEDL);\n\t\t\t\n\t\t\tif(lights.length > 0){\n\t\t\t\tviewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtEDL, {\n\t\t\t\t\tclipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)),\n\t\t\t\t\tshadowMaps: [this.shadowMap],\n\t\t\t\t\ttransparent: false,\n\t\t\t\t});\n\t\t\t}else{\n\n\t\t\t\t\n\t\t\t\t// let test = camera.clone();\n\t\t\t\t// test.matrixAutoUpdate = false;\n\n\t\t\t\t// //test.updateMatrixWorld = () => {};\n\n\t\t\t\t// let mat = new THREE.Matrix4().set(\n\t\t\t\t// \t1, 0, 0, 0,\n\t\t\t\t// \t0, 0, 1, 0,\n\t\t\t\t// \t0, -1, 0, 0,\n\t\t\t\t// \t0, 0, 0, 1,\n\t\t\t\t// );\n\t\t\t\t// mat.invert()\n\n\t\t\t\t// test.matrix.multiplyMatrices(mat, test.matrix);\n\t\t\t\t// test.updateMatrixWorld();\n\n\t\t\t\t//test.matrixWorld.multiplyMatrices(mat, test.matrixWorld);\n\t\t\t\t//test.matrixWorld.multiply(mat);\n\t\t\t\t//test.matrixWorldInverse.invert(test.matrixWorld);\n\t\t\t\t//test.matrixWorldInverse.multiplyMatrices(test.matrixWorldInverse, mat);\n\t\t\t\t\n\n\t\t\t\tviewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtEDL, {\n\t\t\t\t\tclipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)),\n\t\t\t\t\ttransparent: false,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t\n\t\t}\n\n\t\tviewer.dispatchEvent({type: \"render.pass.scene\", viewer: viewer, renderTarget: this.rtRegular});\n\t\tviewer.renderer.setRenderTarget(null);\n\t\tviewer.renderer.render(viewer.scene.scene, camera);\n\n\t\t{ // EDL PASS\n\n\t\t\tconst uniforms = this.edlMaterial.uniforms;\n\n\t\t\tuniforms.screenWidth.value = width;\n\t\t\tuniforms.screenHeight.value = height;\n\n\t\t\tlet proj = camera.projectionMatrix;\n\t\t\tlet projArray = new Float32Array(16);\n\t\t\tprojArray.set(proj.elements);\n\n\t\t\tuniforms.uNear.value = camera.near;\n\t\t\tuniforms.uFar.value = camera.far;\n\t\t\tuniforms.uEDLColor.value = this.rtEDL.texture;\n\t\t\tuniforms.uEDLDepth.value = this.rtEDL.depthTexture;\n\t\t\tuniforms.uProj.value = projArray;\n\n\t\t\tuniforms.edlStrength.value = viewer.edlStrength;\n\t\t\tuniforms.radius.value = viewer.edlRadius;\n\t\t\tuniforms.opacity.value = viewer.edlOpacity; // HACK\n\t\t\t\n\t\t\tUtils.screenPass.render(viewer.renderer, this.edlMaterial);\n\n\t\t\tif(this.screenshot){\n\t\t\t\tUtils.screenPass.render(viewer.renderer, this.edlMaterial, this.screenshot.target);\n\t\t\t}\n\n\t\t}\n\n\t\tviewer.dispatchEvent({type: \"render.pass.scene\", viewer: viewer});\n\n\t\tviewer.renderer.clearDepth();\n\n\t\tviewer.transformationTool.update();\n\n\t\tviewer.dispatchEvent({type: \"render.pass.perspective_overlay\",viewer: viewer});\n\n\t\tviewer.renderer.render(viewer.controls.sceneControls, camera);\n\t\tviewer.renderer.render(viewer.clippingTool.sceneVolume, camera);\n\t\tviewer.renderer.render(viewer.transformationTool.scene, camera);\n\t\t\n\t\tviewer.dispatchEvent({type: \"render.pass.end\",viewer: viewer});\n\n\t}\n}\n\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {NormalizationMaterial} from \"../materials/NormalizationMaterial.js\";\nimport {NormalizationEDLMaterial} from \"../materials/NormalizationEDLMaterial.js\";\nimport {PointCloudMaterial} from \"../materials/PointCloudMaterial.js\";\nimport {PointShape} from \"../defines.js\";\nimport {SphereVolume} from \"../utils/Volume.js\";\nimport {Utils} from \"../utils.js\";\n\n\nexport class HQSplatRenderer{\n\t\n\tconstructor(viewer){\n\t\tthis.viewer = viewer;\n\n\t\tthis.depthMaterials = new Map();\n\t\tthis.attributeMaterials = new Map();\n\t\tthis.normalizationMaterial = null;\n\n\t\tthis.rtDepth = null;\n\t\tthis.rtAttribute = null;\n\t\tthis.gl = viewer.renderer.getContext();\n\n\t\tthis.initialized = false;\n\t}\n\n\tinit(){\n\t\tif (this.initialized) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.normalizationMaterial = new NormalizationMaterial();\n\t\tthis.normalizationMaterial.depthTest = true;\n\t\tthis.normalizationMaterial.depthWrite = true;\n\t\tthis.normalizationMaterial.transparent = true;\n\n\t\tthis.normalizationEDLMaterial = new NormalizationEDLMaterial();\n\t\tthis.normalizationEDLMaterial.depthTest = true;\n\t\tthis.normalizationEDLMaterial.depthWrite = true;\n\t\tthis.normalizationEDLMaterial.transparent = true;\n\n\t\tthis.rtDepth = new THREE.WebGLRenderTarget(1024, 1024, {\n\t\t\tminFilter: THREE.NearestFilter,\n\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\ttype: THREE.FloatType,\n\t\t\tdepthTexture: new THREE.DepthTexture(undefined, undefined, THREE.UnsignedIntType)\n\t\t});\n\n\t\tthis.rtAttribute = new THREE.WebGLRenderTarget(1024, 1024, {\n\t\t\tminFilter: THREE.NearestFilter,\n\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\ttype: THREE.FloatType,\n\t\t\tdepthTexture: this.rtDepth.depthTexture,\n\t\t});\n\n\t\tthis.initialized = true;\n\t};\n\n\tresize(width, height){\n\t\tthis.rtDepth.setSize(width, height);\n\t\tthis.rtAttribute.setSize(width, height);\n\t}\n\n\tclearTargets(){\n\t\tconst viewer = this.viewer;\n\t\tconst {renderer} = viewer;\n\n\t\tconst oldTarget = renderer.getRenderTarget();\n\n\t\trenderer.setClearColor(0x000000, 0);\n\n\t\trenderer.setRenderTarget( this.rtDepth );\n\t\trenderer.clear( true, true, true );\n\n\t\trenderer.setRenderTarget( this.rtAttribute );\n\t\trenderer.clear( true, true, true );\n\n\t\trenderer.setRenderTarget(oldTarget);\n\t}\n\n\n\tclear(){\n\t\tthis.init();\n\n\t\tconst {renderer, background} = this.viewer;\n\n\t\tif(background === \"skybox\"){\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t} else if (background === 'gradient') {\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t} else if (background === 'black') {\n\t\t\trenderer.setClearColor(0x000000, 1);\n\t\t} else if (background === 'white') {\n\t\t\trenderer.setClearColor(0xFFFFFF, 1);\n\t\t} else {\n\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t}\n\n\t\trenderer.clear();\n\n\t\tthis.clearTargets();\n\t}\n\n\trender (params) {\n\t\tthis.init();\n\n\t\tconst viewer = this.viewer;\n\t\tconst camera = params.camera ? params.camera : viewer.scene.getActiveCamera();\n\t\tconst {width, height} = this.viewer.renderer.getSize(new THREE.Vector2());\n\n\t\tviewer.dispatchEvent({type: \"render.pass.begin\",viewer: viewer});\n\n\t\tthis.resize(width, height);\n\n\t\tconst visiblePointClouds = viewer.scene.pointclouds.filter(pc => pc.visible);\n\t\tconst originalMaterials = new Map();\n\n\t\tfor(let pointcloud of visiblePointClouds){\n\t\t\toriginalMaterials.set(pointcloud, pointcloud.material);\n\n\t\t\tif(!this.attributeMaterials.has(pointcloud)){\n\t\t\t\tlet attributeMaterial = new PointCloudMaterial();\n\t\t\t\tthis.attributeMaterials.set(pointcloud, attributeMaterial);\n\t\t\t}\n\n\t\t\tif(!this.depthMaterials.has(pointcloud)){\n\t\t\t\tlet depthMaterial = new PointCloudMaterial();\n\n\t\t\t\tdepthMaterial.setDefine(\"depth_pass\", \"#define hq_depth_pass\");\n\t\t\t\tdepthMaterial.setDefine(\"use_edl\", \"#define use_edl\");\n\n\t\t\t\tthis.depthMaterials.set(pointcloud, depthMaterial);\n\t\t\t}\n\t\t}\n\n\t\t{ // DEPTH PASS\n\t\t\tfor (let pointcloud of visiblePointClouds) {\n\t\t\t\tlet octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x;\n\n\t\t\t\tlet material = originalMaterials.get(pointcloud);\n\t\t\t\tlet depthMaterial = this.depthMaterials.get(pointcloud);\n\n\t\t\t\tdepthMaterial.size = material.size;\n\t\t\t\tdepthMaterial.minSize = material.minSize;\n\t\t\t\tdepthMaterial.maxSize = material.maxSize;\n\n\t\t\t\tdepthMaterial.pointSizeType = material.pointSizeType;\n\t\t\t\tdepthMaterial.visibleNodesTexture = material.visibleNodesTexture;\n\t\t\t\tdepthMaterial.weighted = false;\n\t\t\t\tdepthMaterial.screenWidth = width;\n\t\t\t\tdepthMaterial.shape = PointShape.CIRCLE;\n\t\t\t\tdepthMaterial.screenHeight = height;\n\t\t\t\tdepthMaterial.uniforms.visibleNodes.value = material.visibleNodesTexture;\n\t\t\t\tdepthMaterial.uniforms.octreeSize.value = octreeSize;\n\t\t\t\tdepthMaterial.spacing = pointcloud.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray());\n\t\t\t\tdepthMaterial.classification = material.classification;\n\t\t\t\tdepthMaterial.uniforms.classificationLUT.value.image.data = material.uniforms.classificationLUT.value.image.data;\n\t\t\t\tdepthMaterial.classificationTexture.needsUpdate = true;\n\n\t\t\t\tdepthMaterial.uniforms.uFilterReturnNumberRange.value = material.uniforms.uFilterReturnNumberRange.value;\n\t\t\t\tdepthMaterial.uniforms.uFilterNumberOfReturnsRange.value = material.uniforms.uFilterNumberOfReturnsRange.value;\n\t\t\t\tdepthMaterial.uniforms.uFilterGPSTimeClipRange.value = material.uniforms.uFilterGPSTimeClipRange.value;\n\t\t\t\tdepthMaterial.uniforms.uFilterPointSourceIDClipRange.value = material.uniforms.uFilterPointSourceIDClipRange.value;\n\n\t\t\t\tdepthMaterial.clipTask = material.clipTask;\n\t\t\t\tdepthMaterial.clipMethod = material.clipMethod;\n\t\t\t\tdepthMaterial.setClipBoxes(material.clipBoxes);\n\t\t\t\tdepthMaterial.setClipPolygons(material.clipPolygons);\n\n\t\t\t\tpointcloud.material = depthMaterial;\n\t\t\t}\n\t\t\t\n\t\t\tviewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtDepth, {\n\t\t\t\tclipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)),\n\t\t\t});\n\t\t}\n\n\t\t{ // ATTRIBUTE PASS\n\t\t\tfor (let pointcloud of visiblePointClouds) {\n\t\t\t\tlet octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x;\n\n\t\t\t\tlet material = originalMaterials.get(pointcloud);\n\t\t\t\tlet attributeMaterial = this.attributeMaterials.get(pointcloud);\n\n\t\t\t\tattributeMaterial.size = material.size;\n\t\t\t\tattributeMaterial.minSize = material.minSize;\n\t\t\t\tattributeMaterial.maxSize = material.maxSize;\n\n\t\t\t\tattributeMaterial.pointSizeType = material.pointSizeType;\n\t\t\t\tattributeMaterial.activeAttributeName = material.activeAttributeName;\n\t\t\t\tattributeMaterial.visibleNodesTexture = material.visibleNodesTexture;\n\t\t\t\tattributeMaterial.weighted = true;\n\t\t\t\tattributeMaterial.screenWidth = width;\n\t\t\t\tattributeMaterial.screenHeight = height;\n\t\t\t\tattributeMaterial.shape = PointShape.CIRCLE;\n\t\t\t\tattributeMaterial.uniforms.visibleNodes.value = material.visibleNodesTexture;\n\t\t\t\tattributeMaterial.uniforms.octreeSize.value = octreeSize;\n\t\t\t\tattributeMaterial.spacing = pointcloud.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray());\n\t\t\t\tattributeMaterial.classification = material.classification;\n\t\t\t\tattributeMaterial.uniforms.classificationLUT.value.image.data = material.uniforms.classificationLUT.value.image.data;\n\t\t\t\tattributeMaterial.classificationTexture.needsUpdate = true;\n\n\t\t\t\tattributeMaterial.uniforms.uFilterReturnNumberRange.value = material.uniforms.uFilterReturnNumberRange.value;\n\t\t\t\tattributeMaterial.uniforms.uFilterNumberOfReturnsRange.value = material.uniforms.uFilterNumberOfReturnsRange.value;\n\t\t\t\tattributeMaterial.uniforms.uFilterGPSTimeClipRange.value = material.uniforms.uFilterGPSTimeClipRange.value;\n\t\t\t\tattributeMaterial.uniforms.uFilterPointSourceIDClipRange.value = material.uniforms.uFilterPointSourceIDClipRange.value;\n\n\t\t\t\tattributeMaterial.elevationGradientRepeat = material.elevationGradientRepeat;\n\t\t\t\tattributeMaterial.elevationRange = material.elevationRange;\n\t\t\t\tattributeMaterial.gradient = material.gradient;\n\t\t\t\tattributeMaterial.matcap = material.matcap;\n\n\t\t\t\tattributeMaterial.intensityRange = material.intensityRange;\n\t\t\t\tattributeMaterial.intensityGamma = material.intensityGamma;\n\t\t\t\tattributeMaterial.intensityContrast = material.intensityContrast;\n\t\t\t\tattributeMaterial.intensityBrightness = material.intensityBrightness;\n\n\t\t\t\tattributeMaterial.rgbGamma = material.rgbGamma;\n\t\t\t\tattributeMaterial.rgbContrast = material.rgbContrast;\n\t\t\t\tattributeMaterial.rgbBrightness = material.rgbBrightness;\n\n\t\t\t\tattributeMaterial.weightRGB = material.weightRGB;\n\t\t\t\tattributeMaterial.weightIntensity = material.weightIntensity;\n\t\t\t\tattributeMaterial.weightElevation = material.weightElevation;\n\t\t\t\tattributeMaterial.weightRGB = material.weightRGB;\n\t\t\t\tattributeMaterial.weightClassification = material.weightClassification;\n\t\t\t\tattributeMaterial.weightReturnNumber = material.weightReturnNumber;\n\t\t\t\tattributeMaterial.weightSourceID = material.weightSourceID;\n\n\t\t\t\tattributeMaterial.color = material.color;\n\n\t\t\t\tattributeMaterial.clipTask = material.clipTask;\n\t\t\t\tattributeMaterial.clipMethod = material.clipMethod;\n\t\t\t\tattributeMaterial.setClipBoxes(material.clipBoxes);\n\t\t\t\tattributeMaterial.setClipPolygons(material.clipPolygons);\n\n\t\t\t\tpointcloud.material = attributeMaterial;\n\t\t\t}\n\t\t\t\n\t\t\tlet gl = this.gl;\n\n\t\t\tviewer.renderer.setRenderTarget(null);\n\t\t\tviewer.pRenderer.render(viewer.scene.scenePointCloud, camera, this.rtAttribute, {\n\t\t\t\tclipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)),\n\t\t\t\t//material: this.attributeMaterial,\n\t\t\t\tblendFunc: [gl.SRC_ALPHA, gl.ONE],\n\t\t\t\t//depthTest: false,\n\t\t\t\tdepthWrite: false\n\t\t\t});\n\t\t}\n\n\t\tfor(let [pointcloud, material] of originalMaterials){\n\t\t\tpointcloud.material = material;\n\t\t}\n\n\t\tviewer.renderer.setRenderTarget(null);\n\t\tif(viewer.background === \"skybox\"){\n\t\t\tviewer.renderer.setClearColor(0x000000, 0);\n\t\t\tviewer.renderer.clear();\n\t\t\tviewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation);\n\t\t\tviewer.skybox.camera.fov = viewer.scene.cameraP.fov;\n\t\t\tviewer.skybox.camera.aspect = viewer.scene.cameraP.aspect;\n\t\t\t\n\t\t\tviewer.skybox.parent.rotation.x = 0;\n\t\t\tviewer.skybox.parent.updateMatrixWorld();\n\n\t\t\tviewer.skybox.camera.updateProjectionMatrix();\n\t\t\tviewer.renderer.render(viewer.skybox.scene, viewer.skybox.camera);\n\t\t} else if (viewer.background === 'gradient') {\n\t\t\tviewer.renderer.setClearColor(0x000000, 0);\n\t\t\tviewer.renderer.clear();\n\t\t\tviewer.renderer.render(viewer.scene.sceneBG, viewer.scene.cameraBG);\n\t\t} else if (viewer.background === 'black') {\n\t\t\tviewer.renderer.setClearColor(0x000000, 1);\n\t\t\tviewer.renderer.clear();\n\t\t} else if (viewer.background === 'white') {\n\t\t\tviewer.renderer.setClearColor(0xFFFFFF, 1);\n\t\t\tviewer.renderer.clear();\n\t\t} else {\n\t\t\tviewer.renderer.setClearColor(0x000000, 0);\n\t\t\tviewer.renderer.clear();\n\t\t}\n\n\t\t{ // NORMALIZATION PASS\n\t\t\tlet normalizationMaterial = this.useEDL ? this.normalizationEDLMaterial : this.normalizationMaterial;\n\n\t\t\tif(this.useEDL){\n\t\t\t\tnormalizationMaterial.uniforms.edlStrength.value = viewer.edlStrength;\n\t\t\t\tnormalizationMaterial.uniforms.radius.value = viewer.edlRadius;\n\t\t\t\tnormalizationMaterial.uniforms.screenWidth.value = width;\n\t\t\t\tnormalizationMaterial.uniforms.screenHeight.value = height;\n\t\t\t\tnormalizationMaterial.uniforms.uEDLMap.value = this.rtDepth.texture;\n\t\t\t}\n\n\t\t\tnormalizationMaterial.uniforms.uWeightMap.value = this.rtAttribute.texture;\n\t\t\tnormalizationMaterial.uniforms.uDepthMap.value = this.rtAttribute.depthTexture;\n\t\t\t\n\t\t\tUtils.screenPass.render(viewer.renderer, normalizationMaterial);\n\t\t}\n\n\t\tviewer.renderer.render(viewer.scene.scene, camera);\n\n\t\tviewer.dispatchEvent({type: \"render.pass.scene\", viewer: viewer});\n\n\t\tviewer.renderer.clearDepth();\n\n\t\tviewer.transformationTool.update();\n\n\t\tviewer.dispatchEvent({type: \"render.pass.perspective_overlay\",viewer: viewer});\n\n\t\tviewer.renderer.render(viewer.controls.sceneControls, camera);\n\t\tviewer.renderer.render(viewer.clippingTool.sceneVolume, camera);\n\t\tviewer.renderer.render(viewer.transformationTool.scene, camera);\n\n\t\tviewer.renderer.setViewport(width - viewer.navigationCube.width, \n\t\t\t\t\t\t\t\t\theight - viewer.navigationCube.width, \n\t\t\t\t\t\t\t\t\tviewer.navigationCube.width, viewer.navigationCube.width);\n\t\tviewer.renderer.render(viewer.navigationCube, viewer.navigationCube.camera);\t\t\n\t\tviewer.renderer.setViewport(0, 0, width, height);\n\t\t\n\t\tviewer.dispatchEvent({type: \"render.pass.end\",viewer: viewer});\n\n\t}\n\n}\n\n","import * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nexport class View{\n\tconstructor () {\n\t\tthis.position = new THREE.Vector3(0, 0, 0);\n\n\t\tthis.yaw = Math.PI / 4;\n\t\tthis._pitch = -Math.PI / 4;\n\t\tthis.radius = 1;\n\n\t\tthis.maxPitch = Math.PI / 2;\n\t\tthis.minPitch = -Math.PI / 2;\n\t}\n\n\tclone () {\n\t\tlet c = new View();\n\t\tc.yaw = this.yaw;\n\t\tc._pitch = this.pitch;\n\t\tc.radius = this.radius;\n\t\tc.maxPitch = this.maxPitch;\n\t\tc.minPitch = this.minPitch;\n\n\t\treturn c;\n\t}\n\n\tget pitch () {\n\t\treturn this._pitch;\n\t}\n\n\tset pitch (angle) {\n\t\tthis._pitch = Math.max(Math.min(angle, this.maxPitch), this.minPitch);\n\t}\n\n\tget direction () {\n\t\tlet dir = new THREE.Vector3(0, 1, 0);\n\n\t\tdir.applyAxisAngle(new THREE.Vector3(1, 0, 0), this.pitch);\n\t\tdir.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\treturn dir;\n\t}\n\n\tset direction (dir) {\n\n\t\t//if(dir.x === dir.y){\n\t\tif(dir.x === 0 && dir.y === 0){\n\t\t\tthis.pitch = Math.PI / 2 * Math.sign(dir.z);\n\t\t}else{\n\t\t\tlet yaw = Math.atan2(dir.y, dir.x) - Math.PI / 2;\n\t\t\tlet pitch = Math.atan2(dir.z, Math.sqrt(dir.x * dir.x + dir.y * dir.y));\n\n\t\t\tthis.yaw = yaw;\n\t\t\tthis.pitch = pitch;\n\t\t}\n\t\t\n\t}\n\n\tlookAt(t){\n\t\tlet V;\n\t\tif(arguments.length === 1){\n\t\t\tV = new THREE.Vector3().subVectors(t, this.position);\n\t\t}else if(arguments.length === 3){\n\t\t\tV = new THREE.Vector3().subVectors(new THREE.Vector3(...arguments), this.position);\n\t\t}\n\n\t\tlet radius = V.length();\n\t\tlet dir = V.normalize();\n\n\t\tthis.radius = radius;\n\t\tthis.direction = dir;\n\t}\n\n\tgetPivot () {\n\t\treturn new THREE.Vector3().addVectors(this.position, this.direction.multiplyScalar(this.radius));\n\t}\n\n\tgetSide () {\n\t\tlet side = new THREE.Vector3(1, 0, 0);\n\t\tside.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\treturn side;\n\t}\n\n\tpan (x, y) {\n\t\tlet dir = new THREE.Vector3(0, 1, 0);\n\t\tdir.applyAxisAngle(new THREE.Vector3(1, 0, 0), this.pitch);\n\t\tdir.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\t// let side = new THREE.Vector3(1, 0, 0);\n\t\t// side.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\tlet side = this.getSide();\n\n\t\tlet up = side.clone().cross(dir);\n\n\t\tlet pan = side.multiplyScalar(x).add(up.multiplyScalar(y));\n\n\t\tthis.position = this.position.add(pan);\n\t\t// this.target = this.target.add(pan);\n\t}\n\n\ttranslate (x, y, z) {\n\t\tlet dir = new THREE.Vector3(0, 1, 0);\n\t\tdir.applyAxisAngle(new THREE.Vector3(1, 0, 0), this.pitch);\n\t\tdir.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\tlet side = new THREE.Vector3(1, 0, 0);\n\t\tside.applyAxisAngle(new THREE.Vector3(0, 0, 1), this.yaw);\n\n\t\tlet up = side.clone().cross(dir);\n\n\t\tlet t = side.multiplyScalar(x)\n\t\t\t.add(dir.multiplyScalar(y))\n\t\t\t.add(up.multiplyScalar(z));\n\n\t\tthis.position = this.position.add(t);\n\t}\n\n\ttranslateWorld (x, y, z) {\n\t\tthis.position.x += x;\n\t\tthis.position.y += y;\n\t\tthis.position.z += z;\n\t}\n\n\tsetView(position, target, duration = 0, callback = null){\n\n\t\tlet endPosition = null;\n\t\tif(position instanceof Array){\n\t\t\tendPosition = new THREE.Vector3(...position);\n\t\t}else if(position.x != null){\n\t\t\tendPosition = position.clone();\n\t\t}\n\n\t\tlet endTarget = null;\n\t\tif(target instanceof Array){\n\t\t\tendTarget = new THREE.Vector3(...target);\n\t\t}else if(target.x != null){\n\t\t\tendTarget = target.clone();\n\t\t}\n\t\t\n\t\tconst startPosition = this.position.clone();\n\t\tconst startTarget = this.getPivot();\n\n\t\t//const endPosition = position.clone();\n\t\t//const endTarget = target.clone();\n\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\tif(duration === 0){\n\t\t\tthis.position.copy(endPosition);\n\t\t\tthis.lookAt(endTarget);\n\t\t}else{\n\t\t\tlet value = {x: 0};\n\t\t\tlet tween = new TWEEN.Tween(value).to({x: 1}, duration);\n\t\t\ttween.easing(easing);\n\t\t\t//this.tweens.push(tween);\n\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tlet t = value.x;\n\n\t\t\t\t//console.log(t);\n\n\t\t\t\tconst pos = new THREE.Vector3(\n\t\t\t\t\t(1 - t) * startPosition.x + t * endPosition.x,\n\t\t\t\t\t(1 - t) * startPosition.y + t * endPosition.y,\n\t\t\t\t\t(1 - t) * startPosition.z + t * endPosition.z,\n\t\t\t\t);\n\n\t\t\t\tconst target = new THREE.Vector3(\n\t\t\t\t\t(1 - t) * startTarget.x + t * endTarget.x,\n\t\t\t\t\t(1 - t) * startTarget.y + t * endTarget.y,\n\t\t\t\t\t(1 - t) * startTarget.z + t * endTarget.z,\n\t\t\t\t);\n\n\t\t\t\tthis.position.copy(pos);\n\t\t\t\tthis.lookAt(target);\n\n\t\t\t});\n\n\t\t\ttween.start();\n\n\t\t\ttween.onComplete(() => {\n\t\t\t\tif(callback){\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t}\n\n};\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Annotation} from \"../Annotation.js\";\nimport {CameraMode} from \"../defines.js\";\nimport {View} from \"./View.js\";\nimport {Utils} from \"../utils.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\n\nexport class Scene extends EventDispatcher{\n\n\tconstructor(){\n\t\tsuper();\n\n\t\tthis.annotations = new Annotation();\n\t\t\n\t\tthis.scene = new THREE.Scene();\n\t\tthis.sceneBG = new THREE.Scene();\n\t\tthis.scenePointCloud = new THREE.Scene();\n\n\t\tthis.cameraP = new THREE.PerspectiveCamera(this.fov, 1, 0.1, 1000*1000);\n\t\tthis.cameraO = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.1, 1000*1000);\n\t\tthis.cameraVR = new THREE.PerspectiveCamera();\n\t\tthis.cameraBG = new THREE.Camera();\n\t\tthis.cameraScreenSpace = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.1, 10);\n\t\tthis.cameraMode = CameraMode.PERSPECTIVE;\n\t\tthis.overrideCamera = null;\n\t\tthis.pointclouds = [];\n\n\t\tthis.measurements = [];\n\t\tthis.profiles = [];\n\t\tthis.volumes = [];\n\t\tthis.polygonClipVolumes = [];\n\t\tthis.cameraAnimations = [];\n\t\tthis.orientedImages = [];\n\t\tthis.images360 = [];\n\t\tthis.geopackages = [];\n\t\t\n\t\tthis.fpControls = null;\n\t\tthis.orbitControls = null;\n\t\tthis.earthControls = null;\n\t\tthis.geoControls = null;\n\t\tthis.deviceControls = null;\n\t\tthis.inputHandler = null;\n\n\t\tthis.view = new View();\n\n\t\tthis.directionalLight = null;\n\n\t\tthis.initialize();\n\t}\n\n\testimateHeightAt (position) {\n\t\tlet height = null;\n\t\tlet fromSpacing = Infinity;\n\n\t\tfor (let pointcloud of this.pointclouds) {\n\t\t\tif (pointcloud.root.geometryNode === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet pHeight = null;\n\t\t\tlet pFromSpacing = Infinity;\n\n\t\t\tlet lpos = position.clone().sub(pointcloud.position);\n\t\t\tlpos.z = 0;\n\t\t\tlet ray = new THREE.Ray(lpos, new THREE.Vector3(0, 0, 1));\n\n\t\t\tlet stack = [pointcloud.root];\n\t\t\twhile (stack.length > 0) {\n\t\t\t\tlet node = stack.pop();\n\t\t\t\tlet box = node.getBoundingBox();\n\n\t\t\t\tlet inside = ray.intersectBox(box);\n\n\t\t\t\tif (!inside) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet h = node.geometryNode.mean.z +\n\t\t\t\t\tpointcloud.position.z +\n\t\t\t\t\tnode.geometryNode.boundingBox.min.z;\n\n\t\t\t\tif (node.geometryNode.spacing <= pFromSpacing) {\n\t\t\t\t\tpHeight = h;\n\t\t\t\t\tpFromSpacing = node.geometryNode.spacing;\n\t\t\t\t}\n\n\t\t\t\tfor (let index of Object.keys(node.children)) {\n\t\t\t\t\tlet child = node.children[index];\n\t\t\t\t\tif (child.geometryNode) {\n\t\t\t\t\t\tstack.push(node.children[index]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (height === null || pFromSpacing < fromSpacing) {\n\t\t\t\theight = pHeight;\n\t\t\t\tfromSpacing = pFromSpacing;\n\t\t\t}\n\t\t}\n\n\t\treturn height;\n\t}\n\t\n\tgetBoundingBox(pointclouds = this.pointclouds){\n\t\tlet box = new THREE.Box3();\n\n\t\tthis.scenePointCloud.updateMatrixWorld(true);\n\t\tthis.referenceFrame.updateMatrixWorld(true);\n\n\t\tfor (let pointcloud of pointclouds) {\n\t\t\tpointcloud.updateMatrixWorld(true);\n\n\t\t\tlet pointcloudBox = pointcloud.pcoGeometry.tightBoundingBox ? pointcloud.pcoGeometry.tightBoundingBox : pointcloud.boundingBox;\n\t\t\tlet boxWorld = Utils.computeTransformedBoundingBox(pointcloudBox, pointcloud.matrixWorld);\n\t\t\tbox.union(boxWorld);\n\t\t}\n\n\t\treturn box;\n\t}\n\n\taddPointCloud (pointcloud) {\n\t\tthis.pointclouds.push(pointcloud);\n\t\tthis.scenePointCloud.add(pointcloud);\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'pointcloud_added',\n\t\t\tpointcloud: pointcloud\n\t\t});\n\t}\n\n\taddVolume (volume) {\n\t\tthis.volumes.push(volume);\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'volume_added',\n\t\t\t'scene': this,\n\t\t\t'volume': volume\n\t\t});\n\t}\n\n\taddOrientedImages(images){\n\t\tthis.orientedImages.push(images);\n\t\tthis.scene.add(images.node);\n\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'oriented_images_added',\n\t\t\t'scene': this,\n\t\t\t'images': images\n\t\t});\n\t};\n\n\tremoveOrientedImages(images){\n\t\tlet index = this.orientedImages.indexOf(images);\n\t\tif (index > -1) {\n\t\t\tthis.orientedImages.splice(index, 1);\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'oriented_images_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'images': images\n\t\t\t});\n\t\t}\n\t};\n\n\tadd360Images(images){\n\t\tthis.images360.push(images);\n\t\tthis.scene.add(images.node);\n\n\t\tthis.dispatchEvent({\n\t\t\t'type': '360_images_added',\n\t\t\t'scene': this,\n\t\t\t'images': images\n\t\t});\n\t}\n\n\tremove360Images(images){\n\t\tlet index = this.images360.indexOf(images);\n\t\tif (index > -1) {\n\t\t\tthis.images360.splice(index, 1);\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': '360_images_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'images': images\n\t\t\t});\n\t\t}\n\t}\n\n\taddGeopackage(geopackage){\n\t\tthis.geopackages.push(geopackage);\n\t\tthis.scene.add(geopackage.node);\n\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'geopackage_added',\n\t\t\t'scene': this,\n\t\t\t'geopackage': geopackage\n\t\t});\n\t};\n\n\tremoveGeopackage(geopackage){\n\t\tlet index = this.geopackages.indexOf(geopackage);\n\t\tif (index > -1) {\n\t\t\tthis.geopackages.splice(index, 1);\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'geopackage_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'geopackage': geopackage\n\t\t\t});\n\t\t}\n\t};\n\n\tremoveVolume (volume) {\n\t\tlet index = this.volumes.indexOf(volume);\n\t\tif (index > -1) {\n\t\t\tthis.volumes.splice(index, 1);\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'volume_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'volume': volume\n\t\t\t});\n\t\t}\n\t};\n\n\taddCameraAnimation(animation) {\n\t\tthis.cameraAnimations.push(animation);\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'camera_animation_added',\n\t\t\t'scene': this,\n\t\t\t'animation': animation\n\t\t});\n\t};\n\n\tremoveCameraAnimation(animation){\n\t\tlet index = this.cameraAnimations.indexOf(volume);\n\t\tif (index > -1) {\n\t\t\tthis.cameraAnimations.splice(index, 1);\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'camera_animation_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'animation': animation\n\t\t\t});\n\t\t}\n\t};\n\n\taddPolygonClipVolume(volume){\n\t\tthis.polygonClipVolumes.push(volume);\n\t\tthis.dispatchEvent({\n\t\t\t\"type\": \"polygon_clip_volume_added\",\n\t\t\t\"scene\": this,\n\t\t\t\"volume\": volume\n\t\t});\n\t};\n\t\n\tremovePolygonClipVolume(volume){\n\t\tlet index = this.polygonClipVolumes.indexOf(volume);\n\t\tif (index > -1) {\n\t\t\tthis.polygonClipVolumes.splice(index, 1);\n\t\t\tthis.dispatchEvent({\n\t\t\t\t\"type\": \"polygon_clip_volume_removed\",\n\t\t\t\t\"scene\": this,\n\t\t\t\t\"volume\": volume\n\t\t\t});\n\t\t}\n\t};\n\t\n\taddMeasurement(measurement){\n\t\tmeasurement.lengthUnit = this.lengthUnit;\n\t\tmeasurement.lengthUnitDisplay = this.lengthUnitDisplay;\n\t\tthis.measurements.push(measurement);\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'measurement_added',\n\t\t\t'scene': this,\n\t\t\t'measurement': measurement\n\t\t});\n\t};\n\n\tremoveMeasurement (measurement) {\n\t\tlet index = this.measurements.indexOf(measurement);\n\t\tif (index > -1) {\n\t\t\tthis.measurements.splice(index, 1);\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'measurement_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'measurement': measurement\n\t\t\t});\n\t\t}\n\t}\n\n\taddProfile (profile) {\n\t\tthis.profiles.push(profile);\n\t\tthis.dispatchEvent({\n\t\t\t'type': 'profile_added',\n\t\t\t'scene': this,\n\t\t\t'profile': profile\n\t\t});\n\t}\n\n\tremoveProfile (profile) {\n\t\tlet index = this.profiles.indexOf(profile);\n\t\tif (index > -1) {\n\t\t\tthis.profiles.splice(index, 1);\n\t\t\tthis.dispatchEvent({\n\t\t\t\t'type': 'profile_removed',\n\t\t\t\t'scene': this,\n\t\t\t\t'profile': profile\n\t\t\t});\n\t\t}\n\t}\n\n\tremoveAllMeasurements () {\n\t\twhile (this.measurements.length > 0) {\n\t\t\tthis.removeMeasurement(this.measurements[0]);\n\t\t}\n\n\t\twhile (this.profiles.length > 0) {\n\t\t\tthis.removeProfile(this.profiles[0]);\n\t\t}\n\n\t\twhile (this.volumes.length > 0) {\n\t\t\tthis.removeVolume(this.volumes[0]);\n\t\t}\n\t}\n\n\tremoveAllClipVolumes(){\n\t\tlet clipVolumes = this.volumes.filter(volume => volume.clip === true);\n\t\tfor(let clipVolume of clipVolumes){\n\t\t\tthis.removeVolume(clipVolume);\n\t\t}\n\n\t\twhile(this.polygonClipVolumes.length > 0){\n\t\t\tthis.removePolygonClipVolume(this.polygonClipVolumes[0]);\n\t\t}\n\t}\n\n\tgetActiveCamera() {\n\n\t\tif(this.overrideCamera){\n\t\t\treturn this.overrideCamera;\n\t\t}\n\n\t\tif(this.cameraMode === CameraMode.PERSPECTIVE){\n\t\t\treturn this.cameraP;\n\t\t}else if(this.cameraMode === CameraMode.ORTHOGRAPHIC){\n\t\t\treturn this.cameraO;\n\t\t}else if(this.cameraMode === CameraMode.VR){\n\t\t\treturn this.cameraVR;\n\t\t}\n\n\t\treturn null;\n\t}\n\t\n\tinitialize(){\n\t\t\n\t\tthis.referenceFrame = new THREE.Object3D();\n\t\tthis.referenceFrame.matrixAutoUpdate = false;\n\t\tthis.scenePointCloud.add(this.referenceFrame);\n\n\t\tthis.cameraP.up.set(0, 0, 1);\n\t\tthis.cameraP.position.set(1000, 1000, 1000);\n\t\tthis.cameraO.up.set(0, 0, 1);\n\t\tthis.cameraO.position.set(1000, 1000, 1000);\n\t\t//this.camera.rotation.y = -Math.PI / 4;\n\t\t//this.camera.rotation.x = -Math.PI / 6;\n\t\tthis.cameraScreenSpace.lookAt(new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, -1), new THREE.Vector3(0, 1, 0));\n\t\t\n\t\tthis.directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );\n\t\tthis.directionalLight.position.set( 10, 10, 10 );\n\t\tthis.directionalLight.lookAt( new THREE.Vector3(0, 0, 0));\n\t\tthis.scenePointCloud.add( this.directionalLight );\n\t\t\n\t\tlet light = new THREE.AmbientLight( 0x555555 ); // soft white light\n\t\tthis.scenePointCloud.add( light );\n\n\t\t{ // background\n\t\t\tlet texture = Utils.createBackgroundTexture(512, 512);\n\n\t\t\ttexture.minFilter = texture.magFilter = THREE.NearestFilter;\n\t\t\ttexture.minFilter = texture.magFilter = THREE.LinearFilter;\n\t\t\tlet bg = new THREE.Mesh(\n\t\t\t\tnew THREE.PlaneBufferGeometry(2, 2, 1),\n\t\t\t\tnew THREE.MeshBasicMaterial({\n\t\t\t\t\tmap: texture\n\t\t\t\t})\n\t\t\t);\n\t\t\tbg.material.depthTest = false;\n\t\t\tbg.material.depthWrite = false;\n\t\t\tthis.sceneBG.add(bg);\n\t\t}\n\n\t\t// { // lights\n\t\t// \t{\n\t\t// \t\tlet light = new THREE.DirectionalLight(0xffffff);\n\t\t// \t\tlight.position.set(10, 10, 1);\n\t\t// \t\tlight.target.position.set(0, 0, 0);\n\t\t// \t\tthis.scene.add(light);\n\t\t// \t}\n\n\t\t// \t{\n\t\t// \t\tlet light = new THREE.DirectionalLight(0xffffff);\n\t\t// \t\tlight.position.set(-10, 10, 1);\n\t\t// \t\tlight.target.position.set(0, 0, 0);\n\t\t// \t\tthis.scene.add(light);\n\t\t// \t}\n\n\t\t// \t{\n\t\t// \t\tlet light = new THREE.DirectionalLight(0xffffff);\n\t\t// \t\tlight.position.set(0, -10, 20);\n\t\t// \t\tlight.target.position.set(0, 0, 0);\n\t\t// \t\tthis.scene.add(light);\n\t\t// \t}\n\t\t// }\n\t}\n\t\n\taddAnnotation(position, args = {}){\t\t\n\t\tif(position instanceof Array){\n\t\t\targs.position = new THREE.Vector3().fromArray(position);\n\t\t} else if (position.x != null) {\n\t\t\targs.position = position;\n\t\t}\n\t\tlet annotation = new Annotation(args);\n\t\tthis.annotations.add(annotation);\n\n\t\treturn annotation;\n\t}\n\n\tgetAnnotations () {\n\t\treturn this.annotations;\n\t};\n\n\tremoveAnnotation(annotationToRemove) {\n\t\tthis.annotations.remove(annotationToRemove);\n\t}\n};\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\n// http://epsg.io/\nproj4.defs([\n\t['UTM10N', '+proj=utm +zone=10 +ellps=GRS80 +datum=NAD83 +units=m +no_defs'],\n\t['EPSG:6339', '+proj=utm +zone=10 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6340', '+proj=utm +zone=11 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6341', '+proj=utm +zone=12 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6342', '+proj=utm +zone=13 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6343', '+proj=utm +zone=14 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6344', '+proj=utm +zone=15 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6345', '+proj=utm +zone=16 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6346', '+proj=utm +zone=17 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6347', '+proj=utm +zone=18 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:6348', '+proj=utm +zone=19 +ellps=GRS80 +units=m +no_defs'],\n\t['EPSG:26910', '+proj=utm +zone=10 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26911', '+proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26912', '+proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26913', '+proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26914', '+proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26915', '+proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26916', '+proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26917', '+proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26918', '+proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n\t['EPSG:26919', '+proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '],\n]);\n\nexport class MapView{\n\n\tconstructor (viewer) {\n\t\tthis.viewer = viewer;\n\n\t\tthis.webMapService = 'WMTS';\n\t\tthis.mapProjectionName = 'EPSG:3857';\n\t\tthis.mapProjection = proj4.defs(this.mapProjectionName);\n\t\tthis.sceneProjection = null;\n\n\t\tthis.extentsLayer = null;\n\t\tthis.cameraLayer = null;\n\t\tthis.toolLayer = null;\n\t\tthis.sourcesLayer = null;\n\t\tthis.sourcesLabelLayer = null;\n\t\tthis.images360Layer = null;\n\t\tthis.enabled = false;\n\n\t\tthis.createAnnotationStyle = (text) => {\n\t\t\treturn [\n\t\t\t\tnew ol.style.Style({\n\t\t\t\t\timage: new ol.style.Circle({\n\t\t\t\t\t\tradius: 10,\n\t\t\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\t\t\tcolor: [255, 255, 255, 0.5],\n\t\t\t\t\t\t\twidth: 2\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\t\t\tcolor: [0, 0, 0, 0.5]\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t];\n\t\t};\n\n\t\tthis.createLabelStyle = (text) => {\n\t\t\tlet style = new ol.style.Style({\n\t\t\t\timage: new ol.style.Circle({\n\t\t\t\t\tradius: 6,\n\t\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\t\tcolor: 'white',\n\t\t\t\t\t\twidth: 2\n\t\t\t\t\t}),\n\t\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\t\tcolor: 'green'\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t\ttext: new ol.style.Text({\n\t\t\t\t\tfont: '12px helvetica,sans-serif',\n\t\t\t\t\ttext: text,\n\t\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\t\tcolor: '#000'\n\t\t\t\t\t}),\n\t\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\twidth: 2\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t});\n\n\t\t\treturn style;\n\t\t};\n\t}\n\n\tshowSources (show) {\n\t\tthis.sourcesLayer.setVisible(show);\n\t\tthis.sourcesLabelLayer.setVisible(show);\n\t}\n\n\tinit () {\n\n\t\tif(typeof ol === \"undefined\"){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.elMap = $('#potree_map');\n\t\tthis.elMap.draggable({ handle: $('#potree_map_header') });\n\t\tthis.elMap.resizable();\n\n\t\tthis.elTooltip = $(`
    `);\n\t\tthis.elMap.append(this.elTooltip);\n\n\t\tlet extentsLayer = this.getExtentsLayer();\n\t\tlet cameraLayer = this.getCameraLayer();\n\t\tthis.getToolLayer();\n\t\tlet sourcesLayer = this.getSourcesLayer();\n\t\tthis.images360Layer = this.getImages360Layer();\n\t\tthis.getSourcesLabelLayer();\n\t\tthis.getAnnotationsLayer();\n\n\t\tlet mousePositionControl = new ol.control.MousePosition({\n\t\t\tcoordinateFormat: ol.coordinate.createStringXY(5),\n\t\t\tprojection: 'EPSG:4326',\n\t\t\tundefinedHTML: ' '\n\t\t});\n\n\t\tlet _this = this;\n\t\tlet DownloadSelectionControl = function (optOptions) {\n\t\t\tlet options = optOptions || {};\n\n\t\t\t// TOGGLE TILES\n\t\t\tlet btToggleTiles = document.createElement('button');\n\t\t\tbtToggleTiles.innerHTML = 'T';\n\t\t\tbtToggleTiles.addEventListener('click', () => {\n\t\t\t\tlet visible = sourcesLayer.getVisible();\n\t\t\t\t_this.showSources(!visible);\n\t\t\t}, false);\n\t\t\tbtToggleTiles.style.float = 'left';\n\t\t\tbtToggleTiles.title = 'show / hide tiles';\n\n\t\t\t// DOWNLOAD SELECTED TILES\n\t\t\tlet link = document.createElement('a');\n\t\t\tlink.href = '#';\n\t\t\tlink.download = 'list.txt';\n\t\t\tlink.style.float = 'left';\n\n\t\t\tlet button = document.createElement('button');\n\t\t\tbutton.innerHTML = 'D';\n\t\t\tlink.appendChild(button);\n\n\t\t\tlet handleDownload = (e) => {\n\t\t\t\tlet features = selectedFeatures.getArray();\n\n\t\t\t\tlet url = [document.location.protocol, '//', document.location.host, document.location.pathname].join('');\n\n\t\t\t\tif (features.length === 0) {\n\t\t\t\t\talert('No tiles were selected. Select area with ctrl + left mouse button!');\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t} else if (features.length === 1) {\n\t\t\t\t\tlet feature = features[0];\n\n\t\t\t\t\tif (feature.source) {\n\t\t\t\t\t\tlet cloudjsurl = feature.pointcloud.pcoGeometry.url;\n\t\t\t\t\t\tlet sourceurl = new URL(url + '/../' + cloudjsurl + '/../source/' + feature.source.name);\n\t\t\t\t\t\tlink.href = sourceurl.href;\n\t\t\t\t\t\tlink.download = feature.source.name;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlet content = '';\n\t\t\t\t\tfor (let i = 0; i < features.length; i++) {\n\t\t\t\t\t\tlet feature = features[i];\n\n\t\t\t\t\t\tif (feature.source) {\n\t\t\t\t\t\t\tlet cloudjsurl = feature.pointcloud.pcoGeometry.url;\n\t\t\t\t\t\t\tlet sourceurl = new URL(url + '/../' + cloudjsurl + '/../source/' + feature.source.name);\n\t\t\t\t\t\t\tcontent += sourceurl.href + '\\n';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet uri = 'data:application/octet-stream;base64,' + btoa(content);\n\t\t\t\t\tlink.href = uri;\n\t\t\t\t\tlink.download = 'list_of_files.txt';\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tbutton.addEventListener('click', handleDownload, false);\n\n\t\t\t// assemble container\n\t\t\tlet element = document.createElement('div');\n\t\t\telement.className = 'ol-unselectable ol-control';\n\t\t\telement.appendChild(link);\n\t\t\telement.appendChild(btToggleTiles);\n\t\t\telement.style.bottom = '0.5em';\n\t\t\telement.style.left = '0.5em';\n\t\t\telement.title = 'Download file or list of selected tiles. Select tile with left mouse button or area using ctrl + left mouse.';\n\n\t\t\tol.control.Control.call(this, {\n\t\t\t\telement: element,\n\t\t\t\ttarget: options.target\n\t\t\t});\n\t\t};\n\t\tol.inherits(DownloadSelectionControl, ol.control.Control);\n\n\t\tthis.map = new ol.Map({\n\t\t\tcontrols: ol.control.defaults({\n\t\t\t\tattributionOptions: ({\n\t\t\t\t\tcollapsible: false\n\t\t\t\t})\n\t\t\t}).extend([\n\t\t\t\t// this.controls.zoomToExtent,\n\t\t\t\tnew DownloadSelectionControl(),\n\t\t\t\tmousePositionControl\n\t\t\t]),\n\t\t\tlayers: [\n\t\t\t\tnew ol.layer.Tile({source: new ol.source.OSM()}),\n\t\t\t\tthis.toolLayer,\n\t\t\t\tthis.annotationsLayer,\n\t\t\t\tthis.sourcesLayer,\n\t\t\t\tthis.sourcesLabelLayer,\n\t\t\t\tthis.images360Layer,\n\t\t\t\textentsLayer,\n\t\t\t\tcameraLayer\n\t\t\t],\n\t\t\ttarget: 'potree_map_content',\n\t\t\tview: new ol.View({\n\t\t\t\tcenter: this.olCenter,\n\t\t\t\tzoom: 9\n\t\t\t})\n\t\t});\n\n\t\t// DRAGBOX / SELECTION\n\t\tthis.dragBoxLayer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({}),\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: 'rgba(0, 0, 255, 1)',\n\t\t\t\t\twidth: 2\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\t\tthis.map.addLayer(this.dragBoxLayer);\n\n\t\tlet select = new ol.interaction.Select();\n\t\tthis.map.addInteraction(select);\n\n\t\tlet selectedFeatures = select.getFeatures();\n\n\t\tlet dragBox = new ol.interaction.DragBox({\n\t\t\tcondition: ol.events.condition.platformModifierKeyOnly\n\t\t});\n\n\t\tthis.map.addInteraction(dragBox);\n\n\t\t// this.map.on('pointermove', evt => {\n\t\t// \tlet pixel = evt.pixel;\n\t\t// \tlet feature = this.map.forEachFeatureAtPixel(pixel, function (feature) {\n\t\t// \t\treturn feature;\n\t\t// \t});\n\n\t\t// \t// console.log(feature);\n\t\t// \t// this.elTooltip.css(\"display\", feature ? '' : 'none');\n\t\t// \tthis.elTooltip.css('display', 'none');\n\t\t// \tif (feature && feature.onHover) {\n\t\t// \t\tfeature.onHover(evt);\n\t\t// \t\t// overlay.setPosition(evt.coordinate);\n\t\t// \t\t// tooltip.innerHTML = feature.get('name');\n\t\t// \t}\n\t\t// });\n\n\t\tthis.map.on('click', evt => {\n\t\t\tlet pixel = evt.pixel;\n\t\t\tlet feature = this.map.forEachFeatureAtPixel(pixel, function (feature) {\n\t\t\t\treturn feature;\n\t\t\t});\n\n\t\t\tif (feature && feature.onClick) {\n\t\t\t\tfeature.onClick(evt);\n\t\t\t}\n\t\t});\n\n\t\tdragBox.on('boxend', (e) => {\n\t\t\t// features that intersect the box are added to the collection of\n\t\t\t// selected features, and their names are displayed in the \"info\"\n\t\t\t// div\n\t\t\tlet extent = dragBox.getGeometry().getExtent();\n\t\t\tthis.getSourcesLayer().getSource().forEachFeatureIntersectingExtent(extent, (feature) => {\n\t\t\t\tselectedFeatures.push(feature);\n\t\t\t});\n\t\t});\n\n\t\t// clear selection when drawing a new box and when clicking on the map\n\t\tdragBox.on('boxstart', (e) => {\n\t\t\tselectedFeatures.clear();\n\t\t});\n\t\tthis.map.on('click', () => {\n\t\t\tselectedFeatures.clear();\n\t\t});\n\n\t\tthis.viewer.addEventListener('scene_changed', e => {\n\t\t\tthis.setScene(e.scene);\n\t\t});\n\n\t\tthis.onPointcloudAdded = e => {\n\t\t\tthis.load(e.pointcloud);\n\t\t};\n\n\t\tthis.on360ImagesAdded = e => {\n\t\t\tthis.addImages360(e.images);\n\t\t};\n\n\t\tthis.onAnnotationAdded = e => {\n\t\t\tif (!this.sceneProjection) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet annotation = e.annotation;\n\t\t\tlet position = annotation.position;\n\t\t\tlet mapPos = this.toMap.forward([position.x, position.y]);\n\t\t\tlet feature = new ol.Feature({\n\t\t\t\tgeometry: new ol.geom.Point(mapPos),\n\t\t\t\tname: annotation.title\n\t\t\t});\n\t\t\tfeature.setStyle(this.createAnnotationStyle(annotation.title));\n\n\t\t\tfeature.onHover = evt => {\n\t\t\t\tlet coordinates = feature.getGeometry().getCoordinates();\n\t\t\t\tlet p = this.map.getPixelFromCoordinate(coordinates);\n\n\t\t\t\tthis.elTooltip.html(annotation.title);\n\t\t\t\tthis.elTooltip.css('display', '');\n\t\t\t\tthis.elTooltip.css('left', `${p[0]}px`);\n\t\t\t\tthis.elTooltip.css('top', `${p[1]}px`);\n\t\t\t};\n\n\t\t\tfeature.onClick = evt => {\n\t\t\t\tannotation.clickTitle();\n\t\t\t};\n\n\t\t\tthis.getAnnotationsLayer().getSource().addFeature(feature);\n\t\t};\n\n\t\tthis.setScene(this.viewer.scene);\n\t}\n\n\tsetScene (scene) {\n\t\tif (this.scene === scene) {\n\t\t\treturn;\n\t\t};\n\n\t\tif (this.scene) {\n\t\t\tthis.scene.removeEventListener('pointcloud_added', this.onPointcloudAdded);\n\t\t\tthis.scene.removeEventListener('360_images_added', this.on360ImagesAdded);\n\t\t\tthis.scene.annotations.removeEventListener('annotation_added', this.onAnnotationAdded);\n\t\t}\n\n\t\tthis.scene = scene;\n\n\t\tthis.scene.addEventListener('pointcloud_added', this.onPointcloudAdded);\n\t\tthis.scene.addEventListener('360_images_added', this.on360ImagesAdded);\n\t\tthis.scene.annotations.addEventListener('annotation_added', this.onAnnotationAdded);\n\n\t\tfor (let pointcloud of this.viewer.scene.pointclouds) {\n\t\t\tthis.load(pointcloud);\n\t\t}\n\n\t\tthis.viewer.scene.annotations.traverseDescendants(annotation => {\n\t\t\tthis.onAnnotationAdded({annotation: annotation});\n\t\t});\n\n\t\tfor(let images of this.viewer.scene.images360){\n\t\t\tthis.on360ImagesAdded({images: images});\n\t\t}\n\t}\n\n\tgetExtentsLayer () {\n\t\tif (this.extentsLayer) {\n\t\t\treturn this.extentsLayer;\n\t\t}\n\n\t\tthis.gExtent = new ol.geom.LineString([[0, 0], [0, 0]]);\n\n\t\tlet feature = new ol.Feature(this.gExtent);\n\t\tlet featureVector = new ol.source.Vector({\n\t\t\tfeatures: [feature]\n\t\t});\n\n\t\tthis.extentsLayer = new ol.layer.Vector({\n\t\t\tsource: featureVector,\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: 'rgba(255, 255, 255, 0.2)'\n\t\t\t\t}),\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: '#0000ff',\n\t\t\t\t\twidth: 2\n\t\t\t\t}),\n\t\t\t\timage: new ol.style.Circle({\n\t\t\t\t\tradius: 3,\n\t\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\t\tcolor: '#0000ff'\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\n\t\treturn this.extentsLayer;\n\t}\n\n\tgetAnnotationsLayer () {\n\t\tif (this.annotationsLayer) {\n\t\t\treturn this.annotationsLayer;\n\t\t}\n\n\t\tthis.annotationsLayer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({\n\t\t\t}),\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 1)'\n\t\t\t\t}),\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 1)',\n\t\t\t\t\twidth: 2\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\n\t\treturn this.annotationsLayer;\n\t}\n\n\tgetCameraLayer () {\n\t\tif (this.cameraLayer) {\n\t\t\treturn this.cameraLayer;\n\t\t}\n\n\t\t// CAMERA LAYER\n\t\tthis.gCamera = new ol.geom.LineString([[0, 0], [0, 0], [0, 0], [0, 0]]);\n\t\tlet feature = new ol.Feature(this.gCamera);\n\t\tlet featureVector = new ol.source.Vector({\n\t\t\tfeatures: [feature]\n\t\t});\n\n\t\tthis.cameraLayer = new ol.layer.Vector({\n\t\t\tsource: featureVector,\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: '#0000ff',\n\t\t\t\t\twidth: 2\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\n\t\treturn this.cameraLayer;\n\t}\n\n\tgetToolLayer () {\n\t\tif (this.toolLayer) {\n\t\t\treturn this.toolLayer;\n\t\t}\n\n\t\tthis.toolLayer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({\n\t\t\t}),\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 1)'\n\t\t\t\t}),\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 1)',\n\t\t\t\t\twidth: 2\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\n\t\treturn this.toolLayer;\n\t}\n\n\tgetImages360Layer(){\n\t\tif(this.images360Layer){\n\t\t\treturn this.images360Layer;\n\t\t}\n\n\t\tlet style = new ol.style.Style({\n\t\t\timage: new ol.style.Circle({\n\t\t\t\tradius: 4,\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: [255, 0, 0, 1],\n\t\t\t\t\twidth: 2\n\t\t\t\t}),\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: [255, 100, 100, 1]\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\t\t\n\t\tlet layer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({}),\n\t\t\tstyle: style,\n\t\t});\n\n\t\tthis.images360Layer = layer;\n\n\t\treturn this.images360Layer;\n\t}\n\n\tgetSourcesLayer () {\n\t\tif (this.sourcesLayer) {\n\t\t\treturn this.sourcesLayer;\n\t\t}\n\n\t\tthis.sourcesLayer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({}),\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: 'rgba(0, 0, 150, 0.1)'\n\t\t\t\t}),\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: 'rgba(0, 0, 150, 1)',\n\t\t\t\t\twidth: 1\n\t\t\t\t})\n\t\t\t})\n\t\t});\n\n\t\treturn this.sourcesLayer;\n\t}\n\n\tgetSourcesLabelLayer () {\n\t\tif (this.sourcesLabelLayer) {\n\t\t\treturn this.sourcesLabelLayer;\n\t\t}\n\n\t\tthis.sourcesLabelLayer = new ol.layer.Vector({\n\t\t\tsource: new ol.source.Vector({\n\t\t\t}),\n\t\t\tstyle: new ol.style.Style({\n\t\t\t\tfill: new ol.style.Fill({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 0.1)'\n\t\t\t\t}),\n\t\t\t\tstroke: new ol.style.Stroke({\n\t\t\t\t\tcolor: 'rgba(255, 0, 0, 1)',\n\t\t\t\t\twidth: 2\n\t\t\t\t})\n\t\t\t}),\n\t\t\tminResolution: 0.01,\n\t\t\tmaxResolution: 20\n\t\t});\n\n\t\treturn this.sourcesLabelLayer;\n\t}\n\n\tsetSceneProjection (sceneProjection) {\n\t\tthis.sceneProjection = sceneProjection;\n\t\tthis.toMap = proj4(this.sceneProjection, this.mapProjection);\n\t\tthis.toScene = proj4(this.mapProjection, this.sceneProjection);\n\t};\n\n\tgetMapExtent () {\n\t\tlet bb = this.viewer.getBoundingBox();\n\n\t\tlet bottomLeft = this.toMap.forward([bb.min.x, bb.min.y]);\n\t\tlet bottomRight = this.toMap.forward([bb.max.x, bb.min.y]);\n\t\tlet topRight = this.toMap.forward([bb.max.x, bb.max.y]);\n\t\tlet topLeft = this.toMap.forward([bb.min.x, bb.max.y]);\n\n\t\tlet extent = {\n\t\t\tbottomLeft: bottomLeft,\n\t\t\tbottomRight: bottomRight,\n\t\t\ttopRight: topRight,\n\t\t\ttopLeft: topLeft\n\t\t};\n\n\t\treturn extent;\n\t};\n\n\tgetMapCenter () {\n\t\tlet mapExtent = this.getMapExtent();\n\n\t\tlet mapCenter = [\n\t\t\t(mapExtent.bottomLeft[0] + mapExtent.topRight[0]) / 2,\n\t\t\t(mapExtent.bottomLeft[1] + mapExtent.topRight[1]) / 2\n\t\t];\n\n\t\treturn mapCenter;\n\t};\n\n\tupdateToolDrawings () {\n\t\tthis.toolLayer.getSource().clear();\n\n\t\tlet profiles = this.viewer.profileTool.profiles;\n\t\tfor (let i = 0; i < profiles.length; i++) {\n\t\t\tlet profile = profiles[i];\n\t\t\tlet coordinates = [];\n\n\t\t\tfor (let j = 0; j < profile.points.length; j++) {\n\t\t\t\tlet point = profile.points[j];\n\t\t\t\tlet pointMap = this.toMap.forward([point.x, point.y]);\n\t\t\t\tcoordinates.push(pointMap);\n\t\t\t}\n\n\t\t\tlet line = new ol.geom.LineString(coordinates);\n\t\t\tlet feature = new ol.Feature(line);\n\t\t\tthis.toolLayer.getSource().addFeature(feature);\n\t\t}\n\n\t\tlet measurements = this.viewer.measuringTool.measurements;\n\t\tfor (let i = 0; i < measurements.length; i++) {\n\t\t\tlet measurement = measurements[i];\n\t\t\tlet coordinates = [];\n\n\t\t\tfor (let j = 0; j < measurement.points.length; j++) {\n\t\t\t\tlet point = measurement.points[j].position;\n\t\t\t\tlet pointMap = this.toMap.forward([point.x, point.y]);\n\t\t\t\tcoordinates.push(pointMap);\n\t\t\t}\n\n\t\t\tif (measurement.closed && measurement.points.length > 0) {\n\t\t\t\tcoordinates.push(coordinates[0]);\n\t\t\t}\n\n\t\t\tlet line = new ol.geom.LineString(coordinates);\n\t\t\tlet feature = new ol.Feature(line);\n\t\t\tthis.toolLayer.getSource().addFeature(feature);\n\t\t}\n\t}\n\n\taddImages360(images){\n\t\tlet transform = this.toMap.forward;\n\t\tlet layer = this.getImages360Layer();\n\n\t\tfor(let image of images.images){\n\n\t\t\tlet p = transform([image.position[0], image.position[1]]);\n\n\t\t\tlet feature = new ol.Feature({\n\t\t\t\t'geometry': new ol.geom.Point(p),\n\t\t\t});\n\n\t\t\tfeature.onClick = () => {\n\t\t\t\timages.focus(image);\n\t\t\t};\n\n\t\t\tlayer.getSource().addFeature(feature);\n\t\t}\n\t}\n\n\tasync load (pointcloud) {\n\t\tif (!pointcloud) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!pointcloud.projection) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.sceneProjection) {\n\t\t\ttry {\n\t\t\t\tthis.setSceneProjection(pointcloud.projection);\n\t\t\t}catch (e) {\n\t\t\t\tconsole.log('Failed projection:', e);\n\n\t\t\t\tif (pointcloud.fallbackProjection) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconsole.log('Trying fallback projection...');\n\t\t\t\t\t\tthis.setSceneProjection(pointcloud.fallbackProjection);\n\t\t\t\t\t\tconsole.log('Set projection from fallback');\n\t\t\t\t\t}catch (e) {\n\t\t\t\t\t\tconsole.log('Failed fallback projection:', e);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\treturn;\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tlet mapExtent = this.getMapExtent();\n\t\tlet mapCenter = this.getMapCenter();\n\n\t\tlet view = this.map.getView();\n\t\tview.setCenter(mapCenter);\n\n\t\tthis.gExtent.setCoordinates([\n\t\t\tmapExtent.bottomLeft,\n\t\t\tmapExtent.bottomRight,\n\t\t\tmapExtent.topRight,\n\t\t\tmapExtent.topLeft,\n\t\t\tmapExtent.bottomLeft\n\t\t]);\n\n\t\tview.fit(this.gExtent, [300, 300], {\n\t\t\tconstrainResolution: false\n\t\t});\n\n\t\tif (pointcloud.pcoGeometry.type == 'ept'){ \n\t\t\treturn;\n\t\t}\n\n\t\tlet url = `${pointcloud.pcoGeometry.url}/../sources.json`;\n\t\t//let response = await fetch(url);\n\n\t\tfetch(url).then(async (response) => {\n\t\t\tlet data = await response.json();\n\t\t\n\t\t\tlet sources = data.sources;\n\n\t\t\tfor (let i = 0; i < sources.length; i++) {\n\t\t\t\tlet source = sources[i];\n\t\t\t\tlet name = source.name;\n\t\t\t\tlet bounds = source.bounds;\n\n\t\t\t\tlet mapBounds = {\n\t\t\t\t\tmin: this.toMap.forward([bounds.min[0], bounds.min[1]]),\n\t\t\t\t\tmax: this.toMap.forward([bounds.max[0], bounds.max[1]])\n\t\t\t\t};\n\t\t\t\tlet mapCenter = [\n\t\t\t\t\t(mapBounds.min[0] + mapBounds.max[0]) / 2,\n\t\t\t\t\t(mapBounds.min[1] + mapBounds.max[1]) / 2\n\t\t\t\t];\n\n\t\t\t\tlet p1 = this.toMap.forward([bounds.min[0], bounds.min[1]]);\n\t\t\t\tlet p2 = this.toMap.forward([bounds.max[0], bounds.min[1]]);\n\t\t\t\tlet p3 = this.toMap.forward([bounds.max[0], bounds.max[1]]);\n\t\t\t\tlet p4 = this.toMap.forward([bounds.min[0], bounds.max[1]]);\n\n\t\t\t\t// let feature = new ol.Feature({\n\t\t\t\t//\t'geometry': new ol.geom.LineString([p1, p2, p3, p4, p1])\n\t\t\t\t// });\n\t\t\t\tlet feature = new ol.Feature({\n\t\t\t\t\t'geometry': new ol.geom.Polygon([[p1, p2, p3, p4, p1]])\n\t\t\t\t});\n\t\t\t\tfeature.source = source;\n\t\t\t\tfeature.pointcloud = pointcloud;\n\t\t\t\tthis.getSourcesLayer().getSource().addFeature(feature);\n\n\t\t\t\tfeature = new ol.Feature({\n\t\t\t\t\tgeometry: new ol.geom.Point(mapCenter),\n\t\t\t\t\tname: name\n\t\t\t\t});\n\t\t\t\tfeature.setStyle(this.createLabelStyle(name));\n\t\t\t\tthis.sourcesLabelLayer.getSource().addFeature(feature);\n\t\t\t}\n\t\t}).catch(() => {\n\t\t\t\n\t\t});\n\n\t}\n\n\ttoggle () {\n\t\tif (this.elMap.is(':visible')) {\n\t\t\tthis.elMap.css('display', 'none');\n\t\t\tthis.enabled = false;\n\t\t} else {\n\t\t\tthis.elMap.css('display', 'block');\n\t\t\tthis.enabled = true;\n\t\t}\n\t}\n\n\tupdate (delta) {\n\t\tif (!this.sceneProjection) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet pm = $('#potree_map');\n\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// resize\n\t\tlet mapSize = this.map.getSize();\n\t\tlet resized = (pm.width() !== mapSize[0] || pm.height() !== mapSize[1]);\n\t\tif (resized) {\n\t\t\tthis.map.updateSize();\n\t\t}\n\n\t\t//\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\n\t\tlet scale = this.map.getView().getResolution();\n\t\tlet campos = camera.position;\n\t\tlet camdir = camera.getWorldDirection(new THREE.Vector3());\n\t\tlet sceneLookAt = camdir.clone().multiplyScalar(30 * scale).add(campos);\n\t\tlet geoPos = camera.position;\n\t\tlet geoLookAt = sceneLookAt;\n\t\tlet mapPos = new THREE.Vector2().fromArray(this.toMap.forward([geoPos.x, geoPos.y]));\n\t\tlet mapLookAt = new THREE.Vector2().fromArray(this.toMap.forward([geoLookAt.x, geoLookAt.y]));\n\t\tlet mapDir = new THREE.Vector2().subVectors(mapLookAt, mapPos).normalize();\n\n\t\tmapLookAt = mapPos.clone().add(mapDir.clone().multiplyScalar(30 * scale));\n\t\tlet mapLength = mapPos.distanceTo(mapLookAt);\n\t\tlet mapSide = new THREE.Vector2(-mapDir.y, mapDir.x);\n\n\t\tlet p1 = mapPos.toArray();\n\t\tlet p2 = mapLookAt.clone().sub(mapSide.clone().multiplyScalar(0.3 * mapLength)).toArray();\n\t\tlet p3 = mapLookAt.clone().add(mapSide.clone().multiplyScalar(0.3 * mapLength)).toArray();\n\n\t\tthis.gCamera.setCoordinates([p1, p2, p3, p1]);\n\t}\n\n\tget sourcesVisible () {\n\t\treturn this.getSourcesLayer().getVisible();\n\t}\n\n\tset sourcesVisible (value) {\n\t\tthis.getSourcesLayer().setVisible(value);\n\t}\n\n}\n","\nexport class CSVExporter {\n\tstatic toString (points) {\n\t\tlet string = '';\n\n\t\tlet attributes = Object.keys(points.data)\n\t\t\t.filter(a => a !== 'normal')\n\t\t\t.sort((a, b) => {\n\t\t\t\tif (a === 'position') return -1;\n\t\t\t\tif (b === 'position') return 1;\n\t\t\t\tif (a === 'rgba') return -1;\n\t\t\t\tif (b === 'rgba') return 1;\n\t\t\t});\n\n\t\tlet headerValues = [];\n\t\tfor (let attribute of attributes) {\n\t\t\tlet itemSize = points.data[attribute].length / points.numPoints;\n\n\t\t\tif (attribute === 'position') {\n\t\t\t\theaderValues = headerValues.concat(['x', 'y', 'z']);\n\t\t\t} else if (attribute === 'rgba') {\n\t\t\t\theaderValues = headerValues.concat(['r', 'g', 'b', 'a']);\n\t\t\t} else if (itemSize > 1) {\n\t\t\t\tfor (let i = 0; i < itemSize; i++) {\n\t\t\t\t\theaderValues.push(`${attribute}_${i}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\theaderValues.push(attribute);\n\t\t\t}\n\t\t}\n\t\tstring = headerValues.join(', ') + '\\n';\n\n\t\tfor (let i = 0; i < points.numPoints; i++) {\n\t\t\tlet values = [];\n\n\t\t\tfor (let attribute of attributes) {\n\t\t\t\tlet itemSize = points.data[attribute].length / points.numPoints;\n\t\t\t\tlet value = points.data[attribute]\n\t\t\t\t\t.subarray(itemSize * i, itemSize * i + itemSize)\n\t\t\t\t\t.join(', ');\n\t\t\t\tvalues.push(value);\n\t\t\t}\n\n\t\t\tstring += values.join(', ') + '\\n';\n\t\t}\n\n\t\treturn string;\n\t}\n};\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nexport class LASExporter {\n\tstatic toLAS (points) {\n\t\t// TODO Unused: let string = '';\n\n\t\tlet boundingBox = points.boundingBox;\n\t\tlet offset = boundingBox.min.clone();\n\t\tlet diagonal = boundingBox.min.distanceTo(boundingBox.max);\n\t\tlet scale = new THREE.Vector3(0.001, 0.001, 0.001);\n\t\tif (diagonal > 1000 * 1000) {\n\t\t\tscale = new THREE.Vector3(0.01, 0.01, 0.01);\n\t\t} else {\n\t\t\tscale = new THREE.Vector3(0.001, 0.001, 0.001);\n\t\t}\n\n\t\tlet setString = function (string, offset, buffer) {\n\t\t\tlet view = new Uint8Array(buffer);\n\n\t\t\tfor (let i = 0; i < string.length; i++) {\n\t\t\t\tlet charCode = string.charCodeAt(i);\n\t\t\t\tview[offset + i] = charCode;\n\t\t\t}\n\t\t};\n\n\t\tlet buffer = new ArrayBuffer(227 + 28 * points.numPoints);\n\t\tlet view = new DataView(buffer);\n\t\tlet u8View = new Uint8Array(buffer);\n\t\t// let u16View = new Uint16Array(buffer);\n\n\t\tsetString('LASF', 0, buffer);\n\t\tu8View[24] = 1;\n\t\tu8View[25] = 2;\n\n\t\t// system identifier o:26 l:32\n\n\t\t// generating software o:58 l:32\n\t\tsetString('Potree 1.7', 58, buffer);\n\n\t\t// file creation day of year o:90 l:2\n\t\t// file creation year o:92 l:2\n\n\t\t// header size o:94 l:2\n\t\tview.setUint16(94, 227, true);\n\n\t\t// offset to point data o:96 l:4\n\t\tview.setUint32(96, 227, true);\n\n\t\t// number of letiable length records o:100 l:4\n\n\t\t// point data record format 104 1\n\t\tu8View[104] = 2;\n\n\t\t// point data record length 105 2\n\t\tview.setUint16(105, 28, true);\n\n\t\t// number of point records 107 4\n\t\tview.setUint32(107, points.numPoints, true);\n\n\t\t// number of points by return 111 20\n\n\t\t// x scale factor 131 8\n\t\tview.setFloat64(131, scale.x, true);\n\n\t\t// y scale factor 139 8\n\t\tview.setFloat64(139, scale.y, true);\n\n\t\t// z scale factor 147 8\n\t\tview.setFloat64(147, scale.z, true);\n\n\t\t// x offset 155 8\n\t\tview.setFloat64(155, offset.x, true);\n\n\t\t// y offset 163 8\n\t\tview.setFloat64(163, offset.y, true);\n\n\t\t// z offset 171 8\n\t\tview.setFloat64(171, offset.z, true);\n\n\t\t// max x 179 8\n\t\tview.setFloat64(179, boundingBox.max.x, true);\n\n\t\t// min x 187 8\n\t\tview.setFloat64(187, boundingBox.min.x, true);\n\n\t\t// max y 195 8\n\t\tview.setFloat64(195, boundingBox.max.y, true);\n\n\t\t// min y 203 8\n\t\tview.setFloat64(203, boundingBox.min.y, true);\n\n\t\t// max z 211 8\n\t\tview.setFloat64(211, boundingBox.max.z, true);\n\n\t\t// min z 219 8\n\t\tview.setFloat64(219, boundingBox.min.z, true);\n\n\t\tlet boffset = 227;\n\t\tfor (let i = 0; i < points.numPoints; i++) {\n\n\t\t\tlet px = points.data.position[3 * i + 0];\n\t\t\tlet py = points.data.position[3 * i + 1];\n\t\t\tlet pz = points.data.position[3 * i + 2];\n\n\t\t\tlet ux = parseInt((px - offset.x) / scale.x);\n\t\t\tlet uy = parseInt((py - offset.y) / scale.y);\n\t\t\tlet uz = parseInt((pz - offset.z) / scale.z);\n\n\t\t\tview.setUint32(boffset + 0, ux, true);\n\t\t\tview.setUint32(boffset + 4, uy, true);\n\t\t\tview.setUint32(boffset + 8, uz, true);\n\n\t\t\tif (points.data.intensity) {\n\t\t\t\tview.setUint16(boffset + 12, (points.data.intensity[i]), true);\n\t\t\t}\n\n\t\t\tlet rt = 0;\n\t\t\tif (points.data.returnNumber) {\n\t\t\t\trt += points.data.returnNumber[i];\n\t\t\t}\n\t\t\tif (points.data.numberOfReturns) {\n\t\t\t\trt += (points.data.numberOfReturns[i] << 3);\n\t\t\t}\n\t\t\tview.setUint8(boffset + 14, rt);\n\n\t\t\tif (points.data.classification) {\n\t\t\t\tview.setUint8(boffset + 15, points.data.classification[i]);\n\t\t\t}\n\t\t\t// scan angle rank\n\t\t\t// user data\n\t\t\t// point source id\n\t\t\tif (points.data.pointSourceID) {\n\t\t\t\tview.setUint16(boffset + 18, points.data.pointSourceID[i]);\n\t\t\t}\n\n\t\t\tif (points.data.rgba) {\n\t\t\t\tlet rgba = points.data.rgba;\n\t\t\t\tview.setUint16(boffset + 20, (rgba[4 * i + 0] * 255), true);\n\t\t\t\tview.setUint16(boffset + 22, (rgba[4 * i + 1] * 255), true);\n\t\t\t\tview.setUint16(boffset + 24, (rgba[4 * i + 2] * 255), true);\n\t\t\t}\n\n\t\t\tboffset += 28;\n\t\t}\n\n\t\treturn buffer;\n\t}\n\t\n}\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Utils} from \"../utils.js\";\nimport {Points} from \"../Points.js\";\nimport {CSVExporter} from \"../exporter/CSVExporter.js\";\nimport {LASExporter} from \"../exporter/LASExporter.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\nimport {PointCloudTree} from \"../PointCloudTree.js\";\nimport {Renderer} from \"../PotreeRenderer.js\";\nimport {PointCloudMaterial} from \"../materials/PointCloudMaterial.js\";\nimport {PointSizeType} from \"../defines.js\";\n\n\nfunction copyMaterial(source, target){\n\n\tfor(let name of Object.keys(target.uniforms)){\n\t\ttarget.uniforms[name].value = source.uniforms[name].value;\n\t}\n\n\ttarget.gradientTexture = source.gradientTexture;\n\ttarget.visibleNodesTexture = source.visibleNodesTexture;\n\ttarget.classificationTexture = source.classificationTexture;\n\ttarget.matcapTexture = source.matcapTexture;\n\n\ttarget.activeAttributeName = source.activeAttributeName;\n\ttarget.ranges = source.ranges;\n\n\t//target.updateShaderSource();\n}\n\n\nclass Batch{\n\n\tconstructor(geometry, material){\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.sceneNode = new THREE.Points(geometry, material);\n\n\t\tthis.geometryNode = {\n\t\t\testimatedSpacing: 1.0,\n\t\t\tgeometry: geometry,\n\t\t};\n\t}\n\n\tgetLevel(){\n\t\treturn 0;\n\t}\n\n}\n\nclass ProfileFakeOctree extends PointCloudTree{\n\n\tconstructor(octree){\n\t\tsuper();\n\n\t\tthis.trueOctree = octree;\n\t\tthis.pcoGeometry = octree.pcoGeometry;\n\t\tthis.points = [];\n\t\tthis.visibleNodes = [];\n\t\t\n\t\t//this.material = this.trueOctree.material;\n\t\tthis.material = new PointCloudMaterial();\n\t\t//this.material.copy(this.trueOctree.material);\n\t\tcopyMaterial(this.trueOctree.material, this.material);\n\t\tthis.material.pointSizeType = PointSizeType.FIXED;\n\n\t\tthis.batchSize = 100 * 1000;\n\t\tthis.currentBatch = null\n\t}\n\n\tgetAttribute(name){\n\t\treturn this.trueOctree.getAttribute(name);\n\t}\n\n\tdispose(){\n\t\tfor(let node of this.visibleNodes){\n\t\t\tnode.geometry.dispose();\n\t\t}\n\n\t\tthis.visibleNodes = [];\n\t\tthis.currentBatch = null;\n\t\tthis.points = [];\n\t}\n\n\taddPoints(data){\n\t\t// since each call to addPoints can deliver very very few points,\n\t\t// we're going to batch them into larger buffers for efficiency.\n\n\t\tif(this.currentBatch === null){\n\t\t\tthis.currentBatch = this.createNewBatch(data);\n\t\t}\n\n\t\tthis.points.push(data);\n\n\n\t\tlet updateRange = {\n\t\t\tstart: this.currentBatch.geometry.drawRange.count,\n\t\t\tcount: 0\n\t\t};\n\t\tlet projectedBox = new THREE.Box3();\n\n\t\tlet truePos = new THREE.Vector3();\n\n\t\tfor(let i = 0; i < data.numPoints; i++){\n\n\t\t\tif(updateRange.start + updateRange.count >= this.batchSize){\n\t\t\t\t// current batch full, start new batch\n\n\t\t\t\tfor(let key of Object.keys(this.currentBatch.geometry.attributes)){\n\t\t\t\t\tlet attribute = this.currentBatch.geometry.attributes[key];\n\t\t\t\t\tattribute.updateRange.offset = updateRange.start;\n\t\t\t\t\tattribute.updateRange.count = updateRange.count;\n\t\t\t\t\tattribute.needsUpdate = true;\n\t\t\t\t}\n\n\t\t\t\tthis.currentBatch.geometry.computeBoundingBox();\n\t\t\t\tthis.currentBatch.geometry.computeBoundingSphere();\n\n\t\t\t\tthis.currentBatch = this.createNewBatch(data);\n\t\t\t\tupdateRange = {\n\t\t\t\t\tstart: 0,\n\t\t\t\t\tcount: 0\n\t\t\t\t};\n\t\t\t}\n\n\t\t\ttruePos.set(\n\t\t\t\tdata.data.position[3 * i + 0] + this.trueOctree.position.x,\n\t\t\t\tdata.data.position[3 * i + 1] + this.trueOctree.position.y,\n\t\t\t\tdata.data.position[3 * i + 2] + this.trueOctree.position.z,\n\t\t\t);\n\n\t\t\tlet x = data.data.mileage[i];\n\t\t\tlet y = 0;\n\t\t\tlet z = truePos.z;\n\n\t\t\tprojectedBox.expandByPoint(new THREE.Vector3(x, y, z));\n\n\t\t\tlet index = updateRange.start + updateRange.count;\n\t\t\tlet geometry = this.currentBatch.geometry;\n\n\t\t\tfor(let attributeName of Object.keys(data.data)){\n\t\t\t\tlet source = data.data[attributeName];\n\t\t\t\tlet target = geometry.attributes[attributeName];\n\t\t\t\tlet numElements = target.itemSize;\n\t\t\t\t\n\t\t\t\tfor(let item = 0; item < numElements; item++){\n\t\t\t\t\ttarget.array[numElements * index + item] = source[numElements * i + item];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tlet position = geometry.attributes.position;\n\n\t\t\t\tposition.array[3 * index + 0] = x;\n\t\t\t\tposition.array[3 * index + 1] = y;\n\t\t\t\tposition.array[3 * index + 2] = z;\n\t\t\t}\n\n\t\t\tupdateRange.count++;\n\t\t\tthis.currentBatch.geometry.drawRange.count++;\n\t\t}\n\n\t\tfor(let key of Object.keys(this.currentBatch.geometry.attributes)){\n\t\t\tlet attribute = this.currentBatch.geometry.attributes[key];\n\t\t\tattribute.updateRange.offset = updateRange.start;\n\t\t\tattribute.updateRange.count = updateRange.count;\n\t\t\tattribute.needsUpdate = true;\n\t\t}\n\n\t\tdata.projectedBox = projectedBox;\n\n\t\tthis.projectedBox = this.points.reduce( (a, i) => a.union(i.projectedBox), new THREE.Box3());\n\t}\n\n\tcreateNewBatch(data){\n\t\tlet geometry = new THREE.BufferGeometry();\n\n\t\t// create new batches with batch_size elements of the same type as the attribute\n\t\tfor(let attributeName of Object.keys(data.data)){\n\t\t\tlet buffer = data.data[attributeName];\n\t\t\tlet numElements = buffer.length / data.numPoints; // 3 for pos, 4 for col, 1 for scalars\n\t\t\tlet constructor = buffer.constructor;\n\t\t\tlet normalized = false;\n\t\t\t\n\t\t\tif(this.trueOctree.root.sceneNode){\n\t\t\t\tif(this.trueOctree.root.sceneNode.geometry.attributes[attributeName]){\n\t\t\t\t\tnormalized = this.trueOctree.root.sceneNode.geometry.attributes[attributeName].normalized;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\t\t\tlet batchBuffer = new constructor(numElements * this.batchSize);\n\n\t\t\tlet bufferAttribute = new THREE.BufferAttribute(batchBuffer, numElements, normalized);\n\t\t\tbufferAttribute.potree = {\n\t\t\t\trange: [0, 1],\n\t\t\t};\n\n\t\t\tgeometry.setAttribute(attributeName, bufferAttribute);\n\t\t}\n\n\t\tgeometry.drawRange.start = 0;\n\t\tgeometry.drawRange.count = 0;\n\n\t\tlet batch = new Batch(geometry, this.material);\n\n\t\tthis.visibleNodes.push(batch);\n\n\t\treturn batch;\n\t}\n\t\n\tcomputeVisibilityTextureData(){\n\t\tlet data = new Uint8Array(this.visibleNodes.length * 4);\n\t\tlet offsets = new Map();\n\n\t\tfor(let i = 0; i < this.visibleNodes.length; i++){\n\t\t\tlet node = this.visibleNodes[i];\n\n\t\t\toffsets[node] = i;\n\t\t}\n\n\n\t\treturn {\n\t\t\tdata: data,\n\t\t\toffsets: offsets,\n\t\t};\n\t}\n\n}\n\nexport class ProfileWindow extends EventDispatcher {\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.elRoot = $('#profile_window');\n\t\tthis.renderArea = this.elRoot.find('#profileCanvasContainer');\n\t\tthis.svg = d3.select('svg#profileSVG');\n\t\tthis.mouseIsDown = false;\n\n\t\tthis.projectedBox = new THREE.Box3();\n\t\tthis.pointclouds = new Map();\n\t\tthis.numPoints = 0;\n\t\tthis.lastAddPointsTimestamp = undefined;\n\n\t\tthis.mouse = new THREE.Vector2(0, 0);\n\t\tthis.scale = new THREE.Vector3(1, 1, 1);\n\n\t\tthis.autoFitEnabled = true; // completely disable/enable\n\t\tthis.autoFit = false; // internal\n\n\t\tlet cwIcon = `${exports.resourcePath}/icons/arrow_cw.svg`;\n\t\t$('#potree_profile_rotate_cw').attr('src', cwIcon);\n\n\t\tlet ccwIcon = `${exports.resourcePath}/icons/arrow_ccw.svg`;\n\t\t$('#potree_profile_rotate_ccw').attr('src', ccwIcon);\n\t\t\n\t\tlet forwardIcon = `${exports.resourcePath}/icons/arrow_up.svg`;\n\t\t$('#potree_profile_move_forward').attr('src', forwardIcon);\n\n\t\tlet backwardIcon = `${exports.resourcePath}/icons/arrow_down.svg`;\n\t\t$('#potree_profile_move_backward').attr('src', backwardIcon);\n\n\t\tlet csvIcon = `${exports.resourcePath}/icons/file_csv_2d.svg`;\n\t\t$('#potree_download_csv_icon').attr('src', csvIcon);\n\n\t\tlet lasIcon = `${exports.resourcePath}/icons/file_las_3d.svg`;\n\t\t$('#potree_download_las_icon').attr('src', lasIcon);\n\n\t\tlet closeIcon = `${exports.resourcePath}/icons/close.svg`;\n\t\t$('#closeProfileContainer').attr(\"src\", closeIcon);\n\n\t\tthis.initTHREE();\n\t\tthis.initSVG();\n\t\tthis.initListeners();\n\n\t\tthis.pRenderer = new Renderer(this.renderer);\n\n\t\tthis.elRoot.i18n();\n\t}\n\n\tinitListeners () {\n\t\t$(window).resize(() => {\n\t\t\tif (this.enabled) {\n\t\t\tthis.render();\n\t\t\t}\n\t\t});\n\n\t\tthis.renderArea.mousedown(e => {\n\t\t\tthis.mouseIsDown = true;\n\t\t});\n\n\t\tthis.renderArea.mouseup(e => {\n\t\t\tthis.mouseIsDown = false;\n\t\t});\n\n\t\tlet viewerPickSphereSizeHandler = () => {\n\t\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\t\tlet domElement = this.viewer.renderer.domElement;\n\t\t\tlet distance = this.viewerPickSphere.position.distanceTo(camera.position);\n\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, domElement.clientWidth, domElement.clientHeight);\n\t\t\tlet scale = (10 / pr);\n\t\t\tthis.viewerPickSphere.scale.set(scale, scale, scale);\n\t\t};\n\n\t\tthis.renderArea.mousemove(e => {\n\t\t\tif (this.pointclouds.size === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet rect = this.renderArea[0].getBoundingClientRect();\n\t\t\tlet x = e.clientX - rect.left;\n\t\t\tlet y = e.clientY - rect.top;\n\n\t\t\tlet newMouse = new THREE.Vector2(x, y);\n\n\t\t\tif (this.mouseIsDown) {\n\t\t\t\t// DRAG\n\t\t\t\tthis.autoFit = false;\n\t\t\t\tthis.lastDrag = new Date().getTime();\n\n\t\t\t\tlet cPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)];\n\t\t\t\tlet ncPos = [this.scaleX.invert(newMouse.x), this.scaleY.invert(newMouse.y)];\n\n\t\t\t\tthis.camera.position.x -= ncPos[0] - cPos[0];\n\t\t\t\tthis.camera.position.z -= ncPos[1] - cPos[1];\n\n\t\t\t\tthis.render();\n\t\t\t} else if (this.pointclouds.size > 0) {\n\t\t\t\t// FIND HOVERED POINT\n\t\t\t\tlet radius = Math.abs(this.scaleX.invert(0) - this.scaleX.invert(40));\n\t\t\t\tlet mileage = this.scaleX.invert(newMouse.x);\n\t\t\t\tlet elevation = this.scaleY.invert(newMouse.y);\n\n\t\t\t\tlet closest = this.selectPoint(mileage, elevation, radius);\n\n\t\t\t\tif (closest) {\n\t\t\t\t\tlet point = closest.point;\n\n\t\t\t\t\tlet position = new Float64Array([\n\t\t\t\t\t\tpoint.position[0] + closest.pointcloud.position.x,\n\t\t\t\t\t\tpoint.position[1] + closest.pointcloud.position.y,\n\t\t\t\t\t\tpoint.position[2] + closest.pointcloud.position.z\n\t\t\t\t\t]);\n\n\t\t\t\t\tthis.elRoot.find('#profileSelectionProperties').fadeIn(200);\n\t\t\t\t\tthis.pickSphere.visible = true;\n\t\t\t\t\tthis.pickSphere.scale.set(0.5 * radius, 0.5 * radius, 0.5 * radius);\n\t\t\t\t\tthis.pickSphere.position.set(point.mileage, 0, position[2]);\n\n\t\t\t\t\tthis.viewerPickSphere.position.set(...position);\n\t\t\t\t\t\n\t\t\t\t\tif(!this.viewer.scene.scene.children.includes(this.viewerPickSphere)){\n\t\t\t\t\t\tthis.viewer.scene.scene.add(this.viewerPickSphere);\n\t\t\t\t\t\tif(!this.viewer.hasEventListener(\"update\", viewerPickSphereSizeHandler)){\n\t\t\t\t\t\t\tthis.viewer.addEventListener(\"update\", viewerPickSphereSizeHandler);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\n\t\t\t\t\tlet info = this.elRoot.find('#profileSelectionProperties');\n\t\t\t\t\tlet html = '';\n\n\t\t\t\t\tfor (let attributeName of Object.keys(point)) {\n\n\t\t\t\t\t\tlet value = point[attributeName];\n\t\t\t\t\t\tlet attribute = closest.pointcloud.getAttribute(attributeName);\n\n\t\t\t\t\t\tlet transform = value => value;\n\t\t\t\t\t\tif(attribute && attribute.type.size > 4){\n\t\t\t\t\t\t\tlet range = attribute.initialRange;\n\t\t\t\t\t\t\tlet scale = 1 / (range[1] - range[0]);\n\t\t\t\t\t\t\tlet offset = range[0];\n\t\t\t\t\t\t\ttransform = value => value / scale + offset;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t\tif (attributeName === 'position') {\n\t\t\t\t\t\t\tlet values = [...position].map(v => Utils.addCommas(v.toFixed(3)));\n\t\t\t\t\t\t\thtml += `\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t} else if (attributeName === 'rgba') {\n\t\t\t\t\t\t\thtml += `\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t} else if (attributeName === 'normal') {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t} else if (attributeName === 'mileage') {\n\t\t\t\t\t\t\thtml += `\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thtml += `\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\thtml += '
    x${values[0]}
    y${values[1]}
    z${values[2]}
    ${attributeName}${value.join(', ')}
    ${attributeName}${value.toFixed(3)}
    ${attributeName}${transform(value)}
    ';\n\t\t\t\t\tinfo.html(html);\n\n\t\t\t\t\tthis.selectedPoint = point;\n\t\t\t\t} else {\n\t\t\t\t\t// this.pickSphere.visible = false;\n\t\t\t\t\t// this.selectedPoint = null;\n\n\t\t\t\t\tthis.viewer.scene.scene.add(this.viewerPickSphere);\n\n\t\t\t\t\tlet index = this.viewer.scene.scene.children.indexOf(this.viewerPickSphere);\n\t\t\t\t\tif(index >= 0){\n\t\t\t\t\t\tthis.viewer.scene.scene.children.splice(index, 1);\n\t\t\t\t\t}\n\t\t\t\t\tthis.viewer.removeEventListener(\"update\", viewerPickSphereSizeHandler);\n\t\t\t\t\t\n\n\t\t\t\t}\n\t\t\t\tthis.render();\n\t\t\t}\n\n\t\t\tthis.mouse.copy(newMouse);\n\t\t});\n\n\t\tlet onWheel = e => {\n\t\t\tthis.autoFit = false;\n\n\t\t\tlet delta = 0;\n\t\t\tif (e.wheelDelta !== undefined) { // WebKit / Opera / Explorer 9\n\t\t\t\tdelta = e.wheelDelta;\n\t\t\t} else if (e.detail !== undefined) { // Firefox\n\t\t\t\tdelta = -e.detail;\n\t\t\t}\n\n\t\t\tlet ndelta = Math.sign(delta);\n\n\t\t\tlet cPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)];\n\n\t\t\tif (ndelta > 0) {\n\t\t\t\t// + 10%\n\t\t\t\tthis.scale.multiplyScalar(1.1);\n\t\t\t} else {\n\t\t\t\t// - 10%\n\t\t\t\tthis.scale.multiplyScalar(100 / 110);\n\t\t\t}\n\n\t\t\tthis.updateScales();\n\t\t\tlet ncPos = [this.scaleX.invert(this.mouse.x), this.scaleY.invert(this.mouse.y)];\n\n\t\t\tthis.camera.position.x -= ncPos[0] - cPos[0];\n\t\t\tthis.camera.position.z -= ncPos[1] - cPos[1];\n\n\t\t\tthis.render();\n\t\t\tthis.updateScales();\n\t\t};\n\t\t$(this.renderArea)[0].addEventListener('mousewheel', onWheel, false);\n\t\t$(this.renderArea)[0].addEventListener('DOMMouseScroll', onWheel, false); // Firefox\n\n\t\t$('#closeProfileContainer').click(() => {\n\t\t\tthis.hide();\n\t\t});\n\n\t\tlet getProfilePoints = () => {\n\t\t\tlet points = new Points();\n\t\t\t\n\t\t\tfor(let [pointcloud, entry] of this.pointclouds){\n\t\t\t\tfor(let pointSet of entry.points){\n\n\t\t\t\t\tlet originPos = pointSet.data.position;\n\t\t\t\t\tlet trueElevationPosition = new Float32Array(originPos);\n\t\t\t\t\tfor(let i = 0; i < pointSet.numPoints; i++){\n\t\t\t\t\t\ttrueElevationPosition[3 * i + 2] += pointcloud.position.z;\n\t\t\t\t\t}\n\n\t\t\t\t\tpointSet.data.position = trueElevationPosition;\n\t\t\t\t\tpoints.add(pointSet);\n\t\t\t\t\tpointSet.data.position = originPos;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn points;\n\t\t};\n\n\t\t$('#potree_download_csv_icon').click(() => {\n\t\t\t\n\t\t\tlet points = getProfilePoints();\n\n\t\t\tlet string = CSVExporter.toString(points);\n\n\t\t\tlet blob = new Blob([string], {type: \"text/string\"});\n\t\t\t$('#potree_download_profile_ortho_link').attr('href', URL.createObjectURL(blob));\n\t\t});\n\n\t\t$('#potree_download_las_icon').click(() => {\n\n\t\t\tlet points = getProfilePoints();\n\n\t\t\tlet buffer = LASExporter.toLAS(points);\n\n\t\t\tlet blob = new Blob([buffer], {type: \"application/octet-binary\"});\n\t\t\t$('#potree_download_profile_link').attr('href', URL.createObjectURL(blob));\n\t\t});\n\t}\n\n\tselectPoint (mileage, elevation, radius) {\n\t\tlet closest = {\n\t\t\tdistance: Infinity,\n\t\t\tpointcloud: null,\n\t\t\tpoints: null,\n\t\t\tindex: null\n\t\t};\n\n\t\tlet pointBox = new THREE.Box2(\n\t\t\tnew THREE.Vector2(mileage - radius, elevation - radius),\n\t\t\tnew THREE.Vector2(mileage + radius, elevation + radius));\n\n\t\tlet numTested = 0;\n\t\tlet numSkipped = 0;\n\t\tlet numTestedPoints = 0;\n\t\tlet numSkippedPoints = 0;\n\n\t\tfor (let [pointcloud, entry] of this.pointclouds) {\n\t\t\tfor(let points of entry.points){\n\n\t\t\t\tlet collisionBox = new THREE.Box2(\n\t\t\t\t\tnew THREE.Vector2(points.projectedBox.min.x, points.projectedBox.min.z),\n\t\t\t\t\tnew THREE.Vector2(points.projectedBox.max.x, points.projectedBox.max.z)\n\t\t\t\t);\n\n\t\t\t\tlet intersects = collisionBox.intersectsBox(pointBox);\n\n\t\t\t\tif(!intersects){\n\t\t\t\t\tnumSkipped++;\n\t\t\t\t\tnumSkippedPoints += points.numPoints;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tnumTested++;\n\t\t\t\tnumTestedPoints += points.numPoints\n\n\t\t\t\tfor (let i = 0; i < points.numPoints; i++) {\n\n\t\t\t\t\tlet m = points.data.mileage[i] - mileage;\n\t\t\t\t\tlet e = points.data.position[3 * i + 2] - elevation + pointcloud.position.z;\n\t\t\t\t\tlet r = Math.sqrt(m * m + e * e);\n\n\t\t\t\t\tconst withinDistance = r < radius && r < closest.distance;\n\t\t\t\t\tlet unfilteredClass = true;\n\n\t\t\t\t\tif(points.data.classification){\n\t\t\t\t\t\tconst classification = pointcloud.material.classification;\n\n\t\t\t\t\t\tconst pointClassID = points.data.classification[i];\n\t\t\t\t\t\tconst pointClassValue = classification[pointClassID];\n\n\t\t\t\t\t\tif(pointClassValue && (!pointClassValue.visible || pointClassValue.color.w === 0)){\n\t\t\t\t\t\t\tunfilteredClass = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (withinDistance && unfilteredClass) {\n\t\t\t\t\t\tclosest = {\n\t\t\t\t\t\t\tdistance: r,\n\t\t\t\t\t\t\tpointcloud: pointcloud,\n\t\t\t\t\t\t\tpoints: points,\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\t//console.log(`nodes: ${numTested}, ${numSkipped} || points: ${numTestedPoints}, ${numSkippedPoints}`);\n\n\t\tif (closest.distance < Infinity) {\n\t\t\tlet points = closest.points;\n\n\t\t\tlet point = {};\n\n\t\t\tlet attributes = Object.keys(points.data);\n\t\t\tfor (let attribute of attributes) {\n\t\t\t\tlet attributeData = points.data[attribute];\n\t\t\t\tlet itemSize = attributeData.length / points.numPoints;\n\t\t\t\tlet value = attributeData.subarray(itemSize * closest.index, itemSize * closest.index + itemSize);\n\n\t\t\t\tif (value.length === 1) {\n\t\t\t\t\tpoint[attribute] = value[0];\n\t\t\t\t} else {\n\t\t\t\t\tpoint[attribute] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tclosest.point = point;\n\n\t\t\treturn closest;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tinitTHREE () {\n\t\tthis.renderer = new THREE.WebGLRenderer({alpha: true, premultipliedAlpha: false});\n\t\tthis.renderer.setClearColor(0x000000, 0);\n\t\tthis.renderer.setSize(10, 10);\n\t\tthis.renderer.autoClear = false;\n\t\tthis.renderArea.append($(this.renderer.domElement));\n\t\tthis.renderer.domElement.tabIndex = '2222';\n\t\t$(this.renderer.domElement).css('width', '100%');\n\t\t$(this.renderer.domElement).css('height', '100%');\n\n\n\t\t{\n\t\t\tlet gl = this.renderer.getContext();\n\n\t\t\tif(gl.createVertexArray == null){\n\t\t\t\tlet extVAO = gl.getExtension('OES_vertex_array_object');\n\n\t\t\t\tif(!extVAO){\n\t\t\t\t\tthrow new Error(\"OES_vertex_array_object extension not supported\");\n\t\t\t\t}\n\n\t\t\t\tgl.createVertexArray = extVAO.createVertexArrayOES.bind(extVAO);\n\t\t\t\tgl.bindVertexArray = extVAO.bindVertexArrayOES.bind(extVAO);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\tthis.camera = new THREE.OrthographicCamera(-1000, 1000, 1000, -1000, -1000, 1000);\n\t\tthis.camera.up.set(0, 0, 1);\n\t\tthis.camera.rotation.order = \"ZXY\";\n\t\tthis.camera.rotation.x = Math.PI / 2.0;\n\t\n\n\t\tthis.scene = new THREE.Scene();\n\t\tthis.profileScene = new THREE.Scene();\n\n\t\tlet sg = new THREE.SphereGeometry(1, 16, 16);\n\t\tlet sm = new THREE.MeshNormalMaterial();\n\t\tthis.pickSphere = new THREE.Mesh(sg, sm);\n\t\tthis.scene.add(this.pickSphere);\n\n\t\t{\n\t\t\tconst sg = new THREE.SphereGeometry(2);\n\t\t\tconst sm = new THREE.MeshNormalMaterial();\n\t\t\tconst s = new THREE.Mesh(sg, sm);\n\n\t\t\ts.position.set(589530.450, 231398.860, 769.735);\n\n\t\t\tthis.scene.add(s);\n\t\t}\n\n\t\tthis.viewerPickSphere = new THREE.Mesh(sg, sm);\n\t}\n\n\tinitSVG () {\n\t\tlet width = this.renderArea[0].clientWidth;\n\t\tlet height = this.renderArea[0].clientHeight;\n\t\tlet marginLeft = this.renderArea[0].offsetLeft;\n\n\t\tthis.svg.selectAll('*').remove();\n\n\t\tthis.scaleX = d3.scale.linear()\n\t\t\t.domain([this.camera.left + this.camera.position.x, this.camera.right + this.camera.position.x])\n\t\t\t.range([0, width]);\n\t\tthis.scaleY = d3.scale.linear()\n\t\t\t.domain([this.camera.bottom + this.camera.position.z, this.camera.top + this.camera.position.z])\n\t\t\t.range([height, 0]);\n\n\t\tthis.xAxis = d3.svg.axis()\n\t\t\t.scale(this.scaleX)\n\t\t\t.orient('bottom')\n\t\t\t.innerTickSize(-height)\n\t\t\t.outerTickSize(1)\n\t\t\t.tickPadding(10)\n\t\t\t.ticks(width / 50);\n\n\t\tthis.yAxis = d3.svg.axis()\n\t\t\t.scale(this.scaleY)\n\t\t\t.orient('left')\n\t\t\t.innerTickSize(-width)\n\t\t\t.outerTickSize(1)\n\t\t\t.tickPadding(10)\n\t\t\t.ticks(height / 20);\n\n\t\tthis.elXAxis = this.svg.append('g')\n\t\t\t.attr('class', 'x axis')\n\t\t\t.attr('transform', `translate(${marginLeft}, ${height})`)\n\t\t\t.call(this.xAxis);\n\n\t\tthis.elYAxis = this.svg.append('g')\n\t\t\t.attr('class', 'y axis')\n\t\t\t.attr('transform', `translate(${marginLeft}, 0)`)\n\t\t\t.call(this.yAxis);\n\t}\n\n\taddPoints (pointcloud, points) {\n\n\t\tif(points.numPoints === 0){\n\t\t\treturn;\n\t\t}\n\n\t\tlet entry = this.pointclouds.get(pointcloud);\n\t\tif(!entry){\n\t\t\tentry = new ProfileFakeOctree(pointcloud);\n\t\t\tthis.pointclouds.set(pointcloud, entry);\n\t\t\tthis.profileScene.add(entry);\n\n\t\t\tlet materialChanged = () => {\n\t\t\t\tthis.render();\n\t\t\t};\n\n\t\t\tmaterialChanged();\n\n\t\t\tpointcloud.material.addEventListener('material_property_changed', materialChanged);\n\t\t\tthis.addEventListener(\"on_reset_once\", () => {\n\t\t\t\tpointcloud.material.removeEventListener('material_property_changed', materialChanged);\n\t\t\t});\n\t\t}\n\n\t\tentry.addPoints(points);\n\t\tthis.projectedBox.union(entry.projectedBox);\n\n\t\tif (this.autoFit && this.autoFitEnabled) { \n\t\t\tlet width = this.renderArea[0].clientWidth;\n\t\t\tlet height = this.renderArea[0].clientHeight;\n\n\t\t\tlet size = this.projectedBox.getSize(new THREE.Vector3());\n\n\t\t\tlet sx = width / size.x;\n\t\t\tlet sy = height / size.z;\n\t\t\tlet scale = Math.min(sx, sy);\n\n\t\t\tlet center = this.projectedBox.getCenter(new THREE.Vector3());\n\t\t\tthis.scale.set(scale, scale, 1);\n\t\t\tthis.camera.position.copy(center);\n\n\t\t\t//console.log(\"camera: \", this.camera.position.toArray().join(\", \"));\n\t\t}\n\n\t\t//console.log(entry);\n\n\t\tthis.render();\n\n\t\tlet numPoints = 0;\n\t\tfor (let [key, value] of this.pointclouds.entries()) {\n\t\t\tnumPoints += value.points.reduce( (a, i) => a + i.numPoints, 0);\n\t\t}\n\t\t$(`#profile_num_points`).html(Utils.addCommas(numPoints));\n\n\t}\n\n\treset () {\n\t\tthis.lastReset = new Date().getTime();\n\n\t\tthis.dispatchEvent({type: \"on_reset_once\"});\n\t\tthis.removeEventListeners(\"on_reset_once\");\n\n\t\tthis.autoFit = true;\n\t\tthis.projectedBox = new THREE.Box3();\n\n\t\tfor(let [key, entry] of this.pointclouds){\n\t\t\tentry.dispose();\n\t\t}\n\n\t\tthis.pointclouds.clear();\n\t\tthis.mouseIsDown = false;\n\t\tthis.mouse.set(0, 0);\n\n\t\tif(this.autoFitEnabled){\n\t\t\tthis.scale.set(1, 1, 1);\n\t\t}\n\t\tthis.pickSphere.visible = false;\n\n\t\tthis.elRoot.find('#profileSelectionProperties').hide();\n\n\t\tthis.render();\n\t}\n\n\tshow () {\n\t\tthis.elRoot.fadeIn();\n\t\tthis.enabled = true;\n\t}\n\n\thide () {\n\t\tthis.elRoot.fadeOut();\n\t\tthis.enabled = false;\n\t}\n\n\tupdateScales () {\n\n\t\tlet width = this.renderArea[0].clientWidth;\n\t\tlet height = this.renderArea[0].clientHeight;\n\n\t\tlet left = (-width / 2) / this.scale.x;\n\t\tlet right = (+width / 2) / this.scale.x;\n\t\tlet top = (+height / 2) / this.scale.y;\n\t\tlet bottom = (-height / 2) / this.scale.y;\n\n\t\tthis.camera.left = left;\n\t\tthis.camera.right = right;\n\t\tthis.camera.top = top;\n\t\tthis.camera.bottom = bottom;\n\t\tthis.camera.updateProjectionMatrix();\n\n\t\tthis.scaleX.domain([this.camera.left + this.camera.position.x, this.camera.right + this.camera.position.x])\n\t\t\t.range([0, width]);\n\t\tthis.scaleY.domain([this.camera.bottom + this.camera.position.z, this.camera.top + this.camera.position.z])\n\t\t\t.range([height, 0]);\n\n\t\tlet marginLeft = this.renderArea[0].offsetLeft;\n\n\t\tthis.xAxis.scale(this.scaleX)\n\t\t\t.orient('bottom')\n\t\t\t.innerTickSize(-height)\n\t\t\t.outerTickSize(1)\n\t\t\t.tickPadding(10)\n\t\t\t.ticks(width / 50);\n\t\tthis.yAxis.scale(this.scaleY)\n\t\t\t.orient('left')\n\t\t\t.innerTickSize(-width)\n\t\t\t.outerTickSize(1)\n\t\t\t.tickPadding(10)\n\t\t\t.ticks(height / 20);\n\n\n\t\tthis.elXAxis\n\t\t\t.attr('transform', `translate(${marginLeft}, ${height})`)\n\t\t\t.call(this.xAxis);\n\t\tthis.elYAxis\n\t\t\t.attr('transform', `translate(${marginLeft}, 0)`)\n\t\t\t.call(this.yAxis);\n\t}\n\n\trequestScaleUpdate(){\n\n\t\tlet threshold = 100;\n\t\tlet allowUpdate = ((this.lastReset === undefined) || (this.lastScaleUpdate === undefined)) \n\t\t\t|| ((new Date().getTime() - this.lastReset) > threshold && (new Date().getTime() - this.lastScaleUpdate) > threshold);\n\n\t\tif(allowUpdate){\n\n\t\t\tthis.updateScales();\n\n\t\t\tthis.lastScaleUpdate = new Date().getTime();\n\n\t\t\t\n\n\t\t\tthis.scaleUpdatePending = false;\n\t\t}else if(!this.scaleUpdatePending) {\n\t\t\tsetTimeout(this.requestScaleUpdate.bind(this), 100);\n\t\t\tthis.scaleUpdatePending = true;\n\t\t}\n\t\t\n\t}\n\n\trender () {\n\t\tlet width = this.renderArea[0].clientWidth;\n\t\tlet height = this.renderArea[0].clientHeight;\n\n\t\tlet {renderer, pRenderer, camera, profileScene, scene} = this;\n\t\tlet {scaleX, pickSphere} = this;\n\n\t\trenderer.setSize(width, height);\n\n\t\trenderer.setClearColor(0x000000, 0);\n\t\trenderer.clear(true, true, false);\n\n\t\tfor(let pointcloud of this.pointclouds.keys()){\n\t\t\tlet source = pointcloud.material;\n\t\t\tlet target = this.pointclouds.get(pointcloud).material;\n\t\t\t\n\t\t\tcopyMaterial(source, target);\n\t\t\ttarget.size = 2;\n\t\t}\n\t\t\n\t\tpRenderer.render(profileScene, camera, null);\n\n\t\tlet radius = Math.abs(scaleX.invert(0) - scaleX.invert(5));\n\n\t\tif (radius === 0) {\n\t\t\tpickSphere.visible = false;\n\t\t} else {\n\t\t\tpickSphere.scale.set(radius, radius, radius);\n\t\t\tpickSphere.visible = true;\n\t\t}\n\t\t\n\t\trenderer.render(scene, camera);\n\n\t\tthis.requestScaleUpdate();\n\t}\n};\n\nexport class ProfileWindowController {\n\tconstructor (viewer) {\n\t\tthis.viewer = viewer;\n\t\tthis.profileWindow = viewer.profileWindow;\n\t\tthis.profile = null;\n\t\tthis.numPoints = 0;\n\t\tthis.threshold = 60 * 1000;\n\t\tthis.rotateAmount = 10;\n\n\t\tthis.scheduledRecomputeTime = null;\n\n\t\tthis.enabled = true;\n\n\t\tthis.requests = [];\n\n\t\tthis._recompute = () => { this.recompute(); };\n\n\t\tthis.viewer.addEventListener(\"scene_changed\", e => {\n\t\t\te.oldScene.removeEventListener(\"pointcloud_added\", this._recompute);\n\t\t\te.scene.addEventListener(\"pointcloud_added\", this._recompute);\n\t\t});\n\t\tthis.viewer.scene.addEventListener(\"pointcloud_added\", this._recompute);\n\n\t\t$(\"#potree_profile_rotate_amount\").val(parseInt(this.rotateAmount));\n\t\t$(\"#potree_profile_rotate_amount\").on(\"input\", (e) => {\n\t\t\tconst str = $(\"#potree_profile_rotate_amount\").val();\n\n\t\t\tif(!isNaN(str)){\n\t\t\t\tconst value = parseFloat(str);\n\t\t\t\tthis.rotateAmount = value;\n\t\t\t\t$(\"#potree_profile_rotate_amount\").css(\"background-color\", \"\")\n\t\t\t}else{\n\t\t\t\t$(\"#potree_profile_rotate_amount\").css(\"background-color\", \"#ff9999\")\n\t\t\t}\n\n\t\t});\n\n\t\tconst rotate = (radians) => {\n\t\t\tconst profile = this.profile;\n\t\t\tconst points = profile.points;\n\t\t\tconst start = points[0];\n\t\t\tconst end = points[points.length - 1];\n\t\t\tconst center = start.clone().add(end).multiplyScalar(0.5);\n\n\t\t\tconst mMoveOrigin = new THREE.Matrix4().makeTranslation(-center.x, -center.y, -center.z);\n\t\t\tconst mRotate = new THREE.Matrix4().makeRotationZ(radians);\n\t\t\tconst mMoveBack = new THREE.Matrix4().makeTranslation(center.x, center.y, center.z);\n\t\t\t//const transform = mMoveOrigin.multiply(mRotate).multiply(mMoveBack);\n\t\t\tconst transform = mMoveBack.multiply(mRotate).multiply(mMoveOrigin);\n\n\t\t\tconst rotatedPoints = points.map( point => point.clone().applyMatrix4(transform) );\n\n\t\t\tthis.profileWindow.autoFitEnabled = false;\n\n\t\t\tfor(let i = 0; i < points.length; i++){\n\t\t\t\tprofile.setPosition(i, rotatedPoints[i]);\n\t\t\t}\n\t\t}\n\n\t\t$(\"#potree_profile_rotate_cw\").click( () => {\n\t\t\tconst radians = THREE.Math.degToRad(this.rotateAmount);\n\t\t\trotate(-radians);\n\t\t});\n\n\t\t$(\"#potree_profile_rotate_ccw\").click( () => {\n\t\t\tconst radians = THREE.Math.degToRad(this.rotateAmount);\n\t\t\trotate(radians);\n\t\t});\n\n\t\t$(\"#potree_profile_move_forward\").click( () => {\n\t\t\tconst profile = this.profile;\n\t\t\tconst points = profile.points;\n\t\t\tconst start = points[0];\n\t\t\tconst end = points[points.length - 1];\n\n\t\t\tconst dir = end.clone().sub(start).normalize();\n\t\t\tconst up = new THREE.Vector3(0, 0, 1);\n\t\t\tconst forward = up.cross(dir);\n\t\t\tconst move = forward.clone().multiplyScalar(profile.width / 2);\n\n\t\t\tthis.profileWindow.autoFitEnabled = false;\n\n\t\t\tfor(let i = 0; i < points.length; i++){\n\t\t\t\tprofile.setPosition(i, points[i].clone().add(move));\n\t\t\t}\n\t\t});\n\n\t\t$(\"#potree_profile_move_backward\").click( () => {\n\t\t\tconst profile = this.profile;\n\t\t\tconst points = profile.points;\n\t\t\tconst start = points[0];\n\t\t\tconst end = points[points.length - 1];\n\n\t\t\tconst dir = end.clone().sub(start).normalize();\n\t\t\tconst up = new THREE.Vector3(0, 0, 1);\n\t\t\tconst forward = up.cross(dir);\n\t\t\tconst move = forward.clone().multiplyScalar(-profile.width / 2);\n\n\t\t\tthis.profileWindow.autoFitEnabled = false;\n\n\t\t\tfor(let i = 0; i < points.length; i++){\n\t\t\t\tprofile.setPosition(i, points[i].clone().add(move));\n\t\t\t}\n\t\t});\n\t}\n\n\tsetProfile (profile) {\n\t\tif (this.profile !== null && this.profile !== profile) {\n\t\t\tthis.profile.removeEventListener('marker_moved', this._recompute);\n\t\t\tthis.profile.removeEventListener('marker_added', this._recompute);\n\t\t\tthis.profile.removeEventListener('marker_removed', this._recompute);\n\t\t\tthis.profile.removeEventListener('width_changed', this._recompute);\n\t\t}\n\n\t\tthis.profile = profile;\n\n\t\t{\n\t\t\tthis.profile.addEventListener('marker_moved', this._recompute);\n\t\t\tthis.profile.addEventListener('marker_added', this._recompute);\n\t\t\tthis.profile.addEventListener('marker_removed', this._recompute);\n\t\t\tthis.profile.addEventListener('width_changed', this._recompute);\n\t\t}\n\n\t\tthis.recompute();\n\t}\n\n\treset () {\n\t\tthis.profileWindow.reset();\n\n\t\tthis.numPoints = 0;\n\n\t\tif (this.profile) {\n\t\t\tfor (let request of this.requests) {\n\t\t\t\trequest.cancel();\n\t\t\t}\n\t\t}\n\t}\n\n\tprogressHandler (pointcloud, progress) {\n\t\tfor (let segment of progress.segments) {\n\t\t\tthis.profileWindow.addPoints(pointcloud, segment.points);\n\t\t\tthis.numPoints += segment.points.numPoints;\n\t\t}\n\t}\n\n\tcancel () {\n\t\tfor (let request of this.requests) {\n\t\t\trequest.cancel();\n\t\t\t// request.finishLevelThenCancel();\n\t\t}\n\n\t\tthis.requests = [];\n\t};\n\n\tfinishLevelThenCancel(){\n\t\tfor (let request of this.requests) {\n\t\t\trequest.finishLevelThenCancel();\n\t\t}\n\n\t\tthis.requests = [];\n\t}\n\n\trecompute () {\n\t\tif (!this.profile) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.scheduledRecomputeTime !== null && this.scheduledRecomputeTime > new Date().getTime()) {\n\t\t\treturn;\n\t\t} else {\n\t\t\tthis.scheduledRecomputeTime = new Date().getTime() + 100;\n\t\t}\n\t\tthis.scheduledRecomputeTime = null;\n\n\t\tthis.reset();\n\n\t\tfor (let pointcloud of this.viewer.scene.pointclouds.filter(p => p.visible)) {\n\t\t\tlet request = pointcloud.getPointsInProfile(this.profile, null, {\n\t\t\t\t'onProgress': (event) => {\n\t\t\t\t\tif (!this.enabled) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.progressHandler(pointcloud, event.points);\n\n\t\t\t\t\tif (this.numPoints > this.threshold) {\n\t\t\t\t\t\tthis.finishLevelThenCancel();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'onFinish': (event) => {\n\t\t\t\t\tif (!this.enabled) {\n\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'onCancel': () => {\n\t\t\t\t\tif (!this.enabled) {\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.requests.push(request);\n\t\t}\n\t}\n};\n","/**\n *\n * @author sigeom sa / http://sigeom.ch\n * @author Ioda-Net Sàrl / https://www.ioda-net.ch/\n * @author Markus Schütz / http://potree.org\n *\n */\n\nimport {Measure} from \"../utils/Measure.js\";\n\nexport class GeoJSONExporter{\n\n\tstatic measurementToFeatures (measurement) {\n\t\tlet coords = measurement.points.map(e => e.position.toArray());\n\n\t\tlet features = [];\n\n\t\tif (coords.length === 1) {\n\t\t\tlet feature = {\n\t\t\t\ttype: 'Feature',\n\t\t\t\tgeometry: {\n\t\t\t\t\ttype: 'Point',\n\t\t\t\t\tcoordinates: coords[0]\n\t\t\t\t},\n\t\t\t\tproperties: {\n\t\t\t\t\tname: measurement.name\n\t\t\t\t}\n\t\t\t};\n\t\t\tfeatures.push(feature);\n\t\t} else if (coords.length > 1 && !measurement.closed) {\n\t\t\tlet object = {\n\t\t\t\t'type': 'Feature',\n\t\t\t\t'geometry': {\n\t\t\t\t\t'type': 'LineString',\n\t\t\t\t\t'coordinates': coords\n\t\t\t\t},\n\t\t\t\t'properties': {\n\t\t\t\t\tname: measurement.name\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tfeatures.push(object);\n\t\t} else if (coords.length > 1 && measurement.closed) {\n\t\t\tlet object = {\n\t\t\t\t'type': 'Feature',\n\t\t\t\t'geometry': {\n\t\t\t\t\t'type': 'Polygon',\n\t\t\t\t\t'coordinates': [[...coords, coords[0]]]\n\t\t\t\t},\n\t\t\t\t'properties': {\n\t\t\t\t\tname: measurement.name\n\t\t\t\t}\n\t\t\t};\n\t\t\tfeatures.push(object);\n\t\t}\n\n\t\tif (measurement.showDistances) {\n\t\t\tmeasurement.edgeLabels.forEach((label) => {\n\t\t\t\tlet labelPoint = {\n\t\t\t\t\ttype: 'Feature',\n\t\t\t\t\tgeometry: {\n\t\t\t\t\t\ttype: 'Point',\n\t\t\t\t\t\tcoordinates: label.position.toArray()\n\t\t\t\t\t},\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdistance: label.text\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tfeatures.push(labelPoint);\n\t\t\t});\n\t\t}\n\n\t\tif (measurement.showArea) {\n\t\t\tlet point = measurement.areaLabel.position;\n\t\t\tlet labelArea = {\n\t\t\t\ttype: 'Feature',\n\t\t\t\tgeometry: {\n\t\t\t\t\ttype: 'Point',\n\t\t\t\t\tcoordinates: point.toArray()\n\t\t\t\t},\n\t\t\t\tproperties: {\n\t\t\t\t\tarea: measurement.areaLabel.text\n\t\t\t\t}\n\t\t\t};\n\t\t\tfeatures.push(labelArea);\n\t\t}\n\n\t\treturn features;\n\t}\n\n\tstatic toString (measurements) {\n\t\tif (!(measurements instanceof Array)) {\n\t\t\tmeasurements = [measurements];\n\t\t}\n\n\t\tmeasurements = measurements.filter(m => m instanceof Measure);\n\n\t\tlet features = [];\n\t\tfor (let measure of measurements) {\n\t\t\tlet f = GeoJSONExporter.measurementToFeatures(measure);\n\n\t\t\tfeatures = features.concat(f);\n\t\t}\n\n\t\tlet geojson = {\n\t\t\t'type': 'FeatureCollection',\n\t\t\t'features': features\n\t\t};\n\n\t\treturn JSON.stringify(geojson, null, '\\t');\n\t}\n\n}\n","/**\n *\n * @author sigeom sa / http://sigeom.ch\n * @author Ioda-Net Sàrl / https://www.ioda-net.ch/\n * @author Markus Schuetz / http://potree.org\n *\n */\n\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Measure} from \"../utils/Measure.js\";\n\nexport class DXFExporter {\n\n\tstatic measurementPointSection (measurement) {\n\t\tlet position = measurement.points[0].position;\n\n\t\tif (!position) {\n\t\t\treturn '';\n\t\t}\n\n\t\tlet dxfSection = `0\nCIRCLE\n8\nlayer_point\n10\n${position.x}\n20\n${position.y}\n30\n${position.z}\n40\n1.0\n`;\n\n\t\treturn dxfSection;\n\t}\n\n\tstatic measurementPolylineSection (measurement) {\n\t\t// bit code for polygons/polylines:\n\t\t// https://www.autodesk.com/techpubs/autocad/acad2000/dxf/polyline_dxf_06.htm\n\t\tlet geomCode = 8;\n\t\tif (measurement.closed) {\n\t\t\tgeomCode += 1;\n\t\t}\n\n\t\tlet dxfSection = `0\nPOLYLINE\n8\nlayer_polyline\n62\n1\n66\n1\n10\n0.0\n20\n0.0\n30\n0.0\n70\n${geomCode}\n`;\n\n\t\tlet xMax = 0.0;\n\t\tlet yMax = 0.0;\n\t\tlet zMax = 0.0;\n\t\tfor (let point of measurement.points) {\n\t\t\tpoint = point.position;\n\t\t\txMax = Math.max(xMax, point.x);\n\t\t\tyMax = Math.max(yMax, point.y);\n\t\t\tzMax = Math.max(zMax, point.z);\n\n\t\t\tdxfSection += `0\nVERTEX\n8\n0\n10\n${point.x}\n20\n${point.y}\n30\n${point.z}\n70\n32\n`;\n\t\t}\n\t\tdxfSection += `0\nSEQEND\n`;\n\n\t\treturn dxfSection;\n\t}\n\n\tstatic measurementSection (measurement) {\n\t\t// if(measurement.points.length <= 1){\n\t\t//\treturn \"\";\n\t\t// }\n\n\t\tif (measurement.points.length === 0) {\n\t\t\treturn '';\n\t\t} else if (measurement.points.length === 1) {\n\t\t\treturn DXFExporter.measurementPointSection(measurement);\n\t\t} else if (measurement.points.length >= 2) {\n\t\t\treturn DXFExporter.measurementPolylineSection(measurement);\n\t\t}\n\t}\n\n\tstatic toString(measurements){\n\t\tif (!(measurements instanceof Array)) {\n\t\t\tmeasurements = [measurements];\n\t\t}\n\t\tmeasurements = measurements.filter(m => m instanceof Measure);\n\n\t\tlet points = measurements.filter(m => (m instanceof Measure))\n\t\t\t.map(m => m.points)\n\t\t\t.reduce((a, v) => a.concat(v))\n\t\t\t.map(p => p.position);\n\n\t\tlet min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\tlet max = new THREE.Vector3(-Infinity, -Infinity, -Infinity);\n\t\tfor (let point of points) {\n\t\t\tmin.min(point);\n\t\t\tmax.max(point);\n\t\t}\n\n\t\tlet dxfHeader = `999\nDXF created from potree\n0\nSECTION\n2\nHEADER\n9\n$ACADVER\n1\nAC1006\n9\n$INSBASE\n10\n0.0\n20\n0.0\n30\n0.0\n9\n$EXTMIN\n10\n${min.x}\n20\n${min.y}\n30\n${min.z}\n9\n$EXTMAX\n10\n${max.x}\n20\n${max.y}\n30\n${max.z}\n0\nENDSEC\n`;\n\n\t\tlet dxfBody = `0\nSECTION\n2\nENTITIES\n`;\n\n\t\tfor (let measurement of measurements) {\n\t\t\tdxfBody += DXFExporter.measurementSection(measurement);\n\t\t}\n\n\t\tdxfBody += `0\nENDSEC\n`;\n\n\t\tlet dxf = dxfHeader + dxfBody + '0\\nEOF';\n\n\t\treturn dxf;\n\t}\n\n}\n","\n\nimport {Utils} from \"../../utils.js\";\n\nexport class MeasurePanel{\n\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tthis.viewer = viewer;\n\t\tthis.measurement = measurement;\n\t\tthis.propertiesPanel = propertiesPanel;\n\n\t\tthis._update = () => { this.update(); };\n\t}\n\n\tcreateCoordinatesTable(points){\n\t\tlet table = $(`\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    xyz
    \n\t\t`);\n\n\t\tlet copyIconPath = Potree.resourcePath + '/icons/copy.svg';\n\n\t\tfor (let point of points) {\n\t\t\tlet x = Utils.addCommas(point.x.toFixed(3));\n\t\t\tlet y = Utils.addCommas(point.y.toFixed(3));\n\t\t\tlet z = Utils.addCommas(point.z.toFixed(3));\n\n\t\t\tlet row = $(`\n\t\t\t\t\n\t\t\t\t\t${x}\n\t\t\t\t\t${y}\n\t\t\t\t\t${z}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t`);\n\n\t\t\tthis.elCopy = row.find(\"img[name=copy]\");\n\t\t\tthis.elCopy.click( () => {\n\t\t\t\tlet msg = point.toArray().map(c => c.toFixed(3)).join(\", \");\n\t\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t\t});\n\n\t\t\ttable.append(row);\n\t\t}\n\n\t\treturn table;\n\t};\n\n\tcreateAttributesTable(){\n\t\tlet elTable = $('
    ');\n\n\t\tlet point = this.measurement.points[0];\n\t\t\n\t\tfor(let attributeName of Object.keys(point)){\n\t\t\tif(attributeName === \"position\"){\n\t\t\t\n\t\t\t}else if(attributeName === \"rgba\"){\n\t\t\t\tlet color = point.rgba;\n\t\t\t\tlet text = color.join(', ');\n\n\t\t\t\telTable.append($(`\n\t\t\t\t\t\n\t\t\t\t\t\trgb\n\t\t\t\t\t\t${text}\n\t\t\t\t\t\n\t\t\t\t`));\n\t\t\t}else{\n\t\t\t\tlet value = point[attributeName];\n\t\t\t\tlet text = value.join(', ');\n\n\t\t\t\telTable.append($(`\n\t\t\t\t\t\n\t\t\t\t\t\t${attributeName}\n\t\t\t\t\t\t${text}\n\t\t\t\t\t\n\t\t\t\t`));\n\t\t\t}\n\t\t}\n\n\t\treturn elTable;\n\t}\n\n\tupdate(){\n\n\t}\n};","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\nimport {Profile} from \"./../../utils/Profile.js\";\n\nexport class DistancePanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\t\t\n\t\tthis.elMakeProfile = this.elContent.find(\"input[name=make_profile]\");\n\t\tthis.elMakeProfile.click( () => {\n\t\t\t//measurement.points;\n\t\t\tconst profile = new Profile();\n\n\t\t\tprofile.name = measurement.name;\n\t\t\tprofile.width = measurement.getTotalDistance() / 50;\n\n\t\t\tfor(const point of measurement.points){\n\t\t\t\tprofile.addMarker(point.position.clone());\n\t\t\t}\n\n\t\t\tthis.viewer.scene.addProfile(profile);\n\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\tlet positions = this.measurement.points.map(p => p.position);\n\t\tlet distances = [];\n\t\tfor (let i = 0; i < positions.length - 1; i++) {\n\t\t\tlet d = positions[i].distanceTo(positions[i + 1]);\n\t\t\tdistances.push(d.toFixed(3));\n\t\t}\n\n\t\tlet totalDistance = this.measurement.getTotalDistance().toFixed(3);\n\t\tlet elDistanceTable = this.elContent.find(`#distances_table`);\n\t\telDistanceTable.empty();\n\n\t\tfor (let i = 0; i < distances.length; i++) {\n\t\t\tlet label = (i === 0) ? 'Distances: ' : '';\n\t\t\tlet distance = distances[i];\n\t\t\tlet elDistance = $(`\n\t\t\t\t\n\t\t\t\t\t${label}\n\t\t\t\t\t${distance}\n\t\t\t\t`);\n\t\t\telDistanceTable.append(elDistance);\n\t\t}\n\n\t\tlet elTotal = $(`\n\t\t\t\n\t\t\t\tTotal: ${totalDistance}\n\t\t\t`);\n\t\telDistanceTable.append(elTotal);\n\t}\n};\n","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class PointPanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\tlet elAttributesContainer = this.elContent.find('.attributes_table_container');\n\t\telAttributesContainer.empty();\n\t\telAttributesContainer.append(this.createAttributesTable());\n\t}\n};","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class AreaPanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\tArea: \n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\tlet elArea = this.elContent.find(`#measurement_area`);\n\t\telArea.html(this.measurement.getArea().toFixed(3));\n\t}\n};","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class AnglePanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \\u03b1\\u03b2\\u03b3
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\tlet angles = [];\n\t\tfor(let i = 0; i < this.measurement.points.length; i++){\n\t\t\tangles.push(this.measurement.getAngle(i) * (180.0 / Math.PI));\n\t\t}\n\t\tangles = angles.map(a => a.toFixed(1) + '\\u00B0');\n\n\t\tlet elAlpha = this.elContent.find(`#angle_cell_alpha`);\n\t\tlet elBetta = this.elContent.find(`#angle_cell_betta`);\n\t\tlet elGamma = this.elContent.find(`#angle_cell_gamma`);\n\n\t\telAlpha.html(angles[0]);\n\t\telBetta.html(angles[1]);\n\t\telGamma.html(angles[2]);\n\t}\n};","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class CirclePanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\tconst elInfos = this.elContent.find(`#infos_table`);\n\n\t\tif(this.measurement.points.length !== 3){\n\t\t\telInfos.empty();\n\t\t\t\n\t\t\treturn;\n\t\t}\n\n\t\tconst A = this.measurement.points[0].position;\n\t\tconst B = this.measurement.points[1].position;\n\t\tconst C = this.measurement.points[2].position;\n\n\t\tconst center = Potree.Utils.computeCircleCenter(A, B, C);\n\t\tconst radius = center.distanceTo(A);\n\t\tconst circumference = 2 * Math.PI * radius;\n\t\t\n\t\tconst format = (number) => {\n\t\t\treturn Potree.Utils.addCommas(number.toFixed(3));\n\t\t};\n\n\t\t\n\t\tconst txtCenter = `${format(center.x)} ${format(center.y)} ${format(center.z)}`;\n\t\tconst txtRadius = format(radius);\n\t\tconst txtCircumference = format(circumference);\n\n\t\tconst thStyle = `style=\"text-align: left\"`;\n\t\tconst tdStyle = `style=\"width: 100%; padding: 5px;\"`;\n\t\t\n\t\telInfos.html(`\n\t\t\t\n\t\t\t\tCenter: \n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t${txtCenter}\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\tRadius: \n\t\t\t\t${txtRadius}\n\t\t\t\n\t\t\t\n\t\t\t\tCircumference: \n\t\t\t\t${txtCircumference}\n\t\t\t\n\t\t`);\n\t}\n};\n","\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class HeightPanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\tHeight:
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeMeasurement(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points.map(p => p.position)));\n\n\t\t{\n\t\t\tlet points = this.measurement.points;\n\n\t\t\tlet sorted = points.slice().sort((a, b) => a.position.z - b.position.z);\n\t\t\tlet lowPoint = sorted[0].position.clone();\n\t\t\tlet highPoint = sorted[sorted.length - 1].position.clone();\n\t\t\tlet min = lowPoint.z;\n\t\t\tlet max = highPoint.z;\n\t\t\tlet height = max - min;\n\t\t\theight = height.toFixed(3);\n\n\t\t\tthis.elHeightLabel = this.elContent.find(`#height_label`);\n\t\t\tthis.elHeightLabel.html(`Height: ${height}`);\n\t\t}\n\t}\n};","\nimport * as THREE from \"../../../libs/three.js/build/three.module.js\";\nimport {Utils} from \"../../utils.js\";\nimport {Volume, BoxVolume, SphereVolume} from \"../../utils/Volume.js\";\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class VolumePanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet copyIconPath = Potree.resourcePath + '/icons/copy.svg';\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\n\t\tlet lblLengthText = new Map([\n\t\t\t[BoxVolume, \"length\"],\n\t\t\t[SphereVolume, \"rx\"],\n\t\t]).get(measurement.constructor);\n\n\t\tlet lblWidthText = new Map([\n\t\t\t[BoxVolume, \"width\"],\n\t\t\t[SphereVolume, \"ry\"],\n\t\t]).get(measurement.constructor);\n\n\t\tlet lblHeightText = new Map([\n\t\t\t[BoxVolume, \"height\"],\n\t\t\t[SphereVolume, \"rz\"],\n\t\t]).get(measurement.constructor);\n\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \\u03b1\\u03b2\\u03b3
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    ${lblLengthText}${lblWidthText}${lblHeightText}
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t
    \n\t\t\t\tVolume: \n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
  • \n\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
  • \n\n\n\t\t\t\t\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
  • \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\t{ // download\n\t\t\tthis.elDownloadButton = this.elContent.find(\"input[name=download_volume]\");\n\n\t\t\tif(this.propertiesPanel.viewer.server){\n\t\t\t\tthis.elDownloadButton.click(() => this.download());\n\t\t\t} else {\n\t\t\t\tthis.elDownloadButton.hide();\n\t\t\t}\n\t\t}\n\n\t\tthis.elCopyRotation = this.elContent.find(\"img[name=copyRotation]\");\n\t\tthis.elCopyRotation.click( () => {\n\t\t\tlet rotation = this.measurement.rotation.toArray().slice(0, 3);\n\t\t\tlet msg = rotation.map(c => c.toFixed(3)).join(\", \");\n\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t});\n\n\t\tthis.elCopyScale = this.elContent.find(\"img[name=copyScale]\");\n\t\tthis.elCopyScale.click( () => {\n\t\t\tlet scale = this.measurement.scale.toArray();\n\t\t\tlet msg = scale.map(c => c.toFixed(3)).join(\", \");\n\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t});\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeVolume(measurement);\n\t\t});\n\n\t\tthis.elContent.find(\"#volume_reset_orientation\").click(() => {\n\t\t\tmeasurement.rotation.set(0, 0, 0);\n\t\t});\n\n\t\tthis.elContent.find(\"#volume_make_uniform\").click(() => {\n\t\t\tlet mean = (measurement.scale.x + measurement.scale.y + measurement.scale.z) / 3;\n\t\t\tmeasurement.scale.set(mean, mean, mean);\n\t\t});\n\n\t\tthis.elCheckClip = this.elContent.find('#volume_clip');\n\t\tthis.elCheckClip.click(event => {\n\t\t\tthis.measurement.clip = event.target.checked;\n\t\t});\n\n\t\tthis.elCheckShow = this.elContent.find('#volume_show');\n\t\tthis.elCheckShow.click(event => {\n\t\t\tthis.measurement.visible = event.target.checked;\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"position_changed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"orientation_changed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"scale_changed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"clip_changed\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tasync download(){\n\n\t\tlet clipBox = this.measurement;\n\n\t\tlet regions = [];\n\t\t//for(let clipBox of boxes){\n\t\t{\n\t\t\tlet toClip = clipBox.matrixWorld;\n\n\t\t\tlet px = new THREE.Vector3(+0.5, 0, 0).applyMatrix4(toClip);\n\t\t\tlet nx = new THREE.Vector3(-0.5, 0, 0).applyMatrix4(toClip);\n\t\t\tlet py = new THREE.Vector3(0, +0.5, 0).applyMatrix4(toClip);\n\t\t\tlet ny = new THREE.Vector3(0, -0.5, 0).applyMatrix4(toClip);\n\t\t\tlet pz = new THREE.Vector3(0, 0, +0.5).applyMatrix4(toClip);\n\t\t\tlet nz = new THREE.Vector3(0, 0, -0.5).applyMatrix4(toClip);\n\n\t\t\tlet pxN = new THREE.Vector3().subVectors(nx, px).normalize();\n\t\t\tlet nxN = pxN.clone().multiplyScalar(-1);\n\t\t\tlet pyN = new THREE.Vector3().subVectors(ny, py).normalize();\n\t\t\tlet nyN = pyN.clone().multiplyScalar(-1);\n\t\t\tlet pzN = new THREE.Vector3().subVectors(nz, pz).normalize();\n\t\t\tlet nzN = pzN.clone().multiplyScalar(-1);\n\n\t\t\tlet planes = [\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(pxN, px),\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(nxN, nx),\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(pyN, py),\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(nyN, ny),\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(pzN, pz),\n\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(nzN, nz),\n\t\t\t];\n\n\t\t\tlet planeQueryParts = [];\n\t\t\tfor(let plane of planes){\n\t\t\t\tlet part = [plane.normal.toArray(), plane.constant].join(\",\");\n\t\t\t\tpart = `[${part}]`;\n\t\t\t\tplaneQueryParts.push(part);\n\t\t\t}\n\t\t\tlet region = \"[\" + planeQueryParts.join(\",\") + \"]\";\n\t\t\tregions.push(region);\n\t\t}\n\n\t\tlet regionsArg = regions.join(\",\");\n\n\t\tlet pointcloudArgs = [];\n\t\tfor(let pointcloud of this.viewer.scene.pointclouds){\n\t\t\tif(!pointcloud.visible){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet offset = pointcloud.pcoGeometry.offset.clone();\n\t\t\tlet negateOffset = new THREE.Matrix4().makeTranslation(...offset.multiplyScalar(-1).toArray());\n\t\t\tlet matrixWorld = pointcloud.matrixWorld;\n\n\t\t\tlet transform = new THREE.Matrix4().multiplyMatrices(matrixWorld, negateOffset);\n\n\t\t\tlet path = `${window.location.pathname}/../${pointcloud.pcoGeometry.url}`;\n\n\t\t\tlet arg = {\n\t\t\t\tpath: path,\n\t\t\t\ttransform: transform.elements,\n\t\t\t};\n\t\t\tlet argString = JSON.stringify(arg);\n\n\t\t\tpointcloudArgs.push(argString);\n\t\t}\n\t\tlet pointcloudsArg = pointcloudArgs.join(\",\");\n\n\t\tlet elMessage = this.elContent.find(\"div[name=download_message]\");\n\n\t\tlet error = (message) => {\n\t\t\telMessage.html(`
    ERROR: ${message}
    `);\n\t\t};\n\n\t\tlet info = (message) => {\n\t\t\telMessage.html(`${message}`);\n\t\t};\n\n\t\tlet handle = null;\n\t\t{ // START FILTER\n\t\t\tlet url = `${viewer.server}/create_regions_filter?pointclouds=[${pointcloudsArg}]®ions=[${regionsArg}]`;\n\t\t\t\n\t\t\t//console.log(url);\n\n\t\t\tinfo(\"estimating results ...\");\n\n\t\t\tlet response = await fetch(url);\n\t\t\tlet jsResponse = await response.json();\n\t\t\t//console.log(jsResponse);\n\n\t\t\tif(!jsResponse.handle){\n\t\t\t\terror(jsResponse.message);\n\t\t\t\treturn;\n\t\t\t}else{\n\t\t\t\thandle = jsResponse.handle;\n\t\t\t}\n\t\t}\n\n\t\t{ // WAIT, CHECK PROGRESS, HANDLE FINISH\n\t\t\tlet url = `${viewer.server}/check_regions_filter?handle=${handle}`;\n\n\t\t\tlet sleep = (function(duration){\n\t\t\t\treturn new Promise( (res, rej) => {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tres();\n\t\t\t\t\t}, duration);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tlet handleFiltering = (jsResponse) => {\n\t\t\t\tlet {progress, estimate} = jsResponse;\n\n\t\t\t\tlet progressFract = progress[\"processed points\"] / estimate.points;\n\t\t\t\tlet progressPercents = parseInt(progressFract * 100);\n\n\t\t\t\tinfo(`progress: ${progressPercents}%`);\n\t\t\t};\n\n\t\t\tlet handleFinish = (jsResponse) => {\n\t\t\t\tlet message = \"downloads ready:
    \";\n\t\t\t\tmessage += \"
      \";\n\n\t\t\t\tfor(let i = 0; i < jsResponse.pointclouds.length; i++){\n\t\t\t\t\tlet url = `${viewer.server}/download_regions_filter_result?handle=${handle}&index=${i}`;\n\n\t\t\t\t\tmessage += `
    • result_${i}.las
    • \\n`;\n\t\t\t\t}\n\n\t\t\t\tlet reportURL = `${viewer.server}/download_regions_filter_report?handle=${handle}`;\n\t\t\t\tmessage += `
    • report.json
    • \\n`;\n\t\t\t\tmessage += \"
    \";\n\n\t\t\t\tinfo(message);\n\t\t\t};\n\n\t\t\tlet handleUnexpected = (jsResponse) => {\n\t\t\t\tlet message = `Unexpected Response.
    status: ${jsResponse.status}
    message: ${jsResponse.message}`;\n\t\t\t\tinfo(message);\n\t\t\t};\n\n\t\t\tlet handleError = (jsResponse) => {\n\t\t\t\tlet message = `ERROR: ${jsResponse.message}`;\n\t\t\t\terror(message);\n\n\t\t\t\tthrow new Error(message);\n\t\t\t};\n\n\t\t\tlet start = Date.now();\n\n\t\t\twhile(true){\n\t\t\t\tlet response = await fetch(url);\n\t\t\t\tlet jsResponse = await response.json();\n\n\t\t\t\tif(jsResponse.status === \"ERROR\"){\n\t\t\t\t\thandleError(jsResponse);\n\t\t\t\t}else if(jsResponse.status === \"FILTERING\"){\n\t\t\t\t\thandleFiltering(jsResponse);\n\t\t\t\t}else if(jsResponse.status === \"FINISHED\"){\n\t\t\t\t\thandleFinish(jsResponse);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}else{\n\t\t\t\t\thandleUnexpected(jsResponse);\n\t\t\t\t}\n\n\t\t\t\tlet durationS = (Date.now() - start) / 1000;\n\t\t\t\tlet sleepAmountMS = durationS < 10 ? 100 : 1000;\n\n\t\t\t\tawait sleep(sleepAmountMS);\n\t\t\t}\n\t\t}\n\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable([this.measurement.position]));\n\n\t\t{\n\t\t\tlet angles = this.measurement.rotation.toVector3();\n\t\t\tangles = angles.toArray();\n\t\t\t//angles = [angles.z, angles.x, angles.y];\n\t\t\tangles = angles.map(v => 180 * v / Math.PI);\n\t\t\tangles = angles.map(a => a.toFixed(1) + '\\u00B0');\n\n\t\t\tlet elAlpha = this.elContent.find(`#angle_cell_alpha`);\n\t\t\tlet elBetta = this.elContent.find(`#angle_cell_betta`);\n\t\t\tlet elGamma = this.elContent.find(`#angle_cell_gamma`);\n\n\t\t\telAlpha.html(angles[0]);\n\t\t\telBetta.html(angles[1]);\n\t\t\telGamma.html(angles[2]);\n\t\t}\n\n\t\t{\n\t\t\tlet dimensions = this.measurement.scale.toArray();\n\t\t\tdimensions = dimensions.map(v => Utils.addCommas(v.toFixed(2)));\n\n\t\t\tlet elLength = this.elContent.find(`#cell_length`);\n\t\t\tlet elWidth = this.elContent.find(`#cell_width`);\n\t\t\tlet elHeight = this.elContent.find(`#cell_height`);\n\n\t\t\telLength.html(dimensions[0]);\n\t\t\telWidth.html(dimensions[1]);\n\t\t\telHeight.html(dimensions[2]);\n\t\t}\n\n\t\t{\n\t\t\tlet elVolume = this.elContent.find(`#measurement_volume`);\n\t\t\tlet volume = this.measurement.getVolume();\n\t\t\telVolume.html(Utils.addCommas(volume.toFixed(2)));\n\t\t}\n\n\t\tthis.elCheckClip.prop(\"checked\", this.measurement.clip);\n\t\tthis.elCheckShow.prop(\"checked\", this.measurement.visible);\n\n\t}\n};","\nimport * as THREE from \"../../../libs/three.js/build/three.module.js\";\nimport {MeasurePanel} from \"./MeasurePanel.js\";\n\nexport class ProfilePanel extends MeasurePanel{\n\tconstructor(viewer, measurement, propertiesPanel){\n\t\tsuper(viewer, measurement, propertiesPanel);\n\n\t\tlet removeIconPath = Potree.resourcePath + '/icons/remove.svg';\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\tWidth: \n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
  • \n\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tthis.elRemove = this.elContent.find(\"img[name=remove]\");\n\t\tthis.elRemove.click( () => {\n\t\t\tthis.viewer.scene.removeProfile(measurement);\n\t\t});\n\n\t\t{ // download\n\t\t\tthis.elDownloadButton = this.elContent.find(`input[name=download_profile]`);\n\n\t\t\tif(this.propertiesPanel.viewer.server){\n\t\t\t\tthis.elDownloadButton.click(() => this.download());\n\t\t\t} else {\n\t\t\t\tthis.elDownloadButton.hide();\n\t\t\t}\n\t\t}\n\n\t\t{ // width spinner\n\t\t\tlet elWidthSlider = this.elContent.find(`#sldProfileWidth`);\n\n\t\t\telWidthSlider.spinner({\n\t\t\t\tmin: 0, max: 10 * 1000 * 1000, step: 0.01,\n\t\t\t\tnumberFormat: 'n',\n\t\t\t\tstart: () => {},\n\t\t\t\tspin: (event, ui) => {\n\t\t\t\t\tlet value = elWidthSlider.spinner('value');\n\t\t\t\t\tmeasurement.setWidth(value);\n\t\t\t\t},\n\t\t\t\tchange: (event, ui) => {\n\t\t\t\t\tlet value = elWidthSlider.spinner('value');\n\t\t\t\t\tmeasurement.setWidth(value);\n\t\t\t\t},\n\t\t\t\tstop: (event, ui) => {\n\t\t\t\t\tlet value = elWidthSlider.spinner('value');\n\t\t\t\t\tmeasurement.setWidth(value);\n\t\t\t\t},\n\t\t\t\tincremental: (count) => {\n\t\t\t\t\tlet value = elWidthSlider.spinner('value');\n\t\t\t\t\tlet step = elWidthSlider.spinner('option', 'step');\n\n\t\t\t\t\tlet delta = value * 0.05;\n\t\t\t\t\tlet increments = Math.max(1, parseInt(delta / step));\n\n\t\t\t\t\treturn increments;\n\t\t\t\t}\n\t\t\t});\n\t\t\telWidthSlider.spinner('value', measurement.getWidth());\n\t\t\telWidthSlider.spinner('widget').css('width', '100%');\n\n\t\t\tlet widthListener = (event) => {\n\t\t\t\tlet value = elWidthSlider.spinner('value');\n\t\t\t\tif (value !== measurement.getWidth()) {\n\t\t\t\t\telWidthSlider.spinner('value', measurement.getWidth());\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.propertiesPanel.addVolatileListener(measurement, \"width_changed\", widthListener);\n\t\t}\n\n\t\tlet elShow2DProfile = this.elContent.find(`#show_2d_profile`);\n\t\telShow2DProfile.click(() => {\n\t\t\tthis.propertiesPanel.viewer.profileWindow.show();\n\t\t\tthis.propertiesPanel.viewer.profileWindowController.setProfile(measurement);\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_added\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_removed\", this._update);\n\t\tthis.propertiesPanel.addVolatileListener(measurement, \"marker_moved\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tlet elCoordiantesContainer = this.elContent.find('.coordinates_table_container');\n\t\telCoordiantesContainer.empty();\n\t\telCoordiantesContainer.append(this.createCoordinatesTable(this.measurement.points));\n\t}\n\n\tasync download(){\n\n\t\tlet profile = this.measurement;\n\n\t\tlet regions = [];\n\t\t{\n\t\t\tlet segments = profile.getSegments();\n\t\t\tlet width = profile.width;\n\t\t\t\n\t\t\tfor(let segment of segments){\n\t\t\t\tlet start = segment.start.clone().multiply(new THREE.Vector3(1, 1, 0));\n\t\t\t\tlet end = segment.end.clone().multiply(new THREE.Vector3(1, 1, 0));\n\t\t\t\tlet center = new THREE.Vector3().addVectors(start, end).multiplyScalar(0.5);\n\t\t\t\t\n\t\t\t\tlet startEndDir = new THREE.Vector3().subVectors(end, start).normalize();\n\t\t\t\tlet endStartDir = new THREE.Vector3().subVectors(start, end).normalize();\n\t\t\t\tlet upDir = new THREE.Vector3(0, 0, 1);\n\t\t\t\tlet rightDir = new THREE.Vector3().crossVectors(startEndDir, upDir);\n\t\t\t\tlet leftDir = new THREE.Vector3().crossVectors(endStartDir, upDir);\n\t\t\t\t\n\t\t\t\tconsole.log(leftDir);\n\t\t\t\t\n\t\t\t\tlet right = rightDir.clone().multiplyScalar(width * 0.5).add(center);\n\t\t\t\tlet left = leftDir.clone().multiplyScalar(width * 0.5).add(center);\n\t\t\t\t\n\t\t\t\tlet planes = [\n\t\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(startEndDir, start),\n\t\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(endStartDir, end),\n\t\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(leftDir, right),\n\t\t\t\t\tnew THREE.Plane().setFromNormalAndCoplanarPoint(rightDir, left),\n\t\t\t\t];\n\t\t\t\t\n\t\t\t\tlet planeQueryParts = [];\n\t\t\t\tfor(let plane of planes){\n\t\t\t\t\tlet part = [plane.normal.toArray(), plane.constant].join(\",\");\n\t\t\t\t\tpart = `[${part}]`;\n\t\t\t\t\tplaneQueryParts.push(part);\n\t\t\t\t}\n\t\t\t\tlet region = \"[\" + planeQueryParts.join(\",\") + \"]\";\n\t\t\t\tregions.push(region);\n\t\t\t}\n\t\t}\n\n\t\tlet regionsArg = regions.join(\",\");\n\n\t\tlet pointcloudArgs = [];\n\t\tfor(let pointcloud of this.viewer.scene.pointclouds){\n\t\t\tif(!pointcloud.visible){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet offset = pointcloud.pcoGeometry.offset.clone();\n\t\t\tlet negateOffset = new THREE.Matrix4().makeTranslation(...offset.multiplyScalar(-1).toArray());\n\t\t\tlet matrixWorld = pointcloud.matrixWorld;\n\n\t\t\tlet transform = new THREE.Matrix4().multiplyMatrices(matrixWorld, negateOffset);\n\n\t\t\tlet path = `${window.location.pathname}/../${pointcloud.pcoGeometry.url}`;\n\n\t\t\tlet arg = {\n\t\t\t\tpath: path,\n\t\t\t\ttransform: transform.elements,\n\t\t\t};\n\t\t\tlet argString = JSON.stringify(arg);\n\n\t\t\tpointcloudArgs.push(argString);\n\t\t}\n\t\tlet pointcloudsArg = pointcloudArgs.join(\",\");\n\n\t\tlet elMessage = this.elContent.find(\"div[name=download_message]\");\n\n\t\tlet error = (message) => {\n\t\t\telMessage.html(`
    ERROR: ${message}
    `);\n\t\t};\n\n\t\tlet info = (message) => {\n\t\t\telMessage.html(`${message}`);\n\t\t};\n\n\t\tlet handle = null;\n\t\t{ // START FILTER\n\t\t\tlet url = `${viewer.server}/create_regions_filter?pointclouds=[${pointcloudsArg}]®ions=[${regionsArg}]`;\n\t\t\t\n\t\t\t//console.log(url);\n\n\t\t\tinfo(\"estimating results ...\");\n\n\t\t\tlet response = await fetch(url);\n\t\t\tlet jsResponse = await response.json();\n\t\t\t//console.log(jsResponse);\n\n\t\t\tif(!jsResponse.handle){\n\t\t\t\terror(jsResponse.message);\n\t\t\t\treturn;\n\t\t\t}else{\n\t\t\t\thandle = jsResponse.handle;\n\t\t\t}\n\t\t}\n\n\t\t{ // WAIT, CHECK PROGRESS, HANDLE FINISH\n\t\t\tlet url = `${viewer.server}/check_regions_filter?handle=${handle}`;\n\n\t\t\tlet sleep = (function(duration){\n\t\t\t\treturn new Promise( (res, rej) => {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tres();\n\t\t\t\t\t}, duration);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tlet handleFiltering = (jsResponse) => {\n\t\t\t\tlet {progress, estimate} = jsResponse;\n\n\t\t\t\tlet progressFract = progress[\"processed points\"] / estimate.points;\n\t\t\t\tlet progressPercents = parseInt(progressFract * 100);\n\n\t\t\t\tinfo(`progress: ${progressPercents}%`);\n\t\t\t};\n\n\t\t\tlet handleFinish = (jsResponse) => {\n\t\t\t\tlet message = \"downloads ready:
    \";\n\t\t\t\tmessage += \"
      \";\n\n\t\t\t\tfor(let i = 0; i < jsResponse.pointclouds.length; i++){\n\t\t\t\t\tlet url = `${viewer.server}/download_regions_filter_result?handle=${handle}&index=${i}`;\n\n\t\t\t\t\tmessage += `
    • result_${i}.las
    • \\n`;\n\t\t\t\t}\n\n\t\t\t\tlet reportURL = `${viewer.server}/download_regions_filter_report?handle=${handle}`;\n\t\t\t\tmessage += `
    • report.json
    • \\n`;\n\t\t\t\tmessage += \"
    \";\n\n\t\t\t\tinfo(message);\n\t\t\t};\n\n\t\t\tlet handleUnexpected = (jsResponse) => {\n\t\t\t\tlet message = `Unexpected Response.
    status: ${jsResponse.status}
    message: ${jsResponse.message}`;\n\t\t\t\tinfo(message);\n\t\t\t};\n\n\t\t\tlet handleError = (jsResponse) => {\n\t\t\t\tlet message = `ERROR: ${jsResponse.message}`;\n\t\t\t\terror(message);\n\n\t\t\t\tthrow new Error(message);\n\t\t\t};\n\n\t\t\tlet start = Date.now();\n\n\t\t\twhile(true){\n\t\t\t\tlet response = await fetch(url);\n\t\t\t\tlet jsResponse = await response.json();\n\n\t\t\t\tif(jsResponse.status === \"ERROR\"){\n\t\t\t\t\thandleError(jsResponse);\n\t\t\t\t}else if(jsResponse.status === \"FILTERING\"){\n\t\t\t\t\thandleFiltering(jsResponse);\n\t\t\t\t}else if(jsResponse.status === \"FINISHED\"){\n\t\t\t\t\thandleFinish(jsResponse);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}else{\n\t\t\t\t\thandleUnexpected(jsResponse);\n\t\t\t\t}\n\n\t\t\t\tlet durationS = (Date.now() - start) / 1000;\n\t\t\t\tlet sleepAmountMS = durationS < 10 ? 100 : 1000;\n\n\t\t\t\tawait sleep(sleepAmountMS);\n\t\t\t}\n\t\t}\n\n\t}\n};","\nimport {Utils} from \"../../utils.js\";\n\nexport class CameraPanel{\n\tconstructor(viewer, propertiesPanel){\n\t\tthis.viewer = viewer;\n\t\tthis.propertiesPanel = propertiesPanel;\n\n\t\tthis._update = () => { this.update(); };\n\n\t\tlet copyIconPath = Potree.resourcePath + '/icons/copy.svg';\n\t\tthis.elContent = $(`\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    position
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    target
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t
    \n\t\t`);\n\n\t\tthis.elCopyPosition = this.elContent.find(\"img[name=copyPosition]\");\n\t\tthis.elCopyPosition.click( () => {\n\t\t\tlet pos = this.viewer.scene.getActiveCamera().position.toArray();\n\t\t\tlet msg = pos.map(c => c.toFixed(3)).join(\", \");\n\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t});\n\n\t\tthis.elCopyTarget = this.elContent.find(\"img[name=copyTarget]\");\n\t\tthis.elCopyTarget.click( () => {\n\t\t\tlet pos = this.viewer.scene.view.getPivot().toArray();\n\t\t\tlet msg = pos.map(c => c.toFixed(3)).join(\", \");\n\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t});\n\n\t\tthis.propertiesPanel.addVolatileListener(viewer, \"camera_changed\", this._update);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\t//console.log(\"updating camera panel\");\n\n\t\tlet camera = this.viewer.scene.getActiveCamera();\n\t\tlet view = this.viewer.scene.view;\n\n\t\tlet pos = camera.position.toArray().map(c => Utils.addCommas(c.toFixed(3)));\n\t\tthis.elContent.find(\"#camera_position_x\").html(pos[0]);\n\t\tthis.elContent.find(\"#camera_position_y\").html(pos[1]);\n\t\tthis.elContent.find(\"#camera_position_z\").html(pos[2]);\n\n\t\tlet target = view.getPivot().toArray().map(c => Utils.addCommas(c.toFixed(3)));\n\t\tthis.elContent.find(\"#camera_target_x\").html(target[0]);\n\t\tthis.elContent.find(\"#camera_target_y\").html(target[1]);\n\t\tthis.elContent.find(\"#camera_target_z\").html(target[2]);\n\t}\n};","\nimport {Utils} from \"../../utils.js\";\n\nexport class AnnotationPanel{\n\tconstructor(viewer, propertiesPanel, annotation){\n\t\tthis.viewer = viewer;\n\t\tthis.propertiesPanel = propertiesPanel;\n\t\tthis.annotation = annotation;\n\n\t\tthis._update = () => { this.update(); };\n\n\t\tlet copyIconPath = `${Potree.resourcePath}/icons/copy.svg`;\n\t\tthis.elContent = $(`\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t
    position
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t
    \n\n\t\t\t\t
    Title
    \n\t\t\t\t
    \n\t\t\t\t\tAnnotation Title\n\t\t\t\t
    \n\n\t\t\t\t
    Description
    \n\t\t\t\t
    \n\t\t\t\t\tA longer description of this annotation. \n\t\t\t\t\t\tCan be multiple lines long. TODO: the user should be able\n\t\t\t\t\t\tto modify title and description. \n\t\t\t\t
    \n\n\t\t\t
    \n\n\t\t
    \n\t\t`);\n\n\t\tthis.elCopyPosition = this.elContent.find(\"img[name=copyPosition]\");\n\t\tthis.elCopyPosition.click( () => {\n\t\t\tlet pos = this.annotation.position.toArray();\n\t\t\tlet msg = pos.map(c => c.toFixed(3)).join(\", \");\n\t\t\tUtils.clipboardCopy(msg);\n\n\t\t\tthis.viewer.postMessage(\n\t\t\t\t\t`Copied value to clipboard:
    '${msg}'`,\n\t\t\t\t\t{duration: 3000});\n\t\t});\n\n\t\tthis.elTitle = this.elContent.find(\"#annotation_title\").html(annotation.title);\n\t\tthis.elDescription = this.elContent.find(\"#annotation_description\").html(annotation.description);\n\n\t\tthis.elTitle[0].addEventListener(\"input\", () => {\n\t\t\tconst title = this.elTitle.html();\n\t\t\tannotation.title = title;\n\n\t\t}, false);\n\n\t\tthis.elDescription[0].addEventListener(\"input\", () => {\n\t\t\tconst description = this.elDescription.html();\n\t\t\tannotation.description = description;\n\t\t}, false);\n\n\t\tthis.update();\n\t}\n\n\tupdate(){\n\t\tconst {annotation, elContent, elTitle, elDescription} = this;\n\n\t\tlet pos = annotation.position.toArray().map(c => Utils.addCommas(c.toFixed(3)));\n\t\telContent.find(\"#annotation_position_x\").html(pos[0]);\n\t\telContent.find(\"#annotation_position_y\").html(pos[1]);\n\t\telContent.find(\"#annotation_position_z\").html(pos[2]);\n\n\t\telTitle.html(annotation.title);\n\t\telDescription.html(annotation.description);\n\n\n\t}\n};","\nimport {Utils} from \"../../utils.js\";\n\nexport class CameraAnimationPanel{\n\tconstructor(viewer, propertiesPanel, animation){\n\t\tthis.viewer = viewer;\n\t\tthis.propertiesPanel = propertiesPanel;\n\t\tthis.animation = animation;\n\n\t\tthis.elContent = $(`\n\t\t\t
    \n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\tDuration: \n\t\t\t\t\t\t\n\t\t\t\t\t\n\n\t\t\t\t\tTime:
    \n\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tconst elPlay = this.elContent.find(\"input[name=play]\");\n\t\telPlay.click( () => {\n\t\t\tanimation.play();\n\t\t});\n\n\t\tconst elSlider = this.elContent.find('#sldTime');\n\t\telSlider.slider({\n\t\t\tvalue: 0,\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\tstep: 0.001,\n\t\t\tslide: (event, ui) => { \n\t\t\t\tanimation.set(ui.value);\n\t\t\t}\n\t\t});\n\n\t\tlet elDuration = this.elContent.find(`input[name=spnDuration]`);\n\t\telDuration.spinner({\n\t\t\tmin: 0, max: 300, step: 0.01,\n\t\t\tnumberFormat: 'n',\n\t\t\tstart: () => {},\n\t\t\tspin: (event, ui) => {\n\t\t\t\tlet value = elDuration.spinner('value');\n\t\t\t\tanimation.setDuration(value);\n\t\t\t},\n\t\t\tchange: (event, ui) => {\n\t\t\t\tlet value = elDuration.spinner('value');\n\t\t\t\tanimation.setDuration(value);\n\t\t\t},\n\t\t\tstop: (event, ui) => {\n\t\t\t\tlet value = elDuration.spinner('value');\n\t\t\t\tanimation.setDuration(value);\n\t\t\t},\n\t\t\tincremental: (count) => {\n\t\t\t\tlet value = elDuration.spinner('value');\n\t\t\t\tlet step = elDuration.spinner('option', 'step');\n\n\t\t\t\tlet delta = value * 0.05;\n\t\t\t\tlet increments = Math.max(1, parseInt(delta / step));\n\n\t\t\t\treturn increments;\n\t\t\t}\n\t\t});\n\t\telDuration.spinner('value', animation.getDuration());\n\t\telDuration.spinner('widget').css('width', '100%');\n\n\t\tconst elKeyframes = this.elContent.find(\"#animation_keyframes\");\n\n\t\tconst updateKeyframes = () => {\n\t\t\telKeyframes.empty();\n\n\t\t\t//let index = 0;\n\n\t\t\t// \n\t\t\t// \t\t\t\t\n\t\t\t// \t\t\t\n\n\t\t\tconst addNewKeyframeItem = (index) => {\n\t\t\t\tlet elNewKeyframe = $(`\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t`);\n\n\t\t\t\tconst elAdd = elNewKeyframe.find(\"input[name=add]\");\n\t\t\t\telAdd.click( () => {\n\t\t\t\t\tanimation.createControlPoint(index);\n\t\t\t\t});\n\n\t\t\t\telKeyframes.append(elNewKeyframe);\n\t\t\t};\n\n\t\t\tconst addKeyframeItem = (index) => {\n\t\t\t\tlet elKeyframe = $(`\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tkeyframe\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t`);\n\n\t\t\t\tconst elAssign = elKeyframe.find(\"img[name=assign]\");\n\t\t\t\tconst elMove = elKeyframe.find(\"img[name=move]\");\n\t\t\t\tconst elDelete = elKeyframe.find(\"img[name=delete]\");\n\n\t\t\t\telAssign.click( () => {\n\t\t\t\t\tconst cp = animation.controlPoints[index];\n\n\t\t\t\t\tcp.position.copy(viewer.scene.view.position);\n\t\t\t\t\tcp.target.copy(viewer.scene.view.getPivot());\n\t\t\t\t});\n\n\t\t\t\telMove.click( () => {\n\t\t\t\t\tconst cp = animation.controlPoints[index];\n\n\t\t\t\t\tviewer.scene.view.position.copy(cp.position);\n\t\t\t\t\tviewer.scene.view.lookAt(cp.target);\n\t\t\t\t});\n\n\t\t\t\telDelete.click( () => {\n\t\t\t\t\tconst cp = animation.controlPoints[index];\n\t\t\t\t\tanimation.removeControlPoint(cp);\n\t\t\t\t});\n\n\t\t\t\telKeyframes.append(elKeyframe);\n\t\t\t};\n\n\t\t\tlet index = 0;\n\n\t\t\taddNewKeyframeItem(index);\n\n\t\t\tfor(const cp of animation.controlPoints){\n\t\t\t\t\n\t\t\t\taddKeyframeItem(index);\n\t\t\t\tindex++;\n\t\t\t\taddNewKeyframeItem(index);\n\n\t\t\t}\n\t\t};\n\n\t\tupdateKeyframes();\n\n\t\tanimation.addEventListener(\"controlpoint_added\", updateKeyframes);\n\t\tanimation.addEventListener(\"controlpoint_removed\", updateKeyframes);\n\n\n\n\n\t\t// this._update = () => { this.update(); };\n\n\t\t// this.update();\n\t}\n\n\tupdate(){\n\t\t\n\t}\n};","\nimport * as THREE from \"../../../libs/three.js/build/three.module.js\";\nimport {Utils} from \"../../utils.js\";\nimport {PointCloudTree} from \"../../PointCloudTree.js\";\nimport {Annotation} from \"../../Annotation.js\";\nimport {Measure} from \"../../utils/Measure.js\";\nimport {Profile} from \"../../utils/Profile.js\";\nimport {Volume, BoxVolume, SphereVolume} from \"../../utils/Volume.js\";\nimport {CameraAnimation} from \"../../modules/CameraAnimation/CameraAnimation.js\";\nimport {PointSizeType, PointShape, ElevationGradientRepeat} from \"../../defines.js\";\nimport {Gradients} from \"../../materials/Gradients.js\";\n\nimport {MeasurePanel} from \"./MeasurePanel.js\";\nimport {DistancePanel} from \"./DistancePanel.js\";\nimport {PointPanel} from \"./PointPanel.js\";\nimport {AreaPanel} from \"./AreaPanel.js\";\nimport {AnglePanel} from \"./AnglePanel.js\";\nimport {CirclePanel} from \"./CirclePanel.js\";\nimport {HeightPanel} from \"./HeightPanel.js\";\nimport {VolumePanel} from \"./VolumePanel.js\";\nimport {ProfilePanel} from \"./ProfilePanel.js\";\nimport {CameraPanel} from \"./CameraPanel.js\";\nimport {AnnotationPanel} from \"./AnnotationPanel.js\";\nimport { CameraAnimationPanel } from \"./CameraAnimationPanel.js\";\n\nexport class PropertiesPanel{\n\n\tconstructor(container, viewer){\n\t\tthis.container = container;\n\t\tthis.viewer = viewer;\n\t\tthis.object = null;\n\t\tthis.cleanupTasks = [];\n\t\tthis.scene = null;\n\t}\n\n\tsetScene(scene){\n\t\tthis.scene = scene;\n\t}\n\n\tset(object){\n\t\tif(this.object === object){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.object = object;\n\t\t\n\t\tfor(let task of this.cleanupTasks){\n\t\t\ttask();\n\t\t}\n\t\tthis.cleanupTasks = [];\n\t\tthis.container.empty();\n\n\t\tif(object instanceof PointCloudTree){\n\t\t\tthis.setPointCloud(object);\n\t\t}else if(object instanceof Measure || object instanceof Profile || object instanceof Volume){\n\t\t\tthis.setMeasurement(object);\n\t\t}else if(object instanceof THREE.Camera){\n\t\t\tthis.setCamera(object);\n\t\t}else if(object instanceof Annotation){\n\t\t\tthis.setAnnotation(object);\n\t\t}else if(object instanceof CameraAnimation){\n\t\t\tthis.setCameraAnimation(object);\n\t\t}\n\t\t\n\t}\n\n\t//\n\t// Used for events that should be removed when the property object changes.\n\t// This is for listening to materials, scene, point clouds, etc.\n\t// not required for DOM listeners, since they are automatically cleared by removing the DOM subtree.\n\t//\n\taddVolatileListener(target, type, callback){\n\t\ttarget.addEventListener(type, callback);\n\t\tthis.cleanupTasks.push(() => {\n\t\t\ttarget.removeEventListener(type, callback);\n\t\t});\n\t}\n\n\tsetPointCloud(pointcloud){\n\n\t\tlet material = pointcloud.material;\n\n\t\tlet panel = $(`\n\t\t\t
    \n\t\t\t\t
      \n\n\t\t\t\t
    • \n\t\t\t\t
      \n\t\t\t\t
    • \n\t\t\t\t
    • \n\t\t\t\t
      \n\t\t\t\t
    • \n\n\t\t\t\t\n\t\t\t\t
    • \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    • \n\n\t\t\t\t\n\t\t\t\t
    • \n\t\t\t\t\t
      \n\t\t\t\t\t\n\t\t\t\t
    • \n\n\t\t\t\t
    • \n\t\t\t\t\n\t\t\t\t
    • \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t
    • :
    • \n\n\t\t\t\t
      \n\t\t\t\t\tAttribute\n\t\t\t\t
      \n\n\t\t\t\t
    • \n\t\t\t\t\t\n\t\t\t\t
    • \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tAttribute Weights\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • RGB:
      \t
    • \n\t\t\t\t\t
    • Intensity:
      \t
    • \n\t\t\t\t\t
    • Elevation:
      \t
    • \n\t\t\t\t\t
    • Classification:
      \t
    • \n\t\t\t\t\t
    • Return Number:
      \t
    • \n\t\t\t\t\t
    • Source ID:
      \t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tRGB\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • Gamma:
      \t
    • \n\t\t\t\t\t
    • Brightness:
      \t
    • \n\t\t\t\t\t
    • Contrast:
      \t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tExtra Attribute\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • :
    • \n\n\t\t\t\t\t
    • Gamma:
    • \n\t\t\t\t\t
    • Brightness:
    • \n\t\t\t\t\t
    • Contrast:
    • \n\t\t\t\t
      \n\t\t\t\t\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tMATCAP\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • \n\t\t\t\t\t\t
      \n\t\t\t\t\t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tColor\n\t\t\t\t\t
      \n\n\t\t\t\t\t\n\t\t\t\t
      \n\n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tElevation\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • :
      \t
    • \n\n\t\t\t\t\t
    • \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    • \n\n\t\t\t\t\t
    • \n\t\t\t\t\t\tGradient Scheme:\n\t\t\t\t\t\t
      \n\t\t\t\t\t\t
      \n\t\t\t\t\t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tTransition\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • transition:
      \t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tIntensity\n\t\t\t\t\t
      \n\n\t\t\t\t\t
    • Range:
      \t
    • \n\t\t\t\t\t
    • Gamma:
      \t
    • \n\t\t\t\t\t
    • Brightness:
      \t
    • \n\t\t\t\t\t
    • Contrast:
      \t
    • \n\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tGPS Time\n\t\t\t\t\t
      \n\n\t\t\t\t
      \n\t\t\t\t\n\t\t\t\t
      \n\t\t\t\t\t
      \n\t\t\t\t\t\tIndices\n\t\t\t\t\t
      \n\t\t\t\t
      \n\n\n\t\t\t\t
    \n\t\t\t
    \n\t\t`);\n\n\t\tpanel.i18n();\n\t\tthis.container.append(panel);\n\n\t\t{ // POINT SIZE\n\t\t\tlet sldPointSize = panel.find(`#sldPointSize`);\n\t\t\tlet lblPointSize = panel.find(`#lblPointSize`);\n\n\t\t\tsldPointSize.slider({\n\t\t\t\tvalue: material.size,\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 3,\n\t\t\t\tstep: 0.01,\n\t\t\t\tslide: function (event, ui) { material.size = ui.value; }\n\t\t\t});\n\n\t\t\tlet update = (e) => {\n\t\t\t\tlblPointSize.html(material.size.toFixed(2));\n\t\t\t\tsldPointSize.slider({value: material.size});\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"point_size_changed\", update);\n\t\t\t\n\t\t\tupdate();\n\t\t}\n\n\t\t{ // MINIMUM POINT SIZE\n\t\t\tlet sldMinPointSize = panel.find(`#sldMinPointSize`);\n\t\t\tlet lblMinPointSize = panel.find(`#lblMinPointSize`);\n\n\t\t\tsldMinPointSize.slider({\n\t\t\t\tvalue: material.size,\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 3,\n\t\t\t\tstep: 0.01,\n\t\t\t\tslide: function (event, ui) { material.minSize = ui.value; }\n\t\t\t});\n\n\t\t\tlet update = (e) => {\n\t\t\t\tlblMinPointSize.html(material.minSize.toFixed(2));\n\t\t\t\tsldMinPointSize.slider({value: material.minSize});\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"point_size_changed\", update);\n\t\t\t\n\t\t\tupdate();\n\t\t}\n\n\t\t{ // POINT SIZING\n\t\t\tlet strSizeType = Object.keys(PointSizeType)[material.pointSizeType];\n\n\t\t\tlet opt = panel.find(`#optPointSizing`);\n\t\t\topt.selectmenu();\n\t\t\topt.val(strSizeType).selectmenu('refresh');\n\n\t\t\topt.selectmenu({\n\t\t\t\tchange: (event, ui) => {\n\t\t\t\t\tmaterial.pointSizeType = PointSizeType[ui.item.value];\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t{ // SHAPE\n\t\t\tlet opt = panel.find(`#optShape`);\n\n\t\t\topt.selectmenu({\n\t\t\t\tchange: (event, ui) => {\n\t\t\t\t\tlet value = ui.item.value;\n\n\t\t\t\t\tmaterial.shape = PointShape[value];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet update = () => {\n\t\t\t\tlet typename = Object.keys(PointShape)[material.shape];\n\n\t\t\t\topt.selectmenu().val(typename).selectmenu('refresh');\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"point_shape_changed\", update);\n\n\t\t\tupdate();\n\t\t}\n\n\t\t{ // BACKFACE CULLING\n\t\t\t\n\t\t\tlet opt = panel.find(`#set_backface_culling`);\n\t\t\topt.click(() => {\n\t\t\t\tmaterial.backfaceCulling = opt.prop(\"checked\");\n\t\t\t});\n\t\t\tlet update = () => {\n\t\t\t\tlet value = material.backfaceCulling;\n\t\t\t\topt.prop(\"checked\", value);\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"backface_changed\", update);\n\t\t\tupdate();\n\n\t\t\tlet blockBackface = $('#materials_backface_container');\n\t\t\tblockBackface.css('display', 'none');\n\n\t\t\tconst pointAttributes = pointcloud.pcoGeometry.pointAttributes;\n\t\t\tconst hasNormals = pointAttributes.hasNormals ? pointAttributes.hasNormals() : false;\n\t\t\tif(hasNormals) {\n\t\t\t\tblockBackface.css('display', 'block');\n\t\t\t}\n\t\t\t/*\n\t\t\topt.checkboxradio({\n\t\t\t\tclicked: (event, ui) => {\n\t\t\t\t\t// let value = ui.item.value;\n\t\t\t\t\tlet value = ui.item.checked;\n\t\t\t\t\tconsole.log(value);\n\t\t\t\t\tmaterial.backfaceCulling = value; // $('#set_freeze').prop(\"checked\");\n\t\t\t\t}\n\t\t\t});\n\t\t\t*/\n\t\t}\n\n\t\t{ // OPACITY\n\t\t\tlet sldOpacity = panel.find(`#sldOpacity`);\n\t\t\tlet lblOpacity = panel.find(`#lblOpacity`);\n\n\t\t\tsldOpacity.slider({\n\t\t\t\tvalue: material.opacity,\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 1,\n\t\t\t\tstep: 0.001,\n\t\t\t\tslide: function (event, ui) { \n\t\t\t\t\tmaterial.opacity = ui.value;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet update = (e) => {\n\t\t\t\tlblOpacity.html(material.opacity.toFixed(2));\n\t\t\t\tsldOpacity.slider({value: material.opacity});\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"opacity_changed\", update);\n\n\t\t\tupdate();\n\t\t}\n\n\t\t{\n\n\t\t\tconst attributes = pointcloud.pcoGeometry.pointAttributes.attributes;\n\n\t\t\tlet options = [];\n\n\t\t\toptions.push(...attributes.map(a => a.name));\n\n\t\t\tconst intensityIndex = options.indexOf(\"intensity\");\n\t\t\tif(intensityIndex >= 0){\n\t\t\t\toptions.splice(intensityIndex + 1, 0, \"intensity gradient\");\n\t\t\t}\n\n\t\t\toptions.push(\n\t\t\t\t\"elevation\",\n\t\t\t\t\"color\",\n\t\t\t\t'matcap',\n\t\t\t\t'indices',\n\t\t\t\t'level of detail',\n\t\t\t\t'composite'\n\t\t\t);\n\n\t\t\tconst blacklist = [\n\t\t\t\t\"POSITION_CARTESIAN\",\n\t\t\t\t\"position\",\n\t\t\t];\n\n\t\t\toptions = options.filter(o => !blacklist.includes(o));\n\n\t\t\tlet attributeSelection = panel.find('#optMaterial');\n\t\t\tfor(let option of options){\n\t\t\t\tlet elOption = $(``);\n\t\t\t\tattributeSelection.append(elOption);\n\t\t\t}\n\n\t\t\tlet updateMaterialPanel = (event, ui) => {\n\t\t\t\tlet selectedValue = attributeSelection.selectmenu().val();\n\t\t\t\tmaterial.activeAttributeName = selectedValue;\n\n\t\t\t\tlet attribute = pointcloud.getAttribute(selectedValue);\n\n\t\t\t\tif(selectedValue === \"intensity gradient\"){\n\t\t\t\t\tattribute = pointcloud.getAttribute(\"intensity\");\n\t\t\t\t}\n\n\t\t\t\tconst isIntensity = attribute ? [\"intensity\", \"intensity gradient\"].includes(attribute.name) : false;\n\n\t\t\t\tif(isIntensity){\n\t\t\t\t\tif(pointcloud.material.intensityRange[0] === Infinity){\n\t\t\t\t\t\tpointcloud.material.intensityRange = attribute.range;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst [min, max] = attribute.range;\n\n\t\t\t\t\tpanel.find('#sldIntensityRange').slider({\n\t\t\t\t\t\trange: true,\n\t\t\t\t\t\tmin: min, max: max, step: 0.01,\n\t\t\t\t\t\tvalues: [min, max],\n\t\t\t\t\t\tslide: (event, ui) => {\n\t\t\t\t\t\t\tlet min = ui.values[0];\n\t\t\t\t\t\t\tlet max = ui.values[1];\n\t\t\t\t\t\t\tmaterial.intensityRange = [min, max];\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else if(attribute){\n\t\t\t\t\tconst [min, max] = attribute.range;\n\n\t\t\t\t\tlet selectedRange = material.getRange(attribute.name);\n\n\t\t\t\t\tif(!selectedRange){\n\t\t\t\t\t\tselectedRange = [...attribute.range];\n\t\t\t\t\t}\n\n\t\t\t\t\tlet minMaxAreNumbers = typeof min === \"number\" && typeof max === \"number\";\n\n\t\t\t\t\tif(minMaxAreNumbers){\n\t\t\t\t\t\tpanel.find('#sldExtraRange').slider({\n\t\t\t\t\t\t\trange: true,\n\t\t\t\t\t\t\tmin: min, \n\t\t\t\t\t\t\tmax: max, \n\t\t\t\t\t\t\tstep: 0.01,\n\t\t\t\t\t\t\tvalues: selectedRange,\n\t\t\t\t\t\t\tslide: (event, ui) => {\n\t\t\t\t\t\t\t\tlet [a, b] = ui.values;\n\n\t\t\t\t\t\t\t\tmaterial.setRange(attribute.name, [a, b]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tlet blockWeights = $('#materials\\\\.composite_weight_container');\n\t\t\t\tlet blockElevation = $('#materials\\\\.elevation_container');\n\t\t\t\tlet blockRGB = $('#materials\\\\.rgb_container');\n\t\t\t\tlet blockExtra = $('#materials\\\\.extra_container');\n\t\t\t\tlet blockColor = $('#materials\\\\.color_container');\n\t\t\t\tlet blockIntensity = $('#materials\\\\.intensity_container');\n\t\t\t\tlet blockIndex = $('#materials\\\\.index_container');\n\t\t\t\tlet blockTransition = $('#materials\\\\.transition_container');\n\t\t\t\tlet blockGps = $('#materials\\\\.gpstime_container');\n\t\t\t\tlet blockMatcap = $('#materials\\\\.matcap_container');\n\n\t\t\t\tblockIndex.css('display', 'none');\n\t\t\t\tblockIntensity.css('display', 'none');\n\t\t\t\tblockElevation.css('display', 'none');\n\t\t\t\tblockRGB.css('display', 'none');\n\t\t\t\tblockExtra.css('display', 'none');\n\t\t\t\tblockColor.css('display', 'none');\n\t\t\t\tblockWeights.css('display', 'none');\n\t\t\t\tblockTransition.css('display', 'none');\n\t\t\t\tblockMatcap.css('display', 'none');\n\t\t\t\tblockGps.css('display', 'none');\n\n\t\t\t\tif (selectedValue === 'composite') {\n\t\t\t\t\tblockWeights.css('display', 'block');\n\t\t\t\t\tblockElevation.css('display', 'block');\n\t\t\t\t\tblockRGB.css('display', 'block');\n\t\t\t\t\tblockIntensity.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'elevation') {\n\t\t\t\t\tblockElevation.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'RGB and Elevation') {\n\t\t\t\t\tblockRGB.css('display', 'block');\n\t\t\t\t\tblockElevation.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'rgba') {\n\t\t\t\t\tblockRGB.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'color') {\n\t\t\t\t\tblockColor.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'intensity') {\n\t\t\t\t\tblockIntensity.css('display', 'block');\n\t\t\t\t} else if (selectedValue === 'intensity gradient') {\n\t\t\t\t\tblockIntensity.css('display', 'block');\n\t\t\t\t} else if (selectedValue === \"indices\" ){\n\t\t\t\t\tblockIndex.css('display', 'block');\n\t\t\t\t} else if (selectedValue === \"matcap\" ){\n\t\t\t\t\tblockMatcap.css('display', 'block');\n\t\t\t\t} else if (selectedValue === \"classification\" ){\n\t\t\t\t\t// add classification color selctor?\n\t\t\t\t} else if (selectedValue === \"gps-time\" ){\n\t\t\t\t\tblockGps.css('display', 'block');\n\t\t\t\t} else if(selectedValue === \"number of returns\"){\n\t\t\t\t\t\n\t\t\t\t} else if(selectedValue === \"return number\"){\n\t\t\t\t\t\n\t\t\t\t} else if([\"source id\", \"point source id\"].includes(selectedValue)){\n\t\t\t\t\t\n\t\t\t\t} else{\n\t\t\t\t\tblockExtra.css('display', 'block');\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tattributeSelection.selectmenu({change: updateMaterialPanel});\n\n\t\t\tlet update = () => {\n\t\t\t\tattributeSelection.val(material.activeAttributeName).selectmenu('refresh');\n\t\t\t};\n\t\t\tthis.addVolatileListener(material, \"point_color_type_changed\", update);\n\t\t\tthis.addVolatileListener(material, \"active_attribute_changed\", update);\n\n\t\t\tupdate();\n\t\t\tupdateMaterialPanel();\n\t\t}\n\n\t\t{\n\t\t\tconst schemes = Object.keys(Potree.Gradients).map(name => ({name: name, values: Gradients[name]}));\n\n\t\t\tlet elSchemeContainer = panel.find(\"#elevation_gradient_scheme_selection\");\n\n\t\t\tfor(let scheme of schemes){\n\t\t\t\tlet elScheme = $(`\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t`);\n\n\t\t\t\tconst svg = Potree.Utils.createSvgGradient(scheme.values);\n\t\t\t\tsvg.setAttributeNS(null, \"class\", `button-icon`);\n\n\t\t\t\telScheme.append($(svg));\n\n\t\t\t\telScheme.click( () => {\n\t\t\t\t\tmaterial.gradient = Gradients[scheme.name];\n\t\t\t\t});\n\n\t\t\t\telSchemeContainer.append(elScheme);\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tlet matcaps = [\n\t\t\t\t{name: \"Normals\", icon: `${Potree.resourcePath}/icons/matcap/check_normal+y.jpg`}, \n\t\t\t\t{name: \"Basic 1\", icon: `${Potree.resourcePath}/icons/matcap/basic_1.jpg`}, \n\t\t\t\t{name: \"Basic 2\", icon: `${Potree.resourcePath}/icons/matcap/basic_2.jpg`}, \n\t\t\t\t{name: \"Basic Dark\", icon: `${Potree.resourcePath}/icons/matcap/basic_dark.jpg`}, \n\t\t\t\t{name: \"Basic Side\", icon: `${Potree.resourcePath}/icons/matcap/basic_side.jpg`}, \n\t\t\t\t{name: \"Ceramic Dark\", icon: `${Potree.resourcePath}/icons/matcap/ceramic_dark.jpg`}, \n\t\t\t\t{name: \"Ceramic Lightbulb\", icon: `${Potree.resourcePath}/icons/matcap/ceramic_lightbulb.jpg`}, \n\t\t\t\t{name: \"Clay Brown\", icon: `${Potree.resourcePath}/icons/matcap/clay_brown.jpg`}, \n\t\t\t\t{name: \"Clay Muddy\", icon: `${Potree.resourcePath}/icons/matcap/clay_muddy.jpg`}, \n\t\t\t\t{name: \"Clay Studio\", icon: `${Potree.resourcePath}/icons/matcap/clay_studio.jpg`}, \n\t\t\t\t{name: \"Resin\", icon: `${Potree.resourcePath}/icons/matcap/resin.jpg`}, \n\t\t\t\t{name: \"Skin\", icon: `${Potree.resourcePath}/icons/matcap/skin.jpg`}, \n\t\t\t\t{name: \"Jade\", icon: `${Potree.resourcePath}/icons/matcap/jade.jpg`}, \n\t\t\t\t{name: \"Metal_ Anisotropic\", icon: `${Potree.resourcePath}/icons/matcap/metal_anisotropic.jpg`}, \n\t\t\t\t{name: \"Metal Carpaint\", icon: `${Potree.resourcePath}/icons/matcap/metal_carpaint.jpg`}, \n\t\t\t\t{name: \"Metal Lead\", icon: `${Potree.resourcePath}/icons/matcap/metal_lead.jpg`}, \n\t\t\t\t{name: \"Metal Shiny\", icon: `${Potree.resourcePath}/icons/matcap/metal_shiny.jpg`}, \n\t\t\t\t{name: \"Pearl\", icon: `${Potree.resourcePath}/icons/matcap/pearl.jpg`}, \n\t\t\t\t{name: \"Toon\", icon: `${Potree.resourcePath}/icons/matcap/toon.jpg`},\n\t\t\t\t{name: \"Check Rim Light\", icon: `${Potree.resourcePath}/icons/matcap/check_rim_light.jpg`}, \n\t\t\t\t{name: \"Check Rim Dark\", icon: `${Potree.resourcePath}/icons/matcap/check_rim_dark.jpg`}, \n\t\t\t\t{name: \"Contours 1\", icon: `${Potree.resourcePath}/icons/matcap/contours_1.jpg`}, \n\t\t\t\t{name: \"Contours 2\", icon: `${Potree.resourcePath}/icons/matcap/contours_2.jpg`}, \n\t\t\t\t{name: \"Contours 3\", icon: `${Potree.resourcePath}/icons/matcap/contours_3.jpg`}, \n\t\t\t\t{name: \"Reflection Check Horizontal\", icon: `${Potree.resourcePath}/icons/matcap/reflection_check_horizontal.jpg`}, \n\t\t\t\t{name: \"Reflection Check Vertical\", icon: `${Potree.resourcePath}/icons/matcap/reflection_check_vertical.jpg`}, \n\t\t\t];\n\n\t\t\tlet elMatcapContainer = panel.find(\"#matcap_scheme_selection\");\n\n\t\t\tfor(let matcap of matcaps){\n\t\t\t\tlet elMatcap = $(`\n\t\t\t\t\t\t\n\t\t\t\t`);\n\n\t\t\t\telMatcap.click( () => {\n\t\t\t\t\tmaterial.matcap = matcap.icon.substring(matcap.icon.lastIndexOf('/'));\n\t\t\t\t});\n\n\t\t\t\telMatcapContainer.append(elMatcap);\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tpanel.find('#sldRGBGamma').slider({\n\t\t\t\tvalue: material.rgbGamma,\n\t\t\t\tmin: 0, max: 4, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.rgbGamma = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldRGBContrast').slider({\n\t\t\t\tvalue: material.rgbContrast,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.rgbContrast = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldRGBBrightness').slider({\n\t\t\t\tvalue: material.rgbBrightness,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.rgbBrightness = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldExtraGamma').slider({\n\t\t\t\tvalue: material.extraGamma,\n\t\t\t\tmin: 0, max: 4, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.extraGamma = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldExtraBrightness').slider({\n\t\t\t\tvalue: material.extraBrightness,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.extraBrightness = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldExtraContrast').slider({\n\t\t\t\tvalue: material.extraContrast,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.extraContrast = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldHeightRange').slider({\n\t\t\t\trange: true,\n\t\t\t\tmin: 0, max: 1000, step: 0.01,\n\t\t\t\tvalues: [0, 1000],\n\t\t\t\tslide: (event, ui) => {\n\t\t\t\t\tmaterial.heightMin = ui.values[0];\n\t\t\t\t\tmaterial.heightMax = ui.values[1];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpanel.find('#sldIntensityGamma').slider({\n\t\t\t\tvalue: material.intensityGamma,\n\t\t\t\tmin: 0, max: 4, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.intensityGamma = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldIntensityContrast').slider({\n\t\t\t\tvalue: material.intensityContrast,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.intensityContrast = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldIntensityBrightness').slider({\n\t\t\t\tvalue: material.intensityBrightness,\n\t\t\t\tmin: -1, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.intensityBrightness = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightRGB').slider({\n\t\t\t\tvalue: material.weightRGB,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightRGB = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightIntensity').slider({\n\t\t\t\tvalue: material.weightIntensity,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightIntensity = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightElevation').slider({\n\t\t\t\tvalue: material.weightElevation,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightElevation = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightClassification').slider({\n\t\t\t\tvalue: material.weightClassification,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightClassification = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightReturnNumber').slider({\n\t\t\t\tvalue: material.weightReturnNumber,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightReturnNumber = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find('#sldWeightSourceID').slider({\n\t\t\t\tvalue: material.weightSourceID,\n\t\t\t\tmin: 0, max: 1, step: 0.01,\n\t\t\t\tslide: (event, ui) => {material.weightSourceID = ui.value}\n\t\t\t});\n\n\t\t\tpanel.find(`#materials\\\\.color\\\\.picker`).spectrum({\n\t\t\t\tflat: true,\n\t\t\t\tshowInput: true,\n\t\t\t\tpreferredFormat: 'rgb',\n\t\t\t\tcancelText: '',\n\t\t\t\tchooseText: 'Apply',\n\t\t\t\tcolor: `#${material.color.getHexString()}`,\n\t\t\t\tmove: color => {\n\t\t\t\t\tlet cRGB = color.toRgb();\n\t\t\t\t\tlet tc = new THREE.Color().setRGB(cRGB.r / 255, cRGB.g / 255, cRGB.b / 255);\n\t\t\t\t\tmaterial.color = tc;\n\t\t\t\t},\n\t\t\t\tchange: color => {\n\t\t\t\t\tlet cRGB = color.toRgb();\n\t\t\t\t\tlet tc = new THREE.Color().setRGB(cRGB.r / 255, cRGB.g / 255, cRGB.b / 255);\n\t\t\t\t\tmaterial.color = tc;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.addVolatileListener(material, \"color_changed\", () => {\n\t\t\t\tpanel.find(`#materials\\\\.color\\\\.picker`)\n\t\t\t\t\t.spectrum('set', `#${material.color.getHexString()}`);\n\t\t\t});\n\n\t\t\tlet updateHeightRange = function () {\n\t\t\t\t\n\n\t\t\t\tlet aPosition = pointcloud.getAttribute(\"position\");\n\n\t\t\t\tlet bMin, bMax;\n\n\t\t\t\tif(aPosition){\n\t\t\t\t\t// for new format 2.0 and loader that contain precomputed min/max of attributes\n\t\t\t\t\tlet min = aPosition.range[0][2];\n\t\t\t\t\tlet max = aPosition.range[1][2];\n\t\t\t\t\tlet width = max - min;\n\n\t\t\t\t\tbMin = min - 0.2 * width;\n\t\t\t\t\tbMax = max + 0.2 * width;\n\t\t\t\t}else{\n\t\t\t\t\t// for format up until exlusive 2.0\n\t\t\t\t\tlet box = [pointcloud.pcoGeometry.tightBoundingBox, pointcloud.getBoundingBoxWorld()]\n\t\t\t\t\t\t.find(v => v !== undefined);\n\n\t\t\t\t\tpointcloud.updateMatrixWorld(true);\n\t\t\t\t\tbox = Utils.computeTransformedBoundingBox(box, pointcloud.matrixWorld);\n\n\t\t\t\t\tlet bWidth = box.max.z - box.min.z;\n\t\t\t\t\tbMin = box.min.z - 0.2 * bWidth;\n\t\t\t\t\tbMax = box.max.z + 0.2 * bWidth;\n\t\t\t\t}\n\n\t\t\t\tlet range = material.elevationRange;\n\n\t\t\t\tpanel.find('#lblHeightRange').html(`${range[0].toFixed(2)} to ${range[1].toFixed(2)}`);\n\t\t\t\tpanel.find('#sldHeightRange').slider({min: bMin, max: bMax, values: range});\n\t\t\t};\n\n\t\t\tlet updateExtraRange = function () {\n\n\t\t\t\tlet attributeName = material.activeAttributeName;\n\t\t\t\tlet attribute = pointcloud.getAttribute(attributeName);\n\n\t\t\t\tif(attribute == null){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlet range = material.getRange(attributeName);\n\n\t\t\t\tif(range == null){\n\t\t\t\t\trange = attribute.range;\n\t\t\t\t}\n\n\t\t\t\t// currently only supporting scalar ranges.\n\t\t\t\t// rgba, normals, positions, etc have vector ranges, however\n\t\t\t\tlet isValidRange = (typeof range[0] === \"number\") && (typeof range[1] === \"number\");\n\t\t\t\tif(!isValidRange){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif(range){\n\t\t\t\t\tlet msg = `${range[0].toFixed(2)} to ${range[1].toFixed(2)}`;\n\t\t\t\t\tpanel.find('#lblExtraRange').html(msg);\n\t\t\t\t}else{\n\t\t\t\t\tpanel.find(\"could not deduce range\");\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet updateIntensityRange = function () {\n\t\t\t\tlet range = material.intensityRange;\n\n\t\t\t\tpanel.find('#lblIntensityRange').html(`${parseInt(range[0])} to ${parseInt(range[1])}`);\n\t\t\t};\n\n\t\t\t{\n\t\t\t\tupdateHeightRange();\n\t\t\t\tpanel.find(`#sldHeightRange`).slider('option', 'min');\n\t\t\t\tpanel.find(`#sldHeightRange`).slider('option', 'max');\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tlet elGradientRepeat = panel.find(\"#gradient_repeat_option\");\n\t\t\t\telGradientRepeat.selectgroup({title: \"Gradient\"});\n\n\t\t\t\telGradientRepeat.find(\"input\").click( (e) => {\n\t\t\t\t\tthis.viewer.setElevationGradientRepeat(ElevationGradientRepeat[e.target.value]);\n\t\t\t\t});\n\n\t\t\t\tlet current = Object.keys(ElevationGradientRepeat)\n\t\t\t\t\t.filter(key => ElevationGradientRepeat[key] === this.viewer.elevationGradientRepeat);\n\t\t\t\telGradientRepeat.find(`input[value=${current}]`).trigger(\"click\");\n\t\t\t}\n\n\t\t\tlet onIntensityChange = () => {\n\t\t\t\tlet gamma = material.intensityGamma;\n\t\t\t\tlet contrast = material.intensityContrast;\n\t\t\t\tlet brightness = material.intensityBrightness;\n\n\t\t\t\tupdateIntensityRange();\n\n\t\t\t\tpanel.find('#lblIntensityGamma').html(gamma.toFixed(2));\n\t\t\t\tpanel.find('#lblIntensityContrast').html(contrast.toFixed(2));\n\t\t\t\tpanel.find('#lblIntensityBrightness').html(brightness.toFixed(2));\n\n\t\t\t\tpanel.find('#sldIntensityGamma').slider({value: gamma});\n\t\t\t\tpanel.find('#sldIntensityContrast').slider({value: contrast});\n\t\t\t\tpanel.find('#sldIntensityBrightness').slider({value: brightness});\n\t\t\t};\n\n\t\t\tlet onRGBChange = () => {\n\t\t\t\tlet gamma = material.rgbGamma;\n\t\t\t\tlet contrast = material.rgbContrast;\n\t\t\t\tlet brightness = material.rgbBrightness;\n\n\t\t\t\tpanel.find('#lblRGBGamma').html(gamma.toFixed(2));\n\t\t\t\tpanel.find('#lblRGBContrast').html(contrast.toFixed(2));\n\t\t\t\tpanel.find('#lblRGBBrightness').html(brightness.toFixed(2));\n\n\t\t\t\tpanel.find('#sldRGBGamma').slider({value: gamma});\n\t\t\t\tpanel.find('#sldRGBContrast').slider({value: contrast});\n\t\t\t\tpanel.find('#sldRGBBrightness').slider({value: brightness});\n\t\t\t};\n\n\t\t\tthis.addVolatileListener(material, \"material_property_changed\", updateExtraRange);\n\t\t\tthis.addVolatileListener(material, \"material_property_changed\", updateHeightRange);\n\t\t\tthis.addVolatileListener(material, \"material_property_changed\", onIntensityChange);\n\t\t\tthis.addVolatileListener(material, \"material_property_changed\", onRGBChange);\n\n\t\t\tupdateExtraRange();\n\t\t\tupdateHeightRange();\n\t\t\tonIntensityChange();\n\t\t\tonRGBChange();\n\t\t}\n\n\t}\n\n\t\n\n\tsetMeasurement(object){\n\n\t\tlet TYPE = {\n\t\t\tDISTANCE: {panel: DistancePanel},\n\t\t\tAREA: {panel: AreaPanel},\n\t\t\tPOINT: {panel: PointPanel},\n\t\t\tANGLE: {panel: AnglePanel},\n\t\t\tHEIGHT: {panel: HeightPanel},\n\t\t\tPROFILE: {panel: ProfilePanel},\n\t\t\tVOLUME: {panel: VolumePanel},\n\t\t\tCIRCLE: {panel: CirclePanel},\n\t\t\tOTHER: {panel: PointPanel},\n\t\t};\n\n\t\tlet getType = (measurement) => {\n\t\t\tif (measurement instanceof Measure) {\n\t\t\t\tif (measurement.showDistances && !measurement.showArea && !measurement.showAngles) {\n\t\t\t\t\treturn TYPE.DISTANCE;\n\t\t\t\t} else if (measurement.showDistances && measurement.showArea && !measurement.showAngles) {\n\t\t\t\t\treturn TYPE.AREA;\n\t\t\t\t} else if (measurement.maxMarkers === 1) {\n\t\t\t\t\treturn TYPE.POINT;\n\t\t\t\t} else if (!measurement.showDistances && !measurement.showArea && measurement.showAngles) {\n\t\t\t\t\treturn TYPE.ANGLE;\n\t\t\t\t} else if (measurement.showHeight) {\n\t\t\t\t\treturn TYPE.HEIGHT;\n\t\t\t\t} else if (measurement.showCircle) {\n\t\t\t\t\treturn TYPE.CIRCLE;\n\t\t\t\t} else {\n\t\t\t\t\treturn TYPE.OTHER;\n\t\t\t\t}\n\t\t\t} else if (measurement instanceof Profile) {\n\t\t\t\treturn TYPE.PROFILE;\n\t\t\t} else if (measurement instanceof Volume) {\n\t\t\t\treturn TYPE.VOLUME;\n\t\t\t}\n\t\t};\n\n\t\t//this.container.html(\"measurement\");\n\n\t\tlet type = getType(object);\n\t\tlet Panel = type.panel;\n\n\t\tlet panel = new Panel(this.viewer, object, this);\n\t\tthis.container.append(panel.elContent);\n\t}\n\n\tsetCamera(camera){\n\t\tlet panel = new CameraPanel(this.viewer, this);\n\t\tthis.container.append(panel.elContent);\n\t}\n\n\tsetAnnotation(annotation){\n\t\tlet panel = new AnnotationPanel(this.viewer, this, annotation);\n\t\tthis.container.append(panel.elContent);\n\t}\n\n\tsetCameraAnimation(animation){\n\t\tlet panel = new CameraAnimationPanel(this.viewer, this, animation)\n\t\tthis.container.append(panel.elContent);\n\t}\n\n}\n","\r\nfunction addCommas(nStr){\r\n\tnStr += '';\r\n\tlet x = nStr.split('.');\r\n\tlet x1 = x[0];\r\n\tlet x2 = x.length > 1 ? '.' + x[1] : '';\r\n\tlet rgx = /(\\d+)(\\d{3})/;\r\n\twhile (rgx.test(x1)) {\r\n\t\tx1 = x1.replace(rgx, '$1' + ',' + '$2');\r\n\t}\r\n\treturn x1 + x2;\r\n};\r\n\r\nfunction format(value){\r\n\treturn addCommas(value.toFixed(3));\r\n};\r\n\r\nexport class HierarchicalSlider{\r\n\r\n\tconstructor(params = {}){\r\n\t\t\r\n\t\tthis.element = document.createElement(\"div\");\r\n\r\n\t\tthis.labels = [];\r\n\t\tthis.sliders = [];\r\n\t\tthis.range = params.range != null ? params.range : [0, 1];\r\n\t\tthis.slide = params.slide != null ? params.slide : null;\r\n\t\tthis.step = params.step != null ? params.step : 0.0001;\r\n\r\n\t\tlet levels = params.levels != null ? params.levels : 1;\r\n\r\n\t\tfor(let level = 0; level < levels; level++){\r\n\t\t\tthis.addLevel();\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tsetRange(range){\r\n\t\tthis.range = [...range];\r\n\r\n\t\t{ // root slider\r\n\t\t\tlet slider = this.sliders[0];\r\n\r\n\t\t\t$(slider).slider({\r\n\t\t\t\tmin: range[0],\r\n\t\t\t\tmax: range[1],\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfor(let i = 1; i < this.sliders.length; i++){\r\n\t\t\tlet parentSlider = this.sliders[i - 1];\r\n\t\t\tlet slider = this.sliders[i];\r\n\r\n\t\t\tlet parentValues = $(parentSlider).slider(\"option\", \"values\");\r\n\t\t\tlet childRange = [...parentValues];\r\n\r\n\t\t\t$(slider).slider({\r\n\t\t\t\tmin: childRange[0],\r\n\t\t\t\tmax: childRange[1],\r\n\t\t\t});\r\n\t\t}\r\n\t\t\r\n\t\tthis.updateLabels();\r\n\t}\r\n\r\n\tsetValues(values){\r\n\t\tfor(let slider of this.sliders){\r\n\t\t\t$(slider).slider({\r\n\t\t\t\tvalues: [...values],\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis.updateLabels();\r\n\t}\r\n\r\n\taddLevel(){\r\n\t\tconst elLevel = document.createElement(\"li\");\r\n\t\tconst elRange = document.createTextNode(\"Range: \");\r\n\t\tconst label = document.createElement(\"span\");\r\n\t\tconst slider = document.createElement(\"div\");\r\n\r\n\t\tlet level = this.sliders.length;\r\n\t\tlet [min, max] = [0, 0];\r\n\r\n\t\tif(this.sliders.length === 0){\r\n\t\t\t[min, max] = this.range;\r\n\t\t}else{\r\n\t\t\tlet parentSlider = this.sliders[this.sliders.length - 1];\r\n\t\t\t[min, max] = $(parentSlider).slider(\"option\", \"values\");\r\n\t\t}\r\n\t\t\r\n\t\t$(slider).slider({\r\n\t\t\trange: true, \r\n\t\t\tmin: min, \r\n\t\t\tmax: max,\r\n\t\t\tstep: this.step,\r\n\t\t\tvalues: [min, max],\r\n\t\t\tslide: (event, ui) => {\r\n\t\t\t\t\r\n\t\t\t\t// set all descendants to same range\r\n\t\t\t\tlet levels = this.sliders.length;\r\n\t\t\t\tfor(let i = level + 1; i < levels; i++){\r\n\t\t\t\t\tlet descendant = this.sliders[i];\r\n\r\n\t\t\t\t\t$(descendant).slider({\r\n\t\t\t\t\t\trange: true,\r\n\t\t\t\t\t\tmin: ui.values[0],\r\n\t\t\t\t\t\tmax: ui.values[1],\r\n\t\t\t\t\t\tvalues: [...ui.values],\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(this.slide){\r\n\t\t\t\t\tlet values = [...ui.values];\r\n\r\n\t\t\t\t\tthis.slide({\r\n\t\t\t\t\t\ttarget: this, \r\n\t\t\t\t\t\trange: this.range,\r\n\t\t\t\t\t\tvalues: values,\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.updateLabels();\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\telLevel.append(elRange, label, slider);\r\n\r\n\t\tthis.sliders.push(slider);\r\n\t\tthis.labels.push(label);\r\n\t\tthis.element.append(elLevel);\r\n\r\n\t\tthis.updateLabels();\r\n\t}\r\n\r\n\tremoveLevel(){\r\n\r\n\t}\r\n\r\n\tupdateSliders(){\r\n\r\n\t}\r\n\r\n\tupdateLabels(){\r\n\r\n\t\tlet levels = this.sliders.length;\r\n\r\n\t\tfor(let i = 0; i < levels; i++){\r\n\r\n\t\t\tlet slider = this.sliders[i];\r\n\t\t\tlet label = this.labels[i];\r\n\r\n\t\t\tlet [min, max] = $(slider).slider(\"option\", \"values\");\r\n\t\t\tlet strMin = format(min);\r\n\t\t\tlet strMax = format(max);\r\n\t\t\tlet strLabel = `${strMin} to ${strMax}`;\r\n\r\n\t\t\tlabel.innerHTML = strLabel;\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n}\r\n\r\n","\nimport * as THREE from \"../../../libs/three.js/build/three.module.js\";\nimport {EventDispatcher} from \"../../EventDispatcher.js\";\n\n \nexport class OrientedImageControls extends EventDispatcher{\n\t\n\tconstructor(viewer){\n\t\tsuper();\n\t\t\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.originalCam = viewer.scene.getActiveCamera();\n\t\tthis.shearCam = viewer.scene.getActiveCamera().clone();\n\t\tthis.shearCam.rotation.set(this.originalCam.rotation.toArray());\n\t\tthis.shearCam.updateProjectionMatrix();\n\t\tthis.shearCam.updateProjectionMatrix = () => {\n\t\t\treturn this.shearCam.projectionMatrix;\n\t\t};\n\n\t\tthis.image = null;\n\n\t\tthis.fadeFactor = 20;\n\t\tthis.fovDelta = 0;\n\n\t\tthis.fovMin = 0.1;\n\t\tthis.fovMax = 120;\n\n\t\tthis.shear = [0, 0];\n\n\t\t// const style = ``;\n\t\tthis.elUp = $(``);\n\t\tthis.elRight = $(``);\n\t\tthis.elDown = $(``);\n\t\tthis.elLeft = $(``);\n\t\tthis.elExit = $(``);\n\n\t\tthis.elExit.click( () => {\n\t\t\tthis.release();\n\t\t});\n\n\t\tthis.elUp.click(() => {\n\t\t\tconst fovY = viewer.getFOV();\n\t\t\tconst top = Math.tan(THREE.Math.degToRad(fovY / 2));\n\t\t\tthis.shear[1] += 0.1 * top;\n\t\t});\n\n\t\tthis.elRight.click(() => {\n\t\t\tconst fovY = viewer.getFOV();\n\t\t\tconst top = Math.tan(THREE.Math.degToRad(fovY / 2));\n\t\t\tthis.shear[0] += 0.1 * top;\n\t\t});\n\n\t\tthis.elDown.click(() => {\n\t\t\tconst fovY = viewer.getFOV();\n\t\t\tconst top = Math.tan(THREE.Math.degToRad(fovY / 2));\n\t\t\tthis.shear[1] -= 0.1 * top;\n\t\t});\n\n\t\tthis.elLeft.click(() => {\n\t\t\tconst fovY = viewer.getFOV();\n\t\t\tconst top = Math.tan(THREE.Math.degToRad(fovY / 2));\n\t\t\tthis.shear[0] -= 0.1 * top;\n\t\t});\n\n\t\tthis.scene = null;\n\t\tthis.sceneControls = new THREE.Scene();\n\n\t\tlet scroll = (e) => {\n\t\t\tthis.fovDelta += -e.delta * 1.0;\n\t\t};\n\n\t\tthis.addEventListener('mousewheel', scroll);\n\t\t//this.addEventListener(\"mousemove\", onMove);\n\t}\n\n\thasSomethingCaptured(){\n\t\treturn this.image !== null;\n\t}\n\n\tcapture(image){\n\t\tif(this.hasSomethingCaptured()){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.image = image;\n\n\t\tthis.originalFOV = this.viewer.getFOV();\n\t\tthis.originalControls = this.viewer.getControls();\n\n\t\tthis.viewer.setControls(this);\n\t\tthis.viewer.scene.overrideCamera = this.shearCam;\n\n\t\tconst elCanvas = this.viewer.renderer.domElement;\n\t\tconst elRoot = $(elCanvas.parentElement);\n\n\t\tthis.shear = [0, 0];\n\n\n\t\telRoot.append(this.elUp);\n\t\telRoot.append(this.elRight);\n\t\telRoot.append(this.elDown);\n\t\telRoot.append(this.elLeft);\n\t\telRoot.append(this.elExit);\n\t}\n\n\trelease(){\n\t\tthis.image = null;\n\n\t\tthis.viewer.scene.overrideCamera = null;\n\n\t\tthis.elUp.detach();\n\t\tthis.elRight.detach();\n\t\tthis.elDown.detach();\n\t\tthis.elLeft.detach();\n\t\tthis.elExit.detach();\n\n\t\tthis.viewer.setFOV(this.originalFOV);\n\t\tthis.viewer.setControls(this.originalControls);\n\t}\n\n\tsetScene (scene) {\n\t\tthis.scene = scene;\n\t}\n\n\tupdate (delta) {\n\t\t// const view = this.scene.view;\n\n\t\t// let prevTotal = this.shearCam.projectionMatrix.elements.reduce( (a, i) => a + i, 0);\n\n\t\t//const progression = Math.min(1, this.fadeFactor * delta);\n\t\t//const attenuation = Math.max(0, 1 - this.fadeFactor * delta);\n\t\tconst progression = 1;\n\t\tconst attenuation = 0;\n\n\t\tconst oldFov = this.viewer.getFOV();\n\t\tlet fovProgression = progression * this.fovDelta;\n\t\tlet newFov = oldFov * ((1 + fovProgression / 10));\n\n\t\tnewFov = Math.max(this.fovMin, newFov);\n\t\tnewFov = Math.min(this.fovMax, newFov);\n\n\t\tlet diff = newFov / oldFov;\n\n\t\tconst mouse = this.viewer.inputHandler.mouse;\n\t\tconst canvasSize = this.viewer.renderer.getSize(new THREE.Vector2());\n\t\tconst uv = [\n\t\t\t(mouse.x / canvasSize.x),\n\t\t\t((canvasSize.y - mouse.y) / canvasSize.y)\n\t\t];\n\n\t\tconst fovY = newFov;\n\t\tconst aspect = canvasSize.x / canvasSize.y;\n\t\tconst top = Math.tan(THREE.Math.degToRad(fovY / 2));\n\t\tconst height = 2 * top;\n\t\tconst width = aspect * height;\n\n\t\tconst shearRangeX = [\n\t\t\tthis.shear[0] - 0.5 * width,\n\t\t\tthis.shear[0] + 0.5 * width,\n\t\t];\n\n\t\tconst shearRangeY = [\n\t\t\tthis.shear[1] - 0.5 * height,\n\t\t\tthis.shear[1] + 0.5 * height,\n\t\t];\n\n\t\tconst shx = (1 - uv[0]) * shearRangeX[0] + uv[0] * shearRangeX[1];\n\t\tconst shy = (1 - uv[1]) * shearRangeY[0] + uv[1] * shearRangeY[1];\n\n\t\tconst shu = (1 - diff);\n\n\t\tconst newShear = [\n\t\t\t(1 - shu) * this.shear[0] + shu * shx,\n\t\t\t(1 - shu) * this.shear[1] + shu * shy,\n\t\t];\n\t\t\n\t\tthis.shear = newShear;\n\t\tthis.viewer.setFOV(newFov);\n\t\t\n\t\tconst {originalCam, shearCam} = this;\n\n\t\toriginalCam.fov = newFov;\n\t\toriginalCam.updateMatrixWorld()\n\t\toriginalCam.updateProjectionMatrix();\n\t\tshearCam.copy(originalCam);\n\t\tshearCam.rotation.set(...originalCam.rotation.toArray());\n\n\t\tshearCam.updateMatrixWorld();\n\t\tshearCam.projectionMatrix.copy(originalCam.projectionMatrix);\n\n\t\tconst [sx, sy] = this.shear;\n\t\tconst mShear = new THREE.Matrix4().set(\n\t\t\t1, 0, sx, 0,\n\t\t\t0, 1, sy, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1,\n\t\t);\n\n\t\tconst proj = shearCam.projectionMatrix;\n\t\tproj.multiply(mShear);\n\t\tshearCam.projectionMatrixInverse.copy(proj).invert();\n\n\t\tlet total = shearCam.projectionMatrix.elements.reduce( (a, i) => a + i, 0);\n\n\t\tthis.fovDelta *= attenuation;\n\t}\n};\n","\r\nimport * as THREE from \"../../../libs/three.js/build/three.module.js\";\r\nimport {OrientedImageControls} from \"./OrientedImageControls.js\";\r\nimport { EventDispatcher } from \"../../EventDispatcher.js\";\r\n\r\n// https://support.pix4d.com/hc/en-us/articles/205675256-How-are-yaw-pitch-roll-defined\r\n// https://support.pix4d.com/hc/en-us/articles/202558969-How-are-omega-phi-kappa-defined\r\n\r\nfunction createMaterial(){\r\n\r\n\tlet vertexShader = `\r\n\tuniform float uNear;\r\n\tvarying vec2 vUV;\r\n\tvarying vec4 vDebug;\r\n\t\r\n\tvoid main(){\r\n\t\tvDebug = vec4(0.0, 1.0, 0.0, 1.0);\r\n\t\tvec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0);\r\n\t\t// make sure that this mesh is at least in front of the near plane\r\n\t\tmodelViewPosition.xyz += normalize(modelViewPosition.xyz) * uNear;\r\n\t\tgl_Position = projectionMatrix * modelViewPosition;\r\n\t\tvUV = uv;\r\n\t}\r\n\t`;\r\n\r\n\tlet fragmentShader = `\r\n\tuniform sampler2D tColor;\r\n\tuniform float uOpacity;\r\n\tvarying vec2 vUV;\r\n\tvarying vec4 vDebug;\r\n\tvoid main(){\r\n\t\tvec4 color = texture2D(tColor, vUV);\r\n\t\tgl_FragColor = color;\r\n\t\tgl_FragColor.a = uOpacity;\r\n\t}\r\n\t`;\r\n\tconst material = new THREE.ShaderMaterial( {\r\n\t\tuniforms: {\r\n\t\t\t// time: { value: 1.0 },\r\n\t\t\t// resolution: { value: new THREE.Vector2() }\r\n\t\t\ttColor: {value: new THREE.Texture() },\r\n\t\t\tuNear: {value: 0.0},\r\n\t\t\tuOpacity: {value: 1.0},\r\n\t\t},\r\n\t\tvertexShader: vertexShader,\r\n\t\tfragmentShader: fragmentShader,\r\n\t\tside: THREE.DoubleSide,\r\n\t} );\r\n\r\n\tmaterial.side = THREE.DoubleSide;\r\n\r\n\treturn material;\r\n}\r\n\r\nconst planeGeometry = new THREE.PlaneGeometry(1, 1);\r\nconst lineGeometry = new THREE.Geometry();\r\n\r\nlineGeometry.vertices.push(\r\n\tnew THREE.Vector3(-0.5, -0.5, 0),\r\n\tnew THREE.Vector3( 0.5, -0.5, 0),\r\n\tnew THREE.Vector3( 0.5, 0.5, 0),\r\n\tnew THREE.Vector3(-0.5, 0.5, 0),\r\n\tnew THREE.Vector3(-0.5, -0.5, 0),\r\n);\r\n\r\nexport class OrientedImage{\r\n\r\n\tconstructor(id){\r\n\r\n\t\tthis.id = id;\r\n\t\tthis.fov = 1.0;\r\n\t\tthis.position = new THREE.Vector3();\r\n\t\tthis.rotation = new THREE.Vector3();\r\n\t\tthis.width = 0;\r\n\t\tthis.height = 0;\r\n\t\tthis.fov = 1.0;\r\n\r\n\t\tconst material = createMaterial();\r\n\t\tconst lineMaterial = new THREE.LineBasicMaterial( { color: 0x00ff00 } );\r\n\t\tthis.mesh = new THREE.Mesh(planeGeometry, material);\r\n\t\tthis.line = new THREE.Line(lineGeometry, lineMaterial);\r\n\t\tthis.texture = null;\r\n\r\n\t\tthis.mesh.orientedImage = this;\r\n\t}\r\n\r\n\tset(position, rotation, dimension, fov){\r\n\r\n\t\tlet radians = rotation.map(THREE.Math.degToRad);\r\n\r\n\t\tthis.position.set(...position);\r\n\t\tthis.mesh.position.set(...position);\r\n\r\n\t\tthis.rotation.set(...radians);\r\n\t\tthis.mesh.rotation.set(...radians);\r\n\r\n\t\t[this.width, this.height] = dimension;\r\n\t\tthis.mesh.scale.set(this.width / this.height, 1, 1);\r\n\r\n\t\tthis.fov = fov;\r\n\r\n\t\tthis.updateTransform();\r\n\t}\r\n\r\n\tupdateTransform(){\r\n\t\tlet {mesh, line, fov} = this;\r\n\r\n\t\tmesh.updateMatrixWorld();\r\n\t\tconst dir = mesh.getWorldDirection();\r\n\t\tconst alpha = THREE.Math.degToRad(fov / 2);\r\n\t\tconst d = -0.5 / Math.tan(alpha);\r\n\t\tconst move = dir.clone().multiplyScalar(d);\r\n\t\tmesh.position.add(move);\r\n\r\n\t\tline.position.copy(mesh.position);\r\n\t\tline.scale.copy(mesh.scale);\r\n\t\tline.rotation.copy(mesh.rotation);\r\n\t}\r\n\r\n};\r\n\r\nexport class OrientedImages extends EventDispatcher{\r\n\r\n\tconstructor(){\r\n\t\tsuper();\r\n\r\n\t\tthis.node = null;\r\n\t\tthis.cameraParams = null;\r\n\t\tthis.imageParams = null;\r\n\t\tthis.images = null;\r\n\t\tthis._visible = true;\r\n\t}\r\n\r\n\tset visible(visible){\r\n\t\tif(this._visible === visible){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor(const image of this.images){\r\n\t\t\timage.mesh.visible = visible;\r\n\t\t\timage.line.visible = visible;\r\n\t\t}\r\n\r\n\t\tthis._visible = visible;\r\n\t\tthis.dispatchEvent({\r\n\t\t\ttype: \"visibility_changed\",\r\n\t\t\timages: this,\r\n\t\t});\r\n\t}\r\n\r\n\tget visible(){\r\n\t\treturn this._visible;\r\n\t}\r\n\r\n\r\n};\r\n\r\nexport class OrientedImageLoader{\r\n\r\n\tstatic async loadCameraParams(path){\r\n\t\tconst res = await fetch(path);\r\n\t\tconst text = await res.text();\r\n\r\n\t\tconst parser = new DOMParser();\r\n\t\tconst doc = parser.parseFromString(text, \"application/xml\");\r\n\r\n\t\tconst width = parseInt(doc.getElementsByTagName(\"width\")[0].textContent);\r\n\t\tconst height = parseInt(doc.getElementsByTagName(\"height\")[0].textContent);\r\n\t\tconst f = parseFloat(doc.getElementsByTagName(\"f\")[0].textContent);\r\n\r\n\t\tlet a = (height / 2) / f;\r\n\t\tlet fov = 2 * THREE.Math.radToDeg(Math.atan(a));\r\n\r\n\t\tconst params = {\r\n\t\t\tpath: path,\r\n\t\t\twidth: width,\r\n\t\t\theight: height,\r\n\t\t\tf: f,\r\n\t\t\tfov: fov,\r\n\t\t};\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\tstatic async loadImageParams(path){\r\n\r\n\t\tconst response = await fetch(path);\r\n\t\tif(!response.ok){\r\n\t\t\tconsole.error(`failed to load ${path}`);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst content = await response.text();\r\n\t\tconst lines = content.split(/\\r?\\n/);\r\n\t\tconst imageParams = [];\r\n\r\n\t\tfor(let i = 1; i < lines.length; i++){\r\n\t\t\tconst line = lines[i];\r\n\r\n\t\t\tif(line.startsWith(\"#\")){\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst tokens = line.split(/\\s+/);\r\n\r\n\t\t\tif(tokens.length < 6){\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst params = {\r\n\t\t\t\tid: tokens[0],\r\n\t\t\t\tx: Number.parseFloat(tokens[1]),\r\n\t\t\t\ty: Number.parseFloat(tokens[2]),\r\n\t\t\t\tz: Number.parseFloat(tokens[3]),\r\n\t\t\t\tomega: Number.parseFloat(tokens[4]),\r\n\t\t\t\tphi: Number.parseFloat(tokens[5]),\r\n\t\t\t\tkappa: Number.parseFloat(tokens[6]),\r\n\t\t\t};\r\n\r\n\t\t\t// const whitelist = [\"47518.jpg\"];\r\n\t\t\t// if(whitelist.includes(params.id)){\r\n\t\t\t// \timageParams.push(params);\r\n\t\t\t// }\r\n\t\t\timageParams.push(params);\r\n\t\t}\r\n\r\n\t\t// debug\r\n\t\t//return [imageParams[50]];\r\n\r\n\t\treturn imageParams;\r\n\t}\r\n\r\n\tstatic async load(cameraParamsPath, imageParamsPath, viewer){\r\n\r\n\t\tconst tStart = performance.now();\r\n\r\n\t\tconst [cameraParams, imageParams] = await Promise.all([\r\n\t\t\tOrientedImageLoader.loadCameraParams(cameraParamsPath),\r\n\t\t\tOrientedImageLoader.loadImageParams(imageParamsPath),\r\n\t\t]);\r\n\r\n\t\tconst orientedImageControls = new OrientedImageControls(viewer);\r\n\t\tconst raycaster = new THREE.Raycaster();\r\n\r\n\t\tconst tEnd = performance.now();\r\n\t\tconsole.log(tEnd - tStart);\r\n\r\n\t\t// const sp = new THREE.PlaneGeometry(1, 1);\r\n\t\t// const lg = new THREE.Geometry();\r\n\r\n\t\t// lg.vertices.push(\r\n\t\t// \tnew THREE.Vector3(-0.5, -0.5, 0),\r\n\t\t// \tnew THREE.Vector3( 0.5, -0.5, 0),\r\n\t\t// \tnew THREE.Vector3( 0.5, 0.5, 0),\r\n\t\t// \tnew THREE.Vector3(-0.5, 0.5, 0),\r\n\t\t// \tnew THREE.Vector3(-0.5, -0.5, 0),\r\n\t\t// );\r\n\r\n\t\tconst {width, height} = cameraParams;\r\n\t\tconst orientedImages = [];\r\n\t\tconst sceneNode = new THREE.Object3D();\r\n\t\tsceneNode.name = \"oriented_images\";\r\n\r\n\t\tfor(const params of imageParams){\r\n\r\n\t\t\t// const material = createMaterial();\r\n\t\t\t// const lm = new THREE.LineBasicMaterial( { color: 0x00ff00 } );\r\n\t\t\t// const mesh = new THREE.Mesh(sp, material);\r\n\r\n\t\t\tconst {x, y, z, omega, phi, kappa} = params;\r\n\t\t\t// const [rx, ry, rz] = [omega, phi, kappa]\r\n\t\t\t// \t.map(THREE.Math.degToRad);\r\n\t\t\t\r\n\t\t\t// mesh.position.set(x, y, z);\r\n\t\t\t// mesh.scale.set(width / height, 1, 1);\r\n\t\t\t// mesh.rotation.set(rx, ry, rz);\r\n\t\t\t// {\r\n\t\t\t// \tmesh.updateMatrixWorld();\r\n\t\t\t// \tconst dir = mesh.getWorldDirection();\r\n\t\t\t// \tconst alpha = THREE.Math.degToRad(cameraParams.fov / 2);\r\n\t\t\t// \tconst d = -0.5 / Math.tan(alpha);\r\n\t\t\t// \tconst move = dir.clone().multiplyScalar(d);\r\n\t\t\t// \tmesh.position.add(move);\r\n\t\t\t// }\r\n\t\t\t// sceneNode.add(mesh);\r\n\r\n\t\t\t// const line = new THREE.Line(lg, lm);\r\n\t\t\t// line.position.copy(mesh.position);\r\n\t\t\t// line.scale.copy(mesh.scale);\r\n\t\t\t// line.rotation.copy(mesh.rotation);\r\n\t\t\t// sceneNode.add(line);\r\n\r\n\t\t\tlet orientedImage = new OrientedImage(params.id);\r\n\t\t\t// orientedImage.setPosition(x, y, z);\r\n\t\t\t// orientedImage.setRotation(omega, phi, kappa);\r\n\t\t\t// orientedImage.setDimension(width, height);\r\n\t\t\tlet position = [x, y, z];\r\n\t\t\tlet rotation = [omega, phi, kappa];\r\n\t\t\tlet dimension = [width, height];\r\n\t\t\torientedImage.set(position, rotation, dimension, cameraParams.fov);\r\n\r\n\t\t\tsceneNode.add(orientedImage.mesh);\r\n\t\t\tsceneNode.add(orientedImage.line);\r\n\t\t\t\r\n\t\t\torientedImages.push(orientedImage);\r\n\t\t}\r\n\r\n\t\tlet hoveredElement = null;\r\n\t\tlet clipVolume = null;\r\n\r\n\t\tconst onMouseMove = (evt) => {\r\n\t\t\tconst tStart = performance.now();\r\n\t\t\tif(hoveredElement){\r\n\t\t\t\thoveredElement.line.material.color.setRGB(0, 1, 0);\r\n\t\t\t}\r\n\t\t\tevt.preventDefault();\r\n\r\n\t\t\t//var array = getMousePosition( container, evt.clientX, evt.clientY );\r\n\t\t\tconst rect = viewer.renderer.domElement.getBoundingClientRect();\r\n\t\t\tconst [x, y] = [evt.clientX, evt.clientY];\r\n\t\t\tconst array = [ \r\n\t\t\t\t( x - rect.left ) / rect.width, \r\n\t\t\t\t( y - rect.top ) / rect.height \r\n\t\t\t];\r\n\t\t\tconst onClickPosition = new THREE.Vector2(...array);\r\n\t\t\t//const intersects = getIntersects(onClickPosition, scene.children);\r\n\t\t\tconst camera = viewer.scene.getActiveCamera();\r\n\t\t\tconst mouse = new THREE.Vector3(\r\n\t\t\t\t+ ( onClickPosition.x * 2 ) - 1, \r\n\t\t\t\t- ( onClickPosition.y * 2 ) + 1 );\r\n\t\t\tconst objects = orientedImages.map(i => i.mesh);\r\n\t\t\traycaster.setFromCamera( mouse, camera );\r\n\t\t\tconst intersects = raycaster.intersectObjects( objects );\r\n\t\t\tlet selectionChanged = false;\r\n\r\n\t\t\tif ( intersects.length > 0){\r\n\t\t\t\t//console.log(intersects);\r\n\t\t\t\tconst intersection = intersects[0];\r\n\t\t\t\tconst orientedImage = intersection.object.orientedImage;\r\n\t\t\t\torientedImage.line.material.color.setRGB(1, 0, 0);\r\n\t\t\t\tselectionChanged = hoveredElement !== orientedImage;\r\n\t\t\t\thoveredElement = orientedImage;\r\n\t\t\t}else{\r\n\t\t\t\thoveredElement = null;\r\n\t\t\t}\r\n\r\n\t\t\tlet shouldRemoveClipVolume = clipVolume !== null && hoveredElement === null;\r\n\t\t\tlet shouldAddClipVolume = clipVolume === null && hoveredElement !== null;\r\n\r\n\t\t\tif(clipVolume !== null && (hoveredElement === null || selectionChanged)){\r\n\t\t\t\t// remove existing\r\n\t\t\t\tviewer.scene.removePolygonClipVolume(clipVolume);\r\n\t\t\t\tclipVolume = null;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(shouldAddClipVolume || selectionChanged){\r\n\t\t\t\tconst img = hoveredElement;\r\n\t\t\t\tconst fov = cameraParams.fov;\r\n\t\t\t\tconst aspect = cameraParams.width / cameraParams.height;\r\n\t\t\t\tconst near = 1.0;\r\n\t\t\t\tconst far = 1000 * 1000;\r\n\t\t\t\tconst camera = new THREE.PerspectiveCamera(fov, aspect, near, far);\r\n\t\t\t\tcamera.rotation.order = viewer.scene.getActiveCamera().rotation.order;\r\n\t\t\t\tcamera.rotation.copy(img.mesh.rotation);\r\n\t\t\t\t{\r\n\t\t\t\t\tconst mesh = img.mesh;\r\n\t\t\t\t\tconst dir = mesh.getWorldDirection();\r\n\t\t\t\t\tconst pos = mesh.position;\r\n\t\t\t\t\tconst alpha = THREE.Math.degToRad(fov / 2);\r\n\t\t\t\t\tconst d = 0.5 / Math.tan(alpha);\r\n\t\t\t\t\tconst newCamPos = pos.clone().add(dir.clone().multiplyScalar(d));\r\n\t\t\t\t\tconst newCamDir = pos.clone().sub(newCamPos);\r\n\t\t\t\t\tconst newCamTarget = new THREE.Vector3().addVectors(\r\n\t\t\t\t\t\tnewCamPos,\r\n\t\t\t\t\t\tnewCamDir.clone().multiplyScalar(viewer.getMoveSpeed()));\r\n\t\t\t\t\tcamera.position.copy(newCamPos);\r\n\t\t\t\t}\r\n\t\t\t\tlet volume = new Potree.PolygonClipVolume(camera);\r\n\t\t\t\tlet m0 = new THREE.Mesh();\r\n\t\t\t\tlet m1 = new THREE.Mesh();\r\n\t\t\t\tlet m2 = new THREE.Mesh();\r\n\t\t\t\tlet m3 = new THREE.Mesh();\r\n\t\t\t\tm0.position.set(-1, -1, 0);\r\n\t\t\t\tm1.position.set( 1, -1, 0);\r\n\t\t\t\tm2.position.set( 1, 1, 0);\r\n\t\t\t\tm3.position.set(-1, 1, 0);\r\n\t\t\t\tvolume.markers.push(m0, m1, m2, m3);\r\n\t\t\t\tvolume.initialized = true;\r\n\t\t\t\t\r\n\t\t\t\tviewer.scene.addPolygonClipVolume(volume);\r\n\t\t\t\tclipVolume = volume;\r\n\t\t\t}\r\n\t\t\tconst tEnd = performance.now();\r\n\t\t\t//console.log(tEnd - tStart);\r\n\t\t};\r\n\r\n\t\tconst moveToImage = (image) => {\r\n\t\t\tconsole.log(\"move to image \" + image.id);\r\n\r\n\t\t\tconst mesh = image.mesh;\r\n\t\t\tconst newCamPos = image.position.clone();\r\n\t\t\tconst newCamTarget = mesh.position.clone();\r\n\r\n\t\t\tviewer.scene.view.setView(newCamPos, newCamTarget, 500, () => {\r\n\t\t\t\torientedImageControls.capture(image);\r\n\t\t\t});\r\n\r\n\t\t\tif(image.texture === null){\r\n\r\n\t\t\t\tconst target = image;\r\n\r\n\t\t\t\tconst tmpImagePath = `${Potree.resourcePath}/images/loading.jpg`;\r\n\t\t\t\tnew THREE.TextureLoader().load(tmpImagePath,\r\n\t\t\t\t\t(texture) => {\r\n\t\t\t\t\t\tif(target.texture === null){\r\n\t\t\t\t\t\t\ttarget.texture = texture;\r\n\t\t\t\t\t\t\ttarget.mesh.material.uniforms.tColor.value = texture;\r\n\t\t\t\t\t\t\tmesh.material.needsUpdate = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\r\n\t\t\t\tconst imagePath = `${imageParamsPath}/../${target.id}`;\r\n\t\t\t\tnew THREE.TextureLoader().load(imagePath,\r\n\t\t\t\t\t(texture) => {\r\n\t\t\t\t\t\ttarget.texture = texture;\r\n\t\t\t\t\t\ttarget.mesh.material.uniforms.tColor.value = texture;\r\n\t\t\t\t\t\tmesh.material.needsUpdate = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t\t\r\n\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst onMouseClick = (evt) => {\r\n\r\n\t\t\tif(orientedImageControls.hasSomethingCaptured()){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif(hoveredElement){\r\n\t\t\t\tmoveToImage(hoveredElement);\r\n\t\t\t}\r\n\t\t};\r\n\t\tviewer.renderer.domElement.addEventListener( 'mousemove', onMouseMove, false );\r\n\t\tviewer.renderer.domElement.addEventListener( 'mousedown', onMouseClick, false );\r\n\r\n\t\tviewer.addEventListener(\"update\", () => {\r\n\r\n\t\t\tfor(const image of orientedImages){\r\n\t\t\t\tconst world = image.mesh.matrixWorld;\r\n\t\t\t\tconst {width, height} = image;\r\n\t\t\t\tconst aspect = width / height;\r\n\r\n\t\t\t\tconst camera = viewer.scene.getActiveCamera();\r\n\r\n\t\t\t\tconst imgPos = image.mesh.getWorldPosition(new THREE.Vector3());\r\n\t\t\t\tconst camPos = camera.position;\r\n\t\t\t\tconst d = camPos.distanceTo(imgPos);\r\n\r\n\t\t\t\tconst minSize = 1; // in degrees of fov\r\n\t\t\t\tconst a = THREE.Math.degToRad(minSize);\r\n\t\t\t\tlet r = d * Math.tan(a);\r\n\t\t\t\tr = Math.max(r, 1);\r\n\r\n\r\n\t\t\t\timage.mesh.scale.set(r * aspect, r, 1);\r\n\t\t\t\timage.line.scale.set(r * aspect, r, 1);\r\n\r\n\t\t\t\timage.mesh.material.uniforms.uNear.value = camera.near;\r\n\r\n\t\t\t}\r\n\r\n\t\t});\r\n\r\n\t\tconst images = new OrientedImages();\r\n\t\timages.node = sceneNode;\r\n\t\timages.cameraParamsPath = cameraParamsPath;\r\n\t\timages.imageParamsPath = imageParamsPath;\r\n\t\timages.cameraParams = cameraParams;\r\n\t\timages.imageParams = imageParams;\r\n\t\timages.images = orientedImages;\r\n\r\n\t\tPotree.debug.moveToImage = moveToImage;\r\n\r\n\t\treturn images;\r\n\t}\r\n}\r\n\r\n","\r\nimport * as THREE from \"../../../libs/three.js/build/three.module.js\";\r\nimport { EventDispatcher } from \"../../EventDispatcher.js\";\r\nimport {TextSprite} from \"../../TextSprite.js\";\r\n\r\nlet sg = new THREE.SphereGeometry(1, 8, 8);\r\nlet sgHigh = new THREE.SphereGeometry(1, 128, 128);\r\n\r\nlet sm = new THREE.MeshBasicMaterial({side: THREE.BackSide});\r\nlet smHovered = new THREE.MeshBasicMaterial({side: THREE.BackSide, color: 0xff0000});\r\n\r\nlet raycaster = new THREE.Raycaster();\r\nlet currentlyHovered = null;\r\n\r\nlet previousView = {\r\n\tcontrols: null,\r\n\tposition: null,\r\n\ttarget: null,\r\n};\r\n\r\nclass Image360{\r\n\r\n\tconstructor(file, time, longitude, latitude, altitude, course, pitch, roll){\r\n\t\tthis.file = file;\r\n\t\tthis.time = time;\r\n\t\tthis.longitude = longitude;\r\n\t\tthis.latitude = latitude;\r\n\t\tthis.altitude = altitude;\r\n\t\tthis.course = course;\r\n\t\tthis.pitch = pitch;\r\n\t\tthis.roll = roll;\r\n\t\tthis.mesh = null;\r\n\t}\r\n};\r\n\r\nexport class Images360 extends EventDispatcher{\r\n\r\n\tconstructor(viewer){\r\n\t\tsuper();\r\n\r\n\t\tthis.viewer = viewer;\r\n\r\n\t\tthis.selectingEnabled = true;\r\n\r\n\t\tthis.images = [];\r\n\t\tthis.node = new THREE.Object3D();\r\n\r\n\t\tthis.sphere = new THREE.Mesh(sgHigh, sm);\r\n\t\tthis.sphere.visible = false;\r\n\t\tthis.sphere.scale.set(1000, 1000, 1000);\r\n\t\tthis.node.add(this.sphere);\r\n\t\tthis._visible = true;\r\n\t\t// this.node.add(label);\r\n\r\n\t\tthis.focusedImage = null;\r\n\r\n\t\tlet elUnfocus = document.createElement(\"input\");\r\n\t\telUnfocus.type = \"button\";\r\n\t\telUnfocus.value = \"unfocus\";\r\n\t\telUnfocus.style.position = \"absolute\";\r\n\t\telUnfocus.style.right = \"10px\";\r\n\t\telUnfocus.style.bottom = \"10px\";\r\n\t\telUnfocus.style.zIndex = \"10000\";\r\n\t\telUnfocus.style.fontSize = \"2em\";\r\n\t\telUnfocus.addEventListener(\"click\", () => this.unfocus());\r\n\t\tthis.elUnfocus = elUnfocus;\r\n\r\n\t\tthis.domRoot = viewer.renderer.domElement.parentElement;\r\n\t\tthis.domRoot.appendChild(elUnfocus);\r\n\t\tthis.elUnfocus.style.display = \"none\";\r\n\r\n\t\tviewer.addEventListener(\"update\", () => {\r\n\t\t\tthis.update(viewer);\r\n\t\t});\r\n\t\tviewer.inputHandler.addInputListener(this);\r\n\r\n\t\tthis.addEventListener(\"mousedown\", () => {\r\n\t\t\tif(currentlyHovered){\r\n\t\t\t\tthis.focus(currentlyHovered.image360);\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t};\r\n\r\n\tset visible(visible){\r\n\t\tif(this._visible === visible){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\r\n\t\tfor(const image of this.images){\r\n\t\t\timage.mesh.visible = visible && (this.focusedImage == null);\r\n\t\t}\r\n\r\n\t\tthis.sphere.visible = visible && (this.focusedImage != null);\r\n\t\tthis._visible = visible;\r\n\t\tthis.dispatchEvent({\r\n\t\t\ttype: \"visibility_changed\",\r\n\t\t\timages: this,\r\n\t\t});\r\n\t}\r\n\r\n\tget visible(){\r\n\t\treturn this._visible;\r\n\t}\r\n\r\n\tfocus(image360){\r\n\t\tif(this.focusedImage !== null){\r\n\t\t\tthis.unfocus();\r\n\t\t}\r\n\r\n\t\tpreviousView = {\r\n\t\t\tcontrols: this.viewer.controls,\r\n\t\t\tposition: this.viewer.scene.view.position.clone(),\r\n\t\t\ttarget: viewer.scene.view.getPivot(),\r\n\t\t};\r\n\r\n\t\tthis.viewer.setControls(this.viewer.orbitControls);\r\n\t\tthis.viewer.orbitControls.doubleClockZoomEnabled = false;\r\n\r\n\t\tfor(let image of this.images){\r\n\t\t\timage.mesh.visible = false;\r\n\t\t}\r\n\r\n\t\tthis.selectingEnabled = false;\r\n\r\n\t\tthis.sphere.visible = false;\r\n\r\n\t\tthis.load(image360).then( () => {\r\n\t\t\tthis.sphere.visible = true;\r\n\t\t\tthis.sphere.material.map = image360.texture;\r\n\t\t\tthis.sphere.material.needsUpdate = true;\r\n\t\t});\r\n\r\n\t\t{ // orientation\r\n\t\t\tlet {course, pitch, roll} = image360;\r\n\t\t\tthis.sphere.rotation.set(\r\n\t\t\t\tTHREE.Math.degToRad(+roll + 90),\r\n\t\t\t\tTHREE.Math.degToRad(-pitch),\r\n\t\t\t\tTHREE.Math.degToRad(-course + 90),\r\n\t\t\t\t\"ZYX\"\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tthis.sphere.position.set(...image360.position);\r\n\r\n\t\tlet target = new THREE.Vector3(...image360.position);\r\n\t\tlet dir = target.clone().sub(viewer.scene.view.position).normalize();\r\n\t\tlet move = dir.multiplyScalar(0.000001);\r\n\t\tlet newCamPos = target.clone().sub(move);\r\n\r\n\t\tviewer.scene.view.setView(\r\n\t\t\tnewCamPos, \r\n\t\t\ttarget,\r\n\t\t\t500\r\n\t\t);\r\n\r\n\t\tthis.focusedImage = image360;\r\n\r\n\t\tthis.elUnfocus.style.display = \"\";\r\n\t}\r\n\r\n\tunfocus(){\r\n\t\tthis.selectingEnabled = true;\r\n\r\n\t\tfor(let image of this.images){\r\n\t\t\timage.mesh.visible = true;\r\n\t\t}\r\n\r\n\t\tlet image = this.focusedImage;\r\n\r\n\t\tif(image === null){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\r\n\t\tthis.sphere.material.map = null;\r\n\t\tthis.sphere.material.needsUpdate = true;\r\n\t\tthis.sphere.visible = false;\r\n\r\n\t\tlet pos = viewer.scene.view.position;\r\n\t\tlet target = viewer.scene.view.getPivot();\r\n\t\tlet dir = target.clone().sub(pos).normalize();\r\n\t\tlet move = dir.multiplyScalar(10);\r\n\t\tlet newCamPos = target.clone().sub(move);\r\n\r\n\t\tviewer.orbitControls.doubleClockZoomEnabled = true;\r\n\t\tviewer.setControls(previousView.controls);\r\n\r\n\t\tviewer.scene.view.setView(\r\n\t\t\tpreviousView.position, \r\n\t\t\tpreviousView.target,\r\n\t\t\t500\r\n\t\t);\r\n\r\n\r\n\t\tthis.focusedImage = null;\r\n\r\n\t\tthis.elUnfocus.style.display = \"none\";\r\n\t}\r\n\r\n\tload(image360){\r\n\r\n\t\treturn new Promise(resolve => {\r\n\t\t\tlet texture = new THREE.TextureLoader().load(image360.file, resolve);\r\n\t\t\ttexture.wrapS = THREE.RepeatWrapping;\r\n\t\t\ttexture.repeat.x = -1;\r\n\r\n\t\t\timage360.texture = texture;\r\n\t\t});\r\n\r\n\t}\r\n\r\n\thandleHovering(){\r\n\t\tlet mouse = viewer.inputHandler.mouse;\r\n\t\tlet camera = viewer.scene.getActiveCamera();\r\n\t\tlet domElement = viewer.renderer.domElement;\r\n\r\n\t\tlet ray = Potree.Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\r\n\r\n\t\t// let tStart = performance.now();\r\n\t\traycaster.ray.copy(ray);\r\n\t\tlet intersections = raycaster.intersectObjects(this.node.children);\r\n\r\n\t\tif(intersections.length === 0){\r\n\t\t\t// label.visible = false;\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet intersection = intersections[0];\r\n\t\tcurrentlyHovered = intersection.object;\r\n\t\tcurrentlyHovered.material = smHovered;\r\n\r\n\t\t//label.visible = true;\r\n\t\t//label.setText(currentlyHovered.image360.file);\r\n\t\t//currentlyHovered.getWorldPosition(label.position);\r\n\t}\r\n\r\n\tupdate(){\r\n\r\n\t\tlet {viewer} = this;\r\n\r\n\t\tif(currentlyHovered){\r\n\t\t\tcurrentlyHovered.material = sm;\r\n\t\t\tcurrentlyHovered = null;\r\n\t\t}\r\n\r\n\t\tif(this.selectingEnabled){\r\n\t\t\tthis.handleHovering();\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\nexport class Images360Loader{\r\n\r\n\tstatic async load(url, viewer, params = {}){\r\n\r\n\t\tif(!params.transform){\r\n\t\t\tparams.transform = {\r\n\t\t\t\tforward: a => a,\r\n\t\t\t};\r\n\t\t}\r\n\t\t\r\n\t\tlet response = await fetch(`${url}/coordinates.txt`);\r\n\t\tlet text = await response.text();\r\n\r\n\t\tlet lines = text.split(/\\r?\\n/);\r\n\t\tlet coordinateLines = lines.slice(1);\r\n\r\n\t\tlet images360 = new Images360(viewer);\r\n\r\n\t\tfor(let line of coordinateLines){\r\n\r\n\t\t\tif(line.trim().length === 0){\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tlet tokens = line.split(/\\t/);\r\n\r\n\t\t\tlet [filename, time, long, lat, alt, course, pitch, roll] = tokens;\r\n\t\t\ttime = parseFloat(time);\r\n\t\t\tlong = parseFloat(long);\r\n\t\t\tlat = parseFloat(lat);\r\n\t\t\talt = parseFloat(alt);\r\n\t\t\tcourse = parseFloat(course);\r\n\t\t\tpitch = parseFloat(pitch);\r\n\t\t\troll = parseFloat(roll);\r\n\r\n\t\t\tfilename = filename.replace(/\"/g, \"\");\r\n\t\t\tlet file = `${url}/${filename}`;\r\n\r\n\t\t\tlet image360 = new Image360(file, time, long, lat, alt, course, pitch, roll);\r\n\r\n\t\t\tlet xy = params.transform.forward([long, lat]);\r\n\t\t\tlet position = [...xy, alt];\r\n\t\t\timage360.position = position;\r\n\r\n\t\t\timages360.images.push(image360);\r\n\t\t}\r\n\r\n\t\tImages360Loader.createSceneNodes(images360, params.transform);\r\n\r\n\t\treturn images360;\r\n\r\n\t}\r\n\r\n\tstatic createSceneNodes(images360, transform){\r\n\r\n\t\tfor(let image360 of images360.images){\r\n\t\t\tlet {longitude, latitude, altitude} = image360;\r\n\t\t\tlet xy = transform.forward([longitude, latitude]);\r\n\r\n\t\t\tlet mesh = new THREE.Mesh(sg, sm);\r\n\t\t\tmesh.position.set(...xy, altitude);\r\n\t\t\tmesh.scale.set(1, 1, 1);\r\n\t\t\tmesh.material.transparent = true;\r\n\t\t\tmesh.material.opacity = 0.75;\r\n\t\t\tmesh.image360 = image360;\r\n\r\n\t\t\t{ // orientation\r\n\t\t\t\tvar {course, pitch, roll} = image360;\r\n\t\t\t\tmesh.rotation.set(\r\n\t\t\t\t\tTHREE.Math.degToRad(+roll + 90),\r\n\t\t\t\t\tTHREE.Math.degToRad(-pitch),\r\n\t\t\t\t\tTHREE.Math.degToRad(-course + 90),\r\n\t\t\t\t\t\"ZYX\"\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\timages360.node.add(mesh);\r\n\r\n\t\t\timage360.mesh = mesh;\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n\r\n};\r\n\r\n\r\n","// This is a generated file. Do not edit.\nvar Space_Separator = /[\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/;\nvar ID_Start = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE83\\uDE86-\\uDE89\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]/;\nvar ID_Continue = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u09FC\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9-\\u0AFF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D00-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1C80-\\u1C88\\u1CD0-\\u1CD2\\u1CD4-\\u1CF9\\u1D00-\\u1DF9\\u1DFB-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C5\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC00-\\uDC4A\\uDC50-\\uDC59\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDE00-\\uDE3E\\uDE47\\uDE50-\\uDE83\\uDE86-\\uDE99\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC40\\uDC50-\\uDC59\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD47\\uDD50-\\uDD59]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6\\uDD00-\\uDD4A\\uDD50-\\uDD59]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/;\n\nvar unicode = {\n\tSpace_Separator: Space_Separator,\n\tID_Start: ID_Start,\n\tID_Continue: ID_Continue\n};\n\nvar util = {\n isSpaceSeparator (c) {\n return typeof c === 'string' && unicode.Space_Separator.test(c)\n },\n\n isIdStartChar (c) {\n return typeof c === 'string' && (\n (c >= 'a' && c <= 'z') ||\n (c >= 'A' && c <= 'Z') ||\n (c === '$') || (c === '_') ||\n unicode.ID_Start.test(c)\n )\n },\n\n isIdContinueChar (c) {\n return typeof c === 'string' && (\n (c >= 'a' && c <= 'z') ||\n (c >= 'A' && c <= 'Z') ||\n (c >= '0' && c <= '9') ||\n (c === '$') || (c === '_') ||\n (c === '\\u200C') || (c === '\\u200D') ||\n unicode.ID_Continue.test(c)\n )\n },\n\n isDigit (c) {\n return typeof c === 'string' && /[0-9]/.test(c)\n },\n\n isHexDigit (c) {\n return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)\n },\n};\n\nlet source;\nlet parseState;\nlet stack;\nlet pos;\nlet line;\nlet column;\nlet token;\nlet key;\nlet root;\n\nvar parse = function parse (text, reviver) {\n source = String(text);\n parseState = 'start';\n stack = [];\n pos = 0;\n line = 1;\n column = 0;\n token = undefined;\n key = undefined;\n root = undefined;\n\n do {\n token = lex();\n\n // This code is unreachable.\n // if (!parseStates[parseState]) {\n // throw invalidParseState()\n // }\n\n parseStates[parseState]();\n } while (token.type !== 'eof')\n\n if (typeof reviver === 'function') {\n return internalize({'': root}, '', reviver)\n }\n\n return root\n};\n\nfunction internalize (holder, name, reviver) {\n const value = holder[name];\n if (value != null && typeof value === 'object') {\n for (const key in value) {\n const replacement = internalize(value, key, reviver);\n if (replacement === undefined) {\n delete value[key];\n } else {\n value[key] = replacement;\n }\n }\n }\n\n return reviver.call(holder, name, value)\n}\n\nlet lexState;\nlet buffer;\nlet doubleQuote;\nlet sign;\nlet c;\n\nfunction lex () {\n lexState = 'default';\n buffer = '';\n doubleQuote = false;\n sign = 1;\n\n for (;;) {\n c = peek();\n\n // This code is unreachable.\n // if (!lexStates[lexState]) {\n // throw invalidLexState(lexState)\n // }\n\n const token = lexStates[lexState]();\n if (token) {\n return token\n }\n }\n}\n\nfunction peek () {\n if (source[pos]) {\n return String.fromCodePoint(source.codePointAt(pos))\n }\n}\n\nfunction read () {\n const c = peek();\n\n if (c === '\\n') {\n line++;\n column = 0;\n } else if (c) {\n column += c.length;\n } else {\n column++;\n }\n\n if (c) {\n pos += c.length;\n }\n\n return c\n}\n\nconst lexStates = {\n default () {\n switch (c) {\n case '\\t':\n case '\\v':\n case '\\f':\n case ' ':\n case '\\u00A0':\n case '\\uFEFF':\n case '\\n':\n case '\\r':\n case '\\u2028':\n case '\\u2029':\n read();\n return\n\n case '/':\n read();\n lexState = 'comment';\n return\n\n case undefined:\n read();\n return newToken('eof')\n }\n\n if (util.isSpaceSeparator(c)) {\n read();\n return\n }\n\n // This code is unreachable.\n // if (!lexStates[parseState]) {\n // throw invalidLexState(parseState)\n // }\n\n return lexStates[parseState]()\n },\n\n comment () {\n switch (c) {\n case '*':\n read();\n lexState = 'multiLineComment';\n return\n\n case '/':\n read();\n lexState = 'singleLineComment';\n return\n }\n\n throw invalidChar(read())\n },\n\n multiLineComment () {\n switch (c) {\n case '*':\n read();\n lexState = 'multiLineCommentAsterisk';\n return\n\n case undefined:\n throw invalidChar(read())\n }\n\n read();\n },\n\n multiLineCommentAsterisk () {\n switch (c) {\n case '*':\n read();\n return\n\n case '/':\n read();\n lexState = 'default';\n return\n\n case undefined:\n throw invalidChar(read())\n }\n\n read();\n lexState = 'multiLineComment';\n },\n\n singleLineComment () {\n switch (c) {\n case '\\n':\n case '\\r':\n case '\\u2028':\n case '\\u2029':\n read();\n lexState = 'default';\n return\n\n case undefined:\n read();\n return newToken('eof')\n }\n\n read();\n },\n\n value () {\n switch (c) {\n case '{':\n case '[':\n return newToken('punctuator', read())\n\n case 'n':\n read();\n literal('ull');\n return newToken('null', null)\n\n case 't':\n read();\n literal('rue');\n return newToken('boolean', true)\n\n case 'f':\n read();\n literal('alse');\n return newToken('boolean', false)\n\n case '-':\n case '+':\n if (read() === '-') {\n sign = -1;\n }\n\n lexState = 'sign';\n return\n\n case '.':\n buffer = read();\n lexState = 'decimalPointLeading';\n return\n\n case '0':\n buffer = read();\n lexState = 'zero';\n return\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n buffer = read();\n lexState = 'decimalInteger';\n return\n\n case 'I':\n read();\n literal('nfinity');\n return newToken('numeric', Infinity)\n\n case 'N':\n read();\n literal('aN');\n return newToken('numeric', NaN)\n\n case '\"':\n case \"'\":\n doubleQuote = (read() === '\"');\n buffer = '';\n lexState = 'string';\n return\n }\n\n throw invalidChar(read())\n },\n\n identifierNameStartEscape () {\n if (c !== 'u') {\n throw invalidChar(read())\n }\n\n read();\n const u = unicodeEscape();\n switch (u) {\n case '$':\n case '_':\n break\n\n default:\n if (!util.isIdStartChar(u)) {\n throw invalidIdentifier()\n }\n\n break\n }\n\n buffer += u;\n lexState = 'identifierName';\n },\n\n identifierName () {\n switch (c) {\n case '$':\n case '_':\n case '\\u200C':\n case '\\u200D':\n buffer += read();\n return\n\n case '\\\\':\n read();\n lexState = 'identifierNameEscape';\n return\n }\n\n if (util.isIdContinueChar(c)) {\n buffer += read();\n return\n }\n\n return newToken('identifier', buffer)\n },\n\n identifierNameEscape () {\n if (c !== 'u') {\n throw invalidChar(read())\n }\n\n read();\n const u = unicodeEscape();\n switch (u) {\n case '$':\n case '_':\n case '\\u200C':\n case '\\u200D':\n break\n\n default:\n if (!util.isIdContinueChar(u)) {\n throw invalidIdentifier()\n }\n\n break\n }\n\n buffer += u;\n lexState = 'identifierName';\n },\n\n sign () {\n switch (c) {\n case '.':\n buffer = read();\n lexState = 'decimalPointLeading';\n return\n\n case '0':\n buffer = read();\n lexState = 'zero';\n return\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n buffer = read();\n lexState = 'decimalInteger';\n return\n\n case 'I':\n read();\n literal('nfinity');\n return newToken('numeric', sign * Infinity)\n\n case 'N':\n read();\n literal('aN');\n return newToken('numeric', NaN)\n }\n\n throw invalidChar(read())\n },\n\n zero () {\n switch (c) {\n case '.':\n buffer += read();\n lexState = 'decimalPoint';\n return\n\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n\n case 'x':\n case 'X':\n buffer += read();\n lexState = 'hexadecimal';\n return\n }\n\n return newToken('numeric', sign * 0)\n },\n\n decimalInteger () {\n switch (c) {\n case '.':\n buffer += read();\n lexState = 'decimalPoint';\n return\n\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalPointLeading () {\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalFraction';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalPoint () {\n switch (c) {\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalFraction';\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalFraction () {\n switch (c) {\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalExponent () {\n switch (c) {\n case '+':\n case '-':\n buffer += read();\n lexState = 'decimalExponentSign';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalExponentInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalExponentSign () {\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalExponentInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalExponentInteger () {\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n hexadecimal () {\n if (util.isHexDigit(c)) {\n buffer += read();\n lexState = 'hexadecimalInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n hexadecimalInteger () {\n if (util.isHexDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n string () {\n switch (c) {\n case '\\\\':\n read();\n buffer += escape();\n return\n\n case '\"':\n if (doubleQuote) {\n read();\n return newToken('string', buffer)\n }\n\n buffer += read();\n return\n\n case \"'\":\n if (!doubleQuote) {\n read();\n return newToken('string', buffer)\n }\n\n buffer += read();\n return\n\n case '\\n':\n case '\\r':\n throw invalidChar(read())\n\n case '\\u2028':\n case '\\u2029':\n separatorChar(c);\n break\n\n case undefined:\n throw invalidChar(read())\n }\n\n buffer += read();\n },\n\n start () {\n switch (c) {\n case '{':\n case '[':\n return newToken('punctuator', read())\n\n // This code is unreachable since the default lexState handles eof.\n // case undefined:\n // return newToken('eof')\n }\n\n lexState = 'value';\n },\n\n beforePropertyName () {\n switch (c) {\n case '$':\n case '_':\n buffer = read();\n lexState = 'identifierName';\n return\n\n case '\\\\':\n read();\n lexState = 'identifierNameStartEscape';\n return\n\n case '}':\n return newToken('punctuator', read())\n\n case '\"':\n case \"'\":\n doubleQuote = (read() === '\"');\n lexState = 'string';\n return\n }\n\n if (util.isIdStartChar(c)) {\n buffer += read();\n lexState = 'identifierName';\n return\n }\n\n throw invalidChar(read())\n },\n\n afterPropertyName () {\n if (c === ':') {\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n beforePropertyValue () {\n lexState = 'value';\n },\n\n afterPropertyValue () {\n switch (c) {\n case ',':\n case '}':\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n beforeArrayValue () {\n if (c === ']') {\n return newToken('punctuator', read())\n }\n\n lexState = 'value';\n },\n\n afterArrayValue () {\n switch (c) {\n case ',':\n case ']':\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n end () {\n // This code is unreachable since it's handled by the default lexState.\n // if (c === undefined) {\n // read()\n // return newToken('eof')\n // }\n\n throw invalidChar(read())\n },\n};\n\nfunction newToken (type, value) {\n return {\n type,\n value,\n line,\n column,\n }\n}\n\nfunction literal (s) {\n for (const c of s) {\n const p = peek();\n\n if (p !== c) {\n throw invalidChar(read())\n }\n\n read();\n }\n}\n\nfunction escape () {\n const c = peek();\n switch (c) {\n case 'b':\n read();\n return '\\b'\n\n case 'f':\n read();\n return '\\f'\n\n case 'n':\n read();\n return '\\n'\n\n case 'r':\n read();\n return '\\r'\n\n case 't':\n read();\n return '\\t'\n\n case 'v':\n read();\n return '\\v'\n\n case '0':\n read();\n if (util.isDigit(peek())) {\n throw invalidChar(read())\n }\n\n return '\\0'\n\n case 'x':\n read();\n return hexEscape()\n\n case 'u':\n read();\n return unicodeEscape()\n\n case '\\n':\n case '\\u2028':\n case '\\u2029':\n read();\n return ''\n\n case '\\r':\n read();\n if (peek() === '\\n') {\n read();\n }\n\n return ''\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n throw invalidChar(read())\n\n case undefined:\n throw invalidChar(read())\n }\n\n return read()\n}\n\nfunction hexEscape () {\n let buffer = '';\n let c = peek();\n\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n\n c = peek();\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n\n return String.fromCodePoint(parseInt(buffer, 16))\n}\n\nfunction unicodeEscape () {\n let buffer = '';\n let count = 4;\n\n while (count-- > 0) {\n const c = peek();\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n }\n\n return String.fromCodePoint(parseInt(buffer, 16))\n}\n\nconst parseStates = {\n start () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n push();\n },\n\n beforePropertyName () {\n switch (token.type) {\n case 'identifier':\n case 'string':\n key = token.value;\n parseState = 'afterPropertyName';\n return\n\n case 'punctuator':\n // This code is unreachable since it's handled by the lexState.\n // if (token.value !== '}') {\n // throw invalidToken()\n // }\n\n pop();\n return\n\n case 'eof':\n throw invalidEOF()\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n afterPropertyName () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator' || token.value !== ':') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n parseState = 'beforePropertyValue';\n },\n\n beforePropertyValue () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n push();\n },\n\n beforeArrayValue () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n if (token.type === 'punctuator' && token.value === ']') {\n pop();\n return\n }\n\n push();\n },\n\n afterPropertyValue () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n switch (token.value) {\n case ',':\n parseState = 'beforePropertyName';\n return\n\n case '}':\n pop();\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n afterArrayValue () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n switch (token.value) {\n case ',':\n parseState = 'beforeArrayValue';\n return\n\n case ']':\n pop();\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n end () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'eof') {\n // throw invalidToken()\n // }\n },\n};\n\nfunction push () {\n let value;\n\n switch (token.type) {\n case 'punctuator':\n switch (token.value) {\n case '{':\n value = {};\n break\n\n case '[':\n value = [];\n break\n }\n\n break\n\n case 'null':\n case 'boolean':\n case 'numeric':\n case 'string':\n value = token.value;\n break\n\n // This code is unreachable.\n // default:\n // throw invalidToken()\n }\n\n if (root === undefined) {\n root = value;\n } else {\n const parent = stack[stack.length - 1];\n if (Array.isArray(parent)) {\n parent.push(value);\n } else {\n parent[key] = value;\n }\n }\n\n if (value !== null && typeof value === 'object') {\n stack.push(value);\n\n if (Array.isArray(value)) {\n parseState = 'beforeArrayValue';\n } else {\n parseState = 'beforePropertyName';\n }\n } else {\n const current = stack[stack.length - 1];\n if (current == null) {\n parseState = 'end';\n } else if (Array.isArray(current)) {\n parseState = 'afterArrayValue';\n } else {\n parseState = 'afterPropertyValue';\n }\n }\n}\n\nfunction pop () {\n stack.pop();\n\n const current = stack[stack.length - 1];\n if (current == null) {\n parseState = 'end';\n } else if (Array.isArray(current)) {\n parseState = 'afterArrayValue';\n } else {\n parseState = 'afterPropertyValue';\n }\n}\n\n// This code is unreachable.\n// function invalidParseState () {\n// return new Error(`JSON5: invalid parse state '${parseState}'`)\n// }\n\n// This code is unreachable.\n// function invalidLexState (state) {\n// return new Error(`JSON5: invalid lex state '${state}'`)\n// }\n\nfunction invalidChar (c) {\n if (c === undefined) {\n return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n }\n\n return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)\n}\n\nfunction invalidEOF () {\n return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n}\n\n// This code is unreachable.\n// function invalidToken () {\n// if (token.type === 'eof') {\n// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n// }\n\n// const c = String.fromCodePoint(token.value.codePointAt(0))\n// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)\n// }\n\nfunction invalidIdentifier () {\n column -= 5;\n return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`)\n}\n\nfunction separatorChar (c) {\n console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`);\n}\n\nfunction formatChar (c) {\n const replacements = {\n \"'\": \"\\\\'\",\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\',\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n '\\v': '\\\\v',\n '\\0': '\\\\0',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n };\n\n if (replacements[c]) {\n return replacements[c]\n }\n\n if (c < ' ') {\n const hexString = c.charCodeAt(0).toString(16);\n return '\\\\x' + ('00' + hexString).substring(hexString.length)\n }\n\n return c\n}\n\nfunction syntaxError (message) {\n const err = new SyntaxError(message);\n err.lineNumber = line;\n err.columnNumber = column;\n return err\n}\n\nvar stringify = function stringify (value, replacer, space) {\n const stack = [];\n let indent = '';\n let propertyList;\n let replacerFunc;\n let gap = '';\n let quote;\n\n if (\n replacer != null &&\n typeof replacer === 'object' &&\n !Array.isArray(replacer)\n ) {\n space = replacer.space;\n quote = replacer.quote;\n replacer = replacer.replacer;\n }\n\n if (typeof replacer === 'function') {\n replacerFunc = replacer;\n } else if (Array.isArray(replacer)) {\n propertyList = [];\n for (const v of replacer) {\n let item;\n\n if (typeof v === 'string') {\n item = v;\n } else if (\n typeof v === 'number' ||\n v instanceof String ||\n v instanceof Number\n ) {\n item = String(v);\n }\n\n if (item !== undefined && propertyList.indexOf(item) < 0) {\n propertyList.push(item);\n }\n }\n }\n\n if (space instanceof Number) {\n space = Number(space);\n } else if (space instanceof String) {\n space = String(space);\n }\n\n if (typeof space === 'number') {\n if (space > 0) {\n space = Math.min(10, Math.floor(space));\n gap = ' '.substr(0, space);\n }\n } else if (typeof space === 'string') {\n gap = space.substr(0, 10);\n }\n\n return serializeProperty('', {'': value})\n\n function serializeProperty (key, holder) {\n let value = holder[key];\n if (value != null) {\n if (typeof value.toJSON5 === 'function') {\n value = value.toJSON5(key);\n } else if (typeof value.toJSON === 'function') {\n value = value.toJSON(key);\n }\n }\n\n if (replacerFunc) {\n value = replacerFunc.call(holder, key, value);\n }\n\n if (value instanceof Number) {\n value = Number(value);\n } else if (value instanceof String) {\n value = String(value);\n } else if (value instanceof Boolean) {\n value = value.valueOf();\n }\n\n switch (value) {\n case null: return 'null'\n case true: return 'true'\n case false: return 'false'\n }\n\n if (typeof value === 'string') {\n return quoteString(value, false)\n }\n\n if (typeof value === 'number') {\n return String(value)\n }\n\n if (typeof value === 'object') {\n return Array.isArray(value) ? serializeArray(value) : serializeObject(value)\n }\n\n return undefined\n }\n\n function quoteString (value) {\n const quotes = {\n \"'\": 0.1,\n '\"': 0.2,\n };\n\n const replacements = {\n \"'\": \"\\\\'\",\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\',\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n '\\v': '\\\\v',\n '\\0': '\\\\0',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n };\n\n let product = '';\n\n for (let i = 0; i < value.length; i++) {\n const c = value[i];\n switch (c) {\n case \"'\":\n case '\"':\n quotes[c]++;\n product += c;\n continue\n\n case '\\0':\n if (util.isDigit(value[i + 1])) {\n product += '\\\\x00';\n continue\n }\n }\n\n if (replacements[c]) {\n product += replacements[c];\n continue\n }\n\n if (c < ' ') {\n let hexString = c.charCodeAt(0).toString(16);\n product += '\\\\x' + ('00' + hexString).substring(hexString.length);\n continue\n }\n\n product += c;\n }\n\n const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b);\n\n product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);\n\n return quoteChar + product + quoteChar\n }\n\n function serializeObject (value) {\n if (stack.indexOf(value) >= 0) {\n throw TypeError('Converting circular structure to JSON5')\n }\n\n stack.push(value);\n\n let stepback = indent;\n indent = indent + gap;\n\n let keys = propertyList || Object.keys(value);\n let partial = [];\n for (const key of keys) {\n const propertyString = serializeProperty(key, value);\n if (propertyString !== undefined) {\n let member = serializeKey(key) + ':';\n if (gap !== '') {\n member += ' ';\n }\n member += propertyString;\n partial.push(member);\n }\n }\n\n let final;\n if (partial.length === 0) {\n final = '{}';\n } else {\n let properties;\n if (gap === '') {\n properties = partial.join(',');\n final = '{' + properties + '}';\n } else {\n let separator = ',\\n' + indent;\n properties = partial.join(separator);\n final = '{\\n' + indent + properties + ',\\n' + stepback + '}';\n }\n }\n\n stack.pop();\n indent = stepback;\n return final\n }\n\n function serializeKey (key) {\n if (key.length === 0) {\n return quoteString(key, true)\n }\n\n const firstChar = String.fromCodePoint(key.codePointAt(0));\n if (!util.isIdStartChar(firstChar)) {\n return quoteString(key, true)\n }\n\n for (let i = firstChar.length; i < key.length; i++) {\n if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {\n return quoteString(key, true)\n }\n }\n\n return key\n }\n\n function serializeArray (value) {\n if (stack.indexOf(value) >= 0) {\n throw TypeError('Converting circular structure to JSON5')\n }\n\n stack.push(value);\n\n let stepback = indent;\n indent = indent + gap;\n\n let partial = [];\n for (let i = 0; i < value.length; i++) {\n const propertyString = serializeProperty(String(i), value);\n partial.push((propertyString !== undefined) ? propertyString : 'null');\n }\n\n let final;\n if (partial.length === 0) {\n final = '[]';\n } else {\n if (gap === '') {\n let properties = partial.join(',');\n final = '[' + properties + ']';\n } else {\n let separator = ',\\n' + indent;\n let properties = partial.join(separator);\n final = '[\\n' + indent + properties + ',\\n' + stepback + ']';\n }\n }\n\n stack.pop();\n indent = stepback;\n return final\n }\n};\n\nconst JSON5 = {\n parse,\n stringify,\n};\n\nvar lib = JSON5;\n\nexport default lib;\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {GeoJSONExporter} from \"../exporter/GeoJSONExporter.js\"\nimport {DXFExporter} from \"../exporter/DXFExporter.js\"\nimport {Volume, SphereVolume} from \"../utils/Volume.js\"\nimport {PolygonClipVolume} from \"../utils/PolygonClipVolume.js\"\nimport {PropertiesPanel} from \"./PropertyPanels/PropertiesPanel.js\"\nimport {PointCloudTree} from \"../PointCloudTree.js\"\nimport {Profile} from \"../utils/Profile.js\"\nimport {Measure} from \"../utils/Measure.js\"\nimport {Annotation} from \"../Annotation.js\"\nimport {CameraMode, ClipTask, ClipMethod} from \"../defines.js\"\nimport {ScreenBoxSelectTool} from \"../utils/ScreenBoxSelectTool.js\"\nimport {Utils} from \"../utils.js\"\nimport {CameraAnimation} from \"../modules/CameraAnimation/CameraAnimation.js\"\nimport {HierarchicalSlider} from \"./HierarchicalSlider.js\"\nimport {OrientedImage} from \"../modules/OrientedImages/OrientedImages.js\";\nimport {Images360} from \"../modules/Images360/Images360.js\";\n\nimport JSON5 from \"../../libs/json5-2.1.3/json5.mjs\";\n\nexport class Sidebar{\n\n\tconstructor(viewer){\n\t\tthis.viewer = viewer;\n\n\t\tthis.measuringTool = viewer.measuringTool;\n\t\tthis.profileTool = viewer.profileTool;\n\t\tthis.volumeTool = viewer.volumeTool;\n\n\t\tthis.dom = $(\"#sidebar_root\");\n\t}\n\n\tcreateToolIcon(icon, title, callback){\n\t\tlet element = $(`\n\t\t\t\n\t\t`);\n\n\t\telement.click(callback);\n\n\t\treturn element;\n\t}\n\n\tinit(){\n\n\t\tthis.initAccordion();\n\t\tthis.initAppearance();\n\t\tthis.initToolbar();\n\t\tthis.initScene();\n\t\tthis.initNavigation();\n\t\tthis.initFilters();\n\t\tthis.initClippingTool();\n\t\tthis.initSettings();\n\t\t\n\t\t$('#potree_version_number').html(Potree.version.major + \".\" + Potree.version.minor + Potree.version.suffix);\n\t}\n\n\t\t\n\n\tinitToolbar(){\n\n\t\t// ANGLE\n\t\tlet elToolbar = $('#tools');\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/angle.png',\n\t\t\t'[title]tt.angle_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: false,\n\t\t\t\t\tshowAngles: true,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tclosed: true,\n\t\t\t\t\tmaxMarkers: 3,\n\t\t\t\t\tname: 'Angle'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// POINT\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/point.svg',\n\t\t\t'[title]tt.point_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: false,\n\t\t\t\t\tshowAngles: false,\n\t\t\t\t\tshowCoordinates: true,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tclosed: true,\n\t\t\t\t\tmaxMarkers: 1,\n\t\t\t\t\tname: 'Point'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// DISTANCE\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/distance.svg',\n\t\t\t'[title]tt.distance_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: true,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tclosed: false,\n\t\t\t\t\tname: 'Distance'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// HEIGHT\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/height.svg',\n\t\t\t'[title]tt.height_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: false,\n\t\t\t\t\tshowHeight: true,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tclosed: false,\n\t\t\t\t\tmaxMarkers: 2,\n\t\t\t\t\tname: 'Height'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// CIRCLE\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/circle.svg',\n\t\t\t'[title]tt.circle_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: false,\n\t\t\t\t\tshowHeight: false,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tshowCircle: true,\n\t\t\t\t\tshowEdges: false,\n\t\t\t\t\tclosed: false,\n\t\t\t\t\tmaxMarkers: 3,\n\t\t\t\t\tname: 'Circle'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// AZIMUTH\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/azimuth.svg',\n\t\t\t'Azimuth',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: false,\n\t\t\t\t\tshowHeight: false,\n\t\t\t\t\tshowArea: false,\n\t\t\t\t\tshowCircle: false,\n\t\t\t\t\tshowEdges: false,\n\t\t\t\t\tshowAzimuth: true,\n\t\t\t\t\tclosed: false,\n\t\t\t\t\tmaxMarkers: 2,\n\t\t\t\t\tname: 'Azimuth'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// AREA\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/area.svg',\n\t\t\t'[title]tt.area_measurement',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown();\n\t\t\t\tlet measurement = this.measuringTool.startInsertion({\n\t\t\t\t\tshowDistances: true,\n\t\t\t\t\tshowArea: true,\n\t\t\t\t\tclosed: true,\n\t\t\t\t\tname: 'Area'});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === measurement.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// VOLUME\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/volume.svg',\n\t\t\t'[title]tt.volume_measurement',\n\t\t\t() => {\n\t\t\t\tlet volume = this.volumeTool.startInsertion(); \n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === volume.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// SPHERE VOLUME\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/sphere_distances.svg',\n\t\t\t'[title]tt.volume_measurement',\n\t\t\t() => { \n\t\t\t\tlet volume = this.volumeTool.startInsertion({type: SphereVolume}); \n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === volume.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// PROFILE\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/profile.svg',\n\t\t\t'[title]tt.height_profile',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown(); ;\n\t\t\t\tlet profile = this.profileTool.startInsertion();\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === profile.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// ANNOTATION\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/annotation.svg',\n\t\t\t'[title]tt.annotation',\n\t\t\t() => {\n\t\t\t\t$('#menu_measurements').next().slideDown(); ;\n\t\t\t\tlet annotation = this.viewer.annotationTool.startInsertion();\n\n\t\t\t\tlet annotationsRoot = $(\"#jstree_scene\").jstree().get_json(\"annotations\");\n\t\t\t\tlet jsonNode = annotationsRoot.children.find(child => child.data.uuid === annotation.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// REMOVE ALL\n\t\telToolbar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/reset_tools.svg',\n\t\t\t'[title]tt.remove_all_measurement',\n\t\t\t() => {\n\t\t\t\tthis.viewer.scene.removeAllMeasurements();\n\t\t\t}\n\t\t));\n\n\n\t\t{ // SHOW / HIDE Measurements\n\t\t\tlet elShow = $(\"#measurement_options_show\");\n\t\t\telShow.selectgroup({title: \"Show/Hide labels\"});\n\n\t\t\telShow.find(\"input\").click( (e) => {\n\t\t\t\tconst show = e.target.value === \"SHOW\";\n\t\t\t\tthis.measuringTool.showLabels = show;\n\t\t\t});\n\n\t\t\tlet currentShow = this.measuringTool.showLabels ? \"SHOW\" : \"HIDE\";\n\t\t\telShow.find(`input[value=${currentShow}]`).trigger(\"click\");\n\t\t}\n\t}\n\n\tinitScene(){\n\n\t\tlet elScene = $(\"#menu_scene\");\n\t\tlet elObjects = elScene.next().find(\"#scene_objects\");\n\t\tlet elProperties = elScene.next().find(\"#scene_object_properties\");\n\t\t\n\n\t\t{\n\t\t\tlet elExport = elScene.next().find(\"#scene_export\");\n\n\t\t\tlet geoJSONIcon = `${Potree.resourcePath}/icons/file_geojson.svg`;\n\t\t\tlet dxfIcon = `${Potree.resourcePath}/icons/file_dxf.svg`;\n\t\t\tlet potreeIcon = `${Potree.resourcePath}/icons/file_potree.svg`;\n\n\t\t\telExport.append(`\n\t\t\t\tExport:
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t`);\n\n\t\t\tlet elDownloadJSON = elExport.find(\"img[name=geojson_export_button]\").parent();\n\t\t\telDownloadJSON.click( (event) => {\n\t\t\t\tlet scene = this.viewer.scene;\n\t\t\t\tlet measurements = [...scene.measurements, ...scene.profiles, ...scene.volumes];\n\n\t\t\t\tif(measurements.length > 0){\n\t\t\t\t\tlet geoJson = GeoJSONExporter.toString(measurements);\n\n\t\t\t\t\tlet url = window.URL.createObjectURL(new Blob([geoJson], {type: 'data:application/octet-stream'}));\n\t\t\t\t\telDownloadJSON.attr('href', url);\n\t\t\t\t}else{\n\t\t\t\t\tthis.viewer.postError(\"no measurements to export\");\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet elDownloadDXF = elExport.find(\"img[name=dxf_export_button]\").parent();\n\t\t\telDownloadDXF.click( (event) => {\n\t\t\t\tlet scene = this.viewer.scene;\n\t\t\t\tlet measurements = [...scene.measurements, ...scene.profiles, ...scene.volumes];\n\n\t\t\t\tif(measurements.length > 0){\n\t\t\t\t\tlet dxf = DXFExporter.toString(measurements);\n\n\t\t\t\t\tlet url = window.URL.createObjectURL(new Blob([dxf], {type: 'data:application/octet-stream'}));\n\t\t\t\t\telDownloadDXF.attr('href', url);\n\t\t\t\t}else{\n\t\t\t\t\tthis.viewer.postError(\"no measurements to export\");\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet elDownloadPotree = elExport.find(\"img[name=potree_export_button]\").parent();\n\t\t\telDownloadPotree.click( (event) => {\n\n\t\t\t\tlet data = Potree.saveProject(this.viewer);\n\t\t\t\tlet dataString = JSON5.stringify(data, null, \"\\t\")\n\n\t\t\t\tlet url = window.URL.createObjectURL(new Blob([dataString], {type: 'data:application/octet-stream'}));\n\t\t\t\telDownloadPotree.attr('href', url);\n\t\t\t});\n\t\t}\n\n\t\tlet propertiesPanel = new PropertiesPanel(elProperties, this.viewer);\n\t\tpropertiesPanel.setScene(this.viewer.scene);\n\t\t\n\t\tlocalStorage.removeItem('jstree');\n\n\t\tlet tree = $(`
    `);\n\t\telObjects.append(tree);\n\n\t\ttree.jstree({\n\t\t\t'plugins': [\"checkbox\", \"state\"],\n\t\t\t'core': {\n\t\t\t\t\"dblclick_toggle\": false,\n\t\t\t\t\"state\": {\n\t\t\t\t\t\"checked\" : true\n\t\t\t\t},\n\t\t\t\t'check_callback': true,\n\t\t\t\t\"expand_selected_onload\": true\n\t\t\t},\n\t\t\t\"checkbox\" : {\n\t\t\t\t\"keep_selected_style\": true,\n\t\t\t\t\"three_state\": false,\n\t\t\t\t\"whole_node\": false,\n\t\t\t\t\"tie_selection\": false,\n\t\t\t},\n\t\t});\n\n\t\tlet createNode = (parent, text, icon, object) => {\n\t\t\tlet nodeID = tree.jstree('create_node', parent, { \n\t\t\t\t\t\"text\": text, \n\t\t\t\t\t\"icon\": icon,\n\t\t\t\t\t\"data\": object\n\t\t\t\t}, \n\t\t\t\t\"last\", false, false);\n\t\t\t\n\t\t\tif(object.visible){\n\t\t\t\ttree.jstree('check_node', nodeID);\n\t\t\t}else{\n\t\t\t\ttree.jstree('uncheck_node', nodeID);\n\t\t\t}\n\n\t\t\treturn nodeID;\n\t\t}\n\n\t\tlet pcID = tree.jstree('create_node', \"#\", { \"text\": \"Point Clouds\", \"id\": \"pointclouds\"}, \"last\", false, false);\n\t\tlet measurementID = tree.jstree('create_node', \"#\", { \"text\": \"Measurements\", \"id\": \"measurements\" }, \"last\", false, false);\n\t\tlet annotationsID = tree.jstree('create_node', \"#\", { \"text\": \"Annotations\", \"id\": \"annotations\" }, \"last\", false, false);\n\t\tlet otherID = tree.jstree('create_node', \"#\", { \"text\": \"Other\", \"id\": \"other\" }, \"last\", false, false);\n\t\tlet vectorsID = tree.jstree('create_node', \"#\", { \"text\": \"Vectors\", \"id\": \"vectors\" }, \"last\", false, false);\n\t\tlet imagesID = tree.jstree('create_node', \"#\", { \"text\": \" Images\", \"id\": \"images\" }, \"last\", false, false);\n\n\t\ttree.jstree(\"check_node\", pcID);\n\t\ttree.jstree(\"check_node\", measurementID);\n\t\ttree.jstree(\"check_node\", annotationsID);\n\t\ttree.jstree(\"check_node\", otherID);\n\t\ttree.jstree(\"check_node\", vectorsID);\n\t\ttree.jstree(\"check_node\", imagesID);\n\n\t\ttree.on('create_node.jstree', (e, data) => {\n\t\t\ttree.jstree(\"open_all\");\n\t\t});\n\n\t\ttree.on(\"select_node.jstree\", (e, data) => {\n\t\t\tlet object = data.node.data;\n\t\t\tpropertiesPanel.set(object);\n\n\t\t\tthis.viewer.inputHandler.deselectAll();\n\n\t\t\tif(object instanceof Volume){\n\t\t\t\tthis.viewer.inputHandler.toggleSelection(object);\n\t\t\t}\n\n\t\t\t$(this.viewer.renderer.domElement).focus();\n\t\t});\n\n\t\ttree.on(\"deselect_node.jstree\", (e, data) => {\n\t\t\tpropertiesPanel.set(null);\n\t\t});\n\n\t\ttree.on(\"delete_node.jstree\", (e, data) => {\n\t\t\tpropertiesPanel.set(null);\n\t\t});\n\n\t\ttree.on('dblclick','.jstree-anchor', (e) => {\n\n\t\t\tlet instance = $.jstree.reference(e.target);\n\t\t\tlet node = instance.get_node(e.target);\n\t\t\tlet object = node.data;\n\n\t\t\t// ignore double click on checkbox\n\t\t\tif(e.target.classList.contains(\"jstree-checkbox\")){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(object instanceof PointCloudTree){\n\t\t\t\tlet box = this.viewer.getBoundingBox([object]);\n\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\tnode.boundingBox = box;\n\t\t\t\tthis.viewer.zoomTo(node, 1, 500);\n\t\t\t}else if(object instanceof Measure){\n\t\t\t\tlet points = object.points.map(p => p.position);\n\t\t\t\tlet box = new THREE.Box3().setFromPoints(points);\n\t\t\t\tif(box.getSize(new THREE.Vector3()).length() > 0){\n\t\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\t\tnode.boundingBox = box;\n\t\t\t\t\tthis.viewer.zoomTo(node, 2, 500);\n\t\t\t\t}\n\t\t\t}else if(object instanceof Profile){\n\t\t\t\tlet points = object.points;\n\t\t\t\tlet box = new THREE.Box3().setFromPoints(points);\n\t\t\t\tif(box.getSize(new THREE.Vector3()).length() > 0){\n\t\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\t\tnode.boundingBox = box;\n\t\t\t\t\tthis.viewer.zoomTo(node, 1, 500);\n\t\t\t\t}\n\t\t\t}else if(object instanceof Volume){\n\t\t\t\t\n\t\t\t\tlet box = object.boundingBox.clone().applyMatrix4(object.matrixWorld);\n\n\t\t\t\tif(box.getSize(new THREE.Vector3()).length() > 0){\n\t\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\t\tnode.boundingBox = box;\n\t\t\t\t\tthis.viewer.zoomTo(node, 1, 500);\n\t\t\t\t}\n\t\t\t}else if(object instanceof Annotation){\n\t\t\t\tobject.moveHere(this.viewer.scene.getActiveCamera());\n\t\t\t}else if(object instanceof PolygonClipVolume){\n\t\t\t\tlet dir = object.camera.getWorldDirection(new THREE.Vector3());\n\t\t\t\tlet target;\n\n\t\t\t\tif(object.camera instanceof THREE.OrthographicCamera){\n\t\t\t\t\tdir.multiplyScalar(object.camera.right)\n\t\t\t\t\ttarget = new THREE.Vector3().addVectors(object.camera.position, dir);\n\t\t\t\t\tthis.viewer.setCameraMode(CameraMode.ORTHOGRAPHIC);\n\t\t\t\t}else if(object.camera instanceof THREE.PerspectiveCamera){\n\t\t\t\t\tdir.multiplyScalar(this.viewer.scene.view.radius);\n\t\t\t\t\ttarget = new THREE.Vector3().addVectors(object.camera.position, dir);\n\t\t\t\t\tthis.viewer.setCameraMode(CameraMode.PERSPECTIVE);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.viewer.scene.view.position.copy(object.camera.position);\n\t\t\t\tthis.viewer.scene.view.lookAt(target);\n\t\t\t}else if(object.type === \"SpotLight\"){\n\t\t\t\tlet distance = (object.distance > 0) ? object.distance / 4 : 5 * 1000;\n\t\t\t\tlet position = object.position;\n\t\t\t\tlet target = new THREE.Vector3().addVectors(\n\t\t\t\t\tposition, \n\t\t\t\t\tobject.getWorldDirection(new THREE.Vector3()).multiplyScalar(distance));\n\n\t\t\t\tthis.viewer.scene.view.position.copy(object.position);\n\t\t\t\tthis.viewer.scene.view.lookAt(target);\n\t\t\t}else if(object instanceof THREE.Object3D){\n\t\t\t\tlet box = new THREE.Box3().setFromObject(object);\n\n\t\t\t\tif(box.getSize(new THREE.Vector3()).length() > 0){\n\t\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\t\tnode.boundingBox = box;\n\t\t\t\t\tthis.viewer.zoomTo(node, 1, 500);\n\t\t\t\t}\n\t\t\t}else if(object instanceof OrientedImage){\n\t\t\t\t// TODO zoom to images\n\n\t\t\t\t// let box = new THREE.Box3().setFromObject(object);\n\n\t\t\t\t// if(box.getSize(new THREE.Vector3()).length() > 0){\n\t\t\t\t// \tlet node = new THREE.Object3D();\n\t\t\t\t// \tnode.boundingBox = box;\n\t\t\t\t// \tthis.viewer.zoomTo(node, 1, 500);\n\t\t\t\t// }\n\t\t\t}else if(object instanceof Images360){\n\t\t\t\t// TODO\n\t\t\t}else if(object instanceof Geopackage){\n\t\t\t\t// TODO\n\t\t\t}\n\t\t});\n\n\t\ttree.on(\"uncheck_node.jstree\", (e, data) => {\n\t\t\tlet object = data.node.data;\n\n\t\t\tif(object){\n\t\t\t\tobject.visible = false;\n\t\t\t}\n\t\t});\n\n\t\ttree.on(\"check_node.jstree\", (e, data) => {\n\t\t\tlet object = data.node.data;\n\n\t\t\tif(object){\n\t\t\t\tobject.visible = true;\n\t\t\t}\n\t\t});\n\n\n\t\tlet onPointCloudAdded = (e) => {\n\t\t\tlet pointcloud = e.pointcloud;\n\t\t\tlet cloudIcon = `${Potree.resourcePath}/icons/cloud.svg`;\n\t\t\tlet node = createNode(pcID, pointcloud.name, cloudIcon, pointcloud);\n\n\t\t\tpointcloud.addEventListener(\"visibility_changed\", () => {\n\t\t\t\tif(pointcloud.visible){\n\t\t\t\t\ttree.jstree('check_node', node);\n\t\t\t\t}else{\n\t\t\t\t\ttree.jstree('uncheck_node', node);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tlet onMeasurementAdded = (e) => {\n\t\t\tlet measurement = e.measurement;\n\t\t\tlet icon = Utils.getMeasurementIcon(measurement);\n\t\t\tcreateNode(measurementID, measurement.name, icon, measurement);\n\t\t};\n\n\t\tlet onVolumeAdded = (e) => {\n\t\t\tlet volume = e.volume;\n\t\t\tlet icon = Utils.getMeasurementIcon(volume);\n\t\t\tlet node = createNode(measurementID, volume.name, icon, volume);\n\n\t\t\tvolume.addEventListener(\"visibility_changed\", () => {\n\t\t\t\tif(volume.visible){\n\t\t\t\t\ttree.jstree('check_node', node);\n\t\t\t\t}else{\n\t\t\t\t\ttree.jstree('uncheck_node', node);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tlet onProfileAdded = (e) => {\n\t\t\tlet profile = e.profile;\n\t\t\tlet icon = Utils.getMeasurementIcon(profile);\n\t\t\tcreateNode(measurementID, profile.name, icon, profile);\n\t\t};\n\n\t\tlet onAnnotationAdded = (e) => {\n\t\t\tlet annotation = e.annotation;\n\n\t\t\tlet annotationIcon = `${Potree.resourcePath}/icons/annotation.svg`;\n\t\t\tlet parentID = this.annotationMapping.get(annotation.parent);\n\t\t\tlet annotationID = createNode(parentID, annotation.title, annotationIcon, annotation);\n\t\t\tthis.annotationMapping.set(annotation, annotationID);\n\n\t\t\tannotation.addEventListener(\"annotation_changed\", (e) => {\n\t\t\t\tlet annotationsRoot = $(\"#jstree_scene\").jstree().get_json(\"annotations\");\n\t\t\t\tlet jsonNode = annotationsRoot.children.find(child => child.data.uuid === annotation.uuid);\n\t\t\t\t\n\t\t\t\t$.jstree.reference(jsonNode.id).rename_node(jsonNode.id, annotation.title);\n\t\t\t});\n\t\t};\n\n\t\tlet onCameraAnimationAdded = (e) => {\n\t\t\tconst animation = e.animation;\n\n\t\t\tconst animationIcon = `${Potree.resourcePath}/icons/camera_animation.svg`;\n\t\t\tcreateNode(otherID, \"animation\", animationIcon, animation);\n\t\t};\n\n\t\tlet onOrientedImagesAdded = (e) => {\n\t\t\tconst images = e.images;\n\n\t\t\tconst imagesIcon = `${Potree.resourcePath}/icons/picture.svg`;\n\t\t\tconst node = createNode(imagesID, \"images\", imagesIcon, images);\n\n\t\t\timages.addEventListener(\"visibility_changed\", () => {\n\t\t\t\tif(images.visible){\n\t\t\t\t\ttree.jstree('check_node', node);\n\t\t\t\t}else{\n\t\t\t\t\ttree.jstree('uncheck_node', node);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tlet onImages360Added = (e) => {\n\t\t\tconst images = e.images;\n\n\t\t\tconst imagesIcon = `${Potree.resourcePath}/icons/picture.svg`;\n\t\t\tconst node = createNode(imagesID, \"360° images\", imagesIcon, images);\n\n\t\t\timages.addEventListener(\"visibility_changed\", () => {\n\t\t\t\tif(images.visible){\n\t\t\t\t\ttree.jstree('check_node', node);\n\t\t\t\t}else{\n\t\t\t\t\ttree.jstree('uncheck_node', node);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst onGeopackageAdded = (e) => {\n\t\t\tconst geopackage = e.geopackage;\n\n\t\t\tconst geopackageIcon = `${Potree.resourcePath}/icons/triangle.svg`;\n\t\t\tconst tree = $(`#jstree_scene`);\n\t\t\tconst parentNode = \"vectors\";\n\n\t\t\tfor(const layer of geopackage.node.children){\n\t\t\t\tconst name = layer.name;\n\n\t\t\t\tlet shpPointsID = tree.jstree('create_node', parentNode, { \n\t\t\t\t\t\t\"text\": name, \n\t\t\t\t\t\t\"icon\": geopackageIcon,\n\t\t\t\t\t\t\"object\": layer,\n\t\t\t\t\t\t\"data\": layer,\n\t\t\t\t\t}, \n\t\t\t\t\t\"last\", false, false);\n\t\t\t\ttree.jstree(layer.visible ? \"check_node\" : \"uncheck_node\", shpPointsID);\n\t\t\t}\n\n\t\t};\n\n\t\tthis.viewer.scene.addEventListener(\"pointcloud_added\", onPointCloudAdded);\n\t\tthis.viewer.scene.addEventListener(\"measurement_added\", onMeasurementAdded);\n\t\tthis.viewer.scene.addEventListener(\"profile_added\", onProfileAdded);\n\t\tthis.viewer.scene.addEventListener(\"volume_added\", onVolumeAdded);\n\t\tthis.viewer.scene.addEventListener(\"camera_animation_added\", onCameraAnimationAdded);\n\t\tthis.viewer.scene.addEventListener(\"oriented_images_added\", onOrientedImagesAdded);\n\t\tthis.viewer.scene.addEventListener(\"360_images_added\", onImages360Added);\n\t\tthis.viewer.scene.addEventListener(\"geopackage_added\", onGeopackageAdded);\n\t\tthis.viewer.scene.addEventListener(\"polygon_clip_volume_added\", onVolumeAdded);\n\t\tthis.viewer.scene.annotations.addEventListener(\"annotation_added\", onAnnotationAdded);\n\n\t\tlet onMeasurementRemoved = (e) => {\n\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.measurement.uuid);\n\t\t\t\n\t\t\ttree.jstree(\"delete_node\", jsonNode.id);\n\t\t};\n\n\t\tlet onVolumeRemoved = (e) => {\n\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.volume.uuid);\n\t\t\t\n\t\t\ttree.jstree(\"delete_node\", jsonNode.id);\n\t\t};\n\n\t\tlet onPolygonClipVolumeRemoved = (e) => {\n\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.volume.uuid);\n\t\t\t\n\t\t\ttree.jstree(\"delete_node\", jsonNode.id);\n\t\t};\n\n\t\tlet onProfileRemoved = (e) => {\n\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === e.profile.uuid);\n\t\t\t\n\t\t\ttree.jstree(\"delete_node\", jsonNode.id);\n\t\t};\n\n\t\tthis.viewer.scene.addEventListener(\"measurement_removed\", onMeasurementRemoved);\n\t\tthis.viewer.scene.addEventListener(\"volume_removed\", onVolumeRemoved);\n\t\tthis.viewer.scene.addEventListener(\"polygon_clip_volume_removed\", onPolygonClipVolumeRemoved);\n\t\tthis.viewer.scene.addEventListener(\"profile_removed\", onProfileRemoved);\n\n\t\t{\n\t\t\tlet annotationIcon = `${Potree.resourcePath}/icons/annotation.svg`;\n\t\t\tthis.annotationMapping = new Map(); \n\t\t\tthis.annotationMapping.set(this.viewer.scene.annotations, annotationsID);\n\t\t\tthis.viewer.scene.annotations.traverseDescendants(annotation => {\n\t\t\t\tlet parentID = this.annotationMapping.get(annotation.parent);\n\t\t\t\tlet annotationID = createNode(parentID, annotation.title, annotationIcon, annotation);\n\t\t\t\tthis.annotationMapping.set(annotation, annotationID);\n\t\t\t});\n\t\t}\n\n\t\tconst scene = this.viewer.scene;\n\t\tfor(let pointcloud of scene.pointclouds){\n\t\t\tonPointCloudAdded({pointcloud: pointcloud});\n\t\t}\n\n\t\tfor(let measurement of scene.measurements){\n\t\t\tonMeasurementAdded({measurement: measurement});\n\t\t}\n\n\t\tfor(let volume of [...scene.volumes, ...scene.polygonClipVolumes]){\n\t\t\tonVolumeAdded({volume: volume});\n\t\t}\n\n\t\tfor(let animation of scene.cameraAnimations){\n\t\t\tonCameraAnimationAdded({animation: animation});\n\t\t}\n\n\t\tfor(let images of scene.orientedImages){\n\t\t\tonOrientedImagesAdded({images: images});\n\t\t}\n\n\t\tfor(let images of scene.images360){\n\t\t\tonImages360Added({images: images});\n\t\t}\n\n\t\tfor(const geopackage of scene.geopackages){\n\t\t\tonGeopackageAdded({geopackage: geopackage});\n\t\t}\n\n\t\tfor(let profile of scene.profiles){\n\t\t\tonProfileAdded({profile: profile});\n\t\t}\n\n\t\t{\n\t\t\tcreateNode(otherID, \"Camera\", null, new THREE.Camera());\n\t\t}\n\n\t\tthis.viewer.addEventListener(\"scene_changed\", (e) => {\n\t\t\tpropertiesPanel.setScene(e.scene);\n\n\t\t\te.oldScene.removeEventListener(\"pointcloud_added\", onPointCloudAdded);\n\t\t\te.oldScene.removeEventListener(\"measurement_added\", onMeasurementAdded);\n\t\t\te.oldScene.removeEventListener(\"profile_added\", onProfileAdded);\n\t\t\te.oldScene.removeEventListener(\"volume_added\", onVolumeAdded);\n\t\t\te.oldScene.removeEventListener(\"polygon_clip_volume_added\", onVolumeAdded);\n\t\t\te.oldScene.removeEventListener(\"measurement_removed\", onMeasurementRemoved);\n\n\t\t\te.scene.addEventListener(\"pointcloud_added\", onPointCloudAdded);\n\t\t\te.scene.addEventListener(\"measurement_added\", onMeasurementAdded);\n\t\t\te.scene.addEventListener(\"profile_added\", onProfileAdded);\n\t\t\te.scene.addEventListener(\"volume_added\", onVolumeAdded);\n\t\t\te.scene.addEventListener(\"polygon_clip_volume_added\", onVolumeAdded);\n\t\t\te.scene.addEventListener(\"measurement_removed\", onMeasurementRemoved);\n\t\t});\n\n\t}\n\n\tinitClippingTool(){\n\n\n\t\tthis.viewer.addEventListener(\"cliptask_changed\", (event) => {\n\t\t\tconsole.log(\"TODO\");\n\t\t});\n\n\t\tthis.viewer.addEventListener(\"clipmethod_changed\", (event) => {\n\t\t\tconsole.log(\"TODO\");\n\t\t});\n\n\t\t{\n\t\t\tlet elClipTask = $(\"#cliptask_options\");\n\t\t\telClipTask.selectgroup({title: \"Clip Task\"});\n\n\t\t\telClipTask.find(\"input\").click( (e) => {\n\t\t\t\tthis.viewer.setClipTask(ClipTask[e.target.value]);\n\t\t\t});\n\n\t\t\tlet currentClipTask = Object.keys(ClipTask)\n\t\t\t\t.filter(key => ClipTask[key] === this.viewer.clipTask);\n\t\t\telClipTask.find(`input[value=${currentClipTask}]`).trigger(\"click\");\n\t\t}\n\n\t\t{\n\t\t\tlet elClipMethod = $(\"#clipmethod_options\");\n\t\t\telClipMethod.selectgroup({title: \"Clip Method\"});\n\n\t\t\telClipMethod.find(\"input\").click( (e) => {\n\t\t\t\tthis.viewer.setClipMethod(ClipMethod[e.target.value]);\n\t\t\t});\n\n\t\t\tlet currentClipMethod = Object.keys(ClipMethod)\n\t\t\t\t.filter(key => ClipMethod[key] === this.viewer.clipMethod);\n\t\t\telClipMethod.find(`input[value=${currentClipMethod}]`).trigger(\"click\");\n\t\t}\n\n\t\tlet clippingToolBar = $(\"#clipping_tools\");\n\n\t\t// CLIP VOLUME\n\t\tclippingToolBar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/clip_volume.svg',\n\t\t\t'[title]tt.clip_volume',\n\t\t\t() => {\n\t\t\t\tlet item = this.volumeTool.startInsertion({clip: true}); \n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t// CLIP POLYGON\n\t\tclippingToolBar.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/clip-polygon.svg\",\n\t\t\t\"[title]tt.clip_polygon\",\n\t\t\t() => {\n\t\t\t\tlet item = this.viewer.clippingTool.startInsertion({type: \"polygon\"});\n\n\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid);\n\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t}\n\t\t));\n\n\t\t{// SCREEN BOX SELECT\n\t\t\tlet boxSelectTool = new ScreenBoxSelectTool(this.viewer);\n\n\t\t\tclippingToolBar.append(this.createToolIcon(\n\t\t\t\tPotree.resourcePath + \"/icons/clip-screen.svg\",\n\t\t\t\t\"[title]tt.screen_clip_box\",\n\t\t\t\t() => {\n\t\t\t\t\tif(!(this.viewer.scene.getActiveCamera() instanceof THREE.OrthographicCamera)){\n\t\t\t\t\t\tthis.viewer.postMessage(`Switch to Orthographic Camera Mode before using the Screen-Box-Select tool.`, \n\t\t\t\t\t\t\t{duration: 2000});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet item = boxSelectTool.startInsertion();\n\n\t\t\t\t\tlet measurementsRoot = $(\"#jstree_scene\").jstree().get_json(\"measurements\");\n\t\t\t\t\tlet jsonNode = measurementsRoot.children.find(child => child.data.uuid === item.uuid);\n\t\t\t\t\t$.jstree.reference(jsonNode.id).deselect_all();\n\t\t\t\t\t$.jstree.reference(jsonNode.id).select_node(jsonNode.id);\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\n\t\t{ // REMOVE CLIPPING TOOLS\n\t\t\tclippingToolBar.append(this.createToolIcon(\n\t\t\t\tPotree.resourcePath + \"/icons/remove.svg\",\n\t\t\t\t\"[title]tt.remove_all_measurement\",\n\t\t\t\t() => {\n\n\t\t\t\t\tthis.viewer.scene.removeAllClipVolumes();\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\n\t}\n\n\tinitFilters(){\n\t\tthis.initClassificationList();\n\t\tthis.initReturnFilters();\n\t\tthis.initGPSTimeFilters();\n\t\tthis.initPointSourceIDFilters();\n\n\t}\n\n\tinitReturnFilters(){\n\t\tlet elReturnFilterPanel = $('#return_filter_panel');\n\n\t\t{ // RETURN NUMBER\n\t\t\tlet sldReturnNumber = elReturnFilterPanel.find('#sldReturnNumber');\n\t\t\tlet lblReturnNumber = elReturnFilterPanel.find('#lblReturnNumber');\n\n\t\t\tsldReturnNumber.slider({\n\t\t\t\trange: true,\n\t\t\t\tmin: 0, max: 7, step: 1,\n\t\t\t\tvalues: [0, 7],\n\t\t\t\tslide: (event, ui) => {\n\t\t\t\t\tthis.viewer.setFilterReturnNumberRange(ui.values[0], ui.values[1])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet onReturnNumberChanged = (event) => {\n\t\t\t\tlet [from, to] = this.viewer.filterReturnNumberRange;\n\n\t\t\t\tlblReturnNumber[0].innerHTML = `${from} to ${to}`;\n\t\t\t\tsldReturnNumber.slider({values: [from, to]});\n\t\t\t};\n\n\t\t\tthis.viewer.addEventListener('filter_return_number_range_changed', onReturnNumberChanged);\n\n\t\t\tonReturnNumberChanged();\n\t\t}\n\n\t\t{ // NUMBER OF RETURNS\n\t\t\tlet sldNumberOfReturns = elReturnFilterPanel.find('#sldNumberOfReturns');\n\t\t\tlet lblNumberOfReturns = elReturnFilterPanel.find('#lblNumberOfReturns');\n\n\t\t\tsldNumberOfReturns.slider({\n\t\t\t\trange: true,\n\t\t\t\tmin: 0, max: 7, step: 1,\n\t\t\t\tvalues: [0, 7],\n\t\t\t\tslide: (event, ui) => {\n\t\t\t\t\tthis.viewer.setFilterNumberOfReturnsRange(ui.values[0], ui.values[1])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet onNumberOfReturnsChanged = (event) => {\n\t\t\t\tlet [from, to] = this.viewer.filterNumberOfReturnsRange;\n\n\t\t\t\tlblNumberOfReturns[0].innerHTML = `${from} to ${to}`;\n\t\t\t\tsldNumberOfReturns.slider({values: [from, to]});\n\t\t\t};\n\n\t\t\tthis.viewer.addEventListener('filter_number_of_returns_range_changed', onNumberOfReturnsChanged);\n\n\t\t\tonNumberOfReturnsChanged();\n\t\t}\n\t}\n\n\tinitGPSTimeFilters(){\n\n\t\tlet elGPSTimeFilterPanel = $('#gpstime_filter_panel');\n\n\t\t{\n\t\t\tlet slider = new HierarchicalSlider({\n\t\t\t\tlevels: 4,\n\t\t\t\tslide: (event) => {\n\t\t\t\t\tthis.viewer.setFilterGPSTimeRange(...event.values);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tlet initialized = false;\n\n\t\t\tlet initialize = () => {\n\t\t\t\t\n\t\t\t\tlet elRangeContainer = $(\"#gpstime_multilevel_range_container\");\n\t\t\t\telRangeContainer[0].prepend(slider.element);\n\n\t\t\t\tlet extent = this.viewer.getGpsTimeExtent();\n\n\t\t\t\tslider.setRange(extent);\n\t\t\t\tslider.setValues(extent);\n\n\n\t\t\t\tinitialized = true;\n\t\t\t};\n\n\t\t\tthis.viewer.addEventListener(\"update\", (e) => {\n\t\t\t\tlet extent = this.viewer.getGpsTimeExtent();\n\t\t\t\tlet gpsTimeAvailable = extent[0] !== Infinity;\n\n\t\t\t\tif(!initialized && gpsTimeAvailable){\n\t\t\t\t\tinitialize();\n\t\t\t\t}\n\n\t\t\t\tslider.setRange(extent);\n\t\t\t});\n\t\t}\n\n\n\t\t{\n\t\t\t\n\t\t\tconst txtGpsTime = elGPSTimeFilterPanel.find(\"#txtGpsTime\");\n\t\t\tconst btnFindGpsTime = elGPSTimeFilterPanel.find(\"#btnFindGpsTime\");\n\n\t\t\tlet targetTime = null;\n\n\t\t\ttxtGpsTime.on(\"input\", (e) => {\n\t\t\t\tconst str = txtGpsTime.val();\n\n\t\t\t\tif(!isNaN(str)){\n\t\t\t\t\tconst value = parseFloat(str);\n\t\t\t\t\ttargetTime = value;\n\n\t\t\t\t\ttxtGpsTime.css(\"background-color\", \"\")\n\t\t\t\t}else{\n\t\t\t\t\ttargetTime = null;\n\n\t\t\t\t\ttxtGpsTime.css(\"background-color\", \"#ff9999\")\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t\tbtnFindGpsTime.click( () => {\n\t\t\t\t\n\t\t\t\tif(targetTime !== null){\n\t\t\t\t\tviewer.moveToGpsTimeVicinity(targetTime);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t}\n\n\tinitPointSourceIDFilters() {\n\t\tlet elPointSourceIDFilterPanel = $('#pointsourceid_filter_panel');\n\n\t\t{\n\t\t\tlet slider = new HierarchicalSlider({\n\t\t\t\tlevels: 4,\n\t\t\t\trange: [0, 65535],\n\t\t\t\tprecision: 1,\n\t\t\t\tslide: (event) => {\n\t\t\t\t\tlet values = event.values;\n\t\t\t\t\tthis.viewer.setFilterPointSourceIDRange(values[0], values[1]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet initialized = false;\n\n\t\t\tlet initialize = () => {\n\t\t\t\telPointSourceIDFilterPanel[0].prepend(slider.element);\n\n\t\t\t\tinitialized = true;\n\t\t\t};\n\n\t\t\tthis.viewer.addEventListener(\"update\", (e) => {\n\t\t\t\tlet extent = this.viewer.filterPointSourceIDRange;\n\n\t\t\t\tif(!initialized){\n\t\t\t\t\tinitialize();\n\n\t\t\t\t\tslider.setValues(extent);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t}\n\n\t\t// let lblPointSourceID = elPointSourceIDFilterPanel.find(\"#lblPointSourceID\");\n\t\t// let elPointSourceID = elPointSourceIDFilterPanel.find(\"#spnPointSourceID\");\n\n\t\t// let slider = new ZoomableSlider();\n\t\t// elPointSourceID[0].appendChild(slider.element);\n\t\t// slider.update();\n\n\t\t// slider.change( () => {\n\t\t// \tlet range = slider.chosenRange;\n\t\t// \tthis.viewer.setFilterPointSourceIDRange(range[0], range[1]);\n\t\t// });\n\n\t\t// let onPointSourceIDExtentChanged = (event) => {\n\t\t// \tlet range = this.viewer.filterPointSourceIDExtent;\n\t\t// \tslider.setVisibleRange(range);\n\t\t// };\n\n\t\t// let onPointSourceIDChanged = (event) => {\n\t\t// \tlet range = this.viewer.filterPointSourceIDRange;\n\n\t\t// \tlet precision = 1;\n\t\t// \tlet from = `${Utils.addCommas(range[0].toFixed(precision))}`;\n\t\t// \tlet to = `${Utils.addCommas(range[1].toFixed(precision))}`;\n\t\t// \tlblPointSourceID[0].innerHTML = `${from} to ${to}`;\n\n\t\t// \tslider.setRange(range);\n\t\t// };\n\n\t\t// this.viewer.addEventListener('filter_point_source_id_range_changed', onPointSourceIDChanged);\n\t\t// this.viewer.addEventListener('filter_point_source_id_extent_changed', onPointSourceIDExtentChanged);\n\n\t}\n\n\tinitClassificationList(){\n\t\tlet elClassificationList = $('#classificationList');\n\n\t\tlet addClassificationItem = (code, name) => {\n\t\t\tconst classification = this.viewer.classifications[code];\n\t\t\tconst inputID = 'chkClassification_' + code;\n\t\t\tconst colorPickerID = 'colorPickerClassification_' + code;\n\n\t\t\tconst checked = classification.visible ? \"checked\" : \"\";\n\n\t\t\tlet element = $(`\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
  • \n\t\t\t`);\n\n\t\t\tconst elInput = element.find('input');\n\t\t\tconst elColorPicker = element.find(`#${colorPickerID}`);\n\n\t\t\telInput.click(event => {\n\t\t\t\tthis.viewer.setClassificationVisibility(code, event.target.checked);\n\t\t\t});\n\n\t\t\tlet defaultColor = classification.color.map(c => c * 255).join(\", \");\n\t\t\tdefaultColor = `rgb(${defaultColor})`;\n\n\n\t\t\telColorPicker.spectrum({\n\t\t\t\t// flat: true,\n\t\t\t\tcolor: defaultColor,\n\t\t\t\tshowInput: true,\n\t\t\t\tpreferredFormat: 'rgb',\n\t\t\t\tcancelText: '',\n\t\t\t\tchooseText: 'Apply',\n\t\t\t\tmove: color => {\n\t\t\t\t\tlet rgb = color.toRgb();\n\t\t\t\t\tconst c = [rgb.r / 255, rgb.g / 255, rgb.b / 255, 1];\n\t\t\t\t\tclassification.color = c;\n\t\t\t\t},\n\t\t\t\tchange: color => {\n\t\t\t\t\tlet rgb = color.toRgb();\n\t\t\t\t\tconst c = [rgb.r / 255, rgb.g / 255, rgb.b / 255, 1];\n\t\t\t\t\tclassification.color = c;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\telClassificationList.append(element);\n\t\t};\n\n\t\tconst addToggleAllButton = () => { // toggle all button\n\t\t\tconst element = $(`\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
  • \n\t\t\t`);\n\n\t\t\tlet elInput = element.find('input');\n\n\t\t\telInput.click(event => {\n\t\t\t\tthis.viewer.toggleAllClassificationsVisibility();\n\t\t\t});\n\n\t\t\telClassificationList.append(element);\n\t\t}\n\n\t\tconst addInvertButton = () => { \n\t\t\tconst element = $(`\n\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
  • \n\t\t\t`);\n\n\t\t\tlet elInput = element.find('input');\n\n\t\t\telInput.click( () => {\n\t\t\t\tconst classifications = this.viewer.classifications;\n\t\n\t\t\t\tfor(let key of Object.keys(classifications)){\n\t\t\t\t\tlet value = classifications[key];\n\t\t\t\t\tthis.viewer.setClassificationVisibility(key, !value.visible);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\telClassificationList.append(element);\n\t\t};\n\n\t\tconst populate = () => {\n\t\t\taddToggleAllButton();\n\t\t\tfor (let classID in this.viewer.classifications) {\n\t\t\t\taddClassificationItem(classID, this.viewer.classifications[classID].name);\n\t\t\t}\n\t\t\taddInvertButton();\n\t\t};\n\n\t\tpopulate();\n\n\t\tthis.viewer.addEventListener(\"classifications_changed\", () => {\n\t\t\telClassificationList.empty();\n\t\t\tpopulate();\n\t\t});\n\n\t\tthis.viewer.addEventListener(\"classification_visibility_changed\", () => {\n\n\t\t\t{ // set checked state of classification buttons\n\t\t\t\tfor(const classID of Object.keys(this.viewer.classifications)){\n\t\t\t\t\tconst classValue = this.viewer.classifications[classID];\n\n\t\t\t\t\tlet elItem = elClassificationList.find(`#chkClassification_${classID}`);\n\t\t\t\t\telItem.prop(\"checked\", classValue.visible);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t{ // set checked state of toggle button based on state of all other buttons\n\t\t\t\tlet numVisible = 0;\n\t\t\t\tlet numItems = 0;\n\t\t\t\tfor(const key of Object.keys(this.viewer.classifications)){\n\t\t\t\t\tif(this.viewer.classifications[key].visible){\n\t\t\t\t\t\tnumVisible++;\n\t\t\t\t\t}\n\t\t\t\t\tnumItems++;\n\t\t\t\t}\n\t\t\t\tconst allVisible = numVisible === numItems;\n\n\t\t\t\tlet elToggle = elClassificationList.find(\"#toggleClassificationFilters\");\n\t\t\t\telToggle.prop(\"checked\", allVisible);\n\t\t\t}\n\t\t});\n\t}\n\n\tinitAccordion(){\n\t\t$('.accordion > h3').each(function(){\n\t\t\tlet header = $(this);\n\t\t\tlet content = $(this).next();\n\n\t\t\t//header.addClass('accordion-header ui-widget');\n\t\t\t//content.addClass('accordion-content ui-widget');\n\n\t\t\tcontent.hide();\n\n\t\t\theader.click(() => {\n\t\t\t\tcontent.slideToggle();\n\t\t\t});\n\t\t});\n\n\t\tlet languages = [\n\t\t\t[\"EN\", \"en\"],\n\t\t\t[\"FR\", \"fr\"],\n\t\t\t[\"DE\", \"de\"],\n\t\t\t[\"JP\", \"jp\"],\n\t\t\t[\"ES\", \"es\"],\n\t\t\t[\"SE\", \"se\"]\n\t\t];\n\n\t\tlet elLanguages = $('#potree_languages');\n\t\tfor(let i = 0; i < languages.length; i++){\n\t\t\tlet [key, value] = languages[i];\n\t\t\tlet element = $(`${key}`);\n\t\t\telement.click(() => this.viewer.setLanguage(value));\n\n\t\t\tif(i === 0){\n\t\t\t\telement.css(\"margin-left\", \"30px\");\n\t\t\t}\n\t\t\t\n\t\t\telLanguages.append(element);\n\n\t\t\tif(i < languages.length - 1){\n\t\t\t\telLanguages.append($(document.createTextNode(' - ')));\t\n\t\t\t}\n\t\t}\n\n\n\t\t// to close all, call\n\t\t// $(\".accordion > div\").hide()\n\n\t\t// to open the, for example, tool menu, call:\n\t\t// $(\"#menu_tools\").next().show()\n\t}\n\n\tinitAppearance(){\n\n\t\tconst sldPointBudget = this.dom.find('#sldPointBudget');\n\n\t\tsldPointBudget.slider({\n\t\t\tvalue: this.viewer.getPointBudget(),\n\t\t\tmin: 100 * 1000,\n\t\t\tmax: 10 * 1000 * 1000,\n\t\t\tstep: 1000,\n\t\t\tslide: (event, ui) => { this.viewer.setPointBudget(ui.value); }\n\t\t});\n\n\t\tthis.dom.find('#sldFOV').slider({\n\t\t\tvalue: this.viewer.getFOV(),\n\t\t\tmin: 20,\n\t\t\tmax: 100,\n\t\t\tstep: 1,\n\t\t\tslide: (event, ui) => { this.viewer.setFOV(ui.value); }\n\t\t});\n\n\t\t$('#sldEDLRadius').slider({\n\t\t\tvalue: this.viewer.getEDLRadius(),\n\t\t\tmin: 1,\n\t\t\tmax: 4,\n\t\t\tstep: 0.01,\n\t\t\tslide: (event, ui) => { this.viewer.setEDLRadius(ui.value); }\n\t\t});\n\n\t\t$('#sldEDLStrength').slider({\n\t\t\tvalue: this.viewer.getEDLStrength(),\n\t\t\tmin: 0,\n\t\t\tmax: 5,\n\t\t\tstep: 0.01,\n\t\t\tslide: (event, ui) => { this.viewer.setEDLStrength(ui.value); }\n\t\t});\n\n\t\t$('#sldEDLOpacity').slider({\n\t\t\tvalue: this.viewer.getEDLOpacity(),\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\tstep: 0.01,\n\t\t\tslide: (event, ui) => { this.viewer.setEDLOpacity(ui.value); }\n\t\t});\n\n\t\tthis.viewer.addEventListener('point_budget_changed', (event) => {\n\t\t\t$('#lblPointBudget')[0].innerHTML = Utils.addCommas(this.viewer.getPointBudget());\n\t\t\tsldPointBudget.slider({value: this.viewer.getPointBudget()});\n\t\t});\n\n\t\tthis.viewer.addEventListener('fov_changed', (event) => {\n\t\t\t$('#lblFOV')[0].innerHTML = parseInt(this.viewer.getFOV());\n\t\t\t$('#sldFOV').slider({value: this.viewer.getFOV()});\n\t\t});\n\n\t\tthis.viewer.addEventListener('use_edl_changed', (event) => {\n\t\t\t$('#chkEDLEnabled')[0].checked = this.viewer.getEDLEnabled();\n\t\t});\n\n\t\tthis.viewer.addEventListener('edl_radius_changed', (event) => {\n\t\t\t$('#lblEDLRadius')[0].innerHTML = this.viewer.getEDLRadius().toFixed(1);\n\t\t\t$('#sldEDLRadius').slider({value: this.viewer.getEDLRadius()});\n\t\t});\n\n\t\tthis.viewer.addEventListener('edl_strength_changed', (event) => {\n\t\t\t$('#lblEDLStrength')[0].innerHTML = this.viewer.getEDLStrength().toFixed(1);\n\t\t\t$('#sldEDLStrength').slider({value: this.viewer.getEDLStrength()});\n\t\t});\n\n\t\tthis.viewer.addEventListener('background_changed', (event) => {\n\t\t\t$(\"input[name=background][value='\" + this.viewer.getBackground() + \"']\").prop('checked', true);\n\t\t});\n\n\t\t$('#lblPointBudget')[0].innerHTML = Utils.addCommas(this.viewer.getPointBudget());\n\t\t$('#lblFOV')[0].innerHTML = parseInt(this.viewer.getFOV());\n\t\t$('#lblEDLRadius')[0].innerHTML = this.viewer.getEDLRadius().toFixed(1);\n\t\t$('#lblEDLStrength')[0].innerHTML = this.viewer.getEDLStrength().toFixed(1);\n\t\t$('#chkEDLEnabled')[0].checked = this.viewer.getEDLEnabled();\n\t\t\n\t\t{\n\t\t\tlet elBackground = $(`#background_options`);\n\t\t\telBackground.selectgroup();\n\n\t\t\telBackground.find(\"input\").click( (e) => {\n\t\t\t\tthis.viewer.setBackground(e.target.value);\n\t\t\t});\n\n\t\t\tlet currentBackground = this.viewer.getBackground();\n\t\t\t$(`input[name=background_options][value=${currentBackground}]`).trigger(\"click\");\n\t\t}\n\n\t\t$('#chkEDLEnabled').click( () => {\n\t\t\tthis.viewer.setEDLEnabled($('#chkEDLEnabled').prop(\"checked\"));\n\t\t});\n\t}\n\n\tinitNavigation(){\n\t\tlet elNavigation = $('#navigation');\n\t\tlet sldMoveSpeed = $('#sldMoveSpeed');\n\t\tlet lblMoveSpeed = $('#lblMoveSpeed');\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/earth_controls_1.png',\n\t\t\t'[title]tt.earth_control',\n\t\t\t() => { this.viewer.setControls(this.viewer.earthControls); }\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/fps_controls.svg',\n\t\t\t'[title]tt.flight_control',\n\t\t\t() => {\n\t\t\t\tthis.viewer.setControls(this.viewer.fpControls);\n\t\t\t\tthis.viewer.fpControls.lockElevation = false;\n\t\t\t}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/helicopter_controls.svg',\n\t\t\t'[title]tt.heli_control',\n\t\t\t() => { \n\t\t\t\tthis.viewer.setControls(this.viewer.fpControls);\n\t\t\t\tthis.viewer.fpControls.lockElevation = true;\n\t\t\t}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/orbit_controls.svg',\n\t\t\t'[title]tt.orbit_control',\n\t\t\t() => { this.viewer.setControls(this.viewer.orbitControls); }\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + '/icons/focus.svg',\n\t\t\t'[title]tt.focus_control',\n\t\t\t() => { this.viewer.fitToScreen(); }\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/navigation_cube.svg\",\n\t\t\t\"[title]tt.navigation_cube_control\",\n\t\t\t() => {this.viewer.toggleNavigationCube()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/images/compas.svg\",\n\t\t\t\"[title]tt.compass\",\n\t\t\t() => {\n\t\t\t\tconst visible = !this.viewer.compass.isVisible();\n\t\t\t\tthis.viewer.compass.setVisible(visible);\n\t\t\t}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/camera_animation.svg\",\n\t\t\t\"[title]tt.camera_animation\",\n\t\t\t() => {\n\t\t\t\tconst animation = CameraAnimation.defaultFromView(this.viewer);\n\n\t\t\t\tviewer.scene.addCameraAnimation(animation);\n\t\t\t}\n\t\t));\n\n\n\t\telNavigation.append(\"
    \");\n\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/left.svg\",\n\t\t\t\"[title]tt.left_view_control\",\n\t\t\t() => {this.viewer.setLeftView()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/right.svg\",\n\t\t\t\"[title]tt.right_view_control\",\n\t\t\t() => {this.viewer.setRightView()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/front.svg\",\n\t\t\t\"[title]tt.front_view_control\",\n\t\t\t() => {this.viewer.setFrontView()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/back.svg\",\n\t\t\t\"[title]tt.back_view_control\",\n\t\t\t() => {this.viewer.setBackView()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/top.svg\",\n\t\t\t\"[title]tt.top_view_control\",\n\t\t\t() => {this.viewer.setTopView()}\n\t\t));\n\n\t\telNavigation.append(this.createToolIcon(\n\t\t\tPotree.resourcePath + \"/icons/bottom.svg\",\n\t\t\t\"[title]tt.bottom_view_control\",\n\t\t\t() => {this.viewer.setBottomView()}\n\t\t));\n\n\n\n\n\n\t\tlet elCameraProjection = $(`\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t`);\n\t\telNavigation.append(elCameraProjection);\n\t\telCameraProjection.selectgroup({title: \"Camera Projection\"});\n\t\telCameraProjection.find(\"input\").click( (e) => {\n\t\t\tthis.viewer.setCameraMode(CameraMode[e.target.value]);\n\t\t});\n\t\tlet cameraMode = Object.keys(CameraMode)\n\t\t\t.filter(key => CameraMode[key] === this.viewer.scene.cameraMode);\n\t\telCameraProjection.find(`input[value=${cameraMode}]`).trigger(\"click\");\n\n\t\tlet speedRange = new THREE.Vector2(1, 10 * 1000);\n\n\t\tlet toLinearSpeed = (value) => {\n\t\t\treturn Math.pow(value, 4) * speedRange.y + speedRange.x;\n\t\t};\n\n\t\tlet toExpSpeed = (value) => {\n\t\t\treturn Math.pow((value - speedRange.x) / speedRange.y, 1 / 4);\n\t\t};\n\n\t\tsldMoveSpeed.slider({\n\t\t\tvalue: toExpSpeed(this.viewer.getMoveSpeed()),\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\tstep: 0.01,\n\t\t\tslide: (event, ui) => { this.viewer.setMoveSpeed(toLinearSpeed(ui.value)); }\n\t\t});\n\n\t\tthis.viewer.addEventListener('move_speed_changed', (event) => {\n\t\t\tlblMoveSpeed.html(this.viewer.getMoveSpeed().toFixed(1));\n\t\t\tsldMoveSpeed.slider({value: toExpSpeed(this.viewer.getMoveSpeed())});\n\t\t});\n\n\t\tlblMoveSpeed.html(this.viewer.getMoveSpeed().toFixed(1));\n\t}\n\n\n\tinitSettings(){\n\n\t\t{\n\t\t\t$('#sldMinNodeSize').slider({\n\t\t\t\tvalue: this.viewer.getMinNodeSize(),\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 1000,\n\t\t\t\tstep: 0.01,\n\t\t\t\tslide: (event, ui) => { this.viewer.setMinNodeSize(ui.value); }\n\t\t\t});\n\n\t\t\tthis.viewer.addEventListener('minnodesize_changed', (event) => {\n\t\t\t\t$('#lblMinNodeSize').html(parseInt(this.viewer.getMinNodeSize()));\n\t\t\t\t$('#sldMinNodeSize').slider({value: this.viewer.getMinNodeSize()});\n\t\t\t});\n\t\t\t$('#lblMinNodeSize').html(parseInt(this.viewer.getMinNodeSize()));\n\t\t}\n\n\t\t{\n\t\t\tlet elSplatQuality = $(\"#splat_quality_options\");\n\t\t\telSplatQuality.selectgroup({title: \"Splat Quality\"});\n\n\t\t\telSplatQuality.find(\"input\").click( (e) => {\n\t\t\t\tif(e.target.value === \"standard\"){\n\t\t\t\t\tthis.viewer.useHQ = false;\n\t\t\t\t}else if(e.target.value === \"hq\"){\n\t\t\t\t\tthis.viewer.useHQ = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet currentQuality = this.viewer.useHQ ? \"hq\" : \"standard\";\n\t\t\telSplatQuality.find(`input[value=${currentQuality}]`).trigger(\"click\");\n\t\t}\n\n\t\t$('#show_bounding_box').click(() => {\n\t\t\tthis.viewer.setShowBoundingBox($('#show_bounding_box').prop(\"checked\"));\n\t\t});\n\n\t\t$('#set_freeze').click(() => {\n\t\t\tthis.viewer.setFreeze($('#set_freeze').prop(\"checked\"));\n\t\t});\n\t}\n\n}\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {Annotation} from \"../Annotation.js\";\nimport {Utils} from \"../utils.js\";\nimport {CameraMode} from \"../defines.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\nexport class AnnotationTool extends EventDispatcher{\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.sg = new THREE.SphereGeometry(0.1);\n\t\tthis.sm = new THREE.MeshNormalMaterial();\n\t\tthis.s = new THREE.Mesh(this.sg, this.sm);\n\t}\n\n\tstartInsertion (args = {}) {\n\t\tlet domElement = this.viewer.renderer.domElement;\n\n\t\tlet annotation = new Annotation({\n\t\t\tposition: [589748.270, 231444.540, 753.675],\n\t\t\ttitle: \"Annotation Title\",\n\t\t\tdescription: `Annotation Description`\n\t\t});\n\t\tthis.dispatchEvent({type: 'start_inserting_annotation', annotation: annotation});\n\n\t\tconst annotations = this.viewer.scene.annotations;\n\t\tannotations.add(annotation);\n\n\t\tlet callbacks = {\n\t\t\tcancel: null,\n\t\t\tfinish: null,\n\t\t};\n\n\t\tlet insertionCallback = (e) => {\n\t\t\tif (e.button === THREE.MOUSE.LEFT) {\n\t\t\t\tcallbacks.finish();\n\t\t\t} else if (e.button === THREE.MOUSE.RIGHT) {\n\t\t\t\tcallbacks.cancel();\n\t\t\t}\n\t\t};\n\n\t\tcallbacks.cancel = e => {\n\t\t\tannotations.remove(annotation);\n\n\t\t\tdomElement.removeEventListener('mouseup', insertionCallback, true);\n\t\t};\n\n\t\tcallbacks.finish = e => {\n\t\t\tdomElement.removeEventListener('mouseup', insertionCallback, true);\n\t\t};\n\n\t\tdomElement.addEventListener('mouseup', insertionCallback, true);\n\n\t\tlet drag = (e) => {\n\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\te.drag.end, \n\t\t\t\te.viewer.scene.getActiveCamera(), \n\t\t\t\te.viewer, \n\t\t\t\te.viewer.scene.pointclouds,\n\t\t\t\t{pickClipped: true});\n\n\t\t\tif (I) {\n\t\t\t\tthis.s.position.copy(I.location);\n\n\t\t\t\tannotation.position.copy(I.location);\n\t\t\t}\n\t\t};\n\n\t\tlet drop = (e) => {\n\t\t\tviewer.scene.scene.remove(this.s);\n\t\t\tthis.s.removeEventListener(\"drag\", drag);\n\t\t\tthis.s.removeEventListener(\"drop\", drop);\n\t\t};\n\n\t\tthis.s.addEventListener('drag', drag);\n\t\tthis.s.addEventListener('drop', drop);\n\n\t\tthis.viewer.scene.scene.add(this.s);\n\t\tthis.viewer.inputHandler.startDragging(this.s);\n\n\t\treturn annotation;\n\t}\n\t\n\tupdate(){\n\t\t// let camera = this.viewer.scene.getActiveCamera();\n\t\t// let domElement = this.renderer.domElement;\n\t\t// let measurements = this.viewer.scene.measurements;\n\n\t\t// const renderAreaSize = this.renderer.getSize(new THREE.Vector2());\n\t\t// let clientWidth = renderAreaSize.width;\n\t\t// let clientHeight = renderAreaSize.height;\n\n\t}\n\n\trender(){\n\t\t//this.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera());\n\t}\n};\n","/**\n * @author mschuetz / http://mschuetz.at\n *\n *\n */\n\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {KeyCodes} from \"../KeyCodes.js\";\nimport {Utils} from \"../utils.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\nexport class InputHandler extends EventDispatcher {\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\t\tthis.domElement = this.renderer.domElement;\n\t\tthis.enabled = true;\n\t\t\n\t\tthis.scene = null;\n\t\tthis.interactiveScenes = [];\n\t\tthis.interactiveObjects = new Set();\n\t\tthis.inputListeners = [];\n\t\tthis.blacklist = new Set();\n\n\t\tthis.drag = null;\n\t\tthis.mouse = new THREE.Vector2(0, 0);\n\n\t\tthis.selection = [];\n\n\t\tthis.hoveredElements = [];\n\t\tthis.pressedKeys = {};\n\n\t\tthis.wheelDelta = 0;\n\n\t\tthis.speed = 1;\n\n\t\tthis.logMessages = false;\n\n\t\tif (this.domElement.tabIndex === -1) {\n\t\t\tthis.domElement.tabIndex = 2222;\n\t\t}\n\n\t\tthis.domElement.addEventListener('contextmenu', (event) => { event.preventDefault(); }, false);\n\t\tthis.domElement.addEventListener('click', this.onMouseClick.bind(this), false);\n\t\tthis.domElement.addEventListener('mousedown', this.onMouseDown.bind(this), false);\n\t\tthis.domElement.addEventListener('mouseup', this.onMouseUp.bind(this), false);\n\t\tthis.domElement.addEventListener('mousemove', this.onMouseMove.bind(this), false);\n\t\tthis.domElement.addEventListener('mousewheel', this.onMouseWheel.bind(this), false);\n\t\tthis.domElement.addEventListener('DOMMouseScroll', this.onMouseWheel.bind(this), false); // Firefox\n\t\tthis.domElement.addEventListener('dblclick', this.onDoubleClick.bind(this));\n\t\tthis.domElement.addEventListener('keydown', this.onKeyDown.bind(this));\n\t\tthis.domElement.addEventListener('keyup', this.onKeyUp.bind(this));\n\t\tthis.domElement.addEventListener('touchstart', this.onTouchStart.bind(this));\n\t\tthis.domElement.addEventListener('touchend', this.onTouchEnd.bind(this));\n\t\tthis.domElement.addEventListener('touchmove', this.onTouchMove.bind(this));\n\t}\n\n\taddInputListener (listener) {\n\t\tthis.inputListeners.push(listener);\n\t}\n\n\tremoveInputListener (listener) {\n\t\tthis.inputListeners = this.inputListeners.filter(e => e !== listener);\n\t}\n\n\tgetSortedListeners(){\n\t\treturn this.inputListeners.sort( (a, b) => {\n\t\t\tlet ia = (a.importance !== undefined) ? a.importance : 0;\n\t\t\tlet ib = (b.importance !== undefined) ? b.importance : 0;\n\n\t\t\treturn ib - ia;\n\t\t});\n\t}\n\n\tonTouchStart (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onTouchStart');\n\n\t\te.preventDefault();\n\n\t\tif (e.touches.length === 1) {\n\t\t\tlet rect = this.domElement.getBoundingClientRect();\n\t\t\tlet x = e.touches[0].pageX - rect.left;\n\t\t\tlet y = e.touches[0].pageY - rect.top;\n\t\t\tthis.mouse.set(x, y);\n\n\t\t\tthis.startDragging(null);\n\t\t}\n\n\t\t\n\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\tinputListener.dispatchEvent({\n\t\t\t\ttype: e.type,\n\t\t\t\ttouches: e.touches,\n\t\t\t\tchangedTouches: e.changedTouches\n\t\t\t});\n\t\t}\n\t}\n\n\tonTouchEnd (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onTouchEnd');\n\n\t\te.preventDefault();\n\n\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\tinputListener.dispatchEvent({\n\t\t\t\ttype: 'drop',\n\t\t\t\tdrag: this.drag,\n\t\t\t\tviewer: this.viewer\n\t\t\t});\n\t\t}\n\n\t\tthis.drag = null;\n\n\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\tinputListener.dispatchEvent({\n\t\t\t\ttype: e.type,\n\t\t\t\ttouches: e.touches,\n\t\t\t\tchangedTouches: e.changedTouches\n\t\t\t});\n\t\t}\n\t}\n\n\tonTouchMove (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onTouchMove');\n\n\t\te.preventDefault();\n\n\t\tif (e.touches.length === 1) {\n\t\t\tlet rect = this.domElement.getBoundingClientRect();\n\t\t\tlet x = e.touches[0].pageX - rect.left;\n\t\t\tlet y = e.touches[0].pageY - rect.top;\n\t\t\tthis.mouse.set(x, y);\n\n\t\t\tif (this.drag) {\n\t\t\t\tthis.drag.mouse = 1;\n\n\t\t\t\tthis.drag.lastDrag.x = x - this.drag.end.x;\n\t\t\t\tthis.drag.lastDrag.y = y - this.drag.end.y;\n\n\t\t\t\tthis.drag.end.set(x, y);\n\n\t\t\t\tif (this.logMessages) console.log(this.constructor.name + ': drag: ');\n\t\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\t\ttype: 'drag',\n\t\t\t\t\t\tdrag: this.drag,\n\t\t\t\t\t\tviewer: this.viewer\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\tinputListener.dispatchEvent({\n\t\t\t\ttype: e.type,\n\t\t\t\ttouches: e.touches,\n\t\t\t\tchangedTouches: e.changedTouches\n\t\t\t});\n\t\t}\n\n\t\t// DEBUG CODE\n\t\t// let debugTouches = [...e.touches, {\n\t\t//\tpageX: this.domElement.clientWidth / 2,\n\t\t//\tpageY: this.domElement.clientHeight / 2}];\n\t\t// for(let inputListener of this.getSortedListeners()){\n\t\t//\tinputListener.dispatchEvent({\n\t\t//\t\ttype: e.type,\n\t\t//\t\ttouches: debugTouches,\n\t\t//\t\tchangedTouches: e.changedTouches\n\t\t//\t});\n\t\t// }\n\t}\n\n\tonKeyDown (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onKeyDown');\n\n\t\t// DELETE\n\t\tif (e.keyCode === KeyCodes.DELETE && this.selection.length > 0) {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'delete',\n\t\t\t\tselection: this.selection\n\t\t\t});\n\n\t\t\tthis.deselectAll();\n\t\t}\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'keydown',\n\t\t\tkeyCode: e.keyCode,\n\t\t\tevent: e\n\t\t});\n\n\t\t// for(let l of this.getSortedListeners()){\n\t\t//\tl.dispatchEvent({\n\t\t//\t\ttype: \"keydown\",\n\t\t//\t\tkeyCode: e.keyCode,\n\t\t//\t\tevent: e\n\t\t//\t});\n\t\t// }\n\n\t\tthis.pressedKeys[e.keyCode] = true;\n\n\t\t// e.preventDefault();\n\t}\n\n\tonKeyUp (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onKeyUp');\n\n\t\tdelete this.pressedKeys[e.keyCode];\n\n\t\te.preventDefault();\n\t}\n\n\tonDoubleClick (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onDoubleClick');\n\n\t\tlet consumed = false;\n\t\tfor (let hovered of this.hoveredElements) {\n\t\t\tif (hovered._listeners && hovered._listeners['dblclick']) {\n\t\t\t\thovered.object.dispatchEvent({\n\t\t\t\t\ttype: 'dblclick',\n\t\t\t\t\tmouse: this.mouse,\n\t\t\t\t\tobject: hovered.object\n\t\t\t\t});\n\t\t\t\tconsumed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!consumed) {\n\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\ttype: 'dblclick',\n\t\t\t\t\tmouse: this.mouse,\n\t\t\t\t\tobject: null\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\te.preventDefault();\n\t}\n\n\tonMouseClick (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onMouseClick');\n\n\t\te.preventDefault();\n\t}\n\n\tonMouseDown (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onMouseDown');\n\n\t\te.preventDefault();\n\n\t\tlet consumed = false;\n\t\tlet consume = () => { return consumed = true; };\n\t\tif (this.hoveredElements.length === 0) {\n\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\ttype: 'mousedown',\n\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\tmouse: this.mouse\n\t\t\t\t});\n\t\t\t}\n\t\t}else{\n\t\t\tfor(let hovered of this.hoveredElements){\n\t\t\t\tlet object = hovered.object;\n\t\t\t\tobject.dispatchEvent({\n\t\t\t\t\ttype: 'mousedown',\n\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\tconsume: consume\n\t\t\t\t});\n\n\t\t\t\tif(consumed){\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!this.drag) {\n\t\t\tlet target = this.hoveredElements\n\t\t\t\t.find(el => (\n\t\t\t\t\tel.object._listeners &&\n\t\t\t\t\tel.object._listeners['drag'] &&\n\t\t\t\t\tel.object._listeners['drag'].length > 0));\n\n\t\t\tif (target) {\n\t\t\t\tthis.startDragging(target.object, {location: target.point});\n\t\t\t} else {\n\t\t\t\tthis.startDragging(null);\n\t\t\t}\n\t\t}\n\n\t\tif (this.scene) {\n\t\t\tthis.viewStart = this.scene.view.clone();\n\t\t}\n\t}\n\n\tonMouseUp (e) {\n\t\tif (this.logMessages) console.log(this.constructor.name + ': onMouseUp');\n\n\t\te.preventDefault();\n\n\t\tlet noMovement = this.getNormalizedDrag().length() === 0;\n\n\t\t\n\t\tlet consumed = false;\n\t\tlet consume = () => { return consumed = true; };\n\t\tif (this.hoveredElements.length === 0) {\n\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\ttype: 'mouseup',\n\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\tmouse: this.mouse,\n\t\t\t\t\tconsume: consume\n\t\t\t\t});\n\n\t\t\t\tif(consumed){\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}else{\n\t\t\tlet hovered = this.hoveredElements\n\t\t\t\t.map(e => e.object)\n\t\t\t\t.find(e => (e._listeners && e._listeners['mouseup']));\n\t\t\tif(hovered){\n\t\t\t\thovered.dispatchEvent({\n\t\t\t\t\ttype: 'mouseup',\n\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\tconsume: consume\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (this.drag) {\n\t\t\tif (this.drag.object) {\n\t\t\t\tif (this.logMessages) console.log(`${this.constructor.name}: drop ${this.drag.object.name}`);\n\t\t\t\tthis.drag.object.dispatchEvent({\n\t\t\t\t\ttype: 'drop',\n\t\t\t\t\tdrag: this.drag,\n\t\t\t\t\tviewer: this.viewer\n\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\t\ttype: 'drop',\n\t\t\t\t\t\tdrag: this.drag,\n\t\t\t\t\t\tviewer: this.viewer\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// check for a click\n\t\t\tlet clicked = this.hoveredElements.map(h => h.object).find(v => v === this.drag.object) !== undefined;\n\t\t\tif(clicked){\n\t\t\t\tif (this.logMessages) console.log(`${this.constructor.name}: click ${this.drag.object.name}`);\n\t\t\t\tthis.drag.object.dispatchEvent({\n\t\t\t\t\ttype: 'click',\n\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\tconsume: consume,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.drag = null;\n\t\t}\n\n\t\tif(!consumed){\n\t\t\tif (e.button === THREE.MOUSE.LEFT) {\n\t\t\t\tif (noMovement) {\n\t\t\t\t\tlet selectable = this.hoveredElements\n\t\t\t\t\t\t.find(el => el.object._listeners && el.object._listeners['select']);\n\n\t\t\t\t\tif (selectable) {\n\t\t\t\t\t\tselectable = selectable.object;\n\n\t\t\t\t\t\tif (this.isSelected(selectable)) {\n\t\t\t\t\t\t\tthis.selection\n\t\t\t\t\t\t\t\t.filter(e => e !== selectable)\n\t\t\t\t\t\t\t\t.forEach(e => this.toggleSelection(e));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.deselectAll();\n\t\t\t\t\t\t\tthis.toggleSelection(selectable);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.deselectAll();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if ((e.button === THREE.MOUSE.RIGHT) && noMovement) {\n\t\t\t\tthis.deselectAll();\n\t\t\t}\n\t\t}\n\t}\n\n\tonMouseMove (e) {\n\t\te.preventDefault();\n\n\t\tlet rect = this.domElement.getBoundingClientRect();\n\t\tlet x = e.clientX - rect.left;\n\t\tlet y = e.clientY - rect.top;\n\t\tthis.mouse.set(x, y);\n\n\t\tlet hoveredElements = this.getHoveredElements();\n\t\tif(hoveredElements.length > 0){\n\t\t\tlet names = hoveredElements.map(h => h.object.name).join(\", \");\n\t\t\tif (this.logMessages) console.log(`${this.constructor.name}: onMouseMove; hovered: '${names}'`);\n\t\t}\n\n\t\tif (this.drag) {\n\t\t\tthis.drag.mouse = e.buttons;\n\n\t\t\tthis.drag.lastDrag.x = x - this.drag.end.x;\n\t\t\tthis.drag.lastDrag.y = y - this.drag.end.y;\n\n\t\t\tthis.drag.end.set(x, y);\n\n\t\t\tif (this.drag.object) {\n\t\t\t\tif (this.logMessages) console.log(this.constructor.name + ': drag: ' + this.drag.object.name);\n\t\t\t\tthis.drag.object.dispatchEvent({\n\t\t\t\t\ttype: 'drag',\n\t\t\t\t\tdrag: this.drag,\n\t\t\t\t\tviewer: this.viewer\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (this.logMessages) console.log(this.constructor.name + ': drag: ');\n\n\t\t\t\tlet dragConsumed = false;\n\t\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\t\ttype: 'drag',\n\t\t\t\t\t\tdrag: this.drag,\n\t\t\t\t\t\tviewer: this.viewer,\n\t\t\t\t\t\tconsume: () => {dragConsumed = true;}\n\t\t\t\t\t});\n\n\t\t\t\t\tif(dragConsumed){\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}else{\n\t\t\tlet curr = hoveredElements.map(a => a.object).find(a => true);\n\t\t\tlet prev = this.hoveredElements.map(a => a.object).find(a => true);\n\n\t\t\tif(curr !== prev){\n\t\t\t\tif(curr){\n\t\t\t\t\tif (this.logMessages) console.log(`${this.constructor.name}: mouseover: ${curr.name}`);\n\t\t\t\t\tcurr.dispatchEvent({\n\t\t\t\t\t\ttype: 'mouseover',\n\t\t\t\t\t\tobject: curr,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(prev){\n\t\t\t\t\tif (this.logMessages) console.log(`${this.constructor.name}: mouseleave: ${prev.name}`);\n\t\t\t\t\tprev.dispatchEvent({\n\t\t\t\t\t\ttype: 'mouseleave',\n\t\t\t\t\t\tobject: prev,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(hoveredElements.length > 0){\n\t\t\t\tlet object = hoveredElements\n\t\t\t\t\t.map(e => e.object)\n\t\t\t\t\t.find(e => (e._listeners && e._listeners['mousemove']));\n\t\t\t\t\n\t\t\t\tif(object){\n\t\t\t\t\tobject.dispatchEvent({\n\t\t\t\t\t\ttype: 'mousemove',\n\t\t\t\t\t\tobject: object\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\t\n\t\t// for (let inputListener of this.getSortedListeners()) {\n\t\t// \tinputListener.dispatchEvent({\n\t\t// \t\ttype: 'mousemove',\n\t\t// \t\tobject: null\n\t\t// \t});\n\t\t// }\n\t\t\n\n\t\tthis.hoveredElements = hoveredElements;\n\t}\n\t\n\tonMouseWheel(e){\n\t\tif(!this.enabled) return;\n\n\t\tif(this.logMessages) console.log(this.constructor.name + \": onMouseWheel\");\n\t\t\n\t\te.preventDefault();\n\n\t\tlet delta = 0;\n\t\tif (e.wheelDelta !== undefined) { // WebKit / Opera / Explorer 9\n\t\t\tdelta = e.wheelDelta;\n\t\t} else if (e.detail !== undefined) { // Firefox\n\t\t\tdelta = -e.detail;\n\t\t}\n\n\t\tlet ndelta = Math.sign(delta);\n\n\t\t// this.wheelDelta += Math.sign(delta);\n\n\t\tif (this.hoveredElement) {\n\t\t\tthis.hoveredElement.object.dispatchEvent({\n\t\t\t\ttype: 'mousewheel',\n\t\t\t\tdelta: ndelta,\n\t\t\t\tobject: this.hoveredElement.object\n\t\t\t});\n\t\t} else {\n\t\t\tfor (let inputListener of this.getSortedListeners()) {\n\t\t\t\tinputListener.dispatchEvent({\n\t\t\t\t\ttype: 'mousewheel',\n\t\t\t\t\tdelta: ndelta,\n\t\t\t\t\tobject: null\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tstartDragging (object, args = null) {\n\n\t\tlet name = object ? object.name : \"no name\";\n\t\tif (this.logMessages) console.log(`${this.constructor.name}: startDragging: '${name}'`);\n\n\t\tthis.drag = {\n\t\t\tstart: this.mouse.clone(),\n\t\t\tend: this.mouse.clone(),\n\t\t\tlastDrag: new THREE.Vector2(0, 0),\n\t\t\tstartView: this.scene.view.clone(),\n\t\t\tobject: object\n\t\t};\n\n\t\tif (args) {\n\t\t\tfor (let key of Object.keys(args)) {\n\t\t\t\tthis.drag[key] = args[key];\n\t\t\t}\n\t\t}\n\t}\n\n\tgetMousePointCloudIntersection (mouse) {\n\t\treturn Utils.getMousePointCloudIntersection(\n\t\t\tthis.mouse, \n\t\t\tthis.scene.getActiveCamera(), \n\t\t\tthis.viewer, \n\t\t\tthis.scene.pointclouds);\n\t}\n\n\ttoggleSelection (object) {\n\t\tlet oldSelection = this.selection;\n\n\t\tlet index = this.selection.indexOf(object);\n\n\t\tif (index === -1) {\n\t\t\tthis.selection.push(object);\n\t\t\tobject.dispatchEvent({\n\t\t\t\ttype: 'select'\n\t\t\t});\n\t\t} else {\n\t\t\tthis.selection.splice(index, 1);\n\t\t\tobject.dispatchEvent({\n\t\t\t\ttype: 'deselect'\n\t\t\t});\n\t\t}\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'selection_changed',\n\t\t\toldSelection: oldSelection,\n\t\t\tselection: this.selection\n\t\t});\n\t}\n\n\tdeselect(object){\n\n\t\tlet oldSelection = this.selection;\n\n\t\tlet index = this.selection.indexOf(object);\n\n\t\tif(index >= 0){\n\t\t\tthis.selection.splice(index, 1);\n\t\t\tobject.dispatchEvent({\n\t\t\t\ttype: 'deselect'\n\t\t\t});\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'selection_changed',\n\t\t\t\toldSelection: oldSelection,\n\t\t\t\tselection: this.selection\n\t\t\t});\n\t\t}\n\t}\n\n\tdeselectAll () {\n\t\tfor (let object of this.selection) {\n\t\t\tobject.dispatchEvent({\n\t\t\t\ttype: 'deselect'\n\t\t\t});\n\t\t}\n\n\t\tlet oldSelection = this.selection;\n\n\t\tif (this.selection.length > 0) {\n\t\t\tthis.selection = [];\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'selection_changed',\n\t\t\t\toldSelection: oldSelection,\n\t\t\t\tselection: this.selection\n\t\t\t});\n\t\t}\n\t}\n\n\tisSelected (object) {\n\t\tlet index = this.selection.indexOf(object);\n\n\t\treturn index !== -1;\n\t}\n\n\tregisterInteractiveObject(object){\n\t\tthis.interactiveObjects.add(object);\n\t}\n\n\tremoveInteractiveObject(object){\n\t\tthis.interactiveObjects.delete(object);\n\t}\n\n\tregisterInteractiveScene (scene) {\n\t\tlet index = this.interactiveScenes.indexOf(scene);\n\t\tif (index === -1) {\n\t\t\tthis.interactiveScenes.push(scene);\n\t\t}\n\t}\n\n\tunregisterInteractiveScene (scene) {\n\t\tlet index = this.interactiveScenes.indexOf(scene);\n\t\tif (index > -1) {\n\t\t\tthis.interactiveScenes.splice(index, 1);\n\t\t}\n\t}\n\n\tgetHoveredElement () {\n\t\tlet hoveredElements = this.getHoveredElements();\n\t\tif (hoveredElements.length > 0) {\n\t\t\treturn hoveredElements[0];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tgetHoveredElements () {\n\t\tlet scenes = this.interactiveScenes.concat(this.scene.scene);\n\n\t\tlet interactableListeners = ['mouseup', 'mousemove', 'mouseover', 'mouseleave', 'drag', 'drop', 'click', 'select', 'deselect'];\n\t\tlet interactables = [];\n\t\tfor (let scene of scenes) {\n\t\t\tscene.traverseVisible(node => {\n\t\t\t\tif (node._listeners && node.visible && !this.blacklist.has(node)) {\n\t\t\t\t\tlet hasInteractableListener = interactableListeners.filter((e) => {\n\t\t\t\t\t\treturn node._listeners[e] !== undefined;\n\t\t\t\t\t}).length > 0;\n\n\t\t\t\t\tif (hasInteractableListener) {\n\t\t\t\t\t\tinteractables.push(node);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tlet camera = this.scene.getActiveCamera();\n\t\tlet ray = Utils.mouseToRay(this.mouse, camera, this.domElement.clientWidth, this.domElement.clientHeight);\n\t\t\n\t\tlet raycaster = new THREE.Raycaster();\n\t\traycaster.ray.set(ray.origin, ray.direction);\n\t\traycaster.params.Line.threshold = 0.2;\n\n\t\tlet intersections = raycaster.intersectObjects(interactables.filter(o => o.visible), false);\n\n\t\treturn intersections;\n\t}\n\n\tsetScene (scene) {\n\t\tthis.deselectAll();\n\n\t\tthis.scene = scene;\n\t}\n\n\tupdate (delta) {\n\n\t}\n\n\tgetNormalizedDrag () {\n\t\tif (!this.drag) {\n\t\t\treturn new THREE.Vector2(0, 0);\n\t\t}\n\n\t\tlet diff = new THREE.Vector2().subVectors(this.drag.end, this.drag.start);\n\n\t\tdiff.x = diff.x / this.domElement.clientWidth;\n\t\tdiff.y = diff.y / this.domElement.clientHeight;\n\n\t\treturn diff;\n\t}\n\n\tgetNormalizedLastDrag () {\n\t\tif (!this.drag) {\n\t\t\treturn new THREE.Vector2(0, 0);\n\t\t}\n\n\t\tlet lastDrag = this.drag.lastDrag.clone();\n\n\t\tlastDrag.x = lastDrag.x / this.domElement.clientWidth;\n\t\tlastDrag.y = lastDrag.y / this.domElement.clientHeight;\n\n\t\treturn lastDrag;\n\t}\n}\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nexport class NavigationCube extends THREE.Object3D {\n\n\tconstructor(viewer){\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\n\t\tlet createPlaneMaterial = (img) => {\n\t\t\tlet material = new THREE.MeshBasicMaterial( {\n\t\t\t\tdepthTest: true, \n\t\t\t\tdepthWrite: true,\n\t\t\t\tside: THREE.DoubleSide\n\t\t\t});\n\t\t\tnew THREE.TextureLoader().load(\n\t\t\t\texports.resourcePath + '/textures/navigation/' + img,\n\t\t\t\tfunction(texture) {\n\t\t\t\t\ttexture.anisotropy = viewer.renderer.capabilities.getMaxAnisotropy();\n\t\t\t\t\tmaterial.map = texture;\n\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t});\n\t\t\treturn material;\n\t\t};\n\n\t\tlet planeGeometry = new THREE.PlaneGeometry(1, 1);\n\n\t\tthis.front = new THREE.Mesh(planeGeometry, createPlaneMaterial('F.png'));\n\t\tthis.front.position.y = -0.5;\n\t\tthis.front.rotation.x = Math.PI / 2.0;\n\t\tthis.front.updateMatrixWorld();\n\t\tthis.front.name = \"F\";\n\t\tthis.add(this.front);\n\n\t\tthis.back = new THREE.Mesh(planeGeometry, createPlaneMaterial('B.png'));\n\t\tthis.back.position.y = 0.5;\n\t\tthis.back.rotation.x = Math.PI / 2.0;\n\t\tthis.back.updateMatrixWorld();\n\t\tthis.back.name = \"B\";\n\t\tthis.add(this.back);\n\n\t\tthis.left = new THREE.Mesh(planeGeometry, createPlaneMaterial('L.png'));\n\t\tthis.left.position.x = -0.5;\n\t\tthis.left.rotation.y = Math.PI / 2.0;\n\t\tthis.left.updateMatrixWorld();\n\t\tthis.left.name = \"L\";\n\t\tthis.add(this.left);\n\n\t\tthis.right = new THREE.Mesh(planeGeometry, createPlaneMaterial('R.png'));\n\t\tthis.right.position.x = 0.5;\n\t\tthis.right.rotation.y = Math.PI / 2.0;\n\t\tthis.right.updateMatrixWorld();\n\t\tthis.right.name = \"R\";\n\t\tthis.add(this.right);\n\n\t\tthis.bottom = new THREE.Mesh(planeGeometry, createPlaneMaterial('D.png'));\n\t\tthis.bottom.position.z = -0.5;\n\t\tthis.bottom.updateMatrixWorld();\n\t\tthis.bottom.name = \"D\";\n\t\tthis.add(this.bottom);\n\n\t\tthis.top = new THREE.Mesh(planeGeometry, createPlaneMaterial('U.png'));\n\t\tthis.top.position.z = 0.5;\n\t\tthis.top.updateMatrixWorld();\n\t\tthis.top.name = \"U\";\n\t\tthis.add(this.top);\n\n\t\tthis.width = 150; // in px\n\n\t\tthis.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, -1, 1);\n\t\tthis.camera.position.copy(new THREE.Vector3(0, 0, 0));\n\t\tthis.camera.lookAt(new THREE.Vector3(0, 1, 0));\n\t\tthis.camera.updateMatrixWorld();\n\t\tthis.camera.rotation.order = \"ZXY\";\n\n\t\tlet onMouseDown = (event) => {\n\t\t\tif (!this.visible) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tthis.pickedFace = null;\n\t\t\tlet mouse = new THREE.Vector2();\n\t\t\tmouse.x = event.clientX - (window.innerWidth - this.width);\n\t\t\tmouse.y = event.clientY;\n\n\t\t\tif(mouse.x < 0 || mouse.y > this.width) return;\n\n\t\t\tmouse.x = (mouse.x / this.width) * 2 - 1;\n\t\t\tmouse.y = -(mouse.y / this.width) * 2 + 1;\n\n\t\t\tlet raycaster = new THREE.Raycaster();\n\t\t\traycaster.setFromCamera(mouse, this.camera);\n\t\t\traycaster.ray.origin.sub(this.camera.getWorldDirection(new THREE.Vector3()));\n\n\t\t\tlet intersects = raycaster.intersectObjects(this.children);\n\n\t\t\tlet minDistance = 1000;\n\t\t\tfor (let i = 0; i < intersects.length; i++) {\n\t\t\t\tif(intersects[i].distance < minDistance) {\n\t\t\t\t\tthis.pickedFace = intersects[i].object.name;\n\t\t\t\t\tminDistance = intersects[i].distance;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(this.pickedFace) {\n\t\t\t\tthis.viewer.setView(this.pickedFace);\n\t\t\t}\n\t\t};\n\n\t\tthis.viewer.renderer.domElement.addEventListener('mousedown', onMouseDown, false);\n\t}\n\n\tupdate(rotation) {\n\t\tthis.camera.rotation.copy(rotation);\n\t\tthis.camera.updateMatrixWorld();\n\t}\n\n}\n","/**\n * @author mschuetz / http://mschuetz.at\n *\n * adapted from THREE.OrbitControls by\n *\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n *\n *\n *\n */\n\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {MOUSE} from \"../defines.js\";\nimport {Utils} from \"../utils.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\n \nexport class OrbitControls extends EventDispatcher{\n\t\n\tconstructor(viewer){\n\t\tsuper();\n\t\t\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.scene = null;\n\t\tthis.sceneControls = new THREE.Scene();\n\n\t\tthis.rotationSpeed = 5;\n\n\t\tthis.fadeFactor = 20;\n\t\tthis.yawDelta = 0;\n\t\tthis.pitchDelta = 0;\n\t\tthis.panDelta = new THREE.Vector2(0, 0);\n\t\tthis.radiusDelta = 0;\n\n\t\tthis.doubleClockZoomEnabled = true;\n\n\t\tthis.tweens = [];\n\n\t\tlet drag = (e) => {\n\t\t\tif (e.drag.object !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.drag.startHandled === undefined) {\n\t\t\t\te.drag.startHandled = true;\n\n\t\t\t\tthis.dispatchEvent({type: 'start'});\n\t\t\t}\n\n\t\t\tlet ndrag = {\n\t\t\t\tx: e.drag.lastDrag.x / this.renderer.domElement.clientWidth,\n\t\t\t\ty: e.drag.lastDrag.y / this.renderer.domElement.clientHeight\n\t\t\t};\n\n\t\t\tif (e.drag.mouse === MOUSE.LEFT) {\n\t\t\t\tthis.yawDelta += ndrag.x * this.rotationSpeed;\n\t\t\t\tthis.pitchDelta += ndrag.y * this.rotationSpeed;\n\n\t\t\t\tthis.stopTweens();\n\t\t\t} else if (e.drag.mouse === MOUSE.RIGHT) {\n\t\t\t\tthis.panDelta.x += ndrag.x;\n\t\t\t\tthis.panDelta.y += ndrag.y;\n\n\t\t\t\tthis.stopTweens();\n\t\t\t}\n\t\t};\n\n\t\tlet drop = e => {\n\t\t\tthis.dispatchEvent({type: 'end'});\n\t\t};\n\n\t\tlet scroll = (e) => {\n\t\t\tlet resolvedRadius = this.scene.view.radius + this.radiusDelta;\n\n\t\t\tthis.radiusDelta += -e.delta * resolvedRadius * 0.1;\n\n\t\t\tthis.stopTweens();\n\t\t};\n\n\t\tlet dblclick = (e) => {\n\t\t\tif(this.doubleClockZoomEnabled){\n\t\t\t\tthis.zoomToLocation(e.mouse);\n\t\t\t}\n\t\t};\n\n\t\tlet previousTouch = null;\n\t\tlet touchStart = e => {\n\t\t\tpreviousTouch = e;\n\t\t};\n\n\t\tlet touchEnd = e => {\n\t\t\tpreviousTouch = e;\n\t\t};\n\n\t\tlet touchMove = e => {\n\t\t\tif (e.touches.length === 2 && previousTouch.touches.length === 2){\n\t\t\t\tlet prev = previousTouch;\n\t\t\t\tlet curr = e;\n\n\t\t\t\tlet prevDX = prev.touches[0].pageX - prev.touches[1].pageX;\n\t\t\t\tlet prevDY = prev.touches[0].pageY - prev.touches[1].pageY;\n\t\t\t\tlet prevDist = Math.sqrt(prevDX * prevDX + prevDY * prevDY);\n\n\t\t\t\tlet currDX = curr.touches[0].pageX - curr.touches[1].pageX;\n\t\t\t\tlet currDY = curr.touches[0].pageY - curr.touches[1].pageY;\n\t\t\t\tlet currDist = Math.sqrt(currDX * currDX + currDY * currDY);\n\n\t\t\t\tlet delta = currDist / prevDist;\n\t\t\t\tlet resolvedRadius = this.scene.view.radius + this.radiusDelta;\n\t\t\t\tlet newRadius = resolvedRadius / delta;\n\t\t\t\tthis.radiusDelta = newRadius - resolvedRadius;\n\n\t\t\t\tthis.stopTweens();\n\t\t\t}else if(e.touches.length === 3 && previousTouch.touches.length === 3){\n\t\t\t\tlet prev = previousTouch;\n\t\t\t\tlet curr = e;\n\n\t\t\t\tlet prevMeanX = (prev.touches[0].pageX + prev.touches[1].pageX + prev.touches[2].pageX) / 3;\n\t\t\t\tlet prevMeanY = (prev.touches[0].pageY + prev.touches[1].pageY + prev.touches[2].pageY) / 3;\n\n\t\t\t\tlet currMeanX = (curr.touches[0].pageX + curr.touches[1].pageX + curr.touches[2].pageX) / 3;\n\t\t\t\tlet currMeanY = (curr.touches[0].pageY + curr.touches[1].pageY + curr.touches[2].pageY) / 3;\n\n\t\t\t\tlet delta = {\n\t\t\t\t\tx: (currMeanX - prevMeanX) / this.renderer.domElement.clientWidth,\n\t\t\t\t\ty: (currMeanY - prevMeanY) / this.renderer.domElement.clientHeight\n\t\t\t\t};\n\n\t\t\t\tthis.panDelta.x += delta.x;\n\t\t\t\tthis.panDelta.y += delta.y;\n\n\t\t\t\tthis.stopTweens();\n\t\t\t}\n\n\t\t\tpreviousTouch = e;\n\t\t};\n\n\t\tthis.addEventListener('touchstart', touchStart);\n\t\tthis.addEventListener('touchend', touchEnd);\n\t\tthis.addEventListener('touchmove', touchMove);\n\t\tthis.addEventListener('drag', drag);\n\t\tthis.addEventListener('drop', drop);\n\t\tthis.addEventListener('mousewheel', scroll);\n\t\tthis.addEventListener('dblclick', dblclick);\n\t}\n\n\tsetScene (scene) {\n\t\tthis.scene = scene;\n\t}\n\n\tstop(){\n\t\tthis.yawDelta = 0;\n\t\tthis.pitchDelta = 0;\n\t\tthis.radiusDelta = 0;\n\t\tthis.panDelta.set(0, 0);\n\t}\n\t\n\tzoomToLocation(mouse){\n\t\tlet camera = this.scene.getActiveCamera();\n\t\t\n\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\tmouse,\n\t\t\tcamera,\n\t\t\tthis.viewer,\n\t\t\tthis.scene.pointclouds,\n\t\t\t{pickClipped: true});\n\n\t\tif (I === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet targetRadius = 0;\n\t\t{\n\t\t\tlet minimumJumpDistance = 0.2;\n\n\t\t\tlet domElement = this.renderer.domElement;\n\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\n\t\t\tlet nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray);\n\t\t\tlet lastNode = nodes[nodes.length - 1];\n\t\t\tlet radius = lastNode.getBoundingSphere(new THREE.Sphere()).radius;\n\t\t\ttargetRadius = Math.min(this.scene.view.radius, radius);\n\t\t\ttargetRadius = Math.max(minimumJumpDistance, targetRadius);\n\t\t}\n\n\t\tlet d = this.scene.view.direction.multiplyScalar(-1);\n\t\tlet cameraTargetPosition = new THREE.Vector3().addVectors(I.location, d.multiplyScalar(targetRadius));\n\t\t// TODO Unused: let controlsTargetPosition = I.location;\n\n\t\tlet animationDuration = 600;\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\t{ // animate\n\t\t\tlet value = {x: 0};\n\t\t\tlet tween = new TWEEN.Tween(value).to({x: 1}, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\tthis.tweens.push(tween);\n\n\t\t\tlet startPos = this.scene.view.position.clone();\n\t\t\tlet targetPos = cameraTargetPosition.clone();\n\t\t\tlet startRadius = this.scene.view.radius;\n\t\t\tlet targetRadius = cameraTargetPosition.distanceTo(I.location);\n\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tlet t = value.x;\n\t\t\t\tthis.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x;\n\t\t\t\tthis.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y;\n\t\t\t\tthis.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z;\n\n\t\t\t\tthis.scene.view.radius = (1 - t) * startRadius + t * targetRadius;\n\t\t\t\tthis.viewer.setMoveSpeed(this.scene.view.radius);\n\t\t\t});\n\n\t\t\ttween.onComplete(() => {\n\t\t\t\tthis.tweens = this.tweens.filter(e => e !== tween);\n\t\t\t});\n\n\t\t\ttween.start();\n\t\t}\n\t}\n\n\tstopTweens () {\n\t\tthis.tweens.forEach(e => e.stop());\n\t\tthis.tweens = [];\n\t}\n\n\tupdate (delta) {\n\t\tlet view = this.scene.view;\n\n\t\t{ // apply rotation\n\t\t\tlet progression = Math.min(1, this.fadeFactor * delta);\n\n\t\t\tlet yaw = view.yaw;\n\t\t\tlet pitch = view.pitch;\n\t\t\tlet pivot = view.getPivot();\n\n\t\t\tyaw -= progression * this.yawDelta;\n\t\t\tpitch -= progression * this.pitchDelta;\n\n\t\t\tview.yaw = yaw;\n\t\t\tview.pitch = pitch;\n\n\t\t\tlet V = this.scene.view.direction.multiplyScalar(-view.radius);\n\t\t\tlet position = new THREE.Vector3().addVectors(pivot, V);\n\n\t\t\tview.position.copy(position);\n\t\t}\n\n\t\t{ // apply pan\n\t\t\tlet progression = Math.min(1, this.fadeFactor * delta);\n\t\t\tlet panDistance = progression * view.radius * 3;\n\n\t\t\tlet px = -this.panDelta.x * panDistance;\n\t\t\tlet py = this.panDelta.y * panDistance;\n\n\t\t\tview.pan(px, py);\n\t\t}\n\n\t\t{ // apply zoom\n\t\t\tlet progression = Math.min(1, this.fadeFactor * delta);\n\n\t\t\t// let radius = view.radius + progression * this.radiusDelta * view.radius * 0.1;\n\t\t\tlet radius = view.radius + progression * this.radiusDelta;\n\n\t\t\tlet V = view.direction.multiplyScalar(-radius);\n\t\t\tlet position = new THREE.Vector3().addVectors(view.getPivot(), V);\n\t\t\tview.radius = radius;\n\n\t\t\tview.position.copy(position);\n\t\t}\n\n\t\t{\n\t\t\tlet speed = view.radius;\n\t\t\tthis.viewer.setMoveSpeed(speed);\n\t\t}\n\n\t\t{ // decelerate over time\n\t\t\tlet progression = Math.min(1, this.fadeFactor * delta);\n\t\t\tlet attenuation = Math.max(0, 1 - this.fadeFactor * delta);\n\n\t\t\tthis.yawDelta *= attenuation;\n\t\t\tthis.pitchDelta *= attenuation;\n\t\t\tthis.panDelta.multiplyScalar(attenuation);\n\t\t\t// this.radiusDelta *= attenuation;\n\t\t\tthis.radiusDelta -= progression * this.radiusDelta;\n\t\t}\n\t}\n};\n","/**\n * @author mschuetz / http://mschuetz.at\n *\n * adapted from THREE.OrbitControls by\n *\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n *\n *\n *\n */\n\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {MOUSE} from \"../defines.js\";\nimport {Utils} from \"../utils.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\n\nexport class FirstPersonControls extends EventDispatcher {\n\tconstructor (viewer) {\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.scene = null;\n\t\tthis.sceneControls = new THREE.Scene();\n\n\t\tthis.rotationSpeed = 200;\n\t\tthis.moveSpeed = 10;\n\t\tthis.lockElevation = false;\n\n\t\tthis.keys = {\n\t\t\tFORWARD: ['W'.charCodeAt(0), 38],\n\t\t\tBACKWARD: ['S'.charCodeAt(0), 40],\n\t\t\tLEFT: ['A'.charCodeAt(0), 37],\n\t\t\tRIGHT: ['D'.charCodeAt(0), 39],\n\t\t\tUP: ['R'.charCodeAt(0), 33],\n\t\t\tDOWN: ['F'.charCodeAt(0), 34]\n\t\t};\n\n\t\tthis.fadeFactor = 50;\n\t\tthis.yawDelta = 0;\n\t\tthis.pitchDelta = 0;\n\t\tthis.translationDelta = new THREE.Vector3(0, 0, 0);\n\t\tthis.translationWorldDelta = new THREE.Vector3(0, 0, 0);\n\n\t\tthis.tweens = [];\n\n\t\tlet drag = (e) => {\n\t\t\tif (e.drag.object !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.drag.startHandled === undefined) {\n\t\t\t\te.drag.startHandled = true;\n\n\t\t\t\tthis.dispatchEvent({type: 'start'});\n\t\t\t}\n\n\t\t\tlet moveSpeed = this.viewer.getMoveSpeed();\n\n\t\t\tlet ndrag = {\n\t\t\t\tx: e.drag.lastDrag.x / this.renderer.domElement.clientWidth,\n\t\t\t\ty: e.drag.lastDrag.y / this.renderer.domElement.clientHeight\n\t\t\t};\n\n\t\t\tif (e.drag.mouse === MOUSE.LEFT) {\n\t\t\t\tthis.yawDelta += ndrag.x * this.rotationSpeed;\n\t\t\t\tthis.pitchDelta += ndrag.y * this.rotationSpeed;\n\t\t\t} else if (e.drag.mouse === MOUSE.RIGHT) {\n\t\t\t\tthis.translationDelta.x -= ndrag.x * moveSpeed * 100;\n\t\t\t\tthis.translationDelta.z += ndrag.y * moveSpeed * 100;\n\t\t\t}\n\t\t};\n\n\t\tlet drop = e => {\n\t\t\tthis.dispatchEvent({type: 'end'});\n\t\t};\n\n\t\tlet scroll = (e) => {\n\t\t\tlet speed = this.viewer.getMoveSpeed();\n\n\t\t\tif (e.delta < 0) {\n\t\t\t\tspeed = speed * 0.9;\n\t\t\t} else if (e.delta > 0) {\n\t\t\t\tspeed = speed / 0.9;\n\t\t\t}\n\n\t\t\tspeed = Math.max(speed, 0.1);\n\n\t\t\tthis.viewer.setMoveSpeed(speed);\n\t\t};\n\n\t\tlet dblclick = (e) => {\n\t\t\tthis.zoomToLocation(e.mouse);\n\t\t};\n\n\t\tthis.addEventListener('drag', drag);\n\t\tthis.addEventListener('drop', drop);\n\t\tthis.addEventListener('mousewheel', scroll);\n\t\tthis.addEventListener('dblclick', dblclick);\n\t}\n\n\tsetScene (scene) {\n\t\tthis.scene = scene;\n\t}\n\n\tstop(){\n\t\tthis.yawDelta = 0;\n\t\tthis.pitchDelta = 0;\n\t\tthis.translationDelta.set(0, 0, 0);\n\t}\n\t\n\tzoomToLocation(mouse){\n\t\tlet camera = this.scene.getActiveCamera();\n\t\t\n\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\tmouse,\n\t\t\tcamera,\n\t\t\tthis.viewer,\n\t\t\tthis.scene.pointclouds);\n\n\t\tif (I === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet targetRadius = 0;\n\t\t{\n\t\t\tlet minimumJumpDistance = 0.2;\n\n\t\t\tlet domElement = this.renderer.domElement;\n\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\n\t\t\tlet nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray);\n\t\t\tlet lastNode = nodes[nodes.length - 1];\n\t\t\tlet radius = lastNode.getBoundingSphere(new THREE.Sphere()).radius;\n\t\t\ttargetRadius = Math.min(this.scene.view.radius, radius);\n\t\t\ttargetRadius = Math.max(minimumJumpDistance, targetRadius);\n\t\t}\n\n\t\tlet d = this.scene.view.direction.multiplyScalar(-1);\n\t\tlet cameraTargetPosition = new THREE.Vector3().addVectors(I.location, d.multiplyScalar(targetRadius));\n\t\t// TODO Unused: let controlsTargetPosition = I.location;\n\n\t\tlet animationDuration = 600;\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\t{ // animate\n\t\t\tlet value = {x: 0};\n\t\t\tlet tween = new TWEEN.Tween(value).to({x: 1}, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\tthis.tweens.push(tween);\n\n\t\t\tlet startPos = this.scene.view.position.clone();\n\t\t\tlet targetPos = cameraTargetPosition.clone();\n\t\t\tlet startRadius = this.scene.view.radius;\n\t\t\tlet targetRadius = cameraTargetPosition.distanceTo(I.location);\n\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tlet t = value.x;\n\t\t\t\tthis.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x;\n\t\t\t\tthis.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y;\n\t\t\t\tthis.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z;\n\n\t\t\t\tthis.scene.view.radius = (1 - t) * startRadius + t * targetRadius;\n\t\t\t\tthis.viewer.setMoveSpeed(this.scene.view.radius / 2.5);\n\t\t\t});\n\n\t\t\ttween.onComplete(() => {\n\t\t\t\tthis.tweens = this.tweens.filter(e => e !== tween);\n\t\t\t});\n\n\t\t\ttween.start();\n\t\t}\n\t}\n\n\tupdate (delta) {\n\t\tlet view = this.scene.view;\n\n\t\t{ // cancel move animations on user input\n\t\t\tlet changes = [ this.yawDelta,\n\t\t\t\tthis.pitchDelta,\n\t\t\t\tthis.translationDelta.length(),\n\t\t\t\tthis.translationWorldDelta.length() ];\n\t\t\tlet changeHappens = changes.some(e => Math.abs(e) > 0.001);\n\t\t\tif (changeHappens && this.tweens.length > 0) {\n\t\t\t\tthis.tweens.forEach(e => e.stop());\n\t\t\t\tthis.tweens = [];\n\t\t\t}\n\t\t}\n\n\t\t{ // accelerate while input is given\n\t\t\tlet ih = this.viewer.inputHandler;\n\n\t\t\tlet moveForward = this.keys.FORWARD.some(e => ih.pressedKeys[e]);\n\t\t\tlet moveBackward = this.keys.BACKWARD.some(e => ih.pressedKeys[e]);\n\t\t\tlet moveLeft = this.keys.LEFT.some(e => ih.pressedKeys[e]);\n\t\t\tlet moveRight = this.keys.RIGHT.some(e => ih.pressedKeys[e]);\n\t\t\tlet moveUp = this.keys.UP.some(e => ih.pressedKeys[e]);\n\t\t\tlet moveDown = this.keys.DOWN.some(e => ih.pressedKeys[e]);\n\n\t\t\tif(this.lockElevation){\n\t\t\t\tlet dir = view.direction;\n\t\t\t\tdir.z = 0;\n\t\t\t\tdir.normalize();\n\n\t\t\t\tif (moveForward && moveBackward) {\n\t\t\t\t\tthis.translationWorldDelta.set(0, 0, 0);\n\t\t\t\t} else if (moveForward) {\n\t\t\t\t\tthis.translationWorldDelta.copy(dir.multiplyScalar(this.viewer.getMoveSpeed()));\n\t\t\t\t} else if (moveBackward) {\n\t\t\t\t\tthis.translationWorldDelta.copy(dir.multiplyScalar(-this.viewer.getMoveSpeed()));\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tif (moveForward && moveBackward) {\n\t\t\t\t\tthis.translationDelta.y = 0;\n\t\t\t\t} else if (moveForward) {\n\t\t\t\t\tthis.translationDelta.y = this.viewer.getMoveSpeed();\n\t\t\t\t} else if (moveBackward) {\n\t\t\t\t\tthis.translationDelta.y = -this.viewer.getMoveSpeed();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (moveLeft && moveRight) {\n\t\t\t\tthis.translationDelta.x = 0;\n\t\t\t} else if (moveLeft) {\n\t\t\t\tthis.translationDelta.x = -this.viewer.getMoveSpeed();\n\t\t\t} else if (moveRight) {\n\t\t\t\tthis.translationDelta.x = this.viewer.getMoveSpeed();\n\t\t\t}\n\n\t\t\tif (moveUp && moveDown) {\n\t\t\t\tthis.translationWorldDelta.z = 0;\n\t\t\t} else if (moveUp) {\n\t\t\t\tthis.translationWorldDelta.z = this.viewer.getMoveSpeed();\n\t\t\t} else if (moveDown) {\n\t\t\t\tthis.translationWorldDelta.z = -this.viewer.getMoveSpeed();\n\t\t\t}\n\t\t}\n\n\t\t{ // apply rotation\n\t\t\tlet yaw = view.yaw;\n\t\t\tlet pitch = view.pitch;\n\n\t\t\tyaw -= this.yawDelta * delta;\n\t\t\tpitch -= this.pitchDelta * delta;\n\n\t\t\tview.yaw = yaw;\n\t\t\tview.pitch = pitch;\n\t\t}\n\n\t\t{ // apply translation\n\t\t\tview.translate(\n\t\t\t\tthis.translationDelta.x * delta,\n\t\t\t\tthis.translationDelta.y * delta,\n\t\t\t\tthis.translationDelta.z * delta\n\t\t\t);\n\n\t\t\tview.translateWorld(\n\t\t\t\tthis.translationWorldDelta.x * delta,\n\t\t\t\tthis.translationWorldDelta.y * delta,\n\t\t\t\tthis.translationWorldDelta.z * delta\n\t\t\t);\n\t\t}\n\n\t\t{ // set view target according to speed\n\t\t\tview.radius = 3 * this.viewer.getMoveSpeed();\n\t\t}\n\n\t\t{ // decelerate over time\n\t\t\tlet attenuation = Math.max(0, 1 - this.fadeFactor * delta);\n\t\t\tthis.yawDelta *= attenuation;\n\t\t\tthis.pitchDelta *= attenuation;\n\t\t\tthis.translationDelta.multiplyScalar(attenuation);\n\t\t\tthis.translationWorldDelta.multiplyScalar(attenuation);\n\t\t}\n\t}\n};\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {MOUSE} from \"../defines.js\";\nimport {Utils} from \"../utils.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\nexport class EarthControls extends EventDispatcher {\n\tconstructor (viewer) {\n\t\tsuper(viewer);\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.scene = null;\n\t\tthis.sceneControls = new THREE.Scene();\n\n\t\tthis.rotationSpeed = 10;\n\n\t\tthis.fadeFactor = 20;\n\t\tthis.wheelDelta = 0;\n\t\tthis.zoomDelta = new THREE.Vector3();\n\t\tthis.camStart = null;\n\n\t\tthis.tweens = [];\n\n\t\t{\n\t\t\tlet sg = new THREE.SphereGeometry(1, 16, 16);\n\t\t\tlet sm = new THREE.MeshNormalMaterial();\n\t\t\tthis.pivotIndicator = new THREE.Mesh(sg, sm);\n\t\t\tthis.pivotIndicator.visible = false;\n\t\t\tthis.sceneControls.add(this.pivotIndicator);\n\t\t}\n\n\t\tlet drag = (e) => {\n\t\t\tif (e.drag.object !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.pivot) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.drag.startHandled === undefined) {\n\t\t\t\te.drag.startHandled = true;\n\n\t\t\t\tthis.dispatchEvent({type: 'start'});\n\t\t\t}\n\n\t\t\tlet camStart = this.camStart;\n\t\t\tlet camera = this.scene.getActiveCamera();\n\t\t\tlet view = this.viewer.scene.view;\n\n\t\t\t// let camera = this.viewer.scene.camera;\n\t\t\tlet mouse = e.drag.end;\n\t\t\tlet domElement = this.viewer.renderer.domElement;\n\n\t\t\tif (e.drag.mouse === MOUSE.LEFT) {\n\n\t\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\t\t\t\tlet plane = new THREE.Plane().setFromNormalAndCoplanarPoint(\n\t\t\t\t\tnew THREE.Vector3(0, 0, 1),\n\t\t\t\t\tthis.pivot);\n\n\t\t\t\tlet distanceToPlane = ray.distanceToPlane(plane);\n\n\t\t\t\tif (distanceToPlane > 0) {\n\t\t\t\t\tlet I = new THREE.Vector3().addVectors(\n\t\t\t\t\t\tcamStart.position,\n\t\t\t\t\t\tray.direction.clone().multiplyScalar(distanceToPlane));\n\n\t\t\t\t\tlet movedBy = new THREE.Vector3().subVectors(\n\t\t\t\t\t\tI, this.pivot);\n\n\t\t\t\t\tlet newCamPos = camStart.position.clone().sub(movedBy);\n\n\t\t\t\t\tview.position.copy(newCamPos);\n\n\t\t\t\t\t{\n\t\t\t\t\t\tlet distance = newCamPos.distanceTo(this.pivot);\n\t\t\t\t\t\tview.radius = distance;\n\t\t\t\t\t\tlet speed = view.radius / 2.5;\n\t\t\t\t\t\tthis.viewer.setMoveSpeed(speed);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (e.drag.mouse === MOUSE.RIGHT) {\n\t\t\t\tlet ndrag = {\n\t\t\t\t\tx: e.drag.lastDrag.x / this.renderer.domElement.clientWidth,\n\t\t\t\t\ty: e.drag.lastDrag.y / this.renderer.domElement.clientHeight\n\t\t\t\t};\n\n\t\t\t\tlet yawDelta = -ndrag.x * this.rotationSpeed * 0.5;\n\t\t\t\tlet pitchDelta = -ndrag.y * this.rotationSpeed * 0.2;\n\n\t\t\t\tlet originalPitch = view.pitch;\n\t\t\t\tlet tmpView = view.clone();\n\t\t\t\ttmpView.pitch = tmpView.pitch + pitchDelta;\n\t\t\t\tpitchDelta = tmpView.pitch - originalPitch;\n\n\t\t\t\tlet pivotToCam = new THREE.Vector3().subVectors(view.position, this.pivot);\n\t\t\t\tlet pivotToCamTarget = new THREE.Vector3().subVectors(view.getPivot(), this.pivot);\n\t\t\t\tlet side = view.getSide();\n\n\t\t\t\tpivotToCam.applyAxisAngle(side, pitchDelta);\n\t\t\t\tpivotToCamTarget.applyAxisAngle(side, pitchDelta);\n\n\t\t\t\tpivotToCam.applyAxisAngle(new THREE.Vector3(0, 0, 1), yawDelta);\n\t\t\t\tpivotToCamTarget.applyAxisAngle(new THREE.Vector3(0, 0, 1), yawDelta);\n\n\t\t\t\tlet newCam = new THREE.Vector3().addVectors(this.pivot, pivotToCam);\n\t\t\t\t// TODO: Unused: let newCamTarget = new THREE.Vector3().addVectors(this.pivot, pivotToCamTarget);\n\n\t\t\t\tview.position.copy(newCam);\n\t\t\t\tview.yaw += yawDelta;\n\t\t\t\tview.pitch += pitchDelta;\n\t\t\t}\n\t\t};\n\n\t\tlet onMouseDown = e => {\n\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\te.mouse, \n\t\t\t\tthis.scene.getActiveCamera(), \n\t\t\t\tthis.viewer, \n\t\t\t\tthis.scene.pointclouds, \n\t\t\t\t{pickClipped: false});\n\n\t\t\tif (I) {\n\t\t\t\tthis.pivot = I.location;\n\t\t\t\tthis.camStart = this.scene.getActiveCamera().clone();\n\t\t\t\tthis.pivotIndicator.visible = true;\n\t\t\t\tthis.pivotIndicator.position.copy(I.location);\n\t\t\t}\n\t\t};\n\n\t\tlet drop = e => {\n\t\t\tthis.dispatchEvent({type: 'end'});\n\t\t};\n\n\t\tlet onMouseUp = e => {\n\t\t\tthis.camStart = null;\n\t\t\tthis.pivot = null;\n\t\t\tthis.pivotIndicator.visible = false;\n\t\t};\n\n\t\tlet scroll = (e) => {\n\t\t\tthis.wheelDelta += e.delta;\n\t\t};\n\n\t\tlet dblclick = (e) => {\n\t\t\tthis.zoomToLocation(e.mouse);\n\t\t};\n\n\t\tthis.addEventListener('drag', drag);\n\t\tthis.addEventListener('drop', drop);\n\t\tthis.addEventListener('mousewheel', scroll);\n\t\tthis.addEventListener('mousedown', onMouseDown);\n\t\tthis.addEventListener('mouseup', onMouseUp);\n\t\tthis.addEventListener('dblclick', dblclick);\n\t}\n\n\tsetScene (scene) {\n\t\tthis.scene = scene;\n\t}\n\n\tstop(){\n\t\tthis.wheelDelta = 0;\n\t\tthis.zoomDelta.set(0, 0, 0);\n\t}\n\t\n\tzoomToLocation(mouse){\n\t\tlet camera = this.scene.getActiveCamera();\n\t\t\n\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\tmouse,\n\t\t\tcamera,\n\t\t\tthis.viewer,\n\t\t\tthis.scene.pointclouds);\n\n\t\tif (I === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet targetRadius = 0;\n\t\t{\n\t\t\tlet minimumJumpDistance = 0.2;\n\n\t\t\tlet domElement = this.renderer.domElement;\n\t\t\tlet ray = Utils.mouseToRay(mouse, camera, domElement.clientWidth, domElement.clientHeight);\n\n\t\t\tlet nodes = I.pointcloud.nodesOnRay(I.pointcloud.visibleNodes, ray);\n\t\t\tlet lastNode = nodes[nodes.length - 1];\n\t\t\tlet radius = lastNode.getBoundingSphere(new THREE.Sphere()).radius;\n\t\t\ttargetRadius = Math.min(this.scene.view.radius, radius);\n\t\t\ttargetRadius = Math.max(minimumJumpDistance, targetRadius);\n\t\t}\n\n\t\tlet d = this.scene.view.direction.multiplyScalar(-1);\n\t\tlet cameraTargetPosition = new THREE.Vector3().addVectors(I.location, d.multiplyScalar(targetRadius));\n\t\t// TODO Unused: let controlsTargetPosition = I.location;\n\n\t\tlet animationDuration = 600;\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\t{ // animate\n\t\t\tlet value = {x: 0};\n\t\t\tlet tween = new TWEEN.Tween(value).to({x: 1}, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\tthis.tweens.push(tween);\n\n\t\t\tlet startPos = this.scene.view.position.clone();\n\t\t\tlet targetPos = cameraTargetPosition.clone();\n\t\t\tlet startRadius = this.scene.view.radius;\n\t\t\tlet targetRadius = cameraTargetPosition.distanceTo(I.location);\n\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tlet t = value.x;\n\t\t\t\tthis.scene.view.position.x = (1 - t) * startPos.x + t * targetPos.x;\n\t\t\t\tthis.scene.view.position.y = (1 - t) * startPos.y + t * targetPos.y;\n\t\t\t\tthis.scene.view.position.z = (1 - t) * startPos.z + t * targetPos.z;\n\n\t\t\t\tthis.scene.view.radius = (1 - t) * startRadius + t * targetRadius;\n\t\t\t\tthis.viewer.setMoveSpeed(this.scene.view.radius / 2.5);\n\t\t\t});\n\n\t\t\ttween.onComplete(() => {\n\t\t\t\tthis.tweens = this.tweens.filter(e => e !== tween);\n\t\t\t});\n\n\t\t\ttween.start();\n\t\t}\n\t}\n\n\tupdate (delta) {\n\t\tlet view = this.scene.view;\n\t\tlet fade = Math.pow(0.5, this.fadeFactor * delta);\n\t\tlet progression = 1 - fade;\n\t\tlet camera = this.scene.getActiveCamera();\n\t\t\n\t\t// compute zoom\n\t\tif (this.wheelDelta !== 0) {\n\t\t\tlet I = Utils.getMousePointCloudIntersection(\n\t\t\t\tthis.viewer.inputHandler.mouse, \n\t\t\t\tthis.scene.getActiveCamera(), \n\t\t\t\tthis.viewer, \n\t\t\t\tthis.scene.pointclouds);\n\n\t\t\tif (I) {\n\t\t\t\tlet resolvedPos = new THREE.Vector3().addVectors(view.position, this.zoomDelta);\n\t\t\t\tlet distance = I.location.distanceTo(resolvedPos);\n\t\t\t\tlet jumpDistance = distance * 0.2 * this.wheelDelta;\n\t\t\t\tlet targetDir = new THREE.Vector3().subVectors(I.location, view.position);\n\t\t\t\ttargetDir.normalize();\n\n\t\t\t\tresolvedPos.add(targetDir.multiplyScalar(jumpDistance));\n\t\t\t\tthis.zoomDelta.subVectors(resolvedPos, view.position);\n\n\t\t\t\t{\n\t\t\t\t\tlet distance = resolvedPos.distanceTo(I.location);\n\t\t\t\t\tview.radius = distance;\n\t\t\t\t\tlet speed = view.radius / 2.5;\n\t\t\t\t\tthis.viewer.setMoveSpeed(speed);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// apply zoom\n\t\tif (this.zoomDelta.length() !== 0) {\n\t\t\tlet p = this.zoomDelta.clone().multiplyScalar(progression);\n\n\t\t\tlet newPos = new THREE.Vector3().addVectors(view.position, p);\n\t\t\tview.position.copy(newPos);\n\t\t}\n\n\t\tif (this.pivotIndicator.visible) {\n\t\t\tlet distance = this.pivotIndicator.position.distanceTo(view.position);\n\t\t\tlet pixelwidth = this.renderer.domElement.clientwidth;\n\t\t\tlet pixelHeight = this.renderer.domElement.clientHeight;\n\t\t\tlet pr = Utils.projectedRadius(1, camera, distance, pixelwidth, pixelHeight);\n\t\t\tlet scale = (10 / pr);\n\t\t\tthis.pivotIndicator.scale.set(scale, scale, scale);\n\t\t}\n\n\t\t// decelerate over time\n\t\t{\n\t\t\tthis.zoomDelta.multiplyScalar(fade);\n\t\t\tthis.wheelDelta = 0;\n\t\t}\n\t}\n};\n","/**\n * @author chrisl / Geodan\n *\n * adapted from Potree.FirstPersonControls by\n *\n * @author mschuetz / http://mschuetz.at\n *\n * and THREE.DeviceOrientationControls by\n *\n * @author richt / http://richt.me\n * @author WestLangley / http://github.com/WestLangley\n *\n *\n *\n */\n\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {EventDispatcher} from \"../EventDispatcher.js\";\n\nexport class DeviceOrientationControls extends EventDispatcher{\n\tconstructor(viewer){\n\t\tsuper();\n\n\t\tthis.viewer = viewer;\n\t\tthis.renderer = viewer.renderer;\n\n\t\tthis.scene = null;\n\t\tthis.sceneControls = new THREE.Scene();\n\n\t\tthis.screenOrientation = window.orientation || 0;\n\n\t\tlet deviceOrientationChange = e => {\n\t\t\tthis.deviceOrientation = e;\n\t\t};\n\n\t\tlet screenOrientationChange = e => {\n\t\t\tthis.screenOrientation = window.orientation || 0;\n\t\t};\n\n\t\tif ('ondeviceorientationabsolute' in window) {\n\t\t\twindow.addEventListener('deviceorientationabsolute', deviceOrientationChange);\n\t\t} else if ('ondeviceorientation' in window) {\n\t\t\twindow.addEventListener('deviceorientation', deviceOrientationChange);\n\t\t} else {\n\t\t\tconsole.warn(\"No device orientation found.\");\n\t\t}\n\t\t// window.addEventListener('deviceorientation', deviceOrientationChange);\n\t\twindow.addEventListener('orientationchange', screenOrientationChange);\n\t}\n\n\tsetScene (scene) {\n\t\tthis.scene = scene;\n\t}\n\n\tupdate (delta) {\n\t\tlet computeQuaternion = function (alpha, beta, gamma, orient) {\n\t\t\tlet quaternion = new THREE.Quaternion();\n\n\t\t\tlet zee = new THREE.Vector3(0, 0, 1);\n\t\t\tlet euler = new THREE.Euler();\n\t\t\tlet q0 = new THREE.Quaternion();\n\n\t\t\teuler.set(beta, gamma, alpha, 'ZXY');\n\t\t\tquaternion.setFromEuler(euler);\n\t\t\tquaternion.multiply(q0.setFromAxisAngle(zee, -orient));\n\n\t\t\treturn quaternion;\n\t\t};\n\n\t\tif (typeof this.deviceOrientation !== 'undefined') {\n\t\t\tlet alpha = this.deviceOrientation.alpha ? THREE.Math.degToRad(this.deviceOrientation.alpha) : 0;\n\t\t\tlet beta = this.deviceOrientation.beta ? THREE.Math.degToRad(this.deviceOrientation.beta) : 0;\n\t\t\tlet gamma = this.deviceOrientation.gamma ? THREE.Math.degToRad(this.deviceOrientation.gamma) : 0;\n\t\t\tlet orient = this.screenOrientation ? THREE.Math.degToRad(this.screenOrientation) : 0;\n\n\t\t\tlet quaternion = computeQuaternion(alpha, beta, gamma, orient);\n\t\t\tviewer.scene.cameraP.quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w);\n\t\t}\n\t}\n};\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tCanvasTexture,\n\tClampToEdgeWrapping,\n\tColor,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternionKeyframeTrack,\n\tRGBFormat,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTangentSpaceNormalMap,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tsRGBEncoding\n} from '../build/three.module.js';\n\nvar GLTFLoader = ( function () {\n\n\tfunction GLTFLoader( manager ) {\n\n\t\tLoader.call( this, manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ddsLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t}\n\n\tGLTFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\t\tconstructor: GLTFLoader,\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar resourcePath;\n\n\t\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\t\tresourcePath = this.resourcePath;\n\n\t\t\t} else if ( this.path !== '' ) {\n\n\t\t\t\tresourcePath = this.path;\n\n\t\t\t} else {\n\n\t\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t\t}\n\n\t\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tvar _onError = function ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.setRequestHeader( this.requestHeader );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\t\tloader.load( url, function ( data ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, _onError );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t_onError( e );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, _onError );\n\n\t\t},\n\n\t\tsetDRACOLoader: function ( dracoLoader ) {\n\n\t\t\tthis.dracoLoader = dracoLoader;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetDDSLoader: function ( ddsLoader ) {\n\n\t\t\tthis.ddsLoader = ddsLoader;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetKTX2Loader: function ( ktx2Loader ) {\n\n\t\t\tthis.ktx2Loader = ktx2Loader;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetMeshoptDecoder: function ( meshoptDecoder ) {\n\n\t\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tregister: function ( callback ) {\n\n\t\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunregister: function ( callback ) {\n\n\t\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tparse: function ( data, path, onLoad, onError ) {\n\n\t\t\tvar content;\n\t\t\tvar extensions = {};\n\t\t\tvar plugins = {};\n\n\t\t\tif ( typeof data === 'string' ) {\n\n\t\t\t\tcontent = data;\n\n\t\t\t} else {\n\n\t\t\t\tvar magic = LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) );\n\n\t\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontent = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcontent = LoaderUtils.decodeText( new Uint8Array( data ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar json = JSON.parse( content );\n\n\t\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar parser = new GLTFParser( json, {\n\n\t\t\t\tpath: path || this.resourcePath || '',\n\t\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\t\tmanager: this.manager,\n\t\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t\t} );\n\n\t\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\t\tfor ( var i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\t\tvar plugin = this.pluginCallbacks[ i ]( parser );\n\t\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t\t// Remove this workaround if we move all the existing\n\t\t\t\t// extension handlers to plugin system\n\t\t\t\textensions[ plugin.name ] = true;\n\n\t\t\t}\n\n\t\t\tif ( json.extensionsUsed ) {\n\n\t\t\t\tfor ( var i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\t\tvar extensionName = json.extensionsUsed[ i ];\n\t\t\t\t\tvar extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.MSFT_TEXTURE_DDS:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureDDSExtension( this.ddsLoader );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tparser.setExtensions( extensions );\n\t\t\tparser.setPlugins( plugins );\n\t\t\tparser.parse( onLoad, onError );\n\n\t\t}\n\n\t} );\n\n\t/* GLTFREGISTRY */\n\n\tfunction GLTFRegistry() {\n\n\t\tvar objects = {};\n\n\t\treturn\t{\n\n\t\t\tget: function ( key ) {\n\n\t\t\t\treturn objects[ key ];\n\n\t\t\t},\n\n\t\t\tadd: function ( key, object ) {\n\n\t\t\t\tobjects[ key ] = object;\n\n\t\t\t},\n\n\t\t\tremove: function ( key ) {\n\n\t\t\t\tdelete objects[ key ];\n\n\t\t\t},\n\n\t\t\tremoveAll: function () {\n\n\t\t\t\tobjects = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/*********************************/\n\t/********** EXTENSIONS ***********/\n\t/*********************************/\n\n\tvar EXTENSIONS = {\n\t\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\t\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\t\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\t\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\t\tKHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',\n\t\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\t\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\t\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\t\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\t\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\t\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\t\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\t\tMSFT_TEXTURE_DDS: 'MSFT_texture_dds'\n\t};\n\n\t/**\n\t * DDS Texture Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/MSFT_texture_dds\n\t *\n\t */\n\tfunction GLTFTextureDDSExtension( ddsLoader ) {\n\n\t\tif ( ! ddsLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Attempting to load .dds texture without importing DDSLoader' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.MSFT_TEXTURE_DDS;\n\t\tthis.ddsLoader = ddsLoader;\n\n\t}\n\n\t/**\n\t * Punctual Lights Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n\t */\n\tfunction GLTFLightsExtension( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\tGLTFLightsExtension.prototype._markDefs = function () {\n\n\t\tvar parser = this.parser;\n\t\tvar nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tvar nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tGLTFLightsExtension.prototype._loadLight = function ( lightIndex ) {\n\n\t\tvar parser = this.parser;\n\t\tvar cacheKey = 'light:' + lightIndex;\n\t\tvar dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tvar json = parser.json;\n\t\tvar extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tvar lightDefs = extensions.lights || [];\n\t\tvar lightDef = lightDefs[ lightIndex ];\n\t\tvar lightNode;\n\n\t\tvar color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.fromArray( lightDef.color );\n\n\t\tvar range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t};\n\n\tGLTFLightsExtension.prototype.createNodeAttachment = function ( nodeIndex ) {\n\n\t\tvar self = this;\n\t\tvar parser = this.parser;\n\t\tvar json = parser.json;\n\t\tvar nodeDef = json.nodes[ nodeIndex ];\n\t\tvar lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tvar lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Unlit Materials Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n\t */\n\tfunction GLTFMaterialsUnlitExtension() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tGLTFMaterialsUnlitExtension.prototype.getMaterialType = function () {\n\n\t\treturn MeshBasicMaterial;\n\n\t};\n\n\tGLTFMaterialsUnlitExtension.prototype.extendParams = function ( materialParams, materialDef, parser ) {\n\n\t\tvar pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tvar metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tvar array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t};\n\n\t/**\n\t * Clearcoat Materials Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n\t */\n\tfunction GLTFMaterialsClearcoatExtension( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tGLTFMaterialsClearcoatExtension.prototype.getMaterialType = function ( materialIndex ) {\n\n\t\tvar parser = this.parser;\n\t\tvar materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t};\n\n\tGLTFMaterialsClearcoatExtension.prototype.extendMaterialParams = function ( materialIndex, materialParams ) {\n\n\t\tvar parser = this.parser;\n\t\tvar materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tvar pending = [];\n\n\t\tvar extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tvar scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t};\n\n\t/**\n\t * Transmission Materials Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n\t * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n\t */\n\tfunction GLTFMaterialsTransmissionExtension( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tGLTFMaterialsTransmissionExtension.prototype.getMaterialType = function ( materialIndex ) {\n\n\t\tvar parser = this.parser;\n\t\tvar materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t};\n\n\tGLTFMaterialsTransmissionExtension.prototype.extendMaterialParams = function ( materialIndex, materialParams ) {\n\n\t\tvar parser = this.parser;\n\t\tvar materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tvar pending = [];\n\n\t\tvar extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t};\n\n\t/**\n\t * BasisU Texture Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n\t */\n\tfunction GLTFTextureBasisUExtension( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tGLTFTextureBasisUExtension.prototype.loadTexture = function ( textureIndex ) {\n\n\t\tvar parser = this.parser;\n\t\tvar json = parser.json;\n\n\t\tvar textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar extension = textureDef.extensions[ this.name ];\n\t\tvar source = json.images[ extension.source ];\n\t\tvar loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, source, loader );\n\n\t};\n\n\t/**\n\t * WebP Texture Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n\t */\n\tfunction GLTFTextureWebPExtension( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tGLTFTextureWebPExtension.prototype.loadTexture = function ( textureIndex ) {\n\n\t\tvar name = this.name;\n\t\tvar parser = this.parser;\n\t\tvar json = parser.json;\n\n\t\tvar textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar extension = textureDef.extensions[ name ];\n\t\tvar source = json.images[ extension.source ];\n\t\tvar loader = source.uri ? parser.options.manager.getHandler( source.uri ) : parser.textureLoader;\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t};\n\n\tGLTFTextureWebPExtension.prototype.detectSupport = function () {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tvar image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t};\n\n\t/**\n\t* meshopt BufferView Compression Extension\n\t*\n\t* Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n\t*/\n\tfunction GLTFMeshoptCompression( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tGLTFMeshoptCompression.prototype.loadBufferView = function ( index ) {\n\n\t\tvar json = this.parser.json;\n\t\tvar bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tvar extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tvar buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tvar decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( [ buffer, decoder.ready ] ).then( function ( res ) {\n\n\t\t\t\tvar byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tvar byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tvar count = extensionDef.count;\n\t\t\t\tvar stride = extensionDef.byteStride;\n\n\t\t\t\tvar result = new ArrayBuffer( count * stride );\n\t\t\t\tvar source = new Uint8Array( res[ 0 ], byteOffset, byteLength );\n\n\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\treturn result;\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t};\n\n\t/* BINARY EXTENSION */\n\tvar BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\n\tvar BINARY_EXTENSION_HEADER_LENGTH = 12;\n\tvar BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\n\tfunction GLTFBinaryExtension( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tvar headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\n\t\tthis.header = {\n\t\t\tmagic: LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tvar chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tvar chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkView.byteLength ) {\n\n\t\t\tvar chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tvar chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tvar contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = LoaderUtils.decodeText( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tvar byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * DRACO Mesh Compression Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n\t */\n\tfunction GLTFDracoMeshCompressionExtension( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tGLTFDracoMeshCompressionExtension.prototype.decodePrimitive = function ( primitive, parser ) {\n\n\t\tvar json = this.json;\n\t\tvar dracoLoader = this.dracoLoader;\n\t\tvar bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tvar gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tvar threeAttributeMap = {};\n\t\tvar attributeNormalizedMap = {};\n\t\tvar attributeTypeMap = {};\n\n\t\tfor ( var attributeName in gltfAttributeMap ) {\n\n\t\t\tvar threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( attributeName in primitive.attributes ) {\n\n\t\t\tvar threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tvar accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tvar componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( var attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tvar attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tvar normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap );\n\n\t\t\t} );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Texture Transform Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n\t */\n\tfunction GLTFTextureTransformExtension() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\tGLTFTextureTransformExtension.prototype.extendTexture = function ( texture, transform ) {\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV sets in \"' + this.name + '\" extension not yet supported.' );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t};\n\n\t/**\n\t * Specular-Glossiness Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness\n\t */\n\n\t/**\n\t * A sub class of StandardMaterial with some of the functionality\n\t * changed via the `onBeforeCompile` callback\n\t * @pailhead\n\t */\n\n\tfunction GLTFMeshStandardSGMaterial( params ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.isGLTFSpecularGlossinessMaterial = true;\n\n\t\t//various chunks that need replacing\n\t\tvar specularMapParsFragmentChunk = [\n\t\t\t'#ifdef USE_SPECULARMAP',\n\t\t\t'\tuniform sampler2D specularMap;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tvar glossinessMapParsFragmentChunk = [\n\t\t\t'#ifdef USE_GLOSSINESSMAP',\n\t\t\t'\tuniform sampler2D glossinessMap;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tvar specularMapFragmentChunk = [\n\t\t\t'vec3 specularFactor = specular;',\n\t\t\t'#ifdef USE_SPECULARMAP',\n\t\t\t'\tvec4 texelSpecular = texture2D( specularMap, vUv );',\n\t\t\t'\ttexelSpecular = sRGBToLinear( texelSpecular );',\n\t\t\t'\t// reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture',\n\t\t\t'\tspecularFactor *= texelSpecular.rgb;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tvar glossinessMapFragmentChunk = [\n\t\t\t'float glossinessFactor = glossiness;',\n\t\t\t'#ifdef USE_GLOSSINESSMAP',\n\t\t\t'\tvec4 texelGlossiness = texture2D( glossinessMap, vUv );',\n\t\t\t'\t// reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture',\n\t\t\t'\tglossinessFactor *= texelGlossiness.a;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tvar lightPhysicalFragmentChunk = [\n\t\t\t'PhysicalMaterial material;',\n\t\t\t'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );',\n\t\t\t'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );',\n\t\t\t'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );',\n\t\t\t'material.specularRoughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.',\n\t\t\t'material.specularRoughness += geometryRoughness;',\n\t\t\t'material.specularRoughness = min( material.specularRoughness, 1.0 );',\n\t\t\t'material.specularColor = specularFactor;',\n\t\t].join( '\\n' );\n\n\t\tvar uniforms = {\n\t\t\tspecular: { value: new Color().setHex( 0xffffff ) },\n\t\t\tglossiness: { value: 1 },\n\t\t\tspecularMap: { value: null },\n\t\t\tglossinessMap: { value: null }\n\t\t};\n\n\t\tthis._extraUniforms = uniforms;\n\n\t\tthis.onBeforeCompile = function ( shader ) {\n\n\t\t\tfor ( var uniformName in uniforms ) {\n\n\t\t\t\tshader.uniforms[ uniformName ] = uniforms[ uniformName ];\n\n\t\t\t}\n\n\t\t\tshader.fragmentShader = shader.fragmentShader\n\t\t\t\t.replace( 'uniform float roughness;', 'uniform vec3 specular;' )\n\t\t\t\t.replace( 'uniform float metalness;', 'uniform float glossiness;' )\n\t\t\t\t.replace( '#include ', specularMapParsFragmentChunk )\n\t\t\t\t.replace( '#include ', glossinessMapParsFragmentChunk )\n\t\t\t\t.replace( '#include ', specularMapFragmentChunk )\n\t\t\t\t.replace( '#include ', glossinessMapFragmentChunk )\n\t\t\t\t.replace( '#include ', lightPhysicalFragmentChunk );\n\n\t\t};\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tspecular: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn uniforms.specular.value;\n\n\t\t\t\t},\n\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\tuniforms.specular.value = v;\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tspecularMap: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn uniforms.specularMap.value;\n\n\t\t\t\t},\n\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\tuniforms.specularMap.value = v;\n\n\t\t\t\t\tif ( v ) {\n\n\t\t\t\t\t\tthis.defines.USE_SPECULARMAP = ''; // USE_UV is set by the renderer for specular maps\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.USE_SPECULARMAP;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tglossiness: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn uniforms.glossiness.value;\n\n\t\t\t\t},\n\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\tuniforms.glossiness.value = v;\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tglossinessMap: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn uniforms.glossinessMap.value;\n\n\t\t\t\t},\n\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\tuniforms.glossinessMap.value = v;\n\n\t\t\t\t\tif ( v ) {\n\n\t\t\t\t\t\tthis.defines.USE_GLOSSINESSMAP = '';\n\t\t\t\t\t\tthis.defines.USE_UV = '';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.USE_GLOSSINESSMAP;\n\t\t\t\t\t\tdelete this.defines.USE_UV;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\t\tdelete this.metalness;\n\t\tdelete this.roughness;\n\t\tdelete this.metalnessMap;\n\t\tdelete this.roughnessMap;\n\n\t\tthis.setValues( params );\n\n\t}\n\n\tGLTFMeshStandardSGMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tGLTFMeshStandardSGMaterial.prototype.constructor = GLTFMeshStandardSGMaterial;\n\n\tGLTFMeshStandardSGMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\t\tthis.specularMap = source.specularMap;\n\t\tthis.specular.copy( source.specular );\n\t\tthis.glossinessMap = source.glossinessMap;\n\t\tthis.glossiness = source.glossiness;\n\t\tdelete this.metalness;\n\t\tdelete this.roughness;\n\t\tdelete this.metalnessMap;\n\t\tdelete this.roughnessMap;\n\t\treturn this;\n\n\t};\n\n\tfunction GLTFMaterialsPbrSpecularGlossinessExtension() {\n\n\t\treturn {\n\n\t\t\tname: EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS,\n\n\t\t\tspecularGlossinessParams: [\n\t\t\t\t'color',\n\t\t\t\t'map',\n\t\t\t\t'lightMap',\n\t\t\t\t'lightMapIntensity',\n\t\t\t\t'aoMap',\n\t\t\t\t'aoMapIntensity',\n\t\t\t\t'emissive',\n\t\t\t\t'emissiveIntensity',\n\t\t\t\t'emissiveMap',\n\t\t\t\t'bumpMap',\n\t\t\t\t'bumpScale',\n\t\t\t\t'normalMap',\n\t\t\t\t'normalMapType',\n\t\t\t\t'displacementMap',\n\t\t\t\t'displacementScale',\n\t\t\t\t'displacementBias',\n\t\t\t\t'specularMap',\n\t\t\t\t'specular',\n\t\t\t\t'glossinessMap',\n\t\t\t\t'glossiness',\n\t\t\t\t'alphaMap',\n\t\t\t\t'envMap',\n\t\t\t\t'envMapIntensity',\n\t\t\t\t'refractionRatio',\n\t\t\t],\n\n\t\t\tgetMaterialType: function () {\n\n\t\t\t\treturn GLTFMeshStandardSGMaterial;\n\n\t\t\t},\n\n\t\t\textendParams: function ( materialParams, materialDef, parser ) {\n\n\t\t\t\tvar pbrSpecularGlossiness = materialDef.extensions[ this.name ];\n\n\t\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\t\tvar pending = [];\n\n\t\t\t\tif ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) {\n\n\t\t\t\t\tvar array = pbrSpecularGlossiness.diffuseFactor;\n\n\t\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( pbrSpecularGlossiness.diffuseTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterialParams.emissive = new Color( 0.0, 0.0, 0.0 );\n\t\t\t\tmaterialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0;\n\t\t\t\tmaterialParams.specular = new Color( 1.0, 1.0, 1.0 );\n\n\t\t\t\tif ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) {\n\n\t\t\t\t\tmaterialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor );\n\n\t\t\t\t}\n\n\t\t\t\tif ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) {\n\n\t\t\t\t\tvar specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture;\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) );\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( pending );\n\n\t\t\t},\n\n\t\t\tcreateMaterial: function ( materialParams ) {\n\n\t\t\t\tvar material = new GLTFMeshStandardSGMaterial( materialParams );\n\t\t\t\tmaterial.fog = true;\n\n\t\t\t\tmaterial.color = materialParams.color;\n\n\t\t\t\tmaterial.map = materialParams.map === undefined ? null : materialParams.map;\n\n\t\t\t\tmaterial.lightMap = null;\n\t\t\t\tmaterial.lightMapIntensity = 1.0;\n\n\t\t\t\tmaterial.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap;\n\t\t\t\tmaterial.aoMapIntensity = 1.0;\n\n\t\t\t\tmaterial.emissive = materialParams.emissive;\n\t\t\t\tmaterial.emissiveIntensity = 1.0;\n\t\t\t\tmaterial.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap;\n\n\t\t\t\tmaterial.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap;\n\t\t\t\tmaterial.bumpScale = 1;\n\n\t\t\t\tmaterial.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap;\n\t\t\t\tmaterial.normalMapType = TangentSpaceNormalMap;\n\n\t\t\t\tif ( materialParams.normalScale ) material.normalScale = materialParams.normalScale;\n\n\t\t\t\tmaterial.displacementMap = null;\n\t\t\t\tmaterial.displacementScale = 1;\n\t\t\t\tmaterial.displacementBias = 0;\n\n\t\t\t\tmaterial.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap;\n\t\t\t\tmaterial.specular = materialParams.specular;\n\n\t\t\t\tmaterial.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap;\n\t\t\t\tmaterial.glossiness = materialParams.glossiness;\n\n\t\t\t\tmaterial.alphaMap = null;\n\n\t\t\t\tmaterial.envMap = materialParams.envMap === undefined ? null : materialParams.envMap;\n\t\t\t\tmaterial.envMapIntensity = 1.0;\n\n\t\t\t\tmaterial.refractionRatio = 0.98;\n\n\t\t\t\treturn material;\n\n\t\t\t},\n\n\t\t};\n\n\t}\n\n\t/**\n\t * Mesh Quantization Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n\t */\n\tfunction GLTFMeshQuantizationExtension() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n\t/*********************************/\n\t/********** INTERPOLATION ********/\n\t/*********************************/\n\n\t// Spline Interpolation\n\t// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\n\tfunction GLTFCubicSplineInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tGLTFCubicSplineInterpolant.prototype = Object.create( Interpolant.prototype );\n\tGLTFCubicSplineInterpolant.prototype.constructor = GLTFCubicSplineInterpolant;\n\n\tGLTFCubicSplineInterpolant.prototype.copySampleValue_ = function ( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( var i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t};\n\n\tGLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\n\tGLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\n\tGLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer;\n\t\tvar values = this.sampleValues;\n\t\tvar stride = this.valueSize;\n\n\t\tvar stride2 = stride * 2;\n\t\tvar stride3 = stride * 3;\n\n\t\tvar td = t1 - t0;\n\n\t\tvar p = ( t - t0 ) / td;\n\t\tvar pp = p * p;\n\t\tvar ppp = pp * p;\n\n\t\tvar offset1 = i1 * stride3;\n\t\tvar offset0 = offset1 - stride3;\n\n\t\tvar s2 = - 2 * ppp + 3 * pp;\n\t\tvar s3 = ppp - pp;\n\t\tvar s0 = 1 - s2;\n\t\tvar s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( var i = 0; i !== stride; i ++ ) {\n\n\t\t\tvar p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tvar m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tvar p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tvar m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t};\n\n\t/*********************************/\n\t/********** INTERNALS ************/\n\t/*********************************/\n\n\t/* CONSTANTS */\n\n\tvar WEBGL_CONSTANTS = {\n\t\tFLOAT: 5126,\n\t\t//FLOAT_MAT2: 35674,\n\t\tFLOAT_MAT3: 35675,\n\t\tFLOAT_MAT4: 35676,\n\t\tFLOAT_VEC2: 35664,\n\t\tFLOAT_VEC3: 35665,\n\t\tFLOAT_VEC4: 35666,\n\t\tLINEAR: 9729,\n\t\tREPEAT: 10497,\n\t\tSAMPLER_2D: 35678,\n\t\tPOINTS: 0,\n\t\tLINES: 1,\n\t\tLINE_LOOP: 2,\n\t\tLINE_STRIP: 3,\n\t\tTRIANGLES: 4,\n\t\tTRIANGLE_STRIP: 5,\n\t\tTRIANGLE_FAN: 6,\n\t\tUNSIGNED_BYTE: 5121,\n\t\tUNSIGNED_SHORT: 5123\n\t};\n\n\tvar WEBGL_COMPONENT_TYPES = {\n\t\t5120: Int8Array,\n\t\t5121: Uint8Array,\n\t\t5122: Int16Array,\n\t\t5123: Uint16Array,\n\t\t5125: Uint32Array,\n\t\t5126: Float32Array\n\t};\n\n\tvar WEBGL_FILTERS = {\n\t\t9728: NearestFilter,\n\t\t9729: LinearFilter,\n\t\t9984: NearestMipmapNearestFilter,\n\t\t9985: LinearMipmapNearestFilter,\n\t\t9986: NearestMipmapLinearFilter,\n\t\t9987: LinearMipmapLinearFilter\n\t};\n\n\tvar WEBGL_WRAPPINGS = {\n\t\t33071: ClampToEdgeWrapping,\n\t\t33648: MirroredRepeatWrapping,\n\t\t10497: RepeatWrapping\n\t};\n\n\tvar WEBGL_TYPE_SIZES = {\n\t\t'SCALAR': 1,\n\t\t'VEC2': 2,\n\t\t'VEC3': 3,\n\t\t'VEC4': 4,\n\t\t'MAT2': 4,\n\t\t'MAT3': 9,\n\t\t'MAT4': 16\n\t};\n\n\tvar ATTRIBUTES = {\n\t\tPOSITION: 'position',\n\t\tNORMAL: 'normal',\n\t\tTANGENT: 'tangent',\n\t\tTEXCOORD_0: 'uv',\n\t\tTEXCOORD_1: 'uv2',\n\t\tCOLOR_0: 'color',\n\t\tWEIGHTS_0: 'skinWeight',\n\t\tJOINTS_0: 'skinIndex',\n\t};\n\n\tvar PATH_PROPERTIES = {\n\t\tscale: 'scale',\n\t\ttranslation: 'position',\n\t\trotation: 'quaternion',\n\t\tweights: 'morphTargetInfluences'\n\t};\n\n\tvar INTERPOLATION = {\n\t\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\t\tLINEAR: InterpolateLinear,\n\t\tSTEP: InterpolateDiscrete\n\t};\n\n\tvar ALPHA_MODES = {\n\t\tOPAQUE: 'OPAQUE',\n\t\tMASK: 'MASK',\n\t\tBLEND: 'BLEND'\n\t};\n\n\t/* UTILITY FUNCTIONS */\n\n\tfunction resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n\t */\n\tfunction createDefaultMaterial( cache ) {\n\n\t\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\t\tcolor: 0xFFFFFF,\n\t\t\t\temissive: 0x000000,\n\t\t\t\tmetalness: 1,\n\t\t\t\troughness: 1,\n\t\t\t\ttransparent: false,\n\t\t\t\tdepthTest: true,\n\t\t\t\tside: FrontSide\n\t\t\t} );\n\n\t\t}\n\n\t\treturn cache[ 'DefaultMaterial' ];\n\n\t}\n\n\tfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t\t// Add unknown glTF extensions to an object's userData.\n\n\t\tfor ( var name in objectDef.extensions ) {\n\n\t\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @param {Object3D|Material|BufferGeometry} object\n\t * @param {GLTF.definition} gltfDef\n\t */\n\tfunction assignExtrasToUserData( object, gltfDef ) {\n\n\t\tif ( gltfDef.extras !== undefined ) {\n\n\t\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n\t *\n\t * @param {BufferGeometry} geometry\n\t * @param {Array} targets\n\t * @param {GLTFParser} parser\n\t * @return {Promise}\n\t */\n\tfunction addMorphTargets( geometry, targets, parser ) {\n\n\t\tvar hasMorphPosition = false;\n\t\tvar hasMorphNormal = false;\n\n\t\tfor ( var i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tvar target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\n\t\t\tif ( hasMorphPosition && hasMorphNormal ) break;\n\n\t\t}\n\n\t\tif ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry );\n\n\t\tvar pendingPositionAccessors = [];\n\t\tvar pendingNormalAccessors = [];\n\n\t\tfor ( var i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tvar target = targets[ i ];\n\n\t\t\tif ( hasMorphPosition ) {\n\n\t\t\t\tvar pendingAccessor = target.POSITION !== undefined\n\t\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t\t: geometry.attributes.position;\n\n\t\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t\tif ( hasMorphNormal ) {\n\n\t\t\t\tvar pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t\t: geometry.attributes.normal;\n\n\t\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( [\n\t\t\tPromise.all( pendingPositionAccessors ),\n\t\t\tPromise.all( pendingNormalAccessors )\n\t\t] ).then( function ( accessors ) {\n\n\t\t\tvar morphPositions = accessors[ 0 ];\n\t\t\tvar morphNormals = accessors[ 1 ];\n\n\t\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t\treturn geometry;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * @param {Mesh} mesh\n\t * @param {GLTF.Mesh} meshDef\n\t */\n\tfunction updateMorphTargets( mesh, meshDef ) {\n\n\t\tmesh.updateMorphTargets();\n\n\t\tif ( meshDef.weights !== undefined ) {\n\n\t\t\tfor ( var i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\t\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\t\tvar targetNames = meshDef.extras.targetNames;\n\n\t\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createPrimitiveKey( primitiveDef ) {\n\n\t\tvar dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\t\tvar geometryKey;\n\n\t\tif ( dracoExtension ) {\n\n\t\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t\t} else {\n\n\t\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t\t}\n\n\t\treturn geometryKey;\n\n\t}\n\n\tfunction createAttributesKey( attributes ) {\n\n\t\tvar attributesKey = '';\n\n\t\tvar keys = Object.keys( attributes ).sort();\n\n\t\tfor ( var i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t\t}\n\n\t\treturn attributesKey;\n\n\t}\n\n\t/* GLTF PARSER */\n\n\tfunction GLTFParser( json, options ) {\n\n\t\tthis.json = json || {};\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options || {};\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\t\tif ( typeof createImageBitmap !== 'undefined' && /Firefox/.test( navigator.userAgent ) === false ) {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tGLTFParser.prototype.setExtensions = function ( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t};\n\n\tGLTFParser.prototype.setPlugins = function ( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t};\n\n\tGLTFParser.prototype.parse = function ( onLoad, onError ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( [\n\n\t\t\tthis.getDependencies( 'scene' ),\n\t\t\tthis.getDependencies( 'animation' ),\n\t\t\tthis.getDependencies( 'camera' ),\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tvar result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\tonLoad( result );\n\n\t\t} ).catch( onError );\n\n\t};\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\tGLTFParser.prototype._markDefs = function () {\n\n\t\tvar nodeDefs = this.json.nodes || [];\n\t\tvar skinDefs = this.json.skins || [];\n\t\tvar meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( var skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tvar joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( var i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tvar nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t */\n\tGLTFParser.prototype._addNodeRef = function ( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t};\n\n\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\tGLTFParser.prototype._getNodeRef = function ( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tvar ref = object.clone();\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t};\n\n\tGLTFParser.prototype._invokeOne = function ( func ) {\n\n\t\tvar extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( var i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tvar result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t};\n\n\tGLTFParser.prototype._invokeAll = function ( func ) {\n\n\t\tvar extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tvar pending = [];\n\n\t\tfor ( var i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tvar result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t};\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.getDependency = function ( type, index ) {\n\n\t\tvar cacheKey = type + ':' + index;\n\t\tvar dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this.loadNode( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this.loadAnimation( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t};\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise>}\n\t */\n\tGLTFParser.prototype.getDependencies = function ( type ) {\n\n\t\tvar dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tvar parser = this;\n\t\t\tvar defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadBuffer = function ( bufferIndex ) {\n\n\t\tvar bufferDef = this.json.buffers[ bufferIndex ];\n\t\tvar loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tvar options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadBufferView = function ( bufferViewIndex ) {\n\n\t\tvar bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tvar byteLength = bufferViewDef.byteLength || 0;\n\t\t\tvar byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadAccessor = function ( accessorIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\n\t\tvar accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\t// Ignore empty accessors, which may be used to declare runtime\n\t\t\t// information about attributes coming from another source (e.g. Draco\n\t\t\t// compression extension).\n\t\t\treturn Promise.resolve( null );\n\n\t\t}\n\n\t\tvar pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tvar bufferView = bufferViews[ 0 ];\n\n\t\t\tvar itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tvar TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tvar elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tvar itemBytes = elementBytes * itemSize;\n\t\t\tvar byteOffset = accessorDef.byteOffset || 0;\n\t\t\tvar byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tvar normalized = accessorDef.normalized === true;\n\t\t\tvar array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tvar ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tvar ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tvar ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tvar itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tvar TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tvar byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tvar byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tvar sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tvar sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadTexture = function ( textureIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar options = this.options;\n\n\t\tvar textureDef = json.textures[ textureIndex ];\n\n\t\tvar textureExtensions = textureDef.extensions || {};\n\n\t\tvar source;\n\n\t\tif ( textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ] ) {\n\n\t\t\tsource = json.images[ textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].source ];\n\n\t\t} else {\n\n\t\t\tsource = json.images[ textureDef.source ];\n\n\t\t}\n\n\t\tvar loader;\n\n\t\tif ( source.uri ) {\n\n\t\t\tloader = options.manager.getHandler( source.uri );\n\n\t\t}\n\n\t\tif ( ! loader ) {\n\n\t\t\tloader = textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ]\n\t\t\t\t? parser.extensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].ddsLoader\n\t\t\t\t: this.textureLoader;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, source, loader );\n\n\t};\n\n\tGLTFParser.prototype.loadTextureImage = function ( textureIndex, source, loader ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar options = this.options;\n\n\t\tvar textureDef = json.textures[ textureIndex ];\n\n\t\tvar URL = self.URL || self.webkitURL;\n\n\t\tvar sourceURI = source.uri;\n\t\tvar isObjectURL = false;\n\t\tvar hasAlpha = true;\n\n\t\tif ( source.mimeType === 'image/jpeg' ) hasAlpha = false;\n\n\t\tif ( source.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tif ( source.mimeType === 'image/png' ) {\n\n\t\t\t\t\t// Inspect the PNG 'IHDR' chunk to determine whether the image could have an\n\t\t\t\t\t// alpha channel. This check is conservative — the image could have an alpha\n\t\t\t\t\t// channel with all values == 1, and the indexed type (colorType == 3) only\n\t\t\t\t\t// sometimes contains alpha.\n\t\t\t\t\t//\n\t\t\t\t\t// https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header\n\t\t\t\t\tvar colorType = new DataView( bufferView, 25, 1 ).getUint8( 0, false );\n\t\t\t\t\thasAlpha = colorType === 6 || colorType === 4 || colorType === 3;\n\n\t\t\t\t}\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tvar blob = new Blob( [ bufferView ], { type: source.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tvar onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tresolve( new CanvasTexture( imageBitmap ) );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( textureDef.name ) texture.name = textureDef.name;\n\n\t\t\t// When there is definitely no alpha channel in the texture, set RGBFormat to save space.\n\t\t\tif ( ! hasAlpha ) texture.format = RGBFormat;\n\n\t\t\tvar samplers = json.samplers || {};\n\t\t\tvar sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\n\t\t\tparser.associations.set( texture, {\n\t\t\t\ttype: 'textures',\n\t\t\t\tindex: textureIndex\n\t\t\t} );\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.assignTexture = function ( materialParams, mapName, mapDef ) {\n\n\t\tvar parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\t// Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured\n\t\t\t// However, we will copy UV set 0 to UV set 1 on demand for aoMap\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' );\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tvar transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tvar gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accomodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tGLTFParser.prototype.assignFinalMaterial = function ( mesh ) {\n\n\t\tvar geometry = mesh.geometry;\n\t\tvar material = mesh.material;\n\n\t\tvar useVertexTangents = geometry.attributes.tangent !== undefined;\n\t\tvar useVertexColors = geometry.attributes.color !== undefined;\n\t\tvar useFlatShading = geometry.attributes.normal === undefined;\n\t\tvar useSkinning = mesh.isSkinnedMesh === true;\n\t\tvar useMorphTargets = Object.keys( geometry.morphAttributes ).length > 0;\n\t\tvar useMorphNormals = useMorphTargets && geometry.morphAttributes.normal !== undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tvar cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tvar pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tvar cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tvar lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useVertexTangents || useVertexColors || useFlatShading || useSkinning || useMorphTargets ) {\n\n\t\t\tvar cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:';\n\t\t\tif ( useSkinning ) cacheKey += 'skinning:';\n\t\t\tif ( useVertexTangents ) cacheKey += 'vertex-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\t\t\tif ( useMorphTargets ) cacheKey += 'morph-targets:';\n\t\t\tif ( useMorphNormals ) cacheKey += 'morph-normals:';\n\n\t\t\tvar cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useSkinning ) cachedMaterial.skinning = true;\n\t\t\t\tif ( useVertexTangents ) cachedMaterial.vertexTangents = true;\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\t\t\t\tif ( useMorphTargets ) cachedMaterial.morphTargets = true;\n\t\t\t\tif ( useMorphNormals ) cachedMaterial.morphNormals = true;\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\t// workarounds for mesh and geometry\n\n\t\tif ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) {\n\n\t\t\tgeometry.setAttribute( 'uv2', geometry.attributes.uv );\n\n\t\t}\n\n\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\tif ( material.normalScale && ! useVertexTangents ) {\n\n\t\t\tmaterial.normalScale.y = - material.normalScale.y;\n\n\t\t}\n\n\t\tif ( material.clearcoatNormalScale && ! useVertexTangents ) {\n\n\t\t\tmaterial.clearcoatNormalScale.y = - material.clearcoatNormalScale.y;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t};\n\n\tGLTFParser.prototype.getMaterialType = function ( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadMaterial = function ( materialIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar extensions = this.extensions;\n\t\tvar materialDef = json.materials[ materialIndex ];\n\n\t\tvar materialType;\n\t\tvar materialParams = {};\n\t\tvar materialExtensions = materialDef.extensions || {};\n\n\t\tvar pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) {\n\n\t\t\tvar sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ];\n\t\t\tmaterialType = sgExtension.getMaterialType();\n\t\t\tpending.push( sgExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tvar kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tvar metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tvar array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tvar alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tmaterialParams.normalScale.set( materialDef.normalTexture.scale, materialDef.normalTexture.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tmaterialParams.emissive = new Color().fromArray( materialDef.emissiveFactor );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tvar material;\n\n\t\t\tif ( materialType === GLTFMeshStandardSGMaterial ) {\n\n\t\t\t\tmaterial = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams );\n\n\t\t\t} else {\n\n\t\t\t\tmaterial = new materialType( materialParams );\n\n\t\t\t}\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\t// baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding.\n\t\t\tif ( material.map ) material.map.encoding = sRGBEncoding;\n\t\t\tif ( material.emissiveMap ) material.emissiveMap.encoding = sRGBEncoding;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { type: 'materials', index: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t};\n\n\t/** When Object3D instances are targeted by animation, they need unique names. */\n\tGLTFParser.prototype.createUniqueName = function ( originalName ) {\n\n\t\tvar sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tvar name = sanitizedName;\n\n\t\tfor ( var i = 1; this.nodeNamesUsed[ name ]; ++ i ) {\n\n\t\t\tname = sanitizedName + '_' + i;\n\n\t\t}\n\n\t\tthis.nodeNamesUsed[ name ] = true;\n\n\t\treturn name;\n\n\t};\n\n\t/**\n\t * @param {BufferGeometry} geometry\n\t * @param {GLTF.Primitive} primitiveDef\n\t * @param {GLTFParser} parser\n\t */\n\tfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\t\tvar attributes = primitiveDef.attributes;\n\n\t\tvar box = new Box3();\n\n\t\tif ( attributes.POSITION !== undefined ) {\n\n\t\t\tvar accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\t\tvar min = accessor.min;\n\t\t\tvar max = accessor.max;\n\n\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\tbox.set(\n\t\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar targets = primitiveDef.targets;\n\n\t\tif ( targets !== undefined ) {\n\n\t\t\tvar maxDisplacement = new Vector3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\tfor ( var i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\t\tvar target = targets[ i ];\n\n\t\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\t\tvar accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\t\tvar min = accessor.min;\n\t\t\t\t\tvar max = accessor.max;\n\n\t\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\t\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\t\tbox.expandByVector( maxDisplacement );\n\n\t\t}\n\n\t\tgeometry.boundingBox = box;\n\n\t\tvar sphere = new Sphere();\n\n\t\tbox.getCenter( sphere.center );\n\t\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\t\tgeometry.boundingSphere = sphere;\n\n\t}\n\n\t/**\n\t * @param {BufferGeometry} geometry\n\t * @param {GLTF.Primitive} primitiveDef\n\t * @param {GLTFParser} parser\n\t * @return {Promise}\n\t */\n\tfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\t\tvar attributes = primitiveDef.attributes;\n\n\t\tvar pending = [];\n\n\t\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t\t.then( function ( accessor ) {\n\n\t\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tfor ( var gltfAttributeName in attributes ) {\n\n\t\t\tvar threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t\t}\n\n\t\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\t\tvar accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\t\tgeometry.setIndex( accessor );\n\n\t\t\t} );\n\n\t\t\tpending.push( accessor );\n\n\t\t}\n\n\t\tassignExtrasToUserData( geometry, primitiveDef );\n\n\t\tcomputeBounds( geometry, primitiveDef, parser );\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\treturn primitiveDef.targets !== undefined\n\t\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t\t: geometry;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * @param {BufferGeometry} geometry\n\t * @param {Number} drawMode\n\t * @return {BufferGeometry}\n\t */\n\tfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\t\tvar index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tvar indices = [];\n\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( var i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tvar numberOfTriangles = index.count - 2;\n\t\tvar newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( var i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( var i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tvar newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\n\t\treturn newGeometry;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array} primitives\n\t * @return {Promise>}\n\t */\n\tGLTFParser.prototype.loadGeometries = function ( primitives ) {\n\n\t\tvar parser = this;\n\t\tvar extensions = this.extensions;\n\t\tvar cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tvar pending = [];\n\n\t\tfor ( var i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tvar primitive = primitives[ i ];\n\t\t\tvar cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tvar cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tvar geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadMesh = function ( meshIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar extensions = this.extensions;\n\n\t\tvar meshDef = json.meshes[ meshIndex ];\n\t\tvar primitives = meshDef.primitives;\n\n\t\tvar pending = [];\n\n\t\tfor ( var i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tvar material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tvar materials = results.slice( 0, results.length - 1 );\n\t\t\tvar geometries = results[ results.length - 1 ];\n\n\t\t\tvar meshes = [];\n\n\t\t\tfor ( var i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tvar geometry = geometries[ i ];\n\t\t\t\tvar primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tvar mesh;\n\n\t\t\t\tvar material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) {\n\n\t\t\t\t\t\t// we normalize floating point skin weight array to fix malformed assets (see #15319)\n\t\t\t\t\t\t// it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadCamera = function ( cameraIndex ) {\n\n\t\tvar camera;\n\t\tvar cameraDef = this.json.cameras[ cameraIndex ];\n\t\tvar params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadSkin = function ( skinIndex ) {\n\n\t\tvar skinDef = this.json.skins[ skinIndex ];\n\n\t\tvar skinEntry = { joints: skinDef.joints };\n\n\t\tif ( skinDef.inverseBindMatrices === undefined ) {\n\n\t\t\treturn Promise.resolve( skinEntry );\n\n\t\t}\n\n\t\treturn this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) {\n\n\t\t\tskinEntry.inverseBindMatrices = accessor;\n\n\t\t\treturn skinEntry;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadAnimation = function ( animationIndex ) {\n\n\t\tvar json = this.json;\n\n\t\tvar animationDef = json.animations[ animationIndex ];\n\n\t\tvar pendingNodes = [];\n\t\tvar pendingInputAccessors = [];\n\t\tvar pendingOutputAccessors = [];\n\t\tvar pendingSamplers = [];\n\t\tvar pendingTargets = [];\n\n\t\tfor ( var i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tvar channel = animationDef.channels[ i ];\n\t\t\tvar sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tvar target = channel.target;\n\t\t\tvar name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated.\n\t\t\tvar input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tvar output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tvar nodes = dependencies[ 0 ];\n\t\t\tvar inputAccessors = dependencies[ 1 ];\n\t\t\tvar outputAccessors = dependencies[ 2 ];\n\t\t\tvar samplers = dependencies[ 3 ];\n\t\t\tvar targets = dependencies[ 4 ];\n\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tvar node = nodes[ i ];\n\t\t\t\tvar inputAccessor = inputAccessors[ i ];\n\t\t\t\tvar outputAccessor = outputAccessors[ i ];\n\t\t\t\tvar sampler = samplers[ i ];\n\t\t\t\tvar target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tnode.updateMatrix();\n\t\t\t\tnode.matrixAutoUpdate = true;\n\n\t\t\t\tvar TypedKeyframeTrack;\n\n\t\t\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PATH_PROPERTIES.position:\n\t\t\t\t\tcase PATH_PROPERTIES.scale:\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tvar targetName = node.name ? node.name : node.uuid;\n\n\t\t\t\tvar interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\t\t\t\tvar targetNames = [];\n\n\t\t\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\t\t\t// Node may be a Group (glTF mesh with several primitives) or a Mesh.\n\t\t\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\t\t\tif ( object.isMesh === true && object.morphTargetInfluences ) {\n\n\t\t\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttargetNames.push( targetName );\n\n\t\t\t\t}\n\n\t\t\t\tvar outputArray = outputAccessor.array;\n\n\t\t\t\tif ( outputAccessor.normalized ) {\n\n\t\t\t\t\tvar scale;\n\n\t\t\t\t\tif ( outputArray.constructor === Int8Array ) {\n\n\t\t\t\t\t\tscale = 1 / 127;\n\n\t\t\t\t\t} else if ( outputArray.constructor === Uint8Array ) {\n\n\t\t\t\t\t\tscale = 1 / 255;\n\n\t\t\t\t\t} else if ( outputArray.constructor == Int16Array ) {\n\n\t\t\t\t\t\tscale = 1 / 32767;\n\n\t\t\t\t\t} else if ( outputArray.constructor === Uint16Array ) {\n\n\t\t\t\t\t\tscale = 1 / 65535;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported output accessor component type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar scaled = new Float32Array( outputArray.length );\n\n\t\t\t\t\tfor ( var j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t\t\t}\n\n\t\t\t\t\toutputArray = scaled;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar track = new TypedKeyframeTrack(\n\t\t\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\t\t\tinputAccessor.array,\n\t\t\t\t\t\toutputArray,\n\t\t\t\t\t\tinterpolation\n\t\t\t\t\t);\n\n\t\t\t\t\t// Override interpolation with custom factory method.\n\t\t\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\t\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t\t\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t\t\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t\t\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\t\t\t\t\treturn new GLTFCubicSplineInterpolant( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\t\t\t\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( track );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar name = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\t\treturn new AnimationClip( name, undefined, tracks );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadNode = function ( nodeIndex ) {\n\n\t\tvar json = this.json;\n\t\tvar extensions = this.extensions;\n\t\tvar parser = this;\n\n\t\tvar nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tvar nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\treturn ( function () {\n\n\t\t\tvar pending = [];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tpending.push( parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\t\t\tvar node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\t\t\tfor ( var i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn node;\n\n\t\t\t\t} ) );\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t\t} ) );\n\n\t\t\t}\n\n\t\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t\t} ).forEach( function ( promise ) {\n\n\t\t\t\tpending.push( promise );\n\n\t\t\t} );\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}() ).then( function ( objects ) {\n\n\t\t\tvar node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( var i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tvar matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tparser.associations.set( node, { type: 'nodes', index: nodeIndex } );\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadScene = function () {\n\n\t\t// scene node hierachy builder\n\n\t\tfunction buildNodeHierachy( nodeId, parentObject, json, parser ) {\n\n\t\t\tvar nodeDef = json.nodes[ nodeId ];\n\n\t\t\treturn parser.getDependency( 'node', nodeId ).then( function ( node ) {\n\n\t\t\t\tif ( nodeDef.skin === undefined ) return node;\n\n\t\t\t\t// build skeleton here as well\n\n\t\t\t\tvar skinEntry;\n\n\t\t\t\treturn parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) {\n\n\t\t\t\t\tskinEntry = skin;\n\n\t\t\t\t\tvar pendingJoints = [];\n\n\t\t\t\t\tfor ( var i = 0, il = skinEntry.joints.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tpendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Promise.all( pendingJoints );\n\n\t\t\t\t} ).then( function ( jointNodes ) {\n\n\t\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\t\tif ( ! mesh.isMesh ) return;\n\n\t\t\t\t\t\tvar bones = [];\n\t\t\t\t\t\tvar boneInverses = [];\n\n\t\t\t\t\t\tfor ( var j = 0, jl = jointNodes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tvar jointNode = jointNodes[ j ];\n\n\t\t\t\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\t\t\t\tvar mat = new Matrix4();\n\n\t\t\t\t\t\t\t\tif ( skinEntry.inverseBindMatrices !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tmat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinEntry.joints[ j ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmesh.bind( new Skeleton( bones, boneInverses ), mesh.matrixWorld );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn node;\n\n\t\t\t\t} );\n\n\t\t\t} ).then( function ( node ) {\n\n\t\t\t\t// build node hierachy\n\n\t\t\t\tparentObject.add( node );\n\n\t\t\t\tvar pending = [];\n\n\t\t\t\tif ( nodeDef.children ) {\n\n\t\t\t\t\tvar children = nodeDef.children;\n\n\t\t\t\t\tfor ( var i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar child = children[ i ];\n\t\t\t\t\t\tpending.push( buildNodeHierachy( child, node, json, parser ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( pending );\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn function loadScene( sceneIndex ) {\n\n\t\t\tvar json = this.json;\n\t\t\tvar extensions = this.extensions;\n\t\t\tvar sceneDef = this.json.scenes[ sceneIndex ];\n\t\t\tvar parser = this;\n\n\t\t\t// Loader returns Group, not Scene.\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\t\tvar scene = new Group();\n\t\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\t\tvar nodeIds = sceneDef.nodes || [];\n\n\t\t\tvar pending = [];\n\n\t\t\tfor ( var i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\t\tpending.push( buildNodeHierachy( nodeIds[ i ], scene, json, parser ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\t\treturn scene;\n\n\t\t\t} );\n\n\t\t};\n\n\t}();\n\n\treturn GLTFLoader;\n\n} )();\n\nexport { GLTFLoader };\n","/**\n * @webxr-input-profiles/motion-controllers 1.0.0 https://github.com/immersive-web/webxr-input-profiles\n */\n\nconst Constants = {\n Handedness: Object.freeze({\n NONE: 'none',\n LEFT: 'left',\n RIGHT: 'right'\n }),\n\n ComponentState: Object.freeze({\n DEFAULT: 'default',\n TOUCHED: 'touched',\n PRESSED: 'pressed'\n }),\n\n ComponentProperty: Object.freeze({\n BUTTON: 'button',\n X_AXIS: 'xAxis',\n Y_AXIS: 'yAxis',\n STATE: 'state'\n }),\n\n ComponentType: Object.freeze({\n TRIGGER: 'trigger',\n SQUEEZE: 'squeeze',\n TOUCHPAD: 'touchpad',\n THUMBSTICK: 'thumbstick',\n BUTTON: 'button'\n }),\n\n ButtonTouchThreshold: 0.05,\n\n AxisTouchThreshold: 0.1,\n\n VisualResponseProperty: Object.freeze({\n TRANSFORM: 'transform',\n VISIBILITY: 'visibility'\n })\n};\n\n/**\n * @description Static helper function to fetch a JSON file and turn it into a JS object\n * @param {string} path - Path to JSON file to be fetched\n */\nasync function fetchJsonFile(path) {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(response.statusText);\n } else {\n return response.json();\n }\n}\n\nasync function fetchProfilesList(basePath) {\n if (!basePath) {\n throw new Error('No basePath supplied');\n }\n\n const profileListFileName = 'profilesList.json';\n const profilesList = await fetchJsonFile(`${basePath}/${profileListFileName}`);\n return profilesList;\n}\n\nasync function fetchProfile(xrInputSource, basePath, defaultProfile = null, getAssetPath = true) {\n if (!xrInputSource) {\n throw new Error('No xrInputSource supplied');\n }\n\n if (!basePath) {\n throw new Error('No basePath supplied');\n }\n\n // Get the list of profiles\n const supportedProfilesList = await fetchProfilesList(basePath);\n\n // Find the relative path to the first requested profile that is recognized\n let match;\n xrInputSource.profiles.some((profileId) => {\n const supportedProfile = supportedProfilesList[profileId];\n if (supportedProfile) {\n match = {\n profileId,\n profilePath: `${basePath}/${supportedProfile.path}`,\n deprecated: !!supportedProfile.deprecated\n };\n }\n return !!match;\n });\n\n if (!match) {\n if (!defaultProfile) {\n throw new Error('No matching profile name found');\n }\n\n const supportedProfile = supportedProfilesList[defaultProfile];\n if (!supportedProfile) {\n throw new Error(`No matching profile name found and default profile \"${defaultProfile}\" missing.`);\n }\n\n match = {\n profileId: defaultProfile,\n profilePath: `${basePath}/${supportedProfile.path}`,\n deprecated: !!supportedProfile.deprecated\n };\n }\n\n const profile = await fetchJsonFile(match.profilePath);\n\n let assetPath;\n if (getAssetPath) {\n let layout;\n if (xrInputSource.handedness === 'any') {\n layout = profile.layouts[Object.keys(profile.layouts)[0]];\n } else {\n layout = profile.layouts[xrInputSource.handedness];\n }\n if (!layout) {\n throw new Error(\n `No matching handedness, ${xrInputSource.handedness}, in profile ${match.profileId}`\n );\n }\n\n if (layout.assetPath) {\n assetPath = match.profilePath.replace('profile.json', layout.assetPath);\n }\n }\n\n return { profile, assetPath };\n}\n\n/** @constant {Object} */\nconst defaultComponentValues = {\n xAxis: 0,\n yAxis: 0,\n button: 0,\n state: Constants.ComponentState.DEFAULT\n};\n\n/**\n * @description Converts an X, Y coordinate from the range -1 to 1 (as reported by the Gamepad\n * API) to the range 0 to 1 (for interpolation). Also caps the X, Y values to be bounded within\n * a circle. This ensures that thumbsticks are not animated outside the bounds of their physical\n * range of motion and touchpads do not report touch locations off their physical bounds.\n * @param {number} x The original x coordinate in the range -1 to 1\n * @param {number} y The original y coordinate in the range -1 to 1\n */\nfunction normalizeAxes(x = 0, y = 0) {\n let xAxis = x;\n let yAxis = y;\n\n // Determine if the point is outside the bounds of the circle\n // and, if so, place it on the edge of the circle\n const hypotenuse = Math.sqrt((x * x) + (y * y));\n if (hypotenuse > 1) {\n const theta = Math.atan2(y, x);\n xAxis = Math.cos(theta);\n yAxis = Math.sin(theta);\n }\n\n // Scale and move the circle so values are in the interpolation range. The circle's origin moves\n // from (0, 0) to (0.5, 0.5). The circle's radius scales from 1 to be 0.5.\n const result = {\n normalizedXAxis: (xAxis * 0.5) + 0.5,\n normalizedYAxis: (yAxis * 0.5) + 0.5\n };\n return result;\n}\n\n/**\n * Contains the description of how the 3D model should visually respond to a specific user input.\n * This is accomplished by initializing the object with the name of a node in the 3D model and\n * property that need to be modified in response to user input, the name of the nodes representing\n * the allowable range of motion, and the name of the input which triggers the change. In response\n * to the named input changing, this object computes the appropriate weighting to use for\n * interpolating between the range of motion nodes.\n */\nclass VisualResponse {\n constructor(visualResponseDescription) {\n this.componentProperty = visualResponseDescription.componentProperty;\n this.states = visualResponseDescription.states;\n this.valueNodeName = visualResponseDescription.valueNodeName;\n this.valueNodeProperty = visualResponseDescription.valueNodeProperty;\n\n if (this.valueNodeProperty === Constants.VisualResponseProperty.TRANSFORM) {\n this.minNodeName = visualResponseDescription.minNodeName;\n this.maxNodeName = visualResponseDescription.maxNodeName;\n }\n\n // Initializes the response's current value based on default data\n this.value = 0;\n this.updateFromComponent(defaultComponentValues);\n }\n\n /**\n * Computes the visual response's interpolation weight based on component state\n * @param {Object} componentValues - The component from which to update\n * @param {number} xAxis - The reported X axis value of the component\n * @param {number} yAxis - The reported Y axis value of the component\n * @param {number} button - The reported value of the component's button\n * @param {string} state - The component's active state\n */\n updateFromComponent({\n xAxis, yAxis, button, state\n }) {\n const { normalizedXAxis, normalizedYAxis } = normalizeAxes(xAxis, yAxis);\n switch (this.componentProperty) {\n case Constants.ComponentProperty.X_AXIS:\n this.value = (this.states.includes(state)) ? normalizedXAxis : 0.5;\n break;\n case Constants.ComponentProperty.Y_AXIS:\n this.value = (this.states.includes(state)) ? normalizedYAxis : 0.5;\n break;\n case Constants.ComponentProperty.BUTTON:\n this.value = (this.states.includes(state)) ? button : 0;\n break;\n case Constants.ComponentProperty.STATE:\n if (this.valueNodeProperty === Constants.VisualResponseProperty.VISIBILITY) {\n this.value = (this.states.includes(state));\n } else {\n this.value = this.states.includes(state) ? 1.0 : 0.0;\n }\n break;\n default:\n throw new Error(`Unexpected visualResponse componentProperty ${this.componentProperty}`);\n }\n }\n}\n\nclass Component {\n /**\n * @param {Object} componentId - Id of the component\n * @param {Object} componentDescription - Description of the component to be created\n */\n constructor(componentId, componentDescription) {\n if (!componentId\n || !componentDescription\n || !componentDescription.visualResponses\n || !componentDescription.gamepadIndices\n || Object.keys(componentDescription.gamepadIndices).length === 0) {\n throw new Error('Invalid arguments supplied');\n }\n\n this.id = componentId;\n this.type = componentDescription.type;\n this.rootNodeName = componentDescription.rootNodeName;\n this.touchPointNodeName = componentDescription.touchPointNodeName;\n\n // Build all the visual responses for this component\n this.visualResponses = {};\n Object.keys(componentDescription.visualResponses).forEach((responseName) => {\n const visualResponse = new VisualResponse(componentDescription.visualResponses[responseName]);\n this.visualResponses[responseName] = visualResponse;\n });\n\n // Set default values\n this.gamepadIndices = Object.assign({}, componentDescription.gamepadIndices);\n\n this.values = {\n state: Constants.ComponentState.DEFAULT,\n button: (this.gamepadIndices.button !== undefined) ? 0 : undefined,\n xAxis: (this.gamepadIndices.xAxis !== undefined) ? 0 : undefined,\n yAxis: (this.gamepadIndices.yAxis !== undefined) ? 0 : undefined\n };\n }\n\n get data() {\n const data = { id: this.id, ...this.values };\n return data;\n }\n\n /**\n * @description Poll for updated data based on current gamepad state\n * @param {Object} gamepad - The gamepad object from which the component data should be polled\n */\n updateFromGamepad(gamepad) {\n // Set the state to default before processing other data sources\n this.values.state = Constants.ComponentState.DEFAULT;\n\n // Get and normalize button\n if (this.gamepadIndices.button !== undefined\n && gamepad.buttons.length > this.gamepadIndices.button) {\n const gamepadButton = gamepad.buttons[this.gamepadIndices.button];\n this.values.button = gamepadButton.value;\n this.values.button = (this.values.button < 0) ? 0 : this.values.button;\n this.values.button = (this.values.button > 1) ? 1 : this.values.button;\n\n // Set the state based on the button\n if (gamepadButton.pressed || this.values.button === 1) {\n this.values.state = Constants.ComponentState.PRESSED;\n } else if (gamepadButton.touched || this.values.button > Constants.ButtonTouchThreshold) {\n this.values.state = Constants.ComponentState.TOUCHED;\n }\n }\n\n // Get and normalize x axis value\n if (this.gamepadIndices.xAxis !== undefined\n && gamepad.axes.length > this.gamepadIndices.xAxis) {\n this.values.xAxis = gamepad.axes[this.gamepadIndices.xAxis];\n this.values.xAxis = (this.values.xAxis < -1) ? -1 : this.values.xAxis;\n this.values.xAxis = (this.values.xAxis > 1) ? 1 : this.values.xAxis;\n\n // If the state is still default, check if the xAxis makes it touched\n if (this.values.state === Constants.ComponentState.DEFAULT\n && Math.abs(this.values.xAxis) > Constants.AxisTouchThreshold) {\n this.values.state = Constants.ComponentState.TOUCHED;\n }\n }\n\n // Get and normalize Y axis value\n if (this.gamepadIndices.yAxis !== undefined\n && gamepad.axes.length > this.gamepadIndices.yAxis) {\n this.values.yAxis = gamepad.axes[this.gamepadIndices.yAxis];\n this.values.yAxis = (this.values.yAxis < -1) ? -1 : this.values.yAxis;\n this.values.yAxis = (this.values.yAxis > 1) ? 1 : this.values.yAxis;\n\n // If the state is still default, check if the yAxis makes it touched\n if (this.values.state === Constants.ComponentState.DEFAULT\n && Math.abs(this.values.yAxis) > Constants.AxisTouchThreshold) {\n this.values.state = Constants.ComponentState.TOUCHED;\n }\n }\n\n // Update the visual response weights based on the current component data\n Object.values(this.visualResponses).forEach((visualResponse) => {\n visualResponse.updateFromComponent(this.values);\n });\n }\n}\n\n/**\n * @description Builds a motion controller with components and visual responses based on the\n * supplied profile description. Data is polled from the xrInputSource's gamepad.\n * @author Nell Waliczek / https://github.com/NellWaliczek\n*/\nclass MotionController {\n /**\n * @param {Object} xrInputSource - The XRInputSource to build the MotionController around\n * @param {Object} profile - The best matched profile description for the supplied xrInputSource\n * @param {Object} assetUrl\n */\n constructor(xrInputSource, profile, assetUrl) {\n if (!xrInputSource) {\n throw new Error('No xrInputSource supplied');\n }\n\n if (!profile) {\n throw new Error('No profile supplied');\n }\n\n this.xrInputSource = xrInputSource;\n this.assetUrl = assetUrl;\n this.id = profile.profileId;\n\n // Build child components as described in the profile description\n this.layoutDescription = profile.layouts[xrInputSource.handedness];\n this.components = {};\n Object.keys(this.layoutDescription.components).forEach((componentId) => {\n const componentDescription = this.layoutDescription.components[componentId];\n this.components[componentId] = new Component(componentId, componentDescription);\n });\n\n // Initialize components based on current gamepad state\n this.updateFromGamepad();\n }\n\n get gripSpace() {\n return this.xrInputSource.gripSpace;\n }\n\n get targetRaySpace() {\n return this.xrInputSource.targetRaySpace;\n }\n\n /**\n * @description Returns a subset of component data for simplified debugging\n */\n get data() {\n const data = [];\n Object.values(this.components).forEach((component) => {\n data.push(component.data);\n });\n return data;\n }\n\n /**\n * @description Poll for updated data based on current gamepad state\n */\n updateFromGamepad() {\n Object.values(this.components).forEach((component) => {\n component.updateFromGamepad(this.xrInputSource.gamepad);\n });\n }\n}\n\nexport { Constants, MotionController, fetchProfile, fetchProfilesList };\n","import {\n\tMesh,\n\tMeshBasicMaterial,\n\tObject3D,\n\tQuaternion,\n\tSphereBufferGeometry,\n} from '../build/three.module.js';\n\nimport { GLTFLoader } from '../loaders/GLTFLoader.js';\n\nimport {\n\tConstants as MotionControllerConstants,\n\tfetchProfile,\n\tMotionController\n} from '../libs/motion-controllers.module.js';\n\nconst DEFAULT_PROFILES_PATH = 'https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles';\nconst DEFAULT_PROFILE = 'generic-trigger';\n\nfunction XRControllerModel( ) {\n\n\tObject3D.call( this );\n\n\tthis.motionController = null;\n\tthis.envMap = null;\n\n}\n\nXRControllerModel.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: XRControllerModel,\n\n\tsetEnvironmentMap: function ( envMap ) {\n\n\t\tif ( this.envMap == envMap ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.envMap = envMap;\n\t\tthis.traverse( ( child ) => {\n\n\t\t\tif ( child.isMesh ) {\n\n\t\t\t\tchild.material.envMap = this.envMap;\n\t\t\t\tchild.material.needsUpdate = true;\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn this;\n\n\t},\n\n\t/**\n\t * Polls data from the XRInputSource and updates the model's components to match\n\t * the real world data\n\t */\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\tif ( ! this.motionController ) return;\n\n\t\t// Cause the MotionController to poll the Gamepad for data\n\t\tthis.motionController.updateFromGamepad();\n\n\t\t// Update the 3D model to reflect the button, thumbstick, and touchpad state\n\t\tObject.values( this.motionController.components ).forEach( ( component ) => {\n\n\t\t\t// Update node data based on the visual responses' current states\n\t\t\tObject.values( component.visualResponses ).forEach( ( visualResponse ) => {\n\n\t\t\t\tconst { valueNode, minNode, maxNode, value, valueNodeProperty } = visualResponse;\n\n\t\t\t\t// Skip if the visual response node is not found. No error is needed,\n\t\t\t\t// because it will have been reported at load time.\n\t\t\t\tif ( ! valueNode ) return;\n\n\t\t\t\t// Calculate the new properties based on the weight supplied\n\t\t\t\tif ( valueNodeProperty === MotionControllerConstants.VisualResponseProperty.VISIBILITY ) {\n\n\t\t\t\t\tvalueNode.visible = value;\n\n\t\t\t\t} else if ( valueNodeProperty === MotionControllerConstants.VisualResponseProperty.TRANSFORM ) {\n\n\t\t\t\t\tQuaternion.slerp(\n\t\t\t\t\t\tminNode.quaternion,\n\t\t\t\t\t\tmaxNode.quaternion,\n\t\t\t\t\t\tvalueNode.quaternion,\n\t\t\t\t\t\tvalue\n\t\t\t\t\t);\n\n\t\t\t\t\tvalueNode.position.lerpVectors(\n\t\t\t\t\t\tminNode.position,\n\t\t\t\t\t\tmaxNode.position,\n\t\t\t\t\t\tvalue\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n} );\n\n/**\n * Walks the model's tree to find the nodes needed to animate the components and\n * saves them to the motionContoller components for use in the frame loop. When\n * touchpads are found, attaches a touch dot to them.\n */\nfunction findNodes( motionController, scene ) {\n\n\t// Loop through the components and find the nodes needed for each components' visual responses\n\tObject.values( motionController.components ).forEach( ( component ) => {\n\n\t\tconst { type, touchPointNodeName, visualResponses } = component;\n\n\t\tif ( type === MotionControllerConstants.ComponentType.TOUCHPAD ) {\n\n\t\t\tcomponent.touchPointNode = scene.getObjectByName( touchPointNodeName );\n\t\t\tif ( component.touchPointNode ) {\n\n\t\t\t\t// Attach a touch dot to the touchpad.\n\t\t\t\tconst sphereGeometry = new SphereBufferGeometry( 0.001 );\n\t\t\t\tconst material = new MeshBasicMaterial( { color: 0x0000FF } );\n\t\t\t\tconst sphere = new Mesh( sphereGeometry, material );\n\t\t\t\tcomponent.touchPointNode.add( sphere );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( `Could not find touch dot, ${component.touchPointNodeName}, in touchpad component ${component.id}` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Loop through all the visual responses to be applied to this component\n\t\tObject.values( visualResponses ).forEach( ( visualResponse ) => {\n\n\t\t\tconst { valueNodeName, minNodeName, maxNodeName, valueNodeProperty } = visualResponse;\n\n\t\t\t// If animating a transform, find the two nodes to be interpolated between.\n\t\t\tif ( valueNodeProperty === MotionControllerConstants.VisualResponseProperty.TRANSFORM ) {\n\n\t\t\t\tvisualResponse.minNode = scene.getObjectByName( minNodeName );\n\t\t\t\tvisualResponse.maxNode = scene.getObjectByName( maxNodeName );\n\n\t\t\t\t// If the extents cannot be found, skip this animation\n\t\t\t\tif ( ! visualResponse.minNode ) {\n\n\t\t\t\t\tconsole.warn( `Could not find ${minNodeName} in the model` );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! visualResponse.maxNode ) {\n\n\t\t\t\t\tconsole.warn( `Could not find ${maxNodeName} in the model` );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// If the target node cannot be found, skip this animation\n\t\t\tvisualResponse.valueNode = scene.getObjectByName( valueNodeName );\n\t\t\tif ( ! visualResponse.valueNode ) {\n\n\t\t\t\tconsole.warn( `Could not find ${valueNodeName} in the model` );\n\n\t\t\t}\n\n\t\t} );\n\n\t} );\n\n}\n\nfunction addAssetSceneToControllerModel( controllerModel, scene ) {\n\n\t// Find the nodes needed for animation and cache them on the motionController.\n\tfindNodes( controllerModel.motionController, scene );\n\n\t// Apply any environment map that the mesh already has set.\n\tif ( controllerModel.envMap ) {\n\n\t\tscene.traverse( ( child ) => {\n\n\t\t\tif ( child.isMesh ) {\n\n\t\t\t\tchild.material.envMap = controllerModel.envMap;\n\t\t\t\tchild.material.needsUpdate = true;\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t// Add the glTF scene to the controllerModel.\n\tcontrollerModel.add( scene );\n\n}\n\nvar XRControllerModelFactory = ( function () {\n\n\tfunction XRControllerModelFactory( gltfLoader = null ) {\n\n\t\tthis.gltfLoader = gltfLoader;\n\t\tthis.path = DEFAULT_PROFILES_PATH;\n\t\tthis._assetCache = {};\n\n\t\t// If a GLTFLoader wasn't supplied to the constructor create a new one.\n\t\tif ( ! this.gltfLoader ) {\n\n\t\t\tthis.gltfLoader = new GLTFLoader();\n\n\t\t}\n\n\t}\n\n\tXRControllerModelFactory.prototype = {\n\n\t\tconstructor: XRControllerModelFactory,\n\n\t\tcreateControllerModel: function ( controller ) {\n\n\t\t\tconst controllerModel = new XRControllerModel();\n\t\t\tlet scene = null;\n\n\t\t\tcontroller.addEventListener( 'connected', ( event ) => {\n\n\t\t\t\tconst xrInputSource = event.data;\n\n\t\t\t\tif ( xrInputSource.targetRayMode !== 'tracked-pointer' || ! xrInputSource.gamepad ) return;\n\n\t\t\t\tfetchProfile( xrInputSource, this.path, DEFAULT_PROFILE ).then( ( { profile, assetPath } ) => {\n\n\t\t\t\t\tcontrollerModel.motionController = new MotionController(\n\t\t\t\t\t\txrInputSource,\n\t\t\t\t\t\tprofile,\n\t\t\t\t\t\tassetPath\n\t\t\t\t\t);\n\n\t\t\t\t\tconst cachedAsset = this._assetCache[ controllerModel.motionController.assetUrl ];\n\t\t\t\t\tif ( cachedAsset ) {\n\n\t\t\t\t\t\tscene = cachedAsset.scene.clone();\n\n\t\t\t\t\t\taddAssetSceneToControllerModel( controllerModel, scene );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ! this.gltfLoader ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'GLTFLoader not set.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.gltfLoader.setPath( '' );\n\t\t\t\t\t\tthis.gltfLoader.load( controllerModel.motionController.assetUrl, ( asset ) => {\n\n\t\t\t\t\t\t\tthis._assetCache[ controllerModel.motionController.assetUrl ] = asset;\n\n\t\t\t\t\t\t\tscene = asset.scene.clone();\n\n\t\t\t\t\t\t\taddAssetSceneToControllerModel( controllerModel, scene );\n\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t() => {\n\n\t\t\t\t\t\t\tthrow new Error( `Asset ${controllerModel.motionController.assetUrl} missing or malformed.` );\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t} ).catch( ( err ) => {\n\n\t\t\t\t\tconsole.warn( err );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t\tcontroller.addEventListener( 'disconnected', () => {\n\n\t\t\t\tcontrollerModel.motionController = null;\n\t\t\t\tcontrollerModel.remove( scene );\n\t\t\t\tscene = null;\n\n\t\t\t} );\n\n\t\t\treturn controllerModel;\n\n\t\t}\n\n\t};\n\n\treturn XRControllerModelFactory;\n\n} )();\n\nexport { XRControllerModelFactory };\n","\r\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\r\nimport {EventDispatcher} from \"../EventDispatcher.js\";\r\nimport { XRControllerModelFactory } from '../../libs/three.js/webxr/XRControllerModelFactory.js';\r\nimport {Line2} from \"../../libs/three.js/lines/Line2.js\";\r\nimport {LineGeometry} from \"../../libs/three.js/lines/LineGeometry.js\";\r\nimport {LineMaterial} from \"../../libs/three.js/lines/LineMaterial.js\";\r\n\r\nlet fakeCam = new THREE.PerspectiveCamera();\r\n\r\nfunction toScene(vec, ref){\r\n\tlet node = ref.clone();\r\n\tnode.updateMatrix();\r\n\tnode.updateMatrixWorld();\r\n\r\n\tlet result = vec.clone().applyMatrix4(node.matrix);\r\n\tresult.z -= 0.8 * node.scale.x;\r\n\r\n\treturn result;\r\n};\r\n\r\nfunction computeMove(vrControls, controller){\r\n\r\n\tif(!controller || !controller.inputSource || !controller.inputSource.gamepad){\r\n\t\treturn null;\r\n\t}\r\n\r\n\tlet pad = controller.inputSource.gamepad;\r\n\r\n\tlet axes = pad.axes;\r\n\t// [0,1] are for touchpad, [2,3] for thumbsticks?\r\n\tlet y = 0;\r\n\tif(axes.length === 2){\r\n\t\ty = axes[1];\r\n\t}else if(axes.length === 4){\r\n\t\ty = axes[3];\r\n\t}\r\n\r\n\ty = Math.sign(y) * (2 * y) ** 2;\r\n\r\n\tlet maxSize = 0;\r\n\tfor(let pc of viewer.scene.pointclouds){\r\n\t\tlet size = pc.boundingBox.min.distanceTo(pc.boundingBox.max);\r\n\t\tmaxSize = Math.max(maxSize, size);\r\n\t}\r\n\tlet multiplicator = Math.pow(maxSize, 0.5) / 2;\r\n\r\n\tlet scale = vrControls.node.scale.x;\r\n\tlet moveSpeed = viewer.getMoveSpeed();\r\n\tlet amount = multiplicator * y * (moveSpeed ** 0.5) / scale;\r\n\r\n\r\n\tlet rotation = new THREE.Quaternion().setFromEuler(controller.rotation);\r\n\tlet dir = new THREE.Vector3(0, 0, -1);\r\n\tdir.applyQuaternion(rotation);\r\n\r\n\tlet move = dir.clone().multiplyScalar(amount);\r\n\r\n\tlet p1 = vrControls.toScene(controller.position);\r\n\tlet p2 = vrControls.toScene(controller.position.clone().add(move));\r\n\r\n\tmove = p2.clone().sub(p1);\r\n\t\r\n\treturn move;\r\n};\r\n\r\n\r\nclass FlyMode{\r\n\r\n\tconstructor(vrControls){\r\n\t\tthis.moveFactor = 1;\r\n\t\tthis.dbgLabel = null;\r\n\t}\r\n\r\n\tstart(vrControls){\r\n\t\tif(!this.dbgLabel){\r\n\t\t\tthis.dbgLabel = new Potree.TextSprite(\"abc\");\r\n\t\t\tthis.dbgLabel.name = \"debug label\";\r\n\t\t\tvrControls.viewer.sceneVR.add(this.dbgLabel);\r\n\t\t\tthis.dbgLabel.visible = false;\r\n\t\t}\r\n\t}\r\n\t\r\n\tend(){\r\n\r\n\t}\r\n\r\n\tupdate(vrControls, delta){\r\n\r\n\t\tlet primary = vrControls.cPrimary;\r\n\t\tlet secondary = vrControls.cSecondary;\r\n\r\n\t\tlet move1 = computeMove(vrControls, primary);\r\n\t\tlet move2 = computeMove(vrControls, secondary);\r\n\r\n\r\n\t\tif(!move1){\r\n\t\t\tmove1 = new THREE.Vector3();\r\n\t\t}\r\n\r\n\t\tif(!move2){\r\n\t\t\tmove2 = new THREE.Vector3();\r\n\t\t}\r\n\r\n\t\tlet move = move1.clone().add(move2);\r\n\r\n\t\tmove.multiplyScalar(-delta * this.moveFactor);\r\n\t\tvrControls.node.position.add(move);\r\n\t\t\r\n\r\n\t\tlet scale = vrControls.node.scale.x;\r\n\r\n\t\tlet camVR = vrControls.viewer.renderer.xr.getCamera(fakeCam);\r\n\t\t\r\n\t\tlet vrPos = camVR.getWorldPosition(new THREE.Vector3());\r\n\t\tlet vrDir = camVR.getWorldDirection(new THREE.Vector3());\r\n\t\tlet vrTarget = vrPos.clone().add(vrDir.multiplyScalar(scale));\r\n\r\n\t\tlet scenePos = toScene(vrPos, vrControls.node);\r\n\t\tlet sceneDir = toScene(vrPos.clone().add(vrDir), vrControls.node).sub(scenePos);\r\n\t\tsceneDir.normalize().multiplyScalar(scale);\r\n\t\tlet sceneTarget = scenePos.clone().add(sceneDir);\r\n\r\n\t\tvrControls.viewer.scene.view.setView(scenePos, sceneTarget);\r\n\r\n\t\tif(Potree.debug.message){\r\n\t\t\tthis.dbgLabel.visible = true;\r\n\t\t\tthis.dbgLabel.setText(Potree.debug.message);\r\n\t\t\tthis.dbgLabel.scale.set(0.1, 0.1, 0.1);\r\n\t\t\tthis.dbgLabel.position.copy(primary.position);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nclass TranslationMode{\r\n\r\n\tconstructor(){\r\n\t\tthis.controller = null;\r\n\t\tthis.startPos = null;\r\n\t\tthis.debugLine = null;\r\n\t}\r\n\r\n\tstart(vrControls){\r\n\t\tthis.controller = vrControls.triggered.values().next().value;\r\n\t\tthis.startPos = vrControls.node.position.clone();\r\n\t}\r\n\t\r\n\tend(vrControls){\r\n\r\n\t}\r\n\r\n\tupdate(vrControls, delta){\r\n\r\n\t\tlet start = this.controller.start.position;\r\n\t\tlet end = this.controller.position;\r\n\r\n\t\tstart = vrControls.toScene(start);\r\n\t\tend = vrControls.toScene(end);\r\n\r\n\t\tlet diff = end.clone().sub(start);\r\n\t\tdiff.set(-diff.x, -diff.y, -diff.z);\r\n\r\n\t\tlet pos = new THREE.Vector3().addVectors(this.startPos, diff);\r\n\r\n\t\tvrControls.node.position.copy(pos);\r\n\t}\r\n\r\n};\r\n\r\nclass RotScaleMode{\r\n\r\n\tconstructor(){\r\n\t\tthis.line = null;\r\n\t\tthis.startState = null;\r\n\t}\r\n\r\n\tstart(vrControls){\r\n\t\tif(!this.line){\r\n\t\t\tthis.line = Potree.Utils.debugLine(\r\n\t\t\t\tvrControls.viewer.sceneVR, \r\n\t\t\t\tnew THREE.Vector3(0, 0, 0),\r\n\t\t\t\tnew THREE.Vector3(0, 0, 0),\r\n\t\t\t\t0xffff00,\r\n\t\t\t);\r\n\r\n\t\t\tthis.dbgLabel = new Potree.TextSprite(\"abc\");\r\n\t\t\tthis.dbgLabel.scale.set(0.1, 0.1, 0.1);\r\n\t\t\tvrControls.viewer.sceneVR.add(this.dbgLabel);\r\n\t\t}\r\n\r\n\t\tthis.line.node.visible = true;\r\n\r\n\t\tthis.startState = vrControls.node.clone();\r\n\t}\r\n\r\n\tend(vrControls){\r\n\t\tthis.line.node.visible = false;\r\n\t\tthis.dbgLabel.visible = false;\r\n\t}\r\n\r\n\tupdate(vrControls, delta){\r\n\r\n\t\tlet start_c1 = vrControls.cPrimary.start.position.clone();\r\n\t\tlet start_c2 = vrControls.cSecondary.start.position.clone();\r\n\t\tlet start_center = start_c1.clone().add(start_c2).multiplyScalar(0.5);\r\n\t\tlet start_c1_c2 = start_c2.clone().sub(start_c1);\r\n\t\tlet end_c1 = vrControls.cPrimary.position.clone();\r\n\t\tlet end_c2 = vrControls.cSecondary.position.clone();\r\n\t\tlet end_center = end_c1.clone().add(end_c2).multiplyScalar(0.5);\r\n\t\tlet end_c1_c2 = end_c2.clone().sub(end_c1);\r\n\r\n\t\tlet d1 = start_c1_c2.length();\r\n\t\tlet d2 = end_c1_c2.length();\r\n\r\n\t\tlet angleStart = new THREE.Vector2(start_c1_c2.x, start_c1_c2.z).angle();\r\n\t\tlet angleEnd = new THREE.Vector2(end_c1_c2.x, end_c1_c2.z).angle();\r\n\t\tlet angleDiff = angleEnd - angleStart;\r\n\t\t\r\n\t\tlet scale = d2 / d1;\r\n\r\n\t\tlet node = this.startState.clone();\r\n\t\tnode.updateMatrix();\r\n\t\tnode.matrixAutoUpdate = false;\r\n\r\n\t\tlet mToOrigin = new THREE.Matrix4().makeTranslation(...toScene(start_center, this.startState).multiplyScalar(-1).toArray());\r\n\t\tlet mToStart = new THREE.Matrix4().makeTranslation(...toScene(start_center, this.startState).toArray());\r\n\t\tlet mRotate = new THREE.Matrix4().makeRotationZ(angleDiff);\r\n\t\tlet mScale = new THREE.Matrix4().makeScale(1 / scale, 1 / scale, 1 / scale);\r\n\r\n\t\tnode.applyMatrix4(mToOrigin);\r\n\t\tnode.applyMatrix4(mRotate);\r\n\t\tnode.applyMatrix4(mScale);\r\n\t\tnode.applyMatrix4(mToStart);\r\n\r\n\t\tlet oldScenePos = toScene(start_center, this.startState);\r\n\t\tlet newScenePos = toScene(end_center, node);\r\n\t\tlet toNew = oldScenePos.clone().sub(newScenePos);\r\n\t\tlet mToNew = new THREE.Matrix4().makeTranslation(...toNew.toArray());\r\n\t\tnode.applyMatrix4(mToNew);\r\n\r\n\t\tnode.matrix.decompose(node.position, node.quaternion, node.scale );\r\n\r\n\t\tvrControls.node.position.copy(node.position);\r\n\t\tvrControls.node.quaternion.copy(node.quaternion);\r\n\t\tvrControls.node.scale.copy(node.scale);\r\n\t\tvrControls.node.updateMatrix();\r\n\r\n\t\t{\r\n\t\t\tlet scale = vrControls.node.scale.x;\r\n\t\t\tlet camVR = vrControls.viewer.renderer.xr.getCamera(fakeCam);\r\n\t\t\t\r\n\t\t\tlet vrPos = camVR.getWorldPosition(new THREE.Vector3());\r\n\t\t\tlet vrDir = camVR.getWorldDirection(new THREE.Vector3());\r\n\t\t\tlet vrTarget = vrPos.clone().add(vrDir.multiplyScalar(scale));\r\n\r\n\t\t\tlet scenePos = toScene(vrPos, this.startState);\r\n\t\t\tlet sceneDir = toScene(vrPos.clone().add(vrDir), this.startState).sub(scenePos);\r\n\t\t\tsceneDir.normalize().multiplyScalar(scale);\r\n\t\t\tlet sceneTarget = scenePos.clone().add(sceneDir);\r\n\r\n\t\t\tvrControls.viewer.scene.view.setView(scenePos, sceneTarget);\r\n\t\t\tvrControls.viewer.setMoveSpeed(scale);\r\n\t\t}\r\n\r\n\t\t{ // update \"GUI\"\r\n\t\t\tthis.line.set(end_c1, end_c2);\r\n\r\n\t\t\tlet scale = vrControls.node.scale.x;\r\n\t\t\tthis.dbgLabel.visible = true;\r\n\t\t\tthis.dbgLabel.position.copy(end_center);\r\n\t\t\tthis.dbgLabel.setText(`scale: 1 : ${scale.toFixed(2)}`);\r\n\t\t\tthis.dbgLabel.scale.set(0.05, 0.05, 0.05);\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\nexport class VRControls extends EventDispatcher{\r\n\r\n\tconstructor(viewer){\r\n\t\tsuper(viewer);\r\n\r\n\t\tthis.viewer = viewer;\r\n\r\n\t\tviewer.addEventListener(\"vr_start\", this.onStart.bind(this));\r\n\t\tviewer.addEventListener(\"vr_end\", this.onEnd.bind(this));\r\n\r\n\t\tthis.node = new THREE.Object3D();\r\n\t\tthis.node.up.set(0, 0, 1);\r\n\t\tthis.triggered = new Set();\r\n\r\n\t\tlet xr = viewer.renderer.xr;\r\n\r\n\t\t{ // lights\r\n\t\t\t\r\n\t\t\tconst light = new THREE.PointLight( 0xffffff, 5, 0, 1 );\r\n\t\t\tlight.position.set(0, 2, 0);\r\n\t\t\tthis.viewer.sceneVR.add(light)\r\n\t\t}\r\n\r\n\t\tthis.menu = null;\r\n\r\n\t\tconst controllerModelFactory = new XRControllerModelFactory();\r\n\r\n\t\tlet sg = new THREE.SphereGeometry(1, 32, 32);\r\n\t\tlet sm = new THREE.MeshNormalMaterial();\r\n\r\n\t\t{ // setup primary controller\r\n\t\t\tlet controller = xr.getController(0);\r\n\r\n\t\t\tlet grip = xr.getControllerGrip(0);\r\n\t\t\tgrip.name = \"grip(0)\";\r\n\r\n\t\t\t// ADD CONTROLLERMODEL\r\n\t\t\tgrip.add( controllerModelFactory.createControllerModel( grip ) );\r\n\t\t\tthis.viewer.sceneVR.add(grip);\r\n\r\n\t\t\t// ADD SPHERE\r\n\t\t\tlet sphere = new THREE.Mesh(sg, sm);\r\n\t\t\tsphere.scale.set(0.005, 0.005, 0.005);\r\n\r\n\t\t\tcontroller.add(sphere);\r\n\t\t\tcontroller.visible = true;\r\n\t\t\tthis.viewer.sceneVR.add(controller);\r\n\r\n\t\t\t{ // ADD LINE\r\n\t\t\t\t\r\n\t\t\t\tlet lineGeometry = new LineGeometry();\r\n\r\n\t\t\t\tlineGeometry.setPositions([\r\n\t\t\t\t\t0, 0, -0.15,\r\n\t\t\t\t\t0, 0, 0.05,\r\n\t\t\t\t]);\r\n\r\n\t\t\t\tlet lineMaterial = new LineMaterial({ \r\n\t\t\t\t\tcolor: 0xff0000, \r\n\t\t\t\t\tlinewidth: 2, \r\n\t\t\t\t\tresolution: new THREE.Vector2(1000, 1000),\r\n\t\t\t\t});\r\n\r\n\t\t\t\tconst line = new Line2(lineGeometry, lineMaterial);\r\n\t\t\t\t\r\n\t\t\t\tcontroller.add(line);\r\n\t\t\t}\r\n\r\n\r\n\t\t\tcontroller.addEventListener( 'connected', function ( event ) {\r\n\t\t\t\tconst xrInputSource = event.data;\r\n\t\t\t\tcontroller.inputSource = xrInputSource;\r\n\t\t\t\t// initInfo(controller);\r\n\t\t\t});\r\n\r\n\t\t\tcontroller.addEventListener( 'selectstart', () => {this.onTriggerStart(controller)});\r\n\t\t\tcontroller.addEventListener( 'selectend', () => {this.onTriggerEnd(controller)});\r\n\r\n\t\t\tthis.cPrimary = controller;\r\n\r\n\t\t}\r\n\r\n\t\t{ // setup secondary controller\r\n\t\t\tlet controller = xr.getController(1);\r\n\r\n\t\t\tlet grip = xr.getControllerGrip(1);\r\n\r\n\t\t\t// ADD CONTROLLER MODEL\r\n\t\t\tlet model = controllerModelFactory.createControllerModel( grip );\r\n\t\t\tgrip.add(model);\r\n\t\t\tthis.viewer.sceneVR.add( grip );\r\n\r\n\t\t\t// ADD SPHERE\r\n\t\t\tlet sphere = new THREE.Mesh(sg, sm);\r\n\t\t\tsphere.scale.set(0.005, 0.005, 0.005);\r\n\t\t\tcontroller.add(sphere);\r\n\t\t\tcontroller.visible = true;\r\n\t\t\tthis.viewer.sceneVR.add(controller);\r\n\r\n\t\t\t{ // ADD LINE\r\n\t\t\t\t\r\n\t\t\t\tlet lineGeometry = new LineGeometry();\r\n\r\n\t\t\t\tlineGeometry.setPositions([\r\n\t\t\t\t\t0, 0, -0.15,\r\n\t\t\t\t\t0, 0, 0.05,\r\n\t\t\t\t]);\r\n\r\n\t\t\t\tlet lineMaterial = new LineMaterial({ \r\n\t\t\t\t\tcolor: 0xff0000, \r\n\t\t\t\t\tlinewidth: 2, \r\n\t\t\t\t\tresolution: new THREE.Vector2(1000, 1000),\r\n\t\t\t\t});\r\n\r\n\t\t\t\tconst line = new Line2(lineGeometry, lineMaterial);\r\n\t\t\t\t\r\n\t\t\t\tcontroller.add(line);\r\n\t\t\t}\r\n\r\n\t\t\tcontroller.addEventListener( 'connected', (event) => {\r\n\t\t\t\tconst xrInputSource = event.data;\r\n\t\t\t\tcontroller.inputSource = xrInputSource;\r\n\t\t\t\tthis.initMenu(controller);\r\n\t\t\t});\r\n\r\n\t\t\tcontroller.addEventListener( 'selectstart', () => {this.onTriggerStart(controller)});\r\n\t\t\tcontroller.addEventListener( 'selectend', () => {this.onTriggerEnd(controller)});\r\n\r\n\t\t\tthis.cSecondary = controller;\r\n\t\t}\r\n\r\n\t\tthis.mode_fly = new FlyMode();\r\n\t\tthis.mode_translate = new TranslationMode();\r\n\t\tthis.mode_rotScale = new RotScaleMode();\r\n\t\tthis.setMode(this.mode_fly);\r\n\t}\r\n\r\n\tcreateSlider(label, min, max){\r\n\r\n\t\tlet sg = new THREE.SphereGeometry(1, 8, 8);\r\n\t\tlet cg = new THREE.CylinderGeometry(1, 1, 1, 8);\r\n\t\tlet matHandle = new THREE.MeshBasicMaterial({color: 0xff0000});\r\n\t\tlet matScale = new THREE.MeshBasicMaterial({color: 0xff4444});\r\n\t\tlet matValue = new THREE.MeshNormalMaterial();\r\n\r\n\t\tlet node = new THREE.Object3D(\"slider\");\r\n\t\tlet nLabel = new Potree.TextSprite(`${label}: 0`);\r\n\t\tlet nMax = new THREE.Mesh(sg, matHandle);\r\n\t\tlet nMin = new THREE.Mesh(sg, matHandle);\r\n\t\tlet nValue = new THREE.Mesh(sg, matValue);\r\n\t\tlet nScale = new THREE.Mesh(cg, matScale);\r\n\r\n\t\tnLabel.scale.set(0.2, 0.2, 0.2);\r\n\t\tnLabel.position.set(0, 0.35, 0);\r\n\r\n\t\tnMax.scale.set(0.02, 0.02, 0.02);\r\n\t\tnMax.position.set(0, 0.25, 0);\r\n\r\n\t\tnMin.scale.set(0.02, 0.02, 0.02);\r\n\t\tnMin.position.set(0, -0.25, 0);\r\n\r\n\t\tnValue.scale.set(0.02, 0.02, 0.02);\r\n\t\tnValue.position.set(0, 0, 0);\r\n\r\n\t\tnScale.scale.set(0.005, 0.5, 0.005);\r\n\r\n\t\tnode.add(nLabel);\r\n\t\tnode.add(nMax);\r\n\t\tnode.add(nMin);\r\n\t\tnode.add(nValue);\r\n\t\tnode.add(nScale);\r\n\r\n\t\treturn node;\r\n\t}\r\n\r\n\tcreateInfo(){ \r\n\r\n\t\tlet texture = new THREE.TextureLoader().load(`${Potree.resourcePath}/images/vr_controller_help.jpg`);\r\n\t\tlet plane = new THREE.PlaneBufferGeometry(1, 1, 1, 1);\r\n\t\tlet infoMaterial = new THREE.MeshBasicMaterial({map: texture});\r\n\t\tlet infoNode = new THREE.Mesh(plane, infoMaterial);\r\n\r\n\t\treturn infoNode;\r\n\t}\r\n\r\n\tinitMenu(controller){\r\n\r\n\t\tif(this.menu){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet node = new THREE.Object3D(\"vr menu\");\r\n\r\n\t\t// let nSlider = this.createSlider(\"speed\", 0, 1);\r\n\t\t// let nInfo = this.createInfo();\r\n\r\n\t\t// // node.add(nSlider);\r\n\t\t// node.add(nInfo);\r\n\r\n\t\t// {\r\n\t\t// \tnode.rotation.set(-1.5, 0, 0)\r\n\t\t// \tnode.scale.set(0.3, 0.3, 0.3);\r\n\t\t// \tnode.position.set(-0.2, -0.002, -0.1)\r\n\r\n\t\t// \t// nInfo.position.set(0.5, 0, 0);\r\n\t\t// \tnInfo.scale.set(0.8, 0.6, 0);\r\n\r\n\t\t// \t// controller.add(node);\r\n\t\t// }\r\n\r\n\t\t// node.position.set(-0.3, 1.2, 0.2);\r\n\t\t// node.scale.set(0.3, 0.2, 0.3);\r\n\t\t// node.lookAt(new THREE.Vector3(0, 1.5, 0.1));\r\n\r\n\t\t// this.viewer.sceneVR.add(node);\r\n\r\n\t\tthis.menu = node;\r\n\r\n\t\t// window.vrSlider = nSlider;\r\n\t\twindow.vrMenu = node;\r\n\r\n\t}\r\n\r\n\r\n\ttoScene(vec){\r\n\t\tlet camVR = this.getCamera();\r\n\r\n\t\tlet mat = camVR.matrixWorld;\r\n\t\tlet result = vec.clone().applyMatrix4(mat);\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\ttoVR(vec){\r\n\t\tlet camVR = this.getCamera();\r\n\r\n\t\tlet mat = camVR.matrixWorld.clone();\r\n\t\tmat.invert();\r\n\t\tlet result = vec.clone().applyMatrix4(mat);\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tsetMode(mode){\r\n\r\n\t\tif(this.mode === mode){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(this.mode){\r\n\t\t\tthis.mode.end(this);\r\n\t\t}\r\n\r\n\t\tfor(let controller of [this.cPrimary, this.cSecondary]){\r\n\r\n\t\t\tlet start = {\r\n\t\t\t\tposition: controller.position.clone(),\r\n\t\t\t\trotation: controller.rotation.clone(),\r\n\t\t\t};\r\n\r\n\t\t\tcontroller.start = start;\r\n\t\t}\r\n\t\t\r\n\t\tthis.mode = mode;\r\n\t\tthis.mode.start(this);\r\n\t}\r\n\r\n\tonTriggerStart(controller){\r\n\t\tthis.triggered.add(controller);\r\n\r\n\t\tif(this.triggered.size === 0){\r\n\t\t\tthis.setMode(this.mode_fly);\r\n\t\t}else if(this.triggered.size === 1){\r\n\t\t\tthis.setMode(this.mode_translate);\r\n\t\t}else if(this.triggered.size === 2){\r\n\t\t\tthis.setMode(this.mode_rotScale);\r\n\t\t}\r\n\t}\r\n\r\n\tonTriggerEnd(controller){\r\n\t\tthis.triggered.delete(controller);\r\n\r\n\t\tif(this.triggered.size === 0){\r\n\t\t\tthis.setMode(this.mode_fly);\r\n\t\t}else if(this.triggered.size === 1){\r\n\t\t\tthis.setMode(this.mode_translate);\r\n\t\t}else if(this.triggered.size === 2){\r\n\t\t\tthis.setMode(this.mode_rotScale);\r\n\t\t}\r\n\t}\r\n\r\n\tonStart(){\r\n\r\n\t\tlet position = this.viewer.scene.view.position.clone();\r\n\t\tlet direction = this.viewer.scene.view.direction;\r\n\t\tdirection.multiplyScalar(-1);\r\n\r\n\t\tlet target = position.clone().add(direction);\r\n\t\ttarget.z = position.z;\r\n\r\n\t\tlet scale = this.viewer.getMoveSpeed();\r\n\r\n\t\tthis.node.position.copy(position);\r\n\t\tthis.node.lookAt(target);\r\n\t\tthis.node.scale.set(scale, scale, scale);\r\n\t\tthis.node.updateMatrix();\r\n\t\tthis.node.updateMatrixWorld();\r\n\t}\r\n\r\n\tonEnd(){\r\n\t\t\r\n\t}\r\n\r\n\r\n\tsetScene(scene){\r\n\t\tthis.scene = scene;\r\n\t}\r\n\r\n\tgetCamera(){\r\n\t\tlet reference = this.viewer.scene.getActiveCamera();\r\n\t\tlet camera = new THREE.PerspectiveCamera();\r\n\r\n\t\t// let scale = this.node.scale.x;\r\n\t\tlet scale = this.viewer.getMoveSpeed();\r\n\t\t//camera.near = 0.01 / scale;\r\n\t\tcamera.near = 0.1;\r\n\t\tcamera.far = 1000;\r\n\t\t// camera.near = reference.near / scale;\r\n\t\t// camera.far = reference.far / scale;\r\n\t\tcamera.up.set(0, 0, 1);\r\n\t\tcamera.lookAt(new THREE.Vector3(0, -1, 0));\r\n\t\tcamera.updateMatrix();\r\n\t\tcamera.updateMatrixWorld();\r\n\r\n\t\tcamera.position.copy(this.node.position);\r\n\t\tcamera.rotation.copy(this.node.rotation);\r\n\t\tcamera.scale.set(scale, scale, scale);\r\n\t\tcamera.updateMatrix();\r\n\t\tcamera.updateMatrixWorld();\r\n\t\tcamera.matrixAutoUpdate = false;\r\n\t\tcamera.parent = camera;\r\n\r\n\t\treturn camera;\r\n\t}\r\n\r\n\tupdate(delta){\r\n\r\n\t\t\r\n\r\n\t\t// if(this.mode === this.mode_fly){\r\n\t\t// \tlet ray = new THREE.Ray(origin, direction);\r\n\t\t\t\r\n\t\t// \tfor(let object of this.selectables){\r\n\r\n\t\t// \t\tif(object.intersectsRay(ray)){\r\n\t\t// \t\t\tobject.onHit(ray);\r\n\t\t// \t\t}\r\n\r\n\t\t// \t}\r\n\r\n\t\t// }\r\n\r\n\t\tthis.mode.update(this, delta);\r\n\r\n\t\t\r\n\r\n\t}\r\n};","\n// Adapted from three.js VRButton\n\n\nclass VRButton {\n\n\tconstructor(){\n\t\tthis.onStartListeners = [];\n\t\tthis.onEndListeners = [];\n\t\tthis.element = null;\n\t}\n\n\tonStart(callback){\n\t\tthis.onStartListeners.push(callback);\n\t}\n\n\tonEnd(callback){\n\t\tthis.onEndListeners.push(callback);\n\t}\n\n\tstatic async createButton( renderer, options ) {\n\n\t\tif ( options ) {\n\n\t\t\tconsole.error( 'THREE.VRButton: The \"options\" parameter has been removed. Please set the reference space type via renderer.xr.setReferenceSpaceType() instead.' );\n\n\t\t}\n\n\t\tconst button = new VRButton();\n\t\tconst element = document.createElement( 'button' );\n\n\t\tbutton.element = element;\n\n\t\tfunction setEnter(){\n\t\t\tbutton.element.innerHTML = `\n\t\t\t\t
    ENTER
    \n\t\t\t\t
    VR
    \n\t\t\t`;\n\t\t}\n\n\t\tfunction setExit(){\n\t\t\tbutton.element.innerHTML = `\n\t\t\t\t
    EXIT
    \n\t\t\t\t
    VR
    \n\t\t\t`;\n\t\t}\n\n\t\tfunction showEnterVR( /*device*/ ) {\n\n\t\t\tlet currentSession = null;\n\n\t\t\tfunction onSessionStarted( session ) {\n\n\t\t\t\tsession.addEventListener( 'end', onSessionEnded );\n\n\t\t\t\tfor(let listener of button.onStartListeners){\n\t\t\t\t\tlistener();\n\t\t\t\t}\n\n\n\t\t\t\trenderer.xr.setSession( session );\n\t\t\t\tsetExit();\n\n\t\t\t\tcurrentSession = session;\n\n\t\t\t}\n\n\t\t\tfunction onSessionEnded( /*event*/ ) {\n\n\t\t\t\tcurrentSession.removeEventListener( 'end', onSessionEnded );\n\n\t\t\t\tfor(let listener of button.onEndListeners){\n\t\t\t\t\tlistener();\n\t\t\t\t}\n\n\t\t\t\tsetEnter();\n\n\t\t\t\tcurrentSession = null;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tbutton.element.style.display = '';\n\n\t\t\tbutton.element.style.cursor = 'pointer';\n\n\t\t\tsetEnter();\n\n\t\t\tbutton.element.onmouseenter = function () {\n\n\t\t\t\tbutton.element.style.opacity = '1.0';\n\n\t\t\t};\n\n\t\t\tbutton.element.onmouseleave = function () {\n\n\t\t\t\tbutton.element.style.opacity = '0.7';\n\n\t\t\t};\n\n\t\t\tbutton.element.onclick = function () {\n\n\t\t\t\tif ( currentSession === null ) {\n\n\t\t\t\t\t// WebXR's requestReferenceSpace only works if the corresponding feature\n\t\t\t\t\t// was requested at session creation time. For simplicity, just ask for\n\t\t\t\t\t// the interesting ones as optional features, but be aware that the\n\t\t\t\t\t// requestReferenceSpace call will fail if it turns out to be unavailable.\n\t\t\t\t\t// ('local' is always available for immersive sessions and doesn't need to\n\t\t\t\t\t// be requested separately.)\n\n\t\t\t\t\tconst sessionInit = { optionalFeatures: [ 'local-floor', 'bounded-floor', 'hand-tracking' ] };\n\t\t\t\t\tnavigator.xr.requestSession( 'immersive-vr', sessionInit ).then( onSessionStarted );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentSession.end();\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction stylizeElement( element ) {\n\n\t\t\telement.style.position = 'absolute';\n\t\t\telement.style.bottom = '20px';\n\t\t\telement.style.padding = '12px 6px';\n\t\t\telement.style.border = '1px solid #fff';\n\t\t\telement.style.borderRadius = '4px';\n\t\t\telement.style.background = 'rgba(0,0,0,0.1)';\n\t\t\telement.style.color = '#fff';\n\t\t\telement.style.font = 'normal 13px sans-serif';\n\t\t\telement.style.textAlign = 'center';\n\t\t\telement.style.opacity = '0.7';\n\t\t\telement.style.outline = 'none';\n\t\t\telement.style.zIndex = '999';\n\n\t\t}\n\n\t\tif ( 'xr' in navigator ) {\n\n\t\t\tbutton.element.id = 'VRButton';\n\t\t\tbutton.element.style.display = 'none';\n\n\t\t\tstylizeElement( button.element );\n\n\t\t\tlet supported = await navigator.xr.isSessionSupported( 'immersive-vr' );\n\n\t\t\tif(supported){\n\t\t\t\tshowEnterVR();\n\n\t\t\t\treturn button;\n\t\t\t}else{\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( window.isSecureContext === false ) {\n\n\t\t\t\tconsole.log(\"WEBXR NEEDS HTTPS\");\n\n\t\t\t} else {\n\n\t\t\t\tconsole.log(\"WEBXR not available\");\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\n\n\t\t}\n\n\t}\n\n}\n\nexport { VRButton };\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\nimport {ClipTask, ClipMethod, CameraMode, LengthUnits, ElevationGradientRepeat} from \"../defines.js\";\nimport {Renderer} from \"../PotreeRenderer.js\";\nimport {PotreeRenderer} from \"./PotreeRenderer.js\";\nimport {EDLRenderer} from \"./EDLRenderer.js\";\nimport {HQSplatRenderer} from \"./HQSplatRenderer.js\";\nimport {Scene} from \"./Scene.js\";\nimport {ClippingTool} from \"../utils/ClippingTool.js\";\nimport {TransformationTool} from \"../utils/TransformationTool.js\";\nimport {Utils} from \"../utils.js\";\nimport {MapView} from \"./map.js\";\nimport {ProfileWindow, ProfileWindowController} from \"./profile.js\";\nimport {BoxVolume} from \"../utils/Volume.js\";\nimport {Features} from \"../Features.js\";\nimport {Message} from \"../utils/Message.js\";\nimport {Sidebar} from \"./sidebar.js\";\n\nimport {AnnotationTool} from \"../utils/AnnotationTool.js\";\nimport {MeasuringTool} from \"../utils/MeasuringTool.js\";\nimport {ProfileTool} from \"../utils/ProfileTool.js\";\nimport {VolumeTool} from \"../utils/VolumeTool.js\";\n\nimport {InputHandler} from \"../navigation/InputHandler.js\";\nimport {NavigationCube} from \"./NavigationCube.js\";\nimport {Compass} from \"../utils/Compass.js\";\nimport {OrbitControls} from \"../navigation/OrbitControls.js\";\nimport {FirstPersonControls} from \"../navigation/FirstPersonControls.js\";\nimport {EarthControls} from \"../navigation/EarthControls.js\";\nimport {DeviceOrientationControls} from \"../navigation/DeviceOrientationControls.js\";\nimport {VRControls} from \"../navigation/VRControls.js\";\nimport { EventDispatcher } from \"../EventDispatcher.js\";\nimport { ClassificationScheme } from \"../materials/ClassificationScheme.js\";\nimport { VRButton } from '../../libs/three.js/extra/VRButton.js';\n\nimport JSON5 from \"../../libs/json5-2.1.3/json5.mjs\";\n\n\nexport class Viewer extends EventDispatcher{\n\t\n\tconstructor(domElement, args = {}){\n\t\tsuper();\n\n\t\tthis.renderArea = domElement;\n\t\tthis.guiLoaded = false;\n\t\tthis.guiLoadTasks = [];\n\n\t\tthis.onVrListeners = [];\n\n\t\tthis.messages = [];\n\t\tthis.elMessages = $(`\n\t\t
    \n\t\t
    `);\n\t\t$(domElement).append(this.elMessages);\n\t\t\n\t\ttry{\n\n\t\t{ // generate missing dom hierarchy\n\t\t\tif ($(domElement).find('#potree_map').length === 0) {\n\t\t\t\tlet potreeMap = $(`\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t`);\n\t\t\t\t$(domElement).append(potreeMap);\n\t\t\t}\n\n\t\t\tif ($(domElement).find('#potree_description').length === 0) {\n\t\t\t\tlet potreeDescription = $(`
    `);\n\t\t\t\t$(domElement).append(potreeDescription);\n\t\t\t}\n\n\t\t\tif ($(domElement).find('#potree_annotations').length === 0) {\n\t\t\t\tlet potreeAnnotationContainer = $(`\n\t\t\t\t\t
    `);\n\t\t\t\t$(domElement).append(potreeAnnotationContainer);\n\t\t\t}\n\n\t\t\tif ($(domElement).find('#potree_quick_buttons').length === 0) {\n\t\t\t\tlet potreeMap = $(`\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t`);\n\n\t\t\t\t// {\n\t\t\t\t// \tlet imgMenuToggle = document.createElement('img');\n\t\t\t\t// \timgMenuToggle.src = new URL(Potree.resourcePath + '/icons/menu_button.svg').href;\n\t\t\t\t// \timgMenuToggle.onclick = this.toggleSidebar;\n\t\t\t\t// \t// imgMenuToggle.classList.add('potree_menu_toggle');\n\n\t\t\t\t// \tpotreeMap.append(imgMenuToggle);\n\t\t\t\t// }\n\n\t\t\t\t// {\n\t\t\t\t// \tlet imgMenuToggle = document.createElement('img');\n\t\t\t\t// \timgMenuToggle.src = new URL(Potree.resourcePath + '/icons/menu_button.svg').href;\n\t\t\t\t// \timgMenuToggle.onclick = this.toggleSidebar;\n\t\t\t\t// \t// imgMenuToggle.classList.add('potree_menu_toggle');\n\n\t\t\t\t// \tpotreeMap.append(imgMenuToggle);\n\t\t\t\t// }\n\n\t\t\t\t// {\n\t\t\t\t// \tlet imgMenuToggle = document.createElement('img');\n\t\t\t\t// \timgMenuToggle.src = new URL(Potree.resourcePath + '/icons/menu_button.svg').href;\n\t\t\t\t// \timgMenuToggle.onclick = this.toggleSidebar;\n\t\t\t\t// \t// imgMenuToggle.classList.add('potree_menu_toggle');\n\n\t\t\t\t// \tpotreeMap.append(imgMenuToggle);\n\t\t\t\t// }\n\n\t\t\t\t\n\n\t\t\t\t$(domElement).append(potreeMap);\n\t\t\t}\n\t\t}\n\n\t\tthis.pointCloudLoadedCallback = args.onPointCloudLoaded || function () {};\n\n\t\t// if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {\n\t\t//\tdefaultSettings.navigation = \"Orbit\";\n\t\t// }\n\n\t\tthis.server = null;\n\n\t\tthis.fov = 60;\n\t\tthis.isFlipYZ = false;\n\t\tthis.useDEMCollisions = false;\n\t\tthis.generateDEM = false;\n\t\tthis.minNodeSize = 30;\n\t\tthis.edlStrength = 1.0;\n\t\tthis.edlRadius = 1.4;\n\t\tthis.edlOpacity = 1.0;\n\t\tthis.useEDL = false;\n\t\tthis.description = \"\";\n\n\t\tthis.classifications = ClassificationScheme.DEFAULT;\n\n\t\tthis.moveSpeed = 10;\n\n\t\tthis.lengthUnit = LengthUnits.METER;\n\t\tthis.lengthUnitDisplay = LengthUnits.METER;\n\n\t\tthis.showBoundingBox = false;\n\t\tthis.showAnnotations = true;\n\t\tthis.freeze = false;\n\t\tthis.clipTask = ClipTask.HIGHLIGHT;\n\t\tthis.clipMethod = ClipMethod.INSIDE_ANY;\n\n\t\tthis.elevationGradientRepeat = ElevationGradientRepeat.CLAMP;\n\n\t\tthis.filterReturnNumberRange = [0, 7];\n\t\tthis.filterNumberOfReturnsRange = [0, 7];\n\t\tthis.filterGPSTimeRange = [-Infinity, Infinity];\n\t\tthis.filterPointSourceIDRange = [0, 65535];\n\n\t\tthis.potreeRenderer = null;\n\t\tthis.edlRenderer = null;\n\t\tthis.renderer = null;\n\t\tthis.pRenderer = null;\n\n\t\tthis.scene = null;\n\t\tthis.sceneVR = null;\n\t\tthis.overlay = null;\n\t\tthis.overlayCamera = null;\n\n\t\tthis.inputHandler = null;\n\t\tthis.controls = null;\n\n\t\tthis.clippingTool = null;\n\t\tthis.transformationTool = null;\n\t\tthis.navigationCube = null;\n\t\tthis.compass = null;\n\t\t\n\t\tthis.skybox = null;\n\t\tthis.clock = new THREE.Clock();\n\t\tthis.background = null;\n\n\t\tthis.initThree();\n\n\t\tif(args.noDragAndDrop){\n\t\t\t\n\t\t}else{\n\t\t\tthis.initDragAndDrop();\n\t\t}\n\n\t\tif(typeof Stats !== \"undefined\"){\n\t\t\tthis.stats = new Stats();\n\t\t\tthis.stats.showPanel( 0 ); // 0: fps, 1: ms, 2: mb, 3+: custom\n\t\t\tdocument.body.appendChild( this.stats.dom );\n\t\t}\n\n\t\t{\n\t\t\tlet canvas = this.renderer.domElement;\n\t\t\tcanvas.addEventListener(\"webglcontextlost\", (e) => {\n\t\t\t\tconsole.log(e);\n\t\t\t\tthis.postMessage(\"WebGL context lost. \\u2639\");\n\n\t\t\t\tlet gl = this.renderer.getContext();\n\t\t\t\tlet error = gl.getError();\n\t\t\t\tconsole.log(error);\n\t\t\t}, false);\n\t\t}\n\n\t\t{\n\t\t\tthis.overlay = new THREE.Scene();\n\t\t\tthis.overlayCamera = new THREE.OrthographicCamera(\n\t\t\t\t0, 1,\n\t\t\t\t1, 0,\n\t\t\t\t-1000, 1000\n\t\t\t);\n\t\t}\n\t\t\n\t\tthis.pRenderer = new Renderer(this.renderer);\n\t\t\n\t\t{\n\t\t\tlet near = 2.5;\n\t\t\tlet far = 10.0;\n\t\t\tlet fov = 90;\n\t\t\t\n\t\t\tthis.shadowTestCam = new THREE.PerspectiveCamera(90, 1, near, far);\n\t\t\tthis.shadowTestCam.position.set(3.50, -2.80, 8.561);\n\t\t\tthis.shadowTestCam.lookAt(new THREE.Vector3(0, 0, 4.87));\n\t\t}\n\t\t\n\n\t\tlet scene = new Scene(this.renderer);\n\t\t\n\t\t{ // create VR scene\n\t\t\tthis.sceneVR = new THREE.Scene();\n\n\t\t\t// let texture = new THREE.TextureLoader().load(`${Potree.resourcePath}/images/vr_controller_help.jpg`);\n\n\t\t\t// let plane = new THREE.PlaneBufferGeometry(1, 1, 1, 1);\n\t\t\t// let infoMaterial = new THREE.MeshBasicMaterial({map: texture});\n\t\t\t// let infoNode = new THREE.Mesh(plane, infoMaterial);\n\t\t\t// infoNode.position.set(-0.5, 1, 0);\n\t\t\t// infoNode.scale.set(0.4, 0.3, 1);\n\t\t\t// infoNode.lookAt(0, 1, 0)\n\t\t\t// this.sceneVR.add(infoNode);\n\n\t\t\t// window.infoNode = infoNode;\n\t\t}\n\n\t\tthis.setScene(scene);\n\n\t\t{\n\t\t\tthis.inputHandler = new InputHandler(this);\n\t\t\tthis.inputHandler.setScene(this.scene);\n\n\t\t\tthis.clippingTool = new ClippingTool(this);\n\t\t\tthis.transformationTool = new TransformationTool(this);\n\t\t\tthis.navigationCube = new NavigationCube(this);\n\t\t\tthis.navigationCube.visible = false;\n\n\t\t\tthis.compass = new Compass(this);\n\t\t\t\n\t\t\tthis.createControls();\n\n\t\t\tthis.clippingTool.setScene(this.scene);\n\t\t\t\n\t\t\tlet onPointcloudAdded = (e) => {\n\t\t\t\tif (this.scene.pointclouds.length === 1) {\n\t\t\t\t\tlet speed = e.pointcloud.boundingBox.getSize(new THREE.Vector3()).length();\n\t\t\t\t\tspeed = speed / 5;\n\t\t\t\t\tthis.setMoveSpeed(speed);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet onVolumeRemoved = (e) => {\n\t\t\t\tthis.inputHandler.deselect(e.volume);\n\t\t\t};\n\n\t\t\tthis.addEventListener('scene_changed', (e) => {\n\t\t\t\tthis.inputHandler.setScene(e.scene);\n\t\t\t\tthis.clippingTool.setScene(this.scene);\n\t\t\t\t\n\t\t\t\tif(!e.scene.hasEventListener(\"pointcloud_added\", onPointcloudAdded)){\n\t\t\t\t\te.scene.addEventListener(\"pointcloud_added\", onPointcloudAdded);\n\t\t\t\t}\n\n\t\t\t\tif(!e.scene.hasEventListener(\"volume_removed\", onPointcloudAdded)){\n\t\t\t\t\te.scene.addEventListener(\"volume_removed\", onVolumeRemoved);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\n\t\t\tthis.scene.addEventListener(\"volume_removed\", onVolumeRemoved);\n\t\t\tthis.scene.addEventListener('pointcloud_added', onPointcloudAdded);\n\t\t}\n\n\t\t{ // set defaults\n\t\t\tthis.setFOV(60);\n\t\t\tthis.setEDLEnabled(false);\n\t\t\tthis.setEDLRadius(1.4);\n\t\t\tthis.setEDLStrength(0.4);\n\t\t\tthis.setEDLOpacity(1.0);\n\t\t\tthis.setClipTask(ClipTask.HIGHLIGHT);\n\t\t\tthis.setClipMethod(ClipMethod.INSIDE_ANY);\n\t\t\tthis.setPointBudget(1*1000*1000);\n\t\t\tthis.setShowBoundingBox(false);\n\t\t\tthis.setFreeze(false);\n\t\t\tthis.setControls(this.orbitControls);\n\t\t\tthis.setBackground('gradient');\n\n\t\t\tthis.scaleFactor = 1;\n\n\t\t\tthis.loadSettingsFromURL();\n\t\t}\n\n\t\t// start rendering!\n\t\t//if(args.useDefaultRenderLoop === undefined || args.useDefaultRenderLoop === true){\n\t\t\t//requestAnimationFrame(this.loop.bind(this));\n\t\t//}\n\n\t\tthis.renderer.setAnimationLoop(this.loop.bind(this));\n\n\t\tthis.loadGUI = this.loadGUI.bind(this);\n\n\t\tthis.annotationTool = new AnnotationTool(this);\n\t\tthis.measuringTool = new MeasuringTool(this);\n\t\tthis.profileTool = new ProfileTool(this);\n\t\tthis.volumeTool = new VolumeTool(this);\n\n\t\t}catch(e){\n\t\t\tthis.onCrash(e);\n\t\t}\n\t}\n\n\tonCrash(error){\n\n\t\t$(this.renderArea).empty();\n\n\t\tif ($(this.renderArea).find('#potree_failpage').length === 0) {\n\t\t\tlet elFailPage = $(`\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t

    Potree Encountered An Error

    \n\n\t\t\t\t

    \n\t\t\t\tThis may happen if your browser or graphics card is not supported.\n\t\t\t\t
    \n\t\t\t\tWe recommend to use \n\t\t\t\tChrome\n\t\t\t\tor \n\t\t\t\tFirefox.\n\t\t\t\t

    \n\n\t\t\t\t

    \n\t\t\t\tPlease also visit webglreport.com and \n\t\t\t\tcheck whether your system supports WebGL.\n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\tIf you are already using one of the recommended browsers and WebGL is enabled, \n\t\t\t\tconsider filing an issue report at github,
    \n\t\t\t\tincluding your operating system, graphics card, browser and browser version, as well as the \n\t\t\t\terror message below.
    \n\t\t\t\tPlease do not report errors on unsupported browsers.\n\t\t\t\t

    \n\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t
    `);\n\n\t\t\tlet elErrorMessage = elFailPage.find('#potree_error_console');\n\t\t\telErrorMessage.html(error.stack);\n\n\t\t\t$(this.renderArea).append(elFailPage);\n\t\t}\n\n\t\tthrow error;\n\t}\n\n\t// ------------------------------------------------------------------------------------\n\t// Viewer API\n\t// ------------------------------------------------------------------------------------\n\n\tsetScene (scene) {\n\t\tif (scene === this.scene) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet oldScene = this.scene;\n\t\tthis.scene = scene;\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'scene_changed',\n\t\t\toldScene: oldScene,\n\t\t\tscene: scene\n\t\t});\n\n\t\t{ // Annotations\n\t\t\t$('.annotation').detach();\n\n\t\t\t// for(let annotation of this.scene.annotations){\n\t\t\t//\tthis.renderArea.appendChild(annotation.domElement[0]);\n\t\t\t// }\n\n\t\t\tthis.scene.annotations.traverse(annotation => {\n\t\t\t\tthis.renderArea.appendChild(annotation.domElement[0]);\n\t\t\t});\n\n\t\t\tif (!this.onAnnotationAdded) {\n\t\t\t\tthis.onAnnotationAdded = e => {\n\t\t\t\t// console.log(\"annotation added: \" + e.annotation.title);\n\n\t\t\t\t\te.annotation.traverse(node => {\n\n\t\t\t\t\t\t$(\"#potree_annotation_container\").append(node.domElement);\n\t\t\t\t\t\t//this.renderArea.appendChild(node.domElement[0]);\n\t\t\t\t\t\tnode.scene = this.scene;\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (oldScene) {\n\t\t\t\toldScene.annotations.removeEventListener('annotation_added', this.onAnnotationAdded);\n\t\t\t}\n\t\t\tthis.scene.annotations.addEventListener('annotation_added', this.onAnnotationAdded);\n\t\t}\n\t};\n\n\tsetControls(controls){\n\t\tif (controls !== this.controls) {\n\t\t\tif (this.controls) {\n\t\t\t\tthis.controls.enabled = false;\n\t\t\t\tthis.inputHandler.removeInputListener(this.controls);\n\t\t\t}\n\n\t\t\tthis.controls = controls;\n\t\t\tthis.controls.enabled = true;\n\t\t\tthis.inputHandler.addInputListener(this.controls);\n\t\t}\n\t}\n\n\tgetControls () {\n\n\t\tif(this.renderer.xr.isPresenting){\n\t\t\treturn this.vrControls;\n\t\t}else{\n\t\t\treturn this.controls;\n\t\t}\n\t\t\n\t}\n\n\tgetMinNodeSize () {\n\t\treturn this.minNodeSize;\n\t};\n\n\tsetMinNodeSize (value) {\n\t\tif (this.minNodeSize !== value) {\n\t\t\tthis.minNodeSize = value;\n\t\t\tthis.dispatchEvent({'type': 'minnodesize_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetBackground () {\n\t\treturn this.background;\n\t}\n\n\tsetBackground(bg){\n\t\tif (this.background === bg) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(bg === \"skybox\"){\n\t\t\tthis.skybox = Utils.loadSkybox(new URL(Potree.resourcePath + '/textures/skybox2/').href);\n\t\t}\n\n\t\tthis.background = bg;\n\t\tthis.dispatchEvent({'type': 'background_changed', 'viewer': this});\n\t}\n\n\tsetDescription (value) {\n\t\tthis.description = value;\n\t\t\n\t\t$('#potree_description').html(value);\n\t\t//$('#potree_description').text(value);\n\t}\n\n\tgetDescription(){\n\t\treturn this.description;\n\t}\n\n\tsetShowBoundingBox (value) {\n\t\tif (this.showBoundingBox !== value) {\n\t\t\tthis.showBoundingBox = value;\n\t\t\tthis.dispatchEvent({'type': 'show_boundingbox_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetShowBoundingBox () {\n\t\treturn this.showBoundingBox;\n\t};\n\n\tsetMoveSpeed (value) {\n\t\tif (this.moveSpeed !== value) {\n\t\t\tthis.moveSpeed = value;\n\t\t\tthis.dispatchEvent({'type': 'move_speed_changed', 'viewer': this, 'speed': value});\n\t\t}\n\t};\n\n\tgetMoveSpeed () {\n\t\treturn this.moveSpeed;\n\t};\n\n\tsetWeightClassification (w) {\n\t\tfor (let i = 0; i < this.scene.pointclouds.length; i++) {\n\t\t\tthis.scene.pointclouds[i].material.weightClassification = w;\n\t\t\tthis.dispatchEvent({'type': 'attribute_weights_changed' + i, 'viewer': this});\n\t\t}\n\t};\n\n\tsetFreeze (value) {\n\t\tvalue = Boolean(value);\n\t\tif (this.freeze !== value) {\n\t\t\tthis.freeze = value;\n\t\t\tthis.dispatchEvent({'type': 'freeze_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetFreeze () {\n\t\treturn this.freeze;\n\t};\n\n\tgetClipTask(){\n\t\treturn this.clipTask;\n\t}\n\n\tgetClipMethod(){\n\t\treturn this.clipMethod;\n\t}\n\n\tsetClipTask(value){\n\t\tif(this.clipTask !== value){\n\n\t\t\tthis.clipTask = value;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: \"cliptask_changed\", \n\t\t\t\tviewer: this});\t\t\n\t\t}\n\t}\n\n\tsetClipMethod(value){\n\t\tif(this.clipMethod !== value){\n\n\t\t\tthis.clipMethod = value;\n\t\t\t\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: \"clipmethod_changed\",\n\t\t\t\tviewer: this});\n\t\t}\n\t}\n\n\tsetElevationGradientRepeat(value){\n\t\tif(this.elevationGradientRepeat !== value){\n\n\t\t\tthis.elevationGradientRepeat = value;\n\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: \"elevation_gradient_repeat_changed\", \n\t\t\t\tviewer: this});\n\t\t}\n\t}\n\n\tsetPointBudget (value) {\n\t\tif (Potree.pointBudget !== value) {\n\t\t\tPotree.pointBudget = parseInt(value);\n\t\t\tthis.dispatchEvent({'type': 'point_budget_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetPointBudget () {\n\t\treturn Potree.pointBudget;\n\t};\n\n\tsetShowAnnotations (value) {\n\t\tif (this.showAnnotations !== value) {\n\t\t\tthis.showAnnotations = value;\n\t\t\tthis.dispatchEvent({'type': 'show_annotations_changed', 'viewer': this});\n\t\t}\n\t}\n\n\tgetShowAnnotations () {\n\t\treturn this.showAnnotations;\n\t}\n\t\n\tsetDEMCollisionsEnabled(value){\n\t\tif(this.useDEMCollisions !== value){\n\t\t\tthis.useDEMCollisions = value;\n\t\t\tthis.dispatchEvent({'type': 'use_demcollisions_changed', 'viewer': this});\n\t\t};\n\t};\n\n\tgetDEMCollisionsEnabled () {\n\t\treturn this.useDEMCollisions;\n\t};\n\n\tsetEDLEnabled (value) {\n\t\tvalue = Boolean(value) && Features.SHADER_EDL.isSupported();\n\n\t\tif (this.useEDL !== value) {\n\t\t\tthis.useEDL = value;\n\t\t\tthis.dispatchEvent({'type': 'use_edl_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetEDLEnabled () {\n\t\treturn this.useEDL;\n\t};\n\n\tsetEDLRadius (value) {\n\t\tif (this.edlRadius !== value) {\n\t\t\tthis.edlRadius = value;\n\t\t\tthis.dispatchEvent({'type': 'edl_radius_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetEDLRadius () {\n\t\treturn this.edlRadius;\n\t};\n\n\tsetEDLStrength (value) {\n\t\tif (this.edlStrength !== value) {\n\t\t\tthis.edlStrength = value;\n\t\t\tthis.dispatchEvent({'type': 'edl_strength_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetEDLStrength () {\n\t\treturn this.edlStrength;\n\t};\n\n\tsetEDLOpacity (value) {\n\t\tif (this.edlOpacity !== value) {\n\t\t\tthis.edlOpacity = value;\n\t\t\tthis.dispatchEvent({'type': 'edl_opacity_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetEDLOpacity () {\n\t\treturn this.edlOpacity;\n\t};\n\n\tsetFOV (value) {\n\t\tif (this.fov !== value) {\n\t\t\tthis.fov = value;\n\t\t\tthis.dispatchEvent({'type': 'fov_changed', 'viewer': this});\n\t\t}\n\t};\n\n\tgetFOV () {\n\t\treturn this.fov;\n\t};\n\n\tdisableAnnotations () {\n\t\tthis.scene.annotations.traverse(annotation => {\n\t\t\tannotation.domElement.css('pointer-events', 'none');\n\n\t\t\t// return annotation.visible;\n\t\t});\n\t};\n\n\tenableAnnotations () {\n\t\tthis.scene.annotations.traverse(annotation => {\n\t\t\tannotation.domElement.css('pointer-events', 'auto');\n\n\t\t\t// return annotation.visible;\n\t\t});\n\t}\n\n\tsetClassifications(classifications){\n\t\tthis.classifications = classifications;\n\n\t\tthis.dispatchEvent({'type': 'classifications_changed', 'viewer': this});\n\t}\n\n\tsetClassificationVisibility (key, value) {\n\t\tif (!this.classifications[key]) {\n\t\t\tthis.classifications[key] = {visible: value, name: 'no name'};\n\t\t\tthis.dispatchEvent({'type': 'classification_visibility_changed', 'viewer': this});\n\t\t} else if (this.classifications[key].visible !== value) {\n\t\t\tthis.classifications[key].visible = value;\n\t\t\tthis.dispatchEvent({'type': 'classification_visibility_changed', 'viewer': this});\n\t\t}\n\t}\n\n\ttoggleAllClassificationsVisibility(){\n\n\t\tlet numVisible = 0;\n\t\tlet numItems = 0;\n\t\tfor(const key of Object.keys(this.classifications)){\n\t\t\tif(this.classifications[key].visible){\n\t\t\t\tnumVisible++;\n\t\t\t}\n\t\t\tnumItems++;\n\t\t}\n\n\t\tlet visible = true;\n\t\tif(numVisible === numItems){\n\t\t\tvisible = false;\n\t\t}\n\n\t\tlet somethingChanged = false;\n\n\t\tfor(const key of Object.keys(this.classifications)){\n\t\t\tif(this.classifications[key].visible !== visible){\n\t\t\t\tthis.classifications[key].visible = visible;\n\t\t\t\tsomethingChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif(somethingChanged){\n\t\t\tthis.dispatchEvent({'type': 'classification_visibility_changed', 'viewer': this});\n\t\t}\n\t}\n\n\tsetFilterReturnNumberRange(from, to){\n\t\tthis.filterReturnNumberRange = [from, to];\n\t\tthis.dispatchEvent({'type': 'filter_return_number_range_changed', 'viewer': this});\n\t}\n\n\tsetFilterNumberOfReturnsRange(from, to){\n\t\tthis.filterNumberOfReturnsRange = [from, to];\n\t\tthis.dispatchEvent({'type': 'filter_number_of_returns_range_changed', 'viewer': this});\n\t}\n\n\tsetFilterGPSTimeRange(from, to){\n\t\tthis.filterGPSTimeRange = [from, to];\n\t\tthis.dispatchEvent({'type': 'filter_gps_time_range_changed', 'viewer': this});\n\t}\n\n\tsetFilterPointSourceIDRange(from, to){\n\t\tthis.filterPointSourceIDRange = [from, to]\n\t\tthis.dispatchEvent({'type': 'filter_point_source_id_range_changed', 'viewer': this});\n\t}\n\n\tsetLengthUnit (value) {\n\t\tswitch (value) {\n\t\t\tcase 'm':\n\t\t\t\tthis.lengthUnit = LengthUnits.METER;\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.METER;\n\t\t\t\tbreak;\n\t\t\tcase 'ft':\n\t\t\t\tthis.lengthUnit = LengthUnits.FEET;\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.FEET;\n\t\t\t\tbreak;\n\t\t\tcase 'in':\n\t\t\t\tthis.lengthUnit = LengthUnits.INCH;\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.INCH;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.dispatchEvent({ 'type': 'length_unit_changed', 'viewer': this, value: value});\n\t};\n\n\tsetLengthUnitAndDisplayUnit(lengthUnitValue, lengthUnitDisplayValue) {\n\t\tswitch (lengthUnitValue) {\n\t\t\tcase 'm':\n\t\t\t\tthis.lengthUnit = LengthUnits.METER;\n\t\t\t\tbreak;\n\t\t\tcase 'ft':\n\t\t\t\tthis.lengthUnit = LengthUnits.FEET;\n\t\t\t\tbreak;\n\t\t\tcase 'in':\n\t\t\t\tthis.lengthUnit = LengthUnits.INCH;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tswitch (lengthUnitDisplayValue) {\n\t\t\tcase 'm':\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.METER;\n\t\t\t\tbreak;\n\t\t\tcase 'ft':\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.FEET;\n\t\t\t\tbreak;\n\t\t\tcase 'in':\n\t\t\t\tthis.lengthUnitDisplay = LengthUnits.INCH;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.dispatchEvent({ 'type': 'length_unit_changed', 'viewer': this, value: lengthUnitValue });\n\t};\n\n\tzoomTo(node, factor, animationDuration = 0){\n\t\tlet view = this.scene.view;\n\n\t\tlet camera = this.scene.cameraP.clone();\n\t\tcamera.rotation.copy(this.scene.cameraP.rotation);\n\t\tcamera.rotation.order = \"ZXY\";\n\t\tcamera.rotation.x = Math.PI / 2 + view.pitch;\n\t\tcamera.rotation.z = view.yaw;\n\t\tcamera.updateMatrix();\n\t\tcamera.updateMatrixWorld();\n\t\tcamera.zoomTo(node, factor);\n\n\t\tlet bs;\n\t\tif (node.boundingSphere) {\n\t\t\tbs = node.boundingSphere;\n\t\t} else if (node.geometry && node.geometry.boundingSphere) {\n\t\t\tbs = node.geometry.boundingSphere;\n\t\t} else {\n\t\t\tbs = node.boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\t}\n\t\tbs = bs.clone().applyMatrix4(node.matrixWorld); \n\n\t\tlet startPosition = view.position.clone();\n\t\tlet endPosition = camera.position.clone();\n\t\tlet startTarget = view.getPivot();\n\t\tlet endTarget = bs.center;\n\t\tlet startRadius = view.radius;\n\t\tlet endRadius = endPosition.distanceTo(endTarget);\n\n\t\tlet easing = TWEEN.Easing.Quartic.Out;\n\n\t\t{ // animate camera position\n\t\t\tlet pos = startPosition.clone();\n\t\t\tlet tween = new TWEEN.Tween(pos).to(endPosition, animationDuration);\n\t\t\ttween.easing(easing);\n\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tview.position.copy(pos);\n\t\t\t});\n\n\t\t\ttween.start();\n\t\t}\n\n\t\t{ // animate camera target\n\t\t\tlet target = startTarget.clone();\n\t\t\tlet tween = new TWEEN.Tween(target).to(endTarget, animationDuration);\n\t\t\ttween.easing(easing);\n\t\t\ttween.onUpdate(() => {\n\t\t\t\tview.lookAt(target);\n\t\t\t});\n\t\t\ttween.onComplete(() => {\n\t\t\t\tview.lookAt(target);\n\t\t\t\tthis.dispatchEvent({type: 'focusing_finished', target: this});\n\t\t\t});\n\n\t\t\tthis.dispatchEvent({type: 'focusing_started', target: this});\n\t\t\ttween.start();\n\t\t}\n\t};\n\n\tmoveToGpsTimeVicinity(time){\n\t\tconst result = Potree.Utils.findClosestGpsTime(time, viewer);\n\n\t\tconst box = result.node.pointcloud.deepestNodeAt(result.position).getBoundingBox();\n\t\tconst diameter = box.min.distanceTo(box.max);\n\n\t\tconst camera = this.scene.getActiveCamera();\n\t\tconst offset = camera.getWorldDirection(new THREE.Vector3()).multiplyScalar(diameter);\n\t\tconst newCamPos = result.position.clone().sub(offset);\n\n\t\tthis.scene.view.position.copy(newCamPos);\n\t\tthis.scene.view.lookAt(result.position);\n\t}\n\n\tshowAbout () {\n\t\t$(function () {\n\t\t\t$('#about-panel').dialog();\n\t\t});\n\t};\n\n\tgetBoundingBox (pointclouds) {\n\t\treturn this.scene.getBoundingBox(pointclouds);\n\t};\n\n\tgetGpsTimeExtent(){\n\t\tconst range = [Infinity, -Infinity];\n\n\t\tfor(const pointcloud of this.scene.pointclouds){\n\t\t\tconst attributes = pointcloud.pcoGeometry.pointAttributes.attributes;\n\t\t\tconst aGpsTime = attributes.find(a => a.name === \"gps-time\");\n\n\t\t\tif(aGpsTime){\n\t\t\t\trange[0] = Math.min(range[0], aGpsTime.range[0]);\n\t\t\t\trange[1] = Math.max(range[1], aGpsTime.range[1]);\n\t\t\t}\n\t\t}\n\n\t\treturn range;\n\t}\n\n\tfitToScreen (factor = 1, animationDuration = 0) {\n\t\tlet box = this.getBoundingBox(this.scene.pointclouds);\n\n\t\tlet node = new THREE.Object3D();\n\t\tnode.boundingBox = box;\n\n\t\tthis.zoomTo(node, factor, animationDuration);\n\t\tthis.controls.stop();\n\t};\n\n\ttoggleNavigationCube() {\n\t\tthis.navigationCube.visible = !this.navigationCube.visible;\n\t}\n\n\tsetView(view) {\n\t\tif(!view) return;\n\n\t\tswitch(view) {\n\t\t\tcase \"F\":\n\t\t\t\tthis.setFrontView();\n\t\t\t\tbreak;\n\t\t\tcase \"B\":\n\t\t\t\tthis.setBackView();\n\t\t\t\tbreak;\n\t\t\tcase \"L\":\n\t\t\t\tthis.setLeftView();\n\t\t\t\tbreak;\n\t\t\tcase \"R\":\n\t\t\t\tthis.setRightView();\n\t\t\t\tbreak;\n\t\t\tcase \"U\":\n\t\t\t\tthis.setTopView();\n\t\t\t\tbreak;\n\t\t\tcase \"D\":\n\t\t\t\tthis.setBottomView();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tsetTopView(){\n\t\tthis.scene.view.yaw = 0;\n\t\tthis.scene.view.pitch = -Math.PI / 2;\n\n\t\tthis.fitToScreen();\n\t};\n\t\n\tsetBottomView(){\n\t\tthis.scene.view.yaw = -Math.PI;\n\t\tthis.scene.view.pitch = Math.PI / 2;\n\t\t\n\t\tthis.fitToScreen();\n\t};\n\n\tsetFrontView(){\n\t\tthis.scene.view.yaw = 0;\n\t\tthis.scene.view.pitch = 0;\n\n\t\tthis.fitToScreen();\n\t};\n\t\n\tsetBackView(){\n\t\tthis.scene.view.yaw = Math.PI;\n\t\tthis.scene.view.pitch = 0;\n\t\t\n\t\tthis.fitToScreen();\n\t};\n\n\tsetLeftView(){\n\t\tthis.scene.view.yaw = -Math.PI / 2;\n\t\tthis.scene.view.pitch = 0;\n\n\t\tthis.fitToScreen();\n\t};\n\n\tsetRightView () {\n\t\tthis.scene.view.yaw = Math.PI / 2;\n\t\tthis.scene.view.pitch = 0;\n\n\t\tthis.fitToScreen();\n\t};\n\n\tflipYZ () {\n\t\tthis.isFlipYZ = !this.isFlipYZ;\n\n\t\t// TODO flipyz\n\t\tconsole.log('TODO');\n\t}\n\t\n\tsetCameraMode(mode){\n\t\tthis.scene.cameraMode = mode;\n\n\t\tfor(let pointcloud of this.scene.pointclouds) {\n\t\t\tpointcloud.material.useOrthographicCamera = mode == CameraMode.ORTHOGRAPHIC;\n\t\t}\n\t}\n\n\tgetProjection(){\n\t\tconst pointcloud = this.scene.pointclouds[0];\n\n\t\tif(pointcloud){\n\t\t\treturn pointcloud.projection;\n\t\t}else{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync loadProject(url){\n\n\t\tconst response = await fetch(url);\n\t\n\t\tconst text = await response.text();\n\t\tconst json = JSON5.parse(text);\n\t\t// const json = JSON.parse(text);\n\n\t\tif(json.type === \"Potree\"){\n\t\t\tPotree.loadProject(viewer, json);\n\t\t}\n\n\t\t//Potree.loadProject(this, url);\n\t}\n\n\tsaveProject(){\n\t\treturn Potree.saveProject(this);\n\t}\n\t\n\tloadSettingsFromURL(){\n\t\tif(Utils.getParameterByName(\"pointSize\")){\n\t\t\tthis.setPointSize(parseFloat(Utils.getParameterByName(\"pointSize\")));\n\t\t}\n\t\t\n\t\tif(Utils.getParameterByName(\"FOV\")){\n\t\t\tthis.setFOV(parseFloat(Utils.getParameterByName(\"FOV\")));\n\t\t}\n\t\t\n\t\tif(Utils.getParameterByName(\"opacity\")){\n\t\t\tthis.setOpacity(parseFloat(Utils.getParameterByName(\"opacity\")));\n\t\t}\n\t\t\n\t\tif(Utils.getParameterByName(\"edlEnabled\")){\n\t\t\tlet enabled = Utils.getParameterByName(\"edlEnabled\") === \"true\";\n\t\t\tthis.setEDLEnabled(enabled);\n\t\t}\n\n\t\tif (Utils.getParameterByName('edlRadius')) {\n\t\t\tthis.setEDLRadius(parseFloat(Utils.getParameterByName('edlRadius')));\n\t\t}\n\n\t\tif (Utils.getParameterByName('edlStrength')) {\n\t\t\tthis.setEDLStrength(parseFloat(Utils.getParameterByName('edlStrength')));\n\t\t}\n\n\t\tif (Utils.getParameterByName('pointBudget')) {\n\t\t\tthis.setPointBudget(parseFloat(Utils.getParameterByName('pointBudget')));\n\t\t}\n\n\t\tif (Utils.getParameterByName('showBoundingBox')) {\n\t\t\tlet enabled = Utils.getParameterByName('showBoundingBox') === 'true';\n\t\t\tif (enabled) {\n\t\t\t\tthis.setShowBoundingBox(true);\n\t\t\t} else {\n\t\t\t\tthis.setShowBoundingBox(false);\n\t\t\t}\n\t\t}\n\n\t\tif (Utils.getParameterByName('material')) {\n\t\t\tlet material = Utils.getParameterByName('material');\n\t\t\tthis.setMaterial(material);\n\t\t}\n\n\t\tif (Utils.getParameterByName('pointSizing')) {\n\t\t\tlet sizing = Utils.getParameterByName('pointSizing');\n\t\t\tthis.setPointSizing(sizing);\n\t\t}\n\n\t\tif (Utils.getParameterByName('quality')) {\n\t\t\tlet quality = Utils.getParameterByName('quality');\n\t\t\tthis.setQuality(quality);\n\t\t}\n\n\t\tif (Utils.getParameterByName('position')) {\n\t\t\tlet value = Utils.getParameterByName('position');\n\t\t\tvalue = value.replace('[', '').replace(']', '');\n\t\t\tlet tokens = value.split(';');\n\t\t\tlet x = parseFloat(tokens[0]);\n\t\t\tlet y = parseFloat(tokens[1]);\n\t\t\tlet z = parseFloat(tokens[2]);\n\n\t\t\tthis.scene.view.position.set(x, y, z);\n\t\t}\n\n\t\tif (Utils.getParameterByName('target')) {\n\t\t\tlet value = Utils.getParameterByName('target');\n\t\t\tvalue = value.replace('[', '').replace(']', '');\n\t\t\tlet tokens = value.split(';');\n\t\t\tlet x = parseFloat(tokens[0]);\n\t\t\tlet y = parseFloat(tokens[1]);\n\t\t\tlet z = parseFloat(tokens[2]);\n\n\t\t\tthis.scene.view.lookAt(new THREE.Vector3(x, y, z));\n\t\t}\n\n\t\tif (Utils.getParameterByName('background')) {\n\t\t\tlet value = Utils.getParameterByName('background');\n\t\t\tthis.setBackground(value);\n\t\t}\n\n\t\t// if(Utils.getParameterByName(\"elevationRange\")){\n\t\t//\tlet value = Utils.getParameterByName(\"elevationRange\");\n\t\t//\tvalue = value.replace(\"[\", \"\").replace(\"]\", \"\");\n\t\t//\tlet tokens = value.split(\";\");\n\t\t//\tlet x = parseFloat(tokens[0]);\n\t\t//\tlet y = parseFloat(tokens[1]);\n\t\t//\n\t\t//\tthis.setElevationRange(x, y);\n\t\t//\t//this.scene.view.target.set(x, y, z);\n\t\t// }\n\t};\n\n\t// ------------------------------------------------------------------------------------\n\t// Viewer Internals\n\t// ------------------------------------------------------------------------------------\n\n\tcreateControls () {\n\t\t{ // create FIRST PERSON CONTROLS\n\t\t\tthis.fpControls = new FirstPersonControls(this);\n\t\t\tthis.fpControls.enabled = false;\n\t\t\tthis.fpControls.addEventListener('start', this.disableAnnotations.bind(this));\n\t\t\tthis.fpControls.addEventListener('end', this.enableAnnotations.bind(this));\n\t\t}\n\n\t\t// { // create GEO CONTROLS\n\t\t//\tthis.geoControls = new GeoControls(this.scene.camera, this.renderer.domElement);\n\t\t//\tthis.geoControls.enabled = false;\n\t\t//\tthis.geoControls.addEventListener(\"start\", this.disableAnnotations.bind(this));\n\t\t//\tthis.geoControls.addEventListener(\"end\", this.enableAnnotations.bind(this));\n\t\t//\tthis.geoControls.addEventListener(\"move_speed_changed\", (event) => {\n\t\t//\t\tthis.setMoveSpeed(this.geoControls.moveSpeed);\n\t\t//\t});\n\t\t// }\n\n\t\t{ // create ORBIT CONTROLS\n\t\t\tthis.orbitControls = new OrbitControls(this);\n\t\t\tthis.orbitControls.enabled = false;\n\t\t\tthis.orbitControls.addEventListener('start', this.disableAnnotations.bind(this));\n\t\t\tthis.orbitControls.addEventListener('end', this.enableAnnotations.bind(this));\n\t\t}\n\n\t\t{ // create EARTH CONTROLS\n\t\t\tthis.earthControls = new EarthControls(this);\n\t\t\tthis.earthControls.enabled = false;\n\t\t\tthis.earthControls.addEventListener('start', this.disableAnnotations.bind(this));\n\t\t\tthis.earthControls.addEventListener('end', this.enableAnnotations.bind(this));\n\t\t}\n\n\t\t{ // create DEVICE ORIENTATION CONTROLS\n\t\t\tthis.deviceControls = new DeviceOrientationControls(this);\n\t\t\tthis.deviceControls.enabled = false;\n\t\t\tthis.deviceControls.addEventListener('start', this.disableAnnotations.bind(this));\n\t\t\tthis.deviceControls.addEventListener('end', this.enableAnnotations.bind(this));\n\t\t}\n\n\t\t{ // create VR CONTROLS\n\t\t\tthis.vrControls = new VRControls(this);\n\t\t\tthis.vrControls.enabled = false;\n\t\t\tthis.vrControls.addEventListener('start', this.disableAnnotations.bind(this));\n\t\t\tthis.vrControls.addEventListener('end', this.enableAnnotations.bind(this));\n\t\t}\n\n\n\t};\n\n\ttoggleSidebar () {\n\t\tlet renderArea = $('#potree_render_area');\n\t\tlet isVisible = renderArea.css('left') !== '0px';\n\n\t\tif (isVisible) {\n\t\t\trenderArea.css('left', '0px');\n\t\t} else {\n\t\t\trenderArea.css('left', '300px');\n\t\t}\n\t};\n\n\ttoggleMap () {\n\t\t// let map = $('#potree_map');\n\t\t// map.toggle(100);\n\n\t\tif (this.mapView) {\n\t\t\tthis.mapView.toggle();\n\t\t}\n\t};\n\n\tonGUILoaded(callback){\n\t\tif(this.guiLoaded){\n\t\t\tcallback();\n\t\t}else{\n\t\t\tthis.guiLoadTasks.push(callback);\n\t\t}\n\t}\n\n\tpromiseGuiLoaded(){\n\t\treturn new Promise( resolve => {\n\n\t\t\tif(this.guiLoaded){\n\t\t\t\tresolve();\n\t\t\t}else{\n\t\t\t\tthis.guiLoadTasks.push(resolve);\n\t\t\t}\n\t\t\n\t\t});\n\t}\n\n\tloadGUI(callback){\n\n\t\tif(callback){\n\t\t\tthis.onGUILoaded(callback);\n\t\t}\n\n\t\tlet viewer = this;\n\t\tlet sidebarContainer = $('#potree_sidebar_container');\n\t\tsidebarContainer.load(new URL(Potree.scriptPath + '/sidebar.html').href, () => {\n\t\t\tsidebarContainer.css('width', '300px');\n\t\t\tsidebarContainer.css('height', '100%');\n\n\t\t\tlet imgMenuToggle = document.createElement('img');\n\t\t\timgMenuToggle.src = new URL(Potree.resourcePath + '/icons/menu_button.svg').href;\n\t\t\timgMenuToggle.onclick = this.toggleSidebar;\n\t\t\timgMenuToggle.classList.add('potree_menu_toggle');\n\n\t\t\tlet imgMapToggle = document.createElement('img');\n\t\t\timgMapToggle.src = new URL(Potree.resourcePath + '/icons/map_icon.png').href;\n\t\t\timgMapToggle.style.display = 'none';\n\t\t\timgMapToggle.onclick = e => { this.toggleMap(); };\n\t\t\timgMapToggle.id = 'potree_map_toggle';\n\n\t\t\t\n\n\t\t\tlet elButtons = $(\"#potree_quick_buttons\").get(0);\n\n\t\t\telButtons.append(imgMenuToggle);\n\t\t\telButtons.append(imgMapToggle);\n\n\n\t\t\tVRButton.createButton(this.renderer).then(vrButton => {\n\n\t\t\t\tif(vrButton == null){\n\t\t\t\t\tconsole.log(\"VR not supported or active.\");\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.renderer.xr.enabled = true;\n\n\t\t\t\tlet element = vrButton.element;\n\n\t\t\t\telement.style.position = \"\";\n\t\t\t\telement.style.bottom = \"\";\n\t\t\t\telement.style.left = \"\";\n\t\t\t\telement.style.margin = \"4px\";\n\t\t\t\telement.style.fontSize = \"100%\";\n\t\t\t\telement.style.width = \"2.5em\";\n\t\t\t\telement.style.height = \"2.5em\";\n\t\t\t\telement.style.padding = \"0\";\n\t\t\t\telement.style.textShadow = \"black 2px 2px 2px\";\n\t\t\t\telement.style.display = \"block\";\n\n\t\t\t\telButtons.append(element);\n\n\t\t\t\tvrButton.onStart(() => {\n\t\t\t\t\tthis.dispatchEvent({type: \"vr_start\"});\n\t\t\t\t});\n\n\t\t\t\tvrButton.onEnd(() => {\n\t\t\t\t\tthis.dispatchEvent({type: \"vr_end\"});\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tthis.mapView = new MapView(this);\n\t\t\tthis.mapView.init();\n\n\t\t\ti18n.init({\n\t\t\t\tlng: 'en',\n\t\t\t\tresGetPath: Potree.resourcePath + '/lang/__lng__/__ns__.json',\n\t\t\t\tpreload: ['en', 'fr', 'de', 'jp', 'se', 'es'],\n\t\t\t\tgetAsync: true,\n\t\t\t\tdebug: false\n\t\t\t}, function (t) {\n\t\t\t\t// Start translation once everything is loaded\n\t\t\t\t$('body').i18n();\n\t\t\t});\n\n\t\t\t$(() => {\n\t\t\t\t//initSidebar(this);\n\t\t\t\tlet sidebar = new Sidebar(this);\n\t\t\t\tsidebar.init();\n\n\t\t\t\tthis.sidebar = sidebar;\n\n\t\t\t\t//if (callback) {\n\t\t\t\t//\t$(callback);\n\t\t\t\t//}\n\n\t\t\t\tlet elProfile = $('
    ').load(new URL(Potree.scriptPath + '/profile.html').href, () => {\n\t\t\t\t\t$(document.body).append(elProfile.children());\n\t\t\t\t\tthis.profileWindow = new ProfileWindow(this);\n\t\t\t\t\tthis.profileWindowController = new ProfileWindowController(this);\n\n\t\t\t\t\t$('#profile_window').draggable({\n\t\t\t\t\t\thandle: $('#profile_titlebar'),\n\t\t\t\t\t\tcontainment: $(document.body)\n\t\t\t\t\t});\n\t\t\t\t\t$('#profile_window').resizable({\n\t\t\t\t\t\tcontainment: $(document.body),\n\t\t\t\t\t\thandles: 'n, e, s, w'\n\t\t\t\t\t});\n\n\t\t\t\t\t$(() => {\n\t\t\t\t\t\tthis.guiLoaded = true;\n\t\t\t\t\t\tfor(let task of this.guiLoadTasks){\n\t\t\t\t\t\t\ttask();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\t\n\n\t\t\t});\n\n\t\t\t\n\t\t});\n\n\t\treturn this.promiseGuiLoaded();\n\t}\n\n\tsetLanguage (lang) {\n\t\ti18n.setLng(lang);\n\t\t$('body').i18n();\n\t}\n\n\tsetServer (server) {\n\t\tthis.server = server;\n\t}\n\n\tinitDragAndDrop(){\n\t\tfunction allowDrag(e) {\n\t\t\te.dataTransfer.dropEffect = 'copy';\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tlet dropHandler = async (event) => {\n\t\t\tconsole.log(event);\n\t\t\tevent.preventDefault();\n\n\t\t\tfor(const item of event.dataTransfer.items){\n\t\t\t\tconsole.log(item);\n\n\t\t\t\tif(item.kind !== \"file\"){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst file = item.getAsFile();\n\n\t\t\t\tconst isJson = file.name.toLowerCase().endsWith(\".json\");\n\t\t\t\tconst isGeoPackage = file.name.toLowerCase().endsWith(\".gpkg\");\n\n\t\t\t\tif(isJson){\n\t\t\t\t\ttry{\n\n\t\t\t\t\t\tconst text = await file.text();\n\t\t\t\t\t\tconst json = JSON.parse(text);\n\n\t\t\t\t\t\tif(json.type === \"Potree\"){\n\t\t\t\t\t\t\tPotree.loadProject(viewer, json);\n\t\t\t\t\t\t}\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\tconsole.error(\"failed to parse the dropped file as JSON\");\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t}\n\t\t\t\t}else if(isGeoPackage){\n\t\t\t\t\tconst hasPointcloud = viewer.scene.pointclouds.length > 0;\n\n\t\t\t\t\tif(!hasPointcloud){\n\t\t\t\t\t\tlet msg = \"At least one point cloud is needed that specifies the \";\n\t\t\t\t\t\tmsg += \"coordinate reference system before loading vector data.\";\n\t\t\t\t\t\tconsole.error(msg);\n\t\t\t\t\t}else{\n\n\t\t\t\t\t\tproj4.defs(\"WGS84\", \"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs\");\n\t\t\t\t\t\tproj4.defs(\"pointcloud\", this.getProjection());\n\t\t\t\t\t\tlet transform = proj4(\"WGS84\", \"pointcloud\");\n\n\t\t\t\t\t\tconst buffer = await file.arrayBuffer();\n\n\t\t\t\t\t\tconst params = {\n\t\t\t\t\t\t\ttransform: transform,\n\t\t\t\t\t\t\tsource: file.name,\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\tconst geo = await Potree.GeoPackageLoader.loadBuffer(buffer, params);\n\t\t\t\t\t\tviewer.scene.addGeopackage(geo);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t};\n\n\n\t\t$(\"body\")[0].addEventListener(\"dragenter\", allowDrag);\n\t\t$(\"body\")[0].addEventListener(\"dragover\", allowDrag);\n\t\t$(\"body\")[0].addEventListener(\"drop\", dropHandler);\n\t}\n\n\tinitThree () {\n\n\t\tconsole.log(`initializing three.js ${THREE.REVISION}`);\n\n\t\tlet width = this.renderArea.clientWidth;\n\t\tlet height = this.renderArea.clientHeight;\n\n\t\tlet contextAttributes = {\n\t\t\talpha: true,\n\t\t\tdepth: true,\n\t\t\tstencil: false,\n\t\t\tantialias: false,\n\t\t\t//premultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: true,\n\t\t\tpowerPreference: \"high-performance\",\n\t\t};\n\n\t\t// let contextAttributes = {\n\t\t// \talpha: false,\n\t\t// \tpreserveDrawingBuffer: true,\n\t\t// };\n\n\t\t// let contextAttributes = {\n\t\t// \talpha: false,\n\t\t// \tpreserveDrawingBuffer: true,\n\t\t// };\n\n\t\tlet canvas = document.createElement(\"canvas\");\n\n\t\tlet context = canvas.getContext('webgl', contextAttributes );\n\n\t\tthis.renderer = new THREE.WebGLRenderer({\n\t\t\talpha: true, \n\t\t\tpremultipliedAlpha: false,\n\t\t\tcanvas: canvas,\n\t\t\tcontext: context});\n\t\tthis.renderer.sortObjects = false;\n\t\tthis.renderer.setSize(width, height);\n\t\tthis.renderer.autoClear = false;\n\t\tthis.renderArea.appendChild(this.renderer.domElement);\n\t\tthis.renderer.domElement.tabIndex = '2222';\n\t\tthis.renderer.domElement.style.position = 'absolute';\n\t\tthis.renderer.domElement.addEventListener('mousedown', () => {\n\t\t\tthis.renderer.domElement.focus();\n\t\t});\n\t\t//this.renderer.domElement.focus();\n\n\t\t// NOTE: If extension errors occur, pass the string into this.renderer.extensions.get(x) before enabling\n\t\t// enable frag_depth extension for the interpolation shader, if available\n\t\tlet gl = this.renderer.getContext();\n\t\tgl.getExtension('EXT_frag_depth');\n\t\tgl.getExtension('WEBGL_depth_texture');\n\t\tgl.getExtension('WEBGL_color_buffer_float'); \t// Enable explicitly for more portability, EXT_color_buffer_float is the proper name in WebGL 2\n\t\t\n\t\tif(gl.createVertexArray == null){\n\t\t\tlet extVAO = gl.getExtension('OES_vertex_array_object');\n\n\t\t\tif(!extVAO){\n\t\t\t\tthrow new Error(\"OES_vertex_array_object extension not supported\");\n\t\t\t}\n\n\t\t\tgl.createVertexArray = extVAO.createVertexArrayOES.bind(extVAO);\n\t\t\tgl.bindVertexArray = extVAO.bindVertexArrayOES.bind(extVAO);\n\t\t}\n\t\t\n\t}\n\n\tupdateAnnotations () {\n\n\t\tif(!this.visibleAnnotations){\n\t\t\tthis.visibleAnnotations = new Set();\n\t\t}\n\n\t\tthis.scene.annotations.updateBounds();\n\t\tthis.scene.cameraP.updateMatrixWorld();\n\t\tthis.scene.cameraO.updateMatrixWorld();\n\t\t\n\t\tlet distances = [];\n\n\t\tlet renderAreaSize = this.renderer.getSize(new THREE.Vector2());\n\n\t\tlet viewer = this;\n\n\t\tlet visibleNow = [];\n\t\tthis.scene.annotations.traverse(annotation => {\n\n\t\t\tif (annotation === this.scene.annotations) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!annotation.visible) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tannotation.scene = this.scene;\n\n\t\t\tlet element = annotation.domElement;\n\n\t\t\tlet position = annotation.position.clone();\n\t\t\tposition.add(annotation.offset);\n\t\t\tif (!position) {\n\t\t\t\tposition = annotation.boundingBox.getCenter(new THREE.Vector3());\n\t\t\t}\n\n\t\t\tlet distance = viewer.scene.cameraP.position.distanceTo(position);\n\t\t\tlet radius = annotation.boundingBox.getBoundingSphere(new THREE.Sphere()).radius;\n\n\t\t\tlet screenPos = new THREE.Vector3();\n\t\t\tlet screenSize = 0;\n\n\t\t\t{\n\t\t\t\t// SCREEN POS\n\t\t\t\tscreenPos.copy(position).project(this.scene.getActiveCamera());\n\t\t\t\tscreenPos.x = renderAreaSize.x * (screenPos.x + 1) / 2;\n\t\t\t\tscreenPos.y = renderAreaSize.y * (1 - (screenPos.y + 1) / 2);\n\n\n\t\t\t\t// SCREEN SIZE\n\t\t\t\tif(viewer.scene.cameraMode == CameraMode.PERSPECTIVE) {\n\t\t\t\t\tlet fov = Math.PI * viewer.scene.cameraP.fov / 180;\n\t\t\t\t\tlet slope = Math.tan(fov / 2.0);\n\t\t\t\t\tlet projFactor = 0.5 * renderAreaSize.y / (slope * distance);\n\t\t\t\t\tscreenSize = radius * projFactor;\n\t\t\t\t} else {\n\t\t\t\t\tscreenSize = Utils.projectedRadiusOrtho(radius, viewer.scene.cameraO.projectionMatrix, renderAreaSize.x, renderAreaSize.y);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telement.css(\"left\", screenPos.x + \"px\");\n\t\t\telement.css(\"top\", screenPos.y + \"px\");\n\t\t\t//element.css(\"display\", \"block\");\n\n\t\t\tlet zIndex = 10000000 - distance * (10000000 / this.scene.cameraP.far);\n\t\t\tif(annotation.descriptionVisible){\n\t\t\t\tzIndex += 10000000;\n\t\t\t}\n\t\t\telement.css(\"z-index\", parseInt(zIndex));\n\n\t\t\tif(annotation.children.length > 0){\n\t\t\t\tlet expand = screenSize > annotation.collapseThreshold || annotation.boundingBox.containsPoint(this.scene.getActiveCamera().position);\n\t\t\t\tannotation.expand = expand;\n\n\t\t\t\tif (!expand) {\n\t\t\t\t\t//annotation.display = (screenPos.z >= -1 && screenPos.z <= 1);\n\t\t\t\t\tlet inFrustum = (screenPos.z >= -1 && screenPos.z <= 1);\n\t\t\t\t\tif(inFrustum){\n\t\t\t\t\t\tvisibleNow.push(annotation);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn expand;\n\t\t\t} else {\n\t\t\t\t//annotation.display = (screenPos.z >= -1 && screenPos.z <= 1);\n\t\t\t\tlet inFrustum = (screenPos.z >= -1 && screenPos.z <= 1);\n\t\t\t\tif(inFrustum){\n\t\t\t\t\tvisibleNow.push(annotation);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t});\n\n\t\tlet notVisibleAnymore = new Set(this.visibleAnnotations);\n\t\tfor(let annotation of visibleNow){\n\t\t\tannotation.display = true;\n\t\t\t\n\t\t\tnotVisibleAnymore.delete(annotation);\n\t\t}\n\t\tthis.visibleAnnotations = visibleNow;\n\n\t\tfor(let annotation of notVisibleAnymore){\n\t\t\tannotation.display = false;\n\t\t}\n\n\t}\n\n\tupdateMaterialDefaults(pointcloud){\n\t\t// PROBLEM STATEMENT:\n\t\t// * [min, max] of intensity, source id, etc. are computed as point clouds are loaded\n\t\t// * the point cloud material won't know the range it should use until some data is loaded\n\t\t// * users can modify the range at runtime, but sensible default ranges should be \n\t\t// applied even if no GUI is present\n\t\t// * display ranges shouldn't suddenly change even if the actual range changes over time.\n\t\t// e.g. the root node has intensity range [1, 478]. One of the descendants increases range to \n\t\t// [0, 2047]. We should not automatically change to the new range because that would result\n\t\t// in sudden and drastic changes of brightness. We should adjust the min/max of the sidebar slider.\n\n\t\tconst material = pointcloud.material;\n\n\t\tconst attIntensity = pointcloud.getAttribute(\"intensity\");\n\t\t\n\t\tif(attIntensity != null && material.intensityRange[0] === Infinity){\n\t\t\tmaterial.intensityRange = [...attIntensity.range];\n\t\t}\n\n\t\t// const attIntensity = pointcloud.getAttribute(\"intensity\");\n\t\t// if(attIntensity && material.intensityRange[0] === Infinity){\n\t\t// \tmaterial.intensityRange = [...attIntensity.range];\n\t\t// }\n\n\t\t// let attributes = pointcloud.getAttributes();\n\n\t\t// for(let attribute of attributes.attributes){\n\t\t// \tif(attribute.range){\n\t\t// \t\tlet range = [...attribute.range];\n\t\t// \t\tmaterial.computedRange.set(attribute.name, range);\n\t\t// \t\t//material.setRange(attribute.name, range);\n\t\t// \t}\n\t\t// }\n\n\n\t}\n\n\tupdate(delta, timestamp){\n\n\t\tif(Potree.measureTimings) performance.mark(\"update-start\");\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'update_start',\n\t\t\tdelta: delta,\n\t\t\ttimestamp: timestamp});\n\n\t\t\n\t\tconst scene = this.scene;\n\t\tconst camera = scene.getActiveCamera();\n\t\tconst visiblePointClouds = this.scene.pointclouds.filter(pc => pc.visible)\n\t\t\n\t\tPotree.pointLoadLimit = Potree.pointBudget * 2;\n\n\t\tconst lTarget = camera.position.clone().add(camera.getWorldDirection(new THREE.Vector3()).multiplyScalar(1000));\n\t\tthis.scene.directionalLight.position.copy(camera.position);\n\t\tthis.scene.directionalLight.lookAt(lTarget);\n\n\n\t\tfor (let pointcloud of visiblePointClouds) {\n\n\t\t\tpointcloud.showBoundingBox = this.showBoundingBox;\n\t\t\tpointcloud.generateDEM = this.generateDEM;\n\t\t\tpointcloud.minimumNodePixelSize = this.minNodeSize;\n\n\t\t\tlet material = pointcloud.material;\n\n\t\t\tmaterial.uniforms.uFilterReturnNumberRange.value = this.filterReturnNumberRange;\n\t\t\tmaterial.uniforms.uFilterNumberOfReturnsRange.value = this.filterNumberOfReturnsRange;\n\t\t\tmaterial.uniforms.uFilterGPSTimeClipRange.value = this.filterGPSTimeRange;\n\t\t\tmaterial.uniforms.uFilterPointSourceIDClipRange.value = this.filterPointSourceIDRange;\n\n\t\t\tmaterial.classification = this.classifications;\n\t\t\tmaterial.recomputeClassification();\n\n\t\t\tthis.updateMaterialDefaults(pointcloud);\n\t\t}\n\n\t\t{\n\t\t\tif(this.showBoundingBox){\n\t\t\t\tlet bbRoot = this.scene.scene.getObjectByName(\"potree_bounding_box_root\");\n\t\t\t\tif(!bbRoot){\n\t\t\t\t\tlet node = new THREE.Object3D();\n\t\t\t\t\tnode.name = \"potree_bounding_box_root\";\n\t\t\t\t\tthis.scene.scene.add(node);\n\t\t\t\t\tbbRoot = node;\n\t\t\t\t}\n\n\t\t\t\tlet visibleBoxes = [];\n\t\t\t\tfor(let pointcloud of this.scene.pointclouds){\n\t\t\t\t\tfor(let node of pointcloud.visibleNodes.filter(vn => vn.boundingBoxNode !== undefined)){\n\t\t\t\t\t\tlet box = node.boundingBoxNode;\n\t\t\t\t\t\tvisibleBoxes.push(box);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbbRoot.children = visibleBoxes;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.freeze) {\n\t\t\tlet result = Potree.updatePointClouds(scene.pointclouds, camera, this.renderer);\n\n\n\t\t\t// DEBUG - ONLY DISPLAY NODES THAT INTERSECT MOUSE\n\t\t\t//if(false){ \n\n\t\t\t//\tlet renderer = viewer.renderer;\n\t\t\t//\tlet mouse = viewer.inputHandler.mouse;\n\n\t\t\t//\tlet nmouse = {\n\t\t\t//\t\tx: (mouse.x / renderer.domElement.clientWidth) * 2 - 1,\n\t\t\t//\t\ty: -(mouse.y / renderer.domElement.clientHeight) * 2 + 1\n\t\t\t//\t};\n\n\t\t\t//\tlet pickParams = {};\n\n\t\t\t//\t//if(params.pickClipped){\n\t\t\t//\t//\tpickParams.pickClipped = params.pickClipped;\n\t\t\t//\t//}\n\n\t\t\t//\tpickParams.x = mouse.x;\n\t\t\t//\tpickParams.y = renderer.domElement.clientHeight - mouse.y;\n\n\t\t\t//\tlet raycaster = new THREE.Raycaster();\n\t\t\t//\traycaster.setFromCamera(nmouse, camera);\n\t\t\t//\tlet ray = raycaster.ray;\n\n\t\t\t//\tfor(let pointcloud of scene.pointclouds){\n\t\t\t//\t\tlet nodes = pointcloud.nodesOnRay(pointcloud.visibleNodes, ray);\n\t\t\t//\t\tpointcloud.visibleNodes = nodes;\n\n\t\t\t//\t}\n\t\t\t//}\n\n\t\t\t// const tStart = performance.now();\n\t\t\t// const worldPos = new THREE.Vector3();\n\t\t\t// const camPos = viewer.scene.getActiveCamera().getWorldPosition(new THREE.Vector3());\n\t\t\t// let lowestDistance = Infinity;\n\t\t\t// let numNodes = 0;\n\n\t\t\t// viewer.scene.scene.traverse(node => {\n\t\t\t// \tnode.getWorldPosition(worldPos);\n\n\t\t\t// \tconst distance = worldPos.distanceTo(camPos);\n\n\t\t\t// \tlowestDistance = Math.min(lowestDistance, distance);\n\n\t\t\t// \tnumNodes++;\n\n\t\t\t// \tif(Number.isNaN(distance)){\n\t\t\t// \t\tconsole.error(\":(\");\n\t\t\t// \t}\n\t\t\t// });\n\t\t\t// const duration = (performance.now() - tStart).toFixed(2);\n\n\t\t\t// Potree.debug.computeNearDuration = duration;\n\t\t\t// Potree.debug.numNodes = numNodes;\n\n\t\t\t//console.log(lowestDistance.toString(2), duration);\n\n\t\t\tconst tStart = performance.now();\n\t\t\tconst campos = camera.position;\n\t\t\tlet closestImage = Infinity;\n\t\t\tfor(const images of this.scene.orientedImages){\n\t\t\t\tfor(const image of images.images){\n\t\t\t\t\tconst distance = image.mesh.position.distanceTo(campos);\n\n\t\t\t\t\tclosestImage = Math.min(closestImage, distance);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst tEnd = performance.now();\n\n\t\t\tif(result.lowestSpacing !== Infinity){\n\t\t\t\tlet near = result.lowestSpacing * 10.0;\n\t\t\t\tlet far = -this.getBoundingBox().applyMatrix4(camera.matrixWorldInverse).min.z;\n\n\t\t\t\tfar = Math.max(far * 1.5, 10000);\n\t\t\t\tnear = Math.min(100.0, Math.max(0.01, near));\n\t\t\t\tnear = Math.min(near, closestImage);\n\t\t\t\tfar = Math.max(far, near + 10000);\n\n\t\t\t\tif(near === Infinity){\n\t\t\t\t\tnear = 0.1;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcamera.near = near;\n\t\t\t\tcamera.far = far;\n\t\t\t}else{\n\t\t\t\t// don't change near and far in this case\n\t\t\t}\n\n\t\t\tif(this.scene.cameraMode == CameraMode.ORTHOGRAPHIC) {\n\t\t\t\tcamera.near = -camera.far;\n\t\t\t}\n\t\t} \n\t\t\n\t\tthis.scene.cameraP.fov = this.fov;\n\t\t\n\t\tlet controls = this.getControls();\n\t\tif (controls === this.deviceControls) {\n\t\t\tthis.controls.setScene(scene);\n\t\t\tthis.controls.update(delta);\n\n\t\t\tthis.scene.cameraP.position.copy(scene.view.position);\n\t\t\tthis.scene.cameraO.position.copy(scene.view.position);\n\t\t} else if (controls !== null) {\n\t\t\tcontrols.setScene(scene);\n\t\t\tcontrols.update(delta);\n\n\t\t\tif(typeof debugDisabled === \"undefined\" ){\n\t\t\t\tthis.scene.cameraP.position.copy(scene.view.position);\n\t\t\t\tthis.scene.cameraP.rotation.order = \"ZXY\";\n\t\t\t\tthis.scene.cameraP.rotation.x = Math.PI / 2 + this.scene.view.pitch;\n\t\t\t\tthis.scene.cameraP.rotation.z = this.scene.view.yaw;\n\t\t\t}\n\n\t\t\tthis.scene.cameraO.position.copy(scene.view.position);\n\t\t\tthis.scene.cameraO.rotation.order = \"ZXY\";\n\t\t\tthis.scene.cameraO.rotation.x = Math.PI / 2 + this.scene.view.pitch;\n\t\t\tthis.scene.cameraO.rotation.z = this.scene.view.yaw;\n\t\t}\n\t\t\n\t\tcamera.updateMatrix();\n\t\tcamera.updateMatrixWorld();\n\t\tcamera.matrixWorldInverse.copy(camera.matrixWorld).invert();\n\n\t\t{\n\t\t\tif(this._previousCamera === undefined){\n\t\t\t\tthis._previousCamera = this.scene.getActiveCamera().clone();\n\t\t\t\tthis._previousCamera.rotation.copy(this.scene.getActiveCamera().rotation);\n\t\t\t}\n\n\t\t\tif(!this._previousCamera.matrixWorld.equals(camera.matrixWorld)){\n\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\ttype: \"camera_changed\",\n\t\t\t\t\tprevious: this._previousCamera,\n\t\t\t\t\tcamera: camera\n\t\t\t\t});\n\t\t\t}else if(!this._previousCamera.projectionMatrix.equals(camera.projectionMatrix)){\n\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\ttype: \"camera_changed\",\n\t\t\t\t\tprevious: this._previousCamera,\n\t\t\t\t\tcamera: camera\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._previousCamera = this.scene.getActiveCamera().clone();\n\t\t\tthis._previousCamera.rotation.copy(this.scene.getActiveCamera().rotation);\n\n\t\t}\n\n\t\t{ // update clip boxes\n\t\t\tlet boxes = [];\n\t\t\t\n\t\t\t// volumes with clipping enabled\n\t\t\t//boxes.push(...this.scene.volumes.filter(v => (v.clip)));\n\t\t\tboxes.push(...this.scene.volumes.filter(v => (v.clip && v instanceof BoxVolume)));\n\n\t\t\t// profile segments\n\t\t\tfor(let profile of this.scene.profiles){\n\t\t\t\tboxes.push(...profile.boxes);\n\t\t\t}\n\t\t\t\n\t\t\t// Needed for .getInverse(), pre-empt a determinant of 0, see #815 / #816\n\t\t\tlet degenerate = (box) => box.matrixWorld.determinant() !== 0;\n\t\t\t\n\t\t\tlet clipBoxes = boxes.filter(degenerate).map( box => {\n\t\t\t\tbox.updateMatrixWorld();\n\t\t\t\t\n\t\t\t\tlet boxInverse = box.matrixWorld.clone().invert();\n\t\t\t\tlet boxPosition = box.getWorldPosition(new THREE.Vector3());\n\n\t\t\t\treturn {box: box, inverse: boxInverse, position: boxPosition};\n\t\t\t});\n\n\t\t\tlet clipPolygons = this.scene.polygonClipVolumes.filter(vol => vol.initialized);\n\t\t\t\n\t\t\t// set clip volumes in material\n\t\t\tfor(let pointcloud of visiblePointClouds){\n\t\t\t\tpointcloud.material.setClipBoxes(clipBoxes);\n\t\t\t\tpointcloud.material.setClipPolygons(clipPolygons, this.clippingTool.maxPolygonVertices);\n\t\t\t\tpointcloud.material.clipTask = this.clipTask;\n\t\t\t\tpointcloud.material.clipMethod = this.clipMethod;\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tfor(let pointcloud of visiblePointClouds){\n\t\t\t\tpointcloud.material.elevationGradientRepeat = this.elevationGradientRepeat;\n\t\t\t}\n\t\t}\n\t\t\n\t\t{ // update navigation cube\n\t\t\tthis.navigationCube.update(camera.rotation);\n\t\t}\n\n\t\tthis.updateAnnotations();\n\t\t\n\t\tif(this.mapView){\n\t\t\tthis.mapView.update(delta);\n\t\t\tif(this.mapView.sceneProjection){\n\t\t\t\t$( \"#potree_map_toggle\" ).css(\"display\", \"block\");\n\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t\tTWEEN.update(timestamp);\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'update',\n\t\t\tdelta: delta,\n\t\t\ttimestamp: timestamp});\n\t\t\t\n\t\tif(Potree.measureTimings) {\n\t\t\tperformance.mark(\"update-end\");\n\t\t\tperformance.measure(\"update\", \"update-start\", \"update-end\");\n\t\t}\n\t}\n\n\tgetPRenderer(){\n\t\tif(this.useHQ){\n\t\t\tif (!this.hqRenderer) {\n\t\t\t\tthis.hqRenderer = new HQSplatRenderer(this);\n\t\t\t}\n\t\t\tthis.hqRenderer.useEDL = this.useEDL;\n\n\t\t\treturn this.hqRenderer;\n\t\t}else{\n\t\t\tif (this.useEDL && Features.SHADER_EDL.isSupported()) {\n\t\t\t\tif (!this.edlRenderer) {\n\t\t\t\t\tthis.edlRenderer = new EDLRenderer(this);\n\t\t\t\t}\n\n\t\t\t\treturn this.edlRenderer;\n\t\t\t} else {\n\t\t\t\tif (!this.potreeRenderer) {\n\t\t\t\t\tthis.potreeRenderer = new PotreeRenderer(this);\n\t\t\t\t}\n\n\t\t\t\treturn this.potreeRenderer;\n\t\t\t}\n\t\t}\n\t}\n\n\trenderVR(){\n\n\t\tlet renderer = this.renderer;\n\n\t\trenderer.setClearColor(0x550000, 0);\n\t\trenderer.clear();\n\n\t\tlet xr = renderer.xr;\n\t\tlet dbg = new THREE.PerspectiveCamera();\n\t\tlet xrCameras = xr.getCamera(dbg);\n\n\t\tif(xrCameras.cameras.length !== 2){\n\t\t\treturn;\n\t\t}\n\n\t\tlet makeCam = this.vrControls.getCamera.bind(this.vrControls);\n\n\t\t{ // clear framebuffer\n\t\t\tif(viewer.background === \"skybox\"){\n\t\t\t\trenderer.setClearColor(0xff0000, 1);\n\t\t\t}else if(viewer.background === \"gradient\"){\n\t\t\t\trenderer.setClearColor(0x112233, 1);\n\t\t\t}else if(viewer.background === \"black\"){\n\t\t\t\trenderer.setClearColor(0x000000, 1);\n\t\t\t}else if(viewer.background === \"white\"){\n\t\t\t\trenderer.setClearColor(0xFFFFFF, 1);\n\t\t\t}else{\n\t\t\t\trenderer.setClearColor(0x000000, 0);\n\t\t\t}\n\n\t\t\trenderer.clear();\n\t\t}\n\n\t\t// render background\n\t\tif(this.background === \"skybox\"){\n\t\t\tlet {skybox} = this;\n\n\t\t\tlet cam = makeCam();\n\t\t\tskybox.camera.rotation.copy(cam.rotation);\n\t\t\tskybox.camera.fov = cam.fov;\n\t\t\tskybox.camera.aspect = cam.aspect;\n\t\t\t\n\t\t\t// let dbg = new THREE.Object3D();\n\t\t\tlet dbg = skybox.parent;\n\t\t\t// dbg.up.set(0, 0, 1);\n\t\t\tdbg.rotation.x = Math.PI / 2;\n\n\t\t\t// skybox.camera.parent = dbg;\n\t\t\t// dbg.children.push(skybox.camera);\n\n\t\t\tdbg.updateMatrix();\n\t\t\tdbg.updateMatrixWorld();\n\n\t\t\tskybox.camera.updateMatrix();\n\t\t\tskybox.camera.updateMatrixWorld();\n\t\t\tskybox.camera.updateProjectionMatrix();\n\n\t\t\trenderer.render(skybox.scene, skybox.camera);\n\t\t\t// renderer.render(skybox.scene, cam);\n\t\t}else if(this.background === \"gradient\"){\n\t\t\t// renderer.render(this.scene.sceneBG, this.scene.cameraBG);\n\t\t}\n\n\t\tthis.renderer.xr.getSession().updateRenderState({\n\t\t\tdepthNear: 0.1,\n\t\t\tdepthFar: 10000\n\t\t});\n\t\t\n\t\tlet cam = null;\n\t\tlet view = null;\n\n\t\t{ // render world scene\n\t\t\tcam = makeCam();\n\t\t\tcam.position.z -= 0.8 * cam.scale.x;\n\t\t\tcam.parent = null;\n\t\t\t// cam.near = 0.05;\n\t\t\tcam.near = viewer.scene.getActiveCamera().near;\n\t\t\tcam.far = viewer.scene.getActiveCamera().far;\n\t\t\tcam.updateMatrix();\n\t\t\tcam.updateMatrixWorld();\n\n\t\t\tthis.scene.scene.updateMatrix();\n\t\t\tthis.scene.scene.updateMatrixWorld();\n\t\t\tthis.scene.scene.matrixAutoUpdate = false;\n\n\t\t\tlet camWorld = cam.matrixWorld.clone();\n\t\t\tview = camWorld.clone().invert();\n\t\t\tthis.scene.scene.matrix.copy(view);\n\t\t\tthis.scene.scene.matrixWorld.copy(view);\n\n\t\t\tcam.matrix.identity();\n\t\t\tcam.matrixWorld.identity();\n\t\t\tcam.matrixWorldInverse.identity();\n\n\t\t\trenderer.render(this.scene.scene, cam);\n\n\t\t\tthis.scene.scene.matrixWorld.identity();\n\n\t\t}\n\t\t\n\t\tfor(let pointcloud of this.scene.pointclouds){\n\n\t\t\tlet viewport = xrCameras.cameras[0].viewport;\n\n\t\t\tpointcloud.material.useEDL = false;\n\t\t\tpointcloud.screenHeight = viewport.height;\n\t\t\tpointcloud.screenWidth = viewport.width;\n\n\t\t\t// automatically switch to paraboloids because they cause far less flickering in VR, \n\t\t\t// when point sizes are larger than around 2 pixels\n\t\t\t// if(Features.SHADER_INTERPOLATION.isSupported()){\n\t\t\t// \tpointcloud.material.shape = Potree.PointShape.PARABOLOID;\n\t\t\t// }\n\t\t}\n\t\t\n\t\t// render point clouds\n\t\tfor(let xrCamera of xrCameras.cameras){\n\n\t\t\tlet v = xrCamera.viewport;\n\t\t\trenderer.setViewport(v.x, v.y, v.width, v.height);\n\n\t\t\t// xrCamera.fov = 90;\n\n\t\t\t{ // estimate VR fov\n\t\t\t\tlet proj = xrCamera.projectionMatrix;\n\t\t\t\tlet inv = proj.clone().invert();\n\n\t\t\t\tlet p1 = new THREE.Vector4(0, 1, -1, 1).applyMatrix4(inv);\n\t\t\t\tlet rad = p1.y\n\t\t\t\tlet fov = 180 * (rad / Math.PI);\n\n\t\t\t\txrCamera.fov = fov;\n\t\t\t}\n\n\t\t\tfor(let pointcloud of this.scene.pointclouds){\n\t\t\t\tconst {material} = pointcloud;\n\t\t\t\tmaterial.useEDL = false;\n\t\t\t}\n\n\t\t\tlet vrWorld = view.clone().invert();\n\t\t\tvrWorld.multiply(xrCamera.matrixWorld);\n\t\t\tlet vrView = vrWorld.clone().invert();\n\n\t\t\tthis.pRenderer.render(this.scene.scenePointCloud, xrCamera, null, {\n\t\t\t\tviewOverride: vrView,\n\t\t\t});\n\n\t\t}\n\n\t\t{ // render VR scene\n\t\t\tlet cam = makeCam();\n\t\t\tcam.parent = null;\n\n\t\t\trenderer.render(this.sceneVR, cam);\n\t\t}\n\n\t\trenderer.resetState();\n\n\t}\n\n\trenderDefault(){\n\t\tlet pRenderer = this.getPRenderer();\n\n\t\t{ // resize\n\t\t\tconst width = this.scaleFactor * this.renderArea.clientWidth;\n\t\t\tconst height = this.scaleFactor * this.renderArea.clientHeight;\n\n\t\t\tthis.renderer.setSize(width, height);\n\t\t\tconst pixelRatio = this.renderer.getPixelRatio();\n\t\t\tconst aspect = width / height;\n\n\t\t\tconst scene = this.scene;\n\n\t\t\tscene.cameraP.aspect = aspect;\n\t\t\tscene.cameraP.updateProjectionMatrix();\n\n\t\t\tlet frustumScale = this.scene.view.radius;\n\t\t\tscene.cameraO.left = -frustumScale;\n\t\t\tscene.cameraO.right = frustumScale;\n\t\t\tscene.cameraO.top = frustumScale * 1 / aspect;\n\t\t\tscene.cameraO.bottom = -frustumScale * 1 / aspect;\n\t\t\tscene.cameraO.updateProjectionMatrix();\n\n\t\t\tscene.cameraScreenSpace.top = 1/aspect;\n\t\t\tscene.cameraScreenSpace.bottom = -1/aspect;\n\t\t\tscene.cameraScreenSpace.updateProjectionMatrix();\n\t\t}\n\n\t\tpRenderer.clear();\n\n\t\tpRenderer.render(this.renderer);\n\t\tthis.renderer.render(this.overlay, this.overlayCamera);\n\t}\n\t\n\trender(){\n\t\tif(Potree.measureTimings) performance.mark(\"render-start\");\n\n\t\ttry{\n\n\t\t\tconst vrActive = this.renderer.xr.isPresenting;\n\n\t\t\tif(vrActive){\n\t\t\t\tthis.renderVR();\n\t\t\t}else{\n\t\t\t\tthis.renderDefault();\n\t\t\t}\n\n\t\t}catch(e){\n\t\t\tthis.onCrash(e);\n\t\t}\n\t\t\n\t\tif(Potree.measureTimings){\n\t\t\tperformance.mark(\"render-end\");\n\t\t\tperformance.measure(\"render\", \"render-start\", \"render-end\");\n\t\t}\n\t}\n\n\tresolveTimings(timestamp){\n\t\tif(Potree.measureTimings){\n\t\t\tif(!this.toggle){\n\t\t\t\tthis.toggle = timestamp;\n\t\t\t}\n\t\t\tlet duration = timestamp - this.toggle;\n\t\t\tif(duration > 1000.0){\n\t\t\t\n\t\t\t\tlet measures = performance.getEntriesByType(\"measure\");\n\t\t\t\t\n\t\t\t\tlet names = new Set();\n\t\t\t\tfor(let measure of measures){\n\t\t\t\t\tnames.add(measure.name);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlet groups = new Map();\n\t\t\t\tfor(let name of names){\n\t\t\t\t\tgroups.set(name, {\n\t\t\t\t\t\tmeasures: [],\n\t\t\t\t\t\tsum: 0,\n\t\t\t\t\t\tn: 0,\n\t\t\t\t\t\tmin: Infinity,\n\t\t\t\t\t\tmax: -Infinity\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor(let measure of measures){\n\t\t\t\t\tlet group = groups.get(measure.name);\n\t\t\t\t\tgroup.measures.push(measure);\n\t\t\t\t\tgroup.sum += measure.duration;\n\t\t\t\t\tgroup.n++;\n\t\t\t\t\tgroup.min = Math.min(group.min, measure.duration);\n\t\t\t\t\tgroup.max = Math.max(group.max, measure.duration);\n\t\t\t\t}\n\n\t\t\t\tlet glQueries = Potree.resolveQueries(this.renderer.getContext());\n\t\t\t\tfor(let [key, value] of glQueries){\n\n\t\t\t\t\tlet group = {\n\t\t\t\t\t\tmeasures: value.map(v => {return {duration: v}}),\n\t\t\t\t\t\tsum: value.reduce( (a, i) => a + i, 0),\n\t\t\t\t\t\tn: value.length,\n\t\t\t\t\t\tmin: Math.min(...value),\n\t\t\t\t\t\tmax: Math.max(...value)\n\t\t\t\t\t};\n\n\t\t\t\t\tlet groupname = `[tq] ${key}`;\n\t\t\t\t\tgroups.set(groupname, group);\n\t\t\t\t\tnames.add(groupname);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor(let [name, group] of groups){\n\t\t\t\t\tgroup.mean = group.sum / group.n;\n\t\t\t\t\tgroup.measures.sort( (a, b) => a.duration - b.duration );\n\t\t\t\t\t\n\t\t\t\t\tif(group.n === 1){\n\t\t\t\t\t\tgroup.median = group.measures[0].duration;\n\t\t\t\t\t}else if(group.n > 1){\n\t\t\t\t\t\tgroup.median = group.measures[parseInt(group.n / 2)].duration;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlet cn = Array.from(names).reduce( (a, i) => Math.max(a, i.length), 0) + 5;\n\t\t\t\tlet cmin = 10;\n\t\t\t\tlet cmed = 10;\n\t\t\t\tlet cmax = 10;\n\t\t\t\tlet csam = 6;\n\t\t\t\t\n\t\t\t\tlet message = ` ${\"NAME\".padEnd(cn)} |` \n\t\t\t\t\t+ ` ${\"MIN\".padStart(cmin)} |`\n\t\t\t\t\t+ ` ${\"MEDIAN\".padStart(cmed)} |`\n\t\t\t\t\t+ ` ${\"MAX\".padStart(cmax)} |`\n\t\t\t\t\t+ ` ${\"SAMPLES\".padStart(csam)} \\n`;\n\t\t\t\tmessage += ` ${\"-\".repeat(message.length) }\\n`;\n\t\t\t\t\n\t\t\t\tnames = Array.from(names).sort();\n\t\t\t\tfor(let name of names){\n\t\t\t\t\tlet group = groups.get(name);\n\t\t\t\t\tlet min = group.min.toFixed(3);\n\t\t\t\t\tlet median = group.median.toFixed(3);\n\t\t\t\t\tlet max = group.max.toFixed(3);\n\t\t\t\t\tlet n = group.n;\n\t\t\t\t\t\n\t\t\t\t\tmessage += ` ${name.padEnd(cn)} |`\n\t\t\t\t\t\t+ ` ${min.padStart(cmin)} |`\n\t\t\t\t\t\t+ ` ${median.padStart(cmed)} |`\n\t\t\t\t\t\t+ ` ${max.padStart(cmax)} |`\n\t\t\t\t\t\t+ ` ${n.toString().padStart(csam)}\\n`;\n\t\t\t\t}\n\t\t\t\tmessage += `\\n`;\n\t\t\t\tconsole.log(message);\n\t\t\t\t\n\t\t\t\tperformance.clearMarks();\n\t\t\t\tperformance.clearMeasures();\n\t\t\t\tthis.toggle = timestamp;\n\t\t\t}\n\t\t}\n\t}\n\n\tloop(timestamp){\n\n\t\tif(this.stats){\n\t\t\tthis.stats.begin();\n\t\t}\n\n\t\tif(Potree.measureTimings){\n\t\t\tperformance.mark(\"loop-start\");\n\t\t}\n\n\t\tthis.update(this.clock.getDelta(), timestamp);\n\t\tthis.render();\n\n\t\t// let vrActive = viewer.renderer.xr.isPresenting;\n\t\t// if(vrActive){\n\t\t// \tthis.update(this.clock.getDelta(), timestamp);\n\t\t// \tthis.render();\n\t\t// }else{\n\n\t\t// \tthis.update(this.clock.getDelta(), timestamp);\n\t\t// \tthis.render();\n\t\t// }\n\n\n\t\tif(Potree.measureTimings){\n\t\t\tperformance.mark(\"loop-end\");\n\t\t\tperformance.measure(\"loop\", \"loop-start\", \"loop-end\");\n\t\t}\n\t\t\n\t\tthis.resolveTimings(timestamp);\n\n\t\tPotree.framenumber++;\n\n\t\tif(this.stats){\n\t\t\tthis.stats.end();\n\t\t}\n\t}\n\n\tpostError(content, params = {}){\n\t\tlet message = this.postMessage(content, params);\n\n\t\tmessage.element.addClass(\"potree_message_error\");\n\n\t\treturn message;\n\t}\n\n\tpostMessage(content, params = {}){\n\t\tlet message = new Message(content);\n\n\t\tlet animationDuration = 100;\n\n\t\tmessage.element.css(\"display\", \"none\");\n\t\tmessage.elClose.click( () => {\n\t\t\tmessage.element.slideToggle(animationDuration);\n\n\t\t\tlet index = this.messages.indexOf(message);\n\t\t\tif(index >= 0){\n\t\t\t\tthis.messages.splice(index, 1);\n\t\t\t}\n\t\t});\n\n\t\tthis.elMessages.prepend(message.element);\n\n\t\tmessage.element.slideToggle(animationDuration);\n\n\t\tthis.messages.push(message);\n\n\t\tif(params.duration !== undefined){\n\t\t\tlet fadeDuration = 500;\n\t\t\tlet slideOutDuration = 200;\n\t\t\tsetTimeout(() => {\n\t\t\t\tmessage.element.animate({\n\t\t\t\t\topacity: 0\t\n\t\t\t\t}, fadeDuration);\n\t\t\t\tmessage.element.slideToggle(slideOutDuration);\n\t\t\t}, params.duration)\n\t\t}\n\n\t\treturn message;\n\t}\n};\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nTHREE.OrthographicCamera.prototype.zoomTo = function( node, factor = 1){\n\n\tif ( !node.geometry && !node.boundingBox) {\n\t\treturn;\n\t}\n\n\t// TODO\n\n\t//let minWS = new THREE.Vector4(node.boundingBox.min.x, node.boundingBox.min.y, node.boundingBox.min.z, 1);\n\t//let minVS = minWS.applyMatrix4(this.matrixWorldInverse);\n\n\t//let right = node.boundingBox.max.x;\n\t//let bottom\t= node.boundingBox.min.y;\n\t//let top = node.boundingBox.max.y;\n\n\tthis.updateProjectionMatrix();\t\n};","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nTHREE.PerspectiveCamera.prototype.zoomTo = function (node, factor) {\n\tif (!node.geometry && !node.boundingSphere && !node.boundingBox) {\n\t\treturn;\n\t}\n\n\tif (node.geometry && node.geometry.boundingSphere === null) {\n\t\tnode.geometry.computeBoundingSphere();\n\t}\n\n\tnode.updateMatrixWorld();\n\n\tlet bs;\n\n\tif (node.boundingSphere) {\n\t\tbs = node.boundingSphere;\n\t} else if (node.geometry && node.geometry.boundingSphere) {\n\t\tbs = node.geometry.boundingSphere;\n\t} else {\n\t\tbs = node.boundingBox.getBoundingSphere(new THREE.Sphere());\n\t}\n\n\tlet _factor = factor || 1;\n\n\tbs = bs.clone().applyMatrix4(node.matrixWorld);\n\tlet radius = bs.radius;\n\tlet fovr = this.fov * Math.PI / 180;\n\n\tif (this.aspect < 1) {\n\t\tfovr = fovr * this.aspect;\n\t}\n\n\tlet distanceFactor = Math.abs(radius / Math.sin(fovr / 2)) * _factor;\n\n\tlet offset = this.getWorldDirection(new THREE.Vector3()).multiplyScalar(-distanceFactor);\n\tthis.position.copy(bs.center.clone().add(offset));\n};\n","\nimport * as THREE from \"../../libs/three.js/build/three.module.js\";\n\nTHREE.Ray.prototype.distanceToPlaneWithNegative = function (plane) {\n\tlet denominator = plane.normal.dot(this.direction);\n\tif (denominator === 0) {\n\t\t// line is coplanar, return origin\n\t\tif (plane.distanceToPoint(this.origin) === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\t\treturn null;\n\t}\n\tlet t = -(this.origin.dot(plane.normal) + plane.constant) / denominator;\n\n\treturn t;\n};\n","\nexport * from \"./Actions.js\";\nexport * from \"./AnimationPath.js\";\nexport * from \"./Annotation.js\";\nexport * from \"./defines.js\";\nexport * from \"./Enum.js\";\nexport * from \"./EventDispatcher.js\";\nexport * from \"./Features.js\";\nexport * from \"./KeyCodes.js\";\nexport * from \"./LRU.js\";\nexport * from \"./PointCloudEptGeometry.js\";\nexport * from \"./PointCloudOctree.js\";\nexport * from \"./PointCloudOctreeGeometry.js\";\nexport * from \"./PointCloudTree.js\";\nexport * from \"./Points.js\";\nexport * from \"./Potree_update_visibility.js\";\nexport * from \"./PotreeRenderer.js\";\nexport * from \"./ProfileRequest.js\";\nexport * from \"./TextSprite.js\";\nexport * from \"./utils.js\";\nexport * from \"./Version.js\";\nexport * from \"./WorkerPool.js\";\nexport * from \"./XHRFactory.js\";\nexport * from \"./viewer/SaveProject.js\";\nexport * from \"./viewer/LoadProject.js\";\n\nexport * from \"./materials/ClassificationScheme.js\";\nexport * from \"./materials/EyeDomeLightingMaterial.js\";\nexport * from \"./materials/Gradients.js\";\nexport * from \"./materials/NormalizationEDLMaterial.js\";\nexport * from \"./materials/NormalizationMaterial.js\";\nexport * from \"./materials/PointCloudMaterial.js\";\n\nexport * from \"./loader/POCLoader.js\";\nexport * from \"./modules/loader/2.0/OctreeLoader.js\";\nexport * from \"./loader/EptLoader.js\";\nexport * from \"./loader/ept/BinaryLoader.js\";\nexport * from \"./loader/ept/LaszipLoader.js\";\nexport * from \"./loader/ept/ZstandardLoader.js\";\nexport * from \"./loader/PointAttributes.js\";\nexport * from \"./loader/ShapefileLoader.js\";\nexport * from \"./loader/GeoPackageLoader.js\";\n\nexport * from \"./utils/Box3Helper.js\";\nexport * from \"./utils/ClippingTool.js\";\nexport * from \"./utils/ClipVolume.js\";\nexport * from \"./utils/GeoTIFF.js\";\nexport * from \"./utils/Measure.js\";\nexport * from \"./utils/MeasuringTool.js\";\nexport * from \"./utils/Message.js\";\nexport * from \"./utils/PointCloudSM.js\";\nexport * from \"./utils/PolygonClipVolume.js\";\nexport * from \"./utils/Profile.js\";\nexport * from \"./utils/ProfileTool.js\";\nexport * from \"./utils/ScreenBoxSelectTool.js\";\nexport * from \"./utils/SpotLightHelper.js\";\nexport * from \"./utils/TransformationTool.js\";\nexport * from \"./utils/Volume.js\";\nexport * from \"./utils/VolumeTool.js\";\nexport * from \"./utils/Compass.js\";\n\nexport * from \"./viewer/viewer.js\";\nexport * from \"./viewer/Scene.js\";\nexport * from \"./viewer/HierarchicalSlider.js\";\n\nexport * from \"./modules/OrientedImages/OrientedImages.js\";\nexport * from \"./modules/Images360/Images360.js\";\nexport * from \"./modules/CameraAnimation/CameraAnimation.js\";\n\nexport * from \"./modules/loader/2.0/OctreeLoader.js\";\n\nexport {OrbitControls} from \"./navigation/OrbitControls.js\";\nexport {FirstPersonControls} from \"./navigation/FirstPersonControls.js\";\nexport {EarthControls} from \"./navigation/EarthControls.js\";\nexport {DeviceOrientationControls} from \"./navigation/DeviceOrientationControls.js\";\nexport {VRControls} from \"./navigation/VRControls.js\";\n\nimport \"./extensions/OrthographicCamera.js\";\nimport \"./extensions/PerspectiveCamera.js\";\nimport \"./extensions/Ray.js\";\n\nimport {LRU} from \"./LRU.js\";\nimport {OctreeLoader} from \"./modules/loader/2.0/OctreeLoader.js\";\nimport {POCLoader} from \"./loader/POCLoader.js\";\nimport {EptLoader} from \"./loader/EptLoader.js\";\nimport {PointCloudOctree} from \"./PointCloudOctree.js\";\nimport {WorkerPool} from \"./WorkerPool.js\";\n\nexport const workerPool = new WorkerPool();\n\nexport const version = {\n\tmajor: 1,\n\tminor: 8,\n\tsuffix: '.0'\n};\n\nexport let lru = new LRU();\n\nconsole.log('Potree ' + version.major + '.' + version.minor + version.suffix);\n\nexport let pointBudget = 1 * 1000 * 1000;\nexport let framenumber = 0;\nexport let numNodesLoading = 0;\nexport let maxNodesLoading = 4;\n\nexport const debug = {};\n\nlet scriptPath = \"\";\n\nif (document.currentScript && document.currentScript.src) {\n\tscriptPath = new URL(document.currentScript.src + '/..').href;\n\tif (scriptPath.slice(-1) === '/') {\n\t\tscriptPath = scriptPath.slice(0, -1);\n\t}\n} else if(import.meta){\n\tscriptPath = new URL(import.meta.url + \"/..\").href;\n\tif (scriptPath.slice(-1) === '/') {\n\t\tscriptPath = scriptPath.slice(0, -1);\n\t}\n}else {\n\tconsole.error('Potree was unable to find its script path using document.currentScript. Is Potree included with a script tag? Does your browser support this function?');\n}\n\nlet resourcePath = scriptPath + '/resources';\n\n// scriptPath: build/potree\n// resourcePath:build/potree/resources\nexport {scriptPath, resourcePath};\n\n\nexport function loadPointCloud(path, name, callback){\n\tlet loaded = function(e){\n\t\te.pointcloud.name = name;\n\t\tcallback(e);\n\t};\n\n\tlet promise = new Promise( resolve => {\n\n\t\t// load pointcloud\n\t\tif (!path){\n\t\t\t// TODO: callback? comment? Hello? Bueller? Anyone?\n\t\t} else if (path.indexOf('ept.json') > 0) {\n\t\t\tEptLoader.load(path, function(geometry) {\n\t\t\t\tif (!geometry) {\n\t\t\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet pointcloud = new PointCloudOctree(geometry);\n\t\t\t\t\t//loaded(pointcloud);\n\t\t\t\t\tresolve({type: 'pointcloud_loaded', pointcloud: pointcloud});\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (path.indexOf('cloud.js') > 0) {\n\t\t\tPOCLoader.load(path, function (geometry) {\n\t\t\t\tif (!geometry) {\n\t\t\t\t\t//callback({type: 'loading_failed'});\n\t\t\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t\t\t} else {\n\t\t\t\t\tlet pointcloud = new PointCloudOctree(geometry);\n\t\t\t\t\t// loaded(pointcloud);\n\t\t\t\t\tresolve({type: 'pointcloud_loaded', pointcloud: pointcloud});\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (path.indexOf('metadata.json') > 0) {\n\t\t\tPotree.OctreeLoader.load(path).then(e => {\n\t\t\t\tlet geometry = e.geometry;\n\n\t\t\t\tif(!geometry){\n\t\t\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t\t\t}else{\n\t\t\t\t\tlet pointcloud = new PointCloudOctree(geometry);\n\n\t\t\t\t\tlet aPosition = pointcloud.getAttribute(\"position\");\n\n\t\t\t\t\tlet material = pointcloud.material;\n\t\t\t\t\tmaterial.elevationRange = [\n\t\t\t\t\t\taPosition.range[0][2],\n\t\t\t\t\t\taPosition.range[1][2],\n\t\t\t\t\t];\n\n\t\t\t\t\t// loaded(pointcloud);\n\t\t\t\t\tresolve({type: 'pointcloud_loaded', pointcloud: pointcloud});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tOctreeLoader.load(path, function (geometry) {\n\t\t\t\tif (!geometry) {\n\t\t\t\t\t//callback({type: 'loading_failed'});\n\t\t\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t\t\t} else {\n\t\t\t\t\tlet pointcloud = new PointCloudOctree(geometry);\n\t\t\t\t\t// loaded(pointcloud);\n\t\t\t\t\tresolve({type: 'pointcloud_loaded', pointcloud: pointcloud});\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (path.indexOf('.vpc') > 0) {\n\t\t\tPointCloudArena4DGeometry.load(path, function (geometry) {\n\t\t\t\tif (!geometry) {\n\t\t\t\t\t//callback({type: 'loading_failed'});\n\t\t\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t\t\t} else {\n\t\t\t\t\tlet pointcloud = new PointCloudArena4D(geometry);\n\t\t\t\t\t// loaded(pointcloud);\n\t\t\t\t\tresolve({type: 'pointcloud_loaded', pointcloud: pointcloud});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t//callback({'type': 'loading_failed'});\n\t\t\tconsole.error(new Error(`failed to load point cloud from URL: ${path}`));\n\t\t}\n\t});\n\n\tif(callback){\n\t\tpromise.then(pointcloud => {\n\t\t\tloaded(pointcloud);\n\t\t});\n\t}else{\n\t\treturn promise;\n\t}\n};\n\n\n// add selectgroup\n(function($){\n\t$.fn.extend({\n\t\tselectgroup: function(args = {}){\n\n\t\t\tlet elGroup = $(this);\n\t\t\tlet rootID = elGroup.prop(\"id\");\n\t\t\tlet groupID = `${rootID}`;\n\t\t\tlet groupTitle = (args.title !== undefined) ? args.title : \"\";\n\n\t\t\tlet elButtons = [];\n\t\t\telGroup.find(\"option\").each((index, value) => {\n\t\t\t\tlet buttonID = $(value).prop(\"id\");\n\t\t\t\tlet label = $(value).html();\n\t\t\t\tlet optionValue = $(value).prop(\"value\");\n\n\t\t\t\tlet elButton = $(`\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t`);\n\t\t\t\tlet elLabel = elButton.find(\"label\");\n\t\t\t\tlet elInput = elButton.find(\"input\");\n\n\t\t\t\telInput.change( () => {\n\t\t\t\t\telGroup.find(\"label\").removeClass(\"ui-state-active\");\n\t\t\t\t\telGroup.find(\"label\").addClass(\"ui-state-default\");\n\t\t\t\t\tif(elInput.is(\":checked\")){\n\t\t\t\t\t\telLabel.addClass(\"ui-state-active\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\t//elLabel.addClass(\"ui-state-default\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\telButtons.push(elButton);\n\t\t\t});\n\n\t\t\tlet elFieldset = $(`\n\t\t\t\t
    \n\t\t\t\t\t${groupTitle}\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t`);\n\n\t\t\tlet elButtonContainer = elFieldset.find(\"span\");\n\t\t\tfor(let elButton of elButtons){\n\t\t\t\telButtonContainer.append(elButton);\n\t\t\t}\n\n\t\t\telButtonContainer.find(\"label\").each( (index, value) => {\n\t\t\t\t$(value).css(\"margin\", \"0px\");\n\t\t\t\t$(value).css(\"border-radius\", \"0px\");\n\t\t\t\t$(value).css(\"border\", \"1px solid black\");\n\t\t\t\t$(value).css(\"border-left\", \"none\");\n\t\t\t});\n\t\t\telButtonContainer.find(\"label:first\").each( (index, value) => {\n\t\t\t\t$(value).css(\"border-radius\", \"4px 0px 0px 4px\");\n\n\t\t\t});\n\t\t\telButtonContainer.find(\"label:last\").each( (index, value) => {\n\t\t\t\t$(value).css(\"border-radius\", \"0px 4px 4px 0px\");\n\t\t\t\t$(value).css(\"border-left\", \"none\");\n\t\t\t});\n\n\t\t\telGroup.empty();\n\t\t\telGroup.append(elFieldset);\n\n\n\n\t\t}\n\t});\n})(jQuery);\n"],"names":["UnsignedInt248Type","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT5_Format","EventDispatcher","THREE.CatmullRomCurve3","THREE.Geometry","THREE.Vector3","THREE.Object3D","THREE.Texture","THREE.LinearFilter","THREE.SpriteMaterial","THREE.Sprite","THREE.BoxGeometry","Vector3","THREE.MeshBasicMaterial","THREE.Mesh","THREE.LineSegments","THREE.LineBasicMaterial","THREE.Sphere","THREE.SphereGeometry","THREE.Color","THREE.MeshLambertMaterial","THREE.VertexColors","THREE.Line","THREE.Vector2","THREE.MeshNormalMaterial","THREE.Matrix4","THREE.PlaneHelper","THREE.Box3","THREE.PerspectiveCamera","THREE.Scene","THREE.BackSide","THREE.TextureLoader","THREE.CubeGeometry","THREE.LinePieces","THREE.DataTexture","THREE.RGBFormat","THREE.Raycaster","THREE.Ray","THREE.OrthographicCamera","THREE.Vector4","THREE.RGBAFormat","THREE.NearestFilter","THREE.PlaneBufferGeometry","THREE.Camera","THREE.Math","MOUSE","PointCloudMaterial","THREE.RawShaderMaterial","THREE.NoBlending","THREE.LessEqualDepth","THREE.AdditiveBlending","THREE.AlwaysDepth","THREE.CanvasTexture","THREE.RepeatWrapping","THREE.Points","THREE.Line3","THREE.Box2","THREE.WebGLRenderTarget","Points","Box3Helper","THREE.BufferGeometry","THREE.BufferAttribute","THREE.Frustum","THREE.Plane","THREE.PointCloud","PointCloudArena4D","THREE.ClampToEdgeWrapping","THREE.MirroredRepeatWrapping","THREE.NearestMipMapNearestFilter","THREE.NearestMipMapLinearFilter","THREE.LinearMipMapNearestFilter","THREE.LinearMipMapLinearFilter","THREE.UnsignedByteType","THREE.UnsignedShort4444Type","THREE.UnsignedShort5551Type","THREE.UnsignedShort565Type","THREE.ByteType","THREE.ShortType","THREE.UnsignedShortType","THREE.IntType","THREE.UnsignedIntType","THREE.FloatType","THREE.HalfFloatType","THREE.AlphaFormat","THREE.LuminanceFormat","THREE.LuminanceAlphaFormat","THREE.DepthFormat","THREE.DepthStencilFormat","THREE.AddEquation","THREE.SubtractEquation","THREE.ReverseSubtractEquation","THREE.ZeroFactor","THREE.OneFactor","THREE.SrcColorFactor","THREE.OneMinusSrcColorFactor","THREE.SrcAlphaFactor","THREE.OneMinusSrcAlphaFactor","THREE.DstAlphaFactor","THREE.OneMinusDstAlphaFactor","THREE.DstColorFactor","THREE.OneMinusDstColorFactor","THREE.SrcAlphaSaturateFactor","THREE.RGB_S3TC_DXT1_Format","THREE.RGBA_S3TC_DXT3_Format","THREE.RGBA_S3TC_DXT1_Format","THREE.RGBA_S3TC_DXT5_Format","THREE.RGB_PVRTC_4BPPV1_Format","THREE.RGB_PVRTC_2BPPV1_Format","THREE.RGBA_PVRTC_4BPPV1_Format","THREE.RGBA_PVRTC_2BPPV1_Format","THREE.RGB_ETC1_Format","THREE.MinEquation","THREE.MaxEquation","Geopackage","THREE.CylinderGeometry","THREE.MOUSE","THREE.PointLight","THREE.DepthTexture","SpotLightHelper","THREE.Quaternion","THREE.PlaneGeometry","THREE.TorusGeometry","Scene","THREE.DirectionalLight","THREE.AmbientLight","THREE.WebGLRenderer","THREE.ShaderMaterial","THREE.DoubleSide","sign","escape","JSON5","THREE.Euler","MotionControllerConstants","THREE.Clock","THREE.REVISION","scriptPath","loadPointCloud"],"mappings":"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,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CACrE,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;AACrE;CACA,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC3D;CACA,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC3D;CACA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AK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;AACnI;CACA,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC;CACzB,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,G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SAAS,EAAE,KAAK;CAClB,EAAE,UAAU,EAAE,KAAK;AACnB;CACA,EAAE,EAAE,CAAC;AACL;CACA,CAAC,OAAO,cAAc,CAAC;AACvB;CACA,CAAC;AACD;CACA,SAAS,sBAAsB,GAAG;AAClC;CACA,CAAC,iBAAiB,CAAC;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC,CAAC;AACH;CACA,CAAC;AACD;CACA,SAAS,aAAa,GAAG;AACzB;CACA,CAAC,iBAAiB,CAAC;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC,CAAC;AACH;CACA,CAAC;AACD;CACA,SAAS,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG;AAC3D;CACA,CAAC,OAAO,CAAC,IAAI,EAAE,sEAAsE,EAAE,CAAC;CACxF,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,aAA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A;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC;AACH;CACA,CAAC,cAAc;CACf,EAAE,CAAC;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC;CACH,CAAC,CAAC;AACF;CACA,IAAI,YAAY,GAAG,WAAW,UAAU,GAAG;AAC3C;CACA,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE;AAC5B;CACA,EAAE,IAAI,EAAE,cAAc;AACtB;CACA,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC/D;CACA,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,YAAY;CAChD,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,cAAc;AACpD;CACA,EAAE,QAAQ,EAAE,IAAI;AAChB;CACA,EAAE,EAAE,CAAC;AACL;CACA,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACrB;CACA,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,EAAE;AAChC;CACA,EAAE,KA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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;CACA,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;CACA,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;CACA,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;CACA,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;AACF;CACA,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;AACF;CACA,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;AACF;CACA,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;AACF;CACA,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;CAC1B,GAAG,KAAK,GAAG,MAAM,YAAY,UAAU,CAAC;CACxC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;CAC9B,GAAG,KAAK,GAAG,MAAM,YAAY,eAAe,CAAC;CAC7C,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;CACnC,GAAG;CACH;CACA,EAAE;AACF;CACA;CACA;CACA;CACA;CACA;CACA,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;CAC5C,EAAE,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;CAC1C,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM;CAC/B,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;CAC9C,GAAG,CAAC,CAAC;CACL,EAAE;AACF;CACA,CAAC,aAAa,CAAC,UAAU,CAAC;AAC1B;CACA,EAAE,IAAI,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;AACrC;CACA,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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"} \ No newline at end of file diff --git a/resources/page_template/libs/potree/resources/LICENSE b/resources/page_template/libs/potree/resources/LICENSE index 8dc6ae0d..f0089238 100644 --- a/resources/page_template/libs/potree/resources/LICENSE +++ b/resources/page_template/libs/potree/resources/LICENSE @@ -13,3 +13,8 @@ free for commerical use without attribution http://www.freepik.com/free-icon/package-cube-box-for-delivery_720159.htm +# VR Controller Model +images/vr_controller_help* +Controller model from https://sketchfab.com/3d-models/htc-vive-controller-9f03e4a80c5a4b31a24bb122f17cb229 +license: CC AttributionCreative Commons Attribution + diff --git a/resources/page_template/libs/potree/resources/images/vr_controller_help.jpg b/resources/page_template/libs/potree/resources/images/vr_controller_help.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c309650879a3e2b94893505e160590669b66a105 GIT binary patch literal 89138 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 VMZ{rrqRd{QE(C-j$;0>!_kT0H#3ld$ literal 0 HcmV?d00001 diff --git a/resources/page_template/libs/potree/resources/images/vr_controller_help.png b/resources/page_template/libs/potree/resources/images/vr_controller_help.png new file mode 100644 index 0000000000000000000000000000000000000000..e33ddeb7ec949961ea310dbf147f28300bbd8f13 GIT binary patch literal 436845 zcmb4r1ys~uv@Rgv&^3hgz)*q+N{htEzyQ)nN{4i}G=r3+V33m1-QA!FDBTDs2uMly z`wi&-{_lP7zWd%<##%0ap0m%{``h2Q_dbRxE6NbyQsbhbp%KU;q*T$+uw&5BFwsER zz@IEnQ5OKe;W!|)ozc*^A*i3|H+9c0fj_+E0@rd;vp08fH*zvVb9Z;=wzRW$HZgKA zn$ifIJ&$wYx{d-gP|o_t;TPnr>;g^ieW`CM6L32Z`CV#M|`d)Z(3Z@@9wGWb5Dkq zxr@G&w^0Q8muc-Qemkx{$k`HL|eqGfv<76@0W>(s2#Q)q}lm}iVZjuJ}M-E zAY)b-d+5<1z>=x3mk-gLFla!DuHbGxcWOGJCW14Onnvo+vOCtZA)RSqO5@m%?*D=f z7cV(e(`*YdA&H&DlqG=QV9n@~(ZBo`-XJlQLXi%%Da^wn2W zn$jEmw8WVhhF}JSh+^7GfFR8h=wZY#(9X+kI|t=&x6+7hBrl+kC9@3nH z^$C`Ag%%O4mVZ-*AF0XTNPb zmsd)@J+juczv&`fKIXQg2F(M&PVMHZ6q_ufxvC4 zYU1VXjjLr*W)8nAY;oInGb}-33?3ng&)b8{ykSC7z@pv+*NbWs>yX%DD1XCA_fn!f!o!JSun-JV z!2g^CzL-#_so{x2!Ku~O7Se~#V#6XeIrp`%jx;K&MSv=?lp@fLE}}Fe*MpV>hVZ!d zy(r9eMmka$n7m&^tYiGu`>!E}IxDZ!UZrRhQCvGg+ZSX4YxMP(fZsn8wt#_fu&+-R z2^a~7m7+(AVFJsYC3D#lvtCRkxW?qjfbd9Ow>qafEZ{((rtFL)z#YM3Q$C*j^)+CbQev=2H(O!wiX-5f9oI)G%=wcyQVE1XbSuy@`{VBa$*i@$ zFU2M#uX`!lX@N_3`C}L8%C0>;z^=j|FzeO!epOmkc|0i1Tq+@W@xt^0X_qndHaFa00t8Hb}SEqEL=yf@PnVRSC*l7H{&Q| z5(OBnjJZe&w2b*6&fXolz^l_2B9HSV144kXiNB6k+FN6iB2eT{%0yR`i}yl&Q*`wS z%z4hr+wyjvl@IG2@){*J=8*)pKB5m40OFPR`nwoLyU)9<{qiWYL>x}|-2Qx*V|K%j zb$z^^C`{Znh6>IPhDf!1`D>vm!}T5CYQ4HOCHBYb*dc&pj44=@U^}ax=^ToICwt3q z7P>`=UcVs@Bse++V9Dr@aq@t1ZN<#Az*hXr##5wkc2~E3ITD^!n`kv?@VdSOn8^hD z?I~Ap_H6*j-r<5{fa{APa{v$mHj(aU6%g{0C^NTv0pD+^8C{%Bo(36q9q6Wwe4eJX zFk+A1M_;g!#P|5Fzq}7=q@it7_{jyj8y?<6;&38@@LgD;Z9k3l4PSjccD1Y~EZ~_p zEYx?Q?VcEfRtA8ilWTwJW&XlU6SSR?3wzs9bH9j&_FssE3Lj7;F>r>4o;Z*R{}v)3 z;4ZGe8+g6D+Y57G>LBwNh~8e4-4??5W9jxl(T8m}Lzx}}8YK2QqXGf0D6m}4HJp8y z0`N=d3b&&&^#YT=6o3Ycl@?Y^ErWP=u3|lbM`3ORB>4?OBuN8!K+K=zLbm~TN2d+? z7YaUJXWesQUB3ceP88}q;&K_kiIu8s1SW?dk(gKb`Mof`hfl1h1|2Jv=iL|q;lIuk zwL^RbEgE}^@f{pV(@?U02yf?a!eSf<1B&Ac22SKUa-f9`D>6WF77 z*N`r2=iONUr@vQs6}7C$;P-%qMt4M`nPDJdy6c;-2%#T7LNad0K&S*2<^VTKLqYPN zyzs|7JjsSAxE7Nx$Qg)>KR7MSTNvbm0P-T=`Vms|W*C~<0|3PSjS{Sde4dr-TBwVv zpyh)gldo4Kc0$8S+up95J4{tbu53MB@b2(-0@?5 zFq;(ePcB&R7CjaLaA^m{Cw>!O9|t;cbdLZhPuK1VagAy3EOA~R3EHtLzvDakZRF_w zPL1GI)EgSwzksFL?|g z6$dPU4V*)6_HEP<+eAlT`&qef(P_-l{T<8m=15tP;Iids6i9enkivS8C9jel4z`!+ zm3`L;k>f@-RnV3UZW(JLf(tm=0F-B8xFinpzV#6Z0+qVP+Z({~h2R?yzXiAwPq-Cr zj_WU_E6XOXKYeKWf*i<=C}#+HPXOR_{2#x1yY2RK7@anaSW19ird59IA#(q>GvUIy zw0N*)kT8dD(etz~8M*A+FO~kylXCE`;sDu*2Jj?eeK2`6v!Rus(BDiqdX4bJ)BwV- zwEZRpQlTFMuxR7;rDJye2TvNuDM`fyzP6#kk4$?-ur=d_`5GYP!C#klW9YXvt%2Ol`*xy+19)N*ZeY;^L;!Mq{}2N+54PV&bgC%& z8kK1@El!l<`s(B0$02N^#S*;``Uwxbg%X0^zSWnv{z++S*9iv4f7|Z!s}i!n-tHxf z|Ar_Tb#&%o(f@V@Ql(cDDnep1|9nge1eP<9V36&@ZUp^5eFvWD0Lk|chN8&pBeF5r zzgUGS?zI<5`@6;v;y}W~&FRt>)@8r^e8f}a+&B19u|OlD=Eeh&iz!2kcDYwF4N+KF zsXM}bl4P*Z@jqBt0RY$k%$2^+{Ba!&`_D=wxT4=ZQAGFgy7`a)yuEf93X@7HQhNXy z;{D({@C{KI4*`jqf^rgA2M3PpAYzF z`LD=?u=}-3Gq(e10cZkPMU)b#=d19&qNFbVoaJ%~q zoZd=?J6zuer1cM1z^E8*us#=}qW*p2KkF)Dzw7hFBzjoRJK>6aMC<|LIjA50**YOW zMJ>+u9GB)_nhc)?4sVDex{9O~{40DiH617;R0TcQQ@XPqQvxv5%JHQybY35CU1a&( z_!pD;FWQRs&u0CR?m^78I4M{QVK$J@3)4nG>c!a-JmL5&AoOtncgBI71mEmC0u(AB zACCTbHOYG!0c@~GyQ$9qh>D#`*Ox+%VxTK4vBBS@Ua)N^Gc1h0`sRrF(l#i4$GLnV zMOSIznpS`a0RN%Bl8?!pS1v&O`!+zeI8Yef^OYN*dQXtg#y|WOt>fu81?IYG{A?wf zga46_-q&BoNZh)>zL}W|Gxdm#?D*X%y){a?uFR(K`I_dg;b6#C~9QF-`JWO=y8fOx9@Cmf{w<1vDg|6oRr ztKG4%_7vmevno!2Ax9fgF7mC@|CNoMn%7GO{99rrnv-l;&KB-HEB~PH{%>)MNq>(5 zVDueTO8?}SceHzNyV(GVjgLP3J@OBGDstVrp8^zPx=)d=CaK;j#MgSb*X0^_Jpif> z=;42KBS3;)X5cdTvG&oOJZk$lX|lflAjba1AHn$FDl7JK0ys!Top1S1?EI15tZ3Kw zmCge=)~iID2m^rwD;~D45?2ONKNJq)D*&{~v$PROY|}b_6R7nBS^Po=yaZy3kBRo+ zfRS}z$CeS(&~mKpmiw$H_l*xVfQHmC+1<9?8m~VT-k&-((e<+>rjDLI0}H&@>sjFw zpgO1t0zyZD`u8S@hX_nnf+I}yE;bb%1ldS`;@0=RsA#|B8YFzVPDLE z=wDgVoj#g8GxK?@W{SrEP&6eA0V<7ekSqR1zvv=h;a%gyuvvCeUHDucBux3XJqji2 zKntVj?}z!Z8{Etj87Xs!&V|BVNr>T@Npr2jc5;>E2S!OXDUx@#1F$Mr9q`5+Y4 z{ZPR3|HM!JlM)raiSoNf!(VzrGw4#@-)VP^(-vZgP`U$fum()QbWM^}y|nhfJO!wC zasFr7{RTxd7O`NV6^+`8y>%pWmK6VAl`AMMY6q-DnbEzK!c{#|(Kh((+sKcVb`D2> z!sSm!XXJy`@(u?508(X8j30x?-9Ta|!s|E_eG%&!g5Lt|+2RomSUCgzH|(?R%gdS_ zbCh^KU^^hy9g|S4!}yT5N6VH)N1G2 zRREo9`P*W=40V}Tm8@H|z^5^?!%{Xo*bgB+!T){nhfC_OrXyy!4*kc(|2M4~)vLL} z&WLo0fOI-HZ*M#jk)`}sd5efF@*x_m*U<>t-?xxRf+2J>hJU2{$B_UrhM{HSw#QU) zdP?6F8oy2x5W)hAY62hv2qqVrH9jL|VO8naruI}uo#b8RXNo_Iluknra9&pNbZ=Hd zg8i%f1+d{y()00eXBxefB!$Ne@mt*?mcflx4UI>tl8#}hf#-n}}QGQ0c_ZP-ZL$a<^+18T3#>@qU#N!1sxVkIz|= zG2=i15wl|?7;R3A6?uext=B!6jjougt+RMEM~jVv)md4ai~CO^+aO0zb)xdt=zLU*i@`0UWPA)vLJl25j*L+r@=?4UTz;D| z*x#y?l_SQiVoGA{yyRKoa-FMRt4^!VjZD`RLZwGQf}3xrsyG~MAE|m(ITi!MC}l4g z${x9o?Os5zsbPI~wkkipV*Gl+inpU-9j~#@MMXYB`vq5Itkl<7tnA$vsKP!mL%Kg7 zx{Y(2TwtdTo(aC~<6g|aMV8EmsI;)s>j}T*%{g3oTxs(yI`UlSa5uYdvwSRL2pg_# z+;qpGMQ72P})oi^;wvrANeZ*9pPF7+i4UmlVe&?h~{a){g_;zrCmF zDaSbE+57TSGs(itE3`SOENu-V0|cn6*?27V((`Y}XOl&JD)01acp-rOL>mS|FXDgc zW;|S7SbE_dktXf~U`6fQXSMoV4nD#%q#RE_KYKf<`t-9J)bS-EFa7bE@joTk-(YYI z#)nxWDH0CQ!N$a|3yf}sr5e9SNj=n%EC@5VK9>(0|YTNI^ zu;-@qaQ6w&US4DGD$|XArkjkR^!}?r2QYrrB*eI@fg0dIdH7pf0dQ&jx3KLl-gMym^Bd0z1Y74g{5bArwX|={X<4UR1t8>bOzvceWT%u-z(iVD!c3@4Ncfpz(a^q%xwn%%CCEs%9|H@J z_V3aWQjUco>rZ4$NaRSI8E^XROS8@+(60^sBMmvv-puF*9%vtRjN^{6adSm3Y3W z&@nFu^t@XI#cDL2DoCg+2PkoezsKmlfXSUK;*E*Zt*r>N{^#>fT!I@>xANe z9w5chvmk3go7pQ@LoIG0&kV|jP-RfjU&)a4G- zJCS=ID>GEH74ASseT{)cK0N>A36|ay_C8#=_WRrNV6yZ2CKD0#JnMor zH|uAYNhKRz<_Kv8RhyMX0U#^XE~Xw103ebjvJA?C}ZMvxboctCQlcXx-$%WcxjW zL3Av#ko|kn5fizC>J@ex81QIrpl2cKxEnr(e%~iq7aG9D3{R*qf>^W33kJ zolxBfx$bt0iX{fks=-{&$o!Gq{BrVyM8EZYYBXiAaJ6TEZF5_Rp!M1D@EvY(^V&o+ zRNO}#<43%UcpN^$LxTm>Zm!!>zo`I>3=!;)enduI$pAO~T&y)r8UD1^cT^hlRs|SI$lQ`Es9|wIE z`>3*aC~fzG`u*K+BM%1ATB+YFTD~uG#x-V%W#u&oQb`m~pK7Pd$Yz%HR48*WmwYUX zY|5e}hK2-!Q5Dw_3<)=uie1|P+g#K|xKD0=d#+`1l342U3DIP4*&wTc=p{aS{%W=A zUkxVF%R|V2RLZZZC_gQY&}G}PuGy1C->SC$bKEq$H(GYMHu90KmNEVJp8EL(Z@t2_ zOk|8o^4oO#=q+%=Fhwa7stzUj2vS9`v*@Jfl7y&l)qzP>(O~%l_NyP#)^X%A^u4TY zIjObZD?VE}6Tv|@A;?m9&}THnLbFzR9Xy?7L37ywLj(&cdc}%x<4LWv)hV^<+~9b6 zyGh!(d`v=OOeP4aS{{LLx?y`hGcaF-#WL-ukN3FyxKvtKed;|sE+|w(*=lGu!7O;g z4PC;pNxx0Uuu4Y~tvBM%@5a^-t^sDg5s0}(<5c5RmfGHXT+19375Kk@HtPwkbRD;| z--dy1;o&0CD_-4rCz|A2lRQcLFI(A zf*KgGj6yjJ6BUi_;N$7~oLDqNc$0JA#%~O(bSc-2uz+A*j41>ar(sb(7Bf1eVb(^Y z_n?k=K*geaX5id`e~o|jVhxjag=#`a^j^6et)U^N@)J@T+w|Y0U%N-8<1#M1n|AR_ z5yrs?*_wzF5-&7U%Rp^X6W%n4!qYhi7SkjmT35Sm1ib1Cm=2`SfA+N5X|maFZL#7s zZ#T-Pd9Ua9P<2u$clL-%k5nkb7aWEgxT4pEuBqg!febks(TihlxrQNZPZi^;$wj-W zcKaH6t{N5%PpkyfnA>gMygjFr_-LhX2T8g}&>}ovSM5ij1#!s|*L;QVXA&zHA&>%` zQVnGaKvrO;mc-SvO<(NAL6mZ*(D^Gdh<#gJ!)-a+OGCr_R4x@uS=zq1c|c#EKNacG z_k&J-Lq?8c`ZHn0h;4J(TsVUf)4j5kc%Bz?Ie+qob z<*Mo43v1Pi$QYSeW)biVXdKF2gJr79#V3#{#=kUFmbruO@A}{~BWApMjOyqrp(&?- ztzW(y*kvQDHXbA!2jq@dOp+Pw;Rl|6?z&{w@n(|))W60#tWsAz=fvzIat|=Ggu?a2 zY<_J>Q~=qMKXTV_jj1e>@x%1fN$GLVimDgEl2Dc*EhAoe5>9k-4g{KpXLBpRVtqCAf>r?^*bG|2yCZVMzkuWQ!5vpJ*`lSiW zUxY~yN)Culg<1|meliyVzbpxDi2K&3)}Jr!?VP10jqmT5r&XvOI&N;X6h}K(wXI*M zd8{3z%>%PomnULTF&4qlg*Y5x{yzn>1bYr`ZzH!wZ##e=Np&uN|Y9$h(h&U?Q zWC;*sKPdq9epSj@@e!=5RYD`8nhK^W=ehA@FERbgxngo|G5RBJQx&8akOIy`rm8i0<&*EanJO08uynV~IxH#xR z1%l(D>LVxdvlwn-`l0Yd*#KaSJPFj{_I<{r{+(wM0vxO?Jv3_Sb&>SNrXk~h9 zu;RG7%$uYWb9&2fg&Rji^vO%fEu3y$VoVyp;7Vc+BLz*$duqz4u2$>EZHy{ft#Pbs zXiZUI6;`oxM)nJoFc--IJh(iUp>OE;hbtXRCMQBGE4EWqo=1u7b2(-OpJZa^z~S=) zl3HgzvC~>_x`xQq`sm%{j=CD4(7A$x1-<9_l9#=Y6d1FsZD{B)Z*UbZOb9Gfz!g?o zu@-Qx^$Al@VZ6IeJJ7B7mh%U9cO>zbsj+sF`VS*a)RXK>P8avCn-*YC_ zJB<7fI$xF*4G&3CvpCLh7T#8Vo$#E9d%w+>`hf&v)KUjLPmL_zY*cJ3Beovw#66n| zFU$~$lvFYegsa3qxNc$_ZwTO+gWNr2fDMC#%U zW>$w7J9nv%_$if!goq-;3O6Ic*AVe5?;`h5oV}>S<545_Xs(J5nc9*$rZfv473gtl z>aus|oGGrEc#W+gyuhSzA8Hv6l})w)_k=D{$wEnLn&0`yNkH|~W8?I0*CRfi)FJbI z?i<-s8fAg=hv5BZd%J06`Xvs2?$JVuD&*4wv$QURL7<2Tc_2fWN8que1N`ey{ERS7 z%%`1bzU8L!!tRQ$mdOsKeMyWaOPrP@D6DbBAFCWx+FeQg)vlizeR`Uwwjh4b8xOtJ zGi1O|oz!2#Y=*TVqcA3?${q(j6BGKhlBBRep>ndgY;yT%dq+@0uF!6aST+FABxs=- zU>$1-Eh$HQtO#ITtmf0r2cIe5*by)X_j^S`KN_O1I46nlH}DdV8SBPRP+%Db*y^`p zXw?|2j)o)5v@_Uo0bbttGZl|YiWKpRYO91hhLvRbT|rWo*Da1zM?T;Ei8HqsWFG8{ zK21cZ%Gx4OsbG~6C)ZPZzuVCht;PLD%N9>P;RUd9DHThbU0f_QT|5}J#qI;mF_;9b zk}wzs?r{~V0+oeNt=!J11LwWZkd|=Dh>OGRPONUtj}VCqU7FZ1w+?1HmM9xN$!PhQ z)TAa=_5AWn$k9o#6Ekkr-~xAs&3R`A$;&mRi4&#*ir0yUC(+&1TGq27cmWwvN2Cs` zl!>_<)=zPR@~abw%PFFh{YNMa?r^HtOKA%~U(1I*NvLAaCXtOOEbamKaEE`S4iX~m zjl&j$uwDxh>_E8M|NGR;@p>mP zK?)qg($)B=2W?7&|K7e>bCbB=l%F00*duE4V)yiYt8+dI*OWIHLZy>v57!BN&z+*5 zs4$IFBs@Xfr?liVc*-c7p~w@?4AT0%2)1hNp~wIeE3OH8p<9@3)?86sf|+ z81GMxn=lrdi3tM~?VTZ)7fgd?{dhJtSYqBs1Qh-pHSBVc<@v-iW%7Q-{1g%LPYqhy zwtO$2uWa28-uDXTO3ECXGTSM&2+jg3Wm<->R!S+@3vkyrD0uA1Okx{)^BUP>Rc@fGg=o^k6+v+rs<{G1Pnl_}>dMze5Di^V*2lk)MIX2DwMxRhB7Wtb#i2Z1+iLh#(k>;uruskEAOu)3BR`=-6Ab)E^Q}x|uVrpnY zU^bVk>raAm?Wb$(`$1abL|%h zS*chUZ4UzQ_|)|uf?ML@J~y`#7Kyr;f72@7Wkg?bF!Ak0B~o!3+5;e20u#&5;FuRb zmuS0!A=7@^sNv-G6CoM&)qS7GO5cRxr+Plx5sigwUeYw)bp}g)RuMxO)Fg3y@YiOD zA$-fVp`orw!+2<@SKd!1boKy&Pwc7~j!m+Kx1CJ2v9rOI#SVVEST*j4wa33FBOhr3 zvx(L4fUY0p&Cd_%ExBS$If}Wt(VKu$V^$RpYe-SJV&UWt2^16hC5O5M4$*$5@^iG< zbw0uN_5)BIji>slM}w;^R$*aEm-#z)0dfIb7j2G{rC;6k)@;^yq(0D%&hu?ZcWgT6 zTu5yUBd{bgxbVv-X{jZiP#g`W`F1%~VM<}D+3oz;rQ7YTlk_6bMV>^5$=wxBMaM;a zUr*MhZrJXOg`60kDxvTT7@h#f=#QcJSH0N4DA2d>w!Pf<5xro6Ap0IGYiJeM)an)Q z9NR?>t`k&}e7PqbXNDLCTP8vj^sMTkVZ@xlQnKt%#vhSqP`pfbfM!b+LYeXygW*u} z$~*_Z=RrzoVv>lkAHV5$ZLrk}(a9m<_Z#az^P~+rHUVW#iRMY;*P!_0Dce3W*R}OA zmT7V~w|fW)k*&uflDV>Kgohuw`R4?ZdJ3m!ImV5U|3sk(Lt;!AynxdJGV-8(2^$fyxYNC4URd z%ni4QhK2`RZ{#J=;AUl$W02kKZjrkx@zhfo@F#6lUn#b2x-vxcCb{~E4>QBPIDW>j zbuv8}=d;4ium1XIe?G&rD3X2+Gjq9O!#dJ`VT`l(FX#secC$5rbd5iIC${s9FEkzYZJu%iv4uRWfh12Be; ze2#`uP^B5LGP04@faV;9G3YquS4(7zuaQKXX1`fF^Zh7#(EW=}TQ|v&4M30~Mb^|T zviKZW=CXlWI8sA6Qn6@EwIXmi9d-^94$3YvS)3yInfbZJ4{4WV6)uF<{Q1TNCYW>0 zm-OSB&Rom4C}e>q5t>@N23Db~WtEYwCTG=72j+}<=SkJY^OSkksdyI*T$q60xLAVD@PgC@98+>*^4j8ISGy)9P%rS1_ ztW$@FSRZmc)oQR135+GTHEBLl6*@X=5 zGQrYQmSW$KS5_0twN0^>-|QWF_x$rcDV3K(`PP(qAQjrtE_D_r@=@0?QyQa;EPvG$ zp{&GQrn9h1m>FlIlel;1kIu~~{C1s}p8Jt$*hS~O?xMLPluDFfxM4)Hp zz$@<{oCc9+`fSco4t4!%Rkh8&P8XE#C(2(U?(j=Zg2^DrHRgr=WofjtJ?agPJs|*Q z!#y>JD@vy&>p>WUywiTZ03}l#1t{6k*g=tN(iy-V#Juaf?i$#YaiD{+gp*7Jl9>Cg zzOpMaCbTwEM8*>N70B=xfjgDF0w@IliEQ*pd^)qwf2rv7MvS zoZjv}I3}D@IZ|bMRVtDn8EF9M@d@U~}8!l&^r5$*=yLCyw8^PI%k>J*Bs;yD< zUY*ZaRb_N_Lxkkx!}>ip&(scT0v4=d?&aEKGw!ZgE_jxD1GI+?)A9Sv3J($_eGOcT zbP6K%tSowDBylUk)zf!?9|E3X`{og+KofQvqreu&maEzEwD7~o*FU=P=|2Lsr4G@GhSlhrr^*s9JtBJUiLp z-Ja?<{^}fmsni?mj0E!+Mhq*@f;z+on$DLF9iuRYh<%bXYk5ph@2)S+Oaq)BXzDjL zM>}Aqs#O`Nv%D_2v#DwAU8lP+Y!zXP!zdTiztU^&Y+3=9jf2SQB|)<6Oy9f zZTIR8nTP))lHRY`l=eTsj&JKXw@($O>h%G@XOunEIZde^Q+ah@H)xNXSlWmL?4uH=sms@_(d>qEC%$79Dg)&URRR96dJ%Y}$9F4=x)qpKmh3OF5`g4aVyL`IROE-n zt_=-y{6N0fU?pa6yQl(B8q3>f z9OXcfCP(Y@O6aT3?3MyG4pmX6!5=e26Txgz_+M{M`_-RAPJovj>Hd4=D7PBlcPthF z22kuy?`~uk@`=sQE{)GOe-js<%^bm2#u@6uGOxH*K8bIcSUV*x2LZ5K8$40Gy4DRTL?XAifw&l_sqX5$X&Oju#5Jt_J*e5~_uzEHD5;}=Mj zNQQA=5N)$TCnQ$pd~2*dI>r?om+Rc*N+PG~MuNyVAm3odP!(i&M)WmW!U`kdOQ=S} zqRQcf-|TVVh70wx{G_MrO8~P_lCT5w}KeXtU@OVWm1w&u^f*R;Fu!4`uGWwNMAc^}gKeu}WIH@QrNP zr>ZG9yg`2WCOCncjqRJ5@zwRQtvX5x<<7$CV4ygIL}L zAX%3!D>pOZ`>TPr4nl0ND2cl)v--CKN^lV6bEjtObk-XuiyY{ykow*?2W2}rm^$do z@5`RyAaXX2WYJ~)^hDRBvU2fC;7Wf-0TY8o@U61-hF!mD+}nAeYkQLj6vY7sylkOV8Dv{hNjMvU0wH^ zQ}T=baiv~PbX^&megJW_HDoq8JLMp%3R$tifdOC&Ty7AMXQ?BjTh5Tv4Z1e3<+;pp zOsiYXGPXB2fO-Sk4{Yf-H>*tCnFHu4yhIoV!-R>BT~EbQHw?-TF;i}yKSI3U$fStL zD#A+Z0K3iRbj%(wQ0tz0H9RQujDKLV7VYDw*wpA;6x$W#W~Vy1kM&+r-An&GbFRDN zWWB*PA(bL7vBlkh%>SkG6YS}X*0hUrwzJ=TgP}_xVv-@QuKDv>zegfTH;BJ<*PkHZ zlR0(k8F6b~vZyqqKd$S>u{or*a9T57+uYa+D7w!57p?X|7(?jg{4T zL=%*sKRjnipf|2;6}92Ro0orEs|XSdr|vXOP{%%^W6fAGE5QZ! zdp`(U<_cqV(Mi}4&+sT6<8u&0RAH*2%s5yP2rY!s`$9OT1c<=s&hLKG7N0X^nLsV@ zH2GX}UH9oaUY2FxZ3AX$bWSK5-Xw@ug2uCgrigiceM3(Y{%MZ2EhsldMgWv?(Bq~r z4z|{D%%=!f#zPD|bFq>)sGQord5D?it zT}GO(AJTk_E4!N?O1n5#sx>Hv z7?p9$H9kKjY`Hu)U`iQ8Ls-}*zf~9bDyvYGr6W4EJn?(u6q(jpF+S7uLz)VQ%Q!N z6(72k6~z}$B7>_^NSvo5l+XM!1Hlwm9?2LU9~if}4-5i?7B|O|+J27(yPB%d1&@dj zp3fSGF!8Uq-(k8EkcbAq!2l>Dr9!7HE!o&a@_DiLQdDM#?Q5lqY@{ zVrZR|7O} zYdm)fsnK-z@N*4tx93K2kz=k$+OH97dv1};)1h)o@DC(Tv{MFD_o#bn+SFPuzq=%R z&8FF)v~QVIs$xa*4CkA4%P<>eOB98+iD{w69+|@{1CvF zV+05hH7WI{G0l~n&hrfdF)^;Jv%j+dXTR~(!6u&1Z%_ptZk23zoYsVn@MjGe?cthN z1Y)d#?IX8Uo4%nT6a4LAxxsXhde5rRxpDX`gQ4xKwPKp_i&*H1l?pIb?yK-{ zTwn0Hi7nf7)7g8_h?(ES`P6vyM#|u?2$|<;74?BtEMWi31A`0PBwHNv?4#9jBA`rv z<6_?Lh+qoMey+JAy5;gAQ0B5MR5lCii;H7n4+l@%1}HRlxvgVnZ&b_MAMSpj0ilUE zP8+6Xdp!3E<_c>OiT)tezcpRjLU%n`#{<;e6+b<)Tno==1^n>bDR}w^Zp|Uk&5)nr z7MuWMRaWy5E1s=p=d3eDC04pBGCHX|%8$Hf)yd3pY8*HHqGrpbwY9UQ;UzXHH-5+w3Uqd`pwG_Hu2# z);D9v0519I_(-BKSyQh)`=`V`+lse=0d$-NA*K-29O3Zt)%!)0rF2Z2A_A1Mo1X*X z{tSJ6NCJ9mIRft~7dLOxU~D$Y5W8FREiR^Xh*5fBKqa{$LB3Oj_<5iB(&jRD1Xth~ z#rPY%v+?oym0A{YhotTO23X?Kk&6We>g2*rAxBf z`ub+c2+jGFf~Sz^TQ`^F<>(9S&Jbj#47JD4+4Im$nd!;np@9`Q`XV^BJQ~ZziTl=e z2t$jE{;ji<1v1~`ACzYu9}Li?Ja#wl_#U1z@XD_sjB!%BdxtP9MB49eD+tj2{$L8tAP-O~dhUOQTfva4j5<$#t6!3C+K{j&Ys;^SGDxCP*2+Q=W z;5dKMYVybfH6j-bq-{!YGyB&TD*NI#h6cTPAHVtI2_L^pPcoG~>cp4W`vw-(A0J+p zuW+^xrZTvA4C}mCq^hB@9ntLfdeBC{okCAPTC*u-ePOo`nYNVP5IP}IO^F{rmd2J) zvzHT5kp+QR7z>@%gY&vnEg9pHUrAx|pp7+$yx!~@=Rnn$xAWf@kUBoi$Y0cVQ4JpK zBd{COJv+{9pDwsdEWI>4ieX=}4Dg1|A6*y`UgPGpJsZ4Ikg#Mt;Gt&P7{M14)KgSu zbdQhqEp|=7)3qGSUCYT<2Ab2V&AUBR5u@f22I8~d416yLriULN4u4gM_Qlhlel=~)!+U$u9jv&Y+*A<#%JfuI=ysc@ zOZFKtYY7wXPft~pB72z$YgDG(c-{0py}3@)CY{f0wmc7G2QC2t-e69YQ}Db~#(VGl zd~idG`<9k<4B}gf?;(ZX`6)vw2mi%}!3BZ%D$ZwG-q8~ep0UoV$FDm zL?vId^;Tp>N#Ew_Q?uE{@QgJ9#yo~M9*TKi1pe@fEQr9GYpIhyi6oKD3Q$o8p4$Vn zpS>!UNM=gQg^b8VKG&K)e!Dl;-p$$zyG|QJR8;OCbJdYTu1vA2xMfa@vEf+-mLpQ6 zVJ9jd6?x*y$s?GIAVyOgy~h)yT%3!;oC zWlau|WZOS=8>YW}`N+3#SL-%B)2#M8jx)u+5oF!T#OG|w{RPhU^%st-5)N#h{t3iu z0CQ@OQ15h;uHlsYm#0?Kv*IXHv=Qx(Uq?#r$+aS|Y^``@9I?9}n%)ldc@WmNrMDoKi9rs;b zYXG?V&4Wg*g73P^&&-tUtokkujr_=#=Qj*skJ3A5%6@A4!U_|r8Db#=%~u=dfUH?C zjSSu~U6KLafN(*dSY{o+?hn#$cu!^%sz2w0Dd9g6G8i=73l$ z3`F_nI~Nxt^nI{@JjqM+EWYB`uj9TXU}gozP{TMuwJZYXyLLq%`}jo#_qSme~>`)4;B2`OlPirWKf$VCJZ-0(&Svlna^1 z=o)Zueh~#dHEDjZt%ljbIKQK2JEEth-ijo&&B zzJ2Uqc+Qibd)P12mDw>UKH^ugy7hHSoFcN4jsD?5N>7VDngtZ&==AdBCK`tOI_>3= z(q*{cvB4$7Z`Gy#B*CL~@iX*s%KKpLzzqSJMAqJFnk>|yVoWy);3w<0QE6hn-6d&a zK$C@hPTycL#ND1mW^Lj4@ajdp>0@@rSo@r`;^HtN9quN+}e?h}g^bCo;PlH-(z7`Pbia-aeoNZV8~<4Q+{^5vGD z7!jOd-(7!l`Lu~2?TfQrJ>D*B6>J6bS2pv6vzD7G!QRgZ84Op|st~sfpDwnEmd7^1 zWkKW3zOL@ubxk0K@w8bQRkp^5T}GE~hpSPM4AG_{9`grDc6}B z7iJdmp+Wu^U2nk^R~u{%CP?t$5*!+L*9L+FcXtR99D+LpcXzi2g1cLQ;O_43E{#s- zy>n;2HEYdZIIB)=sa^FD46s1e|AIsvY0WFh8vGNn#rDLA$tVM(4NVXVbt&RYCr~Rm zOP`c9u+Qgt&*yc#v}}F~C|vetaISZxZM8MoxdwuYJ{Bsbvn+dveKjO1^KKA_cJMLnH4pETVp>FZPwEC7L%3jszd7ZbJ#xi$x$lD_MWcjd$mAD-9E zblS|RJ;n7d?hu6X!0X02kF9vO*f|$r+?ikgj`Imn5}y^dp6GijDlR{dFDy4S!hF#E zf$_f6^^Ut+*x&W`oO1=fq4sKN5soiih|^?c}+WI&PQH_3uOs6vRl{_-epYT8g-G))>X}^iTGB zwG52C;;-b3nIeNC(FRJX35QzsmGmYgr6skHz72oFM+oEV6UN-jBO}dnGyEX=5$`Cx z5dV*KiqYt@Jj1b&U4I8j&}G6*qWub+W(C znhVYI39|GJxowqF?g@Xg_dn-y5QS`hBEB?~)j_Ov*9Us9M~4XC_d9kvbpEZwW5gS+ zV{#_)Fipf15kh?F6qeSWlnIin8{ap$a@Jq8SKPi}Pk0q_aaf&o=*IP5lww5IGhxDG zXfQD4tm6+S{389}DDS6jr32rvfQPn&hRNCoFISY$=||oq4GA}ih7Hs-XC2dsf;jvi zCFJ@exbRDw?5nRNbn?v1RFtTz1;l*KQQHt=2qP=HZUfzBd3@pC7CYUHbv{#a0i zEuy)stUutAoS%TJ1lEiE8gQgwUe?~nn5X*-WfR~@^O2Ih=!C{vu0LnAl|oc@MNM8 z_o+RcN>9&#r?tgkd*lp5$hWmO<(V_N428~$v`_@Ak11VbSRNRUp@eBep}0U-S`cAK zRyY$9i1lmk*A$C-eMU>7YPEQeq-(s_OHDQhL;=;+*{bh?CH6zRkHLx@ah=qS02iD^&vFd}@2mDu7* zRT|i%P?=|1QoVO^3fb%+6qG6%Iz$PN*hy9}TKp56j4gM0ml7mA@&Wbl{_X`uO}N_9 zN|<7o)s1EWPf&YC!`-~Ew#FP#5BxhahQF&M&`hUiL2bI(Dvzpi9b1{!qcuv=A&2!B z%HPC_2u7JjcR)}u45={uPTawp7#Xc8LQ8J_cRt;pKx;|92aV)H@CXvs4R!)Je#>d7 zTP>zo1CyBO{Q9sP`u^VK3vwy36j9vl&{^Vh-B-7aT~SORiNU!Dflu2iWGJ-4yT69F zD%aAn^YncnS2g^|dVFe$w`wA|JP{<@w6wNiW@eUA;Ug|2BZVn!8TA&=Ry^vc4}6cS zo58Hr&*^>D``id;0;MT8Wlo~jy+s+&8@SQN5e;J&U#_L=N->QxyBbU#+x9uGScU() zDz!IP@{Ht)3uT}vYS7WVg!YXC&+M04r85Ad$nUeUJG+aR#)wwa&ZET)y2_DscP;A3 z$|SDFisS`8y8>ro$&>bIE_CU+7sScxg_M_#_tzK(>Bqg4l+k{Tmz8&3GdtfDyRPT# zHQ|kRKu2VSa1K~K=cs(bsnd|lfF)g)x2x5NE#v0WFsCXT_+#?I+XSNfa!pkjW$mRyZ_>Ckj3QgSy1;v+kBOBa%Ii9vj zc}7B3wHr;0G4G_zqFM_*!9c!WW7VS8JkPfnV8b9Q?#B4=#B)Ry1le!Eu|Vou(ST38>Ew%*D({N`Vij4-4!VzHtLv3t;@uwxP3U`|CyaULC&o>h`% z(;3u9ab$vLu&Ffw+4@oL*FST51E5`8T^85Zixy7QL{^-qhsO49bV%EgNFn>`z?>Yf zQ1@GlgCE>6n<_Eg1IdumaJ^Vtrf70RuEeb1yy=TCsFU&G<@?SvCiQ9M^o*psu4`bN zv@j>lJDLJfX@B>I)w~;gWhJi=6Nm8`_1?X@Nltt8J1b}skqnuO<5p_7!5ARQGl&%m z0NR$NR(wOpO{_&H*u{@YA3Us*Gx9CuvG_Z+ISS2fRF9MVgUF(xA7w~rN1&=)Cq97G zidZY7#g|!((>saA(P9D9nkj}0iW=`zzoR$G(%*E7Wzpgv`ULuUC%};T!m4tl*=!53 zZgaAPKNZ~OpD^Bzp3Qd4By>LyL`q=3U0=MDw0U}Zy{}y?eYst%^nB8j$XsFw71>Z6yI^$(Hgg@^LH??asM z1narN^?kkWcR`14vyVVh6@k>NI#Ej1V)ZYlkn-?lJ z!>U;fQSRM@cf=Y&m23rJ6(UJfpt~W2m#iEN2qRQ*iX4YmcFbRwf6Ii`CEBeoj$#=2 zUHZ6C!neT0$6waeU~!B!&&MU%l&@BkEo2$bOTaMLqdDtYCcZwaC0~99K4%iA?8Bmkg7}0A=L-vKM8uLDP<-kSa_rWWmV{pZ@zhhf!;v zvY;>X2x!(aOgrok7ZP%MdKyb1g*#oD5OsZpiz>wN_2k25acrAJ?OG7mi%Sdmp;zy) zYGo-ndb1_tx@17jYHZG}Cx%)7=J+w*#42O`4f^vv>eABr)P!=aYPx`++Go>oFTVXd zW}#YLhDpAaWw~{V+O>FmYSk2~hLef}1?2 z)$YxLAqt^r;ktA7JjzQt!n*gh#{M6C(O$@8^mmG_02dsi;}~lalb(|St*8Uy=Fv_F zKNJr}_9sIPn9}(}k&)jvv0rQz1*JB$r`V#YAf{q-oDW+N_scXDeH$oI%iPrw>IJEydjut(u{qA7Fl=)xq&%Z<9P;N5~-6*r&LIhMZ zky+l_K{Qb&Qa^-b(|Z^P4NNj&^ZIEl?Pp0ng=;T#U;)1?}N#S_GSyE_V5Q z9;ZZi#Jd`vY&H5>5fx3#=MCOZ2lck2C<_N$6NO6l<0u9t;Sx%erghIwNTGAB$vN;g zj=Ls(#+AxVilu&)!|m)C@nXN^fi!c{e#!8KUnT3AL}~bGy+g&JCt(w-M`f<_Nhh$& z@=Z)P%qlonR#re3((x2TVY5Rhdv6SzYt%>Z*=@8BR(?A!(eB)zTvco@n&0|a(W-U# z2($Emy72Daf$>`ECboJ*2+uDjPrk$yV4=1CA~$0txOqy+Nmb~-#T=XI^{zF6%TiFH zKSO!?07Bc(94uRxfrl$<_zG{47a4k~6``b2fHJ4JV~(cO-lWcUM1=ezVsirbk)*$A z*}*1}I^Wx9MUu%z#3sW<)sa)rctVe0ioiKB`?6CNI)|Fvb_1Nkdf64(mu9GupI!+X?-!(SsjB|98BhY( zKLUfFpD1D_XYrsG))6f~&g|~UweQ9AgC{MI!^Gm!2#pIl>yOQRNky#{!=F`wdX`~T z1pFYh<#+|E&n|lI5n;py0bjn!N*{@m(9}~$m1c|6kzrm`$CE1n4!r%< zPJ`fwjbIabOsAJT=CI#fs*Nm)VkhwFx$0W19bW>`Q0`7U0vo3n_8f0s^xoHbUinPB z8a`cROQ?-hvqVo9mwoukFZTKO`~ZFIuQO+4u*3)2?2&VM#(-2ssApn}oxEb$eoGa@ zds(_d*f|WptNNSSLU>|Nsv@9yAf*|A!W{+%he%Q=n;C1))l&*dngZ1=##lmt&67nq9Zn);E~oNf z=sIx!mj0CEio10{E(S_2%1$_2@#Usxp zBSGpsjV3`H)DbP7si%Lve;b}qhR}PJs8%`oHM!7dN_&yTIj+c@p_H(N9A;5LEt#gR znF)m8SPZxzV<9_&5!Q12t4M0?v`35~%_#YsX`kP8jApX*4*b+2volC5LGFG%7=i*X z-88?f)2xPVuQz};_jV7Ha8fsHSngdtCwY?K8K=tG?X2#4!qMMo-=b8q>~UQ_(W+c_ zoGmtQMQb8HlE-VO|Y)2!o+0T}^{1&rHp5oe4JTwrtogWA56#-2Bzq@WWB;Cv}z=LyISj0`YL)BB|J`SdWZ4avz$Y;i?%odL=Gk?1zJCHjPYDJ z5`B$)_Z#EeouLaiwpl7ge)Z0ns|nyo+YqC79d{K9z_!)JW^KMOYJYU!YsYaaz4J`B zVCjp=3uGk_F1P@p3+Ow(QULI<=&!5FiK9daJB>pe8Yea8Nweon|LJ1iXDw(3OuKsA zfkQ^UWNkTZ!G>8Uq|AsduMWdaMZ+~ux5+XJs+S9Z|aypTN^SO#A zNb^ysKo&u4Qnx{z)-M)H4Zn&McYnORWF*|bFi6}2R??&l0|%bC=^zdVsxaxw$dWP? zOZr>x4`{#L58`WOAgHf@JU{VP?=-y7pc*R`5iH0#=pmFTZpG<_hN8aXFAIe#P~-TH z6j4iqey~^xzd|~4A#+S7;44{u%`8^3;j}iVBt13M&n=d~d283AXXS z2hGgLWOsQDnREPbwF{~0dmj(n zqns_#4+gS*-$KLq!o0tLK=kZY{*$)N%~oW=f~4p3i9J~$iv@ZX70C+)kRjG}n zJ*<9Xq`!%ZJQj!$1dz2}#xpUuNpveaf&;YRFQcP9SM#LqVOdJRs}AOIk#<+9WR&7~ zGyb`ta{txzx6Gg;jAPi6%$G~BAYa}J8#XOi4l@tFDnU^|3 zWvJ#XrTN}U9-|V7um*%27g$!8W$+`u50qfLEl7qICKjJ7jW^*4k%aNM;rTR5+BcWo z(4PW?CCHr}qE>TY+gIpa{WgzwjR*JbJFG6Q&#Wh2J(?hBFw8_@99ux1j;AA3GQT=!j_tyWq&WCc7aGnSBj2LSn*68A`gG1l+v8&U1T7XDcZ6UPtXsI$E*oK#+uePjLG(mR`gj_nBZof)M15%Lx_A=9!Y;BB_h^P%wDUzy zC(?j8!hJ5+tJlTU%Tj)+BT^Qk5*-ZBNarzH>`Ibq_)2{Ka>5;@IJ|2*)8cuz^9bfE zp~$3fou=x9YP7L$g(tLtgh@aZfv>UT_);7n1Mk206kNJ-avB86E(CB^hMcpq+^AbB zA>^xfrLsJ0Zr|N;4!hoIdu9;aVWa!iRZeOT@F8__S@EBpV7ix0Wh!(-BPfJ_ir{oD zAAM0@MiXCl+oCO0Eae!$6G6b`P}q^8s&CkItjYz%8ObPqun5&r!;#&m=Kx3-GUVd? z6B9mN2C%PLUh309wdTWmmp(_oE{ju8SwB5QY_?=Mbgfsc@D>ZcwcXL~%|!X3`RA+t zgYcQMrcB*PMYg@mA>+@VU6;n6Kp27AdDqw}#S(-a?kL(26OZuRPMEit#@~k~@S`NF zep!xH1m+Hlvwha3Nf5xpNfeb+%beh~d%IK`z71YwPLd*~tlqQ8f}tr|wNyrTV!tCc zD0F(jLyJgfN%a$|M6zF=7MY5~>Em^1Pw@&U$#U&$kU`mr!OgWBl&K27gtc0wdn@Hr zj`*RV!6&60mENO#DTf9DUzM;Z@hXJ?Zv4oIB{2*e>799nc#6HD9f{M6v+JFS30?t# zy_fBH=4@a-_u`MX1pqd}E5lYT_nr~Y_ShA|&QM}qgpAL_oyMuHoiC2&=Dm-EUHl4| zVEI1@#rjV|mBdO!^!Y;+)XI*EewHp$*`Q{0hb+4 za~5=za*rnu4M$kApIZ$~TqAza6_v82iKvnj(j_D_6ZZ#A(OFrN7K;_EhGKT`cD#_N zPC-%0qJY7ph%w&XT&j2lk8xL^sfDZh=i{t^P^tOmG7Az+tk`TPqGo^GFJ`AX$2OLzmvb&J(#<82kk-m}@RAGj-E)Kr-beh_?e+*@F~hKX1H zF_FIvRA*AnQhw6~qqzo4B2H+M7D&rzYLPbtUj(9nX$r5z(#JH+1<2%Jq>S#hJPZZm zbXQiNA)kUo8Uj;-!w{NdOSWY^_+RJAJnrB89EuiM%>H(BkOD#V@3nMGOKUqL%*1tV z0=X&Dn3c9kb*V8t9#`>w)*|6QT-!p#lq%J6CJ=I{Kie%D9gBsv;TZE!!i2#B?S;#*j0bo3N4d`F=rxU}_Nw;4Ld^|~?c z)6cEQzhEixRMk-~o%1~URC|wNZdgu5>?B!M_(Y7nhQ;ZDyy0RqmNG3Dn$TdO+sAd6 z(5u&~opK_X?_xxYb%IY@Xkuj*@&0rm#F{Sa2EOK$7@(#pe0+7?U^{$}qA&?FoV>8- z#dq{^9s=*d790gK6ASGx;VK+Gcr;~;dAvJFbanAVRFu4}-#@>`XQE)w0RndWdl^kY zq1Me^qrWCKAXR)?Ob}&ErduuSPtW??B#rc>7H&`rm3o z;@A{^<=4jAgc9xGf$CdO#r<5?Wua_v_E{(BD&p>5tjNyj0%!1zO7J!K17$D8l!Jt) zv(X}0LndbEqgjm{@}Qx}n&ji6?7R8&n!ck9R%uimRB*VEZp<#wx$|YQb^S?n?0X$a(`&k7vFlvBj{^J zZi*?`QS@?htRkmkqoHd+1_S5mdHQk`lc}qFITC^UvM2P`&%FUOc6E(8^NA6Yeo8Z> zAA#toFVR$^KOBo@Xbm722@2p)ZPU1?*Ph-w4Z1r1jS;+4qQABt=4E;khw(xiK#WoC@3U3_H2!xSU|e1Y7a92pkd7km zhyeFU$L$gmi(Uy@{ydGV^!H~dqmw_u&IXCKh$bQx>v~-DfzhYtEi;lD)K^>w7B`_- z7k4HJ&+X&SgA=p&{yHL5c*-SNK(-ep#tz;OGEaw}+*Os6DN7><0csv1QaTF!-#4Ua zDYWs(hvH<-ZR|}`i9Rp#)msANIO_W1>*yDcO>dvPYZ;8~>{2-77W@z7&+AqhKRmh* z>yf(gf$?hHbuX6Ny!clf{{a^JCz93;yNl*eCv`_&;~PGYK?dvXrnQ8b{x~Avz1m-QKK4|y4OBeEbCn7(ofjmVc-JP4` zz?<#Bn|VFM%*@l#yt`s%aP@5GtAX&^rB!-@M)LH0_U0qu`fteK4q%DkzU~)OaC{F#b=>Om;AQk*Xx*_}p zQ&Om<*z`>JQGKghyYmZkk!E*U!UrD`3I-)g_`Fkc<=^sLeZG~a6jELU#!ylgL9^4I zBo^;S_kpGNj@Y{}XZltuO{MV_^p@?Rm5n`YGHB-8GUx3?Xn)nb?9`>umC$u&D@NQg zr!b2xGMmt4m$mGU=Am906;{ioRA^`Zl2>U=#kd9$vTfmUC+OWBSnu0j05VdPf4n6X zBBBJQN@wcd_qrL7C(jcSSL31MCk6~bCz`V{k1nM|=34&4ztx=v#w1yj_ z3f6`WD4Rx>FI@)zf0$1zt6Nuo!~X7zf7kmXdlw;*N}_+ULeAyx5umZDQSuu?87$ag zeC41^@i&GN)6yDoY_6i|I;jxU6~^4!cP7_4<6os)hNGsN(|zbfFZQWO^FNre)T|6> z1S?ajtnakYu{NoARr@TozmS(@iG^#t!rle92!?m~=?ZYiE8}0(fQaHua~>}G`5b7- zGfKTx=ts8fd+^j&=5X$Ho9;ai5&UZKZ5js-Hh*464HbB_(%H|>$8dKianrY-U5{N? zEac5Cvh-K0X5bsIc<3uje|r7+{-WS(!k2aPK;pAGchY2SV{>&o1ZeaWz#uy;^cQB{ zap2k7wiKg-Et?C66xx~qip2xjuFG4n%YQXw4pCd4bkRV%aDTAZc;6mnRkXajqf7Ts zpeP_tY8xSW(UI~4bldK^B*+V)FOfm+@IfUWBtc6dEnFgO*t=pO5d^RMp`EKLA$3t{ zxZICE@goKLa5<(VD=+9YK%}|v9_{$E=84}fJY6BDGLK!73p0g*f|cL?bT~eX!yb4< ze0*;q78yv+ru_0&l|ixa zNhfc-=+lR#J)NDlI76IOTpm3MybVtt{v~_qD+J|H?M}~xycYlo!n{aW$|=G*?KrA* ztijvxC8Hi|HeqV-+6rh)#X|Ir|b|Fmq8xeqbl`GOEC=&zi<88J}ooAhfr&MfU0w ztSB?=)i(!brM8Pcq)zu?2CN+wgs;MtIqILPMT3IOCznMr8GhIca-MfuAghTNe)Ce^ zI8UXqq;~cfHcmpbIPDGG(KE`#jQo7{P=;6arIVlB3Vv12b4^6Yq(abMlzy)*GpKjP zmKk9DiwfRwnjo^FZ=}xqU^6l_-1#c``F%si4h`a|}>F;Us;;p}2@ZQYjfz;H1d)W^;wdT&oN{Y(5p~6yspIf5|(Ef-&Olj!=l~~;nGz;y)1{k6UO~gn&7wnmqO-7GQ_9_WO+;>)6(wP25NIb*TZ=-%ERS{MR#*k5J$EOg3X(6}puj#M74393%2~9vO zC^AZI+GO``bH1I&m&~jzo2OSnxaVg*nl^a|dGdsiCr6E4pP;ao9AlrZ{>}TytFvR* z)G^$bk*?Pu5+5J=JkA&h6OE{X=;KL%3~YHaMBz70cl*_#!ziPg#%CT6ab(eYh&^eA@qAz+@=v^nOpn+lR1 zK?;iVgYndL5%09wSo?$9QMwo_o8tsW#B|=wD(~1%aMHm%uS&=G&Oo! z(`#L`={k{pwKp@s9j$u#y>o-lzxba|wCk7%DYKA&BucwNJ#xT!ojB+6_%JYHE6`n^ zG*(>7Wj79fVhQk^QT3I+pnRWQblSX0K}OMIT8u@~6Pa!7XJ&J+*zHY`}jft!cMJ?;y88>+eU#q_x9^8~yYeRstNQuju^u}XvtOXm!xFBfG zT9=A+U(%R*1uS?nq9lR|5|xc7pz3nGL^R8_CrOZ^%d!V!VTqxgFN9JCt5cTkC4!|@ z%GGyAc+2|yy?BHA60NKL+F}MHiPE07TQ5k9D0i`yO zCuh-|5lzKrVcT0k)SL0sWWVHuyDaz_o2O79(z&@diPXQp!SL&0m0`PI?)HoERSr%= zI^Uyi*ZES;eJ!CoDCoXF!9KfNdupEg{3aF7Qj=4;tloU}TCq{wsa*5}G5XQZLcsxo z-SA4{`Z#9RB^Wu~)*+rNaR(HTsa%%slCbTi{0SA#Lo?2rxr|QRYAa;N$(j+&=E9<@wtgqrtym$PG)vijpk_Dc#+rpSrdiT!?)xAophxC zV^^|-?uiGybxV;2Gwk|=M2=qeeQwDG^`ugTlrg0^3S_9|+%b28B6;DN4!qw$X?K~S zNhApxRSP>TQfcG3qZ%z^qwfbN2f(;LZUEXsd;%dlqI*#X=h9-8Wehnc1>9k#Yo2ff zP@|&D*Rl}hHRz!r>lyWKREw);3f?k4o0U~$H8e5!BmPdCyw1-8UIyVjQ4^;Cb5k3z z-948j$d(MHN@gb}3marxbO$pYoc?@JWu=6ax2R5CajHA{5t*iKB5txDFpl}n=N({L zm6SB;OcvF$abX5@Yo53t|K*URQjSd4rp*|YRA3(=LOW*3CL+{$r;<*0UVk&yne&60 z;-j=;V)&I81PNeY%O#RcDWrPt=W(Rs%Sryq+a@_ZlXC7cxpg^xeV!T7OO?neSgmUD z6&iSPiMl%A{Di9^`u2M9zS(!O0D2YN5PVMVShMj+3-prDJ|OJy8lp3ZgYU~tA)g%% zDYJ5XC=rf8tU;S1P-EC__nKS}kn+56ol=*TK{%Int4iPG#XJZZWA8yl7v8ZMrTaj3 zdbEP9ge%g=t2`X0K(J6}xIae~d$ zKH1Mz-eR$TB8_%!RoN+~yq&;W)`Vb88 z*>0!Lsc=TPStKBzKTeT^q+CKEtP`UBe0OhOGJCyp&dzL}(qP!)1@NT0=gg7+IH+BQ z*mZqp!E@5w(il3pd!GEyU=oBFOy_Yt*Mn!CPCoYCWla)#Ek&z`^fq$lmMiEQdNcb-XX6~yS#&V}BUZ_1YCLXswr*dOs6$*zeV zJjE>njXx05h3)FirCNGy1;g8sX((*e;t_q_y`x+en@5+onb%Yc;{Q6_N~uX2x5}HX zdOa68a@~N#xX{xQelXkGnCs0aLEQ2*kMP^A3Q)KvD7ocBp4(N|w?iERSxG3A5i*Ph z>g`dwmkes~nri(@RVhz4dG#wv#GqO)u*uFSwfFUd$)io&wggh~2kR$KU))J11p0Kv zB-Y+Q=!3%p!!5u60i>+{`A{F%3pXxAeAmXgRy!^ZEYgOW2cuVJ2(KR!$ebExI2Ci_CY)j1h*mDdOI9n{A zH+>&)Wi@%v3k?bEY}n(c?G${sJS_?TYgV0TgZk+}jSx8`-0{?k~kto3WP+cmvMW5vZr zv9PSWXeCge6=5^#PsBBv}t{*L4B$-JV(Rn$v>s^o<*6fsf?@P0H1D5Qz#0V(0< zag@ZKo?kdX2C)=UXxe~PA0zzz8(7>F<9(T^RUgT&U+s#6>mSlUF3}lR3C&>AQn`kQ zF@9zmY=)8en-Q|t@`3U3&jA&T(;POVVe)+7pANn_@OBBRem^BHSFu|RkO(2u{x;TT zNUEscISKb=r`P~8K48??VTD5_arjw1K$?Vg!wNPTocn357|b+Si>1Uggxzgey-#W6 zB-4bdoB#|D!$gn!zDr9Et#(auRF_!toff806o7g z2raJ5D+9!=s2W;ZcJ!+TF1ntHip>rPbF!~?Zc@D7$Jn2=5Vif~r2>Bdb*^6K=po6p z4X-cl4>zL_%9F+hQMETl*fRY4{Ipu=F%~;(=2lKC)B|ao@TNC<6P-(CE==9A0;x zM!)e~a_Kc*toGNVCv5p8uk8H(NJtmqvBl#r?+3jM6Syj{@X4UfHP(4qbEVMgqZt2p zEFqG_Ll%;#ct*!FP(K&N_O+Rh}ejLx43N*YfxbEBiyfJ%Q-R z1*L5M>%rhKte=;czXAdTOfZ5Ru&Ol~c-^0qBO;KlSKCEJq>bljU^>pARcpkGyz5!W z$O@8Gxg;8qF+?P1%tUe%4Lj+0y4sB%b_27{Y#@Si1GNMY!v`kBg};CbeVK&h2y(;) z&sI_s%P`;2J8fcujOJkAK^`}O-PfdsYLC=NTZfcNm*o8TA9vZK^F zr@^Z$TGNt6;@ib>if@7s6DxNX3S{O{+|3a~A%ow7H%E8`gHY$hh2-A{onM*&t32z_OKbQY#S4k8XqFer#3mjlC*#pbPczmX^LHX5zzf56rz3J?t3TNc?I`=`o_HF zDhOel$HkN4F{)=~W<##jeTfc+*sH#g_x~>yD}_)o5>4BHq|W*88wFQxqZtLp*(C&Mp zI8xAjp5S_qY>2IrHo$nKO!AAePV&Tha?T(tU`#f#I{g|;R z=!)-VTAD}ZT@)VtJ3ce1&t1%cPb9!Twb2BOg1xY7eqF%KN>OeAHCn(u=?Wmq}03lwZdXnP+c zCwE&-vHK6wM2N4S?P}}#pCA=CeZQf=uTosU6ZgdzBOTS%a%L|41#eq9G5{m{>Z{Ph z`{Oj7PW(ezva3#hBVYS-1J6nkNfM>Y{K7I+A6>G;0$mHwX>mGe!r2++lJy*SF5H#C zeeock;=7$|%KMeUTN-ZF221+5Vgb4WiBM6_hcpufGYa$I0+~v2z%}ro>lHjfA$7g< zJwyS}bn`!{-Ca>B_D37)3pra%cU3G{h)|fhLDFw`@4Y(uvU7yIvq@@m$Y&w>;kg_@ zPWon1kE0XVVLH0qeC=7LiY?>VPA9_@ELtgUyyKO%2y1C*=DETY4fpjJXC(_ml`{BP zI{6B5+Q+WQ{JS7uW#)=mJ8r10NAT)y)${^qkcxzJl?MfH1!q0;t;XRqfjf+rLc((2 zNp>m7W8>y#ZT9yhYWc~+@+1E?&25!AP~*(ibqpJ`Frr_!>gWOyy`-Q;iQL6x_Wxo4_z;C30KWTU$KztC1oG^ z^eFXqX76fH*F%Wq{bRADS+iw%_=OH$w*7~kq_Yny+?^aA_RdkjSyq!~WOMFLxc!?< z^;=CNV_hWY{|Axt#Xsr4Gve7bczk4UIi@K;-U7*fKkgzYr2rSl zVwX=NiA-dm#>EMtew-&-dpU%&8xw=Gi# zQ(TG2BQJld%A_b{_KNrRXcMj3dslLgR2JPGtz^RyqFeqw`!ZiH^XPb?H zEqN!c|5i#qK|EMghNd7O#4XcB327JP+kV_lESrkWcgj1-#7=ccvUQ_S#mX_q9LzOI z3Z)Ppi6o!U!QvFwPs}txX=%o>+}EG&;y=|6leRnJKk`+Xm#msy3Zd8lBfw$N;FHvL#&ze?2=ZP}`i53Z*f zz7O;e1wMw^HhgUT^rh)zsyUo(Mqxv7F|VmHnogQZ!&CJS!ThL@l_%aGZ;5n65k04# zs&rNrMMKkp5-~ZG7pQ1>6Mt$IBZEbKz*}(pbz0945z2|B6l=WA=xGa@e;Ys`to|E? z!9Zn;q6kVeT-?m;9D8TyKBF3zz=cnW3q#&Uh74@lWnO zaYu#^Xy2EcO}$L9DM4S8!1#Ur zv65y7DYE@4^*DIG)KXm=2b-I}#KhePNGU#}GzQO>d`LzyQP@jMJ}|~W(9Tv-yC|d! zQ&ofSKvCBN%*qwAw$8yQlDB>-v<_^%d8Sqq7(6~$7QG)z1Zh7K&_Op;oC0mdXHK%X;01^k030hkZL6pv8agA8}qoy)(!SPMH>sOL(v1Xe8-C#Pir&aX_$Qk!JoREXKKjptr=onb`2E*xYaf(Kh0V z?mQ$`;>_c(fBpRtUk~}V*74D{_A@B^W%A8KrlR!BxGeZS2SG^j|coG?TUzww!1lNJ!@5{qbYr{HfKw-!3Er z^WQwt32Kd4@9C=%16y% zb$cAOV(y3Qw@};;Toe)cBqei{RG}D}6&vql)5LgrW)ePe@>&rZBa$+Xxw3 zUSI#wpv_7g(q~_hsP&j)n7>=GfrNk@N6A7Fn>Z&Bx4c?YIJQ72lS2hGSmUOJJYB?L z%S@q{=TJXScAKMe-7r_QW~Pc#QQ)1pTz{VIjs^P*-YlBIfqO^p=SCQh<;BVd-B~!J zPv@NKL%*XR9-?+5YT@E18vLL+7JaAH&n5-!98_L<72#Kzzq1D@)Dv!1rIqMJiLu@N z=wxPyWuESvnwI#zzQ*6`GBNzX)PH*fjP$LZs?F2ktL=g;HtM@!3lj4A;9hhQ)`NRK z>A2n~=F%1&{9b~WlHyww!J%hI^Tdo?6THxaxLl?e!6Z*V`w>Eip1z>>T;6Zz)4eWP+P`$(*E&x@##y6Vc zdAGF+ly%@<_+hC5L9WDdOw=Lhryb_dWMqW4)p!~@s&ul!A46;oNp+$DBC_wn+KN^( zkw_<=bS-b_Y#x05G3Tobal^&)O13?PF^HFY!8ab>Uc#y?)$-|LCQiDZ$}oR%1e5_^ zyvesoyDJR5R-LrK4Pe*%9Q}1KHNWsxw=H+_@m3x1!6M-E(;p|DQ=WJOm*hXqxsy z=HevWv)MDoc=-5tAf6&&RwfH^loUpHa-dOC2JDH^w@&SvRFol?&v7fB`YpG^x%G&i z?RZ6F`StVDbn8%ga+<&j8B%*rau38`TBekMKo;@Tf?T zB&H-dwtrg(wGls1El~ow-8x(PM7+6|Do^v~tHYi3Qi#mbYt%4#@u0@<{9lJY>6Ae4 zd(PJiM%2ZdIe%QC*TK0xaQ{Ub`2@PuL?UCRSscX&D|XkQ545n#+E7Ck9Gd9Am^6OR z`Lh|2)*;vXJ4gu;&*WH=tmWL8$8(oc<8L0p4%prX3jZ`TJmijJNPrnxIBl=T>%<8#ep#Sz3lYK zq6i>=fHE?eLcpRvS`1_P3n?r{Nq84>5Jep1eh@Crr>=t{_djmy3uR~NJ11Izg!-|v zX!jS#Uz16WGept45iE%S*ZI>1)owZIyu!%Pn%I=uR~pFMGU-j~%gZL|F3&ZSdB_SL z-?GJQS{rw?dn)LDPhHI&g65_1HRgTd4wucI*Y26g^(to536F`t-+8RLol%m<&;ixY zz=)q$W19x5SwH<>WW7aLTn!U02n2Tx?vifYgS!WJhu|Kp3GVI=!QI_mgF6Hd65PFU zng0GecQ&(N*YL17r>p8!8h26%WA3mq@E0fLMIo_VbA%X6mI)kll3aphH0I z5{G#AFfbmDEs=CHQ<7KRf3wAx0R0}{y^3(ZUS8_al0Q8B^L@Mjk4=Aoh~JMtjoM%R zzij&I6EBNl_rcU0R+^Spk!nM4=a7w%WaT_dA_^toK&`P(|5~muUSfq@Vp#|%!f%U< z#txTIm@EZjot<04l7&o$II22kTsLIX91RuEN=6hIF5s-` zfQ4lefhGRcnp~5iB?HpUs$`2qbMjkNf`U+z;x7(fEzNF7kzhIQ$?gIV_Si{HeMmY2 zBOa@xV32EegVL@qSp8_UV}>f0MHI^s6Q2q3RzPydcP`Gk+)-t%2TW=Z9Byy@o#m5yk)YCkzcujcaD$4jb~HUCa;V zb@{p|Y)bt7w!XLYF6>9?9(bH;wq`Q7Q~<+VmEBrw?Nb9b9IYcO959_g%nZxaU~iH| zuKuvK)@l4p?5))X4)r89tui$7YrA;S{3M%L*ZU(nbY_~Fhrf4cY!~5fKDj}^fTQ2l zdq_4Tu>`pFenAW==K}ZiPVoOGv{PMQ8y|DJ?ttn2L?MwX9)O}K-E=PmIf$7sUomZD+ce=*mA z2&|95F9NzT0|*9lMID;Fh=|=*oqF@!4DKmS7aLjq{tX1z?ojkh;r9Bj6+U z&NBb*bampFikA^NnazL8M~w)+3zkA#OX4}RlI&CcDwrm-Xr-X?*h9!2`@{BVF^Wjn}hU0=%w$Q30=hlv{se*{n& z*&`YtNG1?p@=(6AD1GG`^dT&(j4yFI|2u+vAeK`2Y zS;zK24bl2Ny%>3b@57sxEp2W60jao8$*WeA?kzMLk)ksR(&%bD_xWQozr96?f#OW$ zyBcOPMUmHf@>EaQFmHvVkQ*c)Ao@jy6QCy?Wj~o0F1H~d6(MJxXq12IAO_Q}Jk?VR zmqQS>U}y=u4>s3A3OKJ+IIfgX7^OaGCmP#h)!INAJCsFBdwOGH&L-b`VQAh;G-s}gUXY?8Gmg{dI~0(+C@ z)+>Zv70olw_lt7N9_ARTxM@l5qP^w-8`jdIrI?Jx$!SRRO1scGZOC4y*4LLHpQvc4b zQuPeyTq-OT<~WQIn^Xb#^dcsRc~-k-_4Jl`ViSdDEf!$#ARhoYaX#@$Lir|d~32HQsIFNjlrAi3ngK9mxcNvW(HJ#aKCXu4}u+quzolF zBfYNwj~1M+Qw8-c8{+1f1t+b|&I$`ytA@(djlM?PNB`#FoK5*;ng{L4>k0`Liq-@ zlpY36ylmiX{Qa{`=l0ovzNoTsF{Xv65m7NYrHEW%AbpIK*qV5rN+qwDRirnPZqog8 zHTW|k1eiR#OaG#jOIbv7ig8q}Ir=nthGDv3jarz8m?P#8&^t#S3z%P2c8hgY)unE_ z&%G9snYI}zt;Uj*TkcMfC*UuGMx`oNRY$6Zpg>TX{y_+;eA>A~)&^N;d}g!E)J*ZKuSPw1f)~UCCE~e%>!gq;rTn0B_XQwWYy?U zOH>x6Zm_m(9DNAArWMWRi@Z1$&S^ajQy7g5qX$iKT|WJ_i-I<$ZArWcl0rvwl;-e6 zS@jpU7I+yTffB?hZ|bQt<3$A`llf`%pC%pf|I?%kDgBbSd|mH-<7YAKr8#|o$YmsY z@+J=%=^#WYo?yN#PHVVrxxbt|YpZg#UPO4y>9qA&yy$%gZSY?%X>b2Q1_kV~<3yqu zJ4_k6j9|x2sP0hskHuDLp?OhNA$Crt8q1}3&6uCv^%x_6*0Ph+q<2U7AXMMVwYD8(X$&j0Wox! z&B*r&uG=s)o^IxS$^WwFDfE!Vh>b{zXJwuG8^ZCAq*RD!GPe*>%KlAsHO6AOG$t3PrKd?_FeRkxq63dJ@72AisUQ}cTE ziHOtQ93XF|Pb(3phbnd$!;>j=bl@+^Pv&iyrQUrE^_qlcpF6`UOx}Ij_)y{h@p7A4 zOpieU^9y&huwfLa$y)(Xu8^<|p-0(GQBReD)A`{q&mqoPol4UCxaz)9-H7#PxKft7 zTI+knXQ0lKI1O;1=PSFc47O}yI$A24huJ_9B8tap0EXlm^;8QW3F!O+#RNy25j`K* zAw`X&(4*_<;Q`TK%2Yq7WRzTDX}jKdjBddA=a&Ab@JfoK%p3vNbWgN43O<}}bYz=e zQSP-ypV|o>`hA>!96U`N(&$LBq|}k9RRr$a^}8l4;Acok!3I-Dy?$)pNwua`Ub$09 z$X|UQE&KvQXg0&8F1F*r<%N@q*x}wM5TNbY(S6F0Eb@)?<^hDktMQs^vohAYu(TW| z^rPG+x?hA48%dhZgSj-pjbo{G564#Qr8!>JNi+xc?i|fJt3NN+lM49=pKCh#LUC|K z%_qzA2NZJ(lm1`$oLxh+53`_Yt&`NL)6&YDxO+w)oh}3kd>S5zjW6SJs32& z#4e1`{(syWvR^KhAg3LXPH9!}tV3&%fb$DkwvqnT4cIm|Rtcho^}c-(Zur=yv}(+a zPfj#9j87xVHnXZ8YasI|C$J+oCW(hs{LyDdBYV3ysUyl!&WhzHM_805YgjWy(0J($ z4>KB30f3q){>?PleeRr6bb_Xo3tI)k1a%EFz-sRmrfP*F!7t3XT7^HTSc>=pg4uoL zV`*@#u+x6-S*t$?A@4yU62mL$vQ+WSh6^{Ne|80710BLDjWXf%44N@8q{z8*+Iq2t z?}+PP)>vbRZ}e@!#e+_!c3lnnY89qCGSW{x1xV5~aDin=-`D7?p^tObe52R<)w?&* z&5p{ZeREdo63unuYc-Q49mWc=HHc;k8vx33b6abYC4`m5XuPbM^;t6vpm5QurM0tS z^#gy_r^sL$Qi?=WMvvqoB-z9jp9n^eV5yGFy0X$NgUoA1^}A=iD$VtS?&O2)QAx21 zIQ9fOnw(@aYpEVxw%i$Q=AVG^^H_n75NBeDDTTWoWs`*z^Zo9Ia(LSpOQ2QlV!0E< zfB0v_uT?0UF^%DU-|vkD!UjOA&QGZRu?d|%tV*SgD#$wwhc_5R(^b*kKr8KCd(p9o z4r3?Q<#ESfjYIymJ&F=_DluC`%A}Uh#My5vrH1zXP%vn+UX`MFV`K?OKEF%kRXu`c z)_2ys=Dus^7qyt`PnDPH0i{cSafM#qu1b)=R~Y80 zwuWEB-z5yjdgsxp&JHd#3Zj}8QD!x=4(rNeZ)%oGi8czjW<1|ML1a2q&Q9F9w{hgY zJFl;iL(a#tJD#br>O(~6a==&JNX)%btU@v|7TL z(zEl6cu3una|p90N1VHt>!g){`Ntd%nb1?9VMhF6hAPmakvC~9xB=iJRIExOsSH496l=s{ZFiV&BTVxktWs{I1a_D1b)60$5*$gRlIhfx+ zTt>D*o2JsUL;WY{(rspP_2a|ir^U?b2JZ%~cAzACb0jKS-^S#oFYCVpbP0AHnxq6Q zcaL~wX8AUR&BhnlI|k-d!D$3t(gg=;W0i9Tu`RFXy?9*ezn_GPbvHAy;^H*_uNI(H z#FgOhR%T&yNpmWynKH!2I+PR64vk`tXl9c8XD<-hxTsKGBu9$#qiZfGY0(A^K)3C2$Eq#Fthc-o3`&o= z(I?15GA(W}OYiMs996~XZRqACLHyDPa`t3>Yi%BBVz@S=D(jd}cfZQI{uu)6g3&S^ z2R*xBVGKN1#6nwqgnyI9kl>jw^xF{2(CY>Fuhwao5uZe&4-!|&cEI^WQ`b$Vm?SH~0`BF~`aiD^Cv z3>W#xcsss#8@hOVPY!-jdVKyzZAebKFnRd8Tl*35WFmUxWl~K!@-GU%Z8PSxtNp_4 z_c7xd!82?&OMVaULh77TqF|Kp=txSyZ zk2p7%)PFAK5&|w@!-yV#qf~|0Tl>8x)xqZgtGvr6<6&rfwJWKd!j_aGM$7hxpXFv5 zlolxQ$%2E(Tp4%7`iwh&lrv-luys$2G*7XoCp~b~*|4=ovKn2EVc^4ca;U8iP9G@ro@BZurmt;gowVK*CKmf7aDpumIVa6) zZV)QH=_O%8)K>B{7_-+XCwu#aYXLWgs=g)t0lk=02yu%@A2Z{gMWK1p1W&fsP@$s>-1!@zm*hH<9vf?lNl8yM0wYXaDU%ORT11tRgA| zhiU!?_lvzgxz@P$vN3>M5)bCrR{{g*6s8s=`w}Pzf!@`4uZ1BNI1+oZ9}WAh{?f-2 z6}dQdYEq7Mmr^t>&)y5=PBsYWZ+~I!Y)&5+N7k(F&EtVn5vq>9J$p)iZ^TNuJ$*0z zSnlhN04ncj>&dXuLM(}Sw&wQmS&*Q?mb6TAY-{?Ii9%6W9E42VHTJ_;*Uq}Vt3)9a ze9xe`s_lJaQdscDz_dnicWX$>KHIC9K&P-zc<7I!Vp0BSFmikh#DJtt|G*%-I(u^I z*u1XXdS~!@L4bnY=N05VnA0+LD4W@de`(~{D zgBjZHyjLV4N1zN?N6J#(O7qF`&;2Meui`1uh#_$N?U#t>RN^o&luUafuIa*QA04c=fx_S>oJ$vT_4V% z&sPpL`UriEIFJ8E-lj&jHYP5`YL>b|E)?q;L=Rzco(@ z(Ubu(i<+nuSpH_403Loj1B;_cM~rZ>K8!k7!^1HdTt(9}@HzPLPOx?ZFu2 z7B%B=36Vc=SqmF`nFvtzEE>$t$${+f?;%=Ywbz?*SyCygP4=!gjl(6LQ%;`_U#hRH zWbB1__H&G?tcbqB8^cVlrTRUdsgVhIPM+?XI*^h`bk?07EisS@L$)!K{#xIsD62Hz zIOmjisY|mj|9$fpoI$D5g5w@F%AJ}N*ac2rav)ODoF4ant^eMFRg~09uHM%)zuot@ zT;r;IJ(hMJ;oVB%kBG%59k`%^3ahH(U(Hrn>PITN`Qk7#Ik44hZfws729n6qMIvW^Yge?$34A6??H_AP*5Chm7nT zYev%vB%Qa#uz0;@qq@Zl4(GTR|#(QkG;b*uK9mK-(nI`O-o$3gnDR9 zjbQ>$@P~XSv}D(q!?x^5^b)lW9sizLYodlJH=DwwJFBZ~f!b;qK#^jx0?1^SrbL~H z@nYhZlDYlkowC?JM>#hGax##rn1mcBK+u0L4W z{NZ;O=2{5WYBl0_6VtQr*ZX|>(wBv=ZSm&@6H{5Ym0Sp0wGfkbYH(1+bLXgRbf5Fkpk2drEl0Sqnx;F-so)uY+kQDQiL5!j-n_kQAAITC z=xqHKQzROCTCJF&DUTC@iBwi#F7u~Exu8hRK_@wmiNvQy0?m>HItOWQ1;$)zL^jVx zM0Zc>%Zs(MU5aX7MDqQCtDDYpue=}qg@rle4Ze70X@dO1D1CXRHrTv^`kT!bfL=C{ zms<4z&b;EyoYQacsB-QroScR!|Ar~D?~O_c74eUjPx(`~b`idbHt4M~>_;zX47FLMEw%#n{>~9n*6w7JsI7_zx{} zUy~tvdMCG*9b*=YbVLK`WhRg7Gsuv>f7&a}Jv)mcekShzZ&nKdOLa2j7% zq*voO{XK)1Amq|B`oZ1ydPz*zSW7Nn0;>t0%b!FwQ#}5$JuWvz@}%e~4A%7IY1+{C z6D)SJESVK0O9l#Gf1%1=5^QpGfJ*ibGebJDH8wq*W{U&IT2~X-y*Uc~czZ`weZxKv z^^dyN5V`f<90xuwDP}d2#X8ww7d(o{uLQ-iwt7OG?xO%kEw9!97 zj2UV{(5eANbAMxEVqYDn=N_=g+IvP`m;YxE2;VR)ARWsiUZ z!$kwBAIYxKL-M9jO^JRt0mDG@T9z?GD~Jivn%a_8=2C=-oxN!i{>`e7kYr(ICbgQKAIpbaq? z?@Xs&^j#3?^VRvj&703l{^9lu|NHS1;m0MUpX3U>Y(z!L`U8&-))W8e8Opl8jYkY= z#Umlx%%i?%jy;QP zG$+L17wJpydqf%Bm2m&q5E8EZ&V0iSVXd}4{;_1`WTm*iQVmpDKaNS0JAG^#Kso^I z*JESXo6yMpUXuu%+H|jX7AYt8onhlkz?s=`eqL3wsV?n8pKhPBa((WBMuP66*Qf@a*AkiYfDfS#~<{^M@(+5YdCB4pXRWc~_SwQiX`j6QRgUL74h zrb{d3-t4V%C@RfZ<0HJ@w0;bG*WKr?D(A?MZ&k3toWrk0`Q#s?%CK1)G7v^dOTcBA>sz z*z6#0rArv*tehk@9l4%KOc|TL@~6A9m~fu2eOa%G>}nC zz;RH`NY4_%*hS);qhJ52kdqroUwV4?#sZJC2KmF1AbV99OoFr7j7@uV6m*Sr*O%}w zZDf@GKLPf0CD0t=O=73?3faxY2MJt6l^PXr+&4b*+}UAwvq9Ee(Hq0bBfQItTVv0c zR+j=0!v@5{6{HEcRFP^t<44E9s2`^4GZA8WIM;aR?@ao^(i!rU3E=N@G1#+Ua@3#V z-I7!>Q1V!4t6j2vKm2$le+Ae2Np+dBH4@CZGBfW`Q7(Ov^DKv9C0d_W8J2j{M7RF5*tk>NZgwitzhM27N5IEM#X1Jn5 z)~v#CdAN?=oj&NTtgxBXF~yq>kqIJmV+s@DEi0^uTppZS0VVC!q z%|?vsvI05VMu$Rk!oZO>B(y8n5Av=Edk(CwO3JrdGo3ENDUta|A_jas8+{Nry4{mf z%%fkO{cj!9NF_#yH-4q&ubyy9p)DOg>4;5AQX>=e7>C^A9^hv#W_RCPmXG0`?az6l zNS2nRujjX0yV)!u8mBoew>lLn1ruLaIjX}|0VI5`WqHa|Lb@Z#I&>BHPMxp{hyfJP zNP%phx7@2-XsO0Zm$5kkK~_=o9KUO?9b(YY&jjc#*7Ad>0kfk37(m>J>w9wGHX$@! zHG)#Zgg}f~JYp;^7HoNk1$LP=u4=e-AF>2C(E9R3-EGyKpr*abQ4>psYEDLWmxoKL zq+tVBCc9KlFuql7%YZPmr2It+3;2RM8!89Qa%9<|=K*oHcE!-V6h*>T+((oq?v26O z@aZPjuCKIA9TlFe;K(G;mAWOHnX7FMs<^5U zpH>&hXXbPlN9b{zOi=_b=+@D#-ptooY=N7t*--BL&tG9jiZxMxv)~3QX-vf*`Ji&L z`{D#II=u*e&v@OJow*KQ!_tGuZ4I*@AaxZE^RW6Bo&%JFo;Ig>n4@( zxrqDZkq`4Uuwu*!L7AF@asxSIt!>X%wsO)9}LtJPNvJypH-eY z>=zITQtXExo{#vtiu}wsC}bL@oN?z@=A8J@)485>-`O5V%Ig~S}EWGdj`9PMbg$F@|7q4JU z?VqG9IYK)V{6C+-wZ7RK4Gy9W*%SRk#_{E^2RO5lTAz<$}xvh~eB4@PcLMTQM54iCk}S)sNnJLheNT1N*b z7S-Pjx{>w#_{!3PVN|)J^VmJASM>!o&uSqLaH~mZNDMDKw>vT?yx;ij0|vbGmfORq zc3r8fgi3NREDxQVR>Zv;#0n6#OsyB43jNNI^4Th0leYEV+I?m&DY~sW>%^ldZgMMd z?XVCGl*)uRw*VBgEhU#xuWJ+8T1CfzCZh+6TtU1iGFX72SoPo;HbH5PQ^etmutjY} zmu{4Lo=Vt$IAQK!vF)?htmg15B2EtpsU%B zeCQcPU++~(l{X&e#?QZM4zex}w$Jx(h2IipJ|4YN4=ow*56l>1HA z5L!)rvE=S5-ex9s&6{;e9GgKR|Ld+3A2C%ERu{ffZ&-!XkP!>UZH0$nx~fW}AL|_C4J4lHzFz5l~UJn;`U(J`f+nR)0VrP zfXaDWO*5FY=t*iXITUJ2?$2G~KMAB+&~-W8hPob@yJmy9VIe|mESfq)7LWHcHi#5- zXF*BG=OxsDzdfUO?!T+u?Z#&`21@2~U2Ihyaa{)RmJH?6hgS4Y=4hUDGD(+`hB z!XK9err$i97YeBr;|zy&1z7IfRDeV#;JO#Uyg?3veK^oAfvB}`w2Nlk-j2>K13Nx z5#R`be7DysOU2<$HTh*vGsihqEfkro@zGkJnN$d+_=`qUL_}(Gy4@jCEwYx!#uFt^ zBCD$-nDl?l8QcK(zE#At9wb>*`d>y;-wdd8|Y zQ!B62_M_#eJL`S!iaR~3(LoXk<9{g=RhJimXJQ%;Wg}o)G4jIruG6a?r3a}y{Ru2j zT=%^lpB-vWZ2Q>`QN5^nV26yYys5Pv4s~qwFi})9*3FWNG+T}`ecfrowhH#;#?CeO zjVH;3W?vqz+(<88aE!sxOWW1#^Z|gWssr7cxapRJl+?6ZvJ%>2UAF#!RNk|9|Cx#G z0=17^yv7K3@q#b#2gk+o_pTZX@|vx!qpxF&S)csVSd4BuKOQj@W8+NNo|6Upyp;L! zDkV>J>wgeU*s;aA;nUP%skOGF#wLrklflfr6OzOD>#W1fa-$)5x%?+k6XcIllp5=S z;JY_xLkvPskA>;wfgOUT%Jo2vBE|C&&CvxY&~VgyrZMnjpO^m2T9Ep)t$>}Kc0EQ4 zJ#f774ey_<5SWM51=a{@r%vZn(;a~RJueJ*WkIIEyM_qS9Fda;ri8l04a1biToK`g zCGPviRy9c(svB9*SzRkrhymf^R4q3KfBh=AWWw!$L99Q(v=AGrV{(|d6$g@$#9dHP z+F)bqp$V>!aNBBeu@kfhb^k&6l6Yw0$j9ho`8V!cZi0&NuxVra3`AuVM=mV+`xCM~ zC*;&PG>G@(Vx#+~Q;xmx3yK&|w!C2gO0w+^3U&;$(up1OKkE zm=Sv)r+VklNVk2e_;5P7APuhMt_I|B{dwf{a8XY%rcC8$Rw@!Gtg0FMhgRXAXOGl> zN|rv;XF#pdwH09&?i7IdEDdonC@Hv^eKxd{4@lQWAJZ!_)q$cKbc!xRy$ zno%~p-)gmmis>}OI@pK@vHc#6R3MO~lVshaB{Ji)3Jgr&VHTq)#_bYp5t~*LR;pUtGLrcYHEST@)V90gVAPY;W1)b)ni1QE=(Cd z>T~*;K?M_L%Yg4pn(cy+;C8d*48ljOZPf1tRGiL+LC!%)5r)n5lLLB9>7Uy*Flq10 zo8QgNqKgHvxfaIzre`7LLcn0-$015a3F$f-O{b(Z@f1*UxpuB$Xu>i|+qT^W;>qM9 zAtT-82*1f$mj3d0O?Z1cJ7_*(fC`zF@GO3^TP`?MZu;l(g#IDdU?Pl+DtY9E(JBQM zn;5_{Sp){xpZkozsu&|xR#}`$IRJ4H*(-`^%pdqett#I2-HEhV;A@3{=if_brb+@J z*NO^W)p$@Majvm$HNK^E-8V|C!Ha|sbu77k7p~|J^I*VFw{K#pe;vxQ4ogf~Jq&z! z*ky{}1$>nG(G)+n@t~4>Cho`K9m`|+TSOPQXwp8Iy1Rr2V{|X-DRyTnF7`U43n3_x z!R-k6S-g9yLl+U*U)>cwxXCN{5kjdm54gho}K{E&0~O?4Z#cJ6&Kh z+5FP}GJO~~F^+gfbA+R;ZE}nFN~0zK&z5>W3A(5gwg6^SVI#9vDhBAPegNVEiIi`J7Ju#hWOP%p(zy+@<<+aDtBuV{3}t1uO{ z8Oc194nAo=lwIH#zV1cq zaERNAUkd2*q6VbZ8e#{Ic!Y)LHCu3J#!$>FZf3t;S)Xn8!VR1nOBf3G-M)`uIFY`! zEgwKe3Aq>gW;5g(_uIOx7JmPa2i(W6Vqsoc*E4pl%BPphPsk5dNF*}jR0wM3V>0BJ zHvk2))tqAX>XhCnm_#2eRey?}>*DcN*aC-(T#|&1NS~cgS+868W5XGuCh&rgFJg{T zCl%OP>DS?5ll*1puOY)?dfHyc$WcFMF8o*<`Ls*JANTpCI#@LnV5<4$N< zZd@T(pTIN^m&>lW0$BM{!5$nTy$)Yk5*q{-)LPS({;aU3yj4&@uW0P!U?eSFi<# zL9c8@^%|@>GE=?Fdh&K8V7~D$kvqoU8nMe0oYA9OTAiBZmEoI4qmLij z>pKP*ForO3J+B{po-k;EmLWC zQu-mXEk!s}yhyw{K2Q=j1Pc2~$oPfJ3!6&*gs$eRLII^G{Yjy6v~8;x!s znViZGhH5SdoqZ-Uhnuqaccp03QU?JtwwSyhenF*fG@mM9PO==0y{KM|G7k(DSu!U* z^sO#Xwjz`&@_gM+f|8agckJ+5;TlSwL-4hhZk$nrZ54^9VhUdpY{dJp=LtbxX`)f% zoqHk@^xjiu0Cg5ulWP#S4V+M}&Dm42l+?lzL+DXqpT$W>%&mkodlwzU{hTufwk@*9 z<#A_hkKS&ld9ZZNU?;5TAm%ad!eWT4Z%_l%_zGfdbiZy?Gn&1r^%`ACr7dI3Qo4Sa zy!m~mppwf6EX}~Gzw}j}YDJhGfSuq%Ozuw>jE5M%UETY%x{e4U!WY1&NEm zaQJ7Cmqb=5`W%bTVgys4s=7YhA+zvz9kLahJCjC_l5Ri!k1R1=HIQ~BJp?O2j&<*^ z2x&i_&yLmJpVNe0?w;`)b-ooQxnux1g+{!SpZV14my-YVu7-|zS|bMjjCE)x;h(R6 z)7EJqEl`HQW=>mP5CxZl4ENsk7~$=OR7^aRKdihAg+(2COAcF7uIsyY zK$&;taD1s7*|+-VUuVg;ar3-vTkVAs4NT;#S%L;{OY+G$-)BU}2HyNo^Xv$=x=@-f3(=E;+)q`&B|MsH@q zj)w1F>|0FOg$i3g5zu4)n7EE4Z43B*GDS=5M|?On9nJMY)JzNym4QJ!xU!5{D$wxB zc(Fo2VVy)`)r^Z3sPa?ix?&o{PyEwv`nJRA}5yHEFexVY^{AosSs0>6(fzQ%0+ zAGDXA-``b|R_g2T4rxdQr-0{8a<9*uf9Xt)i?drO?7xdJVbd1Ke=5LBW#Z#I{4^I8 zvkNSS2)zpJGs@I0&DFK6PnXPhLak|kGHi0>blT^6 zahXV+VA*rK&kLR&N?X+{C;>fj6hNt;MYunw|LH3o>T?P_=M2-MLffLDtrA4|TFMpc z%Fq*8%AKkjgNkVADqD;4#S8DQ3~4_Vd)Er+W@;~3VB5PAN>mJPe8rtW;u&8Sxi=Pv z|0KKOAY*37$v6DxQDtleIILRyR~;U$K)ORo093q&5@bROQ{WnmPvs8h+Z4$fDn@-- z4P!N|Tzwh2uhIg zF4Gno&hZOJCpjqVepd+o(qcWlT^3P(5*<0D+8hfc(70!mw^mFh0)=A=P%;1NVmlc< z;#u}!%J1nZS)O^!82iM{Z88GiI;)LhSJL28b7%tUx2u;{{Dv*D>#4L{UAM%VJN1j@ zpvgXJse>_6zJEz^lf~m9DonU3poIg<54GJl{+#dbU+2X7hff=XKH++)`y?P7duK3m z`EkWhChQA^Sj{CVtcE=rVz62C1hAL;E#f<^vb~A0#9-8?lq#B=Nn(pVL`AQQayu0G z)_v53sFLgD;Xb;#8OYy?5qVC4fATfEMGD=9+C87%T{S2PI^(zLXlS9@y8x!v2grVv zrnJv)UH*aiZpCc3m{>$h(eueeCgiIKy~==p+ez8^O2S{~1S`-92}pfSmDe*OdYG}d zHeaVumM@SXNjg2*5w79p;ck4*2#%5cY)@7Rw z-fJ#NElcs|Jh-`T@B5h?wmO=fURzUT7cxqQvB^RHn+fLe#=Fqps;$lccC%$2H>hJ|xlrk8UPv3f z`}NI#5L#an1oZWB7Q6IZTaCsLeu1N!V~tQAc6ofoa!79F4n3c-fCyUtkOvh2=0JZ` zg2g=DbMq4CiR?`z5-Uz<@UD_$izfnq-rUVYIeDo_9I+cDvnT^uGlz&|4Yukr9(xK; zhcT8P0JuKA!~Ahc{-=W7{{0IC`Sz%hX7a^&?nz=i5(FN{(8b|<$`b(k70O_O?jlb5 zfKUoHD!F4iNy=j^o(i=!H2(#Q%k?KojB~|9yzxK7_J2 zD>9Gq&x}sFo;x+0RKRO0$om$Z)FB|bx!1@FRfH;FdiU$MdK3}`_!Pyvm8y+v^Cw$i z%`M`#B(*jx5r1RT6sr29=ms~_c~#6zc@LIc-P$aXpae0Vsj{-gnx;~GdPOX3DykSO z?+(2O!E^mr%WQ5_WM+*Xqm{lm>Q8d{b;DFJ%<>ef%Z(RHKqJ5Cfg8%aAPCt!?#*q< zox8woAFv3*TDHz~yXhHU)amPNzj>SKN59fnYS%#_(Q=vo>EbB3kKy+y2r=z`UBdr% z|M`}4M#XXg*h5)U6W1?=Mk2p&m()A)+{hM?Vv_uRuE2g2cr8QYGe}{Z9*%icDfaSQ)Gh0F#DK z0S!`gro!E>He{TeFO{T(tAAKegt_ z;bySg@yMJK4&3nM6_M%_II1&0AUnYUD?og!tT*v{?+J#=+k@4oK=u3liih03(2nn) zI8}y1EBj;B!JXXxsvU}9gXk^aeFAS3HCjwy#O3}BJDnEB*ol}moUdTrH8@4|xvaIE z?`maa8}c9W2=Y^Jnd=f?{Ot~U@OAy@jgb)~NSVY(Y1$wQpb>J!njU`387Lgi1!w52JJ;(&s-e@gZJ!?eK7J6G_QFZ5LFfGU2JyE?HhhxNlDBbJUl#Pd zInxP{2DH6g&p0_udD@%$gT;i%w5n%PjeO%SWmtShO@ z7PY8qWG6b-cMqq4@H#_gH3P!$8@0+lB21)>zxn|qn^eX=gLX9q(70h1pQy}CX~oE? zI90{ph(hvIGdlCcf~DoOW{(?mW#+=FH4mKsL}}{O$BcZ{HI=VgFN%o;{fHhua9XAh z=uM7Q3_0ottTG~(jp8_eS@^3y95^qlGap2*H;R)|o7MD#?;f!UGvEI+qUfwBCi%kc zG3J8`bd$e|SRM2sT->&Lbo})m+f1{oSPum^?%iZ^12pRrP~$o{@q~j;Jbt|k{K%z^ zyePEjhDEdlid#Y=tJYy+(XLLt>$W_H8Rpbp#|_#_r#lF3VS~i@5nCvTuXE-F|FR$N zIx!2cG$T38LEQ#mb|IMT<%`Ygj*_KQ0$d4@F`}@ODW{dp#XoPi)f=<@t&98~U9xUI zsAnC6)z9%q{NyDT>>0C!CK`YYZK{VkxcY?jy!gGmH8n1~5CR)q?1j|^-Mx>2!VA_2 z2ZVcGFOy6gtn7&%pe<(ONUQ}1|9$vn0K0DmpK^DB%!x>&aZ^;F2;5kUYZy6g~ z=6jK!WqI0rb8Itf7~BV}S>mTO?iMpOcfACgdf`)dNH&%p!V3v0#+>|Vjp-ujYzE&y zS>2czQ#Nva9+rys1sUF59bcUaimut3B!qLtJYM5>)s_wWZzQCaV`zVQcxPDScuvi7 z3_{L7m_Ym7g{*yFd|PS^mtx|>78{LDBeceJqs8^a?KP->@MZCZ1vaBe>l(epx#kld z45Of5GVJ5u*6zl-d&?Q*z?=~p+jpKCM<7QPhtT_DQuRwu z%>Nxt{Ouk8d$Gjib~R7_%lzB@Zz{P;Y)QNS;pD)CTWe5!s_8yG?&Q+cTk@4MS7~Th zo5s4B)-4&k2FmE>H|PB>42)~`h~GO;X)Z^NH*-`LPvIr^sEZK$r&iF|W-cGVBNSVd z!G{e4n>$~$KNGSEa+3EB_2b2sMMgy}OZSXN%#a}VrdXU|vw{w!D#=HD#OxdK@d@M= z<8EOXY8GgKPK_xVL(@2()yeN=gei}OES0dR2^vqE0>Xmk&HoQuZxz+%8m*1u8rd1*)TE*ms6p&b0Te-OO1|xzyLg!OSe4AOAL>uK~miJIL@g* zU*{J5my0y2s5iOj9|K8e4Oab0XGscgs%znOn>ZnmWE|edV7t9YQvUnm6hT_|@vp9( zg`5@~WcHw2_^g(YkAsDPoC=XRK>f_UR)kVkvRI6g4)XZbmGp9}6BS34!lTFqe51vH zwYz&N*ehQ9KN)4P_@3*&+79zH=uO=3e2c1cEx>e&)XV1qO#oK0q@y#yKcz8u?0PT>5V-OASYj^xi5Yfy19W$wWe!_;|c^STSNT500;PEc`L7=)YO>}|VR;4byM^G4+ z9iS895N^+(_`B5Ud&XEp3L_etPlEIUD_~wZ^RP6Ks-6HB8b4pB#Vc=E-}8K;d<{~Ml_Mj?B7)^UxCxlnH}AEO;4B+DZjuiUF4#}k6W9FG`CS9FOVhYuIh zIabAsj9Ml;flKE_-&Iqgrw-umLxAvdz)4(UkkT7`rUC zG_g!o#iz@=CUAXPKLocsk|8*f>Ch&(j91W>hnBe+z-ayC^`)6b$N6;3+laf+rJAgd z^t)6SL2%xt)v$)Uy(}E<>idK%3E;dKX#t;7t&oiDpbgS+O_*#`nLOl}Y=CA1;Bf5G zn{yT#Ce}F?H*(fecJ*I7vs`#)_&?E2Yi4I=XW{Az7nMOPmdN1E`TotE#6cqG+i;-o zkhQqN5ivuVH^So>?b~N9NtA*P*UTGp{g+rVHRX_(khr*}oc20>XJBOi1@!5|?iNT% zsNPYCP?S`iw7N(LFqSnO&2dvuSQB)iFuuY4ItC%XIe!=57NoK!-RfE7M#j8N0gXZXJw=}0|hl# zcZ%(L3~68%hc34bUVd0$-6Rt{S55fBzkA=X@om>A?Cks-9uNAX0Usy5aq?L+7+s97 z3mb!$7c1Lf8`Fih)v3DTx z9@}}UB|5J6g7F#zw*OyDue;&DNd~>+{!ixI_n*v}>iS{LJ4HhSRUC+oSnsM@4%TlT zQ{CQsraTCg<(=Ypv=q;^Qme0ZgDcfy{lO|{Y=)=gjJ{sdUO$Mp+)p4H2~D2CaI_iF zZB;a5Xh^u$M>`CpcL7ogU_!%oT{`FZ77j*R4$zQ|e zxM+&zwf;hO^pZY#q58?v&Cmad!G3{x-_^@d(GR$oS0*Z7S&vDB z(Z<%JjiQdM_uZcVgLGl0n#y>Tt~1Tx52VXzDb7BimS-BBYfose5I*o)qcgow!OHVS zz=5VCMj97j=J_-LD{JwI!GKyweIApUUlC~WLU zvF?cSyMFaHWbW}%h^Vp>>VTZ(oV^T*j;~$*Ug3&k=j0Gm;p9|To5}Ee19-}`PzZi$v;KVbRfUG>^M1XV>2o^7gct?nC!JWk zRNfR@f0yFa&LdA866Uc)w(-d=UNB6I9{kid%!|Q+aw|3#BpstjBm4VI6y!&~wzpqQ zcp_kxa--PHfWU)I05y1_r467I9Y9cymk-U zJKd*07MSdaXQ`B#KRgju(3wQv?r_o$yeW8neLb8|z|g@D3JS_24-;q=KQVD7JNehJ zdg29T_h))cxC_~}C77#E<*}0k9_ zsu8m!(&r7Ac}}SohFU3pU>GKoNgutmB{!?^nFw{2U5`JOO|x9qF8 zrAF5m5S>)Bhj~zQx#YOv!s*(|O~1j(=UQF7@H^<3dz~=-BVeAJrR{0hW-h4fz}9 z`p3&CtUtLk)<3l(6uCpTpo8pWInXD$!fFG?>nN^NDBM3}*5Tv%_Q3SXszTk0XNZ-r z=g`f8MpqDo11eq!t-bGe?lv0e`(NP#WD+{)U?+dmt%?bYitg7UV+B0yqsA&Ibme8J z4-zNlUo84M_j)57SR-g(Toy--S>NW#BiDUJi2oBVx8#A$CrieXFPReGp6(LGqgEHI z8&%?p)xy(LU8laN?JBRbUsZOBT#lzm3kS!_o=t;cqz@9!Sxwz7UD@^LIBa5X98LMC~7EPId)!x}RD3jtrfNoo|60DtLvL z6*G2h%*wF2jEjHTpd9W*6krcl6T9v$rM0M5_Cpi7cu9sDUrvKPZ$o}%VW|Q3hpCprQ1J{OoL&i7M33bAJzfc_csiZAV(0_-R=$3anN8c}6Cy5Avq3GkTlRI-igWzQ@2Ess zFjll7)FMuYP;BCxS2jxE46TDAw#k{Xhk6`R_IarNGr?PA=}_e<1sJNS%SH5WsMxFv zI)Pf?{yWuu-t9Zk2z#Q_pp=lrCWWHFD+gLUv-D|0)8*Ll#IXBM1=!?gy>bq*gSK?c zJLg*)qCxlj&qpvt$&^QCtwz(I`mFhLD>e9OwB0-q_^(`1GLFUVkjq>k`;NqVn7F>_ z_^25z1cQI#m15vjO&CUU;biG$H$KD3BVlKr?v$Z_@u6|#_dV%y@A=?$i?wmLNG%g6 zkpC>^Z-+5X){XQ}VtmPw~+RInpGJhp$B5v<`daejFXOJ#Nt7z{?mx%QBZvgOsFw)k6=rAS@@f z{ljNVb`N~G&sI}I`>Re4#Xl^;9d?2L!0Cj=zZa%q8`nx+1?-2*WHP#p!!Y zMY5JcvRXQiF_R&%$IGxQ)z_S>hcsV^3W&w*fGBb-wB^H(ck^S){(XR zcLr=)67-_UJ_b&${^C6|?VnwUP6pimbyw$pj(Ie|hZiR;jk>A^+KZ<;F&doco!S^$ zmc?Hx(t|HL!^dL>N4+LbN=tDAY- zRKB|W3;%XqIVU6`Qrb+Il$;_WL~vz0ThXz=AMpAF^^n~)I{K_+;xa3xM7BOd9%;+r z-o*2yt@}*y^7my88%54H=TRu>g&x(YwIf(Y%_q5RGMDBJjR;1%q0*5 zz>UtaP2ay&E>oTc(=_os)Oe>VMzdRY{b zPwCJv>sOuC)z$rP_o4Fg;9rR&BRN6Bt^%TDz21tE2;KI{2&wlJgt2m(Q(xs=ED?gM z3U91kl`SfL5+oNG0|$xmEKX3lNX0U&dq-hNWy-GnqEfZp7V$+#>jz6^^^`sD=~W)v zd{zAf*lZ4(XWWqx1?1WFluZ))ad0BB{11-I67-LQdfcF!&LYI@>DS&9$*jn1-iTj8 zYk%e6$n4lks5E!ccx31omovcc-oeqP+nYfU+*;={lv=3i;up7lYI04k6_Hl__IqIvkfE^+T zxzK$1-2svR!yZilu6>biIXnut@-*oetWX&BBj(xIV_`TddU@#?`2VK`C^uF4tfXG5 zP?SG2KlU5KiE1CCgJEs`saucp*8C7LGBz`jp%W9cWcZ@U8`GJsV@(DK9!U*NXzze2 z$%$zg;wRkT{0IDU&^9QZ8vGg(AMP zSbQBB2S)vkJ}hNqI#l*K2mqEdUDa=fWL{Fq7jvHLSj1int)5t^=Z5ivMhrI1Ir*$) z+gAbNg>sjFe7mUQ*nW2m5v%H~*y(8sS0t5kXLO)8aVb=1Y%Oa- zlI?=Ayecwy2=u5mG$zb-=uoQf31PJ`hG&*^Wy$;Q7SV zj}exE?~8(vs|koHzhdE}LyoeX@ssv0?ymW9h%N34$A317OG z>=vhNiM z%*rf_b*@eNHmbe-YRYoiuohDlhLY9#Yd0Sq4CY>E9v5S051iS9x*~whsY0uGN-n{zbL+RjSX+t?&Qk^dNNZ34a{aTfZuSqSru;(16W zJc{Se**lg)cZicY?iLs)EyfBY94!`K+oT7RMtz3lVm>5i05URi`CMsLb$+jd7ax(9 z``76v~s?ggtSpE)gN-u~N7p}7nY?(?wc4IomUW}>lRYX%AFy%a2M|6~n=cw|6Dj|DD6{0`wO=ZLq!eXx~I(;}ei1ZM+w`! z?mOA*ujX`zdm|i%qH2 zRpye%uGSJ1z8`5ogYaejb+>e~rJ9^9Dz~M2E8MpGM<1^v7jL}JLH+q9Y381Rfx}xr zAfRJXGO8QKSN{J~U}gR{>F5GdQV4cdiyI=XFN9tAwioawWsW!3x{; z*yT|5c4)Fy@;wc^m$Q8J3AH?d6kAUXk0t3~8b6Y&3xO*Tw7OBoT(0%>`j$7+ZMr30D-?;<VYXu+B7Jzlj zR4%eqvkziUS9$Ewzal3qV%{Rnj`&VWiP4#;oQRwy_B~0wJQ}+M@{K#jcl&QJ@=$3m z;XLMf%b1J!2OPy8fr=7!!4@p;4Vk?`biT;`4W&?m&!ZJ)ZW&nX z>;C%NJCv`n8ftde(ywI*d)d1X5)MpmU*p!0*~aLl+mPfUmIka$R;loGB%1dJj}E*| zOW2%ZlelN7JGcF7)eyJu>)m-57b!h?8mPtUrs(EijV|#cv6)C0R=V24OuvqpnCCG{ zxBrtZom;iokR_ysM~=b(=g2G0O2u_Dn0;7nE9TeqXl;Cieb(cXSM9xAw2C=?DH|fZ zVpwxFdDe5J*r@!^^=ra9RM( zlmon9S6AT3j$)F&ZJ_CmNtU=xx4|xE!ymGaJQBKYzwiLT(MfSJ1xxQA;WXWa$2(j( z;1%r1rH?yPAU-y^Io4aUL4PV0%(EXE=Z#wpe?4Sxzr}>TRaz|YyS7Oz;-)9)0*FL4 z3dIht79HkUx{ojU74P{QParGC=b&ypii&5-Qa+~fMralgNvHcZl;1V8fI3Qw{|}gf zG7zsQJYN)`g)RTZ2c;H>f-moI%sNxZ?3ra^m?AAWQ9*KtQ3{Au5t?wKc2s=f1#tG) z4kSn{dbG)2Pr~JDfwB`oolQG6Hy=|z^TXMeZZ&P)ib6BEJZlrCLRYuZhjGIUxRbrN zh@l`33EW=N*>BH4a|27&4C%~du_0~vN`N|bg~bOPRTff3X#_cavb#lI=0?iBV zx#8p#z~YKXsKvKJWVVkzWdRwo*1Q&%yt2wXd@DrttXbDH{Ii zSU=XIZeg(ffzNgdqHUhr7bq3UDEn}(bLkh<(a zvxjDEFv-Zlw`>%ERYOkaZevd$pPz|+Vs2YKqi-N_wMF37pGozW|3~Ki_!8~T6t?Ye zRv&a?Kl`}+J&MYBm;4<(7xr(mG&XwYn^6@1MW7^P-q>f-J3;gxW@=GP?!nTzr3IJ8D-Lo zd_I6kga@&8F9mj<+Y3yRq%gQ~0i!Vwc&D>&&j43~h1xsn< zs#!9&{Hpn!Cqt4^{E%;9$ai2cQ-9T%WMyR?9e}DXJz{Mjx89c{uyCrdOVqN;k~nz^ z+BsDy751K2L%w*;%HR~!@h9VJ@HM^6WqVF1SHR3cYUDqv4XK~(XqmQB|Mb?w8Pf4) ztx2>83d`I*!f?jnxv`>ZVMY;Vn;%ia6`e756rVW5u(7(4ga9;wlo$axlRh!M-W*>P zK%Z-C&~A?Kr@>IRWA?rpDDSYz%8aK6U(IQ%Vc$wZDc&0!cCQgeWFZ=gP`~x+2G@9v zJqcs$8R`==@H7w>-{GmUN;9|0VChozat#>^hTquuke8QN)bOcJAH6rQFRHQs4GD4~ zVTkq6AlCq)2#p~DsR~bTmKqlqOu9r_5qkyg@D(SnQ=&U+rtFsom(jHV zLX;p(vA|0hHww?rSx*O5Q`*K8OJR5$jP;eGGg4xSjS2SrgL~d%Rib-wuOJE%qFJ9D zwMy$X;d|zcAo1>yl-aqtUYfCw$)Yc4<1L2##9xZrWOL>Of?ruwN3`7+WM|mauA!al zJA0j1M@Ojr&u=2+RFvI)snD^z4asE35Qv{PA$Q?vPL!oKk& zdNmf}umnf%JG)p~20v*y>ye*CAA+fW&~3|r!HHH4$$4Q)t6l9>?=tZn(u24I7hoVm)X8nnepgzexPhPQe5cevc# zk1%d?`(1_K$oA&Z4EfMsmbYJU$C)Y{F6tu`0>IpZN!wpe%-i(4I@`Z2?%A+?MOQs0 zeRkj8xvS0ov$?6P|BZS2uD{fM<%cIwOP&O5KZ%moVD#s?%83;Ersu`rYlH=5nEPbV!QEGAsi=`4+-#gN!Bg zZ^4=y*|YFO=Hu%JLa%eF;WYWce>s3v8U?hEG0bu{8_D%BAxpwN#Ygvcwo&UNVM}ug>hN4l|QcesC*l!r>xoep|c5+cYgi+T3Q6p{~tKSBwUG zeTf>8adC06)Ygy|*3-KKoN0*@b(_O`05gIg_=z#jH0TODK;sT1#55bOS&(`NRsTCB zr-i7@YI~0QCuY8@=dAD8F_1yjPaT>zxZ##KE-WzWu{Q&=b3_mKKbRh_uVh5KIuU6l z@q*?Jb(R0-HVzCHzFbl5aK4YcCqjc4e9V50=*eB7;fo`y=j&kxW6NM`Y3&coxe9X( zjp4-`Uf8*c%^xuwFmqv5a?5L!d6aHA>cOBRC5oDYWqw_tepbhf1Wf`-F=v!nq{QT#9On4H~nXat8;BQ zI`(B7sV_`gN;{~P=sdxR2<~?G=s@6y{Yd@LRHoH~>N&K@Ors;Le%}*lUYbTl+ZpX= zCQ?-LTF`6E(Wj2q>Xckl5Uyw?UKlmOP5=QDrCyE_r9yS!T=^@Z7FG^)q$%;1gDrwle{`@5foRM0jcX9qfqu2bb7u!*?QoA_YVU~u3Pz6N7zaVo{P!o z|AIm1V%{Y{k`+f2P=rDWlY?Sd*Eb8k1QQnl(L3d3kyqG@(?~TVRX>vHuGrR!y2vI{ z#v&0E7%os#B9Ze$5Qj6=fRHrcI}5ayPu}=zWf~{9U5uqJcwvOE0<^Ei$g$@Al6vJ?)W4m6RfCs$QX9Oulr(VWKXjKVW zxPM(8pG|^srkKz}3g@9r=<0G^sRaL$c~e_?8iffdQZ|vF);uK|7hb%>6#=*cmk7p1j*W$7HZ~k6 zfSA?|Nl2Gru>??2fCH13crmz@Z?$%*z&aCmokOt~|FzuL_lJGlcxjOAxViBThP?U- z3W-NH;MYt7lv#YXln-+rEhR?aSl`9}+1ZX|xX=*!?()?fYm zG91i5;{LuX;Nc!b7WQ6Cb$N0THn_GnTCM`yI_olV#ytf;EjxQs$n*_|x`T3xCc{9Y zyuf}->HdQAIY;)b-t)**EO_Qa?|uUOR|%w|F>M0AO7 znt^o9keugnj4_qCGU=Pq^xHPmHy2(hoD6VzO8|vT6Gx#B>2_*eT#~N~vM7BVfKsuT z>hUT2h_U;JDg;u+5KiYGJ`&5&w1A8k)x_e{WZ2Q3F_Hr7zo??{XOv;WCjCurW=N;H zZsDZD_T#;{{JoW*n|Ps(cy6~?R{Zc3xmB1sSUgkd%bH8fOfm+vz4n*Ajw&PGfV5I# z#~wF%Hr4rs?BM7qBB&QMTKKvV7Te*9yul1if3`L!dac+=kR(Qch4E4mpZ(_zg}RH4 z_;Qx`)Kjpop6)O^Iy#DLH^k`!K5ozdx0x|tuy(#S-X-IprV@r0rXFy9Zn}Bm!%R(? z=MQbwNiY{;J?*BIL^c}uNsir{>eI1Aj;fIglbAQIg`kX97O>Vc6+rEOL4R+o+?%vd z-AAqB~r}AbjgefQkg^^(&3VP3*&gXOw5k1DG1&00ES~VO;OFo-1ga19egul zwpgV$|2Ozyx7hqTu%zfACJ?Rifx5oOLjnPRDn%+lX~8%yf&}HV(c^n#S^RXu(d(}b zwlPH>4c(+>-KCsH-3`@?X?uxg1Y+4MzhhTfPgLOqYL+EaM+*Qc-%!*v9HAQ?O98_e z65j#$9~-4BQxoHKd7Ntx@?po!7*^@-Cy)}4%Q=C4T|5CosQ%VA4kB2RZQFUz_W2?s1v>;yOm{9qU&TUC1i}&u-%nMRvOar5i#Elqc&e|!d&oJ<15s;r zW83c|eunK7go$?C8oppAfHAr=K@yCj)LdplKSj8r4ZfL$`OG%G3jYjWmD&+;V7*uqVaf`YmNW zUq@#rv;hGyc(!d4a8cT{5G#R{ZW0ikT?d(7@2ubW@S}l6eDN))+jRHt#O!6Q@I45+ z{~$@)&by=Eb4^X7$p$qoRrGE5W6d3-b_fV~{-K2G-i_I>b|3MAU+*+L--n{iP0Slj zFGQZ)`hpZl?0_5ebdo(tEW@Sw6sNrb$x$OCD5-`hmUAc)k!PWJLB_Tq1z6LcVhR2M zO3t(5c74Ik3&4@*=RlYodx3;4?t23f^)17MpA%SdRa7cU8^(;{iG_vnAo5G zBXf;=&p&5q-cOEyum0$?+!Z2g`TB)|_v6p>GsH4_TNd%^aOj_vJD$DMV%`r&UE)tJ ziDN-zN9Ru6B=wWOls91yxv6(4PFr*LJ9;7OOdd@OrZq`o8qxF|hD;IMOZou8=5;iE z((x_HaS#(mKK#y8iP|E}pEzWo1;^}qmjdoV)LX``KZz-lrZS_13Ool{)2DO^W#Ra zOH?jr?J}-JFoZ%qB}G#YZP^FO5Zz{7aI%UECHGLBlKyTM2RFnhGAj`b7k2ml!rmWz zYhm5fcjRF3$N*&De5-bi>REZn-+m&Yl;};(7x?jKOAN~X#)GZFzUJulDB)78#=QAg zQOo#@Cq8D#<@k)5@v%%=ER|nw+|pBK5I&OC&~Bgth{Ed?uks zW?XlA+n!)i)Dh1Be}n;EJ~YqR4%-cOXM>Y7KX|K350jt~KJ_kKMjUW*p{`t$Lw!}) z91R6#GoW$TY`)^I2?m8fw*3;E98@N+kykbS(bn<-E_FQc(h+8J;v%QkkH|@D%3p<% z`=Ha0a-^wpZm8wvx=C|Is(BW(h0tm_ja=8rnLBs3397Q|U~hxaX4DQd6O22uVMDg> zI_jF`Pp!uGURT3j+I!R zgF2Qr_QBS(4#Z+_r6dfSsQ5v`gL2M^O8z_u0hG(gW@R8`xGx6WUGN1IJb@HMCFc^{ zP+{)o7+42l>8)n}42rpkqNuSaa)Q`tm~L-du4G-B+ZWEobRzTP14e`)%5Md)1OUIzT6IQGp};74&GS@dTIUVY^b1H{R` zg^{>{Y9fOi3gnY}hDhHa`A2WjMHLo3O)ncng1<^mXux0WW!+l#UaNmg~oZl`&EW$@6TR-}h+Ztz5X8{s>|aHWd11kB>$%xsR;<;vBz_{)>UR}z`2W9t#hu^TLnaOZB<^wma)-s33 z&mgkL?B8NdQ!8!R@>+ZrS^b=do#AyoDK)ep>QX=i36w{`YKDGAlM23alhQ3o=n5Or z_G;?2J`xGhA0Zhfvc*-@6Obsk?)n`_{I7Q&Q31!%SLF|)@J>iWpR?+Ilu532)1(%G zeBJlT@9XQ7a>49y2_=y9IEhC~!vv7R*E2BsML3dEw-bl z#^VAcMo!snH)T-!Wdr@_q;Ti$wKj-mtKRPdy5I9m&7?!&C0nbDFBMK6p`j`HtL~R0 ziw=JR?nuYSnGVW|1?2sw1N=12n1|A*Z_%_KCzv@q0?EX{;EC53Nb)5s`DC|S(<|{UiJ~Dx3C^% zQ7?b-dK=5odvxDIWR-VtcE8!S%*a_AIk`+Y{GRFl& z{g@*O77dNwg8Y#%m%=-!*ky5*RsT;5AjSJ6ZPdEw_y?!1WtMs2O6Zq}Jf``d;j^J+ zRao_8UFB<~OG>5w>n%XDcpS;ozd(VNpWiZ_VKR8%q)lb}V9}98L?3pp5z_RUmJmzD zkPW=X>`?2#zIb7>Q5NEz{8&sUhUq5S;!D{-!aSRQ{+-8R%tTe}9!T2|o#5thfDDx_ zjR}}RZ+RiO0u9d2VybeUd%7L|juYYTZ?2)a8-v7AR0YAQQBh*pD9X=&L#FO@-qf=j ze?XnXNVM!2wP81U}S(b=bHRx2&0IXjd>7V+7ht_^^F8Ox+dVh4Q>wn1+<6Y9mO`+B$GYym!rncXOe-zZ z5f?2ukrEVGIkV0zYlNhK{m82F?!K1>(VD~?Zx@lF4$GGXxw5E>#}-u1YX)9Je1v^N zHhn^07`Jl2j~jG_05rb0;kX((TM0)&>BN`g4W zA)+B~9qfwDR`xRo*0gWL0z}H+7z$-E@Eafp}INw!x?73h#3qq-&hYABZ^_ zm1GMQC?B;Avz3Q?C&*OZ48N2kf(Jv4@%49XS`P*}RuC&SWShJ!YAi*oatJ>}12}Ap zXERU3ps$ z)Sd2^9=tFTUpB=jK9fyd?tzcPsN7^iwtn$!_7BXT?2mK|4GoDGNW8)xR5Deapk)SL zt7io;aMBOT&^dMf6w#O?e1L?#zW==qj(^|93d1tVC3BU*eq(2K|R zB3|fund^#&ILLZX-cTRej(Tc*0TV;w!J0DP^1h6Uz1)cnZ3eQTK#D)GtVH?&nmR2K!?N6nJgZt;C3f6S#9DQtr!J6E+91OPnKbl2Ai#yNUK0Uu8*pbfNRVgGfnw% zMGwPybF&8~6+sfsH9ZSwW%u@!96F?+o5!X71&l_hf4p9+@?Wh+j`VMPcGS1xcr*KA zSq+-2cx?JAziQB+J0SF~9utswBE_#Pg z1l*zA(diBj_Ftqc&FV{nD|fF>AG1wjJ{auLgd!?gu+$!xjNEBZnU5&uGu0#bWP%;O zoE#Q4q2PxFvK-DtxKs(VJiE$yVHt4>!p>hngr%#$O+<0hbDZ4-&xmr>91gZ!abSfZ zrP?s#Ze0VmD(1d}7UCCSd%}eu^x2x(EtDC~ue$V_=-ay>fAcRd6JFsh<)l?Wd+j37 zBkj_}$XeZbH&)^smtf|ESHDm}Z^RRl6tjt2943i3$z}SLiL)e-(`FS*f?R=gtlWUB zpm%68<~#3i>V~Ynn`eUbTp^Nsqie}EgJLpW?5pVK?rm%`hFzKY7;moiNa4tjcRwzR zu%td>-xXkd`}~<-nq|ICCS+u|XTUX7gw+P{wU%%!uh^B$Cx4^UNjSf_;iM^P%hG}j z95Xr2|NDPd@kx~bYE=g5nW_qND%b7Wv=1 ziuA9-Od^bD%ua)S(MQ(yNjF3|OgE?FX)=7XaL8)6%V-<5RAL{_?n}I;bA-eUU~PwO zrJP;EBlD8lSKy^BS`jY@%$pHBf=sz((S&=h+b27Mh|w*BD6N(=Z0~R_B&<#cEeu%i z%QLn{!VUv_g71?I=N~T6`KHX}8M^lWnqt-b*%yhG2u=+__E@?>xPF(?o1OjzL%`Oi zZ`Jb2&D+@7^K)oQ;+L`9K6vtTs@=N{v%CVcXoueH6oQaD_@PqVrOa{J=(BouHbNrD z_AkW;;GS(PzmqMI|3Mu2NMIKfaJw(&q4x04px&X{Rd)~n;OGih zGwKVk3*ep0k?_074)Rj*jaF9MWNQW^TL$N&P2ZP_@1TR5 z3nNoj)hmwg)|tU!iQf_@a9J2 zFk3}`q+Jlsh>JH76abj8!}2~6|EBec0vQ2XtpB4AGXZ56H@0PGUW zl;%T%r=YdaFC#lyiatoWps};UkklWlFBa$BTciMf>ZTGGpR>BJD{P)()IKsNbMuO# zl8mkJEKpp5Q+E3G&-+(}j$=Ld-FE4VKS^YZpHahh+{>l>^%=ZqVPS9*l!QVS91BGV zKIZRogYF-1ECuyY1o7o^1Oi16;c$w-s}9o_n|g5)6*EHc!R_Wsg!3saM+={!1k=FN zIqE$Y))nX5L*Xvyp0N(``$_=S)$3_7c2Qg$-5=lz0w;Z9R}0)psJ2F24=3W*Om#fI zuLSzOacP?ty==n0$v+BuSf%Eag@~&(%w~s>Zfm8Y0|a^K+d6Sh4%LS` z?dB!_Pk+Z>`~iRa!ID4T71ARY(AFF2X=^ZK@t^X3Y_o^3KNm~!t5bi~JYYagzBFuI znE@q)z=729?yInHL{srmtNu1{`zH*ta%48@b*!VxNwO4Tqj zyb3Gn`hi*W1Hc&Oe4625ai9`Vv2g2MHS$4Yf~%sn38Tmd-5J%@q1lQJpO=GB1)8T~ zzr1^Ri?6o0`(ho@+Uk8tuZzFn>FI61vRdDJVb*{#RN2$Om8<62Y$&P6_cammv!5Td z(8R*Z+4)2{Z0=&^hu{CQP7^3;;*m`doRLx@k;cncERE)y^^2e-UoBW0u*z%(+;HM1 zi~S`G&1|Mufs7W5&-6-lS0zsONpM}{K{}EyL3U#%NE$&Mun!Tvp6|-$RVt$SNOp7F zzxJ$%I%YMZh7&F5_l|9aYjGPm^-182ENYW!Uiq zCnZFwRP7h=`492UEe7b3Oe)QJvPU7bSfiJHAMJj5FaMaf`U#j$Lpl&ZX9o@#a#j}) z#{65}(G24(Y^h8q80X%i$D(!NamHu)^YPxE(U@6Z~`zz#S2-0d-b z|GQ%bbMdf*&n!ju zbMgqscy~WBpGNGv;1hh^)tL&S$6>%$I={mEOGrC7MOlllI*6fdC>gk7M)2uYBK*uf zmuygr#qA`&Gf%+qDg7RV&6|MzJEkDxz`Om^d>ciZafxek*c-bg!FopopWC}BCe@D9 z*A!0Gr@o5N2IFi4RIEXGh2-R94Bi3R;p+u@0g21XOYPkj}(R>cIK47${d(&qb5t^Vy5MPxc^K&Um zc!YD=5>>Et7%O9(c(2Px)JcXkSPhP{e=@Khc$LR1=Y0GsKH^fztc`-+@t zXn4z09K^wwh)UB+^XrWP9Nl#=Dn14U)103D!_>CyzF0;t_oSySw$i^3Ke58Q-X?@o zTwc7V!MD@)m+%Ik@Pt(OE@V)9udO1RXCQGW#bN=U%lRBlR_(`#vHPU;oR;(`zP8lX zTxEU61K(r(O7-dvcA5B0;VODxdXiQP&11qi^ZYpNK?Xb5^zy*(2-UV0NI-4sG$@i{ z-y-9F$45Xi_5=TTNJ<#8yEKA)V^mRPTMXIAPR}WJ!``;vC_=CAvLBA86>^sO;@FOR z&>m540uTV2WtO7hM?HjQFbarUI7>HZ>6tN`0gW=(cjjh;YKFT`^7M`Aaj_RngW5i) zO1qgyYxE8D?uaHd|28Yv`O zHZWx8Z2AEqv*(M|1}RZJQv~*19R9dFr-0tZZc$04u2h=Dl+fZ{s4m$5`cw#- z@c*T61isUULQZE;3WFb88}(r@3Zb&>D#MHN1v`i+U57ECkWT*(FeOdNiP`K+&>!fF z_y42n9iuA$-nikDG1;1ITa#@!X|gBVO}0JRwrjHM)WpfgWb?%P%silQ=Up$m z_TJa`L#nvP1*fKz0Lr5GWTfwp&Sxo*!?aS%MCjCs@Onw_(Q8w#doU2T@y019wRm0w zX8Y@0k^0ZM;(SI&l3(D%C(xvF6)zc}qT#RALc0>sTbH~WsL;SUZNrY5_qWT27_38y z3qM((m|K$l4%1hYr>njQA_X%;NtIlI_^{?=$mGwUDjLQ|eul`t^&}7Gx-H%M{&l1s z**T7j;7}grd(&|pxB>#Ricf(eU$eCUI#Q|vD(F0luoJoJCH%<8B9jEjMTl>2HDUq) z&s&-YBWD|s2QfMNN#}?ee?J()dm)Q;o56d1H^#X_>WWVL6E z;Dpe&y*Kt-XB}@zle54_c+JT3zT+DQQ>5m_@>7D;S_l|a%6)cs?$z3~e4jq}i`WVZ2vUASNorPQ|`p z9wjv62%l$cfhvho>T_6(rT)*M$iN=0F1>8!Tm9PTol_83$=<&9<|kkV%DikWc#AkX zCbC;I{x~N*^S_2ABHc ztwBlnNS34(e%#-=&C!7DtsOS>mpaRP4}#q8)+2^7@35zg*>2@^L|4PG*~|8!e&8$` z<;0+KV@KMUR8Nbw4^^1+4Sf2e`EGky3=4u=*tR++z%D7SD?EMV6XKU_GJzDDpGpBT zGUWwo8ehh4uJ!wXV>iH@!G@roMD z{4A{e&WKwUDTH}P7AF(&3+KMWkr+n%E*EVaZ2JV`OK9-mjaQd}h&WF~i=fm^KG*Hc z&xDEJbe1v8s7hj<(=bgpE%>yu+GBLf=s~R=_jowrZ>A=UK%dj~M3@Po@|~JZ-wR4G zENS{QJZO@jYAA#T-vF`!Ws;EbbZBwl4gk?6Ys<@>X^9i33c{qtz9)(P9~KozX3_)6@8aIMN=ev$-0`h9hU)Y{y~McK17S z^JjPwy1JM3=oF#@;IkM|0tmKc`L=0~6j$wL zAk7x*@hH+sFF=35w_lK8aGVS715I=4p6XJP1GxjS9!8}j0y=Bia(>tAa?PZMwP0sj z1iroL3;4fMf!RftDc~XKqWkCN%>N}t{;jkLS4jDPzK4R{F=t)=v0z%n$m0h|^zZ;f z78VkM=FMNUD|o;F5{<-+n4AwDd3q_P{2v6#SW6nZ-beI04@PXhBqx{*%1Nw#p9#4F z0R4ClH!XZcKRQ_^XV|kvqGH{Oe@442;at5hQ~v%gt}**@d6Qh_L1uZu1L|b$&lSBX$%b|y|*Kxh1?{GR* zBA0c{NxUSLHJk+^n$FIefN)RKr`~Shmd!2hQ!b%ZV^uDx1wi1bEth%WH-X z*+@oPrK>RgHU-$>zZ5UxBvwOY9k7|%YWn_9Mg|U%L5(LC8u&Y6kx`Lx_#umc&~^;!0QG|NjWY*Wxz~#&=t9T(<(Vufe+xS_jgb(9Juim(l>=@JIkK;!dD6H#3&7s7ZZWQ zOeak?0&t(y-SFPS9;4oskq$DE=`V3bz~@*8>rZ298#5_QvpBl?2FYp~Uv9%|9z0|= zjBM`&`(#Z0RjEYibhczvSQ4{AHbu%T1secMOrZ+m8XXW4*E`XIq0mZL)kx-#2%~iqP@48<{G0>b|?n5O!L)=qc45C%&fx&c)4){eK znTM*Gi_g8cd|mX^XUxj8=WIRbgND>i=x>VyLZIcYeCZyu~yO$=8 zXocyk3Uy(o3J(~jj8e$t6aZw2H^bP(kX?>ReAY~i?XYkCN~uTCDA@U`&dR#iWS89v z)VQ>QKXf35ov!0-RMySVH!U5FKYx=$(td(w?{H;xm?+u|^bNWB=} zi9fh`UP)*?<10=X1q@hpcx4K);ck{1$cUS}-pi7*+0yyIQ+au5ItW#K>`H*NfKI-F)bZXwI16~ayV+SYI+JcwuidO|D-g7|z_0yS zc}}_Ux7+TD&)qq=wY1V=03!sgvri+3xkB$7=h5KL`F6dBO%b;#<^t=c0 z@Jt)DYmFeRB#A3|H+nd5YAPJvXLrEgO#Qq4HijI!6yPJ!GM+a=w z=ZJv1T#WQ87x(ZmwQHUwKcc70H8zBR$+HCbr2U3(&W86r_@s0-P-k) zH$W8UEpuASy>fZT#c?w~=@VLy#D|t;DslyL1ag?2=6kSpT%n?tr1OF7`ulU^Oh`l_J(o)9 z=}n&wIU@G&+Ofzbmmy_bV)(GiP$yi45^XVBRcf_+%7M;UU#0qXe7(YL5t&VeAQ(L} z@>57K`s5ekK|a~{cFs?O;M(wRRv1ZUqah_W1q1@ehCL%c>%P1smmB}hqA~6KPkRux zM2Cve#}7C?uOQr~?z(rFOnZcc%XmPVR1rmNbTmiy8RIPTqc_l?X=8hYdxACMln(+T z;gEx{gY!a!s*X~Qx}E;ShwQpNOz&Tt1QVGWdt9OroR^<2@M?_zvH^O*QQ3TEKAh|F ze&<81_xKS%ZMpZhtBiY|AHGG&ETO7PFKka?x~l$7Z1YF^H=+DXmdDo1e%If74*WU! zIyH{o&H-9=2FCn3ru;e8Q(L3{Je&XHfxZ75M0Y~Nny>#>&-ufDCIg$Zi%ZiLPA8GH z?97Sa-DBWa6z5N9;vsSDd~6$17*CQ9!YAcw?c*RY1^s10GYmIpos6zi|A$2 zO*y;@UYK-)K#zima+C5815vth%aI86gwe(=db=Y%B_eGJF0 zTlp2IChA}!8(8U^=J0Lx>o&Fe5$NqdKT*I7=NSocJJ;(koG2`C(r?JP89QY0V+t^@ z=obz6W$*de>hH&s7Jo_xj#>r(g7LI3{cj#0D&j%5IyToE9$O}d2cJ045mOg4CN1hq z5sXtmM#)d~v-4W`X8~Bd@L=&w^i8fzZjnkm4T(TmLfV%IcfAXIvryuU{f4fu22Nrs zGnYoby49EH@U;rn6ybM_r-K2(!l6{B`^pe`Nn5+Tiz$%RYYZ6$QET>pLds$0WsMRP z_$3wL0d#Oe03*m0851l&^4vqJak)*(oA%pYy-&0!`4KamOuB-@L%O!M>w_Z?+|;*q z^>5p3fPobdpHdpr11d^ECN@euYW{DOtL^u0gO_VH_w_W}bQDGZ)3sl-af**Ufh2=R zgOs2zAZ}=Ltj^X?q!p-%^t6&F5gxPO+o&IT*##D#Ids_}Npjb<@Pv6?lGjRmrAXP&_ zT!d6-6gt4RI?Ke~F2Zm@i2MxLLl%?ghMk3%`sBnqPG~<&i|DrzNvF@aE+6TnLokze z7*-p;AigGhHYOG5E2LhYxZqFLjlwG{t1BK2PF@Wcm zlU|<%AF4kAY6g2d4cdTttI>ZQ4L)I@*-eeWwOt{bhRSHRKLf=M>Kk5gsg0vkL*Ms~ zkVWj~MbD=zvdYR6WUCnGF9*+Xj>26Ko^7xN!Xf`#OYIk%?iF;9a`H+jtQ0eTnaLGF(Zt_ZS)$#?m}K|H`GK0qs7w=I>h&-p2;dIkP_S~=zV`3z=(K=cB(v3`5W*V9o(bLx{?_%JM_I{ zXyn09p^O6%Vm=QE*C0;YFDun_QC1 zk*PO^6a zW8og#oZQ{xD&2ceE5kJVHZSzREzrK#PuIUvZ>7OT6mj7tkG+4Q`bV&+{*n$Uez!;3 z=V@mgv&*+7cyG_tRX?3pL(DJKmrQkLJtwJ3hSs9%5nXbcBG(U7KUh%UhE&$({5J#g z9Cie~2%|n+(xx=u4BAXcVI%GIFWep?qTg^)ITqUl4mZT+SyL6iXF#qtm? zDpK*3i%`mW=utedE>e)B?3Ez?V`8&;fP=8y7{2BQCoNq#X1!4+RwT;+}@xm9quSw z5{@$722xyyOmdL`Fm=D^>kr1ZsegCQRgEkzxxZHiwbtid47FGnh%!9>`m^i%lwi2~JKpb!4R_a)DUelU z{kHtp4xPdObF&UyJY+c$K=AZg(%)}m>o3{SU9GdGC*?3Q$8|e4s?Jyg7{RnTl=Je` z&;%ay|1fj#sFGn2 zGvR#VVK`sm5LojHeG3-nv?DZzlU&%rVy>v*KNt$6XuA{jJjU35puX7_qm_7dx0ohZ zb4pXns3_vf=M=%Wm4nUH1A;h z-V`Q6%bOH_`mIbRnQ?PRmy!St>1qz2vf8X~ zMJ>Bju5QyM^g|d`(@@e|4edCw4xGqbb=S)#FUCSjZMtOU<3YXktND{kkgit`WIePI zW0DI5WhB?M59tIHQHcg*sl1y=lxO@lt4e|hg&Hd>1bG=ygVz(A3@A*(dc1bqEqUT!{tda<*NhXQ-nFqY`0&7BYiDoF{xjxFKEE@J>oau|pV6;=AKKr5 z;6;MPRWoHdoKc;j{ZcZ=`MeJenOpYHG*TFX<8%fEV&qyfxMn*?yR!92eo+E{c5l&Yoh;^CpmX)XPp)4HduRZ6qRk8j%s#o7oEh=ARCROTOSX19rcL_YA z!k}?wFzp`$@sojs)(sQeDDaaEm>5)n#0p^5*$(5m+|>@2x)Ymp;wkn85@S zi{Z{e)e^6OfW&;Wk{5YJp-7iVQNl;KmX&*b-xk9oHHMsuujr`xnFw^rI&88Ew5O+p z2846PuiSysp=$K&!bi{%orgrXUp(o=sN;BE!~rwPx`BNn8o>Oez}6iLpkIhn8!w!K zK$~Vc726Hr?^Ka4HKyg9r%}ID{B!hh?}iCYKI3q7=jqI0mL04sj?^L6WG336RVN`=ZJoPX!(n13rR_Ry%4ijTjutJNYU z3e{_0u{#SLY&)R@*k&BLRp6=-Gl)~@Q0lF&ML=>w>^4q{h#s=I9_IEa!9Q?_u#yUQ z&~0ZvIm~p|jEPTHVbko12zomjGYMdfj=++qDC9RnqTTPwa*XhIF09qGl%Eg;AREY3 zncqnz)y#7vr{R{p8}N|X{oxi$fn$`Yms(IK8bf1CGfq-ST;3#y^g`_dlB$uAsv-sp zD3~}<3SD$QWoh(iC5e?`xt0wixy#WtK*q3GUkNofZ1|l2=r~lZBcWvCMZ%Lmzl@U& zAyHDFI3PW8*1?qyk@g=K>8nB7kz6f(o%}@wgY8<9y`);gR>QE6j6j`?INv$)YPq$2 zwGVw54MQxvIijHK*ub9uJ+uw(Wkz?8X3H13=8maB@#60nZ?Fge)b;NgrCmf-;Z_W8 zx^+40@&*H@hP&svYmc-?8paCCLHS)bnaG{qEjg4t81joSPvq;3pH=2mMN8o`@DScMY)cVkqhjz#4Uo!XmuX%Pbaw9)_h-423$&tGK6hGD$dw(bw(+8}O-%2P4}_ z=@kxK2MV9{Sc3r=Ut<{Uja=R0j;S;UH-j~`8&+>?fC`;zhx|hwgF6K1##2D(Of*73dvZC8 z&zK`|-&&zG4eWWT2n>5{Z=n9%_c)7J*OmtN$X5(462Jx8_9I$QzVz5Z4##ArQ>Dy!%ChK}A$tx$=mxD<$Ig`rXu_SGH(zpeY=f{--Z zD%C)kG?6$ok8)L6DdTgHoD=?+6Y=7K@N|$R3uVc=P`TVGAesL`LJd(4A)o3d5@}|? zx9%Ci4iPp)OYesH?czh9?yctJF$=h@3Y~U3m|7RwQ%>P%CVMX9K!}kqD{6Bf7*D^@ zGE!W-VX5{jm7E%L(t-)fs#5iFnm9I}HBzGK_k!po)&xBq1E@bd8?0OhZ%3FR#8N=_K2=alqCF`SljP? zI#OT_Z(MFXXoan{VftMAWejW5zyQg>#U``GE&jZ?}%7i$U#f}^NZ^QbD{F;!7 z&S`hG-+|bJO}I&GKzK(38EypvdT((y4N_;c()`PG*R44|$l*8la+0u9%7*fqtZeIu ze3@VwxR>Rp&L-}Yj5(k*&Y*Thle2!iMA2w?fXu)x+}8mJ=p&3i0442J11@0hPq!qa z5keZg{u0#=yvP#cY;`uztQo&JSB1FFxR!m1%_PsI>5qmX35H8-Y#LMdg?=$AYmAO( zPIkd9w(4^a_NW|zK71i%Zrz00-*Mbuy55)`Md`gLtxGnX-6Rq)ZHtyv54RJe&}405 zl^CtdBD!-Vgnaeyw^7u#=bsAu{UtHUeQJ(nkTgA1AmtB@F>Mz~M&PP|GT!hy(c_V*NSUARs(gTsz~Ylx`A{f^_nHqPqWRk3GSx z`Zsbvbpa#h+M`STy^i}2FfuSOD9VV|aDo|1ca|gaEdcHQ0+JKaiyS@8+|Z5!-#UzpxEk00f zds5fZZGyAL@nzc2ht^g%ejRJ!SK8y$y%W;od4d#Ku7JZJ<^x*39$ps4jyPuWBflDA zs$pYoC4H}%K6c-%?MdIPuh5_^_oyrPAo%y=e(P2KHB0zK*wL{*oTcX-`RE+sWE@gc zu)lwY&47fsh~u;W!+f6DY+v#Jy_;2qqQJLvlt~Tp)zRG@R^4XT@NLd#A|m2K>r8mx zv7ZoBp8LPAgqm@d7c> z615-)6gUcqXba9@kkMXWFt&~7T?Fx*e?lf~2;)(Is`u~X1vzI6V0D^6o3rAIZXF~-hicwc zhF^@%IYKhR82%PVaZBKTdGBy!l;Pw{0&xNOfT$} zDb?NV`q~R_UW|+BRi3o`qQh>AgKBckEO2xF-l5R2_4g5Zey;bFdqhsS)4nA6!J>GD(liVxMW1A39m zQm_`BylznDZ8^X)1$e-HSHvh8^LA8=%)SA>)QMKN$D1rYum3U;``)UTaWGEjf0fVh zh7IcX<%a1mw9{3w$sfz-(AREd?E2CjRRFlO9^}^`YDPh{E{&t~=NU9R4u)qjhr8;L zMqs1&CevxPp~OpG(y>&qzeRSCJ&H%?Ud~T`k?BH1XB?JIws$T@oJX$VB2(mZk|m;c zdMHrs@)(;RWRkZW@Ry1#L%?MSmb&?-wgtKUjaodP99yjEo5|zUC!(_pBmOMYmwwy; z7-nXrdhHrVr{+tVOuCeiM=eE@Dc3%a*`F=|RepDfm1+tH@lk{-+q$dK^U&g%3M~3W zI5GVt7#4h3aFf*$w1}F29;H6ChDmkt3~H3$V5xcQ<|5;LfsjhnW(1WL|`7Hy!E}!JI>MMiDV+G|sT^x~28U5c0=_H-2z7l!jzli#w4bc27ur?yB7dAw%dd>1r8z}ZIVJn7ui?& zDb@cFqdh=_zeEdx*6R>9o(jS!YCHT?dS54v3&LE--|Sb1j@L-Kd?@=UXHC0{2q;Zz zNyOlVyM&Y6+|RPr93>U98#D`VeI5xU-7r7T9lb9|5wqT-R}CLwUpOkm)?+^364B8~ z_hP>9#du0UqxgW$W#B{;rCL|r2eQ^i^B1jSdC8p<}xI&!XO8Oy;)BIFrSNnrRR zPfjSjf6yZt%miaOzmTrk(GJF^|0hMfcLPfiU*4tal6&Ib-5pR_JWw01k8CE}E{ne6 zgfZ54BQ$+0(915Y;xeMKN(q`{S}lcg6R~8BiS3MC&`()9wiEv2m~s>eQ=S6zVPx`V zMuB}tKa0BPMJDSL6QWP;CPr~?$X)2!!OX@sK040N*LSR5@3iteb~^&@>J8vEmP{mY zcsIxGqz6|5oVrFv^5iG!Mklry4)jM?Zt%bDf0Z9V(m#xJ5;y6@DTT_k2yL3*qcl*f zTynedMP4Z^*_&&rN+Cl9wlaUrvaKwK?q0*9MRdM5x=pOGOH~0f)AB911=^0SWBJ@IIb5E8oIed!!4u9u(cIYv|L{93Lk&)n>=*6G#@(dOu`VQb%8{< zqm}BATIR*`C0i>vIDG{T<(r^JTBYn)P@7*K9DK(J%m|S=O|{L>rp6eKs%XgWe9=UWvA&dmc+6QmW@bR41ZZmqW^_bnZQ-B!*VNj(uq=P z*YN#o02e7>74j>Cwpw?mM4E|#@K?MWXwurM%bV3IX@)eq@inBb6_@V;)INfu{YjE* ztyU0>Y4YE|NV2zc)bKDq_}^9g-PXZD+$M)-i?&V8{x9jdT{`;Jx>AQ86cKot8RdTR zY}DoQymv=s(A?=CWMR!&P-zu!;}5Q}S$2of(>aR8Pt%MY{tnafJzq1pluE_Mh+oW7 z(MguI6?gC}4bt~9rj69-`v(d#Z%$Rml8-)tboG0|YQFYdX zk8vIvYE8Q`I%qtJ|Lpuz6cA!!Ty9;tnrjzSPu6`z2939u7RXUB8G)J-D?g9#0_x$Y zm~sW(7?s?f!uH7T>_777yJ%)m42}!wH5%`-0q!1sr*2uHQ{~)sa#>nE_^*;cXQ^gT zGD)UXT@pOvr0=f!hYunro^H5p&HAH0)aX7_M}T79IIHtDXsnvICx0{?b;buW3_oW< z0bRHlxpU7y?&;(-$n@m-YNUI)H1>I}19s4Ifc(_3MXav4@0VWtX_ZwCY+1&preRZ4 z$p4%u;EBxFA{Tiw(gvrUeN40TGiH7;C{3$NP5(#-L`wpp0qxJlK}mz#zQQP$!6gitb&PSG9krLYdm z`<@<{Xh5&khjtfn2;9^PC2V|Vu~O%Tb^~BHploW5+1QJBW}W$Hsgk=S3~``~Uiq^l z30L#nY(Zqp93{5Zv_N1ru)?d`#`;j`&|i4*d-S_pG8P;~Qi*)yGvZ^UW!Z8V)CLnI z12}jEC*T}lI_t^+Zk8|AG2*UZ+gcXUUs_&X#`C3?igZrZDG_FeSsxNzb#o?+83TJR zgoHtOZ%6YFQw<~#d7a3$dSKT@uQDN6U-U0dqWkFT>eSGPeKx}i#!inDh)`Ww-@q4` zV{6o4TVJlb&@xb1TmOx|yd+F5_Ew5r1diZN3eiHENE)S67ZvTP-^yCg7YQNRr8-Yr z0-WoRmf%U&Z}TzfU;RjQ6DlWyVS<--6iVp^*8RjMNAF6=!aS%o1j3Zak3uXex5|+z zRm=B6=dc<76pfo49^4*NraeV|x>fTy?Vo;uEGjrn|13Z9$lSS#W=jiEEO5bV%@oTJ z7Jn|x8E8){+@X)<>hrMyCku~hrS52!w55+LnBKgol5?sx@mMEkV`VyUV>63M7dIc0 z>p>?XHp@WwcFy{};xjXpT*+m@v%)-zB&{56DT|9HdQ9XCiEO}--NANNSS{_D8)t=Q zM<)SC@3)P=BSc`$YQ~gTU6G=~;iHP8MSf+_7P^309S2TU*4k6@$8+zn;cM0h_Ky$X zN5IF?;|Kgah$wBH*ed=S4{-JHgxAOL`dYU2)LX!F>Bsq>K~7KN<2djA_~WU9!%2Nu zmxr+TKTC$`;UBPneCrKkI!|aARH^uYkI3>Z0^%kg^A`_yuj@+HD4k&HFBV#1gNBOA za%k(+Gp8XA%YnAq{MXf<{YzBl5odQ4I@d!uE0o;5yOk|dFYka_yIF2|ZJV4mpS9iH zeYC0Xp?lr>w!+UCV5H3uu$CsCc_6UBqg6sY`?-*eZ=8`zbcMeO~OQD1a3Cm zAz6t)0+b}nC+?mBK<9LurD3fi-UFHg&QHHr3;@D9W?p^6exG-L$c-1JG1?E8^GL@V zb%F@gQ6i(sCd)e;-7Gg zH@GV+I=m%rUfr~6ZJTR)KcBo7a31?TsY{7&r5c~e`3KsY@PTJUxO zpSlEMketyxe?&lsYN*~blT&jLQ$ZrWyCJ(wGIB{>)m)Vb#`X=3G=WaQPTpGHhj+(G z1(MmJI`X#SCNA?uPSIYNI~E5`ot~M>JAryx>+N6nnYFbuHUoaWv_l;H)^;6%&bO>V z2F~H{xvu=?tz+}p^hBk^gxd-YpM4o90$wonLp>5E0E!mkvZu9$ehY7@KNKc8%0RZO z`K86Zm>(VfC^rZ@tJ~aXhp_ZKc8a+9>o}UK{}9}~5zAIz=oj1a-WDFkUB>{oSbge9 zeql0>u~xU9Ci0H-IN!z3NpQilp3#@^Q_}xf$iMW~uVD8HHZ*cV0)N|5yjd+aR5>KrE!|r-2Mxz zHMfZFO(=j0NNeO823k!R&y-G=Q!Is?^Zv7Uf~jM4-FeA_l{y!O)HsWlA?Jp^;c>Q} zrF)1u7p;r9FbJk=~oYp2!^pZ@(Pdjot@<`CaKI}E- zl*ltSO=o<9!h9pqBt4H!cdi+MWi9T&o+M?vtCUhlBmz;4zI8lO~{t&UUi{zpg;}9a{7a_CL@pfDRQHz`kZ1#nBu?cg`;r4m|GyC zl1|^=0O_qvfdkHNvby*J^vA~FV#*tKnIy-GGA#yd8o6hx(+Ca7*mXefJ!TCfV~Kn; zS%_PI4BOEw&2raB9|6>-UQ6t}rq|=(LJUS)lm*;5ncZdp_vMXARvM~xs&Yecr z9LXg%v?k(+Yo~9y@dawRi@*B7?~l0g;-BG8eul-YIs((3hgHOLtnOL049dsGo43BP z`i8fqHuPXhC3SBSvg72p7dmU8z=hj^zLtadk{>p9sK#>}?Q8e-7JnZVPiq04_h&v& zjUp3A&KkBXMb^COdhG349Bv*SaPvG{mV-&F6Y4w&XTc1%5Rnwd2A`-ON(>Gmwk2S0 zdAT!u>gDnJ`M{;i`m)n;yf=@<#EO8**Q{(wCb+b$4U?|Z4 zewzOD_pleaMw7OQ6Fy7E;QOa##@}Jd@>CG%R*`#kC{=yu$OyubkC26&r zxcP*H2nnPB6h7$TSu32_JN81?IH7)DWIw{=BkQ<3(y3X;F+PId5rgI;L6iX(u-;WC ztIqM0F~b{EcSg}!KAsX5T%9-?BQ?p`=of!mf4y`+{=l8(`zT=*vFmSAX4QXa!H9r*`scP@p>ptA@e7mltIvhClg`0ZiVx7(yO@A61gCu;1+;PSSJsA0CtG*3n^qpnq z`Xd_WyeQ(jy51w=ewoi7w3|EoUNyuDVQcriBPvtF1*8BO* z{?%7bD^I^*rP|El1Ks1ocVzV$Rws=O59uo?A(wA>`UzW*@cCwm^s95t;?r=!Lub#? zo$tlk9|B*#;+DU^yWzS%KuO4Q%b59)TTXL!)v@E4%IfmU&TB^}J2;^~<47ag6#VDmXHQ(m zlKi?2c#sZDr7}WSU230X8V&e>5@>r!q+F|VQ6mri(D;hlMcJEI!?hlTY=0XL^m~VV zzdQsj@5#XUbA@Eta2Y}N3f6Hx=8e!5I2oxfQ4GIXV_tXp5lg+ftY6ICba%kxb;Rs$ z#gB&_oZQw&)j1J7sr;6hC*JjL2K4kO8;*n>I{?S^9cQ2unhAI9uOH2ww;CH8hz?~5 zP0cANY>C;R#CUd2cUdEhNn$uji?X+<0jfyNTUPQ_+ zGFz9N_-L1M@}m6>n`zKvk(R5HuR7_nRc+hrY8qJ&L|*9FmA{pJ;_K*e%c=Wu=<|B#@E(=-er|Z3 zYWO0gquO477zBPDLjqpH;jBzOk4N0*C_6lfdjR@ieQ(s)=0fZiYZ%h|gqF!!GS`h@ zIMntZm&7kGFAJSgC6b;iuvZaMd>8#itq1tXV^|Ph`a9*NI%3uxcBo)caU!{S7r;(f zrpuybA4$Z1sg8L5U($5nE!oN{Qi`ij%TaUq9QQJmXnddNdk_8s>xzwykO42Wb}!f`m;nq%31a|Fwe0%yhsloiw*UN zvD%~G4HrVr&q(dG(<;Y=G%{|66OJ7LJ)oFx2hn5cX*lZH3b=xO6<)I!Yv$`eF}?$# zMsL}_w6NSNGw4l8wfKd7THTmB2fY<2$)e;z04P4Vf+pL}o`hG3qJ|4**=534-Xi_i6bFIXMn3N0sECt2yvc@$>9h1-}?)<|QeOm>rrnnn~r#{ccRT z27z_T1J%tPi6@<{1}s99U(-j~V2`i!(i(|f;hwHVRI1{Hh}Uk%rUIiyDSt#Zyv@|w z_X{LoUD1CGx_Y{pj4xk9G3ea4gk{4oquZ=g4?Er9Io$#!@PIc?5q746-d|*gdrIYX+;Ub z^UO$h+he~KNs73mxIMs`GG}?(@3ARUt~V-+eKKhlk;e?k^CBG&R^Yx&TqK~gX?9mN zY8E>s&}6_R8#(xigX4-g)kf?G?5^H*v#;5p>MLSKbHgWXOefcrsuMLq&A_^o5F@3c zloiXQouhQ?h{L!MC>v7`3(nqg9CPGt?ufg|?$W0DT%AbCy_Lw5|FErUj-*)vWrYPL z!%gy2sxo9Fi{(1i!9TqBW7hEMJ^r2J@_ht#?3R4YS5JyGbpQRGf-)$J$2|`(0(_Ke ztR%HkzXH_4W2|q$MdzmA9QY2OM-=cKowBz_;hK~#Yn{E01LEytn^vq3XuZW*ukjP^;+5kc*E=K@4 zAoASX1Ogf-SUoo_P-&yHbLmO&QWW`^6OX?VD)Vjjo)Zx=iO@v=boGEavQ zHX!roHC%V!AvU}bFYof`r?L!QqKNZe)L#|FF1*BVW-R3-zAIwJ4ik!I(7X;!Qw(2UyR#d zFl-33iYv&~lN5p~M-_g@;nPmpIP^#-9tNc5`GPAl$7Q0BVQp+;q(@_><7DS!Tz!@J zm1GuTG-PovJSG*=Qp_XEZCqp3lUf6dYgN%^Sy03J?qO8bqG-@f|imVjO4)% z&6&L;48UBF>GgGV>YH7CIYN#_^=Qh65)}EAS91tEC!b$~fgYq~AC>DM#jo)jV+bdK z&b&{+4|-SqDPR$bNaN1duR}1ikLHY`k)-Axkk3uJV9B`z`}Mdw`EcH65r)A*7P=6} z>inJ&Il)XY**7m1CbLh*g#EikfYMa3{1s(%HhQ@f>eUw8nn;^clV%_Z|lKzE5|()m$dw z4jvh|OV;fC-V~>=@j8BH_R94`Ae~G04;RY2Jofpmx{#`MtLS|=6d#fF6^BTHCQYu51xFWxbkuJo@dX%9Hk*i+u7a{H3R?XfT zJLFXhWJAmotIyF~Pv9tZlTy>v&@{izTv(<5kt!i8dXS+s9X*UxCF=Ne1(AHscVH`* zhAVpgnKaEahE3h1r61a9l!B;xJMq|{$F}6}-$gFTPcl&xBh3nY>-_Ut7i@tg(d7^c zI3Bcp$cejKxygPohtGtm+RJs!w;;}=hLk&W!xp?FYiz{rnBKq9tnvE&rPFGh?}|r( z8=+1ww<|Tau5Im1^55gaF6IR*9hezCc0a727p6`0qdR zex1H7u5O{!fSgjft9DF5@-fh^u_|;Yiaa)tif_Ff(Nmue}8q#k)%%*@@%%goUL`5z30xsrT5#Y(i#?zNctR{vVpY!LQPAYdd2yChhDd+qOMfliS(0 zCfjyRnrxdBcgEzJY=8Tl^Syt=^Sht5*2U8=rUIm>I*Jzc3jGZiA4yX~JRNLMP894gQ# zqMCQK?=?cYFG!%m6JN|QJAT7?)6XZ%B|`ZVn$fNd99qh$;ijkq{8m#5R3y646SiPM zm6%5zQi_J;w(lK5`D0)`}J35pBCtxEG z*M-^CKB9L;Df=TciBgmrao&Qh2|4o>OD(jdNa!;WHcP{Gss;Pek})D3gxoL#)u;>N zat%&`q9Rkp%sohPLutOOvC7aJt*{+i6qqsi7+BI*GF;m7p!SW%ud2_R%FX{J%EMg70)O4>B{ltM`O|YADxTmVfIT>z z)s{V=COJKeL;SOgL-1W}k-7at4LgJ{Ryuk;)?y23JpH~moi%Ao?3dG0hB^(-v`?VxF983Ry^vNAxF z3$vky)Jh!6^NLpW8^j;kq=Yg$>#W2B-pj6gHVO3P4n8tSMK%~c7@Q+L&w;WW zM(>?<=le~y4yPLd{ATmuz<+n#b3=cjQJ3b68fFI+)Hvm*yIl+{PEws@Fy_T5;AH|l5O=^I)#Q3M$Vbh#oks4Dw`cqIB_+0+6Ju_A0)HtI}TOkN5_$|LIu z&wpKsRhT+DrLII_8X;Wqt2<0~kXD(h3xxO!U(mX81mdl9?Peh51`cuxPtwr0KDX#5 z1&weX^>ispNR8UPb-e^&ON`8-)6m+SZgGGi0@ZUfGfdz^ zRx0m^6y~QIa)h`>QvL6qnd7^Z*n2l{lP*L>E+`wl05}bf@(OGO$MXLW$vPC^TNzFH zN>dCjyz(4-e#!xdg3i#GmL;<$Ux#+&fzM%ZYY{4f%?&GeK@w6(IkpPB&(;2TdP7`?jPfuf2TO&ksGG-F_~aC}es(&zgtzkd3sE+#Sk*uK zl-cmUOw9qu7a((pq*< z<2g6rZTr^p^J4pIPT7A5aQQ(n7;C2`Rd3z`@$|NXfzbB5Q8Dqzh#=Cnd8?aVcP{Gt z;-4=f&e%RA;3wVK+B^Fmfwr>lGj!}4s+t*F{7o`D0QY*by~Z~lKNEsaHb~CyxSdiK zL)D)`S0oY5ynLWsQOi`Ph-QMhA7`y%qusi3B(C*w=lQsfs2^ z9ZH?!^GLMnL0j-@VX?X3zWq!BZ+-rH`28f#t#%XPPgEb{5N5wh+m^mf5-!3?{4WJ= zBKPf3dtYnphabw#(S5l+Yz8;qqx}wEPtTUIBrXx^Z~Ux-@QH#()11x`(1p4pxl95$ z%tZ+F{YkR95nu*n(6=6#PJ!re;&m8M6AdMJwXFF0{8uu`hrDOtmC`y`fn5ehijvY= zEQ=CVVPfoNidt&ACV`(2=PhLWjq4Lc@<|ubsJdsjnw3M0{*#M>_;Gy(pVm4IO%-V4 zk!e3|2~9n`D+#-4nK~q6>e8|F_2|eFd^Oc`3^CWo8rfBXfqm z>WaLhT;8#P6qu#?PvP71hWa%D9KKk3 zk15Qamw1Cdj;L#1tt8?aFXv{pW#gXB<_7*g_P5b^02zAgjyDqKv-|yqr2#jw^amdq z%sM~6*>m7#E)iF)ozv|hN_YrlXJ==L^}x$o2TE=QrI(?jx4TrL-mF(Ie9y~L9n-&? zkrzHVFimOO(qNtD?Bg@4EP$7h%5La)z%|lm%SAEE4o-gxNjwMpSbgG&3sHQpK9t*C zj+o%#eKgD^4bo#77$l%cB?FUCV8LPL8nl2<&Kosorf26lwG~u#Q^DLdHZ^r6ZjnTE zymUS34*%!->w=_5nHy3yT#<$?nI7BQ^@rJq%1*6pzjkEoQ~3C|;ARMA_D}oF_0bC> z)4rpF8GD`wE@KJGPXsam(sFEr+_HdsU5z1JU+q^GI;XDK(K1}oP zK2;r^c#6Vm)&mh)g})H|py`RtTepKeG`HzCj;RT@tnw`2I=}BH$vf7^zxWRaq1UU+ zw&zoRTZ4dcL2hGtgc7xlb)P^HM?cFmdDz4r+Xf$PBYj87|GeouvKk1=f6*0HRXbj; zo~}cK((xz1zWQPiTP6FoDbx0Ke_Bfobmi_)C{ERG=BpK4qhxoY#e!Lsm#h=3^6 zSq=Fxm3e9$O{SwnIfljxTi$$nI_-D_(JIQi3wvi5`tqzi{)=@__PBzK)b%?cf8e{Cdq#!v{4$aeO6pGPaVY(aykE#x7`Bt z(j&#non_kDPd)j8=zYt9eK4uprf|lH4!1$sridHRDf#W4KETSTu zU{-BRV|&aWdT*61R&*VlAcbHmO6kbj0XXZnm^Se9&nvQK8(|R=Jh(CzzH@5(-Tx4q zK6Wz@+&w_eBbeQP=Q#p+4xDDNWErD{6GtMZn()@3rfW6q=tt{$1iVFj-W`EYTiluQ z2!E(!th6RCYEKnKf{;Y07!i;?@qmkDn`I7sT+Y>!f=xmT%>2l4dX$b1J3*{UJTZBx zvkCqUDQ)esRyKIy)-1s_LCI4#e~XsVI@|IVdR$xp7aDPTkO=&}=%=GLq9Li(3A4&d zu%xTXbM6R0lN_dZ_~Z+jW;`-5Jz})TXE-@{p@O5dndOIB|4xMYHVjj&Q@CCJq_WkWDddK7CQP5Qz+j1wfgGvFExH}-F$ zN%sr~50kkP9SShkcMfmT2#aSTXxIg>3cYo_W4`D~!D+1euYbRv3XR;$FHozOBM@WP z1;cZ(l&gMm%Z2f^&v2*0dVNw#=tV*gH8&s*raQRruv=06hM|${EGkDdj~#Cx8MI8R zUt26dl7zafY8{k-D5ReYce=Ks;^wB9_RSevr>w}IXIOdPe)@IxSz zHET)3JZvuO{M_K9Kj3}#`S$Z_lu)26dM>LbyLFJKOZ93nL>dp7A5{CBi_ljT{p8s< zq85B6>&`8dd<~Sq>ab_abo6x|01xn0egR`w?}?H{yitaX$Wyg}yoEtcw?v$ZS16LuEebZeX zp;J+H8-nE2fMLuq{B_;KlhW|MS6ZKlcF2}A#a=rMQ;?!Ok)vDGfCeSkxG)!qj`M$gp&2tmh(=hYU8MCXSk69tA>n*4at8sq$(j^=_P3ps$o!#=BzHSoB5B^y1Ef8>@BZsUWc%n@w1fPTk3`!8vLy_tL6J>LJQ8OJT0s0iEkNzIcP7KE z9Z@27VbDp_eq#g;9+lVG8nsSZBG0f)Qi++hQWnb7A*gre9sc!gQ#nA&0906KxMQQ2 zHPV)r+=i@LWR8)Cvk~s68J4BgY!>)f)Dy`qz1I!aKR! zTY5wjEwOdv@=C|NCswx%u&L_&?m;^18hMO*}wEnk~E2={BrW`+RNM@m!;~A4+7n-CimaBHg~&dFmes7>+P@6Yi)CS z=hM>zwK?q_svof8PBdQhTIBNMx-v~QAfxNAH+fmYg+PY%2X1bj`ChjABh{e5!@v68 zU60}!++L58Tp#aJ5DWSCog8O;`Q?%@AKs#_#josH-*4@JICL*!UbV)EJ0cOlDNkq;8vk1KK5qHT=GL7Z)b6==mjSJNA|@*y#O#v<+^2 ztw5kz42l7Ft`dH%l)&1$>E%`6UNS~Rxn+!{o3TobrE2_-ZI&ay{a*Sb!TlhT0D(Xx zvA`4@O6MKbE0LrxWdCT$gp(YX_2#KVIM#Fn$YhdJ9Q+U5+-qx86={}%bcq!|C1}Hv zq7v7N6lx{83UiC0+Z-MdlgO2piGBd@kpD9E-r%gu(Xc6VaU>~xS?HJq4a{18*mo_+}_RuggGSBEUgjeMJ=mS)8dv-R1gf{@SI>wskum zqbwvWqLt(ja7)y{A#ILmt(IU0`)zWC`0#B9etRz@|1;RhfH{X)vfsnAGwbaWIWRSu4OtMBQt?`NeMsy()zyRDSy z*1bEZ>z70KXSIIrsJ%ES7yZxVeiPJ8`%2>L9AUH}Oxf+8I}Oy^_pk5K5fq*>MqSGC(F@6<&o(XtEVZ z{IS;>?s_awBGYv2gM^Oa(=AB6cSkr9S`HFBO&0DP@gq%;70a_khUYTde0fQTy@vz> z#lfKl<8a~)wlcca6!U~+ltLg?a~N~Ypdba=d5N%lBoel6^%|ld?%#JJ8OsPAL(#v_(E$!>9RtzT z+R)txh;E+~{%Ws<-sVN%igD*U?Mye{lX17!B~pK(!u~cX%l>Ook>*I?$3&(Ks}uul zf&g<{OY^j`OLEn6$#4Qw<2s8I>mMxoTZ7(ih`& zv3*DV-QVkqsXIuOD@c3F;E~DsKtlBeXGpZ3S*{{u%QSglWK7fV+z@9c6P_K1MZHY* zU#m?FOtigk=m?t=eh5zf=RqPB^A5u;i|&`5KNeHCUTAJ-)?Gi>-j2ytWFvW6JTwA4 z_(~i}oz#t>$vK}>LjTZmL-uU-pwqAhQiU4ZnTDL_5}`gkiXzN&oaHup#x&{-=SI9% z*PwZw#cH+to%6|NktGj>Goc3qKy|mNbzOto@0;7}`jS)Ib7Ba%{zLK-(_H|BFJXq= zFw=;o|1ua8%+}|7I-r2J1(?YNe{yPr&*{9pI-fJyy64;Gatrg}h<_i*4+wGmT2UN*KR)n3o&_-#G zgtGl+j{w0yX@hwsZ*+|8LvaLPAA+go>Hw^M(s!~v8S}w-OIRHtNmr#27?wrROkl++H3zQemP}Jh9WH)^;0*t|51aAJ*}eI{o(EWKvDN1@ z$dd$wUn;HapznFy?M~uo-By76SEsHxCW6=b_G8*@02;P#dkjJSSU~Fm7uWJ?w|{b7 zz&o((;{~AK*)sg_;Lct#!eHY>lE?OQ=J7k4B8B*1@R9Z}5&h^*;lW*k!CmygGmwYZ zWp^DotylQ-N?hpW7#Exoczx9mtu$-9rIAWmqc8q2duVtLpVX0GGsENM=s)z)ZhN5d z+Uxo%Bgag`Inp~#*d&-t03oYaM_H4osziy##0dgv?==q>sJ7-VUtc^)u+Lm<#Y)>+ zP3G^CuQ?YQahGCS7t!9NG&e(Lp8;)ck##(FRE6*oN@2eNNRzP1u-8JQ2_~wffQr;q zKa&)db&-DfEI)a;YgN88ejH5FsDXoJ3+C|HcYxa;LL~41E?0dVBRWamQ_{D6)4TBg zimH;q&`87g@j?L3;z>|%#^-PEeYL^RR#Op^feys@e<>s|iq9u>c(orncS1)qN|O_# z#M)tRXeElst87==fkH!-YMvH`-Osr8aod-8|K;X75Lz4ihF}+uGGvG}Op%E;v_4A} zS;lfaSad8@%VCpp622uzA)%uv4Uvr=?=0o@B{XWXH?5_1o1Af3bv$xqJM4BNR5}Drey6tUu;$LbHPX7$gZH5m~OR9=W!MvD2 zXDEa&3TxMjs;b4yjTyV8NMbPOX(HnVtJm}powe@37LNbV=h90;3Cwf_{C@WCxv2To zeyIEd1^hH$d!Irdg|{v39=Sj*tp+p2G31JgOQ8$W`H5<`FWfzoj%}hDKBJbnUp8i+>H(xTo;%O<$X&y?m<||5OTm{aB&O&>=n_DLi84N#vXW;Hg zETHSLxlR?tN#cJ6NfK~}^ziWTG%QU5)mHER6FT8rm0VZ_glv-WB`nbab5ibuo%Eii zyxv80PzfzJrm+oRYo-eM?}p6nj;gPMTu2(G`C8%m8eG)(my`9*bm&wl*U*dh*6ao) zR0n)Ucjqhb+*p8oqf$W%`J`IjYhrxie;RE)Rczcy!Elh4Zhx;j*8LRKCfT9ZXQ6i zH=-FN;1@dz&%y@}35ZWs|97%gJc}F9@IPS%p2!XIt}WNzzke~sd!}(pQZY)i;B2BI z2KiS^9M!FSp?5cV{1|A5YA8*Z*&Hf$Rws077sFidyU_I27G1ftdvrF zo2?GEb~h6>XSAtnE^-kno-{O^`LW-q%|D|(F-pDS06{B_wYK|`@y}=>LgITcS zq$wMQu*5x&85q0s+NlNUreEB z2t#{&`vxvTM_*T~VMykZZ0!OBc8qt72VFd^98*Pv7%YM{u|(L!u2QRvL6!s6p>v!k zGtsw`{hYx;zj=neImg)M-2@IreAEb}%Y(1)H%)3&Mv`ESpmB429*O}Y?C6sI?GZ4R z*)T*$=ejXoXm@ZH4bQN5dS)hW+AGCkzfw#?UFq>6AtQ>r=iUGg8jVX2zK#1~}0FKEQoa;Kfy=*e7ksCwVywCJ`2(~0d+fM)4 zDZmM*q3bm7-qd=Iv|3GWH76SR&zavJ0O5Qz272Hcnmz3*Il-gaLmSn8Cl zW5p<;VidEw)vT^<=>JJRxby7>X#Gb4bv(Y13X|{_z2!qfL`c#Y;5#*UjR;O|QJ_|5 zA($;5{1F!L$L&V~N1$l3#Baz%hKdrxdP)p2oxU;paLJN{R-)$0_&1;$h?K~M%=VuF zy&NrAtW`Z0VoaujN2VfH6t;h5y8#!-B)V|TyElhuoz>9Z4TP+_O1k6K=}@S*1Q5xi zx8aCm%`kYcc1)Vql^!n0%bY)_)%K`VAzkQuht|Hav6M?&Z@?4ZFR!;-c`DAt| zcosv&clQ-!s*4XDdq8B3mOcwT%3$phM~aqgtuf6RZx?c9EMlbdzuU1d8HM6_ePL|8 z%YpAY48vyTar<@M2hVXn6QY^eM@DdnySDppAnz(qhWduf`Dax2@;@=_ox@l_%0lJ# zU13hSq-kBV#pO;ye%Gf<&*LVr|J$E00*>cvI1W9})cM=p&{ERID*s{^RmD6{5U_$| z9x_B>95s1rH(i%S5X54_loQF6535hQOJZ(dOjUK4|B;qc!h5i+g8|Z19ZvcVpvVK|OE$&EkQ;+9zRu z40rFd-u^HF-gLp34q$~X`wX9$*?Q~Aj-u@9R1Yuxz2FecgEAbIi|@$rlOIR;~VEx2k{B*2Rr)d z()t)nl^CC%M)!hu?5KReHQ}3@X~4XFDU)fVZoN-r4&z zZcp%aN${s{TBq-kfOSckmI#vhMUYuu7>#2z3rn^%H(Bh7>>-xPho9yb60Qs zh4bTKG+=Q1?aAS3$5MFEYOo{+4y~l4HdjjxYi;H)6!iqF`MOPDiT~BuWhKO)4i`h` z1cIh3=fxioNt@ukQ&5yw*0KDGKOf1-Ty+2o=qRu6^_!VzNPV1CY*6w8G{5Y+KqZla;x8 zC7pIz{amy9HI=bt%izUgQ8QL7xd0!Bj@!sT_D9>uYrt)K*JttP*!uPhv81Xth5V7D z8y{Z@!)(P_*5-Lldw2VPry{-0LMn8E0EM>Z*W~d~@LZI#G*z0V0TOgmw(w)RBMIIz~Nh4C+VG$i@%elD@@jIQ+o~;-yxIUrNG+@O;wcAV_j*$$cFTvdA*^c4!i=g z!^eH(3_Ouzl$3sWSKnI$J&vVF!~r)cWECga)9j16+pi#856jIjkQ$l{JCFO zh@FTeWo+!~nwOo5*qM;X5#b9nj1i?4111;IKwK)aa+=>C+8^)$l??J* zpF83`_tOr)Thco6)_$XaxL3OUb7Nz{GJrU}*9CfL0*ukX-)VVLz?gXYOBm0}>Z3Bz zz|7v;z4lwN;*{ki5VWFy){%%9`VOWW%C-6PB?u+pEu(SVJx;6kHYMf3@B_ zUHAUd>gD(;6mTc~nbzqcba3ZtCK@ck8(4;Dmri-{F{~Y;RgF=HSRwJ4hmpIN`(gU$ zLWeY#-7wiWhgF}jhY8gZ_l8_@OGd5|NwnnYk^CwW_UPyg6B0Xm7XEp7#pjoDo+g_K z3n5t5VFq5-zGx&BYJ?}ysZot_G|#b=h#^Uu!=whub>`UVuH#Xvkt^^|8D;p)aX#7# zTjFeDI2kO{{|S4o2E>aN0wqf6=0o2eevwjs9(=w&`o1*w?%sR!n!Auo5|k7d`&mer zFY3Cucvy-~Dkta7dffe2G!I!3a9{Va^m$Xwf6YOMYQRkp>)94CHaLhyd`{wYG-IhS zY8vXeC7np#Do6*Fi=gT3mS*NwM0FBU^eU6JP4 zSR z1iPqzWv_&}M=Lc(GX>w#`t(ctd1a%EBN+?V<9etRZtRs4_Pd{<^uqm8!@N+yl7hq*Q?7 z=P*|xA|~s(PZ7^*bt>YUxz>wo*DBmzt6WsmC2+T3n2dgHp7ujM2}<30cXuuv*I0_10epNa`ilbaTe?h7Es&!i1to%}RE#=Gg1SUf zDUCKIRD%~<++r`UCKf^+ruKNkB<#bdazA}wQf(qfn`pU1P5>jrts_0XK=uc@+W>> z?+4hh^Ek#dr~fBh${PlcX1zI{5&D!5HXr|aS@EbfL7gHRv4i z=(z=S-7oW3qrm^WJZI0Iq5YM)jwQsM8t;q_@No}#EqgWZl?dS*wjmXS2mWer05$^U7q{2s_y393IwWeKG06(=3 zVswECh(G|S&HwD{MZlX2>f;6bM%##S+r^z|fyRUmW=?*H)s2nFAkU-5;SEV9!jPl=gb;j^Bh!>@ zl$=_&MaehTjsXo$Hv`pla~TNj*|OLhqi-5nMI~n5-(+ucIGAM`Hby=b8;yrkWyeR> z_%u_nB=E#z59fAS-3}N`NhNYRRZ{+hOM3{Br6y%F_hK^WNDN8nm^+&GlXoa2;i7lJ zs!bk`LMyU*?(2lX)*Z%u1y|boZ#>8|dy?n$-VibikB-0MFzvc6R#Dif-x&c&IxDtt z8i`&O&rS8)7@O|SHzy-$dIhFiZzfyXo3?{wxlH7nP(E_dfosd(ub*pMRjfcHXw8ot z%!l2qKa>m1&%F{jajafKW7~v2yR0B|gA$;MiHa`(t>0+?ppDJlvpL1BYmO5UWDf%{fj2eXOljdsK$wW6RYlzW(haSTRVFxTDWaL)bc{9KAN)x&r4`H z@Vs0D-#MysiRCQ(=Du%{`m%=a6Wn9bka|Gax_`Dw=7>M+WhE&F@0tmN@cp)=NASQ> zL@^hLWb`C~Sq$w`^DGO5WK%WSEEx-Hxh!f*xz&1uK}5^Fm>+3;DudqS)=cnU?!#J6 z0V+FAinsi=;*qpd8rTn2dLvM=K6-hSASz?Fg3Ckg)y}ROHM%*&D&s}1L`a+~W zJaU9@!C=hW7TS?uoOfAWW#{Yq_)Pf2`|9#5fQDuiA!gTkHq-K!L6^&dCT&U;IJGO? z`pJ4_DoY0_x~OU0K5PaV9liFxcfNHBzfgR<^uEDr8nEXo$*M0vxt#H#>|RvckA%>G zG1Wj=XAz`~pUaA0Xn?#sauYJ2JN>bF!u38(4-z)hilZ|1Xq2bW30Y@)jT?Ah-OW^b z;k!RZCZ$C`Fy;?3wOTA2lZ-7%!_m$sef#bG zGradLIbd+p=q*&Qu4nr2V%lo`+}YK&Z+8_hRi=fDtBv9R{ARzDwBST;(!L0}Zuakz z#iL3S#?9~w37TGh5XHDJpQ~{oCqx=`DfS@mLQr02LKQhFk9ZMRhB8dcG!UA6t2*H= zt75q@FMrQx#Umqan^@;MSPbh@kFwz^B*;%ZfS&J9sLEMQr*#B#3PpHuXB@i&Ojf2m ze1g(mU|()eM*D5VnXZes^N^!U@_j60w#OLE_<#r7-O}l=eyh-#|I-2t3((`SPLlU9 zfp;F1g+L8E|FNmmvr@yeGV@`{%f~X8=(-aqiJHsY8~MqHdrr0B*~ee`>KM7R4>?>h zAofB@@t6Q+oyKUb1rD`t+;Bx<8T3}rXe9GLkv-G#$G3S9*+ffjQSO_Jj#yuPNL zM8wCE-vRTR(K9-#PYL93`g})tx`^s&miT8t@J0xtwWN|{ZSz#(dk?tUfsBx**&psh zydBy759XZbuP!JWO**jh5Lr; zRjdN07&xP>g!dI1H3IlAZf0d;g>te19po#ioRp_bbylOf*sd=uh_WazNeR}SOUUs+t-QKO3XNip}z_uqoQa-w`c5|xLE1PEV&lc6o z+%lO`GZ5|3EEqD$;MWK15D+f}_1Z`iq(St{vxd`LCnyOy3M!Mb#9HhdWNrfeActy+ zbyPx<9DuqJfA2bGwYq4zAXb8cc5?py;KxqMSFS1tMFr@8PutOUG`aoBdyJ-eT!&gm z-3Q$)D})YZpd&P!A#uBo3GlbEBOUi>`}8pS+8cU_|=wC<AnzL9*s7`Z&o(4;KjyO9%J&4sebtCK9x0Q@B}VDv4!Ah){+m&YR2 zyhFNVqUKeysXyn)jmJK{+WVJj^cqH;Au1u`TrGdRUPLboMuCvrVjzmGAI~6htZvOM z7Z7#J$F6zHm@t-L3TYM(GVZ}3+awv0SVwpwU0HRd1v?U{ETY&vrS~yI%@6?$)Y{K_ zm;}D0(E)^wF3HT{;Bx00?nIV(I^q9a z6O3;4^Gz?h$^RyBS>&RTiFL}8Uvd>Qn8rhe>$;!mT&5onyn1%_6m}csG1wMoim47>rg`ti#)`1}w&Ja$X-Vg3!6fkEz6(hbKb75=}7orpT&~1m$J0j?N_f zejU%l%hxa~SQFyh=OZ%g(Mgi+Bu7+i@L2j4BCP2#GigEx+NQ*cVP&8%{d`vlf~#Y+ zB&FmhlnuZ}%A8Vmz)^+8)r6?F19!ge?^6J5r-1Z1YZnCc%U7^6kfiw}4DbiH2-m?N zeeRZbWz+zSrTRHuCfw)h*15B;DNH12@*TNEO#F zukF_j^AK;~1`hq)TyVt}+{D1D)A?}cDt@x_)2u26$bLt^WJ+0?#uNrw8O$^DLPa}n<_~8TCSY*O+UFsej zT;oj+-!$tuF5i6UMlcvCS&(5+I2@RH9Qf5~DR-BP*sBW z8SX1>7q?{Ja8QDA#>_=CzZd`~R#Q513eTdvEz}uO*t0E6zR!R+*c03EYG~r)JoD0Eqn9sRh^kuF z=&;aLQU&Yn@bSbAk-@vIIq}AO!W7*#uaze4Hi9O44w1^5^zB z&hWpqCH-!YS&Ru+wv)gA%*iVL<0I;dFg`m$u9LU-#GNlpM;vy-?f?#m#t|a&r)WF^ zL_!kBvn*W` zc-V^zU`rE52KR?M5eItQ7LmkS5v>m!2sLii&!+fHio+QBbG zL1cHSJQfoO`u-GFeZ>|ZKRPM4>z;c!72C(r-rb1j&)FK(ErIU{XI_QyDy<|)6WpY7 z6dDiuf}gKyzM>xCOv*-Z>#UZ)hlX7ahFYS18jKBan*HV!o?gq{4B~y8|M1N>|4{bG ze2#``wh!psNGfhO)lhxIP~ZMza{r9^vJcTe?ET3kjRGxr9vDFv58$ zfwg?rVw`IstC8fBp3gOP?6hAD*VcAk9(3!?9DMwk(^ES(YG5hWw!mgbonZ?!&wcaW z@#l|upP`iFvQeBGMWnJB%fa`UBVRRSY$!69f^{@0gQC*OMx5bRYT* zCNpzS*7-px(AQlLZht~=c^!crx6xvf!d|Ca>Wl@Y_;JDjBYeNh ziEpzH)UoC*hR@T{{fsO>^PC;VSNE90gm)7@|z|_1Bu2IR(vmqE9{*+jF zQ`@PyCuE6LE}YFgUZvE5$3D5jV>NFhjn9{KhPE zLowgX_ze>su{ja!)tLXn_!UfzCcqS1t+_z(Skm>IeP_?oNGUbpV5)R2rdLx-I6`d4 zEWuP;-Dkcvp08$LOwa~t%xJ3u@#1OBhC9?%@!`$@zDFJ(tisQe!scvzMOksHUH!{t?(c_!8_TZ7yWs`+ z@Ljxx%w37#Ht0-1Zei3Z^&g!Pg z2joP9S>nPdXdN3hrB5@R8%eN2`FTJPlY(cu_rvEhaQvB9Q%4OD!bRRih{BSWrZBns z_vcT13ht3AhSh*4UdghoCRU#Gs}kA|X0dh&aWa-7{o2eQhL6ApI=>eNEi@XK+_jvy;)Y1DktnqTe0Vx$VdbCGWigPZAci86F|K()P(LTxRWv!FL>V=bZFQ%%M<-#V0~f>6f8%(X#>GhsZ15Y~*~#RYFUtdA$puZk z=b_fXJ{i9`ut>Kn!?hWkaP}z6D3z0z{?f~}&-e@u)Y5_vUW6wwPv?ZH_-ORD_g~Ii zRpfrRTZn^9ay&85HoDc8h%U3mFy0-!#Xy>FiYJ~4cs$=Glh#6TnhP1q7v0XCH9K;o z<_loPI4CrYV~p#|=*qHw=qD@8?bJO=|}GbR;&xzo7*#caPOX$ zq=1oK-%B6i9gol5%ik>)w}gTyR~2EIL&k|#>0~))S6MZq%33&{53^;GEa}HF%B}%V zKQjPg3`Z@anPqg`4x4|CK9oP%w_ne<4+1{7KeQf51kKolXeQarlK#dzG%Fcs^8;ZH z9~}TPTtxT^O|fQ>=Pum*UW&lIe|JrsW^R3|$Qr`|e?s@u8sGzCFSW3s;v#PS^3P3C zQ+`4gdkXE*-8D1>fr}r-b=I6pt%>G^!QG=}rsI_9Ibg1Zui?47G1%8pjBP`rBByDk z$)$u-ZO!Y^t2%})W9B`ZcGyeD#r3-rA5*1Ge(%q;#Copq>k_kn9r@+K*s+y0xVyIB z*>a~czJG1zLKSGp*R-bipp+$8_Fy5riQRr7^8aWR{^8m*THHzE@_xWg8x^#U)EN_p z>gDJuSA)Xs-ok*_0;Yg8|G!(#l}c z*KH3q)F>fDhC-T@!h<-=H69I+qt?5?ptMUIDhfXh06g@A1-c> zw=8oAiQphs0`N@#z@1J|3o=gPn`;*SA~4Vi+zfeYNwo3{75yTcMJYoS5=dTZC1(C5 zSkt(opzbpFJ%bX_OI2l`*E)+7R)f~2MpcewjQvL7GSt?8OvRHkOP>Bo{CZd>zi~)Il;i8)XJ3VJ|gM~n@lMpd`?o7tC?HJgmRY4E<=8!4Y zE{|Iqd3<$^0Zn{3Kon)3rEPD&-zbx*=+Yhi12>R7pr`aLZ!dMQHE+-FjTMr`2K$jI z##l3{jIOTdh41sc_v!NK!lQT8_{q~tI6y}irpmKVCi2k7p}k!)>a)Xf=T?%K1sJP& zhg|t?PA5wzoASfXE_VCv!a;S36Wn0^gDrEdf)RCRapbiFvDyl295h${zLkT<75F;_ zw9u^0^f|Byz18Yp5U&Bm=^0ye^`${H;qWIw^^;i zE;m-qtAN6txmtEqt-I3%JT(BoZGCX)0xRi>M0|o87>tOn{WeleF*75DJ;><{Pfi7< z073tV2qCjfSVbx)$A|tW#x0shx(wQPA<2!A+VHsw?0(0JE6*A?Q{V;jFspAOs8QAo z3NWYzg^&pw(TXAv@u4XtIwNb%j5iWuUU78gDd2PVyJ%m1l$yAvPyZkiW_SnJkdt?z zDii=A%^ti|U_wg;q2s|j#>~z<&*i`Oz6}OEFw5RuRi8^5o!Wmhmo5$#X?CxKf%t(LkQQl;gQTFusDw5$J6bWI8J^m| z@H>);(7Rt;VrnwKdn5JZ+Vp3VhNg@IA>j^p+aJv5^@~Yr$Fp@bH{Sy-31az}Pu(=Z zW-5?Ho=eZ@A7>v(Go&=$WvPPlL0_HdudGRSKNM5Gbx00Kmet5a)n3?*sb*K}?$l2j(EA`3FvUK_7)xL7ztfUI&#W_9M3k1fa zo2mUEkZjJmt**jHg;S6=mHK~Fon=>>Z5yR=_u>-Vin|4OcXx+U+}+*1xI>E*ptzR+ z#l1KbEADQS=bbelX07~$T<3kt-p3xo_V@Rn-mhq_SXO<h19O>>9LvZX|hZ+%Kw4C+uarqsKG@i%DFzHy2V_XmpqFpY@xob?(I(@5yGo8VRvW* z{Rr;k4`%eSiWM_f3yXHQzfHtfyLL&}JJapn%5|0}z`6VmpW31^%4{i^b6NCy6$}=A z9ul>(wLLr;gJFxOYF~;|aP78R{Rz3S^XT9P%Adz6wl`)SQ>2C^h8%qR|z)QL47Y_}BT zlR}|0lbLto_*n!-+G-dF;%g-kA^I5Cn8!aVZQP->?rH`)9$xa)ea#kJD;cT`+G%6l zSTnIY50z9R8^SE~e_FyG%5L)v6ihQK8K9h5yR!tGI%z`!9(paq#Y9YXTOmskQuL=y z%%F$~8r9y{1Y6TUaCqC6yEUJ+de|HG^JA&p^tWxHo&S04!eDdElqd)(Aae-10iPd}$EO?02aI#4` z@_Ji+WOr0h@ui=^(hv&Sg{=ca6I+aM8t5}X{Xm%yVy5r@Ti5z}&qsb8z7;fKc=1k1 zX@zT0KGCqS%$HbNuMqS$-e*q1EE;eDQCkral7*IKm^ahO)OcBD=mFsmn5tcR80Wn^ZBRpu>1-Bj9Or+Q1Fta1EfBodKiM4#eu5r9W) zPH*|vTi1SQOi3I4;?In)2+3U)n9qfv5#mabSd9Iv2CS05HV%PmQ*)#g#Cwb`2d0B% z%D!MmeJYAHAR?|%uXbYbY;6{E2L#|ya-|SWJv6?B(4`NsKIr&fcTQyCBgnGeteS-h#DLA6bl zqpzao$U6LMgGEx?$v^FxyCTdsa}g&Saub5l%EX-^Rgqo3fi*mM>x* znTr-5xBJb-_lUEe6JV(pATt!5nY%x zrL5v|SLsj<$f>7}RqO=SKoKr+5Xh5g!A;y0?9wm##`aEh(eqIjQPo3~At8({M+MER zPZmAtKYQQ1)om+ZrTs4Z+0Dz(%zpV5T;K9y##wNk{C=72vpd-a!L3()q;|40j>ir3 zr{KZ!v~C?nmG+ZV)lJ7|oTp+m?k9e=W|u%;CT4GUNerAVCco!Y(~WZBV_y;uUhSFN z7%3<;b(@OyF&UAH*`s1NS2aA$sc3N(OS5a`St4w48npt?*+nd(Aqw0)g$)!Jlj0{J zzz=nne8-EN)6-`!1ZeC@wzvh((@7#rW;w8R*&heUQI`iV1wj&t%8<*BpvQM@?d&uK zeyprdtO?;`OO zX>c$%zPg;U^x~jT=QpVb@)w>k+@R~qvDr7`&m zq5B7=T+%g}y#`(ce?;ricp5h|JA65lkkofribZ0^N404t>U(>nj`;C7w)KQPzhOTv z2H*Ns*6iQsLRh^|EK7Ed5ilemH)m|l;)qL6D*WRnbu0_?7x(jmGpzwmqphb$0X#>3 zfiQ{AvJlKZ^8&ZtPYOhwGOSjaa2O!Xf!gCb(DLok^ywP`Dw3 zmn%lBPn$xG_ud+Z+McFMKRx>zh?Bke8$P$azjp3sb3E(5oqtBqsaxjN&$(|Xa~JVF z|DyxR3>}hIKpqkwm|Y>NbkfT}AKGEp?=nss4jC(GW4F2@svsUdB!5FUeSL;S%vjrw zw6{Bsl7ZOa_9c2BUtQD%afztL1^roWinX%jogkuYo?aksu=9gYHZ$5z_B> zOWwV0Cr~}NT^W#*Y^upXhAokvWFa~s8VZ6h*ax@?$%{B@AzNNnWedXixwh{$w}0ce zM)ziOf5>~zVu?;3^i0(E`Wj>L!5Zy-(Vj00n|(8C1QcK50{bJ9u73ngxWZ&zQCOz5 z2BKqvXvm>Q=JseX(xIPD%}jt5KS0E@DbmVa;iR?(a*o z)nm8{`M@qz<&BH?Kz+%L8V;D6o#g_E3jMWcDxb}=2})u;yei1#{3OxBVbKJT!`Wz* z)lfhLoSkzKVUFg)SJuxcl(fb|TDm#?6uFc_Y@}sF<~fuU0T}UA%qAJjL|PKnoFdYa z6O>wUgLu3;`gGL1lys7lPtQaN>H+Uph^Jfr=@%c553@^=<%T+VkRWNLNgr+qRHw+U zv7A-05a^pw&4fV@yBTyC2u`Oouy62*93_TtCP}k2_GerI1&4-W_q4ATisJN~%o}Vs`wzfzcdtQ^GS%(RysHN6p5JNsB2ulZML@_(90mGGEe0H)o6dMx_n@m&{V zEt`_ZZfxbA5AC(nykKZ&=*pl6+3@_Ww*jI2{KA{Ze-YDtKBMpNfcYarOZW~&x)4gq zRmS+pK~V7z5)aLE++BPN*n-F$?K67~ z{ZEE#e~e74JnqdB?FwN+IDQyqJ1Mgiwt9Pi;_3IkjM*KAy!m4QVc6WE=ZJH`79idd ze=Sljis|so?)|ahu$#ymI)mjej%c2{{Etdvsrp~h4Iq_CQj?FNW_GnSv-xbElOSiG19|^Pj z|I-2#>WL`GB4c)AC>hwg%=b)%%AVs>w)h$*%Xg;*7@-*53U|4(mA|b@?c9@bu& z7*=mwyutU@pL}&SA+v(v zgX86C?Yc;m!-f|Ouy%Fq)#5y@>C+J&o%jx~H*;n!1OH%n78vRnTEN8o!oE@>E0oiS zat#kS8dQs zEy2hw8TZ>N@d#AU=&g+Z~i ziHK^JL~k>?i%;reIOJQ_Gh8 zCML9$+lOOLqB=e$Ta%;Aqk{H{T^gT1wM!s_ddc2~yzaPX6Umbce;&kEl&{7b_wWq9 zFQwp{OP_}DyAHG&mnQ0jZsbWHQ z(mgvf{VXl*VKerB=VvS%cB?SJE$L2l_eO1+Zj@)Iv%0*F$~gi4qDkKXLEHA=?4EGg z>_e**E@qU|VN1>)v-alc&9{q=%S~Z`f<3xS${~KbfTE9Ow-Oyxl$L^P=XZgIT*YYW zOwzYwcsfp(PhRtNQe>7NZxGSajXg$lm|AyZOmDf7_29;Fv zXxDwO$#v6L&!TOeuCYRQOoM1D{@`l4R&_#YW@9=^vW`%b^p|Ue0)8VCz@lP*y{U~^ z7AmVMCwtF*!-He^^QuSjv zc&tk_Ao=4g_^s#%^8!FB4A+ALcNi+A_uL^wE~F7!3J1Hz)0~4v&R~eovS|+NNtmG4 zHRpB8p~>eHCe`+qbUyj4c~7UekT*8z{5`#2gjU)be-oqt?9sS zP}&O3gq7TD#oseDH4s?EnFhnS{!M{$bi|*;=Jg~UD{Rbe@aPFG9ZI%jZI$}*NN3cA zQe~(<1qZx~z0&jYdQ1LF+4uPHL0I;O8RV+x}HiWJP*!SY z`w?>FA+^L@;%a^(VWAc8Qj#42+`wA?+4{;^-#dU5F2rf7En4$!%xV(8v43FJ!a%f2-iPBpd?(#HpSQ&qJ-gvk*dE3n!6fyEuc~(D4 z^!{-EXPQCvx8(f6xq2Oc%(mivyk0SHMYOT9FuNkG&*VdQAaDHm1a+ZiDd!}T)BDfe zPx!jkmj}tY*5%q7wx&)c|0eL~I@)yHuMZW?tn&aYU3Ib13M*USAU9r4#6HMkmhiWM zrb8mH$|$>m`}?gsAov;j?(bkEH+ycU`husj@#2DVxH>Dua097}?D?l^31H?!uB>L% z+-j?!APIpY0n~OsWSz9+$`IOVnj9qavvN$`cZ?w|@`Kx{{peje|{`hXU3o zM7pbcS{W1p1rzNvM7tYr|9rVWqkI#lTt(rlF~7=Qt9~Cb*TdO2k4);x%n{urf7lzoT3x`N$WIH z%jVg48w(IQ{A)2a{Be0^;w%X}rttu3&}vBaDx| zqSwRMk>JQQ^?jqj)O47_4;IGg;As5jNOHD$`rfDuh&cQzdpXxgGo50wiQy} zpPmF%3q^MJZX@4BR`B~xxNurOT#9&a1tkx! zaKtxLXK3vCCJo9smzR#t%6;8%xqXr~0=~pqfT9_|c5pHIp(dP@X0~QTiHIRGd_0`v zvvY@JsVFHFk>m|a2%}e4S$INCW?{P{TdrRCofSG?$6;a?R#9e|)^ta^nsDv?dDX|S zJTV*g@0YUC_xYgNYm}a!5sblvjv@s9IU(M8BW{*&%M3Se47Jf&B_^UD)3Un0FSpCH zp2y+ZsLhHOSETzebvIsLPGBg@w>SmE%Km&O{&(B3HiG{T-8!;Qo+OQ>$D8j0JHnSk zuZBa$vgPJG_n7QK*o*fALrreHv~-1;3EyV=_j02`4YI}WZh%O{3Z80LWY;XFGbx_Tv){jBFcd`~ZJp%@Y( zK%Xgfjxo;53yytcmAD4Ypann5cy>j9Pe7G%|Aw2fmdJ-vvfcKl4rJV=`*axDG8uUb z`Ue^KvP^(Ij{r$F-oNMiLI1RjQY)D_LJWBSWK4@VaR9 zdCqM6OMvWxTaAszITjMdEitmyM>^4QI~e}EBfpohTUVsPJ43yfaM zs6pw=S|vP%xcQR&PO0wW;yf6?e0x@KU)-;C*)YTmqL93J5455)eg{>f5~Ixi@;s3+ z|IIHo_#E?jtdNrUqgB%W(jK+(T_FE)>B&|N$(|lMfWMvMq|4n=_8AIi>|#8m%yZcT zEjW;bg}-r>{)Cs(G<8<*WN@M5g)n=1jW7b2kOlY$cU2r!glK3!x`_Qx-^kRC;Z#2x zM*<6hd(^IduudO`u#j-o66K!l>1VUC_yk_rNPj15A2SWOaMy+h7`k-E$c)!p%y-J* zmz%!r=H#G(wTm~_ve}sG`X5!6g@uJ_wgL|q8?H}3JIF3J|JRUrCOFZClxJLT&uRjM zg9ah*Tfrd$2_NPJI<()+5*_K#hAG0mYZB5g0?j!A8vhXHwe>`~$*Cr3KRERm8rFVRZ_!3F#h^DMvniqHdHv#gMMs)5Snkqod7k*0f za}Cu-;LKhg8orzybB|rj^5eLnEV{OnHpPXHoajH;wCo>&e^{cVL@OHRccw2P8VRXmx?(xT;*9BhSUivafvjT zwc;wb)Zt=3vI_|?=Jb>$i?QlFD?nZox`-8Kn!bd2WSy@u4)rk5&%R_D&D*&bEoe&d zu++CqH}gF>z?fv7GjD+Y;));w=R*%ieDtVp8VSj9#xiopCHPYaa^rhBZ1Vd1vPsHJ z77~^H2M0JseqhS3ztNshUb5^nL2kV(a(Uv?RHQ`0?;VJMhx#Db_i#J-wD5cqz}u z<+^NAPSAyGa%`3uy@pWJljV?Om)|>&whkVqun)~h7g{tdf;9O1=*}%AJl@a|^t_NW zj*?thDf@nKs}A9OaW{-6N>%M-;*Hi%gauEU9f#w&Xv^$qOA%8GX(Yqt+{zHMG{f%- z_=`A;3k#l;0ZnGTdLW~$2?E-2kPM?VWD#dQ=GNg6kkPi?Mu%){%c28kCIf}=mE`TO z#&kr|{o1%Eww7IkKK-r~?N21^&pJKVlp(SMHw+4^BtO_bn;-z-%T(i0h1Mao>%oVu zpzO9yzxeLa^f)=`N%X|VWk!!(Mq^j#co(QBq4v*QaNu^#{Mev@pvi`a=Nh&GO1ni& zlB$JZ4)FEqKct+F1nEwDgD25r+*LbT$|8dlrol%kBB1_-`jo=zffl9wCR<-tqH9Pb z2RQx$CvjeQ|0;-zH<%3KHQ8o>FP%FH3$Pyum0lv6+<~U3YlTfxy5x5wcc_ESY8f7- zDep2>0}qalCmApm2HkV4T!wTLN`)YpJyfueiEnTtVHXCU|FcVZx%5+6N+0ZefL3V( z;W#3Af91}(+^*wetSP!Yk|lTZy8U)F#hN|~RX0ND;Pao4LC>YV?*nJQ*!iN_?!Qm+ zS(zas1*9D!FUZfo{5PvhT0}apg=ZrC&*YYoo+{sM!|zB^?-O25N%sV#bTD?!BTJSv zDewOsB!1w;kx1JY*pr3}PVmAf*6GTwmnij=WM$@@CbOea()vnlxtg7gYge)B3}NQ+ zOiU-~8|7bZpOJ(7ANC}GzFZebsEOA<1-d0Hnqy1m#4hW@W%%` zz%*}%QaiFs2s!vOXH7iaQ~iw>KqA>Tb)aJC2=|^NzNCF3nU>v__aKzudw=9mVMRmw z#0lue>0fc_C6{5X^VEC_GOhod{f=QmJB4C9MoyjPOR9dVdi?|raTa%D=0 zr8gG-$p~D^$$4R5U~^X0GEJ!_t-DVd9>J$DjMH?WZKsNjG8du(M06ZHwC7?dhjv0b zok~YE3J=M4#GkRsk4&~!?n=;=A{WI6EX%gB%v2qWm;;IKbC?pKu7S4wA=TA6(*y}4 zpJd9^*TCos*(@7q|K9-JsqcScJ^eIkpb1f{Tt0@`-b4i)rp$gfOF0AppA%rt`pdeU z>3U)DBNBny+mjg@#hzLw3XG#IGPXp5Y*>+hMwf#M9=x;mal?`Q)N%NwNzgQEyEM%m zvi8$DnHg*5_D_tN^;i}0$K!@U<@F@FGR?K5{aXGPXNxoY`~Z{WRUXr&dNjW13 zs#~z1B@U^*L3ptF*R7}Ui zeV`?p0nsxf-ue@%18U1Gspvay4krI=K@pWT;9-5`30|n{1ubewdH!YHL&OxspqRlK zL9a|0?cZg24~ECVB=zj4&Q52APm+3M%2)3fy68<-kD3;F`t}rQ!(Yfwgs$#6IsD(o ziwl53)Z71VB*Pakx&j%MZ;k(Z#_$(qBdUO#{h??hBctMk8xfS>D;N%D;S!6XvhQ`X z29$DRcHB13-qGTfP1Ro8amW+lG)yQU3n&f28XQy!y#!7|hR|gW?E6iEHDa`cd)fB3C6nsGkM)p#&5(;*IMkE}lbgdr+mzO{N zwGW*FqkJT}>T#gwZ%k#)y3g^*u*L#c^h~#?f50-w?tS}UVf}GIjP8%2vUiN#gDiN{ zzpw^KCui8BaX&moX>2~vRe3|IZDitH=yc%qrApN+LuT7)l^CuTJ3hwnZCd@dvEg6Y z=g8R#{ptXZ7!Y>I%N=@8sop|B<8dp(*`s=#iYq~`=iI8ZjNWPg{bUuHZYgaaKK-rB zZljT3)LNiO$VIT;y{Jm=r*Ayg;9=VM-)23e9m!e#;m~>q;#5jm0nd$;{SL%b&WoKR z%R5wg8(N8fK7AX;&g!~63%^?|S&bf%!(FDuE+VZGhVAyJY}2lMCW;A*TP;M2xJWSw zF`~}`+inx>YQBB2&f#x&u-t-1-k$IJ;+`Izrk=*X?N+J-1qAo6^kdh1#_jm6z9~jY zBUBY}HKKGce(}qEAW^)0toVe?K70 zR*us5`5)8f`}>;1$-n#7=mL+ahfwM~+|wdc@5z%AW%fS`9dLThJAI0IMTPA|ZwdX_ zb)A$`_Rh}`(8AMW8RmvKWq&n4fZD%`Uk8OYw6lwV+oW}Wh6Z!F}SzHSNG5^ zcw<2~ad@Ev#7B1k5jW+7>uWtqA=IUB=RT(Ukqd8Ke!;NnS*TCui3E;9Vy)9Rj(@pE zeI@3geu5DS(i#v^BPTg@TwfRIM|UuGg`6pyVW9I#$z4A-dk9b{Snw4A*wGzS*4kJ5%qxCC4$ z0Mom#w#DHJe?m?FrxICHXhRVLEom(CKtQ0tz-LI%mt}5sl++IKCerMuF&~FOXK8G$ zHjL3R!X)tNxe}oQyfV6p`Y}pZx12tQ*ysco2Wy|KB^qe-TQ*89#Lq;?^fs;?#*IY1 zF8k6ISI?K00aIdhEnY_kg=aETZE*QGkGazIKsP`1vL5^r4Se3qW(5`=Hm>zy{Nn_d z)`{mPO!#Bl)u~sD+Ym`C!6^n)!asWH=SwWQp64WEpO`d0>NSy}=I~R;${n^Ykr|3k zw<7S4M|DMhGhPOTb-HP%gsC3M(w(6;Ik1(rF8PoonR;$`PSs^NUi^`^H$oH?+ZZn+ zQ2SuAuPW=sI<2L599(IIQqhIdL)@epsZYt{4OL|_QBwaWze@SHQZA%2Gxu*1et^@( z8e-;OQ-_`r>*oL$fn+Thfc^!<`9qb+i%*tTe5|9!zM4IoTj`YrQl6h#V9g+dxyQUH zLDSk#i=Vel&|%dzf=Vj)C^>i?L3Y{kMg@$)xx`I~6rbSGg1;G2ji&*})jrdY8-1I( zTqlrt^jS8qm2r}rVr{G}jkWV-l0w3X7dmp2LOx2n($OAvVZWU|O^c65t(<3s%s>Oh zd8A&7Y+)vSAPdDd=y_+BiLQBgHi$SfY#@KU7LKvUG~31L07j`S(R&xRcL{>nNzYK-?7O z`81bSVVbcfOzk}``MuVmg_C;~ntB#wN`mG1UQA&~BuSdgP+gbv*eal23Qt_q zef`^~rBLN62CtwKIC6~IN}>DwaH4?<=pd(D$kLf|H?bJwq+gjlAb5Q)!}Pt76+O7T zOgfQ0RW)1|y!`H7+vDG!tBqw}QL$B=-H;@RrT1@YHTuHev|Nm_N>su6^G26y7GCcZzLcBxqpL!qb)9E4k~;cp7#B>rwPDg%*O2dyD^Y5YuDmsQWTvvo`xyn9FKm^)IlJzOA|K##X$&&h&Z{EKXpsZSaQFj>OD3}CAp@g`Vyi=pPrv_ zPKbR6cicY{Hc22su+B_TNU2ZXW?8cw%kVhIzp*fJB6o~7E>R^)qr^5LnA7SIMzBwP z-lV5lz&`zgS8dR>E(azoPc4|yAQ(~AGs?f*E_i6aS;Fk#4^rykuTqa&H~4bGA_E*c z$!Nf#6+?p0B#-I8M%{5wk|S(iuDmV80o#~Bv!rki$q|{8hZ>o48$2>rCM!X54P#Qm z6m-f<=1vuiC2kMrxZFyG`exBr3>km+9qHu;I6}$AFg5hB8ha&snvJi{HNa(b08=*T zj*Tb~CKQ8|i`ff)_$K z+v!3z7J?8uCeDXnmjG#BsH6xu##D*td^gT8=^WK=Vt80S!Yh48Ep#`r3U~-HXB&wS z!}!!OLM)}Dv%B1^&UzXZ7++m-6!G9r(F|r{Y>{E4cd_QQKJ(6v10M2P+e|LpP9+2`tqS zh$T_qp(Hh_7m=H7fIV914Gd6vp%Az>i*=fe3SSNTV&vcxR-AsR^=i`A@!VA%-xOe*el|1oYC zJG8#MjAwg%y-{7+64kpxF>QMgoCGo1u7(F%SyW_^H2>h!KqNkn+m+AB(7i|G^SZFP z?ZCuIdv(hAo89*qlAdnKCfe$Uc^C_)yy0;R|0AC=W$F(vYX;P4d9kHve!(zBKA(Dk z3U;j}+YAIe8^i+6!T= zV>f}u=K0!pD@L=9y}cXL#$*a|a*HOQ-z`$a_J;S?n+(OATgRR*1d#jm1h0cs?pbIk zfrQ~*6>zZ$n4j$rmsY{dj>Wf%GsFJX;W$v{bz9e}L`VI;eeogkG5v8De7(QIh=>@y zhohxkvJkerYnw1a4LY^{uG>d8o%P=is;$TgJ;bW6q8h^f`}_Ku-`vcV@kPvv454_O zR=)_A=HJnpTlmhXFTfhVQ*J-4LFAnl5wmw>Z=3aD zGhiSF=kx#50^~&(y`og)J(hYmH5UZz!_}DEk|wyCAnIi&@Icx3c6}SwvzjUd8@>dr_8U`KN;&4H-R&j(xdkjC@^yI}q;R{eAwfc=68Jbrf!EyI_x5aw@2 zAUuA5&kdQ6B4$0?%H+WoSk`*f-yv%F{!iiOFXhQ)#2>$M$=M{D-dnlZvmbcjg9Is3 zuw2m}#!V~v`zC4_g*Ra^egS`Sd@U#*%2?yMi!ftUapBt*9nAekx;Q-SU4#WvsR8?v z`o^m`v>+xC6YoROKn5JcmN{&(YKN*@hH(gq)&3Y9**pa5@)pxcXr$U58`>(>J}YAU zA*+7kyC-(S3@*W!Z|`JHXDg+m2sA;Z6k|+C$?$~r0-v8d!R^FD!l_&~m3iGkBU zj3s^O9wY~5HF6<`L=S81CVb79Y+ufbAlr;QHgb*A4O?yiS4vt5yV^7dy{U`Kha>pq zp>#h0mj~*E7S}v50?`3!7Mpoy!83XbEs8O`Q(}>J*zAwMgYwbW-tDg@&n}w0*E&Lz zpR(?Vs_h|#Y$ag8OTVa>8mJKYgCZFkVjq^^y^FhJ2m|gW5 z(+#n-O93cQH}4#nk|eQ#$~uLpeO!~dwo`EZxC={5`;a}jbnkdW*W z@i%=~_N?*rQHfW)lIydN@|A2N_`*;T8tBlBK_Y_^e8sL$?cv>@tOmXMyhpf!4s$P6 z`x0wPGnP;4^6tda8Et(GX@PU_!E4X0_Y@ipj^fi)qxw@S>_s0eLKm;XAPcEFX48Nt zyztp?FWwjIg$ZNJFl;Bws`}a!2Z|!Ed!Gu)3IvQ)P!dw~jy92Hm;j{bbmk}J)4{l< z`ZUwfv&%$J9Oxl=>UPHS8K|4V7sf$%JF@@2#7=M`beM7ET|L&Y@dMk3&Nnw#dHdv6 zuiyW>FPRW*5JQa-N*XU`jMFx+Bv^MC!4mE~7MQ79!-~yn%U~c(-Pmzs$<;NkN^QfE z`e>oaK>q$hUw-5w#Fy88i7UNi8%&9ovZ$lnGel;c85ESR#%2Y#vJ>0WXmmEJEy*G2 zP^{`t5uMe}O88fJn8+W>Cg&6tTpn~?xPN$W9=;w?=ekAB{qC7bj4YwFiMndCEr6Hb z2ve335?2!2F)h~55-RC8XqDiWgmv-{_sme6zw zhHV1t(7svCR$T5OiQx8W8$E;lJ@%Iik4wfnSACSSr*m(Rrm5iX%W@;LeqPUdYOvl? zcJoQFmsR`SVikJ#!Q=hf0}uSQLx|Zjwz5>?YiIR3o>+<$7U#Z){$+jUpEz%9bAx&( zSzM`q4@`QF2vJR$2elk#t%#uslCg=3qhBnI9L^rRp^}MPI0^TQoHtP>{Ytvkf78<5 zo1e6B+BvEj%yUBufIf2;b2hE=27luZbt_*mL=qD=A>el%<0deq|LS!^I0i*Eh6YK{ zR+2zt#Bw9^45fxX_my<+i)bw&Xpg7B+XmH^Z=y?tPvN%Md z`cVJnl0!i(-7RwX-RE3gO*PF$-q`@bJ|qkc33PS&8$uny&**S`Y!sgZogu4fi7g06 zb~69Qd5Dyu&etm-flMXmREcOWOv0eNdS=9wvk<_(D(um(w*6$>dGo6g333)850Zm%ND+`X zUS$5A_7pG$s#aHkaX`_wZio?;DiBrGhI!smK@I5x)7yz;eA z=w-VF$H7Y!d)^CjEO`_XE)41u$ZHb4XL(#A3(st_i!3nlo^#cs@9$adt>R4AKqr4c z&dx6YP*#{0Rc2ED^~=Di!>zWr10|F!HxN3iNj$x6@1-uZI~)HB^&ur~XAH|R{ln)| zkmBqNdQ0E{c%bZ@MW^xJgQ(1%C(l!JvB9Tc#4AW z@JxXLO4`e=fF>dhg9LoiQY!mu7ke;GO34FFc2$ztDcKj&~Fdhk%m-H*bYe3Zm+oI)QJa`*2?PTXuJ%O6;4e} z>oI3N>OxDvVbKkw*R~x{wen-_g+mMZ3nie)R|ZU#nMu<{z(&PUN*ugb*kLWraidtW z#8Iujv1>JIH1=cSt^~ zXBjvOoA~)K;As|d-S_5239{S$iy>?Jz7#5}BXG$O@dM`6Y^K#NHn>0|=PF4^2M%kD zLt@azj8;N$nu(D`=iB#J&!$jm2hUyZzNsEPNSt83Gmb1jI|RHqM26Z-2zEu6un70- z9UmNVNB%VTV;5!2I?`7jcWHKxVVz6etD#FoI|70}$hK(KbSE;M{vA_m{{C!TsH?OY zp=d146taG^&d&JZ>C?!7OXH@<#NZK`a}u?69QXTdmO^c?dK=KasS`Oy5#!X}c8P+$ zlR<|KRr=h&iGn8)KfA&()nHK9rf^0Tw{x!>c;sHQesfKG-f{uElq95tB{1k`9KYe^EZ%Lq$% zRsAw)vBF+}!T5H=KhB9sxBo6oVbl&}CQ`$NPe1yVIP{cYt#4T_cffrr4vDa;^uqr& z4zl7VElm_>oV0*QG>T@q(ZdJK>ePt-b>VKF56@0&^czL@qNA+W{IiAy8u|&}`Yj)L zkqw*_hU+Sy9KPP}MMSG66A3>8q*)m`Ll=0CUpa*8PzIWLZIKmUhcjpKYDM&P3os0?@CT zi{1=te~zZyGp7zwH#nh77nWtnETQ{mrJ`addP%lB(oZ)arb-0PAf^WVF5?GCwJ-X) zCd2J6fcaC4mgIOBRyMXyB$tgb#SHpH=Oqg&wyV_2MPI!iPTigxwYGMKTXirwh2YL(K%b$``Ae))r`{mxcJrrM%cjjRp_`$9Bo$n>bRjE z;m7xf$MLFQWn*m!*K>G|o2QCicD*n7?#AYSVw2vw+d4#u+Jswq2*eE0^5hp5y7_r2 z=w}&wI##c@EioE?5{046uUI{w0;HSE*knxmTD?A{+}K4-pft2Qn{p@4GM_{N#~E?N z%cs@kVs#Jb0P=IuE$M@i-#<MTEdoBp zl`{C;AYR-YUqbe$ zgv~1{r)z=~de3HeG%I*ADL7~(x1I;otA{u4jcIUNyH-IUOR-h_f-TZ8ot&#keWUf&<0&LLn z@KhYs>Xlo37EG~WacP$6J<>B}|6U3o~=3_A*>=`l#Q07r4S_UhTbs9x!;L0OosQL^PZu9@}%0tL%ZO8OhkK5J#UYfk03SR%tyqi$mA_wS9|#C34X;2 zrCQt~MW$>TppNuMs9QBl2!Qy>jTXT;@He%;q&OOWY$KSyBznx_w@a^CP?MYwVx?NC|kLA+p`vs^RU?mcVmo9@{m6?*vpCkoqO{Oasl1<3fk!qv?oM1m01hbBgY#PNsF)BGcP~?+=5gF5WiDFTo_v_YyvJ z8nVtQT0{e-E=sosq*tlM=9utv7l9@&8yhC%cl)E6;a{4kpk8$aV{N zXt-95`IdJhdOWhHz2RdhxdvB{SN{n`U?d=(#qb>{IIYaedvF|dH|m|iZl?HLiY>hN zgZGoa=o56bkS6`f6APiIY)fBYIF$fiKfSo$+keF%Lj$5An2W9#5)rTw$t%l{82u{TW{Ivc z+BiGcGs@-V<&~4*#%b(5Kus}@dL0lk;SS@23!~3tz`@28*Bv9kL*Z-wQ23xysedQu z#`a5l-#-Zm}J6aw9W_oP-Z}CsuNo~U*w)xkJ}E^ zZ%Y$qjc^%sJZ!m?@E|YvBAhTNI|Cy#^X}M}=fg~PMxhto=t+r~#zS0Y{N4gZYHlcQ zUOXHMW_=d_&zi|oh<Gy6j9esw9C}&ug7dX0>`vkIT(&IGbhqCXeHEwsC9@l3wl0t0A zz(g+>1Dsse*<20AfJU0XE4`1gm& z@=GV4UoF8wK6K@{XzXmtlUpq5(WAn0P>%KY&b_VIypKH5r}U4c9T$&%GPajO7+?FX zXHK!@Am-ZHpA$CUk8RE_S}%1vZPL=O1k7G^ANn3bE3#!Jkdl%Lud;)m2=p9Atqwd0 zdq4dMFi(FP^4sme`pufHZt^8@7R9s|l`68gUR(6ZGyhxwJE<-5FZpgy3KkBD#rOG4 z%ICfYnB*nntuH~VUY^s4WK+M9+Lr0|TU#O75ix?$UtZG(FvRv^I>XYZ$Es2P1QT2f zCrb-D&sW;pWxyD1wl%iRyVCR<3`T;wy&I>=-#3%_|KxQV8U(DOU=B({eI8B!$@Pw( z546Qo;DN*g|H$UnmeO0SY&9a^Xe#;%LpeaOG!^(y z`dLpYo@2h2Df%*%Je>1(v;`J=Oi6%XX?3(m$bB%oE%;Uw5d6*vCO)pbN3k7A=;B2O z!rB$23GAs~Q8pwLsG&uTP9!H!Vu4%OtQsD9I3p@h*nCecq5KcVD$#sTw56^~F}F3$ z2sFI^S>e%8sQr%U;-Xre@JZ&PMDCwo44L{e+L>XmV!SmpmXsz$lrD0YY-IW^j=-qw zwepL^cd#lJ)s3xK)CxlqSGf(;ucRNu*NuKmveQlTBybzg*cuz>dqCzW;?C#v;b{X`dei&G zJg+hYw-Es$OlNw(5o%JN5afdw=HDx!ftP1qQs->7%GHV=fTyL~+|{Q@ML9v&)V4|O zY=S)#eK+wezkj)e6jQ=&a*1MMzb`exLYVSPE`<2g*n9giVZ_tcGAlxz$>ir^GZB+SpNl|M{#{1Ov0Az6!B=GBPbZzdZ?DNImt=n{Ridldgdh67(Bi3C z>rK>am7ntzDc)^JsF!Z`(<<}~I2Y;BgH7ulEoz9QZ455$f^REn-@){c+|`f!MydcXNx_Z%TX1&6hbSL-!T(#!-u!*z9=^ktjz_UoWlxJ zVGr)yx^$SRTgdpDsHH+S#WoL+p`tqq(17G!x1G|Rog#xaVcL(lqw)yz4TQ$14@nuH zHB=*6iNMEIKzxFn&WB$*r=Iq}h7mltRH=|XOdDY>KCtuWPgu_#WeVgWG2qSxI0)7k zKa{xghm^Nhu-8_haAbYVj0dVmyrrvw%mYC9x9B(UE z7UL_yHcvNdRUoX-4kMf4@`9?)jyTqqcnD-efy;`b58U2mqHx{~+0jYY+c%iLxZqBv zl#u-^6unqlCyn~ig=3lTm(GE7wB7d!*kzK^*qN}2(v}bB%k@GA6TwFbGVE!h>Evfn zo;&*YR8r&(q_~ z_1MxHibG^0Q6@d*b>yJ7I#xo!P5zJ%=)St#mQSP_(4~Hx*w+=3H|@UG#+j0JN#ZpX znm*MZUglR@_VA||2PUJ@;BJV-^9Lfjll|I~->jiyt~-@64E7g&c3FwzJ^bQc^BG@X zRd?THNEYFs$=+AXn7OWo_2FSYc+SW*u&AJ*U^?p7FeB-+8E2w;`|-(Si`SU#X=^=K-$1_j2h~{xs=$f);8#6;N0WWnC9u)8W7 znaCYXYAx33wikOFh*v7|aC6F86=D%CHVdLh??Nu#h3;_=tMQf}SNSVw<6iVSQskzm zSt+z)8X}?beo%(5Ik^DK9GR0Lq6&h}Nh<${E))o_bMoE}X5uiAJ~F1u=4x|NM`VfH zb!%Xr>g6?=7z3>d9I`k)5cA7?S?M?JKbZ8NAKuiZ36rY7zMb?L zG}0?&Zr}0pnpt)^Ht3ib82PAs$V$N>?Zl%kDhjZKgBSv#muGN+QM}x$}7=k zfk57J@72(JbtOO6z$2V9JGgylW5WOB7xxt&b$`Or_^2`4Txi~>U;I;9G_nQS2v}Ss z1i#&XFeB`YMxv()(fu-ldq6Rc@UXxv4N=fozIFM?UF_WWJ=s0#P@+_Va#_my#FAL7 z~a-_I~SLZ+~hrHl9FbJ9%c*36#kBBQmTQjqdz*qzZGQ$KFzx;75mxitbjw zsF!2^9YsfqA-d>z)0kz!1pYSXaaLB5Tvfcjq@C+$I8ElZg@C7rtQTHpKBZf@s0`Yu zDl&f>46qWdAI<1XZc(y-$+2*U^T!Qur#xqv1W_7tvw%WW8sH&Z>GS5P2nvZ=h!=e# zl*8IYp>gXNiHU1LQLZ)WbO{Y3?AXlhXz&^H{zi;A>V)vKnec0LWEsE+LoN-9b(VlQ0P?!J&d+@N@Z zc7?=pE_b&410E|~SDo@u6hSfD@!q3;eFs;MY@A$kpmT7K=eh6KQF?2J+ue-L?nY~0@Cdi_Hc(D+OrZC!^0 z+K=|X8{nO=>!J5+diXhra$gFiE#<>s_#6j;`Nk`0s=%ew+Cyw6dSM5XNY&yptG?D8K{ zfPyPiN|Spn>PLM^UcGmZx_j*WXQQyj7Qp{f?2J3JGmaHI?VW#`kjbQc7T#L$f))Me zdEawnn33kxN!H8!ey&BI(;@e74h`=BS)b{AI2~{jxl+AY! zAe#*Ly#GGWn3YWKRLz8^rf!?D7^>POgMw~npjCycqx&)~{(NY^PRJBy6G$?$>`OI# zRIlsUJ!f9`PBNA1GU3{y9L7zbOcb_mVMnYRt)%o{jjcctcfstFC=E@WR7`jQ{Kp=P zln87PQ|hp}6M{&DoKk4}(AVG|gR3Lg*QnNbqx|jukFDUJE}8cYv%RV8yb@(KQ&L2y zpFnll@uNmnb{e{hyMFS_=rQmTAR2~m9ZZqeR}m`TX_7xp@h*l3ki_5%XL28qu)SaH z-BO{AtjAmUs}QkYD>aC~!gFr#X@jr)^yMs%hc(;3IKgYUe?XjIRgbjtr(g!M|32=Np8Ca1=&jK=cy z=I~|8%8w;67I!4hL_e6+!qMeer<3PZ0@updU1r#5v8DsMPtfPN=WBjDNB46}QFO|# z9WQH&b>j67n=Zpv(|QN177ebQ%VlQ`#Nfy0CGoM~&m|e}*j2;)VNyP2f2Wis4OKXD zwG5(`Y&&*^cnL%Zrcs2BIx=tcnK&d z#Y(^>;Qnl-a@Q+=6uT!Da7zgv(+FeoxFlvNDe6>LI#be-?dO{MHb$J^SyigWkX}yk zMx@zKRxS*SuWTVQYxeTn>;kB(Jf9PRYGfV+(e)#rPKA<02_WV0Xl6Y>xjBn$a}n7; zG_*CQ0KqM3RBwf`cj5OB+B;5nnDg7)wY6-oYZ6ZbpzA}NVgD&w7zq?h{B!2K@pkaE zlI1Fw7HaP-ZQqY;BzGpg_KbcrpNF7T{^zZ47L0)@h)?ZllY8Rd%+9~pIhXmRiLSl{ z-h=Lp`?uX+1`n&#+%h$*FDPe^QZ~sY>B-iQitD1Du#miLP(DH?{i=e01Y^fJRv)o;?RNODyZI}PR0&0{z_^!Q`PT<4L|(b}YmbE^pjV6aIAdp}OX zDM~hG!#9mBc3_xP9+~aTMOd*Y5i%(`80hdbwZ8Luw`eUSjg7x>rKs~xG>%IU>ad=MJRxkjN=M|!pqYlO0Vmy{mGX_iN^*`&}?n~PM7V!&zE5jlO)bP2es;N z6Mh#F70yq+icB+ARi#cm-V#YpYWMZ*Qjwyx;ylr&C=pb|R5=mp=(4yZm0J*I=>+|3 z>j*;AwC!zov+H5GF$BA1#fNOlUOj|_A487BflTL2q1j>Lvr90B?-u;U7?#-?0#72V zd;9x$#p-^3WJOk}u=|Y1blB>VgOX{MKa~LTEi(DSOF`P2_xI%I+SV8H+-oPyBZrmi zgj38;FBC;#{Qf=0CWk5)7!4!~%Bb(_=Ho;5K@@%qzOJAsMz1hKL0*5WZ!x-}E3-#9wK}dCN%^lxYOGRc1d~VA6p4XgT0;=b)2{3bj zt5Z(16hXfhC!KW5OVsx{V%jK6YDc43d)bD8v6zHmms+zBwdFkO8L5Gy%nF!e3>MB&0&4AlxXzy$B+tH-TLoI*hta``s6wm?1}dC96WsAA&|Y??z&Gd$(EgdiP}7 zhp~236`rlrR58!L3xV*HNc7d$YV%0^nGVp-*4#H>9?`S>B|uadlvJn$S2m2)v>&dg zhst(8#NK6&-r&7na=j7!mjgg$Y-)<6vFpF6DmE?q<7WZ6=%idK-?kOU3+xnP%QHw_ z|7n5QteZ}u%oB`t?5PbhhJOn5eGRJDWqZBcel>c%3Vz|*5tS2?rBm!C$y)A0xu6Tc zq_t_Gw1g2(BiE@x4M4>@d*om1{6&?0rQ*{J`HD~;!*(%7vlWI-gPwOC*cPqd(rEW{ zd=s7gU;yI0O7TSP_!koGiIt+N$2lSn@gEgR7Qlq4Hhv@}yj1scKwOC?F)J6>B7Qa-34&(Y<3HzxdH<}^iVOaXp)H!M%8 z9D<|aefHJlt3U2Hpf&WF&LhRX5)<=RDskfvn52JXU*pa3UJyTATQF}=7pcQ8YZZvY zlgXo>oCUCS$L1Q|Ot+4@_IG>?-?F zHV^NHh?%E!F^-(XZT9nuUQMr{N?mYr4r~~0yB1h3gv}XK+9_3WwrlaJ&CNT5IO0G-bOG?6( z750Y46gbaHAu+Ma4bCs8nJvt2;-H79%>){!91)?i8at^ZEls3r$|K_xF>NH;u5(K0 zg9k)Q1GX3VhgUqWjZ5rpD4>bI{WI!NjrR)L`NQ+gF{x2M8I};@hg`kZphi+z;H@6=Up-zg-foitgv+0Wdhyc}!4q9e*IZLr=pwH<7TP~Y zV$`HL$bl)qmrXm2?9b=-H&gb8yXw#Z}S=#3X%pxP`Id%zX!fircdq{Um7YW zd!Vu)vvJVSPozXvHaPyhBFW0?{2mD5g!W$Xa&mHJ&#PA*qY@ERXW0?u&p@7k2jBYu zmuZS^4>}>)1)in+M-+j3nP97;8u}*YZKhsTE>qQqNQP~P-D*c=v+Sh7JyFodT zKNG>u=W96y7HVm?g}#{XMN`n@04M9J718th zxfR$ST1@K~#@<(d7JnY)>H;87+bdsrq)!qiHV-rdjrOHmUa*jgqh-#z|GV_E^6 zGhC0>%X2~v4UI?LNx&%$*y|$k`8JRm5uAo4=OI`6R;U(CVYH~p+G#E9+22upgh%R^ z+X{yE-cR~}E#7RBw<`GN(81@dnD!#-c%&#HP61oknF@{&5@f{u}bSd-*`6{f>2P}7Ig;&2nsNetF7-!cd%h2{T#Ja>EVq4qo@)sEOoqvgs z>$ytP67F@;ca=HZs&F=_@2JytTt3FAoy`RJ(p=0k=fC{e57+2?z75S*AADlf!A%o^Z(&St6y-5CLWSa0XS57EFy(65DkgpHn7bW(yN(QiAE zL*K%Y1JBa4C!F?gwJ4SFy zQ)~8Hgh5=T?@MbQsX=Wnh6!H3ydo1&uN#h6U5t9Ml!QOwJ}4Qu`w=4KLvYa3+^?7G zjQ~#>kb#SqJKJs7kZU_V(m1gDXPLnc0x2_AmX7!V)fxjek}Sb#{O1p~+YE+?V^Ic7 zygWhOyuIZqzP7L$KF!;DR4h55xPHhvf7*V@EM zJ|xVd;b?yUj*Pc@?-*-G>h#N{pRU0n#OiDC$ls_Yg&JyQxRJezQS6_wxH3m4|~yAVKjA4Eb}J zc6H^!$i3^f(XrX@5$zLv8v`JI7)37^pBf59$A}YQv^D?aE1(cWhV6vni=%g?Sc7z3 zI*oEG5?9cVp?^;J_POGOb_)4z0SN#h1JD{wNRV74I=sGv6L;mL>sZJ<`r-q|fWi@s z)h{5m>hJVH_V?+Rt5V!y{(MVe{w6Ih2)&qVb|WLTYUUO-FZ%x5u-6AzKbLC>Ojan2 z)m^)h7i){lEMJ|=>3|soQU)nn`CuV#Ixj8?CHE}&yZgZmxs0eRHC=e$Y}17WHS!ZK zBs}16{_C56%W`szs zjL1LWdfvF2at%a@w;eI@mrKWfU(eaT4Tw`GM^WGdMrEr|Cl_Q>JWmr7ICr7tTwe#V%8rN%;M64SEuJJs5Z;;yXoRDNdn@3`st( zJm%mS3GQ>Do(#Ic8%`Q8rG?3)*(@Iyj^>UkWgdidrLapU^rc8sSh~(Wq4!caa}_(BbjF;2Y$W=)=e{H#^w`6a72VcBQ*Jy} zyY)snR>Iyn)6keL@tph6W-CzeK1Z9`H!MYt7>`}41JhrTCgmPqcM10rNif=rbP4c{ zI(DB%ofWTW5`~t+;Ck7@#Cjs6dR88FyUh{DcL?m0-|ft#a5?sDfdw(S^1z(%S^t5r z5(0fVFj}SNnz;BNDNUgeWE;)*MQYhP1PmQ|-@_!oGRSFaWWes6i&+thA6Jy|=dM|k zW=AP5Kbn%D?v8%Q`vnXT_>pm56u3B;5(nS3X8wAB{oi1Vf^%_yM+fnrW{zWV$Z5XM zn|})WNODHyPL9)?@`nQBwwx)#E`Dwcdi$G)i=c-jIj4u)Cjh-EtM$dmN3?cEMh^Q$#tJX1oT3WC4= zoauL01!2j?O5B^%(hsmZLW@{Z>cBbT%r#K>;%jo7$(=j@dhcI{vAk8v>>%LiX$NPn z&77Y_Gm}RKB6p;XvF59ACDD&Z~2N^ikd4;5UW4@DDyK3+)&n^%8`3&$`UyBLRku(@f|6=G+deKCpYAakH_D ze!Z?!uE4(4iEv%)PU;WqI}8TA3Eob~sSYL3MYTUWJ`;kiN*C;MXhZ0oKAtciwsOxL zlbzE`mC(=0thhXkPzB9f_Wk90g$(R$J^6Hriij~E_p$yPg;a(pye$2o`fh(ca&~`~ z^pf29fK`u>T3427d*TDa)#GH6&SnK!2GqGIeg|%+0g04 zh!e8pB}oil0B)oBge_R8ml&oDpOh;wL%40sHJ5CHr}(r${f?p`kd&D>QwhtT;dH9r zcf&;(kNPNok+OU8r#rS;kxc^0qjkY(UiQ}srsVnaO_q$(23-{5&~*QFE$2V$S8vzm~?9yj&BG=1mXg0|zb=FzXIr zOszL>_2;J7y-_HqKKdfjjU@Qq?1dLDNK9Ou@Jy1Vvn_6S?Q~6t^i#%N<@F|+{y=j; z7silwQ|pn$Z&txx{gg9!hS@cM$(xs>X~T{eLTBe(lr3~1!o&D}*w8VdU64#Hxo%V+ zZ?LQuan?ItD{kZN>}off%H!@#Oif+AtGAaNc2060e+39Y)ya@s^EV8-y3ylv#w*m5 zYkKxzF=!(*nj)cK@5KFCxU6WRGh@3HVhdAkm zkFk|~>6Y=~NPloBB2!YrQl>3eK)Ukoy{w`XO~b$VM2M=Rn1L!EC1u;4h!3YjQ01F= zy|hygWk2;+?M#IgT9vtHdHL5aVciWm3gBw()4E@V-1@_a^N@7qKcDz_i$iTlIIqnK03 z@95F##2s(+@&Gf) z+42D&1V26n&-p_)A=lQ*C8m9G`v%4?63YgiPuxNOu7n9ds{8e1Nlybls0q&3X)5&k z4SG&_nG!)4h($rK1OqR7c1|mf#+{P6nV)&2ltRyk(0+$w! zn|KZG_t9RBoM*=OvMQm#bpAt(L#w0syLnBqVLDBz&r*26QXr2zPp$emO-or;6F1>b zy0ACK3GbR54oa>|*6l6RW3uG(!PEI1)p;YS!NGpL;X_;R`ku2ip+uP1%Ia>i3Ze`XC^gBP7Q3ytFfp%Q_(kIW2^Zg4v zt$U_MYsDYyUfNy+^=gMX`>=Jm05W$5?wO9J3Y_tWitU`7oKS;gdj$&6sN{5XfFJ+1 zl6VCu;oMNky5Zm-}n>}s>$T)^uw)M{pLhklFN#( zMVL0Fjp!e=2bC8Hv(4b$rA0Cd^5*>ZBj5=AzW$%|2HQ*PRrjDSn3xXA^@ zsM2ax_*irdy-)$5CYkim);p}c-G@c)whxAosocK!=3TY&0&jcHtZiWSbQ{tYL{?Z= zdCb_ou(AIc&Jja-Oaq(MAPPe=O@q?exla8yP)F;_W4^_4p`49@dr(jkw{w%42Le_- zN=NmfCPPGV3gsS9$;VDKEpBG?kIJDiLN=!KPBwS;FOAdC=luOJ%KxVYkaHyO*zUFv zqmR`44sLCf^%X;SqQme6-gkLFyuUkDiuW{!r|U+IE~+MGW>y7OrTB81=J{pL8^ky? zq{Re7juXC-KB$f4b6%^9mIb4q6M3Vwd<3^FZ7a2xfD+eF84Ox}8mJ6F(;*E-WD|bN z32ZqGBa8AkON6K}ElkM>dKe8*{2;&y@#l6p8*maDn{joS0v0L2$?KRo&3}9e)q-gbhYpA;E{B*X%9S8uf(=xe?SRBrQ-^kh-dKDN9WuNPGH4j$k1 zuR1z(h^P6??j1Ae>8(8f#VWe!ED8woN;*Df7#0cWEdB9mMqLB0_qQM!Cm2!9+ts}l zfD#f4=5I9xy-}cLCm+u5ecMuYb)Sll&S0)n-?jez7PvYckO2Lfi)&BLQJ1}R_ z?v%`>(DP%=mM)ss#0%dC{|vD*m$cX`$j2IBcfX@U+n z0^5$G_Lz;+Wh+T#Wydn#MJ!LP%j1rd3aEml3OKj87OlYyQ`qCi@2dnJ_urQ)4LK>D z%)^eoR*9ftzdqY8!!LgBa5{3Z5t6EYKW09%d{N%b7#5CgBVqk?oaW8m*tm+Gp+zR%hG)*%UQU0`^}D zWZ~=qQbJEZHoizry=m@ltIZA2|Cc>oF& zE8u*ZuixnW{{1_Ui+3Zmh#A^W8+PftD&*)qQQ6jO+x#8S;dvoSXMQR7P^X6n#YsyC zU@Edy*VNoyUUyxmZTtI(1_ZY$Xt4lIB+J?2h5ghhEOZizG#a$~-5v)CH-57L;v)}f zw8*LFI6$-N0ZT3R+?;;6fvY7bex^nPb62%!h3ryMz4HIx|EVm+O>e|Z=lO3$J&L{F z|MUQt)u3+i>67((0lV@u=F$~IenYczjrWR8u95%s3?zttW`)4r{qI=81qlz$@0NX!xl^7!A9VwPaklQqeuLL1%pGd zEEJQ0Ui{dtl~g7r@NOm17gQ7o1wZA)U0J}m?4*Vv>>AHlrMs1x>?ophC{H~hU?1GX z6*!hB2sLZ(NVT`O8D337-v*hASYIDk1`hV_w)gs;?(SQYC3g0$Z?(|#3&nBwpnRy! zM&XtcFPX9Fdwp41{~}MbHdeD_eUBF}YXpbQbD)6(FjLiqY01Z02NgGfyXRExu2u4mN@P zepK502e`uaYixycG_q(`oOM?62?$2ZrLhwb@;gCP)|QSG@{Yn=7TvZJ@S6^vE2BR> zY0ynj^|C}$JmC@(hCCmVp>XajGsf^U^D&ICYxSamO(_uEkBxBNLc24FrVATaZNjZ60pt zEv<>Kj+lJOtxBzBUPlkH8zQ(LDS8V#_zV!Bwyh4>(r&B>VLYWiNF~T)#>$Z?tT0Z} z=8-2-3@qu#7oh?vk{Jl7a0|*V>>d3mTAZZbx*svRB?o@`mW4|2^7G#v1UB5o@`sO@>KM%>F#@g<$`fld_?Ia^KUyAT9`{(ygt>)Y)>t8x8LL*ynUmR_y$0M+WVp*?QVbU2uz z(2ksg&HKX##p|?nbN-L?X{eU!u5u-Kb6Nu7Wz~QB>Adg;T-Jlhg5SMy z%`=?zbRFs;`?_yo|&qg26Lr zKlIf51Rz)>oRw>a1SzzJZ;a23EgPZe~;5oB!)r&$S*r(rPtpwH&!j*dwI zm+CiP=47$|+>K8Ic$q$ozFn4hf}?Ntu1q8N*}QL`VR9qlhUrs73=s z7b)i^{+Uci1hB14Ah{$*#dgAdxSCZ{E*87FAW+{Yyj?g-G_g>@`Qu8vr!XkyAEzI= z7dIre8F`4#nQu&A*m;2yB=`Vs=k?1PQ>2<>J1+#x>)M*VDN;xOv!K6dA2MN4A54u~ z51sW@vf_W$($?Ckm-nZV#II(K!_~>8(X7A@hiIbM_Wjq`&KgZtjj?N&NZm3or>Pl}iw$^g(Y?v9{m&s&igJ9>{P*j4yf zFWJ~W%hHXZmic)Rx9OLv@q~+|$mXq6c8*O?f70qf!U|UDx7bBP|N3<#)RijE(7i&=N@`t79F^4LEqv(&155kU*flYeo z*uKj}pIy(`ghSsI;2q!59cbm1%?OZ+OW1!#wiR!Awv4``VzY`oUsz)HTLww(Jj*p2 z_d9e1{9zfTw!9t_E~KHdg9{_46KClg7wZ|*Y%ZV^rG;)^DZ#vhSr>tfjQdC9rb$yU z%ft!dM!!!a60%Q8E+eKu!*Qp1ca%~psThh)*vKzWR>!ViFC!83wnh~2a*i`6^g255 zrvCgV9J%-HOeEkQ99VHf4=Nat4s!M3yLzCUkMx+OG3M6#AJb7dt5e;%zHDI19t*H4N zS0i5qsQetx)qX_Bkh5IpFMFCS`BQjxmmLdt&n`~8l{m#b0S(Zp7!{~>!-DDRUY7t4y8ADx#FU(Q-}EDSc&!e`iU=C$Q>DK_!7 zlwJFFV?AtJ@5X5WMV6lsik7sjJN-JMqw^)`%TPEn*8Pruh(aK51Tjlm?f<0M0rHlR zj5M=1)zMC~m)KL=JXkdz{X~?|6bgA3>$ab`(xaQ&xO5m=|G<0HTU;39CAvrgfPm#+ zukg21^YAS3#<0S8hQs4LH*7cVG&zKQ!=cvupfdRPL<~ zv=B%qi(;46IX@2i8GOJ0pL(xbmo744xUZO9Id0NAS#;wMqjeTb?&-zJ zdNiy+fD2)W#0N~EWh9Q=-6N`uAiF`5h|@t&x5bj@chZ2zUy~)H6J;gj=BH3hOUYpL zCM&osv1F|d=!^}VwQRQRT5mFKG^k&30)NcBjvsy5^qlr zr}rCSxblV!_E@Vp+T!-bzX`LydjgaL7F7}0nv@h%ti>9|vhUL}lowdymkAyDsd1E> z*IZzw0A6h=_=W%N6dI(UqYiR=!yI_LmkIKQVmeoL1w+!DH@NeD&3}O5dN2Rb^mlNf zY7^*}f4>{2bsVRlht@!dMrmqtalXMO{&vYGYz4aBSK|8_=fM~~ zW@L8(=B`JblIAJUR)H|#N6H>zTG8twVSQ_pkJ9i&mR_|9=YMqeIlbTXu-`1gZ($cJ zPph;Zh_=8Yrf8V|8wGw=w5w5UXV6*hZT;M?& zJq}Bh)me4?IK~aqx%RtY`X8;bwjVr9IX0`aa2~gWkcD`?fhT~i5@X21$V5?(gGg}u z=@5qzjaujId!wCK%-W5-wP5=h$#gkGtS|O1Ca)d6S{G z@>H2&QqVP@d=%3M8)Rtb7Zd=pap=Vm05TshpF$BSF}47eHdJisC<8D8!E#&cR62AN zHLp8K_h;0|qBJeiCdztK$SZ53S`pQ^)}<0xrzn?M3%TS`jmhmZ$sw)C(kRHrrx#kx ztiR9(imGr?KZx4BL`UR~9NY!_`#s2tEN*@*^>*%`YfC1^Th?Az`vj@T;1R7vC6K;2ASoJP zVqwA2iEI~OgkZuf4yDlLEF!~HekmRFoxTCe(jj&ihHLOz%j@TA7jTYFRQ=i$VMhV- zChCu(T0MI=-k~jASxIpZovBGM^Lf&)Sz&uO`B!>k$n!P90tL~}^59)DPiG>6DD)^w z5oLL(jcf6r{4zIGJ?8v0X09(_3ugrbLpMTKx{wGNOB~{eC6r1Q?(d6xsPSL%@|!^H z=8|8j(Xh?iDx3w3P0X(L|HT35QT%A!=;x8oeHN{2rR_&wC&9=+=_S-2vKECWxy__Yg7#QcN2-c zY^DD5`*veq^?jZ!)|7=yuAh;onEGlFdrk1bCOkj80q;X5u%rEim(&y#wkcig8rgs| z$VA}NfGg~9u;0iur%oBgLL?w%E_LH&D5 zmSVf|{$wk4VdrW#xJxSv$Xx0d6 z@F{dSw7m0IlvZ$VqElPq!O|E5`Zn*(lmb~za4GZ>|+W>d&lkLkTjMk zRe5n=(ZRsQni?wqBE+2_lY51bM!yv~e@V(9S%qvjvUY)fx;(A#LJ~guM6I=beIm3M zxUOdaz|+wKFEF-=x~A&`g)pD7*f^Gm&~K=m#^<`snK_ym53pKLN>UaVy`rQe$@}%D zF>b6wYZyTWyRws`YYykiiG@`(q9)JwG8S;N1-8S5Lo)(Xno*+CSmZy%q%FC_l=eScJfSDbuOU{NwzQDOS@ZxZ1} zWA9zF!&iL4xO-N7eXBwL438@5(X0@w4U%%L47r7YA9sH`XSCHwF}<2!56nLksQb4AvleY1Z;o{cjpyX(O1= z#qc~}q)1=-R*K+fOt^#tlKZ#c)B1PzA7RdWK*{>>Fwf8CYt*eXrT2b*-YzO!%bLK3 zg4IvL#8Y8kIl*TV=%6-_`BkXYxf*1A2C8_18*M4E4WpQfOB}7-=M$=_uJs&K>h%@# zAps80v6&HcW>3amli-z&04$J8?d+K!BSJPhU9K*;f+h?6?@Uoa8OfgvGG}aeUKo}Q zyF1>!a~rrv-y(@PEFHv=Ja1vQEG#|W^wL`3=VC&rN~5W+!I3>Tl#l$11=bMBh|Yh< zBwDbbsPmI__BU__*j4tuClT#;YRXK_@od#&zX-65K*3y^2(i|3W4 zz^;Him}fkc&_f6DBkS9m%k`g1z+=Jp8ZCiX0Fgho`Q1l5($AzU2nB;%$djDr#8F&i zpMQrg7m67!S|l2kQxgtNKt|Lw8ZaDm);bckFBRR(1H)0GR~&CH-V7fx#uG?bp-(^G z^J@WiupAb24szr4SNTQ-52IHR`DMUF=h#r-{TJwrhu61We|%oL#2xBGW=$v7=0M?= zwo!gi9?`9zSdHEO(#*h1q&(_S%s%*XTcPXqL64uh`W|TdJ|haw%jH=XNpD&}LJ*?+ zA!X8zKvZTE%u=$3ci>0_Pf2d@$0|BlG$U1ftZf;0n?yY-^-lO3F7cRg;{Z8eaP`Y< zWcTedL9NVGWzO?z=ZpDLHXlxg@7+iDbj2WFQC(Hv^Db9`3NrRZ{vBfA;u3LVgmCHb zfXW;jg5`JlhEHeL4M)G;z5Qj3kLzbme(#&m@&*3RE@Kr~< z%_2R7hc~R4y2JAuq}TmqjQ;up2XE%9Q7UP%wrv1MAycTnQ~t(B7;z#2frMhk(xiW1 zxL|K1Nf92RACGlF>`~$rd+9xlz$mtUZ3r#O8`=V@R$__WYFkp1pIUZ~qpe4+`dJBa z4s~kKEDfl&KpYJj`oMCkYSE64K(fxeFyy4WbuP!%=W9#>U}d(&t0SQx0d zwjZL(84Egw86~r!;OGbY0;17iWLVH)D!k!Wv){i*mfUiS@P0%aoeh zol(g`>u*KHs=Y@{Ra~wv1q5FJe0r;Q%$D;!sN@QP=*T4Z1T0IA3W#U9zBPD558ZPJ zcweQjCnC?mro;jTVImtLin@caL`uf@q|tO|;xq>NDpLgvR}nk z+B}wJT?tSGqtU(RRr8RLz~U!-yD0=cXPcS^ibQTXqtw+A0pkQwh9b!LGOxmJ!_RyM zMMIzG0Aq*^@kF(|oaIn!cctZPF-cZv6Rk;hY2uH+Z2|`hr}_o~f9!iSXa5SVaO-A^Y?`hyO7Cpd|lSe$TQNkm4-bK4#l6odi;D?^%h z@bBR3^f4Qh7%ADIT?1$6cJoTaW4y}r$yZ(d9iUxoC!&9$@z(9NhQ358A|cv60A2S) z-3`wTqU{B>+gE#q*CnTdtS|9}PHjz3C z6@H(8(JOV~hk}H#aB*5GE#?ZQ*7p7egeK-1**LihZ6f@&s~sSXI{f23xO|^{eiVJ= zJ>%VMw#06^B>oM(eXKf;G>tv>xfpHu3NMm15bYK5VnFCBnCx|N&eHCISH3|002g(Q zBT~lgPUD{J8Ha+hjrd=O-;dgljrXlV>HWO96D^qEU{U(B!sdpGJtPTh%wRHJvnAUu z-=3*m??_aVGoT?T3u{Cpe=d4v4?z>P{$jV2+-%X(4xOKB8aHQaTL!L7lE`NbY&uMvC^NIaxL(3c3YY4&{`9=4Ks|eX)fPjThJrxh3V?TPVOxoK&}K~} zbXQ?)*g<@VMWPosP)rEA_p$Gf-#W1F7ue4uY2ug4Lmd}Yw*Izh&AFNG+$oN|>WO#r zTQ9#rY4Vg5(ugI=@FY1@I&X=APl}O$aB;IhZD?nPD;CjvPyd%QSf5&-9(9R;} z1Cc1f+J(T{c}s+I&nblX<+(M`)Vcg`<@0lcx!#5<{A-E=3%SB**4hNVc0%5z#m_VI3Rk=M0 z_@MKDKkq--&^M{|*%yQx*hD__a~!#R4n_Uk*x2h60zS*-1ey5r?F3K>>j74q)X_I( z!IFMCzh!%<;d5Qo)B)D&WOlooeTM02rk;RvO1!0`o@^Lp2-mbCsj7q;GxJnAEwtdt zpP@SX=hjuE`~tkaBa*`OYFxh5J4v`h(qx74Yvv+~XeVXz{NkIUzCucPWNUJ{mm)T58_1FKlc-(wnFSr^H@~f+>QH`hYYgRn3XrkZk>|3D0 zXWR+EdM(A*-M*+mH%w}enX<+Wn1RwP^Gd4dR6v7G^dV-*(!y}>s^TKrslfk&BDK2d z^?6K`Y1F0vasHo70qpqSE3nO+@(j1M9$RMv?DJf#vJRZRg_86j`_RT6#e_(5eHV)R z^q1hss{WLZb+$ecq2i}SaK0XwJmw1%22XIoH(|GH7x&O3t^ydm1yWxf!$>_SOT-PG zwoQiW`)qI4qm2F+tjEj#;o9%*+}4yXDL18ctU`ENxlloU9DxSqlvPXgDgKiUe5x z`}!_)!pqOwp0)q41wcjgtl?}CB@6tjsX1-lTzD4^mK@btK^WXr2Rz}y2cOWv+wb3o zpl))%0PkDO4oUFqu|h5sQ$E1*A;~G=f7{nf$HKHDN40#uHxmv{E5(!W+tA;>9#QJU z2r|LOqZd+?{Uq{CfOVgU*iS?+8{nQFRk4&`fDYmRp0-x^4QGK|TDlbdTPPHK?1fe> z7l2cCMgs}jJ0+l==4O#y+NuZQC(j^z!TG(xV6qY$yU**WvR8hjhQim&ZOC4QwryYNBlV559|I6}4 z1}l&dJg}&sQUp%-ntsKG1WYbwIr{TsQwS{o%r)3)(8Y+829OHEUIAtn&gXw~*ISNn zd=)meH8zo&Cqld6i%JxaoBf}XzwY{SQr_5zLaVgv1N-IHbm~I zZ|FL9Rug}L2;*nBxj>OXzFoBWR11qL?ZNrBGtzJ8UDqvWTIJM-V&E};Yv~Cadg~_O z6_nqn>wSAz@?Vv!C+KAXQ&Cq3c2@uM38T}Pf-V5E1$3F}=5;U($*EI|X|a%D(R)CM zQfL_W(4>?jLuvoY4o!SFg`>9HR&G9QMxU%$(_Sf z*;B>-WE}?1=R6_(IHHpRgFazUln z$f1}Y+h3w_u~k<)S59+}=b-KH+uPflUpmb`7u*VY*;|$-bCbe>+lHJsO70MzQh3ZZ%Eas|t;$*H2j@uX8UlgYxtN{MtO+#bAee0+RcUH90U^?DZU z`0LqnP5Z8&R3kJdFb%S}aT0)AyfNpAt3v@_ii`QJb{hDRzpc7v*JUfd_#11tjz?`+ z`(A_9a-3LLs8=W`&QVW76aij^!R(57$ddHOYzQ~h5+!JWS7Sm#+^_&59x_b1Jx(x1 z-Io;^o0oUNkikMC3_9gSaPTBV(2!%;GprH;UY$T1&Y?^ZgXeyH=Cpb1Z@6i@BJCQ; zkGs22z!-(yaNSn|cjWFBU{`11LickrR2I)4KtqWKDJH-dcjkKf&;^1D@h`Zzuy3T;DXCze>S@Ze9lr_`d=ChqeUam}Rw8c5wQAnE!oExywx14{LA^$9YdYXjT zx4&);Ai})z zUXo7F$pS}Q1U1yw_OIjZvHXtz>zD9hBXSoPhFx4HH>E!F z9}h0j7#TM0-_#gdxJ;ADPox=}{Hn-tb-dkZbEfqY5(y>=^?Vr&Ws&hgqI#TJO@e4APilC!^D-fykSO2xx<-G3 zJ>v^GN8vKmnR_*+$qFH@oWOYKBwg4)q(kDUnuQtfhAS&KUU%q@YLKFJd2OB^2vy*) ze0;xbP%Rl~!6_b(Wx)1;o<6^AVFy%wyns3^6PP^K=X zE~SSQL&Y@{r!5U7i!QiOV9F;}0foIsMIsC1ldaX{7F`P-|S z^#Of+G9$r(e4T#pXzMu_Zo-&4=OCBz;}3?uqT^H=*bStJZ|?3M3lQ-{LdS1UXnFe5 zKOkD1-6S!)m|Jy*I^47A%BY>ck)N`sb3>qYn4N`46^iFY9P)WH^=b&Q{#Y~=w@c+O zQ45S!i5v($0=&8bo;PX;ga<_^x`37)2oXcY2lQYu>_`6=(7EfXi&-A@ln4M6_V%W$#@CKB}%{_iTQsI z4v)!MAn@je(%Y;^MjvD@SPHj|uWjLKfzcfM@>0q#{n^0*se+az7*;VvuozbQa1hN3 zOZePIR1hFYC!%vFOeIJty^=~&$>7P|+uAz(53sNNPx$^`U8PV=;PZPM-B|Nl6;RZN zpgq5U^Y03J5uKkN)y>@V24?^Wy(Uy}=~9^zv{(8%wF8D!Nvi~$NF`=aYd1tM;nTv0 zUD_l86F3!Hkr)hk(=RCTC~6WK(s9{RdQb=<-ch8Nj7T8;H<>)PJbmT@rjE?%&dlko z*^}@t`YGxd!Xq%I?--D^4C;*eGYk3rCxdpp8YA#IKM5pmYw3h)%qU56Eid2=+sqB>jGITa@Hlcf{thuSV9sTmBQG& zlept3TyGIrqR=jjj!-O2(&%QHDlBbu&d`lWp5bKLj2Y(pdrKo=W1)eoIsRG%zj=|a zun|sb<8dWmzkbZZ2Qc4_!B=v5%ot3t?%sa%>Tvnhwr9QfLofq8Lyk*x?adykt*_de zm7z6i6=&OX*SD`_<29NjStA_0jGodfA0xa74g!QTF1)b|f^4C!rI`vgs#na#C81`* z)K*ST3s0Y2=A49wq&JJ7tfMB_OKM|3@=|tY$x^}$)2yUn37lStA_jVPl-!wCEkt58BO(X$<%1T!+P{T-b zatLf~ZJn1)=?>XE0!RsQjBx+h>2#tLN6DYDgIP14#VM0qE}8<6~@K13laCY(Qi zOcG^oz>_$LL;5Z>DHda9HF>;(4Tgh*ZbW-~2T7EhL_-;i$T;}fxwT0Q&&8TqmLw&yYLN{xg>IR6AIO{Yyu%R3SfN{N!^gH}tiv*7yqw4Ch7j3D! zx%iYWdRf8lS2)1z(#ODmaOV=)33DOJgf|L2FPWlz_hRwF?Ro#ozhJ4^h3Lx{7jMqN zbyiVJiDB@~?*xZu!PTz-t7*WTr!a9-oR4F78MVdhy&%ULAOT22=eoul1xi z5Ie(NubAxMIU82EdsPyRjt6ttob~Lde%!wOmgSOdh<{c^xV~!z3O2`1Zd2H5qDSj2 ztSc}IejB2uSj-mBCoeVPK{WzdA+wqlQSf2__qZ`y%~!vO;b;_AX8dZ z$bR3@RhQ#GXNHPqhumK;Mg+`_cqG`ktOLy;ZW^oB|Q;S1nS~hGt1iFT-NSZ-4VLE>ezD0+E$d{;d2Gu!(yqc zCiij!#;gd*Q;j7~?bRA}R1?iZ@(zaldVWELN z)Br)k%5;hn0i~jJ3=KSY8KspyMAq%rVh;{wSeYMF8tZ|HT^}G(olylmD{h}LAL-rv zIWhLKz&9YY0vQ*mIosV&-F=v}B(=`XY=CA^Keq=P44pniO0!;{5)tAhgtTDm%fF|? z(6bR9vm{k>9xvR&;6!Fi9u!C`vXvGI8M6VXspfN9XYRyuwdj%*lREuw2w}`H><-pZ z8PsrFhx>In2vgLBi^r!~ABUotTvtvrmR`fYOc#Ga(m56LW}e|bW8MPQ^vN5v9K`%} z@n}@ikikHp3GMJY9|@GSxAlVyE-ap8UA42`{`-aS`g$iLw}3FoJZokH{k}C7x=IZS zP2Cmgmon|BmrX1iDI%8_G@+HX*)O)H{Acglo0`FuE>=6HV<3cUb`3Yd>uC=hK%AGF z*=7|Ld4z;41c6q|fw^D~RTNzU&Eo4=>?lDw%&%F-*Vorjr=NvFz+qV;zU%aVhdJ|& zM}&k4A+_on5Yuz-0a2|-npcf(;IG=hdh*w$atG}08d6>GWXo(=kJK{8$LQuY>6a)Y zA66HYl(Q^q^yZwn2}253Y>Ed~vNaoj4jL-)px*FH+K3b8u;k4i=jP@nmm>hbs-?5g z3DZee-lMm-EmM{}z@}0G=n_TJC?7Ak$>mjn$y-uVQcT%&^t;S|#4nirws#D7JS}R~ z>P2Q};+ost-^Fs|O7fPLWjzj^=SNv>J%_w6s*oh+{fo|x8JL|#^*IU_V#?$DgQPhG zIk960I50#!PC#tpYIUHgqUih5>0bL@_g2G_h zlwyBv27cUuQI*w{{BR8qC;5A~wy|ay;E?gXedqVfJ%O#gJ-YZp+1`RqACK2Rs~ zl#6kO#Y6ZTl1k@6MzfZwSv}NGl|^|dt4itHWO}-B1o8SMN+zVKao*_Q!n#D zq#h^hVDs5y9V9ZZvFE)cce`2$7*~!^`T%^Hq2bixQC zi|1$(EWICzABIxxyCq8(Xk%#7=%@%H)UA5`l+=*nG6;m7UbiRWYxESVDD7|%#v)Rm z9e?n*EWR6T7<@8*uNE9thtMHP*!@*%4I$#jH^Xy%DGvKbjnl{NjN^Q9Bhd zEM63^4(@4ajl0aIpUB>FvHEg66+l|xaF6bLm%qJj$bQ#!&wVBo8V;Bj*|kHuGn#il}f$YQ0U z;zT7FsmerF631vIl7)1O?s)DWaaa|ujMy|nuOmz}@FPA~+vf9%pfU=0h+)#d{+TQz zEXtG{5UL`$=;ML*Utww^i*qTWY$bxK&5AvJc}eN8LiPiDdj;&bIwmf6h_>w?J3}O^ zN7sZ3=#+Ty<6@1kyZguHKHhfO1o%kfO=KuRH7VWn@-U)5FuAKZ^yoxov%vC;_ou2X z^N#51<8nug!9^WEcQQhae%f+c00q(2^`~zV&bTC{;f{?7%2qEw`YgDif+X$8rx8iVJxTeZ0DDF8Ij(ysLi~6seab4EyOM zMi?fhtShifD1LA}x&|gCZbTk72f$H@!6dABa(NWhqkK~c3QV)(O}=pa)~3Yj1Ilc- zKW5by)BdS!$PL?L{ucttchxu6TD=Njr|RK*I{M)~*$Tf}eFd~3`Rglsw2|XAU1kkd z2-Sj=Mb!e8zSq|`11RPmgdhY3er)aWxmQpTVMUGA2IAgto@|2N#BmZRyrgs*Xeu(j zv{9qXau;Ay2VR_4c9WDU>-SgzCPW6UBZnjH0dgZYte=b4mVr_ay-wEIT?*>*TJ=as zE0uM0@Js~DrrAyxJbQzES}F+j{rQkd zUhy}h*H7=2wv<(!!>yX@ih`(nA&@IGyI_HT-V0LW$jo~CE$;^%fUIE>P?Wf^N-Cy+ z)Di?cW*ONG{EhJd*&L9NIE{m_*dq+&@>p#qxdqT748+f%M;_Ygvf{lD+G-DXWu@J< zaBOI$#A#cRDRFqJaZ;ZndLH^Egpw3*UXY0iFP<-+A>rM@x_S$A2|yB#1d+f)2hBrS z&PS_cJb2IGdte4m?IpF$`f4IrWsM>?dhgH;3vnTo)brR4j!F=3>0sA__q`Rp z(BCS}2``1$Zv1GgEw8VhQ-hQhY|wdz>9Ht=WZ8Vbo$IS&k`Fw+k*nk!xKl%&2(r=- zENJ$+~Spwbco7sIG$MaYddy8&Ft@lYcvOmQ(UY4o&Ir@{BJ3OQ_O>Ewpy=Bb$+2Pa2I zsks#vucSR?pWFlPIxq~3s3NJQR65Q2+mADoVO2T|2rH4&;szPvD5@&L6Zx?YR{m{~ zI72nshKhB|TDsx+b}8%_=&`Xe0LKSb|0^oK%2oW&;q3$w<{JR4^YC-;z5Nc>ub!7@9392nqU0(hDb1hUK1 z8H#`gM-GD{P_A5@oCXiZ61?tCBM-*Le4qBwfCUK{{>#S>k1IjGZoXIv@`uNV4*y%; zcl`opR=g0Z;0d+_fun%VRieUuLUNtj4n=lxW&E;^@#@sKCTgkXVEc-(djc*XgU7_h zqy!?zAeSr)C1t&BRv^JmiIh}8=c~^Of_Pp_b~jtH2Z_c zgVOgZUMUq)nX2hnb8MAO<#V&WU*9_TJ!g;6u{*AV8wh8zrx=|`(j9W1?LN%A;+M|1 zUOB_G1Z0pB#~g~lKh%6yH?1~css|~w7q%O3d~R{Vz_%5GA#UoZrsSzq+Do)ec_5Lj z`W;x47k{m=r~^Oy=ta|Ayw`zWjx6_y>2@u$B0%4uv6(XWaXPPdTHs#GK;XNqdtgRj zWoG@w=$&3?C#ao8?q~pQMuyVSLxHcE~*3SL@015O9*f+5*e#FHFFUj zM)3CX3tNp_wV8-Jurln{Jhk|Tf6l0t_-1@37t^A!!msxk8jz(s->jAe3XyQzevf+> zGI{-Aw~OS>bbNlh$l^k(yHq(+v+DEKvpm1NIPXKGzIp9=`}5!+(9h&$|0I$^mC5vV zib51V$DEq(`%I>HdAKsBg!^tT|CDrdEI(6~9F;oldG};Trd&s+LiL6O*yIXsIPX-g zz@uPFq(=0h;nU*Zi`E)51{*K58y&%YARP)bmIM@ekh$;p^Z1yG*zXz~g=ouylP&BF zDG^g=tPIDEkt0aO5`he_3+ntBiCst9)Nqz7XXZJ^pifad^)2o5(BtgU+x$~lV={ha zl2&_zdW{=(LQJKD_$wYrM*U{*G!}LYV~E)p08MhZ?46JPsD}@eI^|~4Q{||mKdk6u3CK%Mp%X22oMRHD#U9C@(h7>OP*Zf~UG=)A4DDlr>~~7tWmL z&SCS?EBpL^Er1l9q~sW&6u)`;XR^qC^!M+UDcX$1--`=pCzhh!E0^~dw`2+<8=sgD zLy%=#d;6IiEa!b5ZSVx_Xm0Yx83p@bL0X8he){lF4PSfW*U&-t=-uY&)(T3_mGBr| z9a4YJaIoQByEFkBD6767thO3%bt@kIRqZ9MpQ|^SPdbmZiL(x?zN=@hRSXyB1c)!d zM{C3b*td)_wiJ!m6Y!-H6BemSC%b0OmIK8kg5UcolKAs!jD9iIzJ1D*|M%!UL8$UL zaNWz-ua?luBr61qJw<|AMfNO+XkIsZpzOZj%2Y=8G1AE_0*PI0?j9)X+uH!11>i=s z4Uc9(SQdBu+2gCNgF^~1Vgasi*v)uL6Ffq%&rCE}Zy5mx^#JM;msrkS1^RO;TF6m0 zs)aZ-ukr8Ml+N>}kZM9^)4#t1 z7gz3zAi}c)H=9&rZLXWYuzAPBrG^8MC>zjcZ^0a>a*yu4faljq;B6@~dJf%@vZ5BYuxDE%6`CX&4C**!hQv~iAY|pmUoy@lv$ldKO#b(RDHExme;nQ{ z#PW~<1UfxpRhh#R*_hzsH>T<8Zb=H=- z8|c!n*94aaWB_!UbvNg?CQbb0AdJ*HtCDDb%BYmd9hbuF!DMUZiP(&F8hKSBK~E`M zD4>2gIXe$MKjR(z%Pc7|;mt#i8Oe={V|jh`0mvIRqJ*>iE=z_E_X}%|6|3~cR{L;~C0>y13-}FmO--qhbQD_u^T)qC?9_xtE!Gbb5MuYx%ef0BjKl zT!WvaAW)s00BTl8S68u0%+>$o5`>ONT}7wxLxH{Te$B^pkQX$50V)O=oF5YM90Xt$ zMys1!CzCSwXjxNpRAFE=3p#AL56Y8-tLOI}UbomldSgG}_mej9lUoFMobh2;6mCJD zqtjC~6k`5E#m~Fl=0=v|6ksO$-0^d7^XT-xfLF$Ker>C)FI5J#{Jhd)U*jvONo!bj z1-NVrX5LL>RUxUeUiif;&mLj_US9pzr;LtDi0eHz6<}TB@e?A`L?>VQKKhtyPmU4$ z4)}5&;q*UIro^~>tn9vh+wnX3(xvB<;4RaQX7Lu3NXiOIGJ-P`(NFhv|BN)~`-B5( z&5W&bYTCb|)RG!i82-idzS)u*I=YRSWM;&(N1wl!7f$EL-?uuvQnt4RynBg^aO-M3 z4rQUI>jq04boGVC-gNRAZ2~PA=BVZb>+6Sod$Ly@*9l#H1UR|c0l17D9^yQQ6TT3; zEzwKc;<=DCI@S(*ENNjXm8`HXZDal@^j3r}lpf8@@Q+w}bn&mlP6%z1NuDb9APN2trMjM7=xz>g?G{`z%eIqTWohNlzZjKMK9g0uk61ZfsN4vT{hP>Dmj!QI*RwpZwi(`WlT~i*Wcq$8uL)1>W}ivNJhS4M2;oKqv zye|zYmp(C!WE|Si&o+88UA3&O1`SOGe^*Z#6Vpsu|Cj6GI@ysgD-Z#eCfGV9A_Y4n zVs)hoS#=|`wpo6~q*Jf=pERI++y;R}1c^)?ULO@TJY2>Kpnm2qcaDZpc27Ps44mEl z%`v&kK*NF5h;R^bYLhEMi%=WphyUIdjT7* zy-CvVIRv28<>gq&r644)B4Od|M@c$#dTwGEB(raNw zV8-dW_-Bxm6XDW@J05a`Znr>Tv$8Emy#U0+)(q?fJJ>kdZ+UihgiI^X9E8>RkA zRKrRH8*?_!=uI2eO%8WNf$MY`%mDnzv2>FR>5|TWbeSvb{?~v9i?QU@%#J!-0t>J zHj_rD9(b4Qm#OMAF~8J7 zed*essz1K(sqvu$LDcPb41OgJ2$V|>H&F|LR=_m+ERpkY5elM zZl*ujycgp(t|Z7|Uv6i@4o4tybiIplujwq;<3JlycE;)6o8s+4K2d5?HutBJS>4i28oCQH#Id&p?NXa_Q>^{Q`FNU5A%sjiu_FX9h z$v}(OlN5@Tc^zvf%tu@9I7`*6sAaU5+hdzMOP`#kO)mjFL8tw6qcv51toRqunoc5 z5_+o5hzqor6D6ZSY_$HKQ5Rpghy9^r;NJa!UCn1uqLB_s`j4%>udmKP0HOD!@I0hM z&P6-$<1vo2g`jyVcHgW}79>YX>|n6{X8EQCm^QN){zz|wAR_zuGRq))pPo!4buPBpF2ktbaB!=g@{4JfrnXSV&5mhg5CGjl9C8| z?3m~ZZtGtXi`0~GsS+@5b`+H|-&`ub1rH#e45<(Sw&DL4#yoHnxSlSq{34h^o>$xL zrsOUS1X zjQn-=h-YW(?0AHKQjs8Um#(CeJ_=$_QiqY7Y^5s584BCh&saB|1>laQCDqVG3h4;4 zIpBEpyv}w5(ncWd(}}RTwbhEO$+v7y#`qkafiJHJ&+1_6sPVgjT}{6;;u@EC2b02A z4ABNH`i|R)ufErV_0LPh?~y(RJ0?0(L-q*?#0qD2Tc+%|O}kNewzeru=DN9gECNDD z`y)JFT_o?nBMm;@PIUYInO_S4T^HrVMhNONAo&jEr*9t=Ws{_ z%JW&lXY5QZlKLi;-*l0A=?d~Z8f?~En;flJMBn#jnf zuHC>SHz)LoPP6y*b6?2$?J4!lcG8r$I#&i6@n(>`%&xWs+w#{eZ}dSVFlm2$2)5hz zjsRWj+RjeVYPYYPL79`kdfAzh4nhwixiivrPy7x4@!kxCr@p+G-W3B4NDMR9V^InR3-*E2(yj9ATER8!%kxUyeJSU>NOsF<@a7Q?l%x z3$V5fTO^6*#I^FhCG?at@X=)L99-5gaI0-g&|#<<)kzBY$TBD(G_6qxWxhEEl4ABB zDrhiZttA@pA|%jdm{M`IL27)9NZT1DtGBtkL^rC>`J3-;tG`(bP2GBDzHIxdzc`uM zdPynC=0bK7@m+M8B!jl@qBcaB%8H6KWm-v!%j}uX($@ZBaXk##6m6Kmaa-G0$M+uk z5X)JALI*Ls1qOq)fQzLDH~l)Sf=Rv+RmO%6Tf|H^?xg1kqn)@}T;ZFcjtQop1Dehz zdg>-bnz)3LhCP*Z3&tcAN$K*mrV~KK0f$O909KdGeTFI}oetpk0*gH)(#F53$)b_& za}g8}~2I2xcp(657n3j?pKGW(lX0+Ee>lH77m(kfC}Z;YVp-Tt(<5&bCt()ATm zI^&f?2w`(lIZpDX_Nz1`G)s(t&gCHwEmWjcQEYs%&`p0Xz8PtGn{x;c>P zz`uVqG3;iIQs{ks&eQV_gms5&ufN~jzGK4u*X4Ya zf%lzpDF&g9vwaO0rL&`B@9-{EBw*Z_HYoC{)~l#rzd;8!Xo`)~YU1oGH;#w@z43PAzgbKu0z; z3?%*&pf!swC-C0e;)Z4LJbZDkob`y(Q3}Gpuq&Ru`!`tPO?+E555g?2`ez!SCaTm$ zPjQ~9SKfF#``7n($2_&4G+`d4eA|IKteh9S#?ZPZQbIjn&&$)adx{oOAAD$%5)8U> zOYTdW$u8{n#+CfR6qwR&2bJM+Rgmj?K@XH%7nBzK5Eu;vA6L1imv$jqy2gUi4h;fX z8nPH|+=Xq^vCUqg@x9U{R4Nu_7;9@(YMqU1)~e23~i2VH@)D&%Tl1|XIwIJYYYlD#9#ZbKxUN<0k0ge^v-D6XjhUH?+_RrEz zbBZM4v!ZnX^Sj2q>g;#b-G3ArTS*QcmGUHg#C4V^AP`j_~ahKX&)2J z@c*#g`pO;_F!Wy}$uSb3;6UnVDfAQ$;M`8-DGL6c9V5QI9`pmUbjE8^IAcYJNQ7lo z8`RIi)@LPXu~_G^9Gdwuo(Gixg$JN5Humfu4jdt?_fOSJ%|#7XNdB*^{8t6q`xWa~ z$)k%k@%e*!Ri>A-@sT9|{=NM7?~H{uIvyV2gOSYSR7V|AWcbfUrT*Ia%$ywFg$B=k9{ZatFpHy2%B&n!YS|@ z6?(7u{E9-ve^>+Rytyj&~pVJA`i6zUa zqhC_P6qr0VeIM2b_GVi~Vu$29(xd;jn^ptb(s^s*CKf zM)@V;%FeE?(`RQq%6H>RNiZU2h%)D9nE@DPNY^z->xb(n_imX9nz#6jIU)A-V;>*j zKo5oy3a+g|2D#w4LQ^&$M4^=2q$H*7X$WuX1@Jc<@A?@kcqcrh>0gRx*=KLEMPv7o5%ghu+`l!qL=-+&auSU9H#+~FC0sF;~5d6I|D4W zQxhta!_3=$uAcemd#&O(0x&hr3!jGs_f4_oxrZiKl4R7K`+348>$-~$4Oe%SLKz2x zZi8+jm6F;&E11jQs(B;W!BkxWPy(%Y#|^~)`W^1%WXS$K9DUsAzDO6L3_>Amb?86l ze5A%Wg>Pn?BUY~^c64h>*XB+aGLSH7$Ct9!6TJV@?fY&|44V&xN?&xe2p4MqJzl4z z6oqSPIHFGd{Tq)h0j!vsLi+cpm!8m{kIa$E*5b``jPM1nW67tko8R{v{~c|I;2veL zWDH^{=c^Lx;-xcYeB|}5jpGs&!M)2oMQ#Cqxpa%;2wKFbp+FL5_}0{N36;Xw-3MY{&ju2nk!kEyfZin9y0bmQ*s4vjm(-8HydfZ)O1 z-QC@t#t8(M-~oaM2@o6_cW3&$cV?~m1+4Wp=bWlt&)(%7`DWaG?$nokQ)l`P7xb$3 z&beTw%(1o`we<$|-*F5Bp+Wf4Fo~?dekmX=HODOs9)aA-tvE9wI(E87dCr$0`(Ful z-90b&hW@Yr)?ZI&gCqqCF8kkyKO*|yyx#eOZu;L1A%{&*F3_>Qp@~A*=xqP`7R$Tu zVRRo$X7jkevXs8K)=dW&uDd(WA<1u}%O}C_fg*LEsQ-Cs>=(Y9>bc493wJ_Pzh8%p z5NdqTS-NVW#_qOfavnZq(re4AIh(s^*2n)f+dU-|lV8ww%gj9yJGc}XY9XW9$eIj- zJth3qnl_L#C!D`X`tx^v7eb3|^!UWRy+Lq12^rmoJW;Q8Ewul}Z+3#}TP!|gfWr13 zM4#)PzHblLbv`2O;LX_GaL^eUE#?T4Z7w#VIq*2&ZSj3Zi4m!sezxS+uJ30Gr^QXZ z8J4AcDj_S6#uQVStp16RrG)ugjdrsKXz&#2D}jilLD}Y3oA>-VBpq18eECn|xn8^K z^V+hgWJo5yw5#f#?>~M7Z#X$`-=y!8K_YC0WCx?mBsg9H-yC2VAyr}x_!O5y7<<#Z z{jmDml)dH`Zrk$JbKnG9UBoSIFe1)R%g~&?iWi-gztCCGwkLE%__EwZ-~2P+5|Jx_ zJbW+{5}cm68=VHl0~EuGtPKYXL!=GpnN720lSt={2wq$f4FGDl#>K6i$ad`ech2CH z>osRfj{~hKzVxQ?-%QCh(Cs}D+F}xP=p46)nfS?Cy^0~9r#z)eFeMi$akTwBjmWf3 z+xcV`P90bWrnsWmGM3-ZcGpqK>i`MMNcP)R9_I&g#!hZ#R~qYlZolRokquEm@G%<~ z<6MAc*jOFSjU~#o2me|C^NMW1n`pI@za#yU*5};B^vUJE1#L`MMp*sKH0#xCJrIPU zCrpY8*I4T^`vww>ED=y#-J&)Jm{|9V)z$y+S>BTMp@E`hmaqebJqnzWwF9Ttonb+ zC2dOirS0po+1^B+y7FXyYW{RmWe+3nYwlor-q#<|_3vx(hglFVP<|x%crCiRct7hm zm&^j$zxW?^_mB8>G`KX0e6f{{;FnCr)br;aX`gcO(%A%@94YG+ zM?Ox@=7?>7x1;H<+AKXe+iNv-_l~#=?soLQ@L^CCIbRIYRHhNhF<8gT!a!yN!xBY< zX5y)|Td~%WFqhqb*}A*C{U18| zH>fs|@7toxd@OCu>guXhP*Bl&$JW8+q;}d!2JM#3_rp3-40esabCFxYNeC>l0@;rV zoV7sTWC=c8O4kK%J|7$iBhr>#WtXyGEyFWUrkVhmqdKnC*S7*|uA0g!zQ^`Z%B0aM z;ME@n-jESe6Q=t+$>TZpPH%k`Rlg==v-FC2MjW=>RW>rT^l6?U5*IF-snLTJl6w}+5^Ma)=bHEKK;I~cKL${#kq(3 z^KOepfA8QkBQYi53Uw&yhZ@w`cV+Ze`V4tC^$bsoeLaB>l~*Sq7lQDJ8pCj%Ol;-F zEk<*gHs$Xr8V5extX99_H(kUv&=5Ks?Gb;O!f4M1NJXDew%+T+mx=XN;-?`HKNV9> zc_imD*g`82yA?t4X{zWDxm127_B4KKh*+|JTOBO>S{e7G$lhxT$HrUu39s71_iNvS zWA4G97ei8=vR6MWuY^*UBPQ``G}LzPfxhi)w_WvHadxRe!~4wh!(v>;vyOlp{fWu26< za;+7?+*9@sb(_sV(bdmq@IKzQ?m4C!uqY9YSrd$ZLi9fFSf zJrlN>CIiUk%SXAOp`^fDi^|e5(8YVQ*Vd0|$jKx<|JKy|Lm@x>j$h})&jdL{MY{HP z+9W@EX)-YM8}OKxbJ%3a=8rYU(G`K%3zFDVs~F7`*ZVr;SP~_!jnL{c^LDixx1f>< z(!E7YB8!|VpgTkHo*xI`FOH^j*IT-+oM@`xlrkeAFCITDGVTD)tnFcpndl)?kn|>q ztD|bYZ2hcn{?^0MWi}o%{)OmVC+u&*!t9T6MIXNw%akNyRuxPK% zFZ*bDI9h8E!r%Hz-QQz)zd#m*8ut&*%#gnYHl}bsdsv~R_mKa8?d+r7bzZ_sorhC^ z-+>Y01jGv@V}i*Ld0-&jkm%4`bP>)H8cJ=NKy3?}xWOK0vUb(SZ?_=f=BilUKA8i; zO)hjZnff?}wUr%%f6*AzoeI7E*_!Qf(WjWfT3c&8$*6XJ{0>y6_b@Z3-_mERkX8!O zDV?lE3I!Nv+E8JY)}LH=v6O2N$M$LOuJp}xp{F|hl5%A71|;9xTnh`03WW(scKgX1 zS~rvUrA_a~A>GEu2g;cwfvO8096uMY9T%bT>9l3!5Go16(z4%VAwxn65_W755a zLHY7{=Nb;6GVbSrUWJvaPHJbMOh=bMI$_2}?{qdxg-NoTQdswy=NlOdX-3z!TX6m% z&eArpiO)B_)R)PYH*Q(n>G`(AQfnq*ewfLG*|1q>z`^U0=LCn0xmFmr%=qf|gZDS| zaXD^bKj5YBr#Xd+Sg6npbn#~HT>zQ}VsffDF+MT3+<`WVZEym^AF$e#EVd`CokJrU zE^ohmsN%Vf+dFKJ#mQY)K9b&r?nBAu&U#7WnksWgV^had>%!{O#d@RCi}r^)yCX%< z_4B6Qf?`Ryqyn6x&hD3%&uD*N791=pa3RX`8AzoRSZ||TfL2ps$!FN4XGz{!989cTBA3<&KJn=tRfyAaaU?Rrti=fre@3p1&6w#MkHj1D}sE5AS)ZMgQCK82+ zSPoPb{M2RnnuMJ)2_S+mzv?F7VYnn+GJ{@_B^C#Q{P=)D9i1*W_>ksIoA~t8@h^Y% zo%meHL@8mk=k2_kl!D^w@|^%u^%c-ccsS6D+fwHk)i&?0-^sK}u3obaS&s{2DLJi` zX7$^Xa51lYz?&Nq;qnPqd1O{WDmu-DSE$vzA+e=Z}i?EeLS1KDY3;S=WTt6 z1YR0mxC8{{G5f7M#79MD)}3_Q|L$GX`F`2o1lhwqYD_a6EYYuoeKvpWNqF1!)8%K; z+eH8VSkN`Y>&(SF`qsxF2BALYaUGDO>#oZo`ujus+!yA|(72y=?T<#5wn$5Z3Q8}> z%byHhg!c<2<6)A1ahCy=rf!_LY`*h-g2;g_%|9T*60JgNtnZmNftb+3=ZQN3e*SIt zfR7hk{n5t2JBYEq0H%hsK}$qd(Kd8IcF9~PxQxhVMZk3cEBk0KAps2?9pgv9i}8QB z1;j&Q^U-(g^1}CPxWjlk@#&L#-;;n|V_6o>tlx$yE5c-+z+u*Oh&l6-h8@nAv?>Ap zD$2w!!X7w>W|<-WrR1RY8qmpUXDLtwpgSHXGrIYwvp@OE#Hcr-C(KT8of0J9K-ye4OeLVmgxR zE-c}A6j0E;0jUKT2(&*uPFv140<|;yjBzGsnqgw>3|-*T!bw=ptRA%nik&J}&gy-i z1$25dgxUtHkYQcG1Mwy4o8C${Oc71IgTM50Jl5e!&vHF28a)E~L*WoqzNV$mYv5^w zXss2ln_|qed2R@Ip3eIysyWxU?#5r;mYvte(f7 zIO(o{l-fl0*wC9elxyLKM9uioyj$Pi##ivW-7&*|ek%y$r4J)t$R9QgMX8~<^Jh`^ z1VWrSe7l~5>_L2(Axk6|q5iLAWx`X(Ee!+MhLkJYW5P+onvj)0BP>X}WJgDUK&;<3 zdmzAT$LiWz<@yee8%(($HLbmaFAQZ3=Et@}sPs7x>m_>E`SUiFx}oD1S>Y@1uM z)`OA2G#67;?>dV(>Z0sLyHQnBRht;qDEXD6*GEW$`Zol zri3DiWX@n7#2~JiJ!_p`K<@TX_VBd(v77XS@bMNj=GAvYu8#Y};Jf3Y=hjP1pf5vUA_4Xbd*#7~l4%&;upoWtW@83F{%&0ps$k-Wv2%3hJ%!*Y< z@+CZ(OpDH@B)eOm2W;wMn9r=qRt@CTrTbSboIZl{{u{rKvO?lN2vMJB;hYVvDSDNC zp54B(&KmxAJW1Br-0L9&qh%eN{VroJ zjR~7x2iy}@(9}FET>-DvV+H+~93X zs#lMi#JHfM(01a1uF!_7?{wi5Oq0%lri0T!vUg*GDXf_23vW8!jOS@r<|@fP{d`RvOqtv_X*t{Y<(f#YI7Jk z;G^)L+w7(3dv-Gd+r?uAUt52JbN=>1)dRMl^?>8+VqTmASLK9giJ1zoOw`WIm+#p7 zFC7(`*Cdzg%ho7{Qu^1jD=1EEZnA|*^q*Aax#=o7^^G%$Pv-x6Y#AjXL4|i*&iG$| z_stTG5`=j;?%s%wdh9M3FAK41f4jPZ?1Q?PV&@kU(s>@JaHNvhN*N#oBir00PW+s-?3ex$fy^O^=fd5ugA?WkcQ`guln04=oH7&)| zqyXp&&0-p^*7#NTJ)b(@DHr0)`B(IM@sZ8L9`i!75%?g|a1sBbrF&x3M*cJ2KMzW! zir5ZZv7R?3$E1UrkD&X_`mt0?1&o(pB0DTTu3L7~C%rHC#uCowzYvpUaXDe+gNqSD zFdvH%Qi*%fC_|sos3|2rLVf4NFVba0#U;b229-8{xE-?fZk(UA-_tR#w1#(s2mfwN z)9hGkd+AzPeT~3V-50LmkfiseWc$lMXu;osbAR`Fd##Lm)|9@X>~-yd@q>pqz)X z(CC?g`m%+`b9pcvNNj=nReS$aMC6c7Tl661S%4Pq;chcq?_9Pwd)LT_jM3H)D4k!T z@0T5a{92-7a*Bbh`QVaTme`@H5_73w>R6x6fJJpU3sT=+Z04z{KWl5F>lZz71qCE} zrlw=g{Qf0=G6ix7!3)J*USH(U)~9XTqS3d1c)MdQ&-s+=+MkK_3z!-h3@zXDk&E;s zNd!TB@q3xTT>`>_M7ehk;h!vxn9_cmvA(1SJp=sIN!;15?$fDHYJU?s)^fft* zQsLh2gtUfr#Y|#3iP(EDDaJM2-K5ZgSuWTEKZEz^SaLvzF`=L(a26v`e5cneU%QVT z7PzmO#t7~Hi2lpV^B=BNVA}IGErI5Y&y$ghsZkGgL!!^kyt4Uznqcdw1R~>1dnEdC zwzm3!KFlYyOq(wvlTetl0hFO`uObL&m_7ywq1e$J6qe%>g*^^r@{^)A--$Aq^i5xt zjysKTToT6bH2Nvrj0v=o;IFKS?MXK30YK^Ln(pZ%?4Yg7KSq^XKPL-tMCuBx9Vd9@ zuyygksL((f7mAcrH_Bz$FeOVVcP&wC{9`Y73DkiQ?CrY#MoC(nSI#j;OsWBpgTvX) z{7l3>kH^!N;GdtqxOQVW1M3dFBEz(p=>xJ^1vd}Y(B8pq@OuXGQydAaR-k=*npPKS z%=jJtlOzlzj;fNq2Z98G-#%Ztbg;b$oWiZw!E|68Cmf5kiT zVN+ip)~3F7h~SULI4c!9eXni$npsht%ep z3pa2ats|0G^tAjK6qdDGERXE6)+KS_@WuwFZp%=bUp-Wmk&tw#JLxD&Yz5C-m4*UQ z7#c~=37AC{fV9g$KNG-PX4N-8?v*87=54(a``W^Yd4C{uy7-Xk@~t%WeJ76J3*HK- z(kHlKT4MP}XE`?bS_Yeh33=+GK+_(t+r1sl{T*>Z4^HpM4;PywA2&fCaPQ!tOALRL z`+EJ_rFBnLJ~a@RdS2*_f6c0x4tOI5+5ptbpr17)I7^-M(+lhnFJ2ozt0|hN^O@>w zea9wz(9F5vUKBca_EX?;rd3SEhzvvz{^_1w^!F7O<9utlo{JD6Vj!FP8}V6&glQ6* zc>XdRKE7f-$kEK&8lkcG9iGkfN9+103Yn5TaBTBu2g@uMX9g(0LSOgM|0p66 z-xWOU$xqTC9DoXzvW2bguRU0hTzdzaNPu>^(t7G zDu0^rrazD&Pb$X!8NpUD3yr8~Z(}TJk8@x+Xib?uM+c1=n;Wxb9j$NbHJ|qo1JHsE z-ZOPE+FyBU^Mn4Jdd4SeOHRaNcl3^C7_6%dKBODId5M2a9jLoMEH3)g=yloknexwg zo#l3xK1_6InJG*>abqNo8gtX!=paNz9vKtn{sD&T0jL{ATW-f`28?v zYbv2Aq>tL(7*?UP!Dmhi`!?k;C+gKdvdm`21|h|g>~8OBVvYR{mBD3&p$u z-1;IzPMVTZoSx~{Ks#8d({-N-(rfPa(K(o9QOzIbSl%u}ZhVs<05zOFl*RBSEqz6c zTT_z`!sR%;Oa*zER#n$zHXy;9C>4M?^_gku^J{c->;}yN?Ii9vPVA@2cK3H$vw9t# z`z^h&qK{WGv#%lcE2d*J`zl8IhJ*LZU*&D#Y01B9&q&(U{^&)Km;@n>ocgtMobF!V z)Ac;e2z9!>pa;IKhzJ{M!`ZyK^$<-Rg}($sHE3&_^OKtM82pr!H}*2Q7yV*KXtKS+9VQfEe!DK#mgkyrihmybRthV{{+}^nk#Nhz8d<7*e$ov+ZL~0x)=$uA?HjRmB z64=}Q3YqLlGbbl8B7rcfu6NZ3@*_=gd(?Djvl4};TMsI=b~ki<%mwQE9n2Y{J0SXy z@MSdGT=dFhze03Izrw4^Snt(J(iVT?CtDDWcLne$J{A&gr{xA)ftQZ-LKAUR{=6w< zP~)I{(+9KZT{})aX zbJk7wz(a;zABh8{Ld()I(s&gz^ z9~lEmX7n&ysk7<#1Zm>>?+(8V-GvhY_}rH}`GAxm?ph)V;JHs{+xt&1Xfw{B3;I6M zgij%v0%~hM6Ex7*>yThCk)^`Y_R+~n>;}_bh_Xi^PKAy4UjlRk~H z{*L53&J!t;)jx^!j0`*n)2?_(mssD>@WtGm%J=WpVJQ)>K&V+K$L(>)SG@X~olRO) z>X9Q9*g?7j$*~ykFc?WaUvHT1+!ns5=nDBJ4y2~bm2;_2Nsl0kQa@6tpDCj1GB!-P zj`OPaXKeWP(-ydM%X{@2|mAxLPEou1&=K3Ezrs&#Jts^D3|QMJF_M5B2|<+ zW>M6|)Dmr!XN>ObVCu3v{%bF&d%RAw^7p*a^uJm?{Ij;%P@yZ7GuEJUx|b@^!A&2L55txNr+10?QSBT^8MB$l~9^VG92$B z!TtCeZ{vp>iP!nY;AR@+1Zg^%)iAb)4FXWguo{f|VyAT3ECK>xl$4YpBU+HZ9ZX9f zbAaYRbJ?Maqgr>X3V}q-uQBKMgW@tz-yim^hH?WC11Eu$bU0)k6NEh{gOH)XSZHnS zf0x^sWpe*kt&5IX9i=Wuig8NPJ&ZSPCog{J)XCU6IyI*I$jBcw!>0`(ROqQ z9S>QWaFH(1>gJjpu*4}!g5VP9h_axHiRk9iI~+EuP26M=EzEguNIp*rIqQ&mNW%h) z)>NSZDFvk<#ErHPcpI^qNT-qFlzfuOL0Hv-NR|8a0k1_n2!JxdRMkxroFRaUk~nIBdmf1ttR&p<(b8^Q$qqTVtxk41I4!)!soF-bCPs_-98NTPy;xj6(mK_ew4{lX=1 zFROAjdPCAj0BjqzaY6d;Ju)ze-BveF?gjpoH3RWRqR_C!<8uO*Rn^b7}y zA)3Uj6No4OE|$!0likQV>?Czn^Vxl96*02uSD>pETQELWV2)v1ZyYax4*5_Gvj1yG zL!0~c)cRw_Z_ubK@(jdV&&vMA$`;GuCI3i2L6X|78pVNSuGtyfBWFx#b86DlRd|&6 zITLPqMaS9VP_V(MKT^mvD53wc{~cQFbwbVH{?I4Zl5pK}aE+q8T9^(XiwtIub;YR3 zoZ)MuttmzlXY(|cCKtGWl*HYG8qfz{WF-&H$WizNw}>5CbT(l=h}vlq&M=9PZL7=` z4gbTm(udp{P+&0F`>cJXxxfFgh>re@#0rEId65;lC~EoY(n1NAiH5_QIh`nG&=ZUpqf9NASv_2Z~^=LkWAQ z&kww$N4s4%4-I$-Z`8x*CjFWK!uloUIA=IXLSU~QNvUX zCVk=dx{cch7otORkBCK^uee)5A1|Vg@TS+e_Dajx_E?hR{wFQoxx9zRdVk$2jPfl; zCae@;23~?!f03}92f<#b*G*x+Z34nV5Oim7ykXl&d``3w&f-eNAs^6&XXyDE-r-W% zV+ILhBi$~YMrJ*@j6mdjqH0lY?14{}DwID_dSh7}2LgdP>Q+JF+mkcaqX*yEZ$1R8 z#;E@a>ALxCB&B*MPY%et=J1Ioq#K>JW?Zi-uE!7NO9gs}QLaN14 z+j?3T2TdtiqlAgL#6pb>bpKZnrB`Lg#03JVz+SA0Qy}fM84cg$W&E>%{u2$R%>2h! zMvN4mZc*d!D1v#zbR2pmJY+!IKbx?~j(s$=z$i{E8?t@ZMJOE9zgOuksmpl2Xk>BUlxqMgrZHvg3k7YVH>WQ4&$tIVmuCse?bHxm z*m`Cb+l9ShjcwJSnbc-n{ zSp7^GOF{raNd=P;#5&oPmlyoAcQ~v-icMH3eFu@&)S{6E@}}6=Dd`cSOYA-Pb5-^g z5p$5MUG1-QaFQn(-pb7uMMTim*Ea;ByzRPg%@L@Hom7`4n&5i?<~t~#QZ0uq)orvg z{>(C@r!ZcWb9~fdk_7tolI!T`a2go>oSUQi%I$>84njIU{j)nFLq{FJLRvV=4R4t{ zB%S9ySGhOhODf@uUAVV96sk;ibjfa)$w9VLnaS!wClL)+0N}SH5^8X?E$=|~4`==9 zb4OYlHtswoWR8=%eUa&-P&I0mJW2>krDR0^4)Dqsq)9@CdC<3kkttEfB`*61sGDNW zR;hY?o@%^Yn?Yk?Wv5xtXt|2mYH-{b8_0 z{e_b%r%LcmY%^NWYWUzwfJ+gX>;9?}QvzndUjKt{uNz4K?BYdtRaS;LBx7urHZd?_^C3EBl1GEF*9V>VdiNn8>Rx6kFSHH?kf

    S?+WPM?7HPoI`wxE)3sIj17tEI?uNxG!o3QbZIXju{cI zuu6=`69y>Ote8Du5q7C?cr2#%U-y(~6R+#xy=7Vel*djFwsPM(lK7DC0cLxo6W@1C zx3b5V=~OB0LO#FJ${HPZ5&<_ zlm-Srq*&px25VQt;FdJHk&AEW#@?j>R(~4R5nuSIj)>N%dttc2VVUF6Tidwu@W5>MCr)Mxxes_+_<$?BZ|q z32gMvo3`W{JnQyy@y`#FyR&J6G#xDLjsAxZ2X%BG?*CO>IgpCWP{a7>PO>Ww8VSp) zc&^S)-g4MUKNHgC=oy$mQiLDgMCF&|$cXH>>yc`ZN%LExUnrXq;@#Zfs?s1Xz9(uU z>_ANM<-p$Qfciv_I5|8Dh=eg#fewnrukIi`_VBAQVOy% z78Dj%HnWl~xqe+)C?9fNU|q*d`8`UWv!ak!3?c~_-0AX09N5bMlmRlno(F*>;fY0gv-SwFCVa_jH zpU?sl*k=x1%#-u0iO*orj6=GAODt>Pwv|aT_0gx)qj151NzbU^>_y>Dl--p+#i({KRVHbzcX!m1nRk?5Ju6(}&JB z1#a3WHZ_`oOO~NhC>&jn0WeH5fAnxletQT`+sMi-!Vox_QRI_$lkvRWN)kf5W=ARQ5^R5Z0Gobc$Hy`_97(Xp`E;7??F;B zcl~sE+L8O%;C=iqiJ#rEJUtZIUV=c7f4MTo*`+(2Cve~&L?lUrQj^qVDcYF@Hn)$vl<%l+z2y)+cEFFCL(It^L^>~9%$viT; zwzWq03K2_`6&YFBS^rI(Ti_a4nExJb%Y94`m-1tA_c5P4DEgk#7Rsk_mkgawPwUiwfg_Q1|m@ZKi+0l$u#MOMIO+%q;DLGrt!H11O)!`uzY>Cg}~n`t+^ zHQ94-p%|fMSy>s4uun@=Z7ml~6>LgomaLw!eqld`4A79M|AWaauceDaYk6!L7W&H| zB4zXtL$KVmJ=nF(VOYHtRj$gdT>R4iW)53%8q)x7$!J#gH=Xpub&Fy^4 zn~c_Jo{ZBgfs!cW1YA_Qxw04|Ovk}-lEKLzdyHIzbIIti2kQXd54O3j)rT!2|lW7qX4s1!v zD+&maOY$^Fy&16D*E?M4rD8MfbB(;a&{d>7hSV>rF*7GP7e>iE2CnI7K_>gvWrCc^ ze1xb?Jw37ihM<+T2VrM1@W1-U!ts^1x>_!PpBbSuURB*@`6gmMb~&Rm%g#3Wb1tC> z#4%RZP8WL4NT@{$oY75Ex;+m0M$?dxD>#U6o4&W?;$G@tL;EWQshV_f!nl8iC0xWR z;&3uxM12-vL4DREyuCVle{(jzbk7G@>`Rovou0hbSBQyj|lKLSXmj`iq0-{e_#N zFg~f#xC(;5vK^`+PS^gOh_8Zq7B+cdrNCylU0!w}Ma*#lE$s-oB=X(uZGZ;@>oSf! zmMls@J&2`*<&a_Jvou8RnR!`Qhjupa#RQk7EtG*{2oieDd`R4%6g5bbSz}`H`_D z#pKN#-?K~z`TP3XK60EpEEI6apyGBlJkxtc;NN&rTeyU99j$g~%%=<3d3l<^ zGU1Q7GielGc#ZKNSK?6Mc4(V)`=t4cE@+mOS>ZobXh)NZm{cc$H;)lKh3+hE`u&YV zTRKtV0zG=t{Hn-Hf=d)a#NJv-;*%?Wu;k*urLhpL^3YQdXewYhX0xXA1r1kuo#dZf z%6TccK|k&PaB5U)TZnQ1tPI;P5laV6orVK!3c@@jqT0;6;VjG?_8-LSpl)p8?EzP$ zc77)LkcIVWS2UQ#qc>U`7Pg7oG;zt3qj9bFjKUb&-!3hS4dbT?j0Omubi=4}(Dh#3P&*)S*oF~}lA=ilVX9#}|hms|p|Lj(6TF;fXQsD$B;pgyaS zjjcTRi9n=Pvo?-_dM5@Jh_t!pdde!7Y6!Wkx@gqX&eeJKwqPTj4o~i0?95j49L409JV7W4HY&H*H(}W~Ym@a3O+@wZ=sS zfSTu)>|MBq?yCsU*DDe@R*>0S$XwzUy;eK-M7?!+;*Rtg%GKzq2`5+dDcBiO{*Z&m zjXAh_?l|zc91PR z6YPQ8yMwa02B2@)$*}bVSfP$v!9MlLhP0r`f!~a);EQnKzxS}HY*p)HBK$EOaQBVA z+w!Ll4pQ`@95uBv)rK?3l{*9D0nm_R&;Mgl4n#(cLLp>jldw&wRkZz4I;MYVM+5G) zI;lBzwS#e@71u&AFQ*o-sjkl?-3HcuXLPqFh<2GQYGJ<_piw=PjTWlrgPnf8R>p+q z$We8^@uDbWK^{ZfIv(CUjP zcngI~heXXswLOKb^H}ZZw!b+bfL`MigntqdHYNs@5zS{LOgI?0O9$5?UID!qJ$ z=L>`;6dCsU^<}znT&OQK1a;@l#{oLT`+UUN5*8h*iJ?!*AYD)TVCiug9#VfZ0r|BC z&j%QT;Jg5d}kOM*yQtci_UWJSs4mVW)*+I1G3%8jFkz$9%*rdQi_5I86nAwB>;PZ;o@=f|L1iB^#`U~<9QiNxPKWMvng3zu-h%dT7 zFT;cg1U>4{`un#81?SW>J?sG%^y%DhJTJ!u5L95b(Vcfk?GMF2&i7gp1y7Ei=JkV4 zJlrLs%aS4UUf(y-*ivaLY1PeaWU9A_v{-Y$1{0(?>HeHtQGzMaB{Q<{KR9tB`*i+0 zwz@CjWo%?hA4;{u)G@wRF=ta*97IVj{_fGcWiZP0a@p|#S{kHjn7_dysnph@!9HOw z+bW;_oiLty3*#?LU{$7ZRxU8+yB$3|6SA>{6X$yPVR4+9FT!)EpJ|F!>Y0BNh|1hG z2T~HuOD~E#O5S#qe%2*6oigh5Phbd>lNZ{~-;)0$n7(!x#NMJ3F^f?EcX=cef^Ti^ zK-Q}#_{JFcj^;Uan>R0$9rkTrEzAVu2Yy1+0Yk5Nd72drn{n8DmkwWDtZF4m8jG&U zx4UqCH^zs9e-n)y7WK8l((DwlF#F0~)P=-C+--CaPYKNhv!|fW@+(15&Q*%x3lhA6 zDz)ACeqsGCkEg1hu}F1A2K3&0H)#cA6$bx2qI-CoSM6#U{cjqY-GV>5bTZRp_WxSk z?gaNQWDSH;CTHNQBrQ;D?cgnh`K6_SQ$rU)(tA)m8o()XUn{j!iyJhFa#RN-gKRyF z>43y}!K<6m8(o;>F9qpYDZpf#EG5frjNG%C1$MaSg@MAgW!t{xg3g{FY%O=|e6r%V z?2T0oTNPYtX;Z6&Gr>3`{n$!7kzjufXUgWUthq2cu4v;j?J!z>ucI5ad4{m1CD-iaS5I{Ocu;guYqg7fpCD^To4dWD<+@+IZ*4GI zYthN~{l|;c(ZP8ndd9|nUqz>@bQR5xAXh3IzynL3tN__XFQ{>4%!Wr&Khq=`36RR& z^TT2d2Z_pxpz1q}yADJD5qBf0H`WwfgdO?iJmuJse67rKHii8sO!_VSqu z^|-=*J}A_~1(yKxxiAXK_EPA@{+V3XkURb|RZ%R7CP6HkJt~WnH?~|_rP{F`JZ_Jk z8NRUkub}-#W~}Uc@6(HT7~`24{vK9m=Jd37|OuZ(a{ zm`Vuadd^l2rYstOZQIVpL7#U4SX*is$q#f1+Ht5P31y(by@OaQG z@os?$nlm)-oruJAf9aPMct7*q$NS}o=ORXaeZvAM)rU=$A4XZCaQ^vRWX%t>-yRzK z(9h(>oA6B$~Gw+r60Xp2Aq4now+(L5)Sm0OQ0nJV@bPl#$p zkRS-CDbu9FzlBJ~__A??=#kzn4?n|X_$soTmj~9UWvM1q4Dy_WZEw{?1vO55JT-Afnhka;6wVQ2TxH z&?AX;Py8iVl3Mg<3z?C2atwHLg;0w<7%+}HT=Rtn zCq-VW)J)}vCfOZgX^>0vwU0csB`_?Co8MRTkoQes-Td$wnAb$(r46AWm&VL5pa{F& zR5mFz?{B(P@4C!`i#jU1fz|UTxjd862rTk+cR6+-RySqsLIkMERY@?+f@Qk1W)Hkg zmV4X#niH9`8h8HnzF_^PDrR%H;L6*X+hxes=4MI2Pkm)Uom1B04rD%C=&{1${P$4_ zlNEnWnS8^T<&A;!tym>C8-=`ml2l<-tzd_{?z6=O31(YiTg6FInw4a zD@AlhA_cjoF`%`Qi%2ccAaP4-Bn1ZbbF!Kh0wv);R?=etx}IL1IBx%US9h8su}nMx zWX2&$$`%fIEa_OkQ@gVVXD)~}9g0#0*cREGaTw#4AQDS#mawgko;|+nfvHH?VJMzi zSt4|$FfW;A|6*4oMLf zIwE>EJ@i*WQ4E-(jB6qhn@#?rgcC5`i?QF`6|!d!Ibgsiz$Ahv;OZUiJ8bpqyCmA< z^(&>;=ukFMdaYT#3zd}Qr};=svGT00PXy<d&6J!uHme*rbkU- zOUeSGGc0yhQyo)S=~2nbMcK-Q6awaP&u@L`q~ME6!UEZVM&trsvn!V0$IK~bvuzhz z7FCG-?!H)Vmv&IX)@f`fz1p~RkOiQ|{!dRTq~zp}(IIBiYLRm6RKyld9bVC^?vWY$ zbht7c02%~pfH|--c?XR#w(|UK=I4IKB--_+JnOxR%LFD%V@8nvx$2?4>$hr=s5asQ zfBBkafud1Wfz32vc}*-=S%N;f!)Q`v{+IX&Wcam~+e#=T>Sq7Rv#$Y7e5WJl|Z`Q%G&#FjwYDRhY6A{(G+w8lgPSxrs ze@w99+Qt6OTA1RsclJZIeO2J}Zc*p_3QJQuEb&#R2COl-_0+Zz+edvgl_zM%Ku>c} z2k$g~P@CXZ|5`krtvDSWJS%Ie1eT^%Gx~UXTR9CDrk4eWrcpX9difysJaBLKkWstH z8;I^~JdV@gxjUC1DjtRQQzRfH$J?LsCTzE%*bm>RlgKSOQUWHLG4g{;G&aN|&UP)VLmX?iPT0seI^z}~P z%xzt4*-U51JzVww!ysR)VUh&}@xIKaw6JiJqI2pIO5nlOPC|!wV*DSf-myK;uIn0( zZQE?p*iIVTwi+~zZQHhO+qRR&b{m`TeqQ(Xe0cxCfi>5fbIbuW{OLsFpP<+nBxd=P z7NDY6o!37kx4rs2>?A=Xwxh>9{B`y5KY6hBZzF~^wUH$#S>R?FyiUF#PWL-g3%RB( z!k{1)o~L((^Vxy7WnJeR1azoG8cyUY0969XLYlg|eDlxDf^b#Q64VCxnQrPbk=8F-yem{8 z^?7(7_qt%T-P$A~hvam$H8=DNNK&+^w12aj%cA=03<~I_lgx0t7-j|hmL%2epibQ% zkE)`|3l|HKcHJ@0$fksUN^&83G+$Pqw3Z|(x81B?0DS5Zz@*d8%?(Fv&%!WD+{Tuk zpAWCF0%1ixMe#lY>cGr2Tp2F!am*&B!O(rP)QP zeNG_QhaIts1E*m8_<)M+4+u^Fi<5Q?&gONX3E<}#=EXnx*5iY0jtiEg1cG3`XqiP_ zjDhix*Ax;EOK)fwKB|Hd3>{zQodb}UM7_BxXjx51t=EMywS2n?*4MKZOMg|vV8&d5 zhVncouBh=%)b@`*!PxqU3@UBmdvxat>T z$2=%tKg{xoX(&S-57_IdF)f;;-9WggheuJ9E+~Rl(B!G2uEWJk9NNN?`;mX`d1^Rx zz~U_X1A#s~ETwJjVXWyouCF^trn4;2^$*d7%#SPZ&y+hu^LdqSv z+OK%8bGl-)P(;JHoLJTu7c`#Tw!;xFJbLYamlG6tfZg|r9HHORd^t*dtPnsP<{~h* zZwhLl4@@{fJXKTce~>kob)9)>a$x`!)OY>??icT;z;CwM=-i;MP{j}h+Prxr$%RRr zvUA~_<&+Z%TieM2s^(!`pV!pg4GA5&Rs|$6LIbf8L`0h(c-EOZz@;(>+uEW^M+(Wd z+(nQ*J2>?f_7ZzfN;?(WzK8O%c8>#iHV^&ld;-opjD~?HJTIp{K+&)wb{qMo&a@8M z$D#Q>8GGFY8wcDtgyQ*3M~D1wxX#09d)} z=c5pq1LcdE;$`}~*M;|*$pwwl&op1mvzJ-n)))pV{IYt>8O2n=HFv9KG4#hb!e-{&{ZE6mA zaXX4M?(X+#%l3>{aeiZRxEhKW(m|RG9=Yf5l_@Md1cnv3^r}%D69sVtquh)#JlF&Y zQL*X~hH$&VTZ+^d*aEkG{dI-8arUM|in86h?Nb$f<$uFed55c4&(iQT!6JOqBkdp zqy>_7A z4TfbJBslT43<2Q<$V!gZ?nFxmR|~MIpkS71Mmq&(IE@G1st3$}f2DAjvbd>YP?o{$ z#y_Asko0Nw;pngaiY(j7aL@2K_IHHP!(dvb4-olmNf5$V;789l?2%z{W?j-c=;fMq z6eUqzDgAk1uRY1S`|u#_3jz&)o=D7yG4(6pW)HN&Dx`pk1}<7(tLR2k$TC`FjcfE> zHly`;J?kz5g>?UYc~)u?I`an(jQo>27nm~=6B)6fv z4WW+CMzx8r{t_r3KrNitDnSxDKV1rQR71uV$3cLmnM7+`V}oeqj3dPaNxM#=LUr7Dd=J|z6wA~$9$*VB8LEv^(I0q{RH&f0QGpDgKZWe)f zNmgnUIRTL{H%VyX7rx8Hiiz~}WdC-_4hE4Omm%2 zAXg)sFk6i$Q+!Dyk^!u55%qfi#mC`etJ@3jzTvXEfadyf<7zi>=N+!~w|DT(GuPPB z!WnIx%)I2HR`6LO`27SLz@zO}9)xY@7q2{R*c$A5z?@N{4;%Rj_MXEq50=4N!44Ph zPcyH$^j-6@7Ww=8Oo3zEErX^B$Zh$4lq0hkW@%l;x5P7*k_x8EZ>o*B6%}yt{6ghw z5a%Qt;QKvHB@L*mk_9daXI;#?pvl3D38mYb3W{~t9RxzCf67%%dQm|Oa0ZnmA>^m! zaKn-c;wMBTn8d{a;{z|Ndk|w9F;Yq#$~lV}3A0@#eU6#fv;z)1sTAHb-V@wdI#EAP z2YzqP3ArbPkbpxU$$SE0a=4k`{fs%rqlMp6q8R<;u-he`V`i`BY}>1zXh&4tqIbPS)fn` z-R%}v1O{ROF9R?Fw*>6&mXi<;Ut%V9Caypv*_anrV<&CFyppC?f6kxb&dzl^o+Ts_s;)g z*3PE>Z(=3qaC!5N3pq`u962~h%b9FXs*pLZkhAOo+ui?#!sLcs=wfU%4G$&ahA6GL z6-Z;YF1Jc&oF@u~%OVZ4hljh4#P%vi^e$ygMinw-SKx_k?kpJ+d*ZyoNxC>zuvcc4&nsO z%~kk3-eFpQZ}o3MKMAYu$9|m(iff%}Qpw1Wyif|$Qwvk1V#=6;hGqMfGY|-L1}qct zE}@($FjX+c{b7jWz(j@CtnI2}!4KAhirNpU6+jz5anYFHNJxHbl(&(-pDe(hk8NaW zxs$CX3asVI?g4H65AfCta&{s*I|}$!DmUvo!`a$me>9=y_3@B8ps5$C2?mP-3j&0V zS9HU5H;5|HU}y&x`Xw#Uu(ppM8Ne#_RO6F_ih@L%eHOv9nH)O;=`Hk4DK*X_QPI^? z4cS@`ie_0wN(#I!Ry2acJnqH-NAz|VgAyg2 zOL=Ow7BkNYHehFGDLZt`^LL2 zD2laCiM}jkJmJB^chJJWId(4|(R?sMNe&nbb>rt39%@{drgzF3Rc9OQ{IMW$jb$Y! zvQMte+dIR*91t|LG$}~N?$m^_DJ9=%noqN!^BR!)@8>$8s^vx_8UUZ>frnN7(I=mG z*Li$~-P;*!H@hz)qASAPnN@?my=+GN3)kNMUk(@-dp&N~>O4VIdTs(S@qe+W7^(eC zYIb~|f|F#IXJ_e{&3IQ`?9LX#%K2EeWMeEMCugtvm)33 z8(`mcCugCTmG64hsQiDV+1b$ls}QJIfD&6P=(i9&yJ(#tWOkr0nbpHUOToO1jrP7^ zw>IhXoLJ>+HV~yavG2T(VxLZb!kk-}a&cjT>22s90waJ775;lA*h4@)vdE!Ik*O~s z$f_8_=Qfe}V135=`I__1?b;66V5=vR&cMsRIGOU-FTLPz(mPGYV-euTuzu-ub~io( zf7^$YRK6Dri>6JNxOKh37;JS!>a<=Nv*Z|=Srgj!eyGnR!id!WnL04~nkY*0L@5^| ziS~-?A~R3@y2OJo65dgVF+Gw3qC=c#o~*!>JH#_#8x|syo`fpC!571w0<2%G6F4ED zFN~DL?q~9CiJCj{XBZ%G3W36YORgK4C%K5U0ku>XSBp-@^Ct(4sTK!=Jh?x7Sc&)SncQW zsnwNO$^l0m(d_drX9S9CNfk8}-(*YCWq)E;XhDLcsbOY03!IN}lazEg)I}J=M~iso z$;D(}#D41Fl5p$@WfhRbPrz+Q&5&O*%UKsI6O458d+oY|SOiAL_4CILG35@n3;2bMZvi!}2MA)@~ zO<)V>NWJbvanH%1bcjqedYQ^1aM_wM{zJ^tACqK*n!RM{6ATY?H_h^*Bx1pBNczPy zBM&nsNF!ez$KyA2E2?QR$jsZ`K{uZ!s)@{oQM1YYyQm;!h6h zXFsa1!aoOKY`w1}+&-pT>)p>-uryZloWq0X$wpG@>RS8<3%zm3(zGBKzVV=XeDtUr z!KYADeRm;IAf(NPS6S!plXzbKHqjF!9@*yc@~!7ppg?*~Y#1N&25$P>0Kl{wTexx1B;3yzp(rbgU!)yB4_O^IJB8%@#e(JjFsbKK7`&C?IgT@Ndrj7;8JXFY|yYrTL*_qAmS6u|BA>iaXp6fJu1 zqw33KL87X{gd7M0zCVRXS^oQvWiJQwJHJC@B!UFqYQ8sAIsFRFNN9Gh^iL~??l%IN z2SqeHk-g$#%J=TxCyD3V)WgYi)w{5Qw?^8hcw^!h(855G*TB0t-#P=<6}Tu zi@q^QO4er&5oyIP6`{Nw#8DKzI6nVHOF~KB`=I%bk>HnJeB>zN=HhN(0-=r~e^Oir ztaw&zgnIy`YCK_tEnwZKdmcau&aV&M}rA})~IWreiAYhQhx8$Z4P^bmp zySWFJitojo+RevoNiB8F>Lfv#NQk{n5oFc!D@xL2>13(?BS{7(DeV26Mp&*AQJXei z=RpBzfb556vSLhPsC}4F@FE-ZH4TFrX-)3CO7GU72lQEBNse>c!dkiCYF97vId%J% zD_5DdwMW*EDFFl|zX8j&=Myj2_ZBn;`O&Z%6f}Qlo9Xv=V+!T$+&;FJD*^yE2@ zt%1KAw!FlUP!3||e!Q9#BK*u=2>~cA8J6IY5P4eAQOAUlCa65IPMJxlG^hwXXYHt~ zC+{rw?=Yu?zgnoWg$gL_j%%C7KV~U&m{>94snnondd z6D2w7G$Ou!ploE3pA4x?a{EEy7)tEPiJeQDd#U~M47hQiaq3T$BGAwrl`b@tFf_Hb zpoG%osnXNiV`xfiFNtfbmnCC zH7fR!>jK*r-mC6Vzy%Z_mtGWPG4cY){^is5DA2qMJnwQoKL_sYe|GcQ&CSgOofHSC z6U9}l@PC;8GriM1&C^|^cpiMBUo9V4-+ycU_h}s&7V+Bh1q8{l`*)RP^16kZLs!*Q z@4X2=Gwb^vL|>UAzf#>>jSK!aeYh9=H+`svM{k?;#`^ezfG{hxqQ7*0Tor{4u^IF` zN_gzC=^wM3cn4}H%hEAW#=+tDDtC&!I!Q}YO_EE2oRDQrkU@*P$=>QZ3Kr|SGem&- z-sgT&KMQ^x^$vXi{NAfiZ?F3^5O{caU~auJUmG>FABX=(y3;;trP>z<>J#SG&(Br{Cc7De0nf@JwDB-gc}$f4EcVu^FO2j2nH0g3 zJhiYB24!)}=w{}eKdYClCnlP3oaEz9!*($h4d%PB(6~m$BSS#&9|hs?Npw=l;$H(% z0WH=&v=4Iqf6M30xiz*0eJ3kCsTtn?W{`%L?XAiGN%v&vDy^TlpL%0MkuL$hCKpnY za1;j$E$*tL@ek5T^`ay@d3cBPIOL6}JU}{U&gI!n9zd()b7)OjAiA{9D4=m+!vR;* z+Mq5fMuS3-u;uCcpHm1&CfF6~xfk3~pO^`)C)^dlZIzRfDY|X{T*B9;T8-y?T zNh|Pnz54uj^$T=Vfhgn@3@Sm_{8~Z@B75M;4Ns_uD>hJ=O@w!h1`o3MBIJaP(nbi4 z_UK6@LMS4Pp>mo$kjX|#oLY>BbS2x6PGTUqZa!vnyi8z+nxFEn5w$Nrkxb;a0ruyO zb#^ua?FHuW8(DyaU$1T4z9VnMN*Mq2vANvPe0GJOV-4^8C3N z{pmxfdXGZd;6+^~70h)r`3^pW#r)w8e$*|RI!{PgB^lvM_Ll#+PrQC3ll@18@#$qp zzsiMa4d+<*FNFC!{J2In;DQoUAUe_EZ`TVc?s%W0;9XPaZ3%quafRy61 zm-}aHYwNZqZ`j`F;aU5W$5k9+!XIbXn@c_N(@;^@x>4Msx*2VW2LbC)1z8wm=2{~q)-0)(D|?|ZR80ruo_+vp#<+WvRf&P)C8h52TWp{#{L zGl4eq3RBcVQ&^HJhmui+_!3D;*+(TshS8AOPJ?5r?}%C!KY{02aag{XBM%D`zl%jf z8NsXM1vgEDmDX?@W9C7W%!nSuie;FRl6n*Sc_TRR^(y$q_-8|Kpqkfp{_3fo>95J$ z)xpFAAp&-)Q8g4dq%tUh14xz#Yu6YosXQ}J(H*?jI9$X9TX&8}5g>yO2Y=pz673!I3wT$6qv_sQi z>RZNT3JjQ9hQrC$+lvSJz94yQQBm1| zt#5IDvUHKt#pwdZZ8=I77*v{9-0r4ZZ}ud5hqFCh4J*F23@95A{vu5+Z2(V&8Lq0Y zc)KDScafO7+qLq#)`J-DZfp)$urTJ^}v zD~wo>=!WMe4mxOper;&K1pxghiq@?dI-4zD#qw$oJ&zMje1dV*c83>s>v{RKA#14Z zw!6#-m!r7%JC5DjHDOLlQa~HRC>KM=5A`r1(8rU}DECVe5?o{f;@n--+DfJ;J~L)K zSZ>Lp_u%G(b|c-}7`oWLBtEQroblz6Epalunr=~!OE>6j&GOSkU0%aEGU(`arud=+ z);J6#<*X{*ooF7^-1?iU>Tgp3U4=-X|IiM3aS&W}ky%mAZ$aPnXI%(egg$Z+JlFG5 ztUzVp;1rXaDLI#wjkW=M%j;!b4DnM9;v4(u<9i2*G6~2>FeJ^zEiY53>E* zH`whz(7S&FM|k5`UDxjavR1s7 zmX`k*eLN|E$;|TEKCT@v^ji;hnxDaC?4Qb#;tBmSRzVKQBuAY#$yTO+e5_a&YaLpte9$* z>(~7vC^QUkOa&kKr2obA_y(`Gj6f$d>2{Irdh>Dh1!8@HAI}N=KY|}0g7@>tD|?NZ zxjB5GGmc>@RCL98;BiIGk5;IWz3eEY+&?L)JF2Xh>xo3A&rT&@!g3n^O4yP9aW{$* zW+yb^$?V7J{h_>%$kM)!gT2mZ*!&}6dRCaC0Md37Im8)L)Q;@-jSbSId4cEeG{uq# zC<5hm*ubB}8joXeubz6uN7la{Qz zi)@;+5(f*T-oi5Q*3C^+QM66RuvYa~L{REAxW+S_<$0nKi8msy41$5_5=D}>f_nk? zks$76nn|!cvQ1XZD)zFdA7)w52__@x*sFv?T$F+!dtTDpxGOx+_{tq>i?G0qW579M z_%-jn`EvM!;PTQ#FEi_ptF^!%rCd+3Z2>TmbK52CMf9Ltcu^sxLy$ATY2@fg4FCl^ z-M&7Ev+{UbdWpke@bNRB&#t~mQ&Ll|TYKN}y%3?(1yR+Oc5tirEf7k zZm<6njNtv>(}arJw4$h;PY<6Y+;5+Pcm_&gd_@#`z3O(HCjK%>L+rxpD7PbkCbP`+vWD|fH8T#{C`u@)PJr)(VRO2p~UZ4 zfXDC;H8u7?FS{wDLh{T-@GuCH@p=D0N^;->N}~hZnEl~XB(YB35VE>pamG!OG}E3v zYztKITI#op=3A4|16{Uo5|WzM^$lGC|NhwkgKp=a_8V<$9+PVJ&&#V1j8sO0k=~EW z-T?ru2-|4=&Cd65frkt#zzPv4G2<@^Ayg9y(HDc3s~K%&YO?D=XULLc%#jVj6v|ge zG4hujAH!)akim04KCaN;;r6zj*~k`4LsTnM1$}}ZYlX*fE_A^=?v5k@&c~|=(@An1 zQZVQ34(AvUmTy?;!tM~B4In9Md4}| z!PUr@*4Gw9EdCO?#<8u=FZ-f)FWYrzFdCn;2OVYM>glF1_nok+#&(yp_m#5eb>ETC z%Z}Kuw>GJTC`|1yy|lfJ`2qSY3Y5j*?7Alvv~ho)QWm4MHTtx>;vR)p z3T~{b!p#*if$b!m@wg=wr*_{Jur>ZLL)nl)YkzmIU0J)j+_D*hLqkt#OL-oe<{c-B^ z;jtW`j9Aqq_-<%og8223`)N{DTkEdygQ#gzQ0m4aHHL++M$N1|+2v5U=zX9}ogXtW z0VJMl#bT%ZJ~LT`uGapx$q!yEeJnPGV+}n*`~U|6eD{EqjO!WML&Qbta*_tZETt6^Fa<@E!{sxr|fG#E!Uz`?ry$NC_2mBZTezO5 z&o{RN0H1zAK8c`XqYc$HNoi7@VwpWdtJ-Fym(s3|HF*;wQsMUfM) zRO0Dv7xYo-!7C9oz7pLFJb=eo8Y%%ypbxTW4zlU@BsIGTu(-q36b7eX8=ypr$^ppi zAk6+E`kYgr(rHQ{63o?FP(R@QF*T8@WtOPVr+MF0>rFTh&nY%KBcaa#6 zL5X3>r5MI_yQ^eIA7yX9!_-Rzh8+;?N61IM$^tEv`oX`sGgt~Z1N`>&K?iI}fWq{B z0_*{hm2lCO<2w5o33JtSCGG^Irxez+BQ2kP*_FwC?4RUfy@9=0x2+ED!Pxe^U;)4N zll|Gk(MbU(8tU&&H$(uVcs?CO28+9gOoHpE19Ji~CWP$XbjA0v_Op8vR}qTPZ9?m- z<+na`9esjhf5U3u#i2JIRqIjz5sv8$=-LF&2~@X#BmH@!5CNw+tc#_lG?&)_p*T1(#nw^L8QK_&YV4y z7YP_tfJ$1+maxi}vZh&uR8#=_lN+}uW-`CN32a%Ft$~8x1;U?m zcV8c@$5o`SQ-ry5$g%&d-YbEPy^PTq#N=0@Lm1+MrBnx-YL>ZD%ZaIgC7~*zp-4v| z9oT0{=!$AU7AFfA9NJNKF`Kkgj5&0MyZXeGszK_V#?5AQe8d7M2Ex3UA{j5xF)oT} zN^m;^?kQn+9%z6JNJDyW>!~Mna1dP6pL+_`ZWi z|35B3e&R^5)A}!nSrpQptSBC%?MX>+D4(omrjgy#QyAj+X#*1nJD{1uW%+gdB&+dLg8u8fWK@=8^DNY zPwT>;k*?U zOIvJM0SE0FYv)vl-_I;`?ntz2c_7toGcMjI82Sq&_I%z+R+|=M{UVsfrUd-@tMO@D zCV@i7V`p}YoQze*S;JYa((=3bW_mmMWw&SjA4s9Wgw8`jYw=r13yP_0JQ89*H^jLp z@g7hFh`RlVZsQsv{_0Y*vkAb1`-GTbfSjeWRKm&C+1ZPAIUN@lcW>`9-aW?m#Ovhr z77m+1|9E1#vWnt1#Q-|?ZA)8I^Kk2Fn|hL^iFvcberwg^_92gj`1DV9XZRPqFb6|? z=?{w7Y)`(w2jLq+kFMBe%H1X#sOkK1vP&EAR@fYy~9{RyWf&npi+jN`JFg)BlrNSaBp+%MzS zHn}PaaiQapqBulGiB8j!$h3cdmUhaFEmqpKE{GcF=`Ub63^Yn1s^h)|G{WvFKps)% zS9Iga%#H6y=$D`H_1X#G7__;6I$yZ?>X6>N;i{#_Ke8}@=2#dYrN)XAqsixxR4@i4 z!5Dk~Os%NEL4XIi?|pzf3o^05e*a)7pGOk_b@R;vj!h(6G$d70 zHPz8W@8m1r!A??muV~`u-y(V*!PlmFGvw`a?aNm1IgVo2}?#3_Yx!h z@FkqGey(61YlwQ<{vs8(j#~D*ogWSQ3*G8trL!h!8RMz>Ck7@mY^BL7LP&hAZtfBm zlfAG-Li5H|fpBkb!i^=`J9Yi(EHN$CXwWgCBlWkviuLsEycvUD$I$Sk2A9wK5NE?1 z)F7$vC-zqWJ!72m?HYD&r!2*uLscCKrDWA4UjxZ`;PiW(0gk z<6ewW*wDafnhJnM$quh*s#{}KU3@d{SeMEP|{%3Y(m9IOvj&)Q*yq9H2Jt<_T zK=#EbTq{Pdr$enAl!ablb3fQ%KL{zMMWoQ1^6LAkiDfyc=NS?>OhCbjHwS^rVCb6r1%qe13n6Ts0+S zzvHhtrCv>pks3q8P;a^fMNK9Pfapps;bd=Mm_I@?w}qbIH)ZcXhh12Sld6MM``7Tt z%7#hOv;>8wsTlw=YUWoImr3tvs$EU@pQe1)E~oj>dUgV{dU``NOIH_Ah!AnXxXN$5 zVP>>0kmIZ1em3jfj=4OhmeK#91w5{2M z8z)+@TuJ$jshbzFroR5(&^j!GUeDCHN+}R|ZqV491C{g7_P+5c*5m&4rl62I&V$d9 z4fWT|S_AMs@Cxy1VabeweC5gXem;IQTcfg#N2){2_dtjmIs{;@(%-it9JK8uir)u0 zmWn1)hgw9Htf2C{AHt;K$b<`ZoPZI7a$gJ(0*54UFRu4vqxYzqbLVj9>+LHslk>O3 z!Ak0;?{!>pr_82S&*<%~l6awegm8Zz4NXLVv0`3yamBauijtad6&=Rj-hg-Ecc4|& zYue4*{d24IIo2S3s}C3?3UAjBH2u(LrqOqjDB%>d_gx9W#~%OP#8^QHI;QR7KaBXWS%{e7sT538 zFA(`i2~esFZ_^?s$J4WH+STP|*F_3&o#xX+-O$vgFOqPA@P! zo_BKk-v1DfPfmK(zG#b|8;QSI)ipF;h6O*etPQ+o3MG)UYSFVP>(U3TD`gdBX7tZnQWP4S|uWXS%3m`~XR?xKua>T5`Jt zsqnW*MKDrKb!j2WAmxLaq9C1!73+Ak?}P^Ix*l=xvK-{*z9wv=+o75fqmoytOvt4Q z|2qC$O$wZ3d6=QM(l7l5WopyS$1`GAPE}Qt;@=*Srwa23V8Q%@M@~V;$kd!qZ!JOe zQbnFFWp#0g)odSRSe>n!Paf+O%6C39&T)q6NtZ5BL#C8>j<;WSMk7IhdvKgVj+?oC zil)}s7@zT%%I5sB`}mC|;kO7NbxEL4pVRNR``wpJSL<+eZVl+Wr*ZPHutZ>Hx*S4) z3-h*A@Y8?i<9Kzm%Lfq~t`d~m@&qPdGWO*+{E#MRnZ~n6FX6sG4(n8(C09+^3j^ZG z+{&aso&pZCL=}Br5ODwGlRZG%}FyK?q5w3M_;V2ip5`sC#tfA%i7oR^Jawm;>-M<}zRXuj?!! zOii*%e@4&#+L*WF3$JX)kc2V{UPX6_msr6whA2YB{v%2JJPB?1n{9s}82-KU>*H&e z`16MN+4t+}D^!Zz$lD|`^x|S_E4!2i?zZ5%x!mEFepEZKrg|}Mg}r&@??1V+i;Uu8 zu^1w~@vnEm&+ig3^rT|c-y9#}areo3u*A zV#B|Qh4f6hJ<1<0Qn`8XA@fBuyS+2#J{nK!*0qO|tx#`5mGx@AfY-R^UEj zra%p!mNKDlEkX_@jr>Owv#I_AiJmFefYd^`MQ%F9`c}XA+hWHr3_3*-PQ?84`0_(eOua z0lF@FqlGvjs_>$Z=^i73A5h995(sFKeQ`#019@`6HPTM)k>5wltODvNHRTX3(v_?S ziz>=0A{r{TGW^Hpl=GS=c^1S~mSeaonl6`kSbBV_qCP&k-jqpP^3boek7wbO1j(NurB@WO-N=&sz44HnJk#uzmmm?)M><#zofu(saOuemgP`S))gs6@XUq4OJEk{}XBhX%eM(q~u`mIY!WNt%sw zzd_KW!K`h5bp7c=hLos@_eO^ZU3ewjm_=;~|8}pW)GrKMw5Up<3EyG{(j1jxN^I`4 z&2bfc45J_sj8G)h0Abr-x&VJwCO>-2#?VNfzxg;E42gw}#r+_dy0~{FM1)8h@E3${rYwjB;5&NAH;Ahq*^WX>nqhtB?syjPNpNGe$@+302~!eQq%0(DRMl;!H{TEcJlr{ISK5ntPC#51;tA_5c%MdHoS8{{};Q-fz$ zLlAP&!0rX~Jk^hc+0b<+ZFt|0jE*W)q;z5O>Q(xQ(0>A~q$rx& zDk+p^+(ya_OoD>3gh;dzS#eVSu%fwNli$UD$HNp=qe3NN&_J?GqOedyNQ=jg@o@8! zuCq9A$wnqgN;A@?bflk0EJ^ggF>rWGu~LiD@m4i!T;ne~mK++ju2l7wYNNS~ds78n zp@WL>Sc*&hv5F!xso)po7GFVk&`~O6hH08AJI|=7NK>UWJ8Os(^2exwNIytHJe5xY|KFMQZ*)A3-?yAzP>L~;(AUku zQK=RNgAn^)F~S-5wj0NZwl2QiW+fkCejeL?hFtZ2AT`&#d|dg=9v?$V#1I_~3i=FX zce=K_UvP}Bu5h_tvPDM9AcTO6567w0W*u&}-(_+2gfwTU%GdqtYzmKWfo6-8yv?l} zlH~NC6gk&7=w!_t)e<$xs9q8kikN%vO&re7`1N2 z$A7qrX16%FKVdD-us($?BI3`%`51Vg49nR)0~*^~dwzrid#2jGi%lJ6X@I?g2>f>a zSH4d=K6e)e_CUO=Bt<(;or}1T?qtC~jA!^5taj`3vTOo=t;@w? zt0QKNdyP0ehw;(o=5?swwb8M=G}KevFFbASU(S;?dk-zWccR1{-=Al{2$Id-k2QJ^ z*PCZe6b()r+v7!~#xF0oF~T7bnZXe)O#{9t^r%wF<=4|8Mf`4Y#a8foWBZpd2UbTg zMM#n%igNL{{z52($fggF)+spYBIi~YBo3Qzn3i$9u*#`%la*%~7#abA1vFW^8O%63 zCiE8I?YY?QNRU{?L5}cErN}10sDjmX;Y>)&m>F z&(O+1WrBqwqoh-1D>59=!pQ5$2ESz;=JjecwZwD5#l9s=|3m)R$X`s*;4nuU z!E0s{RjBGs@u5Pbkn8arxRD$yWVCSHzMad4oiPkI84o<-nuIE0~A$N?Id$f_E` z*egMWDnh}T-cQ@FkXeD3G=tCE+&0GxC_p=@sbiAtBpk=KihKEw0T%np^?}LV>HSSe3ZcK>MWIK0GtVko_Erf+BN`@TOzv$iJzt-h25=-$#?Qb7? z7<;Wu&jDtFAL5<;O(${}cjE%(MSb+86mh<+jI1c)q+RruB02-}L!SN7jUq%KCwUUF zgZ_g@AU$bZ2tfb&(|7}@86PT+aDw$0}Q zzBSO&^xvj&4FVA1DR_q~s0<4OKPz5XRheu|50mTtyGl%Jog$%+aFqjoNo4<1L`ydI za^Fdl1ZfBer8~SoTh#4vN{>us5Ntesrk?~tDc_jgQ&d(k4Yu1cvGW5tSqTv0M1Xur z3ANRxvB)4p6=^Xk-d2)JD_mH#H$ApdX9_gGTR4m%5)uDdi-nQs{9lJdnPRtEhf0Ac ze<=fY4m$-+Yn;60ZSc_QYqF~Jw34T0zcX>-vEUq9Bo@}!$Ri?xnpO83jyED4UA(8^ zX$ZnbPe6sygU1_nUt!7mKJndC3;0eOg(oz9b>;psOH7z$ zAN{3C3u>Bv?@fnF)92Q!XW|@O&0g}Yyt1A=W&-UTPD#Vis;Yc`gk?UUqd|5e;ijm7 zp3cf-UL+rKNxU%nh9bVWCOTE!l|5-Nt;A&GGW*hb>OA-HNr&A1?4*SF%6v29AmRD1 zk*W5{?E&U0`TJenqwuZ%52E%CGe<{q@j|64?~5XGNQsy#z+>M`pW88|xR@N8s%%bs z>@Ew)W}2yQX7~B(+_^3le9!4L*dDv@J{M8x_ zZsR@C?MGuoZ5p<+DVR_Lob-Smqy;vlACEFuFoM4SO%UxcIf3D+7u#0HNy-t6r3OaM z&e6cByt~W&2*O{j1ulE%fU0aPELy~Yv9z_FC1J2%+N@&aK~8I|DF=7_T!aD>8n@UmF@uld5bS_L0$u7P@U{y#KIusynFg!vG<-^5s%*}k9tsQIn@zAP( zH&u6(EuQV;&|Q8FiTfhYvFyY_i9&^M#+3P2TBMF;Ak^B2QyHgTE%wYnN*@x zplQ8%NOY7`SXD@?sAH;%Uqfo4_zj1u<@%KKG-;3m?Yx2|HNTJ`B(KujX=|=Cfm8ro9=N##_ z+2uH%%r@3t|2-%4Cgck6O%{B+5d_+%a0B0KnHuj$+>vilO*E9S38`3h4WzLm-+5BU zX@q%=w{Z^Cv4Rp=olG>ei6(?=UI%E4X&+xxwelYv5ZZS^uCO%5&M)uH!(`}(M(?OI#6d(p$D zH`R}c!&gZHKZrfAeppx}9Y=ae{t(O2N)r%?g&}T4|HFu-l(a3RJ{d+)6@h!zh4k!{ zQ32Gg5a&38%EiYb^mQAl+Tsm)>(boWKdpq{F`Lr69og^ZX8PE*O`Nwx`KTJ;6UT$P zyO|Gef*LAtVr9-d_D^q_V+eK3e*cc4pF|2$6$YROJia%OxvS40Xo|20$N?jqK%co> zNc|emi#3BP<%s2FwVIw+Jc-m)+R22iEqHUQiA-xypSHJgG*z?wkxTM0Zf9AoHmK*g{BQZ|Cb~oJ%7-wBPBvf>IJoD!=1wd2JJ; z&cPt4>*PUIqCN{6#SchPecOBGMW5cBDiWm)SG`n%^wor+Zp2|EzcJwTG1<71N&5D# z);aiWj}>PY!3W`S-2SD4p>>x^CzS%rVx&|evSd=`!hD3(ve~b0@{30*y4 zjg1|LO0EL`LX#xX{NozTCuR{A+(aay0)bs62N;+s~EXebsK>T%{ww3HHjZf+YjSoh1XJ|?jq>LZ_q;Kmp3LtJB?3(j zPHdn%;?8h4J6^Qg$<|Yw-3?jq$1bPW^@Rb)L;Nq3SsB>o6`E>VmLo4DMu}sJAWCH} zVF#Rt*59X0Py zr|5EPS-pZv*p6@cSwcsjvTDkylxk}317$^3O_LlI-=4ZwlA4Pb0@h*9@vLmhqGO&S zm_sW5Kce0;D6Xz+8YYBb!6CT21$PE_5AF`Z-Gc>pcPF^J1b4UKu7d=3xA)|_zo$NG zs`v*Cv(H|=dUf}jVLqlF1|H2==bePgSylM^WcBGg}ZaeKh@4QLV$uJ-6M`MrZdzAKxh zQ+J#<7OPoP8&v>OU++~ev|UV`m>H54n7Pe|nh zhk^GAJQB~dGH{noU8=_5q*=n$p)Dy%?A0uNDg4CeMRbY0S)$6j;F;{KYZv@bdu(g; z*H9Oh=)u%|hw!=o3fNGOj;MEwJvMAM;S^*H(PEz~BhmP=hvL~+5-5onhHET9sCqGY z-#PSOZ~L5q{M+XgcXd^p`J$rADiMvpjV!+?I>+rULl~}^ItFEKFji{2UIyQPH?e-c zLVLW~W^6%hCKXb|A{ZZW8e=Mr~LJ=kj z>W9Z_p!{%30U-x#LKZ7JVf=&IpNJq7MSx!#KGFGu!=y5EE?q?x(=C*4N>#98rI7l! zmR9jrhSJe6vgOfu#~l?6%7pZ=l(Gz!Xq2*sUkk|q0@##SheHs-|0gzzP*M48|Tpdrbo_vBf8hcn7;kED=SV}|ZwzSuHm()SJ2vL;J_t(0-J)0Rav$aSu=vYM47+)romVzY zFw&OXKP<(Pr0}3QZ2plt(=dGFg&EC_$|t-g1+)SMO01?>KW?}p-Rr2QQ$B}~JQun( z5Msh<9x*5>THRNvdnAQXIU-My*z9mW>>Lp0#xUwqjQ`1b&Ou5c+3R}I2V zn7Gv9XmV~L_Hi?zlw1VQt_WzYQkU*Ue>X1bH(=Ubs#V?ax|W;F>KcA|c~NhA_Yk5T z0PIdA)$LdC|0uf4|Rtk86{>yy1P3{b7L)6ci33g!3HVvOj+%<`Y$Sr z?id=!M>$L1Nz#7%!WuZ4WDn%oM5&A}il;XvtlB0JS*=n+`A?t@S8oO2T6ILGzn2rV zD9(QYKu%`l^2BEa{5^zlP?u-AAkrpQ`_uIzv zT4$5PG~XfLlrB19SUrzD1Yie~*W2OH%T-F(*8c7B$=O-|37OSbaVe}DJXXv?vVHGO zd;y2d1S)x8tf0EEumCWq3P*Xj?kqR1ngEpT z*D~D9rBpHsFQF0hHw9%0i`|^Y0MX-r*p^HXx@ zE6^~V0; z^u3F~EdoiY-cEa*G?r%qmThI^(5q(J+vW=gVoYsiJpzNwFk8k`L1WfyQH*IHYQ?N@ zOhG9#a6<$Kpo(QbujqHgt>q61i7H&QM{*$;|6wHWUOc?FThNC&-uU4$2pVIV%;p<{ z>)LwwUxQoabiMELv*<2PiA_j*V_}j7gK{M}3FUMJKil3ODqb7PjpMgHi;kAl&0lzR z{f<$frR4?)WY!A9$B7{g*dAc)|2XFRSgpbB8kzG3-mLFviM~>D7NWIg!_7-H0@0L~ z@$d<*F)p?Fi7HX+ESDy-z{_W>68ewhw@BO+$AA0%8^tc+XLnVDh9EC=?Xgjnpk0cFR>}+q1 zm8EdlF-R#b!Xv`xm-&iqqmxD8AbikmnvB}-7At$dG?w_xtS$a@2r0i+g`FhMz)#8~ z&O!6W6;<5{;=;U#Ji3c2E>Tr$#(P#ca-;E5+zvPr3Gq^@ifZhtn#!u_Gw!`5Ri&2b z&$V&+tUwnFrL^=ta*T%s(SwcGvqXlLeX(tmFE(C&0wg6x#C!XAC|gV=LQK|YCm1Ui z$(~^L;4+BqNYUba32)c&ij?2dlGa6}aNxFg_{NU_{ZY>o?Ah+PPw#fV4z5?=-@iM} zSnIf^XlvsorU3Bx@~5fRTmJ+q1*e@|xD9u(95BzviP}eU__kO78pW@1Cj}gNB-;Ou zyb#l&VYIGO0nNQ+9Glde#tB+pVD9C8;vSQ>dA5BHn z>f2KibN<{a9i4auT_j*ljdG|{B$`PqzEltxA>iXaC4YiG99!E)k8t2T0b2w8j{H?$9|Fh;kDxzc$bnVk1FImi}=$wG^a))s#Ga zk_?v>`Wq12fx%)7`yr6TimX+F|2MM28~K40YqpY6$t~zf@01?d?eBN(;XBR+qbOG! z#i*=okGz_@a0E@Yc+-}I;xU#w*|^d*Q(z1>kZZ7IdIlXJNXV^Z!G-+|%8_Pjq#iek zCNWW7Pw}a>S$L3GIKpK+TFtm!fIjFNITFH3%sEQAn(9Z&o02K{9)d;`)0e?WA%$+s zifQv48x_?rE~+g&;zFa<6*vmggQjBKr8Hx3rn<^%>@I~g$19)c78pL$#0ssX0z25Q z*W5n^Q?k-zr9PW})+B zPivy7Sg8>Jha;^xmv+S>J}w9|2E<~MOK$Eq%`H@P}h9uiu3 z3B}MKpOrhtpmGm#lZKZeux?qMk(JYD-9;diD8cjo>~b%w&Dy4_zOjDH1my5ZwmiMH z?3>5rd&Y#OFB|fNq+U zq6IwuBr*}7@p)Y%fdyR*nF3=+E4XxY5+m36r7DSx2q{Y(lWpRL1)lLXr8ip@Q(l~Z zc@QV?8>bDIrw(Cp#Q689mpS9=j!%yBG+Z)k8yA3?S#V!mLTy6bl;F`cn741+zE|HG zAKJed26XOoes1diWNcq^R%yqvpFfSi>3hH@pUpD?1DF{8VW726m)YfJr2wQfB3s{b zLCvs>pp8b3Y*Eq`>nfkGP_u@s&=|N;l9dya8-Z8fA(fe2ZsPAJSAzL z`yLoz*=tbqwhj4m;01g1w>T(C!>Do%^1@8gxV6^S+e@QU+)`aq$-$p(_67$(UFszv zBNBrc@>%yPUy~Gt%u@%wAs7KYf#?(|4|2Q(>RZA9IR(8W4twX7#IUmhb zhOenIk6Y2E9X{lr1MIq%h?~tjtNc@_dlSIH~fLWO%`av<0MHOXtOQ=8Q*C^ z)lR8Ait0`PIie*)Ns&_BKB#TyyJ<#9kjl7T?4LJW z%W<$fqFi}e|MWgGjSd0^PJb_T{}a$*NfrVEww4xdOsr)0Zy1w*rCGxBBG)7J!Q%T2 zOq@}MT&CI@+hIkNt0iz_SG!8Mx8NxvBubDJaUgp0XK~IYZwn+GycrI?*`?-Jl*UEn z9oQb=s0Il23=TrypLvg@G@sia+aE*E#hK z4a1kFzI1X7I& z>vZKaxkkEP?B3W9CUXuriM+a_@D{Pp&uZ$M4^B*tORYqb=S?*CS-V9jqe8nB2GJ$7 z@G7P&Dl0D+R?qFXcf^uo7^V`7e*~+KxiLfk>t6+)&2}}TQR0sm`J>Y$nVqMeA$y|P zDKD!Ibp%DMvGIgxa;~9` z;|MeHdg$^H*kCvcDhqX)sIo6EY6dowRp-qCEi4^xXYI)yUR}}{Q7gxaT4p1`Ocdt-*7wW zoOPd1qjbKz+g271ldD&CrVlUhy`TR%Na~q=Zd1U6x#n#BM=4_c>n2+SrKGYCBE$qCpbNyBv27V~=eC7eL8lVdzu<<%Fgry|AD*tdj7BBg!_>fO!8-B;nV>AD^a{rs|qt z8`cjAixc`}`Ag{)wv%DIXx2^}MSO=Iy(F#oKUWpt!xF=@LBKV<3ce8gdylkrJ!D9{ z{Nw?pU%ZL@pQ745*~ym)`(ovI6TJ2qvDW69GR6NKsKEc0s@-f?*VZOd#NwRYW^}K) z|1lfazh_>=@$)92Z0GVg!l(wwcz|dGkPb-bGtxfxxW7_3AkF>&F{oAL{T4Tc4`H52 zoL7nag;>-mxLFGFU{)#-WB3~u%_X?vmYa3KjOTHxfG`QgFvsNMY{a9VpoI=xT!Sv# z+C0MV`*?^hgGDQRKXY%yit+jL(xY_H*zk3vmYIo5g4FICi%OA}OF|upiVi;9sN0^& z1Q;WHYTNQ2!}o($RNj)3CFfmjLy-8CxMJ_RaC$lJk67lfrkxfUElg& zULb)nJG8;&FsgVT31I);A3sc>AD?n~e6ffo)GQb#hh`FPWsc)k(~K-BX)v@?s_o$Y zMLQ;mZ2>kphICLl#;t5jabx56td_%{Z&iL@ib+CPHfzFRIrjFpLWA?{y%$T6TbLkp zB#+O&fo@VJ*c{>0`#c}tOo8qtjjx1qy5PtZUlA%q8R*^!(2!Lu9*19o7j5x?~+V{7Q zQ{ATpt5i-CW#XjB0aU79-L`Hi>7_u~^h8tgnbA7(u{HImh&sC8zVG}2+dmnrbb;cM z@RIU=rO)mAMvuj)vpbqJR)PSiH^rsmT4B8!QIoLmr_)ZD!j-{m+`aS?zxcEq-Wu<) zelMe#z^8AJeV_f5XOWC9oL_kUq|J%yTo?B3AITUIyaDG+$mOM}@(S`#vGD^NL_Zqh z2TYsyw_G1^yF9T0dgQNXYn>D4KJVK9zIS-K5paLALg{a1>+#Xn=AHaE5FJe_&jfjd z4-AMEK@RFcfJS~x7rLLr2tYuovhUwb9PhT&Uw#}xvntkFm0TVW6u7U3`+Pt6OedX3 zFKOY`q_Da#XF3u%%>d8_=n?ilXqy#T^P6QZ$JHKcOlv+heidjFm$k$Q8f-}}1)&S_ z$(22qP_XIG96Hx@Z|}spo+`NtgEoWw+r07v+lNA7jdO6Y zuG!dp;gq%&YHb#WMM6$}uhJ8)lC-q?rZlXiSDR3_!{Mmv#>-pVI3KEqGm|e75-rk4 zz}(^M=?Q=gqhJ42`dIzAlC%-io^dx95hsITj8vab!cMe=S+?Wvb^EmvC(lHQJ{g$= ze?-ljf;=P>#!!a!gcns>V{Adnfg-A+A>E_*FQnsHMc1%eUS1wBYVmo6_I>CJNlakQ z@xJ5c<>fs&jb>h8%1$)bZBu#wW-yn)E4L8-VcWSbD4RG?xCEc#Q{(W6s-GIpLZW0E ziI*>InjcDu5#i6)HIXIUd^-A~5$Sk%zi#uWKgRbymCP<;d#l0h*o;}kLFEn>d{QI-bgBafz^l~dJoer-!C#=bOuNy!ylu0~x)$d{b!*|8J zo;AmZ7pj<&+kngE0N+T>lm2H+^0has@=A3c@OH@*FiuahNRd2e9XiZr;q_? z#OB>`um3(yPWTY^ToVSEMV-5jUxUnSPPvAnD;)u^1(1PdYG;=M%!|*?7y$XvNz{Gj zjfS56OFtYS%TLS5D5efaI=swc|IEb&rY+ogC3=fRr&0hWPp|$80&k%}08rySoS&&r zk3P_W-)HBAMG9F(G@_Y`tdkyWw!~;q9TLQVUwE4#6b!23$BQW;n4m9&cHSFT<98hD zTA2SRg!VI>bGZyY7ByBU6*lHoeUY}v@gt`(jY>RgQ3)rVGBPMs3fFA}nhUyBywA%nrW-;PKi=UiDb+lOk-Eq|7#YInmnmviesH1;l zvLlP3r&Ya6hf?=HmFK_vE9dRz;9o=`MgS@nqwaS%yO4=nxlzZH;n=!N3O?==V-J+yT9l-`XU{p~;(_L}>oZXc7ePYcS%$&n4`iy-*AcYI++ivwq=m zrN&E0aVTT_ZuT2=?pM*Zifr8dm28t*-(5ou6zPAQO2O{*wur*T4KU{!>X87HukKYf z{HANzt0-Un$fQXJdtKj2?o)FNqCO1KE%+G~#f8DJPm$kz2 z4C^4RNciIfV__zYW5v|C-P7^x1)Sx7a*gKmHB(Q|ko9%lK`@+Y;k1ifi7r$RH#74! zHQl~o3PU^%k^iXT07{skiAaUY+mTKdDNS$XIcsy?^w*1Cv|%IIpXsei&DHEHx&;iV z!v0lEt$EoehNEyrD~0KirAIuN_#CZwilL-v(vvis`NOQ@`KU1qi!B~tN|~;wp9xe8 zza1ZGv8r`;AC739@)gT-h#2)3ZLZagn`C=#_;#5;NI6~hgOmf?jz~j zjs?1ENavF&swpjxw}-PKLD-(O`h(OQ{jH@VT!Gi2E^tqW=Vgb%kaTIuF?^Jml-Te% ztRzKwpCBIjb*OMPrOKFpIt}Sbt z^Opm(rM5C&zzn-mnFgbp2bvHKz`f15D)9(Q!2|9X*lm-K_f20i@IKvNMMgy-zFmaG zECC16n{Q*)s;;f5uIan((8+Oxt_A%nFE8xY`TH3W5D~w-(cuYH6#u%il2N$AYHt%u zEG}#*(gYLywAin6lsdV5cp|IDg5S-lCdS$80kW-b!FyfrV{Xf#_Oh@K)^^>F_3;Vo zBopAU@Mztn@rmlu0^Vmn;tb56QAzh+Kycmy_^GONT1MAiUi=!}kU#d!8e={&|2usN z|21u#!zHiBdc4IwJUB+_f61-9IK%;M4=e?d;+Ooez|aB}^uqm2WPN3JG-de&Y+N(S z0>&U{k0HwbG#A8y(2M*G(R>P2H#tjB5n^m(>hg3?x2|1e-tJ9gDD@rpeo9NtQ7(a%Sn7j|T znTx;CCtF6b_&Q*}Ol37co`$BZn(ByE-zLw#oL@y7IR&g}&o6KuP_;@~=>i}qGj>gF z3$XYY`Ee)W82|Ye9zYLUuSA_gN29c2arucS-~3}@WIxLbxiz#d-aeGul2Mj^GBe2$ zc}Q(GIeR?KI*@N=h$D#HjrSOT`G*-62e!4lPYJpY{Q4y72!gF1?%c1=L;C*c!(8Jc z&A8pnQbhoG76g~9uJ-W8du|j3#2LPI)xBN#dG;~J${b>j7gx)ZzjH7xa2^ny(_&8z;FDQ$Gk(T6$NT;9zA&?9EHgtrP`A?LUNCH6>?~|5ZFAm87sB6$fd~gloX^%ml@NHXzPPxU z_Hw9z0Q1o~F|WMTYCXP$buc$e8RL9?+0Uc?;EDc-vgr=a7FB@k#U7?^SU@4GA#f`) z{;p>;#tLngO4jtktm;#N3~ZAHAWO4K^}rF?-a8HsAi-kL*_|n*qo-%!dxPwP{6|$@ zS`Tdzzuw*bod$3HuRKfIv6-cjG6F6fW0q1}v=PRJ4AEYB=P1SdUMIQiT&et(-m$^f zB9bEixW5&AZnEIx2W(M$xOi`WF@loNrEqLSGrRz0wgP4J51+)X%361O0zzIcV~8BV zgNO^99Lp;!MrMHfbVj8y8dYZjS0Pt3Hkh6+SEE}xXcQVYP8lw21bT$s6#;RzVVxT) zni_pU;*Z$XSDl5g{Dx~dv9wS&Y~VyX+WcZ2_G4?AvcZR5ZzaJp{lr~Wy10sB96bteD7+M2n(1i8hW zY<+p7%_en66}bLA?z`B$i~g#~=1rk=7tsnn@%x}4IY-l!%yj$~K@resPk zl%ed!fb94jtcgDberHE6V-3H^h`4Y6BVSm1R*?8LzE=4gL4#y4jyE6yB>ZJ>q9lyt zf+Tv=137Kb@X6RKH-{|Ys5Sf)V4q4!amL`3;5h(L;zsd>@&|_8anMxNuX#oVmTXKK z^IQi z5?#fm2?5o=FHgkTNo=eQ8jVhUE*x>AL)}6n*($ywb^A@;KR?%a8mmsbS5P6D1mP@P zOyAh``i<@uQ>-=PqMhBpP6qdXa{}U6pmj6nGGfAKAv|wIV~*RE!W^GH@TujSi|_dn z##Mm~V-?vRe1aO9%Svf&Y_f{7yno+3$P2|#MUVSTP}(rK4%;8M*;UKW3*ByD2iga& z2q1LvV6ELD;r130$eCJR*(j>A8Z8Uks#AMT7YQaEt6he@f=nX%rS`D`WA1B!DUUSm zTrw`kCy%03JPhm)5!Vs)M4GwOj_M8UDTxW;I#PkL7yU(j`x zlh{pl>pN=)_9u~gd)--zD%ikMVI*;ovWRD1lYEM?$e6YB3?k)eCm>-3*R_^1_)4ot z)K2Ph(M5Lfx~^-p|MxZU|7ii-mNqu_r}GgzA9irD7_$$u+&ZULj^M?Z1!+duM4hSb zB;2g;>qq?qP}UX)!)yrXNV4)?NTI|_#H0%wqlJYGt$3V>)RE~=7SSd7^u*gkSzHzH zrZ&P}&a!samBVKDiPP}g7yrVpdPFX##w$Q?XLRpi9l%(9`K-4dGWr`El#iI4^Z+12( zd2(c3;WCePpJbiJMvdyxKNGH>(R_X}7GCwZVk(fbZst@#MoXtGxu(UuaxWdt}~T=DuxsSIZDijH5Kr7#>h*4|7PbkX*3r zj&OfWyW!dkp|odva7G-V@rwO^foXN>^)zkR zrT7*gX01jH2ss%I$^Rzb2pd5>HxX#27IP#wHnOWl)3XQ&n7EjxB@LjCNnkE5FBewP z?FZwCDaO)-p)qleGY{qk8ra7ArF>Y+nuDd7Ua8@&V(O%G9iot?bsdW@1UkKDSB=f| znwFM``iH zHV6qFx~@&YNn6?3?hEm{TRzZfclYDe^Nmv1<344HmmRY7#CJ<{&L?Y6H8fuNElT?wzb6;*@A16>@{&2a1e#stB1o`97Xd`t$z5mRY+h@1J4+0u{uU4TIDN`q4Dx z%Y5Out_|Zf{>=Pf>#%>K`Sz&)CQ}DG03*KxQ?-fZpbOV3(NaOrVJ>JtE=wnfD147x z=L+N!$go<{RyRa}KM$_LOUa*^YzE{K_lf4%Q!FxIJ|y?gakT&)d1+0!2tg&3e9qY@zk z(x!E0?Vq+Ku1IY)^{99DwD-N0l3BZt=Rf48s#HmyIy((Lr+hDRp9uS z^{39DyEEnU@DcF+$C{p%Pq^Z@S{MyczRw({CT7ZJeU5Ol36+;kO?W1CeR76Yv}dSr z@U051c@8~vckqUush8N?48aPqGwd8v2U{dqPZ>o%d)&}p>~1257=n=Y*#R$m#3vFc zAlQ)*V$TGPHLexS(XR=$S3GCLn=n)V%MY?rw>h|*j{!BgQJ(|Jp8U>QYW&EVHr$lt zcnhcsMMcmWS3;FXC7U@@h1AGD1ovcF*D1ym7bJ@Mr()L=Df!C54kwXLL;(z5C}G&@ zbX)%O_rDL>i2V2rPNiT5G0D9{-d{{v5PT8_d_5J7O=P>wykw(Y>@Mv~ZhxQxi_T}+ zdMT~52E_Fn504W;EDppw?n{HspN%&o>r=X8s6JU`+(IygNN6k47nZP27N&if1GgRQ<9SyLtZJkhPxY3E~$L>SPHh4bof9ONtT zA55mWEiEmXI5{Oa05Ss?CFeO^vt-ky9>@|@Eu{7h;T@I7CK?hhj~DEKmQRy8+&zcj zu}nUnNMpL|NOEd6>EF&?fwE7Mf8@p=i(G~3=W3_9lPwdlW!q)U)W@-}S?L z+#zM~qF4EPxwZu}`IZ$nSwIK8e6Kd#`* zigjIc^U&QL(yDewMYWy%{l>=)-+KbU;@J%-p1@LBb24c{^g%7K!G95*?;FQ`Hh5If z`M8c5WAhiV8C4HT72kb|SQ1sJ3*Fnxmw|d<7lP&c;e24|pMe`66Xc_VyxQT#RDH15 z+WZgiBYI^xBq?3Jx@{P;5Z2e%_q}?$jnoIXGxKYVj(#W66Zh#(kbtW-GOv3zb3?8s z3HHa3p}U0U3s8Box<}BIX*zzfPT9sFZY9{nE*N_MgkpJz?OqB1`Q05h5^nM#Vf_nR z`30OWM#}$gu#m)2vAuq=+cTp!1(W75hrfud#yXhsF<4Ghl^45GxD<2j^B?1OBgI={ z_#JWgpl6of26tvX(!t?^h23|P3`D-JS;w5VS6e+I3q+N`q&g**NWMs(Mk?7X)ab+4 z5ET|=HBVaMCLrCo z#1=VV*OmN`cz6U`MD~n{UEs^M>)bE&WGYX+ZT!f#H;y&M0a&UK*bncU0RCTly+V?P zMk}o?&RX2zUP?3FZn3p7n4)`X&4W2uKmyt+j zf(B?mY$W(P`r;~Sj^<_@BxsP<=GI$^KJf8;EGxTu#g#wU-3e4tbhV-EH9hmBaA-cP ztf#CsLkGWIh8>UHxkiW$`q&PWy~9l-0U;8Ym1&Ey5|wkL>D*{uz5COM1R&o`#=-CgBTxn~O??c16E|I-W+4cNpPoQq!@iVf*D zu{BOHZz4bIzhne?z9+{BTSkhg55dsY^ir&Z+-FdeO36$uz3;fWlw`vZPjkpdJQ4SjtxkVBw^F7J*cyx%bNa1TB@cgPo7>B>(|YOp=ig`etr zLKhjcwxh<(G&Aw+y*#q_9zlDRM!J~~^^97&w+PH~)P?zED3bK$5ubq9O7A23d5wC< z&;jT9)#a_{%Vi&O=}|b$amIvjZEP$u>Z4R}{+Dr+49nvWt!1gQw3ar*mJ`7oDyAbQ zEZ@!CQdXPKF3vp9?e|Y`0Kc5)w#R1Y;VA8I4^%HDynR!aH^o8Qqg=RcoZ*7W+@;?s z1K7u`GxRHeC5tczei|_mPt|L9H4fE_Z65G-(){p0Fzx?miy_(8-1_g*$~+p{Iy3+V zc)+iyZ)q9veN%Xk1NcFf!?F|X;};q!Qgu@yLl;vEe!2B_X4S_I+(eb$!If*l# zk^VDX)s2)`+&^5Gxo}x!iN3U2Q@~1-^=Z!&L7qKw{PoZUHf8GT= z?J((O95?P?S?bGvaIdZ}E_06aLj*(AqJNh9i57se$FxbGMgr4^FqTYu0;_E(L5<;q zLT1u2to9(3+>1m*uT4oaLITf0fo6;pW-18L55d|E(br>rKbh5*`Ff+Kn&vY+URH6& ze~``VH0Aib>sw^!wixf3Gs^hB`94-x^GY0O#jAPWm)Pq$)4#enJ82Ul?it3UvUbyy zmS`QM=8K|*;x~;;!&gjxqUEp8X%8+W)a`w=UFis?b!0Jb`|(xqcPJ_Y6(>?qQ>LOt zjmL5Zt!LF7pb&Ec-TWcTq{K1_GXxYTRwoW&@6Tt;h5ccVn zKV`FH^tiffAPR4+qN1V>=r`@T@~EZ5>qMoc(oO#s$dIh;3NM2K9HnUfHfgVUo{MF> zZ`l%hZjly8yNsaOwWnTOrFW(pHJmiPZqm8xsZ>9gI6@XkjnjO{qW_i9Q!6p)u-F0y zy$*XUEIzm29N1mXD7`pRt_y<#~+J!5;3_Z=RSRC1f>0Jq08! zA%uu5EG)XeTn>30l~S2E^OlHm?CT+tmayDJ3gDn5u_I%w;TM>i>+I@lDXei-ed|qH zEsOEe5TO-jms6Ud7b}${KEGK+OFuE)~WzydSB>G zpEdZ*#5!&b!R9Zj*Y=b%VTSA7ZVFDB}W)t#GSc?(`M%-0P@_IbSgJtkyFb z@v0%p)?h!jjqs8MZ=W3fap9kG=rzavRX5vSOUdc~JcNyE=NL$qyHgIOnnjy8mNou~ zx-d24*m0B3ZPuc>jLo&~IuHd24>@ElPSa047^-gX1!{$c? z_P?_v(in?0f#Uk1*0^JU4IAYf`yrd`Z#FLY0?5=?L(y8rY zh$5xzB^V1X63kswKxc!Q!l1u>I(A;u-adMCMBC95J560oEq(kYnG(Y?`qwyhV8b3F zi!{1a@#^-a1mW&7717q*3gVdr(7yJqw(>y*LJ4P@Iwh)wY2IS zTR*w|_u7HwLd<+L!nSu15Xmpq`Itp?(WkC&W?U|zhsi=ojkFtNmc(K}PFKaBdP88OU!R9x+LjO|Djw=g8=Cz)P z16lhzxlK!ffL^(itl*Zrs$vkW+!(oJyW!tb+A`0=snr~Gza(xUT*Y;LbV-J>(-lVI zZ6y>f= z*nw{Q86`1f-v=f0pLTa`X8m_YMpsWDPAVt+J8L+E+pzyR2k zX5T`W=uQ|%nif6qE6wagMf(kf$YV*7Fx33Wk4CzjpsdQ+dI#?9?QkF)C72A|-r?`< zIg610$gY!u|Y{L*p zprp#>vYm0#5YTa9C#khkkFS6QEtk_~{N3vZDH@i|W$mv%f^vGsURV5tt~NU-Jk}4y(PPZ`v}KM83PG1RZg$}s zntOY1LPDG12Z8|q8pk;8jq-xt*VKWS#FA`q;lcx#aT0v#)x-7Y4tX5XQrIYznbPER z@_1yvgY$cmlNvvw0z`eJ?4OQ{Ei*D1{>s}>yJ)#|A^n%H?v$GGr^Pmng+~@x)6PK% zGcKlZa}ug&(IV1`|H#t@?XMejk<8;$6At&fZr7IY^IE8smShc%CRTHhGE1=LCyH!p zAxGs)`=YUWvq{Qx5|9})$n};n6-V-BW^K$xjpCBr7DG}*E8lp;GMaBIqG(>V0-k>* z$p>LHsW(Dxhf;RQqn=r4TUw3f0G8LbvsS#q@5YBVc5iPdj6LYgi2q*^b7#U+s14=C zuDwk@`GKDWjslAqE^;RRIPN$5HFhE_z zhVDbP({BNylFsc&ZtI?gQThrbzN zTL#Qz4zY6Q()UsFAD(O0{(B>#Hs@UyNQPQqBG;eGVux}XtHeZxQSHfrFpT&ICzss( z4}V|1?w_kK%mkjC78Vzgixi)3-1gQVBwB4hAl0v2kId{-D6u?(HX=QER0dajbnS-7kMy#^hChk(bj1X&21lFK>buFdjtnAw%DENR9e?MBX&@Z+wV~Ux%EQ9!k^|6gmw%RA-pa%m)KLVYOkOJfIczv|*5YMW zYl>WTZtIexfE$X*F#vp?8){QYVn3n6M5TfppEcMk3yb7t@%4D4*qIB54UaZ#UA@h{ zemh`s_s=cPgNuA%{FE9`ZH~2K2o5F5eK&%U?jOwqYdvR^8FX}Kv&*Fzh~x%%+K&tb zw83){#U2+uAzU6;yGS+;p0$fm3jIQczRz3ce0XG}q^<#y#A5i^FM(WREGwrRn&rB3 zy_TQii`WXUNw1_c3{W?rBHq3*o0RE_0<>;}*ioDi zgLGQ=K}2>!p#!C51tUKqyA;r*Hq7DlmiW56f837H=%oNPyBWs8@Qs=j4TRd(clPWe z@B}u$dz{wl=K*Z)^7NXoaDO${7nB{S7A3WOia z_v7W|!1sHo!hcR(6{T1UbXhkumT6t|#5DgLI{&?gX(Y=PP{&A?MbFzvF(*Ae%{O}B zuckfkR9NB^=CIkx;NBH7UXv|%D-pduMphanrq61MJH!7~8pX$XCaclKX=y4a+JILb zE$S#bGm=ou<#MD#c49#8jzn1h2S(y}85_X9*#F^`fPYFgi*y!FPKn}KQ?4Zh$%2b7 zb;R-!vl9th`jzgtFjIC&tgte77zK1)mYx_Rd&3~M!Xxp>o~6=x5Q zsv4?~Db^hzj)5--4fPgg>qRE~hd;VEnx7{Rhc>T#w(MV(~<)2$qrY+96Z8nx-P$y}9H@ zqrol9EtBTOhG=H{0QcC`5y;pD%lethtZ5yuktLhW6L~PYe9o(RK*Y^-?RIbKI*X`% z@Otw{96&@d;YL+B5P!+@j!ZsMy0iU;#4!>BcY2IY@PZI_QABVfm$X;hpOAIFfEG3NvbPFqva+wg*m7y9V(6$AsJ!wQ81sS zl-ju?@fU@a#L&uMe%^cS!S3sQX~*LwFpsm?y8G zc2Z9IuwAT^zLEUy>u-Y&vOU}f^D5>OgZn?58T9uCqf7x+#nRfE3DYP|IDR3<$Anr% z+LYuhMGEPeqw(vL1mx@G7~jxq8JpHq9-mvNOBY_;d5RmK;rw;kmkdHZ5(kX$I*R17 ztSPR_NJI=qqf$x~!z#T~{IA4rIlLooJ`cE?Z}lla{LHS0p_8nQ25;Q=zZ14kc zs*`l_-ib&$y3WhUtz9WHs8bb(_aO940q;yRLf_EM=ldzA!|MDh0Wz zUDC9 zN=Ml~SOPbC=gqR}iR;@-hrDl*-fqu*qpha}2pA?sY6Oqh-y~cv%E)p_<3WZTXV_fw zn5uCk*vCY=M)(c|jUQ~>w>n{3?6-}K&;K7?e;pO&8?^zWf{2u~fOHIvbT>%MfOJVq zcej+l(A`LPBi$t--ObPf(%t<%{@(Zf&RJ)z!{4)JF>^on?7gpjMIL7CI-fhxvHtH2 zC`N@1#(Enz@oK^(^y)B&Up*Lo+6bfn8}{BTvFq=(H*BVack4pIhdfGh%r%tC`>Y$~`##!z0bjEI3yq(#R--#C=__aaS+iT$O4HMod-30t*G?&y z`&!PuYo;Oe2pLK1&$Z!?F#Sit@y=7qwWlsdKwUOeBLRMM^d`Yt={o7dyI?hJo;pD8 z34l_OQi9jJR7_*zT!XpvtLD?Cf_x@u?_zi;-U&`cQ5VZR9i#Vs{C9MX+qNc19$__|;==nIUMQM+dQw&a%v?`CSs21k z2*6-BdKSz>U`aXExerrd^_G9)HbHYYqW(Nja1S8#R!7H2g*B*xfPkzc_!K6MZWF3#MeQu{@$=k+?n^{?)2r5gjd?wdK zUixP#o@Y~79z3|_G-YMB2i_<#hO1UE5Na^YN=TC6eN!eR6h&e)DX1}n@2J^@&CwIw85v&&!7Ea<^yCs-v4?= zkCsz8=R7775b+rCJ!hc08NCWlsQI=Cw*?lq%R@293nRc`LPn}%roHciHq3wFd%T-i zCBg_aTON*+CPYgYb_oImt=veBn!QYzf&iZQKu$?%$Zz^kg6B|7Q6NDtSvG45C}^7R z_z(kpoZ_U~rAM6Y$U9T)mU|}!asm-UkW`tD%k`Hkqbwq-C6txSlX!x3I;*?)_X&aY zQ9wU_E-0OxiWOF`qiB9wJLSr_`FQ8_ID{`eXyle<_%m%WW#zN5&*;L#sA9Z@fWo6& zZA!}uS0BO8cR`Q+#+Bhwczs>jX`J{)bZXQ6S51%4ek%Mb7Z1Djz)O-xNJBNqx!}7?!L;o1|5#}Q%wkB7i)>L1;3LAwX*j}JfubwQQF+&M`OgQx*14#2_1V9?zHvIdJ+qmDb*{O9+)dxtvPJ=Y{jr1u zJpG?vKmmvY<*e*YSh$r2y5K-lIcy7jrqV2Q;Qkmt_bKCCrGNDLgItD$C7iL&ix_E8 zn^jxWG6o2Ufv_Yl596bhmk79J>7GN3Fnnh#aY$ zfSZ-Vc?Qkj0Obp!ao>2^b|06+{jUR+A~)}R9`J=n#rd}t0;|*Kn%2vHT#k9(&P=ttG0UqF3G%V) zU?iE}4zd37XE505cUDEc>oFgxN-d@{dYWh=BT^3F7oy*fbUa{1SMtNfVj~KXx)meG z7OV};1CkPW9|W(vtPNT2xd3U$w_7Z|$J!G|06%WTjL%jl^N@^NGcxrw`{b#Ap-nO+ zkK(7g8AeqkA19YfxBSpgngvRtfzSZa>vHOH4CypIJF^yVb^@tC!7}hP<6;WwHIt@} zTyM{;lJ_tWuTyWnt0sW?Ko$_}S(6jzD7gQ;oY)jCV{G?nwsnmf*6=xq~{-uIw(%c+_cs-ksee`aUUi{1$m`j?QVLz{Te3 z3#@bs<=R$Tn@H#_7}rEVJ79LwSdZg+9Ds_? z?6?MW&)Y-WeP=LqXD6Rti6?P!%H{FGA-;67&rXg`4MD1z(5eTbKxmZPx*?H2-Qy~G z27G~%OXqSZXR0cnhjQ=nEbieXG<)fob>23%0UM?%HD@_#S-d8PqsA?;E z`nicaPNrF?IDh2@!Z7bTChzD{y-&4gtxA@us8DCO0B@*l3{@+q$NatEKvp_d3WPr3 zsvGPrRBP`CgdF`}WAGn*heBsUJD?nb9Qd}7CQkf(Kwm@7kQNF3VO7zV7a)F*&5O;T zy$P$2{HQ)Zw+P#3Ba9r7rjjZ!sIdDo{Em>!w?)qFXAg_lexBETPjuCSjU2P_u_);g z!?MoRc!Cp8^Go4gIRDr zJa%QkkOw>sm2dsjy7cGIol{+{dZOC}7dLwUkY=*sxqFIy371L9ifQ@Js7QjfRw5qY zG6drT9U-8n|2N4Ohw?^!#d~m}B_0!w_O9|B(E51Xe&W+{Rxg5nh}5`-g}5P1gkK

    N82DbE`NeD!>-FBG&%Z4oW7(O*QiX9d4O_o<1InH(+PnPc&DtG~ zXhi?-g5_LBt+y_NEII}74RUBcyi-qTh4(8PZLjXzzL- zN9UwUGw#0bH61Hj#m=!j^0aUr0&o&Rv*Tz+Uc8N`d;&&D3fFO~h90VPi~76qvU^Kr zOoF|;m_M{V2q3_j1G)_pNzjPk-Nwq;v&!*k z>-j+@Fm?YUgAtjWd5bN#5ckiI+hnGyA>k_GNeS+W#Hre=)M>j84a_B5t^2(587wr0 zc|-85tcIogZEu`jEd8@duTulM>V@61J@uql(*r)eDDT1NTt+B6-gOn68W|Z$`(dx~ znKFP5iww)0axRQ9hh=r^oGbUL(#pWnjIw)RFt~lMOlp#HsqRjqQ4Ute!o5eQMZIg3 zJx|H+_@=DO<(kren=PkGJj;@@&K+rP>|*Ykq!FSFfdRf71bXYsQ>6^}K+hNVa*54j zr_bOgtvg4_@@{|SFAJr0#YegIDFRb5CzHhL0;psxpS5LjhGL9ayx1;}iOC!J4VDA` zt0@w3u_#p-&W0Ss;*f33ewrh|OhIPL_nXtOcl$5*ouX&^XS3Mx$fXHLCHuTr@rU)W zE;nS+oDQgbAj#@=2Ib-1Cob(V-c-LirU_qo>m1VRpc`k54v z$4O{Qzh*;7dh8v zfW2qey|+fSKD+9-L=iM%22>$>(-rgUu2AEsyeivW$M>Jf{=U=t(e`7Vw_F)V2A%GT zra^=?>_xmu=TfLqn40<;^zi*LH>c3{Xv0OiPj;~<9dT!k#QA_#KGAf2d+ApD+fZY2 zN`Ym|kth!j2qBmP4%9{UsjFW4ndIC-mOMI}E|>2P#_eosav)=HlX=Ix)&BQBou9@! z@ta2_iRcH0XPi~NMyPDEdUQ*9-Rm}BN#mFvvnc2R5Am>`Q3Bu?$;DXe7W_<>dd_Ue z%aBY*I*pjOuuU(QQGMrDzbvI4fdk%uk?mVrmw(LMjqg9oS5*cAyUi?$aJ;r+AJfJ) zH$$m*uIY0yLoGafYx6+E6FJFXZ{6;mU4_%v*QX;5Xb<}JH-?+KOM&gnpS#s})7qYg2L4ePt>z-a{+|XI}U|(G|v`>kZrT4H>&_3{1N37Ixwl=?qQ3vM$(c4DQ}u< zB3G9TlE>Xw-lZ88OFl$ZP@bDJQcnAT363UCxf zBeMpnJ@|RqpFuMz2EpT3cXF}6wFHl>eTKmA>Ka_Ce^2EJ|wTmT}- zk@dOIwn%On4fvea#Ko&fCC%+S(x_Kgv_u(rXjKzcqU5*FxCEyD!fLp`PP*HHIYv5S z3r=&H)3;ix&NSUjC)26F3;-{p4)zyUei;chkJT0#`rUeIc4>Pvv`*_cDPS>UH=%^` zY05;NsU9W`{;i+%Td?SVImsx?^py`24P1cV7je7!Hhyftw#iq;NgZW8`RJipra80h zTl;tGrn`Erza~qmpE}5FFg!oK+6D=V=sp&|Se5v*n36#cPmliXUEL5R?|7{qjuCC_ zyIMs-UWJ3SQ|d^x)L=ulwywIaX~u$LXz!d(m=fW`{4`R*mVvc5Rn>Uy+-$$e)Y9pl zOyXbaSG3nPL<3e)&r@HvDA*|i69^<2L+F<_FxOxCJSKL{*B$pk+p*0wou7{VIZN2q zu73d?N^u_OfRsT>W{L;xOK#je6R=~7@#H4dzx9#e+2LXRNM4lI%xnY)xqOct`>;PA zWcU3bjZZlN`KP5n`DJ@y3+mfDzPb0r${vf3`>zGNRDr6-l5$zL#t*;h0yL4mfiomZ z=D>a-r|L^;mvG+H$i?)0V_$F-yPtn;OjKy{o!}zZHw;a;I3vMQ#P?KI0iN4e6D+Ip zn#i&C3{4HFtbepq`zbz7)tqhETE`Z>igI=)QtyQ0(Wo%LI}a4HCVZ7@jXGQZsWk+Q%Xscys~~Vcu*H7e zz_m#Wf zafWkWzg=!{#q!jWdrWGo>b8AMF%e`6BgTR~b~bjpNn;MhjRp%{u^s^@u*sYFRpmKR zH(a49OxzFw1BY4KSHr(mH9;U1nhDGJUq)cRXDb1BEvA!8C`^`8Ki18X9aPMIaZmR5 z3o>nt(f-gQEvI{G_9rsKh_1C*L2){KQj|NIMN>DM!xrap+$=j$2V@5KvIY+cniPkT zEEJEfti-%hUTpf_V4g+>Y$4pV`T+w2gR3hG3qhU;o8}TPiRWp_5+J%&nEUZnF zvOS9aK$xNJPl%4i2;oynL{KN`=_*?BybPCFsjaRJOld4PI>{aM$#R`Qq&}x+WFT`#%Bgr;?{cv#OohM-)jBNh3U#wl|IW?>_$x+^Q-uYTQF>;)jSE!Eu1>G zJ*_Gu0)0~o5F6=vchwkSLE1@>4bt0+qL85oM@`B z==Dj?zbAkX%~gbwMFYf$zEs)lt1;>^;`6`sPPo7=irtmJ14Fgnpk*?ErS^tWT2e?J zyi~kym-bd4M?kY7o4@y^SGXhz+H9mahtFpu6s&4}qS=zsFDfqmuO005Y|Nk6{+)L008t-}aCTtYRd9YQT`_C=vR0abB1eeyQ(6?FbQ$XTD71DZI0mXfP*ZqS#tFuXOCA7&=%-618i z+J+v+PNOeVJ-pLV%&OY zpkDSw8Q^Y(wF;w;i@Nk@G;*PSBs^F>ex6`VjPFFQ{kt7!-<=4OUH(>vpTnG7bUCqV z;+rpW`FW{6Z2ha2d0Dfja{I`u{0=6YsT>C8&A^alcyE!}``fW8G8Q)iB8ACr-tkC9 z3`!T(*sEY5wN~dbhKY+VAG*VhH)-y*qR;8tlw&L*T08u+4UvIuNW&7W4|8{Y zpR@aLhSgq%HBlbFs*;RHq@ckQ`m>CVHLLeB^#zi^YuS{GV9!>OGkdW3%vu?e8Z)Dz zAvK6*fEi;`D|n0UokN%78-5eYFUwgrHB5hUw%_6l-VWxzdq>S(oVVs(WQ*Wv- zORiw?-_7`JHE~n>j~xH(x(dem&R5-spQCGec1!{VTlf# zxn~ZeIF>iw=~({kz1{T9dwU#gp%;I{%?K|ExjpM2%aV29iwOeW9G%5NQ}E4NWGkky zL7kd|1BnI@z94mE-Tx_j|Vd+@B!u+$No>!HcxM(l6=O|s&i3jGkWr)T81KN z>#bK!^62ZnFtHB!B+`kBu_3$33B=!=``mverG~zY+|rx#(x&3w?E7w{$kU%Bgt9VZ zu&jGNa{|3v0I&=hSQRb~0DSY*MZxE44%DXoWS93qGjYNh*CGo}-m=SXhPI_n4Qg-n zM!BvL#c&>^3E-}7Eq83p-)6KV~mG=3Ta0O;@6W z_W%j7_~=lB>Xr?(M+^J#w)|2@5;%-cpI-3D9))^#LU#jyp))mVZKl%<-#<<9YrQVY zGvQT>@~w*gu!s=fJohaw^0ZZNR{nGQEsnc+kVUzp@Njt2`MQnq56r}J=eD2X#|?ve zwX=rO(yf{N`TPXo{@6b6FQ)@CkhHiM{Vm zOGLsUHqOB>50i;kTga*Hl*g>&%y}_j8_tvLi+?v86|a>!RBEhEYUPOc5h?5#g{b<_ z&|^m9Rd~v08s`_z-79GBPGdz>=iJB)t_SLu@6oTt%AbE?jti>tf;9**AUi#eGT$!- zm<1kBlzV$$Zm&_F$<>R?+5{|RT=q{q>B+sfe}Cfa;${u~mGg~fUdgTYXk4~zLQXpH zw0r+;j#*y-UFKO}HV;c>gUnJ*moCfc)dr^e-}j8D<>$BHfsJ^8u>b*6(5Hd_odEn6 z%x9IEV({HJ+(m8hV{Nu$iTzq1o@Pl(lOT|Ny4;0N6wsSbUiMS9EB5r9WX}`m{;hHm zf8p0lKal8-vcMf-k|pw2c>7>?J-vV9zgYm0hZ`!lL!gZRFEAqdyjjzC^}zOB8i04^tHLt-^^xWk>@)RNi52y~f7`tDp_`!~IbX-Iugh9i@Xggr z`6&LjD@&g?d#x}rtD4+4Rma^<5O>n($dmiL-xVFFTRw(@*1vn$)stWnvUml&o)iqA z+}TUagY}NaFhZplFLEx+_Io$@;V0mqMU1`bJXgrw-&MR>3St|GWX z0fpa1H4gwXNQ@-_lP3r&8dLt>PWbQ1;)7qH@tVy<&^48Q2K|uCENdUJins8Vxlb$3 z+lW0{dZ9ZgDL@miWRUe5>JItbU4-t_slUux+f93-zkf8^PO;eFKuZJex+(1DyKl(oGo;eH3>RuYQJi?)7@{yom%t}?$Eco@^=!8w;k7+X(-ZO6tYOcMV+@!ds{)>{em0w`}>#T zb0aiMmM9<)1DtB|f08SJMk!B(b~FP`?v}6S;_>jC2h+ts^f$Aisk&vEdkOjEF-YX< z7rMTT8)10D&^kr zSB0`P8p(>Kb~xb za%a5)oeh*pf0xm?)@HQfump`IM3~?Pf#yLNo>wwxE}vxmU;G>ewD})Bn+sP%U%BjPu^(tHys6C{F5>( z|0~U8`e*Aw94z}Y@{ID^kU)}?t{7=z1o*FLzILXp4ByK{Ah$g4ZeKrm=6#{=NqA@T z`$^blmq$R^hol6tf!DyLtwT2>D5_F$VGFtS7XtE@z$NKlYsCbHf9&?)Qj5N>^)PHA|c-J>sX$U2KQ6aN|L_OxN0rKpn+@} zTSUU*TAt`Uz^i1;mM8$t&k^NjNiP>@@1hM?kJN0tu|~Sbl{?rAQS5-7IL?QR#}I^P zpGS10O{$p;v{&3`vG&+WG-~Z#;99!LWTO-r6)v=$vWJ7V_e{!(c#VS)avLBL$c`i) zepo(ye&gF>?T8BAqF!=S?jha9mq&y^ZQ})C3Md5xDDLRS6a~{i-W@+3NocF-TUVHi zB;{J)pILZUtw1apc1A`HtzTeaq8+rNt;a+ohdfC-v7)wKaZ!XHlU)-S_BT?%#+Z&O z548DhnhbH!)>Z9ZgmS1ku=L#Py?p z#RZ85uhujFXJ|0vND`0)a3-E#>7nerh{aCY1W9h+eKyyTR>W$v6Qtd+%$juU3>`D+ z-9)n@AJ*JX{B-!xdEaZ!!ZK8e9*C_Wt=*f)AE=cpFly7#j_kIUZcL)X@HiK_Nh1x- zCBw&eTw1%f|Hn{zwH4_9<$YDqJNCc!xjWlJ`KYVq8sAwnlW(5#`G6=7kGA#}LI$gx$^xpWHyi#D&d>JqAkz-~aTnWY* zCpgx#7R-Q_M4AtI7C=t7dJHEP+mXLNoQAris#s~Fe6w4Yc>*+5>}P^)d7MZ(su~#<(&V2h|J&D^6sxFn9sH^ z!m>7+L)u2y%H6{IsbC74ch2=8t5{Q9aW@i`15R>Rlr0Spi zhxKW3!2^Y=!;DcD+q#Snc*r&PY3mxYzgV6AOqKeapLeq`S=aLOte{Vt+zp7$v0ga) zeGtlC3T(p20?;vDZS7{ScRVa!$ZryE_^1M3t!k@Bc5!6)1yu#&f8bg zvTl<`*kqA7PTuyD3RsFsi@4#H-3Qa};py!S!Km!VQu{dqJAw`=Lq6Qvr%VT|3!*7} zNOh|;3)KlPnMQ>&kMOE@c4R!TNC-lVEsqyy0Lp>9;}3n_u-pHv*w-@9mFZK@Le`be zq8x2Xt}q|Tt^E#drZjfp3n5jol6`=Fm@gJqY$u$acicQ_9|^HT)naRi z1c$-Nty6MDW(g3T4xL=Bpk*1tkN~gc=nZ~SC09YxT~EO~4R-+O5KW}z*S~u62xNr1 z?#Lr-NODf74oQHhjIEy(S&Z}@a3kZ&osv9Gq{t7Awjtw*h&x}tWvQiBjTdXy7 zvD#89wFxhxiC_D?`<|){GgRO-t8aoyk>FkMARVpbeCyykQyuL4@0S`@Mm%5*l^fRP)-v!qAWTV4O&4SnHr# zDfQW+++J9YOTfT22gA--wC*L_P8n^!e;W6C$KnrCR<^Pn8}skA1doc0iffTAzUs4l zZ@zEpoW5GPIrHS7+D`=%aKPXP1@kosgsZmlhWH=s!5V=Kc;=lIL~C6;7t~9r6e1w& z{qOfzhOZFu=Y_zV)7olJil_>whvj|1Uw}i+a`p%TjigcS%dO2>x>C<5ow2D*h?tL(`YEgW znk0nIm{!e7o2KqvIUVoeSeTX*qlw_SO2!^(NI;13myKP8(2amLdz`qONqI65=n76a zckW9kT{&U@iQiS@(!#b8JL2^;51O0)yQZzIiw8{#tIv2A#!tTbd?n&5p@U6Xdt`l- z*rP<--%?!zBDOL5hemwpwWO3mDT)^&zQ6?uEDbGTshJ`_-8>2a>s4@uU+dCWyXOp+>u980 zXA&vlpt3#jlJ2yx#DpRM*k`Y8T>2Xv2-Fg~bN^7WM)h4dVCS~<*bfUpc+V+MfK^%m zryknS=c0bb4H8bX8`o1%L6X)_)Wu}vtmRaAPKg3B zM09!>CeyTF)lkqWD%FMyLV zWP%%(OW5vwaL=g+M-tg`qM!ORywx;-P;T7r(vcT=I?rtjHV(hJO(4LCPn??Zf3+d7nc`+F9Z7C$##ri>SBZoK#<9Ef3i8 z?fTub31ab)$u^ji+1i>iSsP^IXdN8>6YKOu2h6CAlZbn(WVv-l1+Q8=R8Mz;N$_#! zAtCr4Rr5-EA=@51(xoXni^3>4kK)`ewJjfCI-RccJ^z4D3#M%@!5cwKcl?hxhTg+l zk`-Pp{IpHwlC8EqGOc9S8=VjvQyS`!YA}TzC*A?(%O6;U7s{QtMg|*4iBVJZV z_q^;PQ0r|Z4+mCQ<8c%o5!pxF)|8mIc6>T@5jvWZ&X<#NNLr(gMD>zdHpM<$=yQzE zQIi{t|D6F7CNwQ|LN}_=IRdwsLC9d9lx?)OwrVy0`Ou@9(+P#GelEAQn-+(Zc2ASm z)gCapv58`JqN`(JrfkY(c-SjmuCM5-LVmt7ud;-CaSUo13igH>4B9h!SGabSO#t_i zTsm_4>by-Dz)>wRT?Wq$xBqu)F+_l$I0iV(N;9G~CZmEAOYZ4O#{7#Y%E#PEj5hT0 zsVG0neI-vjwmRx#Rz=Y9_Llh!F0Yo{;ge6Ng*ulb)d5Mn_LAd*~Y0Rxjjn4V`=cHm!gpHA}#T6vs_7+6cpL+@%Twa zW0WABU{{Q8LHp%$7-Py! zVM#7fT!KD@qFn$y;1xuL#G`@#jdqr;J8F&snSKLfr`E_VY%G}dLnbudE@hX5Qn~RD zaTLrfnx(CreXQjZCt5ERP@%E^Cw@`iz?#FCF#P^#ue}y$uqLraKNk_>bi6{w0M;(tj{*Lr#l}P2+e3-Wb)51j{k40m%LG*Fu zed!wb+32<@306_nNCGuU-)K-_ZP#9m`8pJY^Sfun%Y2f0@CKT1zVl;_?N zGw5%-l1IRRSMJYoc9Z7OAH)$0PBb=OFeCTMTp%-97jKWE==syoUu8Jp@oQa1>aOS-!n7iXgZE$XNIaPwu+1fG1x#$?E?fvfjck z>aN`$MwISukfCGfPNlm=y1PTVq`Q$0=@9Ae9*~ld?(S{`-!I{h~nb~_^ zdtK{VYi%f1jjhN24voHHi{!fK=2!a=%Ud#;H;HmM$xkU)-TVdfpYmtg1HzIT(wpHX z`Il}tf9(C*q~OUWN#01Nf?G8_W> z@o_t#jIwfOK?e5hAxh+=fF{Vt;`!@6UlJjEL(+$1K3yJ_809159QEaJX@L*AN$-0W zC8UKx{7m?1J?NtuZB!KC#_^!g%t6%>7X-ii#!i)4*VA%S+XFz5Q#n2Yev#c~*Gw5m z0{y$<5O{)D9?)R9TwOc_>*?zk!((mFN%{TU4$1J8E^|l(w^!*%&<>IM4BskIs$1qM zd!BISf&~!43K&*)`2uJ|(HdWbhSJMRSW{-IEYsi86S9+-m)b5`u6hjsP5K%;AV&H} zN6meVP)|wqwWKzD z6p!q2)IJs$|9y=8cn~0`P51ErlOxs#}00)PfK!<&>_=%(cEi zpVz?pQJt(voK&jCgq6HhSJY2@ol*QDa)_VhlA>kpQ`kA~oKGUv*+4?-pQIi!i}jqJ zQjFm<5_Wo&%n7lF ztQk@-M!+!DgK4}qn!$E+L})TO^=h7ukL%3Sn}6QYD zPlTjGHz$f2q+kf_-dZ57-^vm@wzOHCj&!#;u+OS9QDt};<(E*NG!&9$RC1qG0{Vm_ zm~Tct>E&N;EPXrWme4UL3QadphH05VY$2#VicjnBbZ18;dVrac{Mseczx)b7WV_US zznw96GgA$`?sIk!AlZkI`RRPJv0{)L3pR;Nv`(ba@{fA`)hX4qLA%4=Mv@U#o-4}F z&^S`E^xId}`!I^pvq)5yas|?Eliz+xI(#9=*uSWXm#l~`Sr*R#hmwgLif}l2gq8hY zIWe>|RD&$aYBCgdwQ8S~@yHgT#893(Q^$7o`SbnFm5{|aFmqW{uBi0xyX&fD!p{5V zbjwRmc9<7s(e1V-qI^IBsI<9;-jVn7?R#+RDMB{G0RT{Oi2gF+B!Yt;CoMHZW!Z0Z zT)kiT*P$1i9awR^cYPh%!fc%gZ`-#Q&mL8{03OH0a1nF#`~-K2?K!NV$0*dC$dvhz zVC)TN%7vu-Z3W3rl<7Q+!vvAKSei(~VAw3}s7k9^jgr=exbWZ=inBi43&`6YfBr>Q~VKH{UV~vU<=s z);T;Df#*1TOE8TaEjfE=bgQt!Tly7m7v%-s!|2bM7=_DMF7NxFJqUmGf&A-kl2a*5 zPa3~|l*=^cOG%zlD2l4$(5akuIZo}c!vt(LP~MbxI)AS{fYS7U6kr`6OYX_LPzM&C zuKG=(gx;C7ut|qS*Xh>WzH5O@GZ1p*U*=r}GjeZ`oMMwxNuPEM&P2LtnaQ3%xh?#p zAFlXDRj8BJae8_(`s{wxp4V`l)}Z*pi0}YQ!h}zavF6l{sjN^ESE*wE?JkVRrOS3z zq5F{GAlT1mvr*U5Rwyxoyp1K-o@~aQ77Nb(evgzBLnQZktMHfGfnp+9kAKsv-CXai z;_``FcJ|Pvts=y*8UliXnuZR#OoFVU<3lS(zfd4IF2|=vAbH)+ZXz=$gNFD8viy%W$;{#l)_F zw^sB|Psh#N%K^2_i@n&w0JV$j1x7=_2^j-`89*q4^1fRb)iGzLC44~iqF&mGZJb%V z_LkVm@8*?0q4XBcX|Q@5_VO0U?T6{~v16h#Z@m7J;wT#hrTY|^_ArWvA@-6EEqoAl z)7cmq2q~$UMT%4cq)BI_2bVuXUp4)M-NWp7PdPIyZDVqa#`gv|rt82M;zf|uik?on z8%w#xXuP1zD3IEhtFKXhnV&3(hUvRS_Z>$NCM0p2pHrJS#Bt2TvP}}NuLmqUE+IkD zw|qwZC?e3FamZK5Vn&>gaHVozjy7~O&H* zB#fQm9LGrlv)6l=Zb_T0XZHoZkBQQe%hTOQktN35GZ}&sWqL!SO6G@*N%ZbnU%rhH z=&WZR8l`ejZy*|pN(nUPBIj@oN8BHNMv%6hngm$Cio=q$6aOF=pbPTm7{49T3dFbv z=Jlz?9gos$d>}0^RMJr{xWgSFzG2n()|Lwk8a$6flfMQjAs}OLEGQkWz}iExCXa6X$)E#GoZ;!F97nVKv(rdG8M7JQ%QilP5YRCNq+;zzLj z$R_25>wHm_9_gQXvIvHP9fkNpY#GW|Ht&-9Xn#&pYxs13#{}Qi_M3f4oOVwY^eu|r zK@Fr|X<>XKJJo*({-&VKsIjd=IpJnfP>orx+wnv;5LEUA-gOqc{B z7k)?F}@w!5}9;^Ex%Ylfrh182GaF z!giVbL=9~&PI5cLF;QkZVSPiD%4`LH0+U4XAyw|CV|)8m%c|G9m3RPAUf3F#^ag4U zFRV+hbUkVM|0l1~;D!T`$_sR!0MRrNJ#7_0;WV5-8Je$z3>M+Vwi=~I7hh?bO-oV4 z-5Fa9+r~chH7xcBrVI5ksvP_b0*`?|>NW{G$(QfCtFGSSz6}5zqxhxgL|9P%X&`Yx zj}KU)0sZ6Pg8xyRX56AXc_s5_=WK&9_Jbm_UjRJkmuerjtBgGqx+NtOSeMdVUmad* zuH&%C(<$;Gl`j-mKervIa-6SzZX6C?Sy>qblB^8R7IVn}CDn~b8^--Pipa|hxFR1i z^N0B8P_hUx*(v`;i>rTT|70@{)}Zv2j@DNUC^MI?kW&P14AR`<-;+H^%65k!a3NN= zfHGLZ!53fR1e6xKq{WgMNcbfN6jI}BOutXq?puuXJTuLy)y_gdfi{d&u3*7upQ@Ed zJN+E{dMxVNe=ov@zoaO>DA3NW-sXp0U5JQL*IImmP}3c?H6}L{ph4VOr60Mtc^xh9 z@%nTq<@eG)x}`SPngXt2r(RNcc8HU}Sg6q5)!?c0JY* zj(q1?2@eETeH|d%=@$6QVUfOiv7y!fhF^9QeA=$`Qw=7}J3m6Y7iag%bIx5AzL9v8 z@gVur52M5E6Todag@2)mle)KclwGC$M@s=gSmF(yRz-}YhNpe)H|EM#Enaz7Lf9wZl=AO3gwN-gt!m*%-7wCDdOff zQfYT7aNFA0TEoG=e3~cCTh+zSaBJtk*q@M!&D({O$h41qMSzuVx<6PpfwK=*#zZdj zJ_!7IS|`W#>-E0T{8D>n-NnoTow)9vaD1WY>QwGw_~0AXpG@(4z!6ziT6R1NK7U{}T5xw`}Qj8lP;?3-o>5-!d97S+=GH+*kN&tZ<`!+HbB-NZiRw)ig zH{xk{4%4bC;rh?=${*+siQYzw<6&&qp}Qjs9jQtI+1<;uhs}6kI@4eaVN(L+JNz)W z@BfqL25^IK{+~^YP!tf`kL{++*MOjRNu9?0FM>W;txOUOkY+?qq}G#*G0U5SUfr4irN~DbGu;4qiP=4?2)x??X-_RM zFZ$n6Yd?84Y>WmKwrvV+*vpQwCrxOsaSn;aDMwL1ERqr#FpHsqY9}9#mtc`X8MtUG zUAym*UHY*|^t5j}EyCTn+;TN|sTl;3!YyRJUXID;0huhF0)G8RG9%{=mCCnva$^?^m7wOdbHm$NYAlETaBxtCx{p)x4iJYWi zOB*o|QGnGR&cJT_k%p!<*u_>dbThuCf`T1E3X}yr`SRJ#pKRwA{tamrGJrCC$}}#t zWP!SyvQhydVG~?2z++mXUJRGTui+9SGY!rk+@EL>s)eV%om?zStWKTgO|zP;AM=zH zAe%Qi{?tpGfgH7(NaqEcT2YuY6Xhc{|JtNk?rM$&IiqfwYp(Fi|Dph?fh{@4GVLO$ z{q+Yejth#G)~QwoxQNNs{%5R-Onsf8rv4EH*D5WZM^k+FVt5TPHXQnf^W^bLEVx11 zY+UkwMN(%=JF1?;;u3fCo8su&f@8K#@}AR+sG?}EpgJd?E8PAQK-3eT-2;mpH|Ym(8JI7TE*3)jCRv}+!Np9rR03;qkIIi*%YU_j-#Vbj@v(MRMTwKj`IU_ zASpx5i~YeDKy6R!0tFyH`r9a4tWps>R+~iIj^s3pWPz3|id(!J>PV0NNXC813WaY1 zv%%$avhrKqF}T;w>nRU}zp7XWW%!c^oACxfX{UiIo#=BGS8C3d#}%`~cMDopi)M0x zKyl%Rf%cR^nP5(xxdvt~fV}#}z&w+x)b_uw4j8A)fwAn7OP4t_6th8v<1jQ5X>89o*5v^2{9(~vDzT9p z$b_PZu<~)(=;kW9C&K#NmDEvj>cw{@SZ_;%SIwnc9y{J_K-svPIvy(6=tl~^uw)Wk zsd3#&JQ|G|4`=Ng16Qu*IJXz}t))-2V%IY0GqH)(`AT7oP!A|f)d8oCU@8nqAA%CV z`ybgAz$5#(nsae#j8p7%@qV^+O~{>IiBLX;tD9?(B{@of|LWd3iTel7A;vjg!??FW zXZ5>ktap+c`gHkWhWz8f59I2&g6OulLCqW+1X=E6O|y_)9jVmpk!5D-?^26oR*W|pWEq?i$zt0U$70ao ztI3v)l*BkNoMvytUdei#4J7v^Xk+FfjW_Ra)sr`?>}oVpKlfj)#rpg)KEt=JNBuR&aLt%NcODjX=?jd40m)s4AY>&Je7;If(Nt4^vY74RNeViaLK?H8VD)8pYf z`({AQVu>UYH!Y*nX>KDk+JQ@CW*!5`Y%i`4m&ZN>yWl&5Z|W)$x;xYyU=i!GJ9Fzg z?|G-8bb0o>TB9yiJu1LqsV)ZxUSH<6*?9W|iNh=BYv$(*ROP*f*FDXq8Mq|0r(jO= z5yleM&3y>T-i5My1!KnMzQ^j#CxNVzQ#4ij*49=4pnUKz8TsFaFtf#sgOT1UlSJAi zr?QKA#LL!@04xe=B0#7z&y*j}8JFu%Na%fkr6;Dm(AxK2VJ3%^!B$DR=gltP{H_I0 zGD#e&vqW9X>WwyZ<fOcv4#++F!_!qu!f`;ksGIz;FALK66O~!sxnvmFN-IpEo*!`Kg|-dcz<-O zzIw|(!9@1ff=5)IK$eBXxYe#s6-AScBd$8IiDs(J@eATRA(1eCx`n-Z+VSD4%}u_# z88DfR5Qy%(`H;>M^Vzxc-SzOt`aWY##kE&4fb_|s8c3}GW_6~2hdmZoQ6~@CW6YJ) z*MgUO5kH+fFz|@QI?OXjjXofedsc9%>P4-N2iT{IM_z3EL~83KtuRf=TZ7Y#glwL8 zt-W!^|ZIOKCAj zAvMklHXiJhwp1oOgFIXE&??03n=sTfpUog=9a?5}7v*TxfqDrry)6wg%90VRM>y<> zV(QBZ^dVsW0CrxU8j`2=GbYI{Tir)a)fan-#*4k=B|{kFWx)W=Zo^^8sh6jZM`21z ziplvg-WGM+&0_-MkYs_94!x$THIh~IBkl~6aRlzHt2Hz3m)OaLWwllpq-QxT;ca|6 zS~?5~<+QID{W3{%_7>oYZKqryqSqr34bVO9zKXO#DInJYJj!7+LZ^Up@88rM+gUK1 zYV!AoEOG)ejRwUfu3K}=T`_{EUepVDj|}lS-E@eN)$3xgI9FofAa#OkT>3>!fPrzo z6QT3QlBB+1ugl#U;q4FO{F0mNv}SpL(yLPZyF^jB4YsAHXwxL9pFBOtQ_PrdY9`y7 zelwAJh@Fe@C0&lI8HyaP^9R9mk_4C@`kg%C1hGvBuSA!OpWoGy()gM>&bM}cO(8Dn z_p$`3a*Q9JT)d|wp z0J$0%QS%mCIcx~Dq6+4cnshA0co$CIoBbHv8oAZ%vBusiZUrOrh)cjB`?|a7c9jMB zSwmJVkYw+Zz|^_}ka<>m$Y-^vUI|p2u27}_h@bw;^JV@VC6uLbb?f(A)Go?anBf?o zGnj}Whstp>QV;S$EAM^yMf~_^0UzB^uWo0sJnnpa1n}l83(~S1CKWM7v zP9A?WPfoI2jOWuwvpy5^Zyq`bys#b}!b*#-(;RpBFi@XcK8rW}?iJ%P#H}pPuB2arZI=|56E2USM549?CeYNHfEc9f28KzRnu2i>zFIM zQnVxvkBxQ*IH`w$J7u^HC{x!x6fKPZv9ibcp4i z9s6)X;}5W*FOtPY!g5x?xWOv6>+l$4wA_Iyp?P=!5K*vtjFQI#=D82oFW- zXoSeR1(7ZK2UAdeonx_Xs-t7=MY!uj6f2wU>*y74Gnr7HWI$q3bpg~^^I}*E%>Tcb zX*}b#=g{-%MsHh(ogQ-RI>QfF!GM97T2uS_K6)Yrdgf26%suUKCQ}N-)mtZm zCP9s>^53x^3VtO=IC0@CP32?7RP<6^PXZM6**gQ)@8gj1S9v8sEAa1G6S16%Gh11D z!@abj+pK1lRBKyaNr(G+sez+vFrhxsB32UZ9Cq2&{1Cn0Rq4HeR@;|(HQrWU%(3LE z5^uAIP2UWnTF{ds@a`5OIR5Q`Pd*_eM`dLHK=va5)%W#B0+=fuSjYDvf$4HfJ$`#zT}_y z`2P_j0Y((gxfHyV9=qmLWlSwhXVGf#R12Gni69Aub_{o7b-xig0|&-pE2GwsgkNw+ zq_a`JhzuC=x zTLTFK4TYQMQYeoXwKmoK=6qXr*nHZ)53VvWu_L3tE7Ghmt36y1p2KRf;d-kF9VzY* zkAdb*Gsz_vn$uJZq)Ki3PYO~_0}@iL=HLn7kGmXBd-3e(Mv_Urg8B-2dv+8L%nTEs z;ejdn!j6IPuA~K!mqgMF`FMrY`hH7Nz{qzn|owCZTZKK%UTM|REp-7TD!b2f#*gYsj1jW##^ zkB7*UZ5M{Jv>u&xlOXg{ZI0Xsn9ZmP8@0)4RJ??+Fn~hsU6-<*RRvtE&`_Tx1OA(K z$ac|Os@qfqErHP85S#!bc`JqIr(J_^d`wAJ%j*`W8k6*9P}|s!{qVHV?8ggKmp+@k zi}Q!npfK#yEo!d;q1K^rc3zYt4I*C#ciimj_UrR$2jK53SJb5;oyBm+ekqUmy?>B7 z`v?IkU zQiSxeY?qvHVx^GMd}y@D&n%5?*anuLUU@dWtF1y@_a$HtK)Znd6+5M7EL@UF#Y6`i zz*Q*o-3f*Mw#ECr_qME&;)pc(=N1&lk-cKE(t$Epiq!N{QtC+Jl?Ba2psy-{fq#PQ z>>G0>(Y{QcScWXL(PTB~dKNW1v(9yY`#d}Ru9xL`S%?d;KjDQ<%Ka-ZvO^WR5Nu%f zH_red!wDI7#H!Nd98F zQ$F|`KLvAD_@haI5)&PR0{W`m5XWK*ESab-Fb)DhC>5|;FQzU5-j~*{%JnTkR_Q7N z9AkO|PUKj16lof!WJ#YgucdZNS3>X4-*~g$eQ{pO<>L5n1gLrhB~yHElqjQR2*Te(bHEMg)y*|ut!T{2Gh#S*SE;0yn`UWYv{MKC3mz5lm8=W zs4%hi$WNHMQ0zB{ZC99xeuuX%ZPzBi=xqXokn@<=OPY897TUp!TN1^XLj|xssw`e# zU0m=L3PsAA;dTYn;?WJxIn~8$6$5;FK~wA?UGU}zS&q%sx`?{_*f!bbz{!`dJCB-W zA0qt9KY@_T5U77Z$4Sj{-!G$VHW=dLMgeo?F3G@uPga!eGMr@&_k`~N83P)G;^~Pj z@v}*PuY5s^>>S&QGmTp&HF9CYx=zkkwN`ue;@2qr3s+JYB3hnRR>l4~f2Z@ImWlT) z*2Vi)O9|HF^O5?UOgM23y@@WjSf#RSudJ1UtdypQS8oFV@EpVnsMaL`35&( z)^cUg?uVT_FV)s?5>w8todxIpDu(bNGG(rpYDFJu=^#8W~>;CQ=Y$2N{0_X$xu13g~I+(4nY?TY3BfPzGRe}pSM?2 zv3`iC7OEx+auZR*LHMRV&)Bc1Q@P()RS&on+iW7x2)8rT@Y-h-js>jzkd^zU=5R5V zm~8Rv&Fq}2_V}om*G-HH#|C@*{(<=5!H{$WNPfrp4-X_d#W8(LLJ~`JfJWoV+bOmI zkrP9V$HUtAJ#5)r^HVe_LXgVeipfV;>o#ky4$m{j`kAjdO4=}{bBsVUPf-1^y>!D} zDS<=l$E9)9d0q;80WwB=TgT7)?Jq!`zxMgF&TRm|;stjuv{gx^e}bS${e%(Z9w_Dj zaSfTWnmpi<^1UMuzRF*1}D!k5JgC88Nk_xJ^(XQGw zYkQj}t-&?FG)A=3?oeUR%eAu9u)KV;eHqB%;q_Wstv-MkDi)^GH(>c^!wcvK`kli= z2H-ov8h=j2k(q=0)RH|LJMLLE+7yB_h``r21oP#NuWwbYTL-aKCCeBGY4Y5If#MtG zs3!TPNnd@l)jcn(3AL!zSD?D<&H}y7S3sv~xo~^^(!lQgCkN_(C3=$y0#CI9L>HUa zZq{AUn#q*rP&x+{jYLNBI#J!@+=3i7`uLK8PXhw~wE%tP^)JkLlo{}X#MXoOKuZ@(w7j7$ zZRjRzlE9qOHYj$*I4$1P#kmMKoKpZfn}*#^-&s^urKy^gz*tv{ZQkz`-`#rM*4Lzm zQ+yK%*?NZMckit{)Z)t;n|i7v6npy;fAIgZpsrs-Dqs)iXNZ}bA>}VZn+zO}nqTv2 zPs+JpcegV4lG7r{e`U3q$FtvTV7nzt5REq41M(0<;YhBFU+%f|Iq!Rvs`7Uf6kQoL z;S_#kuksXnbc2;`^J7lGwEwS0#@+SokOrt7gd~8nE{+uiW%jU%f}*Ccz+YxUWEQL` z@1EspvCI@uB6$`p43pn=s{M1M6_mPjP{ecHUH5AzI@Y0Aec1xOM{lQ%p|aT!2QW>V zic?ZYup0kZ7XvyMDC^geHa=&fI^c4z71n(*uSm8z33FgvS@YOND{AW35C=VOABHrd zf@$PVup%)dtvH`*$32OQIiA{0z*)kp-;zf^Ac)_b``PN7gzI|ym2NC{Yt9SJ!1Cqr zwLjeFhwjQ81MaBXdh!+>0ROhdQ(-~h;b8bnY2LP45MYpzF%UPCGJc|AP)qbI$7!pd z-Zae%5Zjti=>SU^yIG^|uk|N)?y6M$8FJ3$6yKd&_TVZtFB+BRsCl0Ffc3zSD5YTv zY&+t+c)TA@C=kAU%Ca_s$G%m(gEraWhDuhVYRoNs*PFtn0#HKyW# zC!(NYo|_Skz{LhSdxFm!Oiep1oR)gApIR1t)cqshU5oW@ynUO`2^V%A*L-JW6X9lZ z|DBp{0#j4h;QHi>S%#;Zr|1s9Kcu)r*nQZbi#&fF=MWUO3-f}z*O~+THbspQjf=<6 z>I=~ygh3BdvYcIlSGd1eNqJPwI)pHMz7SJHb2Btls|Wzud*I6Gfz5D=~>)q3bdOHuuFWf3ws6UtE)c$?$4A zlsC@|DhKjw7h53U3_CEmhjq9wK+GDG**^Mb+Umxw8+o9?f3yHg6mmW?^A3GR<19>l zmhtk~H_W9pKBK?kv;5f)xgd|mzpDYKClK`Baa!zUIXVsWCtpElxt*}r;>zoMpoPVM z5_CTwbB5^Y=?{%1XG%_SXA&6Wn&!u~)8gD>#;OnUo%cNv++auv|QU z=IjZyVkEzikqk$6pX*4zi4xlvXe{z(n9UW#k2gY&(-K%df|Xf<9~5KsF~V1%OP7`{ zPO*?0s@9Q1G~Iybunw>2Wl1;bT|+7D5dOLEUDR<}dZ^VC093q&zDpnK*?;1gc1r)t z?5!GXg7cEOxNx6VLrFTxXC?ffxrB{AATqBxB$_qJ@&yTPy(L6MwBvsuUbyM zi5M)L`5VZ#=E5n=O%YcR@j%m`x^ujPr$6&vx8{&&#_`jPaJ-?%l47+&6}N9>?EJN@ zE7u|I>wi`{d5+-67h&k`FjcUr?{oyo#t9DBy~rGOH-7wx?-TkZ(X7x|ZEY+s>_9VmjP5(F zkm>^6S)1lmB{7V}F@3Uc{n9XaIPqTt0|YRJ7HNLgTQ2J=(LT>5ZT)brLEbL%;j#G| z7GO*^tp0wPOPr!TNIw(`HFfw#pfa#`ox?-c7!?`~D-iOT7lrXHE0XBDupMS@x}z4l zgWuD`=NZ2`#>dj*w>{yL@v5a4w_HOd)Q>c|`BUW+RAPxJPncu@ zY{Z&ewLFX{v^+Z$89S2fYWF)B(XbkAV3uM#!3y}Qpz4X+x%~f>M8V|4l0tZ zFW#(7uPR_IW4o97sGLzdeIgzAJ>vDADEZbP?x80z_Kd}NxR9Q}E0DUIXiB!j0{i=^ zONSo#?<0c_2!EBm2|5$3t_yqf$N6$a>|xOq1FbT21)YrXG!?ezP?3hl#fD$Cp_PeC zQcYt8ulUMadHq3@ANQo!J`^lEaUQ0gcJ|DE44bR&l6XUZqSGU2wWhQ5+PU zkzg4ZdxnepkzJ{$x>5uPg`#z$i0nz);nEDrIT}CF(1V}3WhcC4>jC*S)aT(mAAuANxuk1q-p_|$K zGR-X|&3Mma8zX94r0eO4P5L_U`VK-gTlXl_WVEI|7aU)G<^x~qNsIQ(tu~o64|)TdGrD^!z5wjVx#6pD zO>7mj!AoNC_|1a@Lh*WN^zi9$vEwEYdE`W9zUyyC9+56EF?S@aF2eEFKl(t1DlXU4 zZN+DtTcfy$8Y|~6$cYn=C=n=LQ}fY$n{zFfF8Rf4L}C^y^ZRth!AT`$m}w*0fq{Mn zfHk|w%olAZ&2R@@ynlCsZp|aEXjg?)M3!zUAfU?fdnowpneJ9C!`Rg{W)siCy@pG= zt+A|2aJ~1qEM9+guQ z*9=3_QZ`X?Bu7{c{{A`{Z1I>HE%IR`8?KB!lxnX_Yx^IPMN*O9Ptlh4OOc?&yvUf> zieY&^N~EgufnU3z#O~pSe&Ro<--(da_5T_D?gEqyukn3m&Za^s3Fbl|G%1Az7g#pg zz|M@~(EO5A$E(=GCDEJ`*xw`lZbvB?Uy^Q^Nc^ATKwPet*Svja zyc6O8%4DQggzZw==`VTf;@QC8o7mCr2WHk)J2tC4aEA}53bS%#6&+N=HNm>tJ|hhB zq_Kx;FO?B*-eM=7>ygA9d^=T{4Tzfsd8SK`uERC zj&Cq~Sw=(*{LRBh43Yo+IhRLA`BAShPEH%&23?}eU$0o3J6}xJMYHM$mB#)yeFxe3 zw77pfH7}H&tu3~MAIKZf15Zi8?SUb)99C$ijYFJY=fm?!E{v9USFIR?n1unEEP(b- z#iAMytP|LAc)LS&rbF$$mNpy$LusbG*KD0mr1nasAnO|xPdx9~cUPL^5^f`eiEYri z@%w6`+j#C?xYfIxCp(XLfcm4d{;8x*fWHt%i6TcE*S$l)B(`KIqDAFZ zIl+%Yv}D!7a9~J@YJs-7Nn(ujth}oE;@ht%)EVu$#o`hsvhxENt@E|*l8ADGd(8zq zUE(_0G=`{`!!N6K$#>>W${LFz{K^zp%GtSf(YAW=n2$|avg@;7;tE~L-O&f4`-_Il z^MX^S+j!$BNevre!FmWxUd8)$N%2?mv;P#hH)Pu`aeW=;i2s(b$>K&?TDZ*%JRo8n2nZd9_>T zb}Bk$3!$@ZGJV;Jz$X{&)`1qQZ@YKtoGs6=lz`PrdgJn4X%?~=?h&^$1e~XRzC#2gP##o$kZk@r<21LOC5;#uQqXYB zGX)d9U)MjErw|ehM`~e0Mc#A{&3^kM8gLGpR}Du>KycbivZ!AYUb2Vbgleu zF@AhoEJt}l*KV!rX;W+b7}Ip+lAnTUO5sAV82bBp51ukwg;UKYKo=+rW;0b?wPFAU z5ZEhTYpeKf%)L|2XYIa+4^LjDXOHf(ghXHr*LPLCA`k7wPS}B6S}^*yIF!n+7N#L3 zgK$Y&lvEZgB{Op9NQlciJ{tdkUk;6}P-U@*9>?{1lcyShUc<&ORVQ_dJ@hh6^95xL z2N5!}`vHb(xcEjEM>4*PnA=zSa}pH?tU?&oz-{) z>#x)Vh5fDSi;qotz^&Yuxfl}j0fJu(n?&SKSttfnyB~;}$)J_yM-p&e z_nz#_G!jVW-Pv_HB(|5+Om=ju3)6L^&Hoe|V@c6=>q;~`6M4#zd^0)`pUy)rxyKsg zB4IGO823$;*F~^KG;1~{bT+F7!IUe9!*$oiR(^<>bmY?Dq?dT$bEW=H!b^#J`-Tpt zhEY;E=^bqezCWnhqqW1!n4iaS&v#TzM}Q!mku%F_y;~kJIwRFB(^+R=<*xWmISco# zUWgdTsgy#1cl-OR!u$lnUb=B7wQq>x+4-~)W)~lx>&<~JW_-u*>ACavjHPQDk_GpK zojF_2DQ_GGubG^7>m#PUHwRvpN~z|G+Ke$@_}XjUQmE3CP%k~Sn3pkO)aB|j`Xda> zs0L4O!D;<8&p4p)V@S`8p;<$xG7sFON7kcr2-yhp--bf3>T@3>Djih~qp0524lG-8 z=Y0Q?o@Ablk&$%H1naZpV1zhCDg_s>bx;f|ctXN14U#ZKdp?9HvvB8Lf~V!J{oTL0 z*M1zvi?Id-@oayu`8|D*vm+5WCLZX&1s6ru(H25 z3`@d5BuKe(X)ix*+-8CE4-M}&?jnW*Zqa`7pwCH|;>rf?nvX-n0<5%7=5|74G(9wW zPiGz8%#})E(yQ5v*f1wXtrfLs_RWIoJ_G8N>Sy8SSlT6Q9Yx?asD zojEQb^?T8meh2-jhi3R{WL>~086JSFprIOMQ_Va^r!5aukZF4^Ux3V(pizKoYumW8 z)u%mF59SF>661aeNffWN!duT04qQUEQr^@&l!H?9)zw)kvzGYdcMfwy#EdFId5mwx zE!2Sih-DZ0pIc=l*i>+hXMF4eA4+p2TCRF5gv*KAv%KU{=4;WB(2c%65nLv+S8!pB zE`Oe~!Xgo?MH|Vq`IiOPB88T#p*eG{Sl&?X43q)^+c%Ry?W0TU4fGJwyfFm+pH;Mx z!Y*jcTAojDRFX}bIy&ALUA~390nIggM1kL(=zg++Qy_U?vB&bXEaZ;yZd&)`gh~_Q z|41sXMkE6-5iWEkiGVUqg!zmKM@EOQLD3}+ifg#NowI9HDhnyIrY#J)9e=qWN47Oh zoLN9mLN6u%b7?F;8XwCwerEcVn`^z^=9HqoT0pW)^YrB@acZ8mu7E|jP8AK)o-u~Z)+{0Vroe^#*Zd{TTNLnhl8Nm&tNJv~wSx)KUw!rUo&~#%N z%LcXOkI!{GX;>HV{B@j_~9o#8M(ACF&n&);~XW%E~dG|A6ca?K>{W zY=qG)|A6IQaW?PGcmU13x(=NX^wbyq(Ep~*;<4pJYuHcB>FuoOq%xn=c2}Qztz50| zZ%soOhu>29xx5@SD5CYLF6eOq&6(FR05na2ypstxAI~l(nE`QLiT~_7vms}GuxPX8 zOnTK*D=#kQ9{y|AvA{-#dUT>HX62^uhR{AxJL7bR8}mXhZ)tT^)T}t`HG;-MJtvj3 zJIgrDun+)!?;ib|-`vsB*76(?OYv6N+bO9tFh{`dMLJooLac$Xc#Ai2z2?G%m^E#; zf!w#twt+IE53HniN$$dRBk~w?wmoy3(;vtBQ0iS^L*&mii6lkfnKz_ThH8n$l|jRV zufi$f06u~=bki?KZ{_xy*w<)>=1hn5GD9(7oWkIMm4~y~?=wy9GlXKm*Zp(lN?5Yk zZKmFqxvzu1&!xFH;yEjf(XJ7_%w9F>tnu{a&GBMMdvm$9wTwGyL18yETJOl~zlFOn z=%sLPJUkG7`yuhx1v<1XW2H_fPq3{;;4FpOjDfPPt4<2DC}7bq<(%k`#Z;T|@2*h!j{ z@^4hIf+=f>Z(s#By0>k1x4lU*oSmh%;?3RP48t`nSqr0;8nWQs#!al9FkdBkF-oYJ zgL1EsFs#b>jWZGa8JS0ZYXaB_xi^#frNiInZ66$%a4-J6`#wF}*#{mR6ck6XQ%iM4 zs>PpS3p{&78)?3WkHPEWcAI<1k{;g}BS$Z2`zNS$-nN+w5;9iy-cHxYCyJ~f7oJIf z6Ei$-SjqH;HMA^u!S;7nd%ioP?-gAJn<3^VmdT{pyf;?l;8`X;!*> z^z!71h#-K}*fj!dmMqC@@;5*7>LNiCk`MCq*1>dUe-0PYvS`0@_=>5necG*qFq}%D zUmtQ(oMj!O*A;d;9bkvSmPg|5rmz1keM`y};cgm87C1 zW7zoZ{QShY*5Pd#_4YpYWs9ep%?cDcr`3l)LS&UBL*5ILMHxAZo^Q^he|670Yu7%{0Exz@YaR?$R#wyS+3RaK6h`Nt zSksKJeZ?^+Yy$;f?N|{DQcI$zlIJ05%nLj3;1`5j2lV=}T<&BvE(q}*TgtgJwpw2L z6*;%Jz**pRwDI4q8_7jOzC{09cYT#U%yM1`SPP75omRZHT3t%_f)>+e@?}4|lPlao zMci2@=s>{hwq9%!g6*p^YhKN^gGrJjW+_5=?s!nWM?qjSbJ_UVI*w&qWw$Fli(k8e z@m}WDdI28*TLI)h|3Aq8Ut+3?6%hCT7UzSeLwtWl8t4ui)C4x1(u%6(Fq+`?*AQPu z(|Q{@uh@b9OIJY*{cFr7O@Qm&C5QFukf!PZNjsGl=u1yRqNvp*IG#rm6}!Ue!&@2AcB?_P%e ze`LLdLsap*?M*Wv0z*jG&;rukICKe!NK1E#w4`(+h;&Pbbc29^NJ+=gHFQY#yT{)- z_nvd#|6peCZ#>UhpY?1n5JD=2E`yX=>7cG;P2HhKUYko@-JGzcj7#q%x1&?l=I{2l zK~wFT=mj`9HF8q3M(H~_tjy7GH`+e?$=*IlL6#iHa2cj?c9iqeq&luP&1-qrQlH_6 z;IsTD@G`1{N3DENMyQ9F{!Z$nlxWmjL@Mb_N0S-<8s)hWrBrFlxYKZk&CBU}_Dpml z{ja3a)7K7diAM9_Dl0aS&;@}kMG6#TTtnX2e^E~ycVT-H-Yu)4;yuN&H@|CUbUJw4 zq}JPpkjDd4Isg5gC?vGNn(`cYm*TCC+fiep;A3XyT+l6+G?q@KxmRNbTWrBz#3EJWhR#gb0TOqFCZ?$DDBe!Wz5F1WQSf}Rt%X4UHhq$8M5$itDIk#mS9^a*r%vk- z-AzcCoA;I=9sw%*0bglGt8LFQ&y)4kFv{I0TPf*(|$iGUmI6|)jR5?7g#C|ah_G6V%S%Ea+ zmx!Gcg-@WZo5zApLA1W`N(;K_Jdy53T!36v^~uRItbwpn9BD>)Xfh`z{N3CqP}^*% z=1(^P|L@3uYJGp!>^RT}XRAU#OQfNcP3?}gfdTO>#S6H_2~vAVk8`qvfDH?un|s-p zQ~tco?^GD6e@IaX+~C9gX!`9Yb8CV4z+BRdg6gU9d&y=smxqN`R`{>)9bvP!FZBsl zG6h)2N)jFKR-Vnxmz8=ubGQKeev>elliXqC0+(2 z_pzf$S4D+KgYC~6^rLZpA!cMj?cVZ_YhEXPJPsWkWL%=i3s|8bG0k}@4gEL=!=-SY z>Zpfj=_Dg1^NM{<}-g z-(``7qEm-98z7cbL~4I%z@j@QYdI!S?~$JSjx(wwi;wQ@a5taL?_>LRYjM6L|60rE z-q!6po%y6B9pgI<*h?_)JGxr-XX%cAQPff)6$?Oqd*cOx zcm@+TbZ(Ca}Q%^ftXS@g}m{7WQ z6cXg~mE~}fAN0n-qSYeQF)74EHE_K2lq(lY&XA^97 z*HAlWSXq5N$8WJ2x_F@G)_@{K5D__&3BH6vyU3Q>Po+P+(X6xg2qdmKt2|HsZK(&E zUn&V*c$oDTZE);~Zfha!`5k6iRoX=x%v>8f`oHR z!IzEcv=)e0;4mZec?Mh?X`d(LG)|h-@Scd_xTbDs2?m%H{s1Yok}FLKm`jGso%GT% zoA+gMTCIeB3BO32$=%Z}yo4pntOPdif1s#uGM!gG%Q5b+_7%L9pLszj1^3J8)b+mG zXVwIdJ?+>oysXk%*}2qZl8&VtaQ%QNy6`R=w>9zCT&NV(4E;T5?k_3vsE5sbYm7vzYf#`x2FRgT!od#Eh z)(Eq`GdmiZdhgWj~)}vx5(qQSx>0*MQe;4BuGe2V((1OUWWXrpT=dGQB zX5mevtDc!wG$T8rX~hvsSPn8s_#%6sw#y@@%#Col6QCQ0wt_()(If7rF2r@2m1Il3 zv{jW_TPihX_}yU~4VU`%9{Sd;4a-oUVhZ{U!grm7U5x`7+ZFM&As*vGo3n1!ZYH;8lCfiflWX9iJ==OYqm5rRcW8uFi1zm@p1!%3Gf>o? z0YxpI)qhNEW%5rdma|LCFngjGT`taX$}{c+WABZw!@*|z@`NS@Wi==fjS4t#%^Wde z+)-zeBV^U4++r5hOnf>|Gmqp_d^K9_J$YemsNCrdWQ=!T8rH-ltI))hTN(;2aPhXT z&F8{|qmlh3x!@R*SQgI|lPv%TR9n}iUN67&4HH%1wCoMN?XM&(@zyk*8Zdu1IhJ`r z0@He3^1IJt@|b(_525`^n9xuCB_4Kge-9fy@*2C~Q*v&i531hLNuo^7ICQ&h%;IVe z!mNyc+X9k4|7(sdyEc8}Mpuih{7^70Nhuz34Az7$N+o6JAs8>pJ7HZw?<%MlJ+umCKIvaC=aft4Qk>bK$~VjjzV zGovJW$|qVr29rSF|9>^8t-lEMnL#%>mj%204V!(XK=HIA+UFR5mtOQ3VzMEWA0V(} zcxv15#dwb;E8lJ`p zwH@5?icdTJ87cqu>Rlqx{_G4n`H?+vqy=3^*t>4`^Z*u4A>6>RDg^)PY^rSJZ!vl< z32r#~{PnTRJlyyF{J3~Pab^HGLYwRmWe}%jMDNhwMUheLSW>O5_bzb9lNlJmkep>UX zze1Ox=oj5yy%pF9@5|s0ZoR#g!+$ReF)X8)H*@DW-lTa5aC$s5{3FLBpgH^8Oc~RM z#^>;ll)9#XHQ&nfaa^RP=4RO}t99}ZkmL^z=e(T#6#tN+f6}jT7oyK=du=ya@cfTy ztkH7ien}6<*n+2IOU{JW;`cv<#>;!?9xD$Q2bX44g-a50!OgED#d+Zg;F4dHbl-xB z#y!`l>?BwL9kj38)c30}RAX3urCDrCFdHpf{>P-5vu!MFj(srRVjYUXgB@$;74A71 zJ>ZOA^{WjdP<8ukMq5FJD4~^RInc2YwhD}x1RPBjuT!g^#f2!DHLa;H->hzJwM?j( zF|(514%Eh7oJa5Xsx}uH-}8O6X?Z$lFW^(eU_4zv)&Bw0)UQ)txzI z@bAU74-m6Nww*wCgB#9duYV@@`iqNPPTWf?`n^^$zkV=PRl!k)ZsLHf@lr_?M|lh4 zT#rn+WDT9#&oJDpkCSb99k|}BM9CM#h_<$|D-+4?sIm_NmmU}0DWPYI31G;b{=JdV z0esO+E35ukX$_)J0$*F@gdQ<=YLVT1nJ8qsHE_95;-5L))y!wvNhq?q_;>aS`rqKf z4yK))VCHj$9y2ye%MVx2jwC+@xX1IkrzDni-Lb-qJk(a`R0q;wpm2*-*pbTaenG2S zyTf z^}gxPmWCFT)X2t~o_0&_-q8d9+jVE?s7s6&kmiPjfR<=S_-oh~3+>f&t8CP8;kJ4K z^V<@2KJq$a8Q9S5*9UjGcgRv|Ey51{P3h^9qscZk4j=D_vyXe?j^-5@>H_7brPV;l z-#|x8{y&!=`a9*dD^xHrQuc8>sLBrX5}OuXQE(181+}xB)m|=!(#9C+GcjHT55BzY z-+lx2qj=WcY@iS9Rn#t&(X*k!lh9FmOLoL__&F5Fz-XRqQg39}+|5QpNZn#8zmL(; zzo|rlTnQp9nN_ zLwP72^v@{wNT6X}!`odh`DB`gnf2NvJG&GwDiHNdNy=A*P|tNro85wp!^?;Uz~z8G zoo_!uoI>o_{Ps)ZA3CXw*@%x1l$KQc+Q#s)l$C|%|2$_l_Y zu^nOz^@$iGAx>LTO7*~D9x9C8cbdu#lAOID^7&~d`CinQCMDi1TG~G|&Yzmw5ZFdk zM;Xr}QL2pmF#yO>gUvaa8Co#?BJY>GB4u^2Z%8$!*@b@pJ9O!Q;D8*toAHK8TkX}T zY`@UQn^vb|7-whi<0-7F+DN-;{&f@V(793j%Gm>xHNZ*--S6UB-Nn~6W}5c2J4YdY z#z^`>tQyVYx5s!*qIJxM$rLl|AF6jrJ82SrcbTv*aYWA zE#61tzI{A|hMbE^R4GO2NAR zglYJV%VauuAuwx=sSGL#z(9L+1;) ztXN2vx85oNQ0yt_j;ZVmpFHmYWO2&3E4mP%Y4?kF#zq`DaAAH+oPs3JlL6)}SL@MN z@ffP2&Gj_-u;6I7*gp+9b~8JdQ1?_P&WLFvh}|iuI|@eeEBou!Rv6yZ>8%e7O2_pB z6%k0iYMLdIILol&WFV2>NW4>;2}u);k%C4%(Jl6)emOV+rM29Q_j6)MkMOG#+{Swx z9ma+oPq#j3dts(ma^_XJ*ngc!!lOqW_bFe0xTYek(Jc(bgBlZDax=_dT3lZb!yBkE z@q7rMPybu7!!_cGzxe01?cu2G(B803e@dNg-ybrT-HR#WL~mKfBDZ|llq0m_6=9?y zWd03X33|*l50T7~m}oy3|w(zrPSi*zzwv;vx<4D9E?tFNx9zd zhP&>Pf_Vn*W zWql`)4byw4ZT`zOVow#Fj=@|%EGXzzOn}8t)~k!G?3NKZH7{Md3^i;zBy@b6T)V3u zP4|T1v#E#D`z5EhN1b6whc~BfxUpTr2Kw+WoBlhY{>*=Rqz5LTc9Z_Qkl1Js8blRR zrI{e^3p)1_Uv?`i7OzjM6L_XSv9qtrLK4nxlnaww+m|%Y7SoyYzI>p#`I-O8n!b%( zzK;5cSKfTQODD+Sh#&TXq91+vE%$AmBEG4a%~mdtA|y>m7Te>}<5g*&W8?a3CB(^O zW`wa~!2?+D!svrai5~wBCb!OZ%m5QOcTIy5iR5$E5ZX?uerh)!Jshj3@9xo4HF_uV zpyG?u!slrs!2$7P!SR+pNKC}79=HTjLA0`FZ~|}=#Ox*8H(Hp=Qxqh(c@~juZz_%+ z^gMm}=newl2Uz($yx5#4w**eaT7Yz%i*3h~P)~IYaOLKX>IHgHsv7%8 zvPvrz`mg22Q*vHXQ?PmFMdP_G{VSTP);N!=;|El~yA%0^#l_spJ!=|-EVzDLjElp& zdKR{E;_<6TM7*E$(}RfDf5^IZw>MVQr1NnNho;;8UpL6vN`mm9u!KGV;#FLSyFV%S zHWN|r4wxL$S>HR<_IW~N{e%q_F<09zg!CcqFE05$Zg79RT#v(C)&YEmU9%R{E;FvD z{lbR;Nz-HYV;>XP0;XeGn)n3x;c~P)?+@(?3LoxsPS&t{^B+X|3I}T)RIo+oQ$WA_ zm%`j`+=>SIj>4c!MIYy5tskt3fyvs zh5hMw9MW~0=HdhVv4h2S*T*Ar(udC*5tdTUW9&_{Gwbd<^zyz&aN;&9#1fb|sa~ zRVXe6Q8V@+U0toxH?&eA`4G-~(6?0O;B!{>JR<+qBzapc*SH>k@1}VW(~hN{ych9I z3Chp-7(E6CX|JcxEz5m?k@_65*CnW$j|R5=O0Xc%v{XHGdeBB#PoDoV1gu_A-Zo{= zR4gGhD;04J6e(S8uI4&@F)#}kvq%GGUN5!nwvYqSj=(-)bM1`8aO}-(^;c;UCs@j} zIN}Y;MZDCZSoe?ApDcVk|2GL_X^Yr`arh`otdsTc4N~SkbA#U!5S$~?Q*|5>+xH~Y zIio!?!N8Tpwc}Mj?75c17vL<1UytRU zo4}pU558QrRi3b9Y)gFlBtl9@R6V9L-4d%>*E!4->}cEFcR*?fxe?Gjl?wi1_$;mp zTe9!KVvGZX)YQ^JZTpTBpsadq;&T`@^H4Fgny>R;1BzoJlPW&~NvcrqazpUGb^ zzP_T^{o8$g8bZ%GUktR{j0Wf5VxssMH5!+bCm-;@F)b(>Fw)hp+!hDYPa4i)Rt?;~ zQQ-z)@E^APxNMlD{8gfEY#U3pUd5|q#wUn+hw#T(wjlz70X7q`C|)F3WZr(A)1|ZM zzEJXyoE%@2m@N=g&9p*&3VT<;NCSzlQ4ZVBt$y1Yv9GA&?y&6s^fvPeO3yv@ZnDd^ zeMzZpl>is(xLGqhvX3x=5HUR_O1oQv)6YiN*_#dH)n0&oH{{lWu{QF?O5E# zsC;LBi5~y{#$lI{$ReV&6!=en#jO50ZA?Q)$e91yKkgN2%nRW|S0N+#To`L-KH&I7 z)?BY#bs+mtRs_c|sHD95n3-Dk3+DIZ;>^y4a(&_2mx6-DzB4mFBIBa>Qn|FgE11xU zQAF0qerXn)B8Ja)2yd!u{=q>&=Tm}u|LVsr>9ysHf5Pd1H<~1fwW*wJQ4vtrXX_fG zV!0Jcal=nXosg)~O#l1G$boBd?aWI}+yb^KH@qWJs$M?Gu5C_ihl5;Fq{DWa;Qjfo zLRr=a905qlKq5ylG}$6vQ%33Gw>fZJ;0AKkupU1(0i5Fh5>w$47~0zWTD0FxW4*OR zajtP2@)R{k6kk(Re-SYax87y6rP|N~D~e*f+j8w}+~I++5_Ejg>5k1 z8btvXy{)E(jBkRvFYCU_?x&T*#VXFlhVLtFhiUCVgL^h11tz(C&cTE zdKM4R=|p6|OW%)w{YIu@QZ&=m%&k5-0oMP_@7Ab@CFf{p^7FMy#`vv5#A`!oP$rMr zNvvY&q7T&Zx)%zad~%VG&S*F;8hTibPE^cI9U{b%7YP*3UScmaesum|@&G_;Z=uCC zvDBW+9#6oY_ceQ^%_io1G32U%y7nSy`kMVa8HQ>Y(};XZac&b~u0s`DIS!Q;*6J*m z$USA?E4Gl9%G`y{McmS*z+G~sgL18W3a^cQ|6)7e3JRW*k6-08$2rTrf(^H{CqMo= zHT7)GcgdRRT6Ioq`^NoW1Ya})$TZUl29_;Yy1rY(aORbgm%q2J;Ze>mdF$fHtXefY&Y1Y6knZ7n z=uB!@#G2^BU~^nRS(zP?Y<9p0#NYgX&?DCX#6QKahkVAhIcmLjqxb&9y7c0Y;6?Xx z2RusX%kz=8@nhBZDcLQst-}sY2Ss_Bn5YiyMs5w+KnE!O4f^8E+l|DF=m`tcbgu*4 zSchBn=1sk7CBSP-jOSUW(Ex68S?7IDp9k(#6ku}>)Eo{2FV&U$li29V+GY_FrT*wZ zjA^LF=J$-Uc%#?Zs9ID?4TVSnxwfk6)7LnR0liwzUb)U;W0B;^enMOm_{>| zZ-HQ)cJ`)Z(Z2|WN%;ta!FmKT0)&nA;k^iVXrKlUXd@o{-W5V$8gR@!T_*1k62m?R{pV9%&e*}T zxXwS03S7+xmdjvEazDXiG<{qlLH=h0qJ<_(Qf#KzV~QgDpN0j-+D1<)1!rdBH6epM z3IpDvfMA(~bAQ2+V3`$FqJP45Co$VBm@?rKeQG`Ln)qMHQk>|Pm&Qt>y73%(g`t(? zrPI-z|HwF3Q{QDgg_VI@USP19b+=6+5}GdHl@SNq?o-mGhgA9!its&?bsXP&I$mm) z`*gR`NzQtKwD~r=5d48hKH6bn_#iP5RB(bQ+16*5>vwM8m#w`>{p6n}mI#jl6N?yO zV&yxD>>0+i#?cJ(a6W~FbNUlDLoz@l$g?zTl2&z~n0N)>T<($zO>M?;yHK{a$pBL#AqVcN)|BjReMGutYL8mvcGv#Y zxB})U8<-j_#zX+OW)pcs7elyN)nj+>UCW*$;G?+qXUYF}E{O{vq=bckw|jZ9*Ww6o zi}<>y42HAY7{fM@C+`xTL58TR14bZ<47BEJPxR&a54?Kz8p;&;r4D^RnCeI~#4ibK z=j(2{PqqE@``CuEs+QjX{X<4N!w+!b37-OJ_1MT&<+{pVz&)#X4*s&g)cx|S2FELl zURhTiC@_Y45iQHySK)B`2`^vHh?8Z!|J=nT)G|+y4UCtiz^NIJ)8-LEGxY+&oZHqR zvLAj^VaVcza@`X2HIKNyBtp4_InY1D!eW`4FEWS3*Ezs1q)Yk)mijSvhvQ8iW(2+~ zC97gP(T?^_FhQi2a&0J|nq;6O%NWk!erl6UDz~bUNlv> zk5uLG!w6-_gG(kXC)>(@%f|tW#g+$*4^Fb{NBf|eCg>D&9(T;326_y5lHM_LyPTF< znBmr~Wz>hxOQLD`Y0@)&=+J>irb-$sM>JdWqjGxW!o0H|nkKuZije!YV{3bHIRVM! zBt35xYS+35v6{iQM&C*u>L4I{qa)tGocz}$?T}&1PkAgNGCe7+^96#b4ZM^+UE9pk z;qA@WAxQOLWhlh&<=rdqDZ0g9e$~%g#E4BcrVeIk7_UEVKUa68GK`Bh>H_uJ$ju35m&^llr$9vceV z73mh9Hkj<&R`$)}@oBjxz;NEDN&KxpYw+H^O}|=>k08eSQIU?$?M9SYwK1MR23vu3 z*qF3py>N)|K&-QpQ52UrBQbY=YUW&F8ssX(^7e3~9oEKHhOH@aDBO*t<@YuF!6QnT zy8oG{+Mvb7DuiM<1K$twn>`IETap3$r*rEit14%<)PMscmJ4zVjKiS05^ZKFY6m&~<8>N2Awq2K z!VYdYI8}IPye}NRQJea6ITA>kx$}fjfM*dZjP}ek`4^B{05Sv!Zf$g=uV0FG^a;|j z1MUae0->GP^Ny*rkv&_fQ){tY35s$$1Sl37Qjv1B??Y&3Fo^O}Nd{&mG*M#1iFnU( zh5ZLeTLbLSE($x9XUiuAhKLguFj@tcYpq6Ue+r8|i2Pq6`JZTW9B5UzN$Dp|X2}Bt z3^a&<#NFEp!M9aa2Qk%bazYdI@&O z&(d<0GmT`6f7~ap)_)^m{Z}rTJ)Rj>G=<)8o0sg5w@$O=?8&D()Sc{9N#5suy8GZ@ zqw@om>hGVv)08@Qk?~@1Ou6UeVF;)o$*i%ymathvp#_)svV8ptB>y_ku~myqB=}Fn zo?id&z=uA2Q_1mPkvD%N?O?5Sh(&zQ46Emzd*rmAm^tV4Zc_K^>-8#5COA8gR+N~h6I3r@_2PMTeJVx4+l`!g zreVBzpXZoE++%BwVDD)p{eHT)y3IdftGRlLj-){6?BO35M{|?|8I$}y7Y5EZIAOBL z7RYo~OS>8%tQ8b>XJ0uRE6KhixM?ypG?cw`8yPyEpU?Ih=IjAZhEsyMtv{GsH3%z{ zPfzN14JF_RYF9*KCig|Ta}QE>q2w*2a=4&6%(#iqY6=b>`du>G`!7Fj)_L)4fG|=% zwqM75R89=?;VE`iY++MtiNvo9`j+1A`w-tZpbL{oa8haRYlo1YY1)N@hS{mz9JAqn zWI+~Y$slE(vFF>OFo2+C9&Bl#uBx@rU766SLbjG~s$AE<9npUlNjajlcP7B+RQ@oF zEtgrG9!mvJGgEzoGi9mD3}N|pTqNlWm#56tFM9C=w6MImeh?=qHO2qBHBzsqI6l(xV#4Q_pnNC2)mt$ygr&3BsV>X{N3)!@-~%7OaclZGL3WlLe{|cM6qD2 zr2C1W(N>S6lSMrLKKI7j^WxyAiopl>;tvmkk4V^P^g8CiN5S7H)oUnm-@f*k!j{ll8_{Qg|Tov z;mS&{}OJ~NLu zCh*je#75tk#>`h?>SzkccMzm)ZcuWWKns{SJ+`T=^V4PW2TxS&;Q2gRAD}UUR3*i^ zzkmlagm*vjzFQo!`l2f%x}OGBB5rHo%0;}_lhTI zdKDU9w4GW%{wo}`0Qq;|pZx193_mdA3gcec`zp+cxKf!1d6Fz5YFLgp1~}f7@h8ov zQjBon7}Ni{yi&^TrPd0uez0@uqB>!DLD`)5`B9?2s_vb|bp0AJByTE3M0D_O%MNy504PC+%W}6fAP85V17(%c$;ttG%i?>h}_}xFd zhiXC97Aq+?W^(ntJv`z#AJ3kNYOL%OLSN_y$|`}7N--o389IDBdygJ>^gmu5FDbji zFQ(>DiLgL)IYiPdD8Xv3`7Ipe1Ydvo(u6}Jl6>Uu#&H90Jf)vF0K%T7Bdp(Y{-}`= z5eCFSFiZb3ZdvSzjCJWb20p=*cL<(jN6b=&ZJm|YZP%$v6c&#jgRMl}C{TminERYmkkFVi+D_(FTO~Wi$n$_wu(3kAt;rTZtR$2vQhA|;!CBDz8 zMc8f)^#bWILzvU$_Yl+MhUJ9=UuGGH{xud?TJ9GUhBNT<`v%JYhA@Qg*nYE9bI@*j z#lq6{Ut6GS2EHW47Eh3MUuRf4D6R%;F?}2@Qy?eI*Nb8{Dvi#J3VJm{T`a(8N zzlB?|XOKOH^x4H!q(bDrc^#mRI{Gp) z+jm{S6Eyisif=&`~B1E>PK?>F|{9?uPEr*Fklcq1pnnXlIY1`!A z9LPD2g-qZ4My}D*j`x}lH&sL}lCk{76JcvH(eZ6p zr(plCODXj_a=%UC@ZzT3XQf>O6wF|@kgEmo0$n2zS+FcICx{9V1Fc`m(W?*It*Uw1_o9te6-WY;Ark9@bs;R{?wuSJ^r_PF5HCv|+o8Jf zg0nKwYdf=eV8lTwyG9bQ$8mbt(E(8w3P|Qp2EBi{WMyWqzuYd{vje6dRMHYbw|?4Z z6s%JqXAZ<>XvS1PAQrN0lvn{!c_}Q|s>q-zL(_o8*hf9O0;2A&8N+5^>S`eV&AFAuzi@Qou&s{CV$}4({*~v84@@D z!9DW(oI!5+bHdbQc*X$&-tqb_D}dfXCkB);$b}MzV%z_i5bB~@S&fz2QGbG2XOY@K z8k2Pbkqx(~pFimXw@#wDEb6wU8Rl`Y)$U`d=83C5W{c6GIaXCw>sHZP6xxNQrq2Lz zb4#)}7O|ZVB#$T-+Vl4%NxtFkhIW#o?tD@K*csHBbsL8X-%sACe)!U$o`0Kf=|?Zy zkU>q6C!jPqcQ{oxvncHi1sv4>rQp$Am9X^u@YVt#-AT7a=rdMq$2aR^?5rkGA+qd< zmQ%8jpIf5ujm<1HeX$1np3JA8nd?FxNjOu&ShSr!y3j)y;kq)SGh?K`mJ|5#C&RgG z{oO?2V2wma>H1K0CSG%%Pf27o?4t7pWr!Ac)nE-+nkn|MWlXqYHoX|$I3K$mbsWG- zI^#s<{X94zL=wpRcD)EL{5XNPniK(3%>6|lJYquvMZ+3%T$UrNmx*Jm+ZNoIvn3Mu z|Bz7BsN-1$l03xLO11OZvBkz}`{)uyGU}N2!NW0qtX|pB=Sva_)*QRt<)V2my_KK7 zR_ZcMuqpn$SCXx<0fb`HywT?N2+L=BtF^hEivR2Jj_~N-iu3rr?(`+>Juui{3p);Z zA_Sl!k%v^hHIj?puqm*%AKyt-RhpB@;%g%1HM<^?;$Q)G<=EP*f)RyD`5r2>o}BH}_I2R|By*Rartw#c(e;K?aO*>eea#)j z9MbdL6edlhpJl3K#(J*F6Vx{(*5VZ#BH_f+&nHG&zp<5RWq{c3yg@DtfF_NM$s^Vk*o6Kg_7;gOKakMO z_?H~!&V~VV0$#oO0+vT2P49{gJh~zg`OT{Nt9Zcrc>mf}%&!hqlzW<1XT6vmobw0m69m+Qph3L9>0{tL$Q^xq)>v& z+pR}MY?B2s6+Ncg;xz;8dtaEGz6XIR|X|XyW#Jk zBM6)=)`eQt$MLTh8em2iZLONU2>!vG-O*h(Q+0Ac(|KVZUnvYo$@NaJh>0a02h@+F zjPD7`rm&rs+K`d%cG8`IWE-yW!-VAO0jv?A6@2xO73#AgPyI=C7UdA`3zo0|GE(+5bz z8*{wd4DSAy{*N4ojh7X^a7tIRBi&m7#Wh==;tvN&Uf(glt(u{a8(9V9g#U$xQzKTU zHCjOpJD}lbiTQ?3*@iSqF36&Tgqpvk$9t`Ul#VCL>jnF7n2b;3KYXC8tcC<_z9=Db zYp}nRuS?W>v1&LoDXSI|;rp3T^9!U!gm}mNl8mBkGW%S~4xMpoYo95k)F9X3OT2Du z9t&{g07aD<0FBuoER2!&B5{~qa4=UKVA5p3Q^L%?8&#e3l1TQ`bl&`)Cou2DKj7OI z`LW{&)HE~M?S1}_M~~vb&s?(rZpQ&-ps8EiRKDx%yngy{bv`qD;2zIow+AuH#}Zfn zT&q6X&=p=l@MgfJ7UmV)Sp?m{(=u=RKn9~mXF*m#m&*InnHIp%|G@DVMNmCEw-gxE zs>Hg!($w71S5zh0)9QbPIe|vuHO2l%AhXo2U-~=i@j#i*R#P?{=)nFTGvvzIkttM~ z9#MM%Pq4*7 zzI&Jz&Bz>g24BI)DEr>w`g#hjchYP*w~f@|6+Ohh7{snJ>I~FWHIEXw5rd%yE>6#L zTIj9~r;obaZV043(^rZ(_YN_B=&d>)1XilHb`0>94)g~Re|=7a{uKLa@3o6V1x)ev zXsd}}{UUKYD-E^_d~l?8NDX_wFEAcID(?qyIkorAInnb?9W2b)og&z^sG}cSHgj@N`Xb;8MSVp3%|K$;Hk0se+VnUbugL zdB~GXjOAuwfxR?I;*n9prJOK#DX7@)czZM6G9ItN2rqhCr~2;TbQaLr4WA7AAp|aRa1^h38cZA0XdzZ zO48>O({3-Z((8VVi7M!DTdAz>O4Y-r@uf%s7+hM~9i=YOI{_cfg-h&SO?m}=sbx3u zu}Pnjoe?w7cC&vzJEI1mA0&0f1&wyR62;R3$vi!_^*fWq>%fPpf6{c^U>_}YI%V)- z(SCb1^Lu|Z^HhNqy{=@yxXm*HKAL@G5tqg5+S-6?WfUtYRtZQv2{FKjnP!g@HA1D= zHQ3<; zHgOyzBQ56orctISB-eYPj(Zi&1;pZw_l7U!De#AV{Kb;q56=D7&060AGTT$Xp)}%r zy|e&N=4x=|(*o!##elv7CpG(H3~!^x&SFETEK9m{Xjzi}5rUHUx{1$YK=t%*pj2pB zvs0oA3kz%atsePk(ZC`CQu4Xwzw0J)bL~z^PcU+0EDwsLeb^c#|I(Kk=<^@6!J)QY zB09FHI$$}`9Y9!GzwCSzZ-7;l_{&?@D!kSIu4pnd?^p3@#mZ?Zr}Rz!#VIMmlmR#z zmz!mdEzcpg$VlMnj3X9~UK*b}+3zU~x2GGjHr+?{;RO)ZiG5Xfk>4zvRMVV)qa$P@ z2?@VZ?ri4RyK-|j_`={=Cb^gC+&l)sB)$dcw7b!t{s!l)u0M?r;&y($_w5a!?(VSx zVhYfai;Z4)F#ylxbo>8+HAVl4+X_&A+DoUn+qW`KX?9DhSwqKnF{ekzKR)nSUSGV8 z%Rl%=!f8y)8EI4^|Kv5RXwB{1gAGj^cauPQWw_XFT{?F+EOwrSL0l5dIte5s9K$#} z?+Dx~#6;QLqYH?xdT2U+HZDJ4rBBUAnC88a8W+gnR9cO8GaX6#16OEr#K#nGcf|^-yE>{RyRKAs*u@S5vNTaM4pXT8O=<@LRC zKLx(n4rnJ63F6diKmy3@hfKi#O#NEVA+9wJAZ@{}Ts~uGu)MG~cMAV?3L$q1ey8h6 z4?F+yJ}XDnkrDEJImepH z+Z}a}L}YRNEHcUPrgq=ZvONj_0RG3pM5F#6jdr4NK$IUom)&frF9T}xz9*M_?5!%# zly*4*S<8ihfIHCm@#6AoH~k3sXW2t2biqHuT1D^F9|!$^;5qs4Lxqrctcy%U`M(oi z@{_%!c+Nx`a%=q+iym|x8wgu`=KpXa{!rC<%XxJQqe=IQqFnNA>$!AVUiWxBY3B;2MuV81x|Yn?WwFxasMrM2da@aTr^8Uil}SiqqsFM_+4$I-{{{IWj8%{~rnNX0N8p%MZ<(00}7 z$tZmxBI(<m;Y~C%fl+)6y}tF}}qP(yKSEfl#xug+xQEz%%$+x1z^*VunrVHF} z-Gx8ij_fbbMHn%@gQ*u9xRy(Jo!}Th6g@`LEcyNbD21QtGgZ#M^?iF^M^B~%5#r$G z)jdr|kCWeJoTrh3Si7!S>tbGIdh?fH`ks(6)kt#g-QK~k`EXrt6`<2R=U()<-tlit zSvMKY7mn_-xClHNOu_iKhe3gW(*&qpQy6>0{H5pQM@x_43&BG@VA?e!)ixP9~fw|Q_tbfF7;X+ZA?aiNEu3Sn5eG?mXzTIFo>hO%%+oO1`-Ma=Ph;UqA z|NjVM;#lcqi>uA52Lhm~=n`E1xF|x5J?TJZCtRoIf;I{L<)MFf61TkKe`owiDB*ie zRAnsDe{hbWUirrJc2(T(9>HZVKk^q1_`{>swYNphiE5%DzYIyncKjd%W7D zIob2SBiGf)Eq%VQxNO#1fs8**;OSm3(_SVW*){yt<*a znMYWKi^KaO^m+JF-QK0mw@-JV2SQ6Gg*Zt0FwZe@>!S^NNeJ4qCoP4r`Q;{wGdddw zgnuxz#xd#jPiyB}rC50Sk_y9(_23h&Q2WhKkc8}RHF>uBY+~stYyf0-tM8sD8a=t| zWd>$2_1V^&{^QYB|NGR9Jy{nCI}sX{P&xVjcVMFEY7O4`W5)O%nSn700vfxs(2Y+G z0?B}1x4(41#C7U?L|$%(tqn@HV`2qrC$IW7_BJke%C_GIz=chH}Yq?SC`M2rXSaKSY@Uy6P=L)i3=5qg~Wx;VEpq0hfow-(rIm?OJ(udUbEFTPG z7~gGZ-L1AZdipPew3j;{!+A)WmK5yYze~iDnkxRnQ_?Tq9{q0LHIr^*cNg3L`m2A) zxi`P9O1~>m8gjp*lj7wB4E0FBLntcC7B)sS2AG+BmB3qET3Sm~H(JZ~e-xc;<*+S@ zFCmu!AT|NP?~wsR1O6O!;ggf_Z{&Xx6uUdG<78<=5=5!M{iiQJU1MDOr5RBC0DDt< zSyq{uX`SrQJUtl2@Pw$_o0(|Q@X@4yt{kz@nsJk5K0ud0)N=@Dc(f8Fg?}{-Pk=C1>$Tf^?aZQka8vrU^3AE^5EA0d2mjTi~eE$cZ*IZ!!(_Tvot2V zLL6zui&TGGo#I!?J^Yu}B#c)vA)wOg-yUy?QPj%_(6F~q3F3p0re>j0;Q$fv+(D z==ry9z^Fnq*PR{;saskpRkgb4S(H~`txm+2dCpRz5^KSs#xk|AqBQr5z9!LqWccsa zfgFXITJtFml|biblAsMTE|lqs;j@1832LV3 z79MR(uxyNuULsj;C2TuC?bXb16JIv5dnq{9{T$cL@a2JRxLChst#lTA>&OM3iWqee z`=5!YW1RNZ>UaR;r9J}q-WMs7YWIkH^qj2Y>YDT9T*p5EpmzB$vd7m#HDmrvP%p^g zY33}7zrPD8zY2)1Ot3;pMVl6mw;+(A#g8KwjWJIYQHw03M#8VD=3r!yD)r*0VDxr^ zq*^;K3?G%4O@y2iXo&X5OC*rrmd%B6sU^Y3}fPl#%tG*{s2U!Dx$y& zG}VB;gD9a%vOh-R(Ma$KR=GV*ox-n|O13bHtZS*HtHqi07Il-k8Vi>w{o==S)YsXYaG0^{i(-YwrWkfk2t;r3|u3p}C9DHa)JOt{_>Ki<;z~{o`ft z%0^_&zq3OMVT<3Nc;y!ahOtA(hZH&3+Su=z zt?ZB@BjM%zz?5Xf#W4yqwig4illX($_mfV16I#r0SVKvWiPgP4LSCpA_|!-6rM7VS^1*y!UFrs z9zp#jWm#b|w*sWY1A~QUITU@Rx6^OshOIB6de&+DHr__x{e}H6eS;J4?vcMtz*&I^ zJ||-Ilw(Pf_1nN2f&D4BO9+m-QGGlasu&al&h<$QWA|zr30b)jtSHjY7UzG1TTehm z=0)1Y7`b_8IGY*^HK8<4`xPIYr~OJxt%1l&!&t)gM@SDUl+~9s&6NhYYA>C#3Y+cg zHxZ=*a#88BEk6ZT*wfUGpu~j9wGZe?V45xTYT1|XG{(M^u^AX%v9U$bjU+dE)-(=` zWV>%K38hGQyvWIMUqyrWCj#NdvrT!psy@H=_3_{AkRQah7+#d{IG_ZFnDeatxhEjdoV`;1d&H74_?^3gYy?Xia@n+9!Ce_K>t{C3%hYBc&FEW#Ji8T=n8J&Na$Lx{Lmi$~M~>7G7yosZ&>cFL4RB zXN5S~{r0*_9`pOKwt~L6YD@oFIfqq}oJi}ZY$p;PktZonR_XLT!L|?*lcbIYsusWVY_We!Xh^q$N!GK1EjPix6_QHvK-uu6m@nqQqtYhyDo}E^&}# zQrKuVM?xB>LNfWoDCpIbZxxNP)B(;+VGk!ZKkVVqcMWoxu;pbrGTGV?P~e{^HI`8sXZT89E&wOLkMT`(T~n#}-3>`x~`e@%<|OH%PmY^7);gqfTqyA5Q4D zR^|+=R=!zUJUDc&f_lW?G|+r)!y0amL$RgA5+h?F7;gTIjcwfBcV1b$nW~|X#+|LK)ju4d0H?D>V4cN)gc>lIz90`xcA4zW05W#)R%>nnh zx1I)v+oQWVDZT-PrzL$a>&eWi8DHa3JTh~Q^D4IUJbdq0=vVVxF)sPS!;@)Cxhz2m zLG6cHTIwm^xR4eGh+P+?)8Wyh`@Fkppn zv6@eNT=+F#@t3HPleF&(xA8+PW8eL2zrH$7hd&^IZHx`7W+I!Ocfq2L zW|HSxuVNwf6Sm?zs2y*qZkpvQV8@*r`OZBQI>;eGEy?yn&B|K>9^QH(IJ?X~D{h^z zR(=BM{vqY*6yrS7x<~EOlD2eH;1=<##;3M7cXr9vPY9TwLLi4LuY9<2Ye|u{-L&gL zT&6pJeUN7EXPcDBcqbskR@rP$-A|rmATBB)(SYhi@PD%UVVg)AqiSlRAp?;ysKbxL zo3P|aEKYS1>a6pAN;2D8DXVzQV}rYk^Q4(~h;O}I!upBd$d4-Mc5C(L9J&jtbxK`j zci*Mly>rYXF(WR%StYdaMStw7$nEy)<8P`y+{pSRAL?%~-PXhULZhhCkW87EG{%28Q5lQB zCSAvv_hacZE znt6KWci!+Ver(Oc{5|Cg0p|IhP+gVJ*v8CO!?Y|Eqrg@ThCm!Dzr40Ky?jJ$>~~CM zRO9_JgI_x)K?p7@s9lAfOBu1Dp7u@Wf`5PzosPlYcnL3-)v2$g#$oc3_3fK>cim_r z*KW`6t}Mn_^`#CWa(Q!dY@O(jo2=u7-AcSPNN#;XZt00UwIaSlE!jM0$wU>*gHSH! z?ig13#NFF27@=rDON_tZELL7d%E88FqhBXm5hOd4gUjT3+XJPtE`cM5NP~9fe$%|P zR=X?ZyWYe+X?c2FH$AmUm5_XagWtcuBUsr}_}(UTHHWC9wqX25a1}+y{D$>0lsfMH*t~(oHK7*QSx=?a z@lP9;8Wqu9TNwv?flch*M;lx}fBtk2w<%E6N9ZW8bZ0z$0ygT&4@%)H-z)Fce~jI~ zI>x@t%rrT%ei4B{w6%(GU&76w?~&7d=6`{NhK*-MpUi4E+u)Wmw&LUD@uj-&hlK*W zZ~atZ9yg@@=6H$^o_;B}B4#*xWd810zuYgNy=+{#x9D^EaMenuZoTksxfE_Y87Kd| zHEc;bZRxe7-fmlu)N}POvmT^GX#*=yAznmDBL)k*heO0*3ibU^6{K-NvK+W6>l`1H z)Fh&@Ub;Nt=zc%06WCzluP%KkRl7Hkx^7>0@K{$UQDu50;l@Xkyf0#pR0+6NQE#Qo zbBZotb-2Wo0*Awm!(P2y`Vud!LHGy^c2#wYdC-88pV#|g(ZR2S_|Ox}0-~x27qhBF zEJC}yxfIqrLwOmAiONIEnTuEND{SAb)!ugy{jS997g4g+O18v7u?C}>cUgC^jeko= zh)vejM3)tTeYp<@$Zz9oW_Rc&*B35kTh8yT4nL}PpR_19PfSb<)}mAxE~{_m*T>bt zF3RzK+IeijMhTi>F~9t zc9_e^75i1S90{3OYJ*dv(8K)9b@h#XuKqd6FFIZZHNj6bDBB=@%+aGJX8g1!US2c? z2IAWO->)j)yXQ>rAtEY@MJ#L7#%ant#)Oc)#5V)^y|{SQ_qX4%WQyc5wejgTAM9(~ z^`^9a2vrwR+#Rgkl-p~R&)E`baYDbgVchSo$dVS1mZ91v&^c5=ihM}>sc1iS7 zNle1?{7Y$+r8p71C5#nsTxIrM^E>dAv7sFbn%f-8?=2nw!rpC~Do}rdkS^E|f;z!_ zp_3E|FE;JBZigLN{9+AyzIIdo)0g#5qzci6X#&z&;w-Q`1?xwUQj0F-Bit=j;5M z_5yDA@DAU-L_1@V#E*|^$^852;F08=6K%oD{*Y+PL5@3{W^D(%i9aZFqRF@d?|eKO z85$hXNRkZxQiwQ0mX&=jFive(dr>JVf%7o3XDJ{y$#n2T>>zQRA*3q9aN1RrVX|g- zytQv*<3rAO55~L~Gmsm%F5CUcc6xF%Fo?v=b64!+3#ToW_ty}%lO~cG-e)d(pN4ts{Ovbjk00Py4jht<8uE7ccw{#3v_AXK=Q^%)7Lzy*9Q16+4*a{ zD;`a@lX&g=mKw)pK-!x#K3Hqo$5%!pNma`W2kLry-1^`JyDD;YSP(ylgwxJgzJ0K) zsr+%#5KEJfY@OAzZEm0ltnhYA!ep$h>HGZUSJg6ZX8xl}(M5g^L8GIR-BMshT9rzN z8J@5tVynAf?#^_rJMmOTaX$JWWUPhz@lHzh7U|gOx|#R(&|~h1fa@J!KO{SAubWlR z&F3h-yMSjdC9G-pNy8^kQ3wmC~;IHAklSRZqw zM-eHzF($Vqo+pW1E!-~@cU#t>oq^d=Y)fxR@HKr@DKdYBLqHI^w_MUwR8>`8WZ?$D zacIYde6=#X9N*b5eoI-dUVf_x{|kt4X99f)SPBt}>P zorZf+aq!^fVnGZe%(rJ~77q9h^iesfFj(39F0D0r$r0fRYS*2@l7={__k{TmP14K$ z?Z0^jEm?%*Iiyk62P$hVS8VFDhMt&>tb8!$_I@`*z+gox)*(z#9(?~q1-8fq->jB_ zFPb{tX2=Xt-6#_(Ib(y3nDzSaXZ(S1USp+dL*l;TPS5F4&nfS3Me=4l3(go#evhbZ_0*|@ zxlhYupK^?skNMzR78G4xOFt5WZfzOh{MyhS7Cw2m0NHncn*`lJN-{Dq^;*mvMR74UUB$CQ+;$w{@RLY%QxwM^~WD6%gV~v50>c0y^n8-1hg;~Ua3!HZNElA8l~>A{W&9;pB2L^mI&|MIr&|alSD7L$TN|d{K->U%Q)QXfZ##RO7i=I zU;5&Kf+Ejv$GktTK?Npx)@#+|3vg>Vjk$VFXay@O1Z1@3mJ!q#F-Px^IXJin)zm0` z@VR#{0jnVJ&R>l;uS+e`8XclkvbM7Pl&zl_`=8 zZmejQ3zU~FSB(ip_bN|M3-yicsOF{uaZK2%GEeY>Y&6kYS%H2?PMzM|#Ccq3Je>=4 zJ&B%ldiC((rQzTQT(~Bky%!_lE-kcHSom}~@Phhs<|3=IueoxJ2FAUEeq7_3bdf8c zPvGu|zRU*nL8?-pm}t8UPTTauCBV@> zo$K5^0!;J#Eg9o$rhb0R>M7NM$H%y~c6J~wE7VO~r=a*4imm>NW6)pZGBO4Z7};Hy zw{#2)3=>?^$6VZ4bw~R>4jLiKF8UDKw|g?O=?^bag;3eV7_tT2&Pa_PkcRpAhq<`h`9&G-B%szq^9#%&YwMAyQiHQ*Pm+ z90wlv?u?EZzUH=pWKMQBCs9T>k+~LBM-ysrGY9^Bh<@qx{lKekpW2a~#r4no+o;nr z7H_MZ#YH_`-XDkPP_xdFomRY+w4XN(*+mYb?W;V$$uShm_ zcaw%R0e;40$xK1fSF_RL{fc(IchrF~YyIgrJr4(mu+yUfKb*AnaKHUi2M@Pp*uI}-o9CDC?}z~Q5J z2l7GhuGjF4BR+V{v|0}-2{9er*exNBzI40lL?eafnfna9Sn}>@>#pCry!T#TYdD!V zYO0!4hxHBQh6JIIW&M?upe?Hx^BQ#M((e)bJ)~Dq{6Om-%DAqfc^0o_+IutHrG2}m z%zvq#1n*{^U~fm){pabL`0sFX4BZDq>GdIdp;eswF}#m?G>76Xx~$qN?M0}5t4b5P zzIA!S$*Q@ZpKda=jL@1L%xp&}uFRYI$inwOm3PsW`@!|!HEy@15XNHt)Ms9KDq(H# zcK+^WMtu>YDRWeESqj;@(@iQYEc~-FDlF`cG91f6QstuiXA)~zd$^OIW@Q;EDd|Rh z>Ipkmxbe}ErMr&@w%egXCijmYf$sGjY1RyE25Rgtbf`NdU3Gn{b83U|(mG%Xd1T=^ z(TUDqtU{FI3CNP(lbw8N9|+hc2}~`!V?U>{?RL7hv|=Z*46u@4LE!cwH^9k9^_2Kk zRaJW@WGAG|zI%O*8#CU3b?3(P!(h5qLdM&UmQUoZMSxOr59JRyqvXDh>#;90*e)$9 zb+@6aXS_9hetdGozP82vL(}n`F_BS1>S}63mvX=V^6Ws*og`l3lf z?w?WQWUj9o@Xm>Yv>3C==*REc(Ti&Kr_MNx1_?An;_(ltHmfm)6 z2cA;d2agLh45NZX?Yg^nl5!3#=V=iZ%sl!0bWsk@-VuQ70HWYr^`xwTo$dZbgzWok zraMFgjgyXy9EtsvWjcNjRt{ZV?@!X4P9g3s)k~AUdnS`@Yf+FOr;%_wgwjOyn+K9W zrXV-D7{5dJGbz?bQxlWdE|IGVcnJjuKlDDP4b5yF_uQjd*fY5lxskmw8G9OrYzo~n zh!ttI88XP0<1phQy9h_fTwgYqG-QlGM|-J)f^6B;H{?!zzV>%j|!u5mA%O0x-nv zfARI}qn1o>op!?D+r~e+SR-JweA`ZqSEZe-JOc)n)+|nLW-TfCL%Xdv)r zry<;@`|*C<&mg!_HaF--wEdp1z~L^lWi%&F5dlJYn~kcCnGyt){J&_Qo~~aMuZk{$ z!Gb}oKgizl=R$;qfl>N%DO|RxrzeDlp^*A6UDFcTs|JC`fw)KWsYmQs6K|zY@804w zem%`A@}?8p+;y`znJ4cMfAyQZF1OXkT!DBv5+=hJfl|bl9%*}H)~ym|-a&w!PMP3R z5|aa;9Qvu*kYF17)gQLn(DZx;{&Q_n4;)MpwUpn6%2c_%<+v&<`v@R?IR{_I>J_i( zo%KxSQ^}JZd%uU0SnuYp96*f;h}|3G`NOYwBi2flMWeYn(X+~ZCiS4{BNNkfW^`Ss z_lN1N9>2ic&KnUs|bveqD1iP0055id)qBu%bvN zB&ZK(<897PW#RrPus{YD=!=1p+Y-p}RtHgYlo${!E{(lYr@&>ZOsas(-Y=OG82gTt z7Oj^)nqkJ~KH4<)4G9l_JfxfbC~7{TnER59>|w)Y+fV8F!P>WE636l6zC9$QQ>4;9 zbe4WldjB;9^`HeZYo4~LS66)Oakpd3=Z2OGd8eZZ%xG;;-hY+(c1etPHVKgd{h_Ia z+K9zrB~FVj!!q*(`0Bfv_s;Nm#=y(tH`-zdy$FO3?OBmHb_-o39(*jPI#f5yumTZJ zPf!1IbTnAt)_2-@ypyA5<_%!JirA`Fjrqka$*pT%gp|uAhU;2MUcJc8En`5b(?A=p z3eh!7FLf<(2fE6eK(aRvZ{-}!DQL{YHoolEyQaDwN{z$u+x+;nr51J87FU?<9>K|& zevNS965~PCp!jh-2E*yL+K-7MY@K>F_Ob^f4sU~(dWicWC1vVpLtIo+vT1eIj*7(* z&C7Y22_`22gkID=cC<{YUZ1KgLnbM>I5_zG0n&txbvjKW-IV*bkiV>;M6T6h;oXl& z$B2+F!3E;pGFyXeRj^aH%>R+TJS5oD0rxdFY?VwO!fnu^;`;-C@T8z4#8aD{xRpz0 z)&RAFnuFyeEnc6LF4>VnJZtO`%?VXjpkiWVVwwn*J`#|6qVG=GTvs!Re3@Ki0*VZrdLH=U^j8yaCW zy_fD^#Y#-_xIh$))A0tyWqSE1_pJWRkR>7ZqmtN9aPAxtPMMX=gz@hF`q8v~bub>=mL^xWsXS=S}5Bff1jepG>+{c=`k#S0B?8f9oV{-%Zf zhtU%`X-SsPQu5d>Idhh;S4ii6xY&57oCjQM?Hu-%gmc-}Ykw11TaEJ6Z$ zQE}HianRxo@j>dL>N^ZEMeQQaxk z;bHW8F3_D%eus`v59Pis=#(pe6vB(&qED$W|CV>5v^(b6BkVY`gozf1``@;mN8P_N zkX?Tg8GQ7!Pfal=SlKsE=cG=6sJ$+8gM7j{>_WLPFDG_e5a7`)0OK==i~eai#QQ&{}B3lbBI?cN{m@6Iy}BN^11VjI)0>?Y05-l(NIGqX$qN!<2RD~<9a|1T*FNuE`9#Dbi-WPY|s0*MSsb2~SQqa$QZZNH`E zl0|c3#|aelxcTwd4=>&w^O%3az?^F0=0*dchB!Jb%<7uEnUn&tdzLZ^U+II8I^<1* zElC-Weo{}?{ObGq2v1u1`~v(Ahw7&Gx7PTX=8IYye-bki(LU>3Z>xkkrN_R8Eaccg z+3R&ta;(r!R~P(VUuwF{NR-vS=Vv1+5`PzLbebHgZ9_B<{8%d zVrVim$dz<~HA>Oz8?An5{SK?Owe`jamqDZ4#@;Eh-D~jP6zu8hj)_QC>`UxrOT z&Qn|*!h6Xqhhg3=^^_V&;}uuOwI-F{eA@v#L|pO8YzOA>3F*W-O-hglO7XsqSfB8* z984oaaE`=OwwVyK^AGfCe=ZT09t@amQ{!*x{_qln9+)jJ(;v_4Bg*RS`S@#Ma`K}B zzqaIiXca`yNWnvu@Lpxeys;+6rx(2|*0MP4VK%2xKJv`{-o1OglPnTJb27R>RFPSj z?uJ~w_$06__=`vOKr;ceZ`gGF6*Q9iofe+HJl)%_Loj{n>}@B`8^RJSPY&i4*BnF+ zT%CTw^07nMjryV8C_9mML3wUYJ>lmrsp9z1OSw@?+uantKXeUJ%YX^6DqxL4z{9<_ z5HfNxvO`)#DG9Wyz$Osi5Vvt3=FC2ap-^!;P{^{v#KT{K&lh8p_1OT)R6pZpXD@1- zpDxm2fvFh>i}uk38SpObv*$`Rb<_mHsV_)LOrzJiBem2E7&$wS@9E?dB;yje} z*Ojsf0~{evTP-&?cs0Ke2{U&ALL@Mmo!8s=DT8kq))TK)i}6g0nTPO+oZ zAFR*P7*C1R?F*euBkEe*dQzsQhB|EwKS#Eh@Yk=dqFcK~0<;rzb9D5eC>>?edNbLV z`NVKE!qL%@FnJpbi-v}#SAY88;L@e~t}YTR6Hx~2hqTf54=L{+)L`;@&v$R z6NrjQHCTcrK2YNH`|y~6DOVRohwk>AG15Z?q|4VRbQzBe%J{#8`R;WT69bXh3uJ)V z)Y|&3`5p%+pGXNllYE8j0mp_&7ZmeVGsAH4NBFWiJHpSfW~sFlpcZkd!FLjq&2v{0 zcP)Lq0+10OpI^(GBTL-0zN6hD4Lfn!W+sit)8$QohTOB;wK!cxCtsTN#DCq|z9`}S)tQzDk)J?bu#$Nlp7jPgR;p9f8!rX7*>uzHmUwUHIDaZt z6S<{-poQYtFGtk2m{V))M;|czzK_-Xtj@ZLV$v>&@>g`2vE=wB?DEOhK*ZWZ(1e*0c=6`y=jziT5 z)buf#RQ>+66Nu*ViB7(gAmigDKX#P)f~&Z;f#b(J5ke2|n?fL0^s)`2$|;3KL?GKv zsLq226uw$NlUF}zlzqYNpq`$M>DCW7Di7?2b8bo~r5HpI4eb5O!Arr}Ap`9)rSYb| zVKn%gf^-|$&_e$rv%;q6J{p`I8M6lYCs_3v!HT`1NfuiQUvRAg-QapSoEj}jv`RBf zg-f4M0P8PFLBXxqdAx$INR(RslZRO#?ef0L=?vBoN>d#k>n{It!(ePke^~AGunfx@ z`MV3Y7@g#{)m5l{XHh%U#(%03-i5FHNm%~Ni3_SEs#rC10Lbl5VadsifCx-2>|F>| zQu;YO)&dBsCE!-Ex|i`|(Q)O#B(x!c!vS}R6@}C;(e1G;w#RerZH$AxZ_<8IG(B}q zUE9|LpQTN-gp^F*9@lspb(goDeyxm1$}K9gj}t#h+`U>r?u|=&G0?HpoW-8}J~%E8 zR1CYSL`HMgk0@GNYZdnR5=*|`E0HIA38+W;F=Vmc{J`G5Vax4QFOwttf1WWA~f z?8fu^UXtAdRIUI+8t{q=j7w8}vX0okz)X}OSf2z?R!06ah)0_vx9wdo^GnlS-_6j6 zd^u`E*2@jau`pBX$*861_ zT6%z(z&J4U^%@)7rSxNZhDp1*-lbCJ;tdHKT+pOd?@(KKP#zBci;QG_@ZbUXRDA@G zgO3YdK9yE>ApHQgoxf~hc;gJeMMUEaR)?O_{nu1Ej4_JuW?I9xqx-PLdPi?v!u>5G zwm?UeOKI0~SCP7{@`+V`-=Z_btaAuoaRV-dZa7Tk2i#dXc~I}KbiF$xqr4UCrB!pn z^YBm$y$~P+KgfR6rAS8_`g3fop>KomWP1FR#MpNOub{vfoKi}uFbP-Gyrh_D6Pamv zbwN;OlQotoZt&OX5_Z3H%ph^h(awXDQEy$_%d~1zt#GOGlPitgrBx+Z2`<>08fAqy z*t3vGrBxm=H}3KgZ_xkSYzT2{wym6f~k(-QZt?dF<+4<1pHk;XL{_>zc*-~Uu< z=kVQQtQddy=+f-Z?2#3mg^Y3L!7)^eCgNMLP$GmZN+sN3e3jukB!UpNM7D{IWmxVk z!{huqr2mrMzQ^dv6g0A=;7kz%t-r850#04TL-Sx;iRcAZury$8J<6K*(??c-)cj3P zrHK{)7+bi!Z2k9${l<#O_ykbHryY$#6rN4sk`Sf!c2T>O!*Y{+>XPzj#zhjJ%v3P5 z<&@P7jd#G<{fC)tU6(?m^H0`UV>eIzp}+fga2d_it`=hK_Ewa4sMDoXotjwVqezi^bQ+bbk5OJ0Z`sFN$y2( z=zh>8vIoK*4WMATgCpX7f-`8VzKIFDg~!j$=5gew2_nY2VPBKRKiT#9xs+h{FOQ>2 zUU8;h=9HeyVRkLkr}=WEddfb^rCbEBobFvTD}}uT?E(e{rpdlBDOXpwuP~T4o{}%T z&m2w#V%?kAU6UgnfAQBvQXcd$oL&jV@QhX7Hz2TXaEmI#hsHaMwqJ6GUtz9JFK@zn z$(?q_B6Eb|fTmhhQWH2@qXgv1<^lWKhR4P}FXzW4o0^-ifgY3TCd2(Imsk@j+sU~- zEQO&0JK?>=A5xoZ1D;0o;&o*j+r!%2LZh_>M-hp7DqYlWvxmzwZ}G6&5){i3@`Z>d z(A^420^C-tWo%4pXJ-d6SAGW4z8lh?Mpl5osK5=pkG{#seM*6e^r}ffXFj@=2zJxu z$yK{NBk5;PpF77ewRMTJ*_QDYj!S*1Wp53-+M#c`vfVektM-<1rKg9&=l3>y{94M# zeFHc4@I6v+pH-N3rnS;aTI&%Y4(tvHVm0aXb2rU8Uq^ZuXC{P4FVEc05sJ;hvKGAZ zg^79;PTiIdF;9mnzH#YA?S8%cyd)Am(KWEhm1N1~)zznW=uGd>X*a|gi@&-JRA?)o zHae^VE?`oDvDzk8mo4I^ZY5N+QA2Q&o`m-vl-hQF2oCF)`%}S+3A#j|U%NI)8l-(hYWp z^a|@iH$mtEbKTo+l-ny1y9!xM94=L(Hj4e=rGlU>s;i3*4<|A-G6E&#d_}c8dh_OF z6_B?V%h4ksHdDPTuF_E7_ztI~B2oVSw>M7lI<930wNm$<+gBiT-rf$r1MCd`irFLB zdCkBEWOb);a#A3qiDX$4+3K)haTQ7&O8fgz+v>Zp3s@#w0uw5+Kxk8xqX)4#C6TR* zn+WC_A$woFN=UcM@h!R^^i8PI!7OajAt*8uyKr zqU|H#{X<2F%su+Gj5-$xy50SY^wjKyA>|hsIN_Kja3sgPmF_ zSUA9z??(|F%zM8NeJB;chAsi7=-g9M(EjxF49UGg!=eXyNE?oLOT+)EegL41hvUnn zBnV|N4=(-0(gB@e7OI_wFyH zQC?3Zgmhuf5D7JSq=)Bi!jjMKOd6`_?Elj9-Qe2psA{^PDqW-^di#-RPi(Xk?IRf; zaG1HnZKmm?BLSm2-^l8=bZr0*^j7&fh1eC$svc4yI1WBeB)XtY8S5feQCZn&QiPo^ zXEHN^g?8lzP;q&7kmMu(QRINXP1W&W0q+B7ei z_w+XCIUlJXx_Zna^8AcUiB&bUSReZFe@3G8AfvV!&&8KewEL$=s_dtru}3k=jGICU zyp#4ESh@CQGzi#hi>`qjSqY&iR7E*Yic1V_F-)QHW{$g&c>guvQY8m7Mfi{`erc&B z;Z?@xl(HSxN0PQV1kxv4uQL1v@Zreo#7oX%z&>b7-oyreKm)&m%f!=P*$`{dHJ#%q zCKPt|m+7(%0?Sl@d9%l(iWCTGg=Ef;!5A+j(cIL7h2KV5 zclXOUOgM7PZbqFlHYLRUUpx$3Yoba%TMZ+V6`CtUTKz+V2!Uepu2b4=aL;qMpQozA-}FPu0fw(8PvLtdc96wJyxk?x_3`_g%Vga!T3 zaVA6YP9v#Dox?4xcTm+wbn6nArdL~^G;X|dV(zy|i|OueF+f;}EC<+)r@BK})T#(P zgx6|dtx>PC=rcT|3cmcK>&#N6JTB{;<@)4yo!NwQ)c%u={I zea^L|Tj0^rzx?k9k!>8rY_oV0C`+n&jh{~O=bor=C(GF<2I2QG7hAhgQ=#aXaG5e@ zP5c4O+`Ffu2@z#8Xi`gQKwIhNHR3B6J;^=L9?9fqB<8Qm3;OJS;(k>#vf;QOafb}T zLV`AL0OjLatXrV`FVcKG57wk0A9pW90v-vE!oKjVk`llMktAL$_!5&qPHc?72L3Ds z40y`W58Bs}=lT6Rh2BMCck}yb^-jE#u8q?EN#js zhx*xKH-wbt=sXSC#7Ws^x0fVLQIc7pE9LD@e(eV3y}S~_`=naP$^f{p09HmIIz%y9TZfsNoeTot)5_7Bjj^8PnEH(N@Zx-a1X0)E= z$;D;cYL`gYrZ>07=t|YjOeW{K@~o5s_e!{fF?PHWs@_4woAiyG84FFNiZ5iNV za<4=i1AxIJQ7thr$(l2|gV6vyK7UzYG$}w?N5<$RRg3O&0lt-- z9C@}T`kT?ycF~=?+Eusopz9`{OCy`Xv~k$eC%zi3z2HXpvfYDuEQ3TBDduuCtHU&rYe*E|J^ z?!H*zcpTb834Z$WfdAe30wlSXcjc$Acn3{(P<8wCwLBJ6)+M_1EdEj14-6Pe$rmbLvi>*Nz_>`K_Kx>Kt!B<}FCl&GkKwnxB^kV4}7-$TCW&{x6zu zq4E1r$a!4CUPLy76F`+UgCtjPdeVc=QwH+g>sM!B#;6XmAozb@^wdb)nEE%ALvRpLux%+H+f+T|NMp z!%6?%xS%hR4z5Pu5urjfjFI>;F`0iE6U$WRoHUj#pPs>S^(KVn(ckM;nSHWFLjBF* zxp;C1vy}4n>L?O}WX+wJ!Mt4vl3KkfhBjaVuz9Qz=#HX05675Kqk39-5O-qtuvJVb zYFINOWc2~sd|mPn9aA;B!Iz@sAAtz10+*hLWGVfQ%s+s}%+d3quiB=MRiVAtLF5jPuHNQwXTna0^p=Ub>5Kt? z=XpHJ&=mwG&;g9u1r^2_Zg;8Z8ixQQ<))ot*ho4->|=z&)Gs}_%qMpgawjC%Yn^k9 zu6HEnOgLz$1TIGOukQ!(jX87~Wcu>Wo2dIpNFToS{5SO}!1Wo-htK@YVY5$8g z1}F)Vb5f=aU3HO3bYTWJh=XZm(-#C%8tIGN82Gm*48lcc96f@R`94n!oKap-Qbjjv z|9D-%*q3(##{P`!E{5If!q?GU=!4PJ^EzHkgZbf|cdBniZHfK++b2Y#kYQg+G=|FT&mFz+Vjkt&Swj zZ7T6F=9Er4G$XKRc7ZCu1oB_z;^$KLbbk^L&w>6+U|hj0@E7QenRI9OS~~tsu_B-! zg4<|7RU!R=kBQSG9PJ-TpjZUVA>l#8d^au5VuKoUDeu%-DT)bu+kb%y0rSjf0MP#C z8T}ZXYftn~EdGHe#l}dF zl$+@H+4g$(VrK-{UkT=i!^sliq~KPk3AiDv%ukmwF)JY=8%WoQG=-kjI90 zoqRM3lOySYyNw@B1STbHE|<%bu@x4Cf5&9vGagjd{#PVsVAz-&Va??8HDQ}v{1-5@ z9u0c%Ut^i40VXqK)KkRY`>%NuG=6)61ii-v&55ls0q9I{#+x{PWW@c4n!K7<4S~d- z9X)3Vsd@1s! zjpYr;A(Nr0;bG_0-gz zOQx-BYJ)jIq7V0A27WG-2;-j>*F>TBr+}hnR9@k9)}k-b1Q&^g*p}K>3#6h`;1$e2 zUVVuvN}rK{8<$3bnkgPReBV$g>O9WRnG2RUBglF0LxsX9Fu`!Kt*YUy_z*Jb3piwO zBW%6V?Gv+0SEKyrX4WO2|DCyv{)t!)P%X(hvHb8?dW9Bq{|P(vbhAVT(QirUt;)-h z>>b45W9Cmo|BSn!chy}A1PhgGa(i+WWI^pgmcJKk*57p!8<0KEs4y-X$RHK%x6z?q z_?o7NU8V)qH2Q~g|3{=h{j)zF;dPL~blo`Pif5S?@4!jS%zJ!T|qVsO1QK1M$a2K6vy4(Ww+7r8{Vx!HMK{iZ%o@Sj0~M;fcY zP_UN=dk;T|C&Bf3&p|n`tlcKQ74RJh^^oUklfGT4GG(M;be|yNwq!<2_N|V6c zf&RT>`v0IVbALwm=6|OyU-Y^hfnRwH3`+FRpun0z`!4?()ZYWK(D?ceod_4yFfgVN z_Ag4D&aos=68kG(QUN|O(s2Vxff+hx6zY{deRAz{O&SEp$3^A9MrL zwf>YJIAMUa{QAA78_!BFV%DDWxv^Y1_DmiT26i+J=#Tr&F27K; z#eKy^;EY2iI>iO=14E(>*83-~ZpLG%IwCfMi z3NZS|+b#xLAd`g0XQ|FoBlv3wpS3;fze*#)ka#6ijEjN;6H*lMf3y*_P>2nd82

  • FHmwEx%*_aDj+Xg8q!hF>trDnXPm zP#LYzh(^EvzS0}mmWyKhL+YVkO^uT7SL{g^pqPPCVg?o)UtUZ6?~V+>gvI`lu`_;z z6zz>)YdC8G#=XLTCvq~3r+OCQj~%UQJvtHgPpyXudZudACqQ)t{mM8@s_u)+_hro5 zW;dm#>ZC(&c4@2Rq0I$)tf-rCK1@I3TrPqFctYzv@j~cr=A%^S>x1oSeLM#t$R-#W z<*e#^Y>i^!-RtfHQp#o0^DR+Q?(BbZkWl^qnC&r2PyLpJ4FP5i!oE{HLZ?O>`Jcib zpz`(mzl#-22?lWgJElmy_D{Ue1e`@~1gt1adHAHk~_RGdKj7#u@zVcsevg8kDvDC7r2N|7_?tsM}u zl_F#qQ4SjKVwN(d3N{|4DE-mo!gPZE&h{XwwNw6IL`1%<3@saiKI?UOni>YWK7*m1 zLDzUsQ`BQagwDTVL`~G0a&_}M^=-6f=z+Nie(|jSil(&g5)893(~s970ZgYN$}4GV zc%#&4TrLijD$UjCLVmky3=_KfLjP8(*!-h|po^QTV;RsqdyTC356!}WQK_6Efwj&d z5zg(2*f2milu^H;oh+{wgP}RT%^UR(MRPlJ*WcjJ9j1R+npQ*}7QK_?;kD&n_ zz0h*NN*m+ReC&@hLGTp4fo7ObLJw`Zz{C(6MHX*{8Wt|om;Xg;Y4SXfeugrX`Pk0G Qi3NTt3J>lT$eFzOKj^FuHvj+t literal 0 HcmV?d00001 diff --git a/resources/page_template/libs/potree/resources/images/vr_controller_help.svg b/resources/page_template/libs/potree/resources/images/vr_controller_help.svg new file mode 100644 index 00000000..6d03c7bf --- /dev/null +++ b/resources/page_template/libs/potree/resources/images/vr_controller_help.svg @@ -0,0 +1,7620 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + Fly (Touchpad or Joystick) + 🡅 + 🡅 + + Translate Scene(1x trigger) + Rotate & Scale(2x triggers) + + + diff --git a/resources/page_template/libs/potree/resources/textures/rectangle.png b/resources/page_template/libs/potree/resources/textures/rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..8b57a4f8f291e9f5fea25ffd24f43029ce7f7b7e GIT binary patch literal 2955 zcmeAS@N?(olHy`uVBq!ia0y~yV2TA{4mO|&N7Er~AjMMb9gP2NHH*Qb9lNq zhE&XXdvjwUQ=kCrLD!``dQ;?C44wJJPaSQDVO(c2C1Cr{HKxn6{EdsH85ruW9$(GR z!0?0LMV!IGp@flv#ZJCG_jcOauU*j$4EGN0dtWSb{O&iA*zC1CWAttYGBCV
  • Potree is a viewer for large point cloud / LIDAR data sets, developed at the Vienna University of Technology. (github)
  • -
  • Author: Markus Schütz
  • -
  • License: FreeBSD (2-clause BSD)
  • -
  • Libraries: - -
  • -
  • Donators: - -
  • -
  • Credits: - -
  • +
  • Author: Markus Schütz
  • +
  • License: FreeBSD (2-clause BSD)
  • +
  • Dependency Licenses: See github
  • + +
  • +Funding: +Potree is funded by a combination of research projects, companies, institutions and individuals. If you're making good use of Potree, please consider funding its future development via Github Sponsors or by directly inquiring via e-mail. + +
    +
    +Research projects who's funding contributes to Potree: + + + + + + + + + + + + + + + + + + + + + + +
    Project NameFunding Agency
    LargeClouds2BIMFFG
    Harvest4DEU 7th Framework Program 323567
    GCD Doctoral CollegeTU Wien
    SuperhumansFWF
    + +
    +Thanks to all the companies and institutions funding Potree: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • Diamond •
    SITN
    Synth
    GeoCue Group
    Rapidlasso
    • Gold •
    BART
    • Silver •
    APPF ANU
    LimitAddict
    Georepublic
    • Bronze •
    EventArt
    Geodelta
    E-Cassini
    Sogelink
    Data-viewer
    Helimap
    Vevey
    yverdon-les-bains
    LBI ArchPro
    KTS
    Veesus
    Sigeom
    +
  • + + +

    ys@FT@d(Q#KcvGCxmY2`@j# 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

    diff --git a/resources/page_template/libs/potree/workers/2.0/DecoderWorker.js b/resources/page_template/libs/potree/workers/2.0/DecoderWorker.js new file mode 100644 index 00000000..6d971aaf --- /dev/null +++ b/resources/page_template/libs/potree/workers/2.0/DecoderWorker.js @@ -0,0 +1,303 @@ +/** + * Some types of possible point attribute data formats + * + * @class + */ +const PointAttributeTypes = { + DATA_TYPE_DOUBLE: {ordinal: 0, name: "double", size: 8}, + DATA_TYPE_FLOAT: {ordinal: 1, name: "float", size: 4}, + DATA_TYPE_INT8: {ordinal: 2, name: "int8", size: 1}, + DATA_TYPE_UINT8: {ordinal: 3, name: "uint8", size: 1}, + DATA_TYPE_INT16: {ordinal: 4, name: "int16", size: 2}, + DATA_TYPE_UINT16: {ordinal: 5, name: "uint16", size: 2}, + DATA_TYPE_INT32: {ordinal: 6, name: "int32", size: 4}, + DATA_TYPE_UINT32: {ordinal: 7, name: "uint32", size: 4}, + DATA_TYPE_INT64: {ordinal: 8, name: "int64", size: 8}, + DATA_TYPE_UINT64: {ordinal: 9, name: "uint64", size: 8} +}; + +let i = 0; +for (let obj in PointAttributeTypes) { + PointAttributeTypes[i] = PointAttributeTypes[obj]; + i++; +} + + +class PointAttribute{ + + constructor(name, type, numElements){ + this.name = name; + this.type = type; + this.numElements = numElements; + this.byteSize = this.numElements * this.type.size; + this.description = ""; + this.range = [Infinity, -Infinity]; + } + +} +PointAttribute.POSITION_CARTESIAN = new PointAttribute( + "POSITION_CARTESIAN", PointAttributeTypes.DATA_TYPE_FLOAT, 3); + +PointAttribute.RGBA_PACKED = new PointAttribute( + "COLOR_PACKED", PointAttributeTypes.DATA_TYPE_INT8, 4); + +PointAttribute.COLOR_PACKED = PointAttribute.RGBA_PACKED; + +PointAttribute.RGB_PACKED = new PointAttribute( + "COLOR_PACKED", PointAttributeTypes.DATA_TYPE_INT8, 3); + +PointAttribute.NORMAL_FLOATS = new PointAttribute( + "NORMAL_FLOATS", PointAttributeTypes.DATA_TYPE_FLOAT, 3); + +PointAttribute.INTENSITY = new PointAttribute( + "INTENSITY", PointAttributeTypes.DATA_TYPE_UINT16, 1); + +PointAttribute.CLASSIFICATION = new PointAttribute( + "CLASSIFICATION", PointAttributeTypes.DATA_TYPE_UINT8, 1); + +PointAttribute.NORMAL_SPHEREMAPPED = new PointAttribute( + "NORMAL_SPHEREMAPPED", PointAttributeTypes.DATA_TYPE_UINT8, 2); + +PointAttribute.NORMAL_OCT16 = new PointAttribute( + "NORMAL_OCT16", PointAttributeTypes.DATA_TYPE_UINT8, 2); + +PointAttribute.NORMAL = new PointAttribute( + "NORMAL", PointAttributeTypes.DATA_TYPE_FLOAT, 3); + +PointAttribute.RETURN_NUMBER = new PointAttribute( + "RETURN_NUMBER", PointAttributeTypes.DATA_TYPE_UINT8, 1); + +PointAttribute.NUMBER_OF_RETURNS = new PointAttribute( + "NUMBER_OF_RETURNS", PointAttributeTypes.DATA_TYPE_UINT8, 1); + +PointAttribute.SOURCE_ID = new PointAttribute( + "SOURCE_ID", PointAttributeTypes.DATA_TYPE_UINT16, 1); + +PointAttribute.INDICES = new PointAttribute( + "INDICES", PointAttributeTypes.DATA_TYPE_UINT32, 1); + +PointAttribute.SPACING = new PointAttribute( + "SPACING", PointAttributeTypes.DATA_TYPE_FLOAT, 1); + +PointAttribute.GPS_TIME = new PointAttribute( + "GPS_TIME", PointAttributeTypes.DATA_TYPE_DOUBLE, 1); + +const typedArrayMapping = { + "int8": Int8Array, + "int16": Int16Array, + "int32": Int32Array, + "int64": Float64Array, + "uint8": Uint8Array, + "uint16": Uint16Array, + "uint32": Uint32Array, + "uint64": Float64Array, + "float": Float32Array, + "double": Float64Array, +}; + +Potree = {}; + +onmessage = function (event) { + + let {buffer, pointAttributes, scale, name, min, max, size, offset, numPoints} = event.data; + + let tStart = performance.now(); + + let view = new DataView(buffer); + + let attributeBuffers = {}; + let attributeOffset = 0; + + let bytesPerPoint = 0; + for (let pointAttribute of pointAttributes.attributes) { + bytesPerPoint += pointAttribute.byteSize; + } + + let gridSize = 32; + let grid = new Uint32Array(gridSize ** 3); + let toIndex = (x, y, z) => { + // let dx = gridSize * (x - min.x) / size.x; + // let dy = gridSize * (y - min.y) / size.y; + // let dz = gridSize * (z - min.z) / size.z; + + // min is already subtracted + let dx = gridSize * x / size.x; + let dy = gridSize * y / size.y; + let dz = gridSize * z / size.z; + + let ix = Math.min(parseInt(dx), gridSize - 1); + let iy = Math.min(parseInt(dy), gridSize - 1); + let iz = Math.min(parseInt(dz), gridSize - 1); + + let index = ix + iy * gridSize + iz * gridSize * gridSize; + + return index; + }; + + let numOccupiedCells = 0; + for (let pointAttribute of pointAttributes.attributes) { + + if(["POSITION_CARTESIAN", "position"].includes(pointAttribute.name)){ + let buff = new ArrayBuffer(numPoints * 4 * 3); + let positions = new Float32Array(buff); + + for (let j = 0; j < numPoints; j++) { + + let pointOffset = j * bytesPerPoint; + + let x = (view.getInt32(pointOffset + attributeOffset + 0, true) * scale[0]) + offset[0] - min.x; + let y = (view.getInt32(pointOffset + attributeOffset + 4, true) * scale[1]) + offset[1] - min.y; + let z = (view.getInt32(pointOffset + attributeOffset + 8, true) * scale[2]) + offset[2] - min.z; + + let index = toIndex(x, y, z); + let count = grid[index]++; + if(count === 0){ + numOccupiedCells++; + } + + positions[3 * j + 0] = x; + positions[3 * j + 1] = y; + positions[3 * j + 2] = z; + } + + attributeBuffers[pointAttribute.name] = { buffer: buff, attribute: pointAttribute }; + }else if(["RGBA", "rgba"].includes(pointAttribute.name)){ + let buff = new ArrayBuffer(numPoints * 4); + let colors = new Uint8Array(buff); + + for (let j = 0; j < numPoints; j++) { + let pointOffset = j * bytesPerPoint; + + let r = view.getUint16(pointOffset + attributeOffset + 0, true); + let g = view.getUint16(pointOffset + attributeOffset + 2, true); + let b = view.getUint16(pointOffset + attributeOffset + 4, true); + + colors[4 * j + 0] = r > 255 ? r / 256 : r; + colors[4 * j + 1] = g > 255 ? g / 256 : g; + colors[4 * j + 2] = b > 255 ? b / 256 : b; + } + + attributeBuffers[pointAttribute.name] = { buffer: buff, attribute: pointAttribute }; + }else { + let buff = new ArrayBuffer(numPoints * 4); + let f32 = new Float32Array(buff); + + let TypedArray = typedArrayMapping[pointAttribute.type.name]; + preciseBuffer = new TypedArray(numPoints); + + let [offset, scale] = [0, 1]; + + const getterMap = { + "int8": view.getInt8, + "int16": view.getInt16, + "int32": view.getInt32, + // "int64": view.getInt64, + "uint8": view.getUint8, + "uint16": view.getUint16, + "uint32": view.getUint32, + // "uint64": view.getUint64, + "float": view.getFloat32, + "double": view.getFloat64, + }; + const getter = getterMap[pointAttribute.type.name].bind(view); + + // compute offset and scale to pack larger types into 32 bit floats + if(pointAttribute.type.size > 4){ + let [amin, amax] = pointAttribute.range; + offset = amin; + scale = 1 / (amax - amin); + } + + for(let j = 0; j < numPoints; j++){ + let pointOffset = j * bytesPerPoint; + let value = getter(pointOffset + attributeOffset, true); + + f32[j] = (value - offset) * scale; + preciseBuffer[j] = value; + } + + attributeBuffers[pointAttribute.name] = { + buffer: buff, + preciseBuffer: preciseBuffer, + attribute: pointAttribute, + offset: offset, + scale: scale, + }; + } + + attributeOffset += pointAttribute.byteSize; + + + } + + let occupancy = parseInt(numPoints / numOccupiedCells); + // console.log(`${name}: #points: ${numPoints}: #occupiedCells: ${numOccupiedCells}, occupancy: ${occupancy} points/cell`); + + { // add indices + let buff = new ArrayBuffer(numPoints * 4); + let indices = new Uint32Array(buff); + + for (let i = 0; i < numPoints; i++) { + indices[i] = i; + } + + attributeBuffers["INDICES"] = { buffer: buff, attribute: PointAttribute.INDICES }; + } + + + { // handle attribute vectors + let vectors = pointAttributes.vectors; + + for(let vector of vectors){ + + let {name, attributes} = vector; + let numVectorElements = attributes.length; + let buffer = new ArrayBuffer(numVectorElements * numPoints * 4); + let f32 = new Float32Array(buffer); + + let iElement = 0; + for(let sourceName of attributes){ + let sourceBuffer = attributeBuffers[sourceName]; + let {offset, scale} = sourceBuffer; + let view = new DataView(sourceBuffer.buffer); + + const getter = view.getFloat32.bind(view); + + for(let j = 0; j < numPoints; j++){ + let value = getter(j * 4, true); + + f32[j * numVectorElements + iElement] = (value / scale) + offset; + } + + iElement++; + } + + let vecAttribute = new PointAttribute(name, PointAttributeTypes.DATA_TYPE_FLOAT, 3); + + attributeBuffers[name] = { + buffer: buffer, + attribute: vecAttribute, + }; + + } + + } + + // let duration = performance.now() - tStart; + // let pointsPerMs = numPoints / duration; + // console.log(`duration: ${duration.toFixed(1)}ms, #points: ${numPoints}, points/ms: ${pointsPerMs.toFixed(1)}`); + + let message = { + buffer: buffer, + attributeBuffers: attributeBuffers, + density: occupancy, + }; + + let transferables = []; + for (let property in message.attributeBuffers) { + transferables.push(message.attributeBuffers[property].buffer); + } + transferables.push(buffer); + + postMessage(message, transferables); +}; diff --git a/resources/page_template/libs/potree/workers/2.0/DecoderWorker_brotli.js b/resources/page_template/libs/potree/workers/2.0/DecoderWorker_brotli.js new file mode 100644 index 00000000..046c4e01 --- /dev/null +++ b/resources/page_template/libs/potree/workers/2.0/DecoderWorker_brotli.js @@ -0,0 +1,2485 @@ +/** + * Some types of possible point attribute data formats + * + * @class + */ +const PointAttributeTypes = { + DATA_TYPE_DOUBLE: {ordinal: 0, name: "double", size: 8}, + DATA_TYPE_FLOAT: {ordinal: 1, name: "float", size: 4}, + DATA_TYPE_INT8: {ordinal: 2, name: "int8", size: 1}, + DATA_TYPE_UINT8: {ordinal: 3, name: "uint8", size: 1}, + DATA_TYPE_INT16: {ordinal: 4, name: "int16", size: 2}, + DATA_TYPE_UINT16: {ordinal: 5, name: "uint16", size: 2}, + DATA_TYPE_INT32: {ordinal: 6, name: "int32", size: 4}, + DATA_TYPE_UINT32: {ordinal: 7, name: "uint32", size: 4}, + DATA_TYPE_INT64: {ordinal: 8, name: "int64", size: 8}, + DATA_TYPE_UINT64: {ordinal: 9, name: "uint64", size: 8} +}; + +let i = 0; +for (let obj in PointAttributeTypes) { + PointAttributeTypes[i] = PointAttributeTypes[obj]; + i++; +} + + +class PointAttribute{ + + constructor(name, type, numElements){ + this.name = name; + this.type = type; + this.numElements = numElements; + this.byteSize = this.numElements * this.type.size; + this.description = ""; + this.range = [Infinity, -Infinity]; + } + +} +PointAttribute.POSITION_CARTESIAN = new PointAttribute( + "POSITION_CARTESIAN", PointAttributeTypes.DATA_TYPE_FLOAT, 3); + +PointAttribute.RGBA_PACKED = new PointAttribute( + "COLOR_PACKED", PointAttributeTypes.DATA_TYPE_INT8, 4); + +PointAttribute.COLOR_PACKED = PointAttribute.RGBA_PACKED; + +PointAttribute.RGB_PACKED = new PointAttribute( + "COLOR_PACKED", PointAttributeTypes.DATA_TYPE_INT8, 3); + +PointAttribute.NORMAL_FLOATS = new PointAttribute( + "NORMAL_FLOATS", PointAttributeTypes.DATA_TYPE_FLOAT, 3); + +PointAttribute.INTENSITY = new PointAttribute( + "INTENSITY", PointAttributeTypes.DATA_TYPE_UINT16, 1); + +PointAttribute.CLASSIFICATION = new PointAttribute( + "CLASSIFICATION", PointAttributeTypes.DATA_TYPE_UINT8, 1); + +PointAttribute.NORMAL_SPHEREMAPPED = new PointAttribute( + "NORMAL_SPHEREMAPPED", PointAttributeTypes.DATA_TYPE_UINT8, 2); + +PointAttribute.NORMAL_OCT16 = new PointAttribute( + "NORMAL_OCT16", PointAttributeTypes.DATA_TYPE_UINT8, 2); + +PointAttribute.NORMAL = new PointAttribute( + "NORMAL", PointAttributeTypes.DATA_TYPE_FLOAT, 3); + +PointAttribute.RETURN_NUMBER = new PointAttribute( + "RETURN_NUMBER", PointAttributeTypes.DATA_TYPE_UINT8, 1); + +PointAttribute.NUMBER_OF_RETURNS = new PointAttribute( + "NUMBER_OF_RETURNS", PointAttributeTypes.DATA_TYPE_UINT8, 1); + +PointAttribute.SOURCE_ID = new PointAttribute( + "SOURCE_ID", PointAttributeTypes.DATA_TYPE_UINT16, 1); + +PointAttribute.INDICES = new PointAttribute( + "INDICES", PointAttributeTypes.DATA_TYPE_UINT32, 1); + +PointAttribute.SPACING = new PointAttribute( + "SPACING", PointAttributeTypes.DATA_TYPE_FLOAT, 1); + +PointAttribute.GPS_TIME = new PointAttribute( + "GPS_TIME", PointAttributeTypes.DATA_TYPE_DOUBLE, 1); + +/* Copyright 2017 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/** @return {function(!Int8Array):!Int8Array} */ +function BrotliDecodeClosure() { + + /** @type {!Int8Array} */ + var DICTIONARY_DATA = new Int8Array(0); + + /** + * @constructor + * @param {!Int8Array} bytes + * @struct + */ + function InputStream(bytes) { + /** @type {!Int8Array} */ + this.data = bytes; + /** @type {!number} */ + this.offset = 0; + } + var MAX_HUFFMAN_TABLE_SIZE = Int32Array.from([256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822, 854, 886, 920, 952, 984, 1016, 1048, 1080]); + var CODE_LENGTH_CODE_ORDER = Int32Array.from([1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15]); + var DISTANCE_SHORT_CODE_INDEX_OFFSET = Int32Array.from([0, 3, 2, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3]); + var DISTANCE_SHORT_CODE_VALUE_OFFSET = Int32Array.from([0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3]); + var FIXED_TABLE = Int32Array.from([0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040001, 0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040005]); + var DICTIONARY_OFFSETS_BY_LENGTH = Int32Array.from([0, 0, 0, 0, 0, 4096, 9216, 21504, 35840, 44032, 53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536, 115968, 118528, 119872, 121280, 122016]); + var DICTIONARY_SIZE_BITS_BY_LENGTH = Int32Array.from([0, 0, 0, 0, 10, 10, 11, 11, 10, 10, 10, 10, 10, 9, 9, 8, 7, 7, 8, 7, 7, 6, 6, 5, 5]); + var BLOCK_LENGTH_OFFSET = Int32Array.from([1, 5, 9, 13, 17, 25, 33, 41, 49, 65, 81, 97, 113, 145, 177, 209, 241, 305, 369, 497, 753, 1265, 2289, 4337, 8433, 16625]); + var BLOCK_LENGTH_N_BITS = Int32Array.from([2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 24]); + var INSERT_LENGTH_N_BITS = Int16Array.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0E, 0x18]); + var COPY_LENGTH_N_BITS = Int16Array.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x18]); + var CMD_LOOKUP = new Int16Array(2816); + { + unpackCommandLookupTable(CMD_LOOKUP); + } + /** + * @param {number} i + * @return {number} + */ + function log2floor(i) { + var /** number */ result = -1; + var /** number */ step = 16; + while (step > 0) { + if ((i >>> step) != 0) { + result += step; + i = i >>> step; + } + step = step >> 1; + } + return result + i; + } + /** + * @param {number} npostfix + * @param {number} ndirect + * @param {number} maxndistbits + * @return {number} + */ + function calculateDistanceAlphabetSize(npostfix, ndirect, maxndistbits) { + return 16 + ndirect + 2 * (maxndistbits << npostfix); + } + /** + * @param {number} maxDistance + * @param {number} npostfix + * @param {number} ndirect + * @return {number} + */ + function calculateDistanceAlphabetLimit(maxDistance, npostfix, ndirect) { + if (maxDistance < ndirect + (2 << npostfix)) { + throw "maxDistance is too small"; + } + var /** number */ offset = ((maxDistance - ndirect) >> npostfix) + 4; + var /** number */ ndistbits = log2floor(offset) - 1; + var /** number */ group = ((ndistbits - 1) << 1) | ((offset >> ndistbits) & 1); + return ((group - 1) << npostfix) + (1 << npostfix) + ndirect + 16; + } + /** + * @param {!Int16Array} cmdLookup + * @return {void} + */ + function unpackCommandLookupTable(cmdLookup) { + var /** !Int16Array */ insertLengthOffsets = new Int16Array(24); + var /** !Int16Array */ copyLengthOffsets = new Int16Array(24); + copyLengthOffsets[0] = 2; + for (var /** number */ i = 0; i < 23; ++i) { + insertLengthOffsets[i + 1] = (insertLengthOffsets[i] + (1 << INSERT_LENGTH_N_BITS[i])); + copyLengthOffsets[i + 1] = (copyLengthOffsets[i] + (1 << COPY_LENGTH_N_BITS[i])); + } + for (var /** number */ cmdCode = 0; cmdCode < 704; ++cmdCode) { + var /** number */ rangeIdx = cmdCode >>> 6; + var /** number */ distanceContextOffset = -4; + if (rangeIdx >= 2) { + rangeIdx -= 2; + distanceContextOffset = 0; + } + var /** number */ insertCode = (((0x29850 >>> (rangeIdx * 2)) & 0x3) << 3) | ((cmdCode >>> 3) & 7); + var /** number */ copyCode = (((0x26244 >>> (rangeIdx * 2)) & 0x3) << 3) | (cmdCode & 7); + var /** number */ copyLengthOffset = copyLengthOffsets[copyCode]; + var /** number */ distanceContext = distanceContextOffset + (copyLengthOffset > 4 ? 3 : copyLengthOffset - 2); + var /** number */ index = cmdCode * 4; + cmdLookup[index + 0] = (INSERT_LENGTH_N_BITS[insertCode] | (COPY_LENGTH_N_BITS[copyCode] << 8)); + cmdLookup[index + 1] = insertLengthOffsets[insertCode]; + cmdLookup[index + 2] = copyLengthOffsets[copyCode]; + cmdLookup[index + 3] = distanceContext; + } + } + /** + * @param {!State} s + * @return {number} + */ + function decodeWindowBits(s) { + var /** number */ largeWindowEnabled = s.isLargeWindow; + s.isLargeWindow = 0; + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + if (readFewBits(s, 1) == 0) { + return 16; + } + var /** number */ n = readFewBits(s, 3); + if (n != 0) { + return 17 + n; + } + n = readFewBits(s, 3); + if (n != 0) { + if (n == 1) { + if (largeWindowEnabled == 0) { + return -1; + } + s.isLargeWindow = 1; + if (readFewBits(s, 1) == 1) { + return -1; + } + n = readFewBits(s, 6); + if (n < 10 || n > 30) { + return -1; + } + return n; + } else { + return 8 + n; + } + } + return 17; + } + /** + * @param {!State} s + * @param {!InputStream} input + * @return {void} + */ + function initState(s, input) { + if (s.runningState != 0) { + throw "State MUST be uninitialized"; + } + s.blockTrees = new Int32Array(3091); + s.blockTrees[0] = 7; + s.distRbIdx = 3; + var /** number */ maxDistanceAlphabetLimit = calculateDistanceAlphabetLimit(0x7FFFFFFC, 3, 15 << 3); + s.distExtraBits = new Int8Array(maxDistanceAlphabetLimit); + s.distOffset = new Int32Array(maxDistanceAlphabetLimit); + s.input = input; + initBitReader(s); + s.runningState = 1; + } + /** + * @param {!State} s + * @return {void} + */ + function close(s) { + if (s.runningState == 0) { + throw "State MUST be initialized"; + } + if (s.runningState == 11) { + return; + } + s.runningState = 11; + if (s.input != null) { + closeInput(s.input); + s.input = null; + } + } + /** + * @param {!State} s + * @return {number} + */ + function decodeVarLenUnsignedByte(s) { + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + if (readFewBits(s, 1) != 0) { + var /** number */ n = readFewBits(s, 3); + if (n == 0) { + return 1; + } else { + return readFewBits(s, n) + (1 << n); + } + } + return 0; + } + /** + * @param {!State} s + * @return {void} + */ + function decodeMetaBlockLength(s) { + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + s.inputEnd = readFewBits(s, 1); + s.metaBlockLength = 0; + s.isUncompressed = 0; + s.isMetadata = 0; + if ((s.inputEnd != 0) && readFewBits(s, 1) != 0) { + return; + } + var /** number */ sizeNibbles = readFewBits(s, 2) + 4; + if (sizeNibbles == 7) { + s.isMetadata = 1; + if (readFewBits(s, 1) != 0) { + throw "Corrupted reserved bit"; + } + var /** number */ sizeBytes = readFewBits(s, 2); + if (sizeBytes == 0) { + return; + } + for (var /** number */ i = 0; i < sizeBytes; i++) { + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ bits = readFewBits(s, 8); + if (bits == 0 && i + 1 == sizeBytes && sizeBytes > 1) { + throw "Exuberant nibble"; + } + s.metaBlockLength |= bits << (i * 8); + } + } else { + for (var /** number */ i = 0; i < sizeNibbles; i++) { + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ bits = readFewBits(s, 4); + if (bits == 0 && i + 1 == sizeNibbles && sizeNibbles > 4) { + throw "Exuberant nibble"; + } + s.metaBlockLength |= bits << (i * 4); + } + } + s.metaBlockLength++; + if (s.inputEnd == 0) { + s.isUncompressed = readFewBits(s, 1); + } + } + /** + * @param {!Int32Array} tableGroup + * @param {number} tableIdx + * @param {!State} s + * @return {number} + */ + function readSymbol(tableGroup, tableIdx, s) { + var /** number */ offset = tableGroup[tableIdx]; + var /** number */ val = (s.accumulator32 >>> s.bitOffset); + offset += val & 0xFF; + var /** number */ bits = tableGroup[offset] >> 16; + var /** number */ sym = tableGroup[offset] & 0xFFFF; + if (bits <= 8) { + s.bitOffset += bits; + return sym; + } + offset += sym; + var /** number */ mask = (1 << bits) - 1; + offset += (val & mask) >>> 8; + s.bitOffset += ((tableGroup[offset] >> 16) + 8); + return tableGroup[offset] & 0xFFFF; + } + /** + * @param {!Int32Array} tableGroup + * @param {number} tableIdx + * @param {!State} s + * @return {number} + */ + function readBlockLength(tableGroup, tableIdx, s) { + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ code = readSymbol(tableGroup, tableIdx, s); + var /** number */ n = BLOCK_LENGTH_N_BITS[code]; + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + return BLOCK_LENGTH_OFFSET[code] + ((n <= 16) ? readFewBits(s, n) : readManyBits(s, n)); + } + /** + * @param {!Int32Array} v + * @param {number} index + * @return {void} + */ + function moveToFront(v, index) { + var /** number */ value = v[index]; + for (; index > 0; index--) { + v[index] = v[index - 1]; + } + v[0] = value; + } + /** + * @param {!Int8Array} v + * @param {number} vLen + * @return {void} + */ + function inverseMoveToFrontTransform(v, vLen) { + var /** !Int32Array */ mtf = new Int32Array(256); + for (var /** number */ i = 0; i < 256; i++) { + mtf[i] = i; + } + for (var /** number */ i = 0; i < vLen; i++) { + var /** number */ index = v[i] & 0xFF; + v[i] = mtf[index]; + if (index != 0) { + moveToFront(mtf, index); + } + } + } + /** + * @param {!Int32Array} codeLengthCodeLengths + * @param {number} numSymbols + * @param {!Int32Array} codeLengths + * @param {!State} s + * @return {void} + */ + function readHuffmanCodeLengths(codeLengthCodeLengths, numSymbols, codeLengths, s) { + var /** number */ symbol = 0; + var /** number */ prevCodeLen = 8; + var /** number */ repeat = 0; + var /** number */ repeatCodeLen = 0; + var /** number */ space = 32768; + var /** !Int32Array */ table = new Int32Array(32 + 1); + var /** number */ tableIdx = table.length - 1; + buildHuffmanTable(table, tableIdx, 5, codeLengthCodeLengths, 18); + while (symbol < numSymbols && space > 0) { + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ p = (s.accumulator32 >>> s.bitOffset) & 31; + s.bitOffset += table[p] >> 16; + var /** number */ codeLen = table[p] & 0xFFFF; + if (codeLen < 16) { + repeat = 0; + codeLengths[symbol++] = codeLen; + if (codeLen != 0) { + prevCodeLen = codeLen; + space -= 32768 >> codeLen; + } + } else { + var /** number */ extraBits = codeLen - 14; + var /** number */ newLen = 0; + if (codeLen == 16) { + newLen = prevCodeLen; + } + if (repeatCodeLen != newLen) { + repeat = 0; + repeatCodeLen = newLen; + } + var /** number */ oldRepeat = repeat; + if (repeat > 0) { + repeat -= 2; + repeat <<= extraBits; + } + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + repeat += readFewBits(s, extraBits) + 3; + var /** number */ repeatDelta = repeat - oldRepeat; + if (symbol + repeatDelta > numSymbols) { + throw "symbol + repeatDelta > numSymbols"; + } + for (var /** number */ i = 0; i < repeatDelta; i++) { + codeLengths[symbol++] = repeatCodeLen; + } + if (repeatCodeLen != 0) { + space -= repeatDelta << (15 - repeatCodeLen); + } + } + } + if (space != 0) { + throw "Unused space"; + } + codeLengths.fill(0, symbol, numSymbols); + } + /** + * @param {!Int32Array} symbols + * @param {number} length + * @return {void} + */ + function checkDupes(symbols, length) { + for (var /** number */ i = 0; i < length - 1; ++i) { + for (var /** number */ j = i + 1; j < length; ++j) { + if (symbols[i] == symbols[j]) { + throw "Duplicate simple Huffman code symbol"; + } + } + } + } + /** + * @param {number} alphabetSizeMax + * @param {number} alphabetSizeLimit + * @param {!Int32Array} tableGroup + * @param {number} tableIdx + * @param {!State} s + * @return {number} + */ + function readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) { + var /** !Int32Array */ codeLengths = new Int32Array(alphabetSizeLimit); + var /** !Int32Array */ symbols = new Int32Array(4); + var /** number */ maxBits = 1 + log2floor(alphabetSizeMax - 1); + var /** number */ numSymbols = readFewBits(s, 2) + 1; + for (var /** number */ i = 0; i < numSymbols; i++) { + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ symbol = readFewBits(s, maxBits); + if (symbol >= alphabetSizeLimit) { + throw "Can't readHuffmanCode"; + } + symbols[i] = symbol; + } + checkDupes(symbols, numSymbols); + var /** number */ histogramId = numSymbols; + if (numSymbols == 4) { + histogramId += readFewBits(s, 1); + } + switch(histogramId) { + case 1: + codeLengths[symbols[0]] = 1; + break; + case 2: + codeLengths[symbols[0]] = 1; + codeLengths[symbols[1]] = 1; + break; + case 3: + codeLengths[symbols[0]] = 1; + codeLengths[symbols[1]] = 2; + codeLengths[symbols[2]] = 2; + break; + case 4: + codeLengths[symbols[0]] = 2; + codeLengths[symbols[1]] = 2; + codeLengths[symbols[2]] = 2; + codeLengths[symbols[3]] = 2; + break; + case 5: + codeLengths[symbols[0]] = 1; + codeLengths[symbols[1]] = 2; + codeLengths[symbols[2]] = 3; + codeLengths[symbols[3]] = 3; + break; + } + return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit); + } + /** + * @param {number} alphabetSizeLimit + * @param {number} skip + * @param {!Int32Array} tableGroup + * @param {number} tableIdx + * @param {!State} s + * @return {number} + */ + function readComplexHuffmanCode(alphabetSizeLimit, skip, tableGroup, tableIdx, s) { + var /** !Int32Array */ codeLengths = new Int32Array(alphabetSizeLimit); + var /** !Int32Array */ codeLengthCodeLengths = new Int32Array(18); + var /** number */ space = 32; + var /** number */ numCodes = 0; + for (var /** number */ i = skip; i < 18 && space > 0; i++) { + var /** number */ codeLenIdx = CODE_LENGTH_CODE_ORDER[i]; + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ p = (s.accumulator32 >>> s.bitOffset) & 15; + s.bitOffset += FIXED_TABLE[p] >> 16; + var /** number */ v = FIXED_TABLE[p] & 0xFFFF; + codeLengthCodeLengths[codeLenIdx] = v; + if (v != 0) { + space -= (32 >> v); + numCodes++; + } + } + if (space != 0 && numCodes != 1) { + throw "Corrupted Huffman code histogram"; + } + readHuffmanCodeLengths(codeLengthCodeLengths, alphabetSizeLimit, codeLengths, s); + return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit); + } + /** + * @param {number} alphabetSizeMax + * @param {number} alphabetSizeLimit + * @param {!Int32Array} tableGroup + * @param {number} tableIdx + * @param {!State} s + * @return {number} + */ + function readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) { + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ simpleCodeOrSkip = readFewBits(s, 2); + if (simpleCodeOrSkip == 1) { + return readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s); + } else { + return readComplexHuffmanCode(alphabetSizeLimit, simpleCodeOrSkip, tableGroup, tableIdx, s); + } + } + /** + * @param {number} contextMapSize + * @param {!Int8Array} contextMap + * @param {!State} s + * @return {number} + */ + function decodeContextMap(contextMapSize, contextMap, s) { + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + var /** number */ numTrees = decodeVarLenUnsignedByte(s) + 1; + if (numTrees == 1) { + contextMap.fill(0, 0, contextMapSize); + return numTrees; + } + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ useRleForZeros = readFewBits(s, 1); + var /** number */ maxRunLengthPrefix = 0; + if (useRleForZeros != 0) { + maxRunLengthPrefix = readFewBits(s, 4) + 1; + } + var /** number */ alphabetSize = numTrees + maxRunLengthPrefix; + var /** number */ tableSize = MAX_HUFFMAN_TABLE_SIZE[(alphabetSize + 31) >> 5]; + var /** !Int32Array */ table = new Int32Array(tableSize + 1); + var /** number */ tableIdx = table.length - 1; + readHuffmanCode(alphabetSize, alphabetSize, table, tableIdx, s); + for (var /** number */ i = 0; i < contextMapSize; ) { + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ code = readSymbol(table, tableIdx, s); + if (code == 0) { + contextMap[i] = 0; + i++; + } else if (code <= maxRunLengthPrefix) { + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ reps = (1 << code) + readFewBits(s, code); + while (reps != 0) { + if (i >= contextMapSize) { + throw "Corrupted context map"; + } + contextMap[i] = 0; + i++; + reps--; + } + } else { + contextMap[i] = (code - maxRunLengthPrefix); + i++; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + if (readFewBits(s, 1) == 1) { + inverseMoveToFrontTransform(contextMap, contextMapSize); + } + return numTrees; + } + /** + * @param {!State} s + * @param {number} treeType + * @param {number} numBlockTypes + * @return {number} + */ + function decodeBlockTypeAndLength(s, treeType, numBlockTypes) { + var /** !Int32Array */ ringBuffers = s.rings; + var /** number */ offset = 4 + treeType * 2; + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ blockType = readSymbol(s.blockTrees, 2 * treeType, s); + var /** number */ result = readBlockLength(s.blockTrees, 2 * treeType + 1, s); + if (blockType == 1) { + blockType = ringBuffers[offset + 1] + 1; + } else if (blockType == 0) { + blockType = ringBuffers[offset]; + } else { + blockType -= 2; + } + if (blockType >= numBlockTypes) { + blockType -= numBlockTypes; + } + ringBuffers[offset] = ringBuffers[offset + 1]; + ringBuffers[offset + 1] = blockType; + return result; + } + /** + * @param {!State} s + * @return {void} + */ + function decodeLiteralBlockSwitch(s) { + s.literalBlockLength = decodeBlockTypeAndLength(s, 0, s.numLiteralBlockTypes); + var /** number */ literalBlockType = s.rings[5]; + s.contextMapSlice = literalBlockType << 6; + s.literalTreeIdx = s.contextMap[s.contextMapSlice] & 0xFF; + var /** number */ contextMode = s.contextModes[literalBlockType]; + s.contextLookupOffset1 = contextMode << 9; + s.contextLookupOffset2 = s.contextLookupOffset1 + 256; + } + /** + * @param {!State} s + * @return {void} + */ + function decodeCommandBlockSwitch(s) { + s.commandBlockLength = decodeBlockTypeAndLength(s, 1, s.numCommandBlockTypes); + s.commandTreeIdx = s.rings[7]; + } + /** + * @param {!State} s + * @return {void} + */ + function decodeDistanceBlockSwitch(s) { + s.distanceBlockLength = decodeBlockTypeAndLength(s, 2, s.numDistanceBlockTypes); + s.distContextMapSlice = s.rings[9] << 2; + } + /** + * @param {!State} s + * @return {void} + */ + function maybeReallocateRingBuffer(s) { + var /** number */ newSize = s.maxRingBufferSize; + if (newSize > s.expectedTotalSize) { + var /** number */ minimalNewSize = s.expectedTotalSize; + while ((newSize >> 1) > minimalNewSize) { + newSize >>= 1; + } + if ((s.inputEnd == 0) && newSize < 16384 && s.maxRingBufferSize >= 16384) { + newSize = 16384; + } + } + if (newSize <= s.ringBufferSize) { + return; + } + var /** number */ ringBufferSizeWithSlack = newSize + 37; + var /** !Int8Array */ newBuffer = new Int8Array(ringBufferSizeWithSlack); + if (s.ringBuffer.length != 0) { + newBuffer.set(s.ringBuffer.subarray(0, 0 + s.ringBufferSize), 0); + } + s.ringBuffer = newBuffer; + s.ringBufferSize = newSize; + } + /** + * @param {!State} s + * @return {void} + */ + function readNextMetablockHeader(s) { + if (s.inputEnd != 0) { + s.nextRunningState = 10; + s.runningState = 12; + return; + } + s.literalTreeGroup = new Int32Array(0); + s.commandTreeGroup = new Int32Array(0); + s.distanceTreeGroup = new Int32Array(0); + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + decodeMetaBlockLength(s); + if ((s.metaBlockLength == 0) && (s.isMetadata == 0)) { + return; + } + if ((s.isUncompressed != 0) || (s.isMetadata != 0)) { + jumpToByteBoundary(s); + s.runningState = (s.isMetadata != 0) ? 5 : 6; + } else { + s.runningState = 3; + } + if (s.isMetadata != 0) { + return; + } + s.expectedTotalSize += s.metaBlockLength; + if (s.expectedTotalSize > 1 << 30) { + s.expectedTotalSize = 1 << 30; + } + if (s.ringBufferSize < s.maxRingBufferSize) { + maybeReallocateRingBuffer(s); + } + } + /** + * @param {!State} s + * @param {number} treeType + * @param {number} numBlockTypes + * @return {number} + */ + function readMetablockPartition(s, treeType, numBlockTypes) { + var /** number */ offset = s.blockTrees[2 * treeType]; + if (numBlockTypes <= 1) { + s.blockTrees[2 * treeType + 1] = offset; + s.blockTrees[2 * treeType + 2] = offset; + return 1 << 28; + } + var /** number */ blockTypeAlphabetSize = numBlockTypes + 2; + offset += readHuffmanCode(blockTypeAlphabetSize, blockTypeAlphabetSize, s.blockTrees, 2 * treeType, s); + s.blockTrees[2 * treeType + 1] = offset; + var /** number */ blockLengthAlphabetSize = 26; + offset += readHuffmanCode(blockLengthAlphabetSize, blockLengthAlphabetSize, s.blockTrees, 2 * treeType + 1, s); + s.blockTrees[2 * treeType + 2] = offset; + return readBlockLength(s.blockTrees, 2 * treeType + 1, s); + } + /** + * @param {!State} s + * @param {number} alphabetSizeLimit + * @return {void} + */ + function calculateDistanceLut(s, alphabetSizeLimit) { + var /** !Int8Array */ distExtraBits = s.distExtraBits; + var /** !Int32Array */ distOffset = s.distOffset; + var /** number */ npostfix = s.distancePostfixBits; + var /** number */ ndirect = s.numDirectDistanceCodes; + var /** number */ postfix = 1 << npostfix; + var /** number */ bits = 1; + var /** number */ half = 0; + var /** number */ i = 16; + for (var /** number */ j = 0; j < ndirect; ++j) { + distExtraBits[i] = 0; + distOffset[i] = j + 1; + ++i; + } + while (i < alphabetSizeLimit) { + var /** number */ base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1; + for (var /** number */ j = 0; j < postfix; ++j) { + distExtraBits[i] = bits; + distOffset[i] = base + j; + ++i; + } + bits = bits + half; + half = half ^ 1; + } + } + /** + * @param {!State} s + * @return {void} + */ + function readMetablockHuffmanCodesAndContextMaps(s) { + s.numLiteralBlockTypes = decodeVarLenUnsignedByte(s) + 1; + s.literalBlockLength = readMetablockPartition(s, 0, s.numLiteralBlockTypes); + s.numCommandBlockTypes = decodeVarLenUnsignedByte(s) + 1; + s.commandBlockLength = readMetablockPartition(s, 1, s.numCommandBlockTypes); + s.numDistanceBlockTypes = decodeVarLenUnsignedByte(s) + 1; + s.distanceBlockLength = readMetablockPartition(s, 2, s.numDistanceBlockTypes); + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + s.distancePostfixBits = readFewBits(s, 2); + s.numDirectDistanceCodes = readFewBits(s, 4) << s.distancePostfixBits; + s.distancePostfixMask = (1 << s.distancePostfixBits) - 1; + s.contextModes = new Int8Array(s.numLiteralBlockTypes); + for (var /** number */ i = 0; i < s.numLiteralBlockTypes; ) { + var /** number */ limit = min(i + 96, s.numLiteralBlockTypes); + for (; i < limit; ++i) { + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + s.contextModes[i] = readFewBits(s, 2); + } + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + } + s.contextMap = new Int8Array(s.numLiteralBlockTypes << 6); + var /** number */ numLiteralTrees = decodeContextMap(s.numLiteralBlockTypes << 6, s.contextMap, s); + s.trivialLiteralContext = 1; + for (var /** number */ j = 0; j < s.numLiteralBlockTypes << 6; j++) { + if (s.contextMap[j] != j >> 6) { + s.trivialLiteralContext = 0; + break; + } + } + s.distContextMap = new Int8Array(s.numDistanceBlockTypes << 2); + var /** number */ numDistTrees = decodeContextMap(s.numDistanceBlockTypes << 2, s.distContextMap, s); + s.literalTreeGroup = decodeHuffmanTreeGroup(256, 256, numLiteralTrees, s); + s.commandTreeGroup = decodeHuffmanTreeGroup(704, 704, s.numCommandBlockTypes, s); + var /** number */ distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 24); + var /** number */ distanceAlphabetSizeLimit = distanceAlphabetSizeMax; + if (s.isLargeWindow == 1) { + distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 62); + distanceAlphabetSizeLimit = calculateDistanceAlphabetLimit(0x7FFFFFFC, s.distancePostfixBits, s.numDirectDistanceCodes); + } + s.distanceTreeGroup = decodeHuffmanTreeGroup(distanceAlphabetSizeMax, distanceAlphabetSizeLimit, numDistTrees, s); + calculateDistanceLut(s, distanceAlphabetSizeLimit); + s.contextMapSlice = 0; + s.distContextMapSlice = 0; + s.contextLookupOffset1 = s.contextModes[0] * 512; + s.contextLookupOffset2 = s.contextLookupOffset1 + 256; + s.literalTreeIdx = 0; + s.commandTreeIdx = 0; + s.rings[4] = 1; + s.rings[5] = 0; + s.rings[6] = 1; + s.rings[7] = 0; + s.rings[8] = 1; + s.rings[9] = 0; + } + /** + * @param {!State} s + * @return {void} + */ + function copyUncompressedData(s) { + var /** !Int8Array */ ringBuffer = s.ringBuffer; + if (s.metaBlockLength <= 0) { + reload(s); + s.runningState = 2; + return; + } + var /** number */ chunkLength = min(s.ringBufferSize - s.pos, s.metaBlockLength); + copyBytes(s, ringBuffer, s.pos, chunkLength); + s.metaBlockLength -= chunkLength; + s.pos += chunkLength; + if (s.pos == s.ringBufferSize) { + s.nextRunningState = 6; + s.runningState = 12; + return; + } + reload(s); + s.runningState = 2; + } + /** + * @param {!State} s + * @return {number} + */ + function writeRingBuffer(s) { + var /** number */ toWrite = min(s.outputLength - s.outputUsed, s.ringBufferBytesReady - s.ringBufferBytesWritten); + if (toWrite != 0) { + s.output.set(s.ringBuffer.subarray(s.ringBufferBytesWritten, s.ringBufferBytesWritten + toWrite), s.outputOffset + s.outputUsed); + s.outputUsed += toWrite; + s.ringBufferBytesWritten += toWrite; + } + if (s.outputUsed < s.outputLength) { + return 1; + } else { + return 0; + } + } + /** + * @param {number} alphabetSizeMax + * @param {number} alphabetSizeLimit + * @param {number} n + * @param {!State} s + * @return {!Int32Array} + */ + function decodeHuffmanTreeGroup(alphabetSizeMax, alphabetSizeLimit, n, s) { + var /** number */ maxTableSize = MAX_HUFFMAN_TABLE_SIZE[(alphabetSizeLimit + 31) >> 5]; + var /** !Int32Array */ group = new Int32Array(n + n * maxTableSize); + var /** number */ next = n; + for (var /** number */ i = 0; i < n; ++i) { + group[i] = next; + next += readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, group, i, s); + } + return group; + } + /** + * @param {!State} s + * @return {number} + */ + function calculateFence(s) { + var /** number */ result = s.ringBufferSize; + if (s.isEager != 0) { + result = min(result, s.ringBufferBytesWritten + s.outputLength - s.outputUsed); + } + return result; + } + /** + * @param {!State} s + * @return {void} + */ + function decompress(s) { + if (s.runningState == 0) { + throw "Can't decompress until initialized"; + } + if (s.runningState == 11) { + throw "Can't decompress after close"; + } + if (s.runningState == 1) { + var /** number */ windowBits = decodeWindowBits(s); + if (windowBits == -1) { + throw "Invalid 'windowBits' code"; + } + s.maxRingBufferSize = 1 << windowBits; + s.maxBackwardDistance = s.maxRingBufferSize - 16; + s.runningState = 2; + } + var /** number */ fence = calculateFence(s); + var /** number */ ringBufferMask = s.ringBufferSize - 1; + var /** !Int8Array */ ringBuffer = s.ringBuffer; + while (s.runningState != 10) { + switch(s.runningState) { + case 2: + if (s.metaBlockLength < 0) { + throw "Invalid metablock length"; + } + readNextMetablockHeader(s); + fence = calculateFence(s); + ringBufferMask = s.ringBufferSize - 1; + ringBuffer = s.ringBuffer; + continue; + case 3: + readMetablockHuffmanCodesAndContextMaps(s); + s.runningState = 4; + case 4: + if (s.metaBlockLength <= 0) { + s.runningState = 2; + continue; + } + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + if (s.commandBlockLength == 0) { + decodeCommandBlockSwitch(s); + } + s.commandBlockLength--; + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ cmdCode = readSymbol(s.commandTreeGroup, s.commandTreeIdx, s) << 2; + var /** number */ insertAndCopyExtraBits = CMD_LOOKUP[cmdCode]; + var /** number */ insertLengthOffset = CMD_LOOKUP[cmdCode + 1]; + var /** number */ copyLengthOffset = CMD_LOOKUP[cmdCode + 2]; + s.distanceCode = CMD_LOOKUP[cmdCode + 3]; + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ extraBits = insertAndCopyExtraBits & 0xFF; + s.insertLength = insertLengthOffset + ((extraBits <= 16) ? readFewBits(s, extraBits) : readManyBits(s, extraBits)); + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ extraBits = insertAndCopyExtraBits >> 8; + s.copyLength = copyLengthOffset + ((extraBits <= 16) ? readFewBits(s, extraBits) : readManyBits(s, extraBits)); + s.j = 0; + s.runningState = 7; + case 7: + if (s.trivialLiteralContext != 0) { + while (s.j < s.insertLength) { + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + if (s.literalBlockLength == 0) { + decodeLiteralBlockSwitch(s); + } + s.literalBlockLength--; + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + ringBuffer[s.pos] = readSymbol(s.literalTreeGroup, s.literalTreeIdx, s); + s.pos++; + s.j++; + if (s.pos >= fence) { + s.nextRunningState = 7; + s.runningState = 12; + break; + } + } + } else { + var /** number */ prevByte1 = ringBuffer[(s.pos - 1) & ringBufferMask] & 0xFF; + var /** number */ prevByte2 = ringBuffer[(s.pos - 2) & ringBufferMask] & 0xFF; + while (s.j < s.insertLength) { + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + if (s.literalBlockLength == 0) { + decodeLiteralBlockSwitch(s); + } + var /** number */ literalContext = LOOKUP[s.contextLookupOffset1 + prevByte1] | LOOKUP[s.contextLookupOffset2 + prevByte2]; + var /** number */ literalTreeIdx = s.contextMap[s.contextMapSlice + literalContext] & 0xFF; + s.literalBlockLength--; + prevByte2 = prevByte1; + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + prevByte1 = readSymbol(s.literalTreeGroup, literalTreeIdx, s); + ringBuffer[s.pos] = prevByte1; + s.pos++; + s.j++; + if (s.pos >= fence) { + s.nextRunningState = 7; + s.runningState = 12; + break; + } + } + } + if (s.runningState != 7) { + continue; + } + s.metaBlockLength -= s.insertLength; + if (s.metaBlockLength <= 0) { + s.runningState = 4; + continue; + } + var /** number */ distanceCode = s.distanceCode; + if (distanceCode < 0) { + s.distance = s.rings[s.distRbIdx]; + } else { + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + if (s.distanceBlockLength == 0) { + decodeDistanceBlockSwitch(s); + } + s.distanceBlockLength--; + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + var /** number */ distTreeIdx = s.distContextMap[s.distContextMapSlice + distanceCode] & 0xFF; + distanceCode = readSymbol(s.distanceTreeGroup, distTreeIdx, s); + if (distanceCode < 16) { + var /** number */ index = (s.distRbIdx + DISTANCE_SHORT_CODE_INDEX_OFFSET[distanceCode]) & 0x3; + s.distance = s.rings[index] + DISTANCE_SHORT_CODE_VALUE_OFFSET[distanceCode]; + if (s.distance < 0) { + throw "Negative distance"; + } + } else { + var /** number */ extraBits = s.distExtraBits[distanceCode]; + var /** number */ bits; + if (s.bitOffset + extraBits <= 32) { + bits = readFewBits(s, extraBits); + } else { + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + bits = ((extraBits <= 16) ? readFewBits(s, extraBits) : readManyBits(s, extraBits)); + } + s.distance = s.distOffset[distanceCode] + (bits << s.distancePostfixBits); + } + } + if (s.maxDistance != s.maxBackwardDistance && s.pos < s.maxBackwardDistance) { + s.maxDistance = s.pos; + } else { + s.maxDistance = s.maxBackwardDistance; + } + if (s.distance > s.maxDistance) { + s.runningState = 9; + continue; + } + if (distanceCode > 0) { + s.distRbIdx = (s.distRbIdx + 1) & 0x3; + s.rings[s.distRbIdx] = s.distance; + } + if (s.copyLength > s.metaBlockLength) { + throw "Invalid backward reference"; + } + s.j = 0; + s.runningState = 8; + case 8: + var /** number */ src = (s.pos - s.distance) & ringBufferMask; + var /** number */ dst = s.pos; + var /** number */ copyLength = s.copyLength - s.j; + var /** number */ srcEnd = src + copyLength; + var /** number */ dstEnd = dst + copyLength; + if ((srcEnd < ringBufferMask) && (dstEnd < ringBufferMask)) { + if (copyLength < 12 || (srcEnd > dst && dstEnd > src)) { + for (var /** number */ k = 0; k < copyLength; k += 4) { + ringBuffer[dst++] = ringBuffer[src++]; + ringBuffer[dst++] = ringBuffer[src++]; + ringBuffer[dst++] = ringBuffer[src++]; + ringBuffer[dst++] = ringBuffer[src++]; + } + } else { + ringBuffer.copyWithin(dst, src, srcEnd); + } + s.j += copyLength; + s.metaBlockLength -= copyLength; + s.pos += copyLength; + } else { + for (; s.j < s.copyLength; ) { + ringBuffer[s.pos] = ringBuffer[(s.pos - s.distance) & ringBufferMask]; + s.metaBlockLength--; + s.pos++; + s.j++; + if (s.pos >= fence) { + s.nextRunningState = 8; + s.runningState = 12; + break; + } + } + } + if (s.runningState == 8) { + s.runningState = 4; + } + continue; + case 9: + if (s.distance > 0x7FFFFFFC) { + throw "Invalid backward reference"; + } + if (s.copyLength >= 4 && s.copyLength <= 24) { + var /** number */ offset = DICTIONARY_OFFSETS_BY_LENGTH[s.copyLength]; + var /** number */ wordId = s.distance - s.maxDistance - 1; + var /** number */ shift = DICTIONARY_SIZE_BITS_BY_LENGTH[s.copyLength]; + var /** number */ mask = (1 << shift) - 1; + var /** number */ wordIdx = wordId & mask; + var /** number */ transformIdx = wordId >>> shift; + offset += wordIdx * s.copyLength; + if (transformIdx < 121) { + var /** number */ len = transformDictionaryWord(ringBuffer, s.pos, DICTIONARY_DATA, offset, s.copyLength, RFC_TRANSFORMS, transformIdx); + s.pos += len; + s.metaBlockLength -= len; + if (s.pos >= fence) { + s.nextRunningState = 4; + s.runningState = 12; + continue; + } + } else { + throw "Invalid backward reference"; + } + } else { + throw "Invalid backward reference"; + } + s.runningState = 4; + continue; + case 5: + while (s.metaBlockLength > 0) { + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + readFewBits(s, 8); + s.metaBlockLength--; + } + s.runningState = 2; + continue; + case 6: + copyUncompressedData(s); + continue; + case 12: + s.ringBufferBytesReady = min(s.pos, s.ringBufferSize); + s.runningState = 13; + case 13: + if (writeRingBuffer(s) == 0) { + return; + } + if (s.pos >= s.maxBackwardDistance) { + s.maxDistance = s.maxBackwardDistance; + } + if (s.pos >= s.ringBufferSize) { + if (s.pos > s.ringBufferSize) { + ringBuffer.copyWithin(0, s.ringBufferSize, s.pos); + } + s.pos &= ringBufferMask; + s.ringBufferBytesWritten = 0; + } + s.runningState = s.nextRunningState; + continue; + default: + throw "Unexpected state " + s.runningState; + } + } + if (s.runningState == 10) { + if (s.metaBlockLength < 0) { + throw "Invalid metablock length"; + } + jumpToByteBoundary(s); + checkHealth(s, 1); + } + } + + /** + * @constructor + * @param {number} numTransforms + * @param {number} prefixSuffixLen + * @param {number} prefixSuffixCount + * @struct + */ + function Transforms(numTransforms, prefixSuffixLen, prefixSuffixCount) { + /** @type {!number} */ + this.numTransforms = 0; + /** @type {!Int32Array} */ + this.triplets = new Int32Array(0); + /** @type {!Int8Array} */ + this.prefixSuffixStorage = new Int8Array(0); + /** @type {!Int32Array} */ + this.prefixSuffixHeads = new Int32Array(0); + /** @type {!Int16Array} */ + this.params = new Int16Array(0); + this.numTransforms = numTransforms; + this.triplets = new Int32Array(numTransforms * 3); + this.params = new Int16Array(numTransforms); + this.prefixSuffixStorage = new Int8Array(prefixSuffixLen); + this.prefixSuffixHeads = new Int32Array(prefixSuffixCount + 1); + } + + var RFC_TRANSFORMS = new Transforms(121, 167, 50); + /** + * @param {!Int8Array} prefixSuffix + * @param {!Int32Array} prefixSuffixHeads + * @param {!Int32Array} transforms + * @param {!string} prefixSuffixSrc + * @param {!string} transformsSrc + * @return {void} + */ + function unpackTransforms(prefixSuffix, prefixSuffixHeads, transforms, prefixSuffixSrc, transformsSrc) { + var /** number */ n = prefixSuffixSrc.length; + var /** number */ index = 1; + var /** number */ j = 0; + for (var /** number */ i = 0; i < n; ++i) { + var /** number */ c = prefixSuffixSrc.charCodeAt(i); + if (c == 35) { + prefixSuffixHeads[index++] = j; + } else { + prefixSuffix[j++] = c; + } + } + for (var /** number */ i = 0; i < 363; ++i) { + transforms[i] = transformsSrc.charCodeAt(i) - 32; + } + } + { + unpackTransforms(RFC_TRANSFORMS.prefixSuffixStorage, RFC_TRANSFORMS.prefixSuffixHeads, RFC_TRANSFORMS.triplets, "# #s #, #e #.# the #.com/#\u00C2\u00A0# of # and # in # to #\"#\">#\n#]# for # a # that #. # with #'# from # by #. The # on # as # is #ing #\n\t#:#ed #(# at #ly #=\"# of the #. This #,# not #er #al #='#ful #ive #less #est #ize #ous #", " !! ! , *! &! \" ! ) * * - ! # ! #!*! + ,$ ! - % . / # 0 1 . \" 2 3!* 4% ! # / 5 6 7 8 0 1 & $ 9 + : ; < ' != > ?! 4 @ 4 2 & A *# ( B C& ) % ) !*# *-% A +! *. D! %' & E *6 F G% ! *A *% H! D I!+! J!+ K +- *4! A L!*4 M N +6 O!*% +.! K *G P +%( ! G *D +D Q +# *K!*G!+D!+# +G +A +4!+% +K!+4!*D!+K!*K"); + } + /** + * @param {!Int8Array} dst + * @param {number} dstOffset + * @param {!Int8Array} src + * @param {number} srcOffset + * @param {number} len + * @param {!Transforms} transforms + * @param {number} transformIndex + * @return {number} + */ + function transformDictionaryWord(dst, dstOffset, src, srcOffset, len, transforms, transformIndex) { + var /** number */ offset = dstOffset; + var /** !Int32Array */ triplets = transforms.triplets; + var /** !Int8Array */ prefixSuffixStorage = transforms.prefixSuffixStorage; + var /** !Int32Array */ prefixSuffixHeads = transforms.prefixSuffixHeads; + var /** number */ transformOffset = 3 * transformIndex; + var /** number */ prefixIdx = triplets[transformOffset]; + var /** number */ transformType = triplets[transformOffset + 1]; + var /** number */ suffixIdx = triplets[transformOffset + 2]; + var /** number */ prefix = prefixSuffixHeads[prefixIdx]; + var /** number */ prefixEnd = prefixSuffixHeads[prefixIdx + 1]; + var /** number */ suffix = prefixSuffixHeads[suffixIdx]; + var /** number */ suffixEnd = prefixSuffixHeads[suffixIdx + 1]; + var /** number */ omitFirst = transformType - 11; + var /** number */ omitLast = transformType - 0; + if (omitFirst < 1 || omitFirst > 9) { + omitFirst = 0; + } + if (omitLast < 1 || omitLast > 9) { + omitLast = 0; + } + while (prefix != prefixEnd) { + dst[offset++] = prefixSuffixStorage[prefix++]; + } + if (omitFirst > len) { + omitFirst = len; + } + srcOffset += omitFirst; + len -= omitFirst; + len -= omitLast; + var /** number */ i = len; + while (i > 0) { + dst[offset++] = src[srcOffset++]; + i--; + } + if (transformType == 10 || transformType == 11) { + var /** number */ uppercaseOffset = offset - len; + if (transformType == 10) { + len = 1; + } + while (len > 0) { + var /** number */ c0 = dst[uppercaseOffset] & 0xFF; + if (c0 < 0xC0) { + if (c0 >= 97 && c0 <= 122) { + dst[uppercaseOffset] ^= 32; + } + uppercaseOffset += 1; + len -= 1; + } else if (c0 < 0xE0) { + dst[uppercaseOffset + 1] ^= 32; + uppercaseOffset += 2; + len -= 2; + } else { + dst[uppercaseOffset + 2] ^= 5; + uppercaseOffset += 3; + len -= 3; + } + } + } else if (transformType == 21 || transformType == 22) { + var /** number */ shiftOffset = offset - len; + var /** number */ param = transforms.params[transformIndex]; + var /** number */ scalar = (param & 0x7FFF) + (0x1000000 - (param & 0x8000)); + while (len > 0) { + var /** number */ step = 1; + var /** number */ c0 = dst[shiftOffset] & 0xFF; + if (c0 < 0x80) { + scalar += c0; + dst[shiftOffset] = (scalar & 0x7F); + } else if (c0 < 0xC0) ; else if (c0 < 0xE0) { + if (len >= 2) { + var /** number */ c1 = dst[shiftOffset + 1]; + scalar += (c1 & 0x3F) | ((c0 & 0x1F) << 6); + dst[shiftOffset] = (0xC0 | ((scalar >> 6) & 0x1F)); + dst[shiftOffset + 1] = ((c1 & 0xC0) | (scalar & 0x3F)); + step = 2; + } else { + step = len; + } + } else if (c0 < 0xF0) { + if (len >= 3) { + var /** number */ c1 = dst[shiftOffset + 1]; + var /** number */ c2 = dst[shiftOffset + 2]; + scalar += (c2 & 0x3F) | ((c1 & 0x3F) << 6) | ((c0 & 0x0F) << 12); + dst[shiftOffset] = (0xE0 | ((scalar >> 12) & 0x0F)); + dst[shiftOffset + 1] = ((c1 & 0xC0) | ((scalar >> 6) & 0x3F)); + dst[shiftOffset + 2] = ((c2 & 0xC0) | (scalar & 0x3F)); + step = 3; + } else { + step = len; + } + } else if (c0 < 0xF8) { + if (len >= 4) { + var /** number */ c1 = dst[shiftOffset + 1]; + var /** number */ c2 = dst[shiftOffset + 2]; + var /** number */ c3 = dst[shiftOffset + 3]; + scalar += (c3 & 0x3F) | ((c2 & 0x3F) << 6) | ((c1 & 0x3F) << 12) | ((c0 & 0x07) << 18); + dst[shiftOffset] = (0xF0 | ((scalar >> 18) & 0x07)); + dst[shiftOffset + 1] = ((c1 & 0xC0) | ((scalar >> 12) & 0x3F)); + dst[shiftOffset + 2] = ((c2 & 0xC0) | ((scalar >> 6) & 0x3F)); + dst[shiftOffset + 3] = ((c3 & 0xC0) | (scalar & 0x3F)); + step = 4; + } else { + step = len; + } + } + shiftOffset += step; + len -= step; + if (transformType == 21) { + len = 0; + } + } + } + while (suffix != suffixEnd) { + dst[offset++] = prefixSuffixStorage[suffix++]; + } + return offset - dstOffset; + } + + /** + * @param {number} key + * @param {number} len + * @return {number} + */ + function getNextKey(key, len) { + var /** number */ step = 1 << (len - 1); + while ((key & step) != 0) { + step >>= 1; + } + return (key & (step - 1)) + step; + } + /** + * @param {!Int32Array} table + * @param {number} offset + * @param {number} step + * @param {number} end + * @param {number} item + * @return {void} + */ + function replicateValue(table, offset, step, end, item) { + do { + end -= step; + table[offset + end] = item; + } while (end > 0); + } + /** + * @param {!Int32Array} count + * @param {number} len + * @param {number} rootBits + * @return {number} + */ + function nextTableBitSize(count, len, rootBits) { + var /** number */ left = 1 << (len - rootBits); + while (len < 15) { + left -= count[len]; + if (left <= 0) { + break; + } + len++; + left <<= 1; + } + return len - rootBits; + } + /** + * @param {!Int32Array} tableGroup + * @param {number} tableIdx + * @param {number} rootBits + * @param {!Int32Array} codeLengths + * @param {number} codeLengthsSize + * @return {number} + */ + function buildHuffmanTable(tableGroup, tableIdx, rootBits, codeLengths, codeLengthsSize) { + var /** number */ tableOffset = tableGroup[tableIdx]; + var /** number */ key; + var /** !Int32Array */ sorted = new Int32Array(codeLengthsSize); + var /** !Int32Array */ count = new Int32Array(16); + var /** !Int32Array */ offset = new Int32Array(16); + var /** number */ symbol; + for (symbol = 0; symbol < codeLengthsSize; symbol++) { + count[codeLengths[symbol]]++; + } + offset[1] = 0; + for (var /** number */ len = 1; len < 15; len++) { + offset[len + 1] = offset[len] + count[len]; + } + for (symbol = 0; symbol < codeLengthsSize; symbol++) { + if (codeLengths[symbol] != 0) { + sorted[offset[codeLengths[symbol]]++] = symbol; + } + } + var /** number */ tableBits = rootBits; + var /** number */ tableSize = 1 << tableBits; + var /** number */ totalSize = tableSize; + if (offset[15] == 1) { + for (key = 0; key < totalSize; key++) { + tableGroup[tableOffset + key] = sorted[0]; + } + return totalSize; + } + key = 0; + symbol = 0; + for (var /** number */ len = 1, step = 2; len <= rootBits; len++, step <<= 1) { + for (; count[len] > 0; count[len]--) { + replicateValue(tableGroup, tableOffset + key, step, tableSize, len << 16 | sorted[symbol++]); + key = getNextKey(key, len); + } + } + var /** number */ mask = totalSize - 1; + var /** number */ low = -1; + var /** number */ currentOffset = tableOffset; + for (var /** number */ len = rootBits + 1, step = 2; len <= 15; len++, step <<= 1) { + for (; count[len] > 0; count[len]--) { + if ((key & mask) != low) { + currentOffset += tableSize; + tableBits = nextTableBitSize(count, len, rootBits); + tableSize = 1 << tableBits; + totalSize += tableSize; + low = key & mask; + tableGroup[tableOffset + low] = (tableBits + rootBits) << 16 | (currentOffset - tableOffset - low); + } + replicateValue(tableGroup, currentOffset + (key >> rootBits), step, tableSize, (len - rootBits) << 16 | sorted[symbol++]); + key = getNextKey(key, len); + } + } + return totalSize; + } + + /** + * @param {!State} s + * @return {void} + */ + function doReadMoreInput(s) { + if (s.endOfStreamReached != 0) { + if (halfAvailable(s) >= -2) { + return; + } + throw "No more input"; + } + var /** number */ readOffset = s.halfOffset << 1; + var /** number */ bytesInBuffer = 4096 - readOffset; + s.byteBuffer.copyWithin(0, readOffset, 4096); + s.halfOffset = 0; + while (bytesInBuffer < 4096) { + var /** number */ spaceLeft = 4096 - bytesInBuffer; + var /** number */ len = readInput(s.input, s.byteBuffer, bytesInBuffer, spaceLeft); + if (len <= 0) { + s.endOfStreamReached = 1; + s.tailBytes = bytesInBuffer; + bytesInBuffer += 1; + break; + } + bytesInBuffer += len; + } + bytesToNibbles(s, bytesInBuffer); + } + /** + * @param {!State} s + * @param {number} endOfStream + * @return {void} + */ + function checkHealth(s, endOfStream) { + if (s.endOfStreamReached == 0) { + return; + } + var /** number */ byteOffset = (s.halfOffset << 1) + ((s.bitOffset + 7) >> 3) - 4; + if (byteOffset > s.tailBytes) { + throw "Read after end"; + } + if ((endOfStream != 0) && (byteOffset != s.tailBytes)) { + throw "Unused bytes after end"; + } + } + /** + * @param {!State} s + * @param {number} n + * @return {number} + */ + function readFewBits(s, n) { + var /** number */ val = (s.accumulator32 >>> s.bitOffset) & ((1 << n) - 1); + s.bitOffset += n; + return val; + } + /** + * @param {!State} s + * @param {number} n + * @return {number} + */ + function readManyBits(s, n) { + var /** number */ low = readFewBits(s, 16); + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + return low | (readFewBits(s, n - 16) << 16); + } + /** + * @param {!State} s + * @return {void} + */ + function initBitReader(s) { + s.byteBuffer = new Int8Array(4160); + s.accumulator32 = 0; + s.shortBuffer = new Int16Array(2080); + s.bitOffset = 32; + s.halfOffset = 2048; + s.endOfStreamReached = 0; + prepare(s); + } + /** + * @param {!State} s + * @return {void} + */ + function prepare(s) { + if (s.halfOffset > 2030) { + doReadMoreInput(s); + } + checkHealth(s, 0); + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + /** + * @param {!State} s + * @return {void} + */ + function reload(s) { + if (s.bitOffset == 32) { + prepare(s); + } + } + /** + * @param {!State} s + * @return {void} + */ + function jumpToByteBoundary(s) { + var /** number */ padding = (32 - s.bitOffset) & 7; + if (padding != 0) { + var /** number */ paddingBits = readFewBits(s, padding); + if (paddingBits != 0) { + throw "Corrupted padding bits"; + } + } + } + /** + * @param {!State} s + * @return {number} + */ + function halfAvailable(s) { + var /** number */ limit = 2048; + if (s.endOfStreamReached != 0) { + limit = (s.tailBytes + 1) >> 1; + } + return limit - s.halfOffset; + } + /** + * @param {!State} s + * @param {!Int8Array} data + * @param {number} offset + * @param {number} length + * @return {void} + */ + function copyBytes(s, data, offset, length) { + if ((s.bitOffset & 7) != 0) { + throw "Unaligned copyBytes"; + } + while ((s.bitOffset != 32) && (length != 0)) { + data[offset++] = (s.accumulator32 >>> s.bitOffset); + s.bitOffset += 8; + length--; + } + if (length == 0) { + return; + } + var /** number */ copyNibbles = min(halfAvailable(s), length >> 1); + if (copyNibbles > 0) { + var /** number */ readOffset = s.halfOffset << 1; + var /** number */ delta = copyNibbles << 1; + data.set(s.byteBuffer.subarray(readOffset, readOffset + delta), offset); + offset += delta; + length -= delta; + s.halfOffset += copyNibbles; + } + if (length == 0) { + return; + } + if (halfAvailable(s) > 0) { + if (s.bitOffset >= 16) { + s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16); + s.bitOffset -= 16; + } + while (length != 0) { + data[offset++] = (s.accumulator32 >>> s.bitOffset); + s.bitOffset += 8; + length--; + } + checkHealth(s, 0); + return; + } + while (length > 0) { + var /** number */ len = readInput(s.input, data, offset, length); + if (len == -1) { + throw "Unexpected end of input"; + } + offset += len; + length -= len; + } + } + /** + * @param {!State} s + * @param {number} byteLen + * @return {void} + */ + function bytesToNibbles(s, byteLen) { + var /** !Int8Array */ byteBuffer = s.byteBuffer; + var /** number */ halfLen = byteLen >> 1; + var /** !Int16Array */ shortBuffer = s.shortBuffer; + for (var /** number */ i = 0; i < halfLen; ++i) { + shortBuffer[i] = ((byteBuffer[i * 2] & 0xFF) | ((byteBuffer[(i * 2) + 1] & 0xFF) << 8)); + } + } + + var LOOKUP = new Int32Array(2048); + /** + * @param {!Int32Array} lookup + * @param {!string} map + * @param {!string} rle + * @return {void} + */ + function unpackLookupTable(lookup, map, rle) { + for (var /** number */ i = 0; i < 256; ++i) { + lookup[i] = i & 0x3F; + lookup[512 + i] = i >> 2; + lookup[1792 + i] = 2 + (i >> 6); + } + for (var /** number */ i = 0; i < 128; ++i) { + lookup[1024 + i] = 4 * (map.charCodeAt(i) - 32); + } + for (var /** number */ i = 0; i < 64; ++i) { + lookup[1152 + i] = i & 1; + lookup[1216 + i] = 2 + (i & 1); + } + var /** number */ offset = 1280; + for (var /** number */ k = 0; k < 19; ++k) { + var /** number */ value = k & 3; + var /** number */ rep = rle.charCodeAt(k) - 32; + for (var /** number */ i = 0; i < rep; ++i) { + lookup[offset++] = value; + } + } + for (var /** number */ i = 0; i < 16; ++i) { + lookup[1792 + i] = 1; + lookup[2032 + i] = 6; + } + lookup[1792] = 0; + lookup[2047] = 7; + for (var /** number */ i = 0; i < 256; ++i) { + lookup[1536 + i] = lookup[1792 + i] << 3; + } + } + { + unpackLookupTable(LOOKUP, " !! ! \"#$##%#$&'##(#)#++++++++++((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# ", "A/* ': & : $ \u0081 @"); + } + + /** + * @constructor + * @struct + */ + function State() { + /** @type {!Int8Array} */ + this.ringBuffer = new Int8Array(0); + /** @type {!Int8Array} */ + this.contextModes = new Int8Array(0); + /** @type {!Int8Array} */ + this.contextMap = new Int8Array(0); + /** @type {!Int8Array} */ + this.distContextMap = new Int8Array(0); + /** @type {!Int8Array} */ + this.distExtraBits = new Int8Array(0); + /** @type {!Int8Array} */ + this.output = new Int8Array(0); + /** @type {!Int8Array} */ + this.byteBuffer = new Int8Array(0); + /** @type {!Int16Array} */ + this.shortBuffer = new Int16Array(0); + /** @type {!Int32Array} */ + this.intBuffer = new Int32Array(0); + /** @type {!Int32Array} */ + this.rings = new Int32Array(0); + /** @type {!Int32Array} */ + this.blockTrees = new Int32Array(0); + /** @type {!Int32Array} */ + this.literalTreeGroup = new Int32Array(0); + /** @type {!Int32Array} */ + this.commandTreeGroup = new Int32Array(0); + /** @type {!Int32Array} */ + this.distanceTreeGroup = new Int32Array(0); + /** @type {!Int32Array} */ + this.distOffset = new Int32Array(0); + /** @type {!number} */ + this.runningState = 0; + /** @type {!number} */ + this.nextRunningState = 0; + /** @type {!number} */ + this.accumulator32 = 0; + /** @type {!number} */ + this.bitOffset = 0; + /** @type {!number} */ + this.halfOffset = 0; + /** @type {!number} */ + this.tailBytes = 0; + /** @type {!number} */ + this.endOfStreamReached = 0; + /** @type {!number} */ + this.metaBlockLength = 0; + /** @type {!number} */ + this.inputEnd = 0; + /** @type {!number} */ + this.isUncompressed = 0; + /** @type {!number} */ + this.isMetadata = 0; + /** @type {!number} */ + this.literalBlockLength = 0; + /** @type {!number} */ + this.numLiteralBlockTypes = 0; + /** @type {!number} */ + this.commandBlockLength = 0; + /** @type {!number} */ + this.numCommandBlockTypes = 0; + /** @type {!number} */ + this.distanceBlockLength = 0; + /** @type {!number} */ + this.numDistanceBlockTypes = 0; + /** @type {!number} */ + this.pos = 0; + /** @type {!number} */ + this.maxDistance = 0; + /** @type {!number} */ + this.distRbIdx = 0; + /** @type {!number} */ + this.trivialLiteralContext = 0; + /** @type {!number} */ + this.literalTreeIdx = 0; + /** @type {!number} */ + this.commandTreeIdx = 0; + /** @type {!number} */ + this.j = 0; + /** @type {!number} */ + this.insertLength = 0; + /** @type {!number} */ + this.contextMapSlice = 0; + /** @type {!number} */ + this.distContextMapSlice = 0; + /** @type {!number} */ + this.contextLookupOffset1 = 0; + /** @type {!number} */ + this.contextLookupOffset2 = 0; + /** @type {!number} */ + this.distanceCode = 0; + /** @type {!number} */ + this.numDirectDistanceCodes = 0; + /** @type {!number} */ + this.distancePostfixMask = 0; + /** @type {!number} */ + this.distancePostfixBits = 0; + /** @type {!number} */ + this.distance = 0; + /** @type {!number} */ + this.copyLength = 0; + /** @type {!number} */ + this.maxBackwardDistance = 0; + /** @type {!number} */ + this.maxRingBufferSize = 0; + /** @type {!number} */ + this.ringBufferSize = 0; + /** @type {!number} */ + this.expectedTotalSize = 0; + /** @type {!number} */ + this.outputOffset = 0; + /** @type {!number} */ + this.outputLength = 0; + /** @type {!number} */ + this.outputUsed = 0; + /** @type {!number} */ + this.ringBufferBytesWritten = 0; + /** @type {!number} */ + this.ringBufferBytesReady = 0; + /** @type {!number} */ + this.isEager = 0; + /** @type {!number} */ + this.isLargeWindow = 0; + /** @type {!InputStream|null} */ + this.input = null; + this.ringBuffer = new Int8Array(0); + this.rings = new Int32Array(10); + this.rings[0] = 16; + this.rings[1] = 15; + this.rings[2] = 11; + this.rings[3] = 4; + } + + /** + * @param {!Int8Array} dictionary + * @param {!string} data0 + * @param {!string} data1 + * @param {!string} skipFlip + * @return {void} + */ + function unpackDictionaryData(dictionary, data0, data1, skipFlip) { + var /** !Int8Array */ dict = toUsAsciiBytes(data0 + data1); + if (dict.length != dictionary.length) { + throw "Corrupted brotli dictionary"; + } + var /** number */ offset = 0; + var /** number */ n = skipFlip.length; + for (var /** number */ i = 0; i < n; i += 2) { + var /** number */ skip = skipFlip.charCodeAt(i) - 36; + var /** number */ flip = skipFlip.charCodeAt(i + 1) - 36; + offset += skip; + for (var /** number */ j = 0; j < flip; ++j) { + dict[offset] |= 0x80; + offset++; + } + } + dictionary.set(dict); + } + { + var /** !Int8Array */ dictionary = new Int8Array(122784); + unpackDictionaryData(dictionary, "timedownlifeleftbackcodedatashowonlysitecityopenjustlikefreeworktextyearoverbodyloveformbookplaylivelinehelphomesidemorewordlongthemviewfindpagedaysfullheadtermeachareafromtruemarkableuponhighdatelandnewsevennextcasebothpostusedmadehandherewhatnameLinkblogsizebaseheldmakemainuser') +holdendswithNewsreadweresigntakehavegameseencallpathwellplusmenufilmpartjointhislistgoodneedwayswestjobsmindalsologorichuseslastteamarmyfoodkingwilleastwardbestfirePageknowaway.pngmovethanloadgiveselfnotemuchfeedmanyrockicononcelookhidediedHomerulehostajaxinfoclublawslesshalfsomesuchzone100%onescareTimeracebluefourweekfacehopegavehardlostwhenparkkeptpassshiproomHTMLplanTypedonesavekeepflaglinksoldfivetookratetownjumpthusdarkcardfilefearstaykillthatfallautoever.comtalkshopvotedeepmoderestturnbornbandfellroseurl(skinrolecomeactsagesmeetgold.jpgitemvaryfeltthensenddropViewcopy1.0\"stopelseliestourpack.gifpastcss?graymean>rideshotlatesaidroadvar feeljohnrickportfast'UA-deadpoorbilltypeU.S.woodmust2px;Inforankwidewantwalllead[0];paulwavesure$('#waitmassarmsgoesgainlangpaid!-- lockunitrootwalkfirmwifexml\"songtest20pxkindrowstoolfontmailsafestarmapscorerainflowbabyspansays4px;6px;artsfootrealwikiheatsteptriporg/lakeweaktoldFormcastfansbankveryrunsjulytask1px;goalgrewslowedgeid=\"sets5px;.js?40pxif (soonseatnonetubezerosentreedfactintogiftharm18pxcamehillboldzoomvoideasyringfillpeakinitcost3px;jacktagsbitsrolleditknewnearironfreddiskwentsoilputs/js/holyT22:ISBNT20:adamsees

    json', 'contT21: RSSloopasiamoon

    soulLINEfortcartT14:

    80px!--<9px;T04:mike:46ZniceinchYorkricezh:d'));puremageparatonebond:37Z_of_']);000,zh:gtankyardbowlbush:56ZJava30px\n|}\n%C3%:34ZjeffEXPIcashvisagolfsnowzh:iquer.csssickmeatmin.binddellhirepicsrent:36ZHTTP-201fotowolfEND xbox:54ZBODYdick;\n}\nexit:35Zvarsbeat'});diet999;anne}}sonyguysfuckpipe|-\n!002)ndow[1];[];\nLog salt\r\n\t\tbangtrimbath){\r\n00px\n});ko:lfeesad>\rs:// [];tollplug(){\n{\r\n .js'200pdualboat.JPG);\n}quot);\n\n');\n\r\n}\r201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037201320122011201020092008200720062005200420032002200120001999199819971996199519941993199219911990198919881987198619851984198319821981198019791978197719761975197419731972197119701969196819671966196519641963196219611960195919581957195619551954195319521951195010001024139400009999comomC!sesteestaperotodohacecadaaC1obiendC-aasC-vidacasootroforosolootracualdijosidograntipotemadebealgoquC)estonadatrespococasabajotodasinoaguapuesunosantediceluisellamayozonaamorpisoobraclicellodioshoracasiP7P0P=P0P>PP>Q\u0002P8P7P=P>P4P>Q\u0002P>P6P5P>P=P8Q\u0005P\u001DP0P5P5P1Q\u000BPP2Q\u000BP2P>P\u001DP>P>P1P\u001FP>P;P8P=P8P P$P\u001DP5P\u001CQ\u000BQ\u0002Q\u000BP\u001EP=P8Pthing.org/multiheardPowerstandtokensolid(thisbringshipsstafftriedcallsfullyfactsagentThis //-->adminegyptEvent15px;Emailtrue\"crossspentblogsbox\">notedleavechinasizesguest

    robotheavytrue,sevengrandcrimesignsawaredancephase>\n\n\r\nname=diegopage swiss-->\n\n#fff;\">Log.com\"treatsheet) && 14px;sleepntentfiledja:c\u0003id=\"cName\"worseshots-box-delta\n<bears:48Z spendbakershops= \"\";php\">ction13px;brianhellosize=o=%2F joinmaybe, fjsimg\" \")[0]MTopBType\"newlyDanskczechtrailknowsfaq\">zh-cn10);\n-1\");type=bluestrulydavis.js';>\r\n\r\nform jesus100% menu.\r\n\t\r\nwalesrisksumentddingb-likteachgif\" vegasdanskeestishqipsuomisobredesdeentretodospuedeaC1osestC!tienehastaotrospartedondenuevohacerformamismomejormundoaquC-dC-assC3loayudafechatodastantomenosdatosotrassitiomuchoahoralugarmayorestoshorastenerantesfotosestaspaC-snuevasaludforosmedioquienmesespoderchileserC!vecesdecirjosC)estarventagrupohechoellostengoamigocosasnivelgentemismaairesjuliotemashaciafavorjuniolibrepuntobuenoautorabrilbuenatextomarzosaberlistaluegocC3moenerojuegoperC:haberestoynuncamujervalorfueralibrogustaigualvotoscasosguC-apuedosomosavisousteddebennochebuscafaltaeurosseriedichocursoclavecasasleC3nplazolargoobrasvistaapoyojuntotratavistocrearcampohemoscincocargopisosordenhacenC!readiscopedrocercapuedapapelmenorC:tilclarojorgecalleponertardenadiemarcasigueellassiglocochemotosmadreclaserestoniC1oquedapasarbancohijosviajepabloC)stevienereinodejarfondocanalnorteletracausatomarmanoslunesautosvillavendopesartipostengamarcollevapadreunidovamoszonasambosbandamariaabusomuchasubirriojavivirgradochicaallC-jovendichaestantalessalirsuelopesosfinesllamabuscoC)stalleganegroplazahumorpagarjuntadobleislasbolsabaC1ohablaluchaC\u0001readicenjugarnotasvalleallC!cargadolorabajoestC)gustomentemariofirmacostofichaplatahogarartesleyesaquelmuseobasespocosmitadcielochicomiedoganarsantoetapadebesplayaredessietecortecoreadudasdeseoviejodeseaaguas"domaincommonstatuseventsmastersystemactionbannerremovescrollupdateglobalmediumfilternumberchangeresultpublicscreenchoosenormaltravelissuessourcetargetspringmodulemobileswitchphotosborderregionitselfsocialactivecolumnrecordfollowtitle>eitherlengthfamilyfriendlayoutauthorcreatereviewsummerserverplayedplayerexpandpolicyformatdoublepointsseriespersonlivingdesignmonthsforcesuniqueweightpeopleenergynaturesearchfigurehavingcustomoffsetletterwindowsubmitrendergroupsuploadhealthmethodvideosschoolfutureshadowdebatevaluesObjectothersrightsleaguechromesimplenoticesharedendingseasonreportonlinesquarebuttonimagesenablemovinglatestwinterFranceperiodstrongrepeatLondondetailformeddemandsecurepassedtoggleplacesdevicestaticcitiesstreamyellowattackstreetflighthiddeninfo\">openedusefulvalleycausesleadersecretseconddamagesportsexceptratingsignedthingseffectfieldsstatesofficevisualeditorvolumeReportmuseummoviesparentaccessmostlymother\" id=\"marketgroundchancesurveybeforesymbolmomentspeechmotioninsidematterCenterobjectexistsmiddleEuropegrowthlegacymannerenoughcareeransweroriginportalclientselectrandomclosedtopicscomingfatheroptionsimplyraisedescapechosenchurchdefinereasoncorneroutputmemoryiframepolicemodelsNumberduringoffersstyleskilledlistedcalledsilvermargindeletebetterbrowselimitsGlobalsinglewidgetcenterbudgetnowrapcreditclaimsenginesafetychoicespirit-stylespreadmakingneededrussiapleaseextentScriptbrokenallowschargedividefactormember-basedtheoryconfigaroundworkedhelpedChurchimpactshouldalwayslogo\" bottomlist\">){var prefixorangeHeader.push(couplegardenbridgelaunchReviewtakingvisionlittledatingButtonbeautythemesforgotSearchanchoralmostloadedChangereturnstringreloadMobileincomesupplySourceordersviewed courseAbout island: The dialoghousesBEGIN MexicostartscentreheightaddingIslandassetsEmpireSchooleffortdirectnearlymanualSelect.\n\nOnejoinedmenu\">PhilipawardshandleimportOfficeregardskillsnationSportsdegreeweekly (e.g.behinddoctorloggedunited
    beyond-scaleacceptservedmarineFootercamera\n_form\"leavesstress\" />\r\n.gif\" onloadloaderOxfordsistersurvivlistenfemaleDesignsize=\"appealtext\">levelsthankshigherforcedanimalanyoneAfricaagreedrecentPeople
    wonderpricesturned|| {};main\">inlinesundaywrap\">failedcensusminutebeaconquotes150px|estateremoteemail\"linkedright;signalformal1.htmlsignupprincefloat:.png\" forum.AccesspaperssoundsextendHeightsliderUTF-8\"& Before. WithstudioownersmanageprofitjQueryannualparamsboughtfamousgooglelongeri++) {israelsayingdecidehome\">headerensurebranchpiecesblock;statedtop\">boston.test(avatartested_countforumsschemaindex,filledsharesreaderalert(appearSubmitline\">body\">\n* TheThoughseeingjerseyNews\nSystem DavidcancertablesprovedApril reallydriveritem\">more\">boardscolorscampusfirst || [];media.guitarfinishwidth:showedOther .php\" assumelayerswilsonstoresreliefswedenCustomeasily your String\n\nWhiltaylorclear:resortfrenchthough\") + \"buyingbrandsMembername\">oppingsector5px;\">vspacepostermajor coffeemartinmaturehappenkansaslink\">Images=falsewhile hspace0& \n\nIn powerPolski-colorjordanBottomStart -count2.htmlnews\">01.jpgOnline-rightmillerseniorISBN 00,000 guidesvalue)ectionrepair.xml\" rights.html-blockregExp:hoverwithinvirginphones\rusing \n\tvar >');\n\t\n\nbahasabrasilgalegomagyarpolskisrpskiX1X/Y\u0008d8-f\u0016\u0007g.\u0000d=\u0013g9\u0001i+\u0014d?!f\u0001/d8-e\u001B=f\u0008\u0011d;,d8\u0000d8*e\u0005,e\u000F8g.!g\u0010\u0006h.:e\u001D\u001Be\u000F/d;%f\u001C\re\n!f\u00176i\u00174d8*d::d:'e\u0013\u0001h\u0007*e71d<\u0001d8\u001Af\u001F%g\u001C\u000Be7%d=\u001Ch\u0001\u0014g3;f2!f\u001C\tg=\u0011g+\u0019f\t\u0000f\u001C\th/\u0004h.:d8-e?\u0003f\u0016\u0007g+ g\u0014(f\u00087i&\u0016i!5d=\u001Ch\u0000\u0005f\n\u0000f\u001C/i\u0017.i\"\u0018g\u001B8e\u00053d8\u000Bh==f\u0010\u001Cg4\"d=?g\u0014(h=/d;6e\u001C(g:?d8;i\"\u0018h5\u0004f\u0016\u0019h'\u0006i\"\u0011e\u001B\u001Ee$\rf3(e\u0006\u000Cg=\u0011g;\u001Cf\u00146h\u0017\u000Fe\u0006\u0005e.9f\u000E(h\r\u0010e8\u0002e\u001C:f6\u0008f\u0001/g):i\u00174e\u000F\u0011e8\u0003d;\u0000d9\u0008e%=e\u000F\u000Bg\u0014\u001Ff4;e\u001B>g\t\u0007e\u000F\u0011e1\u0015e&\u0002f\u001E\u001Cf\t\u000Bf\u001C:f\u00160i\u0017;f\u001C\u0000f\u00160f\u00169e<\u000Fe\u000C\u0017d:,f\u000F\u0010d>\u001Be\u00053d:\u000Ef\u001B4e$\u001Ah?\u0019d8*g3;g;\u001Fg\u001F%i\u0001\u0013f88f\u0008\u000Fe9?e\u0011\ne\u00056d;\u0016e\u000F\u0011h!(e.\te\u0005(g,,d8\u0000d<\u001Ae\u0011\u0018h?\u001Bh!\u000Cg\u00029e\u0007;g\t\u0008f\u001D\u0003g\u00145e-\u0010d8\u0016g\u0015\u000Ch.>h.!e\u0005\rh49f\u0015\u0019h\u00022e\n e\u0005%f4;e\n(d;\u0016d;,e\u0015\u0006e\u0013\u0001e\r\u001Ae.\"g\u000E0e\u001C(d8\nf57e&\u0002d=\u0015e72g;\u000Fg\u0015\u0019h(\u0000h/&g;\u0006g$>e\u000C:g\u0019;e=\u0015f\u001C,g+\u0019i\u001C\u0000h&\u0001d;7f f\u000E%e\u001B=e.6e;:h.>f\u001C\u000Be\u000F\u000Bi\u0018\u0005h/;f3\u0015e>\u000Bd=\rg=.g;\u000Ff5\u000Ei\u0000\tf\u000B)h?\u0019f 7e=\u0013e\t\re\u0008\u0006g1;f\u000E\u0012h!\u000Ce\u001B d8:d:$f\u0018\u0013f\u001C\u0000e\u0010\u000Ei\u001F3d9\u0010d8\rh\u0003=i\u0000\u001Ah?\u0007h!\u000Cd8\u001Ag'\u0011f\n\u0000e\u000F/h\u0003=h.>e$\u0007e\u0010\u0008d=\u001Ce$'e.6g$>d<\u001Ag \u0014g)6d8\u0013d8\u001Ae\u0005(i\u0003(i!9g\u001B.h?\u0019i\u0007\u000Ch?\u0018f\u0018/e<\u0000e'\u000Bf\u0003\u0005e\u00065g\u00145h\u0004\u0011f\u0016\u0007d;6e\u0013\u0001g\t\u000Ce8.e\n)f\u0016\u0007e\u000C\u0016h5\u0004f:\u0010e$'e-&e-&d9 e\u001C0e\u001D\u0000f5\u000Fh'\u0008f\n\u0015h5\u0004e7%g(\u000Bh&\u0001f1\u0002f\u0000\u000Ed9\u0008f\u00176e\u0000\u0019e\n\u001Fh\u0003=d8;h&\u0001g\u001B.e\t\rh5\u0004h./e\u001F\u000Ee8\u0002f\u00169f3\u0015g\u00145e=1f\u000B\u001Bh\u0001\u0018e#0f\u0018\u000Ed;;d=\u0015e\u0001%e:7f\u00150f\r.g>\u000Ee\u001B=f1=h=&d;\u000Bg;\rd=\u0006f\u0018/d:$f5\u0001g\u0014\u001Fd:'f\t\u0000d;%g\u00145h/\u001Df\u0018>g$:d8\u0000d:\u001Be\r\u0015d=\rd::e\u0011\u0018e\u0008\u0006f\u001E\u0010e\u001C0e\u001B>f\u0017\u0005f88e7%e\u00057e-&g\u0014\u001Fg3;e\u0008\u0017g=\u0011e\u000F\u000Be8\u0016e-\u0010e/\u0006g \u0001i\"\u0011i\u0001\u0013f\u000E'e\u00086e\u001C0e\u000C:e\u001F:f\u001C,e\u0005(e\u001B=g=\u0011d8\ni\u0007\rh&\u0001g,,d:\u000Ce\u0016\u001Cf,\"h?\u001Be\u0005%e\u000F\u000Bf\u0003\u0005h?\u0019d:\u001Bh\u0000\u0003h/\u0015e\u000F\u0011g\u000E0e\u001F9h.-d;%d8\nf\u0014?e:\u001Cf\u0008\u0010d8:g\u000E/e\"\u0003i&\u0019f8/e\u0010\u000Cf\u00176e(1d9\u0010e\u000F\u0011i\u0000\u0001d8\u0000e.\u001Ae<\u0000e\u000F\u0011d=\u001Ce\u0013\u0001f \u0007e\u0007\u0006f,\"h?\u000Eh'#e\u00063e\u001C0f\u00169d8\u0000d8\u000Bd;%e\u000F\nh4#d;;f\u0008\u0016h\u0000\u0005e.\"f\u00087d;#h!(g'/e\u0008\u0006e%3d::f\u00150g \u0001i\u0014\u0000e\u0014.e\u0007:g\u000E0g&;g:?e:\u0014g\u0014(e\u0008\u0017h!(d8\re\u0010\u000Cg<\u0016h>\u0011g;\u001Fh.!f\u001F%h/\"d8\rh&\u0001f\u001C\te\u00053f\u001C:f\u001E\u0004e>\u0008e$\u001Af\u0012-f\u0014>g;\u0004g;\u0007f\u0014?g-\u0016g\u001B4f\u000E%h\u0003=e\n\u001Bf\u001D%f:\u0010f\u0019\u0002i\u0016\u0013g\u001C\u000Be\u00080g\u0003-i\u0017(e\u00053i\u0014.d8\u0013e\u000C:i\u001D\u001Ee88h\u000B1h/-g\u0019>e:&e8\u000Cf\u001C\u001Bg>\u000Ee%3f/\u0014h>\u0003g\u001F%h/\u0006h'\u0004e.\u001Ae;:h..i\u0003(i\u0017(f\u0004\u000Fh'\u0001g2>e=)f\u0017%f\u001C,f\u000F\u0010i+\u0018e\u000F\u0011h(\u0000f\u00169i\u001D\"e\u001F:i\u0007\u0011e$\u0004g\u0010\u0006f\u001D\u0003i\u0019\u0010e=1g\t\u0007i\u00136h!\u000Ch?\u0018f\u001C\te\u0008\u0006d:+g\t)e\u0013\u0001g;\u000Fh\u0010%f7;e\n d8\u0013e.6h?\u0019g'\rh/\u001Di\"\u0018h57f\u001D%d8\u001Ae\n!e\u0005,e\u0011\nh.0e=\u0015g.\u0000d;\u000Bh4(i\u0007\u000Fg\u00147d::e=1e\u0013\re<\u0015g\u0014(f\n%e\u0011\ni\u0003(e\u0008\u0006e?+i\u0000\u001Fe\u0012(h/\"f\u00176e0\u001Af3(f\u0004\u000Fg\u00143h/7e-&f !e:\u0014h/%e\u000E\u0006e\u000F2e\u000F*f\u0018/h?\u0014e\u001B\u001Eh4-d90e\u0010\rg'0d8:d:\u0006f\u0008\u0010e\n\u001Fh/4f\u0018\u000Ed>\u001Be:\u0014e-)e-\u0010d8\u0013i\"\u0018g(\u000Be:\u000Fd8\u0000h\u0008,f\u001C\u0003e\u0013!e\u000F*f\u001C\te\u00056e.\u0003d?\u001Df\n$h\u0000\u000Cd8\u0014d;\ne$)g*\u0017e\u000F#e\n(f\u0000\u0001g\n6f\u0000\u0001g\t9e\u0008+h.$d8:e?\u0005i!;f\u001B4f\u00160e0\u000Fh/4f\u0008\u0011e\u0000\u0011d=\u001Cd8:e*\u0012d=\u0013e\u000C\u0005f\u000B,i\u0002#d9\u0008d8\u0000f 7e\u001B=e\u0006\u0005f\u0018/e\u0010&f 9f\r.g\u00145h'\u0006e-&i\u0019\"e\u00057f\u001C\th?\u0007g(\u000Bg\u00141d:\u000Ed::f\t\re\u0007:f\u001D%d8\rh?\u0007f-#e\u001C(f\u0018\u000Ef\u0018\u001Ff\u0015\u0005d:\u000Be\u00053g3;f \u0007i\"\u0018e\u0015\u0006e\n!h>\u0013e\u0005%d8\u0000g\u001B4e\u001F:g!\u0000f\u0015\u0019e-&d:\u0006h'#e;:g-\u0011g;\u0013f\u001E\u001Ce\u0005(g\u0010\u0003i\u0000\u001Ag\u001F%h.!e\u0008\u0012e/9d:\u000Eh\t:f\u001C/g\u001B8e\u0006\u000Ce\u000F\u0011g\u0014\u001Fg\u001C\u001Fg\u001A\u0004e;:g+\u000Bg-\tg:'g1;e\u001E\u000Bg;\u000Fi*\u000Ce.\u001Eg\u000E0e\u00086d=\u001Cf\u001D%h\u0007*f \u0007g->d;%d8\u000Be\u000E\u001Fe\u0008\u001Bf\u0017 f3\u0015e\u00056d8-e\u0000\u000Bd::d8\u0000e\u0008\u0007f\u000C\u0007e\r\u0017e\u00053i\u0017-i\u001B\u0006e\u001B\"g,,d8\te\u00053f3(e\u001B f-$g\u0005'g\t\u0007f71e\u001C3e\u0015\u0006d8\u001Ae9?e7\u001Ef\u0017%f\u001C\u001Fi+\u0018g:'f\u001C\u0000h?\u0011g;\u0011h!\u000Cd8:d:$i\u0000\u001Ah/\u0004d;7h'\te>\u0017g2>e\r\u000Ee.6e:-e.\u000Cf\u0008\u0010f\u0004\u001Fh'\te.\th#\u0005e>\u0017e\u00080i\u0002.d;6e\u00086e:&i#\u001Fe\u0013\u0001h\u0019=g\u00046h=,h==f\n%d;7h.0h\u0000\u0005f\u00169f!\u0008h!\u000Cf\u0014?d::f0\u0011g\u0014(e\u0013\u0001d8\u001Ch%?f\u000F\u0010e\u0007:i\u0005\u0012e:\u0017g\u00046e\u0010\u000Ed;\u0018f,>g\u0003-g\u00029d;%e\t\re.\u000Ce\u0005(e\u000F\u0011e8\u0016h.>g=.i\"\u0006e/g%\u001Eh\u000E7e>\u0017e\u0008)g\u0014(g;'g;-d= d;,h?\u0019d9\u0008f(!e<\u000Fh/-h(\u0000h\u0003=e$\u001Fi\u001B\u0005h\u0019\u000Ef\u0013\rd=\u001Ci#\u000Ef d9&f\u001C\tf\u0015\u0008f5\u000Bh/\u0015g';e\n(f\t\rh\u0003=e\u00063e.\u001Ah\u0002!g%(d8\rf\u0016-i\u001C\u0000f1\u0002d8\re>\u0017e\n\u001Ef3\u0015d9\u000Bi\u00174i\u0007\u0007g\u0014(h\u0010%i\u0014\u0000f\n\u0015h/\tg\u001B.f \u0007g\u00081f\u0003\u0005f\u0011\u0004e=1f\u001C\td:\u001Bh$\u0007h#=f\u0016\u0007e-&f\u001C:d<\u001Af\u00150e-\u0017h#\u0005d?.h4-g\t)e\u0006\u001Cf\u001D\u0011e\u0005(i\u001D\"g2>e\u0013\u0001e\u00056e.\u001Ed:\u000Bf\u0003\u0005f04e93f\u000F\u0010g$:d8\ne8\u0002h0\"h0\"f\u0019.i\u0000\u001Af\u0015\u0019e8\u0008d8\nd< g1;e\u0008+f-\u000Cf\u001B2f\u000B%f\u001C\te\u0008\u001Bf\u00160i\u0005\rd;6e\u000F*h&\u0001f\u00176d;#h3\u0007h(\nh>>e\u00080d::g\u0014\u001Fh.\"i\u0018\u0005h\u0000\u0001e8\u0008e1\u0015g$:e?\u0003g\u0010\u0006h44e-\u0010g62g+\u0019d8;i!\u000Ch\u0007*g\u00046g:'e\u0008+g.\u0000e\r\u0015f\u00149i\u001D)i\u0002#d:\u001Bf\u001D%h/4f\t\u0013e<\u0000d;#g \u0001e\u0008 i\u0019$h/\u0001e\u00088h\n\u0002g\u001B.i\u0007\rg\u00029f,!f\u00158e$\u001Ae0\u0011h'\u0004e\u0008\u0012h5\u0004i\u0007\u0011f\t>e\u00080d;%e\u0010\u000Ee$'e\u0005(d8;i!5f\u001C\u0000d=3e\u001B\u001Eg-\u0014e$)d8\u000Bd?\u001Di\u001A\u001Cg\u000E0d;#f#\u0000f\u001F%f\n\u0015g%(e0\u000Ff\u00176f2\u0012f\u001C\tf-#e88g\u0014\u001Ah\u00073d;#g\u0010\u0006g\u001B.e=\u0015e\u0005,e<\u0000e$\re\u00086i\u0007\u0011h\u001E\re98g&\u000Fg\t\u0008f\u001C,e=\"f\u0008\u0010e\u0007\u0006e$\u0007h!\u000Cf\u0003\u0005e\u001B\u001Ee\u00080f\u0000\u001Df\u00033f\u0000\u000Ef 7e\r\u000Fh..h.$h/\u0001f\u001C\u0000e%=d:'g\u0014\u001Ff\u000C\tg\u0005'f\u001C\rh#\u0005e9?d8\u001Ce\n(f<+i\u0007\u0007h4-f\u00160f\t\u000Bg;\u0004e\u001B>i\u001D\"f\u001D?e\u000F\u0002h\u0000\u0003f\u0014?f2;e.9f\u0018\u0013e$)e\u001C0e\n*e\n\u001Bd::d;,e\r\u0007g:'i\u0000\u001Fe:&d::g\t)h0\u0003f\u00154f5\u0001h!\u000Ci\u0000 f\u0008\u0010f\u0016\u0007e-\u0017i\u001F)e\u001B=h48f\u0018\u0013e<\u0000e1\u0015g\u001B8i\u0017\u001Ch!(g\u000E0e=1h'\u0006e&\u0002f-$g>\u000Ee.9e$'e0\u000Ff\n%i\u0001\u0013f\u001D!f,>e?\u0003f\u0003\u0005h.8e$\u001Af3\u0015h'\u0004e.6e1\u0005d9&e:\u0017h?\u001Ef\u000E%g+\u000Be\r3d8>f\n%f\n\u0000e7'e%%h?\u0010g\u0019;e\u0005%d;%f\u001D%g\u0010\u0006h.:d:\u000Bd;6h\u0007*g\u00141d8-e\r\u000Ee\n\u001Ee\u0005,e&\u0008e&\u0008g\u001C\u001Ff-#d8\ri\u0014\u0019e\u0005(f\u0016\u0007e\u0010\u0008e\u0010\u000Cd;7e\u0000e7&e\u000F3h\u0002!d;=g-\u0014f!\u0008e.\u001Ei\u0019\u0005g\u00145d?!g;\u000Fg\u0010\u0006g\u0014\u001Fe\u0011=e.#d< d;;e\n!f-#e<\u000Fg\t9h\t2d8\u000Bf\u001D%e\r\u000Fd<\u001Ae\u000F*h\u0003=e=\u0013g\u00046i\u0007\rf\u00160e\u0005'e.9f\u000C\u0007e/g(\u000Be\u000C;g\u0016\u0017g;\u000Fh?\u0007h?\u0007e\u000E;d9\u000Be\t\rf\u00146e\u0005%e94e:&f\u001D\u0002e?\u0017g>\u000Ed8=f\u001C\u0000i+\u0018g\u0019;i\u0019\u0006f\u001C*f\u001D%e\n e7%e\u0005\rh4#f\u0015\u0019g(\u000Bg\t\u0008e\u001D\u0017h:+d=\u0013i\u0007\re:\u0006e\u0007:e\u0014.f\u0008\u0010f\u001C,e=\"e<\u000Fe\u001C\u001Fh1\u0006e\u0007:e\u00039d8\u001Cf\u00169i\u0002.g.1e\r\u0017d:,f1\u0002h\u0001\u000Ce\u000F\u0016e>\u0017h\u0001\u000Cd=\rg\u001B8d?!i!5i\u001D\"e\u0008\u0006i\u0012\u001Fg=\u0011i!5g!.e.\u001Ae\u001B>d>\u000Bg=\u0011e\u001D\u0000g'/f\u001E\u0001i\u0014\u0019h//g\u001B.g\u001A\u0004e.\u001Dh4\u001Df\u001C:e\u00053i#\u000Ei\u0019)f\u000E\u0008f\u001D\u0003g\u0017\u0005f/\u0012e. g\t)i\u0019$d:\u0006h)\u0015h+\u0016g\u0016>g\u0017\u0005e\u000F\nf\u00176f1\u0002h4-g+\u0019g\u00029e\u0004?g+%f/\u000Fe$)d8-e$.h.$h/\u0006f/\u000Fd8*e$)f4%e-\u0017d=\u0013e\u000F0g\u0001#g;4f\n$f\u001C,i!5d8*f\u0000'e.\u0018f\u00169e88h'\u0001g\u001B8f\u001C:f\u0008\u0018g\u0015%e:\u0014e=\u0013e>\u000Be8\u0008f\u00169d>?f !e\u001B-h\u0002!e8\u0002f\u0008?e1\u000Bf \u000Fg\u001B.e\u0011\u0018e7%e/\u000Ee\u0005\u0003e<\u0015h57f\u00149e\u000F\u0018g,,e\u001B\u001Bd<\u001Ah.!h**f\u0018\u000Ei\u001A\u0010g'\u0001e.\u001De.\u001Dh'\u0004h\u000C\u0003f6\u0008h49e\u00051e\u0010\u000Ce?\u0018h.0d=\u0013g3;e8&f\u001D%e\u0010\re-\u0017g\u0019e\n g\u001B\u001Fe\u000F\u0017e\u00080d:\u000Cf\t\u000Be$'i\u0007\u000Ff\u0008\u0010d::f\u00150i\u0007\u000Fe\u00051d:+e\u000C:e\u001F\u001Fe%3e-)e\u000E\u001Fe\u0008\u0019f\t\u0000e\u001C(g;\u0013f\u001D\u001Fi\u0000\u001Ad?!h6\u0005g:'i\u0005\rg=.e=\u0013f\u00176d<\u0018g'\u0000f\u0000'f\u0004\u001Ff\u0008?d:'i\u0001\nf\u00082e\u0007:e\u000F#f\u000F\u0010d:$e01d8\u001Ad?\u001De\u0001%g(\u000Be:&e\u000F\u0002f\u00150d:\u000Bd8\u001Af\u00154d8*e11d8\u001Cf\u0003\u0005f\u0004\u001Fg\t9f.\ne\u0008\u0006i!\u001Ef\u0010\u001Ce0\u000Be1\u001Ed:\u000Ei\u0017(f\u00087h4\"e\n!e#0i\u001F3e\u000F\ne\u00056h4\"g;\u000Fe\u001D\u001Af\u000C\u0001e92i\u0003(f\u0008\u0010g+\u000Be\u0008)g\u001B\nh\u0000\u0003h\u0019\u0011f\u0008\u0010i\u0003=e\u000C\u0005h#\u0005g\u0014(f\u00086f/\u0014h5\u001Bf\u0016\u0007f\u0018\u000Ef\u000B\u001Be\u0015\u0006e.\u000Cf\u00154g\u001C\u001Ff\u0018/g\u001Ce/\u0006g\"\u000Ei#\u001Fg;?h\t2g(3e.\u001Ag;\u0008d:\u000Eg\u0014\u001Fg\t)d>\u001Bf1\u0002f\u0010\u001Cg\u000B\u0010e\n\u001Bi\u0007\u000Fd8%i\u0007\rf08h?\u001Ce\u0006\u0019g\u001C\u001Ff\u001C\ti\u0019\u0010g+\u001Ed:\te/9h1!h49g\u0014(d8\re%=g;\u001De/9e\r\u0001e\u0008\u0006d?\u0003h?\u001Bg\u00029h/\u0004e=1i\u001F3d<\u0018e\n?d8\re0\u0011f,#h5\u000Fe96d8\u0014f\u001C\tg\u00029f\u00169e\u0010\u0011e\u0005(f\u00160d?!g\u0014(h.>f\u0016=e=\"h1!h5\u0004f \u000Ee\u0015\u0006e\u001F\u000Eg;\u001Fd8\u0000e\u0007:g\t\u0008f\t\u0013i\u0000 g\u0014\"e\u0013\u0001f&\u0002e\u00065g\u0014(d:\u000Ed?\u001Dg\u0015\u0019e\u001B g4 d8-e\u001C\u000Be-\u0018e\u0002(h44e\u001B>f\u001C\u0000f\u0004\u001Bi\u0015?f\u001C\u001Fe\u000F#d;7g\u0010\u0006h4\"e\u001F:e\u001C0e.\tf\u000E\u0012f-&f1\ti\u0007\u000Ci\u001D\"e\u0008\u001Be;:e$)g):i&\u0016e\u0005\u0008e.\u000Ce\u0016\u0004i)1e\n(d8\u000Bi\u001D\"d8\re\u0006\rh/\u001Ad?!f\u0004\u000Fd9\ti\u00183e\u0005\th\u000B1e\u001B=f<\u0002d:.e\u0006\u001Bd:\u000Bg\u000E)e.6g>$d<\u0017e\u0006\u001Cf0\u0011e\r3e\u000F/e\u0010\rg(1e.6e\u00057e\n(g\u0014;f\u00033e\u00080f3(f\u0018\u000Ee0\u000Fe-&f\u0000'h\u0003=h\u0000\u0003g \u0014g!,d;6h'\u0002g\u001C\u000Bf8\u0005f%\u001Af\u0010\u001Eg,\u0011i&\u0016i \u0001i;\u0004i\u0007\u0011i\u0000\u0002g\u0014(f1\u001Fh\u000B\u000Fg\u001C\u001Fe.\u001Ed8;g.!i\u00186f.5h(;e\u0006\ng?;h/\u0011f\u001D\u0003e\u0008)e\u0001\u001Ae%=d<P:P0P:P8P;P8Q\rQ\u0002P>P2Q\u0001P5P5P3P>P?Q\u0000P8Q\u0002P0P:P5Q\tP5Q\u0003P6P5P\u001AP0P:P1P5P7P1Q\u000BP;P>P=P8P\u0012Q\u0001P5P?P>P4P-Q\u0002P>Q\u0002P>PP=P0P3P4P5PP3P>P4P2P>Q\u0002Q\u0002P0PP2P0Q\u0001P2P0PQ\u0002Q\u0003Q\u0002P=P0P4P4P=Q\u000FP\u0012P>Q\u0002Q\u0002Q\u0000P8P=P5P9P\u0012P0Q\u0001P=P8PQ\u0002Q\u0000Q\u0003P1P\u001EP=P8PPP9P4P2P5P>P=P>Q\u0001Q\u0003P4`$\u0015`%\u0007`$9`%\u0008`$\u0015`%\u0000`$8`%\u0007`$\u0015`$>`$\u0015`%\u000B`$\u0014`$0`$*`$0`$(`%\u0007`$\u000F`$\u0015`$\u0015`$?`$-`%\u0000`$\u0007`$8`$\u0015`$0`$$`%\u000B`$9`%\u000B`$\u0006`$*`$9`%\u0000`$/`$9`$/`$>`$$`$\u0015`$%`$>jagran`$\u0006`$\u001C`$\u001C`%\u000B`$\u0005`$,`$&`%\u000B`$\u0017`$\u0008`$\u001C`$>`$\u0017`$\u000F`$9`$.`$\u0007`$(`$5`$9`$/`%\u0007`$%`%\u0007`$%`%\u0000`$\u0018`$0`$\u001C`$,`$&`%\u0000`$\u0015`$\u0008`$\u001C`%\u0000`$5`%\u0007`$(`$\u0008`$(`$\u000F`$9`$0`$\t`$8`$.`%\u0007`$\u0015`$.`$5`%\u000B`$2`%\u0007`$8`$,`$.`$\u0008`$&`%\u0007`$\u0013`$0`$\u0006`$.`$,`$8`$-`$0`$,`$(`$\u001A`$2`$.`$(`$\u0006`$\u0017`$8`%\u0000`$2`%\u0000X9Y\u0004Y\tX%Y\u0004Y\tY\u0007X0X'X\"X.X1X9X/X/X'Y\u0004Y\tY\u0007X0Y\u0007X5Y\u0008X1X:Y\nX1Y\u0003X'Y\u0006Y\u0008Y\u0004X'X(Y\nY\u0006X9X1X6X0Y\u0004Y\u0003Y\u0007Y\u0006X'Y\nY\u0008Y\u0005Y\u0002X'Y\u0004X9Y\u0004Y\nX'Y\u0006X'Y\u0004Y\u0003Y\u0006X-X*Y\tY\u0002X(Y\u0004Y\u0008X-X)X'X.X1Y\u0001Y\u0002X7X9X(X/X1Y\u0003Y\u0006X%X0X'Y\u0003Y\u0005X'X'X-X/X%Y\u0004X'Y\u0001Y\nY\u0007X(X9X6Y\u0003Y\nY\u0001X(X-X+Y\u0008Y\u0005Y\u0006Y\u0008Y\u0007Y\u0008X#Y\u0006X'X,X/X'Y\u0004Y\u0007X'X3Y\u0004Y\u0005X9Y\u0006X/Y\u0004Y\nX3X9X(X1X5Y\u0004Y\tY\u0005Y\u0006X0X(Y\u0007X'X#Y\u0006Y\u0007Y\u0005X+Y\u0004Y\u0003Y\u0006X*X'Y\u0004X'X-Y\nX+Y\u0005X5X1X4X1X-X-Y\u0008Y\u0004Y\u0008Y\u0001Y\nX'X0X'Y\u0004Y\u0003Y\u0004Y\u0005X1X)X'Y\u0006X*X'Y\u0004Y\u0001X#X(Y\u0008X.X'X5X#Y\u0006X*X'Y\u0006Y\u0007X'Y\u0004Y\nX9X6Y\u0008Y\u0008Y\u0002X/X'X(Y\u0006X.Y\nX1X(Y\u0006X*Y\u0004Y\u0003Y\u0005X4X'X!Y\u0008Y\u0007Y\nX'X(Y\u0008Y\u0002X5X5Y\u0008Y\u0005X'X1Y\u0002Y\u0005X#X-X/Y\u0006X-Y\u0006X9X/Y\u0005X1X#Y\nX'X-X)Y\u0003X*X(X/Y\u0008Y\u0006Y\nX,X(Y\u0005Y\u0006Y\u0007X*X-X*X,Y\u0007X)X3Y\u0006X)Y\nX*Y\u0005Y\u0003X1X)X:X2X)Y\u0006Y\u0001X3X(Y\nX*Y\u0004Y\u0004Y\u0007Y\u0004Y\u0006X'X*Y\u0004Y\u0003Y\u0002Y\u0004X(Y\u0004Y\u0005X'X9Y\u0006Y\u0007X#Y\u0008Y\u0004X4Y\nX!Y\u0006Y\u0008X1X#Y\u0005X'Y\u0001Y\nY\u0003X(Y\u0003Y\u0004X0X'X*X1X*X(X(X#Y\u0006Y\u0007Y\u0005X3X'Y\u0006Y\u0003X(Y\nX9Y\u0001Y\u0002X/X-X3Y\u0006Y\u0004Y\u0007Y\u0005X4X9X1X#Y\u0007Y\u0004X4Y\u0007X1Y\u0002X7X1X7Y\u0004X(profileservicedefaulthimselfdetailscontentsupportstartedmessagesuccessfashioncountryaccountcreatedstoriesresultsrunningprocesswritingobjectsvisiblewelcomearticleunknownnetworkcompanydynamicbrowserprivacyproblemServicerespectdisplayrequestreservewebsitehistoryfriendsoptionsworkingversionmillionchannelwindow.addressvisitedweathercorrectproductedirectforwardyou canremovedsubjectcontrolarchivecurrentreadinglibrarylimitedmanagerfurthersummarymachineminutesprivatecontextprogramsocietynumberswrittenenabledtriggersourcesloadingelementpartnerfinallyperfectmeaningsystemskeepingculture",journalprojectsurfaces"expiresreviewsbalanceEnglishContentthroughPlease opinioncontactaverageprimaryvillageSpanishgallerydeclinemeetingmissionpopularqualitymeasuregeneralspeciessessionsectionwriterscounterinitialreportsfiguresmembersholdingdisputeearlierexpressdigitalpictureAnothermarriedtrafficleadingchangedcentralvictoryimages/reasonsstudiesfeaturelistingmust beschoolsVersionusuallyepisodeplayinggrowingobviousoverlaypresentactions</ul>\r\nwrapperalreadycertainrealitystorageanotherdesktopofferedpatternunusualDigitalcapitalWebsitefailureconnectreducedAndroiddecadesregular & animalsreleaseAutomatgettingmethodsnothingPopularcaptionletterscapturesciencelicensechangesEngland=1&History = new CentralupdatedSpecialNetworkrequirecommentwarningCollegetoolbarremainsbecauseelectedDeutschfinanceworkersquicklybetweenexactlysettingdiseaseSocietyweaponsexhibit<!--Controlclassescoveredoutlineattacksdevices(windowpurposetitle=\"Mobile killingshowingItaliandroppedheavilyeffects-1']);\nconfirmCurrentadvancesharingopeningdrawingbillionorderedGermanyrelated</form>includewhetherdefinedSciencecatalogArticlebuttonslargestuniformjourneysidebarChicagoholidayGeneralpassage,"animatefeelingarrivedpassingnaturalroughly.\n\nThe but notdensityBritainChineselack oftributeIreland\" data-factorsreceivethat isLibraryhusbandin factaffairsCharlesradicalbroughtfindinglanding:lang=\"return leadersplannedpremiumpackageAmericaEdition]"Messageneed tovalue=\"complexlookingstationbelievesmaller-mobilerecordswant tokind ofFirefoxyou aresimilarstudiedmaximumheadingrapidlyclimatekingdomemergedamountsfoundedpioneerformuladynastyhow to SupportrevenueeconomyResultsbrothersoldierlargelycalling."AccountEdward segmentRobert effortsPacificlearnedup withheight:we haveAngelesnations_searchappliedacquiremassivegranted: falsetreatedbiggestbenefitdrivingStudiesminimumperhapsmorningsellingis usedreversevariant role=\"missingachievepromotestudentsomeoneextremerestorebottom:evolvedall thesitemapenglishway to AugustsymbolsCompanymattersmusicalagainstserving})();\r\npaymenttroubleconceptcompareparentsplayersregionsmonitor ''The winningexploreadaptedGalleryproduceabilityenhancecareers). The collectSearch ancientexistedfooter handlerprintedconsoleEasternexportswindowsChannelillegalneutralsuggest_headersigning.html\">settledwesterncausing-webkitclaimedJusticechaptervictimsThomas mozillapromisepartieseditionoutside:false,hundredOlympic_buttonauthorsreachedchronicdemandssecondsprotectadoptedprepareneithergreatlygreateroverallimprovecommandspecialsearch.worshipfundingthoughthighestinsteadutilityquarterCulturetestingclearlyexposedBrowserliberal} catchProjectexamplehide();FloridaanswersallowedEmperordefenseseriousfreedomSeveral-buttonFurtherout of != nulltrainedDenmarkvoid(0)/all.jspreventRequestStephen\n\nWhen observe</h2>\r\nModern provide\" alt=\"borders.\n\nFor \n\nMany artistspoweredperformfictiontype ofmedicalticketsopposedCouncilwitnessjusticeGeorge Belgium...</a>twitternotablywaitingwarfare Other rankingphrasesmentionsurvivescholar</p>\r\n Countryignoredloss ofjust asGeorgiastrange<head><stopped1']);\r\nislandsnotableborder:list ofcarried100,000</h3>\n severalbecomesselect wedding00.htmlmonarchoff theteacherhighly biologylife ofor evenrise of»plusonehunting(thoughDouglasjoiningcirclesFor theAncientVietnamvehiclesuch ascrystalvalue =Windowsenjoyeda smallassumed<a id=\"foreign All rihow theDisplayretiredhoweverhidden;battlesseekingcabinetwas notlook atconductget theJanuaryhappensturninga:hoverOnline French lackingtypicalextractenemieseven ifgeneratdecidedare not/searchbeliefs-image:locatedstatic.login\">convertviolententeredfirst\">circuitFinlandchemistshe was10px;\">as suchdivided</span>will beline ofa greatmystery/index.fallingdue to railwaycollegemonsterdescentit withnuclearJewish protestBritishflowerspredictreformsbutton who waslectureinstantsuicidegenericperiodsmarketsSocial fishingcombinegraphicwinners<br /><by the NaturalPrivacycookiesoutcomeresolveSwedishbrieflyPersianso muchCenturydepictscolumnshousingscriptsnext tobearingmappingrevisedjQuery(-width:title\">tooltipSectiondesignsTurkishyounger.match(})();\n\nburningoperatedegreessource=Richardcloselyplasticentries</tr>\r\ncolor:#ul id=\"possessrollingphysicsfailingexecutecontestlink toDefault<br />\n: true,chartertourismclassicproceedexplain</h1>\r\nonline.?xml vehelpingdiamonduse theairlineend -->).attr(readershosting#ffffffrealizeVincentsignals src=\"/ProductdespitediversetellingPublic held inJoseph theatreaffects<style>a largedoesn'tlater, ElementfaviconcreatorHungaryAirportsee theso thatMichaelSystemsPrograms, and width=e"tradingleft\">\npersonsGolden Affairsgrammarformingdestroyidea ofcase ofoldest this is.src = cartoonregistrCommonsMuslimsWhat isin manymarkingrevealsIndeed,equally/show_aoutdoorescape(Austriageneticsystem,In the sittingHe alsoIslandsAcademy\n\t\t<!--Daniel bindingblock\">imposedutilizeAbraham(except{width:putting).html(|| [];\nDATA[ *kitchenmountedactual dialectmainly _blank'installexpertsif(typeIt also© \">Termsborn inOptionseasterntalkingconcerngained ongoingjustifycriticsfactoryits ownassaultinvitedlastinghis ownhref=\"/\" rel=\"developconcertdiagramdollarsclusterphp?id=alcohol);})();using a><span>vesselsrevivalAddressamateurandroidallegedillnesswalkingcentersqualifymatchesunifiedextinctDefensedied in\n\t<!-- customslinkingLittle Book ofeveningmin.js?are thekontakttoday's.html\" target=wearingAll Rig;\n})();raising Also, crucialabout\">declare-->\n<scfirefoxas muchappliesindex, s, but type = \n\r\n<!--towardsRecordsPrivateForeignPremierchoicesVirtualreturnsCommentPoweredinline;povertychamberLiving volumesAnthonylogin\" RelatedEconomyreachescuttinggravitylife inChapter-shadowNotable</td>\r\n returnstadiumwidgetsvaryingtravelsheld bywho arework infacultyangularwho hadairporttown of\n\nSome 'click'chargeskeywordit willcity of(this);Andrew unique checkedor more300px; return;rsion=\"pluginswithin herselfStationFederalventurepublishsent totensionactresscome tofingersDuke ofpeople,exploitwhat isharmonya major\":\"httpin his menu\">\nmonthlyofficercouncilgainingeven inSummarydate ofloyaltyfitnessand wasemperorsupremeSecond hearingRussianlongestAlbertalateralset of small\">.appenddo withfederalbank ofbeneathDespiteCapitalgrounds), and percentit fromclosingcontainInsteadfifteenas well.yahoo.respondfighterobscurereflectorganic= Math.editingonline paddinga wholeonerroryear ofend of barrierwhen itheader home ofresumedrenamedstrong>heatingretainscloudfrway of March 1knowingin partBetweenlessonsclosestvirtuallinks\">crossedEND -->famous awardedLicenseHealth fairly wealthyminimalAfricancompetelabel\">singingfarmersBrasil)discussreplaceGregoryfont copursuedappearsmake uproundedboth ofblockedsaw theofficescoloursif(docuwhen heenforcepush(fuAugust UTF-8\">Fantasyin mostinjuredUsuallyfarmingclosureobject defenceuse of Medical<body>\nevidentbe usedkeyCodesixteenIslamic#000000entire widely active (typeofone cancolor =speakerextendsPhysicsterrain<tbody>funeralviewingmiddle cricketprophetshifteddoctorsRussell targetcompactalgebrasocial-bulk ofman and</td>\n he left).val()false);logicalbankinghome tonaming Arizonacredits);\n});\nfounderin turnCollinsbefore But thechargedTitle\">CaptainspelledgoddessTag -->Adding:but wasRecent patientback in=false&Lincolnwe knowCounterJudaismscript altered']);\n has theunclearEvent',both innot all\n\n<!-- placinghard to centersort ofclientsstreetsBernardassertstend tofantasydown inharbourFreedomjewelry/about..searchlegendsis mademodern only ononly toimage\" linear painterand notrarely acronymdelivershorter00&as manywidth=\"/* <![Ctitle =of the lowest picked escapeduses ofpeoples PublicMatthewtacticsdamagedway forlaws ofeasy to windowstrong simple}catch(seventhinfoboxwent topaintedcitizenI don'tretreat. Some ww.\");\nbombingmailto:made in. Many carries||{};wiwork ofsynonymdefeatsfavoredopticalpageTraunless sendingleft\"><comScorAll thejQuery.touristClassicfalse\" Wilhelmsuburbsgenuinebishops.split(global followsbody ofnominalContactsecularleft tochiefly-hidden-banner</li>\n\n. When in bothdismissExplorealways via thespaC1olwelfareruling arrangecaptainhis sonrule ofhe tookitself,=0&(calledsamplesto makecom/pagMartin Kennedyacceptsfull ofhandledBesides//--></able totargetsessencehim to its by common.mineralto takeways tos.org/ladvisedpenaltysimple:if theyLettersa shortHerbertstrikes groups.lengthflightsoverlapslowly lesser social </p>\n\t\tit intoranked rate oful>\r\n attemptpair ofmake itKontaktAntoniohaving ratings activestreamstrapped\").css(hostilelead tolittle groups,Picture-->\r\n\r\n rows=\" objectinverse<footerCustomV><\\/scrsolvingChamberslaverywoundedwhereas!= 'undfor allpartly -right:Arabianbacked centuryunit ofmobile-Europe,is homerisk ofdesiredClintoncost ofage of become none ofp"Middle ead')[0Criticsstudios>©group\">assemblmaking pressedwidget.ps:\" ? rebuiltby someFormer editorsdelayedCanonichad thepushingclass=\"but arepartialBabylonbottom carrierCommandits useAs withcoursesa thirddenotesalso inHouston20px;\">accuseddouble goal ofFamous ).bind(priests Onlinein Julyst + \"gconsultdecimalhelpfulrevivedis veryr'+'iptlosing femalesis alsostringsdays ofarrivalfuture <objectforcingString(\" />\n\t\there isencoded. The balloondone by/commonbgcolorlaw of Indianaavoidedbut the2px 3pxjquery.after apolicy.men andfooter-= true;for usescreen.Indian image =family,http://  driverseternalsame asnoticedviewers})();\n is moreseasonsformer the newis justconsent Searchwas thewhy theshippedbr><br>width: height=made ofcuisineis thata very Admiral fixed;normal MissionPress, ontariocharsettry to invaded=\"true\"spacingis mosta more totallyfall of});\r\n immensetime inset outsatisfyto finddown tolot of Playersin Junequantumnot thetime todistantFinnishsrc = (single help ofGerman law andlabeledforestscookingspace\">header-well asStanleybridges/globalCroatia About [0];\n it, andgroupedbeing a){throwhe madelighterethicalFFFFFF\"bottom\"like a employslive inas seenprintermost ofub-linkrejectsand useimage\">succeedfeedingNuclearinformato helpWomen'sNeitherMexicanprotein<table by manyhealthylawsuitdevised.push({sellerssimply Through.cookie Image(older\">us.js\"> Since universlarger open to!-- endlies in']);\r\n marketwho is (\"DOMComanagedone fortypeof Kingdomprofitsproposeto showcenter;made itdressedwere inmixtureprecisearisingsrc = 'make a securedBaptistvoting \n\t\tvar March 2grew upClimate.removeskilledway the</head>face ofacting right\">to workreduceshas haderectedshow();action=book ofan area== \"htt<header\n<html>conformfacing cookie.rely onhosted .customhe wentbut forspread Family a meansout theforums.footage\">MobilClements\" id=\"as highintense--><!--female is seenimpliedset thea stateand hisfastestbesidesbutton_bounded\"><img Infoboxevents,a youngand areNative cheaperTimeoutand hasengineswon the(mostlyright: find a -bottomPrince area ofmore ofsearch_nature,legallyperiod,land ofor withinducedprovingmissilelocallyAgainstthe wayk"px;\">\r\npushed abandonnumeralCertainIn thismore inor somename isand, incrownedISBN 0-createsOctobermay notcenter late inDefenceenactedwish tobroadlycoolingonload=it. TherecoverMembersheight assumes<html>\npeople.in one =windowfooter_a good reklamaothers,to this_cookiepanel\">London,definescrushedbaptismcoastalstatus title\" move tolost inbetter impliesrivalryservers SystemPerhapses and contendflowinglasted rise inGenesisview ofrising seem tobut in backinghe willgiven agiving cities.flow of Later all butHighwayonly bysign ofhe doesdiffersbattery&lasinglesthreatsintegertake onrefusedcalled =US&See thenativesby thissystem.head of:hover,lesbiansurnameand allcommon/header__paramsHarvard/pixel.removalso longrole ofjointlyskyscraUnicodebr />\r\nAtlantanucleusCounty,purely count\">easily build aonclicka givenpointerh"events else {\nditionsnow the, with man whoorg/Webone andcavalryHe diedseattle00,000 {windowhave toif(windand itssolely m"renewedDetroitamongsteither them inSenatorUs</a><King ofFrancis-produche usedart andhim andused byscoringat hometo haverelatesibilityfactionBuffalolink\"><what hefree toCity ofcome insectorscountedone daynervoussquare };if(goin whatimg\" alis onlysearch/tuesdaylooselySolomonsexual - <a hrmedium\"DO NOT France,with a war andsecond take a >\r\n\r\n\r\nmarket.highwaydone inctivity\"last\">obligedrise to\"undefimade to Early praisedin its for hisathleteJupiterYahoo! termed so manyreally s. The a woman?value=direct right\" bicycleacing=\"day andstatingRather,higher Office are nowtimes, when a pay foron this-link\">;borderaround annual the Newput the.com\" takin toa brief(in thegroups.; widthenzymessimple in late{returntherapya pointbanninginks\">\n();\" rea place\\u003Caabout atr>\r\n\t\tccount gives a<SCRIPTRailwaythemes/toolboxById(\"xhumans,watchesin some if (wicoming formats Under but hashanded made bythan infear ofdenoted/iframeleft involtagein eacha"base ofIn manyundergoregimesaction </p>\r\n<ustomVa;></importsor thatmostly &re size=\"</a></ha classpassiveHost = WhetherfertileVarious=[];(fucameras/></td>acts asIn some>\r\n\r\n<!organis <br />BeijingcatalC deutscheuropeueuskaragaeilgesvenskaespaC1amensajeusuariotrabajomC)xicopC!ginasiempresistemaoctubreduranteaC1adirempresamomentonuestroprimeratravC)sgraciasnuestraprocesoestadoscalidadpersonanC:meroacuerdomC:sicamiembroofertasalgunospaC-sesejemploderechoademC!sprivadoagregarenlacesposiblehotelessevillaprimeroC:ltimoeventosarchivoculturamujeresentradaanuncioembargomercadograndesestudiomejoresfebrerodiseC1oturismocC3digoportadaespaciofamiliaantoniopermiteguardaralgunaspreciosalguiensentidovisitastC-tuloconocersegundoconsejofranciaminutossegundatenemosefectosmC!lagasesiC3nrevistagranadacompraringresogarcC-aacciC3necuadorquienesinclusodeberC!materiahombresmuestrapodrC-amaC1anaC:ltimaestamosoficialtambienningC:nsaludospodemosmejorarpositionbusinesshomepagesecuritylanguagestandardcampaignfeaturescategoryexternalchildrenreservedresearchexchangefavoritetemplatemilitaryindustryservicesmaterialproductsz-index:commentssoftwarecompletecalendarplatformarticlesrequiredmovementquestionbuildingpoliticspossiblereligionphysicalfeedbackregisterpicturesdisabledprotocolaudiencesettingsactivityelementslearninganythingabstractprogressoverviewmagazineeconomictrainingpressurevarious <strong>propertyshoppingtogetheradvancedbehaviordownloadfeaturedfootballselectedLanguagedistanceremembertrackingpasswordmodifiedstudentsdirectlyfightingnortherndatabasefestivalbreakinglocationinternetdropdownpracticeevidencefunctionmarriageresponseproblemsnegativeprogramsanalysisreleasedbanner\">purchasepoliciesregionalcreativeargumentbookmarkreferrerchemicaldivisioncallbackseparateprojectsconflicthardwareinterestdeliverymountainobtained= false;for(var acceptedcapacitycomputeridentityaircraftemployedproposeddomesticincludesprovidedhospitalverticalcollapseapproachpartnerslogo\"><adaughterauthor\" culturalfamilies/images/assemblypowerfulteachingfinisheddistrictcriticalcgi-bin/purposesrequireselectionbecomingprovidesacademicexerciseactuallymedicineconstantaccidentMagazinedocumentstartingbottom\">observed: "extendedpreviousSoftwarecustomerdecisionstrengthdetailedslightlyplanningtextareacurrencyeveryonestraighttransferpositiveproducedheritageshippingabsolutereceivedrelevantbutton\" violenceanywherebenefitslaunchedrecentlyalliancefollowedmultiplebulletinincludedoccurredinternal$(this).republic><tr><tdcongressrecordedultimatesolution<ul id=\"discoverHome</a>websitesnetworksalthoughentirelymemorialmessagescontinueactive\">somewhatvictoriaWestern title=\"LocationcontractvisitorsDownloadwithout right\">\nmeasureswidth = variableinvolvedvirginianormallyhappenedaccountsstandingnationalRegisterpreparedcontrolsaccuratebirthdaystrategyofficialgraphicscriminalpossiblyconsumerPersonalspeakingvalidateachieved.jpg\" />machines</h2>\n keywordsfriendlybrotherscombinedoriginalcomposedexpectedadequatepakistanfollow\" valuable</label>relativebringingincreasegovernorplugins/List of Header\">\" name=\" ("graduate</head>\ncommercemalaysiadirectormaintain;height:schedulechangingback to catholicpatternscolor: #greatestsuppliesreliable</ul>\n\t\t<select citizensclothingwatching<li id=\"specificcarryingsentence<center>contrastthinkingcatch(e)southernMichael merchantcarouselpadding:interior.split(\"lizationOctober ){returnimproved-->\n\ncoveragechairman.png\" />subjectsRichard whateverprobablyrecoverybaseballjudgmentconnect..css\" /> websitereporteddefault\"/></a>\r\nelectricscotlandcreationquantity. ISBN 0did not instance-search-\" lang=\"speakersComputercontainsarchivesministerreactiondiscountItalianocriteriastrongly: 'http:'script'coveringofferingappearedBritish identifyFacebooknumerousvehiclesconcernsAmericanhandlingdiv id=\"William provider_contentaccuracysection andersonflexibleCategorylawrence<script>layout=\"approved maximumheader\"></table>Serviceshamiltoncurrent canadianchannels/themes//articleoptionalportugalvalue=\"\"intervalwirelessentitledagenciesSearch\" measuredthousandspending…new Date\" size=\"pageNamemiddle\" \" /></a>hidden\">sequencepersonaloverflowopinionsillinoislinks\">\n\t<title>versionssaturdayterminalitempropengineersectionsdesignerproposal=\"false\"EspaC1olreleasessubmit\" er"additionsymptomsorientedresourceright\"><pleasurestationshistory.leaving border=contentscenter\">.\n\nSome directedsuitablebulgaria.show();designedGeneral conceptsExampleswilliamsOriginal\"><span>search\">operatorrequestsa "allowingDocumentrevision. \n\nThe yourselfContact michiganEnglish columbiapriorityprintingdrinkingfacilityreturnedContent officersRussian generate-8859-1\"indicatefamiliar qualitymargin:0 contentviewportcontacts-title\">portable.length eligibleinvolvesatlanticonload=\"default.suppliedpaymentsglossary\n\nAfter guidance</td><tdencodingmiddle\">came to displaysscottishjonathanmajoritywidgets.clinicalthailandteachers<head>\n\taffectedsupportspointer;toString</small>oklahomawill be investor0\" alt=\"holidaysResourcelicensed (which . After considervisitingexplorerprimary search\" android\"quickly meetingsestimate;return ;color:# height=approval, " checked.min.js\"magnetic></a></hforecast. While thursdaydvertiseéhasClassevaluateorderingexistingpatients Online coloradoOptions\"campbell<!-- end</span><<br />\r\n_popups|sciences," quality Windows assignedheight: <b classle" value=\" Companyexamples<iframe believespresentsmarshallpart of properly).\n\nThe taxonomymuch of </span>\n\" data-srtuguC*sscrollTo project<head>\r\nattorneyemphasissponsorsfancyboxworld's wildlifechecked=sessionsprogrammpx;font- Projectjournalsbelievedvacationthompsonlightingand the special border=0checking</tbody><button Completeclearfix\n<head>\narticle <sectionfindingsrole in popular Octoberwebsite exposureused to changesoperatedclickingenteringcommandsinformed numbers </div>creatingonSubmitmarylandcollegesanalyticlistingscontact.loggedInadvisorysiblingscontent\"s")s. This packagescheckboxsuggestspregnanttomorrowspacing=icon.pngjapanesecodebasebutton\">gamblingsuch as , while </span> missourisportingtop:1px .</span>tensionswidth=\"2lazyloadnovemberused in height=\"cript\">\n </<tr><td height:2/productcountry include footer\" <!-- title\"></jquery.</form>\n(g.\u0000d=\u0013)(g9\u0001i+\u0014)hrvatskiitalianoromC\"nD\u0003tC<rkC'eX'X1X/Y\u0008tambiC)nnoticiasmensajespersonasderechosnacionalserviciocontactousuariosprogramagobiernoempresasanunciosvalenciacolombiadespuC)sdeportesproyectoproductopC:bliconosotroshistoriapresentemillonesmediantepreguntaanteriorrecursosproblemasantiagonuestrosopiniC3nimprimirmientrasamC)ricavendedorsociedadrespectorealizarregistropalabrasinterC)sentoncesespecialmiembrosrealidadcC3rdobazaragozapC!ginassocialesbloqueargestiC3nalquilersistemascienciascompletoversiC3ncompletaestudiospC:blicaobjetivoalicantebuscadorcantidadentradasaccionesarchivossuperiormayorC-aalemaniafunciC3nC:ltimoshaciendoaquellosediciC3nfernandoambientefacebooknuestrasclientesprocesosbastantepresentareportarcongresopublicarcomerciocontratojC3venesdistritotC)cnicaconjuntoenergC-atrabajarasturiasrecienteutilizarboletC-nsalvadorcorrectatrabajosprimerosnegocioslibertaddetallespantallaprC3ximoalmerC-aanimalesquiC)nescorazC3nsecciC3nbuscandoopcionesexteriorconceptotodavC-agalerC-aescribirmedicinalicenciaconsultaaspectoscrC-ticadC3laresjusticiadeberC!nperC-odonecesitamantenerpequeC1orecibidatribunaltenerifecanciC3ncanariasdescargadiversosmallorcarequieretC)cnicodeberC-aviviendafinanzasadelantefuncionaconsejosdifC-cilciudadesantiguasavanzadatC)rminounidadessC!nchezcampaC1asoftonicrevistascontienesectoresmomentosfacultadcrC)ditodiversassupuestofactoressegundospequeC1aP3P>P4P0P5Q\u0001P;P8P5Q\u0001Q\u0002Q\u000CP1Q\u000BP;P>P1Q\u000BQ\u0002Q\u000CQ\rQ\u0002P>P<P\u0015Q\u0001P;P8Q\u0002P>P3P>P<P5P=Q\u000FP2Q\u0001P5Q\u0005Q\rQ\u0002P>P9P4P0P6P5P1Q\u000BP;P8P3P>P4Q\u0003P4P5P=Q\u000CQ\rQ\u0002P>Q\u0002P1Q\u000BP;P0Q\u0001P5P1Q\u000FP>P4P8P=Q\u0001P5P1P5P=P0P4P>Q\u0001P0P9Q\u0002Q\u0004P>Q\u0002P>P=P5P3P>Q\u0001P2P>P8Q\u0001P2P>P9P8P3Q\u0000Q\u000BQ\u0002P>P6P5P2Q\u0001P5P<Q\u0001P2P>Q\u000EP;P8Q\u0008Q\u000CQ\rQ\u0002P8Q\u0005P?P>P:P0P4P=P5P9P4P>P<P0P<P8Q\u0000P0P;P8P1P>Q\u0002P5P<Q\u0003Q\u0005P>Q\u0002Q\u000FP4P2Q\u0003Q\u0005Q\u0001P5Q\u0002P8P;Q\u000EP4P8P4P5P;P>P<P8Q\u0000P5Q\u0002P5P1Q\u000FQ\u0001P2P>P5P2P8P4P5Q\u0007P5P3P>Q\rQ\u0002P8P<Q\u0001Q\u0007P5Q\u0002Q\u0002P5P<Q\u000BQ\u0006P5P=Q\u000BQ\u0001Q\u0002P0P;P2P5P4Q\u000CQ\u0002P5P<P5P2P>P4Q\u000BQ\u0002P5P1P5P2Q\u000BQ\u0008P5P=P0P<P8Q\u0002P8P?P0Q\u0002P>P<Q\u0003P?Q\u0000P0P2P;P8Q\u0006P0P>P4P=P0P3P>P4Q\u000BP7P=P0Q\u000EP<P>P3Q\u0003P4Q\u0000Q\u0003P3P2Q\u0001P5P9P8P4P5Q\u0002P:P8P=P>P>P4P=P>P4P5P;P0P4P5P;P5Q\u0001Q\u0000P>P:P8Q\u000EP=Q\u000FP2P5Q\u0001Q\u000CP\u0015Q\u0001Q\u0002Q\u000CQ\u0000P0P7P0P=P0Q\u0008P8X'Y\u0004Y\u0004Y\u0007X'Y\u0004X*Y\nX,Y\u0005Y\nX9X.X'X5X)X'Y\u0004X0Y\nX9Y\u0004Y\nY\u0007X,X/Y\nX/X'Y\u0004X\"Y\u0006X'Y\u0004X1X/X*X-Y\u0003Y\u0005X5Y\u0001X-X)Y\u0003X'Y\u0006X*X'Y\u0004Y\u0004Y\nY\nY\u0003Y\u0008Y\u0006X4X(Y\u0003X)Y\u0001Y\nY\u0007X'X(Y\u0006X'X*X-Y\u0008X'X!X#Y\u0003X+X1X.Y\u0004X'Y\u0004X'Y\u0004X-X(X/Y\u0004Y\nY\u0004X/X1Y\u0008X3X'X6X:X7X*Y\u0003Y\u0008Y\u0006Y\u0007Y\u0006X'Y\u0003X3X'X-X)Y\u0006X'X/Y\nX'Y\u0004X7X(X9Y\u0004Y\nY\u0003X4Y\u0003X1X'Y\nY\u0005Y\u0003Y\u0006Y\u0005Y\u0006Y\u0007X'X4X1Y\u0003X)X1X&Y\nX3Y\u0006X4Y\nX7Y\u0005X'X0X'X'Y\u0004Y\u0001Y\u0006X4X(X'X(X*X9X(X1X1X-Y\u0005X)Y\u0003X'Y\u0001X)Y\nY\u0002Y\u0008Y\u0004Y\u0005X1Y\u0003X2Y\u0003Y\u0004Y\u0005X)X#X-Y\u0005X/Y\u0002Y\u0004X(Y\nY\nX9Y\u0006Y\nX5Y\u0008X1X)X7X1Y\nY\u0002X4X'X1Y\u0003X,Y\u0008X'Y\u0004X#X.X1Y\tY\u0005X9Y\u0006X'X'X(X-X+X9X1Y\u0008X6X(X4Y\u0003Y\u0004Y\u0005X3X,Y\u0004X(Y\u0006X'Y\u0006X.X'Y\u0004X/Y\u0003X*X'X(Y\u0003Y\u0004Y\nX)X(X/Y\u0008Y\u0006X#Y\nX6X'Y\nY\u0008X,X/Y\u0001X1Y\nY\u0002Y\u0003X*X(X*X#Y\u0001X6Y\u0004Y\u0005X7X(X.X'Y\u0003X+X1X(X'X1Y\u0003X'Y\u0001X6Y\u0004X'X-Y\u0004Y\tY\u0006Y\u0001X3Y\u0007X#Y\nX'Y\u0005X1X/Y\u0008X/X#Y\u0006Y\u0007X'X/Y\nY\u0006X'X'Y\u0004X'Y\u0006Y\u0005X9X1X6X*X9Y\u0004Y\u0005X/X'X.Y\u0004Y\u0005Y\u0005Y\u0003Y\u0006\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u0000\u0004\u0000\u0004\u0000\u0004\u0000\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0007\u0006\u0005\u0004\u0003\u0002\u0001\u0000\u0008\t\n\u000B\u000C\r\u000E\u000F\u000F\u000E\r\u000C\u000B\n\t\u0008\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0017\u0016\u0015\u0014\u0013\u0012\u0011\u0010\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u001F\u001E\u001D\u001C\u001B\u001A\u0019\u0018\u007F\u007F\u007F\u007F\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u007F\u007F\u007F\u007F\u0001\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u007F\u007F\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u007F\u007F\u0000\u0001\u0000\u0000\u0000\u0008\u0000\u0008\u0000\u0008\u0000\u0008\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0003\u0000\u0004\u0000\u0005\u0000\u0006\u0000\u0007resourcescountriesquestionsequipmentcommunityavailablehighlightDTD/xhtmlmarketingknowledgesomethingcontainerdirectionsubscribeadvertisecharacter\" value=\"</select>Australia\" class=\"situationauthorityfollowingprimarilyoperationchallengedevelopedanonymousfunction functionscompaniesstructureagreement\" title=\"potentialeducationargumentssecondarycopyrightlanguagesexclusivecondition</form>\r\nstatementattentionBiography} else {\nsolutionswhen the Analyticstemplatesdangeroussatellitedocumentspublisherimportantprototypeinfluence»</effectivegenerallytransformbeautifultransportorganizedpublishedprominentuntil thethumbnailNational .focus();over the migrationannouncedfooter\">\nexceptionless thanexpensiveformationframeworkterritoryndicationcurrentlyclassNamecriticismtraditionelsewhereAlexanderappointedmaterialsbroadcastmentionedaffiliate</option>treatmentdifferent/default.Presidentonclick=\"biographyotherwisepermanentFranC'aisHollywoodexpansionstandards</style>\nreductionDecember preferredCambridgeopponentsBusiness confusion>\n<title>presentedexplaineddoes not worldwideinterfacepositionsnewspaper</table>\nmountainslike the essentialfinancialselectionaction=\"/abandonedEducationparseInt(stabilityunable to\nrelationsNote thatefficientperformedtwo yearsSince thethereforewrapper\">alternateincreasedBattle ofperceivedtrying tonecessaryportrayedelectionsElizabethdiscoveryinsurances.length;legendaryGeographycandidatecorporatesometimesservices.inheritedCommunityreligiouslocationsCommitteebuildingsthe worldno longerbeginningreferencecannot befrequencytypicallyinto the relative;recordingpresidentinitiallytechniquethe otherit can beexistenceunderlinethis timetelephoneitemscopepracticesadvantage);return For otherprovidingdemocracyboth the extensivesufferingsupportedcomputers functionpracticalsaid thatit may beEnglish\nsuspectedmargin: 0spiritual\n\nmicrosoftgraduallydiscussedhe becameexecutivejquery.jshouseholdconfirmedpurchasedliterallydestroyedup to thevariationremainingit is notcenturiesJapanese among thecompletedalgorithminterestsrebellionundefinedencourageresizableinvolvingsensitiveuniversalprovision(althoughfeaturingconducted), which continued-header\">February numerous overflow:componentfragmentsexcellentcolspan=\"technicalnear the Advanced source ofexpressedHong Kong Facebookmultiple mechanismelevationoffensive\n\tsponsoreddocument.or "there arethose whomovementsprocessesdifficultsubmittedrecommendconvincedpromoting\" width=\".replace(classicalcoalitionhis firstdecisionsassistantindicatedevolution-wrapper\"enough toalong thedelivered-->\r\n\n\r\n
    Archbishop class=\"nobeing usedapproachesprivilegesnoscript>\nresults inmay be theEaster eggmechanismsreasonablePopulationCollectionselected\">noscript>\r/index.phparrival of-jssdk'));managed toincompletecasualtiescompletionChristiansSeptember arithmeticproceduresmight haveProductionit appearsPhilosophyfriendshipleading togiving thetoward theguaranteeddocumentedcolor:#000video gamecommissionreflectingchange theassociatedsans-serifonkeypress; padding:He was theunderlyingtypically , and the srcElementsuccessivesince the should be networkingaccountinguse of thelower thanshows that\n\t\tcomplaintscontinuousquantitiesastronomerhe did notdue to itsapplied toan averageefforts tothe futureattempt toTherefore,capabilityRepublicanwas formedElectronickilometerschallengespublishingthe formerindigenousdirectionssubsidiaryconspiracydetails ofand in theaffordablesubstancesreason forconventionitemtype=\"absolutelysupposedlyremained aattractivetravellingseparatelyfocuses onelementaryapplicablefound thatstylesheetmanuscriptstands for no-repeat(sometimesCommercialin Americaundertakenquarter ofan examplepersonallyindex.php?\npercentagebest-knowncreating a\" dir=\"ltrLieutenant\n
    is said tostructuralreferendummost oftena separate->\n
    soundtracksearchFormtend to beinput id=\"opening ofrestrictedadopted byaddressingtheologianmethods ofvariant ofChristian very largeautomotiveby far therange frompursuit offollow thebrought toin Englandagree thataccused ofcomes frompreventingdiv style=his or hertremendousfreedom ofconcerning0 1em 1em;Basketball/style.cssan earliereven after/\" title=\".com/indextaking thepittsburghcontent\">\rimplementedcan be seenthere was ademonstratecontainer\">connectionsthe Britishwas written!important;px; margin-followed byability to complicatedduring the immigrationalso called

    \n

    acquisitioncalled the persecutiondesignation{font-size:appeared ininvestigateexperiencedmost likelywidely useddiscussionspresence of (document.extensivelyIt has beenit does notcontrary toinhabitantsimprovementscholarshipconsumptioninstructionfor exampleone or morepx; paddingthe currenta series ofare usuallyrole in thepreviously derivativesevidence ofexperiencescolorschemestated thatcertificate
    \n selected=\"high schoolresponse tocomfortableadoption ofthree yearsthe countryin Februaryso that thepeople who provided by\nhaving been\r\n\r\n< "The compilationhe had beenproduced byphilosopherconstructedintended toamong othercompared toto say thatEngineeringa differentreferred todifferencesbelief thatphotographsidentifyingHistory of Republic ofnecessarilyprobabilitytechnicallyleaving thespectacularfraction ofelectricityhead of therestaurantspartnershipemphasis onmost recentshare with saying thatfilled withdesigned toit is often\">as follows:merged withthrough thecommercial pointed outopportunityview of therequirementdivision ofprogramminghe receivedsetInterval\">maintainingChristopherMuch of thewritings of\" height=\"2size of theversion of mixture of between theExamples ofeducationalcompetitive onsubmit=\"director ofdistinctive/DTD XHTML relating totendency toprovince ofwhich woulddespite thescientific legislature.innerHTML allegationsAgriculturewas used inapproach tointelligentyears later,sans-serifdeterminingPerformanceappearances, which is foundationsabbreviatedhigher thans from the individual composed ofsupposed toclaims thatattributionfont-size:1elements ofHistorical his brotherat the timeanniversarygoverned byrelated to ultimately innovationsit is stillcan only bedefinitionstoGMTStringA number ofimg class=\"Eventually,was changedoccurred inneighboringdistinguishwhen he wasintroducingterrestrialMany of theargues thatan Americanconquest ofwidespread were killedscreen and In order toexpected todescendantsare locatedlegislativegenerations backgroundmost peopleyears afterthere is nothe highestfrequently they do notargued thatshowed thatpredominanttheologicalby the timeconsideringshort-livedcan be usedvery littleone of the had alreadyinterpretedcommunicatefeatures ofgovernment,entered the\" height=\"3Independentpopulationslarge-scale. Although used in thedestructionpossibilitystarting intwo or moreexpressionssubordinatelarger thanhistory and\r\nContinentaleliminatingwill not bepractice ofin front ofsite of theensure thatto create amississippipotentiallyoutstandingbetter thanwhat is nowsituated inmeta name=\"TraditionalsuggestionsTranslationthe form ofatmosphericideologicalenterprisescalculatingeast of theremnants ofpluginspage/index.php?remained intransformedHe was alsowas alreadystatisticalin favor ofMinistry ofmovement offormulationis required\nquestion ofwas electedto become abecause of some peopleinspired bysuccessful a time whenmore commonamongst thean officialwidth:100%;technology,was adoptedto keep thesettlementslive birthsindex.html\"Connecticutassigned to&times;account foralign=rightthe companyalways beenreturned toinvolvementBecause thethis period\" name=\"q\" confined toa result ofvalue=\"\" />is actuallyEnvironment\r\n\r\nConversely,>\n
    this is notthe presentif they areand finallya matter of\r\n\t
    \r\n\r\nfaster thanmajority ofafter whichcomparativeto maintainimprove theawarded theer\" class=\"frameborderrestorationin the sameanalysis oftheir firstDuring the continentalsequence offunction(){font-size: work on the\nadopted theproperty ofdirected byeffectivelywas broughtchildren ofProgramminglonger thanmanuscriptswar againstby means ofand most ofsimilar to proprietaryoriginatingprestigiousgrammaticalexperience.to make theIt was alsois found incompetitorsin the U.S.replace thebrought thecalculationfall of thethe generalpracticallyin honor ofreleased inresidentialand some ofking of thereaction to1st Earl ofculture andprincipally\n they can beback to thesome of hisexposure toare similarform of theaddFavoritecitizenshippart in thepeople within practiceto continue&minus;approved by the first allowed theand for thefunctioningplaying thesolution toheight=\"0\" in his bookmore than afollows thecreated thepresence in nationalistthe idea ofa characterwere forced class=\"btndays of thefeatured inshowing theinterest inin place ofturn of thethe head ofLord of thepoliticallyhas its ownEducationalapproval ofsome of theeach other,behavior ofand becauseand anotherappeared onrecorded inblack"may includethe world'scan lead torefers to aborder=\"0\" government winning theresulted in while the Washington,the subjectcity in the>\r\n\t\treflect theto completebecame moreradioactiverejected bywithout anyhis father,which couldcopy of theto indicatea politicalaccounts ofconstitutesworked wither
    of his lifeaccompaniedclientWidthprevent theLegislativedifferentlytogether inhas severalfor anothertext of thefounded thee with the is used forchanged theusually theplace wherewhereas the> \nHowever thelead to the\tThe currentthe site ofsubstantialexperience,in the Westthey shouldslovenD\rinacomentariosuniversidadcondicionesactividadesexperienciatecnologC-aproducciC3npuntuaciC3naplicaciC3ncontraseC1acategorC-asregistrarseprofesionaltratamientoregC-stratesecretarC-aprincipalesprotecciC3nimportantesimportanciaposibilidadinteresantecrecimientonecesidadessuscribirseasociaciC3ndisponiblesevaluaciC3nestudiantesresponsableresoluciC3nguadalajararegistradosoportunidadcomercialesfotografC-aautoridadesingenierC-atelevisiC3ncompetenciaoperacionesestablecidosimplementeactualmentenavegaciC3nconformidadline-height:font-family:\" : \"http://applicationslink\" href=\"specifically//\n/index.html\"window.open( !important;application/independence//www.googleorganizationautocompleterequirementsconservative
    most notably/>notification'undefined')Furthermore,believe thatinnerHTML = prior to thedramaticallyreferring tonegotiationsheadquartersSouth AfricaunsuccessfulPennsylvaniaAs a result,\npadding-top:experimentalgetAttributeinstructionstechnologiespart of the =function(){subscriptionl.dtd\">\r\nEnglish (US)appendChild(transmissions. However, intelligence\" tabindex=\"float:right;Commonwealthranging fromin which theat least onereproductionencyclopedia;font-size:1jurisdictionat that time\">compensationchampionshipmedia=\"all\" violation ofreference toreturn true;Strict//EN\" transactionsinterventionverificationInformation difficultiesChampionshipcapabilities}\n\nChristianityfor example,Professionalrestrictionssuggest thatwas released(such as theremoveClass(unemploymentthe Americanstructure of/index.html published inspan class=\"\">\n\nf (document.border: 1px {font-size:1treatment of0\" height=\"1modificationIndependencedivided intogreater thanachievementsestablishingJavaScript\" neverthelesssignificanceBroadcasting> container\">\nsuch as the influence ofa particularsrc='http://navigation\" half of the substantial  advantage ofdiscovery offundamental metropolitanthe opposite\" xml:lang=\"deliberatelyalign=centerevolution ofpreservationimprovementsbeginning inJesus ChristPublicationsdisagreementtext-align:r, function()similaritiesbody>is currentlyalphabeticalis sometimestype=\"image/many of the flow:hidden;available indescribe theexistence ofall over thethe Internet\t